LayerZero V2 Solana OFT Program
The Solana OFT, Endpoint, and ULN Programs are currently in Mainnet Beta!
The Omnichain Fungible Token (OFT) Standard allows fungible tokens to be transferred across multiple blockchains without asset wrapping or middlechains.
This standard works by either debiting (burn
/ lock
) tokens on the source chain whenever an omnichain transfer is initiated, sending a message via the protocol, and delivering a function call to the destination contract to credit (mint
/ unlock
) the same number of tokens debited. This creates a unified supply across all networks LayerZero supports that the OFT is deployed on.
OFT Standard
OFT Adapter Standard
While the typical path for Solana program development involves interacting with or deploying executable code that defines your specific implementation, and then minting accounts that want to use that interface (e.g., the SPL Token Program), the OFT Program is different in this respect.
Because every Solana Program has an Upgrade Authority, and this authority can change or modify the implementation of all child accounts, developers wishing to create cross-chain tokens on Solana should deploy their own instance of the OFT Program to mint new OFT Config Accounts, so that you own their OFT's Upgrade Authority.
Requirements
To ensure compatibility and smooth operation, please use the following versions:
- Solana CLI:
1.17.31
- Anchor:
0.29.0
You can find the sample codebase in the LayerZero Developer Tools Repo.
Enable Code Example
LZ_ENABLE_EXPERIMENTAL_SOLANA_OFT_EXAMPLE=1 npx create-lz-oapp@latest
Install Dependencies
pnpm install
Generate Program Keypairs
Create program keypair files if they do not exist:
cd packages/solana/contracts
solana-keygen new -o target/deploy/endpoint-keypair.json
solana-keygen new -o target/deploy/oft-keypair.json
anchor keys sync
Build & Test
Install dependencies, build the program, and run tests to ensure everything is set up correctly:
yarn && yarn build && yarn test
Verify
Navigate to the contract directory to start the verification process. This ensures that the program binaries are correct and verifiable:
cd packages/solana/contracts
With Anchor
Use Anchor to build and verify the program:
anchor build --verifiable
With Solana-Verify
Alternatively, you can use Solana-Verify to build and verify the program:
solana-verify build
Deploy
Navigate to the contract directory to prepare for deployment:
cd packages/solana/contracts
With Anchor
Deploy the program using Anchor. This uploads the program binary to the Solana blockchain and assigns it the specified program ID:
solana program deploy --program-id target/deploy/oft-keypair.json target/verifiable/oft.so -u mainnet-beta
After deployment, you can check that your program deployed successfully by running:
$ solana program show --programs --url RPC_URL --keypair deployer-keypair.json
Program Id | Slot | Authority | Balance
CKsfN2UvdF6BxWmt12576GN4EtLynA7MxSqEm6jrCqMh | 279715124 | 6tzUZqC33igPgP7YyDnUxQg6eupMmZGRGKdVAksgRzvk | 8.24730072 SOL
With Solana-Verify
Deploy the program using Solana-Verify. This also uploads the program binary to the Solana blockchain:
solana program deploy --program-id target/deploy/oft-keypair.json target/deploy/oft.so -u mainnet-beta
For more details, please visit Solana Verify CLI and Deploy a Solana Program with the CLI.
If you encounter issues during compilation and testing, it might be due to the versions of Solana and Anchor. You can switch to Solana version 1.17.31 and Anchor version 0.29.0, as these are the versions we have tested and verified to be working.
Minting OFT Config Accounts
After successful program deployment, you can now use the program to create either a Solana OFT Native Account or Solana OFT Adapter Account.
Troubleshooting
Retrying Failed Transactions
If a transaction fails, it may be due to network congestion or other temporary issues. You can retry the transaction by resubmitting it. Ensure that you have enough SOL in your account to cover the transaction fees.
Recovering Failed Rent
solana program close --buffers --keypair deployer-keypair.json -u mainnet-beta