Skip to content

Commit f0baf64

Browse files
feat: flrp validators and delegator
TICKET: WIN-7084
1 parent 6c16b3d commit f0baf64

File tree

6 files changed

+49
-26
lines changed

6 files changed

+49
-26
lines changed

modules/sdk-coin-flrp/src/lib/delegatorTxBuilder.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { BuildTransactionError, TransactionType } from '@bitgo/sdk-core';
22
import { BaseCoin as CoinConfig } from '@bitgo/statics';
33
import { AtomicTransactionBuilder } from './atomicTransactionBuilder';
44
import { Tx } from './iface';
5-
import { RawTransactionData, TransactionWithExtensions, DelegatorRawTransactionData } from './types';
5+
import { RawTransactionData, StakingExtendedTransaction, DelegatorRawTransactionData } from './types';
66
import {
77
DELEGATOR_TRANSACTION_TYPE,
88
PRIMARY_DELEGATOR_TYPE,
@@ -120,7 +120,7 @@ export class DelegatorTxBuilder extends AtomicTransactionBuilder {
120120
throw new BuildTransactionError('At least one reward address is required');
121121
}
122122
// Store reward addresses in the transaction (we'll need to extend the type)
123-
(this.transaction as TransactionWithExtensions)._rewardAddresses = addresses;
123+
(this.transaction as unknown as StakingExtendedTransaction)._rewardAddresses = addresses;
124124
return this;
125125
}
126126

@@ -145,7 +145,7 @@ export class DelegatorTxBuilder extends AtomicTransactionBuilder {
145145
this._stakeAmount = BigInt(delegatorData.stakeAmount);
146146
}
147147
if (delegatorData.rewardAddresses) {
148-
(this.transaction as TransactionWithExtensions)._rewardAddresses = delegatorData.rewardAddresses;
148+
(this.transaction as unknown as StakingExtendedTransaction)._rewardAddresses = delegatorData.rewardAddresses;
149149
}
150150

151151
return this;
@@ -184,7 +184,7 @@ export class DelegatorTxBuilder extends AtomicTransactionBuilder {
184184
throw new BuildTransactionError('Stake amount is required for delegator transaction');
185185
}
186186

187-
const rewardAddresses = (this.transaction as TransactionWithExtensions)._rewardAddresses;
187+
const rewardAddresses = (this.transaction as unknown as StakingExtendedTransaction)._rewardAddresses;
188188
if (!rewardAddresses || rewardAddresses.length === ZERO_NUMBER) {
189189
throw new BuildTransactionError('Reward addresses are required for delegator transaction');
190190
}

