Il programma memo di Solana ti consente di allegare numeri di fattura, ID ordine o riferimenti personalizzati a qualsiasi pagamento. Questi memo vengono registrati permanentemente on-chain e sono visibili nei log delle transazioni, rendendo facile abbinare i pagamenti ai tuoi sistemi interni.
Come funziona
Il programma Memo scrive testo nei log della transazione. Questi log sono indicizzati da explorer e provider RPC, rendendo i memo ricercabili per la riconciliazione dei pagamenti.
Vedi Come funzionano i pagamenti su Solana per i concetti fondamentali sui pagamenti.
Aggiungere un memo richiede la costruzione diretta delle istruzioni, il che ti dà il controllo su ciò che viene incluso nella transazione.
I passaggi seguenti mostrano il flusso principale. Vedi la Demo per il codice completo eseguibile.
Importa il programma Memo
Importa getAddMemoInstruction da @solana-program/memo per creare istruzioni
memo.
Crea l'istruzione di trasferimento
Crea l'istruzione di trasferimento token specificando l'ATA di origine, l'ATA di destinazione, l'autorità (firmatario) e l'importo in unità base.
Crea l'istruzione Memo
Crea un'istruzione memo con un messaggio. Questo messaggio sarà visibile nei log del programma della transazione.
Invia la transazione con memo
Combina le istruzioni di trasferimento e memo in un'unica transazione.
Visualizza il memo nei log delle transazioni
Dopo la conferma della transazione, recuperala per visualizzare il memo nei log. Il memo appare come messaggio di log dal programma Memo.
"Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb invoke [1]","Program log: Instruction: Transfer","Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb consumed 1682 of 200000 compute units","Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb success","Program MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr invoke [1]",'Program log: Memo (len 46): "Payment for services rendered - Invoice #12345"',"Program MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr consumed 18097 of 198318 compute units","Program MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr success","Program ComputeBudget111111111111111111111111111111 invoke [1]","Program ComputeBudget111111111111111111111111111111 success"
Demo
// Generate keypairs for sender and recipientconst sender = (await generateKeypair()).signer;const recipient = (await generateKeypair()).signer;console.log("Sender Address:", sender.address);console.log("Recipient Address:", recipient.address);// Demo Setup: Create client, mint account, token accounts, and fund with initial tokensconst { client, mint } = await demoSetup(sender, recipient);console.log("\nMint Address:", mint.address);// Derive the Associated Token Accounts addresses (ATAs) for sender and recipientconst [senderAta] = await findAssociatedTokenPda({mint: mint.address,owner: sender.address,tokenProgram: TOKEN_2022_PROGRAM_ADDRESS});const [recipientAta] = await findAssociatedTokenPda({mint: mint.address,owner: recipient.address,tokenProgram: TOKEN_2022_PROGRAM_ADDRESS});console.log("Sender Token Account:", senderAta.toString());console.log("Recipient Token Account:", recipientAta.toString());// =============================================================================// Token Payment with Memo Demo// =============================================================================// Create instruction to transfer tokens from sender to recipient// Transferring 250,000 base units = 0.25 tokens (with 6 decimals)const transferInstruction = getTransferInstruction({source: senderAta,destination: recipientAta,authority: sender.address,amount: 250_000n // 0.25 tokens});// Create instruction to add a memo to the transactionconst memoInstruction = getAddMemoInstruction({memo: "Payment for services rendered - Invoice #12345"});// Prepare and send transaction with both transfer and memo using @solana/clientconst signature = await client.transaction.prepareAndSend({authority: sender,instructions: [transferInstruction, memoInstruction],version: 0});console.log("\n=== Token Payment with Memo Complete ===");console.log("Transaction Signature:", signature.toString());// Fetch final token account balances using @solana/client SPL token helperconst splToken = client.splToken({mint: mint.address,tokenProgram: "auto"});const senderBalance = await splToken.fetchBalance(sender.address);const recipientBalance = await splToken.fetchBalance(recipient.address);console.log("\nSender Token Account Balance:", senderBalance);console.log("Recipient Token Account Balance:", recipientBalance);// Fetch transaction details to view the memo in the logsconst transaction = await client.runtime.rpc.getTransaction(signature, {encoding: "jsonParsed",maxSupportedTransactionVersion: 0}).send();console.log("\nTransaction logs with Memo:");console.log(transaction?.meta?.logMessages);// =============================================================================// Demo Setup Helper Function// =============================================================================
Is this page helpful?