From b8f17a6e3ef525d9816630f8db71ca1050e8f85e Mon Sep 17 00:00:00 2001 From: Lukasz Zimnoch Date: Tue, 7 Nov 2023 13:50:04 +0100 Subject: [PATCH] Use satoshi amount while searching wallet for redemption The `RedemptionsService.requestRedemption` function takes an amount in the TBTC token precision (1e18). However, the `findWalletForRedemption` method called to find a wallet for redemption expects an amount in the sathoshi precision (1e8). There is a missing conversion which we are adding in this changeset. --- .../api-reference/classes/RedemptionsService.md | 6 +++--- .../src/services/redemptions/redemptions-service.ts | 12 +++++++++++- typescript/test/services/redemptions.test.ts | 5 +++-- typescript/test/utils/mock-tbtc-token.ts | 2 +- 4 files changed, 18 insertions(+), 7 deletions(-) diff --git a/typescript/api-reference/classes/RedemptionsService.md b/typescript/api-reference/classes/RedemptionsService.md index 5a65618a0..be69d387b 100644 --- a/typescript/api-reference/classes/RedemptionsService.md +++ b/typescript/api-reference/classes/RedemptionsService.md @@ -90,7 +90,7 @@ Promise holding the wallet main UTXO or undefined value. #### Defined in -[services/redemptions/redemptions-service.ts:215](https://github.com/keep-network/tbtc-v2/blob/main/typescript/src/services/redemptions/redemptions-service.ts#L215) +[services/redemptions/redemptions-service.ts:225](https://github.com/keep-network/tbtc-v2/blob/main/typescript/src/services/redemptions/redemptions-service.ts#L225) ___ @@ -116,7 +116,7 @@ Promise with the wallet details needed to request a redemption. #### Defined in -[services/redemptions/redemptions-service.ts:96](https://github.com/keep-network/tbtc-v2/blob/main/typescript/src/services/redemptions/redemptions-service.ts#L96) +[services/redemptions/redemptions-service.ts:106](https://github.com/keep-network/tbtc-v2/blob/main/typescript/src/services/redemptions/redemptions-service.ts#L106) ___ @@ -147,7 +147,7 @@ Throws an error if no redemption request exists for the given #### Defined in -[services/redemptions/redemptions-service.ts:327](https://github.com/keep-network/tbtc-v2/blob/main/typescript/src/services/redemptions/redemptions-service.ts#L327) +[services/redemptions/redemptions-service.ts:337](https://github.com/keep-network/tbtc-v2/blob/main/typescript/src/services/redemptions/redemptions-service.ts#L337) ___ diff --git a/typescript/src/services/redemptions/redemptions-service.ts b/typescript/src/services/redemptions/redemptions-service.ts index 3e8e6f5c8..a7fa57e40 100644 --- a/typescript/src/services/redemptions/redemptions-service.ts +++ b/typescript/src/services/redemptions/redemptions-service.ts @@ -67,9 +67,19 @@ export class RedemptionsService { throw new Error("Redeemer output script must be of standard type") } + const amountToSatoshi = (value: BigNumber): BigNumber => { + const satoshiMultiplier = BigNumber.from(1e10) + const remainder = value.mod(satoshiMultiplier) + const convertibleAmount = amount.sub(remainder) + return convertibleAmount.div(satoshiMultiplier) + } + + // The findWalletForRedemption operates on satoshi amount precision (1e8) + // while the amount parameter is TBTC token precision (1e18). We need to + // convert the amount to get proper results. const { walletPublicKey, mainUtxo } = await this.findWalletForRedemption( redeemerOutputScript, - amount + amountToSatoshi(amount) ) const txHash = await this.tbtcContracts.tbtcToken.requestRedemption( diff --git a/typescript/test/services/redemptions.test.ts b/typescript/test/services/redemptions.test.ts index 3b36489ed..adbee2cda 100644 --- a/typescript/test/services/redemptions.test.ts +++ b/typescript/test/services/redemptions.test.ts @@ -43,8 +43,9 @@ describe("Redemptions", () => { } const redeemerOutputScript = data.pendingRedemptions[0].pendingRedemption.redeemerOutputScript + // Use amount in TBTC token precision (1e18) const amount = - data.pendingRedemptions[0].pendingRedemption.requestedAmount + data.pendingRedemptions[0].pendingRedemption.requestedAmount.mul(1e10) let tbtcContracts: MockTBTCContracts let bitcoinClient: MockBitcoinClient @@ -129,7 +130,7 @@ describe("Redemptions", () => { walletPublicKey, mainUtxo, redeemerOutputScript, - amount, + amount: amount.div(1e10), }) }) }) diff --git a/typescript/test/utils/mock-tbtc-token.ts b/typescript/test/utils/mock-tbtc-token.ts index ba7fdc08d..e68a7451c 100644 --- a/typescript/test/utils/mock-tbtc-token.ts +++ b/typescript/test/utils/mock-tbtc-token.ts @@ -32,7 +32,7 @@ export class MockTBTCToken implements TBTCToken { walletPublicKey, mainUtxo, redeemerOutputScript, - amount, + amount: amount.div(1e10), // Store amount in satoshi. }) return Hex.from(