Solana에서 PYUSD: 실용적인 통합 가이드 (BlockEden.xyz RPC 포함)
PayPal USD (PYUSD)가 Solana에 상륙하면서 디지털 결제 분야에 중요한 이정표가 되었습니다. 이 가이드는 엔지니어가 Solana의 지갑, dApp 및 상거래 플랫폼에 PYUSD를 통합할 때 직접적이고 생산 환경에 초점을 맞춘 단계별 안내를 제공합니다.
모든 예제는 최신 Token-2022 호환 코드를 사용하며, BlockEden.xyz의 저지연 Solana RPC 엔드포인트와 원활히 동작하도록 설계되었습니다.
TL;DR
- 무엇인가: PayPal USD (PYUSD)는 이제 Solana의 네이티브 Token-2022 SPL 토큰으로, 전 세계적으로 인정받는 스테이블코인에 빠르고 저렴한 결제 정산을 제공합니다.
- 핵심 파라미터: Mint
2b1kV6DkPAnxd5ixfnxCpjxmKwqjjaYmCZfHsFu24GXo
, 소수점 자리수6
, 토큰 프로그램Token-2022
. - 기능 세트: Solana Token Extensions (Token-2022)를 활용합니다. Transfer Hook이 초기화되어 있지만 현재는 null 프로그램으로 비활성화되어 있으며, 기밀 전송 기능 및 기타 확장 기능을 포함합니다.
- 크로스체인: 공식 LayerZero 통합을 통해 PYUSD가 Ethereum과 Solana 사이를 안전한 burn‑and‑mint 메커니즘으로 이동할 수 있어 기존 브리지의 위험을 회피합니다.
- 액션: 이 가이드를 템플릿으로 사용해 BlockEden.xyz의 안정적인 Solana RPC와 함께 애플리케이션에 PYUSD 지원을 바로 추가하세요.
왜 Solana에서 PYUSD가 중요한가
PayPal 브랜드와 Solana 성능의 결합은 디지털 달러를 위한 강력한 새로운 레일을 만듭니다.
- 소비자 신뢰와 크립토 UX의 결합: PYUSD는 규제된 트러스트 회사 Paxos가 발행하고 PayPal 및 Venmo에 깊게 통합되어 있습니다. 사용자는 익숙한 자산을 보유하게 되며, 하나의 PYUSD 잔액을 가지고 Ethereum 또는 Solana 외부 지갑으로 인출할 수 있어 체인 복잡성을 추상화합니다.
- 결제 준비 레일: Solana의 아키텍처는 서브초 거래 최종성을 제공하고 수수료는 센트의 일부에 불과합니다. PYUSD는 이 효율적인 정산 네트워크 위에 안정적이고 인지 가능한 회계 단위를 겹쳐 결제, 상거래 및 송금에 최적화됩니다.
- 기관 수준 제어: Token-2022 토큰으로 출시함으로써 PYUSD는 기밀 전송, 풍부 메타데이터, 영구 위임자와 같은 내장 확장을 활용할 수 있어 맞춤형, 감사 어려운 스마트 계약 없이도 고급 컴플라이언스와 기능을 구현합니다.
절대 놓치면 안 되는 핵심 (핵심 파라미터)
코드를 작성하기 전에 아래 파라미터를 반드시 확인하세요. 신뢰할 수 있는 탐색기에서 Mint 주소를 항상 검증하여 사기 토큰과의 상호작용을 방지합니다.
- Mint (메인넷):
2b1kV6DkPAnxd5ixfnxCpjxmKwqjjaYmCZfHsFu24GXo
- 소수점 자리수:
6
(즉, 1 PYUSD = 1,000,000 기본 단위) - 토큰 프로그램:
Token-2022
(Program ID:TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb
) - 사용된 토큰 확장 (Mint 시):
- 메타데이터 & 메타데이터 포인터
- 영구 위임자
- Transfer Hook (null 프로그램으로 초기화)
- 기밀 전송 구성
위 내용은 Solana Explorer에서 확인할 수 있습니다. 탐색기는 공식 Mint 주소와 활성화된 확장을 명확히 표시합니다.
프로젝트 설정
환경을 준비합니다. 최신 Solana web3 및 SPL 토큰 라이브러리를 설치해 Token-2022 호환성을 확보하세요.
1. 라이브러리
npm에서 필요한 패키지를 설치합니다.
npm i @solana/web3.js @solana/spl-token
2. RPC 연결
애플리케이션을 BlockEden.xyz Solana 메인넷 RPC URL에 연결합니다. 프로덕션에서는 환경 변수를 반드시 사용하세요.
// package.json
// npm i @solana/web3.js @solana/spl-token
import { Connection, Keypair, PublicKey } from "@solana/web3.js";
import {
TOKEN_2022_PROGRAM_ID,
getMint,
getOrCreateAssociatedTokenAccount,
getAssociatedTokenAddress,
createTransferCheckedInstruction,
} from "@solana/spl-token";
// 대시보드에서 확인한 BlockEden.xyz Solana RPC URL
const RPC_ENDPOINT =
process.env.SOLANA_RPC_URL ??
"https://your-blockeden-solana-mainnet-endpoint.com";
export const connection = new Connection(RPC_ENDPOINT, "confirmed");
// PYUSD (메인넷)
export const PYUSD_MINT = new PublicKey(
"2b1kV6DkPAnxd5ixfnxCpjxmKwqjjaYmCZfHsFu24GXo",
);
PYUSD Mint 데이터 읽기
먼저 프로그램matically하게 PYUSD Mint의 속성을 확인합니다. 이는 상수값이 정확한지 검증하고 총 공급량 등 세부 정보를 가져오는 중요한 단계입니다.
// Token-2022 API를 통해 PYUSD mint 정보 확인
const mintInfo = await getMint(
connection,
PYUSD_MINT,
"confirmed",
TOKEN_2022_PROGRAM_ID, // 프로그램 ID 명시
);
console.log({
supply: mintInfo.supply.toString(),
decimals: mintInfo.decimals, // 6이어야 함
isInitialized: mintInfo.isInitialized,
});
TOKEN_2022_PROGRAM_ID
를 명시적으로 전달하는 것이 Token Extensions 사용 시 가장 흔한 오류의 원인임을 기억하세요.
연관 토큰 계정(ATA) 생성 또는 조회
Token-2022 토큰의 ATA는 반드시 Token-2022 프로그램 ID를 사용해 파생됩니다. 레거시 TOKEN_PROGRAM_ID
를 사용하면 “incorrect program id” 오류가 발생합니다.
// Payer 및 ATA 소유자 (지갑 로직에 맞게 교체)
const owner = Keypair.generate();
// 소유자의 PYUSD ATA 생성 또는 조회 (Token-2022 인식)
const ownerAta = await getOrCreateAssociatedTokenAccount(
connection,
owner, // 생성 비용을 부담하는 Payer
PYUSD_MINT, // Mint
owner.publicKey, // ATA 소유자
false, // allowOwnerOffCurve
"confirmed",
undefined, // 옵션
TOKEN_2022_PROGRAM_ID, // <-- 중요: Token-2022 프로그램 ID 사용
);
console.log("Owner PYUSD ATA:", ownerAta.address.toBase58());
PYUSD 잔액 확인
사용자의 PYUSD 잔액을 확인하려면 ATA를 조회하고 올바른 프로그램 ID를 지정해야 합니다.
@solana/spl-token
사용
import { getAccount } from "@solana/spl-token";
const accountInfo = await getAccount(
connection,
ownerAta.address,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);
const balance = Number(accountInfo.amount) / 10 ** mintInfo.decimals; // decimals = 6
console.log("PYUSD balance:", balance);
직접 JSON‑RPC (curl
) 사용
curl -X POST "$SOLANA_RPC_URL" -H 'content-type: application/json' -d '{
"jsonrpc":"2.0",
"id":1,
"method":"getTokenAccountsByOwner",
"params":[
"<OWNER_PUBLIC_KEY>",
{ "programId":"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb" },
{ "encoding":"jsonParsed" }
]
}'
PYUSD 전송 (사용자 간)
Token-2022 자산을 전송할 때는 createTransferCheckedInstruction
을 사용합니다. 이 명령은 토큰의 소수점 자리수를 포함해 소수점 관련 취약성을 방지합니다.
import { Transaction } from '@solana/web3.js';
async function transferPyusd({
fromWallet, // 송신자 Keypair
toPubkey, // 수신자 PublicKey
uiAmount, // PYUSD 단위 UI 금액 (예: 1.25)
}) {
const decimals = 6; // mintInfo.decimals에서 가져올 수 있음
const rawAmount = BigInt(Math.round(uiAmount * (10 ** decimals)));
// 송신자 ATA 주소 조회
const fromAta = await getAssociatedTokenAddress(
PYUSD_MINT,
fromWallet.publicKey,
false,
TOKEN_2022_PROGRAM_ID
);
// 수신자 ATA 생성 (Token-2022)
const toAta = await getOrCreateAssociatedTokenAccount(
connection,
fromWallet, // Payer
PYUSD_MINT,
toPubkey,
false,
'confirmed',
undefined,
TOKEN_2022_PROGRAM_ID
);
const transferInstruction = createTransferCheckedInstruction(
fromAta, // 출발 ATA
PYUSD_MINT, // Mint
toAta.address, // 도착 ATA
fromWallet.publicKey, // 출발 ATA 소유자
rawAmount, // 기본 단위 금액
decimals, // 소수점 자리수
[], // 멀티시그 서명자
TOKEN_2022_PROGRAM_ID // <-- 중요
);
const transaction = new Transaction().add(transferInstruction);
// 최신 블록해시와 수수료 지불자 설정
transaction.recentBlockhash = (await connection.getLatestBlockhash()).blockhash;
transaction.feePayer = fromWallet.publicKey;
const signature = await connection.sendTransaction(transaction, [fromWallet]);
await connection.confirmTransaction(signature, 'confirmed');
console.log('Transaction successful with signature:', signature);
return signature;
}
Transfer Hook에 대한 주의: PYUSD Mint는 Transfer Hook 확장을 초기화했지만 프로그램을 null
로 설정했습니다. 따라서 현재는 별도 계정이나 로직 없이 표준 전송이 가능합니다. PayPal/Paxos가 훅을 활성화하면 Mint가 새로운 프로그램을 가리키게 되며, 그때는 해당 프로그램이 요구하는 추가 계정을 전달해야 합니다.