Skip to content

New Bitcoin Recovery App failing to allow multisig wallet registration or signing #405

@logansease

Description

@logansease

We are attempting to leverage the new Bitcoin Recovery App as a migration path to the new firmware which restricts unhardened paths.
We have taken several steps but are hitting significant issues.

1- wallet registration of a multisig wallet fails within the new Bitcoin Recovery app.
2- A device that has already completed wallet registration successfully on the previous firmware / app version fails to sign with the recovery app.

Below are the parameters that are being passed and the errors being returned.
Hopefully this can duplicate the issue within a unit test for quick resolution.

We greatly appreciate any help you can provide.

package.json: "ledger-bitcoin": "0.3.0",

Registration Failure

import * as ledgerBitcoin from 'ledger-bitcoin'
const transport = await getTransport()
const appClient = new ledgerBitcoin.AppClient(transport)

const multisigPolicy = new ledgerBitcoin.WalletPolicy(
   "Multisig-1", // policy name
   "sh(wsh(sortedmulti(2,@0/**,@1/**,@2/**)))", // descriptor template
  ["[22943817/49/0/0]xpub6C92h9BRnATnazSRWkRQw9sjy74FBvmNhEUJEu3dEgCfwVHiM7RNz2xtnywei4peFX2bqTjUce4vWXYsQyNMLgz4U7UtAwJjEdQzrXH8ktM", 
"[203ddff8/49/0/1]xpub6Ct76xvLRD17X9EavNLkRzLWVwaMQEQEn1qBRgdSE92i7eJ21ndRSC73sW9bdgwkE7xj5p4B7VtAwv2skdu52q66Yo4BVDxNjBqqTmZSc6F", 
"[71147f86/49/0/1]xpub6DJH6e3LkiBjqsmd7v11JF55h21RJSERdHC4Q1FNwf95sZjFLwtZ8xHkXYAEnK462rtfBD45MMhBn5MeMG2P5T7yfccYh8pfTnAGpsmdR"
] // keys
)

const [policyId, policyHmac] = await appClient.registerWallet(multisigPolicy)

result:

Transport.ts:277 Uncaught (in promise) TransportStatusError: Ledger device: UNKNOWN_ERROR (0x6a82)
    at TransportWebHID.send (Transport.ts:277:13)
    at async AppClient.makeRequest (appClient.ts:101:18)
    at async AppClient.registerWallet (appClient.ts:188:22)
    at async registerWalletPolicy (ledger.ts:411:1)
    at async Module.signingDevice_registerWalletPolicy (signingDevice.ts:18:1)

I'm on ledger nano S+ v1.5 running BTC recovery app 2.4.3

Signing Failure:

import * as ledgerBitcoin from 'ledger-bitcoin'
const appClient = new ledgerBitcoin.AppClient(transport)


   "Multisig-1", // policy name
   "sh(wsh(sortedmulti(2,@0/**,@1/**,@2/**)))", // descriptor template
  ["[22943817/49/0/0]xpub6C92h9BRnATnazSRWkRQw9sjy74FBvmNhEUJEu3dEgCfwVHiM7RNz2xtnywei4peFX2bqTjUce4vWXYsQyNMLgz4U7UtAwJjEdQzrXH8ktM", 
"[203ddff8/49/0/1]xpub6Ct76xvLRD17X9EavNLkRzLWVwaMQEQEn1qBRgdSE92i7eJ21ndRSC73sW9bdgwkE7xj5p4B7VtAwv2skdu52q66Yo4BVDxNjBqqTmZSc6F", 
"[71147f86/49/0/1]xpub6DJH6e3LkiBjqsmd7v11JF55h21RJSERdHC4Q1FNwf95sZjFLwtZ8xHkXYAEnK462rtfBD45MMhBn5MeMG2P5T7yfccYh8pfTnAGpsmdR"
] // keys
)

const walletPolicy = new ledgerBitcoin.WalletPolicy(
    "Multisig-0", // name
    "sh(wsh(sortedmulti(2,@0/**,@1/**,@2/**)))", // template
    [
        "[1b6531cf/49/0/0]xpub6C92h9BRnATnHMEMQ1885FWavHrDJ2buQmQusSFktV9XKgyC18JcSWFPPK7RtuqFWot4UHHHa4AF5BPV25ZMzYhDMBqBk2eaPv9djqN7Atw",
        "[6e35d0d2/49/0/0]xpub6CFfy1RWVBSqbQkPKNiY1eipHiZUs1f4JwvaiHrK7FNGRWVqhU2SdidHkCpUevSeSUpV3WnGRVMjhgt516Yjk64Hvt6Ka8rxPQ6t6WX4VG2",
        "[c7ef45fc/49/0/0]xpub6Cdpo8JKvjF7B3bjHmeCuoPnnM2G14NkD4QEdzf7y7q5xzHpHJXD1W1Qd5gqdQWU1AxDqsQcodVbqEW25W5nKCE7eNjN76HHGTtLiwjb25C"
    ] // keys
)

const walletHmac = ... // this is a data buffer with a bunch of bytes from a wallet registered with a previous firmware version

