@hashgraphonline/standards-sdk 0.1.160 → 0.1.162

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 (329) hide show
  1. package/dist/cjs/hcs-14/index.d.ts +1 -0
  2. package/dist/cjs/hcs-14/index.d.ts.map +1 -1
  3. package/dist/cjs/hcs-14/resolvers/aid-dns-web-profile.d.ts +1 -0
  4. package/dist/cjs/hcs-14/resolvers/aid-dns-web-profile.d.ts.map +1 -1
  5. package/dist/cjs/hcs-14/resolvers/ans-dns-web-profile-utils.d.ts +23 -0
  6. package/dist/cjs/hcs-14/resolvers/ans-dns-web-profile-utils.d.ts.map +1 -0
  7. package/dist/cjs/hcs-14/resolvers/ans-dns-web-profile.d.ts +32 -0
  8. package/dist/cjs/hcs-14/resolvers/ans-dns-web-profile.d.ts.map +1 -0
  9. package/dist/cjs/hcs-14/resolvers/hcs-11-profile.d.ts +1 -0
  10. package/dist/cjs/hcs-14/resolvers/hcs-11-profile.d.ts.map +1 -1
  11. package/dist/cjs/hcs-14/resolvers/hiero.d.ts +1 -0
  12. package/dist/cjs/hcs-14/resolvers/hiero.d.ts.map +1 -1
  13. package/dist/cjs/hcs-14/resolvers/registry.d.ts +39 -1
  14. package/dist/cjs/hcs-14/resolvers/registry.d.ts.map +1 -1
  15. package/dist/cjs/hcs-14/resolvers/types.d.ts +52 -0
  16. package/dist/cjs/hcs-14/resolvers/types.d.ts.map +1 -1
  17. package/dist/cjs/hcs-14/resolvers/uaid-did-resolution-profile.d.ts +1 -0
  18. package/dist/cjs/hcs-14/resolvers/uaid-did-resolution-profile.d.ts.map +1 -1
  19. package/dist/cjs/hcs-14/resolvers/uaid-dns-web-profile.d.ts +1 -0
  20. package/dist/cjs/hcs-14/resolvers/uaid-dns-web-profile.d.ts.map +1 -1
  21. package/dist/cjs/hcs-14/sdk.d.ts +46 -13
  22. package/dist/cjs/hcs-14/sdk.d.ts.map +1 -1
  23. package/dist/cjs/standards-sdk.cjs +3 -3
  24. package/dist/cjs/standards-sdk.cjs.map +1 -1
  25. package/dist/es/hcs-14/index.d.ts +1 -0
  26. package/dist/es/hcs-14/index.d.ts.map +1 -1
  27. package/dist/es/hcs-14/resolvers/aid-dns-web-profile.d.ts +1 -0
  28. package/dist/es/hcs-14/resolvers/aid-dns-web-profile.d.ts.map +1 -1
  29. package/dist/es/hcs-14/resolvers/ans-dns-web-profile-utils.d.ts +23 -0
  30. package/dist/es/hcs-14/resolvers/ans-dns-web-profile-utils.d.ts.map +1 -0
  31. package/dist/es/hcs-14/resolvers/ans-dns-web-profile.d.ts +32 -0
  32. package/dist/es/hcs-14/resolvers/ans-dns-web-profile.d.ts.map +1 -0
  33. package/dist/es/hcs-14/resolvers/hcs-11-profile.d.ts +1 -0
  34. package/dist/es/hcs-14/resolvers/hcs-11-profile.d.ts.map +1 -1
  35. package/dist/es/hcs-14/resolvers/hiero.d.ts +1 -0
  36. package/dist/es/hcs-14/resolvers/hiero.d.ts.map +1 -1
  37. package/dist/es/hcs-14/resolvers/registry.d.ts +39 -1
  38. package/dist/es/hcs-14/resolvers/registry.d.ts.map +1 -1
  39. package/dist/es/hcs-14/resolvers/types.d.ts +52 -0
  40. package/dist/es/hcs-14/resolvers/types.d.ts.map +1 -1
  41. package/dist/es/hcs-14/resolvers/uaid-did-resolution-profile.d.ts +1 -0
  42. package/dist/es/hcs-14/resolvers/uaid-did-resolution-profile.d.ts.map +1 -1
  43. package/dist/es/hcs-14/resolvers/uaid-dns-web-profile.d.ts +1 -0
  44. package/dist/es/hcs-14/resolvers/uaid-dns-web-profile.d.ts.map +1 -1
  45. package/dist/es/hcs-14/sdk.d.ts +46 -13
  46. package/dist/es/hcs-14/sdk.d.ts.map +1 -1
  47. package/dist/es/standards-sdk.es.js +97 -90
  48. package/dist/es/standards-sdk.es.js.map +1 -1
  49. package/dist/es/standards-sdk.es100.js +151 -43
  50. package/dist/es/standards-sdk.es100.js.map +1 -1
  51. package/dist/es/standards-sdk.es101.js +114 -234
  52. package/dist/es/standards-sdk.es101.js.map +1 -1
  53. package/dist/es/standards-sdk.es102.js +43 -96
  54. package/dist/es/standards-sdk.es102.js.map +1 -1
  55. package/dist/es/standards-sdk.es103.js +244 -80
  56. package/dist/es/standards-sdk.es103.js.map +1 -1
  57. package/dist/es/standards-sdk.es104.js +101 -29
  58. package/dist/es/standards-sdk.es104.js.map +1 -1
  59. package/dist/es/standards-sdk.es105.js +94 -225
  60. package/dist/es/standards-sdk.es105.js.map +1 -1
  61. package/dist/es/standards-sdk.es106.js +29 -112
  62. package/dist/es/standards-sdk.es106.js.map +1 -1
  63. package/dist/es/standards-sdk.es107.js +224 -26
  64. package/dist/es/standards-sdk.es107.js.map +1 -1
  65. package/dist/es/standards-sdk.es108.js +109 -80
  66. package/dist/es/standards-sdk.es108.js.map +1 -1
  67. package/dist/es/standards-sdk.es109.js +29 -26
  68. package/dist/es/standards-sdk.es109.js.map +1 -1
  69. package/dist/es/standards-sdk.es11.js +1 -1
  70. package/dist/es/standards-sdk.es110.js +80 -248
  71. package/dist/es/standards-sdk.es110.js.map +1 -1
  72. package/dist/es/standards-sdk.es111.js +28 -475
  73. package/dist/es/standards-sdk.es111.js.map +1 -1
  74. package/dist/es/standards-sdk.es112.js +244 -97
  75. package/dist/es/standards-sdk.es112.js.map +1 -1
  76. package/dist/es/standards-sdk.es113.js +451 -133
  77. package/dist/es/standards-sdk.es113.js.map +1 -1
  78. package/dist/es/standards-sdk.es114.js +98 -27
  79. package/dist/es/standards-sdk.es114.js.map +1 -1
  80. package/dist/es/standards-sdk.es115.js +156 -8
  81. package/dist/es/standards-sdk.es115.js.map +1 -1
  82. package/dist/es/standards-sdk.es116.js +31 -139
  83. package/dist/es/standards-sdk.es116.js.map +1 -1
  84. package/dist/es/standards-sdk.es117.js +10 -27
  85. package/dist/es/standards-sdk.es117.js.map +1 -1
  86. package/dist/es/standards-sdk.es118.js +139 -19
  87. package/dist/es/standards-sdk.es118.js.map +1 -1
  88. package/dist/es/standards-sdk.es119.js +27 -158
  89. package/dist/es/standards-sdk.es119.js.map +1 -1
  90. package/dist/es/standards-sdk.es12.js +1 -1
  91. package/dist/es/standards-sdk.es120.js +16 -197
  92. package/dist/es/standards-sdk.es120.js.map +1 -1
  93. package/dist/es/standards-sdk.es121.js +133 -763
  94. package/dist/es/standards-sdk.es121.js.map +1 -1
  95. package/dist/es/standards-sdk.es122.js +200 -10
  96. package/dist/es/standards-sdk.es122.js.map +1 -1
  97. package/dist/es/standards-sdk.es123.js +762 -539
  98. package/dist/es/standards-sdk.es123.js.map +1 -1
  99. package/dist/es/standards-sdk.es124.js +10 -599
  100. package/dist/es/standards-sdk.es124.js.map +1 -1
  101. package/dist/es/standards-sdk.es125.js +567 -13
  102. package/dist/es/standards-sdk.es125.js.map +1 -1
  103. package/dist/es/standards-sdk.es126.js +602 -2
  104. package/dist/es/standards-sdk.es126.js.map +1 -1
  105. package/dist/es/standards-sdk.es127.js +12 -86
  106. package/dist/es/standards-sdk.es127.js.map +1 -1
  107. package/dist/es/standards-sdk.es128.js +2 -40
  108. package/dist/es/standards-sdk.es128.js.map +1 -1
  109. package/dist/es/standards-sdk.es129.js +87 -2
  110. package/dist/es/standards-sdk.es129.js.map +1 -1
  111. package/dist/es/standards-sdk.es13.js +1 -1
  112. package/dist/es/standards-sdk.es130.js +37 -232
  113. package/dist/es/standards-sdk.es130.js.map +1 -1
  114. package/dist/es/standards-sdk.es131.js +2 -1140
  115. package/dist/es/standards-sdk.es131.js.map +1 -1
  116. package/dist/es/standards-sdk.es132.js +213 -284
  117. package/dist/es/standards-sdk.es132.js.map +1 -1
  118. package/dist/es/standards-sdk.es133.js +1138 -420
  119. package/dist/es/standards-sdk.es133.js.map +1 -1
  120. package/dist/es/standards-sdk.es134.js +301 -350
  121. package/dist/es/standards-sdk.es134.js.map +1 -1
  122. package/dist/es/standards-sdk.es135.js +417 -1111
  123. package/dist/es/standards-sdk.es135.js.map +1 -1
  124. package/dist/es/standards-sdk.es136.js +348 -201
  125. package/dist/es/standards-sdk.es136.js.map +1 -1
  126. package/dist/es/standards-sdk.es137.js +1029 -1480
  127. package/dist/es/standards-sdk.es137.js.map +1 -1
  128. package/dist/es/standards-sdk.es138.js +207 -1254
  129. package/dist/es/standards-sdk.es138.js.map +1 -1
  130. package/dist/es/standards-sdk.es139.js +1564 -14
  131. package/dist/es/standards-sdk.es139.js.map +1 -1
  132. package/dist/es/standards-sdk.es14.js +1 -1
  133. package/dist/es/standards-sdk.es140.js +1253 -85
  134. package/dist/es/standards-sdk.es140.js.map +1 -1
  135. package/dist/es/standards-sdk.es141.js +15 -79
  136. package/dist/es/standards-sdk.es141.js.map +1 -1
  137. package/dist/es/standards-sdk.es142.js +83 -889
  138. package/dist/es/standards-sdk.es142.js.map +1 -1
  139. package/dist/es/standards-sdk.es143.js +73 -52
  140. package/dist/es/standards-sdk.es143.js.map +1 -1
  141. package/dist/es/standards-sdk.es144.js +877 -143
  142. package/dist/es/standards-sdk.es144.js.map +1 -1
  143. package/dist/es/standards-sdk.es145.js +60 -7
  144. package/dist/es/standards-sdk.es145.js.map +1 -1
  145. package/dist/es/standards-sdk.es146.js +138 -65
  146. package/dist/es/standards-sdk.es146.js.map +1 -1
  147. package/dist/es/standards-sdk.es147.js +7 -65
  148. package/dist/es/standards-sdk.es147.js.map +1 -1
  149. package/dist/es/standards-sdk.es148.js +86 -30
  150. package/dist/es/standards-sdk.es148.js.map +1 -1
  151. package/dist/es/standards-sdk.es149.js +65 -34
  152. package/dist/es/standards-sdk.es149.js.map +1 -1
  153. package/dist/es/standards-sdk.es15.js +1 -1
  154. package/dist/es/standards-sdk.es150.js +30 -41
  155. package/dist/es/standards-sdk.es150.js.map +1 -1
  156. package/dist/es/standards-sdk.es151.js +34 -138
  157. package/dist/es/standards-sdk.es151.js.map +1 -1
  158. package/dist/es/standards-sdk.es152.js +48 -42
  159. package/dist/es/standards-sdk.es152.js.map +1 -1
  160. package/dist/es/standards-sdk.es153.js +106 -12450
  161. package/dist/es/standards-sdk.es153.js.map +1 -1
  162. package/dist/es/standards-sdk.es154.js +38 -168
  163. package/dist/es/standards-sdk.es154.js.map +1 -1
  164. package/dist/es/standards-sdk.es155.js +12423 -263
  165. package/dist/es/standards-sdk.es155.js.map +1 -1
  166. package/dist/es/standards-sdk.es156.js +13 -342
  167. package/dist/es/standards-sdk.es156.js.map +1 -1
  168. package/dist/es/standards-sdk.es157.js +55 -452
  169. package/dist/es/standards-sdk.es157.js.map +1 -1
  170. package/dist/es/standards-sdk.es158.js +70 -317
  171. package/dist/es/standards-sdk.es158.js.map +1 -1
  172. package/dist/es/standards-sdk.es159.js +70 -65
  173. package/dist/es/standards-sdk.es159.js.map +1 -1
  174. package/dist/es/standards-sdk.es16.js +4 -4
  175. package/dist/es/standards-sdk.es160.js +197 -14
  176. package/dist/es/standards-sdk.es160.js.map +1 -1
  177. package/dist/es/standards-sdk.es161.js +60 -229
  178. package/dist/es/standards-sdk.es161.js.map +1 -1
  179. package/dist/es/standards-sdk.es162.js +237 -51
  180. package/dist/es/standards-sdk.es162.js.map +1 -1
  181. package/dist/es/standards-sdk.es163.js +160 -72
  182. package/dist/es/standards-sdk.es163.js.map +1 -1
  183. package/dist/es/standards-sdk.es164.js +312 -71
  184. package/dist/es/standards-sdk.es164.js.map +1 -1
  185. package/dist/es/standards-sdk.es165.js +337 -64
  186. package/dist/es/standards-sdk.es165.js.map +1 -1
  187. package/dist/es/standards-sdk.es166.js +436 -155
  188. package/dist/es/standards-sdk.es166.js.map +1 -1
  189. package/dist/es/standards-sdk.es167.js +319 -210
  190. package/dist/es/standards-sdk.es167.js.map +1 -1
  191. package/dist/es/standards-sdk.es168.js +68 -231
  192. package/dist/es/standards-sdk.es168.js.map +1 -1
  193. package/dist/es/standards-sdk.es169.js +154 -101
  194. package/dist/es/standards-sdk.es169.js.map +1 -1
  195. package/dist/es/standards-sdk.es170.js +200 -104
  196. package/dist/es/standards-sdk.es170.js.map +1 -1
  197. package/dist/es/standards-sdk.es171.js +225 -147
  198. package/dist/es/standards-sdk.es171.js.map +1 -1
  199. package/dist/es/standards-sdk.es172.js +100 -166
  200. package/dist/es/standards-sdk.es172.js.map +1 -1
  201. package/dist/es/standards-sdk.es173.js +110 -123
  202. package/dist/es/standards-sdk.es173.js.map +1 -1
  203. package/dist/es/standards-sdk.es174.js +122 -292
  204. package/dist/es/standards-sdk.es174.js.map +1 -1
  205. package/dist/es/standards-sdk.es175.js +166 -240
  206. package/dist/es/standards-sdk.es175.js.map +1 -1
  207. package/dist/es/standards-sdk.es176.js +125 -102
  208. package/dist/es/standards-sdk.es176.js.map +1 -1
  209. package/dist/es/standards-sdk.es177.js +334 -0
  210. package/dist/es/standards-sdk.es177.js.map +1 -0
  211. package/dist/es/standards-sdk.es178.js +262 -0
  212. package/dist/es/standards-sdk.es178.js.map +1 -0
  213. package/dist/es/standards-sdk.es179.js +119 -0
  214. package/dist/es/standards-sdk.es179.js.map +1 -0
  215. package/dist/es/standards-sdk.es18.js +11 -11
  216. package/dist/es/standards-sdk.es19.js +8 -8
  217. package/dist/es/standards-sdk.es2.js +2 -2
  218. package/dist/es/standards-sdk.es20.js +1 -1
  219. package/dist/es/standards-sdk.es21.js +1 -1
  220. package/dist/es/standards-sdk.es22.js +1 -1
  221. package/dist/es/standards-sdk.es23.js +1 -1
  222. package/dist/es/standards-sdk.es24.js +1 -1
  223. package/dist/es/standards-sdk.es25.js +1 -1
  224. package/dist/es/standards-sdk.es26.js +1 -1
  225. package/dist/es/standards-sdk.es27.js +11 -11
  226. package/dist/es/standards-sdk.es30.js +2 -2
  227. package/dist/es/standards-sdk.es31.js +4 -4
  228. package/dist/es/standards-sdk.es32.js +1 -1
  229. package/dist/es/standards-sdk.es35.js +5 -5
  230. package/dist/es/standards-sdk.es36.js +4 -4
  231. package/dist/es/standards-sdk.es37.js +2 -2
  232. package/dist/es/standards-sdk.es38.js +2 -2
  233. package/dist/es/standards-sdk.es39.js +1 -1
  234. package/dist/es/standards-sdk.es4.js +2 -2
  235. package/dist/es/standards-sdk.es40.js +1 -1
  236. package/dist/es/standards-sdk.es41.js +2 -2
  237. package/dist/es/standards-sdk.es46.js +1 -1
  238. package/dist/es/standards-sdk.es5.js +2 -2
  239. package/dist/es/standards-sdk.es51.js +1 -1
  240. package/dist/es/standards-sdk.es53.js +1 -1
  241. package/dist/es/standards-sdk.es56.js +2 -2
  242. package/dist/es/standards-sdk.es58.js +39 -231
  243. package/dist/es/standards-sdk.es58.js.map +1 -1
  244. package/dist/es/standards-sdk.es59.js +328 -35
  245. package/dist/es/standards-sdk.es59.js.map +1 -1
  246. package/dist/es/standards-sdk.es6.js +2 -2
  247. package/dist/es/standards-sdk.es60.js +33 -101
  248. package/dist/es/standards-sdk.es60.js.map +1 -1
  249. package/dist/es/standards-sdk.es61.js +87 -156
  250. package/dist/es/standards-sdk.es61.js.map +1 -1
  251. package/dist/es/standards-sdk.es62.js +126 -153
  252. package/dist/es/standards-sdk.es62.js.map +1 -1
  253. package/dist/es/standards-sdk.es63.js +234 -81
  254. package/dist/es/standards-sdk.es63.js.map +1 -1
  255. package/dist/es/standards-sdk.es64.js +244 -39
  256. package/dist/es/standards-sdk.es64.js.map +1 -1
  257. package/dist/es/standards-sdk.es65.js +122 -247
  258. package/dist/es/standards-sdk.es65.js.map +1 -1
  259. package/dist/es/standards-sdk.es66.js +41 -28
  260. package/dist/es/standards-sdk.es66.js.map +1 -1
  261. package/dist/es/standards-sdk.es67.js +266 -90
  262. package/dist/es/standards-sdk.es67.js.map +1 -1
  263. package/dist/es/standards-sdk.es68.js +33 -3
  264. package/dist/es/standards-sdk.es68.js.map +1 -1
  265. package/dist/es/standards-sdk.es69.js +84 -89
  266. package/dist/es/standards-sdk.es69.js.map +1 -1
  267. package/dist/es/standards-sdk.es7.js +1 -1
  268. package/dist/es/standards-sdk.es70.js +3 -99
  269. package/dist/es/standards-sdk.es70.js.map +1 -1
  270. package/dist/es/standards-sdk.es71.js +99 -17
  271. package/dist/es/standards-sdk.es71.js.map +1 -1
  272. package/dist/es/standards-sdk.es72.js +100 -77
  273. package/dist/es/standards-sdk.es72.js.map +1 -1
  274. package/dist/es/standards-sdk.es73.js +19 -458
  275. package/dist/es/standards-sdk.es73.js.map +1 -1
  276. package/dist/es/standards-sdk.es74.js +77 -324
  277. package/dist/es/standards-sdk.es74.js.map +1 -1
  278. package/dist/es/standards-sdk.es75.js +420 -170
  279. package/dist/es/standards-sdk.es75.js.map +1 -1
  280. package/dist/es/standards-sdk.es76.js +323 -71
  281. package/dist/es/standards-sdk.es76.js.map +1 -1
  282. package/dist/es/standards-sdk.es77.js +208 -71
  283. package/dist/es/standards-sdk.es77.js.map +1 -1
  284. package/dist/es/standards-sdk.es78.js +67 -138
  285. package/dist/es/standards-sdk.es78.js.map +1 -1
  286. package/dist/es/standards-sdk.es79.js +71 -69
  287. package/dist/es/standards-sdk.es79.js.map +1 -1
  288. package/dist/es/standards-sdk.es80.js +132 -393
  289. package/dist/es/standards-sdk.es80.js.map +1 -1
  290. package/dist/es/standards-sdk.es81.js +44 -471
  291. package/dist/es/standards-sdk.es81.js.map +1 -1
  292. package/dist/es/standards-sdk.es82.js +361 -322
  293. package/dist/es/standards-sdk.es82.js.map +1 -1
  294. package/dist/es/standards-sdk.es83.js +495 -88
  295. package/dist/es/standards-sdk.es83.js.map +1 -1
  296. package/dist/es/standards-sdk.es84.js +365 -125
  297. package/dist/es/standards-sdk.es84.js.map +1 -1
  298. package/dist/es/standards-sdk.es85.js +88 -7
  299. package/dist/es/standards-sdk.es85.js.map +1 -1
  300. package/dist/es/standards-sdk.es86.js +125 -47
  301. package/dist/es/standards-sdk.es86.js.map +1 -1
  302. package/dist/es/standards-sdk.es87.js +6 -99
  303. package/dist/es/standards-sdk.es87.js.map +1 -1
  304. package/dist/es/standards-sdk.es88.js +43 -344
  305. package/dist/es/standards-sdk.es88.js.map +1 -1
  306. package/dist/es/standards-sdk.es89.js +73 -253
  307. package/dist/es/standards-sdk.es89.js.map +1 -1
  308. package/dist/es/standards-sdk.es9.js +2 -2
  309. package/dist/es/standards-sdk.es90.js +340 -53
  310. package/dist/es/standards-sdk.es90.js.map +1 -1
  311. package/dist/es/standards-sdk.es91.js +280 -48
  312. package/dist/es/standards-sdk.es91.js.map +1 -1
  313. package/dist/es/standards-sdk.es92.js +54 -143
  314. package/dist/es/standards-sdk.es92.js.map +1 -1
  315. package/dist/es/standards-sdk.es93.js +44 -62
  316. package/dist/es/standards-sdk.es93.js.map +1 -1
  317. package/dist/es/standards-sdk.es94.js +140 -20
  318. package/dist/es/standards-sdk.es94.js.map +1 -1
  319. package/dist/es/standards-sdk.es95.js +65 -23
  320. package/dist/es/standards-sdk.es95.js.map +1 -1
  321. package/dist/es/standards-sdk.es96.js +26 -236
  322. package/dist/es/standards-sdk.es96.js.map +1 -1
  323. package/dist/es/standards-sdk.es97.js +23 -280
  324. package/dist/es/standards-sdk.es97.js.map +1 -1
  325. package/dist/es/standards-sdk.es98.js +229 -146
  326. package/dist/es/standards-sdk.es98.js.map +1 -1
  327. package/dist/es/standards-sdk.es99.js +254 -117
  328. package/dist/es/standards-sdk.es99.js.map +1 -1
  329. package/package.json +8 -1
