XRP API

XrpApp クラスは、XRP Ledger のアドレス取得とトランザクション署名を提供します。Ed25519(デフォルト)と secp256k1 の両方の楕円曲線をサポートしています。

Ethereum との主な違い

項目 Ethereum XRP
アドレス形式 0x... (hex) r... (Base58Check)
デフォルト曲線 secp256k1 Ed25519
Ed25519 公開鍵 0xED プレフィックス付き
署名フォーマット v/r/s raw bytes (Ed25519: 64B, secp256k1: DER)
BIP44 パス 44'/60'/... 44'/144'/...(Ed25519: 全ハードニング)

インポート

import {
  XrpApp,
  DEFAULT_XRP_PATH,
  type XrpSignatureResult,
  type XrpCurve,
} from '@openloop/sdk-core'

初期化

const xrp = new XrpApp(transport)

メソッド一覧

メソッド 説明
getAddress(path, curve?) XRP アドレスと公開鍵を取得
signTransaction(path, txBlob) シリアライズ済みトランザクションに署名

getAddress

デバイスから XRP Ledger アドレスを取得します。

async getAddress(
  path: string,
  curve?: XrpCurve
): Promise<{
  publicKey: string  // 公開鍵 (hex, Ed25519: 33B with 0xED prefix, secp256k1: 33B compressed)
  address: string    // XRP アドレス ("r...")
}>

パラメータ

名前 デフォルト 説明
path string BIP44 パス
curve XrpCurve 'ed25519' 'ed25519' or 'secp256k1'

XrpCurve

type XrpCurve = 'ed25519' | 'secp256k1'

デフォルトパス

DEFAULT_XRP_PATH = "44'/144'/0'/0'/0'"(Ed25519: 全要素ハードニング)

使用例

// Ed25519(デフォルト)
const { address, publicKey } = await xrp.getAddress(DEFAULT_XRP_PATH)
// address: "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh"
// publicKey: "ed01a2b3c4..." (0xED prefix)

// secp256k1
const { address, publicKey } = await xrp.getAddress(
  "44'/144'/0'/0/0",  // secp256k1 は非ハードニングパスも可
  'secp256k1'
)

曲線選択と P2 値

曲線 P2 値 説明
'ed25519' 0x80 Ed25519(デフォルト、推奨)
'secp256k1' 0x40 secp256k1(Ethereum 互換)

signTransaction

シリアライズ済みの XRP トランザクションに署名します。

async signTransaction(
  path: string,
  txBlob: string
): Promise<XrpSignatureResult>

パラメータ

名前 説明
path string BIP44 パス
txBlob string シリアライズ済みトランザクション (hex, 0x あり/なし)

返り値: XrpSignatureResult

フィールド 説明
signature string 署名の hex(Ed25519: 64 bytes, secp256k1: DER エンコード可変長)

使用例

const { signature } = await xrp.signTransaction(
  DEFAULT_XRP_PATH,
  '120000228...' // serialized transaction blob
)

xrpl.js 連携

import { Client, Wallet, encode, decode } from 'xrpl'
import { XrpApp, DEFAULT_XRP_PATH } from '@openloop/sdk-core'
import { WebHidTransport } from '@openloop/transport-webhid'

const transport = await WebHidTransport.connect()
const xrp = new XrpApp(transport)

// アドレス取得
const { address, publicKey } = await xrp.getAddress(DEFAULT_XRP_PATH)

// XRP Ledger に接続
const client = new Client('wss://xrplcluster.com/')
await client.connect()

// トランザクション作成
const prepared = await client.autofill({
  TransactionType: 'Payment',
  Account: address,
  Amount: '1000000', // 1 XRP = 1,000,000 drops
  Destination: 'rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe',
})

// シリアライズしてデバイスで署名
const txBlob = encode(prepared)
const { signature } = await xrp.signTransaction(DEFAULT_XRP_PATH, txBlob)

// 署名をトランザクションに追加
const signedTx = {
  ...prepared,
  TxnSignature: signature.toUpperCase(),
  SigningPubKey: publicKey.toUpperCase(),
}

// ブロードキャスト
const result = await client.submitAndWait(encode(signedTx))
console.log('TX Result:', result.result.meta.TransactionResult)

await client.disconnect()

次のステップ