Agent Skills by ALSEL
汎用ソフトウェア開発⭐ リポ 6品質スコア 78/100

bluvo

ユーザーのウォレットを取引所(Binance、Kraken、Coinbase)に安全に接続し、出金実行や認証情報管理を行うための暗号資産取引所接続APIです。取引所連携機能、2FAやSMS・KYC認証を含む出金UIの構築、またはマルチテナント型の暗号資産アプリケーション開発に活用できます。TypeScriptのステートマシンおよびReactフックのSDKを提供します。

description の原文を見る

Crypto exchange connectivity API for securely connecting user wallets to exchanges (Binance, Kraken, Coinbase), executing withdrawals, and managing credentials. Use when building exchange integrations, withdrawal UIs with 2FA/SMS/KYC, or multi-tenant crypto applications. SDKs: TypeScript state machine and React hooks.

SKILL.md 本文

Bluvo スキルリファレンス

製品概要

Bluvo は、暗号資産取引所の API 認証情報を安全に管理し、秘密鍵を公開することなくウォレット接続を実現する暗号資産取引所接続 API です。REST ラッパーではありません。ステートマシンが OAuth 認証からウォレットの読み込み、見積の生成、出金実行、2FA チャレンジ処理まで、フロー全体を統制します。

セキュリティ: AES-256-CBC 暗号化、テナント固有の暗号化キー、組織ごとの専用データベース。

リソース場所
REST API (OpenAPI)https://api-bluvo.com/api/v0/openapi
TypeScript SDKnpm の @bluvo/sdk-ts
React SDKnpm の @bluvo/react
ポータル (API キー)https://portal.bluvo.dev
ドキュメントhttps://docs.bluvo.dev
GitHub (SDK)https://github.com/bluvoinc/sdk

プログラミングモデル

3 つのクライアントレイヤー

クライアントサイドAPI キー?用途
BluvoClientサーバーありウォレット、出金、OAuth 操作への直接 REST アクセス
BluvoWebClientブラウザーなしOAuth ポップアップ、WebSocket リアルタイム更新
BluvoFlowClientブラウザーなし (サーバーコールバックを使用)完全な出金フロー用のステートマシンオーケストレーター

SDK はステートマシンパラダイムを使用します。イベントを送信するとマシンが状態遷移します。REST API を直接呼び出しません。BluvoFlowClient がすべての API 呼び出しを内部で統制し、購読する状態変化を発行します。

React SDK (@bluvo/react) はステートマシンをフック内にラップします。useBluvoFlow はほとんどのユースケースで主要なフックです。コンテキストプロバイダーは不要です。

状態図

idle ──→ exchanges:loading ──→ exchanges:ready ──→ oauth:waiting / qrcode:waiting
              │                                         │
        exchanges:error                          oauth:processing / qrcode:displaying
                                                        │
                                            oauth:completed ←─ qrcode:scanning
                                                        │
                                                 wallet:loading
                                                        │
                                                 wallet:ready
                                                        │
                                                quote:requesting
                                                        │
                                                 quote:ready ←─ (auto-refresh)
                                                        │
                                               withdraw:processing
                                                  │    │    │
                                        error2FA  │  errorSMS  errorKYC
                                        error2FAMultiStep │ errorBalance
                                                  │
                                  readyToConfirm  │  retrying
                                                  │
                                        withdraw:completed / fatal / blocked

                      CANCEL_FLOW → flow:cancelled (from ANY state)

ビルド可能なもの

  • 取引所ウォレット接続フロー (OAuth ポップアップまたは Binance Web の QR コード)
  • リアルタイム見積更新と手数料表示を備えた出金 UI
  • マルチステップ 2FA 検証 (TOTP、メール、SMS、顔認識、セキュリティキー/FIDO)
  • 残高プレビュー付きウォレットダッシュボード
  • サーバー側の認証情報管理とバルク ウォレット操作
  • 顧客ごとに独立した暗号資産操作を備えたマルチテナント SaaS

統合パスを選択

アプローチ工数最適な用途トレードオフ
REST API3~4 週間完全な制御、カスタムフローフロー全体を自分で実装
サーバー SDK3 週間言語固有の統合依然としてフロー ロジックの構築が必要
ステートマシン SDK + サーバー SDK5 日抽象化されたフロー、カスタム UIウィジェット UI のみ構築
React ステートマシン (@bluvo/react)24 時間最小限のコードで React アプリReact フレームワークに限定
Vanilla JS ウィジェット24 時間クイック埋め込み可能 UIカスタマイズが少ない
フレームワークウィジェット24 時間React/Vue/Angular 用のプリセット UI最小限のカスタマイズ

