Skip to Content
ハードウェア
HARDWARE SDK / ETHEREUM と EVM

evmSignTransaction

Legacy または EIP-1559 (Type 2) トランザクションについて、デバイス確認を伴う署名を要求します。デバイスは BIP32 パスから鍵を導出し、アプリケーションが結果をシリアライズしてブロードキャストします。デコードされるトランザクション詳細はファームウェアと calldata によって異なります。

const result = await HardwareSDK.evmSignTransaction(connectId, deviceId, params);
01 準備02 デバイスで確認03 シリアライズして送信

呼び出し前に

パラメーター

connectIdstring必須

デバイス検出で返された接続識別子。

deviceIdstring必須

getDeviceState が返したウォレット識別情報。

params.pathstring | number[]必須

3 つ以上のパス要素を持つ BIP32 導出パス。

params.transactionobject必須

Legacy または EIP-1559 トランザクション。数量は 16 進数文字列、chainId は数値です。

任意の共通パラメーター

トランザクションのフィールド

フィールド型説明
chainIdnumber対象ネットワークのチェーン ID。transaction 内に指定します。
tostring送信先アドレス。ERC-20 呼び出しではトークンコントラクト。
valuestring16 進数エンコードされた wei 単位の金額。ERC-20 呼び出しには 0x0 を使用。
noncestring送信アカウントのトランザクション数 (16 進数の数量)。
gasLimitstringガスリミット (16 進数の数量)。
datastring · optional完全な 16 進数エンコードの calldata。ない場合は 0x を使用。
maxFeePerGasstring · EIP-1559ガス単位あたりの最大総手数料 (16 進数エンコードの wei)。
maxPriorityFeePerGasstring · EIP-1559ガス単位あたりの最大優先手数料 (16 進数エンコードの wei)。
gasPricestring · LegacyLegacy のガス価格 (16 進数エンコードの wei)。

このページでは EVMTransaction と EVMTransactionEIP1559 を扱います。HD パスでパスの形式を確認してください。対象の RPC がトランザクションタイプに対応していることを確認します。

EIP-1559 は両方の手数料フィールドが必須です。Legacy では gasPrice を使用します。SDK に type: 2 を渡さないでください。署名済みトランザクションのシリアライズ時にタイプを選択してください。

クリアサイニング

ネイティブ通貨の送金、ERC-20 送金、承認/取り消し、コントラクト呼び出しに、同じメソッドを使用します。ERC-20 呼び出しでは、 to はトークンコントラクト、 value はゼロです。calldata に受取人/spender とトークン数量を含めます。対応ファームウェアは認識できる形式を自動デコードします。次のような clearSigning, トークンメタデータ、コントラクトラベルのパラメーターはありません。

Clear Signing ガイドに入力/表示の対応表と不明なコントラクトの動作があります。EIP-712 と Safe 所有者の署名には evmSignTypedData を使用します。

例

以下のコードは SDK の初期化とウォレットの選択が完了していることを前提とします。署名前に受取人の例を置き換え、対象ネットワークから nonce、ガス、手数料を取得してください。

EIP-1559 では maxFeePerGas と maxPriorityFeePerGas の両方が必要です。Legacy では gasPrice を使用します。

const result = await HardwareSDK.evmSignTransaction(connectId, deviceId, { path: "m/44'/60'/0'/0/0", useEmptyPassphrase: true, transaction: { to: '0xd0d6d6c5fe4a677d343cc433536bb717bae167dd', value: '0xf4240', data: '0x', chainId: 1, nonce: '0x0', maxFeePerGas: '0x77359400', maxPriorityFeePerGas: '0x3b9aca00', gasLimit: '0x5208', }, }); if (result.success === false) throw new Error(result.payload.error);

これらの例では標準ウォレットを選択します。隠しウォレットには、アカウント確認時と同じウォレット共通パラメーターを渡してください。

レスポンス

ペイロードを読み取る前に success を確認してください。成功レスポンスには v、r、s が含まれます。SDK はトランザクションをブロードキャストしません。

{ success: true, payload: { v: string, // hexadecimal string with "0x" prefix r: string, // hexadecimal string with "0x" prefix s: string, // hexadecimal string with "0x" prefix } }

署名済みトランザクションをシリアライズ

SDK は署名を返し、アプリケーションがトランザクションを組み立ててブロードキャストします。この例では ethers v5 パッケージを使用します。ユーザーの署名後は、元のトランザクションのフィールドを変更しないでください。

import type { UnsignedTransaction } from '@ethersproject/transactions'; import { TransactionTypes, serialize } from '@ethersproject/transactions'; import { splitSignature } from '@ethersproject/bytes'; import { keccak256 } from '@ethersproject/keccak256'; // Illustrative fee values: populate nonce, gas, and fees from your network. const transaction = { to: '0x7314e0f1c0e28474bdb6be3e2c3e0453255188f8', value: '0x0', data: '0x', chainId: 1, nonce: '0x0', maxFeePerGas: '0x14', maxPriorityFeePerGas: '0x0', gasLimit: '0x5208', }; const result = await HardwareSDK.evmSignTransaction(connectId, deviceId, { path: "m/44'/60'/0'/0/0", transaction, }); if (result.success === false) throw new Error(result.payload.error); const unsignedTx: UnsignedTransaction = { ...transaction, nonce: Number.parseInt(transaction.nonce, 16), type: TransactionTypes.eip1559, }; const signature = splitSignature({ v: Number(result.payload.v), r: result.payload.r, s: result.payload.s, }); const rawTx = serialize(unsignedTx, signature); const txid = keccak256(rawTx); // Submit rawTx using your Ethereum provider after verifying the signed result.

レガシートランザクションでは、2 つの EIP-1559 手数料フィールドの代わりに gasPrice を使用し、レガシートランザクションとしてシリアライズします。

最終更新日