@hiero-ledger/sdk 2.80.0 → 2.81.0-beta.1

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 (182) hide show
  1. package/README.md +34 -7
  2. package/dist/umd.js +2213 -318
  3. package/dist/umd.js.map +1 -0
  4. package/dist/umd.min.js +6 -5
  5. package/dist/umd.min.js.map +1 -0
  6. package/lib/Executable.cjs +7 -4
  7. package/lib/Executable.js +1 -1
  8. package/lib/Executable.js.map +1 -1
  9. package/lib/PublicKey.cjs +45 -26
  10. package/lib/PublicKey.d.ts +12 -0
  11. package/lib/PublicKey.js +1 -1
  12. package/lib/PublicKey.js.map +1 -1
  13. package/lib/RequestType.cjs +19 -1
  14. package/lib/RequestType.d.ts +2 -0
  15. package/lib/RequestType.js +1 -1
  16. package/lib/RequestType.js.map +1 -1
  17. package/lib/Status.cjs +203 -252
  18. package/lib/Status.d.ts +8 -6
  19. package/lib/Status.js +1 -1
  20. package/lib/Status.js.map +1 -1
  21. package/lib/Transfer.cjs +25 -2
  22. package/lib/Transfer.d.ts +4 -0
  23. package/lib/Transfer.js +1 -1
  24. package/lib/Transfer.js.map +1 -1
  25. package/lib/account/AccountCreateTransaction.cjs +38 -0
  26. package/lib/account/AccountCreateTransaction.d.ts +21 -0
  27. package/lib/account/AccountCreateTransaction.js +1 -1
  28. package/lib/account/AccountCreateTransaction.js.map +1 -1
  29. package/lib/account/AccountUpdateTransaction.cjs +74 -1
  30. package/lib/account/AccountUpdateTransaction.d.ts +43 -0
  31. package/lib/account/AccountUpdateTransaction.js +1 -1
  32. package/lib/account/AccountUpdateTransaction.js.map +1 -1
  33. package/lib/account/TransferTransaction.cjs +57 -9
  34. package/lib/account/TransferTransaction.d.ts +31 -1
  35. package/lib/account/TransferTransaction.js +1 -1
  36. package/lib/account/TransferTransaction.js.map +1 -1
  37. package/lib/browser.js +1 -1
  38. package/lib/client/Client.cjs +38 -0
  39. package/lib/client/Client.d.ts +30 -0
  40. package/lib/client/Client.js +1 -1
  41. package/lib/client/Client.js.map +1 -1
  42. package/lib/client/addressbooks/mainnet.cjs +1 -1
  43. package/lib/client/addressbooks/mainnet.d.ts +1 -1
  44. package/lib/client/addressbooks/mainnet.js +1 -1
  45. package/lib/client/addressbooks/mainnet.js.map +1 -1
  46. package/lib/client/addressbooks/previewnet.cjs +1 -1
  47. package/lib/client/addressbooks/previewnet.d.ts +1 -1
  48. package/lib/client/addressbooks/previewnet.js +1 -1
  49. package/lib/client/addressbooks/previewnet.js.map +1 -1
  50. package/lib/client/addressbooks/testnet.cjs +1 -1
  51. package/lib/client/addressbooks/testnet.d.ts +1 -1
  52. package/lib/client/addressbooks/testnet.js +1 -1
  53. package/lib/client/addressbooks/testnet.js.map +1 -1
  54. package/lib/contract/ContractCreateTransaction.cjs +37 -1
  55. package/lib/contract/ContractCreateTransaction.d.ts +21 -0
  56. package/lib/contract/ContractCreateTransaction.js +1 -1
  57. package/lib/contract/ContractCreateTransaction.js.map +1 -1
  58. package/lib/contract/ContractUpdateTransaction.cjs +74 -1
  59. package/lib/contract/ContractUpdateTransaction.d.ts +43 -0
  60. package/lib/contract/ContractUpdateTransaction.js +1 -1
  61. package/lib/contract/ContractUpdateTransaction.js.map +1 -1
  62. package/lib/exports.cjs +103 -0
  63. package/lib/exports.d.ts +13 -0
  64. package/lib/exports.js +1 -1
  65. package/lib/exports.js.map +1 -1
  66. package/lib/hooks/EvmHook.cjs +84 -0
  67. package/lib/hooks/EvmHook.d.ts +51 -0
  68. package/lib/hooks/EvmHook.js +2 -0
  69. package/lib/hooks/EvmHook.js.map +1 -0
  70. package/lib/hooks/EvmHookCall.cjs +103 -0
  71. package/lib/hooks/EvmHookCall.d.ts +69 -0
  72. package/lib/hooks/EvmHookCall.js +2 -0
  73. package/lib/hooks/EvmHookCall.js.map +1 -0
  74. package/lib/hooks/EvmHookMappingEntry.cjs +135 -0
  75. package/lib/hooks/EvmHookMappingEntry.d.ts +84 -0
  76. package/lib/hooks/EvmHookMappingEntry.js +2 -0
  77. package/lib/hooks/EvmHookMappingEntry.js.map +1 -0
  78. package/lib/hooks/EvmHookStorageUpdate.cjs +238 -0
  79. package/lib/hooks/EvmHookStorageUpdate.d.ts +144 -0
  80. package/lib/hooks/EvmHookStorageUpdate.js +2 -0
  81. package/lib/hooks/EvmHookStorageUpdate.js.map +1 -0
  82. package/lib/hooks/FungibleHookCall.cjs +67 -0
  83. package/lib/hooks/FungibleHookCall.d.ts +50 -0
  84. package/lib/hooks/FungibleHookCall.js +2 -0
  85. package/lib/hooks/FungibleHookCall.js.map +1 -0
  86. package/lib/hooks/FungibleHookType.cjs +11 -0
  87. package/lib/hooks/FungibleHookType.d.ts +5 -0
  88. package/lib/hooks/FungibleHookType.js +2 -0
  89. package/lib/hooks/FungibleHookType.js.map +1 -0
  90. package/lib/hooks/HookCall.cjs +99 -0
  91. package/lib/hooks/HookCall.d.ts +64 -0
  92. package/lib/hooks/HookCall.js +2 -0
  93. package/lib/hooks/HookCall.js.map +1 -0
  94. package/lib/hooks/HookCreationDetails.cjs +149 -0
  95. package/lib/hooks/HookCreationDetails.d.ts +91 -0
  96. package/lib/hooks/HookCreationDetails.js +2 -0
  97. package/lib/hooks/HookCreationDetails.js.map +1 -0
  98. package/lib/hooks/HookEntityId.cjs +67 -0
  99. package/lib/hooks/HookEntityId.d.ts +41 -0
  100. package/lib/hooks/HookEntityId.js +2 -0
  101. package/lib/hooks/HookEntityId.js.map +1 -0
  102. package/lib/hooks/HookExtensionPoint.cjs +31 -0
  103. package/lib/hooks/HookExtensionPoint.d.ts +16 -0
  104. package/lib/hooks/HookExtensionPoint.js +2 -0
  105. package/lib/hooks/HookExtensionPoint.js.map +1 -0
  106. package/lib/hooks/HookId.cjs +101 -0
  107. package/lib/hooks/HookId.d.ts +63 -0
  108. package/lib/hooks/HookId.js +2 -0
  109. package/lib/hooks/HookId.js.map +1 -0
  110. package/lib/hooks/HookStoreTransaction.cjs +157 -0
  111. package/lib/hooks/HookStoreTransaction.d.ts +77 -0
  112. package/lib/hooks/HookStoreTransaction.js +2 -0
  113. package/lib/hooks/HookStoreTransaction.js.map +1 -0
  114. package/lib/hooks/NftHookCall.cjs +67 -0
  115. package/lib/hooks/NftHookCall.d.ts +50 -0
  116. package/lib/hooks/NftHookCall.js +2 -0
  117. package/lib/hooks/NftHookCall.js.map +1 -0
  118. package/lib/hooks/NftHookType.cjs +13 -0
  119. package/lib/hooks/NftHookType.d.ts +7 -0
  120. package/lib/hooks/NftHookType.js +2 -0
  121. package/lib/hooks/NftHookType.js.map +1 -0
  122. package/lib/index.js +1 -1
  123. package/lib/native.js +1 -1
  124. package/lib/token/AbstractTokenTransferTransaction.cjs +17 -5
  125. package/lib/token/AbstractTokenTransferTransaction.d.ts +13 -2
  126. package/lib/token/AbstractTokenTransferTransaction.js +1 -1
  127. package/lib/token/AbstractTokenTransferTransaction.js.map +1 -1
  128. package/lib/token/TokenAirdropTransaction.cjs +1 -1
  129. package/lib/token/TokenAirdropTransaction.js +1 -1
  130. package/lib/token/TokenAirdropTransaction.js.map +1 -1
  131. package/lib/token/TokenNftTransfer.cjs +51 -2
  132. package/lib/token/TokenNftTransfer.d.ts +7 -0
  133. package/lib/token/TokenNftTransfer.js +1 -1
  134. package/lib/token/TokenNftTransfer.js.map +1 -1
  135. package/lib/token/TokenTransfer.cjs +26 -2
  136. package/lib/token/TokenTransfer.d.ts +4 -0
  137. package/lib/token/TokenTransfer.js +1 -1
  138. package/lib/token/TokenTransfer.js.map +1 -1
  139. package/lib/transaction/Transaction.cjs +2 -1
  140. package/lib/transaction/Transaction.js +1 -1
  141. package/lib/transaction/Transaction.js.map +1 -1
  142. package/lib/transaction/TransactionResponse.cjs +82 -9
  143. package/lib/transaction/TransactionResponse.d.ts +33 -2
  144. package/lib/transaction/TransactionResponse.js +1 -1
  145. package/lib/transaction/TransactionResponse.js.map +1 -1
  146. package/lib/version.js +1 -1
  147. package/package.json +15 -13
  148. package/src/Executable.js +10 -7
  149. package/src/PublicKey.js +53 -36
  150. package/src/RequestType.js +18 -0
  151. package/src/Status.js +201 -252
  152. package/src/Transfer.js +33 -1
  153. package/src/account/AccountCreateTransaction.js +39 -0
  154. package/src/account/AccountUpdateTransaction.js +78 -0
  155. package/src/account/TransferTransaction.js +84 -8
  156. package/src/client/Client.js +38 -0
  157. package/src/client/addressbooks/mainnet.js +1 -1
  158. package/src/client/addressbooks/previewnet.js +1 -1
  159. package/src/client/addressbooks/testnet.js +1 -1
  160. package/src/contract/ContractCreateTransaction.js +37 -0
  161. package/src/contract/ContractUpdateTransaction.js +80 -0
  162. package/src/exports.js +17 -0
  163. package/src/hooks/EvmHook.js +83 -0
  164. package/src/hooks/EvmHookCall.js +100 -0
  165. package/src/hooks/EvmHookMappingEntry.js +140 -0
  166. package/src/hooks/EvmHookStorageUpdate.js +257 -0
  167. package/src/hooks/FungibleHookCall.js +65 -0
  168. package/src/hooks/FungibleHookType.js +6 -0
  169. package/src/hooks/HookCall.js +97 -0
  170. package/src/hooks/HookCreationDetails.js +155 -0
  171. package/src/hooks/HookEntityId.js +67 -0
  172. package/src/hooks/HookExtensionPoint.js +25 -0
  173. package/src/hooks/HookId.js +102 -0
  174. package/src/hooks/HookStoreTransaction.js +185 -0
  175. package/src/hooks/NftHookCall.js +64 -0
  176. package/src/hooks/NftHookType.js +8 -0
  177. package/src/token/AbstractTokenTransferTransaction.js +16 -1
  178. package/src/token/TokenAirdropTransaction.js +1 -0
  179. package/src/token/TokenNftTransfer.js +68 -1
  180. package/src/token/TokenTransfer.js +34 -1
  181. package/src/transaction/Transaction.js +3 -0
  182. package/src/transaction/TransactionResponse.js +98 -13
