@hashgraphonline/standards-sdk 0.1.144 → 0.1.145

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 (423) hide show
  1. package/dist/cjs/hcs-10/base-client.d.ts.map +1 -1
  2. package/dist/cjs/hcs-10/sdk.d.ts +8 -0
  3. package/dist/cjs/hcs-10/sdk.d.ts.map +1 -1
  4. package/dist/cjs/hcs-11/client.d.ts +2 -2
  5. package/dist/cjs/hcs-11/client.d.ts.map +1 -1
  6. package/dist/cjs/hcs-11/person-builder.d.ts +1 -0
  7. package/dist/cjs/hcs-11/person-builder.d.ts.map +1 -1
  8. package/dist/cjs/hcs-11/types.d.ts +1 -0
  9. package/dist/cjs/hcs-11/types.d.ts.map +1 -1
  10. package/dist/cjs/hcs-12/rendering/resource-manager.d.ts.map +1 -1
  11. package/dist/cjs/hcs-14/issuers/hiero.d.ts.map +1 -1
  12. package/dist/cjs/hcs-15/browser.d.ts +2 -0
  13. package/dist/cjs/hcs-15/browser.d.ts.map +1 -1
  14. package/dist/cjs/hcs-15/sdk.d.ts +7 -1
  15. package/dist/cjs/hcs-15/sdk.d.ts.map +1 -1
  16. package/dist/cjs/hcs-15/tx.d.ts +4 -0
  17. package/dist/cjs/hcs-15/tx.d.ts.map +1 -1
  18. package/dist/cjs/hcs-15/types.d.ts +16 -1
  19. package/dist/cjs/hcs-15/types.d.ts.map +1 -1
  20. package/dist/cjs/hcs-16/browser.d.ts +11 -2
  21. package/dist/cjs/hcs-16/browser.d.ts.map +1 -1
  22. package/dist/cjs/hcs-16/sdk.d.ts +62 -1
  23. package/dist/cjs/hcs-16/sdk.d.ts.map +1 -1
  24. package/dist/cjs/hcs-16/tx.d.ts +21 -3
  25. package/dist/cjs/hcs-16/tx.d.ts.map +1 -1
  26. package/dist/cjs/hcs-17/base-client.d.ts +1 -0
  27. package/dist/cjs/hcs-17/base-client.d.ts.map +1 -1
  28. package/dist/cjs/hcs-17/sdk.d.ts.map +1 -1
  29. package/dist/cjs/hcs-17/tx.d.ts +2 -0
  30. package/dist/cjs/hcs-17/tx.d.ts.map +1 -1
  31. package/dist/cjs/hcs-17/types.d.ts +4 -0
  32. package/dist/cjs/hcs-17/types.d.ts.map +1 -1
  33. package/dist/cjs/index.d.ts.map +1 -1
  34. package/dist/cjs/services/registry-broker/client/base-client.d.ts +14 -1
  35. package/dist/cjs/services/registry-broker/client/base-client.d.ts.map +1 -1
  36. package/dist/cjs/services/registry-broker/client/feedback.d.ts +2 -0
  37. package/dist/cjs/services/registry-broker/client/feedback.d.ts.map +1 -0
  38. package/dist/cjs/services/registry-broker/private-key-signer.d.ts +1 -0
  39. package/dist/cjs/services/registry-broker/private-key-signer.d.ts.map +1 -1
  40. package/dist/cjs/services/registry-broker/schemas.d.ts +998 -577
  41. package/dist/cjs/services/registry-broker/schemas.d.ts.map +1 -1
  42. package/dist/cjs/services/registry-broker/types.d.ts +20 -1
  43. package/dist/cjs/services/registry-broker/types.d.ts.map +1 -1
  44. package/dist/cjs/standards-sdk.cjs +2 -2
  45. package/dist/cjs/standards-sdk.cjs.map +1 -1
  46. package/dist/cjs/utils/crypto-abstraction.d.ts.map +1 -1
  47. package/dist/cjs/utils/crypto-env.d.ts.map +1 -1
  48. package/dist/cjs/utils/dynamic-import.d.ts +5 -1
  49. package/dist/cjs/utils/dynamic-import.d.ts.map +1 -1
  50. package/dist/cjs/utils/hash-adapter.d.ts.map +1 -1
  51. package/dist/es/hcs-10/base-client.d.ts.map +1 -1
  52. package/dist/es/hcs-10/sdk.d.ts +8 -0
  53. package/dist/es/hcs-10/sdk.d.ts.map +1 -1
  54. package/dist/es/hcs-11/client.d.ts +2 -2
  55. package/dist/es/hcs-11/client.d.ts.map +1 -1
  56. package/dist/es/hcs-11/person-builder.d.ts +1 -0
  57. package/dist/es/hcs-11/person-builder.d.ts.map +1 -1
  58. package/dist/es/hcs-11/types.d.ts +1 -0
  59. package/dist/es/hcs-11/types.d.ts.map +1 -1
  60. package/dist/es/hcs-12/rendering/resource-manager.d.ts.map +1 -1
  61. package/dist/es/hcs-14/issuers/hiero.d.ts.map +1 -1
  62. package/dist/es/hcs-15/browser.d.ts +2 -0
  63. package/dist/es/hcs-15/browser.d.ts.map +1 -1
  64. package/dist/es/hcs-15/sdk.d.ts +7 -1
  65. package/dist/es/hcs-15/sdk.d.ts.map +1 -1
  66. package/dist/es/hcs-15/tx.d.ts +4 -0
  67. package/dist/es/hcs-15/tx.d.ts.map +1 -1
  68. package/dist/es/hcs-15/types.d.ts +16 -1
  69. package/dist/es/hcs-15/types.d.ts.map +1 -1
  70. package/dist/es/hcs-16/browser.d.ts +11 -2
  71. package/dist/es/hcs-16/browser.d.ts.map +1 -1
  72. package/dist/es/hcs-16/sdk.d.ts +62 -1
  73. package/dist/es/hcs-16/sdk.d.ts.map +1 -1
  74. package/dist/es/hcs-16/tx.d.ts +21 -3
  75. package/dist/es/hcs-16/tx.d.ts.map +1 -1
  76. package/dist/es/hcs-17/base-client.d.ts +1 -0
  77. package/dist/es/hcs-17/base-client.d.ts.map +1 -1
  78. package/dist/es/hcs-17/sdk.d.ts.map +1 -1
  79. package/dist/es/hcs-17/tx.d.ts +2 -0
  80. package/dist/es/hcs-17/tx.d.ts.map +1 -1
  81. package/dist/es/hcs-17/types.d.ts +4 -0
  82. package/dist/es/hcs-17/types.d.ts.map +1 -1
  83. package/dist/es/index.d.ts.map +1 -1
  84. package/dist/es/services/registry-broker/client/base-client.d.ts +14 -1
  85. package/dist/es/services/registry-broker/client/base-client.d.ts.map +1 -1
  86. package/dist/es/services/registry-broker/client/feedback.d.ts +2 -0
  87. package/dist/es/services/registry-broker/client/feedback.d.ts.map +1 -0
  88. package/dist/es/services/registry-broker/private-key-signer.d.ts +1 -0
  89. package/dist/es/services/registry-broker/private-key-signer.d.ts.map +1 -1
  90. package/dist/es/services/registry-broker/schemas.d.ts +998 -577
  91. package/dist/es/services/registry-broker/schemas.d.ts.map +1 -1
  92. package/dist/es/services/registry-broker/types.d.ts +20 -1
  93. package/dist/es/services/registry-broker/types.d.ts.map +1 -1
  94. package/dist/es/standards-sdk.es.js +141 -135
  95. package/dist/es/standards-sdk.es.js.map +1 -1
  96. package/dist/es/standards-sdk.es10.js +70 -90
  97. package/dist/es/standards-sdk.es10.js.map +1 -1
  98. package/dist/es/standards-sdk.es100.js +229 -26
  99. package/dist/es/standards-sdk.es100.js.map +1 -1
  100. package/dist/es/standards-sdk.es101.js +109 -228
  101. package/dist/es/standards-sdk.es101.js.map +1 -1
  102. package/dist/es/standards-sdk.es102.js +15 -94
  103. package/dist/es/standards-sdk.es102.js.map +1 -1
  104. package/dist/es/standards-sdk.es103.js +80 -30
  105. package/dist/es/standards-sdk.es103.js.map +1 -1
  106. package/dist/es/standards-sdk.es104.js +27 -80
  107. package/dist/es/standards-sdk.es104.js.map +1 -1
  108. package/dist/es/standards-sdk.es105.js +136 -25
  109. package/dist/es/standards-sdk.es105.js.map +1 -1
  110. package/dist/es/standards-sdk.es106.js +27 -140
  111. package/dist/es/standards-sdk.es106.js.map +1 -1
  112. package/dist/es/standards-sdk.es107.js +20 -27
  113. package/dist/es/standards-sdk.es107.js.map +1 -1
  114. package/dist/es/standards-sdk.es108.js +156 -18
  115. package/dist/es/standards-sdk.es108.js.map +1 -1
  116. package/dist/es/standards-sdk.es109.js +198 -148
  117. package/dist/es/standards-sdk.es109.js.map +1 -1
  118. package/dist/es/standards-sdk.es11.js +121 -45
  119. package/dist/es/standards-sdk.es11.js.map +1 -1
  120. package/dist/es/standards-sdk.es110.js +747 -166
  121. package/dist/es/standards-sdk.es110.js.map +1 -1
  122. package/dist/es/standards-sdk.es111.js +9 -786
  123. package/dist/es/standards-sdk.es111.js.map +1 -1
  124. package/dist/es/standards-sdk.es112.js +567 -13
  125. package/dist/es/standards-sdk.es112.js.map +1 -1
  126. package/dist/es/standards-sdk.es113.js +576 -541
  127. package/dist/es/standards-sdk.es113.js.map +1 -1
  128. package/dist/es/standards-sdk.es114.js +12 -601
  129. package/dist/es/standards-sdk.es114.js.map +1 -1
  130. package/dist/es/standards-sdk.es115.js +2 -13
  131. package/dist/es/standards-sdk.es115.js.map +1 -1
  132. package/dist/es/standards-sdk.es116.js +87 -2
  133. package/dist/es/standards-sdk.es116.js.map +1 -1
  134. package/dist/es/standards-sdk.es117.js +37 -80
  135. package/dist/es/standards-sdk.es117.js.map +1 -1
  136. package/dist/es/standards-sdk.es118.js +2 -39
  137. package/dist/es/standards-sdk.es118.js.map +1 -1
  138. package/dist/es/standards-sdk.es119.js +231 -2
  139. package/dist/es/standards-sdk.es119.js.map +1 -1
  140. package/dist/es/standards-sdk.es12.js +60 -159
  141. package/dist/es/standards-sdk.es12.js.map +1 -1
  142. package/dist/es/standards-sdk.es120.js +1110 -193
  143. package/dist/es/standards-sdk.es120.js.map +1 -1
  144. package/dist/es/standards-sdk.es121.js +225 -1059
  145. package/dist/es/standards-sdk.es121.js.map +1 -1
  146. package/dist/es/standards-sdk.es122.js +419 -303
  147. package/dist/es/standards-sdk.es122.js.map +1 -1
  148. package/dist/es/standards-sdk.es123.js +351 -418
  149. package/dist/es/standards-sdk.es123.js.map +1 -1
  150. package/dist/es/standards-sdk.es124.js +872 -347
  151. package/dist/es/standards-sdk.es124.js.map +1 -1
  152. package/dist/es/standards-sdk.es125.js +182 -854
  153. package/dist/es/standards-sdk.es125.js.map +1 -1
  154. package/dist/es/standards-sdk.es126.js +1512 -153
  155. package/dist/es/standards-sdk.es126.js.map +1 -1
  156. package/dist/es/standards-sdk.es127.js +157 -1547
  157. package/dist/es/standards-sdk.es127.js.map +1 -1
  158. package/dist/es/standards-sdk.es128.js +192 -162
  159. package/dist/es/standards-sdk.es128.js.map +1 -1
  160. package/dist/es/standards-sdk.es129.js +61 -164
  161. package/dist/es/standards-sdk.es129.js.map +1 -1
  162. package/dist/es/standards-sdk.es13.js +200 -60
  163. package/dist/es/standards-sdk.es13.js.map +1 -1
  164. package/dist/es/standards-sdk.es130.js +102 -85
  165. package/dist/es/standards-sdk.es130.js.map +1 -1
  166. package/dist/es/standards-sdk.es131.js +222 -96
  167. package/dist/es/standards-sdk.es131.js.map +1 -1
  168. package/dist/es/standards-sdk.es132.js +153 -220
  169. package/dist/es/standards-sdk.es132.js.map +1 -1
  170. package/dist/es/standards-sdk.es133.js +104 -162
  171. package/dist/es/standards-sdk.es133.js.map +1 -1
  172. package/dist/es/standards-sdk.es134.js +296 -92
  173. package/dist/es/standards-sdk.es134.js.map +1 -1
  174. package/dist/es/standards-sdk.es135.js +432 -294
  175. package/dist/es/standards-sdk.es135.js.map +1 -1
  176. package/dist/es/standards-sdk.es136.js +14 -363
  177. package/dist/es/standards-sdk.es136.js.map +1 -1
  178. package/dist/es/standards-sdk.es137.js +79 -15
  179. package/dist/es/standards-sdk.es137.js.map +1 -1
  180. package/dist/es/standards-sdk.es138.js +79 -59
  181. package/dist/es/standards-sdk.es138.js.map +1 -1
  182. package/dist/es/standards-sdk.es139.js +152 -80
  183. package/dist/es/standards-sdk.es139.js.map +1 -1
  184. package/dist/es/standards-sdk.es14.js +149 -178
  185. package/dist/es/standards-sdk.es14.js.map +1 -1
  186. package/dist/es/standards-sdk.es140.js +7 -159
  187. package/dist/es/standards-sdk.es140.js.map +1 -1
  188. package/dist/es/standards-sdk.es141.js +86 -7
  189. package/dist/es/standards-sdk.es141.js.map +1 -1
  190. package/dist/es/standards-sdk.es142.js +44 -65
  191. package/dist/es/standards-sdk.es142.js.map +1 -1
  192. package/dist/es/standards-sdk.es143.js +30 -65
  193. package/dist/es/standards-sdk.es143.js.map +1 -1
  194. package/dist/es/standards-sdk.es144.js +34 -28
  195. package/dist/es/standards-sdk.es144.js.map +1 -1
  196. package/dist/es/standards-sdk.es145.js +28 -138
  197. package/dist/es/standards-sdk.es145.js.map +1 -1
  198. package/dist/es/standards-sdk.es146.js +133 -37
  199. package/dist/es/standards-sdk.es146.js.map +1 -1
  200. package/dist/es/standards-sdk.es147.js +34 -12281
  201. package/dist/es/standards-sdk.es147.js.map +1 -1
  202. package/dist/es/standards-sdk.es148.js +12284 -12
  203. package/dist/es/standards-sdk.es148.js.map +1 -1
  204. package/dist/es/standards-sdk.es149.js +958 -56
  205. package/dist/es/standards-sdk.es149.js.map +1 -1
  206. package/dist/es/standards-sdk.es15.js +152 -151
  207. package/dist/es/standards-sdk.es15.js.map +1 -1
  208. package/dist/es/standards-sdk.es150.js +48 -74
  209. package/dist/es/standards-sdk.es150.js.map +1 -1
  210. package/dist/es/standards-sdk.es151.js +72 -160
  211. package/dist/es/standards-sdk.es151.js.map +1 -1
  212. package/dist/es/standards-sdk.es152.js +13 -318
  213. package/dist/es/standards-sdk.es152.js.map +1 -1
  214. package/dist/es/standards-sdk.es153.js +120 -294
  215. package/dist/es/standards-sdk.es153.js.map +1 -1
  216. package/dist/es/standards-sdk.es154.js +191 -322
  217. package/dist/es/standards-sdk.es154.js.map +1 -1
  218. package/dist/es/standards-sdk.es155.js +294 -279
  219. package/dist/es/standards-sdk.es155.js.map +1 -1
  220. package/dist/es/standards-sdk.es156.js +440 -63
  221. package/dist/es/standards-sdk.es156.js.map +1 -1
  222. package/dist/es/standards-sdk.es157.js +331 -871
  223. package/dist/es/standards-sdk.es157.js.map +1 -1
  224. package/dist/es/standards-sdk.es158.js +68 -231
  225. package/dist/es/standards-sdk.es158.js.map +1 -1
  226. package/dist/es/standards-sdk.es159.js +218 -223
  227. package/dist/es/standards-sdk.es159.js.map +1 -1
  228. package/dist/es/standards-sdk.es16.js +917 -136
  229. package/dist/es/standards-sdk.es16.js.map +1 -1
  230. package/dist/es/standards-sdk.es160.js +247 -0
  231. package/dist/es/standards-sdk.es160.js.map +1 -0
  232. package/dist/es/standards-sdk.es17.js +23 -944
  233. package/dist/es/standards-sdk.es17.js.map +1 -1
  234. package/dist/es/standards-sdk.es18.js +2422 -24
  235. package/dist/es/standards-sdk.es18.js.map +1 -1
  236. package/dist/es/standards-sdk.es19.js +817 -2071
  237. package/dist/es/standards-sdk.es19.js.map +1 -1
  238. package/dist/es/standards-sdk.es2.js +654 -189
  239. package/dist/es/standards-sdk.es2.js.map +1 -1
  240. package/dist/es/standards-sdk.es20.js +205 -1091
  241. package/dist/es/standards-sdk.es20.js.map +1 -1
  242. package/dist/es/standards-sdk.es21.js +858 -221
  243. package/dist/es/standards-sdk.es21.js.map +1 -1
  244. package/dist/es/standards-sdk.es22.js +179 -903
  245. package/dist/es/standards-sdk.es22.js.map +1 -1
  246. package/dist/es/standards-sdk.es23.js +164 -179
  247. package/dist/es/standards-sdk.es23.js.map +1 -1
  248. package/dist/es/standards-sdk.es24.js +62 -118
  249. package/dist/es/standards-sdk.es24.js.map +1 -1
  250. package/dist/es/standards-sdk.es25.js +377 -52
  251. package/dist/es/standards-sdk.es25.js.map +1 -1
  252. package/dist/es/standards-sdk.es26.js +36 -394
  253. package/dist/es/standards-sdk.es26.js.map +1 -1
  254. package/dist/es/standards-sdk.es27.js +901 -50
  255. package/dist/es/standards-sdk.es27.js.map +1 -1
  256. package/dist/es/standards-sdk.es28.js +134 -902
  257. package/dist/es/standards-sdk.es28.js.map +1 -1
  258. package/dist/es/standards-sdk.es29.js +7 -134
  259. package/dist/es/standards-sdk.es29.js.map +1 -1
  260. package/dist/es/standards-sdk.es3.js +63 -680
  261. package/dist/es/standards-sdk.es3.js.map +1 -1
  262. package/dist/es/standards-sdk.es30.js +344 -7
  263. package/dist/es/standards-sdk.es30.js.map +1 -1
  264. package/dist/es/standards-sdk.es31.js +302 -287
  265. package/dist/es/standards-sdk.es31.js.map +1 -1
  266. package/dist/es/standards-sdk.es32.js +94 -322
  267. package/dist/es/standards-sdk.es32.js.map +1 -1
  268. package/dist/es/standards-sdk.es33.js +458 -101
  269. package/dist/es/standards-sdk.es33.js.map +1 -1
  270. package/dist/es/standards-sdk.es34.js +132 -451
  271. package/dist/es/standards-sdk.es34.js.map +1 -1
  272. package/dist/es/standards-sdk.es35.js +216 -130
  273. package/dist/es/standards-sdk.es35.js.map +1 -1
  274. package/dist/es/standards-sdk.es36.js +273 -195
  275. package/dist/es/standards-sdk.es36.js.map +1 -1
  276. package/dist/es/standards-sdk.es37.js +148 -87
  277. package/dist/es/standards-sdk.es37.js.map +1 -1
  278. package/dist/es/standards-sdk.es38.js +183 -320
  279. package/dist/es/standards-sdk.es38.js.map +1 -1
  280. package/dist/es/standards-sdk.es39.js +238 -161
  281. package/dist/es/standards-sdk.es39.js.map +1 -1
  282. package/dist/es/standards-sdk.es4.js +425 -63
  283. package/dist/es/standards-sdk.es4.js.map +1 -1
  284. package/dist/es/standards-sdk.es40.js +136 -254
  285. package/dist/es/standards-sdk.es40.js.map +1 -1
  286. package/dist/es/standards-sdk.es41.js +225 -176
  287. package/dist/es/standards-sdk.es41.js.map +1 -1
  288. package/dist/es/standards-sdk.es42.js +199 -261
  289. package/dist/es/standards-sdk.es42.js.map +1 -1
  290. package/dist/es/standards-sdk.es43.js +237 -199
  291. package/dist/es/standards-sdk.es43.js.map +1 -1
  292. package/dist/es/standards-sdk.es44.js +209 -201
  293. package/dist/es/standards-sdk.es44.js.map +1 -1
  294. package/dist/es/standards-sdk.es45.js +305 -201
  295. package/dist/es/standards-sdk.es45.js.map +1 -1
  296. package/dist/es/standards-sdk.es46.js +371 -261
  297. package/dist/es/standards-sdk.es46.js.map +1 -1
  298. package/dist/es/standards-sdk.es47.js +316 -371
  299. package/dist/es/standards-sdk.es47.js.map +1 -1
  300. package/dist/es/standards-sdk.es48.js +404 -336
  301. package/dist/es/standards-sdk.es48.js.map +1 -1
  302. package/dist/es/standards-sdk.es49.js +83 -449
  303. package/dist/es/standards-sdk.es49.js.map +1 -1
  304. package/dist/es/standards-sdk.es5.js +232 -354
  305. package/dist/es/standards-sdk.es5.js.map +1 -1
  306. package/dist/es/standards-sdk.es50.js +179 -89
  307. package/dist/es/standards-sdk.es50.js.map +1 -1
  308. package/dist/es/standards-sdk.es51.js +231 -165
  309. package/dist/es/standards-sdk.es51.js.map +1 -1
  310. package/dist/es/standards-sdk.es52.js +25 -262
  311. package/dist/es/standards-sdk.es52.js.map +1 -1
  312. package/dist/es/standards-sdk.es53.js +56 -26
  313. package/dist/es/standards-sdk.es53.js.map +1 -1
  314. package/dist/es/standards-sdk.es54.js +12 -57
  315. package/dist/es/standards-sdk.es54.js.map +1 -1
  316. package/dist/es/standards-sdk.es55.js +49 -12
  317. package/dist/es/standards-sdk.es55.js.map +1 -1
  318. package/dist/es/standards-sdk.es56.js +115 -43
  319. package/dist/es/standards-sdk.es56.js.map +1 -1
  320. package/dist/es/standards-sdk.es57.js +42 -115
  321. package/dist/es/standards-sdk.es57.js.map +1 -1
  322. package/dist/es/standards-sdk.es58.js +52 -43
  323. package/dist/es/standards-sdk.es58.js.map +1 -1
  324. package/dist/es/standards-sdk.es59.js +36 -50
  325. package/dist/es/standards-sdk.es59.js.map +1 -1
  326. package/dist/es/standards-sdk.es6.js +125 -246
  327. package/dist/es/standards-sdk.es6.js.map +1 -1
  328. package/dist/es/standards-sdk.es60.js +207 -39
  329. package/dist/es/standards-sdk.es60.js.map +1 -1
  330. package/dist/es/standards-sdk.es61.js +24 -200
  331. package/dist/es/standards-sdk.es61.js.map +1 -1
  332. package/dist/es/standards-sdk.es62.js +87 -25
  333. package/dist/es/standards-sdk.es62.js.map +1 -1
  334. package/dist/es/standards-sdk.es63.js +3 -51
  335. package/dist/es/standards-sdk.es63.js.map +1 -1
  336. package/dist/es/standards-sdk.es64.js +100 -3
  337. package/dist/es/standards-sdk.es64.js.map +1 -1
  338. package/dist/es/standards-sdk.es65.js +61 -62
  339. package/dist/es/standards-sdk.es65.js.map +1 -1
  340. package/dist/es/standards-sdk.es66.js +17 -98
  341. package/dist/es/standards-sdk.es66.js.map +1 -1
  342. package/dist/es/standards-sdk.es67.js +77 -19
  343. package/dist/es/standards-sdk.es67.js.map +1 -1
  344. package/dist/es/standards-sdk.es68.js +458 -77
  345. package/dist/es/standards-sdk.es68.js.map +1 -1
  346. package/dist/es/standards-sdk.es69.js +106 -240
  347. package/dist/es/standards-sdk.es69.js.map +1 -1
  348. package/dist/es/standards-sdk.es7.js +28 -183
  349. package/dist/es/standards-sdk.es7.js.map +1 -1
  350. package/dist/es/standards-sdk.es70.js +170 -286
  351. package/dist/es/standards-sdk.es70.js.map +1 -1
  352. package/dist/es/standards-sdk.es71.js +71 -207
  353. package/dist/es/standards-sdk.es71.js.map +1 -1
  354. package/dist/es/standards-sdk.es72.js +71 -72
  355. package/dist/es/standards-sdk.es72.js.map +1 -1
  356. package/dist/es/standards-sdk.es73.js +143 -71
  357. package/dist/es/standards-sdk.es73.js.map +1 -1
  358. package/dist/es/standards-sdk.es74.js +62 -136
  359. package/dist/es/standards-sdk.es74.js.map +1 -1
  360. package/dist/es/standards-sdk.es75.js +380 -45
  361. package/dist/es/standards-sdk.es75.js.map +1 -1
  362. package/dist/es/standards-sdk.es76.js +222 -130
  363. package/dist/es/standards-sdk.es76.js.map +1 -1
  364. package/dist/es/standards-sdk.es77.js +320 -444
  365. package/dist/es/standards-sdk.es77.js.map +1 -1
  366. package/dist/es/standards-sdk.es78.js +88 -370
  367. package/dist/es/standards-sdk.es78.js.map +1 -1
  368. package/dist/es/standards-sdk.es79.js +125 -89
  369. package/dist/es/standards-sdk.es79.js.map +1 -1
  370. package/dist/es/standards-sdk.es8.js +80 -29
  371. package/dist/es/standards-sdk.es8.js.map +1 -1
  372. package/dist/es/standards-sdk.es80.js +8 -125
  373. package/dist/es/standards-sdk.es80.js.map +1 -1
  374. package/dist/es/standards-sdk.es81.js +45 -6
  375. package/dist/es/standards-sdk.es81.js.map +1 -1
  376. package/dist/es/standards-sdk.es82.js +98 -44
  377. package/dist/es/standards-sdk.es82.js.map +1 -1
  378. package/dist/es/standards-sdk.es83.js +331 -84
  379. package/dist/es/standards-sdk.es83.js.map +1 -1
  380. package/dist/es/standards-sdk.es84.js +93 -160
  381. package/dist/es/standards-sdk.es84.js.map +1 -1
  382. package/dist/es/standards-sdk.es85.js +55 -275
  383. package/dist/es/standards-sdk.es85.js.map +1 -1
  384. package/dist/es/standards-sdk.es86.js +43 -55
  385. package/dist/es/standards-sdk.es86.js.map +1 -1
  386. package/dist/es/standards-sdk.es87.js +145 -22
  387. package/dist/es/standards-sdk.es87.js.map +1 -1
  388. package/dist/es/standards-sdk.es88.js +34 -47
  389. package/dist/es/standards-sdk.es88.js.map +1 -1
  390. package/dist/es/standards-sdk.es89.js +22 -57
  391. package/dist/es/standards-sdk.es89.js.map +1 -1
  392. package/dist/es/standards-sdk.es9.js +104 -80
  393. package/dist/es/standards-sdk.es9.js.map +1 -1
  394. package/dist/es/standards-sdk.es90.js +23 -28
  395. package/dist/es/standards-sdk.es90.js.map +1 -1
  396. package/dist/es/standards-sdk.es91.js +238 -23
  397. package/dist/es/standards-sdk.es91.js.map +1 -1
  398. package/dist/es/standards-sdk.es92.js +265 -152
  399. package/dist/es/standards-sdk.es92.js.map +1 -1
  400. package/dist/es/standards-sdk.es93.js +95 -68
  401. package/dist/es/standards-sdk.es93.js.map +1 -1
  402. package/dist/es/standards-sdk.es94.js +124 -136
  403. package/dist/es/standards-sdk.es94.js.map +1 -1
  404. package/dist/es/standards-sdk.es95.js +42 -138
  405. package/dist/es/standards-sdk.es95.js.map +1 -1
  406. package/dist/es/standards-sdk.es96.js +259 -42
  407. package/dist/es/standards-sdk.es96.js.map +1 -1
  408. package/dist/es/standards-sdk.es97.js +82 -243
  409. package/dist/es/standards-sdk.es97.js.map +1 -1
  410. package/dist/es/standards-sdk.es98.js +48 -47
  411. package/dist/es/standards-sdk.es98.js.map +1 -1
  412. package/dist/es/standards-sdk.es99.js +29 -100
  413. package/dist/es/standards-sdk.es99.js.map +1 -1
  414. package/dist/es/utils/crypto-abstraction.d.ts.map +1 -1
  415. package/dist/es/utils/crypto-env.d.ts.map +1 -1
  416. package/dist/es/utils/dynamic-import.d.ts +5 -1
  417. package/dist/es/utils/dynamic-import.d.ts.map +1 -1
  418. package/dist/es/utils/hash-adapter.d.ts.map +1 -1
  419. package/package.json +8 -7
  420. package/dist/cjs/patches/topic-autorenew-patch.d.ts +0 -2
  421. package/dist/cjs/patches/topic-autorenew-patch.d.ts.map +0 -1
  422. package/dist/es/patches/topic-autorenew-patch.d.ts +0 -2
  423. package/dist/es/patches/topic-autorenew-patch.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"standards-sdk.es16.js","sources":["../../src/hcs-7/redis-cache.ts"],"sourcesContent":["import { EVMCache } from './evm-bridge';\nimport { Logger, ILogger } from '../utils/logger';\n\ntype RedisOptions = {\n host: string;\n port: number;\n password?: string;\n db: number;\n tls?: Record<string, unknown>;\n keyPrefix?: string;\n connectTimeout: number;\n retryStrategy?: (times: number) => number | void;\n maxRetriesPerRequest: number;\n};\n\ntype RedisClient = {\n get(key: string): Promise<string | null>;\n set(key: string, value: string): Promise<string | null>;\n setex(key: string, seconds: number, value: string): Promise<string | null>;\n del(...keys: string[]): Promise<number>;\n keys(pattern: string): Promise<string[]>;\n quit(): Promise<void>;\n on(event: 'error' | 'connect', listener: (error?: Error) => void): void;\n};\n\ntype RedisConstructor = new (options: RedisOptions) => RedisClient;\n\ntype NodeRequire = (id: string) => unknown;\n\ndeclare const require: NodeRequire | undefined;\n\nexport interface RedisConfig {\n host?: string;\n port?: number;\n password?: string;\n db?: number;\n keyPrefix?: string;\n tls?: boolean;\n connectTimeout?: number;\n retryStrategy?: (times: number) => number | void;\n logLevel?: 'debug' | 'info' | 'warn' | 'error';\n}\n\nexport class RedisCache implements EVMCache {\n private client: RedisClient;\n private prefix: string;\n private logger: ILogger;\n\n constructor(config: RedisConfig = {}) {\n const {\n host = 'localhost',\n port = 6379,\n password,\n db = 0,\n keyPrefix = '',\n tls = false,\n connectTimeout = 5000,\n retryStrategy,\n logLevel = 'info',\n } = config;\n\n this.prefix = keyPrefix;\n this.logger = Logger.getInstance({\n level: logLevel,\n module: 'RedisCache',\n });\n\n this.client = createRedisClient(\n this.logger,\n {\n host,\n port,\n password,\n db,\n tls: tls ? {} : undefined,\n keyPrefix,\n connectTimeout,\n retryStrategy:\n retryStrategy ||\n (times => {\n const delay = Math.min(times * 50, 2000);\n return delay;\n }),\n maxRetriesPerRequest: 3,\n },\n true,\n );\n }\n\n private getKey(key: string): string {\n return `${this.prefix}${key}`;\n }\n\n async get(key: string): Promise<string | undefined> {\n try {\n const value = await this.client.get(this.getKey(key));\n return value || undefined;\n } catch (error: unknown) {\n this.logger.error('Redis get error:', error);\n throw error;\n }\n }\n\n async set(key: string, value: string, ttlSeconds?: number): Promise<void> {\n try {\n const fullKey = this.getKey(key);\n if (ttlSeconds) {\n await this.client.setex(fullKey, ttlSeconds, value);\n } else {\n await this.client.set(fullKey, value);\n }\n } catch (error: unknown) {\n this.logger.error('Redis set error:', error);\n throw error;\n }\n }\n\n async delete(key: string): Promise<void> {\n try {\n await this.client.del(this.getKey(key));\n } catch (error: unknown) {\n this.logger.error('Redis delete error:', error);\n throw error;\n }\n }\n\n async clear(): Promise<void> {\n try {\n const keys = await this.client.keys(`${this.prefix}*`);\n if (keys.length > 0) {\n await this.client.del(...keys);\n }\n } catch (error: unknown) {\n this.logger.error('Redis clear error:', error);\n throw error;\n }\n }\n\n async disconnect(): Promise<void> {\n await this.client.quit();\n }\n\n setLogLevel(level: 'debug' | 'info' | 'warn' | 'error'): void {\n this.logger.setLogLevel(level);\n }\n}\n\nfunction createRedisClient(\n logger: ILogger,\n options: RedisOptions,\n logConnectEvents: boolean,\n): RedisClient {\n const Redis = getRedisConstructor();\n\n if (!Redis) {\n logger.warn(\n 'ioredis is not installed; RedisCache will use an in-memory cache instead',\n );\n\n return createInMemoryRedisClient();\n }\n\n const client = new Redis({\n host: options.host,\n port: options.port,\n password: options.password,\n db: options.db,\n tls: options.tls,\n keyPrefix: options.keyPrefix,\n connectTimeout: options.connectTimeout,\n retryStrategy: options.retryStrategy,\n maxRetriesPerRequest: options.maxRetriesPerRequest,\n });\n\n if (logConnectEvents) {\n client.on('error', (error: Error) => {\n logger.error('Redis connection error:', error);\n });\n\n client.on('connect', () => {\n logger.debug('Redis connected');\n });\n }\n\n return client;\n}\n\nfunction getRedisConstructor(): RedisConstructor | null {\n if (typeof require !== 'function') {\n return null;\n }\n\n try {\n const loaded = require('ioredis') as\n | RedisConstructor\n | { default: RedisConstructor };\n\n if (typeof (loaded as RedisConstructor) === 'function') {\n return loaded as RedisConstructor;\n }\n\n if (\n typeof (loaded as { default?: RedisConstructor }).default === 'function'\n ) {\n return (loaded as { default: RedisConstructor }).default;\n }\n } catch {\n return null;\n }\n\n return null;\n}\n\nfunction createInMemoryRedisClient(): RedisClient {\n const store = new Map<string, string>();\n\n return {\n async get(key: string): Promise<string | null> {\n return store.get(key) ?? null;\n },\n async set(key: string, value: string): Promise<string | null> {\n store.set(key, value);\n return 'OK';\n },\n async setex(\n key: string,\n _seconds: number,\n value: string,\n ): Promise<string | null> {\n store.set(key, value);\n return 'OK';\n },\n async del(...keys: string[]): Promise<number> {\n let deleted = 0;\n for (const key of keys) {\n if (store.delete(key)) {\n deleted += 1;\n }\n }\n return deleted;\n },\n async keys(pattern: string): Promise<string[]> {\n if (pattern.endsWith('*')) {\n const prefix = pattern.slice(0, -1);\n return Array.from(store.keys()).filter(key => key.startsWith(prefix));\n }\n return store.has(pattern) ? [pattern] : [];\n },\n async quit(): Promise<void> {\n store.clear();\n },\n on(): void {\n return;\n },\n };\n}\n"],"names":[],"mappings":";AA2CO,MAAM,WAA+B;AAAA,EAK1C,YAAY,SAAsB,IAAI;AACpC,UAAM;AAAA,MACJ,OAAO;AAAA,MACP,OAAO;AAAA,MACP;AAAA,MACA,KAAK;AAAA,MACL,YAAY;AAAA,MACZ,MAAM;AAAA,MACN,iBAAiB;AAAA,MACjB;AAAA,MACA,WAAW;AAAA,IAAA,IACT;AAEJ,SAAK,SAAS;AACd,SAAK,SAAS,OAAO,YAAY;AAAA,MAC/B,OAAO;AAAA,MACP,QAAQ;AAAA,IAAA,CACT;AAED,SAAK,SAAS;AAAA,MACZ,KAAK;AAAA,MACL;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,KAAK,MAAM,CAAA,IAAK;AAAA,QAChB;AAAA,QACA;AAAA,QACA,eACE,kBACC,CAAA,UAAS;AACR,gBAAM,QAAQ,KAAK,IAAI,QAAQ,IAAI,GAAI;AACvC,iBAAO;AAAA,QACT;AAAA,QACF,sBAAsB;AAAA,MAAA;AAAA,IAG1B;AAAA,EACF;AAAA,EAEQ,OAAO,KAAqB;AAClC,WAAO,GAAG,KAAK,MAAM,GAAG,GAAG;AAAA,EAC7B;AAAA,EAEA,MAAM,IAAI,KAA0C;AAClD,QAAI;AACF,YAAM,QAAQ,MAAM,KAAK,OAAO,IAAI,KAAK,OAAO,GAAG,CAAC;AACpD,aAAO,SAAS;AAAA,IAClB,SAAS,OAAgB;AACvB,WAAK,OAAO,MAAM,oBAAoB,KAAK;AAC3C,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,IAAI,KAAa,OAAe,YAAoC;AACxE,QAAI;AACF,YAAM,UAAU,KAAK,OAAO,GAAG;AAC/B,UAAI,YAAY;AACd,cAAM,KAAK,OAAO,MAAM,SAAS,YAAY,KAAK;AAAA,MACpD,OAAO;AACL,cAAM,KAAK,OAAO,IAAI,SAAS,KAAK;AAAA,MACtC;AAAA,IACF,SAAS,OAAgB;AACvB,WAAK,OAAO,MAAM,oBAAoB,KAAK;AAC3C,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,KAA4B;AACvC,QAAI;AACF,YAAM,KAAK,OAAO,IAAI,KAAK,OAAO,GAAG,CAAC;AAAA,IACxC,SAAS,OAAgB;AACvB,WAAK,OAAO,MAAM,uBAAuB,KAAK;AAC9C,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,QAAuB;AAC3B,QAAI;AACF,YAAM,OAAO,MAAM,KAAK,OAAO,KAAK,GAAG,KAAK,MAAM,GAAG;AACrD,UAAI,KAAK,SAAS,GAAG;AACnB,cAAM,KAAK,OAAO,IAAI,GAAG,IAAI;AAAA,MAC/B;AAAA,IACF,SAAS,OAAgB;AACvB,WAAK,OAAO,MAAM,sBAAsB,KAAK;AAC7C,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,aAA4B;AAChC,UAAM,KAAK,OAAO,KAAA;AAAA,EACpB;AAAA,EAEA,YAAY,OAAkD;AAC5D,SAAK,OAAO,YAAY,KAAK;AAAA,EAC/B;AACF;AAEA,SAAS,kBACP,QACA,SACA,kBACa;AACb,QAAM,QAAQ,oBAAA;AAEd,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,MACL;AAAA,IAAA;AAGF,WAAO,0BAAA;AAAA,EACT;AAEA,QAAM,SAAS,IAAI,MAAM;AAAA,IACvB,MAAM,QAAQ;AAAA,IACd,MAAM,QAAQ;AAAA,IACd,UAAU,QAAQ;AAAA,IAClB,IAAI,QAAQ;AAAA,IACZ,KAAK,QAAQ;AAAA,IACb,WAAW,QAAQ;AAAA,IACnB,gBAAgB,QAAQ;AAAA,IACxB,eAAe,QAAQ;AAAA,IACvB,sBAAsB,QAAQ;AAAA,EAAA,CAC/B;AAEqB;AACpB,WAAO,GAAG,SAAS,CAAC,UAAiB;AACnC,aAAO,MAAM,2BAA2B,KAAK;AAAA,IAC/C,CAAC;AAED,WAAO,GAAG,WAAW,MAAM;AACzB,aAAO,MAAM,iBAAiB;AAAA,IAChC,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,SAAS,sBAA+C;AACtD,MAAI,OAAO,YAAY,YAAY;AACjC,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,SAAS,QAAQ,SAAS;AAIhC,QAAI,OAAQ,WAAgC,YAAY;AACtD,aAAO;AAAA,IACT;AAEA,QACE,OAAQ,OAA0C,YAAY,YAC9D;AACA,aAAQ,OAAyC;AAAA,IACnD;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,4BAAyC;AAChD,QAAM,4BAAY,IAAA;AAElB,SAAO;AAAA,IACL,MAAM,IAAI,KAAqC;AAC7C,aAAO,MAAM,IAAI,GAAG,KAAK;AAAA,IAC3B;AAAA,IACA,MAAM,IAAI,KAAa,OAAuC;AAC5D,YAAM,IAAI,KAAK,KAAK;AACpB,aAAO;AAAA,IACT;AAAA,IACA,MAAM,MACJ,KACA,UACA,OACwB;AACxB,YAAM,IAAI,KAAK,KAAK;AACpB,aAAO;AAAA,IACT;AAAA,IACA,MAAM,OAAO,MAAiC;AAC5C,UAAI,UAAU;AACd,iBAAW,OAAO,MAAM;AACtB,YAAI,MAAM,OAAO,GAAG,GAAG;AACrB,qBAAW;AAAA,QACb;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,IACA,MAAM,KAAK,SAAoC;AAC7C,UAAI,QAAQ,SAAS,GAAG,GAAG;AACzB,cAAM,SAAS,QAAQ,MAAM,GAAG,EAAE;AAClC,eAAO,MAAM,KAAK,MAAM,KAAA,CAAM,EAAE,OAAO,CAAA,QAAO,IAAI,WAAW,MAAM,CAAC;AAAA,MACtE;AACA,aAAO,MAAM,IAAI,OAAO,IAAI,CAAC,OAAO,IAAI,CAAA;AAAA,IAC1C;AAAA,IACA,MAAM,OAAsB;AAC1B,YAAM,MAAA;AAAA,IACR;AAAA,IACA,KAAW;AACT;AAAA,IACF;AAAA,EAAA;AAEJ;"}
