@hashgraphonline/standards-sdk 0.1.157 → 0.1.158

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 (263) hide show
  1. package/dist/cjs/hcs-12/validation/schemas.d.ts +2 -2
  2. package/dist/cjs/hcs-17/types.d.ts +4 -4
  3. package/dist/cjs/hcs-2/types.d.ts +20 -20
  4. package/dist/cjs/hcs-20/types.d.ts +8 -8
  5. package/dist/cjs/hcs-26/base-client.d.ts +83 -0
  6. package/dist/cjs/hcs-26/base-client.d.ts.map +1 -0
  7. package/dist/cjs/hcs-26/browser.d.ts +11 -0
  8. package/dist/cjs/hcs-26/browser.d.ts.map +1 -0
  9. package/dist/cjs/hcs-26/index.d.ts +7 -0
  10. package/dist/cjs/hcs-26/index.d.ts.map +1 -0
  11. package/dist/cjs/hcs-26/memos.d.ts +28 -0
  12. package/dist/cjs/hcs-26/memos.d.ts.map +1 -0
  13. package/dist/cjs/hcs-26/resolver.d.ts +60 -0
  14. package/dist/cjs/hcs-26/resolver.d.ts.map +1 -0
  15. package/dist/cjs/hcs-26/sdk.d.ts +10 -0
  16. package/dist/cjs/hcs-26/sdk.d.ts.map +1 -0
  17. package/dist/cjs/hcs-26/types.d.ts +2752 -0
  18. package/dist/cjs/hcs-26/types.d.ts.map +1 -0
  19. package/dist/cjs/index.d.ts +1 -0
  20. package/dist/cjs/index.d.ts.map +1 -1
  21. package/dist/cjs/inscribe/inscriber.d.ts.map +1 -1
  22. package/dist/cjs/services/registry-broker/client/base-client.d.ts +19 -1
  23. package/dist/cjs/services/registry-broker/client/base-client.d.ts.map +1 -1
  24. package/dist/cjs/services/registry-broker/client/skills.d.ts +20 -1
  25. package/dist/cjs/services/registry-broker/client/skills.d.ts.map +1 -1
  26. package/dist/cjs/services/registry-broker/schemas.d.ts +2515 -86
  27. package/dist/cjs/services/registry-broker/schemas.d.ts.map +1 -1
  28. package/dist/cjs/services/registry-broker/types.d.ts +21 -3
  29. package/dist/cjs/services/registry-broker/types.d.ts.map +1 -1
  30. package/dist/cjs/services/types.d.ts +2 -1
  31. package/dist/cjs/services/types.d.ts.map +1 -1
  32. package/dist/cjs/standards-sdk.cjs +2 -2
  33. package/dist/cjs/standards-sdk.cjs.map +1 -1
  34. package/dist/cjs/utils/crypto-abstraction.d.ts.map +1 -1
  35. package/dist/es/hcs-12/validation/schemas.d.ts +2 -2
  36. package/dist/es/hcs-17/types.d.ts +4 -4
  37. package/dist/es/hcs-2/types.d.ts +20 -20
  38. package/dist/es/hcs-20/types.d.ts +8 -8
  39. package/dist/es/hcs-26/base-client.d.ts +83 -0
  40. package/dist/es/hcs-26/base-client.d.ts.map +1 -0
  41. package/dist/es/hcs-26/browser.d.ts +11 -0
  42. package/dist/es/hcs-26/browser.d.ts.map +1 -0
  43. package/dist/es/hcs-26/index.d.ts +7 -0
  44. package/dist/es/hcs-26/index.d.ts.map +1 -0
  45. package/dist/es/hcs-26/memos.d.ts +28 -0
  46. package/dist/es/hcs-26/memos.d.ts.map +1 -0
  47. package/dist/es/hcs-26/resolver.d.ts +60 -0
  48. package/dist/es/hcs-26/resolver.d.ts.map +1 -0
  49. package/dist/es/hcs-26/sdk.d.ts +10 -0
  50. package/dist/es/hcs-26/sdk.d.ts.map +1 -0
  51. package/dist/es/hcs-26/types.d.ts +2752 -0
  52. package/dist/es/hcs-26/types.d.ts.map +1 -0
  53. package/dist/es/index.d.ts +1 -0
  54. package/dist/es/index.d.ts.map +1 -1
  55. package/dist/es/inscribe/inscriber.d.ts.map +1 -1
  56. package/dist/es/services/registry-broker/client/base-client.d.ts +19 -1
  57. package/dist/es/services/registry-broker/client/base-client.d.ts.map +1 -1
  58. package/dist/es/services/registry-broker/client/skills.d.ts +20 -1
  59. package/dist/es/services/registry-broker/client/skills.d.ts.map +1 -1
  60. package/dist/es/services/registry-broker/schemas.d.ts +2515 -86
  61. package/dist/es/services/registry-broker/schemas.d.ts.map +1 -1
  62. package/dist/es/services/registry-broker/types.d.ts +21 -3
  63. package/dist/es/services/registry-broker/types.d.ts.map +1 -1
  64. package/dist/es/services/types.d.ts +2 -1
  65. package/dist/es/services/types.d.ts.map +1 -1
  66. package/dist/es/standards-sdk.es.js +70 -32
  67. package/dist/es/standards-sdk.es.js.map +1 -1
  68. package/dist/es/standards-sdk.es101.js +2 -2
  69. package/dist/es/standards-sdk.es103.js +1 -1
  70. package/dist/es/standards-sdk.es104.js +2 -2
  71. package/dist/es/standards-sdk.es105.js +247 -137
  72. package/dist/es/standards-sdk.es105.js.map +1 -1
  73. package/dist/es/standards-sdk.es106.js +477 -28
  74. package/dist/es/standards-sdk.es106.js.map +1 -1
  75. package/dist/es/standards-sdk.es107.js +103 -20
  76. package/dist/es/standards-sdk.es107.js.map +1 -1
  77. package/dist/es/standards-sdk.es108.js +141 -141
  78. package/dist/es/standards-sdk.es108.js.map +1 -1
  79. package/dist/es/standards-sdk.es109.js +31 -200
  80. package/dist/es/standards-sdk.es109.js.map +1 -1
  81. package/dist/es/standards-sdk.es11.js +1 -1
  82. package/dist/es/standards-sdk.es110.js +9 -787
  83. package/dist/es/standards-sdk.es110.js.map +1 -1
  84. package/dist/es/standards-sdk.es111.js +140 -11
  85. package/dist/es/standards-sdk.es111.js.map +1 -1
  86. package/dist/es/standards-sdk.es112.js +29 -567
  87. package/dist/es/standards-sdk.es112.js.map +1 -1
  88. package/dist/es/standards-sdk.es113.js +17 -597
  89. package/dist/es/standards-sdk.es113.js.map +1 -1
  90. package/dist/es/standards-sdk.es114.js +159 -12
  91. package/dist/es/standards-sdk.es114.js.map +1 -1
  92. package/dist/es/standards-sdk.es115.js +203 -2
  93. package/dist/es/standards-sdk.es115.js.map +1 -1
  94. package/dist/es/standards-sdk.es116.js +774 -71
  95. package/dist/es/standards-sdk.es116.js.map +1 -1
  96. package/dist/es/standards-sdk.es117.js +11 -38
  97. package/dist/es/standards-sdk.es117.js.map +1 -1
  98. package/dist/es/standards-sdk.es118.js +567 -2
  99. package/dist/es/standards-sdk.es118.js.map +1 -1
  100. package/dist/es/standards-sdk.es119.js +576 -205
  101. package/dist/es/standards-sdk.es119.js.map +1 -1
  102. package/dist/es/standards-sdk.es12.js +1 -1
  103. package/dist/es/standards-sdk.es120.js +12 -1139
  104. package/dist/es/standards-sdk.es120.js.map +1 -1
  105. package/dist/es/standards-sdk.es121.js +2 -306
  106. package/dist/es/standards-sdk.es121.js.map +1 -1
  107. package/dist/es/standards-sdk.es122.js +83 -418
  108. package/dist/es/standards-sdk.es122.js.map +1 -1
  109. package/dist/es/standards-sdk.es123.js +36 -351
  110. package/dist/es/standards-sdk.es123.js.map +1 -1
  111. package/dist/es/standards-sdk.es124.js +2 -1117
  112. package/dist/es/standards-sdk.es124.js.map +1 -1
  113. package/dist/es/standards-sdk.es125.js +215 -188
  114. package/dist/es/standards-sdk.es125.js.map +1 -1
  115. package/dist/es/standards-sdk.es126.js +1055 -1482
  116. package/dist/es/standards-sdk.es126.js.map +1 -1
  117. package/dist/es/standards-sdk.es127.js +306 -1138
  118. package/dist/es/standards-sdk.es127.js.map +1 -1
  119. package/dist/es/standards-sdk.es128.js +419 -14
  120. package/dist/es/standards-sdk.es128.js.map +1 -1
  121. package/dist/es/standards-sdk.es129.js +350 -82
  122. package/dist/es/standards-sdk.es129.js.map +1 -1
  123. package/dist/es/standards-sdk.es13.js +1 -1
  124. package/dist/es/standards-sdk.es130.js +1119 -72
  125. package/dist/es/standards-sdk.es130.js.map +1 -1
  126. package/dist/es/standards-sdk.es131.js +181 -845
  127. package/dist/es/standards-sdk.es131.js.map +1 -1
  128. package/dist/es/standards-sdk.es132.js +1558 -51
  129. package/dist/es/standards-sdk.es132.js.map +1 -1
  130. package/dist/es/standards-sdk.es133.js +1236 -159
  131. package/dist/es/standards-sdk.es133.js.map +1 -1
  132. package/dist/es/standards-sdk.es134.js +17 -7
  133. package/dist/es/standards-sdk.es134.js.map +1 -1
  134. package/dist/es/standards-sdk.es135.js +79 -78
  135. package/dist/es/standards-sdk.es135.js.map +1 -1
  136. package/dist/es/standards-sdk.es136.js +75 -59
  137. package/dist/es/standards-sdk.es136.js.map +1 -1
  138. package/dist/es/standards-sdk.es137.js +893 -30
  139. package/dist/es/standards-sdk.es137.js.map +1 -1
  140. package/dist/es/standards-sdk.es138.js +60 -34
  141. package/dist/es/standards-sdk.es138.js.map +1 -1
  142. package/dist/es/standards-sdk.es139.js +159 -28
  143. package/dist/es/standards-sdk.es139.js.map +1 -1
  144. package/dist/es/standards-sdk.es14.js +1 -1
  145. package/dist/es/standards-sdk.es140.js +7 -138
  146. package/dist/es/standards-sdk.es140.js.map +1 -1
  147. package/dist/es/standards-sdk.es141.js +80 -36
  148. package/dist/es/standards-sdk.es141.js.map +1 -1
  149. package/dist/es/standards-sdk.es142.js +58 -49
  150. package/dist/es/standards-sdk.es142.js.map +1 -1
  151. package/dist/es/standards-sdk.es143.js +30 -84
  152. package/dist/es/standards-sdk.es143.js.map +1 -1
  153. package/dist/es/standards-sdk.es144.js +34 -12320
  154. package/dist/es/standards-sdk.es144.js.map +1 -1
  155. package/dist/es/standards-sdk.es145.js +28 -17
  156. package/dist/es/standards-sdk.es145.js.map +1 -1
  157. package/dist/es/standards-sdk.es146.js +118 -152
  158. package/dist/es/standards-sdk.es146.js.map +1 -1
  159. package/dist/es/standards-sdk.es147.js +34 -314
  160. package/dist/es/standards-sdk.es147.js.map +1 -1
  161. package/dist/es/standards-sdk.es148.js +12266 -292
  162. package/dist/es/standards-sdk.es148.js.map +1 -1
  163. package/dist/es/standards-sdk.es149.js +55 -452
  164. package/dist/es/standards-sdk.es149.js.map +1 -1
  165. package/dist/es/standards-sdk.es15.js +1 -1
  166. package/dist/es/standards-sdk.es150.js +70 -317
  167. package/dist/es/standards-sdk.es150.js.map +1 -1
  168. package/dist/es/standards-sdk.es151.js +15 -74
  169. package/dist/es/standards-sdk.es151.js.map +1 -1
  170. package/dist/es/standards-sdk.es152.js +220 -150
  171. package/dist/es/standards-sdk.es152.js.map +1 -1
  172. package/dist/es/standards-sdk.es153.js +164 -214
  173. package/dist/es/standards-sdk.es153.js.map +1 -1
  174. package/dist/es/standards-sdk.es154.js +302 -219
  175. package/dist/es/standards-sdk.es154.js.map +1 -1
  176. package/dist/es/standards-sdk.es155.js +339 -112
  177. package/dist/es/standards-sdk.es155.js.map +1 -1
  178. package/dist/es/standards-sdk.es156.js +442 -115
  179. package/dist/es/standards-sdk.es156.js.map +1 -1
  180. package/dist/es/standards-sdk.es157.js +322 -152
  181. package/dist/es/standards-sdk.es157.js.map +1 -1
  182. package/dist/es/standards-sdk.es158.js +61 -170
  183. package/dist/es/standards-sdk.es158.js.map +1 -1
  184. package/dist/es/standards-sdk.es159.js +153 -120
  185. package/dist/es/standards-sdk.es159.js.map +1 -1
  186. package/dist/es/standards-sdk.es16.js +5 -5
  187. package/dist/es/standards-sdk.es160.js +178 -287
  188. package/dist/es/standards-sdk.es160.js.map +1 -1
  189. package/dist/es/standards-sdk.es161.js +218 -238
  190. package/dist/es/standards-sdk.es161.js.map +1 -1
  191. package/dist/es/standards-sdk.es162.js +75 -72
  192. package/dist/es/standards-sdk.es162.js.map +1 -1
  193. package/dist/es/standards-sdk.es163.js +105 -92
  194. package/dist/es/standards-sdk.es163.js.map +1 -1
  195. package/dist/es/standards-sdk.es164.js +164 -0
  196. package/dist/es/standards-sdk.es164.js.map +1 -0
  197. package/dist/es/standards-sdk.es165.js +188 -0
  198. package/dist/es/standards-sdk.es165.js.map +1 -0
  199. package/dist/es/standards-sdk.es166.js +142 -0
  200. package/dist/es/standards-sdk.es166.js.map +1 -0
  201. package/dist/es/standards-sdk.es167.js +334 -0
  202. package/dist/es/standards-sdk.es167.js.map +1 -0
  203. package/dist/es/standards-sdk.es168.js +262 -0
  204. package/dist/es/standards-sdk.es168.js.map +1 -0
  205. package/dist/es/standards-sdk.es169.js +119 -0
  206. package/dist/es/standards-sdk.es169.js.map +1 -0
  207. package/dist/es/standards-sdk.es18.js +12 -12
  208. package/dist/es/standards-sdk.es19.js +9 -9
  209. package/dist/es/standards-sdk.es2.js +2 -2
  210. package/dist/es/standards-sdk.es20.js +1 -1
  211. package/dist/es/standards-sdk.es21.js +1 -1
  212. package/dist/es/standards-sdk.es22.js +1 -1
  213. package/dist/es/standards-sdk.es23.js +1 -1
  214. package/dist/es/standards-sdk.es24.js +1 -1
  215. package/dist/es/standards-sdk.es25.js +1 -1
  216. package/dist/es/standards-sdk.es26.js +1 -1
  217. package/dist/es/standards-sdk.es27.js +12 -12
  218. package/dist/es/standards-sdk.es30.js +2 -2
  219. package/dist/es/standards-sdk.es31.js +4 -4
  220. package/dist/es/standards-sdk.es32.js +1 -1
  221. package/dist/es/standards-sdk.es35.js +6 -6
  222. package/dist/es/standards-sdk.es36.js +4 -4
  223. package/dist/es/standards-sdk.es37.js +2 -2
  224. package/dist/es/standards-sdk.es38.js +2 -2
  225. package/dist/es/standards-sdk.es39.js +1 -1
  226. package/dist/es/standards-sdk.es4.js +2 -2
  227. package/dist/es/standards-sdk.es40.js +1 -1
  228. package/dist/es/standards-sdk.es41.js +2 -2
  229. package/dist/es/standards-sdk.es46.js +1 -1
  230. package/dist/es/standards-sdk.es5.js +2 -2
  231. package/dist/es/standards-sdk.es51.js +1 -1
  232. package/dist/es/standards-sdk.es53.js +1 -1
  233. package/dist/es/standards-sdk.es56.js +2 -2
  234. package/dist/es/standards-sdk.es58.js +1 -1
  235. package/dist/es/standards-sdk.es59.js +1 -1
  236. package/dist/es/standards-sdk.es6.js +2 -2
  237. package/dist/es/standards-sdk.es60.js +7 -7
  238. package/dist/es/standards-sdk.es62.js +1 -1
  239. package/dist/es/standards-sdk.es64.js +2 -2
  240. package/dist/es/standards-sdk.es65.js +3 -3
  241. package/dist/es/standards-sdk.es68.js +2 -2
  242. package/dist/es/standards-sdk.es69.js +3 -3
  243. package/dist/es/standards-sdk.es7.js +1 -1
  244. package/dist/es/standards-sdk.es70.js +2 -2
  245. package/dist/es/standards-sdk.es71.js +1 -1
  246. package/dist/es/standards-sdk.es74.js +2 -2
  247. package/dist/es/standards-sdk.es76.js +2 -2
  248. package/dist/es/standards-sdk.es77.js +4 -4
  249. package/dist/es/standards-sdk.es78.js +1 -1
  250. package/dist/es/standards-sdk.es81.js +1 -1
  251. package/dist/es/standards-sdk.es82.js +2 -2
  252. package/dist/es/standards-sdk.es83.js +4 -4
  253. package/dist/es/standards-sdk.es87.js +3 -3
  254. package/dist/es/standards-sdk.es89.js +2 -2
  255. package/dist/es/standards-sdk.es9.js +2 -2
  256. package/dist/es/standards-sdk.es91.js +1 -1
  257. package/dist/es/standards-sdk.es92.js +3 -3
  258. package/dist/es/standards-sdk.es94.js +2 -2
  259. package/dist/es/standards-sdk.es96.js +2 -2
  260. package/dist/es/standards-sdk.es97.js +1 -1
  261. package/dist/es/standards-sdk.es99.js +1 -1
  262. package/dist/es/utils/crypto-abstraction.d.ts.map +1 -1
  263. package/package.json +4 -3
