About XRPL
home

Payment

주요 내용
XRP/IOU 전송
폴더명
Payment

스크립트 실행 명령어

$npx ts-node xrpl/Payment/sendXRP.ts $npx ts-node xrpl/Payment/sendIOU.ts
Bash
복사

1. Payment

Payment는 XRPL에서 계정 간 자산 전송을 수행하는 트랜잭션이다.
자산은 XRP(drops 단위 문자열) 또는 IOU(CurrencyAmount 오브젝트)로 보낼 수 있다.
XRP 전송: Amount: "1000" (drops)
IOU 전송: Amount: { currency, issuer, value }
사전 조건(IOU): 수신자가 해당 IOU에 대한 신뢰선(TrustLine) 을 보유해야 수취 가능
권한 요구(RequireAuth): 발행자가 RequireAuth를 켰다면, 수신자는 승인(allow trust) 되어야 수취 가능

2. 왜 필요한가?

기본 송금: XRP/IOU를 다른 계정으로 보냄
에스크로/DEX 전 단계: 자산 분배, 수수료 처리, 정산 등에 필수
정책 반영: RequireAuth, Freeze, TransferRate 등 발행자 정책의 효과를 실제 송금에서 확인

3. 시나리오: send-xrpsend-iou

Step 1. XRP 전송 (send-xrp.ts)

주체: Admin
행동: Payment(XRP) 전송
내용:
Amount: drops 문자열 (예: "1000" = 0.001 XRP)
Destination: User 주소
import { Client, Wallet, Payment } from "xrpl" import path from "path" import dotenv from "dotenv" // .env 파일 로드 (ADMIN_SEED, USER_SEED 필요) dotenv.config({ path: path.join(__dirname, "..", ".env") }) export async function sendXRP() { // XRPL Devnet에 연결 const client = new Client("wss://s.devnet.rippletest.net:51233") await client.connect() // 환경변수 확인 const ADMIN_SEED = process.env.ADMIN_SEED const USER_SEED = process.env.USER_SEED if (!ADMIN_SEED || !USER_SEED) throw new Error("Missing env: ADMIN_SEED, USER_SEED") try { // 1) Wallet 객체 생성 const admin = Wallet.fromSeed(ADMIN_SEED.trim()) // 송신자(Admin) const user = Wallet.fromSeed(USER_SEED.trim()) // 수신자(User) // 2) XRP 전송 트랜잭션 생성 const tx: Payment = { TransactionType: "Payment", Account: admin.address, // 송신자 Destination: user.address, // 수신자 Amount: "1000000" // 전송 수량 (drops 단위, 1,000,000 drops = 1 XRP) } // 3) 트랜잭션 자동 완성 (수수료/시퀀스 채우기) const prepared = await client.autofill(tx) // 4) Admin이 서명 const signed = admin.sign(prepared) // 5) 트랜잭션 전송 및 결과 대기 const result = await client.submitAndWait(signed.tx_blob) // 6) 결과 출력 console.log(JSON.stringify(result, null, 2)) return result } finally { // 연결 종료 await client.disconnect() } } // 직접 실행된 경우 실행 if (require.main === module) { sendXRP().catch(e => { console.error(e) process.exit(1) }) }
TypeScript
복사

Step 2. IOU 전송 (send-iou.ts)

주체: Admin(해당 IOU의 발행자)
행동: Payment(IOU) 전송
내용:
Amount: CurrencyAmount { currency, issuer, value }
수신자(User) 는 사전에 해당 IOU TrustLine 필요
import { Client, Wallet, Payment } from "xrpl" import path from "path" import dotenv from "dotenv" // .env 파일 로드 (ADMIN_SEED, USER_SEED 필요) dotenv.config({ path: path.join(__dirname, "..", ".env") }) export async function sendIOU() { // XRPL Devnet에 연결 const client = new Client("wss://s.devnet.rippletest.net:51233") await client.connect() // 환경변수 확인 const ADMIN_SEED = process.env.ADMIN_SEED const USER_SEED = process.env.USER_SEED if (!ADMIN_SEED || !USER_SEED) throw new Error("Missing env: ADMIN_SEED, USER_SEED") try { // 1) Wallet 객체 생성 const admin = Wallet.fromSeed(ADMIN_SEED.trim()) // IOU 발행자 const user = Wallet.fromSeed(USER_SEED.trim()) // IOU 수신자 // 2) IOU 전송 트랜잭션 생성 const tx: Payment = { TransactionType: "Payment", Account: admin.address, // 송신자 = 발행자(Admin) Destination: user.address, // 수신자(User) Amount: { currency: "ABC", // IOU 통화 코드 issuer: admin.address, // 발행자 주소 value: "100" // 문자열 수량 } } // 3) 트랜잭션 자동 완성 (수수료/시퀀스 채우기) const prepared = await client.autofill(tx) // 4) Admin이 서명 const signed = admin.sign(prepared) // 5) 트랜잭션 전송 및 결과 대기 const result = await client.submitAndWait(signed.tx_blob) // 6) 결과 출력 console.log(JSON.stringify(result, null, 2)) return result } finally { // 연결 종료 await client.disconnect() } } // 직접 실행된 경우 실행 if (require.main === module) { sendIOU().catch(e => { console.error(e) process.exit(1) }) }
TypeScript
복사
주의:
User가 해당 IOU에 대한 TrustLine 미보유tecNO_LINE/tecNO_AUTH 등 실패
발행자 RequireAuth 활성화 시 → 수신자는 승인 상태여야 수취 가능