// Goal of this file is to inject all necessary device/signer dependency to coin-modules import { firstValueFrom, from } from "rxjs"; import Transport from "@ledgerhq/hw-transport"; import { Bridge } from "@ledgerhq/types-live"; import { CryptoCurrency } from "@ledgerhq/types-cryptoassets"; import Btc from "@ledgerhq/hw-app-btc"; import { createBridges } from "@ledgerhq/coin-bitcoin/bridge/js"; import type { SignerContext } from "@ledgerhq/coin-bitcoin/signer"; import makeCliTools from "@ledgerhq/coin-bitcoin/cli-transaction"; import bitcoinResolver from "@ledgerhq/coin-bitcoin/hw-getAddress"; import { signMessage } from "@ledgerhq/coin-bitcoin/hw-signMessage"; import { BitcoinAccount, Transaction, TransactionStatus } from "@ledgerhq/coin-bitcoin/types"; import { GetAddressOptions, Resolver } from "../../hw/getAddress/types"; import { withDevice } from "../../hw/deviceAccess"; import { GetAddressFn } from "@ledgerhq/ledger-wallet-framework/bridge/getAddressWrapper"; import { getCurrencyConfiguration } from "../../config"; import { BitcoinConfigInfo } from "@ledgerhq/coin-bitcoin/config"; import { SignMessage } from "../../hw/signMessage/types"; const createSigner = (transport: Transport, currency: CryptoCurrency) => { return new Btc({ transport, currency: currency.id }); }; const signerContext: SignerContext = ( deviceId: string, crypto: CryptoCurrency, fn: (signer: Btc) => Promise, ): Promise => firstValueFrom( withDevice(deviceId)((transport: Transport) => from(fn(createSigner(transport, crypto)))), ); const getCurrencyConfig = (currencyId: string) => { return { info: getCurrencyConfiguration(currencyId) }; }; const bridge: Bridge = createBridges( signerContext, getCurrencyConfig, ); export function createMessageSigner(): SignMessage { return (transport, account, messageData) => { const signerContext: SignerContext = (_, crypto, fn) => fn(createSigner(transport, crypto)); return signMessage(signerContext)("", account, messageData); }; } const messageSigner = { signMessage: createMessageSigner(), }; const resolver: Resolver = ( transport: Transport, addressOpt: GetAddressOptions, ): ReturnType => { const signerContext: SignerContext = (_, crypto, fn) => fn(createSigner(transport, crypto)); return bitcoinResolver(signerContext)("", addressOpt); }; const cliTools = makeCliTools(); export { bridge, cliTools, resolver, messageSigner, signerContext };