@bitgo/sdk-coin-flrp 1.3.3 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. package/dist/src/flrp.d.ts +6 -75
  2. package/dist/src/flrp.d.ts.map +1 -1
  3. package/dist/src/flrp.js +13 -298
  4. package/dist/src/index.d.ts +0 -1
  5. package/dist/src/index.d.ts.map +1 -1
  6. package/dist/src/index.js +1 -2
  7. package/dist/src/lib/ExportInCTxBuilder.d.ts +51 -0
  8. package/dist/src/lib/ExportInCTxBuilder.d.ts.map +1 -0
  9. package/dist/src/lib/ExportInCTxBuilder.js +186 -0
  10. package/dist/src/lib/ExportInPTxBuilder.d.ts +47 -0
  11. package/dist/src/lib/ExportInPTxBuilder.d.ts.map +1 -0
  12. package/dist/src/lib/ExportInPTxBuilder.js +273 -0
  13. package/dist/src/lib/ImportInCTxBuilder.d.ts +48 -0
  14. package/dist/src/lib/ImportInCTxBuilder.d.ts.map +1 -0
  15. package/dist/src/lib/ImportInCTxBuilder.js +215 -0
  16. package/dist/src/lib/ImportInPTxBuilder.d.ts +33 -0
  17. package/dist/src/lib/ImportInPTxBuilder.d.ts.map +1 -0
  18. package/dist/src/lib/ImportInPTxBuilder.js +180 -0
  19. package/dist/src/lib/atomicInCTransactionBuilder.d.ts +18 -16
  20. package/dist/src/lib/atomicInCTransactionBuilder.d.ts.map +1 -1
  21. package/dist/src/lib/atomicInCTransactionBuilder.js +38 -36
  22. package/dist/src/lib/atomicTransactionBuilder.d.ts +42 -79
  23. package/dist/src/lib/atomicTransactionBuilder.d.ts.map +1 -1
  24. package/dist/src/lib/atomicTransactionBuilder.js +138 -281
  25. package/dist/src/lib/iface.d.ts +50 -51
  26. package/dist/src/lib/iface.d.ts.map +1 -1
  27. package/dist/src/lib/iface.js +22 -10
  28. package/dist/src/lib/index.d.ts +2 -3
  29. package/dist/src/lib/index.d.ts.map +1 -1
  30. package/dist/src/lib/index.js +5 -6
  31. package/dist/src/lib/keyPair.d.ts +1 -1
  32. package/dist/src/lib/keyPair.d.ts.map +1 -1
  33. package/dist/src/lib/keyPair.js +9 -5
  34. package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts +32 -67
  35. package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts.map +1 -1
  36. package/dist/src/lib/permissionlessValidatorTxBuilder.js +91 -205
  37. package/dist/src/lib/transaction.d.ts +8 -73
  38. package/dist/src/lib/transaction.d.ts.map +1 -1
  39. package/dist/src/lib/transaction.js +159 -210
  40. package/dist/src/lib/transactionBuilder.d.ts +56 -34
  41. package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
  42. package/dist/src/lib/transactionBuilder.js +113 -70
  43. package/dist/src/lib/transactionBuilderFactory.d.ts +35 -30
  44. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
  45. package/dist/src/lib/transactionBuilderFactory.js +133 -74
  46. package/dist/src/lib/utils.d.ts +73 -151
  47. package/dist/src/lib/utils.d.ts.map +1 -1
  48. package/dist/src/lib/utils.js +197 -390
  49. package/dist/test/resources/transactionData/exportInC.d.ts +20 -0
  50. package/dist/test/resources/transactionData/exportInC.d.ts.map +1 -0
  51. package/dist/test/resources/transactionData/exportInC.js +34 -0
  52. package/dist/test/resources/transactionData/exportInP.d.ts +69 -0
  53. package/dist/test/resources/transactionData/exportInP.d.ts.map +1 -0
  54. package/dist/test/resources/transactionData/exportInP.js +140 -0
  55. package/dist/test/resources/transactionData/importInC.d.ts +27 -0
  56. package/dist/test/resources/transactionData/importInC.d.ts.map +1 -0
  57. package/dist/test/resources/transactionData/importInC.js +44 -0
  58. package/dist/test/resources/transactionData/importInP.d.ts +35 -0
  59. package/dist/test/resources/transactionData/importInP.d.ts.map +1 -0
  60. package/dist/test/resources/transactionData/importInP.js +58 -0
  61. package/dist/test/unit/lib/exportInCTxBuilder.js +95 -513
  62. package/dist/test/unit/lib/exportInPTxBuilder.d.ts +1 -1
  63. package/dist/test/unit/lib/exportInPTxBuilder.d.ts.map +1 -1
  64. package/dist/test/unit/lib/exportInPTxBuilder.js +110 -366
  65. package/dist/test/unit/lib/importInCTxBuilder.d.ts +1 -1
  66. package/dist/test/unit/lib/importInCTxBuilder.d.ts.map +1 -1
  67. package/dist/test/unit/lib/importInCTxBuilder.js +40 -251
  68. package/dist/test/unit/lib/importInPTxBuilder.d.ts +1 -1
  69. package/dist/test/unit/lib/importInPTxBuilder.d.ts.map +1 -1
  70. package/dist/test/unit/lib/importInPTxBuilder.js +61 -489
  71. package/dist/test/unit/lib/signFlowTestSuit.d.ts +20 -0
  72. package/dist/test/unit/lib/signFlowTestSuit.d.ts.map +1 -0
  73. package/dist/test/unit/lib/signFlowTestSuit.js +89 -0
  74. package/dist/test/unit/lib/utils.js +29 -302
  75. package/dist/tsconfig.tsbuildinfo +1 -1
  76. package/package.json +8 -10
  77. package/dist/src/iface.d.ts +0 -25
  78. package/dist/src/iface.d.ts.map +0 -1
  79. package/dist/src/iface.js +0 -3
  80. package/dist/src/lib/constants.d.ts +0 -170
  81. package/dist/src/lib/constants.d.ts.map +0 -1
  82. package/dist/src/lib/constants.js +0 -227
  83. package/dist/src/lib/delegatorTxBuilder.d.ts +0 -58
  84. package/dist/src/lib/delegatorTxBuilder.d.ts.map +0 -1
  85. package/dist/src/lib/delegatorTxBuilder.js +0 -224
  86. package/dist/src/lib/errors.d.ts +0 -8
  87. package/dist/src/lib/errors.d.ts.map +0 -1
  88. package/dist/src/lib/errors.js +0 -19
  89. package/dist/src/lib/exportInCTxBuilder.d.ts +0 -77
  90. package/dist/src/lib/exportInCTxBuilder.d.ts.map +0 -1
  91. package/dist/src/lib/exportInCTxBuilder.js +0 -199
  92. package/dist/src/lib/exportInPTxBuilder.d.ts +0 -30
  93. package/dist/src/lib/exportInPTxBuilder.d.ts.map +0 -1
  94. package/dist/src/lib/exportInPTxBuilder.js +0 -120
  95. package/dist/src/lib/importInCTxBuilder.d.ts +0 -67
  96. package/dist/src/lib/importInCTxBuilder.d.ts.map +0 -1
  97. package/dist/src/lib/importInCTxBuilder.js +0 -403
  98. package/dist/src/lib/importInPTxBuilder.d.ts +0 -73
  99. package/dist/src/lib/importInPTxBuilder.d.ts.map +0 -1
  100. package/dist/src/lib/importInPTxBuilder.js +0 -464
  101. package/dist/src/lib/types.d.ts +0 -78
  102. package/dist/src/lib/types.d.ts.map +0 -1
  103. package/dist/src/lib/types.js +0 -5
  104. package/dist/src/lib/validatorTxBuilder.d.ts +0 -40
  105. package/dist/src/lib/validatorTxBuilder.d.ts.map +0 -1
  106. package/dist/src/lib/validatorTxBuilder.js +0 -180
  107. package/dist/test/unit/delegatorTxBuilder.test.d.ts +0 -2
  108. package/dist/test/unit/delegatorTxBuilder.test.d.ts.map +0 -1
  109. package/dist/test/unit/delegatorTxBuilder.test.js +0 -233
  110. package/dist/test/unit/flrp.d.ts +0 -2
  111. package/dist/test/unit/flrp.d.ts.map +0 -1
  112. package/dist/test/unit/flrp.js +0 -118
  113. package/dist/test/unit/lib/atomicTransactionBuilder.d.ts +0 -2
  114. package/dist/test/unit/lib/atomicTransactionBuilder.d.ts.map +0 -1
  115. package/dist/test/unit/lib/atomicTransactionBuilder.js +0 -222
  116. package/dist/test/unit/lib/transaction.d.ts +0 -2
  117. package/dist/test/unit/lib/transaction.d.ts.map +0 -1
  118. package/dist/test/unit/lib/transaction.js +0 -460
  119. package/dist/test/unit/permissionlessValidatorTxBuilder.test.d.ts +0 -2
  120. package/dist/test/unit/permissionlessValidatorTxBuilder.test.d.ts.map +0 -1
  121. package/dist/test/unit/permissionlessValidatorTxBuilder.test.js +0 -271
  122. package/dist/test/unit/smoke.d.ts +0 -2
  123. package/dist/test/unit/smoke.d.ts.map +0 -1
  124. package/dist/test/unit/smoke.js +0 -23
  125. package/dist/test/unit/transactionBuilder.test.d.ts +0 -2
  126. package/dist/test/unit/transactionBuilder.test.d.ts.map +0 -1
  127. package/dist/test/unit/transactionBuilder.test.js +0 -114
  128. package/dist/test/unit/validatorTxBuilder.test.d.ts +0 -2
  129. package/dist/test/unit/validatorTxBuilder.test.d.ts.map +0 -1
  130. package/dist/test/unit/validatorTxBuilder.test.js +0 -293
