diff --git a/libs/exchange-module/src/index.ts b/libs/exchange-module/src/index.ts index e13aadfeeed2..8ebe1a74c18f 100644 --- a/libs/exchange-module/src/index.ts +++ b/libs/exchange-module/src/index.ts @@ -158,8 +158,8 @@ export class ExchangeModule extends CustomModule { provider: string; fromAccountId: string; transaction: Transaction; - binaryPayload: Buffer; - signature: Buffer; + binaryPayload: string | Buffer; // Support Coinify Buffer legacy + signature: string | Buffer; // Support Coinify Buffer legacy feeStrategy: ExchangeCompleteParams["feeStrategy"]; }): Promise { const result = await this.request( @@ -169,8 +169,9 @@ export class ExchangeModule extends CustomModule { provider, fromAccountId, rawTransaction: serializeTransaction(transaction), - hexBinaryPayload: binaryPayload.toString("hex"), - hexSignature: signature.toString("hex"), + hexBinaryPayload: + typeof binaryPayload === "string" ? binaryPayload : binaryPayload.toString("hex"), + hexSignature: typeof signature === "string" ? signature : signature.toString("hex"), feeStrategy, }, ); diff --git a/libs/ledger-live-common/src/exchange/platform/transfer/completeExchange.ts b/libs/ledger-live-common/src/exchange/platform/transfer/completeExchange.ts index a4b8cc3c4ba3..71c131d3a233 100644 --- a/libs/ledger-live-common/src/exchange/platform/transfer/completeExchange.ts +++ b/libs/ledger-live-common/src/exchange/platform/transfer/completeExchange.ts @@ -3,7 +3,12 @@ import { firstValueFrom, from, Observable } from "rxjs"; import { TransportStatusError, WrongDeviceForAccount } from "@ledgerhq/errors"; import { delay } from "../../../promise"; -import { createExchange, ExchangeTypes } from "@ledgerhq/hw-app-exchange"; +import { + isExchangeTypeNg, + ExchangeTypes, + createExchange, + PayloadSignatureComputedFormat, +} from "@ledgerhq/hw-app-exchange"; import perFamily from "../../../generated/exchange"; import { getAccountCurrency, getMainAccount } from "../../../account"; import { getAccountBridge } from "../../../bridge"; @@ -86,11 +91,14 @@ const completeExchange = ( if (unsubscribed) return; currentStep = "PROCESS_TRANSACTION"; - await exchange.processTransaction(Buffer.from(binaryPayload, "hex"), estimatedFees); + const { payload, format }: { payload: Buffer; format: PayloadSignatureComputedFormat } = + isExchangeTypeNg(exchange.transactionType) + ? { payload: Buffer.from("." + binaryPayload), format: "jws" } + : { payload: Buffer.from(binaryPayload, "hex"), format: "raw" }; + await exchange.processTransaction(payload, estimatedFees, format); if (unsubscribed) return; - const bufferSignature = Buffer.from(signature, "hex"); - const goodSign = convertSignature(bufferSignature, exchangeType); + const goodSign = convertSignature(signature, exchange.transactionType); currentStep = "CHECK_TRANSACTION_SIGNATURE"; await exchange.checkTransactionSignature(goodSign); @@ -110,7 +118,7 @@ const completeExchange = ( estimatedFees: estimatedFees.toString(), }); currentStep = "CHECK_PAYOUT_ADDRESS"; - await exchange.checkPayoutAddress( + await exchange.validatePayoutOrAsset( payoutAddressConfig, payoutAddressConfigSignature, payoutAddressParameters.addressParameters, @@ -173,17 +181,10 @@ const completeExchange = ( * @param {ExchangeTypes} exchangeType * @return {Buffer} The correct format Buffer for AppExchange call. */ -function convertSignature(bufferSignature: Buffer, exchangeType: ExchangeTypes): Buffer { - const goodSign = - exchangeType === ExchangeTypes.Sell - ? bufferSignature - : Buffer.from(secp256k1.signatureExport(bufferSignature)); - - if (!goodSign) { - throw new Error("Could not check provider signature"); - } - - return goodSign; +function convertSignature(signature: string, exchangeType: ExchangeTypes): Buffer { + return isExchangeTypeNg(exchangeType) + ? Buffer.from(signature, "base64url") + : secp256k1.signatureExport(Buffer.from(signature, "hex")); } export default completeExchange; diff --git a/libs/ledger-live-common/src/exchange/swap/completeExchange.ts b/libs/ledger-live-common/src/exchange/swap/completeExchange.ts index bb382c795fef..54659f02b70e 100644 --- a/libs/ledger-live-common/src/exchange/swap/completeExchange.ts +++ b/libs/ledger-live-common/src/exchange/swap/completeExchange.ts @@ -115,7 +115,7 @@ const completeExchange = ( try { currentStep = "CHECK_PAYOUT_ADDRESS"; - await exchange.checkPayoutAddress( + await exchange.validatePayoutOrAsset( payoutAddressConfig, payoutAddressConfigSignature, payoutAddressParameters.addressParameters, diff --git a/libs/ledger-live-common/src/exchange/swap/initSwap.ts b/libs/ledger-live-common/src/exchange/swap/initSwap.ts index ff5f0060faa0..b1965fdc42c1 100644 --- a/libs/ledger-live-common/src/exchange/swap/initSwap.ts +++ b/libs/ledger-live-common/src/exchange/swap/initSwap.ts @@ -203,7 +203,7 @@ const initSwap = (input: InitSwapInput): Observable => { await getCurrencyExchangeConfig(payoutCurrency); try { - await swap.checkPayoutAddress( + await swap.validatePayoutOrAsset( payoutAddressConfig, payoutAddressConfigSignature, payoutAddressParameters.addressParameters, diff --git a/libs/ledgerjs/packages/hw-app-exchange/src/Exchange.ts b/libs/ledgerjs/packages/hw-app-exchange/src/Exchange.ts index e663b393de4a..2a2a84f44ffc 100644 --- a/libs/ledgerjs/packages/hw-app-exchange/src/Exchange.ts +++ b/libs/ledgerjs/packages/hw-app-exchange/src/Exchange.ts @@ -30,9 +30,9 @@ const CHECK_PARTNER_COMMAND = 0x05; const PROCESS_TRANSACTION_RESPONSE = 0x06; const CHECK_TRANSACTION_SIGNATURE = 0x07; const CHECK_PAYOUT_ADDRESS = 0x08; -const CHECK_ASSET_IN = 0x08; const CHECK_REFUND_ADDRESS = 0x09; const SIGN_COIN_TRANSACTION = 0x0a; +const CHECK_ASSET_IN_AND_DISPLAY = 0x0b; // Extension for PROCESS_TRANSACTION_RESPONSE APDU const P2_NONE = 0x00 << 4; @@ -260,7 +260,7 @@ export default class Exchange { maybeThrowProtocolError(result); } - async checkPayoutAddress( + async validatePayoutOrAsset( payoutCurrencyConfig: Buffer, currencyConfigSignature: Buffer, addressParameters: Buffer, @@ -280,7 +280,9 @@ export default class Exchange { ]); const result: Buffer = await this.transport.send( 0xe0, - this.transactionType === ExchangeTypes.Swap ? CHECK_PAYOUT_ADDRESS : CHECK_ASSET_IN, + this.transactionType === ExchangeTypes.Swap || this.transactionType === ExchangeTypes.SwapNg + ? CHECK_PAYOUT_ADDRESS + : CHECK_ASSET_IN_AND_DISPLAY, this.transactionRate, this.transactionType, bufferToSend,