Skip to content

Commit ce97b1d

Browse files
committed
feat(sdk-core): update prebuildSelfManagedStakingTransaction
- for TSS transactions we need to delete shares (similar thing done in the build function) - we only care about the expanded params if they exists SC-498 TICKET: SC-498
1 parent 8ef8b38 commit ce97b1d

File tree

3 files changed

+55
-7
lines changed

3 files changed

+55
-7
lines changed

modules/bitgo/test/v2/fixtures/staking/stakingWallet.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { PrebuildTransactionOptions, StakingRequest, StakingTransaction } from '@bitgo/sdk-core';
22

33
export default {
4-
txRequestId: '55ba0198-0b1f-44f6-94fe-8d782d633dde',
54
stakingRequest: function (transactions: StakingTransaction[]): StakingRequest {
65
return {
76
id: '8638284a-dab2-46b9-b07f-21109a6e7220',
@@ -20,7 +19,11 @@ export default {
2019
transactions: transactions,
2120
};
2221
},
23-
transaction: function (status: string, buildParams?: PrebuildTransactionOptions): StakingTransaction {
22+
transaction: function (
23+
status: string,
24+
buildParams?: PrebuildTransactionOptions,
25+
txRequestId: string | undefined = '55ba0198-0b1f-44f6-94fe-8d782d633dde'
26+
): StakingTransaction {
2427
const transaction: StakingTransaction = {
2528
id: '00566722-daef-40eb-b0ac-fa5402bbfe72',
2629
stakingRequestId: '8638284a-dab2-46b9-b07f-21109a6e7220',
@@ -32,7 +35,7 @@ export default {
3235
amount: '1234',
3336
pendingApprovalId: 'd99e3ae1-d2a6-4f57-87b6-d04c24854739',
3437
transferId: 'e4b482b0-54d5-474b-bb2b-c56ce8516b5e',
35-
txRequestId: this.txRequestId,
38+
txRequestId: txRequestId,
3639
};
3740
if (buildParams) {
3841
transaction.buildParams = buildParams;

modules/bitgo/test/v2/unit/staking/stakingWalletCommon.ts

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import * as nock from 'nock';
22
import * as should from 'should';
33
import fixtures from '../../fixtures/staking/stakingWallet';
44

5-
import { Enterprise, Environments, StakingRequest, StakingWallet, Wallet } from '@bitgo/sdk-core';
5+
import { Enterprise, Environments, StakingRequest, StakingWallet, TssUtils, Wallet } from '@bitgo/sdk-core';
66
import { TestBitGo } from '@bitgo/sdk-test';
77
import { BitGo } from '../../../../src';
88
import * as sinon from 'sinon';
@@ -317,14 +317,18 @@ describe('Staking Wallet Common', function () {
317317
.query({ expandBuildParams: true })
318318
.reply(200, transaction);
319319

320+
const deleteSignatureShares = sandbox.stub(TssUtils.prototype, 'deleteSignatureShares');
320321
const prebuildTransaction = sandbox.stub(Wallet.prototype, 'prebuildTransaction');
322+
const build = sandbox.stub(StakingWallet.prototype, 'build');
321323
const txPrebuild = {
322324
walletId: stakingWallet.walletId,
323325
txHex: 'hex',
324326
buildParams: transaction.buildParams,
325327
};
326328
prebuildTransaction.resolves(txPrebuild);
327329
prebuildTransaction.calledOnceWithExactly(transaction.buildParams);
330+
deleteSignatureShares.notCalled.should.be.true();
331+
build.calledOnce.should.be.true();
328332

329333
const formattedParams = {
330334
...fixtures.buildParams,
@@ -336,6 +340,41 @@ describe('Staking Wallet Common', function () {
336340
const expected = await stakingWallet.wallet.prebuildTransaction(formattedParams);
337341
const stakingTransaction = await stakingWallet.prebuildSelfManagedStakingTransaction(transaction);
338342

343+
stakingTransaction.should.deepEqual(expected);
344+
should.exist(stakingTransaction);
345+
});
346+
it('should prebuild self-managed staking transaction - no build params', async function () {
347+
const transaction = fixtures.transaction('READY', undefined, undefined);
348+
nock(microservicesUri)
349+
.get(
350+
`/api/staking/v1/${stakingWallet.coin}/wallets/${stakingWallet.walletId}/requests/${transaction.stakingRequestId}/transactions/${transaction.id}`
351+
)
352+
.query({ expandBuildParams: true })
353+
.reply(200, transaction);
354+
355+
const deleteSignatureShares = sandbox.stub(TssUtils.prototype, 'deleteSignatureShares');
356+
const prebuildTransaction = sandbox.stub(Wallet.prototype, 'prebuildTransaction');
357+
const build = sandbox.stub(StakingWallet.prototype, 'build');
358+
const txPrebuild = {
359+
walletId: stakingWallet.walletId,
360+
txHex: 'hex',
361+
};
362+
prebuildTransaction.resolves(txPrebuild);
363+
prebuildTransaction.calledOnce.should.be.true();
364+
build.calledOnce.should.be.true();
365+
if (transaction.txRequestId) {
366+
deleteSignatureShares.calledOnceWithExactly(transaction.txRequestId);
367+
}
368+
const formattedParams = {
369+
...fixtures.buildParams,
370+
coin: stakingWallet.coin,
371+
walletId: stakingWallet.walletId,
372+
walletType: stakingWallet.wallet.type(),
373+
preview: true,
374+
};
375+
const expected = await stakingWallet.wallet.prebuildTransaction(formattedParams);
376+
const stakingTransaction = await stakingWallet.prebuildSelfManagedStakingTransaction(transaction);
377+
339378
stakingTransaction.should.deepEqual(expected);
340379
should.exist(stakingTransaction);
341380
});

modules/sdk-core/src/bitgo/staking/stakingWallet.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -218,19 +218,25 @@ export class StakingWallet implements IStakingWallet {
218218

219219
/**
220220
* Create prebuilt staking transaction.
221+
*
222+
* for transactions with tx request id (TSS transactions), we need to delete signature shares before creating prebuild transaction
223+
* we only need to get transaction build params if they exist to pre build
224+
*
221225
* @param transaction
222226
*/
223227
async prebuildSelfManagedStakingTransaction(transaction: StakingTransaction): Promise<PrebuildTransactionResult> {
224-
const builtStakingTransaction = await this.build(transaction);
225-
const buildParams = builtStakingTransaction.transaction.buildParams;
228+
if (transaction.txRequestId) {
229+
await this.tssUtil.deleteSignatureShares(transaction.txRequestId);
230+
}
231+
const buildParams = (await this.expandBuildParams(transaction)).buildParams;
226232
const formattedParams = {
227233
...buildParams,
228234
coin: this.coin,
229235
walletId: this.walletId,
230236
walletType: this.wallet.type(),
231237
preview: true,
232238
};
233-
return await this.wallet.prebuildTransaction(formattedParams);
239+
return await (await this.getWalletForBuildingAndSigning()).prebuildTransaction(formattedParams);
234240
}
235241

236242
/**

0 commit comments

Comments
 (0)