Saltar al contenido principal

WalletConnect y dApps

BitTool Signer nunca se conecta a una dApp: no tiene red. Tu billetera mantiene la sesión de WalletConnect y, cuando una dApp pide una firma de una cuenta de BitTool Signer, tu billetera convierte la solicitud en un código QR de firma, espera la respuesta y le responde a la dApp. Así funciona BitTool Wallet.

Tu billeteraMantiene la sesión de WalletConnect
BitTool SignerSin conexión
  1. 1Recibe una solicitud de sesión de la dApp, p. ej. personal_sign en eip155:1.
  2. 2Muestra la solicitud al usuario, la completa si hace falta (nonce, gas, comisiones) y fija los bytes exactos.
  3. ur:eth-sign-request · ur:sol-sign-request · ur:tron-sign-request ▶
  4. 3Decodifica, revisa y firma después de que el usuario ingresa la contraseña de la billetera.
  5. ◀ ur:eth-signature · ur:sol-signature · ur:tron-signature
  6. 4Verifica la firma, la transmite si el método lo requiere y devuelve el resultado JSON-RPC a la dApp.

Las sesiones de WalletConnect expiran, y una dApp puede dejar de esperar. Muestra el código QR sin demora y permite que el usuario cancele; si el usuario cancela, responde a la dApp con un error de rechazo del usuario (4001 en cadenas EVM).

Correspondencia de métodos​

NamespaceMétodo de la dAppSolicitud a BitTool SignerResultado para la dApp
eip155personal_sign [message, address]eth-sign-request, data-type 3, los bytes del mensajeFirma 0x, 65 bytes, v = 27/28
eip155eth_signTypedData_v4 [address, typedData]data-type 2, el JSON de los datos tipadosFirma 0x, 65 bytes, v = 27/28
eip155eth_sendTransaction [tx]Completa nonce, gas y comisiones; data-type 4 (EIP-1559) o 1 (legacy)Hash de la transacción, después de transmitirla
eip155eth_signTransaction [tx]Igual que el anteriorTransacción firmada sin procesar (no transmitida)
eip155eth_signNo compatible: BitTool Signer nunca firma un hash sin procesar de 32 bytesRechaza la solicitud
solanasolana_signMessage {message, pubkey}sol-sign-request, sign-type 2, los bytes decodificados del mensaje{ signature } en Base58
solanasolana_signTransaction {transaction}sign-type 1, los bytes del mensaje de la transacción{ signature } en Base58
solanasolana_signAndSendTransaction {transaction}sign-type 1{ signature } después de transmitirla
trontron_signMessage {address, message}tron-sign-request, data-type 2, los bytes del mensajeFirma 0x con v = 27/28
trontron_signTransaction {address, transaction}data-type 1, los bytes de raw_data_hexEl objeto de la transacción con signature agregado

Chain IDs que se deben ofrecer en la sesión (CAIP-2):

CadenaCAIP-2
EVMeip155:1, eip155:56, eip155:42161, eip155:8453, eip155:10, eip155:137, eip155:100, eip155:43114
Solana mainnetsolana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp
TRON mainnettron:0x2b6653dc

Ofrece solo las cuentas que el usuario emparejó, y solo las redes para las que BitTool Signer puede firmar. El firmador rechazaría un eth_sendTransaction en cualquier otro chain ID.

