4.6 KiB
Compatibility Roadmap: Multisig and TrustedCoin (2FA) Wallets
Status document, 2026-07-19. Companion to COMPATIBILITY.md:
that file states what is supported today; this one explains why multisig and
TrustedCoin (2FA) wallets are currently unsupported and how support can be
added.
Root cause (common to both)
BAL currently does two things that are only valid for standard (single-signature) wallets:
- It builds transactions itself with
PartialTransaction.from_io(...)(bal/core/will.py), bypassingwallet.make_unsigned_transaction. - It signs with a single call —
wallet.sign_transaction(tx, password)(bal/gui/qt/window.py,sign_transactions) — and considers the will ready whentx.is_complete()is true.
On a standard wallet one signature completes the transaction. On multisig and
2FA wallets one signature is not enough: the transaction stays incomplete,
is never marked COMPLETE, and can never be pushed to will-executors.
A secondary single-sig assumption: plugin.py uses wallet.get_keystore()
(singular); multisig wallets expose get_keystores() (plural).
Multisig wallets — solvable, medium/large effort
A 2-of-3 multisig wallet typically holds only one of the required private
keys locally; the other cosigners hold theirs. wallet.sign_transaction adds
the local signature only, and BAL has no flow to collect the missing ones.
Proposed solution: the standard PSBT coordination round (the same flow Electrum itself uses for multisig spending):
- Build and sign locally as today.
- If the transaction is not complete, export the partially-signed
transaction(s) (file and/or QR) and mark the will with a new status such
as
WAITING_COSIGNERS. - Each cosigner signs in their own Electrum (native feature — no new software needed on their side).
- BAL re-imports and merges the signatures; once complete, the will is pushed to will-executors as today.
Notes and caveats:
- Chained will transactions (a will tx spending the change of a previous will tx) remain workable: with segwit, the txid of an unsigned/partially signed transaction is already stable, so the whole chain can be exported as a batch of PSBTs in one round.
- Every rebuild requires a new cosigner round. Check Alive postponements and balance-change rebuilds re-sign the will, so each of them needs the cosigners again. This is inherent to multisig and must be clearly communicated in the UI.
- Implementation surface: export/import/merge pipeline, GUI for it, the new status in the transaction list, and tests.
Target: next plugin release, as announced.
TrustedCoin (2FA) wallets — harder, with one blocking unknown
An Electrum 2FA wallet (Wallet_2fa, defined in Electrum's trustedcoin
plugin) is technically a 2-of-3 multisig whose second signer is the
TrustedCoin server:
- signing requires a one-time password (OTP) per transaction
(
server.sign(short_id, raw_tx, otp)); - the server co-signs only transactions that include its billing fee,
which Electrum adds inside
Wallet_2fa.make_unsigned_transaction— a code path BAL currently bypasses (see root cause #1).
So today: no billing output, no OTP prompt, local signature only → incomplete transaction.
Even with full integration (building via the wallet's
make_unsigned_transaction, adding the OTP prompt flow), one decisive
unknown remains: will transactions carry a locktime years in the future.
Whether the TrustedCoin server agrees to co-sign a transaction with such a
far-future nLockTime is an undocumented server-side policy. If it refuses,
2FA support is not achievable without TrustedCoin's cooperation. This is
why COMPATIBILITY.md marks 2FA as unknown.
Proposed plan:
- Empirical test on testnet (cheap, decisive): create a test 2FA wallet, build a far-future-locktime transaction through the proper 2FA path, and check whether the server signs it.
- If it signs → implement support: build via
make_unsigned_transaction(billing output included), integrate the OTP prompt, and document that every rebuild costs one OTP round and TrustedCoin fees. - If it refuses → document 2FA as unsupported, with the practical workaround: Electrum allows disabling 2FA by restoring the wallet from the full seed, which turns it into a standard wallet — fully supported by BAL.
Recommended order of work
- Multisig first: deterministic path, standard Electrum tooling, already announced for the next release.
- TrustedCoin empirical test in parallel: low cost, and its outcome decides whether 2FA support is feasible at all.