Skip to Content
Matériel
HARDWARE SDK / ETHEREUM ET EVM

evmSignTransaction

Demandez une signature confirmée sur l’appareil pour une transaction historique ou EIP-1559 (Type 2). L’appareil dérive la clé depuis votre chemin BIP32 ; votre application sérialise et diffuse le résultat. Les détails décodés de la transaction dépendent du micrologiciel et du calldata.

const result = await HardwareSDK.evmSignTransaction(connectId, deviceId, params);
01 Préparer02 Confirmer sur l’appareil03 Sérialiser et envoyer

Avant l’appel

Paramètres

connectIdstringobligatoire

L’identifiant de connexion renvoyé par la découverte d’appareils.

deviceIdstringobligatoire

L’identité du portefeuille renvoyée par getDeviceState.

params.pathstring | number[]obligatoire

Chemin de dérivation BIP32 comportant au moins trois composants.

params.transactionobjectobligatoire

Une transaction historique ou EIP-1559. Les quantités numériques utilisent des chaînes hexadécimales ; chainId est un nombre.

Paramètres communs facultatifs

Champs de transaction

ChampTypeDescription
chainIdnumberID de chaîne du réseau cible. Se trouve dans transaction.
tostringAdresse de destination ; le contrat du jeton pour les appels ERC-20.
valuestringMontant en wei encodé en hexadécimal. Utilisez 0x0 pour les appels ERC-20.
noncestringNombre de transactions du compte expéditeur, sous forme de quantité hexadécimale.
gasLimitstringLimite de gas, sous forme de quantité hexadécimale.
datastring · optionalCalldata complet encodé en hexadécimal ; utilisez 0x en l’absence de calldata.
maxFeePerGasstring · EIP-1559Frais totaux maximaux par unité de gas, en wei encodés en hexadécimal.
maxPriorityFeePerGasstring · EIP-1559Frais de priorité maximaux par unité de gas, en wei encodés en hexadécimal.
gasPricestring · LegacyPrix du gas historique, en wei encodés en hexadécimal.

Cette page couvre EVMTransaction et EVMTransactionEIP1559. Consultez Chemins HD pour le format des chemins. Assurez-vous que votre RPC cible prend en charge le type de transaction.

EIP-1559 nécessite les deux champs de frais ; le format historique utilise gasPrice. Ne transmettez pas type: 2 au SDK ; sélectionnez le type lors de la sérialisation de la transaction signée.

Clear Signing

Utilisez cette même méthode pour les transferts natifs, les transferts ERC-20, les autorisations/révocations et les appels de contrat. Pour les appels ERC-20, to est le contrat du jeton et value vaut zéro ; le calldata contient le destinataire/bénéficiaire autorisé et le montant du jeton. Un micrologiciel compatible décode automatiquement les formats reconnus. Il n’existe aucun paramètre clearSigning, de métadonnées de jeton ou de libellé de contrat.

Consultez le guide Clear Signing pour la matrice des entrées/affichages et le comportement face aux contrats inconnus. Pour EIP-712 et les signatures de propriétaires Safe, utilisez evmSignTypedData.

Exemples

Les fragments ci-dessous supposent un SDK initialisé et un portefeuille sélectionné. Remplacez le destinataire d’exemple et récupérez le nonce, le gas et les frais depuis le réseau cible avant de signer.

EIP-1559 nécessite à la fois maxFeePerGas et maxPriorityFeePerGas. Le format historique utilise 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);

Ces exemples sélectionnent le portefeuille standard. Pour un portefeuille caché, transmettez les mêmes paramètres communs de portefeuille que ceux utilisés lors de la confirmation du compte.

Réponse

Vérifiez success avant de lire les données. Une réponse réussie contient v, r, et s ; le SDK ne diffuse pas la transaction.

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

Sérialiser la transaction signée

Le SDK renvoie une signature ; votre application assemble et diffuse la transaction. Cet exemple utilise les paquets ethers v5. Conservez les champs de transaction d’origine inchangés après la signature de l’utilisateur.

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.

Pour une transaction historique, utilisez gasPrice à la place des deux champs de frais EIP-1559 et sérialisez-la comme une transaction historique.

Dernière mise à jour le