스크립트 실행 명령어
$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-xrp → send-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 활성화 시 → 수신자는 승인 상태여야 수취 가능

