本文へ移動

ウォレットの高度な操作

明示的なユーザー操作を通じて、別のデバイスを連携し、復元状態を同期し、Ed25519またはECDSAの鍵素材をエクスポートします。

ウォレットの高度な操作 ​

これらの操作は、アクセス権を変更するか、鍵素材を開示します。 操作ごとに、新たなユーザー操作から開始してください。進行状況を表示してください。 監査のために、返された識別情報や記録を保持してください。

前提条件 ​

ウォレットの設定と認証を完了し、有効なウォレットセッションを取得してください。 デバイス連携には、カメラ、またはQRペイロードをデバイス間で渡す手段も必要です。

デバイス2は、短時間のセッションを開始してQRコードを表示します。 デバイス1は、そのコードを読み取り、新たに認証してリクエストを承認します。

tsx
import { useState } from 'react';
import { QRScanMode, ShowQRCode, useDeviceLinking } from '@seams/wallet/react';
import type { LinkDeviceFlowEvent, QrLinkedDeviceSessionPayloadV5 } from '@seams/wallet';

function logLinkEvent(event: LinkDeviceFlowEvent): void {
  console.log(event.phase, event.status, event.message);
}

// Device 2: `ShowQRCode` runs the whole start/display/expire cycle, including
// picking the target factor and cancelling an abandoned session.
export function NewDeviceLinkCode() {
  const [isOpen, setIsOpen] = useState(false);

  return (
    <>
      <button onClick={() => setIsOpen(true)}>Show link code</button>
      <ShowQRCode
        isOpen={isOpen}
        onClose={() => setIsOpen(false)}
        onEvent={logLinkEvent}
        onError={(error) => console.error('Device link failed', error)}
      />
    </>
  );
}

// Device 1: scan the code and approve.
export function ApproveLinkedDevice(props: { qrData: QrLinkedDeviceSessionPayloadV5 }) {
  const { linkDevice } = useDeviceLinking({
    onEvent: logLinkEvent,
    onError: (error) => console.error('Device link failed', error),
  });

  return (
    <button onClick={() => void linkDevice(props.qrData, QRScanMode.CAMERA)}>Approve device</button>
  );
}

デバイス2のShowQRCodeがセッションを開始し、コードを表示します。 画面を閉じると、放置されたセッションをキャンセルします。未完了のQRセッションには有効期限を設定してください。 成功後はデバイス名を表示し、後で識別して取り消せるようにしてください。

ウォレットアカウントを復元する ​

アカウントレコードのウォレットIDを使い、復元の同期を呼び出します。

これは、既知のウォレットのアカウント状態を同期します。 復元コードの入力と新しい認証方法の確認は、ホストするウォレットメニューが処理します。 ウォレット利用者の復元を参照してください。

ts
import type { SeamsWeb } from '@seams/wallet';

type SyncAccountResult = Awaited<ReturnType<SeamsWeb['recovery']['syncAccount']>>;

export async function recoverWalletAccount(
  seams: SeamsWeb,
  walletId: string,
): Promise<SyncAccountResult> {
  const result = await seams.recovery.syncAccount({ walletId });
  if (!result.success) {
    throw new Error(result.error);
  }

  console.log('wallet account restored', result.walletId, result.nearAccountId);
  return result;
}

成功結果には、復元したウォレットIDとNEARアカウントIDが含まれます。 返された値でアプリ状態を更新してから、署名操作を表示してください。

Ed25519またはECDSAの鍵をエクスポートする ​

exportKeyは、対象のエクスポートレーンを特定し、ウォレットオリジンのエクスポートビューアーを1回の呼び出しで開きます。

ts
import { logWalletEvents, type SeamsWeb } from '@seams/wallet';

export async function exportNearKey(seams: SeamsWeb): Promise<void> {
  await seams.keys.exportKey({
    kind: 'ed25519',
    options: { onEvent: logWalletEvents() },
  });
}

export async function exportEvmKey(seams: SeamsWeb): Promise<void> {
  await seams.keys.exportKey({
    kind: 'ecdsa',
    chainTarget: 'tempo-testnet',
    options: { onEvent: logWalletEvents() },
  });
}

exportNearKeyは、ウォレットのNEARアカウントのEd25519レーンをエクスポートします。 exportEvmKeyは、設定済みチェーンのECDSAレーンをエクスポートします。 どちらも既定では認証済みウォレットを使い、KeyExportFlowEventで進行状況を受け取ります。

SDKがレーンを選択し、選択したレーンをウォレットオリジンのビューアーへ直接渡します。 このデバイスに対象のエクスポートレーンや素材がない場合、exportKeyはレーンまたは素材のエラーで拒否します。

期待する結果 ​

  • デバイス連携は、独立したデバイス認証情報とレーンを作成します。
  • 復元の同期は、復元したウォレットとNEARの識別情報を返します。
  • エクスポートは、対象レーンの承認後に保護されたビューアーを開きます。

対処可能な失敗 ​

  • QRセッションをキャンセルした場合や期限が切れた場合は、再度開始してください。古いQRペイロードを承認しないでください。
  • 復元は失敗結果を返す場合があります。同期が成功するまで、既存のアカウント状態を保持してください。
  • このデバイスに対象のエクスポートレーンや素材がない場合は拒否します。エラーを表示してください。SDKは別のレーンを選びません。
  • エクスポートの承認やビューアーのエラーが発生したら、現在の開示処理を終了してください。再エクスポート前に新たな認証を求めてください。

次に、リンク済みデバイス、復元・エクスポート・鍵のローテーション、結果とエラーを参照してください。