const psbt = "cHNidP8BAHMBAAAAAdkAOvrslpxXu+GJeJsReSGcmbEsBn7Nqa/JIYW7tv3FAQAAAAD9////AoQEAAAAAAAAF6kUZKS+37bMosSsSxKpswEsaZweE1yHyQkAAAAAAAAXqRTZYMbZGoT6h6lMGQ3CbzInkLtbBocAAAAATwEEiLIeA0JK130AAACzBDeBh3HWfdlqHGkvhrds4BLSGIdZCJGmDN7d6eVXxg8DmqNpOWxXTsxFY0vSurcI5noFI/a4jshBWKjnn4VhC7UQG2UxzzEAAAAAAAAAAAAAAE8BBIiyHgNR38KSAAAAAGF2XcdQq9aA1MDzTsbP5lSvwjP88lNGumk47pw0B/EqApyo3lnbvJUxFEa2UmnolhipdIyDS45zlWIzyY4FEwQOEG410NIxAAAAAAAAAAAAAABPAQSIsh4DhdY0kgAAAAA7j65Q8tZF0xp3H22eWmVO3IPLJ2hH11xb96jZ87E4nwMZwxaDMMWKMaLBaXEh4ug6aNYQBKqZjcvCOwk575DBLBDH70X8MQAAAAAAAAAAAAAAAAEA/ZUBAQAAAAABAc5x0EIitkTZ7oa3ItLZ2WT8WVqo3NrX4xKDB1p/zfYyAAAAACMiACCef5r4KDzBhMGJj4T0EZYIRxHGZboDpo5hVt6IkK1BtP3///8CDQkAAAAAAAAXqRSQO1ECuIjCfFprfslzStwciZCOvYdHEAAAAAAAABepFEUwU9QuI5Ye1SDDs3mjfchuy95KhwQARzBEAiArT4AFpeep9hLDF/z8PZZcjvJtNaPkd+mqg1h04pByBAIgLIKZ+6fknlccxbf1b3F+FxiGlEUQEHB96af54sDZ5nABSDBFAiEA9NkY2KpCvXrjeLA03LF5K6xOGJ1fek/uykHrjN8+uJ4CIDFFhWkJPDZOesFZ5enGUeF8eWA3h1p1td9nd1TB3+cgAWlSIQK5jMAJvgiv28tyg25MOeSxmmBO4UvAmqUV+aVUIeNyLSEDB4NIEVO5isYNNMNayytS93WxNFkExiK6PHegdN+Ue1khA250ZyWqJh+pmHhgLJi6dAcckZKaTW9H83JA/BaMvMNDU64AAAAAAQEgRxAAAAAAAAAXqRRFMFPULiOWHtUgw7N5o33IbsveSocBBCIAILIwyVFtj7xKqVjw9m8g4fVHTPYS+k9YmgwCuUPvRvG8AQVpUiEDxMUPhMzy4OVAQpkLWqQA2kJk7YmjL0qTNiJhhHiGngchA9TJxSLzffvMh3yZ2zgTRQoJkcpcj5pXcmUZO4lUQ4joIQPqB6ybbgDtgQwMu2UxmQDRabhIn29XkyB830yNggpYrlOuIgYDxMUPhMzy4OVAQpkLWqQA2kJk7YmjL0qTNiJhhHiGngcYx+9F/DEAAAAAAAAAAAAAAAEAAAAAAAAAIgYD1MnFIvN9+8yHfJnbOBNFCgmRylyPmldyZRk7iVRDiOgYbjXQ0jEAAAAAAAAAAAAAAAEAAAAAAAAAIgYD6gesm24A7YEMDLtlMZkA0Wm4SJ9vV5MgfN9MjYIKWK4YG2UxzzEAAAAAAAAAAAAAAAEAAAAAAAAAAAABAWlSIQK04XITWjbPgCHQ9WH0QNItN81T1Qw9aTDthy7fJm9K/yEDoTb9CqYbOHUONCwma5JHYXA0wTcFZqomW3A8ChD7LechA/YHmM+hCI5bo4QEeVoR91cHQBOt85rnIQRTNaLW9xaqU64iAgK04XITWjbPgCHQ9WH0QNItN81T1Qw9aTDthy7fJm9K/xgbZTHPMQAAAAAAAAAAAAAAAQAAAAEAAAAiAgOhNv0Kphs4dQ40LCZrkkdhcDTBNwVmqiZbcDwKEPst5xjH70X8MQAAAAAAAAAAAAAAAQAAAAEAAAAiAgP2B5jPoQiOW6OEBHlaEfdXB0ATrfOa5yEEUzWi1vcWqhhuNdDSMQAAAAAAAAAAAAAAAQAAAAEAAAAA"

await client.signPsbt(psbt, walletPolicy, walletHMAC, () => {})

Throws:

TransportStatusError: Ledger device: Invalid data received (0x6a80)
    at async AppClient.makeRequest (appClient.ts:101:18)
    at async AppClient.signPsbt (appClient.ts:327:5)
    at async signPsbt (ledger.ts:579:1)
    at async ledger_getSignedBitcoinTransaction (ledger.ts:281:1)
    at async Module.signTransaction (signingDevice.ts:108:1)
    at async run (react.ts:3:3)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions