@hashgraphonline/standards-sdk 0.1.146 → 0.1.148-fix-wc-updates.canary.3273eda.101

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 (181) hide show
  1. package/README.md +3 -3
  2. package/dist/cjs/hcs-3/src/types.d.ts +64 -0
  3. package/dist/cjs/hcs-3/src/types.d.ts.map +1 -0
  4. package/dist/cjs/inscribe/inscriber.d.ts.map +1 -1
  5. package/dist/cjs/services/registry-broker/client/adapters.d.ts +15 -18
  6. package/dist/cjs/services/registry-broker/client/adapters.d.ts.map +1 -1
  7. package/dist/cjs/services/registry-broker/client/agents.d.ts +11 -14
  8. package/dist/cjs/services/registry-broker/client/agents.d.ts.map +1 -1
  9. package/dist/cjs/services/registry-broker/client/base-client.d.ts +100 -1
  10. package/dist/cjs/services/registry-broker/client/base-client.d.ts.map +1 -1
  11. package/dist/cjs/services/registry-broker/client/chat-history.d.ts +8 -12
  12. package/dist/cjs/services/registry-broker/client/chat-history.d.ts.map +1 -1
  13. package/dist/cjs/services/registry-broker/client/chat.d.ts +29 -30
  14. package/dist/cjs/services/registry-broker/client/chat.d.ts.map +1 -1
  15. package/dist/cjs/services/registry-broker/client/credits.d.ts +14 -18
  16. package/dist/cjs/services/registry-broker/client/credits.d.ts.map +1 -1
  17. package/dist/cjs/services/registry-broker/client/encrypted-chat-manager.d.ts +0 -5
  18. package/dist/cjs/services/registry-broker/client/encrypted-chat-manager.d.ts.map +1 -1
  19. package/dist/cjs/services/registry-broker/client/encryption.d.ts +32 -30
  20. package/dist/cjs/services/registry-broker/client/encryption.d.ts.map +1 -1
  21. package/dist/cjs/services/registry-broker/client/ledger-auth.d.ts +5 -8
  22. package/dist/cjs/services/registry-broker/client/ledger-auth.d.ts.map +1 -1
  23. package/dist/cjs/services/registry-broker/client/search.d.ts +14 -17
  24. package/dist/cjs/services/registry-broker/client/search.d.ts.map +1 -1
  25. package/dist/cjs/services/registry-broker/schemas.d.ts +9 -9
  26. package/dist/cjs/services/registry-broker/types.d.ts +1 -0
  27. package/dist/cjs/services/registry-broker/types.d.ts.map +1 -1
  28. package/dist/cjs/standards-sdk.cjs +3 -3
  29. package/dist/cjs/standards-sdk.cjs.map +1 -1
  30. package/dist/es/hcs-3/src/types.d.ts +64 -0
  31. package/dist/es/hcs-3/src/types.d.ts.map +1 -0
  32. package/dist/es/inscribe/inscriber.d.ts.map +1 -1
  33. package/dist/es/services/registry-broker/client/adapters.d.ts +15 -18
  34. package/dist/es/services/registry-broker/client/adapters.d.ts.map +1 -1
  35. package/dist/es/services/registry-broker/client/agents.d.ts +11 -14
  36. package/dist/es/services/registry-broker/client/agents.d.ts.map +1 -1
  37. package/dist/es/services/registry-broker/client/base-client.d.ts +100 -1
  38. package/dist/es/services/registry-broker/client/base-client.d.ts.map +1 -1
  39. package/dist/es/services/registry-broker/client/chat-history.d.ts +8 -12
  40. package/dist/es/services/registry-broker/client/chat-history.d.ts.map +1 -1
  41. package/dist/es/services/registry-broker/client/chat.d.ts +29 -30
  42. package/dist/es/services/registry-broker/client/chat.d.ts.map +1 -1
  43. package/dist/es/services/registry-broker/client/credits.d.ts +14 -18
  44. package/dist/es/services/registry-broker/client/credits.d.ts.map +1 -1
  45. package/dist/es/services/registry-broker/client/encrypted-chat-manager.d.ts +0 -5
  46. package/dist/es/services/registry-broker/client/encrypted-chat-manager.d.ts.map +1 -1
  47. package/dist/es/services/registry-broker/client/encryption.d.ts +32 -30
  48. package/dist/es/services/registry-broker/client/encryption.d.ts.map +1 -1
  49. package/dist/es/services/registry-broker/client/ledger-auth.d.ts +5 -8
  50. package/dist/es/services/registry-broker/client/ledger-auth.d.ts.map +1 -1
  51. package/dist/es/services/registry-broker/client/search.d.ts +14 -17
  52. package/dist/es/services/registry-broker/client/search.d.ts.map +1 -1
  53. package/dist/es/services/registry-broker/schemas.d.ts +9 -9
  54. package/dist/es/services/registry-broker/types.d.ts +1 -0
  55. package/dist/es/services/registry-broker/types.d.ts.map +1 -1
  56. package/dist/es/standards-sdk.es.js +13 -16
  57. package/dist/es/standards-sdk.es.js.map +1 -1
  58. package/dist/es/standards-sdk.es101.js +1 -1
  59. package/dist/es/standards-sdk.es103.js +1 -1
  60. package/dist/es/standards-sdk.es109.js +3 -10
  61. package/dist/es/standards-sdk.es109.js.map +1 -1
  62. package/dist/es/standards-sdk.es11.js +1 -1
  63. package/dist/es/standards-sdk.es110.js +5 -5
  64. package/dist/es/standards-sdk.es12.js +1 -1
  65. package/dist/es/standards-sdk.es120.js +1 -1
  66. package/dist/es/standards-sdk.es121.js +1 -1
  67. package/dist/es/standards-sdk.es122.js +5 -5
  68. package/dist/es/standards-sdk.es124.js +20 -1
  69. package/dist/es/standards-sdk.es124.js.map +1 -1
  70. package/dist/es/standards-sdk.es125.js +1 -1
  71. package/dist/es/standards-sdk.es127.js +960 -178
  72. package/dist/es/standards-sdk.es127.js.map +1 -1
  73. package/dist/es/standards-sdk.es128.js +15 -205
  74. package/dist/es/standards-sdk.es128.js.map +1 -1
  75. package/dist/es/standards-sdk.es129.js +79 -96
  76. package/dist/es/standards-sdk.es129.js.map +1 -1
  77. package/dist/es/standards-sdk.es130.js +72 -112
  78. package/dist/es/standards-sdk.es130.js.map +1 -1
  79. package/dist/es/standards-sdk.es131.js +760 -213
  80. package/dist/es/standards-sdk.es131.js.map +1 -1
  81. package/dist/es/standards-sdk.es132.js +53 -173
  82. package/dist/es/standards-sdk.es132.js.map +1 -1
  83. package/dist/es/standards-sdk.es133.js +156 -119
  84. package/dist/es/standards-sdk.es133.js.map +1 -1
  85. package/dist/es/standards-sdk.es134.js +8 -327
  86. package/dist/es/standards-sdk.es134.js.map +1 -1
  87. package/dist/es/standards-sdk.es135.js +74 -452
  88. package/dist/es/standards-sdk.es135.js.map +1 -1
  89. package/dist/es/standards-sdk.es136.js +61 -13
  90. package/dist/es/standards-sdk.es136.js.map +1 -1
  91. package/dist/es/standards-sdk.es137.js +30 -81
  92. package/dist/es/standards-sdk.es137.js.map +1 -1
  93. package/dist/es/standards-sdk.es138.js +34 -87
  94. package/dist/es/standards-sdk.es138.js.map +1 -1
  95. package/dist/es/standards-sdk.es139.js +28 -60
  96. package/dist/es/standards-sdk.es139.js.map +1 -1
  97. package/dist/es/standards-sdk.es140.js +121 -142
  98. package/dist/es/standards-sdk.es140.js.map +1 -1
  99. package/dist/es/standards-sdk.es141.js +42 -7
  100. package/dist/es/standards-sdk.es141.js.map +1 -1
  101. package/dist/es/standards-sdk.es142.js +12255 -52
  102. package/dist/es/standards-sdk.es142.js.map +1 -1
  103. package/dist/es/standards-sdk.es143.js +49 -58
  104. package/dist/es/standards-sdk.es143.js.map +1 -1
  105. package/dist/es/standards-sdk.es144.js +84 -30
  106. package/dist/es/standards-sdk.es144.js.map +1 -1
  107. package/dist/es/standards-sdk.es145.js +17 -34
  108. package/dist/es/standards-sdk.es145.js.map +1 -1
  109. package/dist/es/standards-sdk.es146.js +172 -28
  110. package/dist/es/standards-sdk.es146.js.map +1 -1
  111. package/dist/es/standards-sdk.es147.js +322 -959
  112. package/dist/es/standards-sdk.es147.js.map +1 -1
  113. package/dist/es/standards-sdk.es148.js +293 -12236
  114. package/dist/es/standards-sdk.es148.js.map +1 -1
  115. package/dist/es/standards-sdk.es149.js +427 -112
  116. package/dist/es/standards-sdk.es149.js.map +1 -1
  117. package/dist/es/standards-sdk.es150.js +329 -40
  118. package/dist/es/standards-sdk.es150.js.map +1 -1
  119. package/dist/es/standards-sdk.es151.js +69 -49
  120. package/dist/es/standards-sdk.es151.js.map +1 -1
  121. package/dist/es/standards-sdk.es152.js +153 -65
  122. package/dist/es/standards-sdk.es152.js.map +1 -1
  123. package/dist/es/standards-sdk.es153.js +219 -14
  124. package/dist/es/standards-sdk.es153.js.map +1 -1
  125. package/dist/es/standards-sdk.es154.js +223 -156
  126. package/dist/es/standards-sdk.es154.js.map +1 -1
  127. package/dist/es/standards-sdk.es155.js +112 -315
  128. package/dist/es/standards-sdk.es155.js.map +1 -1
  129. package/dist/es/standards-sdk.es156.js +116 -336
  130. package/dist/es/standards-sdk.es156.js.map +1 -1
  131. package/dist/es/standards-sdk.es157.js +151 -443
  132. package/dist/es/standards-sdk.es157.js.map +1 -1
  133. package/dist/es/standards-sdk.es158.js +170 -316
  134. package/dist/es/standards-sdk.es158.js.map +1 -1
  135. package/dist/es/standards-sdk.es159.js +132 -69
  136. package/dist/es/standards-sdk.es159.js.map +1 -1
  137. package/dist/es/standards-sdk.es16.js +3 -10
  138. package/dist/es/standards-sdk.es16.js.map +1 -1
  139. package/dist/es/standards-sdk.es160.js +300 -208
  140. package/dist/es/standards-sdk.es160.js.map +1 -1
  141. package/dist/es/standards-sdk.es161.js +16 -1
  142. package/dist/es/standards-sdk.es161.js.map +1 -1
  143. package/dist/es/standards-sdk.es18.js +6 -13
  144. package/dist/es/standards-sdk.es18.js.map +1 -1
  145. package/dist/es/standards-sdk.es19.js +4 -11
  146. package/dist/es/standards-sdk.es19.js.map +1 -1
  147. package/dist/es/standards-sdk.es22.js +1 -1
  148. package/dist/es/standards-sdk.es27.js +6 -13
  149. package/dist/es/standards-sdk.es27.js.map +1 -1
  150. package/dist/es/standards-sdk.es30.js +1 -1
  151. package/dist/es/standards-sdk.es31.js +1 -1
  152. package/dist/es/standards-sdk.es35.js +5 -11
  153. package/dist/es/standards-sdk.es35.js.map +1 -1
  154. package/dist/es/standards-sdk.es36.js +3 -3
  155. package/dist/es/standards-sdk.es37.js +1 -1
  156. package/dist/es/standards-sdk.es4.js +1 -1
  157. package/dist/es/standards-sdk.es53.js +1 -1
  158. package/dist/es/standards-sdk.es56.js +1 -1
  159. package/dist/es/standards-sdk.es58.js +1 -1
  160. package/dist/es/standards-sdk.es59.js +1 -1
  161. package/dist/es/standards-sdk.es60.js +4 -11
  162. package/dist/es/standards-sdk.es60.js.map +1 -1
  163. package/dist/es/standards-sdk.es62.js +1 -1
  164. package/dist/es/standards-sdk.es64.js +1 -1
  165. package/dist/es/standards-sdk.es65.js +2 -2
  166. package/dist/es/standards-sdk.es68.js +2 -2
  167. package/dist/es/standards-sdk.es69.js +1 -1
  168. package/dist/es/standards-sdk.es7.js +1 -1
  169. package/dist/es/standards-sdk.es71.js +1 -1
  170. package/dist/es/standards-sdk.es76.js +1 -1
  171. package/dist/es/standards-sdk.es77.js +3 -10
  172. package/dist/es/standards-sdk.es77.js.map +1 -1
  173. package/dist/es/standards-sdk.es78.js +1 -1
  174. package/dist/es/standards-sdk.es81.js +1 -1
  175. package/dist/es/standards-sdk.es83.js +1 -1
  176. package/dist/es/standards-sdk.es87.js +3 -3
  177. package/dist/es/standards-sdk.es91.js +1 -1
  178. package/dist/es/standards-sdk.es92.js +1 -1
  179. package/dist/es/standards-sdk.es97.js +1 -1
  180. package/dist/es/standards-sdk.es99.js +1 -1
  181. package/package.json +63 -73
@@ -1,141 +1,456 @@
1
- import { AccountId, Client, PrivateKey } from "@hashgraph/sdk";
2
- import { detectKeyTypeFromString } from "./standards-sdk.es113.js";
3
- class NodeOperatorResolver {
4
- constructor(params) {
5
- this.mirror = params.mirrorNode;
6
- this.logger = params.logger;
7
- }
1
+ import { proto } from "@hashgraph/proto";
2
+ import { Long, Hbar, HbarUnit, ContractId, AccountId, FileId } from "@hashgraph/sdk";
3
+ import { Buffer } from "buffer";
4
+ import { hasTransactionType, parseKey } from "./standards-sdk.es151.js";
5
+ class SCSParser {
8
6
  /**
9
- * Best-guess parsing for an operator key without network calls.
10
- * - If PrivateKey: returns immediately with provided or fallback type.
11
- * - If string with explicitType: parse directly.
12
- * - If string without type: detect format; fallback to ECDSA.
7
+ * Parse Smart Contract Service transaction using unified dual-branch approach
8
+ * This handles both regular transactions and signed transaction variants
13
9
  */
14
- bestGuessOperatorKey(operatorKeyInput, explicitType) {
15
- if (typeof operatorKeyInput !== "string") {
16
- return { keyType: explicitType || "ecdsa", privateKey: operatorKeyInput };
17
- }
18
- if (explicitType) {
19
- const pk = explicitType === "ed25519" ? PrivateKey.fromStringED25519(operatorKeyInput) : PrivateKey.fromStringECDSA(operatorKeyInput);
20
- return { keyType: explicitType, privateKey: pk };
21
- }
10
+ static parseSCSTransaction(transaction, originalBytes) {
22
11
  try {
23
- const detected = detectKeyTypeFromString(operatorKeyInput);
24
- return {
25
- keyType: detected.detectedType,
26
- privateKey: detected.privateKey
27
- };
28
- } catch {
12
+ if (originalBytes || transaction.toBytes) {
13
+ try {
14
+ const bytesToParse = originalBytes || transaction.toBytes();
15
+ const decoded = proto.TransactionList.decode(bytesToParse);
16
+ if (decoded.transactionList && decoded.transactionList.length > 0) {
17
+ const tx = decoded.transactionList[0];
18
+ let txBody = null;
19
+ if (tx.bodyBytes && tx.bodyBytes.length > 0) {
20
+ txBody = proto.TransactionBody.decode(tx.bodyBytes);
21
+ } else if (tx.signedTransactionBytes && tx.signedTransactionBytes.length > 0) {
22
+ const signedTx = proto.SignedTransaction.decode(
23
+ tx.signedTransactionBytes
24
+ );
25
+ if (signedTx.bodyBytes) {
26
+ txBody = proto.TransactionBody.decode(signedTx.bodyBytes);
27
+ }
28
+ }
29
+ if (txBody) {
30
+ const protoResult = this.parseFromProtobufTxBody(txBody);
31
+ if (protoResult.type && protoResult.type !== "UNKNOWN") {
32
+ return protoResult;
33
+ }
34
+ }
35
+ }
36
+ } catch (protoError) {
37
+ }
38
+ }
39
+ return this.parseFromTransactionInternals(transaction);
40
+ } catch (error) {
29
41
  return {
30
- keyType: "ecdsa",
31
- privateKey: PrivateKey.fromStringECDSA(operatorKeyInput)
42
+ type: "UNKNOWN",
43
+ humanReadableType: "Unknown Contract Transaction"
32
44
  };
33
45
  }
34
46
  }
35
47
  /**
36
- * Resolve an operator key using Mirror Node for key type when possible.
37
- * - If PrivateKey: return immediately.
38
- * - If explicitType: parse directly.
39
- * - Else: query Mirror Node; fallback to local detection.
48
+ * Parse contract transaction from protobuf TransactionBody
49
+ * Handles all contract operations from decoded protobuf data
40
50
  */
41
- async resolveOperatorKey(operatorId, operatorKeyInput, explicitType) {
42
- if (typeof operatorKeyInput !== "string") {
43
- return { keyType: explicitType || "ecdsa", privateKey: operatorKeyInput };
51
+ static parseFromProtobufTxBody(txBody) {
52
+ if (txBody.contractCall) {
53
+ const contractCall = this.parseContractCall(txBody.contractCall);
54
+ if (contractCall) {
55
+ return {
56
+ type: "CONTRACTCALL",
57
+ humanReadableType: "Contract Call",
58
+ contractCall
59
+ };
60
+ }
44
61
  }
45
- if (explicitType) {
46
- const pk = explicitType === "ed25519" ? PrivateKey.fromStringED25519(operatorKeyInput) : PrivateKey.fromStringECDSA(operatorKeyInput);
47
- return { keyType: explicitType, privateKey: pk };
62
+ if (txBody.contractCreateInstance) {
63
+ const contractCreate = this.parseContractCreate(
64
+ txBody.contractCreateInstance
65
+ );
66
+ if (contractCreate) {
67
+ return {
68
+ type: "CONTRACTCREATE",
69
+ humanReadableType: "Contract Create",
70
+ contractCreate
71
+ };
72
+ }
48
73
  }
49
- const account = typeof operatorId === "string" ? operatorId : operatorId.toString();
50
- try {
51
- const info = await this.mirror.requestAccount(account);
52
- const t = info?.key?._type || "";
53
- const keyType = t.includes("ED25519") ? "ed25519" : "ecdsa";
54
- const privateKey = keyType === "ed25519" ? PrivateKey.fromStringED25519(operatorKeyInput) : PrivateKey.fromStringECDSA(operatorKeyInput);
55
- return { keyType, privateKey };
56
- } catch {
57
- this.logger.warn(
58
- "Mirror node key detection failed; using local detection or default ECDSA"
74
+ if (txBody.contractUpdateInstance) {
75
+ const contractUpdate = this.parseContractUpdate(
76
+ txBody.contractUpdateInstance
59
77
  );
60
- return this.bestGuessOperatorKey(operatorKeyInput);
78
+ if (contractUpdate) {
79
+ return {
80
+ type: "CONTRACTUPDATE",
81
+ humanReadableType: "Contract Update",
82
+ contractUpdate
83
+ };
84
+ }
61
85
  }
86
+ if (txBody.contractDeleteInstance) {
87
+ const contractDelete = this.parseContractDelete(
88
+ txBody.contractDeleteInstance
89
+ );
90
+ if (contractDelete) {
91
+ return {
92
+ type: "CONTRACTDELETE",
93
+ humanReadableType: "Contract Delete",
94
+ contractDelete
95
+ };
96
+ }
97
+ }
98
+ if (txBody.ethereumTransaction) {
99
+ const ethereumCall = this.parseEthereumTransaction(
100
+ txBody.ethereumTransaction
101
+ );
102
+ if (ethereumCall) {
103
+ return {
104
+ type: "ETHEREUMTRANSACTION",
105
+ humanReadableType: "Ethereum Transaction",
106
+ ethereumTransaction: ethereumCall
107
+ };
108
+ }
109
+ }
110
+ return {};
62
111
  }
63
112
  /**
64
- * Resolve a supply key for the given token using Mirror Node token supply_key._type when possible.
113
+ * Extract contract data from Transaction internal fields
114
+ * This handles cases where data is stored in Transaction object internals
65
115
  */
66
- async resolveSupplyKey(tokenId, keyInput, fallbackType, explicitType) {
116
+ static parseFromTransactionInternals(transaction) {
67
117
  try {
68
- const info = await this.mirror.getTokenInfo(tokenId);
69
- const t = info?.supply_key?._type || "";
70
- if (typeof keyInput !== "string") {
71
- return keyInput;
118
+ const tx = transaction;
119
+ if (tx._contractId && tx._gas) {
120
+ const contractCall = {
121
+ contractId: tx._contractId.toString(),
122
+ gas: typeof tx._gas === "number" ? tx._gas : Long.fromValue(tx._gas).toNumber(),
123
+ amount: tx._amount ? parseFloat(tx._amount.toString()) : 0
124
+ };
125
+ if (tx._functionParameters) {
126
+ const funcParams = Buffer.from(tx._functionParameters).toString(
127
+ "hex"
128
+ );
129
+ contractCall.functionParameters = funcParams;
130
+ contractCall.functionName = this.extractFunctionName(funcParams);
131
+ }
132
+ return {
133
+ type: "CONTRACTCALL",
134
+ humanReadableType: "Contract Call",
135
+ contractCall
136
+ };
72
137
  }
73
- if (explicitType) {
74
- return explicitType === "ed25519" ? PrivateKey.fromStringED25519(keyInput) : PrivateKey.fromStringECDSA(keyInput);
138
+ if (hasTransactionType(transaction, "contractCreateInstance")) {
139
+ const contractCreate = {
140
+ gas: tx._gas.toString(),
141
+ initialBalance: tx._initialBalance?.toString() || "0"
142
+ };
143
+ if (tx._fileId) {
144
+ contractCreate.initcodeSource = "fileID";
145
+ contractCreate.initcode = tx._fileId.toString();
146
+ } else if (tx._bytecode) {
147
+ contractCreate.initcodeSource = "bytes";
148
+ contractCreate.initcode = Buffer.from(tx._bytecode).toString("hex");
149
+ }
150
+ if (tx._constructorParameters) {
151
+ contractCreate.constructorParameters = Buffer.from(
152
+ tx._constructorParameters
153
+ ).toString("hex");
154
+ }
155
+ if (tx._memo) contractCreate.memo = tx._memo;
156
+ if (tx._adminKey) contractCreate.adminKey = parseKey(tx._adminKey);
157
+ if (tx._maxAutomaticTokenAssociations !== void 0) {
158
+ contractCreate.maxAutomaticTokenAssociations = tx._maxAutomaticTokenAssociations;
159
+ }
160
+ if (tx._stakedAccountId) {
161
+ contractCreate.stakedAccountId = tx._stakedAccountId.toString();
162
+ } else if (tx._stakedNodeId !== null && tx._stakedNodeId !== void 0) {
163
+ contractCreate.stakedNodeId = Long.fromValue(
164
+ tx._stakedNodeId
165
+ ).toString();
166
+ }
167
+ if (tx._declineReward !== void 0)
168
+ contractCreate.declineReward = tx._declineReward;
169
+ if (tx._autoRenewPeriod)
170
+ contractCreate.autoRenewPeriod = tx._autoRenewPeriod.toString();
171
+ return {
172
+ type: "CONTRACTCREATE",
173
+ humanReadableType: "Contract Create",
174
+ contractCreate
175
+ };
75
176
  }
76
- if (t.includes("ED25519")) {
77
- return PrivateKey.fromStringED25519(keyInput);
177
+ if (hasTransactionType(transaction, "contractUpdateInstance")) {
178
+ const contractUpdate = {
179
+ contractIdToUpdate: tx._contractId.toString()
180
+ };
181
+ if (tx._memo) contractUpdate.memo = tx._memo;
182
+ if (tx._adminKey) contractUpdate.adminKey = parseKey(tx._adminKey);
183
+ if (tx._maxAutomaticTokenAssociations !== void 0) {
184
+ contractUpdate.maxAutomaticTokenAssociations = tx._maxAutomaticTokenAssociations;
185
+ }
186
+ if (tx._stakedAccountId) {
187
+ contractUpdate.stakedAccountId = tx._stakedAccountId.toString();
188
+ } else if (tx._stakedNodeId !== null && tx._stakedNodeId !== void 0) {
189
+ contractUpdate.stakedNodeId = Long.fromValue(
190
+ tx._stakedNodeId
191
+ ).toString();
192
+ }
193
+ if (tx._declineReward !== void 0)
194
+ contractUpdate.declineReward = tx._declineReward;
195
+ if (tx._autoRenewPeriod)
196
+ contractUpdate.autoRenewPeriod = tx._autoRenewPeriod.toString();
197
+ return {
198
+ type: "CONTRACTUPDATE",
199
+ humanReadableType: "Contract Update",
200
+ contractUpdate
201
+ };
78
202
  }
79
- if (t.includes("ECDSA")) {
80
- return PrivateKey.fromStringECDSA(keyInput);
203
+ if (hasTransactionType(transaction, "contractDeleteInstance")) {
204
+ const contractDelete = {
205
+ contractIdToDelete: tx._contractId.toString()
206
+ };
207
+ if (tx._transferAccountId) {
208
+ contractDelete.transferAccountId = tx._transferAccountId.toString();
209
+ } else if (tx._transferContractId) {
210
+ contractDelete.transferContractId = tx._transferContractId.toString();
211
+ }
212
+ return {
213
+ type: "CONTRACTDELETE",
214
+ humanReadableType: "Contract Delete",
215
+ contractDelete
216
+ };
81
217
  }
82
- return fallbackType === "ed25519" ? PrivateKey.fromStringED25519(keyInput) : PrivateKey.fromStringECDSA(keyInput);
83
- } catch {
84
- if (typeof keyInput !== "string") {
85
- return keyInput;
86
- }
87
- if (explicitType) {
88
- return explicitType === "ed25519" ? PrivateKey.fromStringED25519(keyInput) : PrivateKey.fromStringECDSA(keyInput);
218
+ return {};
219
+ } catch (error) {
220
+ return {};
221
+ }
222
+ }
223
+ /**
224
+ * Enhanced function name extraction from contract call parameters
225
+ * Attempts to decode function selector and map to known function names
226
+ */
227
+ static extractFunctionName(functionParameters) {
228
+ if (functionParameters.length < 8) return "unknown";
229
+ const selector = functionParameters.substring(0, 8);
230
+ const commonSelectors = {
231
+ a9059cbb: "transfer",
232
+ "095ea7b3": "approve",
233
+ "23b872dd": "transferFrom",
234
+ "70a08231": "balanceOf",
235
+ dd62ed3e: "allowance",
236
+ "18160ddd": "totalSupply",
237
+ "06fdde03": "name",
238
+ "95d89b41": "symbol",
239
+ "313ce567": "decimals",
240
+ "42842e0e": "safeTransferFrom",
241
+ b88d4fde: "safeTransferFrom",
242
+ e985e9c5: "isApprovedForAll",
243
+ a22cb465: "setApprovalForAll",
244
+ "6352211e": "ownerOf",
245
+ c87b56dd: "tokenURI",
246
+ "01ffc9a7": "supportsInterface",
247
+ "40c10f19": "mint",
248
+ "42966c68": "burn",
249
+ f2fde38b: "transferOwnership",
250
+ "715018a6": "renounceOwnership",
251
+ "8da5cb5b": "owner"
252
+ };
253
+ return commonSelectors[selector] || selector;
254
+ }
255
+ /**
256
+ * Parse Ethereum Transaction (was completely missing from original parser)
257
+ */
258
+ static parseEthereumTransaction(body) {
259
+ if (!body) return void 0;
260
+ const data = {
261
+ contractId: "EVM",
262
+ gas: body.maxGasAllowance ? Long.fromValue(body.maxGasAllowance).toNumber() : 0,
263
+ amount: 0
264
+ };
265
+ if (body.ethereumData && body.ethereumData.length > 0) {
266
+ const ethData = Buffer.from(body.ethereumData).toString("hex");
267
+ data.functionParameters = ethData;
268
+ if (ethData.length >= 8) {
269
+ data.functionName = this.extractFunctionName(ethData);
89
270
  }
90
- return fallbackType === "ed25519" ? PrivateKey.fromStringED25519(keyInput) : PrivateKey.fromStringECDSA(keyInput);
91
271
  }
272
+ return data;
92
273
  }
93
- }
94
- function createNodeOperatorContext(params) {
95
- const operatorId = typeof params.operatorId === "string" ? AccountId.fromString(params.operatorId) : params.operatorId;
96
- const client = params.client ? params.client : params.network === "mainnet" ? Client.forMainnet() : Client.forTestnet();
97
- const resolver = new NodeOperatorResolver({
98
- mirrorNode: params.mirrorNode,
99
- logger: params.logger
100
- });
101
- let currentKeyType;
102
- let currentPrivateKey;
103
- const guess = resolver.bestGuessOperatorKey(
104
- params.operatorKey,
105
- params.keyType
106
- );
107
- currentKeyType = guess.keyType;
108
- currentPrivateKey = guess.privateKey;
109
- client.setOperator(operatorId.toString(), currentPrivateKey);
110
- const initPromise = (async () => {
111
- try {
112
- const resolved = await resolver.resolveOperatorKey(
113
- operatorId,
114
- params.operatorKey,
115
- params.keyType
274
+ static parseContractCall(body) {
275
+ if (!body) return void 0;
276
+ const hbarAmount = Hbar.fromTinybars(Long.fromValue(body.amount ?? 0));
277
+ const data = {
278
+ contractId: new ContractId(
279
+ body.contractID.shardNum ?? 0,
280
+ body.contractID.realmNum ?? 0,
281
+ body.contractID.contractNum ?? 0
282
+ ).toString(),
283
+ gas: Long.fromValue(body.gas ?? 0).toNumber(),
284
+ amount: parseFloat(hbarAmount.toString(HbarUnit.Hbar))
285
+ };
286
+ if (body.functionParameters) {
287
+ data.functionParameters = Buffer.from(body.functionParameters).toString(
288
+ "hex"
116
289
  );
117
- currentKeyType = resolved.keyType;
118
- currentPrivateKey = resolved.privateKey;
119
- client.setOperator(operatorId.toString(), currentPrivateKey);
120
- } catch {
121
- }
122
- })();
123
- return {
124
- client,
125
- operatorId,
126
- get operatorKey() {
127
- return currentPrivateKey;
128
- },
129
- get keyType() {
130
- return currentKeyType;
131
- },
132
- ensureInitialized: async () => {
133
- await initPromise;
134
- }
135
- };
290
+ if (data.functionParameters.length >= 8) {
291
+ data.functionName = this.extractFunctionName(data.functionParameters);
292
+ }
293
+ }
294
+ return data;
295
+ }
296
+ static parseContractCreate(body) {
297
+ if (!body) return void 0;
298
+ const data = {};
299
+ if (body.initialBalance) {
300
+ data.initialBalance = Hbar.fromTinybars(
301
+ Long.fromValue(body.initialBalance)
302
+ ).toString(HbarUnit.Hbar);
303
+ }
304
+ if (body.gas) {
305
+ data.gas = Long.fromValue(body.gas).toString();
306
+ }
307
+ if (body.adminKey) {
308
+ data.adminKey = parseKey(body.adminKey);
309
+ }
310
+ if (body.constructorParameters) {
311
+ data.constructorParameters = Buffer.from(
312
+ body.constructorParameters
313
+ ).toString("hex");
314
+ }
315
+ if (body.memo) {
316
+ data.memo = body.memo;
317
+ }
318
+ if (body.autoRenewPeriod?.seconds) {
319
+ data.autoRenewPeriod = Long.fromValue(
320
+ body.autoRenewPeriod.seconds
321
+ ).toString();
322
+ }
323
+ if (body.stakedAccountId) {
324
+ data.stakedAccountId = new AccountId(
325
+ body.stakedAccountId.shardNum ?? 0,
326
+ body.stakedAccountId.realmNum ?? 0,
327
+ body.stakedAccountId.accountNum ?? 0
328
+ ).toString();
329
+ } else if (body.stakedNodeId !== null && body.stakedNodeId !== void 0) {
330
+ data.stakedNodeId = Long.fromValue(body.stakedNodeId).toString();
331
+ }
332
+ if (body.declineReward !== void 0) {
333
+ data.declineReward = body.declineReward;
334
+ }
335
+ if (body.maxAutomaticTokenAssociations !== void 0) {
336
+ data.maxAutomaticTokenAssociations = body.maxAutomaticTokenAssociations;
337
+ }
338
+ if (body.fileID) {
339
+ data.initcodeSource = "fileID";
340
+ data.initcode = new FileId(
341
+ body.fileID.shardNum ?? 0,
342
+ body.fileID.realmNum ?? 0,
343
+ body.fileID.fileNum ?? 0
344
+ ).toString();
345
+ } else if (body.initcode && body.initcode.length > 0) {
346
+ data.initcodeSource = "bytes";
347
+ data.initcode = Buffer.from(body.initcode).toString("hex");
348
+ }
349
+ return data;
350
+ }
351
+ static parseContractUpdate(body) {
352
+ if (!body) return void 0;
353
+ const data = {};
354
+ if (body.contractID) {
355
+ data.contractIdToUpdate = new ContractId(
356
+ body.contractID.shardNum ?? 0,
357
+ body.contractID.realmNum ?? 0,
358
+ body.contractID.contractNum ?? 0
359
+ ).toString();
360
+ }
361
+ if (body.adminKey) {
362
+ data.adminKey = parseKey(body.adminKey);
363
+ }
364
+ if (body.expirationTime?.seconds) {
365
+ data.expirationTime = `${Long.fromValue(
366
+ body.expirationTime.seconds
367
+ ).toString()}.${body.expirationTime.nanos}`;
368
+ }
369
+ if (body.autoRenewPeriod?.seconds) {
370
+ data.autoRenewPeriod = Long.fromValue(
371
+ body.autoRenewPeriod.seconds
372
+ ).toString();
373
+ }
374
+ if (body.memo) {
375
+ const memoUnion = body.memo;
376
+ if (memoUnion && typeof memoUnion === "object" && Object.prototype.hasOwnProperty.call(memoUnion, "value")) {
377
+ const value = memoUnion.value;
378
+ if (value === null || value === void 0) {
379
+ data.memo = void 0;
380
+ } else {
381
+ data.memo = String(value);
382
+ }
383
+ } else if (typeof memoUnion === "string") {
384
+ data.memo = memoUnion;
385
+ } else {
386
+ data.memo = void 0;
387
+ }
388
+ } else {
389
+ data.memo = void 0;
390
+ }
391
+ if (body.stakedAccountId) {
392
+ data.stakedAccountId = new AccountId(
393
+ body.stakedAccountId.shardNum ?? 0,
394
+ body.stakedAccountId.realmNum ?? 0,
395
+ body.stakedAccountId.accountNum ?? 0
396
+ ).toString();
397
+ data.stakedNodeId = void 0;
398
+ } else if (body.stakedNodeId !== null && body.stakedNodeId !== void 0 && Long.fromValue(body.stakedNodeId).notEquals(-1)) {
399
+ data.stakedNodeId = Long.fromValue(body.stakedNodeId).toString();
400
+ data.stakedAccountId = void 0;
401
+ } else {
402
+ data.stakedNodeId = void 0;
403
+ data.stakedAccountId = void 0;
404
+ }
405
+ if (body.declineReward?.value !== void 0) {
406
+ data.declineReward = body.declineReward.value;
407
+ }
408
+ if (body.maxAutomaticTokenAssociations?.value !== void 0) {
409
+ data.maxAutomaticTokenAssociations = body.maxAutomaticTokenAssociations.value;
410
+ }
411
+ if (body.autoRenewAccountId) {
412
+ data.autoRenewAccountId = new AccountId(
413
+ body.autoRenewAccountId.shardNum ?? 0,
414
+ body.autoRenewAccountId.realmNum ?? 0,
415
+ body.autoRenewAccountId.accountNum ?? 0
416
+ ).toString();
417
+ }
418
+ return data;
419
+ }
420
+ static parseContractDelete(body) {
421
+ if (!body) return void 0;
422
+ const data = {};
423
+ if (body.contractID) {
424
+ data.contractIdToDelete = new ContractId(
425
+ body.contractID.shardNum ?? 0,
426
+ body.contractID.realmNum ?? 0,
427
+ body.contractID.contractNum ?? 0
428
+ ).toString();
429
+ }
430
+ if (body.transferAccountID) {
431
+ data.transferAccountId = new AccountId(
432
+ body.transferAccountID.shardNum ?? 0,
433
+ body.transferAccountID.realmNum ?? 0,
434
+ body.transferAccountID.accountNum ?? 0
435
+ ).toString();
436
+ } else if (body.transferContractID) {
437
+ data.transferContractId = new ContractId(
438
+ body.transferContractID.shardNum ?? 0,
439
+ body.transferContractID.realmNum ?? 0,
440
+ body.transferContractID.contractNum ?? 0
441
+ ).toString();
442
+ }
443
+ return data;
444
+ }
445
+ /**
446
+ * Parse SCS (Smart Contract Service) transaction from Transaction object
447
+ * This is the unified entry point that delegates to the comprehensive parsing logic
448
+ */
449
+ static parseFromTransactionObject(transaction) {
450
+ return this.parseSCSTransaction(transaction);
451
+ }
136
452
  }
137
453
  export {
138
- NodeOperatorResolver,
139
- createNodeOperatorContext
454
+ SCSParser
140
455
  };
141
456
  //# sourceMappingURL=standards-sdk.es149.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"standards-sdk.es149.js","sources":["../../src/common/node-operator-resolver.ts"],"sourcesContent":["import { AccountId, Client, PrivateKey } from '@hashgraph/sdk';\nimport { HederaMirrorNode } from '../services/mirror-node';\nimport { ILogger } from '../utils/logger';\nimport { detectKeyTypeFromString } from '../utils/key-type-detector';\nimport { NetworkType } from '../utils/types';\n\n/**\n * Resolves operator and supply private keys using Mirror Node as source of truth\n * with format-detection fallbacks for string keys.\n */\nexport class NodeOperatorResolver {\n private readonly mirror: HederaMirrorNode;\n private readonly logger: ILogger;\n\n constructor(params: { mirrorNode: HederaMirrorNode; logger: ILogger }) {\n this.mirror = params.mirrorNode;\n this.logger = params.logger;\n }\n\n /**\n * Best-guess parsing for an operator key without network calls.\n * - If PrivateKey: returns immediately with provided or fallback type.\n * - If string with explicitType: parse directly.\n * - If string without type: detect format; fallback to ECDSA.\n */\n bestGuessOperatorKey(\n operatorKeyInput: string | PrivateKey,\n explicitType?: 'ed25519' | 'ecdsa',\n ): { keyType: 'ed25519' | 'ecdsa'; privateKey: PrivateKey } {\n if (typeof operatorKeyInput !== 'string') {\n return { keyType: explicitType || 'ecdsa', privateKey: operatorKeyInput };\n }\n if (explicitType) {\n const pk =\n explicitType === 'ed25519'\n ? PrivateKey.fromStringED25519(operatorKeyInput)\n : PrivateKey.fromStringECDSA(operatorKeyInput);\n return { keyType: explicitType, privateKey: pk };\n }\n try {\n const detected = detectKeyTypeFromString(operatorKeyInput);\n return {\n keyType: detected.detectedType,\n privateKey: detected.privateKey,\n };\n } catch {\n return {\n keyType: 'ecdsa',\n privateKey: PrivateKey.fromStringECDSA(operatorKeyInput),\n };\n }\n }\n\n /**\n * Resolve an operator key using Mirror Node for key type when possible.\n * - If PrivateKey: return immediately.\n * - If explicitType: parse directly.\n * - Else: query Mirror Node; fallback to local detection.\n */\n async resolveOperatorKey(\n operatorId: string | AccountId,\n operatorKeyInput: string | PrivateKey,\n explicitType?: 'ed25519' | 'ecdsa',\n ): Promise<{ keyType: 'ed25519' | 'ecdsa'; privateKey: PrivateKey }> {\n if (typeof operatorKeyInput !== 'string') {\n return { keyType: explicitType || 'ecdsa', privateKey: operatorKeyInput };\n }\n if (explicitType) {\n const pk =\n explicitType === 'ed25519'\n ? PrivateKey.fromStringED25519(operatorKeyInput)\n : PrivateKey.fromStringECDSA(operatorKeyInput);\n return { keyType: explicitType, privateKey: pk };\n }\n const account =\n typeof operatorId === 'string' ? operatorId : operatorId.toString();\n try {\n const info = await this.mirror.requestAccount(account);\n const t = info?.key?._type || '';\n const keyType: 'ed25519' | 'ecdsa' = t.includes('ED25519')\n ? 'ed25519'\n : 'ecdsa';\n const privateKey =\n keyType === 'ed25519'\n ? PrivateKey.fromStringED25519(operatorKeyInput)\n : PrivateKey.fromStringECDSA(operatorKeyInput);\n return { keyType, privateKey };\n } catch {\n this.logger.warn(\n 'Mirror node key detection failed; using local detection or default ECDSA',\n );\n return this.bestGuessOperatorKey(operatorKeyInput);\n }\n }\n\n /**\n * Resolve a supply key for the given token using Mirror Node token supply_key._type when possible.\n */\n async resolveSupplyKey(\n tokenId: string,\n keyInput: string | PrivateKey,\n fallbackType: 'ed25519' | 'ecdsa',\n explicitType?: 'ed25519' | 'ecdsa',\n ): Promise<PrivateKey> {\n try {\n const info = await this.mirror.getTokenInfo(tokenId);\n const t = info?.supply_key?._type || '';\n if (typeof keyInput !== 'string') {\n return keyInput;\n }\n if (explicitType) {\n return explicitType === 'ed25519'\n ? PrivateKey.fromStringED25519(keyInput)\n : PrivateKey.fromStringECDSA(keyInput);\n }\n if (t.includes('ED25519')) {\n return PrivateKey.fromStringED25519(keyInput);\n }\n if (t.includes('ECDSA')) {\n return PrivateKey.fromStringECDSA(keyInput);\n }\n return fallbackType === 'ed25519'\n ? PrivateKey.fromStringED25519(keyInput)\n : PrivateKey.fromStringECDSA(keyInput);\n } catch {\n if (typeof keyInput !== 'string') {\n return keyInput;\n }\n if (explicitType) {\n return explicitType === 'ed25519'\n ? PrivateKey.fromStringED25519(keyInput)\n : PrivateKey.fromStringECDSA(keyInput);\n }\n return fallbackType === 'ed25519'\n ? PrivateKey.fromStringED25519(keyInput)\n : PrivateKey.fromStringECDSA(keyInput);\n }\n }\n}\n\nexport interface NodeOperatorInitParams {\n network: NetworkType;\n operatorId: string | AccountId;\n operatorKey: string | PrivateKey;\n keyType?: 'ed25519' | 'ecdsa';\n mirrorNode: HederaMirrorNode;\n logger: ILogger;\n client?: Client;\n}\n\nexport interface NodeOperatorContext {\n client: Client;\n operatorId: AccountId;\n readonly operatorKey: PrivateKey;\n readonly keyType: 'ed25519' | 'ecdsa';\n ensureInitialized(): Promise<void>;\n}\n\nexport function createNodeOperatorContext(\n params: NodeOperatorInitParams,\n): NodeOperatorContext {\n const operatorId: AccountId =\n typeof params.operatorId === 'string'\n ? AccountId.fromString(params.operatorId)\n : params.operatorId;\n\n const client: Client = params.client\n ? params.client\n : params.network === 'mainnet'\n ? Client.forMainnet()\n : Client.forTestnet();\n\n const resolver = new NodeOperatorResolver({\n mirrorNode: params.mirrorNode,\n logger: params.logger,\n });\n\n let currentKeyType: 'ed25519' | 'ecdsa';\n let currentPrivateKey: PrivateKey;\n\n const guess = resolver.bestGuessOperatorKey(\n params.operatorKey,\n params.keyType,\n );\n currentKeyType = guess.keyType;\n currentPrivateKey = guess.privateKey;\n client.setOperator(operatorId.toString(), currentPrivateKey);\n\n const initPromise = (async () => {\n try {\n const resolved = await resolver.resolveOperatorKey(\n operatorId,\n params.operatorKey,\n params.keyType,\n );\n currentKeyType = resolved.keyType;\n currentPrivateKey = resolved.privateKey;\n client.setOperator(operatorId.toString(), currentPrivateKey);\n } catch {}\n })();\n\n return {\n client,\n operatorId,\n get operatorKey() {\n return currentPrivateKey;\n },\n get keyType() {\n return currentKeyType;\n },\n ensureInitialized: async () => {\n await initPromise;\n },\n };\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"standards-sdk.es149.js","sources":["../../src/utils/parsers/scs-parser.ts"],"sourcesContent":["import { proto } from '@hashgraph/proto';\nimport { ContractId, Hbar, HbarUnit, Long, Transaction } from '@hashgraph/sdk';\nimport {\n ContractCallData,\n ContractCreateData,\n ContractUpdateData,\n ContractDeleteData,\n} from '../transaction-parser-types';\nimport { Buffer } from 'buffer';\nimport {\n parseKey,\n extractTransactionBody,\n hasTransactionType,\n} from './parser-utils';\nimport { AccountId, FileId } from '@hashgraph/sdk';\n\n/**\n * Smart Contract Service (SCS) Parser\n *\n * Handles parsing for all contract-related transaction types including:\n * - Contract calls (including EthereumTransaction)\n * - Contract creation, updates, and deletion\n * - Proper dual-branch parsing (regular vs signed transactions)\n * - Comprehensive protobuf extraction\n */\nexport class SCSParser {\n /**\n * Parse Smart Contract Service transaction using unified dual-branch approach\n * This handles both regular transactions and signed transaction variants\n */\n static parseSCSTransaction(\n transaction: Transaction,\n originalBytes?: Uint8Array,\n ): {\n type?: string;\n humanReadableType?: string;\n contractCall?: ContractCallData;\n contractCreate?: ContractCreateData;\n contractUpdate?: ContractUpdateData;\n contractDelete?: ContractDeleteData;\n [key: string]: unknown;\n } {\n try {\n if (originalBytes || transaction.toBytes) {\n try {\n const bytesToParse = originalBytes || transaction.toBytes();\n const decoded = proto.TransactionList.decode(bytesToParse);\n\n if (decoded.transactionList && decoded.transactionList.length > 0) {\n const tx = decoded.transactionList[0];\n let txBody: proto.ITransactionBody | null = null;\n\n if (tx.bodyBytes && tx.bodyBytes.length > 0) {\n txBody = proto.TransactionBody.decode(tx.bodyBytes);\n } else if (\n tx.signedTransactionBytes &&\n tx.signedTransactionBytes.length > 0\n ) {\n const signedTx = proto.SignedTransaction.decode(\n tx.signedTransactionBytes,\n );\n if (signedTx.bodyBytes) {\n txBody = proto.TransactionBody.decode(signedTx.bodyBytes);\n }\n }\n\n if (txBody) {\n const protoResult = this.parseFromProtobufTxBody(txBody);\n if (protoResult.type && protoResult.type !== 'UNKNOWN') {\n return protoResult;\n }\n }\n }\n } catch (protoError) {}\n }\n\n return this.parseFromTransactionInternals(transaction);\n } catch (error) {\n return {\n type: 'UNKNOWN',\n humanReadableType: 'Unknown Contract Transaction',\n };\n }\n }\n\n /**\n * Parse contract transaction from protobuf TransactionBody\n * Handles all contract operations from decoded protobuf data\n */\n private static parseFromProtobufTxBody(txBody: proto.ITransactionBody): {\n type?: string;\n humanReadableType?: string;\n [key: string]: unknown;\n } {\n if (txBody.contractCall) {\n const contractCall = this.parseContractCall(txBody.contractCall);\n if (contractCall) {\n return {\n type: 'CONTRACTCALL',\n humanReadableType: 'Contract Call',\n contractCall,\n };\n }\n }\n\n if (txBody.contractCreateInstance) {\n const contractCreate = this.parseContractCreate(\n txBody.contractCreateInstance,\n );\n if (contractCreate) {\n return {\n type: 'CONTRACTCREATE',\n humanReadableType: 'Contract Create',\n contractCreate,\n };\n }\n }\n\n if (txBody.contractUpdateInstance) {\n const contractUpdate = this.parseContractUpdate(\n txBody.contractUpdateInstance,\n );\n if (contractUpdate) {\n return {\n type: 'CONTRACTUPDATE',\n humanReadableType: 'Contract Update',\n contractUpdate,\n };\n }\n }\n\n if (txBody.contractDeleteInstance) {\n const contractDelete = this.parseContractDelete(\n txBody.contractDeleteInstance,\n );\n if (contractDelete) {\n return {\n type: 'CONTRACTDELETE',\n humanReadableType: 'Contract Delete',\n contractDelete,\n };\n }\n }\n\n if (txBody.ethereumTransaction) {\n const ethereumCall = this.parseEthereumTransaction(\n txBody.ethereumTransaction,\n );\n if (ethereumCall) {\n return {\n type: 'ETHEREUMTRANSACTION',\n humanReadableType: 'Ethereum Transaction',\n ethereumTransaction: ethereumCall,\n };\n }\n }\n\n return {};\n }\n\n /**\n * Extract contract data from Transaction internal fields\n * This handles cases where data is stored in Transaction object internals\n */\n private static parseFromTransactionInternals(transaction: Transaction): {\n type?: string;\n humanReadableType?: string;\n [key: string]: unknown;\n } {\n try {\n const tx = transaction as unknown as {\n _contractId?: { toString(): string };\n _gas?: number | Long;\n _amount?: { toString(): string };\n _functionParameters?: Uint8Array;\n _initialBalance?: { toString(): string };\n _adminKey?: unknown;\n _memo?: string;\n _fileId?: { toString(): string };\n _bytecode?: Uint8Array;\n _constructorParameters?: Uint8Array;\n _maxAutomaticTokenAssociations?: number;\n _stakedAccountId?: { toString(): string };\n _stakedNodeId?: number | Long;\n _declineReward?: boolean;\n _autoRenewPeriod?: { toString(): string };\n _transferAccountId?: { toString(): string };\n _transferContractId?: { toString(): string };\n constructor?: { name?: string };\n };\n\n if (tx._contractId && tx._gas) {\n const contractCall: ContractCallData = {\n contractId: tx._contractId.toString(),\n gas:\n typeof tx._gas === 'number'\n ? tx._gas\n : Long.fromValue(tx._gas).toNumber(),\n amount: tx._amount ? parseFloat(tx._amount.toString()) : 0,\n };\n\n if (tx._functionParameters) {\n const funcParams = Buffer.from(tx._functionParameters).toString(\n 'hex',\n );\n contractCall.functionParameters = funcParams;\n contractCall.functionName = this.extractFunctionName(funcParams);\n }\n\n return {\n type: 'CONTRACTCALL',\n humanReadableType: 'Contract Call',\n contractCall,\n };\n }\n\n if (hasTransactionType(transaction, 'contractCreateInstance')) {\n const contractCreate: ContractCreateData = {\n gas: tx._gas.toString(),\n initialBalance: tx._initialBalance?.toString() || '0',\n };\n\n if (tx._fileId) {\n contractCreate.initcodeSource = 'fileID';\n contractCreate.initcode = tx._fileId.toString();\n } else if (tx._bytecode) {\n contractCreate.initcodeSource = 'bytes';\n contractCreate.initcode = Buffer.from(tx._bytecode).toString('hex');\n }\n\n if (tx._constructorParameters) {\n contractCreate.constructorParameters = Buffer.from(\n tx._constructorParameters,\n ).toString('hex');\n }\n\n if (tx._memo) contractCreate.memo = tx._memo;\n if (tx._adminKey) contractCreate.adminKey = parseKey(tx._adminKey);\n if (tx._maxAutomaticTokenAssociations !== undefined) {\n contractCreate.maxAutomaticTokenAssociations =\n tx._maxAutomaticTokenAssociations;\n }\n if (tx._stakedAccountId) {\n contractCreate.stakedAccountId = tx._stakedAccountId.toString();\n } else if (\n tx._stakedNodeId !== null &&\n tx._stakedNodeId !== undefined\n ) {\n contractCreate.stakedNodeId = Long.fromValue(\n tx._stakedNodeId,\n ).toString();\n }\n if (tx._declineReward !== undefined)\n contractCreate.declineReward = tx._declineReward;\n if (tx._autoRenewPeriod)\n contractCreate.autoRenewPeriod = tx._autoRenewPeriod.toString();\n\n return {\n type: 'CONTRACTCREATE',\n humanReadableType: 'Contract Create',\n contractCreate,\n };\n }\n\n if (hasTransactionType(transaction, 'contractUpdateInstance')) {\n const contractUpdate: ContractUpdateData = {\n contractIdToUpdate: tx._contractId.toString(),\n };\n\n if (tx._memo) contractUpdate.memo = tx._memo;\n if (tx._adminKey) contractUpdate.adminKey = parseKey(tx._adminKey);\n if (tx._maxAutomaticTokenAssociations !== undefined) {\n contractUpdate.maxAutomaticTokenAssociations =\n tx._maxAutomaticTokenAssociations;\n }\n if (tx._stakedAccountId) {\n contractUpdate.stakedAccountId = tx._stakedAccountId.toString();\n } else if (\n tx._stakedNodeId !== null &&\n tx._stakedNodeId !== undefined\n ) {\n contractUpdate.stakedNodeId = Long.fromValue(\n tx._stakedNodeId,\n ).toString();\n }\n if (tx._declineReward !== undefined)\n contractUpdate.declineReward = tx._declineReward;\n if (tx._autoRenewPeriod)\n contractUpdate.autoRenewPeriod = tx._autoRenewPeriod.toString();\n\n return {\n type: 'CONTRACTUPDATE',\n humanReadableType: 'Contract Update',\n contractUpdate,\n };\n }\n\n if (hasTransactionType(transaction, 'contractDeleteInstance')) {\n const contractDelete: ContractDeleteData = {\n contractIdToDelete: tx._contractId.toString(),\n };\n\n if (tx._transferAccountId) {\n contractDelete.transferAccountId = tx._transferAccountId.toString();\n } else if (tx._transferContractId) {\n contractDelete.transferContractId = tx._transferContractId.toString();\n }\n\n return {\n type: 'CONTRACTDELETE',\n humanReadableType: 'Contract Delete',\n contractDelete,\n };\n }\n\n return {};\n } catch (error) {\n return {};\n }\n }\n\n /**\n * Enhanced function name extraction from contract call parameters\n * Attempts to decode function selector and map to known function names\n */\n private static extractFunctionName(functionParameters: string): string {\n if (functionParameters.length < 8) return 'unknown';\n\n const selector = functionParameters.substring(0, 8);\n\n const commonSelectors: Record<string, string> = {\n a9059cbb: 'transfer',\n '095ea7b3': 'approve',\n '23b872dd': 'transferFrom',\n '70a08231': 'balanceOf',\n dd62ed3e: 'allowance',\n '18160ddd': 'totalSupply',\n '06fdde03': 'name',\n '95d89b41': 'symbol',\n '313ce567': 'decimals',\n '42842e0e': 'safeTransferFrom',\n b88d4fde: 'safeTransferFrom',\n e985e9c5: 'isApprovedForAll',\n a22cb465: 'setApprovalForAll',\n '6352211e': 'ownerOf',\n c87b56dd: 'tokenURI',\n '01ffc9a7': 'supportsInterface',\n '40c10f19': 'mint',\n '42966c68': 'burn',\n f2fde38b: 'transferOwnership',\n '715018a6': 'renounceOwnership',\n '8da5cb5b': 'owner',\n };\n\n return commonSelectors[selector] || selector;\n }\n\n /**\n * Parse Ethereum Transaction (was completely missing from original parser)\n */\n static parseEthereumTransaction(\n body: proto.IEthereumTransactionBody,\n ): ContractCallData | undefined {\n if (!body) return undefined;\n\n const data: ContractCallData = {\n contractId: 'EVM',\n gas: body.maxGasAllowance\n ? Long.fromValue(body.maxGasAllowance).toNumber()\n : 0,\n amount: 0,\n };\n\n if (body.ethereumData && body.ethereumData.length > 0) {\n const ethData = Buffer.from(body.ethereumData).toString('hex');\n data.functionParameters = ethData;\n\n if (ethData.length >= 8) {\n data.functionName = this.extractFunctionName(ethData);\n }\n }\n\n return data;\n }\n\n static parseContractCall(\n body: proto.IContractCallTransactionBody,\n ): ContractCallData | undefined {\n if (!body) return undefined;\n const hbarAmount = Hbar.fromTinybars(Long.fromValue(body.amount ?? 0));\n const data: ContractCallData = {\n contractId: new ContractId(\n body.contractID!.shardNum ?? 0,\n body.contractID!.realmNum ?? 0,\n body.contractID!.contractNum ?? 0,\n ).toString(),\n gas: Long.fromValue(body.gas ?? 0).toNumber(),\n amount: parseFloat(hbarAmount.toString(HbarUnit.Hbar)),\n };\n if (body.functionParameters) {\n data.functionParameters = Buffer.from(body.functionParameters).toString(\n 'hex',\n );\n if (data.functionParameters.length >= 8) {\n data.functionName = this.extractFunctionName(data.functionParameters);\n }\n }\n return data;\n }\n\n static parseContractCreate(\n body: proto.IContractCreateTransactionBody,\n ): ContractCreateData | undefined {\n if (!body) return undefined;\n const data: ContractCreateData = {};\n if (body.initialBalance) {\n data.initialBalance = Hbar.fromTinybars(\n Long.fromValue(body.initialBalance),\n ).toString(HbarUnit.Hbar);\n }\n if (body.gas) {\n data.gas = Long.fromValue(body.gas).toString();\n }\n if (body.adminKey) {\n data.adminKey = parseKey(body.adminKey);\n }\n if (body.constructorParameters) {\n data.constructorParameters = Buffer.from(\n body.constructorParameters,\n ).toString('hex');\n }\n if (body.memo) {\n data.memo = body.memo;\n }\n if (body.autoRenewPeriod?.seconds) {\n data.autoRenewPeriod = Long.fromValue(\n body.autoRenewPeriod.seconds,\n ).toString();\n }\n if (body.stakedAccountId) {\n data.stakedAccountId = new AccountId(\n body.stakedAccountId.shardNum ?? 0,\n body.stakedAccountId.realmNum ?? 0,\n body.stakedAccountId.accountNum ?? 0,\n ).toString();\n } else if (body.stakedNodeId !== null && body.stakedNodeId !== undefined) {\n data.stakedNodeId = Long.fromValue(body.stakedNodeId).toString();\n }\n if (body.declineReward !== undefined) {\n data.declineReward = body.declineReward;\n }\n if (body.maxAutomaticTokenAssociations !== undefined) {\n data.maxAutomaticTokenAssociations = body.maxAutomaticTokenAssociations;\n }\n if (body.fileID) {\n data.initcodeSource = 'fileID';\n data.initcode = new FileId(\n body.fileID.shardNum ?? 0,\n body.fileID.realmNum ?? 0,\n body.fileID.fileNum ?? 0,\n ).toString();\n } else if (body.initcode && body.initcode.length > 0) {\n data.initcodeSource = 'bytes';\n data.initcode = Buffer.from(body.initcode).toString('hex');\n }\n return data;\n }\n\n static parseContractUpdate(\n body: proto.IContractUpdateTransactionBody,\n ): ContractUpdateData | undefined {\n if (!body) return undefined;\n const data: ContractUpdateData = {};\n if (body.contractID) {\n data.contractIdToUpdate = new ContractId(\n body.contractID.shardNum ?? 0,\n body.contractID.realmNum ?? 0,\n body.contractID.contractNum ?? 0,\n ).toString();\n }\n if (body.adminKey) {\n data.adminKey = parseKey(body.adminKey);\n }\n if (body.expirationTime?.seconds) {\n data.expirationTime = `${Long.fromValue(\n body.expirationTime.seconds,\n ).toString()}.${body.expirationTime.nanos}`;\n }\n if (body.autoRenewPeriod?.seconds) {\n data.autoRenewPeriod = Long.fromValue(\n body.autoRenewPeriod.seconds,\n ).toString();\n }\n\n if (body.memo) {\n const memoUnion = body.memo as unknown;\n if (\n memoUnion &&\n typeof memoUnion === 'object' &&\n Object.prototype.hasOwnProperty.call(memoUnion, 'value')\n ) {\n const value = (memoUnion as { value: unknown }).value;\n if (value === null || value === undefined) {\n data.memo = undefined;\n } else {\n data.memo = String(value);\n }\n } else if (typeof memoUnion === 'string') {\n data.memo = memoUnion;\n } else {\n data.memo = undefined;\n }\n } else {\n data.memo = undefined;\n }\n\n if (body.stakedAccountId) {\n data.stakedAccountId = new AccountId(\n body.stakedAccountId.shardNum ?? 0,\n body.stakedAccountId.realmNum ?? 0,\n body.stakedAccountId.accountNum ?? 0,\n ).toString();\n data.stakedNodeId = undefined;\n } else if (\n body.stakedNodeId !== null &&\n body.stakedNodeId !== undefined &&\n Long.fromValue(body.stakedNodeId).notEquals(-1)\n ) {\n data.stakedNodeId = Long.fromValue(body.stakedNodeId).toString();\n data.stakedAccountId = undefined;\n } else {\n data.stakedNodeId = undefined;\n data.stakedAccountId = undefined;\n }\n if (body.declineReward?.value !== undefined) {\n data.declineReward = body.declineReward.value;\n }\n if (body.maxAutomaticTokenAssociations?.value !== undefined) {\n data.maxAutomaticTokenAssociations =\n body.maxAutomaticTokenAssociations.value;\n }\n if (body.autoRenewAccountId) {\n data.autoRenewAccountId = new AccountId(\n body.autoRenewAccountId.shardNum ?? 0,\n body.autoRenewAccountId.realmNum ?? 0,\n body.autoRenewAccountId.accountNum ?? 0,\n ).toString();\n }\n return data;\n }\n\n static parseContractDelete(\n body: proto.IContractDeleteTransactionBody,\n ): ContractDeleteData | undefined {\n if (!body) return undefined;\n const data: ContractDeleteData = {};\n if (body.contractID) {\n data.contractIdToDelete = new ContractId(\n body.contractID.shardNum ?? 0,\n body.contractID.realmNum ?? 0,\n body.contractID.contractNum ?? 0,\n ).toString();\n }\n if (body.transferAccountID) {\n data.transferAccountId = new AccountId(\n body.transferAccountID.shardNum ?? 0,\n body.transferAccountID.realmNum ?? 0,\n body.transferAccountID.accountNum ?? 0,\n ).toString();\n } else if (body.transferContractID) {\n data.transferContractId = new ContractId(\n body.transferContractID.shardNum ?? 0,\n body.transferContractID.realmNum ?? 0,\n body.transferContractID.contractNum ?? 0,\n ).toString();\n }\n return data;\n }\n\n /**\n * Parse SCS (Smart Contract Service) transaction from Transaction object\n * This is the unified entry point that delegates to the comprehensive parsing logic\n */\n static parseFromTransactionObject(transaction: Transaction): {\n type?: string;\n humanReadableType?: string;\n [key: string]: unknown;\n } {\n return this.parseSCSTransaction(transaction);\n }\n}\n"],"names":[],"mappings":"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"}