決定ツリー:

  • React または Next.js? → @bluvo/react (~24 時間)
  • カスタム UI フレームワーク? → @bluvo/sdk-tsBluvoFlowClient (~5 日)
  • サーバーのみ / バックエンド? → @bluvo/sdk-tsBluvoClient
  • プリセット ウィジェット? → @bluvo/widget-react@bluvo/widget-vanjs@bluvo/widget-svelte
# React + Next.js
pnpm add @bluvo/react

# TypeScript のみ
pnpm add @bluvo/sdk-ts

クイックスタート — React + Next.js

サーバーアクション

// app/actions/flowActions.ts
'use server'

import { createClient, createSandboxClient, createDevClient } from "@bluvo/sdk-ts";

function loadBluvoClient() {
    const env = process.env.NEXT_PUBLIC_BLUVO_ENV;
    if (env === 'production') {
        return createClient({
            orgId: process.env.BLUVO_ORG_ID!,
            projectId: process.env.BLUVO_PROJECT_ID!,
            apiKey: process.env.BLUVO_API_KEY!,
        });
    } else if (env === 'staging') {
        return createSandboxClient({
            orgId: process.env.BLUVO_ORG_ID!,
            projectId: process.env.BLUVO_PROJECT_ID!,
            apiKey: process.env.BLUVO_API_KEY!,
        });
    } else {
        return createDevClient({
            orgId: process.env.BLUVO_ORG_ID!,
            projectId: process.env.BLUVO_PROJECT_ID!,
            apiKey: process.env.BLUVO_API_KEY!,
        });
    }
}

// 重要: Next.js サーバーアクション シリアル化に toPlain() が必須
function toPlain<T extends object>(o: T): T {
    return JSON.parse(JSON.stringify(o)) as T;
}

export async function listExchanges(status?: string) {
    return toPlain(await loadBluvoClient().oauth2.listExchanges(status as any));
}

export async function fetchWithdrawableBalances(walletId: string) {
    return toPlain(await loadBluvoClient().wallet.withdrawals.getWithdrawableBalance(walletId));
}

export async function executeWithdrawal(
    walletId: string, idem: string, quoteId: string,
    params?: { twofa?: string | null; emailCode?: string | null; smsCode?: string | null;
               bizNo?: string | null; tag?: string | null; params?: { dryRun?: boolean } | null; }
) {
    return toPlain(await loadBluvoClient().wallet.withdrawals.executeWithdrawal(walletId, idem, quoteId, params ?? {}));
}

サーバーアクション ファイル全体 (requestQuotationgetWalletByIdpingWalletById を含む) については、以下の SDK スキルファイルセクションで参照されている nextjs-patterns.md サブスキルを読み込んでください。

ページコンポーネント

// app/home/page.tsx
"use client";  // 必須 — フックはブラウザーのみ

import { useBluvoFlow } from "@bluvo/react";
import {
    fetchWithdrawableBalances, listExchanges, executeWithdrawal,
    requestQuotation, getWalletById, pingWalletById
} from '../actions/flowActions';

export default function Home() {
    const flow = useBluvoFlow({
        orgId: process.env.NEXT_PUBLIC_BLUVO_ORG_ID!,
        projectId: process.env.NEXT_PUBLIC_BLUVO_PROJECT_ID!,
        listExchangesFn: listExchanges,
        fetchWithdrawableBalanceFn: fetchWithdrawableBalances,
        requestQuotationFn: requestQuotation,
        executeWithdrawalFn: executeWithdrawal,
        getWalletByIdFn: getWalletById,
        pingWalletByIdFn: pingWalletById,
        options: {
            sandbox: process.env.NEXT_PUBLIC_BLUVO_ENV === 'staging',
            dev: process.env.NEXT_PUBLIC_BLUVO_ENV === 'development',
        },
    });

    // 状態ブール値: flow.isOAuthPending、flow.isWalletReady、flow.isQuoteReady など
    // アクション: flow.startWithdrawalFlow()、flow.requestQuote()、flow.executeWithdrawal()
    // チャレンジ: flow.requires2FA、flow.requires2FAMultiStep、flow.requiresSMS
    // 終了状態: flow.isWithdrawalComplete、flow.isFlowCancelled、flow.hasFatalError
}

必要なセットアップ

環境変数

