Skip to Content
Hardware
SDK DE HARDWARE / ETHEREUM Y EVM

evmSignTransaction

Solicita una firma confirmada en el dispositivo para una transacción heredada o EIP-1559 (Type 2). El dispositivo deriva la clave a partir de tu ruta BIP32; tu aplicación serializa y difunde el resultado. Los detalles decodificados de la transacción dependen del firmware y de calldata.

const result = await HardwareSDK.evmSignTransaction(connectId, deviceId, params);
01 Preparar02 Confirmar en el dispositivo03 Serializar y enviar

Antes de llamar

Parámetros

connectIdstringobligatorio

El identificador de conexión que devuelve la detección de dispositivos.

deviceIdstringobligatorio

La identidad de cartera que devuelve getDeviceState.

params.pathstring | number[]obligatorio

Ruta de derivación BIP32 con al menos tres componentes.

params.transactionobjectobligatorio

Una transacción heredada o EIP-1559. Las cantidades numéricas usan cadenas hexadecimales; chainId es un número.

Parámetros comunes opcionales

Campos de la transacción

CampoTipoDescripción
chainIdnumberID de cadena de la red de destino. Va dentro de transaction.
tostringDirección de destino; el contrato del token para llamadas ERC-20.
valuestringImporte en wei codificado en hexadecimal. Usa 0x0 para llamadas ERC-20.
noncestringNúmero de transacciones de la cuenta remitente como cantidad hexadecimal.
gasLimitstringLímite de gas como cantidad hexadecimal.
datastring · optionalCalldata completa codificada en hexadecimal; usa 0x si no hay calldata.
maxFeePerGasstring · EIP-1559Comisión total máxima por unidad de gas, en wei codificados en hexadecimal.
maxPriorityFeePerGasstring · EIP-1559Comisión de prioridad máxima por unidad de gas, en wei codificados en hexadecimal.
gasPricestring · LegacyPrecio del gas heredado, en wei codificados en hexadecimal.

Esta página cubre EVMTransaction y EVMTransactionEIP1559. Consulta Rutas HD para el formato de rutas. Asegúrate de que el RPC de destino admita el tipo de transacción.

EIP-1559 requiere ambos campos de comisión; el formato heredado usa gasPrice. No pases type: 2 al SDK; selecciona el tipo al serializar la transacción firmada.

Clear Signing

Usa este mismo método para transferencias nativas, transferencias ERC-20, autorizaciones o revocaciones y llamadas a contratos. Para llamadas ERC-20, to es el contrato del token y value es cero; calldata contiene el destinatario o beneficiario de la autorización y el importe del token. El firmware compatible decodifica automáticamente los formatos reconocidos. No existe un parámetro clearSigning, de metadatos de token ni de etiqueta de contrato.

Consulta la guía de Clear Signing para ver la tabla de entrada/visualización y el comportamiento con contratos desconocidos. Para EIP-712 y firmas de propietarios de Safe, usa evmSignTypedData.

Ejemplos

Los fragmentos siguientes presuponen un SDK inicializado y una cartera seleccionada. Sustituye el destinatario de ejemplo y obtén el nonce, el gas y las comisiones de la red de destino antes de firmar.

EIP-1559 requiere tanto maxFeePerGas como maxPriorityFeePerGas. El formato antiguo usa 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);

Estos ejemplos seleccionan la cartera estándar. Para una cartera oculta, pasa los mismos parámetros comunes de cartera usados al confirmar la cuenta.

Respuesta

Comprueba success antes de leer los datos devueltos. Una respuesta correcta contiene v, r, y s; el SDK no difunde la transacción.

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

Serializar la transacción firmada

El SDK devuelve una firma; tu aplicación ensambla y difunde la transacción. Este ejemplo usa paquetes de ethers v5. Mantén intactos los campos originales de la transacción después de que el usuario firme.

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.

Para una transacción heredada, usa gasPrice en lugar de los dos campos de comisión EIP-1559 y serialízala como transacción heredada.

Última actualización el