#8 - Deep Dive into Anchor by Implementing Token Management Program
Last updated
Last updated
Author: @ironaddicteddog, @emersonliuuu
[Updated at 2022.5.21]
You can find the full code base here
There is a comprehensive explanation on the official website. Let me just quote relative paragraphs here:
Anchor is a framework for Solana's Sealevel runtime providing several convenient developer tools.
If you're familiar with developing in Ethereum's Solidity, Truffle, web3.js, then the experience will be familiar. Although the DSL syntax and semantics are targeted at Solana, the high level flow of writing RPC request handlers, emitting an IDL, and generating clients from IDL is the same.
In short, Anchor gives you the following handy tools for developing Solana programs:
Rust crates and eDSL for writing Solana programs
IDL specification
TypeScript package for generating clients from IDL
CLI and workspace management for developing complete applications
You can watch this awesome talk given by Armani Ferrante at Breakpoint 2021 to feel the power of Anchor.
Develop the program (Smart Contract)
Build the program and export the IDL
Generate the client representation of program from the IDL to interact with the program
Anchor is the new standard
Productivity
Make Solana program more intuitive to understand
More clear buisness Logic
Remove a ton of biolderplate code
Security
Use discriminator
Discriminator is generated and inserted into the first 8 bytes of account data. Ex: sha256("account:<MyAccountName>")[..8] || borsh(account_struct)
Used for more secure account validation and function dispatch
See this Twitter thread for more details
Implement most of the best practices of secure program
Note: These programs are originated from Serum's stake program developed by Armani Ferrante. There are a few things evolved from the original version:
Upgrade Anchor to latest version (Currently 0.24.2
)
Optimize some function invocation to avoid stack frame limit
Rename struct and module to make them better reveal its designed purpose
In short, token management consist of two modules:
Locker Manager, which manages the vesting of locked tokens
Pool Manager, which manages the mining of rewarded tokens
Token vesting and mining are two fundenmental components of DeFi tokenomics
There are existed solutions.
Bonfida vesting
Quarry
...
anchor-token-management
intergates vesting and mining modules and has the following features:
Written in Anchor
Modular and customizable condition of releasing rewards
Control funds even if its locked in locker. For example: desposit to pool from locker. (Not covered in this tutorial)
Create Locker
Withdraw
Create Pool
Drop Reward
Expired Reward
Create Staker
Update Staker Vault
Deposit
Withdraw
Stake
Start Unstake
End Unstake
Claim Reward
Claim Reward to Locker
Basic layouts of Anchor programs
program
context
state
error
...
Anchor Constraints
[account(mut)]
[account(init)]
...
Token Program
Token Account
Mint
Transfer
Burn
PDA account creation and derivation
Access control
CPI usage
Custimized Error
Checkout to step-1
branch to see the full code
In this step, we scaffold the programs by following the interfaces explained above:
Implement LockerManager
Implement PoolManager
Implement PoolRewardKeeper
Checkout to step-2
branch to see the full code
In this step, we implement all the functions, context and states without concerning the security issues:
Add all contexts and states
Add utils
calculator
RewardQueue
Add constraints
PDA creation and derivation
has_one
Raw constraints
...
Tips: you can use
git diff
to see what changes have been made:
Checkout to step-3
branch to see the full code
In this step, we improve the security:
Implement access control and security check
Customize error
Tips: you can use
git diff
to see what changes have been made:
Control funds even if its locked in locker. For example: desposit to pool from locker. See the full code base for details.
withdraw_to_whitelist
deposit_from_locker
withdraw_to_locker
https://book.anchor-lang.com
https://solanacookbook.com
https://book.solmeet.dev/notes/intro-to-anchor
https://github.com/project-serum/stake/blob/master/docs/staking.md
https://docs.rs/anchor-lang/0.24.2/anchor_lang/derive.Accounts.html