hey-network/mainchain

View on GitHub
build/contracts/VestingTrustee.json

Summary

Maintainability
Test Coverage
{
  "contractName": "VestingTrustee",
  "abi": [
    {
      "constant": false,
      "inputs": [],
      "name": "renounceOwnership",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "owner",
      "outputs": [
        {
          "name": "",
          "type": "address"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "isOwner",
      "outputs": [
        {
          "name": "",
          "type": "bool"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "name": "",
          "type": "address"
        }
      ],
      "name": "grants",
      "outputs": [
        {
          "name": "value",
          "type": "uint256"
        },
        {
          "name": "start",
          "type": "uint256"
        },
        {
          "name": "cliff",
          "type": "uint256"
        },
        {
          "name": "end",
          "type": "uint256"
        },
        {
          "name": "transferred",
          "type": "uint256"
        },
        {
          "name": "revokable",
          "type": "bool"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "transferOwnership",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "name": "token",
          "type": "address"
        }
      ],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "name": "from",
          "type": "address"
        },
        {
          "indexed": true,
          "name": "to",
          "type": "address"
        },
        {
          "indexed": false,
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "GrantCreated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "name": "holder",
          "type": "address"
        },
        {
          "indexed": false,
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "GrantClaimed",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "name": "holder",
          "type": "address"
        },
        {
          "indexed": false,
          "name": "refund",
          "type": "uint256"
        }
      ],
      "name": "GrantRevoked",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "name": "previousOwner",
          "type": "address"
        },
        {
          "indexed": true,
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "OwnershipTransferred",
      "type": "event"
    },
    {
      "constant": false,
      "inputs": [
        {
          "name": "to",
          "type": "address"
        },
        {
          "name": "value",
          "type": "uint256"
        },
        {
          "name": "start",
          "type": "uint256"
        },
        {
          "name": "cliff",
          "type": "uint256"
        },
        {
          "name": "end",
          "type": "uint256"
        },
        {
          "name": "revokable",
          "type": "bool"
        }
      ],
      "name": "createGrant",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "name": "holder",
          "type": "address"
        }
      ],
      "name": "revokeGrant",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [],
      "name": "claimTokens",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "name": "holder",
          "type": "address"
        },
        {
          "name": "time",
          "type": "uint256"
        }
      ],
      "name": "claimableTokens",
      "outputs": [
        {
          "name": "",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "token",
      "outputs": [
        {
          "name": "",
          "type": "address"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "totalVesting",
      "outputs": [
        {
          "name": "",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "bytecode": "0x608060405234801561001057600080fd5b506040516020806116748339810180604052602081101561003057600080fd5b8101908080519060200190929190505050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156101a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f746f6b656e2063616e6e6f74206265207a65726f20616464726573730000000081525060200191505060405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050611481806101f36000396000f3fe6080604052600436106100af576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680631817c5a7146100b457806348c54b9d14610105578063715018a61461011c5780637c17357d146101335780638da5cb5b1461015e5780638f32d59b146101b5578063b869cea3146101e4578063f2fde38b14610270578063f53215c3146102c1578063fbd05ce514610330578063fc0c546a146103b5575b600080fd5b3480156100c057600080fd5b50610103600480360360208110156100d757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061040c565b005b34801561011157600080fd5b5061011a6106f4565b005b34801561012857600080fd5b50610131610a06565b005b34801561013f57600080fd5b50610148610ad8565b6040518082815260200191505060405180910390f35b34801561016a57600080fd5b50610173610ae2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156101c157600080fd5b506101ca610b0b565b604051808215151515815260200191505060405180910390f35b3480156101f057600080fd5b506102336004803603602081101561020757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610b62565b6040518087815260200186815260200185815260200184815260200183815260200182151515158152602001965050505050505060405180910390f35b34801561027c57600080fd5b506102bf6004803603602081101561029357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610bab565b005b3480156102cd57600080fd5b5061031a600480360360408110156102e457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610bca565b6040518082815260200191505060405180910390f35b34801561033c57600080fd5b506103b3600480360360c081101561035357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190803515159060200190929190505050610c92565b005b3480156103c157600080fd5b506103ca6111f4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610414610b0b565b151561041f57600080fd5b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508060050160009054906101000a900460ff1615156104e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f6772616e74206d757374206265207265766f6b61626c6500000000000000000081525060200191505060405180910390fd5b60006105058260040154836000015461121e90919063ffffffff16565b905061051c8160035461121e90919063ffffffff16565b600381905550600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008082016000905560018201600090556002820160009055600382016000905560048201600090556005820160006101000a81549060ff02191690555050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561066557600080fd5b505af1158015610679573d6000803e3d6000fd5b505050506040513d602081101561068f57600080fd5b8101908080519060200190929190505050508273ffffffffffffffffffffffffffffffffffffffff167f740528a7c317c81f0923adc30df75db3f448298c78cdaf548adfcfdb3c84ff6f826040518082815260200191505060405180910390a2505050565b60006107003342610bca565b90506000811415151561077b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f6e6f20746f6b656e7320636c61696d61626c652063757272656e746c7900000081525060200191505060405180910390fd5b6000600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060006107d782600401548461121e90919063ffffffff16565b905060008114151515610878576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001807f636c61696d61626c6520616d6f756e7420616c7265616479207472616e73666581526020017f727265640000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b61088f81836004015461124090919063ffffffff16565b82600401819055506108ac8160035461121e90919063ffffffff16565b600381905550600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561097757600080fd5b505af115801561098b573d6000803e3d6000fd5b505050506040513d60208110156109a157600080fd5b8101908080519060200190929190505050503373ffffffffffffffffffffffffffffffffffffffff167f2aa1d398fac8a867531b04feb1273747a6f1ec3d4700f40a2901dce75363edc0826040518082815260200191505060405180910390a2505050565b610a0e610b0b565b1515610a1957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600354905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b60016020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154908060050160009054906101000a900460ff16905086565b610bb3610b0b565b1515610bbe57600080fd5b610bc781611261565b50565b600080600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600081600001541415610c25576000915050610c8c565b610c888160c0604051908101604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820160009054906101000a900460ff1615151515815250508461135b565b9150505b92915050565b610c9a610b0b565b1515610ca557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614151515610d4a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f746f2063616e6e6f74206265207a65726f20616464726573730000000000000081525060200191505060405180910390fd5b600085111515610dc2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f76616c7565206d7573742062652061626f76652030000000000000000000000081525060200191505060405180910390fd5b6000600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154141515610e7c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f6f6e6c79206f6e65206772616e7420706572206164647265737300000000000081525060200191505060405180910390fd5b828411158015610e8c5750818311155b1515610f00576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f76657374696e67206461746573206d75737420626520636f6e73697374656e7481525060200191505060405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610fbb57600080fd5b505afa158015610fcf573d6000803e3d6000fd5b505050506040513d6020811015610fe557600080fd5b810190808051906020019092919050505061100b8660035461124090919063ffffffff16565b111515156110a7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260348152602001807f6772616e742063616e6e6f742065786365656420746f74616c20616d6f756e7481526020017f206f6620746f6b656e7320617661696c61626c6500000000000000000000000081525060400191505060405180910390fd5b60c06040519081016040528086815260200185815260200184815260200183815260200160008152602001821515815250600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050160006101000a81548160ff0219169083151502179055509050506111818560035461124090919063ffffffff16565b6003819055508573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fe59554161f63f82606fec58f135843633f78733cf852ac15d6cb86ff84f5a05c876040518082815260200191505060405180910390a3505050505050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600082821115151561122f57600080fd5b600082840390508091505092915050565b600080828401905083811015151561125757600080fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561129d57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000826040015182101561137257600090506113e7565b82606001518210151561138b57826000015190506113e7565b6113e46113a98460200151856060015161121e90919063ffffffff16565b6113d66113c386602001518661121e90919063ffffffff16565b86600001516113ed90919063ffffffff16565b61142b90919063ffffffff16565b90505b92915050565b6000808314156114005760009050611425565b6000828402905082848281151561141357fe5b0414151561142057600080fd5b809150505b92915050565b6000808211151561143b57600080fd5b6000828481151561144857fe5b049050809150509291505056fea165627a7a7230582007ce60fca41119bc8c532745d97090f04d9fa9b43b16a7beac7db3cc74a55ebc0029",
  "deployedBytecode": "0x6080604052600436106100af576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680631817c5a7146100b457806348c54b9d14610105578063715018a61461011c5780637c17357d146101335780638da5cb5b1461015e5780638f32d59b146101b5578063b869cea3146101e4578063f2fde38b14610270578063f53215c3146102c1578063fbd05ce514610330578063fc0c546a146103b5575b600080fd5b3480156100c057600080fd5b50610103600480360360208110156100d757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061040c565b005b34801561011157600080fd5b5061011a6106f4565b005b34801561012857600080fd5b50610131610a06565b005b34801561013f57600080fd5b50610148610ad8565b6040518082815260200191505060405180910390f35b34801561016a57600080fd5b50610173610ae2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156101c157600080fd5b506101ca610b0b565b604051808215151515815260200191505060405180910390f35b3480156101f057600080fd5b506102336004803603602081101561020757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610b62565b6040518087815260200186815260200185815260200184815260200183815260200182151515158152602001965050505050505060405180910390f35b34801561027c57600080fd5b506102bf6004803603602081101561029357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610bab565b005b3480156102cd57600080fd5b5061031a600480360360408110156102e457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610bca565b6040518082815260200191505060405180910390f35b34801561033c57600080fd5b506103b3600480360360c081101561035357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190803515159060200190929190505050610c92565b005b3480156103c157600080fd5b506103ca6111f4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610414610b0b565b151561041f57600080fd5b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508060050160009054906101000a900460ff1615156104e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f6772616e74206d757374206265207265766f6b61626c6500000000000000000081525060200191505060405180910390fd5b60006105058260040154836000015461121e90919063ffffffff16565b905061051c8160035461121e90919063ffffffff16565b600381905550600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008082016000905560018201600090556002820160009055600382016000905560048201600090556005820160006101000a81549060ff02191690555050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561066557600080fd5b505af1158015610679573d6000803e3d6000fd5b505050506040513d602081101561068f57600080fd5b8101908080519060200190929190505050508273ffffffffffffffffffffffffffffffffffffffff167f740528a7c317c81f0923adc30df75db3f448298c78cdaf548adfcfdb3c84ff6f826040518082815260200191505060405180910390a2505050565b60006107003342610bca565b90506000811415151561077b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f6e6f20746f6b656e7320636c61696d61626c652063757272656e746c7900000081525060200191505060405180910390fd5b6000600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060006107d782600401548461121e90919063ffffffff16565b905060008114151515610878576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001807f636c61696d61626c6520616d6f756e7420616c7265616479207472616e73666581526020017f727265640000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b61088f81836004015461124090919063ffffffff16565b82600401819055506108ac8160035461121e90919063ffffffff16565b600381905550600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561097757600080fd5b505af115801561098b573d6000803e3d6000fd5b505050506040513d60208110156109a157600080fd5b8101908080519060200190929190505050503373ffffffffffffffffffffffffffffffffffffffff167f2aa1d398fac8a867531b04feb1273747a6f1ec3d4700f40a2901dce75363edc0826040518082815260200191505060405180910390a2505050565b610a0e610b0b565b1515610a1957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600354905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b60016020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154908060050160009054906101000a900460ff16905086565b610bb3610b0b565b1515610bbe57600080fd5b610bc781611261565b50565b600080600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600081600001541415610c25576000915050610c8c565b610c888160c0604051908101604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820160009054906101000a900460ff1615151515815250508461135b565b9150505b92915050565b610c9a610b0b565b1515610ca557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614151515610d4a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f746f2063616e6e6f74206265207a65726f20616464726573730000000000000081525060200191505060405180910390fd5b600085111515610dc2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f76616c7565206d7573742062652061626f76652030000000000000000000000081525060200191505060405180910390fd5b6000600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154141515610e7c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f6f6e6c79206f6e65206772616e7420706572206164647265737300000000000081525060200191505060405180910390fd5b828411158015610e8c5750818311155b1515610f00576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f76657374696e67206461746573206d75737420626520636f6e73697374656e7481525060200191505060405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610fbb57600080fd5b505afa158015610fcf573d6000803e3d6000fd5b505050506040513d6020811015610fe557600080fd5b810190808051906020019092919050505061100b8660035461124090919063ffffffff16565b111515156110a7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260348152602001807f6772616e742063616e6e6f742065786365656420746f74616c20616d6f756e7481526020017f206f6620746f6b656e7320617661696c61626c6500000000000000000000000081525060400191505060405180910390fd5b60c06040519081016040528086815260200185815260200184815260200183815260200160008152602001821515815250600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050160006101000a81548160ff0219169083151502179055509050506111818560035461124090919063ffffffff16565b6003819055508573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fe59554161f63f82606fec58f135843633f78733cf852ac15d6cb86ff84f5a05c876040518082815260200191505060405180910390a3505050505050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600082821115151561122f57600080fd5b600082840390508091505092915050565b600080828401905083811015151561125757600080fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561129d57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000826040015182101561137257600090506113e7565b82606001518210151561138b57826000015190506113e7565b6113e46113a98460200151856060015161121e90919063ffffffff16565b6113d66113c386602001518661121e90919063ffffffff16565b86600001516113ed90919063ffffffff16565b61142b90919063ffffffff16565b90505b92915050565b6000808314156114005760009050611425565b6000828402905082848281151561141357fe5b0414151561142057600080fd5b809150505b92915050565b6000808211151561143b57600080fd5b6000828481151561144857fe5b049050809150509291505056fea165627a7a7230582007ce60fca41119bc8c532745d97090f04d9fa9b43b16a7beac7db3cc74a55ebc0029",
  "sourceMap": "489:7871:4:-;;;1516:170;8:9:-1;5:2;;;30:1;27;20:12;5:2;1516:170:4;;;;;;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1516:170:4;;;;;;;;;;;;;;;;524:10:20;515:6;;:19;;;;;;;;;;;;;;;;;;582:6;;;;;;;;;;;549:40;;578:1;549:40;;;;;;;;;;;;1619:1:4;1593:28;;1601:5;1593:28;;;;1585:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1674:5;1665:6;;:14;;;;;;;;;;;;;;;;;;1516:170;489:7871;;;;;;",
  "deployedSourceMap": "489:7871:4:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3699:506;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3699:506:4;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;3699:506:4;;;;;;;;;;;;;;;;;;;;;;4368:967;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4368:967:4;;;;;;1347:137:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1347:137:20;;;;;;6490:119:4;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6490:119:4;;;;;;;;;;;;;;;;;;;;;;;659:77:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;659:77:20;;;;;;;;;;;;;;;;;;;;;;;;;;;979:90;;8:9:-1;5:2;;;30:1;27;20:12;5:2;979:90:20;;;;;;;;;;;;;;;;;;;;;;;;;;;825:40:4;;8:9:-1;5:2;;;30:1;27;20:12;5:2;825:40:4;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;825:40:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1655:107:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1655:107:20;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1655:107:20;;;;;;;;;;;;;;;;;;;;;;5914:308:4;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5914:308:4;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;5914:308:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2217:1273;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2217:1273:4;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;2217:1273:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6293:114;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6293:114:4;;;;;;;;;;;;;;;;;;;;;;;;;;;3699:506;863:9:20;:7;:9::i;:::-;855:18;;;;;;;;3797:19:4;3819:6;:14;3826:6;3819:14;;;;;;;;;;;;;;;3797:36;;3852:5;:15;;;;;;;;;;;;3844:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3906:14;3923:34;3939:5;:17;;;3923:5;:11;;;:15;;:34;;;;:::i;:::-;3906:51;;3983:25;4001:6;3983:13;;:17;;:25;;;;:::i;:::-;3967:13;:41;;;;4025:6;:14;4032:6;4025:14;;;;;;;;;;;;;;;;4018:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4119:6;;;;;;;;;;;:15;;;4135:10;4147:6;4119:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4119:35:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4119:35:4;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;4119:35:4;;;;;;;;;;;;;;;;;4183:6;4170:28;;;4191:6;4170:28;;;;;;;;;;;;;;;;;;883:1:20;;3699:506:4;:::o;4368:967::-;4556:17;4576:44;4592:10;4604:15;4576;:44::i;:::-;4556:64;;4651:1;4638:9;:14;;4630:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4697:19;4719:6;:18;4726:10;4719:18;;;;;;;;;;;;;;;4697:40;;4969:20;4992:32;5006:5;:17;;;4992:9;:13;;:32;;;;:::i;:::-;4969:55;;5058:1;5042:12;:17;;5034:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5131:35;5153:12;5131:5;:17;;;:21;;:35;;;;:::i;:::-;5111:5;:17;;:55;;;;5192:31;5210:12;5192:13;;:17;;:31;;;;:::i;:::-;5176:13;:47;;;;5233:6;;;;;;;;;;;:15;;;5249:10;5261:12;5233:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5233:41:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5233:41:4;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;5233:41:4;;;;;;;;;;;;;;;;;5303:10;5290:38;;;5315:12;5290:38;;;;;;;;;;;;;;;;;;4368:967;;;:::o;1347:137:20:-;863:9;:7;:9::i;:::-;855:18;;;;;;;;1445:1;1408:40;;1429:6;;;;;;;;;;;1408:40;;;;;;;;;;;;1475:1;1458:6;;:19;;;;;;;;;;;;;;;;;;1347:137::o;6490:119:4:-;6559:7;6589:13;;6582:20;;6490:119;:::o;659:77:20:-;697:7;723:6;;;;;;;;;;;716:13;;659:77;:::o;979:90::-;1019:4;1056:6;;;;;;;;;;;1042:20;;:10;:20;;;1035:27;;979:90;:::o;825:40:4:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1655:107:20:-;863:9;:7;:9::i;:::-;855:18;;;;;;;;1727:28;1746:8;1727:18;:28::i;:::-;1655:107;:::o;5914:308:4:-;6036:7;6059:19;6081:6;:14;6088:6;6081:14;;;;;;;;;;;;;;;6059:36;;6124:1;6109:5;:11;;;:16;6105:55;;;6148:1;6141:8;;;;;6105:55;6177:38;6203:5;6177:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6210:4;6177:25;:38::i;:::-;6170:45;;;5914:308;;;;;:::o;2217:1273::-;863:9:20;:7;:9::i;:::-;855:18;;;;;;;;2447:1:4;2433:16;;:2;:16;;;;2425:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2505:1;2497:5;:9;2489:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2647:1;2627:6;:10;2634:2;2627:10;;;;;;;;;;;;;;;:16;;;:21;2619:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2785:5;2776;:14;;:30;;;;;2803:3;2794:5;:12;;2776:30;2768:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2998:6;;;;;;;;;;;:16;;;3023:4;2998:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2998:31:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2998:31:4;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2998:31:4;;;;;;;;;;;;;;;;2970:24;2988:5;2970:13;;:17;;:24;;;;:::i;:::-;:59;;2962:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3141:179;;;;;;;;;3168:5;3141:179;;;;3194:5;3141:179;;;;3220:5;3141:179;;;;3244:3;3141:179;;;;3274:1;3141:179;;;;3300:9;3141:179;;;;;3128:6;:10;3135:2;3128:10;;;;;;;;;;;;;;;:192;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3408:24;3426:5;3408:13;;:17;;:24;;;;:::i;:::-;3392:13;:40;;;;3473:2;3448:35;;3461:10;3448:35;;;3477:5;3448:35;;;;;;;;;;;;;;;;;;2217:1273;;;;;;:::o;6293:114::-;6355:7;6393:6;;;;;;;;;;;6378:22;;6293:114;:::o;1205:145:19:-;1263:7;1295:1;1290;:6;;1282:15;;;;;;;;1307:9;1323:1;1319;:5;1307:17;;1342:1;1335:8;;;1205:145;;;;:::o;1431:::-;1489:7;1508:9;1524:1;1520;:5;1508:17;;1548:1;1543;:6;;1535:15;;;;;;;;1568:1;1561:8;;;1431:145;;;;:::o;1906:183:20:-;1999:1;1979:22;;:8;:22;;;;1971:31;;;;;;;;2046:8;2017:38;;2038:6;;;;;;;;;;;2017:38;;;;;;;;;;;;2074:8;2065:6;;:17;;;;;;;;;;;;;;;;;;1906:183;:::o;7623:735:4:-;7760:7;7892:5;:11;;;7885:4;:18;7881:57;;;7926:1;7919:8;;;;7881:57;8046:5;:9;;;8038:4;:17;;8034:66;;;8078:5;:11;;;8071:18;;;;8034:66;8281:70;8324:26;8338:5;:11;;;8324:5;:9;;;:13;;:26;;;;:::i;:::-;8281:38;8297:21;8306:5;:11;;;8297:4;:8;;:21;;;;:::i;:::-;8281:5;:11;;;:15;;:38;;;;:::i;:::-;:42;;:70;;;;:::i;:::-;8274:77;;7623:735;;;;;:::o;229:421:19:-;287:7;532:1;527;:6;523:45;;;556:1;549:8;;;;523:45;578:9;594:1;590;:5;578:17;;622:1;617;613;:5;;;;;;;;:10;605:19;;;;;;;;642:1;635:8;;;229:421;;;;;:::o;778:296::-;836:7;933:1;929;:5;921:14;;;;;;;;945:9;961:1;957;:5;;;;;;;;945:17;;1066:1;1059:8;;;778:296;;;;:::o",
  "source": "/** @title Hey Token Sale\n*  @author Thomas Vanderstraeten - <thomas@hey.network>\n*  Keep in mind that smart contracts still rely on experimental technology.\n*/\n\npragma solidity ^0.5.0;\n\nimport \"openzeppelin-solidity/contracts/token/ERC20/IERC20.sol\";\nimport \"openzeppelin-solidity/contracts/ownership/Ownable.sol\";\nimport \"openzeppelin-solidity/contracts/math/SafeMath.sol\";\n\n/** @title VestingTrustee\n * @dev Lends very heavily from SirinLab and Stox's own VestingTrustee contracts.\n */\ncontract VestingTrustee is Ownable {\n\n    /* *** Libraries *** */\n    using SafeMath for uint256;\n\n\n    /* *** Data Structures *** */\n    struct Grant {\n        uint256 value;\n        uint256 start;\n        uint256 cliff;\n        uint256 end;\n        uint256 transferred;\n        bool revokable;\n    }\n\n\n    /* *** Variables *** */\n    mapping (address => Grant) public grants; // Grants by holder address\n    IERC20 private _token;                    // The address of the ERC20 token to vest\n    uint256 private _totalVesting;            // Total tokens available for vesting\n\n\n    /* *** Events *** */\n    event GrantCreated(address indexed from, address indexed to, uint256 value);\n    event GrantClaimed(address indexed holder, uint256 value);\n    event GrantRevoked(address indexed holder, uint256 refund);\n\n\n    /* *** Public Functions *** */\n\n    /** @dev Constructor. Initializes the ERC20 token linked to the grants.\n     *  @param token IERC20 The address of the previously deployed ERC20 smart contract\n     */\n    constructor(\n        IERC20 token\n    )\n        public\n    {\n        require(address(token) != address(0), \"token cannot be zero address\");\n\n        _token = token;\n    }\n\n    /** @dev Grant tokens to a specified address.\n     *  @param to address The address to grant tokens to\n     *  @param value uint256 The amount of tokens to be granted\n     *  @param start uint256 The start of the vesting period in seconds since the Unix Epoch\n     *  @param cliff uint256 The date at which the cliff occurs in seconds since the Unix Epoch\n     *  @param end uint256 The end of the vesting period in seconds since the Unix Epoch\n     *  @param revokable bool Whether the grant is revokable or not\n     */\n    function createGrant(\n        address to,\n        uint256 value,\n        uint256 start,\n        uint256 cliff,\n        uint256 end,\n        bool revokable\n    )\n        public\n        onlyOwner\n    {\n        require(to != address(0), \"to cannot be zero address\");\n        require(value > 0, \"value must be above 0\");\n\n        // Check that no grant has previously been assigned to this address\n        require(grants[to].value == 0, \"only one grant per address\");\n\n        // Check for date inconsistencies that may cause unexpected behavior.\n        require(start <= cliff && cliff <= end, \"vesting dates must be consistent\");\n\n        // Check that this grant doesn't exceed the total amount of tokens currently available for vesting.\n        require(_totalVesting.add(value) <= _token.balanceOf(address(this)), \"grant cannot exceed total amount of tokens available\");\n\n        // Assign a new grant.\n        grants[to] = Grant({\n            value: value,\n            start: start,\n            cliff: cliff,\n            end: end,\n            transferred: 0,\n            revokable: revokable\n        });\n\n        // Tokens granted, increase the total amount vested.\n        _totalVesting = _totalVesting.add(value);\n\n        emit GrantCreated(msg.sender, to, value);\n    }\n\n    /** @dev Revoke the grant of tokens of a specifed address and returns tokens\n     *  to the grant contract owner.\n     *  @param holder address The address which will have its grant revoked.\n     */\n    function revokeGrant(\n        address holder\n    )\n        public\n        onlyOwner\n    {\n        Grant storage grant = grants[holder];\n\n        require(grant.revokable, \"grant must be revokable\");\n\n        uint256 refund = grant.value.sub(grant.transferred);\n        _totalVesting = _totalVesting.sub(refund);\n        delete grants[holder];\n\n        // Send the revoked grant tokens back to the contract owner.\n        _token.transfer(msg.sender, refund);\n\n        emit GrantRevoked(holder, refund);\n    }\n\n    /** @dev Claim vested tokens and transfer them to their holder. Note that\n     *  this function has to be called by the grant holder themselves.\n     */\n    function claimTokens()\n        public\n    {\n        // Get the total amount of claimable tokens, acccording to grant.\n        // solium-disable-next-line security/no-block-members\n        uint256 claimable = claimableTokens(msg.sender, block.timestamp);\n        require(claimable != 0, \"no tokens claimable currently\");\n\n        Grant storage grant = grants[msg.sender];\n\n        // Make sure the holder doesn't transfer more than what he already has.\n        // Note that claimable will always be greater than or equal to\n        // transferred by definition, so this is just an extra check.\n        uint256 transferable = claimable.sub(grant.transferred);\n        require(transferable != 0, \"claimable amount already transferred\");\n\n        grant.transferred = grant.transferred.add(transferable);\n        _totalVesting = _totalVesting.sub(transferable);\n        _token.transfer(msg.sender, transferable);\n\n        emit GrantClaimed(msg.sender, transferable);\n    }\n\n    /** @dev Calculate the total amount of tokens that a holder can claim at a\n     *  given time, from the total amount vested for this holder. This function\n     *  does the precheck of making sure that there is actually a grant for this\n     *  owner, before delegating to the private _calculateClaimableTokens()\n     *  function to derive the claimable amount at the given time.\n     *  @param holder address The address of the holder\n     *  @param time uint256 The specific time\n     *  @return a uint256 representing a holder's total amount of vested tokens\n     */\n    function claimableTokens(\n        address holder,\n        uint256 time\n    )\n        public\n        view\n        returns (uint256)\n    {\n        Grant storage grant = grants[holder];\n        if (grant.value == 0) {\n            return 0;\n        }\n\n        return _calculateClaimableTokens(grant, time);\n    }\n\n    /**\n      * @return The address of the vested token\n      */\n    function token()\n        public\n        view\n        returns (address)\n    {\n        return address(_token);\n    }\n\n    /**\n      * @return The total amount of tokens currently vested\n      */\n    function totalVesting()\n        public\n        view\n        returns (uint256)\n    {\n        return _totalVesting;\n    }\n\n\n    /* *** Private Functions *** */\n\n    /** @dev Calculate amount of vested tokens at a given time for a given grant.\n     *  Note that this function does not take into account any previously claimed\n     *  tokens - it is the responsibility of the caller function to ensure that\n     *  the grant holder does not claim the same value multiple times.\n     *  @param grant Grant The vesting grant\n     *  @param time uint256 The time to be checked\n     *  @return An uint256 representing the amount of claimable tokens\n     *\n     *   |                         ____________ total value\n     *   |                       _/\n     *   |                     _/\n     *   |                   _/\n     *   |                 _/\n     *   |                /\n     *   |              .|\n     *   |            .  |\n     *   |          .    |\n     *   |        .      |\n     *   |      .        |\n     *   |    .          |\n     *   +===+===========+---------+----------> time\n     *     Start       Cliff      End\n     */\n    function _calculateClaimableTokens(\n        Grant memory grant,\n        uint256 time\n    )\n        private\n        pure\n        returns (uint256)\n    {\n        // If we're before the cliff, then everything is still vested and nothing can be claimed.\n        if (time < grant.cliff) {\n            return 0;\n        }\n\n        // If we're after the end of the vesting period, the full value is claimable;\n        if (time >= grant.end) {\n            return grant.value;\n        }\n\n        // If we're between the cliff and the end time, interpolate linearly using\n        // the formula: claimableTokens = total * (time - start) / (end - start)\n        return grant.value.mul(time.sub(grant.start)).div(grant.end.sub(grant.start));\n    }\n}\n",
  "sourcePath": "/Users/thomasvanderstraeten/code/hey/mainchain/contracts/VestingTrustee.sol",
  "ast": {
    "absolutePath": "/Users/thomasvanderstraeten/code/hey/mainchain/contracts/VestingTrustee.sol",
    "exportedSymbols": {
      "VestingTrustee": [
        862
      ]
    },
    "id": 863,
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 475,
        "literals": [
          "solidity",
          "^",
          "0.5",
          ".0"
        ],
        "nodeType": "PragmaDirective",
        "src": "162:23:4"
      },
      {
        "absolutePath": "openzeppelin-solidity/contracts/token/ERC20/IERC20.sol",
        "file": "openzeppelin-solidity/contracts/token/ERC20/IERC20.sol",
        "id": 476,
        "nodeType": "ImportDirective",
        "scope": 863,
        "sourceUnit": 3215,
        "src": "187:64:4",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "openzeppelin-solidity/contracts/ownership/Ownable.sol",
        "file": "openzeppelin-solidity/contracts/ownership/Ownable.sol",
        "id": 477,
        "nodeType": "ImportDirective",
        "scope": 863,
        "sourceUnit": 2656,
        "src": "252:63:4",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "openzeppelin-solidity/contracts/math/SafeMath.sol",
        "file": "openzeppelin-solidity/contracts/math/SafeMath.sol",
        "id": 478,
        "nodeType": "ImportDirective",
        "scope": 863,
        "sourceUnit": 2547,
        "src": "316:59:4",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "baseContracts": [
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 479,
              "name": "Ownable",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 2655,
              "src": "516:7:4",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_Ownable_$2655",
                "typeString": "contract Ownable"
              }
            },
            "id": 480,
            "nodeType": "InheritanceSpecifier",
            "src": "516:7:4"
          }
        ],
        "contractDependencies": [
          2655
        ],
        "contractKind": "contract",
        "documentation": "@title VestingTrustee\n@dev Lends very heavily from SirinLab and Stox's own VestingTrustee contracts.",
        "fullyImplemented": true,
        "id": 862,
        "linearizedBaseContracts": [
          862,
          2655
        ],
        "name": "VestingTrustee",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "id": 483,
            "libraryName": {
              "contractScope": null,
              "id": 481,
              "name": "SafeMath",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 2546,
              "src": "565:8:4",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_SafeMath_$2546",
                "typeString": "library SafeMath"
              }
            },
            "nodeType": "UsingForDirective",
            "src": "559:27:4",
            "typeName": {
              "id": 482,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "578:7:4",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            }
          },
          {
            "canonicalName": "VestingTrustee.Grant",
            "id": 496,
            "members": [
              {
                "constant": false,
                "id": 485,
                "name": "value",
                "nodeType": "VariableDeclaration",
                "scope": 496,
                "src": "650:13:4",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                },
                "typeName": {
                  "id": 484,
                  "name": "uint256",
                  "nodeType": "ElementaryTypeName",
                  "src": "650:7:4",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  }
                },
                "value": null,
                "visibility": "internal"
              },
              {
                "constant": false,
                "id": 487,
                "name": "start",
                "nodeType": "VariableDeclaration",
                "scope": 496,
                "src": "673:13:4",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                },
                "typeName": {
                  "id": 486,
                  "name": "uint256",
                  "nodeType": "ElementaryTypeName",
                  "src": "673:7:4",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  }
                },
                "value": null,
                "visibility": "internal"
              },
              {
                "constant": false,
                "id": 489,
                "name": "cliff",
                "nodeType": "VariableDeclaration",
                "scope": 496,
                "src": "696:13:4",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                },
                "typeName": {
                  "id": 488,
                  "name": "uint256",
                  "nodeType": "ElementaryTypeName",
                  "src": "696:7:4",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  }
                },
                "value": null,
                "visibility": "internal"
              },
              {
                "constant": false,
                "id": 491,
                "name": "end",
                "nodeType": "VariableDeclaration",
                "scope": 496,
                "src": "719:11:4",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                },
                "typeName": {
                  "id": 490,
                  "name": "uint256",
                  "nodeType": "ElementaryTypeName",
                  "src": "719:7:4",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  }
                },
                "value": null,
                "visibility": "internal"
              },
              {
                "constant": false,
                "id": 493,
                "name": "transferred",
                "nodeType": "VariableDeclaration",
                "scope": 496,
                "src": "740:19:4",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                },
                "typeName": {
                  "id": 492,
                  "name": "uint256",
                  "nodeType": "ElementaryTypeName",
                  "src": "740:7:4",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  }
                },
                "value": null,
                "visibility": "internal"
              },
              {
                "constant": false,
                "id": 495,
                "name": "revokable",
                "nodeType": "VariableDeclaration",
                "scope": 496,
                "src": "769:14:4",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_bool",
                  "typeString": "bool"
                },
                "typeName": {
                  "id": 494,
                  "name": "bool",
                  "nodeType": "ElementaryTypeName",
                  "src": "769:4:4",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  }
                },
                "value": null,
                "visibility": "internal"
              }
            ],
            "name": "Grant",
            "nodeType": "StructDefinition",
            "scope": 862,
            "src": "627:163:4",
            "visibility": "public"
          },
          {
            "constant": false,
            "id": 500,
            "name": "grants",
            "nodeType": "VariableDeclaration",
            "scope": 862,
            "src": "825:40:4",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Grant_$496_storage_$",
              "typeString": "mapping(address => struct VestingTrustee.Grant)"
            },
            "typeName": {
              "id": 499,
              "keyType": {
                "id": 497,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "834:7:4",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              },
              "nodeType": "Mapping",
              "src": "825:26:4",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Grant_$496_storage_$",
                "typeString": "mapping(address => struct VestingTrustee.Grant)"
              },
              "valueType": {
                "contractScope": null,
                "id": 498,
                "name": "Grant",
                "nodeType": "UserDefinedTypeName",
                "referencedDeclaration": 496,
                "src": "845:5:4",
                "typeDescriptions": {
                  "typeIdentifier": "t_struct$_Grant_$496_storage_ptr",
                  "typeString": "struct VestingTrustee.Grant"
                }
              }
            },
            "value": null,
            "visibility": "public"
          },
          {
            "constant": false,
            "id": 502,
            "name": "_token",
            "nodeType": "VariableDeclaration",
            "scope": 862,
            "src": "899:21:4",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_contract$_IERC20_$3214",
              "typeString": "contract IERC20"
            },
            "typeName": {
              "contractScope": null,
              "id": 501,
              "name": "IERC20",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 3214,
              "src": "899:6:4",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_IERC20_$3214",
                "typeString": "contract IERC20"
              }
            },
            "value": null,
            "visibility": "private"
          },
          {
            "constant": false,
            "id": 504,
            "name": "_totalVesting",
            "nodeType": "VariableDeclaration",
            "scope": 862,
            "src": "987:29:4",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 503,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "987:7:4",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "value": null,
            "visibility": "private"
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 512,
            "name": "GrantCreated",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 511,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 506,
                  "indexed": true,
                  "name": "from",
                  "nodeType": "VariableDeclaration",
                  "scope": 512,
                  "src": "1117:20:4",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 505,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1117:7:4",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 508,
                  "indexed": true,
                  "name": "to",
                  "nodeType": "VariableDeclaration",
                  "scope": 512,
                  "src": "1139:18:4",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 507,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1139:7:4",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 510,
                  "indexed": false,
                  "name": "value",
                  "nodeType": "VariableDeclaration",
                  "scope": 512,
                  "src": "1159:13:4",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 509,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1159:7:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1116:57:4"
            },
            "src": "1098:76:4"
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 518,
            "name": "GrantClaimed",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 517,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 514,
                  "indexed": true,
                  "name": "holder",
                  "nodeType": "VariableDeclaration",
                  "scope": 518,
                  "src": "1198:22:4",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 513,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1198:7:4",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 516,
                  "indexed": false,
                  "name": "value",
                  "nodeType": "VariableDeclaration",
                  "scope": 518,
                  "src": "1222:13:4",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 515,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1222:7:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1197:39:4"
            },
            "src": "1179:58:4"
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 524,
            "name": "GrantRevoked",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 523,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 520,
                  "indexed": true,
                  "name": "holder",
                  "nodeType": "VariableDeclaration",
                  "scope": 524,
                  "src": "1261:22:4",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 519,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1261:7:4",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 522,
                  "indexed": false,
                  "name": "refund",
                  "nodeType": "VariableDeclaration",
                  "scope": 524,
                  "src": "1285:14:4",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 521,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1285:7:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1260:40:4"
            },
            "src": "1242:59:4"
          },
          {
            "body": {
              "id": 544,
              "nodeType": "Block",
              "src": "1575:111:4",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 536,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 531,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 526,
                              "src": "1601:5:4",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$3214",
                                "typeString": "contract IERC20"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_IERC20_$3214",
                                "typeString": "contract IERC20"
                              }
                            ],
                            "id": 530,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "1593:7:4",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": "address"
                          },
                          "id": 532,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1593:14:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "!=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 534,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "1619:1:4",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              "value": "0"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              }
                            ],
                            "id": 533,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "1611:7:4",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": "address"
                          },
                          "id": 535,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1611:10:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        },
                        "src": "1593:28:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "746f6b656e2063616e6e6f74206265207a65726f2061646472657373",
                        "id": 537,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "1623:30:4",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_78447af7d226b72aaaf03dd000a6faa0d044a521f2c2503edf33dd462ad561f3",
                          "typeString": "literal_string \"token cannot be zero address\""
                        },
                        "value": "token cannot be zero address"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_78447af7d226b72aaaf03dd000a6faa0d044a521f2c2503edf33dd462ad561f3",
                          "typeString": "literal_string \"token cannot be zero address\""
                        }
                      ],
                      "id": 529,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        3407,
                        3408
                      ],
                      "referencedDeclaration": 3408,
                      "src": "1585:7:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 538,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1585:69:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 539,
                  "nodeType": "ExpressionStatement",
                  "src": "1585:69:4"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 542,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 540,
                      "name": "_token",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 502,
                      "src": "1665:6:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IERC20_$3214",
                        "typeString": "contract IERC20"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 541,
                      "name": "token",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 526,
                      "src": "1674:5:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IERC20_$3214",
                        "typeString": "contract IERC20"
                      }
                    },
                    "src": "1665:14:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20_$3214",
                      "typeString": "contract IERC20"
                    }
                  },
                  "id": 543,
                  "nodeType": "ExpressionStatement",
                  "src": "1665:14:4"
                }
              ]
            },
            "documentation": "@dev Constructor. Initializes the ERC20 token linked to the grants.\n @param token IERC20 The address of the previously deployed ERC20 smart contract",
            "id": 545,
            "implemented": true,
            "kind": "constructor",
            "modifiers": [],
            "name": "",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 527,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 526,
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "scope": 545,
                  "src": "1537:12:4",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_IERC20_$3214",
                    "typeString": "contract IERC20"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 525,
                    "name": "IERC20",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 3214,
                    "src": "1537:6:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20_$3214",
                      "typeString": "contract IERC20"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1527:28:4"
            },
            "returnParameters": {
              "id": 528,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1575:0:4"
            },
            "scope": 862,
            "src": "1516:170:4",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 641,
              "nodeType": "Block",
              "src": "2415:1075:4",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 567,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 563,
                          "name": "to",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 547,
                          "src": "2433:2:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "!=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 565,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "2447:1:4",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              "value": "0"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              }
                            ],
                            "id": 564,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "2439:7:4",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": "address"
                          },
                          "id": 566,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2439:10:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        },
                        "src": "2433:16:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "746f2063616e6e6f74206265207a65726f2061646472657373",
                        "id": 568,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "2451:27:4",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_68fbdc27556ce8c765f4eaa1b339606086088a233ebf44019715866c27d14936",
                          "typeString": "literal_string \"to cannot be zero address\""
                        },
                        "value": "to cannot be zero address"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_68fbdc27556ce8c765f4eaa1b339606086088a233ebf44019715866c27d14936",
                          "typeString": "literal_string \"to cannot be zero address\""
                        }
                      ],
                      "id": 562,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        3407,
                        3408
                      ],
                      "referencedDeclaration": 3408,
                      "src": "2425:7:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 569,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2425:54:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 570,
                  "nodeType": "ExpressionStatement",
                  "src": "2425:54:4"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 574,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 572,
                          "name": "value",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 549,
                          "src": "2497:5:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": ">",
                        "rightExpression": {
                          "argumentTypes": null,
                          "hexValue": "30",
                          "id": 573,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "2505:1:4",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        },
                        "src": "2497:9:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "76616c7565206d7573742062652061626f76652030",
                        "id": 575,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "2508:23:4",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_779416dd6e4b18f49d0eee4e3fee49cd12c5710dc127d93bb2864d748aa98efc",
                          "typeString": "literal_string \"value must be above 0\""
                        },
                        "value": "value must be above 0"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_779416dd6e4b18f49d0eee4e3fee49cd12c5710dc127d93bb2864d748aa98efc",
                          "typeString": "literal_string \"value must be above 0\""
                        }
                      ],
                      "id": 571,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        3407,
                        3408
                      ],
                      "referencedDeclaration": 3408,
                      "src": "2489:7:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 576,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2489:43:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 577,
                  "nodeType": "ExpressionStatement",
                  "src": "2489:43:4"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 584,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 579,
                              "name": "grants",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 500,
                              "src": "2627:6:4",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Grant_$496_storage_$",
                                "typeString": "mapping(address => struct VestingTrustee.Grant storage ref)"
                              }
                            },
                            "id": 581,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 580,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 547,
                              "src": "2634:2:4",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "2627:10:4",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_Grant_$496_storage",
                              "typeString": "struct VestingTrustee.Grant storage ref"
                            }
                          },
                          "id": 582,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "value",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 485,
                          "src": "2627:16:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "argumentTypes": null,
                          "hexValue": "30",
                          "id": 583,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "2647:1:4",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        },
                        "src": "2627:21:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "6f6e6c79206f6e65206772616e74207065722061646472657373",
                        "id": 585,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "2650:28:4",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_720ead85d27ff647821f9761e732c63013c0ab291035c0dec678383e14bf523d",
                          "typeString": "literal_string \"only one grant per address\""
                        },
                        "value": "only one grant per address"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_720ead85d27ff647821f9761e732c63013c0ab291035c0dec678383e14bf523d",
                          "typeString": "literal_string \"only one grant per address\""
                        }
                      ],
                      "id": 578,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        3407,
                        3408
                      ],
                      "referencedDeclaration": 3408,
                      "src": "2619:7:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 586,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2619:60:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 587,
                  "nodeType": "ExpressionStatement",
                  "src": "2619:60:4"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "id": 595,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 591,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 589,
                            "name": "start",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 551,
                            "src": "2776:5:4",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "<=",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 590,
                            "name": "cliff",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 553,
                            "src": "2785:5:4",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "2776:14:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "&&",
                        "rightExpression": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 594,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 592,
                            "name": "cliff",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 553,
                            "src": "2794:5:4",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "<=",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 593,
                            "name": "end",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 555,
                            "src": "2803:3:4",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "2794:12:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "src": "2776:30:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "76657374696e67206461746573206d75737420626520636f6e73697374656e74",
                        "id": 596,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "2808:34:4",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_fddf95001eac8aeb7871a7941093f25ac0a544b639b29a8f456a75e1c88e44a2",
                          "typeString": "literal_string \"vesting dates must be consistent\""
                        },
                        "value": "vesting dates must be consistent"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_fddf95001eac8aeb7871a7941093f25ac0a544b639b29a8f456a75e1c88e44a2",
                          "typeString": "literal_string \"vesting dates must be consistent\""
                        }
                      ],
                      "id": 588,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        3407,
                        3408
                      ],
                      "referencedDeclaration": 3408,
                      "src": "2768:7:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 597,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2768:75:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 598,
                  "nodeType": "ExpressionStatement",
                  "src": "2768:75:4"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 610,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 602,
                              "name": "value",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 549,
                              "src": "2988:5:4",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 600,
                              "name": "_totalVesting",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 504,
                              "src": "2970:13:4",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "id": 601,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "add",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 2525,
                            "src": "2970:17:4",
                            "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": 603,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2970:24:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "<=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 607,
                                  "name": "this",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 3465,
                                  "src": "3023:4:4",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_VestingTrustee_$862",
                                    "typeString": "contract VestingTrustee"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_VestingTrustee_$862",
                                    "typeString": "contract VestingTrustee"
                                  }
                                ],
                                "id": 606,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "3015:7:4",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": "address"
                              },
                              "id": 608,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "3015:13:4",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 604,
                              "name": "_token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 502,
                              "src": "2998:6:4",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$3214",
                                "typeString": "contract IERC20"
                              }
                            },
                            "id": 605,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "balanceOf",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 3188,
                            "src": "2998:16:4",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                              "typeString": "function (address) view external returns (uint256)"
                            }
                          },
                          "id": 609,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2998:31:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "src": "2970:59:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "6772616e742063616e6e6f742065786365656420746f74616c20616d6f756e74206f6620746f6b656e7320617661696c61626c65",
                        "id": 611,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "3031:54:4",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_e1320aa96b98997101853e785b5d30dc81f76c894a615639b494619781c85730",
                          "typeString": "literal_string \"grant cannot exceed total amount of tokens available\""
                        },
                        "value": "grant cannot exceed total amount of tokens available"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_e1320aa96b98997101853e785b5d30dc81f76c894a615639b494619781c85730",
                          "typeString": "literal_string \"grant cannot exceed total amount of tokens available\""
                        }
                      ],
                      "id": 599,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        3407,
                        3408
                      ],
                      "referencedDeclaration": 3408,
                      "src": "2962:7:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 612,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2962:124:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 613,
                  "nodeType": "ExpressionStatement",
                  "src": "2962:124:4"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 625,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 614,
                        "name": "grants",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 500,
                        "src": "3128:6:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Grant_$496_storage_$",
                          "typeString": "mapping(address => struct VestingTrustee.Grant storage ref)"
                        }
                      },
                      "id": 616,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 615,
                        "name": "to",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 547,
                        "src": "3135:2:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "3128:10:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_Grant_$496_storage",
                        "typeString": "struct VestingTrustee.Grant storage ref"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 618,
                          "name": "value",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 549,
                          "src": "3168:5:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        {
                          "argumentTypes": null,
                          "id": 619,
                          "name": "start",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 551,
                          "src": "3194:5:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        {
                          "argumentTypes": null,
                          "id": 620,
                          "name": "cliff",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 553,
                          "src": "3220:5:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        {
                          "argumentTypes": null,
                          "id": 621,
                          "name": "end",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 555,
                          "src": "3244:3:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        {
                          "argumentTypes": null,
                          "hexValue": "30",
                          "id": 622,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "3274:1:4",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        },
                        {
                          "argumentTypes": null,
                          "id": 623,
                          "name": "revokable",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 557,
                          "src": "3300:9:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 617,
                        "name": "Grant",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 496,
                        "src": "3141:5:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_struct$_Grant_$496_storage_ptr_$",
                          "typeString": "type(struct VestingTrustee.Grant storage pointer)"
                        }
                      },
                      "id": 624,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "structConstructorCall",
                      "lValueRequested": false,
                      "names": [
                        "value",
                        "start",
                        "cliff",
                        "end",
                        "transferred",
                        "revokable"
                      ],
                      "nodeType": "FunctionCall",
                      "src": "3141:179:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_Grant_$496_memory",
                        "typeString": "struct VestingTrustee.Grant memory"
                      }
                    },
                    "src": "3128:192:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_Grant_$496_storage",
                      "typeString": "struct VestingTrustee.Grant storage ref"
                    }
                  },
                  "id": 626,
                  "nodeType": "ExpressionStatement",
                  "src": "3128:192:4"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 632,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 627,
                      "name": "_totalVesting",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 504,
                      "src": "3392:13:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 630,
                          "name": "value",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 549,
                          "src": "3426:5:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        ],
                        "expression": {
                          "argumentTypes": null,
                          "id": 628,
                          "name": "_totalVesting",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 504,
                          "src": "3408:13:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 629,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "add",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 2525,
                        "src": "3408:17:4",
                        "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": 631,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "3408:24:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "3392:40:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 633,
                  "nodeType": "ExpressionStatement",
                  "src": "3392:40:4"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 635,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3404,
                          "src": "3461:3:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 636,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "3461:10:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 637,
                        "name": "to",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 547,
                        "src": "3473:2:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 638,
                        "name": "value",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 549,
                        "src": "3477:5:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 634,
                      "name": "GrantCreated",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 512,
                      "src": "3448:12:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,address,uint256)"
                      }
                    },
                    "id": 639,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3448:35:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 640,
                  "nodeType": "EmitStatement",
                  "src": "3443:40:4"
                }
              ]
            },
            "documentation": "@dev Grant tokens to a specified address.\n @param to address The address to grant tokens to\n @param value uint256 The amount of tokens to be granted\n @param start uint256 The start of the vesting period in seconds since the Unix Epoch\n @param cliff uint256 The date at which the cliff occurs in seconds since the Unix Epoch\n @param end uint256 The end of the vesting period in seconds since the Unix Epoch\n @param revokable bool Whether the grant is revokable or not",
            "id": 642,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 560,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 559,
                  "name": "onlyOwner",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 2589,
                  "src": "2401:9:4",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "2401:9:4"
              }
            ],
            "name": "createGrant",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 558,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 547,
                  "name": "to",
                  "nodeType": "VariableDeclaration",
                  "scope": 642,
                  "src": "2247:10:4",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 546,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2247:7:4",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 549,
                  "name": "value",
                  "nodeType": "VariableDeclaration",
                  "scope": 642,
                  "src": "2267:13:4",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 548,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2267:7:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 551,
                  "name": "start",
                  "nodeType": "VariableDeclaration",
                  "scope": 642,
                  "src": "2290:13:4",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 550,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2290:7:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 553,
                  "name": "cliff",
                  "nodeType": "VariableDeclaration",
                  "scope": 642,
                  "src": "2313:13:4",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 552,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2313:7:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 555,
                  "name": "end",
                  "nodeType": "VariableDeclaration",
                  "scope": 642,
                  "src": "2336:11:4",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 554,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2336:7:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 557,
                  "name": "revokable",
                  "nodeType": "VariableDeclaration",
                  "scope": 642,
                  "src": "2357:14:4",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 556,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "2357:4:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2237:140:4"
            },
            "returnParameters": {
              "id": 561,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2415:0:4"
            },
            "scope": 862,
            "src": "2217:1273:4",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 695,
              "nodeType": "Block",
              "src": "3787:418:4",
              "statements": [
                {
                  "assignments": [
                    650
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 650,
                      "name": "grant",
                      "nodeType": "VariableDeclaration",
                      "scope": 695,
                      "src": "3797:19:4",
                      "stateVariable": false,
                      "storageLocation": "storage",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_Grant_$496_storage_ptr",
                        "typeString": "struct VestingTrustee.Grant"
                      },
                      "typeName": {
                        "contractScope": null,
                        "id": 649,
                        "name": "Grant",
                        "nodeType": "UserDefinedTypeName",
                        "referencedDeclaration": 496,
                        "src": "3797:5:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Grant_$496_storage_ptr",
                          "typeString": "struct VestingTrustee.Grant"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 654,
                  "initialValue": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "id": 651,
                      "name": "grants",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 500,
                      "src": "3819:6:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Grant_$496_storage_$",
                        "typeString": "mapping(address => struct VestingTrustee.Grant storage ref)"
                      }
                    },
                    "id": 653,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 652,
                      "name": "holder",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 644,
                      "src": "3826:6:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "3819:14:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_Grant_$496_storage",
                      "typeString": "struct VestingTrustee.Grant storage ref"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "3797:36:4"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 656,
                          "name": "grant",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 650,
                          "src": "3852:5:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Grant_$496_storage_ptr",
                            "typeString": "struct VestingTrustee.Grant storage pointer"
                          }
                        },
                        "id": 657,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "revokable",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 495,
                        "src": "3852:15:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "6772616e74206d757374206265207265766f6b61626c65",
                        "id": 658,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "3869:25:4",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_bc1ca1313d04b2b1ab7fef4c641f0abd9d99c8fe5f1179a9cc8d02b6c8960e1a",
                          "typeString": "literal_string \"grant must be revokable\""
                        },
                        "value": "grant must be revokable"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_bc1ca1313d04b2b1ab7fef4c641f0abd9d99c8fe5f1179a9cc8d02b6c8960e1a",
                          "typeString": "literal_string \"grant must be revokable\""
                        }
                      ],
                      "id": 655,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        3407,
                        3408
                      ],
                      "referencedDeclaration": 3408,
                      "src": "3844:7:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 659,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3844:51:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 660,
                  "nodeType": "ExpressionStatement",
                  "src": "3844:51:4"
                },
                {
                  "assignments": [
                    662
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 662,
                      "name": "refund",
                      "nodeType": "VariableDeclaration",
                      "scope": 695,
                      "src": "3906:14:4",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 661,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "3906:7:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 669,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 666,
                          "name": "grant",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 650,
                          "src": "3939:5:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Grant_$496_storage_ptr",
                            "typeString": "struct VestingTrustee.Grant storage pointer"
                          }
                        },
                        "id": 667,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "transferred",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 493,
                        "src": "3939:17:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 663,
                          "name": "grant",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 650,
                          "src": "3923:5:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Grant_$496_storage_ptr",
                            "typeString": "struct VestingTrustee.Grant storage pointer"
                          }
                        },
                        "id": 664,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "value",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 485,
                        "src": "3923:11:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "id": 665,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "sub",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 2501,
                      "src": "3923:15:4",
                      "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": 668,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3923:34:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "3906:51:4"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 675,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 670,
                      "name": "_totalVesting",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 504,
                      "src": "3967:13:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 673,
                          "name": "refund",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 662,
                          "src": "4001:6:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        ],
                        "expression": {
                          "argumentTypes": null,
                          "id": 671,
                          "name": "_totalVesting",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 504,
                          "src": "3983:13:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 672,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sub",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 2501,
                        "src": "3983:17:4",
                        "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": 674,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "3983:25:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "3967:41:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 676,
                  "nodeType": "ExpressionStatement",
                  "src": "3967:41:4"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 680,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "UnaryOperation",
                    "operator": "delete",
                    "prefix": true,
                    "src": "4018:21:4",
                    "subExpression": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 677,
                        "name": "grants",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 500,
                        "src": "4025:6:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Grant_$496_storage_$",
                          "typeString": "mapping(address => struct VestingTrustee.Grant storage ref)"
                        }
                      },
                      "id": 679,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 678,
                        "name": "holder",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 644,
                        "src": "4032:6:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "4025:14:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_Grant_$496_storage",
                        "typeString": "struct VestingTrustee.Grant storage ref"
                      }
                    },
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 681,
                  "nodeType": "ExpressionStatement",
                  "src": "4018:21:4"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 685,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3404,
                          "src": "4135:3:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 686,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "4135:10:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 687,
                        "name": "refund",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 662,
                        "src": "4147:6:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 682,
                        "name": "_token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 502,
                        "src": "4119:6:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$3214",
                          "typeString": "contract IERC20"
                        }
                      },
                      "id": 684,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "transfer",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 3156,
                      "src": "4119:15:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                        "typeString": "function (address,uint256) external returns (bool)"
                      }
                    },
                    "id": 688,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4119:35:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 689,
                  "nodeType": "ExpressionStatement",
                  "src": "4119:35:4"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 691,
                        "name": "holder",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 644,
                        "src": "4183:6:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 692,
                        "name": "refund",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 662,
                        "src": "4191:6:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 690,
                      "name": "GrantRevoked",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 524,
                      "src": "4170:12:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,uint256)"
                      }
                    },
                    "id": 693,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4170:28:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 694,
                  "nodeType": "EmitStatement",
                  "src": "4165:33:4"
                }
              ]
            },
            "documentation": "@dev Revoke the grant of tokens of a specifed address and returns tokens\n to the grant contract owner.\n @param holder address The address which will have its grant revoked.",
            "id": 696,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 647,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 646,
                  "name": "onlyOwner",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 2589,
                  "src": "3773:9:4",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "3773:9:4"
              }
            ],
            "name": "revokeGrant",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 645,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 644,
                  "name": "holder",
                  "nodeType": "VariableDeclaration",
                  "scope": 696,
                  "src": "3729:14:4",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 643,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3729:7:4",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3719:30:4"
            },
            "returnParameters": {
              "id": 648,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3787:0:4"
            },
            "scope": 862,
            "src": "3699:506:4",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 768,
              "nodeType": "Block",
              "src": "4410:925:4",
              "statements": [
                {
                  "assignments": [
                    700
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 700,
                      "name": "claimable",
                      "nodeType": "VariableDeclaration",
                      "scope": 768,
                      "src": "4556:17:4",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 699,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "4556:7:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 707,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 702,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3404,
                          "src": "4592:3:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 703,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "4592:10:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 704,
                          "name": "block",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3394,
                          "src": "4604:5:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_block",
                            "typeString": "block"
                          }
                        },
                        "id": 705,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "timestamp",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "4604:15:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 701,
                      "name": "claimableTokens",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 798,
                      "src": "4576:15:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_address_$_t_uint256_$returns$_t_uint256_$",
                        "typeString": "function (address,uint256) view returns (uint256)"
                      }
                    },
                    "id": 706,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4576:44:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "4556:64:4"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 711,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 709,
                          "name": "claimable",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 700,
                          "src": "4638:9:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "!=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "hexValue": "30",
                          "id": 710,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "4651:1:4",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        },
                        "src": "4638:14:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "6e6f20746f6b656e7320636c61696d61626c652063757272656e746c79",
                        "id": 712,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "4654:31:4",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_9b493e56a6c6560f76f84639ce4f6b5db255fe8e4a81f1200ea18314ed918897",
                          "typeString": "literal_string \"no tokens claimable currently\""
                        },
                        "value": "no tokens claimable currently"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_9b493e56a6c6560f76f84639ce4f6b5db255fe8e4a81f1200ea18314ed918897",
                          "typeString": "literal_string \"no tokens claimable currently\""
                        }
                      ],
                      "id": 708,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        3407,
                        3408
                      ],
                      "referencedDeclaration": 3408,
                      "src": "4630:7:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 713,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4630:56:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 714,
                  "nodeType": "ExpressionStatement",
                  "src": "4630:56:4"
                },
                {
                  "assignments": [
                    716
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 716,
                      "name": "grant",
                      "nodeType": "VariableDeclaration",
                      "scope": 768,
                      "src": "4697:19:4",
                      "stateVariable": false,
                      "storageLocation": "storage",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_Grant_$496_storage_ptr",
                        "typeString": "struct VestingTrustee.Grant"
                      },
                      "typeName": {
                        "contractScope": null,
                        "id": 715,
                        "name": "Grant",
                        "nodeType": "UserDefinedTypeName",
                        "referencedDeclaration": 496,
                        "src": "4697:5:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Grant_$496_storage_ptr",
                          "typeString": "struct VestingTrustee.Grant"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 721,
                  "initialValue": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "id": 717,
                      "name": "grants",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 500,
                      "src": "4719:6:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Grant_$496_storage_$",
                        "typeString": "mapping(address => struct VestingTrustee.Grant storage ref)"
                      }
                    },
                    "id": 720,
                    "indexExpression": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "id": 718,
                        "name": "msg",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3404,
                        "src": "4726:3:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_message",
                          "typeString": "msg"
                        }
                      },
                      "id": 719,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "sender",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": null,
                      "src": "4726:10:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address_payable",
                        "typeString": "address payable"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "4719:18:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_Grant_$496_storage",
                      "typeString": "struct VestingTrustee.Grant storage ref"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "4697:40:4"
                },
                {
                  "assignments": [
                    723
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 723,
                      "name": "transferable",
                      "nodeType": "VariableDeclaration",
                      "scope": 768,
                      "src": "4969:20:4",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 722,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "4969:7:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 729,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 726,
                          "name": "grant",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 716,
                          "src": "5006:5:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Grant_$496_storage_ptr",
                            "typeString": "struct VestingTrustee.Grant storage pointer"
                          }
                        },
                        "id": 727,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "transferred",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 493,
                        "src": "5006:17:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 724,
                        "name": "claimable",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 700,
                        "src": "4992:9:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "id": 725,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "sub",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 2501,
                      "src": "4992:13:4",
                      "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": 728,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4992:32:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "4969:55:4"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 733,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 731,
                          "name": "transferable",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 723,
                          "src": "5042:12:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "!=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "hexValue": "30",
                          "id": 732,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "5058:1:4",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        },
                        "src": "5042:17:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "636c61696d61626c6520616d6f756e7420616c7265616479207472616e73666572726564",
                        "id": 734,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "5061:38:4",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_cf98fc057f5734d3f8f5559dee4e9d3e4e847a59ec581e76b25c76f104fcc5c6",
                          "typeString": "literal_string \"claimable amount already transferred\""
                        },
                        "value": "claimable amount already transferred"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_cf98fc057f5734d3f8f5559dee4e9d3e4e847a59ec581e76b25c76f104fcc5c6",
                          "typeString": "literal_string \"claimable amount already transferred\""
                        }
                      ],
                      "id": 730,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        3407,
                        3408
                      ],
                      "referencedDeclaration": 3408,
                      "src": "5034:7:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 735,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5034:66:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 736,
                  "nodeType": "ExpressionStatement",
                  "src": "5034:66:4"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 745,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "id": 737,
                        "name": "grant",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 716,
                        "src": "5111:5:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Grant_$496_storage_ptr",
                          "typeString": "struct VestingTrustee.Grant storage pointer"
                        }
                      },
                      "id": 739,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberName": "transferred",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 493,
                      "src": "5111:17:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 743,
                          "name": "transferable",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 723,
                          "src": "5153:12:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        ],
                        "expression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 740,
                            "name": "grant",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 716,
                            "src": "5131:5:4",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_Grant_$496_storage_ptr",
                              "typeString": "struct VestingTrustee.Grant storage pointer"
                            }
                          },
                          "id": 741,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "transferred",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 493,
                          "src": "5131:17:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 742,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "add",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 2525,
                        "src": "5131:21:4",
                        "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": 744,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "5131:35:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "5111:55:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 746,
                  "nodeType": "ExpressionStatement",
                  "src": "5111:55:4"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 752,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 747,
                      "name": "_totalVesting",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 504,
                      "src": "5176:13:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 750,
                          "name": "transferable",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 723,
                          "src": "5210:12:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        ],
                        "expression": {
                          "argumentTypes": null,
                          "id": 748,
                          "name": "_totalVesting",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 504,
                          "src": "5192:13:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 749,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sub",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 2501,
                        "src": "5192:17:4",
                        "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": 751,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "5192:31:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "5176:47:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 753,
                  "nodeType": "ExpressionStatement",
                  "src": "5176:47:4"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 757,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3404,
                          "src": "5249:3:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 758,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "5249:10:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 759,
                        "name": "transferable",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 723,
                        "src": "5261:12:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 754,
                        "name": "_token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 502,
                        "src": "5233:6:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$3214",
                          "typeString": "contract IERC20"
                        }
                      },
                      "id": 756,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "transfer",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 3156,
                      "src": "5233:15:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                        "typeString": "function (address,uint256) external returns (bool)"
                      }
                    },
                    "id": 760,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5233:41:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 761,
                  "nodeType": "ExpressionStatement",
                  "src": "5233:41:4"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 763,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3404,
                          "src": "5303:3:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 764,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "5303:10:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 765,
                        "name": "transferable",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 723,
                        "src": "5315:12:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 762,
                      "name": "GrantClaimed",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 518,
                      "src": "5290:12:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,uint256)"
                      }
                    },
                    "id": 766,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5290:38:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 767,
                  "nodeType": "EmitStatement",
                  "src": "5285:43:4"
                }
              ]
            },
            "documentation": "@dev Claim vested tokens and transfer them to their holder. Note that\n this function has to be called by the grant holder themselves.",
            "id": 769,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "claimTokens",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 697,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "4388:2:4"
            },
            "returnParameters": {
              "id": 698,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "4410:0:4"
            },
            "scope": 862,
            "src": "4368:967:4",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 797,
              "nodeType": "Block",
              "src": "6049:173:4",
              "statements": [
                {
                  "assignments": [
                    779
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 779,
                      "name": "grant",
                      "nodeType": "VariableDeclaration",
                      "scope": 797,
                      "src": "6059:19:4",
                      "stateVariable": false,
                      "storageLocation": "storage",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_Grant_$496_storage_ptr",
                        "typeString": "struct VestingTrustee.Grant"
                      },
                      "typeName": {
                        "contractScope": null,
                        "id": 778,
                        "name": "Grant",
                        "nodeType": "UserDefinedTypeName",
                        "referencedDeclaration": 496,
                        "src": "6059:5:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Grant_$496_storage_ptr",
                          "typeString": "struct VestingTrustee.Grant"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 783,
                  "initialValue": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "id": 780,
                      "name": "grants",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 500,
                      "src": "6081:6:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Grant_$496_storage_$",
                        "typeString": "mapping(address => struct VestingTrustee.Grant storage ref)"
                      }
                    },
                    "id": 782,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 781,
                      "name": "holder",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 771,
                      "src": "6088:6:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "6081:14:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_Grant_$496_storage",
                      "typeString": "struct VestingTrustee.Grant storage ref"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "6059:36:4"
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 787,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "id": 784,
                        "name": "grant",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 779,
                        "src": "6109:5:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Grant_$496_storage_ptr",
                          "typeString": "struct VestingTrustee.Grant storage pointer"
                        }
                      },
                      "id": 785,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "value",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 485,
                      "src": "6109:11:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "argumentTypes": null,
                      "hexValue": "30",
                      "id": 786,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "6124:1:4",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "src": "6109:16:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 791,
                  "nodeType": "IfStatement",
                  "src": "6105:55:4",
                  "trueBody": {
                    "id": 790,
                    "nodeType": "Block",
                    "src": "6127:33:4",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "hexValue": "30",
                          "id": 788,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "6148:1:4",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        },
                        "functionReturnParameters": 777,
                        "id": 789,
                        "nodeType": "Return",
                        "src": "6141:8:4"
                      }
                    ]
                  }
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 793,
                        "name": "grant",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 779,
                        "src": "6203:5:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Grant_$496_storage_ptr",
                          "typeString": "struct VestingTrustee.Grant storage pointer"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 794,
                        "name": "time",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 773,
                        "src": "6210:4:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_struct$_Grant_$496_storage_ptr",
                          "typeString": "struct VestingTrustee.Grant storage pointer"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 792,
                      "name": "_calculateClaimableTokens",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 861,
                      "src": "6177:25:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_pure$_t_struct$_Grant_$496_memory_ptr_$_t_uint256_$returns$_t_uint256_$",
                        "typeString": "function (struct VestingTrustee.Grant memory,uint256) pure returns (uint256)"
                      }
                    },
                    "id": 795,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "6177:38:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 777,
                  "id": 796,
                  "nodeType": "Return",
                  "src": "6170:45:4"
                }
              ]
            },
            "documentation": "@dev Calculate the total amount of tokens that a holder can claim at a\n given time, from the total amount vested for this holder. This function\n does the precheck of making sure that there is actually a grant for this\n owner, before delegating to the private _calculateClaimableTokens()\n function to derive the claimable amount at the given time.\n @param holder address The address of the holder\n @param time uint256 The specific time\n @return a uint256 representing a holder's total amount of vested tokens",
            "id": 798,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "claimableTokens",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 774,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 771,
                  "name": "holder",
                  "nodeType": "VariableDeclaration",
                  "scope": 798,
                  "src": "5948:14:4",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 770,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "5948:7:4",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 773,
                  "name": "time",
                  "nodeType": "VariableDeclaration",
                  "scope": 798,
                  "src": "5972:12:4",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 772,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "5972:7:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "5938:52:4"
            },
            "returnParameters": {
              "id": 777,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 776,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 798,
                  "src": "6036:7:4",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 775,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "6036:7:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "6035:9:4"
            },
            "scope": 862,
            "src": "5914:308:4",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 807,
              "nodeType": "Block",
              "src": "6368:39:4",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 804,
                        "name": "_token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 502,
                        "src": "6393:6:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$3214",
                          "typeString": "contract IERC20"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_contract$_IERC20_$3214",
                          "typeString": "contract IERC20"
                        }
                      ],
                      "id": 803,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "lValueRequested": false,
                      "nodeType": "ElementaryTypeNameExpression",
                      "src": "6385:7:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_type$_t_address_$",
                        "typeString": "type(address)"
                      },
                      "typeName": "address"
                    },
                    "id": 805,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "typeConversion",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "6385:15:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "functionReturnParameters": 802,
                  "id": 806,
                  "nodeType": "Return",
                  "src": "6378:22:4"
                }
              ]
            },
            "documentation": "@return The address of the vested token",
            "id": 808,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "token",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 799,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "6307:2:4"
            },
            "returnParameters": {
              "id": 802,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 801,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 808,
                  "src": "6355:7:4",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 800,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "6355:7:4",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "6354:9:4"
            },
            "scope": 862,
            "src": "6293:114:4",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 815,
              "nodeType": "Block",
              "src": "6572:37:4",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 813,
                    "name": "_totalVesting",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 504,
                    "src": "6589:13:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 812,
                  "id": 814,
                  "nodeType": "Return",
                  "src": "6582:20:4"
                }
              ]
            },
            "documentation": "@return The total amount of tokens currently vested",
            "id": 816,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "totalVesting",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 809,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "6511:2:4"
            },
            "returnParameters": {
              "id": 812,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 811,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 816,
                  "src": "6559:7:4",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 810,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "6559:7:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "6558:9:4"
            },
            "scope": 862,
            "src": "6490:119:4",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 860,
              "nodeType": "Block",
              "src": "7773:585:4",
              "statements": [
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 828,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 825,
                      "name": "time",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 820,
                      "src": "7885:4:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "<",
                    "rightExpression": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "id": 826,
                        "name": "grant",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 818,
                        "src": "7892:5:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Grant_$496_memory_ptr",
                          "typeString": "struct VestingTrustee.Grant memory"
                        }
                      },
                      "id": 827,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "cliff",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 489,
                      "src": "7892:11:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "7885:18:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 832,
                  "nodeType": "IfStatement",
                  "src": "7881:57:4",
                  "trueBody": {
                    "id": 831,
                    "nodeType": "Block",
                    "src": "7905:33:4",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "hexValue": "30",
                          "id": 829,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "7926:1:4",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        },
                        "functionReturnParameters": 824,
                        "id": 830,
                        "nodeType": "Return",
                        "src": "7919:8:4"
                      }
                    ]
                  }
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 836,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 833,
                      "name": "time",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 820,
                      "src": "8038:4:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": ">=",
                    "rightExpression": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "id": 834,
                        "name": "grant",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 818,
                        "src": "8046:5:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Grant_$496_memory_ptr",
                          "typeString": "struct VestingTrustee.Grant memory"
                        }
                      },
                      "id": 835,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "end",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 491,
                      "src": "8046:9:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "8038:17:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 841,
                  "nodeType": "IfStatement",
                  "src": "8034:66:4",
                  "trueBody": {
                    "id": 840,
                    "nodeType": "Block",
                    "src": "8057:43:4",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 837,
                            "name": "grant",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 818,
                            "src": "8078:5:4",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_Grant_$496_memory_ptr",
                              "typeString": "struct VestingTrustee.Grant memory"
                            }
                          },
                          "id": 838,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "value",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 485,
                          "src": "8078:11:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 824,
                        "id": 839,
                        "nodeType": "Return",
                        "src": "8071:18:4"
                      }
                    ]
                  }
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 855,
                              "name": "grant",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 818,
                              "src": "8338:5:4",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Grant_$496_memory_ptr",
                                "typeString": "struct VestingTrustee.Grant memory"
                              }
                            },
                            "id": 856,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "start",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 487,
                            "src": "8338:11:4",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          ],
                          "expression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 852,
                              "name": "grant",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 818,
                              "src": "8324:5:4",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Grant_$496_memory_ptr",
                                "typeString": "struct VestingTrustee.Grant memory"
                              }
                            },
                            "id": 853,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "end",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 491,
                            "src": "8324:9:4",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 854,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "sub",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 2501,
                          "src": "8324:13:4",
                          "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": 857,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "8324:26:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 847,
                                  "name": "grant",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 818,
                                  "src": "8306:5:4",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_Grant_$496_memory_ptr",
                                    "typeString": "struct VestingTrustee.Grant memory"
                                  }
                                },
                                "id": 848,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "start",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 487,
                                "src": "8306:11:4",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "id": 845,
                                "name": "time",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 820,
                                "src": "8297:4:4",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 846,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sub",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 2501,
                              "src": "8297:8:4",
                              "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": 849,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "8297:21:4",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          ],
                          "expression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 842,
                              "name": "grant",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 818,
                              "src": "8281:5:4",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Grant_$496_memory_ptr",
                                "typeString": "struct VestingTrustee.Grant memory"
                              }
                            },
                            "id": 843,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "value",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 485,
                            "src": "8281:11:4",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 844,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "mul",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 2453,
                          "src": "8281:15:4",
                          "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": 850,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "8281:38:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "id": 851,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "div",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 2477,
                      "src": "8281:42:4",
                      "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": 858,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "8281:70:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 824,
                  "id": 859,
                  "nodeType": "Return",
                  "src": "8274:77:4"
                }
              ]
            },
            "documentation": "@dev Calculate amount of vested tokens at a given time for a given grant.\n Note that this function does not take into account any previously claimed\n tokens - it is the responsibility of the caller function to ensure that\n the grant holder does not claim the same value multiple times.\n @param grant Grant The vesting grant\n @param time uint256 The time to be checked\n @return An uint256 representing the amount of claimable tokens\n     *   |                         ____________ total value\n  |                       _/\n  |                     _/\n  |                   _/\n  |                 _/\n  |                /\n  |              .|\n  |            .  |\n  |          .    |\n  |        .      |\n  |      .        |\n  |    .          |\n  +===+===========+---------+----------> time\n    Start       Cliff      End",
            "id": 861,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_calculateClaimableTokens",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 821,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 818,
                  "name": "grant",
                  "nodeType": "VariableDeclaration",
                  "scope": 861,
                  "src": "7667:18:4",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_Grant_$496_memory_ptr",
                    "typeString": "struct VestingTrustee.Grant"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 817,
                    "name": "Grant",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 496,
                    "src": "7667:5:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_Grant_$496_storage_ptr",
                      "typeString": "struct VestingTrustee.Grant"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 820,
                  "name": "time",
                  "nodeType": "VariableDeclaration",
                  "scope": 861,
                  "src": "7695:12:4",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 819,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "7695:7:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "7657:56:4"
            },
            "returnParameters": {
              "id": 824,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 823,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 861,
                  "src": "7760:7:4",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 822,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "7760:7:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "7759:9:4"
            },
            "scope": 862,
            "src": "7623:735:4",
            "stateMutability": "pure",
            "superFunction": null,
            "visibility": "private"
          }
        ],
        "scope": 863,
        "src": "489:7871:4"
      }
    ],
    "src": "162:8199:4"
  },
  "legacyAST": {
    "absolutePath": "/Users/thomasvanderstraeten/code/hey/mainchain/contracts/VestingTrustee.sol",
    "exportedSymbols": {
      "VestingTrustee": [
        862
      ]
    },
    "id": 863,
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 475,
        "literals": [
          "solidity",
          "^",
          "0.5",
          ".0"
        ],
        "nodeType": "PragmaDirective",
        "src": "162:23:4"
      },
      {
        "absolutePath": "openzeppelin-solidity/contracts/token/ERC20/IERC20.sol",
        "file": "openzeppelin-solidity/contracts/token/ERC20/IERC20.sol",
        "id": 476,
        "nodeType": "ImportDirective",
        "scope": 863,
        "sourceUnit": 3215,
        "src": "187:64:4",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "openzeppelin-solidity/contracts/ownership/Ownable.sol",
        "file": "openzeppelin-solidity/contracts/ownership/Ownable.sol",
        "id": 477,
        "nodeType": "ImportDirective",
        "scope": 863,
        "sourceUnit": 2656,
        "src": "252:63:4",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "openzeppelin-solidity/contracts/math/SafeMath.sol",
        "file": "openzeppelin-solidity/contracts/math/SafeMath.sol",
        "id": 478,
        "nodeType": "ImportDirective",
        "scope": 863,
        "sourceUnit": 2547,
        "src": "316:59:4",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "baseContracts": [
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 479,
              "name": "Ownable",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 2655,
              "src": "516:7:4",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_Ownable_$2655",
                "typeString": "contract Ownable"
              }
            },
            "id": 480,
            "nodeType": "InheritanceSpecifier",
            "src": "516:7:4"
          }
        ],
        "contractDependencies": [
          2655
        ],
        "contractKind": "contract",
        "documentation": "@title VestingTrustee\n@dev Lends very heavily from SirinLab and Stox's own VestingTrustee contracts.",
        "fullyImplemented": true,
        "id": 862,
        "linearizedBaseContracts": [
          862,
          2655
        ],
        "name": "VestingTrustee",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "id": 483,
            "libraryName": {
              "contractScope": null,
              "id": 481,
              "name": "SafeMath",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 2546,
              "src": "565:8:4",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_SafeMath_$2546",
                "typeString": "library SafeMath"
              }
            },
            "nodeType": "UsingForDirective",
            "src": "559:27:4",
            "typeName": {
              "id": 482,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "578:7:4",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            }
          },
          {
            "canonicalName": "VestingTrustee.Grant",
            "id": 496,
            "members": [
              {
                "constant": false,
                "id": 485,
                "name": "value",
                "nodeType": "VariableDeclaration",
                "scope": 496,
                "src": "650:13:4",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                },
                "typeName": {
                  "id": 484,
                  "name": "uint256",
                  "nodeType": "ElementaryTypeName",
                  "src": "650:7:4",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  }
                },
                "value": null,
                "visibility": "internal"
              },
              {
                "constant": false,
                "id": 487,
                "name": "start",
                "nodeType": "VariableDeclaration",
                "scope": 496,
                "src": "673:13:4",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                },
                "typeName": {
                  "id": 486,
                  "name": "uint256",
                  "nodeType": "ElementaryTypeName",
                  "src": "673:7:4",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  }
                },
                "value": null,
                "visibility": "internal"
              },
              {
                "constant": false,
                "id": 489,
                "name": "cliff",
                "nodeType": "VariableDeclaration",
                "scope": 496,
                "src": "696:13:4",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                },
                "typeName": {
                  "id": 488,
                  "name": "uint256",
                  "nodeType": "ElementaryTypeName",
                  "src": "696:7:4",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  }
                },
                "value": null,
                "visibility": "internal"
              },
              {
                "constant": false,
                "id": 491,
                "name": "end",
                "nodeType": "VariableDeclaration",
                "scope": 496,
                "src": "719:11:4",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                },
                "typeName": {
                  "id": 490,
                  "name": "uint256",
                  "nodeType": "ElementaryTypeName",
                  "src": "719:7:4",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  }
                },
                "value": null,
                "visibility": "internal"
              },
              {
                "constant": false,
                "id": 493,
                "name": "transferred",
                "nodeType": "VariableDeclaration",
                "scope": 496,
                "src": "740:19:4",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                },
                "typeName": {
                  "id": 492,
                  "name": "uint256",
                  "nodeType": "ElementaryTypeName",
                  "src": "740:7:4",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  }
                },
                "value": null,
                "visibility": "internal"
              },
              {
                "constant": false,
                "id": 495,
                "name": "revokable",
                "nodeType": "VariableDeclaration",
                "scope": 496,
                "src": "769:14:4",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_bool",
                  "typeString": "bool"
                },
                "typeName": {
                  "id": 494,
                  "name": "bool",
                  "nodeType": "ElementaryTypeName",
                  "src": "769:4:4",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  }
                },
                "value": null,
                "visibility": "internal"
              }
            ],
            "name": "Grant",
            "nodeType": "StructDefinition",
            "scope": 862,
            "src": "627:163:4",
            "visibility": "public"
          },
          {
            "constant": false,
            "id": 500,
            "name": "grants",
            "nodeType": "VariableDeclaration",
            "scope": 862,
            "src": "825:40:4",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Grant_$496_storage_$",
              "typeString": "mapping(address => struct VestingTrustee.Grant)"
            },
            "typeName": {
              "id": 499,
              "keyType": {
                "id": 497,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "834:7:4",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              },
              "nodeType": "Mapping",
              "src": "825:26:4",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Grant_$496_storage_$",
                "typeString": "mapping(address => struct VestingTrustee.Grant)"
              },
              "valueType": {
                "contractScope": null,
                "id": 498,
                "name": "Grant",
                "nodeType": "UserDefinedTypeName",
                "referencedDeclaration": 496,
                "src": "845:5:4",
                "typeDescriptions": {
                  "typeIdentifier": "t_struct$_Grant_$496_storage_ptr",
                  "typeString": "struct VestingTrustee.Grant"
                }
              }
            },
            "value": null,
            "visibility": "public"
          },
          {
            "constant": false,
            "id": 502,
            "name": "_token",
            "nodeType": "VariableDeclaration",
            "scope": 862,
            "src": "899:21:4",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_contract$_IERC20_$3214",
              "typeString": "contract IERC20"
            },
            "typeName": {
              "contractScope": null,
              "id": 501,
              "name": "IERC20",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 3214,
              "src": "899:6:4",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_IERC20_$3214",
                "typeString": "contract IERC20"
              }
            },
            "value": null,
            "visibility": "private"
          },
          {
            "constant": false,
            "id": 504,
            "name": "_totalVesting",
            "nodeType": "VariableDeclaration",
            "scope": 862,
            "src": "987:29:4",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 503,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "987:7:4",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "value": null,
            "visibility": "private"
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 512,
            "name": "GrantCreated",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 511,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 506,
                  "indexed": true,
                  "name": "from",
                  "nodeType": "VariableDeclaration",
                  "scope": 512,
                  "src": "1117:20:4",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 505,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1117:7:4",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 508,
                  "indexed": true,
                  "name": "to",
                  "nodeType": "VariableDeclaration",
                  "scope": 512,
                  "src": "1139:18:4",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 507,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1139:7:4",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 510,
                  "indexed": false,
                  "name": "value",
                  "nodeType": "VariableDeclaration",
                  "scope": 512,
                  "src": "1159:13:4",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 509,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1159:7:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1116:57:4"
            },
            "src": "1098:76:4"
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 518,
            "name": "GrantClaimed",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 517,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 514,
                  "indexed": true,
                  "name": "holder",
                  "nodeType": "VariableDeclaration",
                  "scope": 518,
                  "src": "1198:22:4",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 513,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1198:7:4",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 516,
                  "indexed": false,
                  "name": "value",
                  "nodeType": "VariableDeclaration",
                  "scope": 518,
                  "src": "1222:13:4",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 515,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1222:7:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1197:39:4"
            },
            "src": "1179:58:4"
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 524,
            "name": "GrantRevoked",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 523,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 520,
                  "indexed": true,
                  "name": "holder",
                  "nodeType": "VariableDeclaration",
                  "scope": 524,
                  "src": "1261:22:4",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 519,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1261:7:4",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 522,
                  "indexed": false,
                  "name": "refund",
                  "nodeType": "VariableDeclaration",
                  "scope": 524,
                  "src": "1285:14:4",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 521,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1285:7:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1260:40:4"
            },
            "src": "1242:59:4"
          },
          {
            "body": {
              "id": 544,
              "nodeType": "Block",
              "src": "1575:111:4",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 536,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 531,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 526,
                              "src": "1601:5:4",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$3214",
                                "typeString": "contract IERC20"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_IERC20_$3214",
                                "typeString": "contract IERC20"
                              }
                            ],
                            "id": 530,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "1593:7:4",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": "address"
                          },
                          "id": 532,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1593:14:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "!=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 534,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "1619:1:4",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              "value": "0"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              }
                            ],
                            "id": 533,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "1611:7:4",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": "address"
                          },
                          "id": 535,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1611:10:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        },
                        "src": "1593:28:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "746f6b656e2063616e6e6f74206265207a65726f2061646472657373",
                        "id": 537,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "1623:30:4",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_78447af7d226b72aaaf03dd000a6faa0d044a521f2c2503edf33dd462ad561f3",
                          "typeString": "literal_string \"token cannot be zero address\""
                        },
                        "value": "token cannot be zero address"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_78447af7d226b72aaaf03dd000a6faa0d044a521f2c2503edf33dd462ad561f3",
                          "typeString": "literal_string \"token cannot be zero address\""
                        }
                      ],
                      "id": 529,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        3407,
                        3408
                      ],
                      "referencedDeclaration": 3408,
                      "src": "1585:7:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 538,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1585:69:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 539,
                  "nodeType": "ExpressionStatement",
                  "src": "1585:69:4"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 542,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 540,
                      "name": "_token",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 502,
                      "src": "1665:6:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IERC20_$3214",
                        "typeString": "contract IERC20"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 541,
                      "name": "token",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 526,
                      "src": "1674:5:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IERC20_$3214",
                        "typeString": "contract IERC20"
                      }
                    },
                    "src": "1665:14:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20_$3214",
                      "typeString": "contract IERC20"
                    }
                  },
                  "id": 543,
                  "nodeType": "ExpressionStatement",
                  "src": "1665:14:4"
                }
              ]
            },
            "documentation": "@dev Constructor. Initializes the ERC20 token linked to the grants.\n @param token IERC20 The address of the previously deployed ERC20 smart contract",
            "id": 545,
            "implemented": true,
            "kind": "constructor",
            "modifiers": [],
            "name": "",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 527,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 526,
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "scope": 545,
                  "src": "1537:12:4",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_IERC20_$3214",
                    "typeString": "contract IERC20"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 525,
                    "name": "IERC20",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 3214,
                    "src": "1537:6:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20_$3214",
                      "typeString": "contract IERC20"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1527:28:4"
            },
            "returnParameters": {
              "id": 528,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1575:0:4"
            },
            "scope": 862,
            "src": "1516:170:4",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 641,
              "nodeType": "Block",
              "src": "2415:1075:4",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 567,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 563,
                          "name": "to",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 547,
                          "src": "2433:2:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "!=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 565,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "2447:1:4",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              "value": "0"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              }
                            ],
                            "id": 564,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "2439:7:4",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": "address"
                          },
                          "id": 566,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2439:10:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        },
                        "src": "2433:16:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "746f2063616e6e6f74206265207a65726f2061646472657373",
                        "id": 568,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "2451:27:4",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_68fbdc27556ce8c765f4eaa1b339606086088a233ebf44019715866c27d14936",
                          "typeString": "literal_string \"to cannot be zero address\""
                        },
                        "value": "to cannot be zero address"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_68fbdc27556ce8c765f4eaa1b339606086088a233ebf44019715866c27d14936",
                          "typeString": "literal_string \"to cannot be zero address\""
                        }
                      ],
                      "id": 562,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        3407,
                        3408
                      ],
                      "referencedDeclaration": 3408,
                      "src": "2425:7:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 569,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2425:54:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 570,
                  "nodeType": "ExpressionStatement",
                  "src": "2425:54:4"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 574,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 572,
                          "name": "value",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 549,
                          "src": "2497:5:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": ">",
                        "rightExpression": {
                          "argumentTypes": null,
                          "hexValue": "30",
                          "id": 573,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "2505:1:4",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        },
                        "src": "2497:9:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "76616c7565206d7573742062652061626f76652030",
                        "id": 575,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "2508:23:4",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_779416dd6e4b18f49d0eee4e3fee49cd12c5710dc127d93bb2864d748aa98efc",
                          "typeString": "literal_string \"value must be above 0\""
                        },
                        "value": "value must be above 0"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_779416dd6e4b18f49d0eee4e3fee49cd12c5710dc127d93bb2864d748aa98efc",
                          "typeString": "literal_string \"value must be above 0\""
                        }
                      ],
                      "id": 571,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        3407,
                        3408
                      ],
                      "referencedDeclaration": 3408,
                      "src": "2489:7:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 576,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2489:43:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 577,
                  "nodeType": "ExpressionStatement",
                  "src": "2489:43:4"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 584,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 579,
                              "name": "grants",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 500,
                              "src": "2627:6:4",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Grant_$496_storage_$",
                                "typeString": "mapping(address => struct VestingTrustee.Grant storage ref)"
                              }
                            },
                            "id": 581,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 580,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 547,
                              "src": "2634:2:4",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "2627:10:4",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_Grant_$496_storage",
                              "typeString": "struct VestingTrustee.Grant storage ref"
                            }
                          },
                          "id": 582,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "value",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 485,
                          "src": "2627:16:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "argumentTypes": null,
                          "hexValue": "30",
                          "id": 583,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "2647:1:4",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        },
                        "src": "2627:21:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "6f6e6c79206f6e65206772616e74207065722061646472657373",
                        "id": 585,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "2650:28:4",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_720ead85d27ff647821f9761e732c63013c0ab291035c0dec678383e14bf523d",
                          "typeString": "literal_string \"only one grant per address\""
                        },
                        "value": "only one grant per address"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_720ead85d27ff647821f9761e732c63013c0ab291035c0dec678383e14bf523d",
                          "typeString": "literal_string \"only one grant per address\""
                        }
                      ],
                      "id": 578,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        3407,
                        3408
                      ],
                      "referencedDeclaration": 3408,
                      "src": "2619:7:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 586,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2619:60:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 587,
                  "nodeType": "ExpressionStatement",
                  "src": "2619:60:4"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "id": 595,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 591,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 589,
                            "name": "start",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 551,
                            "src": "2776:5:4",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "<=",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 590,
                            "name": "cliff",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 553,
                            "src": "2785:5:4",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "2776:14:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "&&",
                        "rightExpression": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 594,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 592,
                            "name": "cliff",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 553,
                            "src": "2794:5:4",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "<=",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 593,
                            "name": "end",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 555,
                            "src": "2803:3:4",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "2794:12:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "src": "2776:30:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "76657374696e67206461746573206d75737420626520636f6e73697374656e74",
                        "id": 596,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "2808:34:4",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_fddf95001eac8aeb7871a7941093f25ac0a544b639b29a8f456a75e1c88e44a2",
                          "typeString": "literal_string \"vesting dates must be consistent\""
                        },
                        "value": "vesting dates must be consistent"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_fddf95001eac8aeb7871a7941093f25ac0a544b639b29a8f456a75e1c88e44a2",
                          "typeString": "literal_string \"vesting dates must be consistent\""
                        }
                      ],
                      "id": 588,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        3407,
                        3408
                      ],
                      "referencedDeclaration": 3408,
                      "src": "2768:7:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 597,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2768:75:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 598,
                  "nodeType": "ExpressionStatement",
                  "src": "2768:75:4"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 610,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 602,
                              "name": "value",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 549,
                              "src": "2988:5:4",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 600,
                              "name": "_totalVesting",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 504,
                              "src": "2970:13:4",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "id": 601,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "add",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 2525,
                            "src": "2970:17:4",
                            "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": 603,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2970:24:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "<=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 607,
                                  "name": "this",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 3465,
                                  "src": "3023:4:4",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_VestingTrustee_$862",
                                    "typeString": "contract VestingTrustee"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_VestingTrustee_$862",
                                    "typeString": "contract VestingTrustee"
                                  }
                                ],
                                "id": 606,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "3015:7:4",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": "address"
                              },
                              "id": 608,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "3015:13:4",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 604,
                              "name": "_token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 502,
                              "src": "2998:6:4",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$3214",
                                "typeString": "contract IERC20"
                              }
                            },
                            "id": 605,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "balanceOf",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 3188,
                            "src": "2998:16:4",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                              "typeString": "function (address) view external returns (uint256)"
                            }
                          },
                          "id": 609,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2998:31:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "src": "2970:59:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "6772616e742063616e6e6f742065786365656420746f74616c20616d6f756e74206f6620746f6b656e7320617661696c61626c65",
                        "id": 611,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "3031:54:4",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_e1320aa96b98997101853e785b5d30dc81f76c894a615639b494619781c85730",
                          "typeString": "literal_string \"grant cannot exceed total amount of tokens available\""
                        },
                        "value": "grant cannot exceed total amount of tokens available"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_e1320aa96b98997101853e785b5d30dc81f76c894a615639b494619781c85730",
                          "typeString": "literal_string \"grant cannot exceed total amount of tokens available\""
                        }
                      ],
                      "id": 599,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        3407,
                        3408
                      ],
                      "referencedDeclaration": 3408,
                      "src": "2962:7:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 612,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2962:124:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 613,
                  "nodeType": "ExpressionStatement",
                  "src": "2962:124:4"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 625,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 614,
                        "name": "grants",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 500,
                        "src": "3128:6:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Grant_$496_storage_$",
                          "typeString": "mapping(address => struct VestingTrustee.Grant storage ref)"
                        }
                      },
                      "id": 616,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 615,
                        "name": "to",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 547,
                        "src": "3135:2:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "3128:10:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_Grant_$496_storage",
                        "typeString": "struct VestingTrustee.Grant storage ref"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 618,
                          "name": "value",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 549,
                          "src": "3168:5:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        {
                          "argumentTypes": null,
                          "id": 619,
                          "name": "start",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 551,
                          "src": "3194:5:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        {
                          "argumentTypes": null,
                          "id": 620,
                          "name": "cliff",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 553,
                          "src": "3220:5:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        {
                          "argumentTypes": null,
                          "id": 621,
                          "name": "end",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 555,
                          "src": "3244:3:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        {
                          "argumentTypes": null,
                          "hexValue": "30",
                          "id": 622,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "3274:1:4",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        },
                        {
                          "argumentTypes": null,
                          "id": 623,
                          "name": "revokable",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 557,
                          "src": "3300:9:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 617,
                        "name": "Grant",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 496,
                        "src": "3141:5:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_struct$_Grant_$496_storage_ptr_$",
                          "typeString": "type(struct VestingTrustee.Grant storage pointer)"
                        }
                      },
                      "id": 624,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "structConstructorCall",
                      "lValueRequested": false,
                      "names": [
                        "value",
                        "start",
                        "cliff",
                        "end",
                        "transferred",
                        "revokable"
                      ],
                      "nodeType": "FunctionCall",
                      "src": "3141:179:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_Grant_$496_memory",
                        "typeString": "struct VestingTrustee.Grant memory"
                      }
                    },
                    "src": "3128:192:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_Grant_$496_storage",
                      "typeString": "struct VestingTrustee.Grant storage ref"
                    }
                  },
                  "id": 626,
                  "nodeType": "ExpressionStatement",
                  "src": "3128:192:4"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 632,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 627,
                      "name": "_totalVesting",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 504,
                      "src": "3392:13:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 630,
                          "name": "value",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 549,
                          "src": "3426:5:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        ],
                        "expression": {
                          "argumentTypes": null,
                          "id": 628,
                          "name": "_totalVesting",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 504,
                          "src": "3408:13:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 629,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "add",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 2525,
                        "src": "3408:17:4",
                        "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": 631,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "3408:24:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "3392:40:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 633,
                  "nodeType": "ExpressionStatement",
                  "src": "3392:40:4"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 635,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3404,
                          "src": "3461:3:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 636,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "3461:10:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 637,
                        "name": "to",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 547,
                        "src": "3473:2:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 638,
                        "name": "value",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 549,
                        "src": "3477:5:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 634,
                      "name": "GrantCreated",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 512,
                      "src": "3448:12:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,address,uint256)"
                      }
                    },
                    "id": 639,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3448:35:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 640,
                  "nodeType": "EmitStatement",
                  "src": "3443:40:4"
                }
              ]
            },
            "documentation": "@dev Grant tokens to a specified address.\n @param to address The address to grant tokens to\n @param value uint256 The amount of tokens to be granted\n @param start uint256 The start of the vesting period in seconds since the Unix Epoch\n @param cliff uint256 The date at which the cliff occurs in seconds since the Unix Epoch\n @param end uint256 The end of the vesting period in seconds since the Unix Epoch\n @param revokable bool Whether the grant is revokable or not",
            "id": 642,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 560,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 559,
                  "name": "onlyOwner",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 2589,
                  "src": "2401:9:4",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "2401:9:4"
              }
            ],
            "name": "createGrant",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 558,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 547,
                  "name": "to",
                  "nodeType": "VariableDeclaration",
                  "scope": 642,
                  "src": "2247:10:4",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 546,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2247:7:4",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 549,
                  "name": "value",
                  "nodeType": "VariableDeclaration",
                  "scope": 642,
                  "src": "2267:13:4",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 548,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2267:7:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 551,
                  "name": "start",
                  "nodeType": "VariableDeclaration",
                  "scope": 642,
                  "src": "2290:13:4",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 550,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2290:7:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 553,
                  "name": "cliff",
                  "nodeType": "VariableDeclaration",
                  "scope": 642,
                  "src": "2313:13:4",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 552,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2313:7:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 555,
                  "name": "end",
                  "nodeType": "VariableDeclaration",
                  "scope": 642,
                  "src": "2336:11:4",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 554,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2336:7:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 557,
                  "name": "revokable",
                  "nodeType": "VariableDeclaration",
                  "scope": 642,
                  "src": "2357:14:4",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 556,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "2357:4:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2237:140:4"
            },
            "returnParameters": {
              "id": 561,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2415:0:4"
            },
            "scope": 862,
            "src": "2217:1273:4",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 695,
              "nodeType": "Block",
              "src": "3787:418:4",
              "statements": [
                {
                  "assignments": [
                    650
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 650,
                      "name": "grant",
                      "nodeType": "VariableDeclaration",
                      "scope": 695,
                      "src": "3797:19:4",
                      "stateVariable": false,
                      "storageLocation": "storage",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_Grant_$496_storage_ptr",
                        "typeString": "struct VestingTrustee.Grant"
                      },
                      "typeName": {
                        "contractScope": null,
                        "id": 649,
                        "name": "Grant",
                        "nodeType": "UserDefinedTypeName",
                        "referencedDeclaration": 496,
                        "src": "3797:5:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Grant_$496_storage_ptr",
                          "typeString": "struct VestingTrustee.Grant"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 654,
                  "initialValue": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "id": 651,
                      "name": "grants",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 500,
                      "src": "3819:6:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Grant_$496_storage_$",
                        "typeString": "mapping(address => struct VestingTrustee.Grant storage ref)"
                      }
                    },
                    "id": 653,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 652,
                      "name": "holder",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 644,
                      "src": "3826:6:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "3819:14:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_Grant_$496_storage",
                      "typeString": "struct VestingTrustee.Grant storage ref"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "3797:36:4"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 656,
                          "name": "grant",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 650,
                          "src": "3852:5:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Grant_$496_storage_ptr",
                            "typeString": "struct VestingTrustee.Grant storage pointer"
                          }
                        },
                        "id": 657,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "revokable",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 495,
                        "src": "3852:15:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "6772616e74206d757374206265207265766f6b61626c65",
                        "id": 658,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "3869:25:4",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_bc1ca1313d04b2b1ab7fef4c641f0abd9d99c8fe5f1179a9cc8d02b6c8960e1a",
                          "typeString": "literal_string \"grant must be revokable\""
                        },
                        "value": "grant must be revokable"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_bc1ca1313d04b2b1ab7fef4c641f0abd9d99c8fe5f1179a9cc8d02b6c8960e1a",
                          "typeString": "literal_string \"grant must be revokable\""
                        }
                      ],
                      "id": 655,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        3407,
                        3408
                      ],
                      "referencedDeclaration": 3408,
                      "src": "3844:7:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 659,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3844:51:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 660,
                  "nodeType": "ExpressionStatement",
                  "src": "3844:51:4"
                },
                {
                  "assignments": [
                    662
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 662,
                      "name": "refund",
                      "nodeType": "VariableDeclaration",
                      "scope": 695,
                      "src": "3906:14:4",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 661,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "3906:7:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 669,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 666,
                          "name": "grant",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 650,
                          "src": "3939:5:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Grant_$496_storage_ptr",
                            "typeString": "struct VestingTrustee.Grant storage pointer"
                          }
                        },
                        "id": 667,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "transferred",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 493,
                        "src": "3939:17:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 663,
                          "name": "grant",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 650,
                          "src": "3923:5:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Grant_$496_storage_ptr",
                            "typeString": "struct VestingTrustee.Grant storage pointer"
                          }
                        },
                        "id": 664,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "value",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 485,
                        "src": "3923:11:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "id": 665,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "sub",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 2501,
                      "src": "3923:15:4",
                      "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": 668,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3923:34:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "3906:51:4"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 675,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 670,
                      "name": "_totalVesting",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 504,
                      "src": "3967:13:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 673,
                          "name": "refund",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 662,
                          "src": "4001:6:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        ],
                        "expression": {
                          "argumentTypes": null,
                          "id": 671,
                          "name": "_totalVesting",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 504,
                          "src": "3983:13:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 672,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sub",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 2501,
                        "src": "3983:17:4",
                        "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": 674,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "3983:25:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "3967:41:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 676,
                  "nodeType": "ExpressionStatement",
                  "src": "3967:41:4"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 680,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "UnaryOperation",
                    "operator": "delete",
                    "prefix": true,
                    "src": "4018:21:4",
                    "subExpression": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 677,
                        "name": "grants",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 500,
                        "src": "4025:6:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Grant_$496_storage_$",
                          "typeString": "mapping(address => struct VestingTrustee.Grant storage ref)"
                        }
                      },
                      "id": 679,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 678,
                        "name": "holder",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 644,
                        "src": "4032:6:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "4025:14:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_Grant_$496_storage",
                        "typeString": "struct VestingTrustee.Grant storage ref"
                      }
                    },
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 681,
                  "nodeType": "ExpressionStatement",
                  "src": "4018:21:4"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 685,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3404,
                          "src": "4135:3:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 686,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "4135:10:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 687,
                        "name": "refund",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 662,
                        "src": "4147:6:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 682,
                        "name": "_token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 502,
                        "src": "4119:6:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$3214",
                          "typeString": "contract IERC20"
                        }
                      },
                      "id": 684,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "transfer",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 3156,
                      "src": "4119:15:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                        "typeString": "function (address,uint256) external returns (bool)"
                      }
                    },
                    "id": 688,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4119:35:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 689,
                  "nodeType": "ExpressionStatement",
                  "src": "4119:35:4"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 691,
                        "name": "holder",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 644,
                        "src": "4183:6:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 692,
                        "name": "refund",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 662,
                        "src": "4191:6:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 690,
                      "name": "GrantRevoked",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 524,
                      "src": "4170:12:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,uint256)"
                      }
                    },
                    "id": 693,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4170:28:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 694,
                  "nodeType": "EmitStatement",
                  "src": "4165:33:4"
                }
              ]
            },
            "documentation": "@dev Revoke the grant of tokens of a specifed address and returns tokens\n to the grant contract owner.\n @param holder address The address which will have its grant revoked.",
            "id": 696,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 647,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 646,
                  "name": "onlyOwner",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 2589,
                  "src": "3773:9:4",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "3773:9:4"
              }
            ],
            "name": "revokeGrant",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 645,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 644,
                  "name": "holder",
                  "nodeType": "VariableDeclaration",
                  "scope": 696,
                  "src": "3729:14:4",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 643,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3729:7:4",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3719:30:4"
            },
            "returnParameters": {
              "id": 648,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3787:0:4"
            },
            "scope": 862,
            "src": "3699:506:4",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 768,
              "nodeType": "Block",
              "src": "4410:925:4",
              "statements": [
                {
                  "assignments": [
                    700
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 700,
                      "name": "claimable",
                      "nodeType": "VariableDeclaration",
                      "scope": 768,
                      "src": "4556:17:4",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 699,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "4556:7:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 707,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 702,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3404,
                          "src": "4592:3:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 703,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "4592:10:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 704,
                          "name": "block",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3394,
                          "src": "4604:5:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_block",
                            "typeString": "block"
                          }
                        },
                        "id": 705,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "timestamp",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "4604:15:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 701,
                      "name": "claimableTokens",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 798,
                      "src": "4576:15:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_address_$_t_uint256_$returns$_t_uint256_$",
                        "typeString": "function (address,uint256) view returns (uint256)"
                      }
                    },
                    "id": 706,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4576:44:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "4556:64:4"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 711,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 709,
                          "name": "claimable",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 700,
                          "src": "4638:9:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "!=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "hexValue": "30",
                          "id": 710,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "4651:1:4",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        },
                        "src": "4638:14:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "6e6f20746f6b656e7320636c61696d61626c652063757272656e746c79",
                        "id": 712,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "4654:31:4",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_9b493e56a6c6560f76f84639ce4f6b5db255fe8e4a81f1200ea18314ed918897",
                          "typeString": "literal_string \"no tokens claimable currently\""
                        },
                        "value": "no tokens claimable currently"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_9b493e56a6c6560f76f84639ce4f6b5db255fe8e4a81f1200ea18314ed918897",
                          "typeString": "literal_string \"no tokens claimable currently\""
                        }
                      ],
                      "id": 708,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        3407,
                        3408
                      ],
                      "referencedDeclaration": 3408,
                      "src": "4630:7:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 713,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4630:56:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 714,
                  "nodeType": "ExpressionStatement",
                  "src": "4630:56:4"
                },
                {
                  "assignments": [
                    716
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 716,
                      "name": "grant",
                      "nodeType": "VariableDeclaration",
                      "scope": 768,
                      "src": "4697:19:4",
                      "stateVariable": false,
                      "storageLocation": "storage",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_Grant_$496_storage_ptr",
                        "typeString": "struct VestingTrustee.Grant"
                      },
                      "typeName": {
                        "contractScope": null,
                        "id": 715,
                        "name": "Grant",
                        "nodeType": "UserDefinedTypeName",
                        "referencedDeclaration": 496,
                        "src": "4697:5:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Grant_$496_storage_ptr",
                          "typeString": "struct VestingTrustee.Grant"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 721,
                  "initialValue": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "id": 717,
                      "name": "grants",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 500,
                      "src": "4719:6:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Grant_$496_storage_$",
                        "typeString": "mapping(address => struct VestingTrustee.Grant storage ref)"
                      }
                    },
                    "id": 720,
                    "indexExpression": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "id": 718,
                        "name": "msg",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3404,
                        "src": "4726:3:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_message",
                          "typeString": "msg"
                        }
                      },
                      "id": 719,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "sender",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": null,
                      "src": "4726:10:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address_payable",
                        "typeString": "address payable"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "4719:18:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_Grant_$496_storage",
                      "typeString": "struct VestingTrustee.Grant storage ref"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "4697:40:4"
                },
                {
                  "assignments": [
                    723
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 723,
                      "name": "transferable",
                      "nodeType": "VariableDeclaration",
                      "scope": 768,
                      "src": "4969:20:4",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 722,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "4969:7:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 729,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 726,
                          "name": "grant",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 716,
                          "src": "5006:5:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Grant_$496_storage_ptr",
                            "typeString": "struct VestingTrustee.Grant storage pointer"
                          }
                        },
                        "id": 727,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "transferred",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 493,
                        "src": "5006:17:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 724,
                        "name": "claimable",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 700,
                        "src": "4992:9:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "id": 725,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "sub",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 2501,
                      "src": "4992:13:4",
                      "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": 728,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4992:32:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "4969:55:4"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 733,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 731,
                          "name": "transferable",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 723,
                          "src": "5042:12:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "!=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "hexValue": "30",
                          "id": 732,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "5058:1:4",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        },
                        "src": "5042:17:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "636c61696d61626c6520616d6f756e7420616c7265616479207472616e73666572726564",
                        "id": 734,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "5061:38:4",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_cf98fc057f5734d3f8f5559dee4e9d3e4e847a59ec581e76b25c76f104fcc5c6",
                          "typeString": "literal_string \"claimable amount already transferred\""
                        },
                        "value": "claimable amount already transferred"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_cf98fc057f5734d3f8f5559dee4e9d3e4e847a59ec581e76b25c76f104fcc5c6",
                          "typeString": "literal_string \"claimable amount already transferred\""
                        }
                      ],
                      "id": 730,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        3407,
                        3408
                      ],
                      "referencedDeclaration": 3408,
                      "src": "5034:7:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 735,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5034:66:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 736,
                  "nodeType": "ExpressionStatement",
                  "src": "5034:66:4"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 745,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "id": 737,
                        "name": "grant",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 716,
                        "src": "5111:5:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Grant_$496_storage_ptr",
                          "typeString": "struct VestingTrustee.Grant storage pointer"
                        }
                      },
                      "id": 739,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberName": "transferred",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 493,
                      "src": "5111:17:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 743,
                          "name": "transferable",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 723,
                          "src": "5153:12:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        ],
                        "expression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 740,
                            "name": "grant",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 716,
                            "src": "5131:5:4",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_Grant_$496_storage_ptr",
                              "typeString": "struct VestingTrustee.Grant storage pointer"
                            }
                          },
                          "id": 741,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "transferred",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 493,
                          "src": "5131:17:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 742,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "add",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 2525,
                        "src": "5131:21:4",
                        "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": 744,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "5131:35:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "5111:55:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 746,
                  "nodeType": "ExpressionStatement",
                  "src": "5111:55:4"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 752,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 747,
                      "name": "_totalVesting",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 504,
                      "src": "5176:13:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 750,
                          "name": "transferable",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 723,
                          "src": "5210:12:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        ],
                        "expression": {
                          "argumentTypes": null,
                          "id": 748,
                          "name": "_totalVesting",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 504,
                          "src": "5192:13:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 749,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sub",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 2501,
                        "src": "5192:17:4",
                        "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": 751,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "5192:31:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "5176:47:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 753,
                  "nodeType": "ExpressionStatement",
                  "src": "5176:47:4"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 757,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3404,
                          "src": "5249:3:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 758,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "5249:10:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 759,
                        "name": "transferable",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 723,
                        "src": "5261:12:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 754,
                        "name": "_token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 502,
                        "src": "5233:6:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$3214",
                          "typeString": "contract IERC20"
                        }
                      },
                      "id": 756,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "transfer",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 3156,
                      "src": "5233:15:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                        "typeString": "function (address,uint256) external returns (bool)"
                      }
                    },
                    "id": 760,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5233:41:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 761,
                  "nodeType": "ExpressionStatement",
                  "src": "5233:41:4"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 763,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3404,
                          "src": "5303:3:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 764,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "5303:10:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 765,
                        "name": "transferable",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 723,
                        "src": "5315:12:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 762,
                      "name": "GrantClaimed",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 518,
                      "src": "5290:12:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,uint256)"
                      }
                    },
                    "id": 766,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5290:38:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 767,
                  "nodeType": "EmitStatement",
                  "src": "5285:43:4"
                }
              ]
            },
            "documentation": "@dev Claim vested tokens and transfer them to their holder. Note that\n this function has to be called by the grant holder themselves.",
            "id": 769,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "claimTokens",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 697,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "4388:2:4"
            },
            "returnParameters": {
              "id": 698,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "4410:0:4"
            },
            "scope": 862,
            "src": "4368:967:4",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 797,
              "nodeType": "Block",
              "src": "6049:173:4",
              "statements": [
                {
                  "assignments": [
                    779
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 779,
                      "name": "grant",
                      "nodeType": "VariableDeclaration",
                      "scope": 797,
                      "src": "6059:19:4",
                      "stateVariable": false,
                      "storageLocation": "storage",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_Grant_$496_storage_ptr",
                        "typeString": "struct VestingTrustee.Grant"
                      },
                      "typeName": {
                        "contractScope": null,
                        "id": 778,
                        "name": "Grant",
                        "nodeType": "UserDefinedTypeName",
                        "referencedDeclaration": 496,
                        "src": "6059:5:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Grant_$496_storage_ptr",
                          "typeString": "struct VestingTrustee.Grant"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 783,
                  "initialValue": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "id": 780,
                      "name": "grants",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 500,
                      "src": "6081:6:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Grant_$496_storage_$",
                        "typeString": "mapping(address => struct VestingTrustee.Grant storage ref)"
                      }
                    },
                    "id": 782,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 781,
                      "name": "holder",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 771,
                      "src": "6088:6:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "6081:14:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_Grant_$496_storage",
                      "typeString": "struct VestingTrustee.Grant storage ref"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "6059:36:4"
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 787,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "id": 784,
                        "name": "grant",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 779,
                        "src": "6109:5:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Grant_$496_storage_ptr",
                          "typeString": "struct VestingTrustee.Grant storage pointer"
                        }
                      },
                      "id": 785,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "value",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 485,
                      "src": "6109:11:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "argumentTypes": null,
                      "hexValue": "30",
                      "id": 786,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "6124:1:4",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "src": "6109:16:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 791,
                  "nodeType": "IfStatement",
                  "src": "6105:55:4",
                  "trueBody": {
                    "id": 790,
                    "nodeType": "Block",
                    "src": "6127:33:4",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "hexValue": "30",
                          "id": 788,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "6148:1:4",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        },
                        "functionReturnParameters": 777,
                        "id": 789,
                        "nodeType": "Return",
                        "src": "6141:8:4"
                      }
                    ]
                  }
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 793,
                        "name": "grant",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 779,
                        "src": "6203:5:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Grant_$496_storage_ptr",
                          "typeString": "struct VestingTrustee.Grant storage pointer"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 794,
                        "name": "time",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 773,
                        "src": "6210:4:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_struct$_Grant_$496_storage_ptr",
                          "typeString": "struct VestingTrustee.Grant storage pointer"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 792,
                      "name": "_calculateClaimableTokens",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 861,
                      "src": "6177:25:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_pure$_t_struct$_Grant_$496_memory_ptr_$_t_uint256_$returns$_t_uint256_$",
                        "typeString": "function (struct VestingTrustee.Grant memory,uint256) pure returns (uint256)"
                      }
                    },
                    "id": 795,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "6177:38:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 777,
                  "id": 796,
                  "nodeType": "Return",
                  "src": "6170:45:4"
                }
              ]
            },
            "documentation": "@dev Calculate the total amount of tokens that a holder can claim at a\n given time, from the total amount vested for this holder. This function\n does the precheck of making sure that there is actually a grant for this\n owner, before delegating to the private _calculateClaimableTokens()\n function to derive the claimable amount at the given time.\n @param holder address The address of the holder\n @param time uint256 The specific time\n @return a uint256 representing a holder's total amount of vested tokens",
            "id": 798,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "claimableTokens",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 774,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 771,
                  "name": "holder",
                  "nodeType": "VariableDeclaration",
                  "scope": 798,
                  "src": "5948:14:4",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 770,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "5948:7:4",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 773,
                  "name": "time",
                  "nodeType": "VariableDeclaration",
                  "scope": 798,
                  "src": "5972:12:4",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 772,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "5972:7:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "5938:52:4"
            },
            "returnParameters": {
              "id": 777,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 776,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 798,
                  "src": "6036:7:4",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 775,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "6036:7:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "6035:9:4"
            },
            "scope": 862,
            "src": "5914:308:4",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 807,
              "nodeType": "Block",
              "src": "6368:39:4",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 804,
                        "name": "_token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 502,
                        "src": "6393:6:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$3214",
                          "typeString": "contract IERC20"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_contract$_IERC20_$3214",
                          "typeString": "contract IERC20"
                        }
                      ],
                      "id": 803,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "lValueRequested": false,
                      "nodeType": "ElementaryTypeNameExpression",
                      "src": "6385:7:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_type$_t_address_$",
                        "typeString": "type(address)"
                      },
                      "typeName": "address"
                    },
                    "id": 805,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "typeConversion",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "6385:15:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "functionReturnParameters": 802,
                  "id": 806,
                  "nodeType": "Return",
                  "src": "6378:22:4"
                }
              ]
            },
            "documentation": "@return The address of the vested token",
            "id": 808,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "token",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 799,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "6307:2:4"
            },
            "returnParameters": {
              "id": 802,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 801,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 808,
                  "src": "6355:7:4",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 800,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "6355:7:4",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "6354:9:4"
            },
            "scope": 862,
            "src": "6293:114:4",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 815,
              "nodeType": "Block",
              "src": "6572:37:4",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 813,
                    "name": "_totalVesting",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 504,
                    "src": "6589:13:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 812,
                  "id": 814,
                  "nodeType": "Return",
                  "src": "6582:20:4"
                }
              ]
            },
            "documentation": "@return The total amount of tokens currently vested",
            "id": 816,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "totalVesting",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 809,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "6511:2:4"
            },
            "returnParameters": {
              "id": 812,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 811,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 816,
                  "src": "6559:7:4",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 810,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "6559:7:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "6558:9:4"
            },
            "scope": 862,
            "src": "6490:119:4",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 860,
              "nodeType": "Block",
              "src": "7773:585:4",
              "statements": [
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 828,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 825,
                      "name": "time",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 820,
                      "src": "7885:4:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "<",
                    "rightExpression": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "id": 826,
                        "name": "grant",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 818,
                        "src": "7892:5:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Grant_$496_memory_ptr",
                          "typeString": "struct VestingTrustee.Grant memory"
                        }
                      },
                      "id": 827,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "cliff",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 489,
                      "src": "7892:11:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "7885:18:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 832,
                  "nodeType": "IfStatement",
                  "src": "7881:57:4",
                  "trueBody": {
                    "id": 831,
                    "nodeType": "Block",
                    "src": "7905:33:4",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "hexValue": "30",
                          "id": 829,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "7926:1:4",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        },
                        "functionReturnParameters": 824,
                        "id": 830,
                        "nodeType": "Return",
                        "src": "7919:8:4"
                      }
                    ]
                  }
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 836,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 833,
                      "name": "time",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 820,
                      "src": "8038:4:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": ">=",
                    "rightExpression": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "id": 834,
                        "name": "grant",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 818,
                        "src": "8046:5:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Grant_$496_memory_ptr",
                          "typeString": "struct VestingTrustee.Grant memory"
                        }
                      },
                      "id": 835,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "end",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 491,
                      "src": "8046:9:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "8038:17:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 841,
                  "nodeType": "IfStatement",
                  "src": "8034:66:4",
                  "trueBody": {
                    "id": 840,
                    "nodeType": "Block",
                    "src": "8057:43:4",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 837,
                            "name": "grant",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 818,
                            "src": "8078:5:4",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_Grant_$496_memory_ptr",
                              "typeString": "struct VestingTrustee.Grant memory"
                            }
                          },
                          "id": 838,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "value",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 485,
                          "src": "8078:11:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 824,
                        "id": 839,
                        "nodeType": "Return",
                        "src": "8071:18:4"
                      }
                    ]
                  }
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 855,
                              "name": "grant",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 818,
                              "src": "8338:5:4",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Grant_$496_memory_ptr",
                                "typeString": "struct VestingTrustee.Grant memory"
                              }
                            },
                            "id": 856,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "start",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 487,
                            "src": "8338:11:4",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          ],
                          "expression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 852,
                              "name": "grant",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 818,
                              "src": "8324:5:4",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Grant_$496_memory_ptr",
                                "typeString": "struct VestingTrustee.Grant memory"
                              }
                            },
                            "id": 853,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "end",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 491,
                            "src": "8324:9:4",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 854,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "sub",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 2501,
                          "src": "8324:13:4",
                          "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": 857,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "8324:26:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 847,
                                  "name": "grant",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 818,
                                  "src": "8306:5:4",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_Grant_$496_memory_ptr",
                                    "typeString": "struct VestingTrustee.Grant memory"
                                  }
                                },
                                "id": 848,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "start",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 487,
                                "src": "8306:11:4",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "id": 845,
                                "name": "time",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 820,
                                "src": "8297:4:4",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 846,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sub",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 2501,
                              "src": "8297:8:4",
                              "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": 849,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "8297:21:4",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          ],
                          "expression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 842,
                              "name": "grant",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 818,
                              "src": "8281:5:4",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Grant_$496_memory_ptr",
                                "typeString": "struct VestingTrustee.Grant memory"
                              }
                            },
                            "id": 843,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "value",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 485,
                            "src": "8281:11:4",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 844,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "mul",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 2453,
                          "src": "8281:15:4",
                          "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": 850,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "8281:38:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "id": 851,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "div",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 2477,
                      "src": "8281:42:4",
                      "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": 858,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "8281:70:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 824,
                  "id": 859,
                  "nodeType": "Return",
                  "src": "8274:77:4"
                }
              ]
            },
            "documentation": "@dev Calculate amount of vested tokens at a given time for a given grant.\n Note that this function does not take into account any previously claimed\n tokens - it is the responsibility of the caller function to ensure that\n the grant holder does not claim the same value multiple times.\n @param grant Grant The vesting grant\n @param time uint256 The time to be checked\n @return An uint256 representing the amount of claimable tokens\n     *   |                         ____________ total value\n  |                       _/\n  |                     _/\n  |                   _/\n  |                 _/\n  |                /\n  |              .|\n  |            .  |\n  |          .    |\n  |        .      |\n  |      .        |\n  |    .          |\n  +===+===========+---------+----------> time\n    Start       Cliff      End",
            "id": 861,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_calculateClaimableTokens",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 821,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 818,
                  "name": "grant",
                  "nodeType": "VariableDeclaration",
                  "scope": 861,
                  "src": "7667:18:4",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_Grant_$496_memory_ptr",
                    "typeString": "struct VestingTrustee.Grant"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 817,
                    "name": "Grant",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 496,
                    "src": "7667:5:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_Grant_$496_storage_ptr",
                      "typeString": "struct VestingTrustee.Grant"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 820,
                  "name": "time",
                  "nodeType": "VariableDeclaration",
                  "scope": 861,
                  "src": "7695:12:4",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 819,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "7695:7:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "7657:56:4"
            },
            "returnParameters": {
              "id": 824,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 823,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 861,
                  "src": "7760:7:4",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 822,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "7760:7:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "7759:9:4"
            },
            "scope": 862,
            "src": "7623:735:4",
            "stateMutability": "pure",
            "superFunction": null,
            "visibility": "private"
          }
        ],
        "scope": 863,
        "src": "489:7871:4"
      }
    ],
    "src": "162:8199:4"
  },
  "compiler": {
    "name": "solc",
    "version": "0.5.0+commit.1d4f565a.Emscripten.clang"
  },
  "networks": {
    "1543575271380": {
      "events": {
        "0xe59554161f63f82606fec58f135843633f78733cf852ac15d6cb86ff84f5a05c": {
          "anonymous": false,
          "inputs": [
            {
              "indexed": true,
              "name": "from",
              "type": "address"
            },
            {
              "indexed": true,
              "name": "to",
              "type": "address"
            },
            {
              "indexed": false,
              "name": "value",
              "type": "uint256"
            }
          ],
          "name": "GrantCreated",
          "type": "event"
        },
        "0x2aa1d398fac8a867531b04feb1273747a6f1ec3d4700f40a2901dce75363edc0": {
          "anonymous": false,
          "inputs": [
            {
              "indexed": true,
              "name": "holder",
              "type": "address"
            },
            {
              "indexed": false,
              "name": "value",
              "type": "uint256"
            }
          ],
          "name": "GrantClaimed",
          "type": "event"
        },
        "0x740528a7c317c81f0923adc30df75db3f448298c78cdaf548adfcfdb3c84ff6f": {
          "anonymous": false,
          "inputs": [
            {
              "indexed": true,
              "name": "holder",
              "type": "address"
            },
            {
              "indexed": false,
              "name": "refund",
              "type": "uint256"
            }
          ],
          "name": "GrantRevoked",
          "type": "event"
        },
        "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0": {
          "anonymous": false,
          "inputs": [
            {
              "indexed": true,
              "name": "previousOwner",
              "type": "address"
            },
            {
              "indexed": true,
              "name": "newOwner",
              "type": "address"
            }
          ],
          "name": "OwnershipTransferred",
          "type": "event"
        }
      },
      "links": {},
      "address": "0x73274404b92684ee16b3c238ca77b14dcbf391ac",
      "transactionHash": "0x8c18cd56f7204795e6ce8e78eb523de30b9a02c754287b68802013cac2792613"
    },
    "1543575362424": {
      "events": {
        "0xe59554161f63f82606fec58f135843633f78733cf852ac15d6cb86ff84f5a05c": {
          "anonymous": false,
          "inputs": [
            {
              "indexed": true,
              "name": "from",
              "type": "address"
            },
            {
              "indexed": true,
              "name": "to",
              "type": "address"
            },
            {
              "indexed": false,
              "name": "value",
              "type": "uint256"
            }
          ],
          "name": "GrantCreated",
          "type": "event"
        },
        "0x2aa1d398fac8a867531b04feb1273747a6f1ec3d4700f40a2901dce75363edc0": {
          "anonymous": false,
          "inputs": [
            {
              "indexed": true,
              "name": "holder",
              "type": "address"
            },
            {
              "indexed": false,
              "name": "value",
              "type": "uint256"
            }
          ],
          "name": "GrantClaimed",
          "type": "event"
        },
        "0x740528a7c317c81f0923adc30df75db3f448298c78cdaf548adfcfdb3c84ff6f": {
          "anonymous": false,
          "inputs": [
            {
              "indexed": true,
              "name": "holder",
              "type": "address"
            },
            {
              "indexed": false,
              "name": "refund",
              "type": "uint256"
            }
          ],
          "name": "GrantRevoked",
          "type": "event"
        },
        "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0": {
          "anonymous": false,
          "inputs": [
            {
              "indexed": true,
              "name": "previousOwner",
              "type": "address"
            },
            {
              "indexed": true,
              "name": "newOwner",
              "type": "address"
            }
          ],
          "name": "OwnershipTransferred",
          "type": "event"
        }
      },
      "links": {},
      "address": "0x20cd07d53a417643eaef92fe339cae4e14855b43",
      "transactionHash": "0xd11e51e8208a6f6f80f125b4e730c911a4fcc504f654bcd4f2041f6eed69c88e"
    },
    "1543582128197": {
      "events": {
        "0xe59554161f63f82606fec58f135843633f78733cf852ac15d6cb86ff84f5a05c": {
          "anonymous": false,
          "inputs": [
            {
              "indexed": true,
              "name": "from",
              "type": "address"
            },
            {
              "indexed": true,
              "name": "to",
              "type": "address"
            },
            {
              "indexed": false,
              "name": "value",
              "type": "uint256"
            }
          ],
          "name": "GrantCreated",
          "type": "event"
        },
        "0x2aa1d398fac8a867531b04feb1273747a6f1ec3d4700f40a2901dce75363edc0": {
          "anonymous": false,
          "inputs": [
            {
              "indexed": true,
              "name": "holder",
              "type": "address"
            },
            {
              "indexed": false,
              "name": "value",
              "type": "uint256"
            }
          ],
          "name": "GrantClaimed",
          "type": "event"
        },
        "0x740528a7c317c81f0923adc30df75db3f448298c78cdaf548adfcfdb3c84ff6f": {
          "anonymous": false,
          "inputs": [
            {
              "indexed": true,
              "name": "holder",
              "type": "address"
            },
            {
              "indexed": false,
              "name": "refund",
              "type": "uint256"
            }
          ],
          "name": "GrantRevoked",
          "type": "event"
        },
        "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0": {
          "anonymous": false,
          "inputs": [
            {
              "indexed": true,
              "name": "previousOwner",
              "type": "address"
            },
            {
              "indexed": true,
              "name": "newOwner",
              "type": "address"
            }
          ],
          "name": "OwnershipTransferred",
          "type": "event"
        }
      },
      "links": {},
      "address": "0x8d77caaa3c6c0f1f8c12383a930fc35ca2a4d746",
      "transactionHash": "0x8c175ebf390524ff4eff78b965bb3d99f19a1eff9c910bda806f52d4491503c5"
    },
    "1543582216163": {
      "events": {
        "0xe59554161f63f82606fec58f135843633f78733cf852ac15d6cb86ff84f5a05c": {
          "anonymous": false,
          "inputs": [
            {
              "indexed": true,
              "name": "from",
              "type": "address"
            },
            {
              "indexed": true,
              "name": "to",
              "type": "address"
            },
            {
              "indexed": false,
              "name": "value",
              "type": "uint256"
            }
          ],
          "name": "GrantCreated",
          "type": "event"
        },
        "0x2aa1d398fac8a867531b04feb1273747a6f1ec3d4700f40a2901dce75363edc0": {
          "anonymous": false,
          "inputs": [
            {
              "indexed": true,
              "name": "holder",
              "type": "address"
            },
            {
              "indexed": false,
              "name": "value",
              "type": "uint256"
            }
          ],
          "name": "GrantClaimed",
          "type": "event"
        },
        "0x740528a7c317c81f0923adc30df75db3f448298c78cdaf548adfcfdb3c84ff6f": {
          "anonymous": false,
          "inputs": [
            {
              "indexed": true,
              "name": "holder",
              "type": "address"
            },
            {
              "indexed": false,
              "name": "refund",
              "type": "uint256"
            }
          ],
          "name": "GrantRevoked",
          "type": "event"
        },
        "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0": {
          "anonymous": false,
          "inputs": [
            {
              "indexed": true,
              "name": "previousOwner",
              "type": "address"
            },
            {
              "indexed": true,
              "name": "newOwner",
              "type": "address"
            }
          ],
          "name": "OwnershipTransferred",
          "type": "event"
        }
      },
      "links": {},
      "address": "0xfe0ba76f4995dc2281fac5c8066db7e849d8a218",
      "transactionHash": "0xfc17160a89d38587ccc6a1bd98ab8696b1ef947986a52e5f0a03a259c26e4b60"
    },
    "1543582360302": {
      "events": {
        "0xe59554161f63f82606fec58f135843633f78733cf852ac15d6cb86ff84f5a05c": {
          "anonymous": false,
          "inputs": [
            {
              "indexed": true,
              "name": "from",
              "type": "address"
            },
            {
              "indexed": true,
              "name": "to",
              "type": "address"
            },
            {
              "indexed": false,
              "name": "value",
              "type": "uint256"
            }
          ],
          "name": "GrantCreated",
          "type": "event"
        },
        "0x2aa1d398fac8a867531b04feb1273747a6f1ec3d4700f40a2901dce75363edc0": {
          "anonymous": false,
          "inputs": [
            {
              "indexed": true,
              "name": "holder",
              "type": "address"
            },
            {
              "indexed": false,
              "name": "value",
              "type": "uint256"
            }
          ],
          "name": "GrantClaimed",
          "type": "event"
        },
        "0x740528a7c317c81f0923adc30df75db3f448298c78cdaf548adfcfdb3c84ff6f": {
          "anonymous": false,
          "inputs": [
            {
              "indexed": true,
              "name": "holder",
              "type": "address"
            },
            {
              "indexed": false,
              "name": "refund",
              "type": "uint256"
            }
          ],
          "name": "GrantRevoked",
          "type": "event"
        },
        "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0": {
          "anonymous": false,
          "inputs": [
            {
              "indexed": true,
              "name": "previousOwner",
              "type": "address"
            },
            {
              "indexed": true,
              "name": "newOwner",
              "type": "address"
            }
          ],
          "name": "OwnershipTransferred",
          "type": "event"
        }
      },
      "links": {},
      "address": "0x7c976740e31a1a69b1d404d5c10afaa852fb48be",
      "transactionHash": "0x4f3f6ad99919ef9ba81e13b1456e6c9f069fd8b6ec14ad2e2cea9a0c46af3860"
    },
    "1543583471841": {
      "events": {
        "0xe59554161f63f82606fec58f135843633f78733cf852ac15d6cb86ff84f5a05c": {
          "anonymous": false,
          "inputs": [
            {
              "indexed": true,
              "name": "from",
              "type": "address"
            },
            {
              "indexed": true,
              "name": "to",
              "type": "address"
            },
            {
              "indexed": false,
              "name": "value",
              "type": "uint256"
            }
          ],
          "name": "GrantCreated",
          "type": "event"
        },
        "0x2aa1d398fac8a867531b04feb1273747a6f1ec3d4700f40a2901dce75363edc0": {
          "anonymous": false,
          "inputs": [
            {
              "indexed": true,
              "name": "holder",
              "type": "address"
            },
            {
              "indexed": false,
              "name": "value",
              "type": "uint256"
            }
          ],
          "name": "GrantClaimed",
          "type": "event"
        },
        "0x740528a7c317c81f0923adc30df75db3f448298c78cdaf548adfcfdb3c84ff6f": {
          "anonymous": false,
          "inputs": [
            {
              "indexed": true,
              "name": "holder",
              "type": "address"
            },
            {
              "indexed": false,
              "name": "refund",
              "type": "uint256"
            }
          ],
          "name": "GrantRevoked",
          "type": "event"
        },
        "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0": {
          "anonymous": false,
          "inputs": [
            {
              "indexed": true,
              "name": "previousOwner",
              "type": "address"
            },
            {
              "indexed": true,
              "name": "newOwner",
              "type": "address"
            }
          ],
          "name": "OwnershipTransferred",
          "type": "event"
        }
      },
      "links": {},
      "address": "0xf52320dd5288405571766d251aeaf899a88cea5c",
      "transactionHash": "0xce3a8a6844795b73bb0736b2e6f7337b3cb0005bb4a98c42f363d77aad7f2d61"
    },
    "1543584071380": {
      "events": {
        "0xe59554161f63f82606fec58f135843633f78733cf852ac15d6cb86ff84f5a05c": {
          "anonymous": false,
          "inputs": [
            {
              "indexed": true,
              "name": "from",
              "type": "address"
            },
            {
              "indexed": true,
              "name": "to",
              "type": "address"
            },
            {
              "indexed": false,
              "name": "value",
              "type": "uint256"
            }
          ],
          "name": "GrantCreated",
          "type": "event"
        },
        "0x2aa1d398fac8a867531b04feb1273747a6f1ec3d4700f40a2901dce75363edc0": {
          "anonymous": false,
          "inputs": [
            {
              "indexed": true,
              "name": "holder",
              "type": "address"
            },
            {
              "indexed": false,
              "name": "value",
              "type": "uint256"
            }
          ],
          "name": "GrantClaimed",
          "type": "event"
        },
        "0x740528a7c317c81f0923adc30df75db3f448298c78cdaf548adfcfdb3c84ff6f": {
          "anonymous": false,
          "inputs": [
            {
              "indexed": true,
              "name": "holder",
              "type": "address"
            },
            {
              "indexed": false,
              "name": "refund",
              "type": "uint256"
            }
          ],
          "name": "GrantRevoked",
          "type": "event"
        },
        "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0": {
          "anonymous": false,
          "inputs": [
            {
              "indexed": true,
              "name": "previousOwner",
              "type": "address"
            },
            {
              "indexed": true,
              "name": "newOwner",
              "type": "address"
            }
          ],
          "name": "OwnershipTransferred",
          "type": "event"
        }
      },
      "links": {},
      "address": "0xf4c86ea0d971c3a9229a4c4e895e7a1cf02eaa48",
      "transactionHash": "0xa9386656ea5d155f8b74f7e139f4af7a9069cfcba74c7abed9a6328b77d782f2"
    },
    "1543585014304": {
      "events": {
        "0xe59554161f63f82606fec58f135843633f78733cf852ac15d6cb86ff84f5a05c": {
          "anonymous": false,
          "inputs": [
            {
              "indexed": true,
              "name": "from",
              "type": "address"
            },
            {
              "indexed": true,
              "name": "to",
              "type": "address"
            },
            {
              "indexed": false,
              "name": "value",
              "type": "uint256"
            }
          ],
          "name": "GrantCreated",
          "type": "event"
        },
        "0x2aa1d398fac8a867531b04feb1273747a6f1ec3d4700f40a2901dce75363edc0": {
          "anonymous": false,
          "inputs": [
            {
              "indexed": true,
              "name": "holder",
              "type": "address"
            },
            {
              "indexed": false,
              "name": "value",
              "type": "uint256"
            }
          ],
          "name": "GrantClaimed",
          "type": "event"
        },
        "0x740528a7c317c81f0923adc30df75db3f448298c78cdaf548adfcfdb3c84ff6f": {
          "anonymous": false,
          "inputs": [
            {
              "indexed": true,
              "name": "holder",
              "type": "address"
            },
            {
              "indexed": false,
              "name": "refund",
              "type": "uint256"
            }
          ],
          "name": "GrantRevoked",
          "type": "event"
        },
        "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0": {
          "anonymous": false,
          "inputs": [
            {
              "indexed": true,
              "name": "previousOwner",
              "type": "address"
            },
            {
              "indexed": true,
              "name": "newOwner",
              "type": "address"
            }
          ],
          "name": "OwnershipTransferred",
          "type": "event"
        }
      },
      "links": {},
      "address": "0xf9cc15f9092b3ad1d6f0b05281c7da6ed3b64d42",
      "transactionHash": "0xa744f7d8cba721d6e8ee099716d2efed3025b3be7d023af1422bff4c6e245bf4"
    }
  },
  "schemaVersion": "3.0.2",
  "updatedAt": "2019-02-28T16:14:49.629Z",
  "devdoc": {
    "details": "Lends very heavily from SirinLab and Stox's own VestingTrustee contracts.",
    "methods": {
      "claimTokens()": {
        "details": "Claim vested tokens and transfer them to their holder. Note that this function has to be called by the grant holder themselves."
      },
      "claimableTokens(address,uint256)": {
        "details": "Calculate the total amount of tokens that a holder can claim at a given time, from the total amount vested for this holder. This function does the precheck of making sure that there is actually a grant for this owner, before delegating to the private _calculateClaimableTokens() function to derive the claimable amount at the given time.",
        "params": {
          "holder": "address The address of the holder",
          "time": "uint256 The specific time"
        },
        "return": "a uint256 representing a holder's total amount of vested tokens"
      },
      "constructor": {
        "details": "Constructor. Initializes the ERC20 token linked to the grants.",
        "params": {
          "token": "IERC20 The address of the previously deployed ERC20 smart contract"
        }
      },
      "createGrant(address,uint256,uint256,uint256,uint256,bool)": {
        "details": "Grant tokens to a specified address.",
        "params": {
          "cliff": "uint256 The date at which the cliff occurs in seconds since the Unix Epoch",
          "end": "uint256 The end of the vesting period in seconds since the Unix Epoch",
          "revokable": "bool Whether the grant is revokable or not",
          "start": "uint256 The start of the vesting period in seconds since the Unix Epoch",
          "to": "address The address to grant tokens to",
          "value": "uint256 The amount of tokens to be granted"
        }
      },
      "isOwner()": {
        "return": "true if `msg.sender` is the owner of the contract."
      },
      "owner()": {
        "return": "the address of the owner."
      },
      "renounceOwnership()": {
        "details": "Allows the current owner to relinquish control of the contract."
      },
      "revokeGrant(address)": {
        "details": "Revoke the grant of tokens of a specifed address and returns tokens to the grant contract owner.",
        "params": {
          "holder": "address The address which will have its grant revoked."
        }
      },
      "token()": {
        "return": "The address of the vested token"
      },
      "totalVesting()": {
        "return": "The total amount of tokens currently vested"
      },
      "transferOwnership(address)": {
        "details": "Allows the current owner to transfer control of the contract to a newOwner.",
        "params": {
          "newOwner": "The address to transfer ownership to."
        }
      }
    },
    "title": "VestingTrustee"
  },
  "userdoc": {
    "methods": {
      "renounceOwnership()": {
        "notice": "Renouncing to ownership will leave the contract without an owner. It will not be possible to call the functions with the `onlyOwner` modifier anymore."
      }
    }
  }
}