@@ -1,40 +0,0 @@
1
- import { TransactionType } from '@bitgo/sdk-core';
2
- import { BaseCoin as CoinConfig } from '@bitgo/statics';
3
- import { DelegatorTxBuilder } from './delegatorTxBuilder';
4
- import { Tx } from './iface';
5
- export declare class ValidatorTxBuilder extends DelegatorTxBuilder {
6
- protected _delegationFeeRate: number | undefined;
7
- /**
8
- * @param coinConfig
9
- */
10
- constructor(coinConfig: Readonly<CoinConfig>);
11
- /**
12
- * get transaction type
13
- * @protected
14
- */
15
- protected get transactionType(): TransactionType;
16
- /**
17
- * set the delegationFeeRate
18
- * @param value number
19
- */
20
- delegationFeeRate(value: number): this;
21
- /**
22
- * Validate that the delegation fee is at least the minDelegationFee
23
- * @param delegationFeeRate number
24
- */
25
- validateDelegationFeeRate(delegationFeeRate: number): void;
26
- /** @inheritdoc */
27
- initBuilder(tx: Tx): this;
28
- /**
29
- * Verify if the transaction is an AddValidator transaction
30
- * @param tx
31
- */
32
- static verifyTxType(tx: unknown): boolean;
33
- verifyTxType(tx: unknown): boolean;
34
- /**
35
- * Build the validator transaction using FlareJS PVM API
36
- * @protected
37
- */
38
- protected buildFlareTransaction(): Promise<void>;
39
- }
40
- //# sourceMappingURL=validatorTxBuilder.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validatorTxBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/validatorTxBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAS7B,qBAAa,kBAAmB,SAAQ,kBAAkB;IACxD,SAAS,CAAC,kBAAkB,EAAE,MAAM,GAAG,SAAS,CAAC;IAEjD;;OAEG;gBACS,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC;IAK5C;;;OAGG;IACH,SAAS,KAAK,eAAe,IAAI,eAAe,CAE/C;IAED;;;OAGG;IACH,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAMtC;;;OAGG;IACH,yBAAyB,CAAC,iBAAiB,EAAE,MAAM,GAAG,IAAI;IAQ1D,kBAAkB;IAClB,WAAW,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI;IAazB;;;OAGG;IACH,MAAM,CAAC,YAAY,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO;IA0CzC,YAAY,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO;IAIlC;;;OAGG;cACa,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;CA0FvD"}
@@ -1,180 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ValidatorTxBuilder = void 0;
4
- const sdk_core_1 = require("@bitgo/sdk-core");
5
- const delegatorTxBuilder_1 = require("./delegatorTxBuilder");
6
- const constants_1 = require("./constants");
7
- class ValidatorTxBuilder extends delegatorTxBuilder_1.DelegatorTxBuilder {
8
- /**
9
- * @param coinConfig
10
- */
11
- constructor(coinConfig) {
12
- super(coinConfig);
13
- this._delegationFeeRate = undefined;
14
- }
15
- /**
16
- * get transaction type
17
- * @protected
18
- */
19
- get transactionType() {
20
- return sdk_core_1.TransactionType.AddValidator;
21
- }
22
- /**
23
- * set the delegationFeeRate
24
- * @param value number
25
- */
26
- delegationFeeRate(value) {
27
- this.validateDelegationFeeRate(value);
28
- this._delegationFeeRate = value;
29
- return this;
30
- }
31
- /**
32
- * Validate that the delegation fee is at least the minDelegationFee
33
- * @param delegationFeeRate number
34
- */
35
- validateDelegationFeeRate(delegationFeeRate) {
36
- // For Flare, use a minimum delegation fee of 2% (20000 basis points)
37
- const minDelegationFee = constants_1.MIN_DELEGATION_FEE_BASIS_POINTS; // 2%
38
- if (delegationFeeRate < minDelegationFee) {
39
- throw new sdk_core_1.BuildTransactionError(`Delegation fee cannot be less than ${minDelegationFee} basis points (2%)`);
40
- }
41
- }
42
- /** @inheritdoc */
43
- initBuilder(tx) {
44
- super.initBuilder(tx);
45
- // Extract delegation fee rate from transaction if available
46
- const txData = tx;
47
- const validatorData = txData;
48
- if (validatorData.delegationFeeRate !== undefined) {
49
- this._delegationFeeRate = validatorData.delegationFeeRate;
50
- }
51
- return this;
52
- }
53
- /**
54
- * Verify if the transaction is an AddValidator transaction
55
- * @param tx
56
- */
57
- static verifyTxType(tx) {
58
- // FlareJS validator transaction type verification
59
- try {
60
- if (!tx || typeof tx !== constants_1.OBJECT_TYPE_STRING) {
61
- return false;
62
- }
63
- const txData = tx;
64
- // Check for validator transaction type markers
65
- const validValidatorTypes = constants_1.VALIDATOR_TRANSACTION_TYPES;
66
- // Primary type verification
67
- if (txData.type && typeof txData.type === constants_1.STRING_TYPE) {
68
- if (validValidatorTypes.includes(txData.type)) {
69
- return true;
70
- }
71
- }
72
- // Secondary verification through transaction structure
73
- const hasValidatorStructure =
74
- // Has delegation fee rate (unique to validators)
75
- (typeof txData.delegationFeeRate === 'number' ||
76
- (txData.delegation &&
77
- typeof txData.delegation.delegationFeeRate === 'number')) &&
78
- // Has node ID
79
- (txData.nodeID || (txData.validator && txData.validator.nodeID)) &&
80
- // Has staking information
81
- (txData.stakeAmount || (txData.stake && txData.stake.amount));
82
- // FlareJS-specific markers
83
- const hasFlareJSValidatorMarkers = txData._txType === 'addValidator' ||
84
- txData._validatorType === 'primary' ||
85
- (txData.validator && txData.validator._flareJSReady === true);
86
- return Boolean(hasValidatorStructure || hasFlareJSValidatorMarkers);
87
- }
88
- catch (error) {
89
- return false;
90
- }
91
- }
92
- verifyTxType(tx) {
93
- return ValidatorTxBuilder.verifyTxType(tx);
94
- }
95
- /**
96
- * Build the validator transaction using FlareJS PVM API
97
- * @protected
98
- */
99
- async buildFlareTransaction() {
100
- // Basic validation
101
- if (!this._nodeID) {
102
- throw new sdk_core_1.BuildTransactionError('Node ID is required for validator transaction');
103
- }
104
- if (!this._startTime) {
105
- throw new sdk_core_1.BuildTransactionError('Start time is required for validator transaction');
106
- }
107
- if (!this._endTime) {
108
- throw new sdk_core_1.BuildTransactionError('End time is required for validator transaction');
109
- }
110
- if (!this._stakeAmount) {
111
- throw new sdk_core_1.BuildTransactionError('Stake amount is required for validator transaction');
112
- }
113
- if (this._delegationFeeRate === undefined) {
114
- throw new sdk_core_1.BuildTransactionError('Delegation fee rate is required for validator transaction');
115
- }
116
- const rewardAddresses = this.transaction._rewardAddresses;
117
- if (!rewardAddresses || rewardAddresses.length === 0) {
118
- throw new sdk_core_1.BuildTransactionError('Reward addresses are required for validator transaction');
119
- }
120
- // Validate time range (inherited from DelegatorTxBuilder logic)
121
- if (this._endTime <= this._startTime) {
122
- throw new sdk_core_1.BuildTransactionError('End time must be after start time');
123
- }
124
- try {
125
- // FlareJS PVM API implementation for validator transactions
126
- // This creates a structured validator transaction compatible with FlareJS patterns
127
- const enhancedValidatorTx = {
128
- type: 'PlatformVM.AddValidatorTx',
129
- networkID: this.transaction._networkID,
130
- blockchainID: this.transaction._blockchainID,
131
- // Enhanced validator information structure
132
- validator: {
133
- nodeID: this._nodeID,
134
- startTime: this._startTime,
135
- endTime: this._endTime,
136
- stakeAmount: this._stakeAmount,
137
- // FlareJS validator markers
138
- _validatorType: 'primary',
139
- _flareJSReady: true,
140
- _pvmCompatible: true,
141
- },
142
- // Enhanced delegation information
143
- delegation: {
144
- delegationFeeRate: this._delegationFeeRate,
145
- rewardAddress: rewardAddresses[0],
146
- // FlareJS delegation markers
147
- _delegationType: 'validator',
148
- _feeRate: this._delegationFeeRate,
149
- _flareJSReady: true,
150
- },
151
- // Enhanced transaction metadata
152
- stake: {
153
- assetID: this.getAssetId(),
154
- amount: this._stakeAmount,
155
- addresses: this.transaction._fromAddresses,
156
- threshold: this.transaction._threshold || 1,
157
- locktime: this.transaction._locktime || 0n,
158
- // FlareJS stake markers
159
- _stakeType: 'validator',
160
- _flareJSReady: true,
161
- },
162
- // Enhanced credential structure for validators
163
- credentials: this.transaction._fromAddresses.map(() => ({
164
- signatures: [], // Will be populated by FlareJS signing
165
- _credentialType: 'secp256k1fx.Credential',
166
- _validatorCredential: true,
167
- _flareJSReady: true,
168
- })),
169
- // Transaction metadata
170
- memo: Buffer.alloc(0),
171
- };
172
- this.transaction.setTransaction(enhancedValidatorTx);
173
- }
174
- catch (error) {
175
- throw new sdk_core_1.BuildTransactionError(`Failed to build validator transaction: ${error instanceof Error ? error.message : 'Unknown error'}`);
176
- }
177
- }
178
- }
179
- exports.ValidatorTxBuilder = ValidatorTxBuilder;
180
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9yVHhCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi92YWxpZGF0b3JUeEJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsOENBQXlFO0FBRXpFLDZEQUEwRDtBQUcxRCwyQ0FLcUI7QUFFckIsTUFBYSxrQkFBbUIsU0FBUSx1Q0FBa0I7SUFHeEQ7O09BRUc7SUFDSCxZQUFZLFVBQWdDO1FBQzFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNsQixJQUFJLENBQUMsa0JBQWtCLEdBQUcsU0FBUyxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUFjLGVBQWU7UUFDM0IsT0FBTywwQkFBZSxDQUFDLFlBQVksQ0FBQztJQUN0QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsaUJBQWlCLENBQUMsS0FBYTtRQUM3QixJQUFJLENBQUMseUJBQXlCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQztRQUNoQyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7O09BR0c7SUFDSCx5QkFBeUIsQ0FBQyxpQkFBeUI7UUFDakQscUVBQXFFO1FBQ3JFLE1BQU0sZ0JBQWdCLEdBQUcsMkNBQStCLENBQUMsQ0FBQyxLQUFLO1FBQy9ELElBQUksaUJBQWlCLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQztZQUN6QyxNQUFNLElBQUksZ0NBQXFCLENBQUMsc0NBQXNDLGdCQUFnQixvQkFBb0IsQ0FBQyxDQUFDO1FBQzlHLENBQUM7SUFDSCxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLFdBQVcsQ0FBQyxFQUFNO1FBQ2hCLEtBQUssQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFdEIsNERBQTREO1FBQzVELE1BQU0sTUFBTSxHQUFHLEVBQW1DLENBQUM7UUFDbkQsTUFBTSxhQUFhLEdBQUcsTUFBcUMsQ0FBQztRQUM1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dk1ELGdEQXVNQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJ1aWxkVHJhbnNhY3Rpb25FcnJvciwgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7IEJhc2VDb2luIGFzIENvaW5Db25maWcgfSBmcm9tICdAYml0Z28vc3RhdGljcyc7XG5pbXBvcnQgeyBEZWxlZ2F0b3JUeEJ1aWxkZXIgfSBmcm9tICcuL2RlbGVnYXRvclR4QnVpbGRlcic7XG5pbXBvcnQgeyBUeCB9IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHsgUmF3VHJhbnNhY3Rpb25EYXRhLCBWYWxpZGF0b3JFeHRlbmRlZFRyYW5zYWN0aW9uLCBWYWxpZGF0b3JSYXdUcmFuc2FjdGlvbkRhdGEgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7XG4gIE1JTl9ERUxFR0FUSU9OX0ZFRV9CQVNJU19QT0lOVFMsXG4gIE9CSkVDVF9UWVBFX1NUUklORyxcbiAgU1RSSU5HX1RZUEUsXG4gIFZBTElEQVRPUl9UUkFOU0FDVElPTl9UWVBFUyxcbn0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG5leHBvcnQgY2xhc3MgVmFsaWRhdG9yVHhCdWlsZGVyIGV4dGVuZHMgRGVsZWdhdG9yVHhCdWlsZGVyIHtcbiAgcHJvdGVjdGVkIF9kZWxlZ2F0aW9uRmVlUmF0ZTogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gY29pbkNvbmZpZ1xuICAgKi9cbiAgY29uc3RydWN0b3IoY29pbkNvbmZpZzogUmVhZG9ubHk8Q29pbkNvbmZpZz4pIHtcbiAgICBzdXBlcihjb2luQ29uZmlnKTtcbiAgICB0aGlzLl9kZWxlZ2F0aW9uRmVlUmF0ZSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBnZXQgdHJhbnNhY3Rpb24gdHlwZVxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IHRyYW5zYWN0aW9uVHlwZSgpOiBUcmFuc2FjdGlvblR5cGUge1xuICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuQWRkVmFsaWRhdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIHNldCB0aGUgZGVsZWdhdGlvbkZlZVJhdGVcbiAgICogQHBhcmFtIHZhbHVlIG51bWJlclxuICAgKi9cbiAgZGVsZWdhdGlvbkZlZVJhdGUodmFsdWU6IG51bWJlcik6IHRoaXMge1xuICAgIHRoaXMudmFsaWRhdGVEZWxlZ2F0aW9uRmVlUmF0ZSh2YWx1ZSk7XG4gICAgdGhpcy5fZGVsZWdhdGlvbkZlZVJhdGUgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSB0aGF0IHRoZSBkZWxlZ2F0aW9uIGZlZSBpcyBhdCBsZWFzdCB0aGUgbWluRGVsZWdhdGlvbkZlZVxuICAgKiBAcGFyYW0gZGVsZWdhdGlvbkZlZVJhdGUgbnVtYmVyXG4gICAqL1xuICB2YWxpZGF0ZURlbGVnYXRpb25GZWVSYXRlKGRlbGVnYXRpb25GZWVSYXRlOiBudW1iZXIpOiB2b2lkIHtcbiAgICAvLyBGb3IgRmxhcmUsIHVzZSBhIG1pbmltdW0gZGVsZWdhdGlvbiBmZWUgb2YgMiUgKDIwMDAwIGJhc2lzIHBvaW50cylcbiAgICBjb25zdCBtaW5EZWxlZ2F0aW9uRmVlID0gTUlOX0RFTEVHQVRJT05fRkVFX0JBU0lTX1BPSU5UUzsgLy8gMiVcbiAgICBpZiAoZGVsZWdhdGlvbkZlZVJhdGUgPCBtaW5EZWxlZ2F0aW9uRmVlKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBEZWxlZ2F0aW9uIGZlZSBjYW5ub3QgYmUgbGVzcyB0aGFuICR7bWluRGVsZWdhdGlvbkZlZX0gYmFzaXMgcG9pbnRzICgyJSlgKTtcbiAgICB9XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgaW5pdEJ1aWxkZXIodHg6IFR4KTogdGhpcyB7XG4gICAgc3VwZXIuaW5pdEJ1aWxkZXIodHgpO1xuXG4gICAgLy8gRXh0cmFjdCBkZWxlZ2F0aW9uIGZlZSByYXRlIGZyb20gdHJhbnNhY3Rpb24gaWYgYXZhaWxhYmxlXG4gICAgY29uc3QgdHhEYXRhID0gdHggYXMgdW5rbm93biBhcyBSYXdUcmFuc2FjdGlvbkRhdGE7XG4gICAgY29uc3QgdmFsaWRhdG9yRGF0YSA9IHR4RGF0YSBhcyBWYWxpZGF0b3JSYXdUcmFuc2FjdGlvbkRhdGE7XG4gICAgaWYgKHZhbGlkYXRvckRhdGEuZGVsZWdhdGlvbkZlZVJhdGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fZGVsZWdhdGlvbkZlZVJhdGUgPSB2YWxpZGF0b3JEYXRhLmRlbGVnYXRpb25GZWVSYXRlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmeSBpZiB0aGUgdHJhbnNhY3Rpb24gaXMgYW4gQWRkVmFsaWRhdG9yIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB0eFxuICAgKi9cbiAgc3RhdGljIHZlcmlmeVR4VHlwZSh0eDogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgIC8vIEZsYXJlSlMgdmFsaWRhdG9yIHRyYW5zYWN0aW9uIHR5cGUgdmVyaWZpY2F0aW9uXG4gICAgdHJ5IHtcbiAgICAgIGlmICghdHggfHwgdHlwZW9mIHR4ICE9PSBPQkpFQ1RfVFlQRV9TVFJJTkcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0eERhdGEgPSB0eCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAgICAgLy8gQ2hlY2sgZm9yIHZhbGlkYXRvciB0cmFuc2FjdGlvbiB0eXBlIG1hcmtlcnNcbiAgICAgIGNvbnN0IHZhbGlkVmFsaWRhdG9yVHlwZXMgPSBWQUxJREFUT1JfVFJBTlNBQ1RJT05fVFlQRVM7XG5cbiAgICAgIC8vIFByaW1hcnkgdHlwZSB2ZXJpZmljYXRpb25cbiAgICAgIGlmICh0eERhdGEudHlwZSAmJiB0eXBlb2YgdHhEYXRhLnR5cGUgPT09IFNUUklOR19UWVBFKSB7XG4gICAgICAgIGlmICh2YWxpZFZhbGlkYXRvclR5cGVzLmluY2x1ZGVzKHR4RGF0YS50eXBlIGFzIHN0cmluZykpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBTZWNvbmRhcnkgdmVyaWZpY2F0aW9uIHRocm91Z2ggdHJhbnNhY3Rpb24gc3RydWN0dXJlXG4gICAgICBjb25zdCBoYXNWYWxpZGF0b3JTdHJ1Y3R1cmUgPVxuICAgICAgICAvLyBIYXMgZGVsZWdhdGlvbiBmZWUgcmF0ZSAodW5pcXVlIHRvIHZhbGlkYXRvcnMpXG4gICAgICAgICh0eXBlb2YgdHhEYXRhLmRlbGVnYXRpb25GZWVSYXRlID09PSAnbnVtYmVyJyB8fFxuICAgICAgICAgICh0eERhdGEuZGVsZWdhdGlvbiAmJlxuICAgICAgICAgICAgdHlwZW9mICh0eERhdGEuZGVsZWdhdGlvbiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikuZGVsZWdhdGlvbkZlZVJhdGUgPT09ICdudW1iZXInKSkgJiZcbiAgICAgICAgLy8gSGFzIG5vZGUgSURcbiAgICAgICAgKHR4RGF0YS5ub2RlSUQgfHwgKHR4RGF0YS52YWxpZGF0b3IgJiYgKHR4RGF0YS52YWxpZGF0b3IgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLm5vZGVJRCkpICYmXG4gICAgICAgIC8vIEhhcyBzdGFraW5nIGluZm9ybWF0aW9uXG4gICAgICAgICh0eERhdGEuc3Rha2VBbW91bnQgfHwgKHR4RGF0YS5zdGFrZSAmJiAodHhEYXRhLnN0YWtlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5hbW91bnQpKTtcblxuICAgICAgLy8gRmxhcmVKUy1zcGVjaWZpYyBtYXJrZXJzXG4gICAgICBjb25zdCBoYXNGbGFyZUpTVmFsaWRhdG9yTWFya2VycyA9XG4gICAgICAgIHR4RGF0YS5fdHhUeXBlID09PSAnYWRkVmFsaWRhdG9yJyB8fFxuICAgICAgICB0eERhdGEuX3ZhbGlkYXRvclR5cGUgPT09ICdwcmltYXJ5JyB8fFxuICAgICAgICAodHhEYXRhLnZhbGlkYXRvciAmJiAodHhEYXRhLnZhbGlkYXRvciBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikuX2ZsYXJlSlNSZWFkeSA9PT0gdHJ1ZSk7XG5cbiAgICAgIHJldHVybiBCb29sZWFuKGhhc1ZhbGlkYXRvclN0cnVjdHVyZSB8fCBoYXNGbGFyZUpTVmFsaWRhdG9yTWFya2Vycyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICB2ZXJpZnlUeFR5cGUodHg6IHVua25vd24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gVmFsaWRhdG9yVHhCdWlsZGVyLnZlcmlmeVR4VHlwZSh0eCk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgdGhlIHZhbGlkYXRvciB0cmFuc2FjdGlvbiB1c2luZyBGbGFyZUpTIFBWTSBBUElcbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGJ1aWxkRmxhcmVUcmFuc2FjdGlvbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBCYXNpYyB2YWxpZGF0aW9uXG4gICAgaWYgKCF0aGlzLl9ub2RlSUQpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ05vZGUgSUQgaXMgcmVxdWlyZWQgZm9yIHZhbGlkYXRvciB0cmFuc2FjdGlvbicpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuX3N0YXJ0VGltZSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignU3RhcnQgdGltZSBpcyByZXF1aXJlZCBmb3IgdmFsaWRhdG9yIHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuICAgIGlmICghdGhpcy5fZW5kVGltZSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignRW5kIHRpbWUgaXMgcmVxdWlyZWQgZm9yIHZhbGlkYXRvciB0cmFuc2FjdGlvbicpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuX3N0YWtlQW1vdW50KSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdTdGFrZSBhbW91bnQgaXMgcmVxdWlyZWQgZm9yIHZhbGlkYXRvciB0cmFuc2FjdGlvbicpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fZGVsZWdhdGlvbkZlZVJhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignRGVsZWdhdGlvbiBmZWUgcmF0ZSBpcyByZXF1aXJlZCBmb3IgdmFsaWRhdG9yIHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuXG4gICAgY29uc3QgcmV3YXJkQWRkcmVzc2VzID0gKHRoaXMudHJhbnNhY3Rpb24gYXMgdW5rbm93biBhcyBWYWxpZGF0b3JFeHRlbmRlZFRyYW5zYWN0aW9uKS5fcmV3YXJkQWRkcmVzc2VzO1xuICAgIGlmICghcmV3YXJkQWRkcmVzc2VzIHx8IHJld2FyZEFkZHJlc3Nlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ1Jld2FyZCBhZGRyZXNzZXMgYXJlIHJlcXVpcmVkIGZvciB2YWxpZGF0b3IgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSB0aW1lIHJhbmdlIChpbmhlcml0ZWQgZnJvbSBEZWxlZ2F0b3JUeEJ1aWxkZXIgbG9naWMpXG4gICAgaWYgKHRoaXMuX2VuZFRpbWUgPD0gdGhpcy5fc3RhcnRUaW1lKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdFbmQgdGltZSBtdXN0IGJlIGFmdGVyIHN0YXJ0IHRpbWUnKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8gRmxhcmVKUyBQVk0gQVBJIGltcGxlbWVudGF0aW9uIGZvciB2YWxpZGF0b3IgdHJhbnNhY3Rpb25zXG4gICAgICAvLyBUaGlzIGNyZWF0ZXMgYSBzdHJ1Y3R1cmVkIHZhbGlkYXRvciB0cmFuc2FjdGlvbiBjb21wYXRpYmxlIHdpdGggRmxhcmVKUyBwYXR0ZXJuc1xuXG4gICAgICBjb25zdCBlbmhhbmNlZFZhbGlkYXRvclR4ID0ge1xuICAgICAgICB0eXBlOiAnUGxhdGZvcm1WTS5BZGRWYWxpZGF0b3JUeCcsXG4gICAgICAgIG5ldHdvcmtJRDogdGhpcy50cmFuc2FjdGlvbi5fbmV0d29ya0lELFxuICAgICAgICBibG9ja2NoYWluSUQ6IHRoaXMudHJhbnNhY3Rpb24uX2Jsb2NrY2hhaW5JRCxcblxuICAgICAgICAvLyBFbmhhbmNlZCB2YWxpZGF0b3IgaW5mb3JtYXRpb24gc3RydWN0dXJlXG4gICAgICAgIHZhbGlkYXRvcjoge1xuICAgICAgICAgIG5vZGVJRDogdGhpcy5fbm9kZUlELFxuICAgICAgICAgIHN0YXJ0VGltZTogdGhpcy5fc3RhcnRUaW1lLFxuICAgICAgICAgIGVuZFRpbWU6IHRoaXMuX2VuZFRpbWUsXG4gICAgICAgICAgc3Rha2VBbW91bnQ6IHRoaXMuX3N0YWtlQW1vdW50LFxuICAgICAgICAgIC8vIEZsYXJlSlMgdmFsaWRhdG9yIG1hcmtlcnNcbiAgICAgICAgICBfdmFsaWRhdG9yVHlwZTogJ3ByaW1hcnknLFxuICAgICAgICAgIF9mbGFyZUpTUmVhZHk6IHRydWUsXG4gICAgICAgICAgX3B2bUNvbXBhdGlibGU6IHRydWUsXG4gICAgICAgIH0sXG5cbiAgICAgICAgLy8gRW5oYW5jZWQgZGVsZWdhdGlvbiBpbmZvcm1hdGlvblxuICAgICAgICBkZWxlZ2F0aW9uOiB7XG4gICAgICAgICAgZGVsZWdhdGlvbkZlZVJhdGU6IHRoaXMuX2RlbGVnYXRpb25GZWVSYXRlLFxuICAgICAgICAgIHJld2FyZEFkZHJlc3M6IHJld2FyZEFkZHJlc3Nlc1swXSxcbiAgICAgICAgICAvLyBGbGFyZUpTIGRlbGVnYXRpb24gbWFya2Vyc1xuICAgICAgICAgIF9kZWxlZ2F0aW9uVHlwZTogJ3ZhbGlkYXRvcicsXG4gICAgICAgICAgX2ZlZVJhdGU6IHRoaXMuX2RlbGVnYXRpb25GZWVSYXRlLFxuICAgICAgICAgIF9mbGFyZUpTUmVhZHk6IHRydWUsXG4gICAgICAgIH0sXG5cbiAgICAgICAgLy8gRW5oYW5jZWQgdHJhbnNhY3Rpb24gbWV0YWRhdGFcbiAgICAgICAgc3Rha2U6IHtcbiAgICAgICAgICBhc3NldElEOiB0aGlzLmdldEFzc2V0SWQoKSxcbiAgICAgICAgICBhbW91bnQ6IHRoaXMuX3N0YWtlQW1vdW50LFxuICAgICAgICAgIGFkZHJlc3NlczogdGhpcy50cmFuc2FjdGlvbi5fZnJvbUFkZHJlc3NlcyxcbiAgICAgICAgICB0aHJlc2hvbGQ6IHRoaXMudHJhbnNhY3Rpb24uX3RocmVzaG9sZCB8fCAxLFxuICAgICAgICAgIGxvY2t0aW1lOiB0aGlzLnRyYW5zYWN0aW9uLl9sb2NrdGltZSB8fCAwbixcbiAgICAgICAgICAvLyBGbGFyZUpTIHN0YWtlIG1hcmtlcnNcbiAgICAgICAgICBfc3Rha2VUeXBlOiAndmFsaWRhdG9yJyxcbiAgICAgICAgICBfZmxhcmVKU1JlYWR5OiB0cnVlLFxuICAgICAgICB9LFxuXG4gICAgICAgIC8vIEVuaGFuY2VkIGNyZWRlbnRpYWwgc3RydWN0dXJlIGZvciB2YWxpZGF0b3JzXG4gICAgICAgIGNyZWRlbnRpYWxzOiB0aGlzLnRyYW5zYWN0aW9uLl9mcm9tQWRkcmVzc2VzLm1hcCgoKSA9PiAoe1xuICAgICAgICAgIHNpZ25hdHVyZXM6IFtdLCAvLyBXaWxsIGJlIHBvcHVsYXRlZCBieSBGbGFyZUpTIHNpZ25pbmdcbiAgICAgICAgICBfY3JlZGVudGlhbFR5cGU6ICdzZWNwMjU2azFmeC5DcmVkZW50aWFsJyxcbiAgICAgICAgICBfdmFsaWRhdG9yQ3JlZGVudGlhbDogdHJ1ZSxcbiAgICAgICAgICBfZmxhcmVKU1JlYWR5OiB0cnVlLFxuICAgICAgICB9KSksXG5cbiAgICAgICAgLy8gVHJhbnNhY3Rpb24gbWV0YWRhdGFcbiAgICAgICAgbWVtbzogQnVmZmVyLmFsbG9jKDApLFxuICAgICAgfTtcblxuICAgICAgdGhpcy50cmFuc2FjdGlvbi5zZXRUcmFuc2FjdGlvbihlbmhhbmNlZFZhbGlkYXRvclR4KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byBidWlsZCB2YWxpZGF0b3IgdHJhbnNhY3Rpb246ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=delegatorTxBuilder.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"delegatorTxBuilder.test.d.ts","sourceRoot":"","sources":["../../../test/unit/delegatorTxBuilder.test.ts"],"names":[],"mappings":""}
@@ -1,233 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- Object.defineProperty(exports, "__esModule", { value: true });
36
- const statics_1 = require("@bitgo/statics");
37
- const sdk_core_1 = require("@bitgo/sdk-core");
38
- const assert = __importStar(require("assert"));
39
- const delegatorTxBuilder_1 = require("../../src/lib/delegatorTxBuilder");
40
- describe('DelegatorTxBuilder', function () {
41
- const coinConfig = statics_1.coins.get('tflrp');
42
- let builder;
43
- beforeEach(function () {
44
- builder = new delegatorTxBuilder_1.DelegatorTxBuilder(coinConfig);
45
- });
46
- describe('Constructor', function () {
47
- it('should initialize with coin config', function () {
48
- assert.ok(builder);
49
- assert.ok(builder instanceof delegatorTxBuilder_1.DelegatorTxBuilder);
50
- });
51
- it('should initialize with default values', function () {
52
- assert.strictEqual(builder['_nodeID'], '');
53
- assert.strictEqual(builder['_startTime'], 0n);
54
- assert.strictEqual(builder['_endTime'], 0n);
55
- assert.strictEqual(builder['_stakeAmount'], 0n);
56
- });
57
- it('should set transaction type to AddDelegator', function () {
58
- assert.strictEqual(builder['transactionType'], sdk_core_1.TransactionType.AddDelegator);
59
- });
60
- });
61
- describe('nodeID', function () {
62
- it('should set node ID correctly', function () {
63
- const nodeID = 'NodeID-7Xhw2mDxuDS44j42TCB6U5579esbSt3Lg';
64
- const result = builder.nodeID(nodeID);
65
- assert.strictEqual(builder['_nodeID'], nodeID);
66
- assert.strictEqual(result, builder);
67
- });
68
- it('should throw error for empty node ID', function () {
69
- assert.throws(() => builder.nodeID(''), sdk_core_1.BuildTransactionError);
70
- });
71
- });
72
- describe('startTime', function () {
73
- it('should set start time from number', function () {
74
- const time = 1640995200;
75
- const result = builder.startTime(time);
76
- assert.strictEqual(builder['_startTime'], BigInt(time));
77
- assert.strictEqual(result, builder);
78
- });
79
- it('should set start time from string', function () {
80
- const time = '1640995200';
81
- const result = builder.startTime(time);
82
- assert.strictEqual(builder['_startTime'], BigInt(time));
83
- assert.strictEqual(result, builder);
84
- });
85
- it('should set start time from bigint', function () {
86
- const time = 1640995200n;
87
- const result = builder.startTime(time);
88
- assert.strictEqual(builder['_startTime'], time);
89
- assert.strictEqual(result, builder);
90
- });
91
- it('should throw error for zero start time', function () {
92
- assert.throws(() => builder.startTime(0), sdk_core_1.BuildTransactionError);
93
- });
94
- it('should throw error for negative start time', function () {
95
- assert.throws(() => builder.startTime(-1), sdk_core_1.BuildTransactionError);
96
- });
97
- it('should throw error when start time is after end time', function () {
98
- builder.endTime(1640995200); // Set end time first
99
- assert.throws(() => builder.startTime(1672531200), sdk_core_1.BuildTransactionError); // Start time after end time
100
- });
101
- it('should allow start time before end time', function () {
102
- builder.endTime(1672531200); // Set end time first
103
- const result = builder.startTime(1640995200); // Start time before end time
104
- assert.strictEqual(result, builder);
105
- });
106
- });
107
- describe('endTime', function () {
108
- it('should set end time from number', function () {
109
- const time = 1672531200;
110
- const result = builder.endTime(time);
111
- assert.strictEqual(builder['_endTime'], BigInt(time));
112
- assert.strictEqual(result, builder);
113
- });
114
- it('should set end time from string', function () {
115
- const time = '1672531200';
116
- const result = builder.endTime(time);
117
- assert.strictEqual(builder['_endTime'], BigInt(time));
118
- assert.strictEqual(result, builder);
119
- });
120
- it('should set end time from bigint', function () {
121
- const time = 1672531200n;
122
- const result = builder.endTime(time);
123
- assert.strictEqual(builder['_endTime'], time);
124
- assert.strictEqual(result, builder);
125
- });
126
- it('should throw error for zero end time', function () {
127
- assert.throws(() => builder.endTime(0), sdk_core_1.BuildTransactionError);
128
- });
129
- it('should throw error for negative end time', function () {
130
- assert.throws(() => builder.endTime(-1), sdk_core_1.BuildTransactionError);
131
- });
132
- it('should throw error when end time is before start time', function () {
133
- builder.startTime(1672531200); // Set start time first
134
- assert.throws(() => builder.endTime(1640995200), sdk_core_1.BuildTransactionError); // End time before start time
135
- });
136
- it('should allow end time after start time', function () {
137
- builder.startTime(1640995200); // Set start time first
138
- const result = builder.endTime(1672531200); // End time after start time
139
- assert.strictEqual(result, builder);
140
- });
141
- });
142
- describe('stakeAmount', function () {
143
- it('should set stake amount from number', function () {
144
- const amount = 50000000000000000000n;
145
- const result = builder.stakeAmount(amount);
146
- assert.strictEqual(builder['_stakeAmount'], amount);
147
- assert.strictEqual(result, builder);
148
- });
149
- it('should set stake amount from string', function () {
150
- const amount = '50000000000000000000';
151
- const result = builder.stakeAmount(amount);
152
- assert.strictEqual(builder['_stakeAmount'], BigInt(amount));
153
- assert.strictEqual(result, builder);
154
- });
155
- it('should throw error for zero stake amount', function () {
156
- assert.throws(() => builder.stakeAmount(0), sdk_core_1.BuildTransactionError);
157
- });
158
- it('should throw error for negative stake amount', function () {
159
- assert.throws(() => builder.stakeAmount(-1), sdk_core_1.BuildTransactionError);
160
- });
161
- });
162
- describe('rewardAddresses', function () {
163
- it('should set reward addresses correctly', function () {
164
- const addresses = ['P-flare1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpk7kph'];
165
- const result = builder.rewardAddresses(addresses);
166
- assert.strictEqual(result, builder);
167
- });
168
- it('should throw error for empty addresses array', function () {
169
- assert.throws(() => builder.rewardAddresses([]), sdk_core_1.BuildTransactionError);
170
- });
171
- });
172
- describe('verifyTxType', function () {
173
- it('should return true for valid delegator transaction', function () {
174
- const tx = {
175
- nodeID: 'NodeID-7Xhw2mDxuDS44j42TCB6U5579esbSt3Lg',
176
- stakeAmount: '50000000000000000000',
177
- };
178
- assert.strictEqual(delegatorTxBuilder_1.DelegatorTxBuilder.verifyTxType(tx), true);
179
- assert.strictEqual(builder.verifyTxType(tx), true);
180
- });
181
- it('should return false for invalid transaction', function () {
182
- const tx = { stakeAmount: '50000000000000000000' };
183
- assert.strictEqual(delegatorTxBuilder_1.DelegatorTxBuilder.verifyTxType(tx), false);
184
- });
185
- it('should return false for empty transaction', function () {
186
- assert.strictEqual(delegatorTxBuilder_1.DelegatorTxBuilder.verifyTxType({}), false);
187
- });
188
- });
189
- describe('buildFlareTransaction', function () {
190
- beforeEach(function () {
191
- builder
192
- .nodeID('NodeID-7Xhw2mDxuDS44j42TCB6U5579esbSt3Lg')
193
- .startTime(1640995200)
194
- .endTime(1672531200)
195
- .stakeAmount(50000000000000000000n)
196
- .rewardAddresses(['P-flare1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpk7kph']);
197
- });
198
- it('should throw error if nodeID is missing', async function () {
199
- builder['_nodeID'] = '';
200
- await assert.rejects(builder['buildFlareTransaction'](), sdk_core_1.BuildTransactionError);
201
- });
202
- it('should throw error if startTime is missing', async function () {
203
- builder['_startTime'] = 0n;
204
- await assert.rejects(builder['buildFlareTransaction'](), sdk_core_1.BuildTransactionError);
205
- });
206
- it('should throw error if endTime is missing', async function () {
207
- builder['_endTime'] = 0n;
208
- await assert.rejects(builder['buildFlareTransaction'](), sdk_core_1.BuildTransactionError);
209
- });
210
- it('should throw error if stakeAmount is missing', async function () {
211
- builder['_stakeAmount'] = 0n;
212
- await assert.rejects(builder['buildFlareTransaction'](), sdk_core_1.BuildTransactionError);
213
- });
214
- it('should throw error if end time is before start time', function () {
215
- // This test verifies that time validation happens immediately when setting values
216
- assert.throws(() => {
217
- builder.startTime(1672531200).endTime(1640995200);
218
- }, sdk_core_1.BuildTransactionError);
219
- });
220
- });
221
- describe('method chaining', function () {
222
- it('should support method chaining', function () {
223
- const result = builder
224
- .nodeID('NodeID-7Xhw2mDxuDS44j42TCB6U5579esbSt3Lg')
225
- .startTime(1640995200)
226
- .endTime(1672531200)
227
- .stakeAmount(50000000000000000000n)
228
- .rewardAddresses(['P-flare1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpk7kph']);
229
- assert.strictEqual(result, builder);
230
- });
231
- });
232
- });
233
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVsZWdhdG9yVHhCdWlsZGVyLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvZGVsZWdhdG9yVHhCdWlsZGVyLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw0Q0FBdUM7QUFDdkMsOENBQXlFO0FBQ3pFLCtDQUFpQztBQUNqQyx5RUFBc0U7QUFFdEUsUUFBUSxDQUFDLG9CQUFvQixFQUFFO0lBQzdCLE1BQU0sVUFBVSxHQUFHLGVBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdEMsSUFBSSxPQUEyQixDQUFDO0lBRWhDLFVBQVUsQ0FBQztRQUNULE9BQU8sR0FBRyxJQUFJLHVDQUFrQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQy9DLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLGFBQWEsRUFBRTtRQUN0QixFQUFFLENBQUMsb0NBQW9DLEVBQUU7WUFDdkMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNuQixNQUFNLENBQUMsRUFBRSxDQUFDLE9BQU8sWUFBWSx1Q0FBa0IsQ0FBQyxDQUFDO1FBQ25ELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHVDQUF1QyxFQUFFO1lBQzFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzNDLE1BQU0sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzlDLE1BQU0sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzVDLE1BQU0sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2xELENBQUMsQ0FBQyxD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QyxDQUFDO1FBRUgsRUFBRSxDQUFDLDhDQUE4QyxFQUFFLEtBQUs7WUFDdEQsT0FBTyxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUM3QixNQUFNLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLHVCQUF1QixDQUFDLEVBQUUsRUFBRSxnQ0FBcUIsQ0FBQyxDQUFDO1FBQ2xGLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHFEQUFxRCxFQUFFO1lBQ3hELGtGQUFrRjtZQUNsRixNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRTtnQkFDakIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDcEQsQ0FBQyxFQUFFLGdDQUFxQixDQUFDLENBQUM7UUFDNUIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxpQkFBaUIsRUFBRTtRQUMxQixFQUFFLENBQUMsZ0NBQWdDLEVBQUU7WUFDbkMsTUFBTSxNQUFNLEdBQUcsT0FBTztpQkFDbkIsTUFBTSxDQUFDLDBDQUEwQyxDQUFDO2lCQUNsRCxTQUFTLENBQUMsVUFBVSxDQUFDO2lCQUNyQixPQUFPLENBQUMsVUFBVSxDQUFDO2lCQUNuQixXQUFXLENBQUMscUJBQXFCLENBQUM7aUJBQ2xDLGVBQWUsQ0FBQyxDQUFDLHNEQUFzRCxDQUFDLENBQUMsQ0FBQztZQUU3RSxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN0QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb2lucyB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCB7IEJ1aWxkVHJhbnNhY3Rpb25FcnJvciwgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCAqIGFzIGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgRGVsZWdhdG9yVHhCdWlsZGVyIH0gZnJvbSAnLi4vLi4vc3JjL2xpYi9kZWxlZ2F0b3JUeEJ1aWxkZXInO1xuXG5kZXNjcmliZSgnRGVsZWdhdG9yVHhCdWlsZGVyJywgZnVuY3Rpb24gKCkge1xuICBjb25zdCBjb2luQ29uZmlnID0gY29pbnMuZ2V0KCd0ZmxycCcpO1xuICBsZXQgYnVpbGRlcjogRGVsZWdhdG9yVHhCdWlsZGVyO1xuXG4gIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgIGJ1aWxkZXIgPSBuZXcgRGVsZWdhdG9yVHhCdWlsZGVyKGNvaW5Db25maWcpO1xuICB9KTtcblxuICBkZXNjcmliZSgnQ29uc3RydWN0b3InLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBpbml0aWFsaXplIHdpdGggY29pbiBjb25maWcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQub2soYnVpbGRlcik7XG4gICAgICBhc3NlcnQub2soYnVpbGRlciBpbnN0YW5jZW9mIERlbGVnYXRvclR4QnVpbGRlcik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGluaXRpYWxpemUgd2l0aCBkZWZhdWx0IHZhbHVlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChidWlsZGVyWydfbm9kZUlEJ10sICcnKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChidWlsZGVyWydfc3RhcnRUaW1lJ10sIDBuKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChidWlsZGVyWydfZW5kVGltZSddLCAwbik7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYnVpbGRlclsnX3N0YWtlQW1vdW50J10sIDBuKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc2V0IHRyYW5zYWN0aW9uIHR5cGUgdG8gQWRkRGVsZWdhdG9yJywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGJ1aWxkZXJbJ3RyYW5zYWN0aW9uVHlwZSddLCBUcmFuc2FjdGlvblR5cGUuQWRkRGVsZWdhdG9yKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ25vZGVJRCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHNldCBub2RlIElEIGNvcnJlY3RseScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG5vZGVJRCA9ICdOb2RlSUQtN1hodzJtRHh1RFM0NGo0MlRDQjZVNTU3OWVzYlN0M0xnJztcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGJ1aWxkZXIubm9kZUlEKG5vZGVJRCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYnVpbGRlclsnX25vZGVJRCddLCBub2RlSUQpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgYnVpbGRlcik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIGZvciBlbXB0eSBub2RlIElEJywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBidWlsZGVyLm5vZGVJRCgnJyksIEJ1aWxkVHJhbnNhY3Rpb25FcnJvcik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzdGFydFRpbWUnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBzZXQgc3RhcnQgdGltZSBmcm9tIG51bWJlcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHRpbWUgPSAxNjQwOTk1MjAwO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYnVpbGRlci5zdGFydFRpbWUodGltZSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYnVpbGRlclsnX3N0YXJ0VGltZSddLCBCaWdJbnQodGltZSkpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgYnVpbGRlcik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHNldCBzdGFydCB0aW1lIGZyb20gc3RyaW5nJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdGltZSA9ICcxNjQwOTk1MjAwJztcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGJ1aWxkZXIuc3RhcnRUaW1lKHRpbWUpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGJ1aWxkZXJbJ19zdGFydFRpbWUnXSwgQmlnSW50KHRpbWUpKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQsIGJ1aWxkZXIpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzZXQgc3RhcnQgdGltZSBmcm9tIGJpZ2ludCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHRpbWUgPSAxNjQwOTk1MjAwbjtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGJ1aWxkZXIuc3RhcnRUaW1lKHRpbWUpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGJ1aWxkZXJbJ19zdGFydFRpbWUnXSwgdGltZSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCBidWlsZGVyKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3IgZm9yIHplcm8gc3RhcnQgdGltZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gYnVpbGRlci5zdGFydFRpbWUoMCksIEJ1aWxkVHJhbnNhY3Rpb25FcnJvcik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIGZvciBuZWdhdGl2ZSBzdGFydCB0aW1lJywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBidWlsZGVyLnN0YXJ0VGltZSgtMSksIEJ1aWxkVHJhbnNhY3Rpb25FcnJvcik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIHdoZW4gc3RhcnQgdGltZSBpcyBhZnRlciBlbmQgdGltZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGJ1aWxkZXIuZW5kVGltZSgxNjQwOTk1MjAwKTsgLy8gU2V0IGVuZCB0aW1lIGZpcnN0XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IGJ1aWxkZXIuc3RhcnRUaW1lKDE2NzI1MzEyMDApLCBCdWlsZFRyYW5zYWN0aW9uRXJyb3IpOyAvLyBTdGFydCB0aW1lIGFmdGVyIGVuZCB0aW1lXG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFsbG93IHN0YXJ0IHRpbWUgYmVmb3JlIGVuZCB0aW1lJywgZnVuY3Rpb24gKCkge1xuICAgICAgYnVpbGRlci5lbmRUaW1lKDE2NzI1MzEyMDApOyAvLyBTZXQgZW5kIHRpbWUgZmlyc3RcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGJ1aWxkZXIuc3RhcnRUaW1lKDE2NDA5OTUyMDApOyAvLyBTdGFydCB0aW1lIGJlZm9yZSBlbmQgdGltZVxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgYnVpbGRlcik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdlbmRUaW1lJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgc2V0IGVuZCB0aW1lIGZyb20gbnVtYmVyJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdGltZSA9IDE2NzI1MzEyMDA7XG4gICAgICBjb25zdCByZXN1bHQgPSBidWlsZGVyLmVuZFRpbWUodGltZSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYnVpbGRlclsnX2VuZFRpbWUnXSwgQmlnSW50KHRpbWUpKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQsIGJ1aWxkZXIpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzZXQgZW5kIHRpbWUgZnJvbSBzdHJpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0aW1lID0gJzE2NzI1MzEyMDAnO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYnVpbGRlci5lbmRUaW1lKHRpbWUpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGJ1aWxkZXJbJ19lbmRUaW1lJ10sIEJpZ0ludCh0aW1lKSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCBidWlsZGVyKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc2V0IGVuZCB0aW1lIGZyb20gYmlnaW50JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdGltZSA9IDE2NzI1MzEyMDBuO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYnVpbGRlci5lbmRUaW1lKHRpbWUpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGJ1aWxkZXJbJ19lbmRUaW1lJ10sIHRpbWUpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgYnVpbGRlcik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIGZvciB6ZXJvIGVuZCB0aW1lJywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBidWlsZGVyLmVuZFRpbWUoMCksIEJ1aWxkVHJhbnNhY3Rpb25FcnJvcik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIGZvciBuZWdhdGl2ZSBlbmQgdGltZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gYnVpbGRlci5lbmRUaW1lKC0xKSwgQnVpbGRUcmFuc2FjdGlvbkVycm9yKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3Igd2hlbiBlbmQgdGltZSBpcyBiZWZvcmUgc3RhcnQgdGltZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGJ1aWxkZXIuc3RhcnRUaW1lKDE2NzI1MzEyMDApOyAvLyBTZXQgc3RhcnQgdGltZSBmaXJzdFxuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBidWlsZGVyLmVuZFRpbWUoMTY0MDk5NTIwMCksIEJ1aWxkVHJhbnNhY3Rpb25FcnJvcik7IC8vIEVuZCB0aW1lIGJlZm9yZSBzdGFydCB0aW1lXG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFsbG93IGVuZCB0aW1lIGFmdGVyIHN0YXJ0IHRpbWUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBidWlsZGVyLnN0YXJ0VGltZSgxNjQwOTk1MjAwKTsgLy8gU2V0IHN0YXJ0IHRpbWUgZmlyc3RcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGJ1aWxkZXIuZW5kVGltZSgxNjcyNTMxMjAwKTsgLy8gRW5kIHRpbWUgYWZ0ZXIgc3RhcnQgdGltZVxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgYnVpbGRlcik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzdGFrZUFtb3VudCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHNldCBzdGFrZSBhbW91bnQgZnJvbSBudW1iZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBhbW91bnQgPSA1MDAwMDAwMDAwMDAwMDAwMDAwMG47XG4gICAgICBjb25zdCByZXN1bHQgPSBidWlsZGVyLnN0YWtlQW1vdW50KGFtb3VudCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYnVpbGRlclsnX3N0YWtlQW1vdW50J10sIGFtb3VudCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCBidWlsZGVyKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc2V0IHN0YWtlIGFtb3VudCBmcm9tIHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGFtb3VudCA9ICc1MDAwMDAwMDAwMDAwMDAwMDAwMCc7XG4gICAgICBjb25zdCByZXN1bHQgPSBidWlsZGVyLnN0YWtlQW1vdW50KGFtb3VudCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYnVpbGRlclsnX3N0YWtlQW1vdW50J10sIEJpZ0ludChhbW91bnQpKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQsIGJ1aWxkZXIpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciBmb3IgemVybyBzdGFrZSBhbW91bnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IGJ1aWxkZXIuc3Rha2VBbW91bnQoMCksIEJ1aWxkVHJhbnNhY3Rpb25FcnJvcik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIGZvciBuZWdhdGl2ZSBzdGFrZSBhbW91bnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IGJ1aWxkZXIuc3Rha2VBbW91bnQoLTEpLCBCdWlsZFRyYW5zYWN0aW9uRXJyb3IpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncmV3YXJkQWRkcmVzc2VzJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgc2V0IHJld2FyZCBhZGRyZXNzZXMgY29ycmVjdGx5JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYWRkcmVzc2VzID0gWydQLWZsYXJlMXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcGs3a3BoJ107XG4gICAgICBjb25zdCByZXN1bHQgPSBidWlsZGVyLnJld2FyZEFkZHJlc3NlcyhhZGRyZXNzZXMpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgYnVpbGRlcik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIGZvciBlbXB0eSBhZGRyZXNzZXMgYXJyYXknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IGJ1aWxkZXIucmV3YXJkQWRkcmVzc2VzKFtdKSwgQnVpbGRUcmFuc2FjdGlvbkVycm9yKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3ZlcmlmeVR4VHlwZScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIGZvciB2YWxpZCBkZWxlZ2F0b3IgdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IHtcbiAgICAgICAgbm9kZUlEOiAnTm9kZUlELTdYaHcybUR4dURTNDRqNDJUQ0I2VTU1Nzllc2JTdDNMZycsXG4gICAgICAgIHN0YWtlQW1vdW50OiAnNTAwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICAgfTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChEZWxlZ2F0b3JUeEJ1aWxkZXIudmVyaWZ5VHhUeXBlKHR4KSwgdHJ1ZSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYnVpbGRlci52ZXJpZnlUeFR5cGUodHgpLCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIGZvciBpbnZhbGlkIHRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSB7IHN0YWtlQW1vdW50OiAnNTAwMDAwMDAwMDAwMDAwMDAwMDAnIH07XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoRGVsZWdhdG9yVHhCdWlsZGVyLnZlcmlmeVR4VHlwZSh0eCksIGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIGZvciBlbXB0eSB0cmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChEZWxlZ2F0b3JUeEJ1aWxkZXIudmVyaWZ5VHhUeXBlKHt9KSwgZmFsc2UpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnYnVpbGRGbGFyZVRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgYnVpbGRlclxuICAgICAgICAubm9kZUlEKCdOb2RlSUQtN1hodzJtRHh1RFM0NGo0MlRDQjZVNTU3OWVzYlN0M0xnJylcbiAgICAgICAgLnN0YXJ0VGltZSgxNjQwOTk1MjAwKVxuICAgICAgICAuZW5kVGltZSgxNjcyNTMxMjAwKVxuICAgICAgICAuc3Rha2VBbW91bnQoNTAwMDAwMDAwMDAwMDAwMDAwMDBuKVxuICAgICAgICAucmV3YXJkQWRkcmVzc2VzKFsnUC1mbGFyZTFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXBrN2twaCddKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3IgaWYgbm9kZUlEIGlzIG1pc3NpbmcnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBidWlsZGVyWydfbm9kZUlEJ10gPSAnJztcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKGJ1aWxkZXJbJ2J1aWxkRmxhcmVUcmFuc2FjdGlvbiddKCksIEJ1aWxkVHJhbnNhY3Rpb25FcnJvcik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIGlmIHN0YXJ0VGltZSBpcyBtaXNzaW5nJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYnVpbGRlclsnX3N0YXJ0VGltZSddID0gMG47XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhidWlsZGVyWydidWlsZEZsYXJlVHJhbnNhY3Rpb24nXSgpLCBCdWlsZFRyYW5zYWN0aW9uRXJyb3IpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciBpZiBlbmRUaW1lIGlzIG1pc3NpbmcnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBidWlsZGVyWydfZW5kVGltZSddID0gMG47XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhidWlsZGVyWydidWlsZEZsYXJlVHJhbnNhY3Rpb24nXSgpLCBCdWlsZFRyYW5zYWN0aW9uRXJyb3IpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciBpZiBzdGFrZUFtb3VudCBpcyBtaXNzaW5nJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYnVpbGRlclsnX3N0YWtlQW1vdW50J10gPSAwbjtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKGJ1aWxkZXJbJ2J1aWxkRmxhcmVUcmFuc2FjdGlvbiddKCksIEJ1aWxkVHJhbnNhY3Rpb25FcnJvcik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIGlmIGVuZCB0aW1lIGlzIGJlZm9yZSBzdGFydCB0aW1lJywgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gVGhpcyB0ZXN0IHZlcmlmaWVzIHRoYXQgdGltZSB2YWxpZGF0aW9uIGhhcHBlbnMgaW1tZWRpYXRlbHkgd2hlbiBzZXR0aW5nIHZhbHVlc1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIuc3RhcnRUaW1lKDE2NzI1MzEyMDApLmVuZFRpbWUoMTY0MDk5NTIwMCk7XG4gICAgICB9LCBCdWlsZFRyYW5zYWN0aW9uRXJyb3IpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnbWV0aG9kIGNoYWluaW5nJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgc3VwcG9ydCBtZXRob2QgY2hhaW5pbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBidWlsZGVyXG4gICAgICAgIC5ub2RlSUQoJ05vZGVJRC03WGh3Mm1EeHVEUzQ0ajQyVENCNlU1NTc5ZXNiU3QzTGcnKVxuICAgICAgICAuc3RhcnRUaW1lKDE2NDA5OTUyMDApXG4gICAgICAgIC5lbmRUaW1lKDE2NzI1MzEyMDApXG4gICAgICAgIC5zdGFrZUFtb3VudCg1MDAwMDAwMDAwMDAwMDAwMDAwMG4pXG4gICAgICAgIC5yZXdhcmRBZGRyZXNzZXMoWydQLWZsYXJlMXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcGs3a3BoJ10pO1xuXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCBidWlsZGVyKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=flrp.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"flrp.d.ts","sourceRoot":"","sources":["../../../test/unit/flrp.ts"],"names":[],"mappings":""}