> For the complete documentation index, see [llms.txt](https://manablast.gitbook.io/manablast/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://manablast.gitbook.io/manablast/tech-docs/markdown.md).

# Manablast Program Docs

Program interacte with native Solana Stake Program, but instead of staking rewards you receive Quote Tokens **$MANA** that you can spend for more fast transactions over our lite-rpc node.

### General **MANA tokens**

Once you stake sol - program creates two accounts where storing data about your stake:

* `StakeAccountInfo` struct stores info about position in native stake program
* `StakeInfo` struct stores info about your stake in our program

#### Accounts signatures:

```
StakeAccountInfo {
  stake: pubkey,
  amount: u64,
}
```

```
StakeInfo {
  start_count_date: i64,
  stop_count_date: Option<i64>
  spent_charges: u64,
  saved_charges: u64,
  last_charge_date: Option<i64>
  restorable_charges: u64,
  amount: u64,
  stake_quantity: u16,
}
```

* Every replenish will creates additional `StakeAccountInfo`, because native stake program doesn\`t support increasing stake amount for stake in active state and we handle it in sepatare stake accounts. After you unstake and withdraw your funds all `StakeAccountInfo` will be closed.
* Such as `StakeInfo` stores info about your Quote MANA it will not be closed after withdrawal and still exists while you have at least 1 Quote MANA. Rent for this accont is about 0.0015 sol, and it will be returned after spending all Quote MANA.
* TODO: implement closing `StakeInfo` account by user initiative with losing Quote MANA

### Instructions

* `Stake`

  Creates stake account and invoke native stake program that delegate whole balance to validator

  Parameters:

  * `amount: u64`

  Accounts:

  * `payer` \[SIGNER]
  * `stake` \[SIGNER]
  * `vote`
* `Replenish`

  Increase summary stake amount with creating separate stake account and delegate it to validator

  Parameters:

  * `amount: u64`

  Accounts:

  * `payer` \[SIGNER]
  * `stake` \[SIGNER]
  * `vote`
* `Unstake`

  Deactivate stake account. To deactivate whole stake you should bundle this instruction for every opened account in one transaction

  Accounts:

  * `payer` \[SIGNER]
  * `stake`
* `Withdraw`

  Withdraw funds from stake account to your wallet. Can be used only after stake goes to deactivated state. To withdraw whole stake amount you should bundle this instruction for every opened account in one transaction

  Accounts:

  * `payer` \[SIGNER]
  * `stake`
* `Charge`

  Calculates your current Quote MANA, check ability to make transaction, and update info about spent MANA

  Accounts:

  * `payer`

### PDAs & Authority

* `Stake` and `Replenish` instuctions must be signed both by user and stake accounts. Further authority moves to `StakeInfo` PDA, that can be fetched by `seeds = ["stake", <user_pubkey>]`.
* `StakeAccountInfo` PDA can be fetch with `seeds = ["stake", <user_pubkey>, <index>]`. Such as user could have several stake accounts we use `<index>` seed to iterate over it.
* `GlobalConfig` PDA contains info about MANA\` calculation rules and can be fetched by `seeds = ["global_config"]`.

### Calculations

`GlobalConfig` signature:

```
GlobalConfig {
  rewards_recipient: Pubkey,
  charges_per_day: u64,
  charges_per_tx: u64,
  restorable_charges: u64,
}
```

Also there is logic for restorable MANA. While you have active stake, MANA for the first transaction per day wil be refunded over 1 day.

$MANA Token calculation examples:

```
// Calculate rewards for staking
((now - ctx.accounts.authority.start_count_date) / DAY_MS) as u64 * ctx.accounts.config.charges_per_day;

// Calculate spent MANA
ctx.accounts.authority.spent_charges - ctx.accounts.authority.restorable_charges;

// Calculate available MANA
ctx.accounts.authority.saved_charges + stake_rewards - spent_charges
```

Once you replenish or unstake, info about your stake collapled to single `StakeInfo` account. Available MANA moves to `saved_charges` and count starts from current MANA in replenish case.