@@ -1,570 +1,793 @@
1
- const getNested = (tx, path) => {
2
- const parts = path.split(".");
3
- let current = tx;
4
- for (const p of parts) {
5
- if (current == null) {
6
- return void 0;
7
- }
8
- current = current[p];
9
- }
10
- return current;
11
- };
12
- const renderTemplate = (template, tx) => {
13
- return template.replace(/\{([^}]+)\}/g, (_m, path) => {
14
- const value = getNested(tx, String(path).trim());
15
- if (value === null || value === void 0) {
16
- return "(Unknown)";
17
- }
18
- return String(value);
19
- });
20
- };
21
- const summarizeCryptoTransfer = (tx) => {
22
- const senders = [];
23
- const receivers = [];
24
- if (Array.isArray(tx.transfers)) {
25
- for (const transfer of tx.transfers) {
26
- const originalAmountFloat = parseFloat(transfer.amount);
27
- let displayStr = transfer.amount;
28
- if (displayStr.startsWith("-")) {
29
- displayStr = displayStr.substring(1);
1
+ import { proto } from "@hashgraph/proto";
2
+ import { Buffer } from "buffer";
3
+ import { Hbar, Long, HbarUnit, Transaction } from "@hashgraph/sdk";
4
+ import { ethers } from "ethers";
5
+ import { TransactionParsingError } from "./standards-sdk.es124.js";
6
+ import { resolveTransactionSummary } from "./standards-sdk.es125.js";
7
+ import { HTSParser } from "./standards-sdk.es133.js";
8
+ import { HCSParser } from "./standards-sdk.es163.js";
9
+ import { FileParser } from "./standards-sdk.es164.js";
10
+ import { CryptoParser } from "./standards-sdk.es165.js";
11
+ import { SCSParser } from "./standards-sdk.es166.js";
12
+ import { UtilParser } from "./standards-sdk.es167.js";
13
+ import { ScheduleParser } from "./standards-sdk.es134.js";
14
+ import { transactionParserRegistry } from "./standards-sdk.es135.js";
15
+ import { getTransactionTypeFromBody, getHumanReadableTransactionType } from "./standards-sdk.es136.js";
16
+ class TransactionParser {
17
+ /**
18
+ * Parse transaction bytes in any supported format (base64 or hex, regular or scheduled)
19
+ * This is the main entry point for transaction parsing with enhanced retry logic
20
+ *
21
+ * @param transactionBytes - Transaction bytes in base64 or hex format
22
+ * @param options - Parsing options and configuration
23
+ * @returns Promise resolving to ParsedTransaction
24
+ */
25
+ static async parseTransactionBytes(transactionBytes, options = {}) {
26
+ const {
27
+ enableFallback = true,
28
+ strictMode = false,
29
+ includeRaw = true,
30
+ maxRetries = 2
31
+ } = options;
32
+ const validation = this.validateTransactionBytes(transactionBytes);
33
+ if (!validation.isValid && strictMode) {
34
+ throw new TransactionParsingError(
35
+ `Invalid transaction bytes format: ${validation.error}`,
36
+ "INVALID_FORMAT",
37
+ void 0,
38
+ transactionBytes
39
+ );
40
+ }
41
+ let lastError;
42
+ let retryCount = 0;
43
+ while (retryCount <= maxRetries) {
44
+ try {
45
+ const result = await this.parseTransaction(transactionBytes, options);
46
+ result.formatDetection = {
47
+ originalFormat: validation.format || "base64",
48
+ wasConverted: validation.format === "hex",
49
+ length: transactionBytes.length
50
+ };
51
+ return result;
52
+ } catch (error) {
53
+ lastError = error instanceof Error ? error : new Error(String(error));
54
+ retryCount++;
55
+ if (!enableFallback || retryCount > maxRetries) {
56
+ if (strictMode) {
57
+ throw new TransactionParsingError(
58
+ "Failed to parse transaction after all attempts",
59
+ "PARSING_FAILED",
60
+ lastError,
61
+ transactionBytes
62
+ );
63
+ }
64
+ break;
65
+ }
66
+ try {
67
+ const result = this.parseScheduledTransaction(
68
+ transactionBytes,
69
+ options
70
+ );
71
+ result.formatDetection = {
72
+ originalFormat: validation.format || "base64",
73
+ wasConverted: false,
74
+ length: transactionBytes.length
75
+ };
76
+ return result;
77
+ } catch (scheduledError) {
78
+ }
79
+ }
80
+ }
81
+ const fallbackResult = this.createFallbackResult(
82
+ transactionBytes,
83
+ lastError,
84
+ void 0
85
+ );
86
+ if (fallbackResult.details) {
87
+ fallbackResult.details.parseAttempts = Math.max(retryCount, 1);
88
+ }
89
+ return fallbackResult;
90
+ }
91
+ /**
92
+ * Parse a Transaction object directly using unified delegation approach
93
+ * This method delegates to specialized parsers for clean separation of concerns
94
+ *
95
+ * @param transaction - The Transaction object to parse
96
+ * @param originalBytes - The original transaction bytes (optional, for protobuf parsing)
97
+ * @param options - Parsing options
98
+ * @returns Parsed transaction data
99
+ */
100
+ static parseTransactionObject(transaction, originalBytesOrOptions, options = {}) {
101
+ let originalBytes;
102
+ let actualOptions;
103
+ if (originalBytesOrOptions && !Buffer.isBuffer(originalBytesOrOptions) && !(originalBytesOrOptions instanceof Uint8Array)) {
104
+ actualOptions = originalBytesOrOptions;
105
+ originalBytes = void 0;
106
+ } else {
107
+ originalBytes = originalBytesOrOptions;
108
+ actualOptions = options;
109
+ }
110
+ try {
111
+ const metadata = this.extractTransactionMetadata(transaction);
112
+ const htsResult = HTSParser.parseFromTransactionObject(transaction);
113
+ const cryptoResult = CryptoParser.parseFromTransactionObject(transaction);
114
+ const hcsResult = HCSParser.parseFromTransactionObject(transaction);
115
+ const fileResult = FileParser.parseFromTransactionObject(transaction);
116
+ const scsResult = SCSParser.parseFromTransactionObject(transaction);
117
+ const scheduleResult = ScheduleParser.parseFromTransactionObject(transaction);
118
+ const utilResult = UtilParser.parseFromTransactionObject(transaction);
119
+ const results = [
120
+ htsResult,
121
+ cryptoResult,
122
+ hcsResult,
123
+ fileResult,
124
+ scsResult,
125
+ scheduleResult,
126
+ utilResult
127
+ ];
128
+ const primaryResult = results.find((result2) => result2.type && result2.type !== "UNKNOWN") || {};
129
+ let finalType = "UNKNOWN";
130
+ let finalHumanReadableType = "Unknown Transaction";
131
+ let parsedTokenCreation;
132
+ let protoParsingResult = {};
133
+ if (originalBytes || transaction.toBytes) {
134
+ try {
135
+ const bytesToParse = originalBytes || transaction.toBytes();
136
+ const decoded = proto.TransactionList.decode(bytesToParse);
137
+ if (decoded.transactionList && decoded.transactionList.length > 0) {
138
+ const tx = decoded.transactionList[0];
139
+ if (tx.bodyBytes && tx.bodyBytes.length > 0) {
140
+ const txBody = proto.TransactionBody.decode(tx.bodyBytes);
141
+ const typeResult = this.detectTransactionTypeFromBody(txBody);
142
+ finalType = typeResult.type;
143
+ finalHumanReadableType = typeResult.humanReadableType;
144
+ protoParsingResult = this.parseTransactionBodyDetails(
145
+ txBody,
146
+ finalType
147
+ );
148
+ if (protoParsingResult.tokenCreation) {
149
+ parsedTokenCreation = protoParsingResult.tokenCreation;
150
+ }
151
+ } else if (tx.signedTransactionBytes && tx.signedTransactionBytes.length > 0) {
152
+ const signedTx = proto.SignedTransaction.decode(
153
+ tx.signedTransactionBytes
154
+ );
155
+ if (signedTx.bodyBytes) {
156
+ const txBody = proto.TransactionBody.decode(signedTx.bodyBytes);
157
+ const typeResult = this.detectTransactionTypeFromBody(txBody);
158
+ finalType = typeResult.type;
159
+ finalHumanReadableType = typeResult.humanReadableType;
160
+ protoParsingResult = this.parseTransactionBodyDetails(
161
+ txBody,
162
+ finalType
163
+ );
164
+ if (protoParsingResult.tokenCreation) {
165
+ parsedTokenCreation = protoParsingResult.tokenCreation;
166
+ }
167
+ }
168
+ }
169
+ }
170
+ } catch (protoError) {
171
+ }
30
172
  }
31
- displayStr = displayStr.replace(/\s*ℏ$/, "");
32
- if (originalAmountFloat < 0) {
33
- senders.push(`${transfer.accountId} (${displayStr} ℏ)`);
34
- } else if (originalAmountFloat > 0) {
35
- receivers.push(`${transfer.accountId} (${displayStr} ℏ)`);
173
+ if (finalType === "UNKNOWN" && primaryResult.type) {
174
+ finalType = primaryResult.type;
175
+ finalHumanReadableType = primaryResult.humanReadableType || finalHumanReadableType;
36
176
  }
177
+ const result = {
178
+ type: finalType,
179
+ humanReadableType: finalHumanReadableType,
180
+ transfers: [],
181
+ tokenTransfers: [],
182
+ ...metadata,
183
+ ...primaryResult,
184
+ raw: actualOptions.includeRaw ? transaction._transactionBody || {} : void 0
185
+ };
186
+ this.mergeProtoParsingResults(
187
+ result,
188
+ protoParsingResult,
189
+ htsResult,
190
+ transaction,
191
+ originalBytes
192
+ );
193
+ result.transfers = cryptoResult.transfers || result.transfers || [];
194
+ result.tokenTransfers = cryptoResult.tokenTransfers || result.tokenTransfers || [];
195
+ return result;
196
+ } catch (error) {
197
+ return {
198
+ type: "UNKNOWN",
199
+ humanReadableType: "Unknown Transaction",
200
+ transfers: [],
201
+ tokenTransfers: [],
202
+ raw: actualOptions.includeRaw ? {} : void 0,
203
+ details: {
204
+ error: `Failed to parse Transaction object: ${error instanceof Error ? error.message : String(error)}`
205
+ }
206
+ };
37
207
  }
38
208
  }
39
- if (senders.length > 0 && receivers.length > 0) {
40
- return `Transfer of HBAR from ${senders.join(", ")} to ${receivers.join(", ")}`;
41
- }
42
- return tx.humanReadableType;
43
- };
44
- const groupTokenTransfers = (tokenTransfers) => {
45
- const groups = {};
46
- for (const t of tokenTransfers) {
47
- if (!groups[t.tokenId]) {
48
- groups[t.tokenId] = [];
209
+ /**
210
+ * Parse a base64 encoded transaction body using registry pattern
211
+ * @param transactionBodyBase64 - The base64 encoded transaction body
212
+ * @returns The parsed transaction
213
+ */
214
+ static parseTransactionBody(transactionBodyBase64) {
215
+ try {
216
+ const buffer = ethers.decodeBase64(transactionBodyBase64);
217
+ const txBody = proto.SchedulableTransactionBody.decode(buffer);
218
+ const transactionType = this.getTransactionType(txBody);
219
+ const result = {
220
+ type: transactionType,
221
+ humanReadableType: this.getHumanReadableType(transactionType),
222
+ transfers: [],
223
+ tokenTransfers: [],
224
+ raw: txBody
225
+ };
226
+ if (txBody.memo) {
227
+ result.memo = txBody.memo;
228
+ }
229
+ if (txBody.transactionFee) {
230
+ const hbarAmount = Hbar.fromTinybars(
231
+ Long.fromValue(txBody.transactionFee)
232
+ );
233
+ result.transactionFee = hbarAmount.toString(HbarUnit.Hbar);
234
+ }
235
+ this.applySchedulableTransactionParsing(txBody, result);
236
+ return result;
237
+ } catch (error) {
238
+ return {
239
+ type: "UNKNOWN",
240
+ humanReadableType: "Unknown Transaction",
241
+ transfers: [],
242
+ tokenTransfers: [],
243
+ raw: void 0,
244
+ details: {
245
+ error: `Failed to parse transaction body: ${error instanceof Error ? error.message : String(error)}`
246
+ }
247
+ };
49
248
  }
50
- groups[t.tokenId].push(t);
51
249
  }
52
- return groups;
53
- };
54
- const summarizeTokenTransfers = (tx) => {
55
- const tokenSummaries = [];
56
- const groups = groupTokenTransfers(tx.tokenTransfers || []);
57
- for (const [tokenId, transfers] of Object.entries(groups)) {
58
- const tokenSenders = [];
59
- const tokenReceivers = [];
60
- for (const t of transfers) {
61
- const amt = parseFloat(String(t.amount));
62
- if (amt < 0) {
63
- tokenSenders.push(`${t.accountId} (${Math.abs(amt)})`);
64
- } else if (amt > 0) {
65
- tokenReceivers.push(`${t.accountId} (${amt})`);
250
+ /**
251
+ * Detect transaction type and human-readable type from transaction body protobuf
252
+ * Uses registry pattern to eliminate massive if-else chain
253
+ */
254
+ static detectTransactionTypeFromBody(txBody) {
255
+ return getTransactionTypeFromBody(txBody);
256
+ }
257
+ /**
258
+ * Parse details from a complete schedule response
259
+ * @param scheduleResponse - The schedule response to parse
260
+ * @returns The parsed transaction
261
+ */
262
+ static parseScheduleResponse(scheduleResponse) {
263
+ if (!scheduleResponse.transaction_body) {
264
+ return {
265
+ type: "UNKNOWN",
266
+ humanReadableType: "Unknown Transaction",
267
+ transfers: [],
268
+ tokenTransfers: [],
269
+ raw: void 0,
270
+ details: {
271
+ error: "Schedule response missing transaction_body"
272
+ }
273
+ };
274
+ }
275
+ const parsed = this.parseTransactionBody(scheduleResponse.transaction_body);
276
+ if (scheduleResponse.memo) {
277
+ parsed.memo = scheduleResponse.memo;
278
+ }
279
+ return parsed;
280
+ }
281
+ /**
282
+ * Determine the transaction type using registry pattern
283
+ * @param txBody - The transaction body to determine the type of
284
+ * @returns The type of the transaction
285
+ */
286
+ static getTransactionType(txBody) {
287
+ return getTransactionTypeFromBody(txBody).type;
288
+ }
289
+ /**
290
+ * Convert technical transaction type to human-readable format using registry pattern
291
+ * @param type - The technical transaction type
292
+ * @returns The human-readable transaction type
293
+ */
294
+ static getHumanReadableType(type) {
295
+ return getHumanReadableTransactionType(type);
296
+ }
297
+ /**
298
+ * Get a human-readable summary of the transaction
299
+ * @param parsedTx - The parsed transaction
300
+ * @returns The human-readable summary of the transaction
301
+ */
302
+ static getTransactionSummary(parsedTx) {
303
+ return resolveTransactionSummary(parsedTx);
304
+ }
305
+ /**
306
+ * Validate transaction bytes format and encoding
307
+ * Enhanced validation with better format detection
308
+ */
309
+ static validateTransactionBytes(transactionBytes) {
310
+ if (!transactionBytes || typeof transactionBytes !== "string") {
311
+ return {
312
+ isValid: false,
313
+ error: "Transaction bytes must be a non-empty string"
314
+ };
315
+ }
316
+ const format = this.detectTransactionFormat(transactionBytes);
317
+ const base64Regex = /^[A-Za-z0-9+/]*={0,2}$/;
318
+ const hexRegex = /^0x[0-9a-fA-F]+$/;
319
+ let isValid = false;
320
+ let error;
321
+ if (format === "hex") {
322
+ isValid = hexRegex.test(transactionBytes) && transactionBytes.length > 2;
323
+ if (!isValid) {
324
+ error = "Invalid hex format";
325
+ }
326
+ } else {
327
+ isValid = base64Regex.test(transactionBytes) && transactionBytes.length > 0;
328
+ if (!isValid) {
329
+ error = "Invalid base64 format";
66
330
  }
67
331
  }
68
- if (tokenSenders.length > 0 && tokenReceivers.length > 0) {
69
- tokenSummaries.push(
70
- `Transfer of token ${tokenId} from ${tokenSenders.join(", ")} to ${tokenReceivers.join(", ")}`
332
+ return {
333
+ isValid,
334
+ format,
335
+ error,
336
+ length: transactionBytes.length
337
+ };
338
+ }
339
+ /**
340
+ * Detects the format of transaction bytes
341
+ * @param transactionBytes - The transaction bytes to analyze
342
+ * @returns The detected format ('base64' or 'hex')
343
+ */
344
+ static detectTransactionFormat(transactionBytes) {
345
+ return transactionBytes.startsWith("0x") ? "hex" : "base64";
346
+ }
347
+ /**
348
+ * Decodes transaction bytes from string to Uint8Array
349
+ * @param transactionBytes - The transaction bytes string (base64 or hex)
350
+ * @returns Decoded Uint8Array
351
+ * @throws TransactionParsingError if decoding fails
352
+ */
353
+ static decodeTransactionBytes(transactionBytes) {
354
+ try {
355
+ const format = this.detectTransactionFormat(transactionBytes);
356
+ if (format === "hex") {
357
+ const hexString = transactionBytes.slice(2);
358
+ return new Uint8Array(Buffer.from(hexString, "hex"));
359
+ } else {
360
+ return new Uint8Array(Buffer.from(transactionBytes, "base64"));
361
+ }
362
+ } catch (error) {
363
+ throw new TransactionParsingError(
364
+ "Failed to decode transaction bytes",
365
+ "DECODE_ERROR",
366
+ error instanceof Error ? error : void 0,
367
+ transactionBytes
71
368
  );
72
369
  }
73
370
  }
74
- if (tokenSummaries.length > 0) {
75
- return tokenSummaries.join("; ");
76
- }
77
- return tx.humanReadableType;
78
- };
79
- const summarizeContractCall = (tx) => {
80
- if (!tx.contractCall) {
81
- return tx.humanReadableType;
82
- }
83
- let summary = `Contract call to ${tx.contractCall.contractId} with ${tx.contractCall.gas} gas`;
84
- if (tx.contractCall.amount > 0) {
85
- summary += ` and ${tx.contractCall.amount} HBAR`;
86
- }
87
- if (tx.contractCall.functionName) {
88
- summary += ` calling function ${tx.contractCall.functionName}`;
89
- }
90
- return summary;
91
- };
92
- const summarizeTokenMint = (tx) => {
93
- if (tx.tokenMint) {
94
- return `Mint ${tx.tokenMint.amount} tokens for token ${tx.tokenMint.tokenId}`;
95
- }
96
- return tx.humanReadableType;
97
- };
98
- const summarizeTokenBurn = (tx) => {
99
- if (tx.tokenBurn) {
100
- return `Burn ${tx.tokenBurn.amount} tokens for token ${tx.tokenBurn.tokenId}`;
101
- }
102
- return tx.humanReadableType;
103
- };
104
- const summarizeTokenCreate = (tx) => {
105
- if (!tx.tokenCreation) {
106
- return tx.humanReadableType;
107
- }
108
- let summary = `Create token ${tx.tokenCreation.tokenName || "(No Name)"} (${tx.tokenCreation.tokenSymbol || "(No Symbol)"})`;
109
- if (tx.tokenCreation.initialSupply) {
110
- summary += ` with initial supply ${tx.tokenCreation.initialSupply}`;
111
- }
112
- if (tx.tokenCreation.customFees && tx.tokenCreation.customFees.length > 0) {
113
- summary += ` including ${tx.tokenCreation.customFees.length} custom fee(s)`;
114
- }
115
- return summary;
116
- };
117
- const summarizeConsensusCreateTopic = (tx) => {
118
- if (!tx.consensusCreateTopic) {
119
- return tx.humanReadableType;
120
- }
121
- let summary = "Create new topic";
122
- if (tx.consensusCreateTopic.memo) {
123
- summary += ` with memo "${tx.consensusCreateTopic.memo}"`;
124
- }
125
- if (tx.consensusCreateTopic.autoRenewAccountId) {
126
- summary += `, auto-renew by ${tx.consensusCreateTopic.autoRenewAccountId}`;
127
- }
128
- return summary;
129
- };
130
- const summarizeConsensusSubmitMessage = (tx) => {
131
- if (!tx.consensusSubmitMessage) {
132
- return tx.humanReadableType;
133
- }
134
- let summary = "Submit message";
135
- if (tx.consensusSubmitMessage.topicId) {
136
- summary += ` to topic ${tx.consensusSubmitMessage.topicId}`;
137
- }
138
- if (tx.consensusSubmitMessage.message) {
139
- if (tx.consensusSubmitMessage.messageEncoding === "utf8") {
140
- const preview = tx.consensusSubmitMessage.message.substring(0, 70);
141
- const needsEllipsis = tx.consensusSubmitMessage.message.length > 70;
142
- summary += `: "${preview}${needsEllipsis ? "..." : ""}"`;
143
- } else {
144
- const byteLength = Buffer.from(
145
- tx.consensusSubmitMessage.message,
146
- "base64"
147
- ).length;
148
- summary += ` (binary message data, length: ${byteLength} bytes)`;
371
+ /**
372
+ * Check if transaction bytes represent a valid Hedera transaction
373
+ */
374
+ static async isValidHederaTransaction(transactionBytes) {
375
+ try {
376
+ if (!this.validateTransactionBytes(transactionBytes).isValid) {
377
+ return false;
378
+ }
379
+ const bytes = this.decodeTransactionBytes(transactionBytes);
380
+ Transaction.fromBytes(bytes);
381
+ return true;
382
+ } catch {
383
+ return false;
149
384
  }
150
385
  }
151
- if (tx.consensusSubmitMessage.chunkInfoNumber && tx.consensusSubmitMessage.chunkInfoTotal) {
152
- summary += ` (chunk ${tx.consensusSubmitMessage.chunkInfoNumber}/${tx.consensusSubmitMessage.chunkInfoTotal})`;
153
- }
154
- return summary;
155
- };
156
- const summarizeFileCreate = (tx) => {
157
- if (!tx.fileCreate) {
158
- return tx.humanReadableType;
159
- }
160
- let summary = "Create File";
161
- if (tx.fileCreate.memo) {
162
- summary += ` with memo "${tx.fileCreate.memo}"`;
163
- }
164
- if (tx.fileCreate.contents) {
165
- summary += " (includes content)";
166
- }
167
- return summary;
168
- };
169
- const summarizeFileAppend = (tx) => {
170
- if (tx.fileAppend) {
171
- return `Append to File ${tx.fileAppend.fileId || "(Unknown ID)"}`;
172
- }
173
- return tx.humanReadableType;
174
- };
175
- const summarizeFileUpdate = (tx) => {
176
- if (tx.fileUpdate) {
177
- return `Update File ${tx.fileUpdate.fileId || "(Unknown ID)"}`;
178
- }
179
- return tx.humanReadableType;
180
- };
181
- const summarizeFileDelete = (tx) => {
182
- if (tx.fileDelete) {
183
- return `Delete File ${tx.fileDelete.fileId || "(Unknown ID)"}`;
184
- }
185
- return tx.humanReadableType;
186
- };
187
- const summarizeConsensusUpdateTopic = (tx) => {
188
- if (tx.consensusUpdateTopic) {
189
- return `Update Topic ${tx.consensusUpdateTopic.topicId || "(Unknown ID)"}`;
190
- }
191
- return tx.humanReadableType;
192
- };
193
- const summarizeConsensusDeleteTopic = (tx) => {
194
- if (tx.consensusDeleteTopic) {
195
- return `Delete Topic ${tx.consensusDeleteTopic.topicId || "(Unknown ID)"}`;
196
- }
197
- return tx.humanReadableType;
198
- };
199
- const summarizeTokenFreeze = (tx) => {
200
- if (tx.tokenFreeze) {
201
- return `Freeze Token ${tx.tokenFreeze.tokenId} for Account ${tx.tokenFreeze.accountId}`;
202
- }
203
- return tx.humanReadableType;
204
- };
205
- const summarizeTokenUnfreeze = (tx) => {
206
- if (tx.tokenUnfreeze) {
207
- return `Unfreeze Token ${tx.tokenUnfreeze.tokenId} for Account ${tx.tokenUnfreeze.accountId}`;
208
- }
209
- return tx.humanReadableType;
210
- };
211
- const summarizeTokenGrantKyc = (tx) => {
212
- if (tx.tokenGrantKyc) {
213
- return `Grant KYC for Token ${tx.tokenGrantKyc.tokenId} to Account ${tx.tokenGrantKyc.accountId}`;
214
- }
215
- return tx.humanReadableType;
216
- };
217
- const summarizeTokenRevokeKyc = (tx) => {
218
- if (tx.tokenRevokeKyc) {
219
- return `Revoke KYC for Token ${tx.tokenRevokeKyc.tokenId} from Account ${tx.tokenRevokeKyc.accountId}`;
220
- }
221
- return tx.humanReadableType;
222
- };
223
- const summarizeTokenPause = (tx) => {
224
- if (tx.tokenPause) {
225
- return `Pause Token ${tx.tokenPause.tokenId}`;
386
+ /**
387
+ * Legacy alias for decodeTransactionBytes - keeping for backward compatibility
388
+ */
389
+ static decodeBytesLegacy(transactionBytes) {
390
+ return this.decodeTransactionBytes(transactionBytes);
391
+ }
392
+ /**
393
+ * Parse transaction bytes into structured data using thin orchestration
394
+ * Delegates to specialized parsers for clean separation of concerns
395
+ */
396
+ static async parseTransaction(transactionBytes, options = {}) {
397
+ try {
398
+ const bytes = this.decodeTransactionBytes(transactionBytes);
399
+ const transaction = Transaction.fromBytes(bytes);
400
+ const metadata = this.extractTransactionMetadataEnhanced(transaction);
401
+ const parserResults = this.runAllParsers(transaction);
402
+ const primaryResult = parserResults.find(
403
+ (result2) => result2.type && result2.type !== "UNKNOWN"
404
+ ) || {};
405
+ const protoParsingResult = this.parseFromProtobuf(bytes);
406
+ const finalType = protoParsingResult.type || primaryResult.type || "UNKNOWN";
407
+ const finalHumanReadableType = protoParsingResult.humanReadableType || primaryResult.humanReadableType || "Unknown Transaction";
408
+ const result = {
409
+ type: finalType,
410
+ humanReadableType: finalHumanReadableType,
411
+ transfers: [],
412
+ tokenTransfers: [],
413
+ details: { ...metadata },
414
+ memo: typeof metadata.memo === "string" ? metadata.memo : void 0,
415
+ transactionId: typeof metadata.transactionId === "string" ? metadata.transactionId : void 0,
416
+ nodeAccountIds: Array.isArray(metadata.nodeAccountIds) ? metadata.nodeAccountIds : [],
417
+ maxTransactionFee: typeof metadata.maxTransactionFee === "string" ? metadata.maxTransactionFee : void 0,
418
+ validStart: typeof metadata.validStart === "string" ? metadata.validStart : void 0,
419
+ validDuration: typeof metadata.validDuration === "string" ? metadata.validDuration : void 0,
420
+ raw: options.includeRaw ? {} : void 0
421
+ };
422
+ this.mergeAllResults(
423
+ result,
424
+ protoParsingResult,
425
+ primaryResult,
426
+ parserResults
427
+ );
428
+ return result;
429
+ } catch (error) {
430
+ throw new TransactionParsingError(
431
+ "Failed to parse as regular transaction",
432
+ "REGULAR_PARSING_FAILED",
433
+ error instanceof Error ? error : void 0,
434
+ transactionBytes
435
+ );
436
+ }
226
437
  }
227
- return tx.humanReadableType;
228
- };
229
- const summarizeTokenUnpause = (tx) => {
230
- if (tx.tokenUnpause) {
231
- return `Unpause Token ${tx.tokenUnpause.tokenId}`;
438
+ /**
439
+ * Parse scheduled transaction body
440
+ */
441
+ static parseScheduledTransaction(transactionBytes, options = {}) {
442
+ try {
443
+ const parsedTx = this.parseTransactionBody(transactionBytes);
444
+ const validation = this.validateTransactionBytes(transactionBytes);
445
+ const enhancedResult = {
446
+ ...parsedTx,
447
+ details: {
448
+ ...parsedTx.details || {},
449
+ parseMethod: "scheduled",
450
+ validation,
451
+ parseAttempts: parsedTx.details?.parseAttempts || 1
452
+ },
453
+ formatDetection: {
454
+ originalFormat: validation.format || "base64",
455
+ wasConverted: false,
456
+ length: transactionBytes.length
457
+ }
458
+ };
459
+ return enhancedResult;
460
+ } catch (error) {
461
+ throw new TransactionParsingError(
462
+ "Failed to parse as scheduled transaction",
463
+ "SCHEDULED_PARSING_FAILED",
464
+ error instanceof Error ? error : void 0,
465
+ transactionBytes
466
+ );
467
+ }
232
468
  }
233
- return tx.humanReadableType;
234
- };
235
- const summarizeTokenWipe = (tx) => {
236
- if (tx.tokenWipeAccount) {
237
- let summary = `Wipe Token ${tx.tokenWipeAccount.tokenId} from Account ${tx.tokenWipeAccount.accountId}`;
238
- if (tx.tokenWipeAccount.serialNumbers && tx.tokenWipeAccount.serialNumbers.length > 0) {
239
- summary += ` (Serials: ${tx.tokenWipeAccount.serialNumbers.join(", ")})`;
469
+ /**
470
+ * Extract metadata from Transaction object (legacy method - keeping for backward compatibility)
471
+ */
472
+ static extractTransactionMetadata(transaction) {
473
+ return {
474
+ transactionId: transaction.transactionId?.toString(),
475
+ nodeAccountIds: transaction.nodeAccountIds?.map((id) => id.toString()) || [],
476
+ maxTransactionFee: transaction.maxTransactionFee?.toTinybars().toString() || "0",
477
+ memo: transaction._transactionMemo || void 0,
478
+ transfers: [],
479
+ tokenTransfers: []
480
+ };
481
+ }
482
+ /**
483
+ * Extract enhanced metadata from Transaction object
484
+ */
485
+ static extractTransactionMetadataEnhanced(transaction) {
486
+ return {
487
+ transactionId: transaction.transactionId?.toString(),
488
+ nodeAccountIds: transaction.nodeAccountIds?.map((id) => id.toString()) || [],
489
+ maxTransactionFee: transaction.maxTransactionFee?.toTinybars().toString() || "0",
490
+ memo: transaction._transactionMemo || void 0,
491
+ validStart: transaction._transactionValidStart?.toString(),
492
+ validDuration: transaction._transactionValidDuration?.toString()
493
+ };
494
+ }
495
+ /**
496
+ * Run all available parsers on a transaction
497
+ */
498
+ static runAllParsers(transaction) {
499
+ return [
500
+ HTSParser.parseFromTransactionObject(transaction),
501
+ CryptoParser.parseFromTransactionObject(transaction),
502
+ HCSParser.parseFromTransactionObject(transaction),
503
+ FileParser.parseFromTransactionObject(transaction),
504
+ SCSParser.parseFromTransactionObject(transaction),
505
+ ScheduleParser.parseFromTransactionObject(transaction),
506
+ UtilParser.parseFromTransactionObject(transaction)
507
+ ];
508
+ }
509
+ /**
510
+ * Parse transaction from protobuf bytes
511
+ */
512
+ static parseFromProtobuf(bytes) {
513
+ const result = {};
514
+ try {
515
+ const decoded = proto.TransactionList.decode(bytes);
516
+ if (decoded.transactionList && decoded.transactionList.length > 0) {
517
+ const tx = decoded.transactionList[0];
518
+ let txBody = null;
519
+ if (tx.bodyBytes && tx.bodyBytes.length > 0) {
520
+ txBody = proto.TransactionBody.decode(tx.bodyBytes);
521
+ } else if (tx.signedTransactionBytes && tx.signedTransactionBytes.length > 0) {
522
+ const signedTx = proto.SignedTransaction.decode(
523
+ tx.signedTransactionBytes
524
+ );
525
+ if (signedTx.bodyBytes) {
526
+ txBody = proto.TransactionBody.decode(signedTx.bodyBytes);
527
+ }
528
+ }
529
+ if (txBody) {
530
+ const typeResult = this.detectTransactionTypeFromBody(txBody);
531
+ result.type = typeResult.type;
532
+ result.humanReadableType = typeResult.humanReadableType;
533
+ const details = this.parseTransactionBodyDetails(
534
+ txBody,
535
+ typeResult.type
536
+ );
537
+ Object.assign(result, details);
538
+ }
539
+ }
540
+ } catch (error) {
240
541
  }
241
- if (tx.tokenWipeAccount.amount) {
242
- summary += ` (Amount: ${tx.tokenWipeAccount.amount})`;
542
+ return result;
543
+ }
544
+ /**
545
+ * Intelligently merge all parsing results
546
+ */
547
+ static mergeAllResults(result, protoResult, primaryResult, parserResults) {
548
+ const cryptoResult = parserResults.find((r) => r.transfers || r.tokenTransfers) || {};
549
+ result.transfers = cryptoResult.transfers || result.transfers || [];
550
+ result.tokenTransfers = cryptoResult.tokenTransfers || result.tokenTransfers || [];
551
+ Object.keys(protoResult).forEach((key) => {
552
+ if (protoResult[key] !== void 0 && key !== "type" && key !== "humanReadableType") {
553
+ result[key] = protoResult[key];
554
+ }
555
+ });
556
+ Object.keys(primaryResult).forEach((key) => {
557
+ if (primaryResult[key] !== void 0 && !(key in result) && key !== "type" && key !== "humanReadableType") {
558
+ result[key] = primaryResult[key];
559
+ }
560
+ });
561
+ }
562
+ /**
563
+ * Apply schedulable transaction parsing using registry pattern
564
+ * Eliminates conditional logic in parseTransactionBody
565
+ */
566
+ static applySchedulableTransactionParsing(txBody, result) {
567
+ if (txBody.cryptoTransfer) {
568
+ CryptoParser.parseCryptoTransfers(txBody.cryptoTransfer, result);
243
569
  }
244
- return summary;
245
- }
246
- return tx.humanReadableType;
247
- };
248
- const summarizeTokenDelete = (tx) => {
249
- if (tx.tokenDelete) {
250
- return `Delete Token ${tx.tokenDelete.tokenId}`;
251
- }
252
- return tx.humanReadableType;
253
- };
254
- const summarizeTokenAssociate = (tx) => {
255
- if (tx.tokenAssociate) {
256
- return `Associate Account ${tx.tokenAssociate.accountId} with Tokens: ${(tx.tokenAssociate.tokenIds || []).join(", ")}`;
257
- }
258
- return tx.humanReadableType;
259
- };
260
- const summarizeTokenDissociate = (tx) => {
261
- if (tx.tokenDissociate) {
262
- return `Dissociate Account ${tx.tokenDissociate.accountId} from Tokens: ${(tx.tokenDissociate.tokenIds || []).join(", ")}`;
263
- }
264
- return tx.humanReadableType;
265
- };
266
- const summarizeAccountDelete = (tx) => {
267
- if (tx.cryptoDelete) {
268
- return `Delete Account ${tx.cryptoDelete.deleteAccountId}`;
269
- }
270
- return tx.humanReadableType;
271
- };
272
- const summarizeAccountCreate = (tx) => {
273
- if (!tx.cryptoCreateAccount) {
274
- return tx.humanReadableType;
275
- }
276
- let summary = "Create Account";
277
- if (tx.cryptoCreateAccount.initialBalance && tx.cryptoCreateAccount.initialBalance !== "0") {
278
- summary += ` with balance ${tx.cryptoCreateAccount.initialBalance}`;
279
- }
280
- if (tx.cryptoCreateAccount.alias) {
281
- summary += ` (Alias: ${tx.cryptoCreateAccount.alias})`;
282
- }
283
- return summary;
284
- };
285
- const summarizeAccountUpdate = (tx) => {
286
- if (tx.cryptoUpdateAccount) {
287
- return `Update Account ${tx.cryptoUpdateAccount.accountIdToUpdate || "(Unknown ID)"}`;
288
- }
289
- return tx.humanReadableType;
290
- };
291
- const summarizeApproveAllowance = (tx) => {
292
- if (tx.cryptoApproveAllowance) {
293
- let count = 0;
294
- if (tx.cryptoApproveAllowance.hbarAllowances) {
295
- count += tx.cryptoApproveAllowance.hbarAllowances.length;
570
+ if (txBody.cryptoDelete) {
571
+ result.cryptoDelete = CryptoParser.parseCryptoDelete(txBody.cryptoDelete);
296
572
  }
297
- if (tx.cryptoApproveAllowance.tokenAllowances) {
298
- count += tx.cryptoApproveAllowance.tokenAllowances.length;
573
+ if (txBody.cryptoCreateAccount) {
574
+ result.cryptoCreateAccount = CryptoParser.parseCryptoCreateAccount(
575
+ txBody.cryptoCreateAccount
576
+ );
299
577
  }
300
- if (tx.cryptoApproveAllowance.nftAllowances) {
301
- count += tx.cryptoApproveAllowance.nftAllowances.length;
578
+ if (txBody.cryptoUpdateAccount) {
579
+ result.cryptoUpdateAccount = CryptoParser.parseCryptoUpdateAccount(
580
+ txBody.cryptoUpdateAccount
581
+ );
302
582
  }
303
- return `Approve ${count} Crypto Allowance(s)`;
304
- }
305
- return tx.humanReadableType;
306
- };
307
- const summarizeDeleteAllowance = (tx) => {
308
- if (tx.cryptoDeleteAllowance) {
309
- const count = (tx.cryptoDeleteAllowance.nftAllowancesToRemove || []).length;
310
- return `Delete ${count} NFT Crypto Allowance(s)`;
311
- }
312
- return tx.humanReadableType;
313
- };
314
- const summarizeContractCreate = (tx) => {
315
- if (tx.contractCreate) {
316
- let summary = "Create Contract";
317
- if (tx.contractCreate.memo) {
318
- summary += ` (Memo: ${tx.contractCreate.memo})`;
583
+ if (txBody.cryptoApproveAllowance) {
584
+ result.cryptoApproveAllowance = CryptoParser.parseCryptoApproveAllowance(
585
+ txBody.cryptoApproveAllowance
586
+ );
319
587
  }
320
- return summary;
321
- }
322
- return tx.humanReadableType;
323
- };
324
- const summarizeContractUpdate = (tx) => {
325
- if (tx.contractUpdate) {
326
- return `Update Contract ${tx.contractUpdate.contractIdToUpdate || "(Unknown ID)"}`;
327
- }
328
- return tx.humanReadableType;
329
- };
330
- const summarizeContractDelete = (tx) => {
331
- if (tx.contractDelete) {
332
- let summary = `Delete Contract ${tx.contractDelete.contractIdToDelete || "(Unknown ID)"}`;
333
- if (tx.contractDelete.transferAccountId) {
334
- summary += ` (Transfer to Account: ${tx.contractDelete.transferAccountId})`;
335
- } else if (tx.contractDelete.transferContractId) {
336
- summary += ` (Transfer to Contract: ${tx.contractDelete.transferContractId})`;
337
- }
338
- return summary;
339
- }
340
- return tx.humanReadableType;
341
- };
342
- const summarizeTokenUpdate = (tx) => {
343
- if (tx.tokenUpdate) {
344
- return `Update Token ${tx.tokenUpdate.tokenId || "(Unknown ID)"}`;
345
- }
346
- return tx.humanReadableType;
347
- };
348
- const summarizeTokenFeeScheduleUpdate = (tx) => {
349
- if (tx.tokenFeeScheduleUpdate) {
350
- return `Update Fee Schedule for Token ${tx.tokenFeeScheduleUpdate.tokenId || "(Unknown ID)"}`;
351
- }
352
- return tx.humanReadableType;
353
- };
354
- const summarizeTokenAirdrop = (tx) => {
355
- if (!tx.tokenAirdrop || !tx.tokenAirdrop.tokenTransfers) {
356
- return tx.humanReadableType;
357
- }
358
- let tokenTypes = 0;
359
- let totalTransfers = 0;
360
- for (const t of tx.tokenAirdrop.tokenTransfers) {
361
- tokenTypes += 1;
362
- totalTransfers += Array.isArray(t.transfers) ? t.transfers.length : 0;
363
- }
364
- return `Token Airdrop across ${tokenTypes} token(s), ${totalTransfers} transfer(s)`;
365
- };
366
- const summarizeScheduleCreate = (tx) => {
367
- if (!tx.scheduleCreate) {
368
- return tx.humanReadableType;
369
- }
370
- let summary = "Create Schedule";
371
- if (tx.scheduleCreate.memo) {
372
- summary += ` (Memo: ${tx.scheduleCreate.memo})`;
373
- }
374
- return summary;
375
- };
376
- const summarizeScheduleSign = (tx) => {
377
- if (tx.scheduleSign) {
378
- return "Sign Schedule";
379
- }
380
- return tx.humanReadableType;
381
- };
382
- const summarizeScheduleDelete = (tx) => {
383
- if (tx.scheduleDelete) {
384
- return "Delete Schedule";
385
- }
386
- return tx.humanReadableType;
387
- };
388
- const summarizeSystemDelete = (tx) => {
389
- if (!tx.systemDelete) {
390
- return tx.humanReadableType;
391
- }
392
- if (tx.systemDelete.fileId) {
393
- return `System Delete File ${tx.systemDelete.fileId}`;
394
- }
395
- if (tx.systemDelete.contractId) {
396
- return `System Delete Contract ${tx.systemDelete.contractId}`;
397
- }
398
- return "System Delete";
399
- };
400
- const summarizeSystemUndelete = (tx) => {
401
- if (!tx.systemUndelete) {
402
- return tx.humanReadableType;
403
- }
404
- if (tx.systemUndelete.fileId) {
405
- return `System Undelete File ${tx.systemUndelete.fileId}`;
406
- }
407
- if (tx.systemUndelete.contractId) {
408
- return `System Undelete Contract ${tx.systemUndelete.contractId}`;
409
- }
410
- return "System Undelete";
411
- };
412
- const summarizeFreeze = (tx) => {
413
- return "Network Freeze";
414
- };
415
- const summarizeEthereumTransaction = (tx) => {
416
- return "Ethereum Transaction";
417
- };
418
- const summarizeUncheckedSubmit = (tx) => {
419
- if (tx.uncheckedSubmit && tx.uncheckedSubmit.topicId) {
420
- return `Unchecked Submit to topic ${tx.uncheckedSubmit.topicId}`;
421
- }
422
- return "Unchecked Submit";
423
- };
424
- const summarizeNodeCreate = (tx) => {
425
- return "Create Node";
426
- };
427
- const summarizeNodeUpdate = (tx) => {
428
- return "Update Node";
429
- };
430
- const summarizeNodeDelete = (tx) => {
431
- return "Delete Node";
432
- };
433
- const summarizeAtomicBatch = (tx) => {
434
- const count = Array.isArray(tx.atomicBatch?.transactions) ? tx.atomicBatch.transactions.length : 0;
435
- return `Atomic Batch (${count} transaction(s))`;
436
- };
437
- const transactionSummaryRegistry = {
438
- CRYPTOTRANSFER: { fn: summarizeCryptoTransfer },
439
- cryptoTransfer: { fn: summarizeCryptoTransfer },
440
- CONTRACTCALL: { fn: summarizeContractCall },
441
- contractCall: { fn: summarizeContractCall },
442
- TOKENMINT: { fn: summarizeTokenMint },
443
- tokenMint: { fn: summarizeTokenMint },
444
- TOKENBURN: { fn: summarizeTokenBurn },
445
- tokenBurn: { fn: summarizeTokenBurn },
446
- TOKENCREATE: { fn: summarizeTokenCreate },
447
- tokenCreation: { fn: summarizeTokenCreate },
448
- TOPICCREATE: { fn: summarizeConsensusCreateTopic },
449
- consensusCreateTopic: { fn: summarizeConsensusCreateTopic },
450
- CONSENSUSSUBMITMESSAGE: { fn: summarizeConsensusSubmitMessage },
451
- consensusSubmitMessage: { fn: summarizeConsensusSubmitMessage },
452
- TOPICUPDATE: { fn: summarizeConsensusUpdateTopic },
453
- consensusUpdateTopic: { fn: summarizeConsensusUpdateTopic },
454
- TOPICDELETE: { fn: summarizeConsensusDeleteTopic },
455
- consensusDeleteTopic: { fn: summarizeConsensusDeleteTopic },
456
- FILECREATE: { fn: summarizeFileCreate },
457
- fileCreate: { fn: summarizeFileCreate },
458
- FILEAPPEND: { fn: summarizeFileAppend },
459
- fileAppend: { fn: summarizeFileAppend },
460
- FILEUPDATE: { fn: summarizeFileUpdate },
461
- fileUpdate: { fn: summarizeFileUpdate },
462
- FILEDELETE: { fn: summarizeFileDelete },
463
- fileDelete: { fn: summarizeFileDelete },
464
- TOKENUPDATE: { fn: summarizeTokenUpdate },
465
- tokenUpdate: { fn: summarizeTokenUpdate },
466
- TOKENFEESCHEDULEUPDATE: { fn: summarizeTokenFeeScheduleUpdate },
467
- tokenFeeScheduleUpdate: { fn: summarizeTokenFeeScheduleUpdate },
468
- TOKENFREEZE: { fn: summarizeTokenFreeze },
469
- tokenFreeze: { fn: summarizeTokenFreeze },
470
- TOKENUNFREEZE: { fn: summarizeTokenUnfreeze },
471
- tokenUnfreeze: { fn: summarizeTokenUnfreeze },
472
- TOKENGRANTKYC: { fn: summarizeTokenGrantKyc },
473
- tokenGrantKyc: { fn: summarizeTokenGrantKyc },
474
- TOKENREVOKEKYC: { fn: summarizeTokenRevokeKyc },
475
- tokenRevokeKyc: { fn: summarizeTokenRevokeKyc },
476
- TOKENPAUSE: { fn: summarizeTokenPause },
477
- tokenPause: { fn: summarizeTokenPause },
478
- TOKENUNPAUSE: { fn: summarizeTokenUnpause },
479
- tokenUnpause: { fn: summarizeTokenUnpause },
480
- TOKENWIPE: { fn: summarizeTokenWipe },
481
- TOKENWIPEACCOUNT: { fn: summarizeTokenWipe },
482
- tokenWipe: { fn: summarizeTokenWipe },
483
- tokenWipeAccount: { fn: summarizeTokenWipe },
484
- TOKENDELETE: { fn: summarizeTokenDelete },
485
- tokenDelete: { fn: summarizeTokenDelete },
486
- TOKENASSOCIATE: { fn: summarizeTokenAssociate },
487
- tokenAssociate: { fn: summarizeTokenAssociate },
488
- TOKENDISSOCIATE: { fn: summarizeTokenDissociate },
489
- tokenDissociate: { fn: summarizeTokenDissociate },
490
- ACCOUNTDELETE: { fn: summarizeAccountDelete },
491
- cryptoDelete: { fn: summarizeAccountDelete },
492
- ACCOUNTCREATE: { fn: summarizeAccountCreate },
493
- cryptoCreateAccount: { fn: summarizeAccountCreate },
494
- ACCOUNTUPDATE: { fn: summarizeAccountUpdate },
495
- cryptoUpdateAccount: { fn: summarizeAccountUpdate },
496
- APPROVEALLOWANCE: { fn: summarizeApproveAllowance },
497
- cryptoApproveAllowance: { fn: summarizeApproveAllowance },
498
- DELETEALLOWANCE: { fn: summarizeDeleteAllowance },
499
- cryptoDeleteAllowance: { fn: summarizeDeleteAllowance },
500
- CONTRACTCREATE: { fn: summarizeContractCreate },
501
- contractCreate: { fn: summarizeContractCreate },
502
- CONTRACTUPDATE: { fn: summarizeContractUpdate },
503
- contractUpdate: { fn: summarizeContractUpdate },
504
- CONTRACTDELETE: { fn: summarizeContractDelete },
505
- contractDelete: { fn: summarizeContractDelete },
506
- TOKENAIRDROP: { fn: summarizeTokenAirdrop },
507
- tokenAirdrop: { fn: summarizeTokenAirdrop },
508
- SCHEDULECREATE: { fn: summarizeScheduleCreate },
509
- scheduleCreate: { fn: summarizeScheduleCreate },
510
- SCHEDULESIGN: { fn: summarizeScheduleSign },
511
- scheduleSign: { fn: summarizeScheduleSign },
512
- SCHEDULEDELETE: { fn: summarizeScheduleDelete },
513
- scheduleDelete: { fn: summarizeScheduleDelete },
514
- SYSTEMDELETE: { fn: summarizeSystemDelete },
515
- systemDelete: { fn: summarizeSystemDelete },
516
- SYSTEMUNDELETE: { fn: summarizeSystemUndelete },
517
- systemUndelete: { fn: summarizeSystemUndelete },
518
- FREEZE: { fn: summarizeFreeze },
519
- freeze: { fn: summarizeFreeze },
520
- ETHEREUMTRANSACTION: { fn: summarizeEthereumTransaction },
521
- ethereumTransaction: { fn: summarizeEthereumTransaction },
522
- UNCHECKEDSUBMIT: { fn: summarizeUncheckedSubmit },
523
- uncheckedSubmit: { fn: summarizeUncheckedSubmit },
524
- NODECREATE: { fn: summarizeNodeCreate },
525
- nodeCreate: { fn: summarizeNodeCreate },
526
- NODEUPDATE: { fn: summarizeNodeUpdate },
527
- nodeUpdate: { fn: summarizeNodeUpdate },
528
- NODEDELETE: { fn: summarizeNodeDelete },
529
- nodeDelete: { fn: summarizeNodeDelete },
530
- ATOMICBATCH: { fn: summarizeAtomicBatch },
531
- atomicBatch: { fn: summarizeAtomicBatch }
532
- };
533
- const resolveTransactionSummary = (tx) => {
534
- const spec = transactionSummaryRegistry[tx.type];
535
- if (spec) {
536
- if (spec.fn) {
537
- return spec.fn(tx);
588
+ if (txBody.cryptoDeleteAllowance) {
589
+ result.cryptoDeleteAllowance = CryptoParser.parseCryptoDeleteAllowance(
590
+ txBody.cryptoDeleteAllowance
591
+ );
538
592
  }
539
- if (spec.template) {
540
- return renderTemplate(spec.template, tx);
593
+ if (txBody.contractCall) {
594
+ result.contractCall = SCSParser.parseContractCall(txBody.contractCall);
541
595
  }
542
- }
543
- const hrSpec = transactionSummaryRegistry[tx.humanReadableType];
544
- if (hrSpec) {
545
- if (hrSpec.fn) {
546
- return hrSpec.fn(tx);
596
+ if (txBody.contractCreateInstance) {
597
+ result.contractCreate = SCSParser.parseContractCreate(
598
+ txBody.contractCreateInstance
599
+ );
600
+ }
601
+ if (txBody.contractUpdateInstance) {
602
+ result.contractUpdate = SCSParser.parseContractUpdate(
603
+ txBody.contractUpdateInstance
604
+ );
547
605
  }
548
- if (hrSpec.template) {
549
- return renderTemplate(hrSpec.template, tx);
606
+ if (txBody.contractDeleteInstance) {
607
+ result.contractDelete = SCSParser.parseContractDelete(
608
+ txBody.contractDeleteInstance
609
+ );
610
+ }
611
+ if (txBody.tokenCreation) {
612
+ result.tokenCreation = HTSParser.parseTokenCreate(txBody.tokenCreation);
613
+ }
614
+ if (txBody.tokenMint) {
615
+ result.tokenMint = HTSParser.parseTokenMint(txBody.tokenMint);
616
+ }
617
+ if (txBody.tokenBurn) {
618
+ result.tokenBurn = HTSParser.parseTokenBurn(txBody.tokenBurn);
619
+ }
620
+ if (txBody.tokenUpdate) {
621
+ result.tokenUpdate = HTSParser.parseTokenUpdate(txBody.tokenUpdate);
622
+ }
623
+ if (txBody.tokenFeeScheduleUpdate) {
624
+ result.tokenFeeScheduleUpdate = HTSParser.parseTokenFeeScheduleUpdate(
625
+ txBody.tokenFeeScheduleUpdate
626
+ );
627
+ }
628
+ if (txBody.tokenFreeze) {
629
+ result.tokenFreeze = HTSParser.parseTokenFreeze(txBody.tokenFreeze);
630
+ }
631
+ if (txBody.tokenUnfreeze) {
632
+ result.tokenUnfreeze = HTSParser.parseTokenUnfreeze(txBody.tokenUnfreeze);
633
+ }
634
+ if (txBody.tokenGrantKyc) {
635
+ result.tokenGrantKyc = HTSParser.parseTokenGrantKyc(txBody.tokenGrantKyc);
636
+ }
637
+ if (txBody.tokenRevokeKyc) {
638
+ result.tokenRevokeKyc = HTSParser.parseTokenRevokeKyc(
639
+ txBody.tokenRevokeKyc
640
+ );
641
+ }
642
+ if (txBody.tokenPause) {
643
+ result.tokenPause = HTSParser.parseTokenPause(txBody.tokenPause);
644
+ }
645
+ if (txBody.tokenUnpause) {
646
+ result.tokenUnpause = HTSParser.parseTokenUnpause(txBody.tokenUnpause);
647
+ }
648
+ if (txBody.tokenWipe) {
649
+ result.tokenWipeAccount = HTSParser.parseTokenWipeAccount(
650
+ txBody.tokenWipe
651
+ );
652
+ }
653
+ if (txBody.tokenDeletion) {
654
+ result.tokenDelete = HTSParser.parseTokenDelete(txBody.tokenDeletion);
655
+ }
656
+ if (txBody.tokenAssociate) {
657
+ result.tokenAssociate = HTSParser.parseTokenAssociate(
658
+ txBody.tokenAssociate
659
+ );
660
+ }
661
+ if (txBody.tokenDissociate) {
662
+ result.tokenDissociate = HTSParser.parseTokenDissociate(
663
+ txBody.tokenDissociate
664
+ );
665
+ }
666
+ if (txBody.tokenAirdrop) {
667
+ result.tokenAirdrop = HTSParser.parseTokenAirdropFromProto(
668
+ txBody.tokenAirdrop
669
+ );
670
+ }
671
+ if (txBody.consensusCreateTopic) {
672
+ result.consensusCreateTopic = HCSParser.parseConsensusCreateTopic(
673
+ txBody.consensusCreateTopic
674
+ );
675
+ }
676
+ if (txBody.consensusSubmitMessage) {
677
+ result.consensusSubmitMessage = HCSParser.parseConsensusSubmitMessage(
678
+ txBody.consensusSubmitMessage
679
+ );
680
+ }
681
+ if (txBody.consensusUpdateTopic) {
682
+ result.consensusUpdateTopic = HCSParser.parseConsensusUpdateTopic(
683
+ txBody.consensusUpdateTopic
684
+ );
685
+ }
686
+ if (txBody.consensusDeleteTopic) {
687
+ result.consensusDeleteTopic = HCSParser.parseConsensusDeleteTopic(
688
+ txBody.consensusDeleteTopic
689
+ );
690
+ }
691
+ if (txBody.fileCreate) {
692
+ result.fileCreate = FileParser.parseFileCreate(txBody.fileCreate);
693
+ }
694
+ if (txBody.fileAppend) {
695
+ result.fileAppend = FileParser.parseFileAppend(txBody.fileAppend);
696
+ }
697
+ if (txBody.fileUpdate) {
698
+ result.fileUpdate = FileParser.parseFileUpdate(txBody.fileUpdate);
699
+ }
700
+ if (txBody.fileDelete) {
701
+ result.fileDelete = FileParser.parseFileDelete(txBody.fileDelete);
702
+ }
703
+ if (txBody.utilPrng) {
704
+ result.utilPrng = UtilParser.parseUtilPrng(txBody.utilPrng);
550
705
  }
551
706
  }
552
- if (tx.type === "cryptoTransfer" || tx.type === "CRYPTOTRANSFER") {
553
- return summarizeCryptoTransfer(tx);
554
- }
555
- if (tx.contractCall) {
556
- return summarizeContractCall(tx);
557
- }
558
- if (Array.isArray(tx.tokenTransfers) && tx.tokenTransfers.length > 0) {
559
- return summarizeTokenTransfers(tx);
707
+ /**
708
+ * Parse transaction body details for all supported transaction types
709
+ * Uses a scalable registry pattern instead of if-else chains
710
+ */
711
+ static parseTransactionBodyDetails(txBody, transactionType) {
712
+ const result = {};
713
+ const parserConfig = transactionParserRegistry[transactionType];
714
+ if (parserConfig) {
715
+ const bodyData = txBody[parserConfig.bodyField];
716
+ if (bodyData) {
717
+ const parserResult = parserConfig.parser(bodyData);
718
+ if (parserConfig.spreadResult) {
719
+ Object.assign(result, parserResult);
720
+ } else {
721
+ result[parserConfig.resultField] = parserResult;
722
+ }
723
+ }
724
+ }
725
+ return result;
726
+ }
727
+ /**
728
+ * Merge protobuf parsing results with parser results using registry pattern
729
+ * Eliminates transactionFields array and forEach logic
730
+ */
731
+ static mergeProtoParsingResults(result, protoResult, htsResult, transaction, originalBytes) {
732
+ const fieldsToMerge = Object.values(transactionParserRegistry).map(
733
+ (config) => config.resultField
734
+ );
735
+ for (const field of fieldsToMerge) {
736
+ const protoValue = protoResult[field];
737
+ const htsValue = htsResult[field];
738
+ if (protoValue !== void 0) {
739
+ result[field] = protoValue;
740
+ } else if (htsValue !== void 0) {
741
+ result[field] = htsValue;
742
+ } else {
743
+ this.handleSpecialFieldExtraction(result, field, transaction);
744
+ }
745
+ }
560
746
  }
561
- if (tx.humanReadableType && tx.humanReadableType !== "Unknown Transaction") {
562
- return tx.humanReadableType;
747
+ /**
748
+ * Handle special field extraction cases using registry pattern
749
+ */
750
+ static handleSpecialFieldExtraction(result, field, transaction) {
751
+ if (field === "tokenCreation" && result.type === "TOKENCREATE") {
752
+ const extracted = HTSParser.extractTokenCreationFromTransaction(transaction);
753
+ if (extracted) {
754
+ result[field] = extracted;
755
+ }
756
+ } else if (field === "tokenAirdrop" && result.type === "TOKENAIRDROP") {
757
+ const extracted = HTSParser.extractTokenAirdropFromTransaction(transaction);
758
+ if (extracted) {
759
+ result[field] = extracted;
760
+ }
761
+ }
563
762
  }
564
- return "Unknown Transaction";
565
- };
763
+ /**
764
+ * Create fallback result when all parsing methods fail
765
+ */
766
+ static createFallbackResult(transactionBytes, primaryError, secondaryError) {
767
+ const validation = this.validateTransactionBytes(transactionBytes);
768
+ return {
769
+ type: "UNKNOWN",
770
+ humanReadableType: "Unknown Transaction",
771
+ transfers: [],
772
+ tokenTransfers: [],
773
+ details: {
774
+ rawBytes: transactionBytes.length > 100 ? transactionBytes.substring(0, 100) + "..." : transactionBytes,
775
+ primaryError: primaryError?.message,
776
+ secondaryError: secondaryError?.message,
777
+ parseAttempts: secondaryError ? 2 : 1,
778
+ validation
779
+ },
780
+ formatDetection: {
781
+ originalFormat: validation.format || "base64",
782
+ wasConverted: false,
783
+ length: transactionBytes.length
784
+ },
785
+ raw: {}
786
+ };
787
+ }
788
+ }
566
789
  export {
567
- resolveTransactionSummary,
568
- transactionSummaryRegistry
790
+ TransactionParser,
791
+ TransactionParsingError
569
792
  };
570
793
  //# sourceMappingURL=standards-sdk.es123.js.map