Saltar al contenido principal

WalletConnect y dApps

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

Tu carteraMantiene 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 introduzca la contraseña de la cartera.
  5. ◀ ur:eth-signature · ur:sol-signature · ur:tron-signature
  6. 4Verifica la firma, la difunde si el método lo requiere y devuelve el resultado JSON-RPC a la dApp.

Las sesiones de WalletConnect caducan, y una dApp puede dejar de esperar. Muestra el código QR enseguida y deja que el usuario cancele; si el usuario cancela, responde a la dApp con un error de rechazo por parte del usuario (4001 en las 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 difundirla
eip155eth_signTransaction [tx]Igual que el anteriorTransacción firmada sin procesar (sin difundir)
eip155eth_signNo compatible: BitTool Signer nunca firma un hash de 32 bytes sin procesarRechaza la solicitud
solanasolana_signMessage {message, pubkey}sol-sign-request, sign-type 2, los bytes del mensaje decodificado{ 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 difundirla
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 añadido

Chain IDs que debes 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 ha vinculado, y solo las redes para las que BitTool Signer puede firmar. El firmante rechazaría un eth_sendTransaction con cualquier otro chain ID.

Errores habituales​

  • Orden de los parámetros de personal_sign. La especificación dice [message, address], pero algunas dApps envían [address, message]. Detecta la dirección de 20 bytes. El mensaje va en hex (0x…) cuando son bytes; pasa como sign-data los bytes decodificados, nunca el texto hex.
  • Los datos tipados llegan como cadena. eth_signTypedData_v4 suele enviar el JSON como cadena. Pásalo tal cual como bytes UTF-8 sin volver a serializarlo, para que los enteros y las direcciones se mantengan exactamente como los escribió la dApp. Si tienes que volver a serializarlo, conserva 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 las posiciones de firma vacías. 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 los mensajes de Solana. solana_signMessage envía el mensaje en Base58. Decodifícalo primero a bytes.
  • Forma de las transacciones de TRON. Cada dApp envuelve la transacción de una manera: params.transaction.transaction, params.transaction o el propio params. Toma el objeto que tenga raw_data_hex, comprueba que txID = SHA-256(raw_data) y firma los bytes de raw_data_hex.
  • Firmas de mensajes de TRON. El firmante 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 cartera recibe de la dApp, el viaje de ida y vuelta por QR 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 cartera → 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 cartera)

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 cartera

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

Cómo mostrar la solicitud​

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