Use this file to discover all available pages before exploring further.
Solana’s memo program lets you attach invoice numbers, order IDs, or custom references
to any payment. These memos are permanently recorded on-chain and visible in transaction
logs, making it easy to match payments to your internal systems.
Use just like with SPL token:
SPL
Light
Transfer
createTransferInstruction()
createTransferInterfaceInstructions()
Agent skill
Use the payments agent skill to add light-token payment support to your project:
Create the transfer instructions with createTransferInterfaceInstructions(). Load transactions are handled under the hood.
Create a memo instruction with a message. This message will be visible in the program logs of the transaction.
Both instructions execute atomically in the same transaction.
After the transaction confirms, fetch it to view the memo in the logs. The memo appears as a log message from the Memo program.
About loading: Light Token accounts reduce account rent ~200x by auto-compressing inactive
accounts. Before any action, the SDK detects cold balances and adds
instructions to load them. This almost always fits in a single
atomic transaction with your regular transfer. APIs return TransactionInstruction[][]
so the same
loop handles the rare multi-transaction case automatically.
SDK 2.0 (@lightprotocol/token-interface) is the latest JavaScript SDK.
It has better API ergonomics, guarantees single-instruction loading, and is
compatible with KIT (the new Solana SDKs).
import { Keypair, Transaction, sendAndConfirmTransaction,} from "@solana/web3.js";import { createTransferInterfaceInstructions } from "@lightprotocol/compressed-token/unified";import { createMemoInstruction } from "@solana/spl-memo";import { rpc, payer, setup } from "../setup.js";(async function () { const { mint } = await setup(); const recipient = Keypair.generate(); const instructions = await createTransferInterfaceInstructions( rpc, payer.publicKey, mint, 100, payer.publicKey, recipient.publicKey ); // Append memo to the transfer transaction (last batch) const memoIx = createMemoInstruction("INV-2024-001"); instructions[instructions.length - 1].push(memoIx); let signature; for (const ixs of instructions) { const tx = new Transaction().add(...ixs); signature = await sendAndConfirmTransaction(rpc, tx, [payer]); } console.log("Tx with memo:", signature); // Read memo back from transaction logs const txDetails = await rpc.getTransaction(signature!, { maxSupportedTransactionVersion: 0, }); const logs = txDetails?.meta?.logMessages || []; const memoLogs = logs.filter((log: string) => log.includes("Program MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr") ); console.log("Memo logs:", memoLogs);})();
---description: Integrate light-token APIs for stablecoin paymentsallowed-tools: Bash, Read, Write, Edit, Glob, Grep, WebFetch, AskUserQuestion, Task, TaskCreate, TaskGet, TaskList, TaskUpdate, TaskOutput, mcp__deepwiki, mcp__zkcompression---## Integrate light-token APIs for stablecoin paymentsContext:- Guide: https://zkcompression.com/light-token/payments/overview- Skills and resources index: https://zkcompression.com/skill.md- SPL to Light reference: https://zkcompression.com/api-reference/solana-to-light-comparison- Dedicated skill: https://github.com/Lightprotocol/skills/tree/main/skills/payments- Packages: @lightprotocol/compressed-token, @lightprotocol/stateless.js- Import from @lightprotocol/compressed-token/unified for all interface APIsSPL → Light Token API mapping:| Operation | SPL | Light Token || Receive | getOrCreateAssociatedTokenAccount() | createLoadAtaInstructions() / loadAta() || Transfer | createTransferInstruction() | createTransferInterfaceInstructions() || Delegated Transfer | transfer() (delegate signs) | transferInterface(..., ownerPubkey, delegateSigner, ...) || Get Balance | getAccount() | getAtaInterface() || Tx History | getSignaturesForAddress() | getSignaturesForOwnerInterface() || Wrap SPL | N/A | createWrapInstruction() / wrap() || Unwrap | N/A | createUnwrapInstructions() / unwrap() |### 1. Index project- Grep `@solana/spl-token|@lightprotocol|createTransferInstruction|getAccount|Connection|Keypair|stablecoin|payment` across src/- Glob `**/*.ts` and `**/*.tsx` for project structure- Identify: RPC setup, existing token operations, payment flow, wallet signing pattern- Check package.json for existing @lightprotocol/* or @solana/spl-token dependencies- Task subagent (Grep/Read/WebFetch) if project has multiple packages to scan in parallel### 2. Read references- WebFetch the guide above — review Instruction and Action tabs for each operation- WebFetch skill.md — check for a dedicated skill and resources matching this task- TaskCreate one todo per phase below to track progress### 3. Clarify intention- AskUserQuestion: what is the goal? (new payment integration, migrate existing SPL payment flow, add alongside existing SPL)- AskUserQuestion: which operations? (receive, send, balance, history, wrap, unwrap — or all)- AskUserQuestion: instruction-level API (build your own transactions) or action-level API (high-level, fewer lines)?- Summarize findings and wait for user confirmation before implementing### 4. Create plan- Based on steps 1–3, draft an implementation plan: which files to modify, what code to add, dependency changes- Verify existing connection/signer setup is compatible (createRpc with ZK Compression endpoint)- Key pattern: import from `@lightprotocol/compressed-token/unified` for all interface APIs- If anything is unclear or ambiguous, loop back to step 3 (AskUserQuestion)- Present the plan to the user for approval before proceeding### 5. Implement- Add deps if missing: Bash `npm install @lightprotocol/compressed-token @lightprotocol/stateless.js`- Set up RPC: `createRpc(RPC_ENDPOINT)` with a ZK Compression endpoint (Helius, Triton)- Import from `@lightprotocol/compressed-token/unified` for the interface APIs- Follow the guide and the approved plan- Write/Edit to create or modify files- TaskUpdate to mark each step done### 6. Verify- Bash `tsc --noEmit`- Bash run existing test suite if present- TaskUpdate to mark complete### Tools- mcp__zkcompression__SearchLightProtocol("<query>") for API details- mcp__deepwiki__ask_question("Lightprotocol/light-protocol", "<q>") for architecture- Task subagent with Grep/Read/WebFetch for parallel lookups- TaskList to check remaining work### ResourcesGuides:- Basic payment: https://zkcompression.com/light-token/payments/basic-payment- Batch payments: https://zkcompression.com/light-token/payments/batch-payments- Payment with memo: https://zkcompression.com/light-token/payments/payment-with-memo- Receive payments: https://zkcompression.com/light-token/payments/receive-payments- Verify payments: https://zkcompression.com/light-token/payments/verify-payments- Verify recipient address: https://zkcompression.com/light-token/payments/verify-recipient-address- Spend permissions: https://zkcompression.com/light-token/payments/spend-permissions- Wrap and unwrap: https://zkcompression.com/light-token/payments/wrap-unwrap- Production readiness: https://zkcompression.com/light-token/payments/production-readiness- FAQ: https://zkcompression.com/faq- Sign with Privy: https://zkcompression.com/light-token/wallets/privy- Sign with Wallet Adapter: https://zkcompression.com/light-token/wallets/wallet-adapter- Gasless transactions: https://zkcompression.com/light-token/wallets/gasless-transactionsExamples:- All payments: https://github.com/Lightprotocol/examples-light-token/tree/main/toolkits/payments- Send (instruction): https://github.com/Lightprotocol/examples-light-token/blob/main/toolkits/payments/send/basic-send-instruction.ts- Send (action): https://github.com/Lightprotocol/examples-light-token/blob/main/toolkits/payments/send/basic-send-action.ts- Batch send: https://github.com/Lightprotocol/examples-light-token/blob/main/toolkits/payments/send/batch-send.ts- Payment with memo: https://github.com/Lightprotocol/examples-light-token/blob/main/toolkits/payments/send/payment-with-memo.ts- Receive: https://github.com/Lightprotocol/examples-light-token/blob/main/toolkits/payments/receive/receive.ts- Get balance: https://github.com/Lightprotocol/examples-light-token/blob/main/toolkits/payments/verify/get-balance.ts- Get history: https://github.com/Lightprotocol/examples-light-token/blob/main/toolkits/payments/verify/get-history.ts- Verify address: https://github.com/Lightprotocol/examples-light-token/blob/main/toolkits/payments/verify/verify-address.ts- Wrap: https://github.com/Lightprotocol/examples-light-token/blob/main/toolkits/payments/interop/wrap.ts- Unwrap: https://github.com/Lightprotocol/examples-light-token/blob/main/toolkits/payments/interop/unwrap.ts- Privy (Node.js): https://github.com/Lightprotocol/examples-light-token/tree/main/toolkits/sign-with-privy/nodejs- Privy (React): https://github.com/Lightprotocol/examples-light-token/tree/main/toolkits/sign-with-privy/react- Wallet Adapter (React): https://github.com/Lightprotocol/examples-light-token/tree/main/toolkits/sign-with-wallet-adapter/react- Gasless transfer: https://github.com/Lightprotocol/examples-light-token/blob/main/toolkits/gasless-transactions/typescript/gasless-transfer.ts