WalletConnect 連携

Openloop SDK は WalletConnect v2 を通じたリモートデバイスアクセスを 2 つの方式でサポートしています。

2 つの方式

方式 レベル 説明
WcTransport 低レベル APDU コマンドを WalletConnect リレー経由で中継
AppKit 高レベル Reown AppKit でマルチチェーン対応の標準 WC 接続

WcTransport(APDU 中継方式)

WcTransportITransport を実装し、WalletConnect v2 リレーを通じて APDU コマンドをリモートの Openloop Connect アプリに送信します。

仕組み

Diagram 0

カスタム JSON-RPC メソッド openloop_exchange で hex エンコードされた APDU を送受信します。

セットアップ

import { WcTransport, EthereumApp, DEFAULT_ETH_PATH } from '@openloop/sdk-core'
import SignClient from '@walletconnect/sign-client'

// WalletConnect SignClient を初期化
const client = await SignClient.init({
  projectId: 'your-project-id',
})

// ペアリングとセッション確立
const { uri, approval } = await client.connect({
  requiredNamespaces: {
    eip155: {
      methods: ['openloop_exchange', 'openloop_lock', 'openloop_unlock'],
      chains: ['eip155:1'],
      events: [],
    },
  },
})

// URI を QR コードで表示 → ユーザーが Openloop Connect でスキャン
console.log('Pairing URI:', uri)

// セッション承認を待つ
const session = await approval()

// WcTransport 作成
const transport = new WcTransport({
  client,
  session: { topic: session.topic },
  chainId: 'eip155:1', // オプション(デフォルト: 'eip155:1')
})

await transport.open()

// 通常の App クラスがそのまま使える
const eth = new EthereumApp(transport)
const { address } = await eth.getAddress(DEFAULT_ETH_PATH)

WcTransport の型定義

interface WcTransportOptions {
  client: IWcSignClient   // WalletConnect SignClient インスタンス
  session: WcSession       // アクティブセッション { topic: string }
  chainId?: string         // チェーン ID(デフォルト: "eip155:1")
}

interface IWcSignClient {
  request<T>(params: {
    topic: string
    chainId: string
    request: { method: string; params: unknown }
  }): Promise<T>
}

interface WcSession {
  topic: string
}

対応メソッド

メソッド 説明
openloop_exchange APDU コマンド送受信
openloop_lock デバイスの排他ロック取得
openloop_unlock デバイスの排他ロック解放

特徴


AppKit(高レベル WC 方式)

Reown AppKit を使うと、WalletConnect の標準メソッド(eth_signTransaction, personal_sign 等)で署名できます。この方式では APDU は直接扱わず、Openloop Connect が内部でデバイス操作を行います。

対応チェーンとメソッド

EVM (eip155)

チェーン: - eip155:1 — Ethereum Mainnet - eip155:11155111 — Sepolia Testnet

メソッド: | メソッド | 説明 | |———|——| | eth_sendTransaction | トランザクション送信 | | eth_signTransaction | トランザクション署名 | | eth_sign | データ署名 | | personal_sign | EIP-191 メッセージ署名 | | eth_signTypedData | EIP-712 Typed Data 署名 | | eth_signTypedData_v3 | EIP-712 v3 | | eth_signTypedData_v4 | EIP-712 v4 | | wallet_getCapabilities | ウォレット機能取得 |

Bitcoin (bip122)

チェーン: - bip122:000000000019d6689c085ae165831e93 — Bitcoin Mainnet - bip122:000000000933ea01ad0ee984209779ba — Bitcoin Testnet3

メソッド: | メソッド | 説明 | |———|——| | signPsbt | PSBT 署名 | | getAccountAddresses | アカウントアドレス取得 | | signMessage | メッセージ署名 | | sendTransfer | 送金 |

Solana

チェーン: - solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp — Mainnet Beta - solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1 — Devnet

メソッド: | メソッド | 説明 | |———|——| | solana_signTransaction | トランザクション署名 | | solana_signAllTransactions | 複数トランザクション署名 | | solana_signAndSendTransaction | 署名+送信 | | solana_signMessage | メッセージ署名 |

TRON

チェーン: - tron:0x2b6653dc — TRON Mainnet - tron:0x94a9059e — TRON Shasta Testnet

メソッド: | メソッド | 説明 | |———|——| | tron_signTransaction | トランザクション署名 | | tron_signMessage | メッセージ署名 |

AppKit の設定例

import { createAppKit } from '@reown/appkit/react'
import { WagmiAdapter } from '@reown/appkit-adapter-wagmi'
import { SolanaAdapter } from '@reown/appkit-adapter-solana'
import { BitcoinAdapter } from '@reown/appkit-adapter-bitcoin'
import { TronAdapter } from '@reown/appkit-adapter-tron'
import { mainnet, sepolia } from '@reown/appkit/networks'

const projectId = 'your-walletconnect-project-id'

// アダプター作成
const wagmiAdapter = new WagmiAdapter({ projectId, networks: [mainnet, sepolia] })
const solanaAdapter = new SolanaAdapter()
const bitcoinAdapter = new BitcoinAdapter()
const tronAdapter = new TronAdapter()

// AppKit 作成
const modal = createAppKit({
  projectId,
  adapters: [wagmiAdapter, solanaAdapter, bitcoinAdapter, tronAdapter],
  networks: [mainnet, sepolia],
  metadata: {
    name: 'My dApp',
    description: 'My dApp with Openloop',
    url: 'https://my-dapp.com',
    icons: ['https://my-dapp.com/icon.png'],
  },
  customWallets: [
    {
      id: 'openloop-connect',
      name: 'Openloop Connect',
      homepage: 'https://crypto.haudi.jp/openloop/',
      mobile_link: 'openloop://',
      desktop_link: 'openloop://',
      image_url: 'https://crypto.haudi.jp/openloop/images/logo/openloop-icon.png',
    },
  ],
})

WcTransport vs AppKit の使い分け

比較項目 WcTransport AppKit
APDU レベル制御 完全制御 抽象化済み
導入の容易さ やや複雑 簡単
UI コンポーネント なし(自前で実装) モーダル付き
マルチチェーン 手動切替 自動切替
EIP-7702 対応 非対応
対応ウォレット Openloop Connect のみ 全 WC 対応ウォレット

推奨: - Openloop デバイスとの統合が主目的 → WcTransport - 複数ウォレットをサポートしたい → AppKit


制限事項

次のステップ