package/src/Transfer.js CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  import AccountId from "./account/AccountId.js";
4
4
  import Hbar from "./Hbar.js";
5
+ import FungibleHookCall from "./hooks/FungibleHookCall.js";
6
+ import FungibleHookType from "./hooks/FungibleHookType.js";
5
7
 
6
8
  /**
7
9
  * @typedef {object} TransferJSON
@@ -31,6 +33,7 @@ export default class Transfer {
31
33
  * @param {AccountId | string} props.accountId
32
34
  * @param {number | string | Long | BigNumber | Hbar} props.amount
33
35
  * @param {boolean} props.isApproved
36
+ * @param {FungibleHookCall} [props.hookCall]
34
37
  */
35
38
  constructor(props) {
36
39
  /**
@@ -52,6 +55,7 @@ export default class Transfer {
52
55
  : new Hbar(props.amount);
53
56
 
54
57
  this.isApproved = props.isApproved;
58
+ this.hookCall = props.hookCall;
55
59
  }
56
60
 
57
61
  /**
@@ -63,6 +67,19 @@ export default class Transfer {
63
67
  const transfers = [];
64
68
 
65
69
  for (const transfer of accountAmounts) {
70
+ let hookCall = undefined;
71
+ if (transfer.preTxAllowanceHook != null) {
72
+ hookCall = FungibleHookCall._fromProtobufWithType(
73
+ transfer.preTxAllowanceHook,
74
+ FungibleHookType.PRE_TX_ALLOWANCE_HOOK,
75
+ );
76
+ } else if (transfer.prePostTxAllowanceHook != null) {
77
+ hookCall = FungibleHookCall._fromProtobufWithType(
78
+ transfer.prePostTxAllowanceHook,
79
+ FungibleHookType.PRE_POST_TX_ALLOWANCE_HOOK,
80
+ );
81
+ }
82
+
66
83
  transfers.push(
67
84
  new Transfer({
68
85
  accountId: AccountId._fromProtobuf(
@@ -74,6 +91,7 @@ export default class Transfer {
74
91
  transfer.amount != null ? transfer.amount : 0,
75
92
  ),
76
93
  isApproved: /** @type {boolean} */ (transfer.isApproval),
94
+ hookCall,
77
95
  }),