modules/sdk-coin-flrp/src/lib/importInCTxBuilder.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { Buffer } from 'buffer';
66
import utils, { createHexRegex } from './utils';
77
import { Tx, DecodedUtxoObj } from './iface';
88
import BigNumber from 'bignumber.js';
9-
import { TransactionWithExtensions } from './types';
9+
import { BaseExtendedTransaction } from './types';
1010
import {
1111
ASSET_ID_LENGTH,
1212
OUTPUT_INDEX_HEX_LENGTH,
@@ -118,7 +118,7 @@ export class ImportInCTxBuilder extends AtomicInCTransactionBuilder {
118118
// Extract amount if present
119119
if (firstOutput.amount) {
120120
// Store output amount for validation
121-
(this.transaction as TransactionWithExtensions)._outputAmount = firstOutput.amount.toString();
121+
(this.transaction as BaseExtendedTransaction)._outputAmount = firstOutput.amount.toString();
122122
}
123123
}
124124
}
@@ -138,7 +138,7 @@ export class ImportInCTxBuilder extends AtomicInCTransactionBuilder {
138138
// Extract memo if present
139139
if (unsignedTx.memo && unsignedTx.memo.length > 0) {
140140
// Store memo data for later use
141-
(this.transaction as TransactionWithExtensions)._memo = unsignedTx.memo;
141+
(this.transaction as BaseExtendedTransaction)._memo = unsignedTx.memo;
142142
}
143143

144144
// Set the transaction

modules/sdk-coin-flrp/src/lib/importInPTxBuilder.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { Buffer } from 'buffer';
77
import utils, { createFlexibleHexRegex } from './utils';
88
import { Tx, DecodedUtxoObj } from './iface';
99
import BigNumber from 'bignumber.js';
10-
import { TransactionWithExtensions } from './types';
10+
import { BaseExtendedTransaction } from './types';
1111
import {
1212
ASSET_ID_LENGTH,
1313
DEFAULT_BASE_FEE,
@@ -120,7 +120,7 @@ export class ImportInPTxBuilder extends AtomicTransactionBuilder {
120120
// Extract memo if present
121121
if (unsignedTx.memo && unsignedTx.memo.length > 0) {
122122
// Store memo data for later use
123-
(this.transaction as TransactionWithExtensions)._memo = unsignedTx.memo;
123+
(this.transaction as BaseExtendedTransaction)._memo = unsignedTx.memo;
124124
}
125125

126126
// Set the transaction

modules/sdk-coin-flrp/src/lib/permissionlessValidatorTxBuilder.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { BuildTransactionError, TransactionType } from '@bitgo/sdk-core';
22
import { BaseCoin as CoinConfig } from '@bitgo/statics';
33
import { AtomicTransactionBuilder } from './atomicTransactionBuilder';
44
import { Tx } from './iface';
5-
import { TransactionWithExtensions } from './types';
5+
import { PermissionlessValidatorExtendedTransaction } from './types';
66
import {
77
ADD_PERMISSIONLESS_VALIDATOR_TYPE,
88
BASIS_POINTS_DIVISOR,
@@ -154,7 +154,7 @@ export class PermissionlessValidatorTxBuilder extends AtomicTransactionBuilder {
154154
throw new BuildTransactionError('At least one reward address is required');
155155
}
156156
// Store reward addresses in the transaction (we'll need to extend the type)
157-
(this.transaction as TransactionWithExtensions)._rewardAddresses = addresses;
157+
(this.transaction as unknown as PermissionlessValidatorExtendedTransaction)._rewardAddresses = addresses;
158158
return this;
159159
}
160160

@@ -201,7 +201,8 @@ export class PermissionlessValidatorTxBuilder extends AtomicTransactionBuilder {
201201
this._delegationFeeRate = txData.delegationFeeRate;
202202
}
203203
if (txData.rewardAddresses) {
204-
(this.transaction as TransactionWithExtensions)._rewardAddresses = txData.rewardAddresses;
204+
(this.transaction as unknown as PermissionlessValidatorExtendedTransaction)._rewardAddresses =
205+
txData.rewardAddresses;
205206
}
206207

207208
return this;
@@ -250,7 +251,8 @@ export class PermissionlessValidatorTxBuilder extends AtomicTransactionBuilder {
250251
throw new BuildTransactionError('Delegation fee rate is required for permissionless validator transaction');
251252
}
252253

253-
const rewardAddresses = (this.transaction as TransactionWithExtensions)._rewardAddresses;
254+
const rewardAddresses = (this.transaction as unknown as PermissionlessValidatorExtendedTransaction)
255+
._rewardAddresses;
254256
if (!rewardAddresses || rewardAddresses.length === 0) {
255257
throw new BuildTransactionError('Reward addresses are required for permissionless validator transaction');
256258
}

modules/sdk-coin-flrp/src/lib/types.ts

Lines changed: 32 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,38 @@
44
import { DecodedUtxoObj } from './iface';
55

66
/**
7-
* Extended transaction interface with additional properties
8-
* used by transaction builders
7+
* Base extended transaction interface with common optional properties
98
*/
10-
export interface ExtendedTransaction {
11-
_rewardAddresses?: string[];
12-
_outputAmount?: string;
9+
export interface BaseExtendedTransaction {
1310
_memo?: Uint8Array;
14-
_delegationFeeRate?: number;
15-
_blsPublicKey?: string;
16-
_blsSignature?: string;
11+
_outputAmount?: string;
12+
_utxos?: DecodedUtxoObj[];
13+
}
14+
15+
/**
16+
* Extended transaction for staking transactions (delegator/validator)
17+
*/
18+
export interface StakingExtendedTransaction extends BaseExtendedTransaction {
19+
_rewardAddresses: string[]; // Required for all staking transactions
1720
_nodeID?: string;
1821
_startTime?: bigint;
1922
_endTime?: bigint;
2023
_stakeAmount?: bigint;
21-
_utxos?: DecodedUtxoObj[];
24+
}
25+
26+
/**
27+
* Extended transaction for validator transactions
28+
*/
29+
export interface ValidatorExtendedTransaction extends StakingExtendedTransaction {
30+
_delegationFeeRate?: number;
31+
}
32+
33+
/**
34+
* Extended transaction for permissionless validator transactions
35+
*/
36+
export interface PermissionlessValidatorExtendedTransaction extends ValidatorExtendedTransaction {
37+
_blsPublicKey?: string;
38+
_blsSignature?: string;
2239
}
2340

2441
/**
@@ -73,6 +90,10 @@ export type RawTransactionData =
7390
| PermissionlessValidatorRawTransactionData;
7491

7592
/**
76-
* Transaction with extended properties type assertion helper
93+
* Specific transaction extension types for better type safety
7794
*/
78-
export type TransactionWithExtensions = ExtendedTransaction & Record<string, unknown>;
95+
export type TransactionWithBaseExtensions = BaseExtendedTransaction & Record<string, unknown>;
96+
export type TransactionWithStakingExtensions = StakingExtendedTransaction & Record<string, unknown>;
97+
export type TransactionWithValidatorExtensions = ValidatorExtendedTransaction & Record<string, unknown>;
98+
export type TransactionWithPermissionlessValidatorExtensions = PermissionlessValidatorExtendedTransaction &
99+
Record<string, unknown>;

modules/sdk-coin-flrp/src/lib/validatorTxBuilder.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { BuildTransactionError, TransactionType } from '@bitgo/sdk-core';
22
import { BaseCoin as CoinConfig } from '@bitgo/statics';
33
import { DelegatorTxBuilder } from './delegatorTxBuilder';
44
import { Tx } from './iface';
5-
import { RawTransactionData, TransactionWithExtensions, ValidatorRawTransactionData } from './types';
5+
import { RawTransactionData, ValidatorExtendedTransaction, ValidatorRawTransactionData } from './types';
66
import {
77
MIN_DELEGATION_FEE_BASIS_POINTS,
88
OBJECT_TYPE_STRING,
@@ -137,7 +137,7 @@ export class ValidatorTxBuilder extends DelegatorTxBuilder {
137137
throw new BuildTransactionError('Delegation fee rate is required for validator transaction');
138138
}
139139

140-
const rewardAddresses = (this.transaction as TransactionWithExtensions)._rewardAddresses;
140+
const rewardAddresses = (this.transaction as unknown as ValidatorExtendedTransaction)._rewardAddresses;
141141
if (!rewardAddresses || rewardAddresses.length === 0) {
142142
throw new BuildTransactionError('Reward addresses are required for validator transaction');
143143
}

0 commit comments

Comments
 (0)