diff --git a/libs/ledger-live-common/package.json b/libs/ledger-live-common/package.json index f49eb15b8473..13c975d6f3ff 100644 --- a/libs/ledger-live-common/package.json +++ b/libs/ledger-live-common/package.json @@ -119,7 +119,7 @@ "https": false }, "dependencies": { - "@blooo/hw-app-acre": "^1.0.1", + "@blooo/hw-app-acre": "^1.1.1", "@cardano-foundation/ledgerjs-hw-app-cardano": "^7.1.2", "@celo/connect": "^3.0.1", "@celo/contractkit": "^3.0.1", diff --git a/libs/ledger-live-common/src/families/bitcoin/ACRESetup.ts b/libs/ledger-live-common/src/families/bitcoin/ACRESetup.ts index f357f8bb904c..7d3dff9d9110 100644 --- a/libs/ledger-live-common/src/families/bitcoin/ACRESetup.ts +++ b/libs/ledger-live-common/src/families/bitcoin/ACRESetup.ts @@ -17,7 +17,7 @@ import { GetAddressFn } from "@ledgerhq/coin-framework/bridge/getAddressWrapper" import { getCurrencyConfiguration } from "../../config"; import { BitcoinConfigInfo } from "@ledgerhq/coin-bitcoin/lib/config"; import { SignMessage } from "../../hw/signMessage/types"; -import { AcreMessageWithdraw } from "@ledgerhq/wallet-api-acre-module"; +import { AcreMessageSignIn, AcreMessageWithdraw } from "@ledgerhq/wallet-api-acre-module"; const createSigner = (transport: Transport, currency: CryptoCurrency) => { return new Acre({ transport, currency: currency.id }); @@ -75,9 +75,40 @@ export function createWithdrawSigner(): SignMessage { }; } +export function createSignInSigner(): SignMessage { + const signIn = + (signerContext: SignerContext) => + async (deviceId: string, account: Account, container: AcreMessageSignIn & AnyMessage) => { + const path = + "path" in container && container.path ? container.path : account.freshAddressPath; + const result = (await signerContext(deviceId, account.currency, signer => + (signer as unknown as Acre).signERC4361Message( + path, + Buffer.from(container.message as string).toString("hex"), + ), + )) as BitcoinSignature; + const v = result["v"] + 27 + 4; + const signature = `${v.toString(16)}${result["r"]}${result["s"]}`; + return { + rsv: result, + signature, + }; + }; + + return (transport, account, messageData) => { + const signerContext: SignerContext = (_, crypto, fn) => fn(createSigner(transport, crypto)); + return signIn(signerContext)( + "", + account, + messageData as unknown as AcreMessageSignIn & AnyMessage, + ); + }; +} + const messageSigner = { signMessage: createMessageSigner(), signWithdraw: createWithdrawSigner(), + signIn: createSignInSigner(), }; const resolver: Resolver = ( diff --git a/libs/ledger-live-common/src/hw/signMessage/index.ts b/libs/ledger-live-common/src/hw/signMessage/index.ts index 5719d7ee62c5..eb2bc705da1e 100644 --- a/libs/ledger-live-common/src/hw/signMessage/index.ts +++ b/libs/ledger-live-common/src/hw/signMessage/index.ts @@ -36,10 +36,17 @@ const signMessage: SignMessage = (transport, account, opts) => { const { currency } = account; let signMessage = perFamily[currency.family].signMessage; if ("type" in opts) { - signMessage = - opts.type === AcreMessageType.Withdraw - ? ACREMessageSigner.signWithdraw - : ACREMessageSigner.signMessage; + switch (opts.type) { + case AcreMessageType.Withdraw: + signMessage = ACREMessageSigner.signWithdraw; + break; + case AcreMessageType.SignIn: + signMessage = ACREMessageSigner.signIn; + break; + default: + signMessage = ACREMessageSigner.signMessage; + break; + } } invariant(signMessage, `signMessage is not implemented for ${currency.id}`); return signMessage(transport, account, opts) @@ -103,7 +110,7 @@ export const createAction = ( const appState: AppState = createAppAction(connectAppExec).useHook(reduxDevice, { appName: request.appName, dependencies: request.dependencies, - account: request.account, + account: request.appName ? undefined : request.account, }); const { device, opened, inWrongDeviceForAccount, error } = appState; const [state, setState] = useState({ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d24efb66089f..911f5164b3c9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -3479,8 +3479,8 @@ importers: libs/ledger-live-common: dependencies: '@blooo/hw-app-acre': - specifier: ^1.0.1 - version: 1.0.1 + specifier: ^1.1.1 + version: 1.1.1 '@cardano-foundation/ledgerjs-hw-app-cardano': specifier: ^7.1.2 version: 7.1.2 @@ -8646,8 +8646,8 @@ packages: '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - '@blooo/hw-app-acre@1.0.1': - resolution: {integrity: sha512-lLwG2abLFks6B8rHatIfj8rOSajzjCQlT6Wa4zoZnlxWqv8o3oIZ/kQzO3Mf3CgY2i3kMk3DqNKd7yBtXyfnEg==} + '@blooo/hw-app-acre@1.1.1': + resolution: {integrity: sha512-wWYUGR0sj4Yyy3GtiFRpRuaBdIgzbg8BnXCfUeduUzjQaMWzQ66wSvaJn4pHrIAdGwmdyqJWn3UqFgb1YPq0VQ==} '@braintree/sanitize-url@6.0.4': resolution: {integrity: sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==} @@ -29164,6 +29164,11 @@ packages: engines: {node: '>=14.17'} hasBin: true + typescript@5.6.3: + resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} + engines: {node: '>=14.17'} + hasBin: true + typical@4.0.0: resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} engines: {node: '>=8'} @@ -32779,7 +32784,7 @@ snapshots: '@bcoe/v8-coverage@0.2.3': {} - '@blooo/hw-app-acre@1.0.1': + '@blooo/hw-app-acre@1.1.1': dependencies: '@ledgerhq/hw-transport': 6.31.3 '@ledgerhq/logs': 6.12.0 @@ -32792,7 +32797,7 @@ snapshots: semver: 7.5.4 sha.js: 2.4.11 tiny-secp256k1: 1.1.6 - typescript: 5.6.2 + typescript: 5.6.3 varuint-bitcoin: 1.1.2 '@braintree/sanitize-url@6.0.4': {} @@ -33259,14 +33264,14 @@ snapshots: '@commitlint/types': 17.8.1 '@types/node': 20.5.1 chalk: 4.1.2 - cosmiconfig: 8.3.6(typescript@5.6.2) - cosmiconfig-typescript-loader: 4.4.0(@types/node@20.5.1)(cosmiconfig@8.3.6(typescript@5.6.2))(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.2))(typescript@5.6.2) + cosmiconfig: 8.3.6(typescript@5.4.3) + cosmiconfig-typescript-loader: 4.4.0(@types/node@20.5.1)(cosmiconfig@8.3.6(typescript@5.4.3))(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.4.3))(typescript@5.4.3) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 resolve-from: 5.0.0 - ts-node: 10.9.2(@types/node@20.5.1)(typescript@5.6.2) - typescript: 5.6.2 + ts-node: 10.9.2(@types/node@20.5.1)(typescript@5.4.3) + typescript: 5.4.3 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' @@ -47921,7 +47926,7 @@ snapshots: config-file-ts@0.2.6: dependencies: glob: 10.3.12 - typescript: 5.6.2 + typescript: 5.4.3 confusing-browser-globals@1.0.11: {} @@ -48045,12 +48050,12 @@ snapshots: dependencies: layout-base: 1.0.2 - cosmiconfig-typescript-loader@4.4.0(@types/node@20.5.1)(cosmiconfig@8.3.6(typescript@5.6.2))(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.2))(typescript@5.6.2): + cosmiconfig-typescript-loader@4.4.0(@types/node@20.5.1)(cosmiconfig@8.3.6(typescript@5.4.3))(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.4.3))(typescript@5.4.3): dependencies: '@types/node': 20.5.1 - cosmiconfig: 8.3.6(typescript@5.6.2) - ts-node: 10.9.2(@types/node@20.5.1)(typescript@5.6.2) - typescript: 5.6.2 + cosmiconfig: 8.3.6(typescript@5.4.3) + ts-node: 10.9.2(@types/node@20.5.1)(typescript@5.4.3) + typescript: 5.4.3 cosmiconfig@5.2.1: dependencies: @@ -48084,14 +48089,14 @@ snapshots: optionalDependencies: typescript: 4.9.5 - cosmiconfig@8.3.6(typescript@5.6.2): + cosmiconfig@8.3.6(typescript@5.4.3): dependencies: import-fresh: 3.3.0 js-yaml: 4.1.0 parse-json: 5.2.0 path-type: 4.0.0 optionalDependencies: - typescript: 5.6.2 + typescript: 5.4.3 cosmjs-types@0.2.1: dependencies: @@ -64358,7 +64363,7 @@ snapshots: transitivePeerDependencies: - source-map-support - ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.2): + ts-node@10.9.2(@types/node@20.5.1)(typescript@5.4.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -64372,7 +64377,7 @@ snapshots: create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.6.2 + typescript: 5.4.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 transitivePeerDependencies: @@ -64600,6 +64605,8 @@ snapshots: typescript@5.6.2: {} + typescript@5.6.3: {} + typical@4.0.0: {} typical@5.2.0: {}