Errores frecuentes​

  • Orden de los parámetros de personal_sign. La especificación es [message, address], pero algunas dApps envían [address, message]. Detecta la dirección de 20 bytes. Cuando se trata de bytes, el mensaje viene en hex (0x…); pasa como sign-data los bytes decodificados, nunca el texto hex.
  • Los datos tipados llegan como cadena. eth_signTypedData_v4 normalmente envía el JSON como cadena. Pásalo tal cual como bytes UTF-8 sin volver a serializarlo, para que los enteros y las direcciones conserven exactamente la forma en que los escribió la dApp. Si tienes que volver a serializarlo, mantén los enteros grandes como cadenas.
  • Solana: envía el mensaje, no la transacción. solana_signTransaction te entrega una transacción serializada en Base64 con los espacios de firma vacíos. Deserialízala y envía solo los bytes del mensaje. Si la dApp construyó una transacción v0 con tablas de búsqueda de direcciones, BitTool Signer no puede firmarla.
  • Codificación de mensajes de Solana. solana_signMessage envía el mensaje en Base58. Primero decodifícalo a bytes.
  • Forma de la transacción de TRON. Las dApps envuelven la transacción de distintas maneras: params.transaction.transaction, params.transaction o el propio params. Toma el objeto que tenga raw_data_hex, verifica txID = SHA-256(raw_data) y firma los bytes de raw_data_hex.
  • Firmas de mensajes de TRON. El firmador devuelve el byte de recuperación como 0/1; las dApps que usan TronWeb esperan 27/28. Suma 27 al último byte.

Ejemplos prácticos​

Cada ejemplo muestra la solicitud que tu billetera recibe de la dApp, el intercambio de QR de ida y vuelta con BitTool Signer y el resultado que devuelves. Todos usan la frase de prueba; los detalles completos de cada cadena están en las páginas de EVM, Solana y TRON.

Un inicio de sesión con Sign-In with Ethereum.

Solicitud de la dApp (chainId eip155:1)
{
"method": "personal_sign",
"params": [
"0x6170702e6578616d706c652e6f72672077616e747320796f7520746f207369676e20696e207769746820796f757220457468657265756d206163636f756e743a0a3078393835384566464432333242343033334534376439303030334434314543333445636145646139340a0a5369676e20696e20746f204578616d706c65204170702e0a0a5552493a2068747470733a2f2f6170702e6578616d706c652e6f72670a56657273696f6e3a20310a436861696e2049443a20310a4e6f6e63653a203866336b326d39710a4973737565642041743a20323032362d31302d31385430393a33303a30302e3030305a",
"0x9858EfFD232B4033E47d90003D41EC34EcaEda94"
]
}

Solicitud (tu billetera → BitTool Signer)

eth-sign-request2 fotogramas
UR:ETH-SIGN-REQUEST/1-2/LPADAOCFADFDCYCMDSCMFHHDOXOSADTPDAGDHECKNDDWKIFTGLJLLEBDCEDPFMGWHTAMAOHDWEHSJOJODMIHKSHSJNJOJZIHDMJLJPIOCXKTHSJTJYJKCXKKJLKPCXJYJLCXJKINIOJTCXINJTCXKTINJYISCXKKJLKPJPCXFEJYISIHJPIHKPJNCXHSIAIAJLKPJTJYFTBKDYKSESETECETFEIYFGFYEYEOEYFWEEDYEOEOFEEEEMIEESDYDYDYEOFYEEEHFEFXEOEEFEIAHSFEIEHSESEEBKBKGUINIOJTCXINJTCXJYJLCXFEKSHSJNJOJZIHCXFPJOJODMBKBKGOGMGAFTCXISCPDEGMOY
1 / 2
Campos CBOR
{
"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
Texto del QR · ur:eth-sign-request
UR:ETH-SIGN-REQUEST/1-2/LPADAOCFADFDCYCMDSCMFHHDOXOSADTPDAGDHECKNDDWKIFTGLJLLEBDCEDPFMGWHTAMAOHDWEHSJOJODMIHKSHSJNJOJZIHDMJLJPIOCXKTHSJTJYJKCXKKJLKPCXJYJLCXJKINIOJTCXINJTCXKTINJYISCXKKJLKPJPCXFEJYISIHJPIHKPJNCXHSIAIAJLKPJTJYFTBKDYKSESETECETFEIYFGFYEYEOEYFWEEDYEOEOFEEEEMIEESDYDYDYEOFYEEEHFEFXEOEEFEIAHSFEIEHSESEEBKBKGUINIOJTCXINJTCXJYJLCXFEKSHSJNJOJZIHCXFPJOJODMBKBKGOGMGAFTCXISCPDEGMOY
UR:ETH-SIGN-REQUEST/2-2/LPAOAOCFADFDCYCMDSCMFHHDOXJYJYJOJKFTDLDLHSJOJODMIHKSHSJNJOJZIHDMJLJPIOBKHFIHJPJKINJLJTFTCXEHBKFXISHSINJTCXGAFYFTCXEHBKGLJLJTIAIHFTCXETIYEOJEEYJNESJSBKGAJKJKKPIHIECXFPJYFTCXEYDYEYENDPEHDYDPEHETGHDYESFTEODYFTDYDYDMDYDYDYHTAXAXAAADAHTAADDYOEADLECSDWYKCSFNYKAEYKAEWKAEWKAOCYJKSKTNBKAMGHMKHDWSZCCNDNFZEOVEKIMHAEFSFPWPEEWPPLTNMWATJTFWINJYGHJLJLJZCXHGHSJZJZIHJYCWTTFYJT
CBOR del UR (hex)
a701d825505f1e9b2c7d3a4e6f8a0b1c2d3e4f5a060258ed6170702e6578616d706c652e6f72672077616e747320796f7520746f207369676e20696e207769746820796f757220457468657265756d206163636f756e743a0a3078393835384566464432333242343033334534376439303030334434314543333445636145646139340a0a5369676e20696e20746f204578616d706c65204170702e0a0a5552493a2068747470733a2f2f6170702e6578616d706c652e6f72670a56657273696f6e3a20310a436861696e2049443a20310a4e6f6e63653a203866336b326d39710a4973737565642041743a20323032362d31302d31385430393a33303a30302e3030305a0303040105d90130a2018a182cf5183cf500f500f400f4021a73c5da0a06549858effd232b4033e47d90003d41ec34ecaeda94076e426974546f6f6c2057616c6c6574

Respuesta (BitTool Signer → tu billetera)

Respuesta decodificada · ur:eth-signature
{
"request-id": {
"uuid": "5f1e9b2c7d3a4e6f8a0b1c2d3e4f5a06"
},
"signature": "23c5ba3f5d247b4c81d55b7c44a3951a14c82e70f17ef2c19abea893c4e5bef05795a7261ac2bd9da29be2dfef529327e1b0724580fccac106bed3d007854f6b1b"
}
Mostrar el texto del QR y el CBOR sin procesar
Texto del QR · ur:eth-signature
UR:ETH-SIGNATURE/OEADTPDAGDHECKNDDWKIFTGLJLLEBDCEDPFMGWHTAMAOHDFPCNSKRDFHHLDKKGGSLYTLHPKEFYOTMDCYBBSPDMJOWNKBWZSENYRNPDMUSSVWRNWTHGMDOSDSCYSARYNTOENDVOURWSGMMUDIVYPFJPFELAZTSGSEAMRNTETIATLPGWJECWWNKEFGEH
CBOR del UR (hex)
a201d825505f1e9b2c7d3a4e6f8a0b1c2d3e4f5a0602584123c5ba3f5d247b4c81d55b7c44a3951a14c82e70f17ef2c19abea893c4e5bef05795a7261ac2bd9da29be2dfef529327e1b0724580fccac106bed3d007854f6b1b

Ensamblado por tu billetera

walletConnectResult
0x23c5ba3f5d247b4c81d55b7c44a3951a14c82e70f17ef2c19abea893c4e5bef05795a7261ac2bd9da29be2dfef529327e1b0724580fccac106bed3d007854f6b1b
Resultado JSON-RPC para la dApp
0x23c5ba3f5d247b4c81d55b7c44a3951a14c82e70f17ef2c19abea893c4e5bef05795a7261ac2bd9da29be2dfef529327e1b0724580fccac106bed3d007854f6b1b

Cómo mostrar la solicitud​

El usuario aprueba dos veces: una en tu billetera y otra en BitTool Signer. Haz que las dos pantallas coincidan. Muestra el nombre y la URL de la dApp, la red y el mismo contenido decodificado que mostrará BitTool Signer: montos, destinatarios, spender y, en el caso de los mensajes, el texto completo. Marca las llamadas a contratos desconocidos como desconocidas en lugar de adivinar; BitTool Signer también las etiquetará como no decodificadas.