変数サイド必須説明
BLUVO_ORG_IDサーバーはいサーバーアクション用の組織 ID
BLUVO_PROJECT_IDサーバーはいサーバーアクション用のプロジェクト ID
BLUVO_API_KEYサーバーはいAPI キー (クライアントに公開しないこと)
NEXT_PUBLIC_BLUVO_ORG_IDクライアントはいフック用の組織 ID
NEXT_PUBLIC_BLUVO_PROJECT_IDクライアントはいフック用のプロジェクト ID
NEXT_PUBLIC_BLUVO_ENVクライアントいいえproduction / staging / development

認証

Bluvo ポータルの API キーセクションから orgIdprojectId、および apiKey を取得します。

スコープ用途
readウォレット、残高、アカウント情報の表示
quote出金見積の生成
withdrawal出金実行
delete接続ウォレットの削除

API キー スコープは、サーバーアクションが実行する操作と一致する必要があります。

制約

  • 対応取引所: Binance、Kraken、Coinbase など。API または help@bluvo.co への問い合わせで現在のリストを確認してください
  • React フックはブラウザーのみ — SSR サポートはありません。useStateuseEffect、WebSocket、localStorage を使用します
  • useBluvoFlow はマウント時にオプションをキャプチャ — クライアントは useState 初期化子で作成されます。マウント後のオプション変更は効果がありません。コンポーネントを再マウントして再初期化します
  • API キー スコープは操作と一致する必要があります — 例: executeWithdrawal には withdrawal スコープが必須
  • 出金見積は有効期限切れになります — 実行前に常に新しい見積を取得します。autoRefreshQuotation はデフォルトで true です

一般的なワークフロー

1. OAuth → 出金 (成功ケース)

idle → exchanges:ready → oauth:completed → wallet:ready → quote:ready → withdraw:completed

listExchanges() を呼び出す → ユーザーが取引所を選択 → startWithdrawalFlow({ exchange, walletId }) → OAuth ポップアップ → ウォレット読み込み → requestQuote({...})executeWithdrawal(quoteId) → 完了。

2. QR コード (binance-web)

exchange === 'binance-web' の場合、startWithdrawalFlow() により自動検出されます。手動ルーティングは不要です。

qrcode:waiting → qrcode:displaying → qrcode:scanning → oauth:completed → wallet:ready → ...

flow.qrCodeUrl を QR 画像として表示します。flow.isQRCodeScanningflow.isOAuthComplete を監視します。

3. ウォレット再開

ウォレットが既に接続されている場合、OAuth をスキップします:

  • resumeWithdrawalFlow({ exchange, walletId }) — OAuth をスキップ、ウォレット残高を読み込み
  • silentResumeWithdrawalFlow({ walletId, exchange, preloadedBalances? }) — 直接 wallet:ready にジャンプ

startWithdrawalFlowgetWalletByIdFn を介して既存ウォレットを自動検出し、再開にルーティングします。

4. 2FA 処理

シングルステップ: flow.requires2FAflow.submit2FA(code)withdraw:completed

マルチステップ (例: Binance GOOGLE + EMAIL + FACE + SMS + ROAMING_FIDO):

  1. flow.requires2FAMultiStep — 必須ステップは flow.multiStep2FASteps で確認
  2. flow.submit2FAMultiStep('GOOGLE', code) — 各コードベースのステップをサブミット
  3. flow.pollFaceVerification() — FACE ステップ用 (10 秒遅延、その後 5 秒ポーリング)
  4. flow.pollRoamingFidoVerification() — ROAMING_FIDO ステップ用 (即座に 5 秒ポーリング)
  5. flow.isReadyToConfirm の場合 → flow.confirmWithdrawal()withdraw:completed

検証状態の信頼できる情報源として flow.mfaVerified を使用します (step.status ではなく)。

問題が発生した場合

  1. すべての Next.js サーバーアクション戻り値に toPlain() が必須 — なければ: "Classes or null prototypes are not supported" シリアル化エラー
  2. 無効な状態遷移はサイレント no-opgetState().type で遷移が発生したかを確認
  3. WITHDRAWAL_DRY_RUN_COMPLETE は成功シグナル、エラーではありません — すべてのマルチステップ 2FA ステップが検証済みを意味します。SDK は withdraw:readyToConfirm に遷移します
  4. マルチステップ 2FA は mfa.verified が信頼できる情報源step.status ではありません。バックエンドが mfa.verified を更新します
  5. フックを使用するすべてのコンポーネントに "use client" が必須 — Next.js App Router 要件
  6. binance-web は QR コードフロー自動検出 — 手動でルーティングしないでください。startWithdrawalFlow が処理します
  7. autoRefreshQuotation はデフォルトで true — 手動の「期限切れ」UI で flow.isQuoteExpired が必要な場合は false に設定
  8. API キーをログしないこと — Bluvo はキーマテリアルをログしません。コードも同様に確認してください
  9. OAuth ウィンドウ閉鎖検出には ~500ms のポーリング遅延がある — ポップアップ閉鎖と oauth:window_closed_by_user の間に若干のラグ

