@bitgo-beta/sdk-coin-vet 1.0.1-beta.57 → 1.0.1-beta.570

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 (151) hide show
  1. package/dist/src/index.d.ts +1 -0
  2. package/dist/src/index.d.ts.map +1 -1
  3. package/dist/src/index.js +2 -1
  4. package/dist/src/lib/constants.d.ts +26 -0
  5. package/dist/src/lib/constants.d.ts.map +1 -1
  6. package/dist/src/lib/constants.js +28 -2
  7. package/dist/src/lib/iface.d.ts +27 -2
  8. package/dist/src/lib/iface.d.ts.map +1 -1
  9. package/dist/src/lib/iface.js +1 -1
  10. package/dist/src/lib/index.d.ts +19 -0
  11. package/dist/src/lib/index.d.ts.map +1 -1
  12. package/dist/src/lib/index.js +40 -2
  13. package/dist/src/lib/transaction/addressInitializationTransaction.d.ts +31 -0
  14. package/dist/src/lib/transaction/addressInitializationTransaction.d.ts.map +1 -0
  15. package/dist/src/lib/transaction/addressInitializationTransaction.js +170 -0
  16. package/dist/src/lib/transaction/burnNftTransaction.d.ts +29 -0
  17. package/dist/src/lib/transaction/burnNftTransaction.d.ts.map +1 -0
  18. package/dist/src/lib/transaction/burnNftTransaction.js +138 -0
  19. package/dist/src/lib/transaction/claimRewards.d.ts +31 -0
  20. package/dist/src/lib/transaction/claimRewards.d.ts.map +1 -0
  21. package/dist/src/lib/transaction/claimRewards.js +151 -0
  22. package/dist/src/lib/transaction/delegateClauseTransaction.d.ts +27 -0
  23. package/dist/src/lib/transaction/delegateClauseTransaction.d.ts.map +1 -0
  24. package/dist/src/lib/transaction/delegateClauseTransaction.js +158 -0
  25. package/dist/src/lib/transaction/exitDelegation.d.ts +29 -0
  26. package/dist/src/lib/transaction/exitDelegation.d.ts.map +1 -0
  27. package/dist/src/lib/transaction/exitDelegation.js +143 -0
  28. package/dist/src/lib/transaction/flushTokenTransaction.d.ts +20 -0
  29. package/dist/src/lib/transaction/flushTokenTransaction.d.ts.map +1 -0
  30. package/dist/src/lib/transaction/flushTokenTransaction.js +98 -0
  31. package/dist/src/lib/transaction/nftTransaction.d.ts +17 -0
  32. package/dist/src/lib/transaction/nftTransaction.d.ts.map +1 -0
  33. package/dist/src/lib/transaction/nftTransaction.js +108 -0
  34. package/dist/src/lib/transaction/stakeClauseTransaction.d.ts +27 -0
  35. package/dist/src/lib/transaction/stakeClauseTransaction.d.ts.map +1 -0
  36. package/dist/src/lib/transaction/stakeClauseTransaction.js +158 -0
  37. package/dist/src/lib/transaction/stakingTransaction.d.ts +31 -0
  38. package/dist/src/lib/transaction/stakingTransaction.d.ts.map +1 -0
  39. package/dist/src/lib/transaction/stakingTransaction.js +169 -0
  40. package/dist/src/lib/transaction/tokenTransaction.d.ts +14 -0
  41. package/dist/src/lib/transaction/tokenTransaction.d.ts.map +1 -0
  42. package/dist/src/lib/transaction/tokenTransaction.js +95 -0
  43. package/dist/src/lib/transaction/transaction.d.ts +18 -28
  44. package/dist/src/lib/transaction/transaction.d.ts.map +1 -1
  45. package/dist/src/lib/transaction/transaction.js +98 -58
  46. package/dist/src/lib/transactionBuilder/addressInitializationBuilder.d.ts +78 -0
  47. package/dist/src/lib/transactionBuilder/addressInitializationBuilder.d.ts.map +1 -0
  48. package/dist/src/lib/transactionBuilder/addressInitializationBuilder.js +158 -0
  49. package/dist/src/lib/transactionBuilder/burnNftBuilder.d.ts +59 -0
  50. package/dist/src/lib/transactionBuilder/burnNftBuilder.d.ts.map +1 -0
  51. package/dist/src/lib/transactionBuilder/burnNftBuilder.js +118 -0
  52. package/dist/src/lib/transactionBuilder/claimRewardsBuilder.d.ts +59 -0
  53. package/dist/src/lib/transactionBuilder/claimRewardsBuilder.d.ts.map +1 -0
  54. package/dist/src/lib/transactionBuilder/claimRewardsBuilder.js +117 -0
  55. package/dist/src/lib/transactionBuilder/delegateTxnBuilder.d.ts +72 -0
  56. package/dist/src/lib/transactionBuilder/delegateTxnBuilder.d.ts.map +1 -0
  57. package/dist/src/lib/transactionBuilder/delegateTxnBuilder.js +133 -0
  58. package/dist/src/lib/transactionBuilder/exitDelegationBuilder.d.ts +59 -0
  59. package/dist/src/lib/transactionBuilder/exitDelegationBuilder.d.ts.map +1 -0
  60. package/dist/src/lib/transactionBuilder/exitDelegationBuilder.js +118 -0
  61. package/dist/src/lib/transactionBuilder/flushTokenTransactionBuilder.d.ts +66 -0
  62. package/dist/src/lib/transactionBuilder/flushTokenTransactionBuilder.d.ts.map +1 -0
  63. package/dist/src/lib/transactionBuilder/flushTokenTransactionBuilder.js +129 -0
  64. package/dist/src/lib/transactionBuilder/nftTransactionBuilder.d.ts +23 -0
  65. package/dist/src/lib/transactionBuilder/nftTransactionBuilder.d.ts.map +1 -0
  66. package/dist/src/lib/transactionBuilder/nftTransactionBuilder.js +93 -0
  67. package/dist/src/lib/transactionBuilder/stakeClauseTxnBuilder.d.ts +73 -0
  68. package/dist/src/lib/transactionBuilder/stakeClauseTxnBuilder.d.ts.map +1 -0
  69. package/dist/src/lib/transactionBuilder/stakeClauseTxnBuilder.js +146 -0
  70. package/dist/src/lib/transactionBuilder/stakingBuilder.d.ts +73 -0
  71. package/dist/src/lib/transactionBuilder/stakingBuilder.d.ts.map +1 -0
  72. package/dist/src/lib/transactionBuilder/stakingBuilder.js +147 -0
  73. package/dist/src/lib/transactionBuilder/tokenTransactionBuilder.d.ts +21 -0
  74. package/dist/src/lib/transactionBuilder/tokenTransactionBuilder.d.ts.map +1 -0
  75. package/dist/src/lib/transactionBuilder/tokenTransactionBuilder.js +70 -0
  76. package/dist/src/lib/transactionBuilder/transactionBuilder.d.ts +10 -9
  77. package/dist/src/lib/transactionBuilder/transactionBuilder.d.ts.map +1 -1
  78. package/dist/src/lib/transactionBuilder/transactionBuilder.js +25 -19
  79. package/dist/src/lib/transactionBuilderFactory.d.ts +52 -0
  80. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
  81. package/dist/src/lib/transactionBuilderFactory.js +115 -1
  82. package/dist/src/lib/types.d.ts +21 -0
  83. package/dist/src/lib/types.d.ts.map +1 -1
  84. package/dist/src/lib/types.js +1 -1
  85. package/dist/src/lib/utils.d.ts +98 -1
  86. package/dist/src/lib/utils.d.ts.map +1 -1
  87. package/dist/src/lib/utils.js +262 -8
  88. package/dist/src/register.d.ts.map +1 -1
  89. package/dist/src/register.js +5 -1
  90. package/dist/src/vet.d.ts +94 -3
  91. package/dist/src/vet.d.ts.map +1 -1
  92. package/dist/src/vet.js +505 -10
  93. package/dist/src/vetNFTCollection.d.ts +18 -0
  94. package/dist/src/vetNFTCollection.d.ts.map +1 -0
  95. package/dist/src/vetNFTCollection.js +52 -0
  96. package/dist/src/vetToken.d.ts +1 -1
  97. package/dist/src/vetToken.d.ts.map +1 -1
  98. package/dist/src/vetToken.js +2 -2
  99. package/dist/test/resources/vet.d.ts +73 -0
  100. package/dist/test/resources/vet.d.ts.map +1 -0
  101. package/dist/test/resources/vet.js +128 -0
  102. package/dist/test/transactionBuilder/addressInitializationBuilder.d.ts +2 -0
  103. package/dist/test/transactionBuilder/addressInitializationBuilder.d.ts.map +1 -0
  104. package/dist/test/transactionBuilder/addressInitializationBuilder.js +141 -0
  105. package/dist/test/transactionBuilder/burnNftBuilder.d.ts +2 -0
  106. package/dist/test/transactionBuilder/burnNftBuilder.d.ts.map +1 -0
  107. package/dist/test/transactionBuilder/burnNftBuilder.js +150 -0
  108. package/dist/test/transactionBuilder/claimRewardsBuilder.d.ts +2 -0
  109. package/dist/test/transactionBuilder/claimRewardsBuilder.d.ts.map +1 -0
  110. package/dist/test/transactionBuilder/claimRewardsBuilder.js +175 -0
  111. package/dist/test/transactionBuilder/delegateClauseTxnBuilder.d.ts +2 -0
  112. package/dist/test/transactionBuilder/delegateClauseTxnBuilder.d.ts.map +1 -0
  113. package/dist/test/transactionBuilder/delegateClauseTxnBuilder.js +184 -0
  114. package/dist/test/transactionBuilder/exitDelegationBuilder.d.ts +2 -0
  115. package/dist/test/transactionBuilder/exitDelegationBuilder.d.ts.map +1 -0
  116. package/dist/test/transactionBuilder/exitDelegationBuilder.js +150 -0
  117. package/dist/test/transactionBuilder/flushTokenTransactionBuilder.d.ts +2 -0
  118. package/dist/test/transactionBuilder/flushTokenTransactionBuilder.d.ts.map +1 -0
  119. package/dist/test/transactionBuilder/flushTokenTransactionBuilder.js +132 -0
  120. package/dist/test/transactionBuilder/nftTransactionBuilder.d.ts +2 -0
  121. package/dist/test/transactionBuilder/nftTransactionBuilder.d.ts.map +1 -0
  122. package/dist/test/transactionBuilder/nftTransactionBuilder.js +242 -0
  123. package/dist/test/transactionBuilder/stakeClauseTransactionBuilder.d.ts +2 -0
  124. package/dist/test/transactionBuilder/stakeClauseTransactionBuilder.d.ts.map +1 -0
  125. package/dist/test/transactionBuilder/stakeClauseTransactionBuilder.js +247 -0
  126. package/dist/test/transactionBuilder/stakingTransaction.d.ts +2 -0
  127. package/dist/test/transactionBuilder/stakingTransaction.d.ts.map +1 -0
  128. package/dist/test/transactionBuilder/stakingTransaction.js +250 -0
  129. package/dist/test/transactionBuilder/tokenTransactionBuilder.d.ts +2 -0
  130. package/dist/test/transactionBuilder/tokenTransactionBuilder.d.ts.map +1 -0
  131. package/dist/test/transactionBuilder/tokenTransactionBuilder.js +249 -0
  132. package/dist/test/transactionBuilder/transferBuilder.d.ts +2 -0
  133. package/dist/test/transactionBuilder/transferBuilder.d.ts.map +1 -0
  134. package/dist/test/transactionBuilder/transferBuilder.js +244 -0
  135. package/dist/test/unit/keyPair.d.ts +2 -0
  136. package/dist/test/unit/keyPair.d.ts.map +1 -0
  137. package/dist/test/unit/keyPair.js +181 -0
  138. package/dist/test/unit/stakingFlowE2E.d.ts +2 -0
  139. package/dist/test/unit/stakingFlowE2E.d.ts.map +1 -0
  140. package/dist/test/unit/stakingFlowE2E.js +222 -0
  141. package/dist/test/unit/utils.d.ts +2 -0
  142. package/dist/test/unit/utils.d.ts.map +1 -0
  143. package/dist/test/unit/utils.js +106 -0
  144. package/dist/test/unit/vet.d.ts +2 -0
  145. package/dist/test/unit/vet.d.ts.map +1 -0
  146. package/dist/test/unit/vet.js +336 -0
  147. package/dist/tsconfig.tsbuildinfo +1 -0
  148. package/package.json +16 -10
  149. package/.eslintignore +0 -5
  150. package/.mocharc.yml +0 -8
  151. package/CHANGELOG.md +0 -34
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=burnNftBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"burnNftBuilder.d.ts","sourceRoot":"","sources":["../../../test/transactionBuilder/burnNftBuilder.ts"],"names":[],"mappings":""}
@@ -0,0 +1,150 @@
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
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const should_1 = __importDefault(require("should"));
40
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
41
+ const statics_1 = require("@bitgo-beta/statics");
42
+ const src_1 = require("../../src");
43
+ const testData = __importStar(require("../resources/vet"));
44
+ const constants_1 = require("../../src/lib/constants");
45
+ describe('Vet Burn NFT Transaction', () => {
46
+ const factory = new src_1.TransactionBuilderFactory(statics_1.coins.get('tvet'));
47
+ const stakingContractAddress = constants_1.STARGATE_CONTRACT_ADDRESS_TESTNET;
48
+ describe('Build and Sign', () => {
49
+ it('should build a burn NFT transaction', async function () {
50
+ const tokenId = '123456';
51
+ const txBuilder = factory.getBurnNftBuilder();
52
+ txBuilder.sender(testData.addresses.validAddresses[0]);
53
+ txBuilder.tokenId(tokenId);
54
+ txBuilder.stakingContractAddress(stakingContractAddress);
55
+ txBuilder.gas(21000);
56
+ txBuilder.nonce('64248');
57
+ txBuilder.blockRef('0x014ead140e77bbc1');
58
+ txBuilder.expiration(64);
59
+ txBuilder.gasPriceCoef(128);
60
+ const tx = (await txBuilder.build());
61
+ should_1.default.equal(tx.sender, testData.addresses.validAddresses[0]);
62
+ should_1.default.equal(tx.tokenId, tokenId);
63
+ should_1.default.equal(tx.stakingContractAddress, constants_1.STARGATE_CONTRACT_ADDRESS_TESTNET);
64
+ should_1.default.equal(tx.gas, 21000);
65
+ should_1.default.equal(tx.nonce, '64248');
66
+ should_1.default.equal(tx.expiration, 64);
67
+ should_1.default.equal(tx.type, sdk_core_1.TransactionType.StakingWithdraw);
68
+ // Verify the transaction data contains the correct method ID and tokenId
69
+ tx.clauses[0].data.should.startWith(constants_1.BURN_NFT_METHOD_ID);
70
+ // Verify the transaction has the correct structure
71
+ tx.clauses.length.should.equal(1);
72
+ should_1.default.exist(tx.clauses[0]);
73
+ should_1.default.exist(tx.clauses[0].to);
74
+ tx.clauses[0]?.to?.should.equal(constants_1.STARGATE_CONTRACT_ADDRESS_TESTNET);
75
+ should_1.default.exist(tx.clauses[0].value);
76
+ tx.clauses[0].value.should.equal('0x0');
77
+ tx.inputs.length.should.equal(1);
78
+ tx.outputs.length.should.equal(1);
79
+ should_1.default.equal(tx.inputs[0].address, testData.addresses.validAddresses[0]);
80
+ should_1.default.equal(tx.inputs[0].value, '0');
81
+ should_1.default.equal(tx.inputs[0].coin, 'tvet');
82
+ should_1.default.equal(tx.outputs[0].address, constants_1.STARGATE_CONTRACT_ADDRESS_TESTNET);
83
+ should_1.default.equal(tx.outputs[0].value, '0');
84
+ should_1.default.equal(tx.outputs[0].coin, 'tvet');
85
+ });
86
+ it('should deserialize and reserialize a signed burn NFT transaction', async function () {
87
+ // Create a mock serialized transaction for burn NFT
88
+ const tokenId = '123456';
89
+ const txBuilder = factory.getBurnNftBuilder();
90
+ txBuilder.sender(testData.addresses.validAddresses[0]);
91
+ txBuilder.tokenId(tokenId);
92
+ txBuilder.stakingContractAddress(stakingContractAddress);
93
+ txBuilder.gas(21000);
94
+ txBuilder.nonce('64248');
95
+ txBuilder.blockRef('0x014ead140e77bbc1');
96
+ txBuilder.expiration(64);
97
+ txBuilder.gasPriceCoef(128);
98
+ const tx = (await txBuilder.build());
99
+ const serializedTx = tx.toBroadcastFormat();
100
+ // Now deserialize and check
101
+ const deserializedBuilder = factory.from(serializedTx);
102
+ const deserializedTx = (await deserializedBuilder.build());
103
+ should_1.default.equal(deserializedTx.type, sdk_core_1.TransactionType.StakingWithdraw);
104
+ should_1.default.equal(deserializedTx.tokenId, tokenId);
105
+ should_1.default.equal(deserializedTx.stakingContractAddress, constants_1.STARGATE_CONTRACT_ADDRESS_TESTNET);
106
+ });
107
+ it('should validate the transaction data structure', async function () {
108
+ const txBuilder = factory.getBurnNftBuilder();
109
+ // Should throw error when building without required fields
110
+ await (0, should_1.default)(txBuilder.build()).be.rejectedWith('Staking contract address is required');
111
+ txBuilder.sender(testData.addresses.validAddresses[0]);
112
+ txBuilder.stakingContractAddress(stakingContractAddress);
113
+ await (0, should_1.default)(txBuilder.build()).be.rejectedWith('Token ID is required');
114
+ // Now add the token ID and it should build successfully
115
+ txBuilder.tokenId('123456');
116
+ txBuilder.gas(21000);
117
+ txBuilder.nonce('64248');
118
+ txBuilder.blockRef('0x014ead140e77bbc1');
119
+ const tx = await txBuilder.build();
120
+ should_1.default.exist(tx);
121
+ });
122
+ it('should build from raw signed tx', async function () {
123
+ const txBuilder = factory.from(testData.BURN_NFT_TRANSACTION);
124
+ const tx = txBuilder.transaction;
125
+ const toJson = tx.toJson();
126
+ toJson.id.should.equal('0xf5e074f2d127fa3ef014873ec193b76823efab51891d43861092bd52b122563e');
127
+ toJson.stakingContractAddress?.should.equal('0x1e02b2953adefec225cf0ec49805b1146a4429c1');
128
+ toJson.nonce.should.equal('327224');
129
+ toJson.gas.should.equal(349324);
130
+ toJson.gasPriceCoef.should.equal(128);
131
+ toJson.expiration.should.equal(64);
132
+ toJson.chainTag.should.equal(39);
133
+ toJson.tokenId?.should.equal('15661');
134
+ });
135
+ });
136
+ describe('Validation', () => {
137
+ it('should fail with invalid contract address', function () {
138
+ const txBuilder = factory.getBurnNftBuilder();
139
+ (0, should_1.default)(() => txBuilder.stakingContractAddress('invalid-address')).throwError('Invalid address invalid-address');
140
+ });
141
+ it('should fail with invalid token ID', async function () {
142
+ const txBuilder = factory.getBurnNftBuilder();
143
+ txBuilder.sender(testData.addresses.validAddresses[0]);
144
+ txBuilder.stakingContractAddress(stakingContractAddress);
145
+ txBuilder.tokenId('');
146
+ await (0, should_1.default)(txBuilder.build()).be.rejectedWith('Token ID is required');
147
+ });
148
+ });
149
+ });
150
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVybk5mdEJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3RyYW5zYWN0aW9uQnVpbGRlci9idXJuTmZ0QnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUE0QjtBQUM1QixtREFBdUQ7QUFDdkQsaURBQTRDO0FBQzVDLG1DQUFzRDtBQUV0RCwyREFBNkM7QUFDN0MsdURBQWdHO0FBRWhHLFFBQVEsQ0FBQywwQkFBMEIsRUFBRSxHQUFHLEVBQUU7SUFDeEMsTUFBTSxPQUFPLEdBQUcsSUFBSSwrQkFBeUIsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDakUsTUFBTSxzQkFBc0IsR0FBRyw2Q0FBaUMsQ0FBQztJQUVqRSxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxFQUFFO1FBQzlCLEVBQUUsQ0FBQyxxQ0FBcUMsRUFBRSxLQUFLO1lBQzdDLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQztZQUN6QixNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUU5QyxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkQsU0FBUyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMzQixTQUFTLENBQUMsc0JBQXNCLENBQUMsc0JBQXNCLENBQUMsQ0FBQztZQUN6RCxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3JCLFNBQVMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDekIsU0FBUyxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1lBQ3pDLFNBQVMsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDekIsU0FBUyxD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RUFBRSxDQUFDLG1DQUFtQyxFQUFFLEtBQUs7WUFDM0MsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDOUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3ZELFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1lBQ3pELFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7WUFFdEIsTUFBTSxJQUFBLGdCQUFNLEVBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQzFFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IGNvaW5zIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5IH0gZnJvbSAnLi4vLi4vc3JjJztcbmltcG9ydCB7IEJ1cm5OZnRUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uL3NyYy9saWIvdHJhbnNhY3Rpb24vYnVybk5mdFRyYW5zYWN0aW9uJztcbmltcG9ydCAqIGFzIHRlc3REYXRhIGZyb20gJy4uL3Jlc291cmNlcy92ZXQnO1xuaW1wb3J0IHsgQlVSTl9ORlRfTUVUSE9EX0lELCBTVEFSR0FURV9DT05UUkFDVF9BRERSRVNTX1RFU1RORVQgfSBmcm9tICcuLi8uLi9zcmMvbGliL2NvbnN0YW50cyc7XG5cbmRlc2NyaWJlKCdWZXQgQnVybiBORlQgVHJhbnNhY3Rpb24nLCAoKSA9PiB7XG4gIGNvbnN0IGZhY3RvcnkgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3R2ZXQnKSk7XG4gIGNvbnN0IHN0YWtpbmdDb250cmFjdEFkZHJlc3MgPSBTVEFSR0FURV9DT05UUkFDVF9BRERSRVNTX1RFU1RORVQ7XG5cbiAgZGVzY3JpYmUoJ0J1aWxkIGFuZCBTaWduJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgYnVpbGQgYSBidXJuIE5GVCB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHRva2VuSWQgPSAnMTIzNDU2JztcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0QnVybk5mdEJ1aWxkZXIoKTtcblxuICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5hZGRyZXNzZXMudmFsaWRBZGRyZXNzZXNbMF0pO1xuICAgICAgdHhCdWlsZGVyLnRva2VuSWQodG9rZW5JZCk7XG4gICAgICB0eEJ1aWxkZXIuc3Rha2luZ0NvbnRyYWN0QWRkcmVzcyhzdGFraW5nQ29udHJhY3RBZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5nYXMoMjEwMDApO1xuICAgICAgdHhCdWlsZGVyLm5vbmNlKCc2NDI0OCcpO1xuICAgICAgdHhCdWlsZGVyLmJsb2NrUmVmKCcweDAxNGVhZDE0MGU3N2JiYzEnKTtcbiAgICAgIHR4QnVpbGRlci5leHBpcmF0aW9uKDY0KTtcbiAgICAgIHR4QnVpbGRlci5nYXNQcmljZUNvZWYoMTI4KTtcblxuICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIEJ1cm5OZnRUcmFuc2FjdGlvbjtcblxuICAgICAgc2hvdWxkLmVxdWFsKHR4LnNlbmRlciwgdGVzdERhdGEuYWRkcmVzc2VzLnZhbGlkQWRkcmVzc2VzWzBdKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC50b2tlbklkLCB0b2tlbklkKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5zdGFraW5nQ29udHJhY3RBZGRyZXNzLCBTVEFSR0FURV9DT05UUkFDVF9BRERSRVNTX1RFU1RORVQpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LmdhcywgMjEwMDApO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4Lm5vbmNlLCAnNjQyNDgnKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5leHBpcmF0aW9uLCA2NCk7XG4gICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdXaXRoZHJhdyk7XG5cbiAgICAgIC8vIFZlcmlmeSB0aGUgdHJhbnNhY3Rpb24gZGF0YSBjb250YWlucyB0aGUgY29ycmVjdCBtZXRob2QgSUQgYW5kIHRva2VuSWRcbiAgICAgIHR4LmNsYXVzZXNbMF0uZGF0YS5zaG91bGQuc3RhcnRXaXRoKEJVUk5fTkZUX01FVEhPRF9JRCk7XG5cbiAgICAgIC8vIFZlcmlmeSB0aGUgdHJhbnNhY3Rpb24gaGFzIHRoZSBjb3JyZWN0IHN0cnVjdHVyZVxuICAgICAgdHguY2xhdXNlcy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgc2hvdWxkLmV4aXN0KHR4LmNsYXVzZXNbMF0pO1xuICAgICAgc2hvdWxkLmV4aXN0KHR4LmNsYXVzZXNbMF0udG8pO1xuICAgICAgdHguY2xhdXNlc1swXT8udG8/LnNob3VsZC5lcXVhbChTVEFSR0FURV9DT05UUkFDVF9BRERSRVNTX1RFU1RORVQpO1xuICAgICAgc2hvdWxkLmV4aXN0KHR4LmNsYXVzZXNbMF0udmFsdWUpO1xuICAgICAgdHguY2xhdXNlc1swXS52YWx1ZS5zaG91bGQuZXF1YWwoJzB4MCcpO1xuXG4gICAgICB0eC5pbnB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4Lm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcblxuICAgICAgc2hvdWxkLmVxdWFsKHR4LmlucHV0c1swXS5hZGRyZXNzLCB0ZXN0RGF0YS5hZGRyZXNzZXMudmFsaWRBZGRyZXNzZXNbMF0pO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LmlucHV0c1swXS52YWx1ZSwgJzAnKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5pbnB1dHNbMF0uY29pbiwgJ3R2ZXQnKTtcblxuICAgICAgc2hvdWxkLmVxdWFsKHR4Lm91dHB1dHNbMF0uYWRkcmVzcywgU1RBUkdBVEVfQ09OVFJBQ1RfQUREUkVTU19URVNUTkVUKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5vdXRwdXRzWzBdLnZhbHVlLCAnMCcpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4Lm91dHB1dHNbMF0uY29pbiwgJ3R2ZXQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZGVzZXJpYWxpemUgYW5kIHJlc2VyaWFsaXplIGEgc2lnbmVkIGJ1cm4gTkZUIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gQ3JlYXRlIGEgbW9jayBzZXJpYWxpemVkIHRyYW5zYWN0aW9uIGZvciBidXJuIE5GVFxuICAgICAgY29uc3QgdG9rZW5JZCA9ICcxMjM0NTYnO1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRCdXJuTmZ0QnVpbGRlcigpO1xuXG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLmFkZHJlc3Nlcy52YWxpZEFkZHJlc3Nlc1swXSk7XG4gICAgICB0eEJ1aWxkZXIudG9rZW5JZCh0b2tlbklkKTtcbiAgICAgIHR4QnVpbGRlci5zdGFraW5nQ29udHJhY3RBZGRyZXNzKHN0YWtpbmdDb250cmFjdEFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLmdhcygyMTAwMCk7XG4gICAgICB0eEJ1aWxkZXIubm9uY2UoJzY0MjQ4Jyk7XG4gICAgICB0eEJ1aWxkZXIuYmxvY2tSZWYoJzB4MDE0ZWFkMTQwZTc3YmJjMScpO1xuICAgICAgdHhCdWlsZGVyLmV4cGlyYXRpb24oNjQpO1xuICAgICAgdHhCdWlsZGVyLmdhc1ByaWNlQ29lZigxMjgpO1xuXG4gICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgQnVybk5mdFRyYW5zYWN0aW9uO1xuICAgICAgY29uc3Qgc2VyaWFsaXplZFR4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgICAgLy8gTm93IGRlc2VyaWFsaXplIGFuZCBjaGVja1xuICAgICAgY29uc3QgZGVzZXJpYWxpemVkQnVpbGRlciA9IGZhY3RvcnkuZnJvbShzZXJpYWxpemVkVHgpO1xuICAgICAgY29uc3QgZGVzZXJpYWxpemVkVHggPSAoYXdhaXQgZGVzZXJpYWxpemVkQnVpbGRlci5idWlsZCgpKSBhcyBCdXJuTmZ0VHJhbnNhY3Rpb247XG5cbiAgICAgIHNob3VsZC5lcXVhbChkZXNlcmlhbGl6ZWRUeC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ1dpdGhkcmF3KTtcbiAgICAgIHNob3VsZC5lcXVhbChkZXNlcmlhbGl6ZWRUeC50b2tlbklkLCB0b2tlbklkKTtcbiAgICAgIHNob3VsZC5lcXVhbChkZXNlcmlhbGl6ZWRUeC5zdGFraW5nQ29udHJhY3RBZGRyZXNzLCBTVEFSR0FURV9DT05UUkFDVF9BRERSRVNTX1RFU1RORVQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSB0aGUgdHJhbnNhY3Rpb24gZGF0YSBzdHJ1Y3R1cmUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldEJ1cm5OZnRCdWlsZGVyKCk7XG5cbiAgICAgIC8vIFNob3VsZCB0aHJvdyBlcnJvciB3aGVuIGJ1aWxkaW5nIHdpdGhvdXQgcmVxdWlyZWQgZmllbGRzXG4gICAgICBhd2FpdCBzaG91bGQodHhCdWlsZGVyLmJ1aWxkKCkpLmJlLnJlamVjdGVkV2l0aCgnU3Rha2luZyBjb250cmFjdCBhZGRyZXNzIGlzIHJlcXVpcmVkJyk7XG5cbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuYWRkcmVzc2VzLnZhbGlkQWRkcmVzc2VzWzBdKTtcbiAgICAgIHR4QnVpbGRlci5zdGFraW5nQ29udHJhY3RBZGRyZXNzKHN0YWtpbmdDb250cmFjdEFkZHJlc3MpO1xuICAgICAgYXdhaXQgc2hvdWxkKHR4QnVpbGRlci5idWlsZCgpKS5iZS5yZWplY3RlZFdpdGgoJ1Rva2VuIElEIGlzIHJlcXVpcmVkJyk7XG5cbiAgICAgIC8vIE5vdyBhZGQgdGhlIHRva2VuIElEIGFuZCBpdCBzaG91bGQgYnVpbGQgc3VjY2Vzc2Z1bGx5XG4gICAgICB0eEJ1aWxkZXIudG9rZW5JZCgnMTIzNDU2Jyk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzKDIxMDAwKTtcbiAgICAgIHR4QnVpbGRlci5ub25jZSgnNjQyNDgnKTtcbiAgICAgIHR4QnVpbGRlci5ibG9ja1JlZignMHgwMTRlYWQxNDBlNzdiYmMxJyk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBzaG91bGQuZXhpc3QodHgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBmcm9tIHJhdyBzaWduZWQgdHgnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20odGVzdERhdGEuQlVSTl9ORlRfVFJBTlNBQ1RJT04pO1xuICAgICAgY29uc3QgdHggPSB0eEJ1aWxkZXIudHJhbnNhY3Rpb24gYXMgQnVybk5mdFRyYW5zYWN0aW9uO1xuICAgICAgY29uc3QgdG9Kc29uID0gdHgudG9Kc29uKCk7XG4gICAgICB0b0pzb24uaWQuc2hvdWxkLmVxdWFsKCcweGY1ZTA3NGYyZDEyN2ZhM2VmMDE0ODczZWMxOTNiNzY4MjNlZmFiNTE4OTFkNDM4NjEwOTJiZDUyYjEyMjU2M2UnKTtcbiAgICAgIHRvSnNvbi5zdGFraW5nQ29udHJhY3RBZGRyZXNzPy5zaG91bGQuZXF1YWwoJzB4MWUwMmIyOTUzYWRlZmVjMjI1Y2YwZWM0OTgwNWIxMTQ2YTQ0MjljMScpO1xuICAgICAgdG9Kc29uLm5vbmNlLnNob3VsZC5lcXVhbCgnMzI3MjI0Jyk7XG4gICAgICB0b0pzb24uZ2FzLnNob3VsZC5lcXVhbCgzNDkzMjQpO1xuICAgICAgdG9Kc29uLmdhc1ByaWNlQ29lZi5zaG91bGQuZXF1YWwoMTI4KTtcbiAgICAgIHRvSnNvbi5leHBpcmF0aW9uLnNob3VsZC5lcXVhbCg2NCk7XG4gICAgICB0b0pzb24uY2hhaW5UYWcuc2hvdWxkLmVxdWFsKDM5KTtcbiAgICAgIHRvSnNvbi50b2tlbklkPy5zaG91bGQuZXF1YWwoJzE1NjYxJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdWYWxpZGF0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgZmFpbCB3aXRoIGludmFsaWQgY29udHJhY3QgYWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0QnVybk5mdEJ1aWxkZXIoKTtcbiAgICAgIHNob3VsZCgoKSA9PiB0eEJ1aWxkZXIuc3Rha2luZ0NvbnRyYWN0QWRkcmVzcygnaW52YWxpZC1hZGRyZXNzJykpLnRocm93RXJyb3IoJ0ludmFsaWQgYWRkcmVzcyBpbnZhbGlkLWFkZHJlc3MnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB3aXRoIGludmFsaWQgdG9rZW4gSUQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldEJ1cm5OZnRCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLmFkZHJlc3Nlcy52YWxpZEFkZHJlc3Nlc1swXSk7XG4gICAgICB0eEJ1aWxkZXIuc3Rha2luZ0NvbnRyYWN0QWRkcmVzcyhzdGFraW5nQ29udHJhY3RBZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci50b2tlbklkKCcnKTtcblxuICAgICAgYXdhaXQgc2hvdWxkKHR4QnVpbGRlci5idWlsZCgpKS5iZS5yZWplY3RlZFdpdGgoJ1Rva2VuIElEIGlzIHJlcXVpcmVkJyk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=claimRewardsBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claimRewardsBuilder.d.ts","sourceRoot":"","sources":["../../../test/transactionBuilder/claimRewardsBuilder.ts"],"names":[],"mappings":""}
@@ -0,0 +1,175 @@
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
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const statics_1 = require("@bitgo-beta/statics");
40
+ const lib_1 = require("../../src/lib");
41
+ const should_1 = __importDefault(require("should"));
42
+ const constants_1 = require("../../src/lib/constants");
43
+ const testData = __importStar(require("../resources/vet"));
44
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
45
+ describe('VET Claim Rewards Transaction', function () {
46
+ const factory = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tvet'));
47
+ const tokenId = '12345';
48
+ const stakingContractAddress = constants_1.STARGATE_CONTRACT_ADDRESS_TESTNET;
49
+ // Helper function to create a basic transaction builder with common properties
50
+ const createBasicTxBuilder = () => {
51
+ const txBuilder = factory.getClaimRewardsBuilder();
52
+ txBuilder.sender('0x9378c12BD7502A11F770a5C1F223c959B2805dA9');
53
+ txBuilder.chainTag(0x27); // Testnet chain tag
54
+ txBuilder.blockRef('0x0000000000000000');
55
+ txBuilder.stakingContractAddress(stakingContractAddress);
56
+ txBuilder.expiration(64);
57
+ txBuilder.gas(100000);
58
+ txBuilder.gasPriceCoef(0);
59
+ txBuilder.nonce('12345');
60
+ return txBuilder;
61
+ };
62
+ it('should build a claim rewards transaction with both reward types', async function () {
63
+ const txBuilder = factory.getClaimRewardsBuilder();
64
+ txBuilder.stakingContractAddress(stakingContractAddress);
65
+ txBuilder.tokenId(tokenId);
66
+ txBuilder.sender('0x9378c12BD7502A11F770a5C1F223c959B2805dA9');
67
+ txBuilder.chainTag(0x27); // Testnet chain tag
68
+ txBuilder.blockRef('0x0000000000000000');
69
+ txBuilder.expiration(64);
70
+ txBuilder.gas(100000);
71
+ txBuilder.gasPriceCoef(0);
72
+ txBuilder.nonce('12345');
73
+ const tx = await txBuilder.build();
74
+ should_1.default.exist(tx);
75
+ tx.should.be.instanceof(lib_1.Transaction);
76
+ tx.should.be.instanceof(lib_1.ClaimRewardsTransaction);
77
+ const claimTx = tx;
78
+ claimTx.tokenId.should.equal(tokenId);
79
+ claimTx.stakingContractAddress.should.equal(stakingContractAddress);
80
+ // Verify clauses - should have ONLY 1 clause (delegation rewards)
81
+ claimTx.clauses.length.should.equal(1);
82
+ // staking rewards clause (claimRewards)
83
+ const stakingRewardsClause = claimTx.clauses[0];
84
+ should_1.default.exist(stakingRewardsClause);
85
+ stakingRewardsClause?.to?.should.equal(constants_1.STARGATE_CONTRACT_ADDRESS_TESTNET);
86
+ stakingRewardsClause?.value.should.equal('0x0');
87
+ // Verify recipients should be empty for claim rewards
88
+ claimTx.recipients.length.should.equal(0);
89
+ });
90
+ it('should build transaction with undefined sender but include it in inputs', async function () {
91
+ const txBuilder = factory.getClaimRewardsBuilder();
92
+ txBuilder.tokenId(tokenId);
93
+ txBuilder.stakingContractAddress(stakingContractAddress);
94
+ txBuilder.chainTag(0x27);
95
+ txBuilder.blockRef('0x0000000000000000');
96
+ txBuilder.expiration(64);
97
+ txBuilder.gas(100000);
98
+ txBuilder.gasPriceCoef(0);
99
+ txBuilder.nonce('12345');
100
+ // Not setting sender
101
+ const tx = await txBuilder.build();
102
+ tx.should.be.instanceof(lib_1.ClaimRewardsTransaction);
103
+ const claimTx = tx;
104
+ // Verify the transaction has inputs but with undefined address
105
+ claimTx.inputs.length.should.equal(1);
106
+ should_1.default.not.exist(claimTx.inputs[0].address);
107
+ // Verify the transaction has no outputs (claim rewards doesn't transfer value)
108
+ claimTx.outputs.length.should.equal(0);
109
+ });
110
+ it('should serialize and explain transaction correctly', async function () {
111
+ const txBuilder = createBasicTxBuilder();
112
+ txBuilder.tokenId(tokenId);
113
+ txBuilder.stakingContractAddress(stakingContractAddress);
114
+ const tx = await txBuilder.build();
115
+ const claimTx = tx;
116
+ // Test serialization
117
+ const serialized = claimTx.toBroadcastFormat();
118
+ serialized.should.be.String();
119
+ serialized.should.startWith('0x');
120
+ // Test explanation
121
+ const explanation = claimTx.explainTransaction();
122
+ explanation.type?.should.equal(sdk_core_1.TransactionType.StakingClaim);
123
+ should_1.default.exist(explanation.fee);
124
+ explanation.outputAmount.should.equal('0');
125
+ explanation.changeAmount.should.equal('0');
126
+ // Test toJson
127
+ const txJson = claimTx.toJson();
128
+ should_1.default.exist(txJson);
129
+ txJson.tokenId?.should.equal(tokenId);
130
+ txJson.stakingContractAddress?.should.equal(stakingContractAddress);
131
+ });
132
+ it('should use network default chainTag when not explicitly set', async function () {
133
+ const txBuilder = factory.getClaimRewardsBuilder();
134
+ txBuilder.tokenId(tokenId);
135
+ txBuilder.stakingContractAddress(stakingContractAddress);
136
+ // Not setting chainTag
137
+ txBuilder.blockRef('0x0000000000000000');
138
+ txBuilder.expiration(64);
139
+ txBuilder.gas(100000);
140
+ txBuilder.gasPriceCoef(0);
141
+ txBuilder.nonce('12345');
142
+ txBuilder.sender('0x9378c12BD7502A11F770a5C1F223c959B2805dA9');
143
+ const tx = await txBuilder.build();
144
+ tx.should.be.instanceof(lib_1.ClaimRewardsTransaction);
145
+ const claimTx = tx;
146
+ // Verify the chainTag is set to the testnet default (39)
147
+ claimTx.chainTag.should.equal(39);
148
+ });
149
+ it('should build a signed tx and validate its toJson', async function () {
150
+ const tokenIdForClaimTxn = '15662';
151
+ const txBuilder = factory.from(testData.CLAIM_REWARDS_TRANSACTION);
152
+ const tx = txBuilder.transaction;
153
+ const toJson = tx.toJson();
154
+ toJson.id.should.equal('0x841b388ee325838eb1e3efad661c2ae3266e950b8fc86b8bb484571bdfa27c6d');
155
+ toJson.stakingContractAddress?.should.equal('0x1e02b2953adefec225cf0ec49805b1146a4429c1');
156
+ toJson.nonce.should.equal('973150');
157
+ toJson.gas.should.equal(150878);
158
+ toJson.gasPriceCoef.should.equal(128);
159
+ toJson.expiration.should.equal(64);
160
+ toJson.chainTag.should.equal(39);
161
+ toJson.tokenId?.should.equal(tokenIdForClaimTxn);
162
+ });
163
+ describe('Failure scenarios', function () {
164
+ it('should throw error when token ID is missing', async function () {
165
+ const txBuilder = createBasicTxBuilder();
166
+ await txBuilder.build().should.be.rejectedWith('Token ID is required');
167
+ });
168
+ it('should throw error when staking contract address is missing', async function () {
169
+ const txBuilder = createBasicTxBuilder();
170
+ txBuilder.tokenId(tokenId);
171
+ await txBuilder.build().should.be.rejectedWith('Staking contract address is required');
172
+ });
173
+ });
174
+ });
175
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhaW1SZXdhcmRzQnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvdHJhbnNhY3Rpb25CdWlsZGVyL2NsYWltUmV3YXJkc0J1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxpREFBNEM7QUFDNUMsdUNBQWdHO0FBQ2hHLG9EQUE0QjtBQUM1Qix1REFBNEU7QUFDNUUsMkRBQTZDO0FBQzdDLG1EQUF1RDtBQUV2RCxRQUFRLENBQUMsK0JBQStCLEVBQUU7SUFDeEMsTUFBTSxPQUFPLEdBQUcsSUFBSSwrQkFBeUIsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDakUsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDO0lBQ3hCLE1BQU0sc0JBQXNCLEdBQUcsNkNBQWlDLENBQUM7SUFFakUsK0VBQStFO0lBQy9FLE1BQU0sb0JBQW9CLEdBQUcsR0FBRyxFQUFFO1FBQ2hDLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQ25ELFNBQVMsQ0FBQyxNQUFNLENBQUMsNENBQTRDLENBQUMsQ0FBQztRQUMvRCxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsb0JBQW9CO1FBQzlDLFNBQVMsQ0FBQyxRQUFRLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUN6QyxTQUFTLENBQUMsc0JBQXNCLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUN6RCxTQUFTLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3pCLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEIsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQixTQUFTLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3pCLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUMsQ0FBQztJQUVGLEVBQUUsQ0FBQyxpRUFBaUUsRUFBRSxLQUFLO1FBQ3pFLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQ25ELFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ3pELFNBQVMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDM0IsU0FBUyxDQUFDLE1BQU0sQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO1FBQy9ELFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxvQkFBb0I7UUFDOUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQ3pDLFNBQVMsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDekIsU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN0QixTQUFTLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFCLFNBQVMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFekIsTUFBTSxFQUFFLEdBQUcsTUFBTSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDbkMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDakIsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLGlCQUFXLENBQUMsQ0FBQztRQUNyQyxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsNkJBQXVCLENBQUMsQ0FBQztRQUVqRCxNQUFNLE9BQU8sR0FBRyxFQUE2QixDQUFDO1FBQzlDLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN0QyxPQUFPLENBQUMsc0JBQXNCLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBRXBFLGtFQUFrRTtRQUNsRSxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXZDLHdDQUF3QztRQUN4QyxNQUFNLG9CQUFvQixHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUNuQyxvQkFBb0IsRUFBRSxFQUFFLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyw2Q0FBaUMsQ0FBQyxDQUFDO1FBQzFFLG9CQUFvQixFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWhELHNEQUFzRDtRQUN0RCxPQUFPLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVDLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLHlFQUF5RSxFQUFFLEtBQUs7UUFDakYsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDbkQsU0FBUyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMzQixTQUFTLENBQUMsc0JBQXNCLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUN6RCxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pCLFNBQVMsQ0FBQyxRQUFRLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUN6QyxTQUFTLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3pCLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEIsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQixTQUFTLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3pCLHFCQUFxQjtRQUVyQixNQUFNLEVBQUUsR0FBRyxNQUFNLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNuQyxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsNkJBQXVCLENBQUMsQ0FBQztRQUVqRCxNQUFNLE9BQU8sR0FBRyxFQUE2QixDQUFDO1FBQzlDLCtEQUErRDtRQUMvRCxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLGdCQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRTVDLCtFQUErRTtRQUMvRSxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pDLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLG9EQUFvRCxFQUFFLEtBQUs7UUFDNUQsTUFBTSxTQUFTLEdBQUcsb0JBQW9CLEVBQUUsQ0FBQztRQUN6QyxTQUFTLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzNCLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBRXpELE1BQU0sRUFBRSxHQUFHLE1BQU0sU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ25DLE1BQU0sT0FBTyxHQUFHLEVBQTZCLENBQUM7UUFFOUMscUJBQXFCO1FBQ3JCLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQy9DLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzlCLFVBQVUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWxDLG1CQUFtQjtRQUNuQixNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUNqRCxXQUFXLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsMEJBQWUsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM3RCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDOUIsV0FBVyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzNDLFdBQVcsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUUzQyxjQUFjO1FBQ2QsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2hDLGdCQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3JCLE1BQU0sQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN0QyxNQUFNLENBQUMsc0JBQXNCLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0lBQ3RFLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDZEQUE2RCxFQUFFLEtBQUs7UUFDckUsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDbkQsU0FBUyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMzQixTQUFTLENBQUMsc0JBQXNCLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUN6RCx1QkFBdUI7UUFDdkIsU0FBUyxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQ3pDLFNBQVMsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDekIsU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN0QixTQUFTLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFCLFNBQVMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDekIsU0FBUyxDQUFDLE1BQU0sQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO1FBRS9ELE1BQU0sRUFBRSxHQUFHLE1BQU0sU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ25DLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyw2QkFBdUIsQ0FBQyxDQUFDO1FBRWpELE1BQU0sT0FBTyxHQUFHLEVBQTZCLENBQUM7UUFDOUMseURBQXlEO1FBQ3pELE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNwQyxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxrREFBa0QsRUFBRSxLQUFLO1FBQzFELE1BQU0sa0JBQWtCLEdBQUcsT0FBTyxDQUFDO1FBQ25DLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLHlCQUF5QixDQUFDLENBQUM7UUFDbkUsTUFBTSxFQUFFLEdBQUcsU0FBUyxDQUFDLFdBQXNDLENBQUM7UUFDNUQsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzNCLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxvRUFBb0UsQ0FBQyxDQUFDO1FBQzdGLE1BQU0sQ0FBQyxzQkFBc0IsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7UUFDMUYsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNoQyxNQUFNLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ25DLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNqQyxNQUFNLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUNuRCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxtQkFBbUIsRUFBRTtRQUM1QixFQUFFLENBQUMsNkNBQTZDLEVBQUUsS0FBSztZQUNyRCxNQUFNLFNBQVMsR0FBRyxvQkFBb0IsRUFBRSxDQUFDO1lBRXpDLE1BQU0sU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFDekUsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsNkRBQTZELEVBQUUsS0FBSztZQUNyRSxNQUFNLFNBQVMsR0FBRyxvQkFBb0IsRUFBRSxDQUFDO1lBQ3pDLFNBQVMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFM0IsTUFBTSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsc0NBQXNDLENBQUMsQ0FBQztRQUN6RixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb2lucyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSwgVHJhbnNhY3Rpb24sIENsYWltUmV3YXJkc1RyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vc3JjL2xpYic7XG5pbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5pbXBvcnQgeyBTVEFSR0FURV9DT05UUkFDVF9BRERSRVNTX1RFU1RORVQgfSBmcm9tICcuLi8uLi9zcmMvbGliL2NvbnN0YW50cyc7XG5pbXBvcnQgKiBhcyB0ZXN0RGF0YSBmcm9tICcuLi9yZXNvdXJjZXMvdmV0JztcbmltcG9ydCB7IFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcblxuZGVzY3JpYmUoJ1ZFVCBDbGFpbSBSZXdhcmRzIFRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICBjb25zdCBmYWN0b3J5ID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0dmV0JykpO1xuICBjb25zdCB0b2tlbklkID0gJzEyMzQ1JztcbiAgY29uc3Qgc3Rha2luZ0NvbnRyYWN0QWRkcmVzcyA9IFNUQVJHQVRFX0NPTlRSQUNUX0FERFJFU1NfVEVTVE5FVDtcblxuICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEgYmFzaWMgdHJhbnNhY3Rpb24gYnVpbGRlciB3aXRoIGNvbW1vbiBwcm9wZXJ0aWVzXG4gIGNvbnN0IGNyZWF0ZUJhc2ljVHhCdWlsZGVyID0gKCkgPT4ge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0Q2xhaW1SZXdhcmRzQnVpbGRlcigpO1xuICAgIHR4QnVpbGRlci5zZW5kZXIoJzB4OTM3OGMxMkJENzUwMkExMUY3NzBhNUMxRjIyM2M5NTlCMjgwNWRBOScpO1xuICAgIHR4QnVpbGRlci5jaGFpblRhZygweDI3KTsgLy8gVGVzdG5ldCBjaGFpbiB0YWdcbiAgICB0eEJ1aWxkZXIuYmxvY2tSZWYoJzB4MDAwMDAwMDAwMDAwMDAwMCcpO1xuICAgIHR4QnVpbGRlci5zdGFraW5nQ29udHJhY3RBZGRyZXNzKHN0YWtpbmdDb250cmFjdEFkZHJlc3MpO1xuICAgIHR4QnVpbGRlci5leHBpcmF0aW9uKDY0KTtcbiAgICB0eEJ1aWxkZXIuZ2FzKDEwMDAwMCk7XG4gICAgdHhCdWlsZGVyLmdhc1ByaWNlQ29lZigwKTtcbiAgICB0eEJ1aWxkZXIubm9uY2UoJzEyMzQ1Jyk7XG4gICAgcmV0dXJuIHR4QnVpbGRlcjtcbiAgfTtcblxuICBpdCgnc2hvdWxkIGJ1aWxkIGEgY2xhaW0gcmV3YXJkcyB0cmFuc2FjdGlvbiB3aXRoIGJvdGggcmV3YXJkIHR5cGVzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0Q2xhaW1SZXdhcmRzQnVpbGRlcigpO1xuICAgIHR4QnVpbGRlci5zdGFraW5nQ29udHJhY3RBZGRyZXNzKHN0YWtpbmdDb250cmFjdEFkZHJlc3MpO1xuICAgIHR4QnVpbGRlci50b2tlbklkKHRva2VuSWQpO1xuICAgIHR4QnVpbGRlci5zZW5kZXIoJzB4OTM3OGMxMkJENzUwMkExMUY3NzBhNUMxRjIyM2M5NTlCMjgwNWRBOScpO1xuICAgIHR4QnVpbGRlci5jaGFpblRhZygweDI3KTsgLy8gVGVzdG5ldCBjaGFpbiB0YWdcbiAgICB0eEJ1aWxkZXIuYmxvY2tSZWYoJzB4MDAwMDAwMDAwMDAwMDAwMCcpO1xuICAgIHR4QnVpbGRlci5leHBpcmF0aW9uKDY0KTtcbiAgICB0eEJ1aWxkZXIuZ2FzKDEwMDAwMCk7XG4gICAgdHhCdWlsZGVyLmdhc1ByaWNlQ29lZigwKTtcbiAgICB0eEJ1aWxkZXIubm9uY2UoJzEyMzQ1Jyk7XG5cbiAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgIHNob3VsZC5leGlzdCh0eCk7XG4gICAgdHguc2hvdWxkLmJlLmluc3RhbmNlb2YoVHJhbnNhY3Rpb24pO1xuICAgIHR4LnNob3VsZC5iZS5pbnN0YW5jZW9mKENsYWltUmV3YXJkc1RyYW5zYWN0aW9uKTtcblxuICAgIGNvbnN0IGNsYWltVHggPSB0eCBhcyBDbGFpbVJld2FyZHNUcmFuc2FjdGlvbjtcbiAgICBjbGFpbVR4LnRva2VuSWQuc2hvdWxkLmVxdWFsKHRva2VuSWQpO1xuICAgIGNsYWltVHguc3Rha2luZ0NvbnRyYWN0QWRkcmVzcy5zaG91bGQuZXF1YWwoc3Rha2luZ0NvbnRyYWN0QWRkcmVzcyk7XG5cbiAgICAvLyBWZXJpZnkgY2xhdXNlcyAtIHNob3VsZCBoYXZlIE9OTFkgMSBjbGF1c2UgKGRlbGVnYXRpb24gcmV3YXJkcylcbiAgICBjbGFpbVR4LmNsYXVzZXMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcblxuICAgIC8vIHN0YWtpbmcgcmV3YXJkcyBjbGF1c2UgKGNsYWltUmV3YXJkcylcbiAgICBjb25zdCBzdGFraW5nUmV3YXJkc0NsYXVzZSA9IGNsYWltVHguY2xhdXNlc1swXTtcbiAgICBzaG91bGQuZXhpc3Qoc3Rha2luZ1Jld2FyZHNDbGF1c2UpO1xuICAgIHN0YWtpbmdSZXdhcmRzQ2xhdXNlPy50bz8uc2hvdWxkLmVxdWFsKFNUQVJHQVRFX0NPTlRSQUNUX0FERFJFU1NfVEVTVE5FVCk7XG4gICAgc3Rha2luZ1Jld2FyZHNDbGF1c2U/LnZhbHVlLnNob3VsZC5lcXVhbCgnMHgwJyk7XG5cbiAgICAvLyBWZXJpZnkgcmVjaXBpZW50cyBzaG91bGQgYmUgZW1wdHkgZm9yIGNsYWltIHJld2FyZHNcbiAgICBjbGFpbVR4LnJlY2lwaWVudHMubGVuZ3RoLnNob3VsZC5lcXVhbCgwKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBidWlsZCB0cmFuc2FjdGlvbiB3aXRoIHVuZGVmaW5lZCBzZW5kZXIgYnV0IGluY2x1ZGUgaXQgaW4gaW5wdXRzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0Q2xhaW1SZXdhcmRzQnVpbGRlcigpO1xuICAgIHR4QnVpbGRlci50b2tlbklkKHRva2VuSWQpO1xuICAgIHR4QnVpbGRlci5zdGFraW5nQ29udHJhY3RBZGRyZXNzKHN0YWtpbmdDb250cmFjdEFkZHJlc3MpO1xuICAgIHR4QnVpbGRlci5jaGFpblRhZygweDI3KTtcbiAgICB0eEJ1aWxkZXIuYmxvY2tSZWYoJzB4MDAwMDAwMDAwMDAwMDAwMCcpO1xuICAgIHR4QnVpbGRlci5leHBpcmF0aW9uKDY0KTtcbiAgICB0eEJ1aWxkZXIuZ2FzKDEwMDAwMCk7XG4gICAgdHhCdWlsZGVyLmdhc1ByaWNlQ29lZigwKTtcbiAgICB0eEJ1aWxkZXIubm9uY2UoJzEyMzQ1Jyk7XG4gICAgLy8gTm90IHNldHRpbmcgc2VuZGVyXG5cbiAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgIHR4LnNob3VsZC5iZS5pbnN0YW5jZW9mKENsYWltUmV3YXJkc1RyYW5zYWN0aW9uKTtcblxuICAgIGNvbnN0IGNsYWltVHggPSB0eCBhcyBDbGFpbVJld2FyZHNUcmFuc2FjdGlvbjtcbiAgICAvLyBWZXJpZnkgdGhlIHRyYW5zYWN0aW9uIGhhcyBpbnB1dHMgYnV0IHdpdGggdW5kZWZpbmVkIGFkZHJlc3NcbiAgICBjbGFpbVR4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgIHNob3VsZC5ub3QuZXhpc3QoY2xhaW1UeC5pbnB1dHNbMF0uYWRkcmVzcyk7XG5cbiAgICAvLyBWZXJpZnkgdGhlIHRyYW5zYWN0aW9uIGhhcyBubyBvdXRwdXRzIChjbGFpbSByZXdhcmRzIGRvZXNuJ3QgdHJhbnNmZXIgdmFsdWUpXG4gICAgY2xhaW1UeC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgc2VyaWFsaXplIGFuZCBleHBsYWluIHRyYW5zYWN0aW9uIGNvcnJlY3RseScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBjcmVhdGVCYXNpY1R4QnVpbGRlcigpO1xuICAgIHR4QnVpbGRlci50b2tlbklkKHRva2VuSWQpO1xuICAgIHR4QnVpbGRlci5zdGFraW5nQ29udHJhY3RBZGRyZXNzKHN0YWtpbmdDb250cmFjdEFkZHJlc3MpO1xuXG4gICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICBjb25zdCBjbGFpbVR4ID0gdHggYXMgQ2xhaW1SZXdhcmRzVHJhbnNhY3Rpb247XG5cbiAgICAvLyBUZXN0IHNlcmlhbGl6YXRpb25cbiAgICBjb25zdCBzZXJpYWxpemVkID0gY2xhaW1UeC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgIHNlcmlhbGl6ZWQuc2hvdWxkLmJlLlN0cmluZygpO1xuICAgIHNlcmlhbGl6ZWQuc2hvdWxkLnN0YXJ0V2l0aCgnMHgnKTtcblxuICAgIC8vIFRlc3QgZXhwbGFuYXRpb25cbiAgICBjb25zdCBleHBsYW5hdGlvbiA9IGNsYWltVHguZXhwbGFpblRyYW5zYWN0aW9uKCk7XG4gICAgZXhwbGFuYXRpb24udHlwZT8uc2hvdWxkLmVxdWFsKFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQ2xhaW0pO1xuICAgIHNob3VsZC5leGlzdChleHBsYW5hdGlvbi5mZWUpO1xuICAgIGV4cGxhbmF0aW9uLm91dHB1dEFtb3VudC5zaG91bGQuZXF1YWwoJzAnKTtcbiAgICBleHBsYW5hdGlvbi5jaGFuZ2VBbW91bnQuc2hvdWxkLmVxdWFsKCcwJyk7XG5cbiAgICAvLyBUZXN0IHRvSnNvblxuICAgIGNvbnN0IHR4SnNvbiA9IGNsYWltVHgudG9Kc29uKCk7XG4gICAgc2hvdWxkLmV4aXN0KHR4SnNvbik7XG4gICAgdHhKc29uLnRva2VuSWQ/LnNob3VsZC5lcXVhbCh0b2tlbklkKTtcbiAgICB0eEpzb24uc3Rha2luZ0NvbnRyYWN0QWRkcmVzcz8uc2hvdWxkLmVxdWFsKHN0YWtpbmdDb250cmFjdEFkZHJlc3MpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHVzZSBuZXR3b3JrIGRlZmF1bHQgY2hhaW5UYWcgd2hlbiBub3QgZXhwbGljaXRseSBzZXQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRDbGFpbVJld2FyZHNCdWlsZGVyKCk7XG4gICAgdHhCdWlsZGVyLnRva2VuSWQodG9rZW5JZCk7XG4gICAgdHhCdWlsZGVyLnN0YWtpbmdDb250cmFjdEFkZHJlc3Moc3Rha2luZ0NvbnRyYWN0QWRkcmVzcyk7XG4gICAgLy8gTm90IHNldHRpbmcgY2hhaW5UYWdcbiAgICB0eEJ1aWxkZXIuYmxvY2tSZWYoJzB4MDAwMDAwMDAwMDAwMDAwMCcpO1xuICAgIHR4QnVpbGRlci5leHBpcmF0aW9uKDY0KTtcbiAgICB0eEJ1aWxkZXIuZ2FzKDEwMDAwMCk7XG4gICAgdHhCdWlsZGVyLmdhc1ByaWNlQ29lZigwKTtcbiAgICB0eEJ1aWxkZXIubm9uY2UoJzEyMzQ1Jyk7XG4gICAgdHhCdWlsZGVyLnNlbmRlcignMHg5Mzc4YzEyQkQ3NTAyQTExRjc3MGE1QzFGMjIzYzk1OUIyODA1ZEE5Jyk7XG5cbiAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgIHR4LnNob3VsZC5iZS5pbnN0YW5jZW9mKENsYWltUmV3YXJkc1RyYW5zYWN0aW9uKTtcblxuICAgIGNvbnN0IGNsYWltVHggPSB0eCBhcyBDbGFpbVJld2FyZHNUcmFuc2FjdGlvbjtcbiAgICAvLyBWZXJpZnkgdGhlIGNoYWluVGFnIGlzIHNldCB0byB0aGUgdGVzdG5ldCBkZWZhdWx0ICgzOSlcbiAgICBjbGFpbVR4LmNoYWluVGFnLnNob3VsZC5lcXVhbCgzOSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgYnVpbGQgYSBzaWduZWQgdHggYW5kIHZhbGlkYXRlIGl0cyB0b0pzb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdG9rZW5JZEZvckNsYWltVHhuID0gJzE1NjYyJztcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20odGVzdERhdGEuQ0xBSU1fUkVXQVJEU19UUkFOU0FDVElPTik7XG4gICAgY29uc3QgdHggPSB0eEJ1aWxkZXIudHJhbnNhY3Rpb24gYXMgQ2xhaW1SZXdhcmRzVHJhbnNhY3Rpb247XG4gICAgY29uc3QgdG9Kc29uID0gdHgudG9Kc29uKCk7XG4gICAgdG9Kc29uLmlkLnNob3VsZC5lcXVhbCgnMHg4NDFiMzg4ZWUzMjU4MzhlYjFlM2VmYWQ2NjFjMmFlMzI2NmU5NTBiOGZjODZiOGJiNDg0NTcxYmRmYTI3YzZkJyk7XG4gICAgdG9Kc29uLnN0YWtpbmdDb250cmFjdEFkZHJlc3M/LnNob3VsZC5lcXVhbCgnMHgxZTAyYjI5NTNhZGVmZWMyMjVjZjBlYzQ5ODA1YjExNDZhNDQyOWMxJyk7XG4gICAgdG9Kc29uLm5vbmNlLnNob3VsZC5lcXVhbCgnOTczMTUwJyk7XG4gICAgdG9Kc29uLmdhcy5zaG91bGQuZXF1YWwoMTUwODc4KTtcbiAgICB0b0pzb24uZ2FzUHJpY2VDb2VmLnNob3VsZC5lcXVhbCgxMjgpO1xuICAgIHRvSnNvbi5leHBpcmF0aW9uLnNob3VsZC5lcXVhbCg2NCk7XG4gICAgdG9Kc29uLmNoYWluVGFnLnNob3VsZC5lcXVhbCgzOSk7XG4gICAgdG9Kc29uLnRva2VuSWQ/LnNob3VsZC5lcXVhbCh0b2tlbklkRm9yQ2xhaW1UeG4pO1xuICB9KTtcblxuICBkZXNjcmliZSgnRmFpbHVyZSBzY2VuYXJpb3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciB3aGVuIHRva2VuIElEIGlzIG1pc3NpbmcnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBjcmVhdGVCYXNpY1R4QnVpbGRlcigpO1xuXG4gICAgICBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdUb2tlbiBJRCBpcyByZXF1aXJlZCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciB3aGVuIHN0YWtpbmcgY29udHJhY3QgYWRkcmVzcyBpcyBtaXNzaW5nJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gY3JlYXRlQmFzaWNUeEJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci50b2tlbklkKHRva2VuSWQpO1xuXG4gICAgICBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdTdGFraW5nIGNvbnRyYWN0IGFkZHJlc3MgaXMgcmVxdWlyZWQnKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=delegateClauseTxnBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delegateClauseTxnBuilder.d.ts","sourceRoot":"","sources":["../../../test/transactionBuilder/delegateClauseTxnBuilder.ts"],"names":[],"mappings":""}
@@ -0,0 +1,184 @@
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
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const statics_1 = require("@bitgo-beta/statics");
40
+ const lib_1 = require("../../src/lib");
41
+ const should_1 = __importDefault(require("should"));
42
+ const constants_1 = require("../../src/lib/constants");
43
+ const ethereumjs_abi_1 = __importDefault(require("ethereumjs-abi"));
44
+ const testData = __importStar(require("../resources/vet"));
45
+ const ethereumjs_util_1 = require("ethereumjs-util");
46
+ describe('VET Delegation Transaction', function () {
47
+ const factory = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tvet'));
48
+ const tokenId = '100201'; // Test token ID
49
+ const validatorAddress = '0x9a7aFCACc88c106f3bbD6B213CD0821D9224d945';
50
+ // Helper function to create a basic transaction builder with common properties
51
+ const createBasicTxBuilder = () => {
52
+ const txBuilder = factory.getStakingDelegateBuilder();
53
+ txBuilder.sender('0x9378c12BD7502A11F770a5C1F223c959B2805dA9');
54
+ txBuilder.chainTag(0x27); // Testnet chain tag
55
+ txBuilder.blockRef('0x0000000000000000');
56
+ txBuilder.expiration(64);
57
+ txBuilder.gas(100000);
58
+ txBuilder.gasPriceCoef(0);
59
+ txBuilder.nonce('12345');
60
+ return txBuilder;
61
+ };
62
+ it('should build a delegate transaction', async function () {
63
+ const txBuilder = factory.getStakingDelegateBuilder();
64
+ txBuilder.stakingContractAddress(constants_1.STARGATE_CONTRACT_ADDRESS_TESTNET);
65
+ txBuilder.tokenId(tokenId);
66
+ txBuilder.sender('0x9378c12BD7502A11F770a5C1F223c959B2805dA9');
67
+ txBuilder.chainTag(0x27); // Testnet chain tag
68
+ txBuilder.blockRef('0x0000000000000000');
69
+ txBuilder.expiration(64);
70
+ txBuilder.gas(100000);
71
+ txBuilder.gasPriceCoef(0);
72
+ txBuilder.nonce('12345');
73
+ txBuilder.validator(validatorAddress);
74
+ const tx = await txBuilder.build();
75
+ should_1.default.exist(tx);
76
+ tx.should.be.instanceof(lib_1.Transaction);
77
+ tx.should.be.instanceof(lib_1.DelegateClauseTransaction);
78
+ const delegationTx = tx;
79
+ delegationTx.stakingContractAddress.should.equal(constants_1.STARGATE_CONTRACT_ADDRESS_TESTNET);
80
+ delegationTx.tokenId.should.equal(tokenId);
81
+ delegationTx.validator.should.equal(validatorAddress);
82
+ // Verify clauses
83
+ delegationTx.clauses.length.should.equal(1);
84
+ should_1.default.exist(delegationTx.clauses[0].to);
85
+ delegationTx.clauses[0].to?.should.equal(constants_1.STARGATE_CONTRACT_ADDRESS_TESTNET);
86
+ // Verify transaction data is correctly encoded using ethereumABI
87
+ should_1.default.exist(delegationTx.clauses[0].data);
88
+ const txData = delegationTx.clauses[0].data;
89
+ txData.should.startWith(constants_1.DELEGATE_CLAUSE_METHOD_ID);
90
+ // Verify the encoded data matches what we expect from ethereumABI
91
+ const methodName = 'delegate';
92
+ const types = ['uint256', 'address'];
93
+ const params = [new ethereumjs_util_1.BN(tokenId), validatorAddress];
94
+ const method = ethereumjs_abi_1.default.methodID(methodName, types);
95
+ const args = ethereumjs_abi_1.default.rawEncode(types, params);
96
+ const expectedData = '0x' + Buffer.concat([method, args]).toString('hex');
97
+ txData.should.equal(expectedData);
98
+ // Verify recipients
99
+ delegationTx.recipients.length.should.equal(1);
100
+ delegationTx.recipients[0].address.should.equal(constants_1.STARGATE_CONTRACT_ADDRESS_TESTNET);
101
+ });
102
+ describe('Failure scenarios', function () {
103
+ it('should throw error when stakingContractAddress is missing', async function () {
104
+ const txBuilder = createBasicTxBuilder();
105
+ txBuilder.tokenId(tokenId);
106
+ txBuilder.validator(validatorAddress);
107
+ await txBuilder.build().should.be.rejectedWith('Staking contract address is required');
108
+ });
109
+ it('should throw error when tokenId is missing', async function () {
110
+ const txBuilder = createBasicTxBuilder();
111
+ txBuilder.stakingContractAddress(constants_1.STARGATE_CONTRACT_ADDRESS_TESTNET);
112
+ await txBuilder.build().should.be.rejectedWith('Token ID is required');
113
+ });
114
+ it('should throw error when validator address is missing', async function () {
115
+ const txBuilder = createBasicTxBuilder();
116
+ txBuilder.stakingContractAddress(constants_1.STARGATE_CONTRACT_ADDRESS_TESTNET);
117
+ txBuilder.tokenId(tokenId);
118
+ await txBuilder.build().should.be.rejectedWith('Validator address is required');
119
+ });
120
+ it('should throw error when stakingContractAddress is invalid', async function () {
121
+ const txBuilder = createBasicTxBuilder();
122
+ // Invalid address (wrong format)
123
+ (0, should_1.default)(() => {
124
+ txBuilder.stakingContractAddress('invalid-address');
125
+ }).throw(/Invalid address/);
126
+ });
127
+ it('should build transaction with undefined sender but include it in inputs', async function () {
128
+ const txBuilder = factory.getStakingDelegateBuilder();
129
+ txBuilder.stakingContractAddress(constants_1.STARGATE_CONTRACT_ADDRESS_TESTNET);
130
+ txBuilder.tokenId(tokenId);
131
+ txBuilder.chainTag(0x27);
132
+ txBuilder.blockRef('0x0000000000000000');
133
+ txBuilder.expiration(64);
134
+ txBuilder.gas(100000);
135
+ txBuilder.gasPriceCoef(0);
136
+ txBuilder.nonce('12345');
137
+ txBuilder.validator(validatorAddress);
138
+ // Not setting sender
139
+ const tx = await txBuilder.build();
140
+ tx.should.be.instanceof(lib_1.DelegateClauseTransaction);
141
+ const delegationTx = tx;
142
+ // Verify the transaction has inputs but with undefined address
143
+ delegationTx.inputs.length.should.equal(1);
144
+ should_1.default.not.exist(delegationTx.inputs[0].address);
145
+ // Verify the transaction has the correct output
146
+ delegationTx.outputs.length.should.equal(1);
147
+ delegationTx.outputs[0].address.should.equal(constants_1.STARGATE_CONTRACT_ADDRESS_TESTNET);
148
+ });
149
+ it('should use network default chainTag when not explicitly set', async function () {
150
+ const txBuilder = factory.getStakingDelegateBuilder();
151
+ txBuilder.stakingContractAddress(constants_1.STARGATE_CONTRACT_ADDRESS_TESTNET);
152
+ txBuilder.tokenId(tokenId);
153
+ // Not setting chainTag
154
+ txBuilder.blockRef('0x0000000000000000');
155
+ txBuilder.expiration(64);
156
+ txBuilder.gas(100000);
157
+ txBuilder.gasPriceCoef(0);
158
+ txBuilder.nonce('12345');
159
+ txBuilder.sender('0x9378c12BD7502A11F770a5C1F223c959B2805dA9');
160
+ txBuilder.validator(validatorAddress);
161
+ const tx = await txBuilder.build();
162
+ tx.should.be.instanceof(lib_1.DelegateClauseTransaction);
163
+ const delegationTx = tx;
164
+ // Verify the chainTag is set to the testnet default (39)
165
+ delegationTx.chainTag.should.equal(39);
166
+ });
167
+ it('should build a signed tx and validate its toJson', async function () {
168
+ const tokenIdForDelegateTxn = '15662';
169
+ const txBuilder = factory.from(testData.DELEGATION_TRANSACTION);
170
+ const tx = txBuilder.transaction;
171
+ const toJson = tx.toJson();
172
+ toJson.id.should.equal('0xc47792a421d90cb52a4aedbd9abe96f779a8ad68e508680ac3cc135428c3f4c5');
173
+ toJson.stakingContractAddress?.should.equal('0x1e02b2953adefec225cf0ec49805b1146a4429c1');
174
+ toJson.nonce.should.equal('887557');
175
+ toJson.gas.should.equal(287920);
176
+ toJson.gasPriceCoef.should.equal(128);
177
+ toJson.expiration.should.equal(64);
178
+ toJson.chainTag.should.equal(39);
179
+ toJson.tokenId?.should.equal(tokenIdForDelegateTxn);
180
+ toJson.validatorAddress?.should.equal('00563ec3cafbbe7e60b04b3190e6eca66579706d');
181
+ });
182
+ });
183
+ });
184
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVsZWdhdGVDbGF1c2VUeG5CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC90cmFuc2FjdGlvbkJ1aWxkZXIvZGVsZWdhdGVDbGF1c2VUeG5CdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsaURBQTRDO0FBQzVDLHVDQUFrRztBQUNsRyxvREFBNEI7QUFDNUIsdURBQXVHO0FBQ3ZHLG9FQUF5QztBQUN6QywyREFBNkM7QUFDN0MscURBQXFDO0FBRXJDLFFBQVEsQ0FBQyw0QkFBNEIsRUFBRTtJQUNyQyxNQUFNLE9BQU8sR0FBRyxJQUFJLCtCQUF5QixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUNqRSxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsQ0FBQyxnQkFBZ0I7SUFDMUMsTUFBTSxnQkFBZ0IsR0FBRyw0Q0FBNEMsQ0FBQztJQUV0RSwrRUFBK0U7SUFDL0UsTUFBTSxvQkFBb0IsR0FBRyxHQUFHLEVBQUU7UUFDaEMsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLHlCQUF5QixFQUFFLENBQUM7UUFDdEQsU0FBUyxDQUFDLE1BQU0sQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO1FBQy9ELFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxvQkFBb0I7UUFDOUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQ3pDLFNBQVMsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDekIsU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN0QixTQUFTLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFCLFNBQVMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDekIsT0FBTyxTQUFTLENBQUM7SUFDbkIs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QUMsRUFBRSxDQUFDLENBQUM7WUFDakMsTUFBTSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7WUFDcEQsTUFBTSxDQUFDLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQztRQUNwRixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb2lucyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSwgVHJhbnNhY3Rpb24sIERlbGVnYXRlQ2xhdXNlVHJhbnNhY3Rpb24gfSBmcm9tICcuLi8uLi9zcmMvbGliJztcbmltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IERFTEVHQVRFX0NMQVVTRV9NRVRIT0RfSUQsIFNUQVJHQVRFX0NPTlRSQUNUX0FERFJFU1NfVEVTVE5FVCB9IGZyb20gJy4uLy4uL3NyYy9saWIvY29uc3RhbnRzJztcbmltcG9ydCBFdGhlcmV1bUFiaSBmcm9tICdldGhlcmV1bWpzLWFiaSc7XG5pbXBvcnQgKiBhcyB0ZXN0RGF0YSBmcm9tICcuLi9yZXNvdXJjZXMvdmV0JztcbmltcG9ydCB7IEJOIH0gZnJvbSAnZXRoZXJldW1qcy11dGlsJztcblxuZGVzY3JpYmUoJ1ZFVCBEZWxlZ2F0aW9uIFRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICBjb25zdCBmYWN0b3J5ID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0dmV0JykpO1xuICBjb25zdCB0b2tlbklkID0gJzEwMDIwMSc7IC8vIFRlc3QgdG9rZW4gSURcbiAgY29uc3QgdmFsaWRhdG9yQWRkcmVzcyA9ICcweDlhN2FGQ0FDYzg4YzEwNmYzYmJENkIyMTNDRDA4MjFEOTIyNGQ5NDUnO1xuXG4gIC8vIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYSBiYXNpYyB0cmFuc2FjdGlvbiBidWlsZGVyIHdpdGggY29tbW9uIHByb3BlcnRpZXNcbiAgY29uc3QgY3JlYXRlQmFzaWNUeEJ1aWxkZXIgPSAoKSA9PiB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRTdGFraW5nRGVsZWdhdGVCdWlsZGVyKCk7XG4gICAgdHhCdWlsZGVyLnNlbmRlcignMHg5Mzc4YzEyQkQ3NTAyQTExRjc3MGE1QzFGMjIzYzk1OUIyODA1ZEE5Jyk7XG4gICAgdHhCdWlsZGVyLmNoYWluVGFnKDB4MjcpOyAvLyBUZXN0bmV0IGNoYWluIHRhZ1xuICAgIHR4QnVpbGRlci5ibG9ja1JlZignMHgwMDAwMDAwMDAwMDAwMDAwJyk7XG4gICAgdHhCdWlsZGVyLmV4cGlyYXRpb24oNjQpO1xuICAgIHR4QnVpbGRlci5nYXMoMTAwMDAwKTtcbiAgICB0eEJ1aWxkZXIuZ2FzUHJpY2VDb2VmKDApO1xuICAgIHR4QnVpbGRlci5ub25jZSgnMTIzNDUnKTtcbiAgICByZXR1cm4gdHhCdWlsZGVyO1xuICB9O1xuXG4gIGl0KCdzaG91bGQgYnVpbGQgYSBkZWxlZ2F0ZSB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFN0YWtpbmdEZWxlZ2F0ZUJ1aWxkZXIoKTtcbiAgICB0eEJ1aWxkZXIuc3Rha2luZ0NvbnRyYWN0QWRkcmVzcyhTVEFSR0FURV9DT05UUkFDVF9BRERSRVNTX1RFU1RORVQpO1xuICAgIHR4QnVpbGRlci50b2tlbklkKHRva2VuSWQpO1xuICAgIHR4QnVpbGRlci5zZW5kZXIoJzB4OTM3OGMxMkJENzUwMkExMUY3NzBhNUMxRjIyM2M5NTlCMjgwNWRBOScpO1xuICAgIHR4QnVpbGRlci5jaGFpblRhZygweDI3KTsgLy8gVGVzdG5ldCBjaGFpbiB0YWdcbiAgICB0eEJ1aWxkZXIuYmxvY2tSZWYoJzB4MDAwMDAwMDAwMDAwMDAwMCcpO1xuICAgIHR4QnVpbGRlci5leHBpcmF0aW9uKDY0KTtcbiAgICB0eEJ1aWxkZXIuZ2FzKDEwMDAwMCk7XG4gICAgdHhCdWlsZGVyLmdhc1ByaWNlQ29lZigwKTtcbiAgICB0eEJ1aWxkZXIubm9uY2UoJzEyMzQ1Jyk7XG4gICAgdHhCdWlsZGVyLnZhbGlkYXRvcih2YWxpZGF0b3JBZGRyZXNzKTtcblxuICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgc2hvdWxkLmV4aXN0KHR4KTtcbiAgICB0eC5zaG91bGQuYmUuaW5zdGFuY2VvZihUcmFuc2FjdGlvbik7XG4gICAgdHguc2hvdWxkLmJlLmluc3RhbmNlb2YoRGVsZWdhdGVDbGF1c2VUcmFuc2FjdGlvbik7XG5cbiAgICBjb25zdCBkZWxlZ2F0aW9uVHggPSB0eCBhcyBEZWxlZ2F0ZUNsYXVzZVRyYW5zYWN0aW9uO1xuICAgIGRlbGVnYXRpb25UeC5zdGFraW5nQ29udHJhY3RBZGRyZXNzLnNob3VsZC5lcXVhbChTVEFSR0FURV9DT05UUkFDVF9BRERSRVNTX1RFU1RORVQpO1xuICAgIGRlbGVnYXRpb25UeC50b2tlbklkLnNob3VsZC5lcXVhbCh0b2tlbklkKTtcbiAgICBkZWxlZ2F0aW9uVHgudmFsaWRhdG9yLnNob3VsZC5lcXVhbCh2YWxpZGF0b3JBZGRyZXNzKTtcblxuICAgIC8vIFZlcmlmeSBjbGF1c2VzXG4gICAgZGVsZWdhdGlvblR4LmNsYXVzZXMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICBzaG91bGQuZXhpc3QoZGVsZWdhdGlvblR4LmNsYXVzZXNbMF0udG8pO1xuICAgIGRlbGVnYXRpb25UeC5jbGF1c2VzWzBdLnRvPy5zaG91bGQuZXF1YWwoU1RBUkdBVEVfQ09OVFJBQ1RfQUREUkVTU19URVNUTkVUKTtcblxuICAgIC8vIFZlcmlmeSB0cmFuc2FjdGlvbiBkYXRhIGlzIGNvcnJlY3RseSBlbmNvZGVkIHVzaW5nIGV0aGVyZXVtQUJJXG4gICAgc2hvdWxkLmV4aXN0KGRlbGVnYXRpb25UeC5jbGF1c2VzWzBdLmRhdGEpO1xuICAgIGNvbnN0IHR4RGF0YSA9IGRlbGVnYXRpb25UeC5jbGF1c2VzWzBdLmRhdGE7XG4gICAgdHhEYXRhLnNob3VsZC5zdGFydFdpdGgoREVMRUdBVEVfQ0xBVVNFX01FVEhPRF9JRCk7XG5cbiAgICAvLyBWZXJpZnkgdGhlIGVuY29kZWQgZGF0YSBtYXRjaGVzIHdoYXQgd2UgZXhwZWN0IGZyb20gZXRoZXJldW1BQklcbiAgICBjb25zdCBtZXRob2ROYW1lID0gJ2RlbGVnYXRlJztcbiAgICBjb25zdCB0eXBlcyA9IFsndWludDI1NicsICdhZGRyZXNzJ107XG4gICAgY29uc3QgcGFyYW1zID0gW25ldyBCTih0b2tlbklkKSwgdmFsaWRhdG9yQWRkcmVzc107XG5cbiAgICBjb25zdCBtZXRob2QgPSBFdGhlcmV1bUFiaS5tZXRob2RJRChtZXRob2ROYW1lLCB0eXBlcyk7XG4gICAgY29uc3QgYXJncyA9IEV0aGVyZXVtQWJpLnJhd0VuY29kZSh0eXBlcywgcGFyYW1zKTtcbiAgICBjb25zdCBleHBlY3RlZERhdGEgPSAnMHgnICsgQnVmZmVyLmNvbmNhdChbbWV0aG9kLCBhcmdzXSkudG9TdHJpbmcoJ2hleCcpO1xuXG4gICAgdHhEYXRhLnNob3VsZC5lcXVhbChleHBlY3RlZERhdGEpO1xuXG4gICAgLy8gVmVyaWZ5IHJlY2lwaWVudHNcbiAgICBkZWxlZ2F0aW9uVHgucmVjaXBpZW50cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgIGRlbGVnYXRpb25UeC5yZWNpcGllbnRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKFNUQVJHQVRFX0NPTlRSQUNUX0FERFJFU1NfVEVTVE5FVCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdGYWlsdXJlIHNjZW5hcmlvcycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIHdoZW4gc3Rha2luZ0NvbnRyYWN0QWRkcmVzcyBpcyBtaXNzaW5nJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gY3JlYXRlQmFzaWNUeEJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci50b2tlbklkKHRva2VuSWQpO1xuICAgICAgdHhCdWlsZGVyLnZhbGlkYXRvcih2YWxpZGF0b3JBZGRyZXNzKTtcblxuICAgICAgYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnU3Rha2luZyBjb250cmFjdCBhZGRyZXNzIGlzIHJlcXVpcmVkJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIHdoZW4gdG9rZW5JZCBpcyBtaXNzaW5nJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gY3JlYXRlQmFzaWNUeEJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5zdGFraW5nQ29udHJhY3RBZGRyZXNzKFNUQVJHQVRFX0NPTlRSQUNUX0FERFJFU1NfVEVTVE5FVCk7XG5cbiAgICAgIGF3YWl0IHR4QnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ1Rva2VuIElEIGlzIHJlcXVpcmVkJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIHdoZW4gdmFsaWRhdG9yIGFkZHJlc3MgaXMgbWlzc2luZycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGNyZWF0ZUJhc2ljVHhCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIuc3Rha2luZ0NvbnRyYWN0QWRkcmVzcyhTVEFSR0FURV9DT05UUkFDVF9BRERSRVNTX1RFU1RORVQpO1xuICAgICAgdHhCdWlsZGVyLnRva2VuSWQodG9rZW5JZCk7XG5cbiAgICAgIGF3YWl0IHR4QnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ1ZhbGlkYXRvciBhZGRyZXNzIGlzIHJlcXVpcmVkJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIHdoZW4gc3Rha2luZ0NvbnRyYWN0QWRkcmVzcyBpcyBpbnZhbGlkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gY3JlYXRlQmFzaWNUeEJ1aWxkZXIoKTtcblxuICAgICAgLy8gSW52YWxpZCBhZGRyZXNzICh3cm9uZyBmb3JtYXQpXG4gICAgICBzaG91bGQoKCkgPT4ge1xuICAgICAgICB0eEJ1aWxkZXIuc3Rha2luZ0NvbnRyYWN0QWRkcmVzcygnaW52YWxpZC1hZGRyZXNzJyk7XG4gICAgICB9KS50aHJvdygvSW52YWxpZCBhZGRyZXNzLyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIHRyYW5zYWN0aW9uIHdpdGggdW5kZWZpbmVkIHNlbmRlciBidXQgaW5jbHVkZSBpdCBpbiBpbnB1dHMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFN0YWtpbmdEZWxlZ2F0ZUJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5zdGFraW5nQ29udHJhY3RBZGRyZXNzKFNUQVJHQVRFX0NPTlRSQUNUX0FERFJFU1NfVEVTVE5FVCk7XG4gICAgICB0eEJ1aWxkZXIudG9rZW5JZCh0b2tlbklkKTtcbiAgICAgIHR4QnVpbGRlci5jaGFpblRhZygweDI3KTtcbiAgICAgIHR4QnVpbGRlci5ibG9ja1JlZignMHgwMDAwMDAwMDAwMDAwMDAwJyk7XG4gICAgICB0eEJ1aWxkZXIuZXhwaXJhdGlvbig2NCk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzKDEwMDAwMCk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzUHJpY2VDb2VmKDApO1xuICAgICAgdHhCdWlsZGVyLm5vbmNlKCcxMjM0NScpO1xuICAgICAgdHhCdWlsZGVyLnZhbGlkYXRvcih2YWxpZGF0b3JBZGRyZXNzKTtcbiAgICAgIC8vIE5vdCBzZXR0aW5nIHNlbmRlclxuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgdHguc2hvdWxkLmJlLmluc3RhbmNlb2YoRGVsZWdhdGVDbGF1c2VUcmFuc2FjdGlvbik7XG5cbiAgICAgIGNvbnN0IGRlbGVnYXRpb25UeCA9IHR4IGFzIERlbGVnYXRlQ2xhdXNlVHJhbnNhY3Rpb247XG4gICAgICAvLyBWZXJpZnkgdGhlIHRyYW5zYWN0aW9uIGhhcyBpbnB1dHMgYnV0IHdpdGggdW5kZWZpbmVkIGFkZHJlc3NcbiAgICAgIGRlbGVnYXRpb25UeC5pbnB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHNob3VsZC5ub3QuZXhpc3QoZGVsZWdhdGlvblR4LmlucHV0c1swXS5hZGRyZXNzKTtcblxuICAgICAgLy8gVmVyaWZ5IHRoZSB0cmFuc2FjdGlvbiBoYXMgdGhlIGNvcnJlY3Qgb3V0cHV0XG4gICAgICBkZWxlZ2F0aW9uVHgub3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgZGVsZWdhdGlvblR4Lm91dHB1dHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWwoU1RBUkdBVEVfQ09OVFJBQ1RfQUREUkVTU19URVNUTkVUKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdXNlIG5ldHdvcmsgZGVmYXVsdCBjaGFpblRhZyB3aGVuIG5vdCBleHBsaWNpdGx5IHNldCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0U3Rha2luZ0RlbGVnYXRlQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnN0YWtpbmdDb250cmFjdEFkZHJlc3MoU1RBUkdBVEVfQ09OVFJBQ1RfQUREUkVTU19URVNUTkVUKTtcbiAgICAgIHR4QnVpbGRlci50b2tlbklkKHRva2VuSWQpO1xuICAgICAgLy8gTm90IHNldHRpbmcgY2hhaW5UYWdcbiAgICAgIHR4QnVpbGRlci5ibG9ja1JlZignMHgwMDAwMDAwMDAwMDAwMDAwJyk7XG4gICAgICB0eEJ1aWxkZXIuZXhwaXJhdGlvbig2NCk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzKDEwMDAwMCk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzUHJpY2VDb2VmKDApO1xuICAgICAgdHhCdWlsZGVyLm5vbmNlKCcxMjM0NScpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcignMHg5Mzc4YzEyQkQ3NTAyQTExRjc3MGE1QzFGMjIzYzk1OUIyODA1ZEE5Jyk7XG4gICAgICB0eEJ1aWxkZXIudmFsaWRhdG9yKHZhbGlkYXRvckFkZHJlc3MpO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgdHguc2hvdWxkLmJlLmluc3RhbmNlb2YoRGVsZWdhdGVDbGF1c2VUcmFuc2FjdGlvbik7XG5cbiAgICAgIGNvbnN0IGRlbGVnYXRpb25UeCA9IHR4IGFzIERlbGVnYXRlQ2xhdXNlVHJhbnNhY3Rpb247XG4gICAgICAvLyBWZXJpZnkgdGhlIGNoYWluVGFnIGlzIHNldCB0byB0aGUgdGVzdG5ldCBkZWZhdWx0ICgzOSlcbiAgICAgIGRlbGVnYXRpb25UeC5jaGFpblRhZy5zaG91bGQuZXF1YWwoMzkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhIHNpZ25lZCB0eCBhbmQgdmFsaWRhdGUgaXRzIHRvSnNvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHRva2VuSWRGb3JEZWxlZ2F0ZVR4biA9ICcxNTY2Mic7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20odGVzdERhdGEuREVMRUdBVElPTl9UUkFOU0FDVElPTik7XG4gICAgICBjb25zdCB0eCA9IHR4QnVpbGRlci50cmFuc2FjdGlvbiBhcyBEZWxlZ2F0ZUNsYXVzZVRyYW5zYWN0aW9uO1xuICAgICAgY29uc3QgdG9Kc29uID0gdHgudG9Kc29uKCk7XG4gICAgICB0b0pzb24uaWQuc2hvdWxkLmVxdWFsKCcweGM0Nzc5MmE0MjFkOTBjYjUyYTRhZWRiZDlhYmU5NmY3NzlhOGFkNjhlNTA4NjgwYWMzY2MxMzU0MjhjM2Y0YzUnKTtcbiAgICAgIHRvSnNvbi5zdGFraW5nQ29udHJhY3RBZGRyZXNzPy5zaG91bGQuZXF1YWwoJzB4MWUwMmIyOTUzYWRlZmVjMjI1Y2YwZWM0OTgwNWIxMTQ2YTQ0MjljMScpO1xuICAgICAgdG9Kc29uLm5vbmNlLnNob3VsZC5lcXVhbCgnODg3NTU3Jyk7XG4gICAgICB0b0pzb24uZ2FzLnNob3VsZC5lcXVhbCgyODc5MjApO1xuICAgICAgdG9Kc29uLmdhc1ByaWNlQ29lZi5zaG91bGQuZXF1YWwoMTI4KTtcbiAgICAgIHRvSnNvbi5leHBpcmF0aW9uLnNob3VsZC5lcXVhbCg2NCk7XG4gICAgICB0b0pzb24uY2hhaW5UYWcuc2hvdWxkLmVxdWFsKDM5KTtcbiAgICAgIHRvSnNvbi50b2tlbklkPy5zaG91bGQuZXF1YWwodG9rZW5JZEZvckRlbGVnYXRlVHhuKTtcbiAgICAgIHRvSnNvbi52YWxpZGF0b3JBZGRyZXNzPy5zaG91bGQuZXF1YWwoJzAwNTYzZWMzY2FmYmJlN2U2MGIwNGIzMTkwZTZlY2E2NjU3OTcwNmQnKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=exitDelegationBuilder.d.ts.map