import { Observable } from "rxjs"; import type { Account, AccountBridge, DeviceId, SignOperationEvent } from "@ledgerhq/types-live"; import { SignerContext } from "@ledgerhq/ledger-wallet-framework/signer"; import { buildOptimisticOperation } from "./buildOptimisticOperatioin"; import type { Transaction, VechainSigner } from "../types"; import { VechainSDKTransaction } from "../types"; /** * Sign Transaction with Ledger hardware */ export const buildSignOperation = (signerContext: SignerContext): AccountBridge["signOperation"] => ({ account, transaction, deviceId, }: { account: Account; transaction: Transaction; deviceId: DeviceId; }): Observable => new Observable(o => { // eslint-disable-next-line @typescript-eslint/explicit-function-return-type async function main() { const unsigned = VechainSDKTransaction.of(transaction.body); o.next({ type: "device-signature-requested", }); const signature = await signerContext(deviceId, signer => signer.signTransaction( account.freshAddressPath, Buffer.from(unsigned.encoded).toString("hex"), ), ); o.next({ type: "device-signature-granted" }); const operation = await buildOptimisticOperation(account, transaction); o.next({ type: "signed", signedOperation: { operation, signature: signature.toString("hex"), rawData: transaction, }, }); } main().then( () => o.complete(), e => o.error(e), ); });