1
+ {"version":3,"file":"standards-sdk.es16.js","sources":["../../src/hcs-10/base-client.ts"],"sourcesContent":["import { Logger, LogLevel, ILogger } from '../utils/logger';\nimport { Registration } from './registrations';\nimport { HCS11Client } from '../hcs-11/client';\nimport {\n AccountResponse,\n HCSMessageWithCommonFields,\n TopicResponse,\n} from '../services/types';\nimport { TopicInfo } from '../services/types';\nimport {\n TransactionReceipt,\n PrivateKey,\n PublicKey,\n TopicMessageSubmitTransaction,\n} from '@hashgraph/sdk';\nimport { NetworkType } from '../utils/types';\nimport { HederaMirrorNode, MirrorNodeConfig } from '../services';\nimport {\n WaitForConnectionConfirmationResponse,\n TransactMessage,\n} from './types';\nimport {\n buildHcs10SubmitConnectionRequestTx,\n buildHcs10OutboundConnectionRequestRecordTx,\n buildHcs10OutboundConnectionCreatedRecordTx,\n} from './tx';\nimport { HRLResolver } from '../utils/hrl-resolver';\n\nexport enum Hcs10MemoType {\n INBOUND = 'inbound',\n OUTBOUND = 'outbound',\n CONNECTION = 'connection',\n REGISTRY = 'registry',\n}\n\n/**\n * Configuration for HCS-10 client.\n *\n * @example\n * // Using default Hedera mirror nodes\n * const config = {\n * network: 'testnet',\n * logLevel: 'info'\n * };\n *\n * @example\n * // Using HGraph custom mirror node provider\n * const config = {\n * network: 'mainnet',\n * logLevel: 'info',\n * mirrorNode: {\n * customUrl: 'https://mainnet.hedera.api.hgraph.dev/v1/<API-KEY>',\n * apiKey: 'your-hgraph-api-key'\n * }\n * };\n *\n * @example\n * // Using custom mirror node with headers\n * const config = {\n * network: 'testnet',\n * mirrorNode: {\n * customUrl: 'https://custom-mirror.example.com',\n * apiKey: 'your-api-key',\n * headers: {\n * 'X-Custom-Header': 'value'\n * }\n * }\n * };\n */\nexport interface HCS10Config {\n /** The Hedera network to connect to */\n network: 'mainnet' | 'testnet';\n /** Log level for the client */\n logLevel?: LogLevel;\n /** Whether to pretty print logs */\n prettyPrint?: boolean;\n /** Fee amount for transactions that require fees */\n feeAmount?: number;\n /** Custom mirror node configuration */\n mirrorNode?: MirrorNodeConfig;\n /** Whether to run logger in silent mode */\n silent?: boolean;\n /** The key type to use for the operator */\n keyType?: 'ed25519' | 'ecdsa';\n}\n\nexport interface ProfileResponse {\n profile: any;\n topicInfo?: TopicInfo;\n success: boolean;\n error?: string;\n}\n\nexport abstract class HCS10BaseClient extends Registration {\n protected logger: ILogger;\n protected feeAmount: number;\n public mirrorNode: HederaMirrorNode;\n public network: string;\n\n protected operatorId: string;\n\n constructor(config: HCS10Config) {\n super();\n this.network = config.network;\n this.logger = Logger.getInstance({\n level: config.logLevel || 'info',\n module: 'HCS10-BaseClient',\n prettyPrint: config.prettyPrint,\n silent: config.silent,\n });\n this.mirrorNode = new HederaMirrorNode(\n config.network as NetworkType,\n this.logger,\n config.mirrorNode,\n );\n this.feeAmount = config.feeAmount || 0.001;\n }\n\n abstract submitPayload(\n topicOrTransaction: string | TopicMessageSubmitTransaction,\n payload?: object | string,\n submitKey?: PrivateKey,\n requiresFee?: boolean,\n ): Promise<TransactionReceipt>;\n\n abstract getAccountAndSigner(): { accountId: string; signer: any };\n\n /**\n * Updates the mirror node configuration.\n * @param config The new mirror node configuration.\n */\n public configureMirrorNode(config: MirrorNodeConfig): void {\n this.mirrorNode.configureMirrorNode(config);\n this.logger.info('Mirror node configuration updated');\n }\n\n public extractTopicFromOperatorId(operatorId: string): string {\n if (!operatorId) {\n return '';\n }\n const parts = operatorId.split('@');\n if (parts.length > 0) {\n return parts[0];\n }\n return '';\n }\n\n public extractAccountFromOperatorId(operatorId: string): string {\n if (!operatorId) {\n return '';\n }\n const parts = operatorId.split('@');\n if (parts.length > 1) {\n return parts[1];\n }\n return '';\n }\n\n /**\n * Get a stream of messages from a connection topic\n * @param topicId The connection topic ID to get messages from\n * @param options Optional filtering options for messages\n * @returns A stream of filtered messages valid for connection topics\n */\n public async getMessageStream(\n topicId: string,\n options?: {\n sequenceNumber?: string | number;\n limit?: number;\n order?: 'asc' | 'desc';\n },\n ): Promise<{ messages: HCSMessageWithCommonFields[] }> {\n try {\n const messages = await this.mirrorNode.getTopicMessages(topicId, options);\n const validOps = ['message', 'close_connection', 'transaction'];\n\n const filteredMessages = messages.filter(msg => {\n if (msg.p !== 'hcs-10' || !validOps.includes(msg.op)) {\n return false;\n }\n\n if (msg.op === 'message' || msg.op === 'close_connection') {\n if (!msg.operator_id) {\n return false;\n }\n\n if (!this.isValidOperatorId(msg.operator_id)) {\n return false;\n }\n\n if (msg.op === 'message' && !msg.data) {\n return false;\n }\n }\n\n if (msg.op === 'transaction') {\n if (!msg.operator_id || !msg.schedule_id) {\n return false;\n }\n\n if (!this.isValidOperatorId(msg.operator_id)) {\n return false;\n }\n }\n\n return true;\n });\n\n return {\n messages: filteredMessages,\n };\n } catch (error: any) {\n if (this.logger) {\n this.logger.error(`Error fetching messages: ${error.message}`);\n }\n return { messages: [] };\n }\n }\n\n /**\n * Public method to retrieve topic information using the internal mirror node client.\n *\n * @param topicId The ID of the topic to query.\n * @returns Topic information or null if not found or an error occurs.\n */\n async getPublicTopicInfo(topicId: string): Promise<TopicResponse | null> {\n try {\n return await this.mirrorNode.getTopicInfo(topicId);\n } catch (error) {\n this.logger.error(\n `Error getting public topic info for ${topicId}:`,\n error,\n );\n return null;\n }\n }\n\n /**\n * Checks if a user can submit to a topic and determines if a fee is required\n * @param topicId The topic ID to check\n * @param userAccountId The account ID of the user attempting to submit\n * @returns Object with canSubmit, requiresFee, and optional reason\n */\n public async canSubmitToTopic(\n topicId: string,\n userAccountId: string,\n ): Promise<{ canSubmit: boolean; requiresFee: boolean; reason?: string }> {\n try {\n const topicInfo = await this.mirrorNode.getTopicInfo(topicId);\n\n if (!topicInfo) {\n return {\n canSubmit: false,\n requiresFee: false,\n reason: 'Topic does not exist',\n };\n }\n\n if (!topicInfo.submit_key?.key) {\n return { canSubmit: true, requiresFee: false };\n }\n\n try {\n const userPublicKey = await this.mirrorNode.getPublicKey(userAccountId);\n\n if (topicInfo.submit_key._type === 'ProtobufEncoded') {\n const keyBytes = Buffer.from(topicInfo.submit_key.key, 'hex');\n const hasAccess = await this.mirrorNode.checkKeyListAccess(\n keyBytes,\n userPublicKey,\n );\n\n if (hasAccess) {\n return { canSubmit: true, requiresFee: false };\n }\n } else {\n const topicSubmitKey = PublicKey.fromString(topicInfo.submit_key.key);\n if (userPublicKey.toString() === topicSubmitKey.toString()) {\n return { canSubmit: true, requiresFee: false };\n }\n }\n } catch (error) {\n this.logger.error(\n `Key validation error: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n\n if (\n topicInfo.fee_schedule_key?.key &&\n topicInfo.custom_fees?.fixed_fees?.length > 0\n ) {\n return {\n canSubmit: true,\n requiresFee: true,\n reason: 'Requires fee payment via HIP-991',\n };\n }\n\n return {\n canSubmit: false,\n requiresFee: false,\n reason: 'User does not have submit permission for this topic',\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n this.logger.error(`Topic submission validation error: ${errorMessage}`);\n return {\n canSubmit: false,\n requiresFee: false,\n reason: `Error: ${errorMessage}`,\n };\n }\n }\n\n /**\n * Get all messages from a topic\n * @param topicId The topic ID to get messages from\n * @param options Optional filtering options for messages\n * @returns All messages from the topic\n */\n public async getMessages(\n topicId: string,\n options?: {\n sequenceNumber?: string | number;\n limit?: number;\n order?: 'asc' | 'desc';\n },\n ): Promise<{ messages: HCSMessageWithCommonFields[] }> {\n try {\n const messages = await this.mirrorNode.getTopicMessages(topicId, options);\n\n const validatedMessages = messages.filter(msg => {\n if (msg.p !== 'hcs-10') {\n return false;\n }\n\n if (msg.op === 'message') {\n if (!msg.data) {\n return false;\n }\n\n if (msg.operator_id) {\n if (!this.isValidOperatorId(msg.operator_id)) {\n return false;\n }\n }\n }\n\n return true;\n });\n\n return {\n messages: validatedMessages,\n };\n } catch (error: any) {\n if (this.logger) {\n this.logger.error(`Error fetching messages: ${error.message}`);\n }\n return { messages: [] };\n }\n }\n\n /**\n * Requests an account from the mirror node\n * @param account The account ID to request\n * @returns The account response\n */\n public async requestAccount(account: string): Promise<AccountResponse> {\n try {\n if (!account) {\n throw new Error('Account ID is required');\n }\n return await this.mirrorNode.requestAccount(account);\n } catch (e) {\n this.logger.error('Failed to fetch account', e);\n throw e;\n }\n }\n\n /**\n * Retrieves the memo for an account\n * @param accountId The account ID to retrieve the memo for\n * @returns The memo\n */\n public async getAccountMemo(accountId: string): Promise<string | null> {\n return await this.mirrorNode.getAccountMemo(accountId);\n }\n\n /**\n * Retrieves the profile for an account\n * @param accountId The account ID to retrieve the profile for\n * @param disableCache Whether to disable caching of the result\n * @param retryOptions Optional retry configuration\n * @returns The profile\n */\n public async retrieveProfile(\n accountId: string,\n disableCache?: boolean,\n retryOptions?: {\n maxRetries?: number;\n retryDelay?: number;\n },\n ): Promise<ProfileResponse> {\n const maxRetries = retryOptions?.maxRetries ?? 0;\n const retryDelay = retryOptions?.retryDelay ?? 3000;\n let retryCount = 0;\n\n while (retryCount <= maxRetries) {\n this.logger.debug(\n `Retrieving profile for account: ${accountId}${retryCount > 0 ? ` (attempt ${retryCount + 1}/${maxRetries + 1})` : ''}`,\n );\n\n const cacheKey = `${accountId}-${this.network}`;\n\n if (!disableCache && retryCount === 0) {\n const cachedProfileResponse = HCS10Cache.getInstance().get(cacheKey);\n if (cachedProfileResponse) {\n this.logger.debug(`Cache hit for profile: ${accountId}`);\n return cachedProfileResponse;\n }\n }\n\n try {\n const hcs11Client = new HCS11Client({\n network: this.network as 'mainnet' | 'testnet',\n auth: {\n operatorId: '0.0.0',\n },\n logLevel: this.logger.getLevel(),\n });\n\n const profileResult = await hcs11Client.fetchProfileByAccountId(\n accountId,\n this.network,\n );\n\n if (!profileResult?.success) {\n if (retryCount < maxRetries) {\n this.logger.info(\n `Profile not found for account ${accountId}, retrying in ${retryDelay}ms... (${profileResult?.error})`,\n );\n retryCount++;\n await new Promise(resolve => setTimeout(resolve, retryDelay));\n continue;\n }\n\n this.logger.error(\n `Failed to retrieve profile for account ID: ${accountId}`,\n profileResult?.error,\n );\n return {\n profile: null,\n success: false,\n error:\n profileResult?.error ||\n `Failed to retrieve profile for account ID: ${accountId}`,\n };\n }\n\n const profile = profileResult?.profile;\n let topicInfo: TopicInfo | null = null;\n const inboundTopic =\n profileResult?.topicInfo?.inboundTopic ||\n profile?.inboundTopicId ||\n '';\n const outboundTopic =\n profileResult?.topicInfo?.outboundTopic ||\n profile?.outboundTopicId ||\n '';\n const profileTopicId = profileResult?.topicInfo?.profileTopicId || '';\n if (inboundTopic && outboundTopic) {\n topicInfo = {\n inboundTopic,\n outboundTopic,\n profileTopicId,\n };\n }\n\n const responseToCache: ProfileResponse = {\n profile,\n topicInfo,\n success: true,\n };\n HCS10Cache.getInstance().set(cacheKey, responseToCache);\n return responseToCache;\n } catch (e: any) {\n if (retryCount < maxRetries) {\n this.logger.info(\n `Error retrieving profile for account ${accountId}, retrying in ${retryDelay}ms... (${e.message})`,\n );\n retryCount++;\n await new Promise(resolve => setTimeout(resolve, retryDelay));\n continue;\n }\n\n const error = e as Error;\n const logMessage = `Failed to retrieve profile: ${error.message}`;\n this.logger.error(logMessage);\n return {\n profile: null,\n success: false,\n error: logMessage,\n };\n }\n }\n\n return {\n profile: null,\n success: false,\n error: 'Unexpected error in profile retrieval',\n };\n }\n\n /**\n * @deprecated Use retrieveCommunicationTopics instead\n * @param accountId The account ID to retrieve the outbound connect topic for\n * @returns {TopicInfo} Topic Info from target profile.\n */\n public async retrieveOutboundConnectTopic(\n accountId: string,\n ): Promise<TopicInfo> {\n return await this.retrieveCommunicationTopics(accountId, true);\n }\n\n /**\n * Retrieves the communication topics for an account\n * @param accountId The account ID to retrieve the communication topics for\n * @param disableCache Whether to disable caching of the result\n * @param retryOptions Optional retry configuration\n * @returns {TopicInfo} Topic Info from target profile.\n */\n public async retrieveCommunicationTopics(\n accountId: string,\n disableCache?: boolean,\n retryOptions?: {\n maxRetries?: number;\n retryDelay?: number;\n },\n ): Promise<TopicInfo> {\n try {\n const profileResponse = await this.retrieveProfile(\n accountId,\n disableCache,\n retryOptions,\n );\n\n if (!profileResponse?.success) {\n throw new Error(profileResponse.error || 'Failed to retrieve profile');\n }\n\n const profile = profileResponse.profile;\n\n if (!profile) {\n throw new Error(\n `Profile is null or undefined for account ${accountId}`,\n );\n }\n\n if (!profile.inboundTopicId || !profile.outboundTopicId) {\n throw new Error(\n `Invalid HCS-11 profile for HCS-10 agent: missing inboundTopicId or outboundTopicId`,\n );\n }\n\n if (!profileResponse.topicInfo) {\n throw new Error(\n `TopicInfo is missing in the profile for account ${accountId}`,\n );\n }\n\n return profileResponse.topicInfo;\n } catch (e: any) {\n const error = e as Error;\n const logMessage = `Failed to retrieve topic info: ${error.message}`;\n this.logger.error(logMessage);\n throw error;\n }\n }\n\n /**\n * Retrieves outbound messages for an agent\n * @param agentAccountId The account ID of the agent\n * @param options Optional filtering options for messages\n * @returns The outbound messages\n */\n public async retrieveOutboundMessages(\n agentAccountId: string,\n options?: {\n sequenceNumber?: string | number;\n limit?: number;\n order?: 'asc' | 'desc';\n },\n ): Promise<HCSMessageWithCommonFields[]> {\n try {\n const topicInfo = await this.retrieveCommunicationTopics(agentAccountId);\n if (!topicInfo) {\n this.logger.warn(\n `No outbound connect topic found for agentAccountId: ${agentAccountId}`,\n );\n return [];\n }\n const response = await this.getMessages(topicInfo.outboundTopic, options);\n return response.messages.filter(\n msg =>\n msg.p === 'hcs-10' &&\n (msg.op === 'connection_request' ||\n msg.op === 'connection_created' ||\n msg.op === 'message'),\n );\n } catch (e: any) {\n const error = e as Error;\n const logMessage = `Failed to retrieve outbound messages: ${error.message}`;\n this.logger.error(logMessage);\n return [];\n }\n }\n\n /**\n * Checks if a connection has been created for an agent\n * @param agentAccountId The account ID of the agent\n * @param connectionId The ID of the connection\n * @returns True if the connection has been created, false otherwise\n */\n public async hasConnectionCreated(\n agentAccountId: string,\n connectionId: number,\n ): Promise<boolean> {\n try {\n const outBoundTopic =\n await this.retrieveCommunicationTopics(agentAccountId);\n const messages = await this.retrieveOutboundMessages(\n outBoundTopic.outboundTopic,\n );\n return messages.some(\n msg =>\n msg.op === 'connection_created' && msg.connection_id === connectionId,\n );\n } catch (e: any) {\n const error = e as Error;\n const logMessage = `Failed to check connection created: ${error.message}`;\n this.logger.error(logMessage);\n return false;\n }\n }\n\n /**\n * Gets message content, resolving any HRL references if needed\n * @param data The data string that may contain an HRL reference\n * @param forceRaw Whether to force returning raw binary data\n * @returns The resolved content\n */\n async getMessageContent(\n data: string,\n forceRaw = false,\n ): Promise<string | ArrayBuffer> {\n if (!data.match(/^hcs:\\/\\/(\\d+)\\/([0-9]+\\.[0-9]+\\.[0-9]+)$/)) {\n return data;\n }\n\n try {\n const resolver = new HRLResolver(this.logger.getLevel());\n\n if (!resolver.isValidHRL(data)) {\n return data;\n }\n\n const result = await resolver.resolveHRL(data, {\n network: this.network as 'mainnet' | 'testnet',\n returnRaw: forceRaw,\n });\n\n return result.content;\n } catch (e: any) {\n const error = e as Error;\n const logMessage = `Error resolving HRL reference: ${error.message}`;\n this.logger.error(logMessage);\n throw new Error(logMessage);\n }\n }\n\n /**\n * Gets message content with its content type, resolving any HRL references if needed\n * @param data The data string that may contain an HRL reference\n * @param forceRaw Whether to force returning raw binary data\n * @returns The resolved content along with content type information\n */\n async getMessageContentWithType(\n data: string,\n forceRaw = false,\n ): Promise<{\n content: string | ArrayBuffer;\n contentType: string;\n isBinary: boolean;\n }> {\n if (!data.match(/^hcs:\\/\\/(\\d+)\\/([0-9]+\\.[0-9]+\\.[0-9]+)$/)) {\n return {\n content: data,\n contentType: 'text/plain',\n isBinary: false,\n };\n }\n\n try {\n const resolver = new HRLResolver(this.logger.getLevel());\n\n return await resolver.getContentWithType(data, {\n network: this.network as 'mainnet' | 'testnet',\n returnRaw: forceRaw,\n });\n } catch (e: any) {\n const error = e as Error;\n const logMessage = `Error resolving HRL reference with type: ${error.message}`;\n this.logger.error(logMessage);\n throw new Error(logMessage);\n }\n }\n\n /**\n * Submits a connection request to an inbound topic\n * @param inboundTopicId The ID of the inbound topic\n * @param memo An optional memo for the message\n * @returns The transaction receipt\n */\n async submitConnectionRequest(\n inboundTopicId: string,\n memo: string,\n ): Promise<TransactionReceipt> {\n const accountResponse = this.getAccountAndSigner();\n if (!accountResponse?.accountId) {\n throw new Error('Operator account ID is not set');\n }\n const operatorId = await this.getOperatorId();\n const accountId = accountResponse.accountId;\n\n const submissionCheck = await this.canSubmitToTopic(\n inboundTopicId,\n accountId,\n );\n\n if (!submissionCheck?.canSubmit) {\n throw new Error(`Cannot submit to topic: ${submissionCheck.reason}`);\n }\n\n const inboundAccountOwner =\n await this.retrieveInboundAccountId(inboundTopicId);\n\n if (!inboundAccountOwner) {\n throw new Error('Failed to retrieve topic info account ID');\n }\n\n const requiresFee = submissionCheck.requiresFee;\n\n const connectionRequestTx = buildHcs10SubmitConnectionRequestTx({\n inboundTopicId,\n operatorId,\n memo,\n });\n\n const response = await this.submitPayload(\n connectionRequestTx,\n undefined,\n undefined,\n requiresFee,\n );\n\n this.logger.info(\n `Submitted connection request to topic ID: ${inboundTopicId}`,\n );\n\n const outboundTopic = await this.retrieveCommunicationTopics(accountId);\n\n if (!outboundTopic) {\n throw new Error('Failed to retrieve outbound topic');\n }\n\n const responseSequenceNumber = response.topicSequenceNumber?.toNumber();\n\n if (!responseSequenceNumber) {\n throw new Error('Failed to get response sequence number');\n }\n\n const requestorOperatorId = `${inboundTopicId}@${inboundAccountOwner}`;\n\n const outboundRecordTx = buildHcs10OutboundConnectionRequestRecordTx({\n outboundTopicId: outboundTopic.outboundTopic,\n operatorId: requestorOperatorId,\n connectionRequestId: responseSequenceNumber,\n memo,\n });\n\n await this.submitPayload(outboundRecordTx);\n\n return response;\n }\n\n /**\n * Records an outbound connection confirmation\n * @param outboundTopicId The ID of the outbound topic\n * @param connectionRequestId The ID of the connection request\n * @param confirmedRequestId The ID of the confirmed request\n * @param connectionTopicId The ID of the connection topic\n * @param operatorId The operator ID of the original message sender.\n * @param memo An optional memo for the message\n */\n public async recordOutboundConnectionConfirmation({\n outboundTopicId,\n requestorOutboundTopicId,\n connectionRequestId,\n confirmedRequestId,\n connectionTopicId,\n operatorId,\n memo,\n }: {\n outboundTopicId: string;\n requestorOutboundTopicId: string;\n connectionRequestId: number;\n confirmedRequestId: number;\n connectionTopicId: string;\n operatorId: string;\n memo: string;\n }): Promise<TransactionReceipt> {\n const transaction = buildHcs10OutboundConnectionCreatedRecordTx({\n outboundTopicId,\n requestorOutboundTopicId,\n connectionTopicId,\n confirmedRequestId,\n connectionRequestId,\n operatorId,\n memo,\n });\n return await this.submitPayload(transaction);\n }\n\n /**\n * Waits for confirmation of a connection request\n * @param inboundTopicId Inbound topic ID\n * @param connectionRequestId Connection request ID\n * @param maxAttempts Maximum number of attempts\n * @param delayMs Delay between attempts in milliseconds\n * @returns Connection confirmation details\n */\n async waitForConnectionConfirmation(\n inboundTopicId: string,\n connectionRequestId: number,\n maxAttempts = 60,\n delayMs = 2000,\n recordConfirmation = true,\n ): Promise<WaitForConnectionConfirmationResponse> {\n this.logger.info(\n `Waiting for connection confirmation on inbound topic ${inboundTopicId} for request ID ${connectionRequestId}`,\n );\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n this.logger.info(\n `Attempt ${attempt + 1}/${maxAttempts} to find connection confirmation`,\n );\n\n const messages = await this.mirrorNode.getTopicMessages(inboundTopicId, {\n order: 'desc',\n limit: 100,\n });\n\n const connectionCreatedMessages = messages.filter(\n m => m.op === 'connection_created',\n );\n\n this.logger.info(\n `Found ${connectionCreatedMessages.length} connection_created messages`,\n );\n\n if (connectionCreatedMessages.length > 0) {\n for (const message of connectionCreatedMessages) {\n if (Number(message.connection_id) === Number(connectionRequestId)) {\n const confirmationResult = {\n connectionTopicId: message.connection_topic_id,\n sequence_number: Number(message.sequence_number),\n confirmedBy: message.operator_id,\n memo: message.m,\n };\n\n const confirmedByAccountId = this.extractAccountFromOperatorId(\n confirmationResult.confirmedBy,\n );\n\n const account = this.getAccountAndSigner();\n const confirmedByConnectionTopics =\n await this.retrieveCommunicationTopics(confirmedByAccountId);\n\n const agentConnectionTopics =\n await this.retrieveCommunicationTopics(account.accountId);\n\n this.logger.info(\n 'Connection confirmation found',\n confirmationResult,\n );\n\n if (recordConfirmation) {\n await this.recordOutboundConnectionConfirmation({\n requestorOutboundTopicId:\n confirmedByConnectionTopics.outboundTopic,\n outboundTopicId: agentConnectionTopics.outboundTopic,\n connectionRequestId,\n confirmedRequestId: confirmationResult.sequence_number,\n connectionTopicId: confirmationResult.connectionTopicId,\n operatorId: confirmationResult.confirmedBy,\n memo: confirmationResult.memo || 'Connection confirmed',\n });\n }\n\n return confirmationResult;\n }\n }\n }\n\n if (attempt < maxAttempts - 1) {\n this.logger.info(\n `No matching confirmation found, waiting ${delayMs}ms before retrying...`,\n );\n await new Promise(resolve => setTimeout(resolve, delayMs));\n }\n }\n\n throw new Error(\n `Connection confirmation not found after ${maxAttempts} attempts for request ID ${connectionRequestId}`,\n );\n }\n\n /**\n * Retrieves the operator ID for the current agent\n * @param disableCache Whether to disable caching of the result\n * @returns The operator ID\n */\n public async getOperatorId(disableCache?: boolean): Promise<string> {\n if (this.operatorId && !disableCache) {\n return this.operatorId;\n }\n\n const accountResponse = this.getAccountAndSigner();\n\n if (!accountResponse?.accountId) {\n throw new Error('Operator ID not found');\n }\n\n const profile = await this.retrieveProfile(accountResponse.accountId);\n\n if (!profile?.success) {\n throw new Error('Failed to retrieve profile');\n }\n\n if (!profile?.topicInfo?.inboundTopic) {\n throw new Error('Failed to retrieve inbound topic');\n }\n\n const operatorId = `${profile.topicInfo?.inboundTopic}@${accountResponse.accountId}`;\n this.operatorId = operatorId;\n return operatorId;\n }\n\n /**\n * Retrieves the account ID of the owner of an inbound topic\n * @param inboundTopicId The ID of the inbound topic\n * @returns The account ID of the owner of the inbound topic\n */\n public async retrieveInboundAccountId(\n inboundTopicId: string,\n ): Promise<string> {\n const topicInfo = await this.mirrorNode.getTopicInfo(inboundTopicId);\n\n if (!topicInfo?.memo) {\n throw new Error('Failed to retrieve topic info');\n }\n\n const topicInfoMemo = topicInfo.memo.toString();\n const topicInfoParts = topicInfoMemo.split(':');\n const inboundAccountOwner = topicInfoParts?.[4];\n\n if (!inboundAccountOwner) {\n throw new Error('Failed to retrieve topic info account ID');\n }\n\n return inboundAccountOwner;\n }\n\n public clearCache(): void {\n HCS10Cache.getInstance().clear();\n }\n\n /**\n * Generates a standard HCS-10 memo string.\n * @param type The type of topic memo ('inbound', 'outbound', 'connection').\n * @param options Configuration options for the memo.\n * @returns The formatted memo string.\n * @protected\n */\n protected _generateHcs10Memo(\n type: Hcs10MemoType,\n options: {\n ttl?: number;\n accountId?: string;\n inboundTopicId?: string;\n connectionId?: number;\n },\n ): string {\n const ttl = options.ttl ?? 60;\n\n switch (type) {\n case Hcs10MemoType.INBOUND:\n if (!options.accountId) {\n throw new Error('accountId is required for inbound memo');\n }\n return `hcs-10:0:${ttl}:0:${options.accountId}`;\n case Hcs10MemoType.OUTBOUND:\n return `hcs-10:0:${ttl}:1`;\n case Hcs10MemoType.CONNECTION:\n if (!options.inboundTopicId || options.connectionId === undefined) {\n throw new Error(\n 'inboundTopicId and connectionId are required for connection memo',\n );\n }\n return `hcs-10:1:${ttl}:2:${options.inboundTopicId}:${options.connectionId}`;\n default:\n throw new Error(`Invalid HCS-10 memo type: ${type}`);\n }\n }\n\n /**\n * Reads a topic's memo and determines its HCS-10 type\n * @param topicId The topic ID to check\n * @returns The HCS-10 memo type or null if not an HCS-10 topic\n */\n public async getTopicMemoType(\n topicId: string,\n ): Promise<Hcs10MemoType | null> {\n try {\n const topicInfo = await this.mirrorNode.getTopicInfo(topicId);\n\n if (!topicInfo?.memo) {\n this.logger.debug(`No memo found for topic ${topicId}`);\n return null;\n }\n\n const memo = topicInfo.memo.toString();\n\n if (!memo.startsWith('hcs-10:')) {\n this.logger.debug(`Topic ${topicId} is not an HCS-10 topic`);\n return null;\n }\n\n const parts = memo.split(':');\n if (parts.length < 4) {\n this.logger.warn(\n `Invalid HCS-10 memo format for topic ${topicId}: ${memo}`,\n );\n return null;\n }\n\n const typeEnum = parts[3];\n\n switch (typeEnum) {\n case '0':\n return Hcs10MemoType.INBOUND;\n case '1':\n return Hcs10MemoType.OUTBOUND;\n case '2':\n return Hcs10MemoType.CONNECTION;\n case '3':\n return Hcs10MemoType.REGISTRY;\n default:\n this.logger.warn(\n `Unknown HCS-10 type enum: ${typeEnum} for topic ${topicId}`,\n );\n return null;\n }\n } catch (error) {\n this.logger.error(`Error getting topic memo type for ${topicId}:`, error);\n return null;\n }\n }\n\n protected async checkRegistrationStatus(\n transactionId: string,\n network: string,\n baseUrl: string,\n ): Promise<{ status: 'pending' | 'success' | 'failed' }> {\n try {\n const response = await fetch(`${baseUrl}/api/request-confirm`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-Network': network,\n },\n body: JSON.stringify({ transaction_id: transactionId }),\n });\n\n if (!response.ok) {\n throw new Error(\n `Failed to confirm registration: ${response.statusText}`,\n );\n }\n\n return await response.json();\n } catch (e: any) {\n const error = e as Error;\n const logMessage = `Error checking registration status: ${error.message}`;\n this.logger.error(logMessage);\n throw error;\n }\n }\n\n /**\n * Validates if an operator_id follows the correct format (agentTopicId@accountId)\n * @param operatorId The operator ID to validate\n * @returns True if the format is valid, false otherwise\n */\n protected isValidOperatorId(operatorId: string): boolean {\n if (!operatorId) {\n return false;\n }\n\n const parts = operatorId.split('@');\n\n if (parts.length !== 2) {\n return false;\n }\n\n const agentTopicId = parts[0];\n const accountId = parts[1];\n\n if (!agentTopicId) {\n return false;\n }\n\n if (!accountId) {\n return false;\n }\n\n const hederaIdPattern = /^[0-9]+\\.[0-9]+\\.[0-9]+$/;\n\n if (!hederaIdPattern.test(accountId)) {\n return false;\n }\n\n if (!hederaIdPattern.test(agentTopicId)) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Retrieves all transaction requests from a topic\n * @param topicId The topic ID to retrieve transactions from\n * @param options Optional filtering and retrieval options\n * @returns Array of transaction requests sorted by timestamp (newest first)\n */\n public async getTransactionRequests(\n topicId: string,\n options?: {\n limit?: number;\n sequenceNumber?: string | number;\n order?: 'asc' | 'desc';\n },\n ): Promise<TransactMessage[]> {\n this.logger.debug(`Retrieving transaction requests from topic ${topicId}`);\n\n const { messages } = await this.getMessageStream(topicId, {\n limit: options?.limit,\n sequenceNumber: options?.sequenceNumber,\n order: options?.order || 'desc',\n });\n\n const transactOperations = (\n messages\n .filter(m => m.op === 'transaction' && m.schedule_id)\n .map(m => ({\n operator_id: m.operator_id || '',\n schedule_id: m.schedule_id || '',\n data: m.data || '',\n memo: m.m,\n sequence_number: Number(m.sequence_number),\n })) as unknown as TransactMessage[]\n ).sort((a, b) => {\n if (a.sequence_number && b.sequence_number) {\n return b.sequence_number - a.sequence_number;\n }\n return 0;\n });\n\n const result = options?.limit\n ? transactOperations.slice(0, options.limit)\n : transactOperations;\n\n return result;\n }\n\n /**\n * Gets the HCS-10 transaction memo for analytics based on the operation type\n * @param payload The operation payload\n * @returns The transaction memo in format hcs-10:op:{operation_enum}:{topic_type_enum}\n */\n protected getHcs10TransactionMemo(payload: object | string): string | null {\n if (typeof payload !== 'object' || !('op' in payload)) {\n return null;\n }\n\n const typedPayload = payload as HCSMessageWithCommonFields;\n const operation = typedPayload.op;\n let operationEnum: string;\n let topicTypeEnum: string;\n\n switch (operation) {\n case 'register':\n operationEnum = '0';\n topicTypeEnum = '0';\n break;\n case 'delete':\n operationEnum = '1';\n topicTypeEnum = '0';\n break;\n case 'migrate':\n operationEnum = '2';\n topicTypeEnum = '0';\n break;\n case 'connection_request':\n operationEnum = '3';\n topicTypeEnum = typedPayload.outbound_topic_id ? '2' : '1';\n break;\n case 'connection_created':\n operationEnum = '4';\n topicTypeEnum = typedPayload.outbound_topic_id ? '2' : '1';\n break;\n case 'connection_closed':\n operationEnum = '5';\n topicTypeEnum = typedPayload.outbound_topic_id ? '2' : '3';\n break;\n case 'message':\n operationEnum = '6';\n topicTypeEnum = '3';\n break;\n case 'close_connection':\n operationEnum = '5';\n topicTypeEnum = '3';\n break;\n case 'transaction':\n operationEnum = '6';\n topicTypeEnum = '3';\n break;\n default:\n operationEnum = '6';\n topicTypeEnum = '3';\n }\n\n return `hcs-10:op:${operationEnum}:${topicTypeEnum}`;\n }\n}\n\nexport class HCS10Cache {\n private static instance: HCS10Cache;\n private cache: Map<string, ProfileResponse>;\n private cacheExpiry: Map<string, number>;\n private readonly CACHE_TTL = 3600000;\n\n private constructor() {\n this.cache = new Map();\n this.cacheExpiry = new Map();\n }\n\n static getInstance(): HCS10Cache {\n if (!HCS10Cache.instance) {\n HCS10Cache.instance = new HCS10Cache();\n }\n return HCS10Cache.instance;\n }\n\n set(key: string, value: ProfileResponse): void {\n this.cache.set(key, value);\n this.cacheExpiry.set(key, Date.now() + this.CACHE_TTL);\n }\n\n get(key: string): ProfileResponse | undefined {\n const expiry = this.cacheExpiry.get(key);\n if (expiry && expiry > Date.now()) {\n return this.cache.get(key);\n }\n if (expiry) {\n this.cache.delete(key);\n this.cacheExpiry.delete(key);\n }\n return undefined;\n }\n\n clear(): void {\n this.cache.clear();\n this.cacheExpiry.clear();\n }\n}\n"],"names":["Hcs10MemoType"],"mappings":"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"}
@@ -0,0 +1,247 @@
1
+ class EncryptionUnavailableError extends Error {
2
+ constructor(sessionId, summary) {
3
+ super("Encryption is not enabled for this session");
4
+ this.sessionId = sessionId;
5
+ this.summary = summary;
6
+ }
7
+ }
8
+ class EncryptedChatManager {
9
+ constructor(client) {
10
+ this.client = client;
11
+ }
12
+ registerConversationContext(context) {
13
+ this.client.registerConversationContextForEncryption(context);
14
+ }
15
+ async startSession(options) {
16
+ await this.client.encryptionReady();
17
+ const session = await this.client.chat.createSession({
18
+ uaid: options.uaid,
19
+ senderUaid: options.senderUaid,
20
+ encryptionRequested: true,
21
+ historyTtlSeconds: options.historyTtlSeconds,
22
+ auth: options.auth
23
+ });
24
+ options.onSessionCreated?.(session.sessionId);
25
+ const summary = session.encryption;
26
+ if (!summary?.enabled) {
27
+ throw new EncryptionUnavailableError(
28
+ session.sessionId,
29
+ session.encryption ?? null
30
+ );
31
+ }
32
+ const handle = await this.establishRequesterContext({
33
+ sessionId: session.sessionId,
34
+ summary,
35
+ senderUaid: options.senderUaid,
36
+ handshakeTimeoutMs: options.handshakeTimeoutMs,
37
+ pollIntervalMs: options.pollIntervalMs
38
+ });
39
+ return handle;
40
+ }
41
+ async acceptSession(options) {
42
+ await this.client.encryptionReady();
43
+ const summary = await this.waitForEncryptionSummary(
44
+ options.sessionId,
45
+ options.handshakeTimeoutMs,
46
+ options.pollIntervalMs
47
+ );
48
+ const handle = await this.establishResponderContext({
49
+ sessionId: options.sessionId,
50
+ summary,
51
+ responderUaid: options.responderUaid,
52
+ handshakeTimeoutMs: options.handshakeTimeoutMs,
53
+ pollIntervalMs: options.pollIntervalMs
54
+ });
55
+ return handle;
56
+ }
57
+ async establishRequesterContext(params) {
58
+ const keyPair = this.client.encryption.generateEphemeralKeyPair();
59
+ await this.client.chat.submitEncryptionHandshake(params.sessionId, {
60
+ role: "requester",
61
+ keyType: "secp256k1",
62
+ ephemeralPublicKey: keyPair.publicKey,
63
+ uaid: params.senderUaid ?? params.summary.requester?.uaid ?? void 0
64
+ });
65
+ const { summary, record } = await this.waitForHandshakeCompletion(
66
+ params.sessionId,
67
+ params.handshakeTimeoutMs,
68
+ params.pollIntervalMs
69
+ );
70
+ const responderKey = record.responder?.ephemeralPublicKey;
71
+ if (!responderKey) {
72
+ throw new Error("Responder handshake was not completed in time");
73
+ }
74
+ const sharedSecret = this.client.encryption.deriveSharedSecret({
75
+ privateKey: keyPair.privateKey,
76
+ peerPublicKey: responderKey
77
+ }).subarray();
78
+ const recipients = this.buildRecipients(summary);
79
+ return this.createHandle({
80
+ sessionId: params.sessionId,
81
+ sharedSecret,
82
+ summary,
83
+ recipients,
84
+ identity: summary.requester ?? void 0
85
+ });
86
+ }
87
+ async establishResponderContext(params) {
88
+ const keyPair = this.client.encryption.generateEphemeralKeyPair();
89
+ await this.client.chat.submitEncryptionHandshake(params.sessionId, {
90
+ role: "responder",
91
+ keyType: "secp256k1",
92
+ ephemeralPublicKey: keyPair.publicKey,
93
+ uaid: params.responderUaid ?? params.summary.responder?.uaid ?? void 0
94
+ });
95
+ const { summary, record } = await this.waitForHandshakeCompletion(
96
+ params.sessionId,
97
+ params.handshakeTimeoutMs,
98
+ params.pollIntervalMs
99
+ );
100
+ const requesterKey = record.requester?.ephemeralPublicKey;
101
+ if (!requesterKey) {
102
+ throw new Error("Requester handshake was not detected in time");
103
+ }
104
+ const sharedSecret = this.client.encryption.deriveSharedSecret({
105
+ privateKey: keyPair.privateKey,
106
+ peerPublicKey: requesterKey
107
+ }).subarray();
108
+ const recipients = this.buildRecipients(summary);
109
+ return this.createHandle({
110
+ sessionId: params.sessionId,
111
+ sharedSecret,
112
+ summary,
113
+ recipients,
114
+ identity: summary.responder ?? void 0
115
+ });
116
+ }
117
+ async waitForHandshakeCompletion(sessionId, timeoutMs = 3e4, pollIntervalMs = 1e3) {
118
+ const deadline = Date.now() + timeoutMs;
119
+ while (true) {
120
+ const status = await this.client.chat.getEncryptionStatus(sessionId);
121
+ const summary = status.encryption;
122
+ const record = summary?.handshake;
123
+ if (summary && record && record.status === "complete") {
124
+ return { summary, record };
125
+ }
126
+ if (Date.now() >= deadline) {
127
+ throw new Error("Timed out waiting for encrypted handshake completion");
128
+ }
129
+ await this.delay(pollIntervalMs);
130
+ }
131
+ }
132
+ async waitForEncryptionSummary(sessionId, _timeoutMs = 3e4, _pollIntervalMs = 1e3) {
133
+ const status = await this.client.chat.getEncryptionStatus(sessionId);
134
+ if (!status.encryption?.enabled) {
135
+ throw new EncryptionUnavailableError(
136
+ sessionId,
137
+ status.encryption ?? null
138
+ );
139
+ }
140
+ return status.encryption;
141
+ }
142
+ buildRecipients(summary) {
143
+ const candidates = [summary.requester, summary.responder].filter(Boolean);
144
+ const normalized = candidates.map((candidate) => {
145
+ if (!candidate) {
146
+ return null;
147
+ }
148
+ const recipient = {};
149
+ if (candidate.uaid) {
150
+ recipient.uaid = candidate.uaid;
151
+ }
152
+ if (candidate.ledgerAccountId) {
153
+ recipient.ledgerAccountId = candidate.ledgerAccountId;
154
+ }
155
+ if (candidate.userId) {
156
+ recipient.userId = candidate.userId;
157
+ }
158
+ if (candidate.email) {
159
+ recipient.email = candidate.email;
160
+ }
161
+ return recipient;
162
+ }).filter(
163
+ (entry) => Boolean(
164
+ entry?.uaid || entry?.ledgerAccountId || entry?.userId || entry?.email
165
+ )
166
+ );
167
+ if (normalized.length > 0) {
168
+ return normalized;
169
+ }
170
+ if (summary.responder?.uaid) {
171
+ return [{ uaid: summary.responder.uaid }];
172
+ }
173
+ return [];
174
+ }
175
+ createHandle(context) {
176
+ const sharedSecret = context.sharedSecret;
177
+ const uaid = context.summary.requester?.uaid ?? context.summary.responder?.uaid ?? context.identity?.uaid;
178
+ const handle = {
179
+ sessionId: context.sessionId,
180
+ mode: "encrypted",
181
+ summary: context.summary,
182
+ send: async (options) => {
183
+ const recipients = options.recipients ?? context.recipients;
184
+ return this.client.chat.sendMessage({
185
+ sessionId: context.sessionId,
186
+ message: options.message ?? "[ciphertext omitted]",
187
+ streaming: options.streaming,
188
+ auth: options.auth,
189
+ uaid,
190
+ encryption: {
191
+ plaintext: options.plaintext,
192
+ sharedSecret: Buffer.from(sharedSecret),
193
+ recipients
194
+ }
195
+ });
196
+ },
197
+ decryptHistoryEntry: (entry) => this.decryptEntry(entry, context.identity, sharedSecret)
198
+ };
199
+ this.registerConversationContext({
200
+ sessionId: context.sessionId,
201
+ sharedSecret,
202
+ identity: context.identity
203
+ });
204
+ return handle;
205
+ }
206
+ decryptEntry(entry, identity, fallbackSecret) {
207
+ const envelope = entry.cipherEnvelope;
208
+ if (!envelope) {
209
+ return null;
210
+ }
211
+ const secret = Buffer.from(fallbackSecret);
212
+ try {
213
+ return this.client.encryption.decryptCipherEnvelope({
214
+ envelope,
215
+ sharedSecret: secret
216
+ });
217
+ } catch (_error) {
218
+ return null;
219
+ }
220
+ }
221
+ recipientMatches(candidate, target) {
222
+ if (target.uaid && candidate.uaid?.toLowerCase() === target.uaid.toLowerCase()) {
223
+ return true;
224
+ }
225
+ if (target.ledgerAccountId && candidate.ledgerAccountId?.toLowerCase() === target.ledgerAccountId.toLowerCase()) {
226
+ return true;
227
+ }
228
+ if (target.userId && candidate.userId === target.userId) {
229
+ return true;
230
+ }
231
+ if (target.email && candidate.email?.toLowerCase() === target.email.toLowerCase()) {
232
+ return true;
233
+ }
234
+ return false;
235
+ }
236
+ async delay(ms) {
237
+ if (ms <= 0) {
238
+ return;
239
+ }
240
+ await new Promise((resolve) => setTimeout(resolve, ms));
241
+ }
242
+ }
243
+ export {
244
+ EncryptedChatManager,
245
+ EncryptionUnavailableError
246
+ };
247
+ //# sourceMappingURL=standards-sdk.es160.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"standards-sdk.es160.js","sources":["../../src/services/registry-broker/client/encrypted-chat-manager.ts"],"sourcesContent":["import type {\n AcceptEncryptedChatSessionOptions,\n ChatHistoryEntry,\n CipherEnvelopeRecipient,\n EncryptedChatSessionHandle,\n EncryptionHandshakeRecord,\n RecipientIdentity,\n SessionEncryptionSummary,\n SharedSecretInput,\n StartEncryptedChatSessionOptions,\n} from '../types';\nimport { RegistryBrokerClient } from './base-client';\n\ninterface EncryptedSessionContext {\n sessionId: string;\n sharedSecret: Uint8Array;\n summary: SessionEncryptionSummary;\n recipients: RecipientIdentity[];\n identity?: RecipientIdentity;\n}\n\ninterface ConversationContextInput {\n sessionId: string;\n sharedSecret: Uint8Array | Buffer;\n identity?: RecipientIdentity;\n}\n\ndeclare module './base-client' {\n interface RegistryBrokerClient {\n registerConversationContextForEncryption(\n context: ConversationContextInput,\n ): void;\n }\n}\n\nexport class EncryptionUnavailableError extends Error {\n constructor(\n readonly sessionId: string,\n readonly summary?: SessionEncryptionSummary | null,\n ) {\n super('Encryption is not enabled for this session');\n }\n}\n\nexport class EncryptedChatManager {\n constructor(private readonly client: RegistryBrokerClient) {}\n\n registerConversationContext(context: ConversationContextInput): void {\n this.client.registerConversationContextForEncryption(context);\n }\n\n async startSession(\n options: StartEncryptedChatSessionOptions,\n ): Promise<EncryptedChatSessionHandle> {\n await this.client.encryptionReady();\n const session = await this.client.chat.createSession({\n uaid: options.uaid,\n senderUaid: options.senderUaid,\n encryptionRequested: true,\n historyTtlSeconds: options.historyTtlSeconds,\n auth: options.auth,\n });\n options.onSessionCreated?.(session.sessionId);\n const summary = session.encryption;\n if (!summary?.enabled) {\n throw new EncryptionUnavailableError(\n session.sessionId,\n session.encryption ?? null,\n );\n }\n const handle = await this.establishRequesterContext({\n sessionId: session.sessionId,\n summary,\n senderUaid: options.senderUaid,\n handshakeTimeoutMs: options.handshakeTimeoutMs,\n pollIntervalMs: options.pollIntervalMs,\n });\n return handle;\n }\n\n async acceptSession(\n options: AcceptEncryptedChatSessionOptions,\n ): Promise<EncryptedChatSessionHandle> {\n await this.client.encryptionReady();\n const summary = await this.waitForEncryptionSummary(\n options.sessionId,\n options.handshakeTimeoutMs,\n options.pollIntervalMs,\n );\n const handle = await this.establishResponderContext({\n sessionId: options.sessionId,\n summary,\n responderUaid: options.responderUaid,\n handshakeTimeoutMs: options.handshakeTimeoutMs,\n pollIntervalMs: options.pollIntervalMs,\n });\n return handle;\n }\n\n private async establishRequesterContext(params: {\n sessionId: string;\n summary: SessionEncryptionSummary;\n senderUaid?: string;\n handshakeTimeoutMs?: number;\n pollIntervalMs?: number;\n }): Promise<EncryptedChatSessionHandle> {\n const keyPair = this.client.encryption.generateEphemeralKeyPair();\n await this.client.chat.submitEncryptionHandshake(params.sessionId, {\n role: 'requester',\n keyType: 'secp256k1',\n ephemeralPublicKey: keyPair.publicKey,\n uaid: params.senderUaid ?? params.summary.requester?.uaid ?? undefined,\n });\n const { summary, record } = await this.waitForHandshakeCompletion(\n params.sessionId,\n params.handshakeTimeoutMs,\n params.pollIntervalMs,\n );\n const responderKey = record.responder?.ephemeralPublicKey;\n if (!responderKey) {\n throw new Error('Responder handshake was not completed in time');\n }\n const sharedSecret = this.client.encryption\n .deriveSharedSecret({\n privateKey: keyPair.privateKey,\n peerPublicKey: responderKey,\n })\n .subarray();\n const recipients = this.buildRecipients(summary);\n return this.createHandle({\n sessionId: params.sessionId,\n sharedSecret,\n summary,\n recipients,\n identity: summary.requester ?? undefined,\n });\n }\n\n private async establishResponderContext(params: {\n sessionId: string;\n summary: SessionEncryptionSummary;\n responderUaid?: string;\n handshakeTimeoutMs?: number;\n pollIntervalMs?: number;\n }): Promise<EncryptedChatSessionHandle> {\n const keyPair = this.client.encryption.generateEphemeralKeyPair();\n await this.client.chat.submitEncryptionHandshake(params.sessionId, {\n role: 'responder',\n keyType: 'secp256k1',\n ephemeralPublicKey: keyPair.publicKey,\n uaid: params.responderUaid ?? params.summary.responder?.uaid ?? undefined,\n });\n const { summary, record } = await this.waitForHandshakeCompletion(\n params.sessionId,\n params.handshakeTimeoutMs,\n params.pollIntervalMs,\n );\n const requesterKey = record.requester?.ephemeralPublicKey;\n if (!requesterKey) {\n throw new Error('Requester handshake was not detected in time');\n }\n const sharedSecret = this.client.encryption\n .deriveSharedSecret({\n privateKey: keyPair.privateKey,\n peerPublicKey: requesterKey,\n })\n .subarray();\n const recipients = this.buildRecipients(summary);\n return this.createHandle({\n sessionId: params.sessionId,\n sharedSecret,\n summary,\n recipients,\n identity: summary.responder ?? undefined,\n });\n }\n\n private async waitForHandshakeCompletion(\n sessionId: string,\n timeoutMs = 30_000,\n pollIntervalMs = 1_000,\n ): Promise<{\n summary: SessionEncryptionSummary;\n record: EncryptionHandshakeRecord;\n }> {\n const deadline = Date.now() + timeoutMs;\n while (true) {\n const status = await this.client.chat.getEncryptionStatus(sessionId);\n const summary = status.encryption;\n const record = summary?.handshake;\n if (summary && record && record.status === 'complete') {\n return { summary, record };\n }\n if (Date.now() >= deadline) {\n throw new Error('Timed out waiting for encrypted handshake completion');\n }\n await this.delay(pollIntervalMs);\n }\n }\n\n private async waitForEncryptionSummary(\n sessionId: string,\n _timeoutMs = 30_000,\n _pollIntervalMs = 1_000,\n ): Promise<SessionEncryptionSummary> {\n const status = await this.client.chat.getEncryptionStatus(sessionId);\n if (!status.encryption?.enabled) {\n throw new EncryptionUnavailableError(\n sessionId,\n status.encryption ?? null,\n );\n }\n return status.encryption;\n }\n\n private buildRecipients(\n summary: SessionEncryptionSummary,\n ): RecipientIdentity[] {\n const candidates = [summary.requester, summary.responder].filter(Boolean);\n const normalized = candidates\n .map(candidate => {\n if (!candidate) {\n return null;\n }\n const recipient: RecipientIdentity = {};\n if (candidate.uaid) {\n recipient.uaid = candidate.uaid;\n }\n if (candidate.ledgerAccountId) {\n recipient.ledgerAccountId = candidate.ledgerAccountId;\n }\n if (candidate.userId) {\n recipient.userId = candidate.userId;\n }\n if (candidate.email) {\n recipient.email = candidate.email;\n }\n return recipient;\n })\n .filter((entry): entry is RecipientIdentity =>\n Boolean(\n entry?.uaid ||\n entry?.ledgerAccountId ||\n entry?.userId ||\n entry?.email,\n ),\n );\n if (normalized.length > 0) {\n return normalized;\n }\n if (summary.responder?.uaid) {\n return [{ uaid: summary.responder.uaid }];\n }\n return [];\n }\n\n private createHandle(\n context: EncryptedSessionContext,\n ): EncryptedChatSessionHandle {\n const sharedSecret = context.sharedSecret;\n const uaid =\n context.summary.requester?.uaid ??\n context.summary.responder?.uaid ??\n context.identity?.uaid;\n const handle: EncryptedChatSessionHandle = {\n sessionId: context.sessionId,\n mode: 'encrypted',\n summary: context.summary,\n send: async options => {\n const recipients = options.recipients ?? context.recipients;\n return this.client.chat.sendMessage({\n sessionId: context.sessionId,\n message: options.message ?? '[ciphertext omitted]',\n streaming: options.streaming,\n auth: options.auth,\n uaid,\n encryption: {\n plaintext: options.plaintext,\n sharedSecret: Buffer.from(sharedSecret),\n recipients,\n },\n });\n },\n decryptHistoryEntry: entry =>\n this.decryptEntry(entry, context.identity, sharedSecret),\n };\n this.registerConversationContext({\n sessionId: context.sessionId,\n sharedSecret,\n identity: context.identity,\n });\n return handle;\n }\n\n private decryptEntry(\n entry: ChatHistoryEntry,\n identity: RecipientIdentity | undefined,\n fallbackSecret: Uint8Array,\n ): string | null {\n const envelope = entry.cipherEnvelope;\n if (!envelope) {\n return null;\n }\n const secret: SharedSecretInput = Buffer.from(fallbackSecret);\n try {\n return this.client.encryption.decryptCipherEnvelope({\n envelope,\n sharedSecret: secret,\n });\n } catch (_error) {\n return null;\n }\n }\n\n private recipientMatches(\n candidate: CipherEnvelopeRecipient,\n target: RecipientIdentity,\n ): boolean {\n if (\n target.uaid &&\n candidate.uaid?.toLowerCase() === target.uaid.toLowerCase()\n ) {\n return true;\n }\n if (\n target.ledgerAccountId &&\n candidate.ledgerAccountId?.toLowerCase() ===\n target.ledgerAccountId.toLowerCase()\n ) {\n return true;\n }\n if (target.userId && candidate.userId === target.userId) {\n return true;\n }\n if (\n target.email &&\n candidate.email?.toLowerCase() === target.email.toLowerCase()\n ) {\n return true;\n }\n return false;\n }\n\n private async delay(ms: number): Promise<void> {\n if (ms <= 0) {\n return;\n }\n await new Promise(resolve => setTimeout(resolve, ms));\n }\n}\n"],"names":[],"mappings":"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"}