Stake pool is designed to support general staking as well as enable the concept of stake receipts.
While their NFT is staked, this feature allows a user to either 1) continue holding the actual NFT in their wallet or 2) hold a dynamic copy NFT representing the stake.
- When staking using the original receipt type, the user's token(s) will be locked into the staker's wallet, and the stake timer will begin.
- This allows users to continue holding their tokens while they're staked which can be advantageous for several reasons including allowing them to continue participating in DAOs and gated discord servers.
- While it does sit in their wallet, the token is frozen while it is staked and thus cannot be traded/sent to anyone else. The locked aspect of staking that projects hope to achieve is thus not compromised in any way.
- In order to unstake, this locked token must first be unfrozen and returned to the stake pool. The current implementation leverages the Cardinal Token Manager and the invalidation type of "Return". The way this works is that upon staking, the token is issued back to the staker from the stake pool with an associated Token Manager wrapper. Then, when the user decides to unstake, the token manager is invalidated, and the token is programatically returned back to the pool. Now back in the pool and unwrapped, the token can be freely claimed by user. The client abstracts this invalidation and return inside of the unstake api.
- Optionally, the user can also claim a generated, dynamic NFT receipt.
- Using stake type of receipt, a new copy NFT will be transferred to user. The receipt metadata is dynamic by default and uses the Cardinal metadata and img-generators hosted at https://api.cardinal.so/metadata and https://api.cardinal.so/img respectively.
- This approach is additionally beneficial because the receipt can be clearly identified in the wallet as a staked NFT rather than a just locked one because of the mutable and dynamic nature of its metadata that allows for relevant markers/metrics to be displayed.
- The current staker can unstake at any time which increments the stake timer for that mint.
- Any unstaking requires returning the receipt before the unstake instruction can be called. This can be done via the Cardinal Token Manager with 'InvalidationType::Return'. Similar to how returning locked tokens works, this is handled automatically by the client unstake api.
- Here's an example featuring Jambo Mambos. The Jambo on the left is not currently staked, while the Jambo on the right is training in the level-up stake pool and will reach level 1 on 4/18/22 at 04:53 GMT.