SDK スキルファイル — 条件付き読み込みトリガー

SDK には詳細な実装ガイダンス用のスキルファイルがあります。構築内容に基づいてオンデマンドでこれらを読み込みます。

@bluvo/react (React フック)

読み込むタイミング: React または Next.js 出金 UI を構築する場合。

メインスキル: https://raw.githubusercontent.com/bluvoinc/sdk/main/packages/react/skill/SKILL.md

リファレンス読み込むタイミング...URL
hooks-complete.md完全な useBluvoFlow 戻り値シグネチャ (~80+ フィールド) が必要https://raw.githubusercontent.com/bluvoinc/sdk/main/packages/react/skill/references/hooks-complete.md
nextjs-patterns.mdNext.js App Router とサーバーアクションを構築https://raw.githubusercontent.com/bluvoinc/sdk/main/packages/react/skill/references/nextjs-patterns.md
components.mdエクスポート済み React コンポーネントを探索https://raw.githubusercontent.com/bluvoinc/sdk/main/packages/react/skill/references/components.md
qrcode-binance-web.mdbinance-web の QR コード認証を実装https://raw.githubusercontent.com/bluvoinc/sdk/main/packages/react/skill/references/qrcode-binance-web.md
multistep-2fa.mdマルチステップ 2FA (Binance GOOGLE+EMAIL+FACE+SMS+ROAMING_FIDO) を処理https://raw.githubusercontent.com/bluvoinc/sdk/main/packages/react/skill/references/multistep-2fa.md

@bluvo/sdk-ts (コア TypeScript)

読み込むタイミング: React 以外のフロントエンド、サーバー側統合を構築、またはステートマシンの内部機構が必要な場合。

メインスキル: https://raw.githubusercontent.com/bluvoinc/sdk/main/packages/ts/skill/SKILL.md

リファレンス読み込むタイミング...URL
api-client.mdREST 呼び出しの詳細、認証ヘッダー、ファクトリ関数、エラーコードが必要https://raw.githubusercontent.com/bluvoinc/sdk/main/packages/ts/skill/references/api-client.md
types.md状態、コンテキスト、イベントの TypeScript 型定義が必要https://raw.githubusercontent.com/bluvoinc/sdk/main/packages/ts/skill/references/types.md
state-transitions.md完全な遷移マップ、ガード条件、シーケンス図が必要https://raw.githubusercontent.com/bluvoinc/sdk/main/packages/ts/skill/references/state-transitions.md

ドキュメント インデックス

知りたいこと移動先
すべての API エンドポイントhttps://docs.bluvo.dev/api-reference
API キーの取得方法https://docs.bluvo.dev/api-keys
OAuth2 統合レベルhttps://docs.bluvo.dev/learn/oauth2-integration
セキュリティアーキテクチャhttps://docs.bluvo.dev/learn/security
マルチテナント設定https://docs.bluvo.dev/learn/multi-tenancy
対応取引所https://docs.bluvo.dev/exchanges
LLM 用の完全なナビゲーションhttps://docs.bluvo.dev/llms.txt
コードサンプルhttps://github.com/bluvoinc/awesome

検証チェックリスト

Bluvo での作業をサブミットする前に:

  • useBluvoFlow または BluvoFlowClient が 6 つのコールバック関数すべてで初期化済み
  • サーバーアクションが toPlain() でラップ済み
  • クライアントコンポーネントが "use client" でマーク済み
  • エラー/チャレンジ状態が処理済み (oauth:errorwithdraw:error2FAwithdraw:fatal など)
  • 終了状態が処理済み (withdraw:completedflow:cancelledwithdraw:blocked)
  • API キーが操作に対して正しいスコープを持っている
  • センシティブ認証情報がログされていない、公開されていない

ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ

詳細情報

作者
bluvoinc
リポジトリ
bluvoinc/sdk
ライセンス
MIT
最終更新
2026/5/4

Source: https://github.com/bluvoinc/sdk / ライセンス: MIT

本サイトは GitHub 上で公開されているオープンソースの SKILL.md ファイルをクロール・インデックス化したものです。 各スキルの著作権は原作者に帰属します。掲載に問題がある場合は info@alsel.co.jp または /takedown フォームよりご連絡ください。
原作者: bluvoinc · bluvoinc/sdk · ライセンス: MIT
bluvo | Agent Skills by ALSEL | Agent Skills by ALSEL