# VestingLib
## What is this library?
VestingLib is a tiny library for computing a vesting schedule for a beneficiary. Developers can initialize a Vesting object by passing in the configuration parameters and compute the total amount of tokens that can be released for the beneficiary.
## Why did you create this library?
I'm doing a begineer's workshop on Anchor programmin at [Solana Breakpoint 2022](https://solana.com/breakpoint). I'll be covering basic Solana concepts by going through a practical example: creating a token vesting contract. I want the class to focus on the Solana concepts and less on the math/business logic - so I created this library to abstract the core vesting calculation away from the students.
Students can import this library and focus more on developing the Solana program.
## Example
Below is some sample code of how the library is to be used:
```rust
use std::time::{SystemTime, UNIX_EPOCH};
use vestinglib::{Vesting, CanInitialize, VestingInitParams, GetReleasableAmountParams };
// Initialize a vesting instance based on the vesting parameters
let vesting_schedule = Vesting::from_init_params(&VestingInitParams {
cliff_seconds: 31560000, // One year in seconds
duration_seconds: 126240000, // Four years in seconds
seconds_per_slice: 2592000, // One month in seconds,
start_unix: 1585181904, // Grant start time
already_issued_token_amount: 0, // No tokens were already issued
grant_token_amount: 100, // Grant is 100 tokens
revoked: false, // If true, marks grant as revoked
})?;
// Get the current time
let current_time_unix = SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_secs();
// Returns the amount releasable by the owner of the grant.
let releasable_amount = vesting_schedule.get_releasable_amount(&GetReleasableAmountParams{
current_time_unix,
})?;
```