기본 결제

Solana는 $0.001 미만의 수수료로 즉각적인 글로벌 토큰 전송을 가능하게 합니다. 국경 간 송금, 급여 지급 또는 자금 관리 운영을 구축하든, 기본 스테이블코인 결제는 1초 이내에 정산되며 비용은 1센트의 일부에 불과합니다.

작동 방식

결제는 발신자의 token account에서 수신자의 token account로 스테이블코인을 이동시킵니다. 수신자가 이 토큰을 처음 받는 경우, 해당 token account는 동일한 트랜잭션의 일부로 생성될 수 있습니다.

핵심 결제 개념은 Solana에서 결제가 작동하는 방식을 참조하세요.

@solana-program/token-2022token2022Program() 플러그인은 @solana/kit 클라이언트를 client.token2022 헬퍼로 확장합니다. transferToATA 메서드는 ATA 도출 및 트랜잭션 빌드를 자동으로 처리하므로, 단일 결제 전송에 이상적입니다.

아래 단계는 핵심 흐름을 보여줍니다. 완전히 실행 가능한 코드는 데모를 참조하세요.

토큰 헬퍼 생성

.use(token2022Program())를 사용하여 클라이언트에 token2022Program() 플러그인을 추가하세요. 이를 통해 client.token2022가 노출되며, instructions는 일반적인 토큰 작업을 위한 메서드를 제공합니다.

Token-2022 프로그램이 소유한 민트에는 token2022Program()를 사용하고, 기존 Token program이 소유한 민트에는 @solana-program/tokentokenProgram()를 사용하세요.

결제 전송

transferToATA()를 사용하여 지갑 간에 토큰을 전송하세요. 이 메서드는 다음을 처리합니다:

  • ATA 확인: 송신자와 수신자의 Associated Token Accounts(ATAs)를 자동으로 도출합니다. 수신자의 ATA가 존재하지 않는 경우, 계정 생성 명령이 동일한 트랜잭션에 자동으로 추가됩니다.
  • 확인된 금액: 민트의 decimals와 함께 기본 단위의 amount를 전달하세요. 전송은 온체인에서 민트의 소수점 자리수에 대해 검증됩니다 (예: 민트의 소수점이 6자리인 경우, 250000 기본 단위 -> 0.25 토큰).
  • 트랜잭션 빌드: sendTransaction()는 트랜잭션을 빌드, 서명 및 전송하며, context.signature에 트랜잭션 서명이 담긴 결과를 반환합니다.
Basic Payment
const client = createClient()
.use(signer(sender))
.use(solanaLocalRpc())
.use(token2022Program());
const result = await client.token2022.instructions
.transferToATA({
mint: mint.address,
authority: sender,
recipient: recipient.address,
amount: 250_000n,
decimals: 6
})
.sendTransaction();

잔액 확인

전송이 완료된 후, RPC에서 토큰 잔액을 읽어오세요. findAssociatedTokenPda()로 각 지갑의 ATA를 도출한 다음, getTokenAccountBalance()를 호출하여 해당 계정의 잔액을 가져오세요.

Basic Payment
const client = createClient()
.use(signer(sender))
.use(solanaLocalRpc())
.use(token2022Program());
const result = await client.token2022.instructions
.transferToATA({
mint: mint.address,
authority: sender,
recipient: recipient.address,
amount: 250_000n,
decimals: 6
})
.sendTransaction();
const [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
});
const senderBalance = await client.rpc.getTokenAccountBalance(senderAta).send();
const recipientBalance = await client.rpc
.getTokenAccountBalance(recipientAta)
.send();

토큰 헬퍼 생성

.use(token2022Program())를 사용하여 클라이언트에 token2022Program() 플러그인을 추가하세요. 이를 통해 client.token2022가 노출되며, instructions는 일반적인 토큰 작업을 위한 메서드를 제공합니다.

Token-2022 프로그램이 소유한 민트에는 token2022Program()를 사용하고, 기존 Token program이 소유한 민트에는 @solana-program/tokentokenProgram()를 사용하세요.

결제 전송

transferToATA()를 사용하여 지갑 간에 토큰을 전송하세요. 이 메서드는 다음을 처리합니다:

  • ATA 확인: 송신자와 수신자의 Associated Token Accounts(ATAs)를 자동으로 도출합니다. 수신자의 ATA가 존재하지 않는 경우, 계정 생성 명령이 동일한 트랜잭션에 자동으로 추가됩니다.
  • 확인된 금액: 민트의 decimals와 함께 기본 단위의 amount를 전달하세요. 전송은 온체인에서 민트의 소수점 자리수에 대해 검증됩니다 (예: 민트의 소수점이 6자리인 경우, 250000 기본 단위 -> 0.25 토큰).
  • 트랜잭션 빌드: sendTransaction()는 트랜잭션을 빌드, 서명 및 전송하며, context.signature에 트랜잭션 서명이 담긴 결과를 반환합니다.

잔액 확인

전송이 완료된 후, RPC에서 토큰 잔액을 읽어오세요. findAssociatedTokenPda()로 각 지갑의 ATA를 도출한 다음, getTokenAccountBalance()를 호출하여 해당 계정의 잔액을 가져오세요.

Basic Payment
const client = createClient()
.use(signer(sender))
.use(solanaLocalRpc())
.use(token2022Program());

데모

Demo
// Generate signers for sender and recipient
const 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 tokens
const { 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 balances
const [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 RPC
const 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
// =============================================================================
Console
Click to execute the code.

Is this page helpful?

목차

페이지 편집