Skip to Content
Hardware
HARDWARE-SDK / ETHEREUM & EVM

evmSignTransaction

Eine auf dem Gerät bestätigte Signatur für eine Legacy- oder EIP-1559-Transaktion (Typ 2) anfordern. Das Gerät leitet den Schlüssel aus Ihrem BIP32-Pfad ab; Ihre Anwendung serialisiert und überträgt das Ergebnis. Dekodierte Transaktionsdetails hängen von Firmware und Calldata ab.

const result = await HardwareSDK.evmSignTransaction(connectId, deviceId, params);
01 Vorbereiten02 Auf dem Gerät bestätigen03 Serialisieren & senden

Vor dem Aufruf

Parameter

connectIdstringerforderlich

Die bei der Geräteerkennung zurückgegebene Verbindungskennung.

deviceIdstringerforderlich

Die von getDeviceState zurückgegebene Wallet-Identität.

params.pathstring | number[]erforderlich

BIP32-Ableitungspfad mit mindestens drei Pfadkomponenten.

params.transactionobjecterforderlich

Eine Legacy- oder EIP-1559-Transaktion. Numerische Mengen verwenden Hex-Zeichenfolgen; chainId ist eine Zahl.

Optionale gemeinsame Parameter

Transaktionsfelder

FeldTypBeschreibung
chainIdnumberChain-ID des Zielnetzwerks. Befindet sich innerhalb von transaction.
tostringZieladresse; bei ERC-20-Aufrufen der Token-Vertrag.
valuestringHexkodierter Betrag in Wei. Bei ERC-20-Aufrufen 0x0 verwenden.
noncestringTransaktionszähler des sendenden Kontos als hexadezimale Mengenangabe.
gasLimitstringGaslimit als hexadezimale Mengenangabe.
datastring · optionalVollständige hexkodierte Calldata; ohne Calldata 0x verwenden.
maxFeePerGasstring · EIP-1559Maximale Gesamtgebühr pro Gas in hexkodierten Wei.
maxPriorityFeePerGasstring · EIP-1559Maximale Prioritätsgebühr pro Gas in hexkodierten Wei.
gasPricestring · LegacyLegacy-Gaspreis in hexkodierten Wei.

Diese Seite behandelt EVMTransaction und EVMTransactionEIP1559. Siehe HD-Pfade zur Pfadformatierung. Stellen Sie sicher, dass Ihre Ziel-RPC den Transaktionstyp unterstützt.

EIP-1559 benötigt beide Gebührenfelder; Legacy verwendet gasPrice. Übergeben Sie nicht type: 2 an das SDK; wählen Sie den Typ beim Serialisieren der signierten Transaktion.

Clear Signing

Verwenden Sie dieselbe Methode für native Überweisungen, ERC-20-Transfers, Freigaben/Widerrufe und Vertragsaufrufe. Bei ERC-20-Aufrufen ist to der Token-Vertrag und value ist null; Calldata enthält Empfänger bzw. ausgabeberechtigte Adresse (Spender) und Token-Betrag. Unterstützende Firmware dekodiert erkannte Formate automatisch. Es gibt keinen clearSigning-, Token-Metadaten- oder Vertragsbezeichnungsparameter.

Siehe die Clear-Signing-Anleitung zur Eingabe-/Anzeigematrix und zum Verhalten bei unbekannten Verträgen. Für EIP-712- und Safe-Eigentümersignaturen verwenden Sie evmSignTypedData.

Beispiele

Die folgenden Fragmente setzen ein initialisiertes SDK und eine ausgewählte Wallet voraus. Ersetzen Sie den Beispielempfänger und rufen Sie vor dem Signieren Nonce, Gas und Gebühren aus dem Zielnetzwerk ab.

EIP-1559 benötigt beide: maxFeePerGas und maxPriorityFeePerGas. Legacy verwendet 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);

Diese Beispiele wählen die Standard-Wallet. Übergeben Sie für eine versteckte Wallet dieselben gemeinsamen Wallet-Parameter, die beim Bestätigen des Kontos verwendet wurden.

Antwort

Prüfen Sie success vor dem Lesen der Nutzlast. Eine erfolgreiche Antwort enthält v, r und s; das SDK überträgt die Transaktion nicht.

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

Signierte Transaktion serialisieren

Das SDK gibt eine Signatur zurück; Ihre Anwendung setzt die Transaktion zusammen und überträgt sie. Dieses Beispiel verwendet ethers-v5-Pakete. Lassen Sie die ursprünglichen Transaktionsfelder nach dem Signieren durch den Nutzer unverändert.

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.

Für eine Legacy-Transaktion verwenden Sie gasPrice anstelle der beiden EIP-1559-Gebührenfelder und serialisieren sie als Legacy-Transaktion.

Zuletzt aktualisiert am