Skip to main content

Limits and errors

Limits​

WhatLimit
QR frames per scan2,048 (BBQr: 1,295)
Characters per frame4,300
Scanned text kept per session1 MiB
Decoded payload (CBOR or PSBT)128 KiB
CBOR nesting / items24 levels / 20,000 items
Wallet-level pairing payload (produced)4,096 bytes
Request ID16 bytes (eth-sign-request: 1–64)
Origin256 characters
Bitcoin inputs and outputs1–100 each
EVM calldata64 KiB
EVM personal message1–8,192 bytes
EIP-71232 types, 64 fields per type, arrays up to 128 items
TRON message1–8,192 bytes
Solana message (sign-type 2)1–1,024 bytes of UTF-8 text
Solana transaction1–64 instructions, 1,232-byte packet

Common rejections​

When BitTool Signer refuses a request it shows a short message in the scanner or on the review screen. These are the ones integrators hit most often:

MessageCauseFix
Unsupported signing UR typeThe UR type is not one of crypto-psbt, psbt, eth-sign-request, sol-sign-request, tron-sign-requestUse the public registry types; a pairing QR code cannot be signed
Unsupported signing request fieldA map key outside 1–7 (ETH) or 1–6 (SOL/TRON)Remove custom fields
Invalid request UUID tag / requestId has invalid lengthRequest ID not wrapped in tag 37, or not 16 bytes for SOL/TRON37(16 random bytes)
Signing path must be concreteA * wildcard, an empty child, or an index ≥ 231Send the full leaf path with true/false hardened flags
Transaction data type does not match payloaddata-type 1 with a typed transaction, or 4 with legacy RLP1 for legacy RLP, 4 for 0x01/0x02 envelopes
Unprotected or missing-chain-ID EVM transactions are refusedLegacy transaction without EIP-155 chain IDSerialize with the chain ID (v = chainId, r = s = 0)
Chain ID does not match the signing requestTransaction, key 4 and/or EIP-712 domain disagreeMake all chain IDs equal
Unsupported networkChain ID outside the eight supported EVM networks, or a non-mainnet requestUse a supported network
Typed message has extra unsigned or missing fieldsmessage fields differ from the declared typeSend exactly the declared fields
Use strings for large typed integersA JSON number above 253 in EIP-712 dataEncode it as a decimal string
Full previous transactions (nonWitnessUtxo) are required …SegWit v0 or legacy input without nonWitnessUtxoAdd the full previous transaction
Only SIGHASH_ALL or Taproot SIGHASH_DEFAULT is acceptedAnother sighash type on an inputUse SIGHASH_ALL
No unsigned input belongs to this wallet …No input with a bip32Derivation for this wallet's keyAdd derivation data with the right fingerprint and path
Exactly one TRON contract is supported per transactionraw_data.contract has 0 or several entriesOne contract per transaction
TRON contract calls require an explicit fee limitTriggerSmartContract without fee_limitSet fee_limit
Invalid TRON timestamp or expirationMissing timestamp, or expiration ≤ timestampUse the values from your node
Address lookup tables require independently trusted account data …v0 Solana message with lookup tablesCompile with static account keys
This wallet is not a required signer in the transactionKey 4 is not among the message's required signersUse the account that must sign
Solana message prefix could represent a transaction headersign-type 2 used for bytes that look like a transactionUse sign-type 1 for transactions
Mixed UR fountain sessions / Multiple unrelated QR payloadsFrames from two different QR codes in one scanShow one request at a time

Error texts come only from the engine's own checks. Unexpected exceptions are reported as a generic error, so a malicious payload cannot inject text into the signer's interface.

Matching results​

Before the password prompt, the request is matched to the wallets on the phone. Only ready can be signed:

StatusMeaning
readyExactly one wallet holds the key; the signing tasks are fixed
noMatchNo wallet on this phone has the requested key (wrong fingerprint or path, or the wallet is not imported)
missingSignerThe request does not say which key should sign (no derivation data, no address)
ambiguousMore than one wallet fits, for example the same phrase imported twice
setupRequiredA wallet's public data needs to be rebuilt (one password entry)
invalidThe request is structurally invalid