Token Wrap
A program for wrapping SPL tokens to enable interoperability between token standards. If you are building an app with a mint/token and find yourself wishing you could take advantage of some of the latest features of a specific token program, this might be for you!
Features
- Bidirectional Wrapping: Convert tokens between SPL Token and SPL Token 2022 standards in either direction, including conversions between different SPL Token 2022 mints.
- SPL Token 2022 Extension Support: Preserve or add SPL Token 2022 extensions (like transfer fees, confidential
transfers, etc.) during the wrapping process. Note: this requires forking and updating the
CreateMint
instruction. - Transfer Hook Compatibility: Integrates with tokens that implement the SPL Transfer Hook interface, enabling custom logic on token transfers.
- Multisignature Support: Compatible with multisig signers for both wrapping and unwrapping operations.
How It Works
It supports three primary operations:
-
CreateMint
: This operation initializes a new wrapped token mint and its associated backpointer account. Note, the caller must pre-fund this account with lamports. This is to avoid requiring writer+signer privileges on this instruction.- Wrapped Mint: An SPL Token or SPL Token 2022 mint account is created. The address of this mint is a PDA derived from the unwrapped token's mint address and the wrapped token program ID. This ensures a unique, deterministic relationship between the wrapped and unwrapped tokens. The wrapped mint's authority is also a PDA, controlled by the Token Wrap program.
- Backpointer: An account (also a PDA, derived from the wrapped mint address) is created to store the address of the original unwrapped token mint. This allows anyone to easily determine the unwrapped token corresponding to a wrapped token, facilitating unwrapping.
-
Wrap
: This operation accepts deposits of unwrapped tokens and mints wrapped tokens.- Unwrapped tokens are transferred from the user's account to an escrow account owned by the wrapped mint authority (different for every mint). Any unwrapped token account whose owner is a PDA controlled by the Token Wrap program can be used.
- An equivalent amount of wrapped tokens is minted to the user's wrapped token account.
-
Unwrap
: This operation burns wrapped tokens and releases unwrapped token deposits.- Wrapped tokens are burned from the user's wrapped token account.
- An equivalent amount of unwrapped tokens is transferred from the escrow account to the user's unwrapped token account.
The 1:1 relationship between wrapped and unwrapped tokens is maintained through the escrow mechanism, ensuring that wrapped tokens are always fully backed by their unwrapped counterparts.
Permissionless design
The SPL Token Wrap program is designed to be permissionless. This means:
- Anyone can create a wrapped mint: No special permissions or whitelisting is required to create a wrapped
version of an existing mint. The
CreateMint
instruction is open to all users, provided they can pay the required rent for the new accounts. - Anyone can wrap and unwrap tokens: Once a wrapped mint has been created, any user holding the underlying
unwrapped tokens can use the
Wrap
andUnwrap
instructions. All transfers are controlled by PDAs owned by the Token Wrap program itself. However, it is important to note that if the unwrapped token has a freeze authority, that freeze authority is preserved in the wrapped token.
Source
The Token Wrap Program's source is available on GitHub.
Security Audits
The Token Wrap program is currently undergoing an audit with Zellic & Runtime Verification.
SDK
- Rust Crate: The program is written in Rust and available as the
spl-token-wrap
crate on crates.io and docs.rs. - JavaScript bindings for web development: @solana-program/token-wrap (source).
- Command-Line Interface (CLI): The
spl-token-wrap-cli
utility allows direct interaction with the program via the command line for testing, scripting, or manual operations.
Reference Guide
Setup
The spl-token-wrap command-line utility can be used to interact with the Token Wrap program.
Install from crates.io
or, build the CLI from source:
Run spl-token-wrap --help
for a full description of available commands.
The spl-token-wrap configuration is shared with the solana command-line tool.
Create a wrapped token mint
To create a new wrapped token mint, first you need to identify the unwrapped token mint address you want to wrap and the to/from token programs.
Find PDAs for a wrapped token
To interact with wrapped tokens, you need to know the PDAs (Program Derived Addresses) associated with them:
Create escrow account
Before wrapping tokens, you need to create an account to hold the unwrapped tokens. The escrow account's owner must be the correct PDA (see find-pdas
command above). There is also a helper to create this account:
Wrap tokens (single signer)
Escrows unwrapped tokens and mints wrapped tokens to recipient account.
You can specify a recipient token account with the --recipient-token-account
option. If not provided, the associated token account of the fee payer will be used or created if it doesn't exist.
Wrap tokens (SPL Token Multisig)
An example wrapping tokens whose origin is a token account owned by an SPL Token multisig.
There are two parts to this. The first is having the multisig members sign the message independently. The second is the broadcaster collecting those signatures and sending the transaction to the network.
Let's pretend we have a 2 of 3 multisig and the broadcaster will be the fee payer. Here's what that would look like:
Get a recent blockhash. This will need to be the same for all signers.
First signer runs this command with their keypair:
Second signer uses their own keypair (note the change at the top):
Now the broadcaster (and in this case, the fee payer as well) sends the last message with the Pubkey=Signature
they have collected from Signer 1 and Signer 2:
Note all three needed signers in final broadcasted message.
Unwrap tokens (single signer)
Burns wrapped tokens and releases unwrapped tokens from escrow.
Unwrap tokens (SPL Token Multisig)
An example unwrapping tokens whose origin is a token account owned by an SPL Token multisig.
There are two parts to this. The first is having the multisig members sign the message independently. The second is the broadcaster collecting those signatures and sending the transaction to the network.
Let's pretend we have a 2 of 3 multisig and the broadcaster will be the fee payer. Here's what that would look like:
Get a recent blockhash. This will need to be the same for all signers.
First signer runs this command with their keypair:
Second signer uses their own keypair (note the change at the top):
Now the broadcaster (and in this case, the fee payer as well) sends the last message with the Pubkey=Signature
they have collected from Signer 1 and Signer 2:
Note all three needed signers in final broadcasted message.