ポリシーに従って署名
各要求は、承認の主体と対象チェーンを指定します。主体を省略すると、ログイン中のウォレットを使用します。 EVM系の呼び出しには、設定済みチェーンを示すchainTargetが必要です。 複数のウォレットを同時に管理する製品では、ウォレットを明示してください。 事前のアンロック操作は不要です。各要求で確認画面が開き、ユーザーがウォレットの認証方法で取引を承認します。 以下の例では、ボタンにuseSeams().walletを使い、単独の署名呼び出しにSeamsWebクライアントを使います。
NEAR取引
この例は、NEARテストネットのアカウントにset_greeting関数の呼び出しを送信します。 送信先、アクション、実行ステータスは、アプリに合った値に置き換えてください。
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)で対象を解決してください。対象チェーンを示す参照を直接渡すこともできます。
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コールバックを接続したままにしてください。 正式な各実装例は、同じイベント形式を使っています。
次の手順
デバイス連携、鍵のエクスポート、復元に進んでください。