78
96
  );
79
97
  }
@@ -86,11 +104,25 @@ export default class Transfer {
86
104
  * @returns {HieroProto.proto.IAccountAmount}
87
105
  */
88
106
  _toProtobuf() {
89
- return {
107
+ /** @type {HieroProto.proto.IAccountAmount} */
108
+ const result = {
90
109
  accountID: this.accountId._toProtobuf(),
91
110
  amount: this.amount.toTinybars(),
92
111
  isApproval: this.isApproved,
93
112
  };
113
+
114
+ if (this.hookCall != null) {
115
+ switch (this.hookCall.type) {
116
+ case FungibleHookType.PRE_TX_ALLOWANCE_HOOK:
117
+ result.preTxAllowanceHook = this.hookCall._toProtobuf();
118
+ break;
119
+ case FungibleHookType.PRE_POST_TX_ALLOWANCE_HOOK:
120
+ result.prePostTxAllowanceHook = this.hookCall._toProtobuf();
121
+ break;
122
+ }
123
+ }
124
+
125
+ return result;
94
126
  }
95
127
 
96
128
  /**
@@ -39,6 +39,7 @@ export default class AccountCreateTransaction extends Transaction {
39
39
  * @param {Long | number} [props.stakedNodeId]
40
40
  * @param {boolean} [props.declineStakingReward]
41
41
  * @param {EvmAddress} [props.alias]
42
+ * @param {import("../hooks/HookCreationDetails.js").default[]} [props.hooks]
42
43
  */
43
44
  constructor(props = {}) {
44
45
  super();
@@ -121,6 +122,18 @@ export default class AccountCreateTransaction extends Transaction {
121
122
  */
122
123
  this._alias = null;
123
124
 
125
+ /**
126
+ * @private
127
+ * @type {import("../hooks/HookCreationDetails.js").default[]}
128
+ */
129
+ this._hooks = [];
130
+
131
+ if (props.hooks != null) {
132
+ props.hooks.forEach((hook) => {
133
+ this.addHook(hook);
134
+ });
135
+ }
136
+
124
137
  if (props.key != null) {
125
138
  this.setKeyWithoutAlias(props.key);
126
139
  }
@@ -652,10 +665,36 @@ export default class AccountCreateTransaction extends Transaction {
652
665
  : null,
653
666
  stakedNodeId: this.stakedNodeId,
654
667
  declineReward: this.declineStakingRewards,
668
+ hookCreationDetails: this._hooks.map((hook) => hook._toProtobuf()),
655
669
  alias,
656
670
  };
657
671
  }
658
672
 
673
+ /**
674
+ * @param {import("../hooks/HookCreationDetails.js").default} hook
675
+ * @returns {this}
676
+ */
677
+ addHook(hook) {
678
+ this._hooks.push(hook);
679
+ return this;
680
+ }
681
+
682
+ /**
683
+ * @param {import("../hooks/HookCreationDetails.js").default[]} hooks
684
+ * @returns {this}
685
+ */
686
+ setHooks(hooks) {
687
+ this._hooks = hooks;
688
+ return this;
689
+ }
690
+
691
+ /**
692
+ * @returns {import("../hooks/HookCreationDetails.js").default[]}
693
+ */
694
+ get hooks() {
695
+ return this._hooks;
696
+ }
697
+
659
698
  /**
660
699
  * @returns {string}
661
700
  */
@@ -44,6 +44,8 @@ export default class AccountUpdateTransaction extends Transaction {
44
44
  * @param {AccountId | string} [props.stakedAccountId]
45
45
  * @param {Long | number} [props.stakedNodeId]
46
46
  * @param {?boolean} [props.declineStakingReward]
47
+ * @param {import("../hooks/HookCreationDetails.js").default[]} [props.hooksToBeCreated]
48
+ * @param {Long[]} [props.hooksToBeDeleted]
47
49
  */
48
50
  constructor(props = {}) {
49
51
  super();
@@ -120,6 +122,18 @@ export default class AccountUpdateTransaction extends Transaction {
120
122
  */
121
123
  this._declineStakingReward = null;
122
124
 
125
+ /**
126
+ * @private
127
+ * @type {import("../hooks/HookCreationDetails.js").default[]}
128
+ */
129
+ this._hooksToBeCreated = [];
130
+
131
+ /**
132
+ * @private
133
+ * @type {Long[]}
134
+ */
135
+ this._hooksToBeDeleted = [];
136
+
123
137
  if (props.accountId != null) {
124
138
  this.setAccountId(props.accountId);
125
139
  }
@@ -166,6 +180,14 @@ export default class AccountUpdateTransaction extends Transaction {
166
180
  if (props.declineStakingReward != null) {
167
181
  this.setDeclineStakingReward(props.declineStakingReward);
168
182
  }
183
+
184
+ if (props.hooksToBeCreated != null) {
185
+ this.setHooksToCreate(props.hooksToBeCreated);
186
+ }
187
+
188
+ if (props.hooksToBeDeleted != null) {
189
+ this.setHooksToDelete(props.hooksToBeDeleted);
190
+ }
169
191
  }
170
192
 
171
193
  /**
@@ -533,6 +555,57 @@ export default class AccountUpdateTransaction extends Transaction {
533
555
  return this;
534
556
  }
535
557
 
558
+ /**
559
+ * @param {import("../hooks/HookCreationDetails.js").default} hook
560
+ * @returns {this}
561
+ */
562
+ addHookToCreate(hook) {
563
+ this._hooksToBeCreated.push(hook);
564
+ return this;
565
+ }
566
+
567
+ /**
568
+ * @param {import("../hooks/HookCreationDetails.js").default[]} hooks
569
+ * @returns {this}
570
+ */
571
+ setHooksToCreate(hooks) {
572
+ this._hooksToBeCreated = hooks;
573
+ return this;
574
+ }
575
+
576
+ /**
577
+ * @returns {import("../hooks/HookCreationDetails.js").default[]}
578
+ */
579
+ get hooksToCreate() {
580
+ return this._hooksToBeCreated;
581
+ }
582
+
583
+ /**
584
+ *
585
+ * @param {Long} hook
586
+ * @returns {this}
587
+ */
588
+ addHookToDelete(hook) {
589
+ this._hooksToBeDeleted.push(hook);
590
+ return this;
591
+ }
592
+
593
+ /**
594
+ * @param {Long[]} hookIds
595
+ * @returns {this}
596
+ */
597
+ setHooksToDelete(hookIds) {
598
+ this._hooksToBeDeleted = hookIds;
599
+ return this;
600
+ }
601
+
602
+ /**
603
+ * @returns {Long[]}
604
+ */
605
+ get hooksToDelete() {
606
+ return this._hooksToBeDeleted;
607
+ }
608
+
536
609
  /**
537
610
  * @param {Client} client
538
611
  */
@@ -613,6 +686,11 @@ export default class AccountUpdateTransaction extends Transaction {
613
686
  this.declineStakingRewards != null
614
687
  ? { value: this.declineStakingRewards }
615
688
  : null,
689
+
690
+ hookIdsToDelete: this._hooksToBeDeleted,
691
+ hookCreationDetails: this._hooksToBeCreated.map((hook) =>
692
+ hook._toProtobuf(),
693
+ ),
616
694
  };
617
695
  }
618
696
 
@@ -12,6 +12,8 @@ import HbarTransferMap from "./HbarTransferMap.js";
12
12
  import TokenNftTransfer from "../token/TokenNftTransfer.js";
13
13
  import NftId from "../token/NftId.js";
14
14
  import AbstractTokenTransferTransaction from "../token/AbstractTokenTransferTransaction.js";
15
+ import FungibleHookCall from "../hooks/FungibleHookCall.js";
16
+ import NftHookCall from "../hooks/NftHookCall.js";
15
17
 
16
18
  /**
17
19
  * @typedef {import("../long.js").LongObject} LongObject
@@ -169,9 +171,10 @@ export default class TransferTransaction extends AbstractTokenTransferTransactio
169
171
  * @param {AccountId | string} accountId
170
172
  * @param {number | string | Long | LongObject | BigNumber | Hbar} amount
171
173
  * @param {boolean} isApproved
174
+ * @param {FungibleHookCall} [hookCall]
172
175
  * @returns {TransferTransaction}
173
176
  */
174
- _addHbarTransfer(accountId, amount, isApproved) {
177
+ _addHbarTransfer(accountId, amount, isApproved, hookCall) {
175
178
  this._requireNotFrozen();
176
179
 
177
180
  const account =
@@ -194,6 +197,7 @@ export default class TransferTransaction extends AbstractTokenTransferTransactio
194
197
  accountId: account,
195
198
  amount: hbars,
196
199
  isApproved,
200
+ hookCall,
197
201
  }),
198
202
  );
199
203
 
@@ -310,6 +314,82 @@ export default class TransferTransaction extends AbstractTokenTransferTransactio
310
314
  return this;
311
315
  }
312
316
 
317
+ /**
318
+ *
319
+ * @param {AccountId} accountId
320
+ * @param {Long} amount
321
+ * @param {FungibleHookCall} hook
322
+ * @returns {TransferTransaction}
323
+ */
324
+ addHbarTransferWithHook(accountId, amount, hook) {
325
+ const isApproved = false; // this is not approved transfer, adding comment for clarity
326
+ return this._addHbarTransfer(
327
+ accountId,
328
+ amount,
329
+ isApproved,
330
+ new FungibleHookCall({
331
+ hookId: hook.hookId,
332
+ evmHookCall: hook.evmHookCall,
333
+ type: hook.type,
334
+ }),
335
+ );
336
+ }
337
+
338
+ /**
339
+ *
340
+ * @param {NftId} nftId
341
+ * @param {AccountId} sender
342
+ * @param {AccountId} receiver
343
+ * @param {NftHookCall} senderHookCall
344
+ * @param {NftHookCall} receiverHookCall
345
+ * @returns {TransferTransaction}
346
+ */
347
+ addNftTransferWithHook(
348
+ nftId,
349
+ sender,
350
+ receiver,
351
+ senderHookCall,
352
+ receiverHookCall,
353
+ ) {
354
+ return this._addNftTransfer(
355
+ false,
356
+ nftId,
357
+ sender,
358
+ receiver,
359
+ undefined, // receiver
360
+ senderHookCall,
361
+ receiverHookCall,
362
+ );
363
+ }
364
+
365
+ /**
366
+ *
367
+ * @param {TokenId} tokenId
368
+ * @param {AccountId} accountId
369
+ * @param {Long} amount
370
+ * @param {FungibleHookCall} hook
371
+ * @returns {TransferTransaction}
372
+ */
373
+ addTokenTransferWithHook(tokenId, accountId, amount, hook) {
374
+ const fungibleHook = new FungibleHookCall({
375
+ hookId: hook.hookId != null ? hook.hookId : undefined,
376
+ evmHookCall:
377
+ hook.evmHookCall != null ? hook.evmHookCall : undefined,
378
+ type: hook.type,
379
+ });
380
+
381
+ const isApproved = false; // this is not approved transfer, adding comment for clarity
382
+ const expectedDecimals = null; // we don't expect decimals here, adding comment for clarity
383
+
384
+ return this._addTokenTransfer(
385
+ tokenId,
386
+ accountId,
387
+ amount,
388
+ isApproved,
389
+ expectedDecimals,
390
+ fungibleHook,
391
+ );
392
+ }
313
393
  /**
314
394
  * @override
315
395
  * @internal
@@ -342,13 +422,9 @@ export default class TransferTransaction extends AbstractTokenTransferTransactio
342
422
 
343
423
  return {
344
424
  transfers: {
345
- accountAmounts: this._hbarTransfers.map((transfer) => {
346
- return {
347
- accountID: transfer.accountId._toProtobuf(),
348
- amount: transfer.amount.toTinybars(),
349
- isApproval: transfer.isApproved,
350
- };
351
- }),
425
+ accountAmounts: this._hbarTransfers.map((transfer) =>
426
+ transfer._toProtobuf(),
427
+ ),
352
428
  },
353
429
  tokenTransfers,
354
430
  };
@@ -132,6 +132,18 @@ export default class Client {
132
132
  /** @private */
133
133
  this._defaultRegenerateTransactionId = true;
134
134
 
135
+ /**
136
+ * When enabled, allows receipt queries to fail over to other nodes
137
+ * if the submitting node is unresponsive. Default is false to preserve
138
+ * existing semantics where receipt queries are pinned to the submitting node.
139
+ *
140
+ * Tradeoff: Improved availability vs the rare case where only the submitting
141
+ * node may have final failure information.
142
+ *
143
+ * @private
144
+ */
145
+ this._allowReceiptNodeFailover = false;
146
+
135
147
  /** @private */
136
148
  this._requestTimeout = DEFAULT_REQUEST_TIMEOUT;
137
149
 
@@ -480,6 +492,32 @@ export default class Client {
480
492
  return this;
481
493
  }
482
494
 
495
+ /**
496
+ * @returns {boolean}
497
+ */
498
+ get allowReceiptNodeFailover() {
499
+ return this._allowReceiptNodeFailover;
500
+ }
501
+
502
+ /**
503
+ * Enable or disable receipt query failover to other nodes when the submitting node
504
+ * is unresponsive. When enabled, receipt queries will start with the submitting node
505
+ * but can fail over to other nodes in the network if needed.
506
+ *
507
+ * Default is `false` to preserve existing behavior where receipt queries are pinned
508
+ * to the submitting node only.
509
+ *
510
+ * **Tradeoff**: Enabling this improves availability for high-throughput/relay use cases,
511
+ * but in rare cases only the submitting node may have the final failure information.
512
+ *
513
+ * @param {boolean} allowReceiptNodeFailover
514
+ * @returns {this}
515
+ */
516
+ setAllowReceiptNodeFailover(allowReceiptNodeFailover) {
517
+ this._allowReceiptNodeFailover = allowReceiptNodeFailover;
518
+ return this;
519
+ }
520
+
483
521
  /**
484
522
  * @returns {Hbar}
485
523
  */