Solana обеспечивает мгновенные глобальные переводы токенов с комиссиями менее $0.001. Независимо от того, строите ли вы сервис для международных переводов, выплат зарплаты или казначейских операций, базовый платёж в стейблкоинах проводится менее чем за секунду и стоит лишь доли цента.
Как это работает
Платёж переводит стейблкоины с токен-аккаунта отправителя на токен-аккаунт получателя. Если получатель впервые получает этот токен, его токен-аккаунт может быть создан в рамках той же транзакции.
Подробнее о ключевых концепциях платежей читайте в разделе Как работают платежи в Solana.
Плагин token2022Program() из @solana-program/token-2022 расширяет ваш клиент
@solana/kit вспомогательным объектом
client.token2022. Его метод transferToATA автоматически обрабатывает
деривацию ATA и построение транзакций, что идеально подходит для единичных
платёжных переводов.
Ниже приведены основные этапы процесса. Полный рабочий код смотрите в разделе Демо.
Создайте токен-хелпер
Добавьте плагин token2022Program() к вашему клиенту с помощью
.use(token2022Program()). Это открывает доступ к client.token2022, чьи
instructions предоставляют методы для стандартных операций с токенами.
Используйте token2022Program() для минтов, принадлежащих программе Token-2022,
или tokenProgram() из @solana-program/token для минтов, принадлежащих
оригинальному Token Program.
Отправьте платёж
Используйте transferToATA() для перевода токенов между кошельками. Метод
обрабатывает:
- Разрешение ATA: Автоматически определяет Associated Token Accounts (ATA) для отправителя и получателя. Если ATA получателя не существует, инструкция по созданию аккаунта автоматически добавляется в ту же транзакцию.
- Проверяемые суммы: Передайте
amountв базовых единицах вместе сdecimalsминта. Перевод проверяется относительно десятичных знаков минта on-chain (например, 250000 базовых единиц -> 0.25 токена, если минт имеет 6 десятичных знаков) - Построение транзакции:
sendTransaction()строит, подписывает и отправляет транзакцию, возвращая результат, чьё полеcontext.signatureсодержит подпись транзакции
Проверка балансов
После завершения перевода считайте балансы токенов из RPC. Определите ATA
каждого кошелька с помощью findAssociatedTokenPda(), затем вызовите
getTokenAccountBalance() для получения баланса этого аккаунта.
Демонстрация
// Generate signers for sender and recipientconst sender = await generateKeyPairSigner();const recipient = await generateKeyPairSigner();console.log("Sender Address:", sender.address);console.log("Recipient Address:", recipient.address);// Demo Setup: Create client, mint account, and fund the sender with initial tokensconst { client, mint } = await demoSetup(sender);console.log("\nMint Address:", mint.address);// =============================================================================// Basic Token Payment Demo// =============================================================================// Transfer tokens from sender to recipient. The source and destination ATAs are// derived automatically, and the recipient's ATA is created if it does not exist.const result = await client.token2022.instructions.transferToATA({mint: mint.address,authority: sender,recipient: recipient.address,amount: 250_000n, // 0.25 tokens (base units for a mint with 6 decimals)decimals: 6}).sendTransaction();console.log("\n=== Token Payment Complete ===");console.log("Transaction Signature:", result.context.signature);// Derive the sender and recipient ATAs to read their balancesconst [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});// Fetch final token account balances via RPCconst senderBalance = await client.rpc.getTokenAccountBalance(senderAta).send();const recipientBalance = await client.rpc.getTokenAccountBalance(recipientAta).send();console.log("\nSender Token Account Balance:",senderBalance.value.uiAmountString);console.log("Recipient Token Account Balance:",recipientBalance.value.uiAmountString);// =============================================================================// Demo Setup Helper Function// =============================================================================
Is this page helpful?