本文へ移動

ポリシーに従って署名

対象を明示した参照と取引ごとの承認を使って、NEAR、NEP-413、EVM系の要求に署名します。

ポリシーに従って署名 ​

各要求は、承認の主体と対象チェーンを指定します。主体を省略すると、ログイン中のウォレットを使用します。 EVM系の呼び出しには、設定済みチェーンを示すchainTargetが必要です。 複数のウォレットを同時に管理する製品では、ウォレットを明示してください。 事前のアンロック操作は不要です。各要求で確認画面が開き、ユーザーがウォレットの認証方法で取引を承認します。 以下の例では、ボタンにuseSeams().walletを使い、単独の署名呼び出しにSeamsWebクライアントを使います。

NEAR取引 ​

この例は、NEARテストネットのアカウントにset_greeting関数の呼び出しを送信します。 送信先、アクション、実行ステータスは、アプリに合った値に置き換えてください。

tsx
import {
  functionCall,
  logWalletEvents,
  TxExecutionStatus,
  useSeams,
  type BoundNearSigner,
} from '@seams/wallet/react';

async function signGreeting(near: BoundNearSigner): Promise<void> {
  await near.signAndSendTransaction({
    receiverId: 'guest-book.testnet',
    actions: [functionCall({ method: 'set_greeting', args: { greeting: 'Hello from Seams' } })],
    options: {
      waitUntil: TxExecutionStatus.EXECUTED_OPTIMISTIC,
      onEvent: logWalletEvents(),
    },
  });
}

export function SetGreetingButton() {
  const { wallet } = useSeams();
  if (wallet?.access !== 'wallet' || !wallet.near) return null;

  // Each request opens wallet confirmation for this transaction.
  return <button onClick={signGreeting.bind(null, wallet.near)}>Sign transaction</button>;
}

useSeams()のwallet.nearは、ウォレットにNEARアカウントができるまでnullです。 署名ボタン付近のチェックによって、アカウントが存在する前の要求を防ぎます。 主体を明示する場合は、walletSessionRefFromSessionとnearAccountRefFromAccountIdで作成した walletSessionとnearAccountを渡して、seams.near.signAndSendTransactionを呼び出します。

EVM系の取引 ​

seams.evmはEIP-1559取引に署名します。seams.tempoはTempoのEIP-2718型付き取引に署名します。 どちらもsignTransaction、signAndSendTransaction、advancedを提供しますが、取引形式と署名結果は異なります。 seams.evmはtxHashHex、seams.tempoはsenderHashHexを返します。

EVM用ユーティリティで取引を作成します。'ethereum-sepolia'など、設定済みのネットワークスラッグでチェーンを選択してください。 セレクターは、ちょうど1つのチェーンに一致する必要があります。2つに一致すると、SDKは両方の名前を含むエラーを送出します。 署名の前にseams.config.chainTarget(selector)で対象を解決してください。対象チェーンを示す参照を直接渡すこともできます。

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

// EIP-1559 on any configured EVM chain. `seams.tempo` mirrors this API for
// Tempo's EIP-2718 typed transactions; the two stay separate because the
// envelopes and the signed results differ.
export async function executeEvmTransaction(seams: SeamsWeb): Promise<string> {
  const execution = await seams.evm.signAndSendTransaction({
    // A configured network slug. The RPC endpoint comes from that chain, and
    // `tx.chainId` is filled in from it. Omitting `walletSession` targets the
    // authenticated wallet.
    chainTarget: 'ethereum-sepolia',
    request: {
      chain: 'evm',
      kind: 'eip1559',
      senderSignatureAlgorithm: 'secp256k1',
      tx: {
        maxPriorityFeePerGas: 1n,
        maxFeePerGas: 1n,
        gasLimit: 21_000n,
        to: '0x1234567890abcdef1234567890abcdef12345678',
        value: parseEther('0'),
        data: '0x',
      },
    },
    options: { onEvent: logWalletEvents() },
  });
  console.log('transaction hash', execution.txHash);
  return execution.txHash;
}

この例はEthereum Sepoliaを対象とし、取引の値には仮の値を使っています。 ヘルパーを呼び出す前に、対象チェーンを設定に追加してください。 チェーン設定の実装例も参照してください。 実際に送信する前に、チェーン、送信先、手数料、データを置き換えます。 SDKは対象チェーンからtx.chainIdを設定し、チェーン設定のRPCエンドポイントを使います。 呼び出し時に、これらの値を重ねて渡す必要はありません。成功すると取引ハッシュを返します。

アプリ自身がペイロードをブロードキャストする場合は、signTransactionを使います。 ブロードキャストの結果はseams.evm.advancedまたはseams.tempo.advancedを通じて通知してください。

認証の手間を減らす ​

導入中は取引ごとの承認を使ってください。取引ごとの認証画面を省いて複数回署名する場合は、unlockで署名セッションを作成します。 ウォレットセッションと署名レーンを参照してください。

キャンセルと再試行 ​

  • 確認のキャンセルやポリシーによる拒否は、その要求の結果として扱い、再試行の操作を明示してください。
  • ブロードキャストの状態が不明な場合は、別の要求を送る前に取引またはノンスの状態を照合してください。
  • 進行状況のUIや監査ログを実装する間は、onEventコールバックを接続したままにしてください。 正式な各実装例は、同じイベント形式を使っています。

次の手順 ​

デバイス連携、鍵のエクスポート、復元に進んでください。