BitGo wallets are based on a 2-of-3 multi-signature, the end user have access to:

- Public key (xpub) of the 3rd signer (as the main wallet xpub)
- Native Segwit (Bech32), bc1... addresses to receive BTC assets
- Private key/seed (BIP39) of the 1st signer (and public key xpub as well)
- Private key/seed (BIP39) of the 2nd signer (and public key xpub as well)

Seeds can be converted to private key here, BitGo provide it's own recovery-tool (it's debug infos can be used to get the xpub keys of the first and second signer).

Public xpub keys can be converted to Zpub (p2wsh) here or with Electrum with the command ./electrum.AppImage convert_xkey 'xpub...' 'p2wsh' --offline (Electrum and xpub-converter uses those specs and derivations paths).

While it is possible to import the BitGo wallet into Electrum without error, Electrum never generate the same receiving address as BitGo, Following this and this bitcointalk's forum threads:

1. What is the derivation path used by BitGo Bitcoin wallet?
2. Is it possible to use BitGo wallet in any other software like Electrum or else?

Other related QA: 1, 2, 3, (note that I am using Bitgo's wallet through Bitwala)

  • may be the answer reside in the source code of BitGoJS – intika Jan 17 at 14:18
  • It may be better to reach out to BitGo directly about this. – Pieter Wuille Jan 21 at 2:21
  • According to answers given to other users, BitGo's support just redirect users to the recovery tool and does not communicate on such information. This is paradoxal while they claim using a non-custodial wallet and are using opensource softwares (but are not widely transparent on what they do/use) – intika Jan 21 at 12:46
  • Have you tried using a bigo wallet with some btc in it; importing the 2 signer private keys into your other software; then attempt to spend some of the btc from the wallet in the new software? It's possible that this may still work, if bitgo is simply using a different derived address from the same script (similar to compressed/uncompressed addresses for p2pkh wallets). – Robherc KV5ROB Jan 24 at 15:10
  • 2
    It would probably be easier to figure it out if you sent a transaction from BitGo, then you can see the exact redeem script of the transaction, which will include the public keys and the order they're listed in. Then you just have to figure out the derivation path of those public keys from the zpubs and zprvs you have. – ieatpizza Jan 26 at 8:30

Looking at the BitGoJS code it would appear that the derivation path is m/0/0/derivationChain/*.

Looking further, the derivationChain seems to be a code depending on the address type:

    [0, UnspentType.p2sh, Purpose.external],
    [10, UnspentType.p2shP2wsh, Purpose.external],
    [20, UnspentType.p2wsh, Purpose.external],

    [1, UnspentType.p2sh, Purpose.internal],
    [11, UnspentType.p2shP2wsh, Purpose.internal],
    [21, UnspentType.p2wsh, Purpose.internal],

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.