{
  "contractName": "EpochTokenLocker",
  "abi": [
    {
      "constant": true,
      "inputs": [
        {
          "name": "",
          "type": "address"
        },
        {
          "name": "",
          "type": "address"
        }
      ],
      "name": "lastCreditBatchId",
      "outputs": [
        {
          "name": "",
          "type": "uint32"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "BATCH_TIME",
      "outputs": [
        {
          "name": "",
          "type": "uint32"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "name": "user",
          "type": "address"
        },
        {
          "indexed": true,
          "name": "token",
          "type": "address"
        },
        {
          "indexed": false,
          "name": "amount",
          "type": "uint256"
        },
        {
          "indexed": false,
          "name": "batchId",
          "type": "uint32"
        }
      ],
      "name": "Deposit",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "name": "user",
          "type": "address"
        },
        {
          "indexed": true,
          "name": "token",
          "type": "address"
        },
        {
          "indexed": false,
          "name": "amount",
          "type": "uint256"
        },
        {
          "indexed": false,
          "name": "batchId",
          "type": "uint32"
        }
      ],
      "name": "WithdrawRequest",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "name": "user",
          "type": "address"
        },
        {
          "indexed": true,
          "name": "token",
          "type": "address"
        },
        {
          "indexed": false,
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "Withdraw",
      "type": "event"
    },
    {
      "constant": false,
      "inputs": [
        {
          "name": "token",
          "type": "address"
        },
        {
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "deposit",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "name": "token",
          "type": "address"
        },
        {
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "requestWithdraw",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "name": "token",
          "type": "address"
        },
        {
          "name": "amount",
          "type": "uint256"
        },
        {
          "name": "batchId",
          "type": "uint32"
        }
      ],
      "name": "requestFutureWithdraw",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "name": "user",
          "type": "address"
        },
        {
          "name": "token",
          "type": "address"
        }
      ],
      "name": "withdraw",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "name": "user",
          "type": "address"
        },
        {
          "name": "token",
          "type": "address"
        }
      ],
      "name": "getPendingDeposit",
      "outputs": [
        {
          "name": "",
          "type": "uint256"
        },
        {
          "name": "",
          "type": "uint32"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "name": "user",
          "type": "address"
        },
        {
          "name": "token",
          "type": "address"
        }
      ],
      "name": "getPendingWithdraw",
      "outputs": [
        {
          "name": "",
          "type": "uint256"
        },
        {
          "name": "",
          "type": "uint32"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "getCurrentBatchId",
      "outputs": [
        {
          "name": "",
          "type": "uint32"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "getSecondsRemainingInBatch",
      "outputs": [
        {
          "name": "",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "name": "user",
          "type": "address"
        },
        {
          "name": "token",
          "type": "address"
        }
      ],
      "name": "getBalance",
      "outputs": [
        {
          "name": "",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "name": "user",
          "type": "address"
        },
        {
          "name": "token",
          "type": "address"
        }
      ],
      "name": "hasValidWithdrawRequest",
      "outputs": [
        {
          "name": "",
          "type": "bool"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "metadata": "{\"compiler\":{\"version\":\"0.5.10+commit.5a6ea5b1\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"constant\":true,\"inputs\":[],\"name\":\"getSecondsRemainingInBatch\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"token\",\"type\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"requestWithdraw\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"token\",\"type\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"deposit\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"address\"}],\"name\":\"lastCreditBatchId\",\"outputs\":[{\"name\":\"\",\"type\":\"uint32\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"user\",\"type\":\"address\"},{\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getPendingDeposit\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"},{\"name\":\"\",\"type\":\"uint32\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"user\",\"type\":\"address\"},{\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getPendingWithdraw\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"},{\"name\":\"\",\"type\":\"uint32\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"user\",\"type\":\"address\"},{\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getBalance\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"BATCH_TIME\",\"outputs\":[{\"name\":\"\",\"type\":\"uint32\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getCurrentBatchId\",\"outputs\":[{\"name\":\"\",\"type\":\"uint32\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"token\",\"type\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\"},{\"name\":\"batchId\",\"type\":\"uint32\"}],\"name\":\"requestFutureWithdraw\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"user\",\"type\":\"address\"},{\"name\":\"token\",\"type\":\"address\"}],\"name\":\"hasValidWithdrawRequest\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"user\",\"type\":\"address\"},{\"name\":\"token\",\"type\":\"address\"}],\"name\":\"withdraw\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"batchId\",\"type\":\"uint32\"}],\"name\":\"Deposit\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"batchId\",\"type\":\"uint32\"}],\"name\":\"WithdrawRequest\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Withdraw\",\"type\":\"event\"}],\"devdoc\":{\"author\":\"@gnosis/dfusion-team <https://github.com/orgs/gnosis/teams/dfusion-team/members>\",\"methods\":{\"deposit(address,uint256)\":{\"details\":\"credits user with deposit amount on next epoch (given by getCurrentBatchId)\",\"params\":{\"amount\":\"number of token(s) to be credited to user's account     * Emits an {Deposit} event with relevent deposit information.     * Requirements: - token transfer to contract is successfull\",\"token\":\"address of token to be deposited\"}},\"getBalance(address,address)\":{\"details\":\"fetches and returns user's balance\",\"params\":{\"token\":\"address of ERC20 token return Current `token` balance of `user`'s account\",\"user\":\"address of user\"}},\"getCurrentBatchId()\":{\"details\":\"getter function to determine current auction id. return current batchId\"},\"getPendingDeposit(address,address)\":{\"details\":\"getter function used to display pending deposit\",\"params\":{\"token\":\"address of ERC20 token return amount and batchId of deposit's transfer if any (else 0)\",\"user\":\"address of user\"}},\"getPendingWithdraw(address,address)\":{\"details\":\"getter function used to display pending withdraw\",\"params\":{\"token\":\"address of ERC20 token return amount and batchId when withdraw was requested if any (else 0)\",\"user\":\"address of user\"}},\"getSecondsRemainingInBatch()\":{\"details\":\"used to determine how much time is left in a batch return seconds remaining in current batch\"},\"hasValidWithdrawRequest(address,address)\":{\"details\":\"Used to determine if user has a valid pending withdraw request of specific token\",\"params\":{\"token\":\"address of ERC20 token return true if `user` has valid withdraw request for `token`, otherwise false\",\"user\":\"address of user\"}},\"requestFutureWithdraw(address,uint256,uint32)\":{\"details\":\"Signals and initiates user's intent to withdraw.\",\"params\":{\"amount\":\"number of token(s) to be withdrawn\",\"batchId\":\"state index at which request is to be made.     * Emits an {WithdrawRequest} event with relevent request information.\",\"token\":\"address of token to be withdrawn\"}},\"requestWithdraw(address,uint256)\":{\"details\":\"Signals and initiates user's intent to withdraw.\",\"params\":{\"amount\":\"number of token(s) to be withdrawn     * Emits an {WithdrawRequest} event with relevent request information.\",\"token\":\"address of token to be withdrawn\"}},\"withdraw(address,address)\":{\"details\":\"Claims pending withdraw - can be called on behalf of others\",\"params\":{\"token\":\"address of token to be withdrawn\",\"user\":\"address of user who withdraw is being claimed.     * Emits an {Withdraw} event stating that `user` withdrew `amount` of `token`     * Requirements: - withdraw was requested in previous epoch - token was received from exchange in current auction batch\"}}},\"title\":\"Epoch Token Locker EpochTokenLocker saveguards tokens for applications with constant-balances during discrete epochs It allows to deposit a token which become credited in the next epoch and allows to request a token-withdraw which becomes claimable after the current epoch has expired.\"},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"/Users/felixleupold/Gnosis/dex-contracts/contracts/EpochTokenLocker.sol\":\"EpochTokenLocker\"},\"evmVersion\":\"petersburg\",\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"/Users/felixleupold/Gnosis/dex-contracts/contracts/EpochTokenLocker.sol\":{\"keccak256\":\"0x6a0e16a44b858c3af0e4e0113af93bf23160f175f36c524f9e753085d8de9978\",\"urls\":[\"bzzr://d6178f1d3533ed733e7eba91d12ce1597711e5b74ad1a4492aed9dc28a8d5c97\",\"dweb:/ipfs/QmeVeD8xeZUfwRi4BCBhrBWCHUDF3tdzwwYDgSNr5T4xPo\"]},\"@openzeppelin/contracts/math/Math.sol\":{\"keccak256\":\"0x4b5aa451e4e8801478708f94b118a7821c0500d676255eaf89fc78c14856ce4e\",\"urls\":[\"bzzr://200d5728b32858918810d8d7a8db1406ee9b157ad5026f050e6d864a696b9080\",\"dweb:/ipfs/QmS6tW81u8E4tvzVfVuqEuMCkdwAozQ6pKJPRBR4JEVmQp\"]},\"@openzeppelin/contracts/math/SafeMath.sol\":{\"keccak256\":\"0x640b6dee7a4b830bdfd52b5031a07fc2b12209f5b2e29e5d364a7d37f69d8076\",\"urls\":[\"bzzr://292843005e754e752644f767477ec5ad7a1ffc91ddb18c38b8079c62f3993cad\",\"dweb:/ipfs/QmbZaJyXdpsYGykVhHH9qpVGQg9DGCxE2QufbCUy3daTgq\"]},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0xe5bb0f57cff3e299f360052ba50f1ea0fff046df2be070b6943e0e3c3fdad8a9\",\"urls\":[\"bzzr://cf2d583b8dce38d0617fdcd65f2fd9f126fe17b7f683b5a515ea9d2762d8b062\",\"dweb:/ipfs/QmQMvwEcPhoRXzbXyrdoeRtvLoifUW9Qh7Luho7bmUPRkc\"]},\"@openzeppelin/contracts/token/ERC20/SafeERC20.sol\":{\"keccak256\":\"0x6f2c9955d65c522b80f4b8792f076512d2df947d2112cbc4d98a4781ed42ede2\",\"urls\":[\"bzzr://d2ff5aadcb697bc27ca3b0f6c40b4998e8cf0a1bd0f761d1df6d5981777841ae\",\"dweb:/ipfs/QmTDkFzKnrpiV1UKnSoiZAHPuguWzokrr4pFbSPvyaSo56\"]},\"@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0x1a8e5072509c5ea7365eb1d48030b9be865140c8fb779968da0a459a0e174a11\",\"urls\":[\"bzzr://4e1d23731da27602b8c552e54fb9976dadf8cf46a8f90a3c8c1b85fe044618b9\",\"dweb:/ipfs/Qmebp4nzPja645c9yXSdJkGq96oU3am3LUnG2K3R7XxyKf\"]}},\"version\":1}",
  "bytecode": "0x608060405234801561001057600080fd5b50610f2c806100206000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c8063d4fac45d11610071578063d4fac45d146101ee578063e48c015e1461021c578063e720ac8e14610224578063f36b63551461022c578063f3f4798214610264578063f940e385146102a6576100b4565b806317569c1d146100b9578063397a1b28146100d357806347e7ef2414610101578063907767c01461012d578063b3c0afa114610174578063c33eb9f6146101c0575b600080fd5b6100c16102d4565b60408051918252519081900360200190f35b6100ff600480360360408110156100e957600080fd5b506001600160a01b0381351690602001356102e0565b005b6100ff6004803603604081101561011757600080fd5b506001600160a01b0381351690602001356102f6565b61015b6004803603604081101561014357600080fd5b506001600160a01b03813581169160200135166103f7565b6040805163ffffffff9092168252519081900360200190f35b6101a26004803603604081101561018a57600080fd5b506001600160a01b038135811691602001351661041a565b6040805192835263ffffffff90911660208301528051918290030190f35b6101a2600480360360408110156101d657600080fd5b506001600160a01b0381358116916020013516610474565b6100c16004803603604081101561020457600080fd5b506001600160a01b03813581169160200135166104ce565b61015b6105f9565b61015b6105ff565b6100ff6004803603606081101561024257600080fd5b5080356001600160a01b0316906020810135906040013563ffffffff16610607565b6102926004803603604081101561027a57600080fd5b506001600160a01b038135811691602001351661070e565b604080519115158252519081900360200190f35b6100ff600480360360408110156102bc57600080fd5b506001600160a01b0381358116916020013516610786565b61012c42819006900390565b6102f282826102ed6105ff565b610607565b5050565b610300338361097d565b61030c82333084610a3e565b336000908152602081815260408083206001600160a01b0386168452909152902060010154610341908263ffffffff610a9e16565b336000908152602081815260408083206001600160a01b038716845290915290206001015561036e6105ff565b336000818152602081815260408083206001600160a01b0388168085529252909120600201805463ffffffff191663ffffffff94909416939093179092557fc11cc34e93c67a93382b99f2498e9937198798f3c1c2888008ffc0eeb82f68c4836103d66105ff565b6040805192835263ffffffff90911660208301528051918290030190a35050565b600160209081526000928352604080842090915290825290205463ffffffff1681565b600080610425610e29565b5050506001600160a01b039182166000908152602081815260408083209390941682529182528290208251808401909352600181015480845260029091015463ffffffff169290910182905291565b60008061047f610e29565b5050506001600160a01b039182166000908152602081815260408083209390941682529182528290208251808401909352600381015480845260049091015463ffffffff169290910182905291565b6001600160a01b038083166000908152602081815260408083209385168352929052908120546104fc6105ff565b6001600160a01b038086166000908152602081815260408083209388168352929052206002015463ffffffff9182169116101561056e576001600160a01b038085166000908152602081815260408083209387168352929052206001015461056b90829063ffffffff610a9e16565b90505b6105766105ff565b6001600160a01b038086166000908152602081815260408083209388168352929052206004015463ffffffff918216911610156105f2576001600160a01b03808516600090815260208181526040808320938716835292905220600301546105ef906105e29083610af8565b829063ffffffff610b0e16565b90505b9392505050565b61012c81565b61012c420490565b610611338461070e565b15610620576106203384610786565b6106286105ff565b63ffffffff168163ffffffff1610156106725760405162461bcd60e51b8152600401808060200182810382526022815260200180610ed66022913960400191505060405180910390fd5b60408051808201825283815263ffffffff83811660208084018281523360008181528084528781206001600160a01b038c16808352908552908890209651600388015591516004909601805463ffffffff19169690951695909517909355845187815290810191909152835191937f2c6245af506f0fc1089918c02c1d01bde9cc807609b334b3e7644d6dfb5a6c5e92918290030190a3505050565b60006107186105ff565b6001600160a01b038085166000908152602081815260408083209387168352929052206004015463ffffffff91821691161080156105f25750506001600160a01b0391821660009081526020818152604080832093909416825291909152206004015463ffffffff16151590565b610790828261097d565b6107986105ff565b6001600160a01b038084166000908152602081815260408083209386168352929052206004015463ffffffff9182169116106108055760405162461bcd60e51b8152600401808060200182810382526026815260200180610e866026913960400191505060405180910390fd5b61080d6105ff565b6001600160a01b0380841660009081526001602090815260408083209386168352929052205463ffffffff9182169116106108795760405162461bcd60e51b8152600401808060200182810382526045815260200180610e416045913960600191505060405180910390fd5b6001600160a01b03828116600090815260208181526040808320938516835292905290812080546003909101546108b09190610af8565b6001600160a01b03808516600090815260208181526040808320938716835292905220549091506108e7908263ffffffff610b0e16565b6001600160a01b0384811660009081526020818152604080832093871683529290529081209182556003820155600401805463ffffffff1916905561092d828483610b50565b816001600160a01b0316836001600160a01b03167f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb836040518082815260200191505060405180910390a3505050565b6001600160a01b038083166000908152602081815260408083209385168352929052206002015463ffffffff1680158015906109c557506109bc6105ff565b63ffffffff1681105b15610a39576001600160a01b03838116600090815260208181526040808320938616835292905220600181015490546109fd91610a9e565b6001600160a01b0384811660009081526020818152604080832093871683529290529081209182556001820155600201805463ffffffff191690555b505050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610a98908590610b9e565b50505050565b6000828201838110156105f2576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000818310610b0757816105f2565b5090919050565b60006105f283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610d56565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610a399084905b610bb0826001600160a01b0316610ded565b610c01576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310610c3f5780518252601f199092019160209182019101610c20565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114610ca1576040519150601f19603f3d011682016040523d82523d6000602084013e610ca6565b606091505b509150915081610cfd576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b805115610a9857808060200190516020811015610d1957600080fd5b5051610a985760405162461bcd60e51b815260040180806020018281038252602a815260200180610eac602a913960400191505060405180910390fd5b60008184841115610de55760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610daa578181015183820152602001610d92565b50505050905090810190601f168015610dd75780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590610e2157508115155b949350505050565b60408051808201909152600080825260208201529056fe5769746864726177206e6f7420706f737369626c6520666f7220746f6b656e20746861742069732074726164656420696e207468652063757272656e742061756374696f6e776974686472617720776173206e6f7420726567697374657265642070726576696f75736c795361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564526571756573742063616e6e6f74206265206d61646520696e207468652070617374a265627a7a72305820be0fd89201be28c08e5fb7bc53b0c5240e0198ee2b2a8b3d4820f6a310fee49764736f6c634300050a0032",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c8063d4fac45d11610071578063d4fac45d146101ee578063e48c015e1461021c578063e720ac8e14610224578063f36b63551461022c578063f3f4798214610264578063f940e385146102a6576100b4565b806317569c1d146100b9578063397a1b28146100d357806347e7ef2414610101578063907767c01461012d578063b3c0afa114610174578063c33eb9f6146101c0575b600080fd5b6100c16102d4565b60408051918252519081900360200190f35b6100ff600480360360408110156100e957600080fd5b506001600160a01b0381351690602001356102e0565b005b6100ff6004803603604081101561011757600080fd5b506001600160a01b0381351690602001356102f6565b61015b6004803603604081101561014357600080fd5b506001600160a01b03813581169160200135166103f7565b6040805163ffffffff9092168252519081900360200190f35b6101a26004803603604081101561018a57600080fd5b506001600160a01b038135811691602001351661041a565b6040805192835263ffffffff90911660208301528051918290030190f35b6101a2600480360360408110156101d657600080fd5b506001600160a01b0381358116916020013516610474565b6100c16004803603604081101561020457600080fd5b506001600160a01b03813581169160200135166104ce565b61015b6105f9565b61015b6105ff565b6100ff6004803603606081101561024257600080fd5b5080356001600160a01b0316906020810135906040013563ffffffff16610607565b6102926004803603604081101561027a57600080fd5b506001600160a01b038135811691602001351661070e565b604080519115158252519081900360200190f35b6100ff600480360360408110156102bc57600080fd5b506001600160a01b0381358116916020013516610786565b61012c42819006900390565b6102f282826102ed6105ff565b610607565b5050565b610300338361097d565b61030c82333084610a3e565b336000908152602081815260408083206001600160a01b0386168452909152902060010154610341908263ffffffff610a9e16565b336000908152602081815260408083206001600160a01b038716845290915290206001015561036e6105ff565b336000818152602081815260408083206001600160a01b0388168085529252909120600201805463ffffffff191663ffffffff94909416939093179092557fc11cc34e93c67a93382b99f2498e9937198798f3c1c2888008ffc0eeb82f68c4836103d66105ff565b6040805192835263ffffffff90911660208301528051918290030190a35050565b600160209081526000928352604080842090915290825290205463ffffffff1681565b600080610425610e29565b5050506001600160a01b039182166000908152602081815260408083209390941682529182528290208251808401909352600181015480845260029091015463ffffffff169290910182905291565b60008061047f610e29565b5050506001600160a01b039182166000908152602081815260408083209390941682529182528290208251808401909352600381015480845260049091015463ffffffff169290910182905291565b6001600160a01b038083166000908152602081815260408083209385168352929052908120546104fc6105ff565b6001600160a01b038086166000908152602081815260408083209388168352929052206002015463ffffffff9182169116101561056e576001600160a01b038085166000908152602081815260408083209387168352929052206001015461056b90829063ffffffff610a9e16565b90505b6105766105ff565b6001600160a01b038086166000908152602081815260408083209388168352929052206004015463ffffffff918216911610156105f2576001600160a01b03808516600090815260208181526040808320938716835292905220600301546105ef906105e29083610af8565b829063ffffffff610b0e16565b90505b9392505050565b61012c81565b61012c420490565b610611338461070e565b15610620576106203384610786565b6106286105ff565b63ffffffff168163ffffffff1610156106725760405162461bcd60e51b8152600401808060200182810382526022815260200180610ed66022913960400191505060405180910390fd5b60408051808201825283815263ffffffff83811660208084018281523360008181528084528781206001600160a01b038c16808352908552908890209651600388015591516004909601805463ffffffff19169690951695909517909355845187815290810191909152835191937f2c6245af506f0fc1089918c02c1d01bde9cc807609b334b3e7644d6dfb5a6c5e92918290030190a3505050565b60006107186105ff565b6001600160a01b038085166000908152602081815260408083209387168352929052206004015463ffffffff91821691161080156105f25750506001600160a01b0391821660009081526020818152604080832093909416825291909152206004015463ffffffff16151590565b610790828261097d565b6107986105ff565b6001600160a01b038084166000908152602081815260408083209386168352929052206004015463ffffffff9182169116106108055760405162461bcd60e51b8152600401808060200182810382526026815260200180610e866026913960400191505060405180910390fd5b61080d6105ff565b6001600160a01b0380841660009081526001602090815260408083209386168352929052205463ffffffff9182169116106108795760405162461bcd60e51b8152600401808060200182810382526045815260200180610e416045913960600191505060405180910390fd5b6001600160a01b03828116600090815260208181526040808320938516835292905290812080546003909101546108b09190610af8565b6001600160a01b03808516600090815260208181526040808320938716835292905220549091506108e7908263ffffffff610b0e16565b6001600160a01b0384811660009081526020818152604080832093871683529290529081209182556003820155600401805463ffffffff1916905561092d828483610b50565b816001600160a01b0316836001600160a01b03167f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb836040518082815260200191505060405180910390a3505050565b6001600160a01b038083166000908152602081815260408083209385168352929052206002015463ffffffff1680158015906109c557506109bc6105ff565b63ffffffff1681105b15610a39576001600160a01b03838116600090815260208181526040808320938616835292905220600181015490546109fd91610a9e565b6001600160a01b0384811660009081526020818152604080832093871683529290529081209182556001820155600201805463ffffffff191690555b505050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610a98908590610b9e565b50505050565b6000828201838110156105f2576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000818310610b0757816105f2565b5090919050565b60006105f283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610d56565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610a399084905b610bb0826001600160a01b0316610ded565b610c01576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310610c3f5780518252601f199092019160209182019101610c20565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114610ca1576040519150601f19603f3d011682016040523d82523d6000602084013e610ca6565b606091505b509150915081610cfd576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b805115610a9857808060200190516020811015610d1957600080fd5b5051610a985760405162461bcd60e51b815260040180806020018281038252602a815260200180610eac602a913960400191505060405180910390fd5b60008184841115610de55760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610daa578181015183820152602001610d92565b50505050905090810190601f168015610dd75780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590610e2157508115155b949350505050565b60408051808201909152600080825260208201529056fe5769746864726177206e6f7420706f737369626c6520666f7220746f6b656e20746861742069732074726164656420696e207468652063757272656e742061756374696f6e776974686472617720776173206e6f7420726567697374657265642070726576696f75736c795361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564526571756573742063616e6e6f74206265206d61646520696e207468652070617374a265627a7a72305820be0fd89201be28c08e5fb7bc53b0c5240e0198ee2b2a8b3d4820f6a310fee49764736f6c634300050a0032",
  "sourceMap": "649:10969:3:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;649:10969:3;;;;;;;",
  "deployedSourceMap": "649:10969:3:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;649:10969:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6732:177;;;:::i;:::-;;;;;;;;;;;;;;;;2918:137;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;2918:137:3;;;;;;;;:::i;:::-;;2085:566;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;2085:566:3;;;;;;;;:::i;972:71::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;972:71:3;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5597:253;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;5597:253:3;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;6081:258;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;6081:258:3;;;;;;;;;;:::i;7107:561::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;7107:561:3;;;;;;;;;;:::i;766:39::-;;;:::i;6445:160::-;;;:::i;3388:604::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3388:604:3;;-1:-1:-1;;;;;3388:604:3;;;;;;;;;;;;;:::i;7939:269::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;7939:269:3;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;4432:896;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;4432:896:3;;;;;;;;;;:::i;6732:177::-;802:3;6885;:16;;;6871:31;;;6732:177::o;2918:137::-;2991:57;3013:5;3020:6;3028:19;:17;:19::i;:::-;2991:21;:57::i;:::-;2918:137;;:::o;2085:566::-;2150:40;2172:10;2184:5;2150:21;:40::i;:::-;2200:76;2234:5;2242:10;2262:4;2269:6;2200:26;:76::i;:::-;2411:10;2397:13;:25;;;;;;;;;;;-1:-1:-1;;;;;2397:32:3;;;;;;;;;:48;;:55;:89;;2470:6;2397:89;:59;:89;:::i;:::-;2353:10;2339:13;:25;;;;;;;;;;;-1:-1:-1;;;;;2339:32:3;;;;;;;;;:48;;:147;2555:19;:17;:19::i;:::-;2510:10;2496:13;:25;;;;;;;;;;;-1:-1:-1;;;;;2496:32:3;;;;;;;;;;:56;;:78;;-1:-1:-1;;2496:78:3;;;;;;;;;;;;;2589:55;2616:6;2624:19;:17;:19::i;:::-;2589:55;;;;;;;;;;;;;;;;;;;;;;;2085:566;;:::o;972:71::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5597:253::-;5674:7;5683:6;5701:33;;:::i;:::-;-1:-1:-1;;;;;;;;5737:19:3;;;:13;:19;;;;;;;;;;;:26;;;;;;;;;;;;5701:78;;;;;;;;5737:42;;;5701:78;;;;;;;;;;;;;;;;;;;5597:253::o;6081:258::-;6159:7;6168:6;6186:34;;:::i;:::-;-1:-1:-1;;;;;;;;6223:19:3;;;:13;:19;;;;;;;;;;;:26;;;;;;;;;;;;6186:80;;;;;;;;6223:43;;;6186:80;;;;;;;;;;;;;;;;;;;6081:258::o;7107:561::-;-1:-1:-1;;;;;7214:19:3;;;7177:7;7214:19;;;;;;;;;;;:26;;;;;;;;;;;:34;7315:19;:17;:19::i;:::-;-1:-1:-1;;;;;7262:19:3;;;:13;:19;;;;;;;;;;;:26;;;;;;;;;:50;;;:72;;;;:50;;:72;7258:175;;;-1:-1:-1;;;;;7372:19:3;;;:13;:19;;;;;;;;;;;:26;;;;;;;;;:42;;:49;7360:62;;:7;;:62;:11;:62;:::i;:::-;7350:72;;7258:175;7500:19;:17;:19::i;:::-;-1:-1:-1;;;;;7446:19:3;;;:13;:19;;;;;;;;;;;:26;;;;;;;;;:51;;;:73;;;;:51;;:73;7442:196;;;-1:-1:-1;;;;;7566:19:3;;;:13;:19;;;;;;;;;;;:26;;;;;;;;;:43;;:50;7545:82;;7557:69;;7618:7;7557:8;:69::i;:::-;7545:7;;:82;:11;:82;:::i;:::-;7535:92;;7442:196;7654:7;7107:561;-1:-1:-1;;;7107:561:3:o;766:39::-;802:3;766:39;:::o;6445:160::-;802:3;6581;:16;;6445:160::o;3388:604::-;3628:42;3652:10;3664:5;3628:23;:42::i;:::-;3624:100;;;3686:27;3695:10;3707:5;3686:8;:27::i;:::-;3752:19;:17;:19::i;:::-;3741:30;;:7;:30;;;;3733:77;;;;-1:-1:-1;;;3733:77:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3872:47;;;;;;;;;;;;;;;;;;;;;;3834:10;-1:-1:-1;3820:25:3;;;;;;;;;-1:-1:-1;;;;;3820:32:3;;;;;;;;;;;;:99;;:49;;;:99;;;;;;;;;-1:-1:-1;;3820:99:3;;;;;;;;;;;;3934:51;;;;;;;;;;;;;;3820:32;;3934:51;;;;;;;;;3388:604;;;:::o;7939:269::-;8022:4;8111:19;:17;:19::i;:::-;-1:-1:-1;;;;;8057:19:3;;;:13;:19;;;;;;;;;;;:26;;;;;;;;;:51;;;:73;;;;:51;;:73;:144;;;;-1:-1:-1;;;;;;;8146:19:3;;;8200:1;8146:19;;;;;;;;;;;:26;;;;;;;;;;;:51;;;;;:55;;;7939:269::o;4432:896::-;4496:34;4518:4;4524:5;4496:21;:34::i;:::-;4677:19;:17;:19::i;:::-;-1:-1:-1;;;;;4623:19:3;;;:13;:19;;;;;;;;;;;:26;;;;;;;;;:51;;;:73;;;;:51;;:73;4602:158;;;;-1:-1:-1;;;4602:158:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4824:19;:17;:19::i;:::-;-1:-1:-1;;;;;4791:23:3;;;;;;;:17;:23;;;;;;;;:30;;;;;;;;;;:52;;;;:30;;:52;4770:168;;;;-1:-1:-1;;;4770:168:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4974:19:3;;;4948:14;4974:19;;;;;;;;;;;:26;;;;;;;;;;;:34;;5010:43;;;;:50;4965:96;;4974:34;4965:8;:96::i;:::-;-1:-1:-1;;;;;5109:19:3;;;:13;:19;;;;;;;;;;;:26;;;;;;;;;:34;4948:113;;-1:-1:-1;5109:46:3;;4948:113;5109:46;:38;:46;:::i;:::-;-1:-1:-1;;;;;5072:19:3;;;:13;:19;;;;;;;;;;;:26;;;;;;;;;;;:83;;;5172:43;;;5165:50;;;;;-1:-1:-1;;5165:50:3;;;5226:51;5072:26;:19;5270:6;5226:22;:51::i;:::-;5307:5;-1:-1:-1;;;;;5292:29:3;5301:4;-1:-1:-1;;;;;5292:29:3;;5314:6;5292:29;;;;;;;;;;;;;;;;;;4432:896;;;:::o;11062:554::-;-1:-1:-1;;;;;11158:19:3;;;11140:15;11158:19;;;;;;;;;;;:26;;;;;;;;;:50;;;;;11222:11;;;;;:44;;;11247:19;:17;:19::i;:::-;11237:29;;:7;:29;11222:44;11218:392;;;-1:-1:-1;;;;;11473:19:3;;;:13;:19;;;;;;;;;;;:26;;;;;;;;;:42;;;:49;11417:34;;:119;;:38;:119::i;:::-;-1:-1:-1;;;;;11380:19:3;;;:13;:19;;;;;;;;;;;:26;;;;;;;;;;;:156;;;11557:42;;;11550:49;;;;;-1:-1:-1;;11550:49:3;;;11218:392;11062:554;;;:::o;842:202:30:-;968:68;;;-1:-1:-1;;;;;968:68:30;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;968:68:30;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;942:95:30;;961:5;;942:18;:95::i;:::-;842:202;;;;:::o;834:176:24:-;892:7;923:5;;;946:6;;;;938:46;;;;;-1:-1:-1;;;938:46:24;;;;;;;;;;;;;;;;;;;;;;;;;;;358:104:23;416:7;446:1;442;:5;:13;;454:1;442:13;;;-1:-1:-1;450:1:23;;358:104;-1:-1:-1;358:104:23:o;1274:134:24:-;1332:7;1358:43;1362:1;1365;1358:43;;;;;;;;;;;;;;;;;:3;:43::i;662:174:30:-;770:58;;;-1:-1:-1;;;;;770:58:30;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;770:58:30;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;744:85:30;;763:5;;2666:1095;3261:27;3269:5;-1:-1:-1;;;;;3261:25:30;;:27::i;:::-;3253:71;;;;;-1:-1:-1;;;3253:71:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;3395:12;3409:23;3444:5;-1:-1:-1;;;;;3436:19:30;3456:4;3436:25;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;3436:25:30;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;3394:67:30;;;;3479:7;3471:52;;;;;-1:-1:-1;;;3471:52:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3538:17;;:21;3534:221;;3678:10;3667:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3667:30:30;3659:85;;;;-1:-1:-1;;;3659:85:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1732:187:24;1818:7;1853:12;1845:6;;;;1837:29;;;;-1:-1:-1;;;1837:29:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;1837:29:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1888:5:24;;;1732:187::o;686:610:31:-;746:4;1207:20;;1052:66;1246:23;;;;;;:42;;-1:-1:-1;1273:15:31;;;1246:42;1238:51;686:610;-1:-1:-1;;;;686:610:31:o;649:10969:3:-;;;;;;;;;;-1:-1:-1;649:10969:3;;;;;;;;:::o",
  "source": "pragma solidity ^0.5.0;\n\nimport \"@openzeppelin/contracts/math/Math.sol\";\nimport \"@openzeppelin/contracts/math/SafeMath.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/SafeERC20.sol\";\n\n/** @title Epoch Token Locker\n *  EpochTokenLocker saveguards tokens for applications with constant-balances during discrete epochs\n *  It allows to deposit a token which become credited in the next epoch and allows to request a token-withdraw\n *  which becomes claimable after the current epoch has expired.\n *  @author @gnosis/dfusion-team <https://github.com/orgs/gnosis/teams/dfusion-team/members>\n */\ncontract EpochTokenLocker {\n    using SafeMath for uint256;\n\n    /** @dev Number of seconds a batch is lasting*/\n    uint32 public constant BATCH_TIME = 300;\n\n    // User => Token => BalanceState\n    mapping(address => mapping(address => BalanceState)) private balanceStates;\n\n    // user => token => lastCreditBatchId\n    mapping(address => mapping(address => uint32)) public lastCreditBatchId;\n\n    struct BalanceState {\n        uint256 balance;\n        PendingFlux pendingDeposits; // deposits will be credited in any future epoch, i.e. currentStateIndex > batchId\n        PendingFlux pendingWithdraws; // withdraws are allowed in any future epoch, i.e. currentStateIndex > batchId\n    }\n\n    struct PendingFlux {\n        uint256 amount;\n        uint32 batchId;\n    }\n\n    event Deposit(address indexed user, address indexed token, uint256 amount, uint32 batchId);\n\n    event WithdrawRequest(address indexed user, address indexed token, uint256 amount, uint32 batchId);\n\n    event Withdraw(address indexed user, address indexed token, uint256 amount);\n\n    /** @dev credits user with deposit amount on next epoch (given by getCurrentBatchId)\n     * @param token address of token to be deposited\n     * @param amount number of token(s) to be credited to user's account\n     *\n     * Emits an {Deposit} event with relevent deposit information.\n     *\n     * Requirements:\n     * - token transfer to contract is successfull\n     */\n    function deposit(address token, uint256 amount) public {\n        updateDepositsBalance(msg.sender, token);\n        SafeERC20.safeTransferFrom(IERC20(token), msg.sender, address(this), amount);\n        // solhint-disable-next-line max-line-length\n        balanceStates[msg.sender][token].pendingDeposits.amount = balanceStates[msg.sender][token].pendingDeposits.amount.add(\n            amount\n        );\n        balanceStates[msg.sender][token].pendingDeposits.batchId = getCurrentBatchId();\n        emit Deposit(msg.sender, token, amount, getCurrentBatchId());\n    }\n\n    /** @dev Signals and initiates user's intent to withdraw.\n     * @param token address of token to be withdrawn\n     * @param amount number of token(s) to be withdrawn\n     *\n     * Emits an {WithdrawRequest} event with relevent request information.\n     */\n    function requestWithdraw(address token, uint256 amount) public {\n        requestFutureWithdraw(token, amount, getCurrentBatchId());\n    }\n\n    /** @dev Signals and initiates user's intent to withdraw.\n     * @param token address of token to be withdrawn\n     * @param amount number of token(s) to be withdrawn\n     * @param batchId state index at which request is to be made.\n     *\n     * Emits an {WithdrawRequest} event with relevent request information.\n     */\n    function requestFutureWithdraw(\n        address token,\n        uint256 amount,\n        uint32 batchId\n    ) public {\n        // First process pendingWithdraw (if any), as otherwise balances might increase for currentBatchId - 1\n        if (hasValidWithdrawRequest(msg.sender, token)) {\n            withdraw(msg.sender, token);\n        }\n        require(batchId >= getCurrentBatchId(), \"Request cannot be made in the past\");\n        balanceStates[msg.sender][token].pendingWithdraws = PendingFlux({amount: amount, batchId: batchId});\n        emit WithdrawRequest(msg.sender, token, amount, batchId);\n    }\n\n    /** @dev Claims pending withdraw - can be called on behalf of others\n     * @param token address of token to be withdrawn\n     * @param user address of user who withdraw is being claimed.\n     *\n     * Emits an {Withdraw} event stating that `user` withdrew `amount` of `token`\n     *\n     * Requirements:\n     * - withdraw was requested in previous epoch\n     * - token was received from exchange in current auction batch\n     */\n    function withdraw(address user, address token) public {\n        updateDepositsBalance(user, token); // withdrawn amount may have been deposited in previous epoch\n        require(\n            balanceStates[user][token].pendingWithdraws.batchId < getCurrentBatchId(),\n            \"withdraw was not registered previously\"\n        );\n        require(\n            lastCreditBatchId[user][token] < getCurrentBatchId(),\n            \"Withdraw not possible for token that is traded in the current auction\"\n        );\n        uint256 amount = Math.min(balanceStates[user][token].balance, balanceStates[user][token].pendingWithdraws.amount);\n\n        balanceStates[user][token].balance = balanceStates[user][token].balance.sub(amount);\n        delete balanceStates[user][token].pendingWithdraws;\n\n        SafeERC20.safeTransfer(IERC20(token), user, amount);\n        emit Withdraw(user, token, amount);\n    }\n\n    /**\n     * Public view functions\n     */\n    /** @dev getter function used to display pending deposit\n     * @param user address of user\n     * @param token address of ERC20 token\n     * return amount and batchId of deposit's transfer if any (else 0)\n     */\n    function getPendingDeposit(address user, address token) public view returns (uint256, uint32) {\n        PendingFlux memory pendingDeposit = balanceStates[user][token].pendingDeposits;\n        return (pendingDeposit.amount, pendingDeposit.batchId);\n    }\n\n    /** @dev getter function used to display pending withdraw\n     * @param user address of user\n     * @param token address of ERC20 token\n     * return amount and batchId when withdraw was requested if any (else 0)\n     */\n    function getPendingWithdraw(address user, address token) public view returns (uint256, uint32) {\n        PendingFlux memory pendingWithdraw = balanceStates[user][token].pendingWithdraws;\n        return (pendingWithdraw.amount, pendingWithdraw.batchId);\n    }\n\n    /** @dev getter function to determine current auction id.\n     * return current batchId\n     */\n    function getCurrentBatchId() public view returns (uint32) {\n        // solhint-disable-next-line not-rely-on-time\n        return uint32(now / BATCH_TIME);\n    }\n\n    /** @dev used to determine how much time is left in a batch\n     * return seconds remaining in current batch\n     */\n    function getSecondsRemainingInBatch() public view returns (uint256) {\n        // solhint-disable-next-line not-rely-on-time\n        return BATCH_TIME - (now % BATCH_TIME);\n    }\n\n    /** @dev fetches and returns user's balance\n     * @param user address of user\n     * @param token address of ERC20 token\n     * return Current `token` balance of `user`'s account\n     */\n    function getBalance(address user, address token) public view returns (uint256) {\n        uint256 balance = balanceStates[user][token].balance;\n        if (balanceStates[user][token].pendingDeposits.batchId < getCurrentBatchId()) {\n            balance = balance.add(balanceStates[user][token].pendingDeposits.amount);\n        }\n        if (balanceStates[user][token].pendingWithdraws.batchId < getCurrentBatchId()) {\n            balance = balance.sub(Math.min(balanceStates[user][token].pendingWithdraws.amount, balance));\n        }\n        return balance;\n    }\n\n    /** @dev Used to determine if user has a valid pending withdraw request of specific token\n     * @param user address of user\n     * @param token address of ERC20 token\n     * return true if `user` has valid withdraw request for `token`, otherwise false\n     */\n    function hasValidWithdrawRequest(address user, address token) public view returns (bool) {\n        return\n            balanceStates[user][token].pendingWithdraws.batchId < getCurrentBatchId() &&\n            balanceStates[user][token].pendingWithdraws.batchId > 0;\n    }\n\n    /**\n     * internal functions\n     */\n    /**\n     * The following function should be used to update any balances within an epoch, which\n     * will not be immediately final. E.g. the BatchExchange credits new balances to\n     * the buyers in an auction, but as there are might be better solutions, the updates are\n     * not final. In order to prevent withdraws from non-final updates, we disallow withdraws\n     * by setting lastCreditBatchId to the current batchId and allow only withdraws in batches\n     * with a higher batchId.\n     */\n    function addBalanceAndBlockWithdrawForThisBatch(\n        address user,\n        address token,\n        uint256 amount\n    ) internal {\n        if (hasValidWithdrawRequest(user, token)) {\n            lastCreditBatchId[user][token] = getCurrentBatchId();\n        }\n        addBalance(user, token, amount);\n    }\n\n    function addBalance(\n        address user,\n        address token,\n        uint256 amount\n    ) internal {\n        updateDepositsBalance(user, token);\n        balanceStates[user][token].balance = balanceStates[user][token].balance.add(amount);\n    }\n\n    /**\n     * The following function should be used to subtract amounts from the current balances state.\n     * For the substraction the current withdrawRequests are considered and they are effectively reducing\n     * the available balance.\n     */\n    function subtractBalance(\n        address user,\n        address token,\n        uint256 amount\n    ) internal {\n        require(amount <= getBalance(user, token), \"Amount exceeds user's balance.\");\n        subtractBalanceUnchecked(user, token, amount);\n    }\n\n    /**\n     * The following function should be used to substract amounts from the current balance\n     * state, if the pending withdrawRequests are not considered and should not effectively reduce\n     * the available balance.\n     * For example, the reversion of trades from a previous batch-solution do not\n     * need to consider withdrawRequests. This is the case as withdraws are blocked for one\n     * batch for accounts having credited funds in a previous submission.\n     * PendingWithdraws must also be ignored since otherwise for the reversion of trades,\n     * a solution reversion could be blocked: A bigger withdrawRequest could set the return value of\n     * getBalance(user, token) to zero, although the user was just credited tokens in\n     * the last submission. In this situation, during the unwinding of the previous orders,\n     * the check `amount <= getBalance(user, token)` would fail and the reversion would be blocked.\n     */\n    function subtractBalanceUnchecked(\n        address user,\n        address token,\n        uint256 amount\n    ) internal {\n        updateDepositsBalance(user, token);\n        balanceStates[user][token].balance = balanceStates[user][token].balance.sub(amount);\n    }\n\n    function updateDepositsBalance(address user, address token) private {\n        uint256 batchId = balanceStates[user][token].pendingDeposits.batchId;\n        if (batchId > 0 && batchId < getCurrentBatchId()) {\n            // batchId > 0 is checked in order save an SSTORE in case there is no pending deposit\n            balanceStates[user][token].balance = balanceStates[user][token].balance.add(\n                balanceStates[user][token].pendingDeposits.amount\n            );\n            delete balanceStates[user][token].pendingDeposits;\n        }\n    }\n}\n",
  "sourcePath": "/Users/felixleupold/Gnosis/dex-contracts/contracts/EpochTokenLocker.sol",
  "ast": {
    "absolutePath": "/Users/felixleupold/Gnosis/dex-contracts/contracts/EpochTokenLocker.sol",
    "exportedSymbols": {
      "EpochTokenLocker": [
        4188
      ]
    },
    "id": 4189,
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 3524,
        "literals": [
          "solidity",
          "^",
          "0.5",
          ".0"
        ],
        "nodeType": "PragmaDirective",
        "src": "0:23:3"
      },
      {
        "absolutePath": "@openzeppelin/contracts/math/Math.sol",
        "file": "@openzeppelin/contracts/math/Math.sol",
        "id": 3525,
        "nodeType": "ImportDirective",
        "scope": 4189,
        "sourceUnit": 8537,
        "src": "25:47:3",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "@openzeppelin/contracts/math/SafeMath.sol",
        "file": "@openzeppelin/contracts/math/SafeMath.sol",
        "id": 3526,
        "nodeType": "ImportDirective",
        "scope": 4189,
        "sourceUnit": 8724,
        "src": "73:51:3",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "@openzeppelin/contracts/token/ERC20/IERC20.sol",
        "file": "@openzeppelin/contracts/token/ERC20/IERC20.sol",
        "id": 3527,
        "nodeType": "ImportDirective",
        "scope": 4189,
        "sourceUnit": 9402,
        "src": "125:56:3",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "@openzeppelin/contracts/token/ERC20/SafeERC20.sol",
        "file": "@openzeppelin/contracts/token/ERC20/SafeERC20.sol",
        "id": 3528,
        "nodeType": "ImportDirective",
        "scope": 4189,
        "sourceUnit": 9622,
        "src": "182:59:3",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "baseContracts": [],
        "contractDependencies": [],
        "contractKind": "contract",
        "documentation": "@title Epoch Token Locker\n EpochTokenLocker saveguards tokens for applications with constant-balances during discrete epochs\n It allows to deposit a token which become credited in the next epoch and allows to request a token-withdraw\n which becomes claimable after the current epoch has expired.\n @author @gnosis/dfusion-team <https://github.com/orgs/gnosis/teams/dfusion-team/members>",
        "fullyImplemented": true,
        "id": 4188,
        "linearizedBaseContracts": [
          4188
        ],
        "name": "EpochTokenLocker",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "id": 3531,
            "libraryName": {
              "contractScope": null,
              "id": 3529,
              "name": "SafeMath",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 8723,
              "src": "687:8:3",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_SafeMath_$8723",
                "typeString": "library SafeMath"
              }
            },
            "nodeType": "UsingForDirective",
            "src": "681:27:3",
            "typeName": {
              "id": 3530,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "700:7:3",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            }
          },
          {
            "constant": true,
            "id": 3534,
            "name": "BATCH_TIME",
            "nodeType": "VariableDeclaration",
            "scope": 4188,
            "src": "766:39:3",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint32",
              "typeString": "uint32"
            },
            "typeName": {
              "id": 3532,
              "name": "uint32",
              "nodeType": "ElementaryTypeName",
              "src": "766:6:3",
              "typeDescriptions": {
                "typeIdentifier": "t_uint32",
                "typeString": "uint32"
              }
            },
            "value": {
              "argumentTypes": null,
              "hexValue": "333030",
              "id": 3533,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "number",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "802:3:3",
              "subdenomination": null,
              "typeDescriptions": {
                "typeIdentifier": "t_rational_300_by_1",
                "typeString": "int_const 300"
              },
              "value": "300"
            },
            "visibility": "public"
          },
          {
            "constant": false,
            "id": 3540,
            "name": "balanceStates",
            "nodeType": "VariableDeclaration",
            "scope": 4188,
            "src": "849:74:3",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$_$",
              "typeString": "mapping(address => mapping(address => struct EpochTokenLocker.BalanceState))"
            },
            "typeName": {
              "id": 3539,
              "keyType": {
                "id": 3535,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "857:7:3",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              },
              "nodeType": "Mapping",
              "src": "849:52:3",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$_$",
                "typeString": "mapping(address => mapping(address => struct EpochTokenLocker.BalanceState))"
              },
              "valueType": {
                "id": 3538,
                "keyType": {
                  "id": 3536,
                  "name": "address",
                  "nodeType": "ElementaryTypeName",
                  "src": "876:7:3",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  }
                },
                "nodeType": "Mapping",
                "src": "868:32:3",
                "typeDescriptions": {
                  "typeIdentifier": "t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$",
                  "typeString": "mapping(address => struct EpochTokenLocker.BalanceState)"
                },
                "valueType": {
                  "contractScope": null,
                  "id": 3537,
                  "name": "BalanceState",
                  "nodeType": "UserDefinedTypeName",
                  "referencedDeclaration": 3553,
                  "src": "887:12:3",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_BalanceState_$3553_storage_ptr",
                    "typeString": "struct EpochTokenLocker.BalanceState"
                  }
                }
              }
            },
            "value": null,
            "visibility": "private"
          },
          {
            "constant": false,
            "id": 3546,
            "name": "lastCreditBatchId",
            "nodeType": "VariableDeclaration",
            "scope": 4188,
            "src": "972:71:3",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint32_$_$",
              "typeString": "mapping(address => mapping(address => uint32))"
            },
            "typeName": {
              "id": 3545,
              "keyType": {
                "id": 3541,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "980:7:3",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              },
              "nodeType": "Mapping",
              "src": "972:46:3",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint32_$_$",
                "typeString": "mapping(address => mapping(address => uint32))"
              },
              "valueType": {
                "id": 3544,
                "keyType": {
                  "id": 3542,
                  "name": "address",
                  "nodeType": "ElementaryTypeName",
                  "src": "999:7:3",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  }
                },
                "nodeType": "Mapping",
                "src": "991:26:3",
                "typeDescriptions": {
                  "typeIdentifier": "t_mapping$_t_address_$_t_uint32_$",
                  "typeString": "mapping(address => uint32)"
                },
                "valueType": {
                  "id": 3543,
                  "name": "uint32",
                  "nodeType": "ElementaryTypeName",
                  "src": "1010:6:3",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint32",
                    "typeString": "uint32"
                  }
                }
              }
            },
            "value": null,
            "visibility": "public"
          },
          {
            "canonicalName": "EpochTokenLocker.BalanceState",
            "id": 3553,
            "members": [
              {
                "constant": false,
                "id": 3548,
                "name": "balance",
                "nodeType": "VariableDeclaration",
                "scope": 3553,
                "src": "1080:15:3",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                },
                "typeName": {
                  "id": 3547,
                  "name": "uint256",
                  "nodeType": "ElementaryTypeName",
                  "src": "1080:7:3",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  }
                },
                "value": null,
                "visibility": "internal"
              },
              {
                "constant": false,
                "id": 3550,
                "name": "pendingDeposits",
                "nodeType": "VariableDeclaration",
                "scope": 3553,
                "src": "1105:27:3",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_struct$_PendingFlux_$3558_storage_ptr",
                  "typeString": "struct EpochTokenLocker.PendingFlux"
                },
                "typeName": {
                  "contractScope": null,
                  "id": 3549,
                  "name": "PendingFlux",
                  "nodeType": "UserDefinedTypeName",
                  "referencedDeclaration": 3558,
                  "src": "1105:11:3",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_PendingFlux_$3558_storage_ptr",
                    "typeString": "struct EpochTokenLocker.PendingFlux"
                  }
                },
                "value": null,
                "visibility": "internal"
              },
              {
                "constant": false,
                "id": 3552,
                "name": "pendingWithdraws",
                "nodeType": "VariableDeclaration",
                "scope": 3553,
                "src": "1225:28:3",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_struct$_PendingFlux_$3558_storage_ptr",
                  "typeString": "struct EpochTokenLocker.PendingFlux"
                },
                "typeName": {
                  "contractScope": null,
                  "id": 3551,
                  "name": "PendingFlux",
                  "nodeType": "UserDefinedTypeName",
                  "referencedDeclaration": 3558,
                  "src": "1225:11:3",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_PendingFlux_$3558_storage_ptr",
                    "typeString": "struct EpochTokenLocker.PendingFlux"
                  }
                },
                "value": null,
                "visibility": "internal"
              }
            ],
            "name": "BalanceState",
            "nodeType": "StructDefinition",
            "scope": 4188,
            "src": "1050:289:3",
            "visibility": "public"
          },
          {
            "canonicalName": "EpochTokenLocker.PendingFlux",
            "id": 3558,
            "members": [
              {
                "constant": false,
                "id": 3555,
                "name": "amount",
                "nodeType": "VariableDeclaration",
                "scope": 3558,
                "src": "1374:14:3",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                },
                "typeName": {
                  "id": 3554,
                  "name": "uint256",
                  "nodeType": "ElementaryTypeName",
                  "src": "1374:7:3",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  }
                },
                "value": null,
                "visibility": "internal"
              },
              {
                "constant": false,
                "id": 3557,
                "name": "batchId",
                "nodeType": "VariableDeclaration",
                "scope": 3558,
                "src": "1398:14:3",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint32",
                  "typeString": "uint32"
                },
                "typeName": {
                  "id": 3556,
                  "name": "uint32",
                  "nodeType": "ElementaryTypeName",
                  "src": "1398:6:3",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint32",
                    "typeString": "uint32"
                  }
                },
                "value": null,
                "visibility": "internal"
              }
            ],
            "name": "PendingFlux",
            "nodeType": "StructDefinition",
            "scope": 4188,
            "src": "1345:74:3",
            "visibility": "public"
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 3568,
            "name": "Deposit",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 3567,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3560,
                  "indexed": true,
                  "name": "user",
                  "nodeType": "VariableDeclaration",
                  "scope": 3568,
                  "src": "1439:20:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3559,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1439:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3562,
                  "indexed": true,
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "scope": 3568,
                  "src": "1461:21:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3561,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1461:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3564,
                  "indexed": false,
                  "name": "amount",
                  "nodeType": "VariableDeclaration",
                  "scope": 3568,
                  "src": "1484:14:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3563,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1484:7:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3566,
                  "indexed": false,
                  "name": "batchId",
                  "nodeType": "VariableDeclaration",
                  "scope": 3568,
                  "src": "1500:14:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint32",
                    "typeString": "uint32"
                  },
                  "typeName": {
                    "id": 3565,
                    "name": "uint32",
                    "nodeType": "ElementaryTypeName",
                    "src": "1500:6:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint32",
                      "typeString": "uint32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1438:77:3"
            },
            "src": "1425:91:3"
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 3578,
            "name": "WithdrawRequest",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 3577,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3570,
                  "indexed": true,
                  "name": "user",
                  "nodeType": "VariableDeclaration",
                  "scope": 3578,
                  "src": "1544:20:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3569,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1544:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3572,
                  "indexed": true,
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "scope": 3578,
                  "src": "1566:21:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3571,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1566:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3574,
                  "indexed": false,
                  "name": "amount",
                  "nodeType": "VariableDeclaration",
                  "scope": 3578,
                  "src": "1589:14:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3573,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1589:7:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3576,
                  "indexed": false,
                  "name": "batchId",
                  "nodeType": "VariableDeclaration",
                  "scope": 3578,
                  "src": "1605:14:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint32",
                    "typeString": "uint32"
                  },
                  "typeName": {
                    "id": 3575,
                    "name": "uint32",
                    "nodeType": "ElementaryTypeName",
                    "src": "1605:6:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint32",
                      "typeString": "uint32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1543:77:3"
            },
            "src": "1522:99:3"
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 3586,
            "name": "Withdraw",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 3585,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3580,
                  "indexed": true,
                  "name": "user",
                  "nodeType": "VariableDeclaration",
                  "scope": 3586,
                  "src": "1642:20:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3579,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1642:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3582,
                  "indexed": true,
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "scope": 3586,
                  "src": "1664:21:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3581,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1664:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3584,
                  "indexed": false,
                  "name": "amount",
                  "nodeType": "VariableDeclaration",
                  "scope": 3586,
                  "src": "1687:14:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3583,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1687:7:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1641:61:3"
            },
            "src": "1627:76:3"
          },
          {
            "body": {
              "id": 3655,
              "nodeType": "Block",
              "src": "2140:511:3",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 3594,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 10242,
                          "src": "2172:3:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 3595,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "2172:10:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 3596,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3588,
                        "src": "2184:5:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 3593,
                      "name": "updateDepositsBalance",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 4187,
                      "src": "2150:21:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$returns$__$",
                        "typeString": "function (address,address)"
                      }
                    },
                    "id": 3597,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2150:40:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 3598,
                  "nodeType": "ExpressionStatement",
                  "src": "2150:40:3"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 3603,
                            "name": "token",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3588,
                            "src": "2234:5:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          ],
                          "id": 3602,
                          "name": "IERC20",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 9401,
                          "src": "2227:6:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_contract$_IERC20_$9401_$",
                            "typeString": "type(contract IERC20)"
                          }
                        },
                        "id": 3604,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "2227:13:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$9401",
                          "typeString": "contract IERC20"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 3605,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 10242,
                          "src": "2242:3:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 3606,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "2242:10:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 3608,
                            "name": "this",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 10266,
                            "src": "2262:4:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_EpochTokenLocker_$4188",
                              "typeString": "contract EpochTokenLocker"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_contract$_EpochTokenLocker_$4188",
                              "typeString": "contract EpochTokenLocker"
                            }
                          ],
                          "id": 3607,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "2254:7:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": "address"
                        },
                        "id": 3609,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "2254:13:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 3610,
                        "name": "amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3590,
                        "src": "2269:6:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_contract$_IERC20_$9401",
                          "typeString": "contract IERC20"
                        },
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 3599,
                        "name": "SafeERC20",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 9621,
                        "src": "2200:9:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_contract$_SafeERC20_$9621_$",
                          "typeString": "type(library SafeERC20)"
                        }
                      },
                      "id": 3601,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "safeTransferFrom",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 9459,
                      "src": "2200:26:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$9401_$_t_address_$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (contract IERC20,address,address,uint256)"
                      }
                    },
                    "id": 3611,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2200:76:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 3612,
                  "nodeType": "ExpressionStatement",
                  "src": "2200:76:3"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 3632,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 3613,
                              "name": "balanceStates",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3540,
                              "src": "2339:13:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$_$",
                                "typeString": "mapping(address => mapping(address => struct EpochTokenLocker.BalanceState storage ref))"
                              }
                            },
                            "id": 3617,
                            "indexExpression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 3614,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 10242,
                                "src": "2353:3:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 3615,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "2353:10:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "2339:25:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$",
                              "typeString": "mapping(address => struct EpochTokenLocker.BalanceState storage ref)"
                            }
                          },
                          "id": 3618,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 3616,
                            "name": "token",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3588,
                            "src": "2365:5:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "2339:32:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_BalanceState_$3553_storage",
                            "typeString": "struct EpochTokenLocker.BalanceState storage ref"
                          }
                        },
                        "id": 3619,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "pendingDeposits",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 3550,
                        "src": "2339:48:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_PendingFlux_$3558_storage",
                          "typeString": "struct EpochTokenLocker.PendingFlux storage ref"
                        }
                      },
                      "id": 3620,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberName": "amount",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 3555,
                      "src": "2339:55:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 3630,
                          "name": "amount",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3590,
                          "src": "2470:6:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        ],
                        "expression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 3621,
                                  "name": "balanceStates",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 3540,
                                  "src": "2397:13:3",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$_$",
                                    "typeString": "mapping(address => mapping(address => struct EpochTokenLocker.BalanceState storage ref))"
                                  }
                                },
                                "id": 3624,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 3622,
                                    "name": "msg",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 10242,
                                    "src": "2411:3:3",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_magic_message",
                                      "typeString": "msg"
                                    }
                                  },
                                  "id": 3623,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "sender",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": null,
                                  "src": "2411:10:3",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address_payable",
                                    "typeString": "address payable"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "2397:25:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$",
                                  "typeString": "mapping(address => struct EpochTokenLocker.BalanceState storage ref)"
                                }
                              },
                              "id": 3626,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 3625,
                                "name": "token",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3588,
                                "src": "2423:5:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "2397:32:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_BalanceState_$3553_storage",
                                "typeString": "struct EpochTokenLocker.BalanceState storage ref"
                              }
                            },
                            "id": 3627,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "pendingDeposits",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 3550,
                            "src": "2397:48:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_PendingFlux_$3558_storage",
                              "typeString": "struct EpochTokenLocker.PendingFlux storage ref"
                            }
                          },
                          "id": 3628,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "amount",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 3555,
                          "src": "2397:55:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 3629,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "add",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 8563,
                        "src": "2397:59:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                          "typeString": "function (uint256,uint256) pure returns (uint256)"
                        }
                      },
                      "id": 3631,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "2397:89:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "2339:147:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 3633,
                  "nodeType": "ExpressionStatement",
                  "src": "2339:147:3"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 3644,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 3634,
                              "name": "balanceStates",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3540,
                              "src": "2496:13:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$_$",
                                "typeString": "mapping(address => mapping(address => struct EpochTokenLocker.BalanceState storage ref))"
                              }
                            },
                            "id": 3638,
                            "indexExpression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 3635,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 10242,
                                "src": "2510:3:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 3636,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "2510:10:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "2496:25:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$",
                              "typeString": "mapping(address => struct EpochTokenLocker.BalanceState storage ref)"
                            }
                          },
                          "id": 3639,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 3637,
                            "name": "token",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3588,
                            "src": "2522:5:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "2496:32:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_BalanceState_$3553_storage",
                            "typeString": "struct EpochTokenLocker.BalanceState storage ref"
                          }
                        },
                        "id": 3640,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "pendingDeposits",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 3550,
                        "src": "2496:48:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_PendingFlux_$3558_storage",
                          "typeString": "struct EpochTokenLocker.PendingFlux storage ref"
                        }
                      },
                      "id": 3641,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberName": "batchId",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 3557,
                      "src": "2496:56:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint32",
                        "typeString": "uint32"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 3642,
                        "name": "getCurrentBatchId",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3888,
                        "src": "2555:17:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_view$__$returns$_t_uint32_$",
                          "typeString": "function () view returns (uint32)"
                        }
                      },
                      "id": 3643,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "2555:19:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint32",
                        "typeString": "uint32"
                      }
                    },
                    "src": "2496:78:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint32",
                      "typeString": "uint32"
                    }
                  },
                  "id": 3645,
                  "nodeType": "ExpressionStatement",
                  "src": "2496:78:3"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 3647,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 10242,
                          "src": "2597:3:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 3648,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "2597:10:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 3649,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3588,
                        "src": "2609:5:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 3650,
                        "name": "amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3590,
                        "src": "2616:6:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "arguments": [],
                        "expression": {
                          "argumentTypes": [],
                          "id": 3651,
                          "name": "getCurrentBatchId",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3888,
                          "src": "2624:17:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_view$__$returns$_t_uint32_$",
                            "typeString": "function () view returns (uint32)"
                          }
                        },
                        "id": 3652,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "2624:19:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        }
                      ],
                      "id": 3646,
                      "name": "Deposit",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 3568,
                      "src": "2589:7:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_uint32_$returns$__$",
                        "typeString": "function (address,address,uint256,uint32)"
                      }
                    },
                    "id": 3653,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2589:55:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 3654,
                  "nodeType": "EmitStatement",
                  "src": "2584:60:3"
                }
              ]
            },
            "documentation": "@dev credits user with deposit amount on next epoch (given by getCurrentBatchId)\n@param token address of token to be deposited\n@param amount number of token(s) to be credited to user's account\n     * Emits an {Deposit} event with relevent deposit information.\n     * Requirements:\n- token transfer to contract is successfull",
            "id": 3656,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "deposit",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 3591,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3588,
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "scope": 3656,
                  "src": "2102:13:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3587,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2102:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3590,
                  "name": "amount",
                  "nodeType": "VariableDeclaration",
                  "scope": 3656,
                  "src": "2117:14:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3589,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2117:7:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2101:31:3"
            },
            "returnParameters": {
              "id": 3592,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2140:0:3"
            },
            "scope": 4188,
            "src": "2085:566:3",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 3670,
              "nodeType": "Block",
              "src": "2981:74:3",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 3664,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3658,
                        "src": "3013:5:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 3665,
                        "name": "amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3660,
                        "src": "3020:6:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "arguments": [],
                        "expression": {
                          "argumentTypes": [],
                          "id": 3666,
                          "name": "getCurrentBatchId",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3888,
                          "src": "3028:17:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_view$__$returns$_t_uint32_$",
                            "typeString": "function () view returns (uint32)"
                          }
                        },
                        "id": 3667,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "3028:19:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        }
                      ],
                      "id": 3663,
                      "name": "requestFutureWithdraw",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 3723,
                      "src": "2991:21:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$_t_uint32_$returns$__$",
                        "typeString": "function (address,uint256,uint32)"
                      }
                    },
                    "id": 3668,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2991:57:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 3669,
                  "nodeType": "ExpressionStatement",
                  "src": "2991:57:3"
                }
              ]
            },
            "documentation": "@dev Signals and initiates user's intent to withdraw.\n@param token address of token to be withdrawn\n@param amount number of token(s) to be withdrawn\n     * Emits an {WithdrawRequest} event with relevent request information.",
            "id": 3671,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "requestWithdraw",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 3661,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3658,
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "scope": 3671,
                  "src": "2943:13:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3657,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2943:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3660,
                  "name": "amount",
                  "nodeType": "VariableDeclaration",
                  "scope": 3671,
                  "src": "2958:14:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3659,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2958:7:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2942:31:3"
            },
            "returnParameters": {
              "id": 3662,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2981:0:3"
            },
            "scope": 4188,
            "src": "2918:137:3",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 3722,
              "nodeType": "Block",
              "src": "3503:489:3",
              "statements": [
                {
                  "condition": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 3681,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 10242,
                          "src": "3652:3:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 3682,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "3652:10:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 3683,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3673,
                        "src": "3664:5:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 3680,
                      "name": "hasValidWithdrawRequest",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 4007,
                      "src": "3628:23:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_address_$_t_address_$returns$_t_bool_$",
                        "typeString": "function (address,address) view returns (bool)"
                      }
                    },
                    "id": 3684,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3628:42:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 3692,
                  "nodeType": "IfStatement",
                  "src": "3624:100:3",
                  "trueBody": {
                    "id": 3691,
                    "nodeType": "Block",
                    "src": "3672:52:3",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 3686,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 10242,
                                "src": "3695:3:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 3687,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "3695:10:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 3688,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3673,
                              "src": "3707:5:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 3685,
                            "name": "withdraw",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3822,
                            "src": "3686:8:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$returns$__$",
                              "typeString": "function (address,address)"
                            }
                          },
                          "id": 3689,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3686:27:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 3690,
                        "nodeType": "ExpressionStatement",
                        "src": "3686:27:3"
                      }
                    ]
                  }
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        },
                        "id": 3697,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 3694,
                          "name": "batchId",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3677,
                          "src": "3741:7:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": ">=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 3695,
                            "name": "getCurrentBatchId",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3888,
                            "src": "3752:17:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$__$returns$_t_uint32_$",
                              "typeString": "function () view returns (uint32)"
                            }
                          },
                          "id": 3696,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3752:19:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "src": "3741:30:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "526571756573742063616e6e6f74206265206d61646520696e207468652070617374",
                        "id": 3698,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "3773:36:3",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_fd823ddd348b7dfce824ea8cc767ce782aa7d36d826897afdf2384ef8a55d6b8",
                          "typeString": "literal_string \"Request cannot be made in the past\""
                        },
                        "value": "Request cannot be made in the past"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_fd823ddd348b7dfce824ea8cc767ce782aa7d36d826897afdf2384ef8a55d6b8",
                          "typeString": "literal_string \"Request cannot be made in the past\""
                        }
                      ],
                      "id": 3693,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        10245,
                        10246
                      ],
                      "referencedDeclaration": 10246,
                      "src": "3733:7:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 3699,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3733:77:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 3700,
                  "nodeType": "ExpressionStatement",
                  "src": "3733:77:3"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 3712,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "baseExpression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 3701,
                            "name": "balanceStates",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3540,
                            "src": "3820:13:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$_$",
                              "typeString": "mapping(address => mapping(address => struct EpochTokenLocker.BalanceState storage ref))"
                            }
                          },
                          "id": 3705,
                          "indexExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 3702,
                              "name": "msg",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 10242,
                              "src": "3834:3:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_message",
                                "typeString": "msg"
                              }
                            },
                            "id": 3703,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sender",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "3834:10:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "3820:25:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$",
                            "typeString": "mapping(address => struct EpochTokenLocker.BalanceState storage ref)"
                          }
                        },
                        "id": 3706,
                        "indexExpression": {
                          "argumentTypes": null,
                          "id": 3704,
                          "name": "token",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3673,
                          "src": "3846:5:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "3820:32:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_BalanceState_$3553_storage",
                          "typeString": "struct EpochTokenLocker.BalanceState storage ref"
                        }
                      },
                      "id": 3707,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberName": "pendingWithdraws",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 3552,
                      "src": "3820:49:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_PendingFlux_$3558_storage",
                        "typeString": "struct EpochTokenLocker.PendingFlux storage ref"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 3709,
                          "name": "amount",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3675,
                          "src": "3893:6:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        {
                          "argumentTypes": null,
                          "id": 3710,
                          "name": "batchId",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3677,
                          "src": "3910:7:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        ],
                        "id": 3708,
                        "name": "PendingFlux",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3558,
                        "src": "3872:11:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_struct$_PendingFlux_$3558_storage_ptr_$",
                          "typeString": "type(struct EpochTokenLocker.PendingFlux storage pointer)"
                        }
                      },
                      "id": 3711,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "structConstructorCall",
                      "lValueRequested": false,
                      "names": [
                        "amount",
                        "batchId"
                      ],
                      "nodeType": "FunctionCall",
                      "src": "3872:47:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_PendingFlux_$3558_memory",
                        "typeString": "struct EpochTokenLocker.PendingFlux memory"
                      }
                    },
                    "src": "3820:99:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_PendingFlux_$3558_storage",
                      "typeString": "struct EpochTokenLocker.PendingFlux storage ref"
                    }
                  },
                  "id": 3713,
                  "nodeType": "ExpressionStatement",
                  "src": "3820:99:3"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 3715,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 10242,
                          "src": "3950:3:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 3716,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "3950:10:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 3717,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3673,
                        "src": "3962:5:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 3718,
                        "name": "amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3675,
                        "src": "3969:6:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 3719,
                        "name": "batchId",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3677,
                        "src": "3977:7:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        }
                      ],
                      "id": 3714,
                      "name": "WithdrawRequest",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 3578,
                      "src": "3934:15:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_uint32_$returns$__$",
                        "typeString": "function (address,address,uint256,uint32)"
                      }
                    },
                    "id": 3720,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3934:51:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 3721,
                  "nodeType": "EmitStatement",
                  "src": "3929:56:3"
                }
              ]
            },
            "documentation": "@dev Signals and initiates user's intent to withdraw.\n@param token address of token to be withdrawn\n@param amount number of token(s) to be withdrawn\n@param batchId state index at which request is to be made.\n     * Emits an {WithdrawRequest} event with relevent request information.",
            "id": 3723,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "requestFutureWithdraw",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 3678,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3673,
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "scope": 3723,
                  "src": "3428:13:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3672,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3428:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3675,
                  "name": "amount",
                  "nodeType": "VariableDeclaration",
                  "scope": 3723,
                  "src": "3451:14:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3674,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "3451:7:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3677,
                  "name": "batchId",
                  "nodeType": "VariableDeclaration",
                  "scope": 3723,
                  "src": "3475:14:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint32",
                    "typeString": "uint32"
                  },
                  "typeName": {
                    "id": 3676,
                    "name": "uint32",
                    "nodeType": "ElementaryTypeName",
                    "src": "3475:6:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint32",
                      "typeString": "uint32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3418:77:3"
            },
            "returnParameters": {
              "id": 3679,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3503:0:3"
            },
            "scope": 4188,
            "src": "3388:604:3",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 3821,
              "nodeType": "Block",
              "src": "4486:842:3",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 3731,
                        "name": "user",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3725,
                        "src": "4518:4:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 3732,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3727,
                        "src": "4524:5:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 3730,
                      "name": "updateDepositsBalance",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 4187,
                      "src": "4496:21:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$returns$__$",
                        "typeString": "function (address,address)"
                      }
                    },
                    "id": 3733,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4496:34:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 3734,
                  "nodeType": "ExpressionStatement",
                  "src": "4496:34:3"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        },
                        "id": 3745,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 3736,
                                  "name": "balanceStates",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 3540,
                                  "src": "4623:13:3",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$_$",
                                    "typeString": "mapping(address => mapping(address => struct EpochTokenLocker.BalanceState storage ref))"
                                  }
                                },
                                "id": 3738,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 3737,
                                  "name": "user",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 3725,
                                  "src": "4637:4:3",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "4623:19:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$",
                                  "typeString": "mapping(address => struct EpochTokenLocker.BalanceState storage ref)"
                                }
                              },
                              "id": 3740,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 3739,
                                "name": "token",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3727,
                                "src": "4643:5:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "4623:26:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_BalanceState_$3553_storage",
                                "typeString": "struct EpochTokenLocker.BalanceState storage ref"
                              }
                            },
                            "id": 3741,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "pendingWithdraws",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 3552,
                            "src": "4623:43:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_PendingFlux_$3558_storage",
                              "typeString": "struct EpochTokenLocker.PendingFlux storage ref"
                            }
                          },
                          "id": 3742,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "batchId",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 3557,
                          "src": "4623:51:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "<",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 3743,
                            "name": "getCurrentBatchId",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3888,
                            "src": "4677:17:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$__$returns$_t_uint32_$",
                              "typeString": "function () view returns (uint32)"
                            }
                          },
                          "id": 3744,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4677:19:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "src": "4623:73:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "776974686472617720776173206e6f7420726567697374657265642070726576696f75736c79",
                        "id": 3746,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "4710:40:3",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_a8d401a914d43eb039a6bcd8282964d80be6445aae392b14acfcab8cff0d345c",
                          "typeString": "literal_string \"withdraw was not registered previously\""
                        },
                        "value": "withdraw was not registered previously"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_a8d401a914d43eb039a6bcd8282964d80be6445aae392b14acfcab8cff0d345c",
                          "typeString": "literal_string \"withdraw was not registered previously\""
                        }
                      ],
                      "id": 3735,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        10245,
                        10246
                      ],
                      "referencedDeclaration": 10246,
                      "src": "4602:7:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 3747,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4602:158:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 3748,
                  "nodeType": "ExpressionStatement",
                  "src": "4602:158:3"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        },
                        "id": 3757,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 3750,
                              "name": "lastCreditBatchId",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3546,
                              "src": "4791:17:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint32_$_$",
                                "typeString": "mapping(address => mapping(address => uint32))"
                              }
                            },
                            "id": 3752,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 3751,
                              "name": "user",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3725,
                              "src": "4809:4:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "4791:23:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_uint32_$",
                              "typeString": "mapping(address => uint32)"
                            }
                          },
                          "id": 3754,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 3753,
                            "name": "token",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3727,
                            "src": "4815:5:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "4791:30:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "<",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 3755,
                            "name": "getCurrentBatchId",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3888,
                            "src": "4824:17:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$__$returns$_t_uint32_$",
                              "typeString": "function () view returns (uint32)"
                            }
                          },
                          "id": 3756,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4824:19:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "src": "4791:52:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "5769746864726177206e6f7420706f737369626c6520666f7220746f6b656e20746861742069732074726164656420696e207468652063757272656e742061756374696f6e",
                        "id": 3758,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "4857:71:3",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_6d363b774611e015ae4b37ced0beb96af88baf5d7d48f43e651448aeca6e96b6",
                          "typeString": "literal_string \"Withdraw not possible for token that is traded in the current auction\""
                        },
                        "value": "Withdraw not possible for token that is traded in the current auction"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_6d363b774611e015ae4b37ced0beb96af88baf5d7d48f43e651448aeca6e96b6",
                          "typeString": "literal_string \"Withdraw not possible for token that is traded in the current auction\""
                        }
                      ],
                      "id": 3749,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        10245,
                        10246
                      ],
                      "referencedDeclaration": 10246,
                      "src": "4770:7:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 3759,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4770:168:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 3760,
                  "nodeType": "ExpressionStatement",
                  "src": "4770:168:3"
                },
                {
                  "assignments": [
                    3762
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 3762,
                      "name": "amount",
                      "nodeType": "VariableDeclaration",
                      "scope": 3821,
                      "src": "4948:14:3",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 3761,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "4948:7:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 3779,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 3765,
                              "name": "balanceStates",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3540,
                              "src": "4974:13:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$_$",
                                "typeString": "mapping(address => mapping(address => struct EpochTokenLocker.BalanceState storage ref))"
                              }
                            },
                            "id": 3767,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 3766,
                              "name": "user",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3725,
                              "src": "4988:4:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "4974:19:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$",
                              "typeString": "mapping(address => struct EpochTokenLocker.BalanceState storage ref)"
                            }
                          },
                          "id": 3769,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 3768,
                            "name": "token",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3727,
                            "src": "4994:5:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "4974:26:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_BalanceState_$3553_storage",
                            "typeString": "struct EpochTokenLocker.BalanceState storage ref"
                          }
                        },
                        "id": 3770,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "balance",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 3548,
                        "src": "4974:34:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 3771,
                                "name": "balanceStates",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3540,
                                "src": "5010:13:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$_$",
                                  "typeString": "mapping(address => mapping(address => struct EpochTokenLocker.BalanceState storage ref))"
                                }
                              },
                              "id": 3773,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 3772,
                                "name": "user",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3725,
                                "src": "5024:4:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "5010:19:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$",
                                "typeString": "mapping(address => struct EpochTokenLocker.BalanceState storage ref)"
                              }
                            },
                            "id": 3775,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 3774,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3727,
                              "src": "5030:5:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "5010:26:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_BalanceState_$3553_storage",
                              "typeString": "struct EpochTokenLocker.BalanceState storage ref"
                            }
                          },
                          "id": 3776,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "pendingWithdraws",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 3552,
                          "src": "5010:43:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_PendingFlux_$3558_storage",
                            "typeString": "struct EpochTokenLocker.PendingFlux storage ref"
                          }
                        },
                        "id": 3777,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "amount",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 3555,
                        "src": "5010:50:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 3763,
                        "name": "Math",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 8536,
                        "src": "4965:4:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_contract$_Math_$8536_$",
                          "typeString": "type(library Math)"
                        }
                      },
                      "id": 3764,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "min",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 8503,
                      "src": "4965:8:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                        "typeString": "function (uint256,uint256) pure returns (uint256)"
                      }
                    },
                    "id": 3778,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4965:96:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "4948:113:3"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 3795,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "baseExpression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 3780,
                            "name": "balanceStates",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3540,
                            "src": "5072:13:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$_$",
                              "typeString": "mapping(address => mapping(address => struct EpochTokenLocker.BalanceState storage ref))"
                            }
                          },
                          "id": 3783,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 3781,
                            "name": "user",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3725,
                            "src": "5086:4:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "5072:19:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$",
                            "typeString": "mapping(address => struct EpochTokenLocker.BalanceState storage ref)"
                          }
                        },
                        "id": 3784,
                        "indexExpression": {
                          "argumentTypes": null,
                          "id": 3782,
                          "name": "token",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3727,
                          "src": "5092:5:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "5072:26:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_BalanceState_$3553_storage",
                          "typeString": "struct EpochTokenLocker.BalanceState storage ref"
                        }
                      },
                      "id": 3785,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberName": "balance",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 3548,
                      "src": "5072:34:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 3793,
                          "name": "amount",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3762,
                          "src": "5148:6:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        ],
                        "expression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 3786,
                                "name": "balanceStates",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3540,
                                "src": "5109:13:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$_$",
                                  "typeString": "mapping(address => mapping(address => struct EpochTokenLocker.BalanceState storage ref))"
                                }
                              },
                              "id": 3788,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 3787,
                                "name": "user",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3725,
                                "src": "5123:4:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "5109:19:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$",
                                "typeString": "mapping(address => struct EpochTokenLocker.BalanceState storage ref)"
                              }
                            },
                            "id": 3790,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 3789,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3727,
                              "src": "5129:5:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "5109:26:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_BalanceState_$3553_storage",
                              "typeString": "struct EpochTokenLocker.BalanceState storage ref"
                            }
                          },
                          "id": 3791,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "balance",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 3548,
                          "src": "5109:34:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 3792,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sub",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 8579,
                        "src": "5109:38:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                          "typeString": "function (uint256,uint256) pure returns (uint256)"
                        }
                      },
                      "id": 3794,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "5109:46:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "5072:83:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 3796,
                  "nodeType": "ExpressionStatement",
                  "src": "5072:83:3"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 3803,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "UnaryOperation",
                    "operator": "delete",
                    "prefix": true,
                    "src": "5165:50:3",
                    "subExpression": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "baseExpression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 3797,
                            "name": "balanceStates",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3540,
                            "src": "5172:13:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$_$",
                              "typeString": "mapping(address => mapping(address => struct EpochTokenLocker.BalanceState storage ref))"
                            }
                          },
                          "id": 3799,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 3798,
                            "name": "user",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3725,
                            "src": "5186:4:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "5172:19:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$",
                            "typeString": "mapping(address => struct EpochTokenLocker.BalanceState storage ref)"
                          }
                        },
                        "id": 3801,
                        "indexExpression": {
                          "argumentTypes": null,
                          "id": 3800,
                          "name": "token",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3727,
                          "src": "5192:5:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "5172:26:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_BalanceState_$3553_storage",
                          "typeString": "struct EpochTokenLocker.BalanceState storage ref"
                        }
                      },
                      "id": 3802,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberName": "pendingWithdraws",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 3552,
                      "src": "5172:43:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_PendingFlux_$3558_storage",
                        "typeString": "struct EpochTokenLocker.PendingFlux storage ref"
                      }
                    },
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 3804,
                  "nodeType": "ExpressionStatement",
                  "src": "5165:50:3"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 3809,
                            "name": "token",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3727,
                            "src": "5256:5:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          ],
                          "id": 3808,
                          "name": "IERC20",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 9401,
                          "src": "5249:6:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_contract$_IERC20_$9401_$",
                            "typeString": "type(contract IERC20)"
                          }
                        },
                        "id": 3810,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "5249:13:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$9401",
                          "typeString": "contract IERC20"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 3811,
                        "name": "user",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3725,
                        "src": "5264:4:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 3812,
                        "name": "amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3762,
                        "src": "5270:6:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_contract$_IERC20_$9401",
                          "typeString": "contract IERC20"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 3805,
                        "name": "SafeERC20",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 9621,
                        "src": "5226:9:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_contract$_SafeERC20_$9621_$",
                          "typeString": "type(library SafeERC20)"
                        }
                      },
                      "id": 3807,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "safeTransfer",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 9434,
                      "src": "5226:22:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$9401_$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (contract IERC20,address,uint256)"
                      }
                    },
                    "id": 3813,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5226:51:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 3814,
                  "nodeType": "ExpressionStatement",
                  "src": "5226:51:3"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 3816,
                        "name": "user",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3725,
                        "src": "5301:4:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 3817,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3727,
                        "src": "5307:5:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 3818,
                        "name": "amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3762,
                        "src": "5314:6:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 3815,
                      "name": "Withdraw",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 3586,
                      "src": "5292:8:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,address,uint256)"
                      }
                    },
                    "id": 3819,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5292:29:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 3820,
                  "nodeType": "EmitStatement",
                  "src": "5287:34:3"
                }
              ]
            },
            "documentation": "@dev Claims pending withdraw - can be called on behalf of others\n@param token address of token to be withdrawn\n@param user address of user who withdraw is being claimed.\n     * Emits an {Withdraw} event stating that `user` withdrew `amount` of `token`\n     * Requirements:\n- withdraw was requested in previous epoch\n- token was received from exchange in current auction batch",
            "id": 3822,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "withdraw",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 3728,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3725,
                  "name": "user",
                  "nodeType": "VariableDeclaration",
                  "scope": 3822,
                  "src": "4450:12:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3724,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4450:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3727,
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "scope": 3822,
                  "src": "4464:13:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3726,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4464:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4449:29:3"
            },
            "returnParameters": {
              "id": 3729,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "4486:0:3"
            },
            "scope": 4188,
            "src": "4432:896:3",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 3848,
              "nodeType": "Block",
              "src": "5691:159:3",
              "statements": [
                {
                  "assignments": [
                    3834
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 3834,
                      "name": "pendingDeposit",
                      "nodeType": "VariableDeclaration",
                      "scope": 3848,
                      "src": "5701:33:3",
                      "stateVariable": false,
                      "storageLocation": "memory",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_PendingFlux_$3558_memory_ptr",
                        "typeString": "struct EpochTokenLocker.PendingFlux"
                      },
                      "typeName": {
                        "contractScope": null,
                        "id": 3833,
                        "name": "PendingFlux",
                        "nodeType": "UserDefinedTypeName",
                        "referencedDeclaration": 3558,
                        "src": "5701:11:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_PendingFlux_$3558_storage_ptr",
                          "typeString": "struct EpochTokenLocker.PendingFlux"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 3841,
                  "initialValue": {
                    "argumentTypes": null,
                    "expression": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "baseExpression": {
                          "argumentTypes": null,
                          "id": 3835,
                          "name": "balanceStates",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3540,
                          "src": "5737:13:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$_$",
                            "typeString": "mapping(address => mapping(address => struct EpochTokenLocker.BalanceState storage ref))"
                          }
                        },
                        "id": 3837,
                        "indexExpression": {
                          "argumentTypes": null,
                          "id": 3836,
                          "name": "user",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3824,
                          "src": "5751:4:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "5737:19:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$",
                          "typeString": "mapping(address => struct EpochTokenLocker.BalanceState storage ref)"
                        }
                      },
                      "id": 3839,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 3838,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3826,
                        "src": "5757:5:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "IndexAccess",
                      "src": "5737:26:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_BalanceState_$3553_storage",
                        "typeString": "struct EpochTokenLocker.BalanceState storage ref"
                      }
                    },
                    "id": 3840,
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "memberName": "pendingDeposits",
                    "nodeType": "MemberAccess",
                    "referencedDeclaration": 3550,
                    "src": "5737:42:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_PendingFlux_$3558_storage",
                      "typeString": "struct EpochTokenLocker.PendingFlux storage ref"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "5701:78:3"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "components": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 3842,
                          "name": "pendingDeposit",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3834,
                          "src": "5797:14:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_PendingFlux_$3558_memory_ptr",
                            "typeString": "struct EpochTokenLocker.PendingFlux memory"
                          }
                        },
                        "id": 3843,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "amount",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 3555,
                        "src": "5797:21:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 3844,
                          "name": "pendingDeposit",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3834,
                          "src": "5820:14:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_PendingFlux_$3558_memory_ptr",
                            "typeString": "struct EpochTokenLocker.PendingFlux memory"
                          }
                        },
                        "id": 3845,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "batchId",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 3557,
                        "src": "5820:22:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        }
                      }
                    ],
                    "id": 3846,
                    "isConstant": false,
                    "isInlineArray": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "TupleExpression",
                    "src": "5796:47:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$_t_uint256_$_t_uint32_$",
                      "typeString": "tuple(uint256,uint32)"
                    }
                  },
                  "functionReturnParameters": 3832,
                  "id": 3847,
                  "nodeType": "Return",
                  "src": "5789:54:3"
                }
              ]
            },
            "documentation": "@dev getter function used to display pending deposit\n@param user address of user\n@param token address of ERC20 token\nreturn amount and batchId of deposit's transfer if any (else 0)",
            "id": 3849,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "getPendingDeposit",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 3827,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3824,
                  "name": "user",
                  "nodeType": "VariableDeclaration",
                  "scope": 3849,
                  "src": "5624:12:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3823,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "5624:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3826,
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "scope": 3849,
                  "src": "5638:13:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3825,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "5638:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "5623:29:3"
            },
            "returnParameters": {
              "id": 3832,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3829,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 3849,
                  "src": "5674:7:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3828,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "5674:7:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3831,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 3849,
                  "src": "5683:6:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint32",
                    "typeString": "uint32"
                  },
                  "typeName": {
                    "id": 3830,
                    "name": "uint32",
                    "nodeType": "ElementaryTypeName",
                    "src": "5683:6:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint32",
                      "typeString": "uint32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "5673:17:3"
            },
            "scope": 4188,
            "src": "5597:253:3",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 3875,
              "nodeType": "Block",
              "src": "6176:163:3",
              "statements": [
                {
                  "assignments": [
                    3861
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 3861,
                      "name": "pendingWithdraw",
                      "nodeType": "VariableDeclaration",
                      "scope": 3875,
                      "src": "6186:34:3",
                      "stateVariable": false,
                      "storageLocation": "memory",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_PendingFlux_$3558_memory_ptr",
                        "typeString": "struct EpochTokenLocker.PendingFlux"
                      },
                      "typeName": {
                        "contractScope": null,
                        "id": 3860,
                        "name": "PendingFlux",
                        "nodeType": "UserDefinedTypeName",
                        "referencedDeclaration": 3558,
                        "src": "6186:11:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_PendingFlux_$3558_storage_ptr",
                          "typeString": "struct EpochTokenLocker.PendingFlux"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 3868,
                  "initialValue": {
                    "argumentTypes": null,
                    "expression": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "baseExpression": {
                          "argumentTypes": null,
                          "id": 3862,
                          "name": "balanceStates",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3540,
                          "src": "6223:13:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$_$",
                            "typeString": "mapping(address => mapping(address => struct EpochTokenLocker.BalanceState storage ref))"
                          }
                        },
                        "id": 3864,
                        "indexExpression": {
                          "argumentTypes": null,
                          "id": 3863,
                          "name": "user",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3851,
                          "src": "6237:4:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "6223:19:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$",
                          "typeString": "mapping(address => struct EpochTokenLocker.BalanceState storage ref)"
                        }
                      },
                      "id": 3866,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 3865,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3853,
                        "src": "6243:5:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "IndexAccess",
                      "src": "6223:26:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_BalanceState_$3553_storage",
                        "typeString": "struct EpochTokenLocker.BalanceState storage ref"
                      }
                    },
                    "id": 3867,
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "memberName": "pendingWithdraws",
                    "nodeType": "MemberAccess",
                    "referencedDeclaration": 3552,
                    "src": "6223:43:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_PendingFlux_$3558_storage",
                      "typeString": "struct EpochTokenLocker.PendingFlux storage ref"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "6186:80:3"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "components": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 3869,
                          "name": "pendingWithdraw",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3861,
                          "src": "6284:15:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_PendingFlux_$3558_memory_ptr",
                            "typeString": "struct EpochTokenLocker.PendingFlux memory"
                          }
                        },
                        "id": 3870,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "amount",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 3555,
                        "src": "6284:22:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 3871,
                          "name": "pendingWithdraw",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3861,
                          "src": "6308:15:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_PendingFlux_$3558_memory_ptr",
                            "typeString": "struct EpochTokenLocker.PendingFlux memory"
                          }
                        },
                        "id": 3872,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "batchId",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 3557,
                        "src": "6308:23:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        }
                      }
                    ],
                    "id": 3873,
                    "isConstant": false,
                    "isInlineArray": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "TupleExpression",
                    "src": "6283:49:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$_t_uint256_$_t_uint32_$",
                      "typeString": "tuple(uint256,uint32)"
                    }
                  },
                  "functionReturnParameters": 3859,
                  "id": 3874,
                  "nodeType": "Return",
                  "src": "6276:56:3"
                }
              ]
            },
            "documentation": "@dev getter function used to display pending withdraw\n@param user address of user\n@param token address of ERC20 token\nreturn amount and batchId when withdraw was requested if any (else 0)",
            "id": 3876,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "getPendingWithdraw",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 3854,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3851,
                  "name": "user",
                  "nodeType": "VariableDeclaration",
                  "scope": 3876,
                  "src": "6109:12:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3850,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "6109:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3853,
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "scope": 3876,
                  "src": "6123:13:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3852,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "6123:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "6108:29:3"
            },
            "returnParameters": {
              "id": 3859,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3856,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 3876,
                  "src": "6159:7:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3855,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "6159:7:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3858,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 3876,
                  "src": "6168:6:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint32",
                    "typeString": "uint32"
                  },
                  "typeName": {
                    "id": 3857,
                    "name": "uint32",
                    "nodeType": "ElementaryTypeName",
                    "src": "6168:6:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint32",
                      "typeString": "uint32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "6158:17:3"
            },
            "scope": 4188,
            "src": "6081:258:3",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 3887,
              "nodeType": "Block",
              "src": "6503:102:3",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 3884,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 3882,
                          "name": "now",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 10244,
                          "src": "6581:3:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "/",
                        "rightExpression": {
                          "argumentTypes": null,
                          "id": 3883,
                          "name": "BATCH_TIME",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3534,
                          "src": "6587:10:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "src": "6581:16:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 3881,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "lValueRequested": false,
                      "nodeType": "ElementaryTypeNameExpression",
                      "src": "6574:6:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_type$_t_uint32_$",
                        "typeString": "type(uint32)"
                      },
                      "typeName": "uint32"
                    },
                    "id": 3885,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "typeConversion",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "6574:24:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint32",
                      "typeString": "uint32"
                    }
                  },
                  "functionReturnParameters": 3880,
                  "id": 3886,
                  "nodeType": "Return",
                  "src": "6567:31:3"
                }
              ]
            },
            "documentation": "@dev getter function to determine current auction id.\nreturn current batchId",
            "id": 3888,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "getCurrentBatchId",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 3877,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "6471:2:3"
            },
            "returnParameters": {
              "id": 3880,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3879,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 3888,
                  "src": "6495:6:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint32",
                    "typeString": "uint32"
                  },
                  "typeName": {
                    "id": 3878,
                    "name": "uint32",
                    "nodeType": "ElementaryTypeName",
                    "src": "6495:6:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint32",
                      "typeString": "uint32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "6494:8:3"
            },
            "scope": 4188,
            "src": "6445:160:3",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 3900,
              "nodeType": "Block",
              "src": "6800:109:3",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 3898,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 3893,
                      "name": "BATCH_TIME",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 3534,
                      "src": "6871:10:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint32",
                        "typeString": "uint32"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "-",
                    "rightExpression": {
                      "argumentTypes": null,
                      "components": [
                        {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 3896,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 3894,
                            "name": "now",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 10244,
                            "src": "6885:3:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "%",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 3895,
                            "name": "BATCH_TIME",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3534,
                            "src": "6891:10:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint32",
                              "typeString": "uint32"
                            }
                          },
                          "src": "6885:16:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "id": 3897,
                      "isConstant": false,
                      "isInlineArray": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "TupleExpression",
                      "src": "6884:18:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "6871:31:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 3892,
                  "id": 3899,
                  "nodeType": "Return",
                  "src": "6864:38:3"
                }
              ]
            },
            "documentation": "@dev used to determine how much time is left in a batch\nreturn seconds remaining in current batch",
            "id": 3901,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "getSecondsRemainingInBatch",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 3889,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "6767:2:3"
            },
            "returnParameters": {
              "id": 3892,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3891,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 3901,
                  "src": "6791:7:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3890,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "6791:7:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "6790:9:3"
            },
            "scope": 4188,
            "src": "6732:177:3",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 3975,
              "nodeType": "Block",
              "src": "7186:482:3",
              "statements": [
                {
                  "assignments": [
                    3911
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 3911,
                      "name": "balance",
                      "nodeType": "VariableDeclaration",
                      "scope": 3975,
                      "src": "7196:15:3",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 3910,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "7196:7:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 3918,
                  "initialValue": {
                    "argumentTypes": null,
                    "expression": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "baseExpression": {
                          "argumentTypes": null,
                          "id": 3912,
                          "name": "balanceStates",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3540,
                          "src": "7214:13:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$_$",
                            "typeString": "mapping(address => mapping(address => struct EpochTokenLocker.BalanceState storage ref))"
                          }
                        },
                        "id": 3914,
                        "indexExpression": {
                          "argumentTypes": null,
                          "id": 3913,
                          "name": "user",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3903,
                          "src": "7228:4:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "7214:19:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$",
                          "typeString": "mapping(address => struct EpochTokenLocker.BalanceState storage ref)"
                        }
                      },
                      "id": 3916,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 3915,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3905,
                        "src": "7234:5:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "IndexAccess",
                      "src": "7214:26:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_BalanceState_$3553_storage",
                        "typeString": "struct EpochTokenLocker.BalanceState storage ref"
                      }
                    },
                    "id": 3917,
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "memberName": "balance",
                    "nodeType": "MemberAccess",
                    "referencedDeclaration": 3548,
                    "src": "7214:34:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "7196:52:3"
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint32",
                      "typeString": "uint32"
                    },
                    "id": 3928,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 3919,
                              "name": "balanceStates",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3540,
                              "src": "7262:13:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$_$",
                                "typeString": "mapping(address => mapping(address => struct EpochTokenLocker.BalanceState storage ref))"
                              }
                            },
                            "id": 3921,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 3920,
                              "name": "user",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3903,
                              "src": "7276:4:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "7262:19:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$",
                              "typeString": "mapping(address => struct EpochTokenLocker.BalanceState storage ref)"
                            }
                          },
                          "id": 3923,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 3922,
                            "name": "token",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3905,
                            "src": "7282:5:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "7262:26:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_BalanceState_$3553_storage",
                            "typeString": "struct EpochTokenLocker.BalanceState storage ref"
                          }
                        },
                        "id": 3924,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "pendingDeposits",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 3550,
                        "src": "7262:42:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_PendingFlux_$3558_storage",
                          "typeString": "struct EpochTokenLocker.PendingFlux storage ref"
                        }
                      },
                      "id": 3925,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "batchId",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 3557,
                      "src": "7262:50:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint32",
                        "typeString": "uint32"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "<",
                    "rightExpression": {
                      "argumentTypes": null,
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 3926,
                        "name": "getCurrentBatchId",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3888,
                        "src": "7315:17:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_view$__$returns$_t_uint32_$",
                          "typeString": "function () view returns (uint32)"
                        }
                      },
                      "id": 3927,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "7315:19:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint32",
                        "typeString": "uint32"
                      }
                    },
                    "src": "7262:72:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 3943,
                  "nodeType": "IfStatement",
                  "src": "7258:175:3",
                  "trueBody": {
                    "id": 3942,
                    "nodeType": "Block",
                    "src": "7336:97:3",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 3940,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 3929,
                            "name": "balance",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3911,
                            "src": "7350:7:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "baseExpression": {
                                      "argumentTypes": null,
                                      "baseExpression": {
                                        "argumentTypes": null,
                                        "id": 3932,
                                        "name": "balanceStates",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 3540,
                                        "src": "7372:13:3",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$_$",
                                          "typeString": "mapping(address => mapping(address => struct EpochTokenLocker.BalanceState storage ref))"
                                        }
                                      },
                                      "id": 3934,
                                      "indexExpression": {
                                        "argumentTypes": null,
                                        "id": 3933,
                                        "name": "user",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 3903,
                                        "src": "7386:4:3",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      },
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "nodeType": "IndexAccess",
                                      "src": "7372:19:3",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$",
                                        "typeString": "mapping(address => struct EpochTokenLocker.BalanceState storage ref)"
                                      }
                                    },
                                    "id": 3936,
                                    "indexExpression": {
                                      "argumentTypes": null,
                                      "id": 3935,
                                      "name": "token",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 3905,
                                      "src": "7392:5:3",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    },
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "IndexAccess",
                                    "src": "7372:26:3",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_BalanceState_$3553_storage",
                                      "typeString": "struct EpochTokenLocker.BalanceState storage ref"
                                    }
                                  },
                                  "id": 3937,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "pendingDeposits",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 3550,
                                  "src": "7372:42:3",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_PendingFlux_$3558_storage",
                                    "typeString": "struct EpochTokenLocker.PendingFlux storage ref"
                                  }
                                },
                                "id": 3938,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "amount",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 3555,
                                "src": "7372:49:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "id": 3930,
                                "name": "balance",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3911,
                                "src": "7360:7:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 3931,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "add",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 8563,
                              "src": "7360:11:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                "typeString": "function (uint256,uint256) pure returns (uint256)"
                              }
                            },
                            "id": 3939,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "7360:62:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "7350:72:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 3941,
                        "nodeType": "ExpressionStatement",
                        "src": "7350:72:3"
                      }
                    ]
                  }
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint32",
                      "typeString": "uint32"
                    },
                    "id": 3953,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 3944,
                              "name": "balanceStates",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3540,
                              "src": "7446:13:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$_$",
                                "typeString": "mapping(address => mapping(address => struct EpochTokenLocker.BalanceState storage ref))"
                              }
                            },
                            "id": 3946,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 3945,
                              "name": "user",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3903,
                              "src": "7460:4:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "7446:19:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$",
                              "typeString": "mapping(address => struct EpochTokenLocker.BalanceState storage ref)"
                            }
                          },
                          "id": 3948,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 3947,
                            "name": "token",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3905,
                            "src": "7466:5:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "7446:26:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_BalanceState_$3553_storage",
                            "typeString": "struct EpochTokenLocker.BalanceState storage ref"
                          }
                        },
                        "id": 3949,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "pendingWithdraws",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 3552,
                        "src": "7446:43:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_PendingFlux_$3558_storage",
                          "typeString": "struct EpochTokenLocker.PendingFlux storage ref"
                        }
                      },
                      "id": 3950,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "batchId",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 3557,
                      "src": "7446:51:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint32",
                        "typeString": "uint32"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "<",
                    "rightExpression": {
                      "argumentTypes": null,
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 3951,
                        "name": "getCurrentBatchId",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3888,
                        "src": "7500:17:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_view$__$returns$_t_uint32_$",
                          "typeString": "function () view returns (uint32)"
                        }
                      },
                      "id": 3952,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "7500:19:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint32",
                        "typeString": "uint32"
                      }
                    },
                    "src": "7446:73:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 3972,
                  "nodeType": "IfStatement",
                  "src": "7442:196:3",
                  "trueBody": {
                    "id": 3971,
                    "nodeType": "Block",
                    "src": "7521:117:3",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 3969,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 3954,
                            "name": "balance",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3911,
                            "src": "7535:7:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "expression": {
                                        "argumentTypes": null,
                                        "baseExpression": {
                                          "argumentTypes": null,
                                          "baseExpression": {
                                            "argumentTypes": null,
                                            "id": 3959,
                                            "name": "balanceStates",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 3540,
                                            "src": "7566:13:3",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$_$",
                                              "typeString": "mapping(address => mapping(address => struct EpochTokenLocker.BalanceState storage ref))"
                                            }
                                          },
                                          "id": 3961,
                                          "indexExpression": {
                                            "argumentTypes": null,
                                            "id": 3960,
                                            "name": "user",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 3903,
                                            "src": "7580:4:3",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_address",
                                              "typeString": "address"
                                            }
                                          },
                                          "isConstant": false,
                                          "isLValue": true,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "nodeType": "IndexAccess",
                                          "src": "7566:19:3",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$",
                                            "typeString": "mapping(address => struct EpochTokenLocker.BalanceState storage ref)"
                                          }
                                        },
                                        "id": 3963,
                                        "indexExpression": {
                                          "argumentTypes": null,
                                          "id": 3962,
                                          "name": "token",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 3905,
                                          "src": "7586:5:3",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          }
                                        },
                                        "isConstant": false,
                                        "isLValue": true,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "nodeType": "IndexAccess",
                                        "src": "7566:26:3",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_struct$_BalanceState_$3553_storage",
                                          "typeString": "struct EpochTokenLocker.BalanceState storage ref"
                                        }
                                      },
                                      "id": 3964,
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "pendingWithdraws",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": 3552,
                                      "src": "7566:43:3",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_PendingFlux_$3558_storage",
                                        "typeString": "struct EpochTokenLocker.PendingFlux storage ref"
                                      }
                                    },
                                    "id": 3965,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "amount",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 3555,
                                    "src": "7566:50:3",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 3966,
                                    "name": "balance",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 3911,
                                    "src": "7618:7:3",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 3957,
                                    "name": "Math",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 8536,
                                    "src": "7557:4:3",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_contract$_Math_$8536_$",
                                      "typeString": "type(library Math)"
                                    }
                                  },
                                  "id": 3958,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "min",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 8503,
                                  "src": "7557:8:3",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                                    "typeString": "function (uint256,uint256) pure returns (uint256)"
                                  }
                                },
                                "id": 3967,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "7557:69:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "id": 3955,
                                "name": "balance",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3911,
                                "src": "7545:7:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 3956,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sub",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 8579,
                              "src": "7545:11:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                "typeString": "function (uint256,uint256) pure returns (uint256)"
                              }
                            },
                            "id": 3968,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "7545:82:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "7535:92:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 3970,
                        "nodeType": "ExpressionStatement",
                        "src": "7535:92:3"
                      }
                    ]
                  }
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 3973,
                    "name": "balance",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 3911,
                    "src": "7654:7:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 3909,
                  "id": 3974,
                  "nodeType": "Return",
                  "src": "7647:14:3"
                }
              ]
            },
            "documentation": "@dev fetches and returns user's balance\n@param user address of user\n@param token address of ERC20 token\nreturn Current `token` balance of `user`'s account",
            "id": 3976,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "getBalance",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 3906,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3903,
                  "name": "user",
                  "nodeType": "VariableDeclaration",
                  "scope": 3976,
                  "src": "7127:12:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3902,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "7127:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3905,
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "scope": 3976,
                  "src": "7141:13:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3904,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "7141:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "7126:29:3"
            },
            "returnParameters": {
              "id": 3909,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3908,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 3976,
                  "src": "7177:7:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3907,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "7177:7:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "7176:9:3"
            },
            "scope": 4188,
            "src": "7107:561:3",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 4006,
              "nodeType": "Block",
              "src": "8028:180:3",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    },
                    "id": 4004,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "commonType": {
                        "typeIdentifier": "t_uint32",
                        "typeString": "uint32"
                      },
                      "id": 3994,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 3985,
                                "name": "balanceStates",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3540,
                                "src": "8057:13:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$_$",
                                  "typeString": "mapping(address => mapping(address => struct EpochTokenLocker.BalanceState storage ref))"
                                }
                              },
                              "id": 3987,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 3986,
                                "name": "user",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3978,
                                "src": "8071:4:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "8057:19:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$",
                                "typeString": "mapping(address => struct EpochTokenLocker.BalanceState storage ref)"
                              }
                            },
                            "id": 3989,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 3988,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3980,
                              "src": "8077:5:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "8057:26:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_BalanceState_$3553_storage",
                              "typeString": "struct EpochTokenLocker.BalanceState storage ref"
                            }
                          },
                          "id": 3990,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "pendingWithdraws",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 3552,
                          "src": "8057:43:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_PendingFlux_$3558_storage",
                            "typeString": "struct EpochTokenLocker.PendingFlux storage ref"
                          }
                        },
                        "id": 3991,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "batchId",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 3557,
                        "src": "8057:51:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": "<",
                      "rightExpression": {
                        "argumentTypes": null,
                        "arguments": [],
                        "expression": {
                          "argumentTypes": [],
                          "id": 3992,
                          "name": "getCurrentBatchId",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3888,
                          "src": "8111:17:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_view$__$returns$_t_uint32_$",
                            "typeString": "function () view returns (uint32)"
                          }
                        },
                        "id": 3993,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "8111:19:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        }
                      },
                      "src": "8057:73:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "&&",
                    "rightExpression": {
                      "argumentTypes": null,
                      "commonType": {
                        "typeIdentifier": "t_uint32",
                        "typeString": "uint32"
                      },
                      "id": 4003,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 3995,
                                "name": "balanceStates",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3540,
                                "src": "8146:13:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$_$",
                                  "typeString": "mapping(address => mapping(address => struct EpochTokenLocker.BalanceState storage ref))"
                                }
                              },
                              "id": 3997,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 3996,
                                "name": "user",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3978,
                                "src": "8160:4:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "8146:19:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$",
                                "typeString": "mapping(address => struct EpochTokenLocker.BalanceState storage ref)"
                              }
                            },
                            "id": 3999,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 3998,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3980,
                              "src": "8166:5:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "8146:26:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_BalanceState_$3553_storage",
                              "typeString": "struct EpochTokenLocker.BalanceState storage ref"
                            }
                          },
                          "id": 4000,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "pendingWithdraws",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 3552,
                          "src": "8146:43:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_PendingFlux_$3558_storage",
                            "typeString": "struct EpochTokenLocker.PendingFlux storage ref"
                          }
                        },
                        "id": 4001,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "batchId",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 3557,
                        "src": "8146:51:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": ">",
                      "rightExpression": {
                        "argumentTypes": null,
                        "hexValue": "30",
                        "id": 4002,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "number",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "8200:1:3",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_rational_0_by_1",
                          "typeString": "int_const 0"
                        },
                        "value": "0"
                      },
                      "src": "8146:55:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "src": "8057:144:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "functionReturnParameters": 3984,
                  "id": 4005,
                  "nodeType": "Return",
                  "src": "8038:163:3"
                }
              ]
            },
            "documentation": "@dev Used to determine if user has a valid pending withdraw request of specific token\n@param user address of user\n@param token address of ERC20 token\nreturn true if `user` has valid withdraw request for `token`, otherwise false",
            "id": 4007,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "hasValidWithdrawRequest",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 3981,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3978,
                  "name": "user",
                  "nodeType": "VariableDeclaration",
                  "scope": 4007,
                  "src": "7972:12:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3977,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "7972:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3980,
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "scope": 4007,
                  "src": "7986:13:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3979,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "7986:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "7971:29:3"
            },
            "returnParameters": {
              "id": 3984,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3983,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 4007,
                  "src": "8022:4:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 3982,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "8022:4:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "8021:6:3"
            },
            "scope": 4188,
            "src": "7939:269:3",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 4037,
              "nodeType": "Block",
              "src": "8892:176:3",
              "statements": [
                {
                  "condition": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 4017,
                        "name": "user",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 4009,
                        "src": "8930:4:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 4018,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 4011,
                        "src": "8936:5:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 4016,
                      "name": "hasValidWithdrawRequest",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 4007,
                      "src": "8906:23:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_address_$_t_address_$returns$_t_bool_$",
                        "typeString": "function (address,address) view returns (bool)"
                      }
                    },
                    "id": 4019,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "8906:36:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 4030,
                  "nodeType": "IfStatement",
                  "src": "8902:119:3",
                  "trueBody": {
                    "id": 4029,
                    "nodeType": "Block",
                    "src": "8944:77:3",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 4027,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 4020,
                                "name": "lastCreditBatchId",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3546,
                                "src": "8958:17:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint32_$_$",
                                  "typeString": "mapping(address => mapping(address => uint32))"
                                }
                              },
                              "id": 4023,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 4021,
                                "name": "user",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4009,
                                "src": "8976:4:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "8958:23:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_uint32_$",
                                "typeString": "mapping(address => uint32)"
                              }
                            },
                            "id": 4024,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 4022,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 4011,
                              "src": "8982:5:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "8958:30:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint32",
                              "typeString": "uint32"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [],
                            "expression": {
                              "argumentTypes": [],
                              "id": 4025,
                              "name": "getCurrentBatchId",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3888,
                              "src": "8991:17:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_view$__$returns$_t_uint32_$",
                                "typeString": "function () view returns (uint32)"
                              }
                            },
                            "id": 4026,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "8991:19:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint32",
                              "typeString": "uint32"
                            }
                          },
                          "src": "8958:52:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "id": 4028,
                        "nodeType": "ExpressionStatement",
                        "src": "8958:52:3"
                      }
                    ]
                  }
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 4032,
                        "name": "user",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 4009,
                        "src": "9041:4:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 4033,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 4011,
                        "src": "9047:5:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 4034,
                        "name": "amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 4013,
                        "src": "9054:6:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 4031,
                      "name": "addBalance",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 4070,
                      "src": "9030:10:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,address,uint256)"
                      }
                    },
                    "id": 4035,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "9030:31:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 4036,
                  "nodeType": "ExpressionStatement",
                  "src": "9030:31:3"
                }
              ]
            },
            "documentation": "The following function should be used to update any balances within an epoch, which\nwill not be immediately final. E.g. the BatchExchange credits new balances to\nthe buyers in an auction, but as there are might be better solutions, the updates are\nnot final. In order to prevent withdraws from non-final updates, we disallow withdraws\nby setting lastCreditBatchId to the current batchId and allow only withdraws in batches\nwith a higher batchId.",
            "id": 4038,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "addBalanceAndBlockWithdrawForThisBatch",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 4014,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 4009,
                  "name": "user",
                  "nodeType": "VariableDeclaration",
                  "scope": 4038,
                  "src": "8817:12:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 4008,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "8817:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 4011,
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "scope": 4038,
                  "src": "8839:13:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 4010,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "8839:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 4013,
                  "name": "amount",
                  "nodeType": "VariableDeclaration",
                  "scope": 4038,
                  "src": "8862:14:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 4012,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "8862:7:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "8807:75:3"
            },
            "returnParameters": {
              "id": 4015,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "8892:0:3"
            },
            "scope": 4188,
            "src": "8760:308:3",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 4069,
              "nodeType": "Block",
              "src": "9178:144:3",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 4048,
                        "name": "user",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 4040,
                        "src": "9210:4:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 4049,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 4042,
                        "src": "9216:5:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 4047,
                      "name": "updateDepositsBalance",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 4187,
                      "src": "9188:21:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$returns$__$",
                        "typeString": "function (address,address)"
                      }
                    },
                    "id": 4050,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "9188:34:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 4051,
                  "nodeType": "ExpressionStatement",
                  "src": "9188:34:3"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 4067,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "baseExpression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 4052,
                            "name": "balanceStates",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3540,
                            "src": "9232:13:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$_$",
                              "typeString": "mapping(address => mapping(address => struct EpochTokenLocker.BalanceState storage ref))"
                            }
                          },
                          "id": 4055,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 4053,
                            "name": "user",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4040,
                            "src": "9246:4:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "9232:19:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$",
                            "typeString": "mapping(address => struct EpochTokenLocker.BalanceState storage ref)"
                          }
                        },
                        "id": 4056,
                        "indexExpression": {
                          "argumentTypes": null,
                          "id": 4054,
                          "name": "token",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 4042,
                          "src": "9252:5:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "9232:26:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_BalanceState_$3553_storage",
                          "typeString": "struct EpochTokenLocker.BalanceState storage ref"
                        }
                      },
                      "id": 4057,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberName": "balance",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 3548,
                      "src": "9232:34:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 4065,
                          "name": "amount",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 4044,
                          "src": "9308:6:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        ],
                        "expression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 4058,
                                "name": "balanceStates",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3540,
                                "src": "9269:13:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$_$",
                                  "typeString": "mapping(address => mapping(address => struct EpochTokenLocker.BalanceState storage ref))"
                                }
                              },
                              "id": 4060,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 4059,
                                "name": "user",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4040,
                                "src": "9283:4:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "9269:19:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$",
                                "typeString": "mapping(address => struct EpochTokenLocker.BalanceState storage ref)"
                              }
                            },
                            "id": 4062,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 4061,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 4042,
                              "src": "9289:5:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "9269:26:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_BalanceState_$3553_storage",
                              "typeString": "struct EpochTokenLocker.BalanceState storage ref"
                            }
                          },
                          "id": 4063,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "balance",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 3548,
                          "src": "9269:34:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 4064,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "add",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 8563,
                        "src": "9269:38:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                          "typeString": "function (uint256,uint256) pure returns (uint256)"
                        }
                      },
                      "id": 4066,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "9269:46:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "9232:83:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 4068,
                  "nodeType": "ExpressionStatement",
                  "src": "9232:83:3"
                }
              ]
            },
            "documentation": null,
            "id": 4070,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "addBalance",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 4045,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 4040,
                  "name": "user",
                  "nodeType": "VariableDeclaration",
                  "scope": 4070,
                  "src": "9103:12:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 4039,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "9103:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 4042,
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "scope": 4070,
                  "src": "9125:13:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 4041,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "9125:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 4044,
                  "name": "amount",
                  "nodeType": "VariableDeclaration",
                  "scope": 4070,
                  "src": "9148:14:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 4043,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "9148:7:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "9093:75:3"
            },
            "returnParameters": {
              "id": 4046,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "9178:0:3"
            },
            "scope": 4188,
            "src": "9074:248:3",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 4095,
              "nodeType": "Block",
              "src": "9687:148:3",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 4085,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 4080,
                          "name": "amount",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 4076,
                          "src": "9705:6:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "<=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 4082,
                              "name": "user",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 4072,
                              "src": "9726:4:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 4083,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 4074,
                              "src": "9732:5:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 4081,
                            "name": "getBalance",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3976,
                            "src": "9715:10:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_address_$_t_address_$returns$_t_uint256_$",
                              "typeString": "function (address,address) view returns (uint256)"
                            }
                          },
                          "id": 4084,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "9715:23:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "src": "9705:33:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "416d6f756e742065786365656473207573657227732062616c616e63652e",
                        "id": 4086,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "9740:32:3",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_ee6ab3ac7e270fae8edfd43cf60cea86aea1fa36fc4b4bb1c39c5b842699e9cb",
                          "typeString": "literal_string \"Amount exceeds user's balance.\""
                        },
                        "value": "Amount exceeds user's balance."
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_ee6ab3ac7e270fae8edfd43cf60cea86aea1fa36fc4b4bb1c39c5b842699e9cb",
                          "typeString": "literal_string \"Amount exceeds user's balance.\""
                        }
                      ],
                      "id": 4079,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        10245,
                        10246
                      ],
                      "referencedDeclaration": 10246,
                      "src": "9697:7:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 4087,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "9697:76:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 4088,
                  "nodeType": "ExpressionStatement",
                  "src": "9697:76:3"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 4090,
                        "name": "user",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 4072,
                        "src": "9808:4:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 4091,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 4074,
                        "src": "9814:5:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 4092,
                        "name": "amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 4076,
                        "src": "9821:6:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 4089,
                      "name": "subtractBalanceUnchecked",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 4128,
                      "src": "9783:24:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,address,uint256)"
                      }
                    },
                    "id": 4093,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "9783:45:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 4094,
                  "nodeType": "ExpressionStatement",
                  "src": "9783:45:3"
                }
              ]
            },
            "documentation": "The following function should be used to subtract amounts from the current balances state.\nFor the substraction the current withdrawRequests are considered and they are effectively reducing\nthe available balance.",
            "id": 4096,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "subtractBalance",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 4077,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 4072,
                  "name": "user",
                  "nodeType": "VariableDeclaration",
                  "scope": 4096,
                  "src": "9612:12:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 4071,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "9612:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 4074,
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "scope": 4096,
                  "src": "9634:13:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 4073,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "9634:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 4076,
                  "name": "amount",
                  "nodeType": "VariableDeclaration",
                  "scope": 4096,
                  "src": "9657:14:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 4075,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "9657:7:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "9602:75:3"
            },
            "returnParameters": {
              "id": 4078,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "9687:0:3"
            },
            "scope": 4188,
            "src": "9578:257:3",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 4127,
              "nodeType": "Block",
              "src": "10912:144:3",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 4106,
                        "name": "user",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 4098,
                        "src": "10944:4:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 4107,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 4100,
                        "src": "10950:5:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 4105,
                      "name": "updateDepositsBalance",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 4187,
                      "src": "10922:21:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$returns$__$",
                        "typeString": "function (address,address)"
                      }
                    },
                    "id": 4108,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "10922:34:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 4109,
                  "nodeType": "ExpressionStatement",
                  "src": "10922:34:3"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 4125,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "baseExpression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 4110,
                            "name": "balanceStates",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3540,
                            "src": "10966:13:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$_$",
                              "typeString": "mapping(address => mapping(address => struct EpochTokenLocker.BalanceState storage ref))"
                            }
                          },
                          "id": 4113,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 4111,
                            "name": "user",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4098,
                            "src": "10980:4:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "10966:19:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$",
                            "typeString": "mapping(address => struct EpochTokenLocker.BalanceState storage ref)"
                          }
                        },
                        "id": 4114,
                        "indexExpression": {
                          "argumentTypes": null,
                          "id": 4112,
                          "name": "token",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 4100,
                          "src": "10986:5:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "10966:26:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_BalanceState_$3553_storage",
                          "typeString": "struct EpochTokenLocker.BalanceState storage ref"
                        }
                      },
                      "id": 4115,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberName": "balance",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 3548,
                      "src": "10966:34:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 4123,
                          "name": "amount",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 4102,
                          "src": "11042:6:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        ],
                        "expression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 4116,
                                "name": "balanceStates",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3540,
                                "src": "11003:13:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$_$",
                                  "typeString": "mapping(address => mapping(address => struct EpochTokenLocker.BalanceState storage ref))"
                                }
                              },
                              "id": 4118,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 4117,
                                "name": "user",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4098,
                                "src": "11017:4:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "11003:19:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$",
                                "typeString": "mapping(address => struct EpochTokenLocker.BalanceState storage ref)"
                              }
                            },
                            "id": 4120,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 4119,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 4100,
                              "src": "11023:5:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "11003:26:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_BalanceState_$3553_storage",
                              "typeString": "struct EpochTokenLocker.BalanceState storage ref"
                            }
                          },
                          "id": 4121,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "balance",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 3548,
                          "src": "11003:34:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 4122,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sub",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 8579,
                        "src": "11003:38:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                          "typeString": "function (uint256,uint256) pure returns (uint256)"
                        }
                      },
                      "id": 4124,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "11003:46:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "10966:83:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 4126,
                  "nodeType": "ExpressionStatement",
                  "src": "10966:83:3"
                }
              ]
            },
            "documentation": "The following function should be used to substract amounts from the current balance\nstate, if the pending withdrawRequests are not considered and should not effectively reduce\nthe available balance.\nFor example, the reversion of trades from a previous batch-solution do not\nneed to consider withdrawRequests. This is the case as withdraws are blocked for one\nbatch for accounts having credited funds in a previous submission.\nPendingWithdraws must also be ignored since otherwise for the reversion of trades,\na solution reversion could be blocked: A bigger withdrawRequest could set the return value of\ngetBalance(user, token) to zero, although the user was just credited tokens in\nthe last submission. In this situation, during the unwinding of the previous orders,\nthe check `amount <= getBalance(user, token)` would fail and the reversion would be blocked.",
            "id": 4128,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "subtractBalanceUnchecked",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 4103,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 4098,
                  "name": "user",
                  "nodeType": "VariableDeclaration",
                  "scope": 4128,
                  "src": "10837:12:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 4097,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "10837:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 4100,
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "scope": 4128,
                  "src": "10859:13:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 4099,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "10859:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 4102,
                  "name": "amount",
                  "nodeType": "VariableDeclaration",
                  "scope": 4128,
                  "src": "10882:14:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 4101,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "10882:7:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "10827:75:3"
            },
            "returnParameters": {
              "id": 4104,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "10912:0:3"
            },
            "scope": 4188,
            "src": "10794:262:3",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 4186,
              "nodeType": "Block",
              "src": "11130:486:3",
              "statements": [
                {
                  "assignments": [
                    4136
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 4136,
                      "name": "batchId",
                      "nodeType": "VariableDeclaration",
                      "scope": 4186,
                      "src": "11140:15:3",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 4135,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "11140:7:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 4144,
                  "initialValue": {
                    "argumentTypes": null,
                    "expression": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "baseExpression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 4137,
                            "name": "balanceStates",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3540,
                            "src": "11158:13:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$_$",
                              "typeString": "mapping(address => mapping(address => struct EpochTokenLocker.BalanceState storage ref))"
                            }
                          },
                          "id": 4139,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 4138,
                            "name": "user",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4130,
                            "src": "11172:4:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "11158:19:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$",
                            "typeString": "mapping(address => struct EpochTokenLocker.BalanceState storage ref)"
                          }
                        },
                        "id": 4141,
                        "indexExpression": {
                          "argumentTypes": null,
                          "id": 4140,
                          "name": "token",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 4132,
                          "src": "11178:5:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "11158:26:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_BalanceState_$3553_storage",
                          "typeString": "struct EpochTokenLocker.BalanceState storage ref"
                        }
                      },
                      "id": 4142,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "pendingDeposits",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 3550,
                      "src": "11158:42:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_PendingFlux_$3558_storage",
                        "typeString": "struct EpochTokenLocker.PendingFlux storage ref"
                      }
                    },
                    "id": 4143,
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "memberName": "batchId",
                    "nodeType": "MemberAccess",
                    "referencedDeclaration": 3557,
                    "src": "11158:50:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint32",
                      "typeString": "uint32"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "11140:68:3"
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    },
                    "id": 4152,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "commonType": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "id": 4147,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "argumentTypes": null,
                        "id": 4145,
                        "name": "batchId",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 4136,
                        "src": "11222:7:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": ">",
                      "rightExpression": {
                        "argumentTypes": null,
                        "hexValue": "30",
                        "id": 4146,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "number",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "11232:1:3",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_rational_0_by_1",
                          "typeString": "int_const 0"
                        },
                        "value": "0"
                      },
                      "src": "11222:11:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "&&",
                    "rightExpression": {
                      "argumentTypes": null,
                      "commonType": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "id": 4151,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "argumentTypes": null,
                        "id": 4148,
                        "name": "batchId",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 4136,
                        "src": "11237:7:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": "<",
                      "rightExpression": {
                        "argumentTypes": null,
                        "arguments": [],
                        "expression": {
                          "argumentTypes": [],
                          "id": 4149,
                          "name": "getCurrentBatchId",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3888,
                          "src": "11247:17:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_view$__$returns$_t_uint32_$",
                            "typeString": "function () view returns (uint32)"
                          }
                        },
                        "id": 4150,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "11247:19:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        }
                      },
                      "src": "11237:29:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "src": "11222:44:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 4185,
                  "nodeType": "IfStatement",
                  "src": "11218:392:3",
                  "trueBody": {
                    "id": 4184,
                    "nodeType": "Block",
                    "src": "11268:342:3",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 4174,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 4153,
                                  "name": "balanceStates",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 3540,
                                  "src": "11380:13:3",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$_$",
                                    "typeString": "mapping(address => mapping(address => struct EpochTokenLocker.BalanceState storage ref))"
                                  }
                                },
                                "id": 4156,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 4154,
                                  "name": "user",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 4130,
                                  "src": "11394:4:3",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "11380:19:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$",
                                  "typeString": "mapping(address => struct EpochTokenLocker.BalanceState storage ref)"
                                }
                              },
                              "id": 4157,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 4155,
                                "name": "token",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4132,
                                "src": "11400:5:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "11380:26:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_BalanceState_$3553_storage",
                                "typeString": "struct EpochTokenLocker.BalanceState storage ref"
                              }
                            },
                            "id": 4158,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "balance",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 3548,
                            "src": "11380:34:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "baseExpression": {
                                      "argumentTypes": null,
                                      "baseExpression": {
                                        "argumentTypes": null,
                                        "id": 4166,
                                        "name": "balanceStates",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 3540,
                                        "src": "11473:13:3",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$_$",
                                          "typeString": "mapping(address => mapping(address => struct EpochTokenLocker.BalanceState storage ref))"
                                        }
                                      },
                                      "id": 4168,
                                      "indexExpression": {
                                        "argumentTypes": null,
                                        "id": 4167,
                                        "name": "user",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 4130,
                                        "src": "11487:4:3",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      },
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "nodeType": "IndexAccess",
                                      "src": "11473:19:3",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$",
                                        "typeString": "mapping(address => struct EpochTokenLocker.BalanceState storage ref)"
                                      }
                                    },
                                    "id": 4170,
                                    "indexExpression": {
                                      "argumentTypes": null,
                                      "id": 4169,
                                      "name": "token",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 4132,
                                      "src": "11493:5:3",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    },
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "IndexAccess",
                                    "src": "11473:26:3",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_BalanceState_$3553_storage",
                                      "typeString": "struct EpochTokenLocker.BalanceState storage ref"
                                    }
                                  },
                                  "id": 4171,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "pendingDeposits",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 3550,
                                  "src": "11473:42:3",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_PendingFlux_$3558_storage",
                                    "typeString": "struct EpochTokenLocker.PendingFlux storage ref"
                                  }
                                },
                                "id": 4172,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "amount",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 3555,
                                "src": "11473:49:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "baseExpression": {
                                    "argumentTypes": null,
                                    "baseExpression": {
                                      "argumentTypes": null,
                                      "id": 4159,
                                      "name": "balanceStates",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 3540,
                                      "src": "11417:13:3",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$_$",
                                        "typeString": "mapping(address => mapping(address => struct EpochTokenLocker.BalanceState storage ref))"
                                      }
                                    },
                                    "id": 4161,
                                    "indexExpression": {
                                      "argumentTypes": null,
                                      "id": 4160,
                                      "name": "user",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 4130,
                                      "src": "11431:4:3",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    },
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "IndexAccess",
                                    "src": "11417:19:3",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$",
                                      "typeString": "mapping(address => struct EpochTokenLocker.BalanceState storage ref)"
                                    }
                                  },
                                  "id": 4163,
                                  "indexExpression": {
                                    "argumentTypes": null,
                                    "id": 4162,
                                    "name": "token",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 4132,
                                    "src": "11437:5:3",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "nodeType": "IndexAccess",
                                  "src": "11417:26:3",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_BalanceState_$3553_storage",
                                    "typeString": "struct EpochTokenLocker.BalanceState storage ref"
                                  }
                                },
                                "id": 4164,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "balance",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 3548,
                                "src": "11417:34:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 4165,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "add",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 8563,
                              "src": "11417:38:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                "typeString": "function (uint256,uint256) pure returns (uint256)"
                              }
                            },
                            "id": 4173,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "11417:119:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "11380:156:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 4175,
                        "nodeType": "ExpressionStatement",
                        "src": "11380:156:3"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 4182,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "UnaryOperation",
                          "operator": "delete",
                          "prefix": true,
                          "src": "11550:49:3",
                          "subExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 4176,
                                  "name": "balanceStates",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 3540,
                                  "src": "11557:13:3",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$_$",
                                    "typeString": "mapping(address => mapping(address => struct EpochTokenLocker.BalanceState storage ref))"
                                  }
                                },
                                "id": 4178,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 4177,
                                  "name": "user",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 4130,
                                  "src": "11571:4:3",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "11557:19:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$",
                                  "typeString": "mapping(address => struct EpochTokenLocker.BalanceState storage ref)"
                                }
                              },
                              "id": 4180,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 4179,
                                "name": "token",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4132,
                                "src": "11577:5:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "11557:26:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_BalanceState_$3553_storage",
                                "typeString": "struct EpochTokenLocker.BalanceState storage ref"
                              }
                            },
                            "id": 4181,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "pendingDeposits",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 3550,
                            "src": "11557:42:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_PendingFlux_$3558_storage",
                              "typeString": "struct EpochTokenLocker.PendingFlux storage ref"
                            }
                          },
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 4183,
                        "nodeType": "ExpressionStatement",
                        "src": "11550:49:3"
                      }
                    ]
                  }
                }
              ]
            },
            "documentation": null,
            "id": 4187,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "updateDepositsBalance",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 4133,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 4130,
                  "name": "user",
                  "nodeType": "VariableDeclaration",
                  "scope": 4187,
                  "src": "11093:12:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 4129,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "11093:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 4132,
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "scope": 4187,
                  "src": "11107:13:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 4131,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "11107:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "11092:29:3"
            },
            "returnParameters": {
              "id": 4134,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "11130:0:3"
            },
            "scope": 4188,
            "src": "11062:554:3",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "private"
          }
        ],
        "scope": 4189,
        "src": "649:10969:3"
      }
    ],
    "src": "0:11619:3"
  },
  "legacyAST": {
    "absolutePath": "/Users/felixleupold/Gnosis/dex-contracts/contracts/EpochTokenLocker.sol",
    "exportedSymbols": {
      "EpochTokenLocker": [
        4188
      ]
    },
    "id": 4189,
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 3524,
        "literals": [
          "solidity",
          "^",
          "0.5",
          ".0"
        ],
        "nodeType": "PragmaDirective",
        "src": "0:23:3"
      },
      {
        "absolutePath": "@openzeppelin/contracts/math/Math.sol",
        "file": "@openzeppelin/contracts/math/Math.sol",
        "id": 3525,
        "nodeType": "ImportDirective",
        "scope": 4189,
        "sourceUnit": 8537,
        "src": "25:47:3",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "@openzeppelin/contracts/math/SafeMath.sol",
        "file": "@openzeppelin/contracts/math/SafeMath.sol",
        "id": 3526,
        "nodeType": "ImportDirective",
        "scope": 4189,
        "sourceUnit": 8724,
        "src": "73:51:3",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "@openzeppelin/contracts/token/ERC20/IERC20.sol",
        "file": "@openzeppelin/contracts/token/ERC20/IERC20.sol",
        "id": 3527,
        "nodeType": "ImportDirective",
        "scope": 4189,
        "sourceUnit": 9402,
        "src": "125:56:3",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "@openzeppelin/contracts/token/ERC20/SafeERC20.sol",
        "file": "@openzeppelin/contracts/token/ERC20/SafeERC20.sol",
        "id": 3528,
        "nodeType": "ImportDirective",
        "scope": 4189,
        "sourceUnit": 9622,
        "src": "182:59:3",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "baseContracts": [],
        "contractDependencies": [],
        "contractKind": "contract",
        "documentation": "@title Epoch Token Locker\n EpochTokenLocker saveguards tokens for applications with constant-balances during discrete epochs\n It allows to deposit a token which become credited in the next epoch and allows to request a token-withdraw\n which becomes claimable after the current epoch has expired.\n @author @gnosis/dfusion-team <https://github.com/orgs/gnosis/teams/dfusion-team/members>",
        "fullyImplemented": true,
        "id": 4188,
        "linearizedBaseContracts": [
          4188
        ],
        "name": "EpochTokenLocker",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "id": 3531,
            "libraryName": {
              "contractScope": null,
              "id": 3529,
              "name": "SafeMath",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 8723,
              "src": "687:8:3",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_SafeMath_$8723",
                "typeString": "library SafeMath"
              }
            },
            "nodeType": "UsingForDirective",
            "src": "681:27:3",
            "typeName": {
              "id": 3530,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "700:7:3",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            }
          },
          {
            "constant": true,
            "id": 3534,
            "name": "BATCH_TIME",
            "nodeType": "VariableDeclaration",
            "scope": 4188,
            "src": "766:39:3",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint32",
              "typeString": "uint32"
            },
            "typeName": {
              "id": 3532,
              "name": "uint32",
              "nodeType": "ElementaryTypeName",
              "src": "766:6:3",
              "typeDescriptions": {
                "typeIdentifier": "t_uint32",
                "typeString": "uint32"
              }
            },
            "value": {
              "argumentTypes": null,
              "hexValue": "333030",
              "id": 3533,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "number",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "802:3:3",
              "subdenomination": null,
              "typeDescriptions": {
                "typeIdentifier": "t_rational_300_by_1",
                "typeString": "int_const 300"
              },
              "value": "300"
            },
            "visibility": "public"
          },
          {
            "constant": false,
            "id": 3540,
            "name": "balanceStates",
            "nodeType": "VariableDeclaration",
            "scope": 4188,
            "src": "849:74:3",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$_$",
              "typeString": "mapping(address => mapping(address => struct EpochTokenLocker.BalanceState))"
            },
            "typeName": {
              "id": 3539,
              "keyType": {
                "id": 3535,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "857:7:3",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              },
              "nodeType": "Mapping",
              "src": "849:52:3",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$_$",
                "typeString": "mapping(address => mapping(address => struct EpochTokenLocker.BalanceState))"
              },
              "valueType": {
                "id": 3538,
                "keyType": {
                  "id": 3536,
                  "name": "address",
                  "nodeType": "ElementaryTypeName",
                  "src": "876:7:3",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  }
                },
                "nodeType": "Mapping",
                "src": "868:32:3",
                "typeDescriptions": {
                  "typeIdentifier": "t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$",
                  "typeString": "mapping(address => struct EpochTokenLocker.BalanceState)"
                },
                "valueType": {
                  "contractScope": null,
                  "id": 3537,
                  "name": "BalanceState",
                  "nodeType": "UserDefinedTypeName",
                  "referencedDeclaration": 3553,
                  "src": "887:12:3",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_BalanceState_$3553_storage_ptr",
                    "typeString": "struct EpochTokenLocker.BalanceState"
                  }
                }
              }
            },
            "value": null,
            "visibility": "private"
          },
          {
            "constant": false,
            "id": 3546,
            "name": "lastCreditBatchId",
            "nodeType": "VariableDeclaration",
            "scope": 4188,
            "src": "972:71:3",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint32_$_$",
              "typeString": "mapping(address => mapping(address => uint32))"
            },
            "typeName": {
              "id": 3545,
              "keyType": {
                "id": 3541,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "980:7:3",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              },
              "nodeType": "Mapping",
              "src": "972:46:3",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint32_$_$",
                "typeString": "mapping(address => mapping(address => uint32))"
              },
              "valueType": {
                "id": 3544,
                "keyType": {
                  "id": 3542,
                  "name": "address",
                  "nodeType": "ElementaryTypeName",
                  "src": "999:7:3",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  }
                },
                "nodeType": "Mapping",
                "src": "991:26:3",
                "typeDescriptions": {
                  "typeIdentifier": "t_mapping$_t_address_$_t_uint32_$",
                  "typeString": "mapping(address => uint32)"
                },
                "valueType": {
                  "id": 3543,
                  "name": "uint32",
                  "nodeType": "ElementaryTypeName",
                  "src": "1010:6:3",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint32",
                    "typeString": "uint32"
                  }
                }
              }
            },
            "value": null,
            "visibility": "public"
          },
          {
            "canonicalName": "EpochTokenLocker.BalanceState",
            "id": 3553,
            "members": [
              {
                "constant": false,
                "id": 3548,
                "name": "balance",
                "nodeType": "VariableDeclaration",
                "scope": 3553,
                "src": "1080:15:3",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                },
                "typeName": {
                  "id": 3547,
                  "name": "uint256",
                  "nodeType": "ElementaryTypeName",
                  "src": "1080:7:3",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  }
                },
                "value": null,
                "visibility": "internal"
              },
              {
                "constant": false,
                "id": 3550,
                "name": "pendingDeposits",
                "nodeType": "VariableDeclaration",
                "scope": 3553,
                "src": "1105:27:3",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_struct$_PendingFlux_$3558_storage_ptr",
                  "typeString": "struct EpochTokenLocker.PendingFlux"
                },
                "typeName": {
                  "contractScope": null,
                  "id": 3549,
                  "name": "PendingFlux",
                  "nodeType": "UserDefinedTypeName",
                  "referencedDeclaration": 3558,
                  "src": "1105:11:3",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_PendingFlux_$3558_storage_ptr",
                    "typeString": "struct EpochTokenLocker.PendingFlux"
                  }
                },
                "value": null,
                "visibility": "internal"
              },
              {
                "constant": false,
                "id": 3552,
                "name": "pendingWithdraws",
                "nodeType": "VariableDeclaration",
                "scope": 3553,
                "src": "1225:28:3",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_struct$_PendingFlux_$3558_storage_ptr",
                  "typeString": "struct EpochTokenLocker.PendingFlux"
                },
                "typeName": {
                  "contractScope": null,
                  "id": 3551,
                  "name": "PendingFlux",
                  "nodeType": "UserDefinedTypeName",
                  "referencedDeclaration": 3558,
                  "src": "1225:11:3",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_PendingFlux_$3558_storage_ptr",
                    "typeString": "struct EpochTokenLocker.PendingFlux"
                  }
                },
                "value": null,
                "visibility": "internal"
              }
            ],
            "name": "BalanceState",
            "nodeType": "StructDefinition",
            "scope": 4188,
            "src": "1050:289:3",
            "visibility": "public"
          },
          {
            "canonicalName": "EpochTokenLocker.PendingFlux",
            "id": 3558,
            "members": [
              {
                "constant": false,
                "id": 3555,
                "name": "amount",
                "nodeType": "VariableDeclaration",
                "scope": 3558,
                "src": "1374:14:3",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                },
                "typeName": {
                  "id": 3554,
                  "name": "uint256",
                  "nodeType": "ElementaryTypeName",
                  "src": "1374:7:3",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  }
                },
                "value": null,
                "visibility": "internal"
              },
              {
                "constant": false,
                "id": 3557,
                "name": "batchId",
                "nodeType": "VariableDeclaration",
                "scope": 3558,
                "src": "1398:14:3",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint32",
                  "typeString": "uint32"
                },
                "typeName": {
                  "id": 3556,
                  "name": "uint32",
                  "nodeType": "ElementaryTypeName",
                  "src": "1398:6:3",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint32",
                    "typeString": "uint32"
                  }
                },
                "value": null,
                "visibility": "internal"
              }
            ],
            "name": "PendingFlux",
            "nodeType": "StructDefinition",
            "scope": 4188,
            "src": "1345:74:3",
            "visibility": "public"
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 3568,
            "name": "Deposit",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 3567,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3560,
                  "indexed": true,
                  "name": "user",
                  "nodeType": "VariableDeclaration",
                  "scope": 3568,
                  "src": "1439:20:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3559,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1439:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3562,
                  "indexed": true,
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "scope": 3568,
                  "src": "1461:21:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3561,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1461:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3564,
                  "indexed": false,
                  "name": "amount",
                  "nodeType": "VariableDeclaration",
                  "scope": 3568,
                  "src": "1484:14:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3563,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1484:7:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3566,
                  "indexed": false,
                  "name": "batchId",
                  "nodeType": "VariableDeclaration",
                  "scope": 3568,
                  "src": "1500:14:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint32",
                    "typeString": "uint32"
                  },
                  "typeName": {
                    "id": 3565,
                    "name": "uint32",
                    "nodeType": "ElementaryTypeName",
                    "src": "1500:6:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint32",
                      "typeString": "uint32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1438:77:3"
            },
            "src": "1425:91:3"
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 3578,
            "name": "WithdrawRequest",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 3577,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3570,
                  "indexed": true,
                  "name": "user",
                  "nodeType": "VariableDeclaration",
                  "scope": 3578,
                  "src": "1544:20:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3569,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1544:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3572,
                  "indexed": true,
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "scope": 3578,
                  "src": "1566:21:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3571,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1566:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3574,
                  "indexed": false,
                  "name": "amount",
                  "nodeType": "VariableDeclaration",
                  "scope": 3578,
                  "src": "1589:14:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3573,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1589:7:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3576,
                  "indexed": false,
                  "name": "batchId",
                  "nodeType": "VariableDeclaration",
                  "scope": 3578,
                  "src": "1605:14:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint32",
                    "typeString": "uint32"
                  },
                  "typeName": {
                    "id": 3575,
                    "name": "uint32",
                    "nodeType": "ElementaryTypeName",
                    "src": "1605:6:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint32",
                      "typeString": "uint32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1543:77:3"
            },
            "src": "1522:99:3"
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 3586,
            "name": "Withdraw",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 3585,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3580,
                  "indexed": true,
                  "name": "user",
                  "nodeType": "VariableDeclaration",
                  "scope": 3586,
                  "src": "1642:20:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3579,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1642:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3582,
                  "indexed": true,
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "scope": 3586,
                  "src": "1664:21:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3581,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1664:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3584,
                  "indexed": false,
                  "name": "amount",
                  "nodeType": "VariableDeclaration",
                  "scope": 3586,
                  "src": "1687:14:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3583,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1687:7:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1641:61:3"
            },
            "src": "1627:76:3"
          },
          {
            "body": {
              "id": 3655,
              "nodeType": "Block",
              "src": "2140:511:3",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 3594,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 10242,
                          "src": "2172:3:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 3595,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "2172:10:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 3596,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3588,
                        "src": "2184:5:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 3593,
                      "name": "updateDepositsBalance",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 4187,
                      "src": "2150:21:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$returns$__$",
                        "typeString": "function (address,address)"
                      }
                    },
                    "id": 3597,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2150:40:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 3598,
                  "nodeType": "ExpressionStatement",
                  "src": "2150:40:3"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 3603,
                            "name": "token",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3588,
                            "src": "2234:5:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          ],
                          "id": 3602,
                          "name": "IERC20",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 9401,
                          "src": "2227:6:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_contract$_IERC20_$9401_$",
                            "typeString": "type(contract IERC20)"
                          }
                        },
                        "id": 3604,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "2227:13:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$9401",
                          "typeString": "contract IERC20"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 3605,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 10242,
                          "src": "2242:3:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 3606,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "2242:10:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 3608,
                            "name": "this",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 10266,
                            "src": "2262:4:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_EpochTokenLocker_$4188",
                              "typeString": "contract EpochTokenLocker"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_contract$_EpochTokenLocker_$4188",
                              "typeString": "contract EpochTokenLocker"
                            }
                          ],
                          "id": 3607,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "2254:7:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": "address"
                        },
                        "id": 3609,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "2254:13:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 3610,
                        "name": "amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3590,
                        "src": "2269:6:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_contract$_IERC20_$9401",
                          "typeString": "contract IERC20"
                        },
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 3599,
                        "name": "SafeERC20",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 9621,
                        "src": "2200:9:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_contract$_SafeERC20_$9621_$",
                          "typeString": "type(library SafeERC20)"
                        }
                      },
                      "id": 3601,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "safeTransferFrom",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 9459,
                      "src": "2200:26:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$9401_$_t_address_$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (contract IERC20,address,address,uint256)"
                      }
                    },
                    "id": 3611,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2200:76:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 3612,
                  "nodeType": "ExpressionStatement",
                  "src": "2200:76:3"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 3632,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 3613,
                              "name": "balanceStates",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3540,
                              "src": "2339:13:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$_$",
                                "typeString": "mapping(address => mapping(address => struct EpochTokenLocker.BalanceState storage ref))"
                              }
                            },
                            "id": 3617,
                            "indexExpression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 3614,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 10242,
                                "src": "2353:3:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 3615,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "2353:10:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "2339:25:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$",
                              "typeString": "mapping(address => struct EpochTokenLocker.BalanceState storage ref)"
                            }
                          },
                          "id": 3618,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 3616,
                            "name": "token",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3588,
                            "src": "2365:5:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "2339:32:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_BalanceState_$3553_storage",
                            "typeString": "struct EpochTokenLocker.BalanceState storage ref"
                          }
                        },
                        "id": 3619,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "pendingDeposits",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 3550,
                        "src": "2339:48:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_PendingFlux_$3558_storage",
                          "typeString": "struct EpochTokenLocker.PendingFlux storage ref"
                        }
                      },
                      "id": 3620,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberName": "amount",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 3555,
                      "src": "2339:55:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 3630,
                          "name": "amount",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3590,
                          "src": "2470:6:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        ],
                        "expression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 3621,
                                  "name": "balanceStates",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 3540,
                                  "src": "2397:13:3",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$_$",
                                    "typeString": "mapping(address => mapping(address => struct EpochTokenLocker.BalanceState storage ref))"
                                  }
                                },
                                "id": 3624,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 3622,
                                    "name": "msg",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 10242,
                                    "src": "2411:3:3",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_magic_message",
                                      "typeString": "msg"
                                    }
                                  },
                                  "id": 3623,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "sender",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": null,
                                  "src": "2411:10:3",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address_payable",
                                    "typeString": "address payable"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "2397:25:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$",
                                  "typeString": "mapping(address => struct EpochTokenLocker.BalanceState storage ref)"
                                }
                              },
                              "id": 3626,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 3625,
                                "name": "token",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3588,
                                "src": "2423:5:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "2397:32:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_BalanceState_$3553_storage",
                                "typeString": "struct EpochTokenLocker.BalanceState storage ref"
                              }
                            },
                            "id": 3627,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "pendingDeposits",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 3550,
                            "src": "2397:48:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_PendingFlux_$3558_storage",
                              "typeString": "struct EpochTokenLocker.PendingFlux storage ref"
                            }
                          },
                          "id": 3628,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "amount",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 3555,
                          "src": "2397:55:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 3629,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "add",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 8563,
                        "src": "2397:59:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                          "typeString": "function (uint256,uint256) pure returns (uint256)"
                        }
                      },
                      "id": 3631,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "2397:89:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "2339:147:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 3633,
                  "nodeType": "ExpressionStatement",
                  "src": "2339:147:3"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 3644,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 3634,
                              "name": "balanceStates",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3540,
                              "src": "2496:13:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$_$",
                                "typeString": "mapping(address => mapping(address => struct EpochTokenLocker.BalanceState storage ref))"
                              }
                            },
                            "id": 3638,
                            "indexExpression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 3635,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 10242,
                                "src": "2510:3:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 3636,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "2510:10:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "2496:25:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$",
                              "typeString": "mapping(address => struct EpochTokenLocker.BalanceState storage ref)"
                            }
                          },
                          "id": 3639,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 3637,
                            "name": "token",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3588,
                            "src": "2522:5:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "2496:32:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_BalanceState_$3553_storage",
                            "typeString": "struct EpochTokenLocker.BalanceState storage ref"
                          }
                        },
                        "id": 3640,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "pendingDeposits",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 3550,
                        "src": "2496:48:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_PendingFlux_$3558_storage",
                          "typeString": "struct EpochTokenLocker.PendingFlux storage ref"
                        }
                      },
                      "id": 3641,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberName": "batchId",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 3557,
                      "src": "2496:56:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint32",
                        "typeString": "uint32"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 3642,
                        "name": "getCurrentBatchId",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3888,
                        "src": "2555:17:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_view$__$returns$_t_uint32_$",
                          "typeString": "function () view returns (uint32)"
                        }
                      },
                      "id": 3643,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "2555:19:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint32",
                        "typeString": "uint32"
                      }
                    },
                    "src": "2496:78:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint32",
                      "typeString": "uint32"
                    }
                  },
                  "id": 3645,
                  "nodeType": "ExpressionStatement",
                  "src": "2496:78:3"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 3647,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 10242,
                          "src": "2597:3:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 3648,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "2597:10:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 3649,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3588,
                        "src": "2609:5:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 3650,
                        "name": "amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3590,
                        "src": "2616:6:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "arguments": [],
                        "expression": {
                          "argumentTypes": [],
                          "id": 3651,
                          "name": "getCurrentBatchId",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3888,
                          "src": "2624:17:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_view$__$returns$_t_uint32_$",
                            "typeString": "function () view returns (uint32)"
                          }
                        },
                        "id": 3652,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "2624:19:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        }
                      ],
                      "id": 3646,
                      "name": "Deposit",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 3568,
                      "src": "2589:7:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_uint32_$returns$__$",
                        "typeString": "function (address,address,uint256,uint32)"
                      }
                    },
                    "id": 3653,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2589:55:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 3654,
                  "nodeType": "EmitStatement",
                  "src": "2584:60:3"
                }
              ]
            },
            "documentation": "@dev credits user with deposit amount on next epoch (given by getCurrentBatchId)\n@param token address of token to be deposited\n@param amount number of token(s) to be credited to user's account\n     * Emits an {Deposit} event with relevent deposit information.\n     * Requirements:\n- token transfer to contract is successfull",
            "id": 3656,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "deposit",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 3591,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3588,
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "scope": 3656,
                  "src": "2102:13:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3587,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2102:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3590,
                  "name": "amount",
                  "nodeType": "VariableDeclaration",
                  "scope": 3656,
                  "src": "2117:14:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3589,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2117:7:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2101:31:3"
            },
            "returnParameters": {
              "id": 3592,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2140:0:3"
            },
            "scope": 4188,
            "src": "2085:566:3",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 3670,
              "nodeType": "Block",
              "src": "2981:74:3",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 3664,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3658,
                        "src": "3013:5:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 3665,
                        "name": "amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3660,
                        "src": "3020:6:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "arguments": [],
                        "expression": {
                          "argumentTypes": [],
                          "id": 3666,
                          "name": "getCurrentBatchId",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3888,
                          "src": "3028:17:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_view$__$returns$_t_uint32_$",
                            "typeString": "function () view returns (uint32)"
                          }
                        },
                        "id": 3667,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "3028:19:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        }
                      ],
                      "id": 3663,
                      "name": "requestFutureWithdraw",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 3723,
                      "src": "2991:21:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$_t_uint32_$returns$__$",
                        "typeString": "function (address,uint256,uint32)"
                      }
                    },
                    "id": 3668,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2991:57:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 3669,
                  "nodeType": "ExpressionStatement",
                  "src": "2991:57:3"
                }
              ]
            },
            "documentation": "@dev Signals and initiates user's intent to withdraw.\n@param token address of token to be withdrawn\n@param amount number of token(s) to be withdrawn\n     * Emits an {WithdrawRequest} event with relevent request information.",
            "id": 3671,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "requestWithdraw",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 3661,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3658,
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "scope": 3671,
                  "src": "2943:13:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3657,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2943:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3660,
                  "name": "amount",
                  "nodeType": "VariableDeclaration",
                  "scope": 3671,
                  "src": "2958:14:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3659,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2958:7:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2942:31:3"
            },
            "returnParameters": {
              "id": 3662,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2981:0:3"
            },
            "scope": 4188,
            "src": "2918:137:3",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 3722,
              "nodeType": "Block",
              "src": "3503:489:3",
              "statements": [
                {
                  "condition": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 3681,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 10242,
                          "src": "3652:3:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 3682,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "3652:10:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 3683,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3673,
                        "src": "3664:5:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 3680,
                      "name": "hasValidWithdrawRequest",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 4007,
                      "src": "3628:23:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_address_$_t_address_$returns$_t_bool_$",
                        "typeString": "function (address,address) view returns (bool)"
                      }
                    },
                    "id": 3684,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3628:42:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 3692,
                  "nodeType": "IfStatement",
                  "src": "3624:100:3",
                  "trueBody": {
                    "id": 3691,
                    "nodeType": "Block",
                    "src": "3672:52:3",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 3686,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 10242,
                                "src": "3695:3:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 3687,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "3695:10:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 3688,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3673,
                              "src": "3707:5:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 3685,
                            "name": "withdraw",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3822,
                            "src": "3686:8:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$returns$__$",
                              "typeString": "function (address,address)"
                            }
                          },
                          "id": 3689,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3686:27:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 3690,
                        "nodeType": "ExpressionStatement",
                        "src": "3686:27:3"
                      }
                    ]
                  }
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        },
                        "id": 3697,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 3694,
                          "name": "batchId",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3677,
                          "src": "3741:7:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": ">=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 3695,
                            "name": "getCurrentBatchId",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3888,
                            "src": "3752:17:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$__$returns$_t_uint32_$",
                              "typeString": "function () view returns (uint32)"
                            }
                          },
                          "id": 3696,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3752:19:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "src": "3741:30:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "526571756573742063616e6e6f74206265206d61646520696e207468652070617374",
                        "id": 3698,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "3773:36:3",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_fd823ddd348b7dfce824ea8cc767ce782aa7d36d826897afdf2384ef8a55d6b8",
                          "typeString": "literal_string \"Request cannot be made in the past\""
                        },
                        "value": "Request cannot be made in the past"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_fd823ddd348b7dfce824ea8cc767ce782aa7d36d826897afdf2384ef8a55d6b8",
                          "typeString": "literal_string \"Request cannot be made in the past\""
                        }
                      ],
                      "id": 3693,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        10245,
                        10246
                      ],
                      "referencedDeclaration": 10246,
                      "src": "3733:7:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 3699,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3733:77:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 3700,
                  "nodeType": "ExpressionStatement",
                  "src": "3733:77:3"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 3712,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "baseExpression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 3701,
                            "name": "balanceStates",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3540,
                            "src": "3820:13:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$_$",
                              "typeString": "mapping(address => mapping(address => struct EpochTokenLocker.BalanceState storage ref))"
                            }
                          },
                          "id": 3705,
                          "indexExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 3702,
                              "name": "msg",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 10242,
                              "src": "3834:3:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_message",
                                "typeString": "msg"
                              }
                            },
                            "id": 3703,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sender",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "3834:10:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "3820:25:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$",
                            "typeString": "mapping(address => struct EpochTokenLocker.BalanceState storage ref)"
                          }
                        },
                        "id": 3706,
                        "indexExpression": {
                          "argumentTypes": null,
                          "id": 3704,
                          "name": "token",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3673,
                          "src": "3846:5:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "3820:32:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_BalanceState_$3553_storage",
                          "typeString": "struct EpochTokenLocker.BalanceState storage ref"
                        }
                      },
                      "id": 3707,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberName": "pendingWithdraws",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 3552,
                      "src": "3820:49:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_PendingFlux_$3558_storage",
                        "typeString": "struct EpochTokenLocker.PendingFlux storage ref"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 3709,
                          "name": "amount",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3675,
                          "src": "3893:6:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        {
                          "argumentTypes": null,
                          "id": 3710,
                          "name": "batchId",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3677,
                          "src": "3910:7:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        ],
                        "id": 3708,
                        "name": "PendingFlux",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3558,
                        "src": "3872:11:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_struct$_PendingFlux_$3558_storage_ptr_$",
                          "typeString": "type(struct EpochTokenLocker.PendingFlux storage pointer)"
                        }
                      },
                      "id": 3711,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "structConstructorCall",
                      "lValueRequested": false,
                      "names": [
                        "amount",
                        "batchId"
                      ],
                      "nodeType": "FunctionCall",
                      "src": "3872:47:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_PendingFlux_$3558_memory",
                        "typeString": "struct EpochTokenLocker.PendingFlux memory"
                      }
                    },
                    "src": "3820:99:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_PendingFlux_$3558_storage",
                      "typeString": "struct EpochTokenLocker.PendingFlux storage ref"
                    }
                  },
                  "id": 3713,
                  "nodeType": "ExpressionStatement",
                  "src": "3820:99:3"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 3715,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 10242,
                          "src": "3950:3:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 3716,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "3950:10:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 3717,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3673,
                        "src": "3962:5:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 3718,
                        "name": "amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3675,
                        "src": "3969:6:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 3719,
                        "name": "batchId",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3677,
                        "src": "3977:7:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        }
                      ],
                      "id": 3714,
                      "name": "WithdrawRequest",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 3578,
                      "src": "3934:15:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_uint32_$returns$__$",
                        "typeString": "function (address,address,uint256,uint32)"
                      }
                    },
                    "id": 3720,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3934:51:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 3721,
                  "nodeType": "EmitStatement",
                  "src": "3929:56:3"
                }
              ]
            },
            "documentation": "@dev Signals and initiates user's intent to withdraw.\n@param token address of token to be withdrawn\n@param amount number of token(s) to be withdrawn\n@param batchId state index at which request is to be made.\n     * Emits an {WithdrawRequest} event with relevent request information.",
            "id": 3723,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "requestFutureWithdraw",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 3678,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3673,
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "scope": 3723,
                  "src": "3428:13:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3672,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3428:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3675,
                  "name": "amount",
                  "nodeType": "VariableDeclaration",
                  "scope": 3723,
                  "src": "3451:14:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3674,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "3451:7:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3677,
                  "name": "batchId",
                  "nodeType": "VariableDeclaration",
                  "scope": 3723,
                  "src": "3475:14:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint32",
                    "typeString": "uint32"
                  },
                  "typeName": {
                    "id": 3676,
                    "name": "uint32",
                    "nodeType": "ElementaryTypeName",
                    "src": "3475:6:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint32",
                      "typeString": "uint32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3418:77:3"
            },
            "returnParameters": {
              "id": 3679,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3503:0:3"
            },
            "scope": 4188,
            "src": "3388:604:3",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 3821,
              "nodeType": "Block",
              "src": "4486:842:3",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 3731,
                        "name": "user",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3725,
                        "src": "4518:4:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 3732,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3727,
                        "src": "4524:5:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 3730,
                      "name": "updateDepositsBalance",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 4187,
                      "src": "4496:21:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$returns$__$",
                        "typeString": "function (address,address)"
                      }
                    },
                    "id": 3733,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4496:34:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 3734,
                  "nodeType": "ExpressionStatement",
                  "src": "4496:34:3"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        },
                        "id": 3745,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 3736,
                                  "name": "balanceStates",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 3540,
                                  "src": "4623:13:3",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$_$",
                                    "typeString": "mapping(address => mapping(address => struct EpochTokenLocker.BalanceState storage ref))"
                                  }
                                },
                                "id": 3738,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 3737,
                                  "name": "user",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 3725,
                                  "src": "4637:4:3",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "4623:19:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$",
                                  "typeString": "mapping(address => struct EpochTokenLocker.BalanceState storage ref)"
                                }
                              },
                              "id": 3740,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 3739,
                                "name": "token",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3727,
                                "src": "4643:5:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "4623:26:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_BalanceState_$3553_storage",
                                "typeString": "struct EpochTokenLocker.BalanceState storage ref"
                              }
                            },
                            "id": 3741,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "pendingWithdraws",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 3552,
                            "src": "4623:43:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_PendingFlux_$3558_storage",
                              "typeString": "struct EpochTokenLocker.PendingFlux storage ref"
                            }
                          },
                          "id": 3742,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "batchId",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 3557,
                          "src": "4623:51:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "<",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 3743,
                            "name": "getCurrentBatchId",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3888,
                            "src": "4677:17:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$__$returns$_t_uint32_$",
                              "typeString": "function () view returns (uint32)"
                            }
                          },
                          "id": 3744,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4677:19:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "src": "4623:73:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "776974686472617720776173206e6f7420726567697374657265642070726576696f75736c79",
                        "id": 3746,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "4710:40:3",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_a8d401a914d43eb039a6bcd8282964d80be6445aae392b14acfcab8cff0d345c",
                          "typeString": "literal_string \"withdraw was not registered previously\""
                        },
                        "value": "withdraw was not registered previously"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_a8d401a914d43eb039a6bcd8282964d80be6445aae392b14acfcab8cff0d345c",
                          "typeString": "literal_string \"withdraw was not registered previously\""
                        }
                      ],
                      "id": 3735,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        10245,
                        10246
                      ],
                      "referencedDeclaration": 10246,
                      "src": "4602:7:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 3747,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4602:158:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 3748,
                  "nodeType": "ExpressionStatement",
                  "src": "4602:158:3"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        },
                        "id": 3757,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 3750,
                              "name": "lastCreditBatchId",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3546,
                              "src": "4791:17:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint32_$_$",
                                "typeString": "mapping(address => mapping(address => uint32))"
                              }
                            },
                            "id": 3752,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 3751,
                              "name": "user",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3725,
                              "src": "4809:4:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "4791:23:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_uint32_$",
                              "typeString": "mapping(address => uint32)"
                            }
                          },
                          "id": 3754,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 3753,
                            "name": "token",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3727,
                            "src": "4815:5:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "4791:30:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "<",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 3755,
                            "name": "getCurrentBatchId",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3888,
                            "src": "4824:17:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$__$returns$_t_uint32_$",
                              "typeString": "function () view returns (uint32)"
                            }
                          },
                          "id": 3756,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4824:19:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "src": "4791:52:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "5769746864726177206e6f7420706f737369626c6520666f7220746f6b656e20746861742069732074726164656420696e207468652063757272656e742061756374696f6e",
                        "id": 3758,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "4857:71:3",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_6d363b774611e015ae4b37ced0beb96af88baf5d7d48f43e651448aeca6e96b6",
                          "typeString": "literal_string \"Withdraw not possible for token that is traded in the current auction\""
                        },
                        "value": "Withdraw not possible for token that is traded in the current auction"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_6d363b774611e015ae4b37ced0beb96af88baf5d7d48f43e651448aeca6e96b6",
                          "typeString": "literal_string \"Withdraw not possible for token that is traded in the current auction\""
                        }
                      ],
                      "id": 3749,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        10245,
                        10246
                      ],
                      "referencedDeclaration": 10246,
                      "src": "4770:7:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 3759,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4770:168:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 3760,
                  "nodeType": "ExpressionStatement",
                  "src": "4770:168:3"
                },
                {
                  "assignments": [
                    3762
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 3762,
                      "name": "amount",
                      "nodeType": "VariableDeclaration",
                      "scope": 3821,
                      "src": "4948:14:3",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 3761,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "4948:7:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 3779,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 3765,
                              "name": "balanceStates",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3540,
                              "src": "4974:13:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$_$",
                                "typeString": "mapping(address => mapping(address => struct EpochTokenLocker.BalanceState storage ref))"
                              }
                            },
                            "id": 3767,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 3766,
                              "name": "user",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3725,
                              "src": "4988:4:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "4974:19:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$",
                              "typeString": "mapping(address => struct EpochTokenLocker.BalanceState storage ref)"
                            }
                          },
                          "id": 3769,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 3768,
                            "name": "token",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3727,
                            "src": "4994:5:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "4974:26:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_BalanceState_$3553_storage",
                            "typeString": "struct EpochTokenLocker.BalanceState storage ref"
                          }
                        },
                        "id": 3770,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "balance",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 3548,
                        "src": "4974:34:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 3771,
                                "name": "balanceStates",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3540,
                                "src": "5010:13:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$_$",
                                  "typeString": "mapping(address => mapping(address => struct EpochTokenLocker.BalanceState storage ref))"
                                }
                              },
                              "id": 3773,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 3772,
                                "name": "user",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3725,
                                "src": "5024:4:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "5010:19:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$",
                                "typeString": "mapping(address => struct EpochTokenLocker.BalanceState storage ref)"
                              }
                            },
                            "id": 3775,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 3774,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3727,
                              "src": "5030:5:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "5010:26:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_BalanceState_$3553_storage",
                              "typeString": "struct EpochTokenLocker.BalanceState storage ref"
                            }
                          },
                          "id": 3776,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "pendingWithdraws",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 3552,
                          "src": "5010:43:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_PendingFlux_$3558_storage",
                            "typeString": "struct EpochTokenLocker.PendingFlux storage ref"
                          }
                        },
                        "id": 3777,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "amount",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 3555,
                        "src": "5010:50:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 3763,
                        "name": "Math",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 8536,
                        "src": "4965:4:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_contract$_Math_$8536_$",
                          "typeString": "type(library Math)"
                        }
                      },
                      "id": 3764,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "min",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 8503,
                      "src": "4965:8:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                        "typeString": "function (uint256,uint256) pure returns (uint256)"
                      }
                    },
                    "id": 3778,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4965:96:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "4948:113:3"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 3795,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "baseExpression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 3780,
                            "name": "balanceStates",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3540,
                            "src": "5072:13:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$_$",
                              "typeString": "mapping(address => mapping(address => struct EpochTokenLocker.BalanceState storage ref))"
                            }
                          },
                          "id": 3783,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 3781,
                            "name": "user",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3725,
                            "src": "5086:4:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "5072:19:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$",
                            "typeString": "mapping(address => struct EpochTokenLocker.BalanceState storage ref)"
                          }
                        },
                        "id": 3784,
                        "indexExpression": {
                          "argumentTypes": null,
                          "id": 3782,
                          "name": "token",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3727,
                          "src": "5092:5:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "5072:26:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_BalanceState_$3553_storage",
                          "typeString": "struct EpochTokenLocker.BalanceState storage ref"
                        }
                      },
                      "id": 3785,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberName": "balance",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 3548,
                      "src": "5072:34:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 3793,
                          "name": "amount",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3762,
                          "src": "5148:6:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        ],
                        "expression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 3786,
                                "name": "balanceStates",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3540,
                                "src": "5109:13:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$_$",
                                  "typeString": "mapping(address => mapping(address => struct EpochTokenLocker.BalanceState storage ref))"
                                }
                              },
                              "id": 3788,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 3787,
                                "name": "user",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3725,
                                "src": "5123:4:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "5109:19:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$",
                                "typeString": "mapping(address => struct EpochTokenLocker.BalanceState storage ref)"
                              }
                            },
                            "id": 3790,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 3789,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3727,
                              "src": "5129:5:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "5109:26:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_BalanceState_$3553_storage",
                              "typeString": "struct EpochTokenLocker.BalanceState storage ref"
                            }
                          },
                          "id": 3791,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "balance",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 3548,
                          "src": "5109:34:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 3792,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sub",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 8579,
                        "src": "5109:38:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                          "typeString": "function (uint256,uint256) pure returns (uint256)"
                        }
                      },
                      "id": 3794,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "5109:46:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "5072:83:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 3796,
                  "nodeType": "ExpressionStatement",
                  "src": "5072:83:3"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 3803,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "UnaryOperation",
                    "operator": "delete",
                    "prefix": true,
                    "src": "5165:50:3",
                    "subExpression": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "baseExpression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 3797,
                            "name": "balanceStates",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3540,
                            "src": "5172:13:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$_$",
                              "typeString": "mapping(address => mapping(address => struct EpochTokenLocker.BalanceState storage ref))"
                            }
                          },
                          "id": 3799,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 3798,
                            "name": "user",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3725,
                            "src": "5186:4:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "5172:19:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$",
                            "typeString": "mapping(address => struct EpochTokenLocker.BalanceState storage ref)"
                          }
                        },
                        "id": 3801,
                        "indexExpression": {
                          "argumentTypes": null,
                          "id": 3800,
                          "name": "token",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3727,
                          "src": "5192:5:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "5172:26:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_BalanceState_$3553_storage",
                          "typeString": "struct EpochTokenLocker.BalanceState storage ref"
                        }
                      },
                      "id": 3802,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberName": "pendingWithdraws",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 3552,
                      "src": "5172:43:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_PendingFlux_$3558_storage",
                        "typeString": "struct EpochTokenLocker.PendingFlux storage ref"
                      }
                    },
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 3804,
                  "nodeType": "ExpressionStatement",
                  "src": "5165:50:3"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 3809,
                            "name": "token",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3727,
                            "src": "5256:5:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          ],
                          "id": 3808,
                          "name": "IERC20",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 9401,
                          "src": "5249:6:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_contract$_IERC20_$9401_$",
                            "typeString": "type(contract IERC20)"
                          }
                        },
                        "id": 3810,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "5249:13:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$9401",
                          "typeString": "contract IERC20"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 3811,
                        "name": "user",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3725,
                        "src": "5264:4:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 3812,
                        "name": "amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3762,
                        "src": "5270:6:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_contract$_IERC20_$9401",
                          "typeString": "contract IERC20"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 3805,
                        "name": "SafeERC20",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 9621,
                        "src": "5226:9:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_contract$_SafeERC20_$9621_$",
                          "typeString": "type(library SafeERC20)"
                        }
                      },
                      "id": 3807,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "safeTransfer",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 9434,
                      "src": "5226:22:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$9401_$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (contract IERC20,address,uint256)"
                      }
                    },
                    "id": 3813,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5226:51:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 3814,
                  "nodeType": "ExpressionStatement",
                  "src": "5226:51:3"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 3816,
                        "name": "user",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3725,
                        "src": "5301:4:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 3817,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3727,
                        "src": "5307:5:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 3818,
                        "name": "amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3762,
                        "src": "5314:6:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 3815,
                      "name": "Withdraw",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 3586,
                      "src": "5292:8:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,address,uint256)"
                      }
                    },
                    "id": 3819,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5292:29:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 3820,
                  "nodeType": "EmitStatement",
                  "src": "5287:34:3"
                }
              ]
            },
            "documentation": "@dev Claims pending withdraw - can be called on behalf of others\n@param token address of token to be withdrawn\n@param user address of user who withdraw is being claimed.\n     * Emits an {Withdraw} event stating that `user` withdrew `amount` of `token`\n     * Requirements:\n- withdraw was requested in previous epoch\n- token was received from exchange in current auction batch",
            "id": 3822,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "withdraw",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 3728,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3725,
                  "name": "user",
                  "nodeType": "VariableDeclaration",
                  "scope": 3822,
                  "src": "4450:12:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3724,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4450:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3727,
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "scope": 3822,
                  "src": "4464:13:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3726,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4464:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4449:29:3"
            },
            "returnParameters": {
              "id": 3729,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "4486:0:3"
            },
            "scope": 4188,
            "src": "4432:896:3",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 3848,
              "nodeType": "Block",
              "src": "5691:159:3",
              "statements": [
                {
                  "assignments": [
                    3834
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 3834,
                      "name": "pendingDeposit",
                      "nodeType": "VariableDeclaration",
                      "scope": 3848,
                      "src": "5701:33:3",
                      "stateVariable": false,
                      "storageLocation": "memory",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_PendingFlux_$3558_memory_ptr",
                        "typeString": "struct EpochTokenLocker.PendingFlux"
                      },
                      "typeName": {
                        "contractScope": null,
                        "id": 3833,
                        "name": "PendingFlux",
                        "nodeType": "UserDefinedTypeName",
                        "referencedDeclaration": 3558,
                        "src": "5701:11:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_PendingFlux_$3558_storage_ptr",
                          "typeString": "struct EpochTokenLocker.PendingFlux"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 3841,
                  "initialValue": {
                    "argumentTypes": null,
                    "expression": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "baseExpression": {
                          "argumentTypes": null,
                          "id": 3835,
                          "name": "balanceStates",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3540,
                          "src": "5737:13:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$_$",
                            "typeString": "mapping(address => mapping(address => struct EpochTokenLocker.BalanceState storage ref))"
                          }
                        },
                        "id": 3837,
                        "indexExpression": {
                          "argumentTypes": null,
                          "id": 3836,
                          "name": "user",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3824,
                          "src": "5751:4:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "5737:19:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$",
                          "typeString": "mapping(address => struct EpochTokenLocker.BalanceState storage ref)"
                        }
                      },
                      "id": 3839,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 3838,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3826,
                        "src": "5757:5:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "IndexAccess",
                      "src": "5737:26:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_BalanceState_$3553_storage",
                        "typeString": "struct EpochTokenLocker.BalanceState storage ref"
                      }
                    },
                    "id": 3840,
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "memberName": "pendingDeposits",
                    "nodeType": "MemberAccess",
                    "referencedDeclaration": 3550,
                    "src": "5737:42:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_PendingFlux_$3558_storage",
                      "typeString": "struct EpochTokenLocker.PendingFlux storage ref"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "5701:78:3"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "components": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 3842,
                          "name": "pendingDeposit",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3834,
                          "src": "5797:14:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_PendingFlux_$3558_memory_ptr",
                            "typeString": "struct EpochTokenLocker.PendingFlux memory"
                          }
                        },
                        "id": 3843,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "amount",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 3555,
                        "src": "5797:21:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 3844,
                          "name": "pendingDeposit",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3834,
                          "src": "5820:14:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_PendingFlux_$3558_memory_ptr",
                            "typeString": "struct EpochTokenLocker.PendingFlux memory"
                          }
                        },
                        "id": 3845,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "batchId",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 3557,
                        "src": "5820:22:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        }
                      }
                    ],
                    "id": 3846,
                    "isConstant": false,
                    "isInlineArray": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "TupleExpression",
                    "src": "5796:47:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$_t_uint256_$_t_uint32_$",
                      "typeString": "tuple(uint256,uint32)"
                    }
                  },
                  "functionReturnParameters": 3832,
                  "id": 3847,
                  "nodeType": "Return",
                  "src": "5789:54:3"
                }
              ]
            },
            "documentation": "@dev getter function used to display pending deposit\n@param user address of user\n@param token address of ERC20 token\nreturn amount and batchId of deposit's transfer if any (else 0)",
            "id": 3849,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "getPendingDeposit",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 3827,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3824,
                  "name": "user",
                  "nodeType": "VariableDeclaration",
                  "scope": 3849,
                  "src": "5624:12:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3823,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "5624:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3826,
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "scope": 3849,
                  "src": "5638:13:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3825,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "5638:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "5623:29:3"
            },
            "returnParameters": {
              "id": 3832,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3829,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 3849,
                  "src": "5674:7:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3828,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "5674:7:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3831,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 3849,
                  "src": "5683:6:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint32",
                    "typeString": "uint32"
                  },
                  "typeName": {
                    "id": 3830,
                    "name": "uint32",
                    "nodeType": "ElementaryTypeName",
                    "src": "5683:6:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint32",
                      "typeString": "uint32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "5673:17:3"
            },
            "scope": 4188,
            "src": "5597:253:3",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 3875,
              "nodeType": "Block",
              "src": "6176:163:3",
              "statements": [
                {
                  "assignments": [
                    3861
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 3861,
                      "name": "pendingWithdraw",
                      "nodeType": "VariableDeclaration",
                      "scope": 3875,
                      "src": "6186:34:3",
                      "stateVariable": false,
                      "storageLocation": "memory",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_PendingFlux_$3558_memory_ptr",
                        "typeString": "struct EpochTokenLocker.PendingFlux"
                      },
                      "typeName": {
                        "contractScope": null,
                        "id": 3860,
                        "name": "PendingFlux",
                        "nodeType": "UserDefinedTypeName",
                        "referencedDeclaration": 3558,
                        "src": "6186:11:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_PendingFlux_$3558_storage_ptr",
                          "typeString": "struct EpochTokenLocker.PendingFlux"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 3868,
                  "initialValue": {
                    "argumentTypes": null,
                    "expression": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "baseExpression": {
                          "argumentTypes": null,
                          "id": 3862,
                          "name": "balanceStates",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3540,
                          "src": "6223:13:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$_$",
                            "typeString": "mapping(address => mapping(address => struct EpochTokenLocker.BalanceState storage ref))"
                          }
                        },
                        "id": 3864,
                        "indexExpression": {
                          "argumentTypes": null,
                          "id": 3863,
                          "name": "user",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3851,
                          "src": "6237:4:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "6223:19:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$",
                          "typeString": "mapping(address => struct EpochTokenLocker.BalanceState storage ref)"
                        }
                      },
                      "id": 3866,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 3865,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3853,
                        "src": "6243:5:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "IndexAccess",
                      "src": "6223:26:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_BalanceState_$3553_storage",
                        "typeString": "struct EpochTokenLocker.BalanceState storage ref"
                      }
                    },
                    "id": 3867,
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "memberName": "pendingWithdraws",
                    "nodeType": "MemberAccess",
                    "referencedDeclaration": 3552,
                    "src": "6223:43:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_PendingFlux_$3558_storage",
                      "typeString": "struct EpochTokenLocker.PendingFlux storage ref"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "6186:80:3"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "components": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 3869,
                          "name": "pendingWithdraw",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3861,
                          "src": "6284:15:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_PendingFlux_$3558_memory_ptr",
                            "typeString": "struct EpochTokenLocker.PendingFlux memory"
                          }
                        },
                        "id": 3870,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "amount",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 3555,
                        "src": "6284:22:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 3871,
                          "name": "pendingWithdraw",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3861,
                          "src": "6308:15:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_PendingFlux_$3558_memory_ptr",
                            "typeString": "struct EpochTokenLocker.PendingFlux memory"
                          }
                        },
                        "id": 3872,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "batchId",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 3557,
                        "src": "6308:23:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        }
                      }
                    ],
                    "id": 3873,
                    "isConstant": false,
                    "isInlineArray": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "TupleExpression",
                    "src": "6283:49:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$_t_uint256_$_t_uint32_$",
                      "typeString": "tuple(uint256,uint32)"
                    }
                  },
                  "functionReturnParameters": 3859,
                  "id": 3874,
                  "nodeType": "Return",
                  "src": "6276:56:3"
                }
              ]
            },
            "documentation": "@dev getter function used to display pending withdraw\n@param user address of user\n@param token address of ERC20 token\nreturn amount and batchId when withdraw was requested if any (else 0)",
            "id": 3876,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "getPendingWithdraw",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 3854,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3851,
                  "name": "user",
                  "nodeType": "VariableDeclaration",
                  "scope": 3876,
                  "src": "6109:12:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3850,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "6109:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3853,
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "scope": 3876,
                  "src": "6123:13:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3852,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "6123:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "6108:29:3"
            },
            "returnParameters": {
              "id": 3859,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3856,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 3876,
                  "src": "6159:7:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3855,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "6159:7:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3858,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 3876,
                  "src": "6168:6:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint32",
                    "typeString": "uint32"
                  },
                  "typeName": {
                    "id": 3857,
                    "name": "uint32",
                    "nodeType": "ElementaryTypeName",
                    "src": "6168:6:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint32",
                      "typeString": "uint32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "6158:17:3"
            },
            "scope": 4188,
            "src": "6081:258:3",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 3887,
              "nodeType": "Block",
              "src": "6503:102:3",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 3884,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 3882,
                          "name": "now",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 10244,
                          "src": "6581:3:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "/",
                        "rightExpression": {
                          "argumentTypes": null,
                          "id": 3883,
                          "name": "BATCH_TIME",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3534,
                          "src": "6587:10:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "src": "6581:16:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 3881,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "lValueRequested": false,
                      "nodeType": "ElementaryTypeNameExpression",
                      "src": "6574:6:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_type$_t_uint32_$",
                        "typeString": "type(uint32)"
                      },
                      "typeName": "uint32"
                    },
                    "id": 3885,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "typeConversion",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "6574:24:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint32",
                      "typeString": "uint32"
                    }
                  },
                  "functionReturnParameters": 3880,
                  "id": 3886,
                  "nodeType": "Return",
                  "src": "6567:31:3"
                }
              ]
            },
            "documentation": "@dev getter function to determine current auction id.\nreturn current batchId",
            "id": 3888,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "getCurrentBatchId",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 3877,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "6471:2:3"
            },
            "returnParameters": {
              "id": 3880,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3879,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 3888,
                  "src": "6495:6:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint32",
                    "typeString": "uint32"
                  },
                  "typeName": {
                    "id": 3878,
                    "name": "uint32",
                    "nodeType": "ElementaryTypeName",
                    "src": "6495:6:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint32",
                      "typeString": "uint32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "6494:8:3"
            },
            "scope": 4188,
            "src": "6445:160:3",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 3900,
              "nodeType": "Block",
              "src": "6800:109:3",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 3898,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 3893,
                      "name": "BATCH_TIME",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 3534,
                      "src": "6871:10:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint32",
                        "typeString": "uint32"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "-",
                    "rightExpression": {
                      "argumentTypes": null,
                      "components": [
                        {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 3896,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 3894,
                            "name": "now",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 10244,
                            "src": "6885:3:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "%",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 3895,
                            "name": "BATCH_TIME",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3534,
                            "src": "6891:10:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint32",
                              "typeString": "uint32"
                            }
                          },
                          "src": "6885:16:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "id": 3897,
                      "isConstant": false,
                      "isInlineArray": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "TupleExpression",
                      "src": "6884:18:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "6871:31:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 3892,
                  "id": 3899,
                  "nodeType": "Return",
                  "src": "6864:38:3"
                }
              ]
            },
            "documentation": "@dev used to determine how much time is left in a batch\nreturn seconds remaining in current batch",
            "id": 3901,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "getSecondsRemainingInBatch",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 3889,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "6767:2:3"
            },
            "returnParameters": {
              "id": 3892,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3891,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 3901,
                  "src": "6791:7:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3890,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "6791:7:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "6790:9:3"
            },
            "scope": 4188,
            "src": "6732:177:3",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 3975,
              "nodeType": "Block",
              "src": "7186:482:3",
              "statements": [
                {
                  "assignments": [
                    3911
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 3911,
                      "name": "balance",
                      "nodeType": "VariableDeclaration",
                      "scope": 3975,
                      "src": "7196:15:3",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 3910,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "7196:7:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 3918,
                  "initialValue": {
                    "argumentTypes": null,
                    "expression": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "baseExpression": {
                          "argumentTypes": null,
                          "id": 3912,
                          "name": "balanceStates",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3540,
                          "src": "7214:13:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$_$",
                            "typeString": "mapping(address => mapping(address => struct EpochTokenLocker.BalanceState storage ref))"
                          }
                        },
                        "id": 3914,
                        "indexExpression": {
                          "argumentTypes": null,
                          "id": 3913,
                          "name": "user",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3903,
                          "src": "7228:4:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "7214:19:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$",
                          "typeString": "mapping(address => struct EpochTokenLocker.BalanceState storage ref)"
                        }
                      },
                      "id": 3916,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 3915,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3905,
                        "src": "7234:5:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "IndexAccess",
                      "src": "7214:26:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_BalanceState_$3553_storage",
                        "typeString": "struct EpochTokenLocker.BalanceState storage ref"
                      }
                    },
                    "id": 3917,
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "memberName": "balance",
                    "nodeType": "MemberAccess",
                    "referencedDeclaration": 3548,
                    "src": "7214:34:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "7196:52:3"
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint32",
                      "typeString": "uint32"
                    },
                    "id": 3928,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 3919,
                              "name": "balanceStates",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3540,
                              "src": "7262:13:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$_$",
                                "typeString": "mapping(address => mapping(address => struct EpochTokenLocker.BalanceState storage ref))"
                              }
                            },
                            "id": 3921,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 3920,
                              "name": "user",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3903,
                              "src": "7276:4:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "7262:19:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$",
                              "typeString": "mapping(address => struct EpochTokenLocker.BalanceState storage ref)"
                            }
                          },
                          "id": 3923,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 3922,
                            "name": "token",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3905,
                            "src": "7282:5:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "7262:26:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_BalanceState_$3553_storage",
                            "typeString": "struct EpochTokenLocker.BalanceState storage ref"
                          }
                        },
                        "id": 3924,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "pendingDeposits",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 3550,
                        "src": "7262:42:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_PendingFlux_$3558_storage",
                          "typeString": "struct EpochTokenLocker.PendingFlux storage ref"
                        }
                      },
                      "id": 3925,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "batchId",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 3557,
                      "src": "7262:50:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint32",
                        "typeString": "uint32"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "<",
                    "rightExpression": {
                      "argumentTypes": null,
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 3926,
                        "name": "getCurrentBatchId",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3888,
                        "src": "7315:17:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_view$__$returns$_t_uint32_$",
                          "typeString": "function () view returns (uint32)"
                        }
                      },
                      "id": 3927,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "7315:19:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint32",
                        "typeString": "uint32"
                      }
                    },
                    "src": "7262:72:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 3943,
                  "nodeType": "IfStatement",
                  "src": "7258:175:3",
                  "trueBody": {
                    "id": 3942,
                    "nodeType": "Block",
                    "src": "7336:97:3",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 3940,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 3929,
                            "name": "balance",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3911,
                            "src": "7350:7:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "baseExpression": {
                                      "argumentTypes": null,
                                      "baseExpression": {
                                        "argumentTypes": null,
                                        "id": 3932,
                                        "name": "balanceStates",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 3540,
                                        "src": "7372:13:3",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$_$",
                                          "typeString": "mapping(address => mapping(address => struct EpochTokenLocker.BalanceState storage ref))"
                                        }
                                      },
                                      "id": 3934,
                                      "indexExpression": {
                                        "argumentTypes": null,
                                        "id": 3933,
                                        "name": "user",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 3903,
                                        "src": "7386:4:3",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      },
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "nodeType": "IndexAccess",
                                      "src": "7372:19:3",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$",
                                        "typeString": "mapping(address => struct EpochTokenLocker.BalanceState storage ref)"
                                      }
                                    },
                                    "id": 3936,
                                    "indexExpression": {
                                      "argumentTypes": null,
                                      "id": 3935,
                                      "name": "token",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 3905,
                                      "src": "7392:5:3",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    },
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "IndexAccess",
                                    "src": "7372:26:3",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_BalanceState_$3553_storage",
                                      "typeString": "struct EpochTokenLocker.BalanceState storage ref"
                                    }
                                  },
                                  "id": 3937,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "pendingDeposits",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 3550,
                                  "src": "7372:42:3",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_PendingFlux_$3558_storage",
                                    "typeString": "struct EpochTokenLocker.PendingFlux storage ref"
                                  }
                                },
                                "id": 3938,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "amount",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 3555,
                                "src": "7372:49:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "id": 3930,
                                "name": "balance",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3911,
                                "src": "7360:7:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 3931,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "add",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 8563,
                              "src": "7360:11:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                "typeString": "function (uint256,uint256) pure returns (uint256)"
                              }
                            },
                            "id": 3939,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "7360:62:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "7350:72:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 3941,
                        "nodeType": "ExpressionStatement",
                        "src": "7350:72:3"
                      }
                    ]
                  }
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint32",
                      "typeString": "uint32"
                    },
                    "id": 3953,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 3944,
                              "name": "balanceStates",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3540,
                              "src": "7446:13:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$_$",
                                "typeString": "mapping(address => mapping(address => struct EpochTokenLocker.BalanceState storage ref))"
                              }
                            },
                            "id": 3946,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 3945,
                              "name": "user",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3903,
                              "src": "7460:4:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "7446:19:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$",
                              "typeString": "mapping(address => struct EpochTokenLocker.BalanceState storage ref)"
                            }
                          },
                          "id": 3948,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 3947,
                            "name": "token",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3905,
                            "src": "7466:5:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "7446:26:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_BalanceState_$3553_storage",
                            "typeString": "struct EpochTokenLocker.BalanceState storage ref"
                          }
                        },
                        "id": 3949,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "pendingWithdraws",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 3552,
                        "src": "7446:43:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_PendingFlux_$3558_storage",
                          "typeString": "struct EpochTokenLocker.PendingFlux storage ref"
                        }
                      },
                      "id": 3950,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "batchId",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 3557,
                      "src": "7446:51:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint32",
                        "typeString": "uint32"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "<",
                    "rightExpression": {
                      "argumentTypes": null,
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 3951,
                        "name": "getCurrentBatchId",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3888,
                        "src": "7500:17:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_view$__$returns$_t_uint32_$",
                          "typeString": "function () view returns (uint32)"
                        }
                      },
                      "id": 3952,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "7500:19:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint32",
                        "typeString": "uint32"
                      }
                    },
                    "src": "7446:73:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 3972,
                  "nodeType": "IfStatement",
                  "src": "7442:196:3",
                  "trueBody": {
                    "id": 3971,
                    "nodeType": "Block",
                    "src": "7521:117:3",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 3969,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 3954,
                            "name": "balance",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3911,
                            "src": "7535:7:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "expression": {
                                        "argumentTypes": null,
                                        "baseExpression": {
                                          "argumentTypes": null,
                                          "baseExpression": {
                                            "argumentTypes": null,
                                            "id": 3959,
                                            "name": "balanceStates",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 3540,
                                            "src": "7566:13:3",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$_$",
                                              "typeString": "mapping(address => mapping(address => struct EpochTokenLocker.BalanceState storage ref))"
                                            }
                                          },
                                          "id": 3961,
                                          "indexExpression": {
                                            "argumentTypes": null,
                                            "id": 3960,
                                            "name": "user",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 3903,
                                            "src": "7580:4:3",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_address",
                                              "typeString": "address"
                                            }
                                          },
                                          "isConstant": false,
                                          "isLValue": true,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "nodeType": "IndexAccess",
                                          "src": "7566:19:3",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$",
                                            "typeString": "mapping(address => struct EpochTokenLocker.BalanceState storage ref)"
                                          }
                                        },
                                        "id": 3963,
                                        "indexExpression": {
                                          "argumentTypes": null,
                                          "id": 3962,
                                          "name": "token",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 3905,
                                          "src": "7586:5:3",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          }
                                        },
                                        "isConstant": false,
                                        "isLValue": true,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "nodeType": "IndexAccess",
                                        "src": "7566:26:3",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_struct$_BalanceState_$3553_storage",
                                          "typeString": "struct EpochTokenLocker.BalanceState storage ref"
                                        }
                                      },
                                      "id": 3964,
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "pendingWithdraws",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": 3552,
                                      "src": "7566:43:3",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_PendingFlux_$3558_storage",
                                        "typeString": "struct EpochTokenLocker.PendingFlux storage ref"
                                      }
                                    },
                                    "id": 3965,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "amount",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 3555,
                                    "src": "7566:50:3",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 3966,
                                    "name": "balance",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 3911,
                                    "src": "7618:7:3",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 3957,
                                    "name": "Math",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 8536,
                                    "src": "7557:4:3",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_contract$_Math_$8536_$",
                                      "typeString": "type(library Math)"
                                    }
                                  },
                                  "id": 3958,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "min",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 8503,
                                  "src": "7557:8:3",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                                    "typeString": "function (uint256,uint256) pure returns (uint256)"
                                  }
                                },
                                "id": 3967,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "7557:69:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "id": 3955,
                                "name": "balance",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3911,
                                "src": "7545:7:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 3956,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sub",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 8579,
                              "src": "7545:11:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                "typeString": "function (uint256,uint256) pure returns (uint256)"
                              }
                            },
                            "id": 3968,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "7545:82:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "7535:92:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 3970,
                        "nodeType": "ExpressionStatement",
                        "src": "7535:92:3"
                      }
                    ]
                  }
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 3973,
                    "name": "balance",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 3911,
                    "src": "7654:7:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 3909,
                  "id": 3974,
                  "nodeType": "Return",
                  "src": "7647:14:3"
                }
              ]
            },
            "documentation": "@dev fetches and returns user's balance\n@param user address of user\n@param token address of ERC20 token\nreturn Current `token` balance of `user`'s account",
            "id": 3976,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "getBalance",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 3906,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3903,
                  "name": "user",
                  "nodeType": "VariableDeclaration",
                  "scope": 3976,
                  "src": "7127:12:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3902,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "7127:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3905,
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "scope": 3976,
                  "src": "7141:13:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3904,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "7141:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "7126:29:3"
            },
            "returnParameters": {
              "id": 3909,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3908,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 3976,
                  "src": "7177:7:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3907,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "7177:7:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "7176:9:3"
            },
            "scope": 4188,
            "src": "7107:561:3",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 4006,
              "nodeType": "Block",
              "src": "8028:180:3",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    },
                    "id": 4004,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "commonType": {
                        "typeIdentifier": "t_uint32",
                        "typeString": "uint32"
                      },
                      "id": 3994,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 3985,
                                "name": "balanceStates",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3540,
                                "src": "8057:13:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$_$",
                                  "typeString": "mapping(address => mapping(address => struct EpochTokenLocker.BalanceState storage ref))"
                                }
                              },
                              "id": 3987,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 3986,
                                "name": "user",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3978,
                                "src": "8071:4:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "8057:19:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$",
                                "typeString": "mapping(address => struct EpochTokenLocker.BalanceState storage ref)"
                              }
                            },
                            "id": 3989,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 3988,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3980,
                              "src": "8077:5:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "8057:26:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_BalanceState_$3553_storage",
                              "typeString": "struct EpochTokenLocker.BalanceState storage ref"
                            }
                          },
                          "id": 3990,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "pendingWithdraws",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 3552,
                          "src": "8057:43:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_PendingFlux_$3558_storage",
                            "typeString": "struct EpochTokenLocker.PendingFlux storage ref"
                          }
                        },
                        "id": 3991,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "batchId",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 3557,
                        "src": "8057:51:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": "<",
                      "rightExpression": {
                        "argumentTypes": null,
                        "arguments": [],
                        "expression": {
                          "argumentTypes": [],
                          "id": 3992,
                          "name": "getCurrentBatchId",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3888,
                          "src": "8111:17:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_view$__$returns$_t_uint32_$",
                            "typeString": "function () view returns (uint32)"
                          }
                        },
                        "id": 3993,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "8111:19:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        }
                      },
                      "src": "8057:73:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "&&",
                    "rightExpression": {
                      "argumentTypes": null,
                      "commonType": {
                        "typeIdentifier": "t_uint32",
                        "typeString": "uint32"
                      },
                      "id": 4003,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 3995,
                                "name": "balanceStates",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3540,
                                "src": "8146:13:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$_$",
                                  "typeString": "mapping(address => mapping(address => struct EpochTokenLocker.BalanceState storage ref))"
                                }
                              },
                              "id": 3997,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 3996,
                                "name": "user",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3978,
                                "src": "8160:4:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "8146:19:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$",
                                "typeString": "mapping(address => struct EpochTokenLocker.BalanceState storage ref)"
                              }
                            },
                            "id": 3999,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 3998,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3980,
                              "src": "8166:5:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "8146:26:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_BalanceState_$3553_storage",
                              "typeString": "struct EpochTokenLocker.BalanceState storage ref"
                            }
                          },
                          "id": 4000,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "pendingWithdraws",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 3552,
                          "src": "8146:43:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_PendingFlux_$3558_storage",
                            "typeString": "struct EpochTokenLocker.PendingFlux storage ref"
                          }
                        },
                        "id": 4001,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "batchId",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 3557,
                        "src": "8146:51:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": ">",
                      "rightExpression": {
                        "argumentTypes": null,
                        "hexValue": "30",
                        "id": 4002,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "number",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "8200:1:3",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_rational_0_by_1",
                          "typeString": "int_const 0"
                        },
                        "value": "0"
                      },
                      "src": "8146:55:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "src": "8057:144:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "functionReturnParameters": 3984,
                  "id": 4005,
                  "nodeType": "Return",
                  "src": "8038:163:3"
                }
              ]
            },
            "documentation": "@dev Used to determine if user has a valid pending withdraw request of specific token\n@param user address of user\n@param token address of ERC20 token\nreturn true if `user` has valid withdraw request for `token`, otherwise false",
            "id": 4007,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "hasValidWithdrawRequest",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 3981,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3978,
                  "name": "user",
                  "nodeType": "VariableDeclaration",
                  "scope": 4007,
                  "src": "7972:12:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3977,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "7972:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3980,
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "scope": 4007,
                  "src": "7986:13:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3979,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "7986:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "7971:29:3"
            },
            "returnParameters": {
              "id": 3984,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3983,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 4007,
                  "src": "8022:4:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 3982,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "8022:4:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "8021:6:3"
            },
            "scope": 4188,
            "src": "7939:269:3",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 4037,
              "nodeType": "Block",
              "src": "8892:176:3",
              "statements": [
                {
                  "condition": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 4017,
                        "name": "user",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 4009,
                        "src": "8930:4:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 4018,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 4011,
                        "src": "8936:5:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 4016,
                      "name": "hasValidWithdrawRequest",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 4007,
                      "src": "8906:23:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_address_$_t_address_$returns$_t_bool_$",
                        "typeString": "function (address,address) view returns (bool)"
                      }
                    },
                    "id": 4019,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "8906:36:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 4030,
                  "nodeType": "IfStatement",
                  "src": "8902:119:3",
                  "trueBody": {
                    "id": 4029,
                    "nodeType": "Block",
                    "src": "8944:77:3",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 4027,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 4020,
                                "name": "lastCreditBatchId",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3546,
                                "src": "8958:17:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint32_$_$",
                                  "typeString": "mapping(address => mapping(address => uint32))"
                                }
                              },
                              "id": 4023,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 4021,
                                "name": "user",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4009,
                                "src": "8976:4:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "8958:23:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_uint32_$",
                                "typeString": "mapping(address => uint32)"
                              }
                            },
                            "id": 4024,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 4022,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 4011,
                              "src": "8982:5:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "8958:30:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint32",
                              "typeString": "uint32"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [],
                            "expression": {
                              "argumentTypes": [],
                              "id": 4025,
                              "name": "getCurrentBatchId",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3888,
                              "src": "8991:17:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_view$__$returns$_t_uint32_$",
                                "typeString": "function () view returns (uint32)"
                              }
                            },
                            "id": 4026,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "8991:19:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint32",
                              "typeString": "uint32"
                            }
                          },
                          "src": "8958:52:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "id": 4028,
                        "nodeType": "ExpressionStatement",
                        "src": "8958:52:3"
                      }
                    ]
                  }
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 4032,
                        "name": "user",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 4009,
                        "src": "9041:4:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 4033,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 4011,
                        "src": "9047:5:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 4034,
                        "name": "amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 4013,
                        "src": "9054:6:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 4031,
                      "name": "addBalance",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 4070,
                      "src": "9030:10:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,address,uint256)"
                      }
                    },
                    "id": 4035,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "9030:31:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 4036,
                  "nodeType": "ExpressionStatement",
                  "src": "9030:31:3"
                }
              ]
            },
            "documentation": "The following function should be used to update any balances within an epoch, which\nwill not be immediately final. E.g. the BatchExchange credits new balances to\nthe buyers in an auction, but as there are might be better solutions, the updates are\nnot final. In order to prevent withdraws from non-final updates, we disallow withdraws\nby setting lastCreditBatchId to the current batchId and allow only withdraws in batches\nwith a higher batchId.",
            "id": 4038,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "addBalanceAndBlockWithdrawForThisBatch",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 4014,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 4009,
                  "name": "user",
                  "nodeType": "VariableDeclaration",
                  "scope": 4038,
                  "src": "8817:12:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 4008,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "8817:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 4011,
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "scope": 4038,
                  "src": "8839:13:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 4010,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "8839:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 4013,
                  "name": "amount",
                  "nodeType": "VariableDeclaration",
                  "scope": 4038,
                  "src": "8862:14:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 4012,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "8862:7:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "8807:75:3"
            },
            "returnParameters": {
              "id": 4015,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "8892:0:3"
            },
            "scope": 4188,
            "src": "8760:308:3",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 4069,
              "nodeType": "Block",
              "src": "9178:144:3",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 4048,
                        "name": "user",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 4040,
                        "src": "9210:4:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 4049,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 4042,
                        "src": "9216:5:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 4047,
                      "name": "updateDepositsBalance",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 4187,
                      "src": "9188:21:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$returns$__$",
                        "typeString": "function (address,address)"
                      }
                    },
                    "id": 4050,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "9188:34:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 4051,
                  "nodeType": "ExpressionStatement",
                  "src": "9188:34:3"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 4067,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "baseExpression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 4052,
                            "name": "balanceStates",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3540,
                            "src": "9232:13:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$_$",
                              "typeString": "mapping(address => mapping(address => struct EpochTokenLocker.BalanceState storage ref))"
                            }
                          },
                          "id": 4055,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 4053,
                            "name": "user",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4040,
                            "src": "9246:4:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "9232:19:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$",
                            "typeString": "mapping(address => struct EpochTokenLocker.BalanceState storage ref)"
                          }
                        },
                        "id": 4056,
                        "indexExpression": {
                          "argumentTypes": null,
                          "id": 4054,
                          "name": "token",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 4042,
                          "src": "9252:5:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "9232:26:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_BalanceState_$3553_storage",
                          "typeString": "struct EpochTokenLocker.BalanceState storage ref"
                        }
                      },
                      "id": 4057,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberName": "balance",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 3548,
                      "src": "9232:34:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 4065,
                          "name": "amount",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 4044,
                          "src": "9308:6:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        ],
                        "expression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 4058,
                                "name": "balanceStates",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3540,
                                "src": "9269:13:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$_$",
                                  "typeString": "mapping(address => mapping(address => struct EpochTokenLocker.BalanceState storage ref))"
                                }
                              },
                              "id": 4060,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 4059,
                                "name": "user",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4040,
                                "src": "9283:4:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "9269:19:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$",
                                "typeString": "mapping(address => struct EpochTokenLocker.BalanceState storage ref)"
                              }
                            },
                            "id": 4062,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 4061,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 4042,
                              "src": "9289:5:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "9269:26:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_BalanceState_$3553_storage",
                              "typeString": "struct EpochTokenLocker.BalanceState storage ref"
                            }
                          },
                          "id": 4063,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "balance",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 3548,
                          "src": "9269:34:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 4064,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "add",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 8563,
                        "src": "9269:38:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                          "typeString": "function (uint256,uint256) pure returns (uint256)"
                        }
                      },
                      "id": 4066,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "9269:46:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "9232:83:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 4068,
                  "nodeType": "ExpressionStatement",
                  "src": "9232:83:3"
                }
              ]
            },
            "documentation": null,
            "id": 4070,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "addBalance",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 4045,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 4040,
                  "name": "user",
                  "nodeType": "VariableDeclaration",
                  "scope": 4070,
                  "src": "9103:12:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 4039,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "9103:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 4042,
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "scope": 4070,
                  "src": "9125:13:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 4041,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "9125:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 4044,
                  "name": "amount",
                  "nodeType": "VariableDeclaration",
                  "scope": 4070,
                  "src": "9148:14:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 4043,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "9148:7:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "9093:75:3"
            },
            "returnParameters": {
              "id": 4046,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "9178:0:3"
            },
            "scope": 4188,
            "src": "9074:248:3",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 4095,
              "nodeType": "Block",
              "src": "9687:148:3",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 4085,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 4080,
                          "name": "amount",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 4076,
                          "src": "9705:6:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "<=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 4082,
                              "name": "user",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 4072,
                              "src": "9726:4:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 4083,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 4074,
                              "src": "9732:5:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 4081,
                            "name": "getBalance",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3976,
                            "src": "9715:10:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_address_$_t_address_$returns$_t_uint256_$",
                              "typeString": "function (address,address) view returns (uint256)"
                            }
                          },
                          "id": 4084,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "9715:23:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "src": "9705:33:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "416d6f756e742065786365656473207573657227732062616c616e63652e",
                        "id": 4086,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "9740:32:3",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_ee6ab3ac7e270fae8edfd43cf60cea86aea1fa36fc4b4bb1c39c5b842699e9cb",
                          "typeString": "literal_string \"Amount exceeds user's balance.\""
                        },
                        "value": "Amount exceeds user's balance."
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_ee6ab3ac7e270fae8edfd43cf60cea86aea1fa36fc4b4bb1c39c5b842699e9cb",
                          "typeString": "literal_string \"Amount exceeds user's balance.\""
                        }
                      ],
                      "id": 4079,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        10245,
                        10246
                      ],
                      "referencedDeclaration": 10246,
                      "src": "9697:7:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 4087,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "9697:76:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 4088,
                  "nodeType": "ExpressionStatement",
                  "src": "9697:76:3"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 4090,
                        "name": "user",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 4072,
                        "src": "9808:4:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 4091,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 4074,
                        "src": "9814:5:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 4092,
                        "name": "amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 4076,
                        "src": "9821:6:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 4089,
                      "name": "subtractBalanceUnchecked",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 4128,
                      "src": "9783:24:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,address,uint256)"
                      }
                    },
                    "id": 4093,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "9783:45:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 4094,
                  "nodeType": "ExpressionStatement",
                  "src": "9783:45:3"
                }
              ]
            },
            "documentation": "The following function should be used to subtract amounts from the current balances state.\nFor the substraction the current withdrawRequests are considered and they are effectively reducing\nthe available balance.",
            "id": 4096,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "subtractBalance",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 4077,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 4072,
                  "name": "user",
                  "nodeType": "VariableDeclaration",
                  "scope": 4096,
                  "src": "9612:12:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 4071,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "9612:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 4074,
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "scope": 4096,
                  "src": "9634:13:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 4073,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "9634:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 4076,
                  "name": "amount",
                  "nodeType": "VariableDeclaration",
                  "scope": 4096,
                  "src": "9657:14:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 4075,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "9657:7:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "9602:75:3"
            },
            "returnParameters": {
              "id": 4078,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "9687:0:3"
            },
            "scope": 4188,
            "src": "9578:257:3",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 4127,
              "nodeType": "Block",
              "src": "10912:144:3",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 4106,
                        "name": "user",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 4098,
                        "src": "10944:4:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 4107,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 4100,
                        "src": "10950:5:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 4105,
                      "name": "updateDepositsBalance",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 4187,
                      "src": "10922:21:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$returns$__$",
                        "typeString": "function (address,address)"
                      }
                    },
                    "id": 4108,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "10922:34:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 4109,
                  "nodeType": "ExpressionStatement",
                  "src": "10922:34:3"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 4125,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "baseExpression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 4110,
                            "name": "balanceStates",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3540,
                            "src": "10966:13:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$_$",
                              "typeString": "mapping(address => mapping(address => struct EpochTokenLocker.BalanceState storage ref))"
                            }
                          },
                          "id": 4113,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 4111,
                            "name": "user",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4098,
                            "src": "10980:4:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "10966:19:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$",
                            "typeString": "mapping(address => struct EpochTokenLocker.BalanceState storage ref)"
                          }
                        },
                        "id": 4114,
                        "indexExpression": {
                          "argumentTypes": null,
                          "id": 4112,
                          "name": "token",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 4100,
                          "src": "10986:5:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "10966:26:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_BalanceState_$3553_storage",
                          "typeString": "struct EpochTokenLocker.BalanceState storage ref"
                        }
                      },
                      "id": 4115,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberName": "balance",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 3548,
                      "src": "10966:34:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 4123,
                          "name": "amount",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 4102,
                          "src": "11042:6:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        ],
                        "expression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 4116,
                                "name": "balanceStates",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3540,
                                "src": "11003:13:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$_$",
                                  "typeString": "mapping(address => mapping(address => struct EpochTokenLocker.BalanceState storage ref))"
                                }
                              },
                              "id": 4118,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 4117,
                                "name": "user",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4098,
                                "src": "11017:4:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "11003:19:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$",
                                "typeString": "mapping(address => struct EpochTokenLocker.BalanceState storage ref)"
                              }
                            },
                            "id": 4120,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 4119,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 4100,
                              "src": "11023:5:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "11003:26:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_BalanceState_$3553_storage",
                              "typeString": "struct EpochTokenLocker.BalanceState storage ref"
                            }
                          },
                          "id": 4121,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "balance",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 3548,
                          "src": "11003:34:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 4122,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sub",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 8579,
                        "src": "11003:38:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                          "typeString": "function (uint256,uint256) pure returns (uint256)"
                        }
                      },
                      "id": 4124,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "11003:46:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "10966:83:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 4126,
                  "nodeType": "ExpressionStatement",
                  "src": "10966:83:3"
                }
              ]
            },
            "documentation": "The following function should be used to substract amounts from the current balance\nstate, if the pending withdrawRequests are not considered and should not effectively reduce\nthe available balance.\nFor example, the reversion of trades from a previous batch-solution do not\nneed to consider withdrawRequests. This is the case as withdraws are blocked for one\nbatch for accounts having credited funds in a previous submission.\nPendingWithdraws must also be ignored since otherwise for the reversion of trades,\na solution reversion could be blocked: A bigger withdrawRequest could set the return value of\ngetBalance(user, token) to zero, although the user was just credited tokens in\nthe last submission. In this situation, during the unwinding of the previous orders,\nthe check `amount <= getBalance(user, token)` would fail and the reversion would be blocked.",
            "id": 4128,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "subtractBalanceUnchecked",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 4103,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 4098,
                  "name": "user",
                  "nodeType": "VariableDeclaration",
                  "scope": 4128,
                  "src": "10837:12:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 4097,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "10837:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 4100,
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "scope": 4128,
                  "src": "10859:13:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 4099,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "10859:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 4102,
                  "name": "amount",
                  "nodeType": "VariableDeclaration",
                  "scope": 4128,
                  "src": "10882:14:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 4101,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "10882:7:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "10827:75:3"
            },
            "returnParameters": {
              "id": 4104,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "10912:0:3"
            },
            "scope": 4188,
            "src": "10794:262:3",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 4186,
              "nodeType": "Block",
              "src": "11130:486:3",
              "statements": [
                {
                  "assignments": [
                    4136
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 4136,
                      "name": "batchId",
                      "nodeType": "VariableDeclaration",
                      "scope": 4186,
                      "src": "11140:15:3",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 4135,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "11140:7:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 4144,
                  "initialValue": {
                    "argumentTypes": null,
                    "expression": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "baseExpression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 4137,
                            "name": "balanceStates",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3540,
                            "src": "11158:13:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$_$",
                              "typeString": "mapping(address => mapping(address => struct EpochTokenLocker.BalanceState storage ref))"
                            }
                          },
                          "id": 4139,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 4138,
                            "name": "user",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4130,
                            "src": "11172:4:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "11158:19:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$",
                            "typeString": "mapping(address => struct EpochTokenLocker.BalanceState storage ref)"
                          }
                        },
                        "id": 4141,
                        "indexExpression": {
                          "argumentTypes": null,
                          "id": 4140,
                          "name": "token",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 4132,
                          "src": "11178:5:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "11158:26:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_BalanceState_$3553_storage",
                          "typeString": "struct EpochTokenLocker.BalanceState storage ref"
                        }
                      },
                      "id": 4142,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "pendingDeposits",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 3550,
                      "src": "11158:42:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_PendingFlux_$3558_storage",
                        "typeString": "struct EpochTokenLocker.PendingFlux storage ref"
                      }
                    },
                    "id": 4143,
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "memberName": "batchId",
                    "nodeType": "MemberAccess",
                    "referencedDeclaration": 3557,
                    "src": "11158:50:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint32",
                      "typeString": "uint32"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "11140:68:3"
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    },
                    "id": 4152,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "commonType": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "id": 4147,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "argumentTypes": null,
                        "id": 4145,
                        "name": "batchId",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 4136,
                        "src": "11222:7:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": ">",
                      "rightExpression": {
                        "argumentTypes": null,
                        "hexValue": "30",
                        "id": 4146,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "number",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "11232:1:3",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_rational_0_by_1",
                          "typeString": "int_const 0"
                        },
                        "value": "0"
                      },
                      "src": "11222:11:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "&&",
                    "rightExpression": {
                      "argumentTypes": null,
                      "commonType": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "id": 4151,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "argumentTypes": null,
                        "id": 4148,
                        "name": "batchId",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 4136,
                        "src": "11237:7:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": "<",
                      "rightExpression": {
                        "argumentTypes": null,
                        "arguments": [],
                        "expression": {
                          "argumentTypes": [],
                          "id": 4149,
                          "name": "getCurrentBatchId",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3888,
                          "src": "11247:17:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_view$__$returns$_t_uint32_$",
                            "typeString": "function () view returns (uint32)"
                          }
                        },
                        "id": 4150,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "11247:19:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        }
                      },
                      "src": "11237:29:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "src": "11222:44:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 4185,
                  "nodeType": "IfStatement",
                  "src": "11218:392:3",
                  "trueBody": {
                    "id": 4184,
                    "nodeType": "Block",
                    "src": "11268:342:3",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 4174,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 4153,
                                  "name": "balanceStates",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 3540,
                                  "src": "11380:13:3",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$_$",
                                    "typeString": "mapping(address => mapping(address => struct EpochTokenLocker.BalanceState storage ref))"
                                  }
                                },
                                "id": 4156,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 4154,
                                  "name": "user",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 4130,
                                  "src": "11394:4:3",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "11380:19:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$",
                                  "typeString": "mapping(address => struct EpochTokenLocker.BalanceState storage ref)"
                                }
                              },
                              "id": 4157,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 4155,
                                "name": "token",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4132,
                                "src": "11400:5:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "11380:26:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_BalanceState_$3553_storage",
                                "typeString": "struct EpochTokenLocker.BalanceState storage ref"
                              }
                            },
                            "id": 4158,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "balance",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 3548,
                            "src": "11380:34:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "baseExpression": {
                                      "argumentTypes": null,
                                      "baseExpression": {
                                        "argumentTypes": null,
                                        "id": 4166,
                                        "name": "balanceStates",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 3540,
                                        "src": "11473:13:3",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$_$",
                                          "typeString": "mapping(address => mapping(address => struct EpochTokenLocker.BalanceState storage ref))"
                                        }
                                      },
                                      "id": 4168,
                                      "indexExpression": {
                                        "argumentTypes": null,
                                        "id": 4167,
                                        "name": "user",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 4130,
                                        "src": "11487:4:3",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      },
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "nodeType": "IndexAccess",
                                      "src": "11473:19:3",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$",
                                        "typeString": "mapping(address => struct EpochTokenLocker.BalanceState storage ref)"
                                      }
                                    },
                                    "id": 4170,
                                    "indexExpression": {
                                      "argumentTypes": null,
                                      "id": 4169,
                                      "name": "token",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 4132,
                                      "src": "11493:5:3",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    },
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "IndexAccess",
                                    "src": "11473:26:3",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_BalanceState_$3553_storage",
                                      "typeString": "struct EpochTokenLocker.BalanceState storage ref"
                                    }
                                  },
                                  "id": 4171,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "pendingDeposits",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 3550,
                                  "src": "11473:42:3",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_PendingFlux_$3558_storage",
                                    "typeString": "struct EpochTokenLocker.PendingFlux storage ref"
                                  }
                                },
                                "id": 4172,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "amount",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 3555,
                                "src": "11473:49:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "baseExpression": {
                                    "argumentTypes": null,
                                    "baseExpression": {
                                      "argumentTypes": null,
                                      "id": 4159,
                                      "name": "balanceStates",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 3540,
                                      "src": "11417:13:3",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$_$",
                                        "typeString": "mapping(address => mapping(address => struct EpochTokenLocker.BalanceState storage ref))"
                                      }
                                    },
                                    "id": 4161,
                                    "indexExpression": {
                                      "argumentTypes": null,
                                      "id": 4160,
                                      "name": "user",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 4130,
                                      "src": "11431:4:3",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    },
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "IndexAccess",
                                    "src": "11417:19:3",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$",
                                      "typeString": "mapping(address => struct EpochTokenLocker.BalanceState storage ref)"
                                    }
                                  },
                                  "id": 4163,
                                  "indexExpression": {
                                    "argumentTypes": null,
                                    "id": 4162,
                                    "name": "token",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 4132,
                                    "src": "11437:5:3",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "nodeType": "IndexAccess",
                                  "src": "11417:26:3",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_BalanceState_$3553_storage",
                                    "typeString": "struct EpochTokenLocker.BalanceState storage ref"
                                  }
                                },
                                "id": 4164,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "balance",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 3548,
                                "src": "11417:34:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 4165,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "add",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 8563,
                              "src": "11417:38:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                "typeString": "function (uint256,uint256) pure returns (uint256)"
                              }
                            },
                            "id": 4173,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "11417:119:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "11380:156:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 4175,
                        "nodeType": "ExpressionStatement",
                        "src": "11380:156:3"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 4182,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "UnaryOperation",
                          "operator": "delete",
                          "prefix": true,
                          "src": "11550:49:3",
                          "subExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 4176,
                                  "name": "balanceStates",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 3540,
                                  "src": "11557:13:3",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$_$",
                                    "typeString": "mapping(address => mapping(address => struct EpochTokenLocker.BalanceState storage ref))"
                                  }
                                },
                                "id": 4178,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 4177,
                                  "name": "user",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 4130,
                                  "src": "11571:4:3",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "11557:19:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_address_$_t_struct$_BalanceState_$3553_storage_$",
                                  "typeString": "mapping(address => struct EpochTokenLocker.BalanceState storage ref)"
                                }
                              },
                              "id": 4180,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 4179,
                                "name": "token",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4132,
                                "src": "11577:5:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "11557:26:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_BalanceState_$3553_storage",
                                "typeString": "struct EpochTokenLocker.BalanceState storage ref"
                              }
                            },
                            "id": 4181,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "pendingDeposits",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 3550,
                            "src": "11557:42:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_PendingFlux_$3558_storage",
                              "typeString": "struct EpochTokenLocker.PendingFlux storage ref"
                            }
                          },
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 4183,
                        "nodeType": "ExpressionStatement",
                        "src": "11550:49:3"
                      }
                    ]
                  }
                }
              ]
            },
            "documentation": null,
            "id": 4187,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "updateDepositsBalance",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 4133,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 4130,
                  "name": "user",
                  "nodeType": "VariableDeclaration",
                  "scope": 4187,
                  "src": "11093:12:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 4129,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "11093:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 4132,
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "scope": 4187,
                  "src": "11107:13:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 4131,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "11107:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "11092:29:3"
            },
            "returnParameters": {
              "id": 4134,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "11130:0:3"
            },
            "scope": 4188,
            "src": "11062:554:3",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "private"
          }
        ],
        "scope": 4189,
        "src": "649:10969:3"
      }
    ],
    "src": "0:11619:3"
  },
  "compiler": {
    "name": "solc",
    "version": "0.5.10+commit.5a6ea5b1.Emscripten.clang"
  },
  "networks": {},
  "schemaVersion": "3.3.1",
  "updatedAt": "2020-11-19T13:47:49.778Z",
  "devdoc": {
    "author": "@gnosis/dfusion-team <https://github.com/orgs/gnosis/teams/dfusion-team/members>",
    "methods": {
      "deposit(address,uint256)": {
        "details": "credits user with deposit amount on next epoch (given by getCurrentBatchId)",
        "params": {
          "amount": "number of token(s) to be credited to user's account     * Emits an {Deposit} event with relevent deposit information.     * Requirements: - token transfer to contract is successfull",
          "token": "address of token to be deposited"
        }
      },
      "getBalance(address,address)": {
        "details": "fetches and returns user's balance",
        "params": {
          "token": "address of ERC20 token return Current `token` balance of `user`'s account",
          "user": "address of user"
        }
      },
      "getCurrentBatchId()": {
        "details": "getter function to determine current auction id. return current batchId"
      },
      "getPendingDeposit(address,address)": {
        "details": "getter function used to display pending deposit",
        "params": {
          "token": "address of ERC20 token return amount and batchId of deposit's transfer if any (else 0)",
          "user": "address of user"
        }
      },
      "getPendingWithdraw(address,address)": {
        "details": "getter function used to display pending withdraw",
        "params": {
          "token": "address of ERC20 token return amount and batchId when withdraw was requested if any (else 0)",
          "user": "address of user"
        }
      },
      "getSecondsRemainingInBatch()": {
        "details": "used to determine how much time is left in a batch return seconds remaining in current batch"
      },
      "hasValidWithdrawRequest(address,address)": {
        "details": "Used to determine if user has a valid pending withdraw request of specific token",
        "params": {
          "token": "address of ERC20 token return true if `user` has valid withdraw request for `token`, otherwise false",
          "user": "address of user"
        }
      },
      "requestFutureWithdraw(address,uint256,uint32)": {
        "details": "Signals and initiates user's intent to withdraw.",
        "params": {
          "amount": "number of token(s) to be withdrawn",
          "batchId": "state index at which request is to be made.     * Emits an {WithdrawRequest} event with relevent request information.",
          "token": "address of token to be withdrawn"
        }
      },
      "requestWithdraw(address,uint256)": {
        "details": "Signals and initiates user's intent to withdraw.",
        "params": {
          "amount": "number of token(s) to be withdrawn     * Emits an {WithdrawRequest} event with relevent request information.",
          "token": "address of token to be withdrawn"
        }
      },
      "withdraw(address,address)": {
        "details": "Claims pending withdraw - can be called on behalf of others",
        "params": {
          "token": "address of token to be withdrawn",
          "user": "address of user who withdraw is being claimed.     * Emits an {Withdraw} event stating that `user` withdrew `amount` of `token`     * Requirements: - withdraw was requested in previous epoch - token was received from exchange in current auction batch"
        }
      }
    },
    "title": "Epoch Token Locker EpochTokenLocker saveguards tokens for applications with constant-balances during discrete epochs It allows to deposit a token which become credited in the next epoch and allows to request a token-withdraw which becomes claimable after the current epoch has expired."
  },
  "userdoc": {
    "methods": {}
  }
}