EVM (eth-sign-request)
eth-sign-request
| Clave | Campo | Tipo | Contenido |
|---|---|---|---|
| 1 | request-id | 37(bytes) | 16 bytes aleatorios (se aceptan de 1 a 64) |
| 2 | sign-data | bytes | Lo que se va a firmar, según el tipo de datos (ver abajo) |
| 3 | data-type | uint | 1, 2, 3 o 4 |
| 4 | chain-id | uint | El chain ID de EVM. Obligatorio para transacciones; recomendado para todo lo demás |
| 5 | derivation-path | 304(crypto-keypath) | Ruta completa, p. ej. m/44'/60'/0'/0/0, con la huella digital maestra |
| 6 | address | bytes (20) | La dirección del firmante como bytes sin procesar, no como texto 0x |
| 7 | origin | texto | Se muestra al usuario, p. ej. "BitTool Wallet" |
Tipos de datos
| data-type | sign-data | Origen típico |
|---|---|---|
1 transacción | La RLP de la transacción legacy sin firmar con un chain ID EIP-155: rlp([nonce, gasPrice, gas, to, value, data, chainId, 0, 0]) | eth_sendTransaction en cadenas donde usas gas legacy |
4 transacción tipada | El sobre EIP-2718 sin firmar: 0x02 ‖ rlp([...]) (EIP-1559) o 0x01 ‖ rlp([...]) (EIP-2930) | eth_sendTransaction, la mayoría de los envíos modernos |
3 mensaje personal | Los bytes sin procesar del mensaje, sin el prefijo "\x19Ethereum Signed Message:\n" y sin aplicarles hash | personal_sign |
2 datos tipados | El JSON EIP-712 en UTF-8: {types, primaryType, domain, message} | eth_signTypedData_v4 |
Envía bytes, nunca un hash. BitTool Signer analiza lo que firma y se niega a firmar a ciegas digests de 32 bytes.
Redes
El chain ID en los bytes de la transacción, en la clave 4 y (para datos tipados) en domain.chainId deben coincidir, y deben ser uno de estos:
| Chain ID | Red | Chain ID | Red | |
|---|---|---|---|---|
| 1 | Ethereum | 10 | OP Mainnet | |
| 56 | BNB Chain | 137 | Polygon PoS | |
| 42161 | Arbitrum One | 100 | Gnosis | |
| 8453 | Base | 43114 | Avalanche C-Chain |
No compatible
Transacciones blob (tipo 3), transacciones EIP-7702 (tipo 4), transacciones legacy no protegidas sin chain ID y eth_sign de un hash sin procesar de 32 bytes. Las solicitudes para otros chain IDs se rechazan.
Reglas de EIP-712
BitTool Signer calcula el hash de los datos tipados exactamente como se declaran y es estricto con los valores, porque un valor que se muestra de una forma pero se hashea de otra es un truco clásico de phishing:
- Los valores
booldeben sertrue/falsede JSON, no cadenas. - Los enteros pueden ser números JSON solo hasta 253 − 1; los valores mayores deben ser cadenas decimales sin ceros a la izquierda, o cadenas hex
0x. - Los valores
addressson0x+ 40 dígitos hex, y las direcciones con mayúsculas y minúsculas mezcladas deben tener un checksum EIP-55 válido;bytesNdebe tener exactamente N bytes. - El
messagedebe tener exactamente los campos que declara su tipo: ni campos faltantes ni campos adicionales. EIP712Domainsolo puede contenername,version,chainId,verifyingContractysalt; para el separador de dominio se usa el orden declarado.
Las estructuras conocidas reciben una revisión completa: Permit de ERC-2612 / DAI, Permit2 (single, batch, transfer-from), SafeTx de Safe y órdenes de marketplaces de NFT (Seaport, LooksRare, Blur). Todo lo demás se muestra campo por campo y se marca como parcialmente decodificado.
Mensajes personales
Cualquier secuencia de 1 a 8,192 bytes. El UTF-8 válido se muestra como texto; cualquier otra cosa, como hex, marcada como opaca. Un mensaje de 32 bytes se marca como de alto riesgo, porque probablemente es un hash que el usuario no puede leer.
eth-signature
eth-signature = {
1: 37(request-id bytes), ; copied from the request
2: signature ; r (32) ‖ s (32) ‖ v (1 or more bytes)
}
La firma no es una transacción firmada; es tu billetera la que ensambla la transacción. La parte v depende del tipo de datos:
| data-type | v | Longitud |
|---|---|---|
1 transacción legacy | chainId × 2 + 35 + yParity (EIP-155), big-endian, con la menor cantidad de bytes necesaria | 65 bytes o más |
4 transacción tipada | yParity (0 o 1) | 65 |
2, 3 mensajes | 27 + yParity | 65 |
Así que lee v como un entero big-endian sin signo desde el byte 64 hasta el final. Por ejemplo, en Avalanche (chain ID 43114) un v legacy es 86263 o 86264, tres bytes, y la firma mide 67 bytes. El código que siempre toma el byte 64 como v falla con cualquier chain ID de 110 o más.
Para terminar:
- Verifica el ID de solicitud.
- Recupera el firmante a partir del digest que esperas (hash de la transacción, hash EIP-191 o hash EIP-712) y compáralo con la dirección emparejada.
- Para transacciones, inserta
r,sy la paridad en la transacción sin firmar, serialízala y verifica el hash de la transacción antes de transmitirla.
Código
Con ethers y @keystonehq/bc-ur-registry-eth de Keystone:
import { randomUUID } from 'node:crypto';
import { Transaction, Signature, getBytes } from 'ethers';
import { EthSignRequest, DataType, ETHSignature } from '@keystonehq/bc-ur-registry-eth';
import { URDecoder } from '@ngraveio/bc-ur';
export function buildEthRequest(tx, { path, masterFingerprint, address }) {
const unsigned = Transaction.from(tx); // no signature yet
const requestId = randomUUID();
const request = EthSignRequest.constructETHRequest(
Buffer.from(getBytes(unsigned.unsignedSerialized)), // the bytes to sign, not a hash
unsigned.type === 0 ? DataType.transaction : DataType.typedTransaction, // 1 or 4
path, // "m/44'/60'/0'/0/0"
masterFingerprint, // "73c5da0a"
requestId,
Number(unsigned.chainId),
address,
'BitTool Wallet', // origin, shown to the user
);
const encoder = request.toUREncoder(400); // fragment length in bytes
const frames = [];
for (let i = 0; i < encoder.fragmentsLength; i++) frames.push(encoder.nextPart().toUpperCase());
return { unsigned, requestId, frames };
}
export function readEthSignature(frames, { unsigned, requestId, address }) {
const decoder = new URDecoder();
for (const frame of frames) decoder.receivePart(frame);
if (!decoder.isSuccess()) throw new Error('Incomplete or invalid QR');
const ur = decoder.resultUR();
if (ur.type !== 'eth-signature') throw new Error(`Expected eth-signature, got ${ur.type}`);
const response = ETHSignature.fromCBOR(ur.cbor);
const id = response.getRequestId();
if (!id || Buffer.from(id).toString('hex') !== requestId.replace(/-/g, '')) throw new Error('Signature is for another request');
const sig = Buffer.from(response.getSignature()); // r (32) ‖ s (32) ‖ v (1+ bytes)
const r = '0x' + sig.subarray(0, 32).toString('hex');
const s = '0x' + sig.subarray(32, 64).toString('hex');
const v = BigInt('0x' + sig.subarray(64).toString('hex'));
const yParity = unsigned.type === 0 ? Number(v - unsigned.chainId * 2n - 35n) : Number(v);
if (yParity !== 0 && yParity !== 1) throw new Error('Unexpected v');
const signed = unsigned.clone();
signed.signature = Signature.from({ r, s, yParity });
if (signed.from !== address) throw new Error('Signed by an unexpected key');
return signed.serialized; // ready for eth_sendRawTransaction
}
Vectores de prueba
Todos desde m/44'/60'/0'/0/0 (0x9858EfFD232B4033E47d90003D41EC34EcaEda94) de la frase de prueba.
- Transferencia de ETH (EIP-1559)
- Transferencia ERC-20
- Legacy (BNB Chain)
- v de varios bytes (Avalanche)
- personal_sign
- EIP-712 (Permit)
Envía 0.01 ETH en Ethereum, nonce 12, comisión máxima de 30 gwei, comisión de prioridad de 1 gwei.
Solicitud (tu billetera → BitTool Signer)
{
"1 request-id": {
"uuid (tag 37)": "5f1e9b2c7d3a4e6f8a0b1c2d3e4f5a01"
},
"2 sign-data": "02ef010c843b9aca008506fc23ac0082520894000000000000000000000000000000000000dead872386f26fc1000080c0",
"3 data-type": 4,
"4 chain-id": 1,
"5 derivation-path": {
"crypto-keypath (tag 304)": {
"1 components": [
44,
true,
60,
true,
0,
true,
0,
false,
0,
false
],
"2 source-fingerprint": 1942346250
}
},
"6 address": "9858effd232b4033e47d90003d41ec34ecaeda94",
"7 origin": "BitTool Wallet"
}
Mostrar el texto del QR y el CBOR sin procesar
UR:ETH-SIGN-REQUEST/OSADTPDAGDHECKNDDWKIFTGLJLLEBDCEDPFMGWHTADAOHDEHAOWSADBNLRFRNYSGAELPAMZTCNPSAELFGMAYMWAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEUEPMLTCNLNWZJLSEAEAELARTAXAAAAADAHTAADDYOEADLECSDWYKCSFNYKAEYKAEWKAEWKAOCYJKSKTNBKAMGHMKHDWSZCCNDNFZEOVEKIMHAEFSFPWPEEWPPLTNMWATJTFWINJYGHJLJLJZCXHGHSJZJZIHJYKEBDYTMH
a701d825505f1e9b2c7d3a4e6f8a0b1c2d3e4f5a0102583102ef010c843b9aca008506fc23ac0082520894000000000000000000000000000000000000dead872386f26fc1000080c00304040105d90130a2018a182cf5183cf500f500f400f4021a73c5da0a06549858effd232b4033e47d90003d41ec34ecaeda94076e426974546f6f6c2057616c6c6574
Respuesta (BitTool Signer → tu billetera)
{
"request-id": {
"uuid": "5f1e9b2c7d3a4e6f8a0b1c2d3e4f5a01"
},
"signature": "6d11ee93f7876a78ea19f4f9c8e551e4522b6deb8349a6572d076b4e67ceb4416db3f690b339bf658a5c8d2ad2f75cdf3252f07f940a821f65bb6cb91e9782a101"
}
Mostrar el texto del QR y el CBOR sin procesar
UR:ETH-SIGNATURE/OEADTPDAGDHECKNDDWKIFTGLJLLEBDCEDPFMGWHTADAOHDFPJNBYWYMUYLLTIMKSWDCFWKYTSPVWGYVEGMDNJNWMLSGAOLHGDPATJEGLIOTOQZFPJNQDYNMHQDESRSIHLEHHLGDRTDYLHHUREYGMWTLBMWBKLFCTIHRKJZRHCKMSLFOYADCWJNLUAY
a201d825505f1e9b2c7d3a4e6f8a0b1c2d3e4f5a010258416d11ee93f7876a78ea19f4f9c8e551e4522b6deb8349a6572d076b4e67ceb4416db3f690b339bf658a5c8d2ad2f75cdf3252f07f940a821f65bb6cb91e9782a101
Ensamblado por tu billetera
0x02f872010c843b9aca008506fc23ac0082520894000000000000000000000000000000000000dead872386f26fc1000080c001a06d11ee93f7876a78ea19f4f9c8e551e4522b6deb8349a6572d076b4e67ceb441a06db3f690b339bf658a5c8d2ad2f75cdf3252f07f940a821f65bb6cb91e9782a1
0xd7e69271cce78ffdf924b78126b93fb3cdf4f797f7e216bcb6702c8d97b47ea3
Envía 25 USDT (0xdAC17F958D2ee523a2206206994597C13D831ec7) a 0x…dEaD: una transacción tipo 2 al contrato del token con calldata transfer(address,uint256).
Solicitud (tu billetera → BitTool Signer)
{
"1 request-id": {
"uuid (tag 37)": "5f1e9b2c7d3a4e6f8a0b1c2d3e4f5a02"
},
"2 sign-data": "02f86d010d843b9aca008506fc23ac0082fde894dac17f958d2ee523a2206206994597c13d831ec780b844a9059cbb000000000000000000000000000000000000000000000000000000000000dead00000000000000000000000000000000000000000000000000000000017d7840c0",
"3 data-type": 4,
"4 chain-id": 1,
"5 derivation-path": {
"crypto-keypath (tag 304)": {
"1 components": [
44,
true,
60,
true,
0,
true,
0,
false,
0,
false
],
"2 source-fingerprint": 1942346250
}
},
"6 address": "9858effd232b4033e47d90003d41ec34ecaeda94",
"7 origin": "BitTool Wallet"
}
Mostrar el texto del QR y el CBOR sin procesar
UR:ETH-SIGN-REQUEST/1-2/LPADAOCSSBCYBAKGFGLDHDIYOSADTPDAGDHECKNDDWKIFTGLJLLEBDCEDPFMGWHTAOAOHDJOAOYAJNADBTLRFRNYSGAELPAMZTCNPSAELFZCVSMWTNSELBMDLGDMVWCNOECXIDAMNLFEMSSEFSLSCKSTLAROFYPTAHNSRKAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEUEWZKKWPDA
UR:ETH-SIGN-REQUEST/2-2/LPAOAOCSSBCYBAKGFGLDHDIYPMAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEADKIKSFZRTAXAAAAADAHTAADDYOEADLECSDWYKCSFNYKAEYKAEWKAEWKAOCYJKSKTNBKAMGHMKHDWSZCCNDNFZEOVEKIMHAEFSFPWPEEWPPLTNMWATJTFWINJYGHJLJLJZCXHGHSJZJZIHJYAEMTOECYFP
a701d825505f1e9b2c7d3a4e6f8a0b1c2d3e4f5a0202587002f86d010d843b9aca008506fc23ac0082fde894dac17f958d2ee523a2206206994597c13d831ec780b844a9059cbb000000000000000000000000000000000000000000000000000000000000dead00000000000000000000000000000000000000000000000000000000017d7840c00304040105d90130a2018a182cf5183cf500f500f400f4021a73c5da0a06549858effd232b4033e47d90003d41ec34ecaeda94076e426974546f6f6c2057616c6c6574
Respuesta (BitTool Signer → tu billetera)
{
"request-id": {
"uuid": "5f1e9b2c7d3a4e6f8a0b1c2d3e4f5a02"
},
"signature": "b655c3c1583521ea9512813649eb67e3d448a82323f3f918733f1f1c81fecfac6c8d3eba455e89df4340648addba1ac384d686d3d6fb1dd876159d436c1d874900"
}
Mostrar el texto del QR y el CBOR sin procesar
UR:ETH-SIGNATURE/OEADTPDAGDHECKNDDWKIFTGLJLLEBDCEDPFMGWHTAOAOHDFPRPGOSRSEHDECCLWDMDBGLYENGAWMIOVLTYFDPDCNCNWFYTCSJKFHCTCELYZETKPSJZLGFMRDFEHYLDURFXFZIELEUTRDCYSRLRTBLNTETBZOCATPKOBZNTFXJZCALTGAAEIOVDDSDP
a201d825505f1e9b2c7d3a4e6f8a0b1c2d3e4f5a02025841b655c3c1583521ea9512813649eb67e3d448a82323f3f918733f1f1c81fecfac6c8d3eba455e89df4340648addba1ac384d686d3d6fb1dd876159d436c1d874900
Ensamblado por tu billetera
0x02f8b0010d843b9aca008506fc23ac0082fde894dac17f958d2ee523a2206206994597c13d831ec780b844a9059cbb000000000000000000000000000000000000000000000000000000000000dead00000000000000000000000000000000000000000000000000000000017d7840c080a0b655c3c1583521ea9512813649eb67e3d448a82323f3f918733f1f1c81fecfaca06c8d3eba455e89df4340648addba1ac384d686d3d6fb1dd876159d436c1d8749
0x833608a1dc2a1a9d3c0cbd3efc5bb2edcfecb6df6529046fec37409e8b2d8a07
Envía 0.05 BNB con una transacción EIP-155 legacy (tipo 0), chain ID 56: v es 147 o 148.
Solicitud (tu billetera → BitTool Signer)
{
"1 request-id": {
"uuid (tag 37)": "5f1e9b2c7d3a4e6f8a0b1c2d3e4f5a03"
},
"2 sign-data": "ea03843b9aca0082520894000000000000000000000000000000000000dead87b1a2bc2ec5000080388080",
"3 data-type": 1,
"4 chain-id": 56,
"5 derivation-path": {
"crypto-keypath (tag 304)": {
"1 components": [
44,
true,
60,
true,
0,
true,
0,
false,
0,
false
],
"2 source-fingerprint": 1942346250
}
},
"6 address": "9858effd232b4033e47d90003d41ec34ecaeda94",
"7 origin": "BitTool Wallet"
}
Mostrar el texto del QR y el CBOR sin procesar
UR:ETH-SIGN-REQUEST/OSADTPDAGDHECKNDDWKIFTGLJLLEBDCEDPFMGWHTAXAOHDDNWDAXLRFRNYSGAELFGMAYMWAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEUEPMLTPAOERFDMSKAEAELAETLALAAXADAACSETAHTAADDYOEADLECSDWYKCSFNYKAEYKAEWKAEWKAOCYJKSKTNBKAMGHMKHDWSZCCNDNFZEOVEKIMHAEFSFPWPEEWPPLTNMWATJTFWINJYGHJLJLJZCXHGHSJZJZIHJYBEDATTTB
a701d825505f1e9b2c7d3a4e6f8a0b1c2d3e4f5a0302582bea03843b9aca0082520894000000000000000000000000000000000000dead87b1a2bc2ec5000080388080030104183805d90130a2018a182cf5183cf500f500f400f4021a73c5da0a06549858effd232b4033e47d90003d41ec34ecaeda94076e426974546f6f6c2057616c6c6574
Respuesta (BitTool Signer → tu billetera)
{
"request-id": {
"uuid": "5f1e9b2c7d3a4e6f8a0b1c2d3e4f5a03"
},
"signature": "99b9b24ba7971ac9b6f978fa9cf7222d763a01f383b78b675fe6f19cd91c24d50a84cb670f593c3b3b07c7e279dc038d6985283b5ea418c882816ecf3886197f94"
}
Mostrar el texto del QR y el CBOR sin procesar
UR:ETH-SIGNATURE/OEADTPDAGDHECKNDDWKIFTGLJLLEBDCEDPFMGWHTAXAOHDFPNLRHPRGROSMSCYSORPYTKSZSNSYLCPDPKOFTADWFLSRLLUIOHEVAWNNSTACEDKTLBKLRSBIOBSHKFNFRFRATSTVOKKUOAXLGINLPDEFRHYOXCSSPLFLYJTTKETLNCFLBMWHPFRGTJO
a201d825505f1e9b2c7d3a4e6f8a0b1c2d3e4f5a0302584199b9b24ba7971ac9b6f978fa9cf7222d763a01f383b78b675fe6f19cd91c24d50a84cb670f593c3b3b07c7e279dc038d6985283b5ea418c882816ecf3886197f94
Ensamblado por tu billetera
0xf86b03843b9aca0082520894000000000000000000000000000000000000dead87b1a2bc2ec50000808194a099b9b24ba7971ac9b6f978fa9cf7222d763a01f383b78b675fe6f19cd91c24d5a00a84cb670f593c3b3b07c7e279dc038d6985283b5ea418c882816ecf3886197f
0xd55bd1f2a22d1be562f20f1183b1d21668ac489c13ef1691e489c20bf5e9f345
Transacción legacy en el chain ID 43114: v = 43114 × 2 + 35 + yParity necesita tres bytes.
Solicitud (tu billetera → BitTool Signer)
{
"1 request-id": {
"uuid (tag 37)": "5f1e9b2c7d3a4e6f8a0b1c2d3e4f5a04"
},
"2 sign-data": "e6808505d21dba0082520894000000000000000000000000000000000000dead018082a86a8080",
"3 data-type": 1,
"4 chain-id": 43114,
"5 derivation-path": {
"crypto-keypath (tag 304)": {
"1 components": [
44,
true,
60,
true,
0,
true,
0,
false,
0,
false
],
"2 source-fingerprint": 1942346250
}
},
"6 address": "9858effd232b4033e47d90003d41ec34ecaeda94",
"7 origin": "BitTool Wallet"
}
Mostrar el texto del QR y el CBOR sin procesar
UR:ETH-SIGN-REQUEST/OSADTPDAGDHECKNDDWKIFTGLJLLEBDCEDPFMGWHTAAAOHDDIVALALPAHTDCARDAELFGMAYMWAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEUEPMADLALFPDIMLALAAXADAACFPDIMAHTAADDYOEADLECSDWYKCSFNYKAEYKAEWKAEWKAOCYJKSKTNBKAMGHMKHDWSZCCNDNFZEOVEKIMHAEFSFPWPEEWPPLTNMWATJTFWINJYGHJLJLJZCXHGHSJZJZIHJYVAFRKEEN
a701d825505f1e9b2c7d3a4e6f8a0b1c2d3e4f5a04025827e6808505d21dba0082520894000000000000000000000000000000000000dead018082a86a808003010419a86a05d90130a2018a182cf5183cf500f500f400f4021a73c5da0a06549858effd232b4033e47d90003d41ec34ecaeda94076e426974546f6f6c2057616c6c6574
Respuesta (BitTool Signer → tu billetera)
{
"request-id": {
"uuid": "5f1e9b2c7d3a4e6f8a0b1c2d3e4f5a04"
},
"signature": "0fbf3979a6eb15c48fc1c21582ec103413606277938a725fade823a28f3c3df41127fb3ced53ae9d8928736e2f485b2cdd6cde01d8a32c6c011cd3ce5cd0fe070150f7"
}
Mostrar el texto del QR y el CBOR sin procesar
UR:ETH-SIGNATURE/OEADTPDAGDHECKNDDWKIFTGLJLLEBDCEDPFMGWHTAAAOHDFXBSRSESKKOLWMBZSSMYSESABZLFWPBEEEBWHNIDKTMULEJPHEPMVSCNOEMYFNFSWKBYDIZOFNWEGUPLNTLDDEJKJTDLFDHPDWUTJZUEADTPOTDWJZADCETETOHHTIZEATADGDYLGTRNGSJZ
a201d825505f1e9b2c7d3a4e6f8a0b1c2d3e4f5a040258430fbf3979a6eb15c48fc1c21582ec103413606277938a725fade823a28f3c3df41127fb3ced53ae9d8928736e2f485b2cdd6cde01d8a32c6c011cd3ce5cd0fe070150f7
Ensamblado por tu billetera
0xf867808505d21dba0082520894000000000000000000000000000000000000dead0180830150f7a00fbf3979a6eb15c48fc1c21582ec103413606277938a725fade823a28f3c3df4a01127fb3ced53ae9d8928736e2f485b2cdd6cde01d8a32c6c011cd3ce5cd0fe07
0x7ccf66af770795af5b7457ac738c6a9ba2d3ebb3ca7203cf9d4e65f815f82678
Un mensaje de Sign-In with Ethereum (EIP-4361). sign-data es el propio texto UTF-8; la firma usa v = 27/28.
Solicitud (tu billetera → BitTool Signer)
{
"1 request-id": {
"uuid (tag 37)": "5f1e9b2c7d3a4e6f8a0b1c2d3e4f5a06"
},
"2 sign-data": "6170702e6578616d706c652e6f72672077616e747320796f7520746f207369676e20696e207769746820796f757220457468657265756d206163636f756e743a0a3078393835384566464432333242343033334534376439303030334434314543333445636145646139340a0a5369676e20696e20746f204578616d706c65204170702e0a0a5552493a2068747470733a2f2f6170702e6578616d706c652e6f72670a56657273696f6e3a20310a436861696e2049443a20310a4e6f6e63653a203866336b326d39710a4973737565642041743a20323032362d31302d31385430393a33303a30302e3030305a",
"3 data-type": 3,
"4 chain-id": 1,
"5 derivation-path": {
"crypto-keypath (tag 304)": {
"1 components": [
44,
true,
60,
true,
0,
true,
0,
false,
0,
false
],
"2 source-fingerprint": 1942346250
}
},
"6 address": "9858effd232b4033e47d90003d41ec34ecaeda94",
"7 origin": "BitTool Wallet"
}
Mostrar el texto del QR y el CBOR sin procesar
UR:ETH-SIGN-REQUEST/1-2/LPADAOCFADFDCYCMDSCMFHHDOXOSADTPDAGDHECKNDDWKIFTGLJLLEBDCEDPFMGWHTAMAOHDWEHSJOJODMIHKSHSJNJOJZIHDMJLJPIOCXKTHSJTJYJKCXKKJLKPCXJYJLCXJKINIOJTCXINJTCXKTINJYISCXKKJLKPJPCXFEJYISIHJPIHKPJNCXHSIAIAJLKPJTJYFTBKDYKSESETECETFEIYFGFYEYEOEYFWEEDYEOEOFEEEEMIEESDYDYDYEOFYEEEHFEFXEOEEFEIAHSFEIEHSESEEBKBKGUINIOJTCXINJTCXJYJLCXFEKSHSJNJOJZIHCXFPJOJODMBKBKGOGMGAFTCXISCPDEGMOY
UR:ETH-SIGN-REQUEST/2-2/LPAOAOCFADFDCYCMDSCMFHHDOXJYJYJOJKFTDLDLHSJOJODMIHKSHSJNJOJZIHDMJLJPIOBKHFIHJPJKINJLJTFTCXEHBKFXISHSINJTCXGAFYFTCXEHBKGLJLJTIAIHFTCXETIYEOJEEYJNESJSBKGAJKJKKPIHIECXFPJYFTCXEYDYEYENDPEHDYDPEHETGHDYESFTEODYFTDYDYDMDYDYDYHTAXAXAAADAHTAADDYOEADLECSDWYKCSFNYKAEYKAEWKAEWKAOCYJKSKTNBKAMGHMKHDWSZCCNDNFZEOVEKIMHAEFSFPWPEEWPPLTNMWATJTFWINJYGHJLJLJZCXHGHSJZJZIHJYCWTTFYJT
a701d825505f1e9b2c7d3a4e6f8a0b1c2d3e4f5a060258ed6170702e6578616d706c652e6f72672077616e747320796f7520746f207369676e20696e207769746820796f757220457468657265756d206163636f756e743a0a3078393835384566464432333242343033334534376439303030334434314543333445636145646139340a0a5369676e20696e20746f204578616d706c65204170702e0a0a5552493a2068747470733a2f2f6170702e6578616d706c652e6f72670a56657273696f6e3a20310a436861696e2049443a20310a4e6f6e63653a203866336b326d39710a4973737565642041743a20323032362d31302d31385430393a33303a30302e3030305a0303040105d90130a2018a182cf5183cf500f500f400f4021a73c5da0a06549858effd232b4033e47d90003d41ec34ecaeda94076e426974546f6f6c2057616c6c6574
Respuesta (BitTool Signer → tu billetera)
{
"request-id": {
"uuid": "5f1e9b2c7d3a4e6f8a0b1c2d3e4f5a06"
},
"signature": "23c5ba3f5d247b4c81d55b7c44a3951a14c82e70f17ef2c19abea893c4e5bef05795a7261ac2bd9da29be2dfef529327e1b0724580fccac106bed3d007854f6b1b"
}
Mostrar el texto del QR y el CBOR sin procesar
UR:ETH-SIGNATURE/OEADTPDAGDHECKNDDWKIFTGLJLLEBDCEDPFMGWHTAMAOHDFPCNSKRDFHHLDKKGGSLYTLHPKEFYOTMDCYBBSPDMJOWNKBWZSENYRNPDMUSSVWRNWTHGMDOSDSCYSARYNTOENDVOURWSGMMUDIVYPFJPFELAZTSGSEAMRNTETIATLPGWJECWWNKEFGEH
a201d825505f1e9b2c7d3a4e6f8a0b1c2d3e4f5a0602584123c5ba3f5d247b4c81d55b7c44a3951a14c82e70f17ef2c19abea893c4e5bef05795a7261ac2bd9da29be2dfef529327e1b0724580fccac106bed3d007854f6b1b
Ensamblado por tu billetera
0x23c5ba3f5d247b4c81d55b7c44a3951a14c82e70f17ef2c19abea893c4e5bef05795a7261ac2bd9da29be2dfef529327e1b0724580fccac106bed3d007854f6b1b
Un Permit de ERC-2612 para USDC: autoriza a un router a gastar 100 USDC. BitTool Signer lo muestra como una aprobación de token y compara el spender (la dirección autorizada a gastar) con su lista de contratos conocidos.
Solicitud (tu billetera → BitTool Signer)
{
"1 request-id": {
"uuid (tag 37)": "5f1e9b2c7d3a4e6f8a0b1c2d3e4f5a07"
},
"2 sign-data": "7b227479706573223a7b22454950373132446f6d61696e223a5b7b226e616d65223a226e616d65222c2274797065223a22737472696e67227d2c7b226e616d65223a2276657273696f6e222c2274797065223a22737472696e67227d2c7b226e616d65223a22636861696e4964222c2274797065223a2275696e74323536227d2c7b226e616d65223a22766572696679696e67436f6e7472616374222c2274797065223a2261646472657373227d5d2c225065726d6974223a5b7b226e616d65223a226f776e6572222c2274797065223a2261646472657373227d2c7b226e616d65223a227370656e646572222c2274797065223a2261646472657373227d2c7b226e616d65223a2276616c7565222c2274797065223a2275696e74323536227d2c7b226e616d65223a226e6f6e6365222c2274797065223a2275696e74323536227d2c7b226e616d65223a22646561646c696e65222c2274797065223a2275696e74323536227d5d7d2c227072696d61727954797065223a225065726d6974222c22646f6d61696e223a7b226e616d65223a2255534420436f696e222c2276657273696f6e223a2232222c22636861696e4964223a312c22766572696679696e67436f6e7472616374223a22307841306238363939316336323138623336633164313944346132653945623063453336303665423438227d2c226d657373616765223a7b226f776e6572223a22307839383538456646443233324234303333453437643930303033443431454333344563614564613934222c227370656e646572223a22307836366139383933634330374439314439353634344145444430354430336639356531644241384166222c2276616c7565223a22313030303030303030222c226e6f6e6365223a2230222c22646561646c696e65223a2231373932333130343030227d7d",
"3 data-type": 2,
"4 chain-id": 1,
"5 derivation-path": {
"crypto-keypath (tag 304)": {
"1 components": [
44,
true,
60,
true,
0,
true,
0,
false,
0,
false
],
"2 source-fingerprint": 1942346250
}
},
"6 address": "9858effd232b4033e47d90003d41ec34ecaeda94",
"7 origin": "BitTool Wallet"
}
Mostrar el texto del QR y el CBOR sin procesar
UR:ETH-SIGN-REQUEST/1-5/LPADAHCFAXAMCYBBGTHYTPHDNDOSADTPDAGDHECKNDDWKIFTGLJLLEBDCEDPFMGWHTATAOHKAOPKKGCPJYKKJOIHJKCPFTKGCPFEGAGDEMEHEYFYJLJNHSINJTCPFTHPKGCPJTHSJNIHCPFTCPJTHSJNIHCPDWCPJYKKJOIHCPFTCPJKJYJPINJTIOCPKIDWKGCPJTHSJNIHCPFTCPKOIHJPJKINJLJTCPDWCPJYKKJOIHCPFTCPJKJYJPINJTIOCPKIDWKGCPJTHSJNIHCPFTCPIAISHSINJTGAIECPDWCPJYKKJOIHCPFTCPKPINJTJYEYECENCPKIDWKGSEJYVSDM
UR:ETH-SIGN-REQUEST/2-5/LPAOAHCFAXAMCYBBGTHYTPHDNDCPJTHSJNIHCPFTCPKOIHJPINIYKKINJTIOFXJLJTJYJPHSIAJYCPDWCPJYKKJOIHCPFTCPHSIEIEJPIHJKJKCPKIHLDWCPGDIHJPJNINJYCPFTHPKGCPJTHSJNIHCPFTCPJLKTJTIHJPCPDWCPJYKKJOIHCPFTCPHSIEIEJPIHJKJKCPKIDWKGCPJTHSJNIHCPFTCPJKJOIHJTIEIHJPCPDWCPJYKKJOIHCPFTCPHSIEIEJPIHJKJKCPKIDWKGCPJTHSJNIHCPFTCPKOHSJZKPIHCPDWCPJYKKJOIHCPFTCPKPINJTJYEYRHHYPSDY
UR:ETH-SIGN-REQUEST/3-5/LPAXAHCFAXAMCYBBGTHYTPHDNDECENCPKIDWKGCPJTHSJNIHCPFTCPJTJLJTIAIHCPDWCPJYKKJOIHCPFTCPKPINJTJYEYECENCPKIDWKGCPJTHSJNIHCPFTCPIEIHHSIEJZINJTIHCPDWCPJYKKJOIHCPFTCPKPINJTJYEYECENCPKIHLKIDWCPJOJPINJNHSJPKKGHKKJOIHCPFTCPGDIHJPJNINJYCPDWCPIEJLJNHSINJTCPFTKGCPJTHSJNIHCPFTCPGOGUFYCXFXJLINJTCPDWCPKOIHJPJKINJLJTCPFTCPEYCPDWCPIAISHSINJTGAIECPFTEHDWGSDWASGE
UR:ETH-SIGN-REQUEST/4-5/LPAAAHCFAXAMCYBBGTHYTPHDNDCPKOIHJPINIYKKINJTIOFXJLJTJYJPHSIAJYCPFTCPDYKSFPDYIDETENESESEHIAENEYEHETIDEOENIAEHIEEHESFYEEHSEYIHESFEIDDYIAFEEOENDYENIHFWEEETCPKIDWCPJNIHJKJKHSIOIHCPFTKGCPJLKTJTIHJPCPFTCPDYKSESETECETFEIYFGFYEYEOEYFWEEDYEOEOFEEEEMIEESDYDYDYEOFYEEEHFEFXEOEEFEIAHSFEIEHSESEECPDWCPJKJOIHJTIEIHJPCPFTCPDYKSENENHSESETESEOIAFXDYEMFYIDCFRFJN
UR:ETH-SIGN-REQUEST/5-5/LPAHAHCFAXAMCYBBGTHYTPHDNDESEHFYESECENEEEEFPFEFYFYDYECFYDYEOIYESECIHEHIEFWFPETFPIYCPDWCPKOHSJZKPIHCPFTCPEHDYDYDYDYDYDYDYDYCPDWCPJTJLJTIAIHCPFTCPDYCPDWCPIEIHHSIEJZINJTIHCPFTCPEHEMESEYEOEHDYEEDYDYCPKIKIAXAOAAADAHTAADDYOEADLECSDWYKCSFNYKAEYKAEWKAEWKAOCYJKSKTNBKAMGHMKHDWSZCCNDNFZEOVEKIMHAEFSFPWPEEWPPLTNMWATJTFWINJYGHJLJLJZCXHGHSJZJZIHJYAESAEMGODP
a701d825505f1e9b2c7d3a4e6f8a0b1c2d3e4f5a07025902aa7b227479706573223a7b22454950373132446f6d61696e223a5b7b226e616d65223a226e616d65222c2274797065223a22737472696e67227d2c7b226e616d65223a2276657273696f6e222c2274797065223a22737472696e67227d2c7b226e616d65223a22636861696e4964222c2274797065223a2275696e74323536227d2c7b226e616d65223a22766572696679696e67436f6e7472616374222c2274797065223a2261646472657373227d5d2c225065726d6974223a5b7b226e616d65223a226f776e6572222c2274797065223a2261646472657373227d2c7b226e616d65223a227370656e646572222c2274797065223a2261646472657373227d2c7b226e616d65223a2276616c7565222c2274797065223a2275696e74323536227d2c7b226e616d65223a226e6f6e6365222c2274797065223a2275696e74323536227d2c7b226e616d65223a22646561646c696e65222c2274797065223a2275696e74323536227d5d7d2c227072696d61727954797065223a225065726d6974222c22646f6d61696e223a7b226e616d65223a2255534420436f696e222c2276657273696f6e223a2232222c22636861696e4964223a312c22766572696679696e67436f6e7472616374223a22307841306238363939316336323138623336633164313944346132653945623063453336303665423438227d2c226d657373616765223a7b226f776e6572223a22307839383538456646443233324234303333453437643930303033443431454333344563614564613934222c227370656e646572223a22307836366139383933634330374439314439353634344145444430354430336639356531644241384166222c2276616c7565223a22313030303030303030222c226e6f6e6365223a2230222c22646561646c696e65223a2231373932333130343030227d7d0302040105d90130a2018a182cf5183cf500f500f400f4021a73c5da0a06549858effd232b4033e47d90003d41ec34ecaeda94076e426974546f6f6c2057616c6c6574
Respuesta (BitTool Signer → tu billetera)
{
"request-id": {
"uuid": "5f1e9b2c7d3a4e6f8a0b1c2d3e4f5a07"
},
"signature": "1f088554b0fae267470e9d0ade42bd4de30d2370964b7069a849c5208fda814e3c378e391d4054ad11cda2846fa667c99979899c282786205305ba717523ce241b"
}
Mostrar el texto del QR y el CBOR sin procesar
UR:ETH-SIGNATURE/OEADTPDAGDHECKNDDWKIFTGLJLLEBDCEDPFMGWHTATAOHDFPCTAYLPGHPFZSVOIOFLBANTBKUEFWRYGTVLBTCNJOMTGRJOINPDGASKCXMYTNLYGLFNEMMNESCAFZGHPMBYSNOELRJLOLIOSONLKKLDNSDEDILNCXGUAHRDJSKPCNTODKCWCTVYCYYA
a201d825505f1e9b2c7d3a4e6f8a0b1c2d3e4f5a070258411f088554b0fae267470e9d0ade42bd4de30d2370964b7069a849c5208fda814e3c378e391d4054ad11cda2846fa667c99979899c282786205305ba717523ce241b
Ensamblado por tu billetera
0x1f088554b0fae267470e9d0ade42bd4de30d2370964b7069a849c5208fda814e3c378e391d4054ad11cda2846fa667c99979899c282786205305ba717523ce241b
Propietarios de Safe (multisig)
Para usar BitTool Signer como uno de los propietarios de una Safe, firma el SafeTx como EIP-712 (tipo de datos 2) desde la dirección emparejada del propietario; la clave 6 es la dirección del propietario, no la de la Safe. BitTool Signer decodifica CALL/DELEGATECALL, MultiSend, cambios de propietarios/módulos/guards y parámetros de reembolso de gas, y eleva el nivel de riesgo de los que son peligrosos. Reunir, ordenar y enviar las firmas de los propietarios es trabajo de tu billetera.