@@ -1,242 +1,325 @@
1
- const DEFAULT_USER_AGENT = "@hol-org/rb-client";
2
- const DEFAULT_PROGRESS_INTERVAL_MS = 1500;
3
- const DEFAULT_PROGRESS_TIMEOUT_MS = 5 * 60 * 1e3;
4
- const DEFAULT_BASE_URL = "https://hol.org/registry/api/v1";
5
- const JSON_CONTENT_TYPE = /application\/json/i;
6
- const DEFAULT_HISTORY_TOP_UP_HBAR = 0.25;
7
- const MINIMUM_REGISTRATION_AUTO_TOP_UP_CREDITS = 1;
8
- const stripTrailingSlashes = (value) => {
9
- let end = value.length;
10
- while (end > 0 && value.charCodeAt(end - 1) === 47) {
11
- end -= 1;
12
- }
13
- return end === value.length ? value : value.slice(0, end);
14
- };
15
- const createAbortError = () => typeof DOMException === "function" ? new DOMException("Aborted", "AbortError") : new Error("The operation was aborted");
16
- const normaliseHeaderName = (name) => name.trim().toLowerCase();
17
- const isBrowserRuntime = () => typeof window !== "undefined" && typeof window.fetch === "function";
18
- const toJsonValue = (value) => {
19
- if (value === null) {
20
- return null;
21
- }
22
- if (value instanceof Date) {
23
- return value.toISOString();
24
- }
25
- if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
26
- return value;
27
- }
28
- if (Array.isArray(value)) {
29
- return value.map((item) => item === void 0 ? null : toJsonValue(item));
30
- }
31
- if (typeof value === "object") {
32
- const result = {};
33
- Object.entries(value).forEach(
34
- ([key, entryValue]) => {
35
- if (entryValue !== void 0) {
36
- result[key] = toJsonValue(entryValue);
1
+ import { proto } from "@hashgraph/proto";
2
+ import { Long } from "@hashgraph/sdk";
3
+ import { hasTransactionType, parseKey } from "./standards-sdk.es158.js";
4
+ import { Buffer } from "buffer";
5
+ class FileParser {
6
+ /**
7
+ * Parse File Service transaction using unified dual-branch approach
8
+ * This handles both regular transactions and signed transaction variants
9
+ */
10
+ static parseFileTransaction(transaction, originalBytes) {
11
+ try {
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
37
  }
38
38
  }
39
- );
40
- return result;
41
- }
42
- throw new TypeError("Only JSON-compatible values are supported");
43
- };
44
- const isJsonObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
45
- const toJsonObject = (value) => {
46
- const normalised = toJsonValue(value);
47
- if (isJsonObject(normalised)) {
48
- return normalised;
49
- }
50
- throw new TypeError("Expected JSON object value");
51
- };
52
- const serialiseAuthConfig = (auth) => {
53
- const authPayload = {};
54
- if (auth.type) {
55
- authPayload.type = auth.type;
56
- }
57
- if (auth.token) {
58
- authPayload.token = auth.token;
59
- }
60
- if (auth.username) {
61
- authPayload.username = auth.username;
62
- }
63
- if (auth.password) {
64
- authPayload.password = auth.password;
65
- }
66
- if (auth.headerName) {
67
- authPayload.headerName = auth.headerName;
68
- }
69
- if (auth.headerValue) {
70
- authPayload.headerValue = auth.headerValue;
71
- }
72
- if (auth.headers) {
73
- authPayload.headers = { ...auth.headers };
74
- }
75
- return authPayload;
76
- };
77
- const serialiseAgentRegistrationRequest = (payload) => {
78
- const body = {
79
- profile: toJsonObject(payload.profile)
80
- };
81
- if (payload.endpoint !== void 0) {
82
- body.endpoint = payload.endpoint;
83
- }
84
- if (payload.protocol !== void 0) {
85
- body.protocol = payload.protocol;
86
- }
87
- if (payload.communicationProtocol !== void 0) {
88
- body.communicationProtocol = payload.communicationProtocol;
89
- }
90
- if (payload.registry !== void 0) {
91
- body.registry = payload.registry;
92
- }
93
- if (payload.additionalRegistries !== void 0) {
94
- body.additionalRegistries = payload.additionalRegistries;
95
- }
96
- if (payload.metadata !== void 0) {
97
- body.metadata = toJsonObject(payload.metadata);
98
- }
99
- return body;
100
- };
101
- const normalizeHexPrivateKey = (value) => {
102
- const trimmed = value.trim();
103
- if (!trimmed) {
104
- throw new Error("evmPrivateKey is required");
39
+ return this.parseFromTransactionInternals(transaction);
40
+ } catch (error) {
41
+ return { type: "UNKNOWN", humanReadableType: "Unknown File Transaction" };
42
+ }
105
43
  }
106
- return trimmed.startsWith("0x") ? trimmed : `0x${trimmed}`;
107
- };
108
- function normaliseBaseUrl(input) {
109
- const trimmed = input?.trim();
110
- let baseCandidate = trimmed && trimmed.length > 0 ? trimmed : DEFAULT_BASE_URL;
111
- try {
112
- const url = new URL(stripTrailingSlashes(baseCandidate));
113
- const hostname = url.hostname.toLowerCase();
114
- const ensureRegistryPrefix = () => {
115
- if (!url.pathname.startsWith("/registry")) {
116
- url.pathname = url.pathname === "/" ? "/registry" : `/registry${url.pathname}`;
44
+ /**
45
+ * Parse file transaction from protobuf TransactionBody
46
+ * Handles all file operations from decoded protobuf data
47
+ */
48
+ static parseFromProtobufTxBody(txBody) {
49
+ if (txBody.fileCreate) {
50
+ const fileCreate = this.parseFileCreate(txBody.fileCreate);
51
+ if (fileCreate) {
52
+ return {
53
+ type: "FILECREATE",
54
+ humanReadableType: "File Create",
55
+ fileCreate
56
+ };
117
57
  }
118
- };
119
- if (hostname === "hol.org") {
120
- ensureRegistryPrefix();
121
- baseCandidate = url.toString();
122
- } else if (hostname === "registry.hashgraphonline.com" || hostname === "hashgraphonline.com") {
123
- ensureRegistryPrefix();
124
- url.hostname = "hol.org";
125
- baseCandidate = url.toString();
126
- }
127
- } catch {
128
- }
129
- const withoutTrailing = stripTrailingSlashes(baseCandidate);
130
- if (/\/api\/v\d+$/i.test(withoutTrailing)) {
131
- return withoutTrailing;
132
- }
133
- if (/\/api$/i.test(withoutTrailing)) {
134
- return `${withoutTrailing}/v1`;
135
- }
136
- return `${withoutTrailing}/api/v1`;
137
- }
138
- function buildSearchQuery(params) {
139
- const query = new URLSearchParams();
140
- const appendList = (key, values) => {
141
- if (!values) {
142
- return;
143
- }
144
- values.forEach((value) => {
145
- if (typeof value === "string") {
146
- const trimmed = value.trim();
147
- if (trimmed.length > 0) {
148
- query.append(key, trimmed);
149
- }
58
+ }
59
+ if (txBody.fileAppend) {
60
+ const fileAppend = this.parseFileAppend(txBody.fileAppend);
61
+ if (fileAppend) {
62
+ return {
63
+ type: "FILEAPPEND",
64
+ humanReadableType: "File Append",
65
+ fileAppend
66
+ };
150
67
  }
151
- });
152
- };
153
- if (params.q) {
154
- const trimmed = params.q.trim();
155
- if (trimmed.length > 0) {
156
- query.set("q", trimmed);
157
68
  }
158
- }
159
- if (typeof params.page === "number") {
160
- query.set("page", params.page.toString());
161
- }
162
- if (typeof params.limit === "number") {
163
- query.set("limit", params.limit.toString());
164
- }
165
- if (params.registry) {
166
- const trimmed = params.registry.trim();
167
- if (trimmed.length > 0) {
168
- query.set("registry", trimmed);
69
+ if (txBody.fileUpdate) {
70
+ const fileUpdate = this.parseFileUpdate(txBody.fileUpdate);
71
+ if (fileUpdate) {
72
+ return {
73
+ type: "FILEUPDATE",
74
+ humanReadableType: "File Update",
75
+ fileUpdate
76
+ };
77
+ }
169
78
  }
170
- }
171
- appendList("registries", params.registries);
172
- if (typeof params.minTrust === "number") {
173
- query.set("minTrust", params.minTrust.toString());
174
- }
175
- appendList("capabilities", params.capabilities);
176
- appendList("protocols", params.protocols);
177
- appendList("adapters", params.adapters);
178
- if (params.metadata) {
179
- Object.entries(params.metadata).forEach(([key, values]) => {
180
- if (!key || !Array.isArray(values) || values.length === 0) {
181
- return;
79
+ if (txBody.fileDelete) {
80
+ const fileDelete = this.parseFileDelete(txBody.fileDelete);
81
+ if (fileDelete) {
82
+ return {
83
+ type: "FILEDELETE",
84
+ humanReadableType: "File Delete",
85
+ fileDelete
86
+ };
87
+ }
88
+ }
89
+ return {};
90
+ }
91
+ /**
92
+ * Extract file data from Transaction internal fields
93
+ * This handles cases where data is stored in Transaction object internals
94
+ */
95
+ static parseFromTransactionInternals(transaction) {
96
+ try {
97
+ const tx = transaction;
98
+ if (hasTransactionType(transaction, "fileCreate")) {
99
+ const fileCreate = {};
100
+ if (tx._contents) {
101
+ const contentInfo = this.analyzeContent(tx._contents);
102
+ fileCreate.contents = contentInfo.encoded;
103
+ if (contentInfo.contentType) {
104
+ fileCreate.contentType = contentInfo.contentType;
105
+ }
106
+ if (contentInfo.size) {
107
+ fileCreate.contentSize = contentInfo.size;
108
+ }
109
+ }
110
+ if (tx._keys && tx._keys.length > 0) {
111
+ const keyList = {
112
+ keys: tx._keys
113
+ };
114
+ fileCreate.keys = parseKey({ keyList });
115
+ }
116
+ if (tx._expirationTime) {
117
+ fileCreate.expirationTime = tx._expirationTime.toString();
118
+ }
119
+ if (tx._memo) {
120
+ fileCreate.memo = tx._memo;
121
+ }
122
+ return {
123
+ type: "FILECREATE",
124
+ humanReadableType: "File Create",
125
+ fileCreate
126
+ };
182
127
  }
183
- const trimmedKey = key.trim();
184
- if (trimmedKey.length === 0) {
185
- return;
128
+ if (hasTransactionType(transaction, "fileAppend")) {
129
+ const fileAppend = {
130
+ fileId: tx._fileId.toString()
131
+ };
132
+ if (tx._contents) {
133
+ const contentInfo = this.analyzeContent(tx._contents);
134
+ fileAppend.contents = contentInfo.encoded;
135
+ if (contentInfo.size) {
136
+ fileAppend.contentSize = contentInfo.size;
137
+ }
138
+ }
139
+ return {
140
+ type: "FILEAPPEND",
141
+ humanReadableType: "File Append",
142
+ fileAppend
143
+ };
186
144
  }
187
- values.forEach((value) => {
188
- if (value === void 0 || value === null) {
189
- return;
145
+ if (hasTransactionType(transaction, "fileUpdate")) {
146
+ const fileUpdate = {
147
+ fileId: tx._fileId.toString()
148
+ };
149
+ if (tx._contents) {
150
+ const contentInfo = this.analyzeContent(tx._contents);
151
+ fileUpdate.contents = contentInfo.encoded;
152
+ if (contentInfo.size) {
153
+ fileUpdate.contentSize = contentInfo.size;
154
+ }
155
+ }
156
+ if (tx._keys && tx._keys.length > 0) {
157
+ const keyList = {
158
+ keys: tx._keys
159
+ };
160
+ fileUpdate.keys = parseKey({ keyList });
161
+ }
162
+ if (tx._expirationTime) {
163
+ fileUpdate.expirationTime = tx._expirationTime.toString();
164
+ }
165
+ if (tx._memo) {
166
+ fileUpdate.memo = tx._memo;
190
167
  }
191
- query.append(`metadata.${trimmedKey}`, String(value));
192
- });
193
- });
168
+ return {
169
+ type: "FILEUPDATE",
170
+ humanReadableType: "File Update",
171
+ fileUpdate
172
+ };
173
+ }
174
+ if (hasTransactionType(transaction, "fileDelete")) {
175
+ const fileDelete = {
176
+ fileId: tx._fileId.toString()
177
+ };
178
+ return {
179
+ type: "FILEDELETE",
180
+ humanReadableType: "File Delete",
181
+ fileDelete
182
+ };
183
+ }
184
+ return {};
185
+ } catch (error) {
186
+ return {};
187
+ }
194
188
  }
195
- if (params.type) {
196
- const trimmedType = params.type.trim();
197
- if (trimmedType.length > 0 && trimmedType.toLowerCase() !== "all") {
198
- query.set("type", trimmedType);
189
+ /**
190
+ * Enhanced content analysis with type detection and metadata
191
+ */
192
+ static analyzeContent(contents) {
193
+ const size = contents.length;
194
+ const contentBuffer = Buffer.from(contents);
195
+ let contentType;
196
+ if (size >= 4) {
197
+ const header = contentBuffer.subarray(0, 4);
198
+ const headerHex = header.toString("hex");
199
+ const signatures = {
200
+ "89504e47": "image/png",
201
+ ffd8ffe0: "image/jpeg",
202
+ ffd8ffe1: "image/jpeg",
203
+ "47494638": "image/gif",
204
+ "25504446": "application/pdf",
205
+ "504b0304": "application/zip",
206
+ "7f454c46": "application/x-executable",
207
+ d0cf11e0: "application/msoffice"
208
+ };
209
+ contentType = signatures[headerHex.toLowerCase()];
199
210
  }
211
+ if (!contentType) {
212
+ try {
213
+ const textContent = contentBuffer.toString("utf8");
214
+ const hasControlChars = /[\x00-\x08\x0B\x0E-\x1F\x7F]/.test(
215
+ textContent
216
+ );
217
+ const hasReplacementChars = textContent.includes("�");
218
+ if (!hasControlChars && !hasReplacementChars) {
219
+ if (textContent.trim().startsWith("{") && textContent.trim().endsWith("}")) {
220
+ contentType = "application/json";
221
+ } else if (textContent.includes("<?xml") || textContent.includes("<html")) {
222
+ contentType = "text/xml";
223
+ } else if (textContent.includes("<!DOCTYPE html")) {
224
+ contentType = "text/html";
225
+ } else {
226
+ contentType = "text/plain";
227
+ }
228
+ } else {
229
+ contentType = "application/octet-stream";
230
+ }
231
+ } catch {
232
+ contentType = "application/octet-stream";
233
+ }
234
+ }
235
+ let encoded;
236
+ if (contentType?.startsWith("text/") || contentType === "application/json") {
237
+ try {
238
+ encoded = contentBuffer.toString("utf8");
239
+ if (encoded.includes("�") || /[\x00-\x08\x0B\x0E-\x1F\x7F]/.test(encoded)) {
240
+ encoded = contentBuffer.toString("base64");
241
+ }
242
+ } catch {
243
+ encoded = contentBuffer.toString("base64");
244
+ }
245
+ } else {
246
+ encoded = contentBuffer.toString("base64");
247
+ }
248
+ return {
249
+ encoded,
250
+ contentType,
251
+ size
252
+ };
200
253
  }
201
- if (params.verified === true) {
202
- query.set("verified", "true");
254
+ static parseFileCreate(body) {
255
+ if (!body) return void 0;
256
+ const data = {};
257
+ if (body.expirationTime?.seconds) {
258
+ data.expirationTime = `${Long.fromValue(
259
+ body.expirationTime.seconds
260
+ ).toString()}.${body.expirationTime.nanos}`;
261
+ }
262
+ if (body.keys) {
263
+ data.keys = parseKey({ keyList: body.keys });
264
+ }
265
+ if (body.contents) {
266
+ data.contents = Buffer.from(body.contents).toString("base64");
267
+ }
268
+ if (body.memo) {
269
+ data.memo = body.memo;
270
+ }
271
+ return data;
203
272
  }
204
- if (params.online === true) {
205
- query.set("online", "true");
273
+ static parseFileAppend(body) {
274
+ if (!body) return void 0;
275
+ const data = {};
276
+ if (body.fileID) {
277
+ data.fileId = `${body.fileID.shardNum ?? 0}.${body.fileID.realmNum ?? 0}.${body.fileID.fileNum ?? 0}`;
278
+ }
279
+ if (body.contents) {
280
+ data.contents = Buffer.from(body.contents).toString("base64");
281
+ }
282
+ return data;
206
283
  }
207
- if (params.sortBy) {
208
- const trimmedSort = params.sortBy.trim();
209
- if (trimmedSort.length > 0) {
210
- query.set("sortBy", trimmedSort);
284
+ static parseFileUpdate(body) {
285
+ if (!body) return void 0;
286
+ const data = {};
287
+ if (body.fileID) {
288
+ data.fileId = `${body.fileID.shardNum ?? 0}.${body.fileID.realmNum ?? 0}.${body.fileID.fileNum ?? 0}`;
289
+ }
290
+ if (body.expirationTime?.seconds) {
291
+ data.expirationTime = `${Long.fromValue(
292
+ body.expirationTime.seconds
293
+ ).toString()}.${body.expirationTime.nanos}`;
211
294
  }
295
+ if (body.keys) {
296
+ data.keys = parseKey({ keyList: body.keys });
297
+ }
298
+ if (body.contents) {
299
+ data.contents = Buffer.from(body.contents).toString("base64");
300
+ }
301
+ if (body.memo?.value !== void 0) {
302
+ data.memo = body.memo.value;
303
+ }
304
+ return data;
212
305
  }
213
- if (params.sortOrder) {
214
- const lowered = params.sortOrder.toLowerCase();
215
- if (lowered === "asc" || lowered === "desc") {
216
- query.set("sortOrder", lowered);
306
+ static parseFileDelete(body) {
307
+ if (!body) return void 0;
308
+ const data = {};
309
+ if (body.fileID) {
310
+ data.fileId = `${body.fileID.shardNum ?? 0}.${body.fileID.realmNum ?? 0}.${body.fileID.fileNum ?? 0}`;
217
311
  }
312
+ return data;
313
+ }
314
+ /**
315
+ * Parse File Service transaction from Transaction object
316
+ * This is the unified entry point that delegates to the comprehensive parsing logic
317
+ */
318
+ static parseFromTransactionObject(transaction) {
319
+ return this.parseFileTransaction(transaction);
218
320
  }
219
- const queryString = query.toString();
220
- return queryString.length > 0 ? `?${queryString}` : "";
221
321
  }
222
322
  export {
223
- DEFAULT_BASE_URL,
224
- DEFAULT_HISTORY_TOP_UP_HBAR,
225
- DEFAULT_PROGRESS_INTERVAL_MS,
226
- DEFAULT_PROGRESS_TIMEOUT_MS,
227
- DEFAULT_USER_AGENT,
228
- JSON_CONTENT_TYPE,
229
- MINIMUM_REGISTRATION_AUTO_TOP_UP_CREDITS,
230
- buildSearchQuery,
231
- createAbortError,
232
- isBrowserRuntime,
233
- isJsonObject,
234
- normaliseBaseUrl,
235
- normaliseHeaderName,
236
- normalizeHexPrivateKey,
237
- serialiseAgentRegistrationRequest,
238
- serialiseAuthConfig,
239
- toJsonObject,
240
- toJsonValue
323
+ FileParser
241
324
  };
242
325
  //# sourceMappingURL=standards-sdk.es154.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"standards-sdk.es154.js","sources":["../../src/services/registry-broker/client/utils.ts"],"sourcesContent":["import type {\n AgentAuthConfig,\n AgentRegistrationRequest,\n JsonObject,\n JsonValue,\n SearchParams,\n} from '../types';\n\nexport const DEFAULT_USER_AGENT = '@hol-org/rb-client';\nexport const DEFAULT_PROGRESS_INTERVAL_MS = 1_500;\nexport const DEFAULT_PROGRESS_TIMEOUT_MS = 5 * 60 * 1_000;\nexport const DEFAULT_BASE_URL = 'https://hol.org/registry/api/v1';\nexport const JSON_CONTENT_TYPE = /application\\/json/i;\nexport const DEFAULT_HISTORY_TOP_UP_HBAR = 0.25;\nexport const MINIMUM_REGISTRATION_AUTO_TOP_UP_CREDITS = 1;\n\nconst stripTrailingSlashes = (value: string): string => {\n let end = value.length;\n while (end > 0 && value.charCodeAt(end - 1) === 47) {\n end -= 1;\n }\n return end === value.length ? value : value.slice(0, end);\n};\n\nexport const createAbortError = (): Error =>\n typeof DOMException === 'function'\n ? new DOMException('Aborted', 'AbortError')\n : new Error('The operation was aborted');\n\nexport const normaliseHeaderName = (name: string): string =>\n name.trim().toLowerCase();\n\nexport const isBrowserRuntime = (): boolean =>\n typeof window !== 'undefined' && typeof window.fetch === 'function';\n\nexport const toJsonValue = (value: unknown): JsonValue => {\n if (value === null) {\n return null;\n }\n if (value instanceof Date) {\n return value.toISOString();\n }\n if (\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean'\n ) {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map(item => (item === undefined ? null : toJsonValue(item)));\n }\n if (typeof value === 'object') {\n const result: JsonObject = {};\n Object.entries(value as Record<string, unknown>).forEach(\n ([key, entryValue]) => {\n if (entryValue !== undefined) {\n result[key] = toJsonValue(entryValue);\n }\n },\n );\n return result;\n }\n throw new TypeError('Only JSON-compatible values are supported');\n};\n\nexport const isJsonObject = (value: JsonValue): value is JsonObject =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nexport const toJsonObject = (value: unknown): JsonObject => {\n const normalised = toJsonValue(value);\n if (isJsonObject(normalised)) {\n return normalised;\n }\n throw new TypeError('Expected JSON object value');\n};\n\nexport const serialiseAuthConfig = (auth: AgentAuthConfig): JsonObject => {\n const authPayload: JsonObject = {};\n if (auth.type) {\n authPayload.type = auth.type;\n }\n if (auth.token) {\n authPayload.token = auth.token;\n }\n if (auth.username) {\n authPayload.username = auth.username;\n }\n if (auth.password) {\n authPayload.password = auth.password;\n }\n if (auth.headerName) {\n authPayload.headerName = auth.headerName;\n }\n if (auth.headerValue) {\n authPayload.headerValue = auth.headerValue;\n }\n if (auth.headers) {\n authPayload.headers = { ...auth.headers };\n }\n return authPayload;\n};\n\nexport const serialiseAgentRegistrationRequest = (\n payload: AgentRegistrationRequest,\n): JsonObject => {\n const body: JsonObject = {\n profile: toJsonObject(payload.profile),\n };\n if (payload.endpoint !== undefined) {\n body.endpoint = payload.endpoint;\n }\n if (payload.protocol !== undefined) {\n body.protocol = payload.protocol;\n }\n if (payload.communicationProtocol !== undefined) {\n body.communicationProtocol = payload.communicationProtocol;\n }\n if (payload.registry !== undefined) {\n body.registry = payload.registry;\n }\n if (payload.additionalRegistries !== undefined) {\n body.additionalRegistries = payload.additionalRegistries;\n }\n if (payload.metadata !== undefined) {\n body.metadata = toJsonObject(payload.metadata);\n }\n return body;\n};\n\nexport type X402NetworkId = 'base' | 'base-sepolia';\n\nexport const normalizeHexPrivateKey = (value: string): `0x${string}` => {\n const trimmed = value.trim();\n if (!trimmed) {\n throw new Error('evmPrivateKey is required');\n }\n return trimmed.startsWith('0x')\n ? (trimmed as `0x${string}`)\n : (`0x${trimmed}` as `0x${string}`);\n};\n\nexport function normaliseBaseUrl(input?: string): string {\n const trimmed = input?.trim();\n let baseCandidate =\n trimmed && trimmed.length > 0 ? trimmed : DEFAULT_BASE_URL;\n\n try {\n const url = new URL(stripTrailingSlashes(baseCandidate));\n const hostname = url.hostname.toLowerCase();\n const ensureRegistryPrefix = (): void => {\n if (!url.pathname.startsWith('/registry')) {\n url.pathname =\n url.pathname === '/' ? '/registry' : `/registry${url.pathname}`;\n }\n };\n\n if (hostname === 'hol.org') {\n ensureRegistryPrefix();\n baseCandidate = url.toString();\n } else if (\n hostname === 'registry.hashgraphonline.com' ||\n hostname === 'hashgraphonline.com'\n ) {\n ensureRegistryPrefix();\n url.hostname = 'hol.org';\n baseCandidate = url.toString();\n }\n } catch {}\n\n const withoutTrailing = stripTrailingSlashes(baseCandidate);\n if (/\\/api\\/v\\d+$/i.test(withoutTrailing)) {\n return withoutTrailing;\n }\n if (/\\/api$/i.test(withoutTrailing)) {\n return `${withoutTrailing}/v1`;\n }\n return `${withoutTrailing}/api/v1`;\n}\n\nexport function buildSearchQuery(params: SearchParams): string {\n const query = new URLSearchParams();\n const appendList = (key: string, values?: string[]) => {\n if (!values) {\n return;\n }\n values.forEach(value => {\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (trimmed.length > 0) {\n query.append(key, trimmed);\n }\n }\n });\n };\n\n if (params.q) {\n const trimmed = params.q.trim();\n if (trimmed.length > 0) {\n query.set('q', trimmed);\n }\n }\n if (typeof params.page === 'number') {\n query.set('page', params.page.toString());\n }\n if (typeof params.limit === 'number') {\n query.set('limit', params.limit.toString());\n }\n if (params.registry) {\n const trimmed = params.registry.trim();\n if (trimmed.length > 0) {\n query.set('registry', trimmed);\n }\n }\n appendList('registries', params.registries);\n if (typeof params.minTrust === 'number') {\n query.set('minTrust', params.minTrust.toString());\n }\n appendList('capabilities', params.capabilities);\n appendList('protocols', params.protocols);\n appendList('adapters', params.adapters);\n\n if (params.metadata) {\n Object.entries(params.metadata).forEach(([key, values]) => {\n if (!key || !Array.isArray(values) || values.length === 0) {\n return;\n }\n const trimmedKey = key.trim();\n if (trimmedKey.length === 0) {\n return;\n }\n values.forEach(value => {\n if (value === undefined || value === null) {\n return;\n }\n query.append(`metadata.${trimmedKey}`, String(value));\n });\n });\n }\n\n if (params.type) {\n const trimmedType = params.type.trim();\n if (trimmedType.length > 0 && trimmedType.toLowerCase() !== 'all') {\n query.set('type', trimmedType);\n }\n }\n\n if (params.verified === true) {\n query.set('verified', 'true');\n }\n\n if (params.online === true) {\n query.set('online', 'true');\n }\n\n if (params.sortBy) {\n const trimmedSort = params.sortBy.trim();\n if (trimmedSort.length > 0) {\n query.set('sortBy', trimmedSort);\n }\n }\n\n if (params.sortOrder) {\n const lowered = params.sortOrder.toLowerCase();\n if (lowered === 'asc' || lowered === 'desc') {\n query.set('sortOrder', lowered);\n }\n }\n const queryString = query.toString();\n return queryString.length > 0 ? `?${queryString}` : '';\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"standards-sdk.es154.js","sources":["../../src/utils/parsers/file-parser.ts"],"sourcesContent":["import { proto } from '@hashgraph/proto';\nimport { Long, Transaction } from '@hashgraph/sdk';\nimport {\n FileCreateData,\n FileAppendData,\n FileUpdateData,\n FileDeleteData,\n} from '../transaction-parser-types';\nimport {\n parseKey,\n extractTransactionBody,\n hasTransactionType,\n} from './parser-utils';\nimport { Buffer } from 'buffer';\nimport { FileId } from '@hashgraph/sdk';\n\n/**\n * File Service Parser\n *\n * Handles parsing for all file-related transaction types including:\n * - File creation, updates, append, and deletion\n * - Proper dual-branch parsing (regular vs signed transactions)\n * - Comprehensive protobuf extraction\n * - Enhanced content handling with type detection\n */\nexport class FileParser {\n /**\n * Parse File Service transaction using unified dual-branch approach\n * This handles both regular transactions and signed transaction variants\n */\n static parseFileTransaction(\n transaction: Transaction,\n originalBytes?: Uint8Array,\n ): {\n type?: string;\n humanReadableType?: string;\n fileCreate?: FileCreateData;\n fileAppend?: FileAppendData;\n fileUpdate?: FileUpdateData;\n fileDelete?: FileDeleteData;\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 { type: 'UNKNOWN', humanReadableType: 'Unknown File Transaction' };\n }\n }\n\n /**\n * Parse file transaction from protobuf TransactionBody\n * Handles all file 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.fileCreate) {\n const fileCreate = this.parseFileCreate(txBody.fileCreate);\n if (fileCreate) {\n return {\n type: 'FILECREATE',\n humanReadableType: 'File Create',\n fileCreate,\n };\n }\n }\n\n if (txBody.fileAppend) {\n const fileAppend = this.parseFileAppend(txBody.fileAppend);\n if (fileAppend) {\n return {\n type: 'FILEAPPEND',\n humanReadableType: 'File Append',\n fileAppend,\n };\n }\n }\n\n if (txBody.fileUpdate) {\n const fileUpdate = this.parseFileUpdate(txBody.fileUpdate);\n if (fileUpdate) {\n return {\n type: 'FILEUPDATE',\n humanReadableType: 'File Update',\n fileUpdate,\n };\n }\n }\n\n if (txBody.fileDelete) {\n const fileDelete = this.parseFileDelete(txBody.fileDelete);\n if (fileDelete) {\n return {\n type: 'FILEDELETE',\n humanReadableType: 'File Delete',\n fileDelete,\n };\n }\n }\n\n return {};\n }\n\n /**\n * Extract file 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 _fileId?: { toString(): string };\n _contents?: Uint8Array;\n _keys?: unknown[];\n _expirationTime?: { toString(): string };\n _memo?: string;\n constructor?: { name?: string };\n };\n\n if (hasTransactionType(transaction, 'fileCreate')) {\n const fileCreate: FileCreateData = {};\n\n if (tx._contents) {\n const contentInfo = this.analyzeContent(tx._contents);\n fileCreate.contents = contentInfo.encoded;\n if (contentInfo.contentType) {\n fileCreate.contentType = contentInfo.contentType;\n }\n if (contentInfo.size) {\n fileCreate.contentSize = contentInfo.size;\n }\n }\n\n if (tx._keys && tx._keys.length > 0) {\n const keyList: proto.IKeyList = {\n keys: tx._keys as unknown as proto.IKey[],\n };\n fileCreate.keys = parseKey({ keyList });\n }\n\n if (tx._expirationTime) {\n fileCreate.expirationTime = tx._expirationTime.toString();\n }\n\n if (tx._memo) {\n fileCreate.memo = tx._memo;\n }\n\n return {\n type: 'FILECREATE',\n humanReadableType: 'File Create',\n fileCreate,\n };\n }\n\n if (hasTransactionType(transaction, 'fileAppend')) {\n const fileAppend: FileAppendData = {\n fileId: tx._fileId.toString(),\n };\n\n if (tx._contents) {\n const contentInfo = this.analyzeContent(tx._contents);\n fileAppend.contents = contentInfo.encoded;\n if (contentInfo.size) {\n fileAppend.contentSize = contentInfo.size;\n }\n }\n\n return {\n type: 'FILEAPPEND',\n humanReadableType: 'File Append',\n fileAppend,\n };\n }\n\n if (hasTransactionType(transaction, 'fileUpdate')) {\n const fileUpdate: FileUpdateData = {\n fileId: tx._fileId.toString(),\n };\n\n if (tx._contents) {\n const contentInfo = this.analyzeContent(tx._contents);\n fileUpdate.contents = contentInfo.encoded;\n if (contentInfo.size) {\n fileUpdate.contentSize = contentInfo.size;\n }\n }\n\n if (tx._keys && tx._keys.length > 0) {\n const keyList: proto.IKeyList = {\n keys: tx._keys as unknown as proto.IKey[],\n };\n fileUpdate.keys = parseKey({ keyList });\n }\n\n if (tx._expirationTime) {\n fileUpdate.expirationTime = tx._expirationTime.toString();\n }\n\n if (tx._memo) {\n fileUpdate.memo = tx._memo;\n }\n\n return {\n type: 'FILEUPDATE',\n humanReadableType: 'File Update',\n fileUpdate,\n };\n }\n\n if (hasTransactionType(transaction, 'fileDelete')) {\n const fileDelete: FileDeleteData = {\n fileId: tx._fileId.toString(),\n };\n\n return {\n type: 'FILEDELETE',\n humanReadableType: 'File Delete',\n fileDelete,\n };\n }\n\n return {};\n } catch (error) {\n return {};\n }\n }\n\n /**\n * Enhanced content analysis with type detection and metadata\n */\n private static analyzeContent(contents: Uint8Array): {\n encoded: string;\n contentType?: string;\n size: number;\n } {\n const size = contents.length;\n const contentBuffer = Buffer.from(contents);\n\n let contentType: string | undefined;\n\n if (size >= 4) {\n const header = contentBuffer.subarray(0, 4);\n const headerHex = header.toString('hex');\n\n const signatures: Record<string, string> = {\n '89504e47': 'image/png',\n ffd8ffe0: 'image/jpeg',\n ffd8ffe1: 'image/jpeg',\n '47494638': 'image/gif',\n '25504446': 'application/pdf',\n '504b0304': 'application/zip',\n '7f454c46': 'application/x-executable',\n d0cf11e0: 'application/msoffice',\n };\n\n contentType = signatures[headerHex.toLowerCase()];\n }\n\n if (!contentType) {\n try {\n const textContent = contentBuffer.toString('utf8');\n const hasControlChars = /[\\x00-\\x08\\x0B\\x0E-\\x1F\\x7F]/.test(\n textContent,\n );\n const hasReplacementChars = textContent.includes('\\uFFFD');\n\n if (!hasControlChars && !hasReplacementChars) {\n if (\n textContent.trim().startsWith('{') &&\n textContent.trim().endsWith('}')\n ) {\n contentType = 'application/json';\n } else if (\n textContent.includes('<?xml') ||\n textContent.includes('<html')\n ) {\n contentType = 'text/xml';\n } else if (textContent.includes('<!DOCTYPE html')) {\n contentType = 'text/html';\n } else {\n contentType = 'text/plain';\n }\n } else {\n contentType = 'application/octet-stream';\n }\n } catch {\n contentType = 'application/octet-stream';\n }\n }\n\n let encoded: string;\n if (\n contentType?.startsWith('text/') ||\n contentType === 'application/json'\n ) {\n try {\n encoded = contentBuffer.toString('utf8');\n if (\n encoded.includes('\\uFFFD') ||\n /[\\x00-\\x08\\x0B\\x0E-\\x1F\\x7F]/.test(encoded)\n ) {\n encoded = contentBuffer.toString('base64');\n }\n } catch {\n encoded = contentBuffer.toString('base64');\n }\n } else {\n encoded = contentBuffer.toString('base64');\n }\n\n return {\n encoded,\n contentType,\n size,\n };\n }\n static parseFileCreate(\n body: proto.IFileCreateTransactionBody,\n ): FileCreateData | undefined {\n if (!body) return undefined;\n const data: FileCreateData = {};\n if (body.expirationTime?.seconds) {\n data.expirationTime = `${Long.fromValue(\n body.expirationTime.seconds,\n ).toString()}.${body.expirationTime.nanos}`;\n }\n if (body.keys) {\n data.keys = parseKey({ keyList: body.keys });\n }\n if (body.contents) {\n data.contents = Buffer.from(body.contents).toString('base64');\n }\n if (body.memo) {\n data.memo = body.memo;\n }\n return data;\n }\n\n static parseFileAppend(\n body: proto.IFileAppendTransactionBody,\n ): FileAppendData | undefined {\n if (!body) return undefined;\n const data: FileAppendData = {};\n if (body.fileID) {\n data.fileId = `${body.fileID.shardNum ?? 0}.${\n body.fileID.realmNum ?? 0\n }.${body.fileID.fileNum ?? 0}`;\n }\n if (body.contents) {\n data.contents = Buffer.from(body.contents).toString('base64');\n }\n return data;\n }\n\n static parseFileUpdate(\n body: proto.IFileUpdateTransactionBody,\n ): FileUpdateData | undefined {\n if (!body) return undefined;\n const data: FileUpdateData = {};\n if (body.fileID) {\n data.fileId = `${body.fileID.shardNum ?? 0}.${\n body.fileID.realmNum ?? 0\n }.${body.fileID.fileNum ?? 0}`;\n }\n if (body.expirationTime?.seconds) {\n data.expirationTime = `${Long.fromValue(\n body.expirationTime.seconds,\n ).toString()}.${body.expirationTime.nanos}`;\n }\n if (body.keys) {\n data.keys = parseKey({ keyList: body.keys });\n }\n if (body.contents) {\n data.contents = Buffer.from(body.contents).toString('base64');\n }\n if (body.memo?.value !== undefined) {\n data.memo = body.memo.value;\n }\n return data;\n }\n\n static parseFileDelete(\n body: proto.IFileDeleteTransactionBody,\n ): FileDeleteData | undefined {\n if (!body) return undefined;\n const data: FileDeleteData = {};\n if (body.fileID) {\n data.fileId = `${body.fileID.shardNum ?? 0}.${\n body.fileID.realmNum ?? 0\n }.${body.fileID.fileNum ?? 0}`;\n }\n return data;\n }\n\n /**\n * Parse File 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.parseFileTransaction(transaction);\n }\n}\n"],"names":[],"mappings":"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"}