@hashgraphonline/standards-sdk 0.0.81 → 0.0.83

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 (214) hide show
  1. package/dist/es/hcs-10/base-client.d.ts.map +1 -1
  2. package/dist/es/hcs-10/browser.d.ts.map +1 -1
  3. package/dist/es/hcs-10/sdk.d.ts.map +1 -1
  4. package/dist/es/services/mirror-node.d.ts.map +1 -1
  5. package/dist/es/standards-sdk.es100.js +157 -13
  6. package/dist/es/standards-sdk.es100.js.map +1 -1
  7. package/dist/es/standards-sdk.es101.js +22 -3
  8. package/dist/es/standards-sdk.es101.js.map +1 -1
  9. package/dist/es/standards-sdk.es102.js +792 -3
  10. package/dist/es/standards-sdk.es102.js.map +1 -1
  11. package/dist/es/standards-sdk.es103.js +3 -15
  12. package/dist/es/standards-sdk.es103.js.map +1 -1
  13. package/dist/es/standards-sdk.es104.js +142 -4
  14. package/dist/es/standards-sdk.es104.js.map +1 -1
  15. package/dist/es/standards-sdk.es105.js +174 -39
  16. package/dist/es/standards-sdk.es105.js.map +1 -1
  17. package/dist/es/standards-sdk.es106.js +32 -38
  18. package/dist/es/standards-sdk.es106.js.map +1 -1
  19. package/dist/es/standards-sdk.es107.js +31 -35
  20. package/dist/es/standards-sdk.es107.js.map +1 -1
  21. package/dist/es/standards-sdk.es108.js +9 -78
  22. package/dist/es/standards-sdk.es108.js.map +1 -1
  23. package/dist/es/standards-sdk.es109.js +34 -4
  24. package/dist/es/standards-sdk.es109.js.map +1 -1
  25. package/dist/es/standards-sdk.es110.js +419 -3
  26. package/dist/es/standards-sdk.es110.js.map +1 -1
  27. package/dist/es/standards-sdk.es111.js +2 -2
  28. package/dist/es/standards-sdk.es111.js.map +1 -1
  29. package/dist/es/standards-sdk.es112.js +120 -2
  30. package/dist/es/standards-sdk.es112.js.map +1 -1
  31. package/dist/es/standards-sdk.es113.js +20 -33
  32. package/dist/es/standards-sdk.es113.js.map +1 -1
  33. package/dist/es/standards-sdk.es114.js +26 -32
  34. package/dist/es/standards-sdk.es114.js.map +1 -1
  35. package/dist/es/standards-sdk.es115.js +26 -9
  36. package/dist/es/standards-sdk.es115.js.map +1 -1
  37. package/dist/es/standards-sdk.es116.js +37 -33
  38. package/dist/es/standards-sdk.es116.js.map +1 -1
  39. package/dist/es/standards-sdk.es12.js +3 -3
  40. package/dist/es/standards-sdk.es17.js +2 -2
  41. package/dist/es/standards-sdk.es18.js +57 -41
  42. package/dist/es/standards-sdk.es18.js.map +1 -1
  43. package/dist/es/standards-sdk.es21.js +1692 -966
  44. package/dist/es/standards-sdk.es21.js.map +1 -1
  45. package/dist/es/standards-sdk.es22.js +36 -1767
  46. package/dist/es/standards-sdk.es22.js.map +1 -1
  47. package/dist/es/standards-sdk.es23.js +48 -36
  48. package/dist/es/standards-sdk.es23.js.map +1 -1
  49. package/dist/es/standards-sdk.es24.js +7163 -21
  50. package/dist/es/standards-sdk.es24.js.map +1 -1
  51. package/dist/es/standards-sdk.es25.js +3 -7190
  52. package/dist/es/standards-sdk.es25.js.map +1 -1
  53. package/dist/es/standards-sdk.es26.js +2 -3
  54. package/dist/es/standards-sdk.es26.js.map +1 -1
  55. package/dist/es/standards-sdk.es27.js +4167 -2
  56. package/dist/es/standards-sdk.es27.js.map +1 -1
  57. package/dist/es/standards-sdk.es28.js +961 -4087
  58. package/dist/es/standards-sdk.es28.js.map +1 -1
  59. package/dist/es/standards-sdk.es29.js +2 -2
  60. package/dist/es/standards-sdk.es30.js +101 -2
  61. package/dist/es/standards-sdk.es30.js.map +1 -1
  62. package/dist/es/standards-sdk.es31.js +2 -6
  63. package/dist/es/standards-sdk.es31.js.map +1 -1
  64. package/dist/es/standards-sdk.es32.js +15 -22
  65. package/dist/es/standards-sdk.es32.js.map +1 -1
  66. package/dist/es/standards-sdk.es33.js +400 -134
  67. package/dist/es/standards-sdk.es33.js.map +1 -1
  68. package/dist/es/standards-sdk.es34.js +347 -178
  69. package/dist/es/standards-sdk.es34.js.map +1 -1
  70. package/dist/es/standards-sdk.es35.js +5 -437
  71. package/dist/es/standards-sdk.es35.js.map +1 -1
  72. package/dist/es/standards-sdk.es36.js +171 -17
  73. package/dist/es/standards-sdk.es36.js.map +1 -1
  74. package/dist/es/standards-sdk.es37.js +71 -129
  75. package/dist/es/standards-sdk.es37.js.map +1 -1
  76. package/dist/es/standards-sdk.es38.js +112 -16
  77. package/dist/es/standards-sdk.es38.js.map +1 -1
  78. package/dist/es/standards-sdk.es39.js +47 -24
  79. package/dist/es/standards-sdk.es39.js.map +1 -1
  80. package/dist/es/standards-sdk.es4.js +1 -1
  81. package/dist/es/standards-sdk.es40.js +9 -28
  82. package/dist/es/standards-sdk.es40.js.map +1 -1
  83. package/dist/es/standards-sdk.es41.js +91 -15
  84. package/dist/es/standards-sdk.es41.js.map +1 -1
  85. package/dist/es/standards-sdk.es42.js +3 -43
  86. package/dist/es/standards-sdk.es42.js.map +1 -1
  87. package/dist/es/standards-sdk.es43.js +2 -18
  88. package/dist/es/standards-sdk.es43.js.map +1 -1
  89. package/dist/es/standards-sdk.es44.js +106 -54
  90. package/dist/es/standards-sdk.es44.js.map +1 -1
  91. package/dist/es/standards-sdk.es45.js +71 -1286
  92. package/dist/es/standards-sdk.es45.js.map +1 -1
  93. package/dist/es/standards-sdk.es46.js +5 -147
  94. package/dist/es/standards-sdk.es46.js.map +1 -1
  95. package/dist/es/standards-sdk.es47.js +4 -90
  96. package/dist/es/standards-sdk.es47.js.map +1 -1
  97. package/dist/es/standards-sdk.es48.js +211 -74
  98. package/dist/es/standards-sdk.es48.js.map +1 -1
  99. package/dist/es/standards-sdk.es49.js +55 -29
  100. package/dist/es/standards-sdk.es49.js.map +1 -1
  101. package/dist/es/standards-sdk.es5.js +29 -21
  102. package/dist/es/standards-sdk.es5.js.map +1 -1
  103. package/dist/es/standards-sdk.es50.js +69 -159
  104. package/dist/es/standards-sdk.es50.js.map +1 -1
  105. package/dist/es/standards-sdk.es51.js +2281 -792
  106. package/dist/es/standards-sdk.es51.js.map +1 -1
  107. package/dist/es/standards-sdk.es52.js +146 -156
  108. package/dist/es/standards-sdk.es52.js.map +1 -1
  109. package/dist/es/standards-sdk.es53.js +7109 -74
  110. package/dist/es/standards-sdk.es53.js.map +1 -1
  111. package/dist/es/standards-sdk.es54.js +3 -2
  112. package/dist/es/standards-sdk.es54.js.map +1 -1
  113. package/dist/es/standards-sdk.es55.js +31 -15
  114. package/dist/es/standards-sdk.es55.js.map +1 -1
  115. package/dist/es/standards-sdk.es56.js +57 -403
  116. package/dist/es/standards-sdk.es56.js.map +1 -1
  117. package/dist/es/standards-sdk.es57.js +44 -358
  118. package/dist/es/standards-sdk.es57.js.map +1 -1
  119. package/dist/es/standards-sdk.es58.js +9 -5
  120. package/dist/es/standards-sdk.es58.js.map +1 -1
  121. package/dist/es/standards-sdk.es59.js +57 -171
  122. package/dist/es/standards-sdk.es59.js.map +1 -1
  123. package/dist/es/standards-sdk.es60.js +6 -81
  124. package/dist/es/standards-sdk.es60.js.map +1 -1
  125. package/dist/es/standards-sdk.es61.js +12 -111
  126. package/dist/es/standards-sdk.es61.js.map +1 -1
  127. package/dist/es/standards-sdk.es62.js +7 -52
  128. package/dist/es/standards-sdk.es62.js.map +1 -1
  129. package/dist/es/standards-sdk.es63.js +45 -10
  130. package/dist/es/standards-sdk.es63.js.map +1 -1
  131. package/dist/es/standards-sdk.es64.js +2 -97
  132. package/dist/es/standards-sdk.es64.js.map +1 -1
  133. package/dist/es/standards-sdk.es65.js +136 -4
  134. package/dist/es/standards-sdk.es65.js.map +1 -1
  135. package/dist/es/standards-sdk.es66.js +172 -2
  136. package/dist/es/standards-sdk.es66.js.map +1 -1
  137. package/dist/es/standards-sdk.es67.js +13 -113
  138. package/dist/es/standards-sdk.es67.js.map +1 -1
  139. package/dist/es/standards-sdk.es68.js +13 -74
  140. package/dist/es/standards-sdk.es68.js.map +1 -1
  141. package/dist/es/standards-sdk.es69.js +2 -6
  142. package/dist/es/standards-sdk.es69.js.map +1 -1
  143. package/dist/es/standards-sdk.es7.js +34 -28
  144. package/dist/es/standards-sdk.es7.js.map +1 -1
  145. package/dist/es/standards-sdk.es70.js +31 -4
  146. package/dist/es/standards-sdk.es70.js.map +1 -1
  147. package/dist/es/standards-sdk.es71.js +13 -219
  148. package/dist/es/standards-sdk.es71.js.map +1 -1
  149. package/dist/es/standards-sdk.es72.js +4 -58
  150. package/dist/es/standards-sdk.es72.js.map +1 -1
  151. package/dist/es/standards-sdk.es73.js +4 -69
  152. package/dist/es/standards-sdk.es73.js.map +1 -1
  153. package/dist/es/standards-sdk.es74.js +14 -19
  154. package/dist/es/standards-sdk.es74.js.map +1 -1
  155. package/dist/es/standards-sdk.es75.js +4 -26
  156. package/dist/es/standards-sdk.es75.js.map +1 -1
  157. package/dist/es/standards-sdk.es76.js +39 -26
  158. package/dist/es/standards-sdk.es76.js.map +1 -1
  159. package/dist/es/standards-sdk.es77.js +39 -37
  160. package/dist/es/standards-sdk.es77.js.map +1 -1
  161. package/dist/es/standards-sdk.es78.js +32 -414
  162. package/dist/es/standards-sdk.es78.js.map +1 -1
  163. package/dist/es/standards-sdk.es79.js +78 -2
  164. package/dist/es/standards-sdk.es79.js.map +1 -1
  165. package/dist/es/standards-sdk.es8.js +8 -4
  166. package/dist/es/standards-sdk.es8.js.map +1 -1
  167. package/dist/es/standards-sdk.es80.js +3 -120
  168. package/dist/es/standards-sdk.es80.js.map +1 -1
  169. package/dist/es/standards-sdk.es81.js +2 -2282
  170. package/dist/es/standards-sdk.es81.js.map +1 -1
  171. package/dist/es/standards-sdk.es82.js +2 -164
  172. package/dist/es/standards-sdk.es82.js.map +1 -1
  173. package/dist/es/standards-sdk.es83.js +195 -3
  174. package/dist/es/standards-sdk.es83.js.map +1 -1
  175. package/dist/es/standards-sdk.es84.js +432 -26
  176. package/dist/es/standards-sdk.es84.js.map +1 -1
  177. package/dist/es/standards-sdk.es85.js +19 -57
  178. package/dist/es/standards-sdk.es85.js.map +1 -1
  179. package/dist/es/standards-sdk.es86.js +133 -44
  180. package/dist/es/standards-sdk.es86.js.map +1 -1
  181. package/dist/es/standards-sdk.es87.js +17 -9
  182. package/dist/es/standards-sdk.es87.js.map +1 -1
  183. package/dist/es/standards-sdk.es88.js +25 -61
  184. package/dist/es/standards-sdk.es88.js.map +1 -1
  185. package/dist/es/standards-sdk.es89.js +29 -6
  186. package/dist/es/standards-sdk.es89.js.map +1 -1
  187. package/dist/es/standards-sdk.es9.js +1 -1
  188. package/dist/es/standards-sdk.es90.js +19 -13
  189. package/dist/es/standards-sdk.es90.js.map +1 -1
  190. package/dist/es/standards-sdk.es91.js +44 -7
  191. package/dist/es/standards-sdk.es91.js.map +1 -1
  192. package/dist/es/standards-sdk.es92.js +18 -45
  193. package/dist/es/standards-sdk.es92.js.map +1 -1
  194. package/dist/es/standards-sdk.es93.js +61 -2
  195. package/dist/es/standards-sdk.es93.js.map +1 -1
  196. package/dist/es/standards-sdk.es94.js +1274 -121
  197. package/dist/es/standards-sdk.es94.js.map +1 -1
  198. package/dist/es/standards-sdk.es95.js +133 -157
  199. package/dist/es/standards-sdk.es95.js.map +1 -1
  200. package/dist/es/standards-sdk.es96.js +69 -7114
  201. package/dist/es/standards-sdk.es96.js.map +1 -1
  202. package/dist/es/standards-sdk.es97.js +84 -13
  203. package/dist/es/standards-sdk.es97.js.map +1 -1
  204. package/dist/es/standards-sdk.es98.js +32 -13
  205. package/dist/es/standards-sdk.es98.js.map +1 -1
  206. package/dist/es/standards-sdk.es99.js +5 -31
  207. package/dist/es/standards-sdk.es99.js.map +1 -1
  208. package/dist/umd/hcs-10/base-client.d.ts.map +1 -1
  209. package/dist/umd/hcs-10/browser.d.ts.map +1 -1
  210. package/dist/umd/hcs-10/sdk.d.ts.map +1 -1
  211. package/dist/umd/services/mirror-node.d.ts.map +1 -1
  212. package/dist/umd/standards-sdk.umd.js +1 -1
  213. package/dist/umd/standards-sdk.umd.js.map +1 -1
  214. package/package.json +1 -1
@@ -1,8 +1,8 @@
1
- import Buffer from "./standards-sdk.es22.js";
1
+ import Buffer from "./standards-sdk.es21.js";
2
2
  import { PublicKey, Timestamp } from "@hashgraph/sdk";
3
- import "./standards-sdk.es23.js";
3
+ import "./standards-sdk.es22.js";
4
4
  import { proto } from "@hashgraph/proto";
5
- import axios from "./standards-sdk.es24.js";
5
+ import axios from "./standards-sdk.es23.js";
6
6
  class HederaMirrorNode {
7
7
  constructor(network, logger) {
8
8
  this.network = network;
@@ -32,10 +32,11 @@ class HederaMirrorNode {
32
32
  );
33
33
  }
34
34
  return PublicKey.fromString(accountInfo.key.key);
35
- } catch (error) {
36
- throw new Error(
37
- `Error fetching public key from Mirror Node: ${error.message}`
38
- );
35
+ } catch (e) {
36
+ const error = e;
37
+ const logMessage = `Error fetching public key from Mirror Node: ${error.message}`;
38
+ this.logger.error(logMessage);
39
+ throw new Error(logMessage);
39
40
  }
40
41
  }
41
42
  /**
@@ -58,10 +59,10 @@ class HederaMirrorNode {
58
59
  if (attempt < maxRetries - 1) {
59
60
  await new Promise((resolve) => setTimeout(resolve, 2e3));
60
61
  }
61
- } catch (error) {
62
- this.logger.error(
63
- `Error getting account memo (attempt ${attempt + 1}): ${error.message}`
64
- );
62
+ } catch (e) {
63
+ const error = e;
64
+ const logMessage = `Error getting account memo (attempt ${attempt + 1}): ${error.message}`;
65
+ this.logger.error(logMessage);
65
66
  if (attempt < maxRetries - 1) {
66
67
  await new Promise((resolve) => setTimeout(resolve, 2e3));
67
68
  }
@@ -80,9 +81,11 @@ class HederaMirrorNode {
80
81
  const topicInfoUrl = `${this.baseUrl}/api/v1/topics/${topicId}`;
81
82
  const response = await axios.get(topicInfoUrl);
82
83
  return response.data;
83
- } catch (error) {
84
- this.logger.error(`Error retrieving topic information: ${error.message}`);
85
- throw new Error(`Failed to retrieve topic information: ${error.message}`);
84
+ } catch (e) {
85
+ const error = e;
86
+ const logMessage = `Error retrieving topic information: ${error.message}`;
87
+ this.logger.error(logMessage);
88
+ throw new Error(logMessage);
86
89
  }
87
90
  }
88
91
  /**
@@ -95,8 +98,10 @@ class HederaMirrorNode {
95
98
  try {
96
99
  const topicInfo = await this.getTopicInfo(topicId);
97
100
  return topicInfo.custom_fees;
98
- } catch (error) {
99
- this.logger.error(`Error retrieving topic fees: ${error.message}`);
101
+ } catch (e) {
102
+ const error = e;
103
+ const logMessage = `Error retrieving topic fees: ${error.message}`;
104
+ this.logger.error(logMessage);
100
105
  return null;
101
106
  }
102
107
  }
@@ -116,6 +121,9 @@ class HederaMirrorNode {
116
121
  const usdPrice = Number(response?.current_rate?.cent_equivalent) / Number(response?.current_rate?.hbar_equivalent) / 100;
117
122
  return usdPrice;
118
123
  } catch (e) {
124
+ const error = e;
125
+ const logMessage = `Error retrieving HBAR price: ${error.message}`;
126
+ this.logger.error(logMessage);
119
127
  return null;
120
128
  }
121
129
  }
@@ -136,10 +144,10 @@ class HederaMirrorNode {
136
144
  }
137
145
  this.logger.warn(`No token info found for ${tokenId}`);
138
146
  return null;
139
- } catch (error) {
140
- this.logger.error(
141
- `Error fetching token info for ${tokenId}: ${error.message}`
142
- );
147
+ } catch (e) {
148
+ const error = e;
149
+ const logMessage = `Error fetching token info for ${tokenId}: ${error.message}`;
150
+ this.logger.error(logMessage);
143
151
  return null;
144
152
  }
145
153
  }
@@ -179,16 +187,16 @@ class HederaMirrorNode {
179
187
  );
180
188
  }
181
189
  } catch (error) {
182
- this.logger.error(`Error decoding message: ${error}`);
190
+ const logMessage = `Error decoding message: ${error}`;
191
+ this.logger.error(logMessage);
183
192
  continue;
184
193
  }
185
194
  let messageJson;
186
195
  try {
187
196
  messageJson = JSON.parse(messageContent);
188
197
  } catch (error) {
189
- this.logger.error(
190
- `Invalid JSON message content: ${messageContent}`
191
- );
198
+ const logMessage = `Invalid JSON message content: ${messageContent}`;
199
+ this.logger.error(logMessage);
192
200
  return;
193
201
  }
194
202
  messageJson.sequence_number = message.sequence_number;
@@ -199,14 +207,17 @@ class HederaMirrorNode {
199
207
  created: new Date(Number(message.consensus_timestamp) * 1e3)
200
208
  });
201
209
  } catch (error) {
202
- this.logger.error(`Error processing message: ${error.message}`);
210
+ const logMessage = `Error processing message: ${error.message}`;
211
+ this.logger.error(logMessage);
203
212
  }
204
213
  }
205
214
  }
206
215
  nextUrl = data.links?.next ? `${this.baseUrl}${data.links.next}` : "";
207
- } catch (error) {
208
- this.logger.error(`Error querying topic messages: ${error.message}`);
209
- throw new Error(`Failed to query topic messages: ${error.message}`);
216
+ } catch (e) {
217
+ const error = e;
218
+ const logMessage = `Error querying topic messages: ${error.message} on ${topicId}`;
219
+ this.logger.error(logMessage);
220
+ throw new Error(logMessage);
210
221
  }
211
222
  }
212
223
  return messages;
@@ -227,9 +238,11 @@ class HederaMirrorNode {
227
238
  );
228
239
  }
229
240
  return response.data;
230
- } catch (error) {
231
- this.logger.error(`Failed to fetch account: ${error.message}`);
232
- throw new Error(`Failed to fetch account: ${error.message}`);
241
+ } catch (e) {
242
+ const error = e;
243
+ const logMessage = `Failed to fetch account: ${error.message}`;
244
+ this.logger.error(logMessage);
245
+ throw new Error(logMessage);
233
246
  }
234
247
  }
235
248
  /**
@@ -242,11 +255,11 @@ class HederaMirrorNode {
242
255
  try {
243
256
  const key = proto.Key.decode(keyBytes);
244
257
  return this.evaluateKeyAccess(key, userPublicKey);
245
- } catch (error) {
246
- this.logger.error(
247
- `Error decoding protobuf key: ${error instanceof Error ? error.message : String(error)}`
248
- );
249
- return false;
258
+ } catch (e) {
259
+ const error = e;
260
+ const logMessage = `Error decoding protobuf key: ${error.message}`;
261
+ this.logger.error(logMessage);
262
+ throw new Error(logMessage);
250
263
  }
251
264
  }
252
265
  /**
@@ -294,10 +307,10 @@ class HederaMirrorNode {
294
307
  if (hasNestedAccess) {
295
308
  return true;
296
309
  }
297
- } catch (err) {
298
- this.logger.debug(
299
- `Error in nested key: ${err instanceof Error ? err.message : String(err)}`
300
- );
310
+ } catch (e) {
311
+ const error = e;
312
+ const logMessage = `Error in nested key: ${error.message}`;
313
+ this.logger.debug(logMessage);
301
314
  }
302
315
  }
303
316
  }
@@ -313,7 +326,10 @@ class HederaMirrorNode {
313
326
  try {
314
327
  const decodedKey = PublicKey.fromBytes(Buffer.from(keyData));
315
328
  return decodedKey.toString() === userPublicKey.toString();
316
- } catch (err) {
329
+ } catch (e) {
330
+ const error = e;
331
+ const logMessage = `Error comparing Ed25519 key: ${error.message}`;
332
+ this.logger.debug(logMessage);
317
333
  return false;
318
334
  }
319
335
  }
@@ -1 +1 @@
1
- {"version":3,"file":"standards-sdk.es18.js","sources":["../../src/services/mirror-node.ts"],"sourcesContent":["import { PublicKey, Timestamp } from '@hashgraph/sdk';\nimport axios from 'axios';\nimport { Logger } from '../utils/logger';\nimport { HCSMessage } from '../hcs-10/base-client';\nimport { proto } from '@hashgraph/proto';\nimport {\n AccountResponse,\n CustomFees,\n HBARPrice,\n TokenInfoResponse,\n TopicMessagesResponse,\n TopicResponse,\n} from './types';\nimport { NetworkType } from '../utils/types';\nexport class HederaMirrorNode {\n private network: NetworkType;\n private baseUrl: string;\n private logger: Logger;\n private isServerEnvironment: boolean;\n\n constructor(network: NetworkType, logger: Logger) {\n this.network = network;\n this.baseUrl = this.getMirrorNodeUrl();\n this.logger = logger;\n this.isServerEnvironment = typeof window === 'undefined';\n }\n\n private getMirrorNodeUrl(): string {\n return this.network === 'mainnet'\n ? 'https://mainnet-public.mirrornode.hedera.com'\n : 'https://testnet.mirrornode.hedera.com';\n }\n\n getBaseUrl(): string {\n return this.baseUrl;\n }\n\n /**\n * Retrieves the public key for a given account ID from the mirror node.\n * @param accountId The ID of the account to retrieve the public key for.\n * @returns A promise that resolves to the public key for the given account.\n * @throws An error if the account ID is invalid or the public key cannot be retrieved.\n */\n async getPublicKey(accountId: string): Promise<PublicKey> {\n this.logger.info(`Getting public key for account ${accountId}`);\n\n const accountInfo = await this.requestAccount(accountId);\n\n try {\n if (!accountInfo || !accountInfo.key) {\n throw new Error(\n `Failed to retrieve public key for account ID: ${accountId}`\n );\n }\n\n return PublicKey.fromString(accountInfo.key.key);\n } catch (error: any) {\n throw new Error(\n `Error fetching public key from Mirror Node: ${error.message}`\n );\n }\n }\n\n /**\n * Retrieves the memo for a given account ID from the mirror node.\n * @param accountId The ID of the account to retrieve the memo for.\n * @returns A promise that resolves to the memo for the given account.\n * @throws An error if the account ID is invalid or the memo cannot be retrieved.\n */\n async getAccountMemo(accountId: string): Promise<string | null> {\n const maxRetries = 3;\n\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n try {\n const accountInfoUrl = `${this.baseUrl}/api/v1/accounts/${accountId}`;\n\n const response = await axios.get(accountInfoUrl);\n const accountInfo = response.data;\n\n if (accountInfo && accountInfo.memo) {\n return accountInfo.memo;\n }\n\n this.logger.error(`No memo found for account ${accountId}`);\n\n if (attempt < maxRetries - 1) {\n await new Promise((resolve) => setTimeout(resolve, 2000));\n }\n } catch (error: any) {\n this.logger.error(\n `Error getting account memo (attempt ${attempt + 1}): ${\n error.message\n }`\n );\n\n if (attempt < maxRetries - 1) {\n await new Promise((resolve) => setTimeout(resolve, 2000));\n }\n }\n }\n\n return null;\n }\n\n /**\n * Retrieves topic information for a given topic ID from the mirror node.\n * @param topicId The ID of the topic to retrieve information for.\n * @returns A promise that resolves to the topic information.\n * @throws An error if the topic ID is invalid or the information cannot be retrieved.\n */\n async getTopicInfo(topicId: string): Promise<TopicResponse> {\n try {\n const topicInfoUrl = `${this.baseUrl}/api/v1/topics/${topicId}`;\n const response = await axios.get(topicInfoUrl);\n return response.data;\n } catch (error: any) {\n this.logger.error(`Error retrieving topic information: ${error.message}`);\n throw new Error(`Failed to retrieve topic information: ${error.message}`);\n }\n }\n\n /**\n * Retrieves custom fees for a given topic ID from the mirror node.\n * @param topicId The ID of the topic to retrieve custom fees for.\n * @returns A promise that resolves to the custom fees for the given topic.\n * @throws An error if the topic ID is invalid or the custom fees cannot be retrieved.\n */\n async getTopicFees(topicId: string): Promise<CustomFees | null> {\n try {\n const topicInfo = await this.getTopicInfo(topicId);\n return topicInfo.custom_fees;\n } catch (error: any) {\n this.logger.error(`Error retrieving topic fees: ${error.message}`);\n return null;\n }\n }\n\n /**\n * Retrieves the current HBAR price from the mirror node.\n * @param date The date to retrieve the HBAR price for.\n * @returns A promise that resolves to the HBAR price for the given date.\n * @throws An error if the date is invalid or the price cannot be retrieved.\n */\n async getHBARPrice(date: Date): Promise<number | null> {\n try {\n const timestamp = Timestamp.fromDate(date).toString();\n\n const request = await fetch(\n `https://mainnet-public.mirrornode.hedera.com/api/v1/network/exchangerate?timestamp=${timestamp}`\n );\n const response = (await request.json()) as HBARPrice;\n\n const usdPrice =\n Number(response?.current_rate?.cent_equivalent) /\n Number(response?.current_rate?.hbar_equivalent) /\n 100;\n\n return usdPrice;\n } catch (e) {\n return null;\n }\n }\n\n /**\n * Retrieves token information for a given token ID from the mirror node.\n * @param tokenId The ID of the token to retrieve information for.\n * @returns A promise that resolves to the token information.\n * @throws An error if the token ID is invalid or the information cannot be retrieved.\n */\n async getTokenInfo(tokenId: string): Promise<TokenInfoResponse | null> {\n this.logger.debug(`Fetching token info for ${tokenId}`);\n try {\n const tokenInfoUrl = `${this.baseUrl}/api/v1/tokens/${tokenId}`;\n const response = await axios.get<TokenInfoResponse>(tokenInfoUrl);\n if (response.data) {\n this.logger.trace(`Token info found for ${tokenId}:`, response.data);\n return response.data;\n }\n this.logger.warn(`No token info found for ${tokenId}`);\n return null;\n } catch (error: any) {\n this.logger.error(\n `Error fetching token info for ${tokenId}: ${error.message}`\n );\n\n return null;\n }\n }\n\n /**\n * Retrieves messages for a given topic ID from the mirror node.\n * @param topicId The ID of the topic to retrieve messages for.\n * @returns A promise that resolves to the messages for the given topic.\n * @throws An error if the topic ID is invalid or the messages cannot be retrieved.\n */\n async getTopicMessages(topicId: string): Promise<HCSMessage[]> {\n this.logger.trace(`Querying messages for topic ${topicId}`);\n\n let nextUrl = `${this.baseUrl}/api/v1/topics/${topicId}/messages`;\n const messages: HCSMessage[] = [];\n\n while (nextUrl) {\n try {\n const response = await axios.get<TopicMessagesResponse>(nextUrl);\n const data = response.data;\n\n if (data.messages && data.messages.length > 0) {\n for (const message of data.messages) {\n try {\n if (!message.message) {\n continue;\n }\n\n let messageContent: string;\n try {\n if (this.isServerEnvironment) {\n messageContent = Buffer.from(\n message.message,\n 'base64'\n ).toString('utf-8');\n } else {\n messageContent = new TextDecoder().decode(\n Uint8Array.from(atob(message.message), (c) =>\n c.charCodeAt(0)\n )\n );\n }\n } catch (error) {\n this.logger.error(`Error decoding message: ${error}`);\n continue;\n }\n\n let messageJson;\n try {\n messageJson = JSON.parse(messageContent);\n } catch (error) {\n this.logger.error(\n `Invalid JSON message content: ${messageContent}`\n );\n return;\n }\n\n messageJson.sequence_number = message.sequence_number;\n messages.push({\n ...messageJson,\n consensus_timestamp: message.consensus_timestamp,\n sequence_number: message.sequence_number,\n created: new Date(Number(message.consensus_timestamp) * 1000),\n });\n } catch (error: any) {\n this.logger.error(`Error processing message: ${error.message}`);\n }\n }\n }\n\n nextUrl = data.links?.next ? `${this.baseUrl}${data.links.next}` : '';\n } catch (error: any) {\n this.logger.error(`Error querying topic messages: ${error.message}`);\n throw new Error(`Failed to query topic messages: ${error.message}`);\n }\n }\n\n return messages;\n }\n\n /**\n * Requests account information for a given account ID from the mirror node.\n * @param accountId The ID of the account to retrieve information for.\n * @returns A promise that resolves to the account information.\n * @throws An error if the account ID is invalid or the information cannot be retrieved.\n */\n async requestAccount(accountId: string): Promise<AccountResponse> {\n try {\n const accountInfoUrl = `${this.baseUrl}/api/v1/accounts/${accountId}`;\n const response = await axios.get(accountInfoUrl);\n if (!response.data) {\n throw new Error(\n `Failed to make request to mirror node for account: ${accountId}`\n );\n }\n return response.data;\n } catch (error: any) {\n this.logger.error(`Failed to fetch account: ${error.message}`);\n throw new Error(`Failed to fetch account: ${error.message}`);\n }\n }\n\n /**\n * Checks if a user has access to a given key list.\n * @param keyBytes The key list to check access for.\n * @param userPublicKey The public key of the user to check access for.\n * @returns A promise that resolves to true if the user has access, false otherwise.\n */\n async checkKeyListAccess(\n keyBytes: Buffer,\n userPublicKey: PublicKey\n ): Promise<boolean> {\n try {\n const key = proto.Key.decode(keyBytes);\n return this.evaluateKeyAccess(key, userPublicKey);\n } catch (error) {\n this.logger.error(\n `Error decoding protobuf key: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n return false;\n }\n }\n\n /**\n * Evaluates the access of a given key to a user's public key.\n * @param key The key to evaluate access for.\n * @param userPublicKey The public key of the user to evaluate access for.\n * @returns A promise that resolves to true if the key has access, false otherwise.\n */\n private async evaluateKeyAccess(\n key: proto.IKey,\n userPublicKey: PublicKey\n ): Promise<boolean> {\n if (key.ed25519) {\n return this.compareEd25519Key(key.ed25519, userPublicKey);\n }\n\n if (key.keyList) {\n return this.evaluateKeyList(key.keyList, userPublicKey);\n }\n\n if (key.thresholdKey && key.thresholdKey.keys) {\n return this.evaluateKeyList(key.thresholdKey.keys, userPublicKey);\n }\n\n return false;\n }\n\n /**\n * Evaluates the access of a given key list to a user's public key.\n * @param keyList The key list to evaluate access for.\n * @param userPublicKey The public key of the user to evaluate access for.\n * @returns A promise that resolves to true if the key list has access, false otherwise.\n */\n private async evaluateKeyList(\n keyList: proto.IKeyList,\n userPublicKey: PublicKey\n ): Promise<boolean> {\n const keys = keyList.keys || [];\n\n for (const listKey of keys) {\n if (!listKey) continue;\n\n if (listKey.ed25519) {\n if (this.compareEd25519Key(listKey.ed25519, userPublicKey)) {\n return true;\n }\n } else if (listKey.keyList || listKey.thresholdKey) {\n try {\n const nestedKeyBytes = proto.Key.encode({\n ...(listKey.keyList ? { keyList: listKey.keyList } : {}),\n ...(listKey.thresholdKey\n ? { thresholdKey: listKey.thresholdKey }\n : {}),\n }).finish();\n\n const hasNestedAccess = await this.checkKeyListAccess(\n Buffer.from(nestedKeyBytes),\n userPublicKey\n );\n\n if (hasNestedAccess) {\n return true;\n }\n } catch (err) {\n this.logger.debug(\n `Error in nested key: ${\n err instanceof Error ? err.message : String(err)\n }`\n );\n }\n }\n }\n\n return false;\n }\n\n /**\n * Compares an Ed25519 key with a user's public key.\n * @param keyData The Ed25519 key data to compare.\n * @param userPublicKey The public key of the user to compare with.\n * @returns A boolean indicating whether the key matches the user's public key.\n */\n private compareEd25519Key(\n keyData: Uint8Array,\n userPublicKey: PublicKey\n ): boolean {\n try {\n const decodedKey = PublicKey.fromBytes(Buffer.from(keyData));\n return decodedKey.toString() === userPublicKey.toString();\n } catch (err) {\n return false;\n }\n }\n}\n"],"names":[],"mappings":";;;;;AAcO,MAAM,iBAAiB;AAAA,EAM5B,YAAY,SAAsB,QAAgB;AAChD,SAAK,UAAU;AACV,SAAA,UAAU,KAAK,iBAAiB;AACrC,SAAK,SAAS;AACT,SAAA,sBAAsB,OAAO,WAAW;AAAA,EAAA;AAAA,EAGvC,mBAA2B;AAC1B,WAAA,KAAK,YAAY,YACpB,iDACA;AAAA,EAAA;AAAA,EAGN,aAAqB;AACnB,WAAO,KAAK;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASd,MAAM,aAAa,WAAuC;AACxD,SAAK,OAAO,KAAK,kCAAkC,SAAS,EAAE;AAE9D,UAAM,cAAc,MAAM,KAAK,eAAe,SAAS;AAEnD,QAAA;AACF,UAAI,CAAC,eAAe,CAAC,YAAY,KAAK;AACpC,cAAM,IAAI;AAAA,UACR,iDAAiD,SAAS;AAAA,QAC5D;AAAA,MAAA;AAGF,aAAO,UAAU,WAAW,YAAY,IAAI,GAAG;AAAA,aACxC,OAAY;AACnB,YAAM,IAAI;AAAA,QACR,+CAA+C,MAAM,OAAO;AAAA,MAC9D;AAAA,IAAA;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASF,MAAM,eAAe,WAA2C;AAC9D,UAAM,aAAa;AAEnB,aAAS,UAAU,GAAG,UAAU,YAAY,WAAW;AACjD,UAAA;AACF,cAAM,iBAAiB,GAAG,KAAK,OAAO,oBAAoB,SAAS;AAEnE,cAAM,WAAW,MAAM,MAAM,IAAI,cAAc;AAC/C,cAAM,cAAc,SAAS;AAEzB,YAAA,eAAe,YAAY,MAAM;AACnC,iBAAO,YAAY;AAAA,QAAA;AAGrB,aAAK,OAAO,MAAM,6BAA6B,SAAS,EAAE;AAEtD,YAAA,UAAU,aAAa,GAAG;AAC5B,gBAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,GAAI,CAAC;AAAA,QAAA;AAAA,eAEnD,OAAY;AACnB,aAAK,OAAO;AAAA,UACV,uCAAuC,UAAU,CAAC,MAChD,MAAM,OACR;AAAA,QACF;AAEI,YAAA,UAAU,aAAa,GAAG;AAC5B,gBAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,GAAI,CAAC;AAAA,QAAA;AAAA,MAC1D;AAAA,IACF;AAGK,WAAA;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAST,MAAM,aAAa,SAAyC;AACtD,QAAA;AACF,YAAM,eAAe,GAAG,KAAK,OAAO,kBAAkB,OAAO;AAC7D,YAAM,WAAW,MAAM,MAAM,IAAI,YAAY;AAC7C,aAAO,SAAS;AAAA,aACT,OAAY;AACnB,WAAK,OAAO,MAAM,uCAAuC,MAAM,OAAO,EAAE;AACxE,YAAM,IAAI,MAAM,yCAAyC,MAAM,OAAO,EAAE;AAAA,IAAA;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASF,MAAM,aAAa,SAA6C;AAC1D,QAAA;AACF,YAAM,YAAY,MAAM,KAAK,aAAa,OAAO;AACjD,aAAO,UAAU;AAAA,aACV,OAAY;AACnB,WAAK,OAAO,MAAM,gCAAgC,MAAM,OAAO,EAAE;AAC1D,aAAA;AAAA,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASF,MAAM,aAAa,MAAoC;AACjD,QAAA;AACF,YAAM,YAAY,UAAU,SAAS,IAAI,EAAE,SAAS;AAEpD,YAAM,UAAU,MAAM;AAAA,QACpB,sFAAsF,SAAS;AAAA,MACjG;AACM,YAAA,WAAY,MAAM,QAAQ,KAAK;AAE/B,YAAA,WACJ,OAAO,UAAU,cAAc,eAAe,IAC9C,OAAO,UAAU,cAAc,eAAe,IAC9C;AAEK,aAAA;AAAA,aACA,GAAG;AACH,aAAA;AAAA,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASF,MAAM,aAAa,SAAoD;AACrE,SAAK,OAAO,MAAM,2BAA2B,OAAO,EAAE;AAClD,QAAA;AACF,YAAM,eAAe,GAAG,KAAK,OAAO,kBAAkB,OAAO;AAC7D,YAAM,WAAW,MAAM,MAAM,IAAuB,YAAY;AAChE,UAAI,SAAS,MAAM;AACjB,aAAK,OAAO,MAAM,wBAAwB,OAAO,KAAK,SAAS,IAAI;AACnE,eAAO,SAAS;AAAA,MAAA;AAElB,WAAK,OAAO,KAAK,2BAA2B,OAAO,EAAE;AAC9C,aAAA;AAAA,aACA,OAAY;AACnB,WAAK,OAAO;AAAA,QACV,iCAAiC,OAAO,KAAK,MAAM,OAAO;AAAA,MAC5D;AAEO,aAAA;AAAA,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASF,MAAM,iBAAiB,SAAwC;AAC7D,SAAK,OAAO,MAAM,+BAA+B,OAAO,EAAE;AAE1D,QAAI,UAAU,GAAG,KAAK,OAAO,kBAAkB,OAAO;AACtD,UAAM,WAAyB,CAAC;AAEhC,WAAO,SAAS;AACV,UAAA;AACF,cAAM,WAAW,MAAM,MAAM,IAA2B,OAAO;AAC/D,cAAM,OAAO,SAAS;AAEtB,YAAI,KAAK,YAAY,KAAK,SAAS,SAAS,GAAG;AAClC,qBAAA,WAAW,KAAK,UAAU;AAC/B,gBAAA;AACE,kBAAA,CAAC,QAAQ,SAAS;AACpB;AAAA,cAAA;AAGE,kBAAA;AACA,kBAAA;AACF,oBAAI,KAAK,qBAAqB;AAC5B,mCAAiB,OAAO;AAAA,oBACtB,QAAQ;AAAA,oBACR;AAAA,kBAAA,EACA,SAAS,OAAO;AAAA,gBAAA,OACb;AACY,mCAAA,IAAI,cAAc;AAAA,oBACjC,WAAW;AAAA,sBAAK,KAAK,QAAQ,OAAO;AAAA,sBAAG,CAAC,MACtC,EAAE,WAAW,CAAC;AAAA,oBAAA;AAAA,kBAElB;AAAA,gBAAA;AAAA,uBAEK,OAAO;AACd,qBAAK,OAAO,MAAM,2BAA2B,KAAK,EAAE;AACpD;AAAA,cAAA;AAGE,kBAAA;AACA,kBAAA;AACY,8BAAA,KAAK,MAAM,cAAc;AAAA,uBAChC,OAAO;AACd,qBAAK,OAAO;AAAA,kBACV,iCAAiC,cAAc;AAAA,gBACjD;AACA;AAAA,cAAA;AAGF,0BAAY,kBAAkB,QAAQ;AACtC,uBAAS,KAAK;AAAA,gBACZ,GAAG;AAAA,gBACH,qBAAqB,QAAQ;AAAA,gBAC7B,iBAAiB,QAAQ;AAAA,gBACzB,SAAS,IAAI,KAAK,OAAO,QAAQ,mBAAmB,IAAI,GAAI;AAAA,cAAA,CAC7D;AAAA,qBACM,OAAY;AACnB,mBAAK,OAAO,MAAM,6BAA6B,MAAM,OAAO,EAAE;AAAA,YAAA;AAAA,UAChE;AAAA,QACF;AAGQ,kBAAA,KAAK,OAAO,OAAO,GAAG,KAAK,OAAO,GAAG,KAAK,MAAM,IAAI,KAAK;AAAA,eAC5D,OAAY;AACnB,aAAK,OAAO,MAAM,kCAAkC,MAAM,OAAO,EAAE;AACnE,cAAM,IAAI,MAAM,mCAAmC,MAAM,OAAO,EAAE;AAAA,MAAA;AAAA,IACpE;AAGK,WAAA;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAST,MAAM,eAAe,WAA6C;AAC5D,QAAA;AACF,YAAM,iBAAiB,GAAG,KAAK,OAAO,oBAAoB,SAAS;AACnE,YAAM,WAAW,MAAM,MAAM,IAAI,cAAc;AAC3C,UAAA,CAAC,SAAS,MAAM;AAClB,cAAM,IAAI;AAAA,UACR,sDAAsD,SAAS;AAAA,QACjE;AAAA,MAAA;AAEF,aAAO,SAAS;AAAA,aACT,OAAY;AACnB,WAAK,OAAO,MAAM,4BAA4B,MAAM,OAAO,EAAE;AAC7D,YAAM,IAAI,MAAM,4BAA4B,MAAM,OAAO,EAAE;AAAA,IAAA;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASF,MAAM,mBACJ,UACA,eACkB;AACd,QAAA;AACF,YAAM,MAAM,MAAM,IAAI,OAAO,QAAQ;AAC9B,aAAA,KAAK,kBAAkB,KAAK,aAAa;AAAA,aACzC,OAAO;AACd,WAAK,OAAO;AAAA,QACV,gCACE,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CACvD;AAAA,MACF;AACO,aAAA;AAAA,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASF,MAAc,kBACZ,KACA,eACkB;AAClB,QAAI,IAAI,SAAS;AACf,aAAO,KAAK,kBAAkB,IAAI,SAAS,aAAa;AAAA,IAAA;AAG1D,QAAI,IAAI,SAAS;AACf,aAAO,KAAK,gBAAgB,IAAI,SAAS,aAAa;AAAA,IAAA;AAGxD,QAAI,IAAI,gBAAgB,IAAI,aAAa,MAAM;AAC7C,aAAO,KAAK,gBAAgB,IAAI,aAAa,MAAM,aAAa;AAAA,IAAA;AAG3D,WAAA;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAST,MAAc,gBACZ,SACA,eACkB;AACZ,UAAA,OAAO,QAAQ,QAAQ,CAAC;AAE9B,eAAW,WAAW,MAAM;AAC1B,UAAI,CAAC,QAAS;AAEd,UAAI,QAAQ,SAAS;AACnB,YAAI,KAAK,kBAAkB,QAAQ,SAAS,aAAa,GAAG;AACnD,iBAAA;AAAA,QAAA;AAAA,MAEA,WAAA,QAAQ,WAAW,QAAQ,cAAc;AAC9C,YAAA;AACI,gBAAA,iBAAiB,MAAM,IAAI,OAAO;AAAA,YACtC,GAAI,QAAQ,UAAU,EAAE,SAAS,QAAQ,QAAA,IAAY,CAAC;AAAA,YACtD,GAAI,QAAQ,eACR,EAAE,cAAc,QAAQ,aAAA,IACxB,CAAA;AAAA,UACL,CAAA,EAAE,OAAO;AAEJ,gBAAA,kBAAkB,MAAM,KAAK;AAAA,YACjC,OAAO,KAAK,cAAc;AAAA,YAC1B;AAAA,UACF;AAEA,cAAI,iBAAiB;AACZ,mBAAA;AAAA,UAAA;AAAA,iBAEF,KAAK;AACZ,eAAK,OAAO;AAAA,YACV,wBACE,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CACjD;AAAA,UACF;AAAA,QAAA;AAAA,MACF;AAAA,IACF;AAGK,WAAA;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASD,kBACN,SACA,eACS;AACL,QAAA;AACF,YAAM,aAAa,UAAU,UAAU,OAAO,KAAK,OAAO,CAAC;AAC3D,aAAO,WAAW,eAAe,cAAc,SAAS;AAAA,aACjD,KAAK;AACL,aAAA;AAAA,IAAA;AAAA,EACT;AAEJ;"}
1
+ {"version":3,"file":"standards-sdk.es18.js","sources":["../../src/services/mirror-node.ts"],"sourcesContent":["import { PublicKey, Timestamp } from '@hashgraph/sdk';\nimport axios from 'axios';\nimport { Logger } from '../utils/logger';\nimport { HCSMessage } from '../hcs-10/base-client';\nimport { proto } from '@hashgraph/proto';\nimport {\n AccountResponse,\n CustomFees,\n HBARPrice,\n TokenInfoResponse,\n TopicMessagesResponse,\n TopicResponse,\n} from './types';\nimport { NetworkType } from '../utils/types';\nexport class HederaMirrorNode {\n private network: NetworkType;\n private baseUrl: string;\n private logger: Logger;\n private isServerEnvironment: boolean;\n\n constructor(network: NetworkType, logger: Logger) {\n this.network = network;\n this.baseUrl = this.getMirrorNodeUrl();\n this.logger = logger;\n this.isServerEnvironment = typeof window === 'undefined';\n }\n\n private getMirrorNodeUrl(): string {\n return this.network === 'mainnet'\n ? 'https://mainnet-public.mirrornode.hedera.com'\n : 'https://testnet.mirrornode.hedera.com';\n }\n\n getBaseUrl(): string {\n return this.baseUrl;\n }\n\n /**\n * Retrieves the public key for a given account ID from the mirror node.\n * @param accountId The ID of the account to retrieve the public key for.\n * @returns A promise that resolves to the public key for the given account.\n * @throws An error if the account ID is invalid or the public key cannot be retrieved.\n */\n async getPublicKey(accountId: string): Promise<PublicKey> {\n this.logger.info(`Getting public key for account ${accountId}`);\n\n const accountInfo = await this.requestAccount(accountId);\n\n try {\n if (!accountInfo || !accountInfo.key) {\n throw new Error(\n `Failed to retrieve public key for account ID: ${accountId}`\n );\n }\n\n return PublicKey.fromString(accountInfo.key.key);\n } catch (e: any) {\n const error = e as Error;\n const logMessage = `Error fetching public key from Mirror Node: ${error.message}`;\n this.logger.error(logMessage);\n throw new Error(logMessage);\n }\n }\n\n /**\n * Retrieves the memo for a given account ID from the mirror node.\n * @param accountId The ID of the account to retrieve the memo for.\n * @returns A promise that resolves to the memo for the given account.\n * @throws An error if the account ID is invalid or the memo cannot be retrieved.\n */\n async getAccountMemo(accountId: string): Promise<string | null> {\n const maxRetries = 3;\n\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n try {\n const accountInfoUrl = `${this.baseUrl}/api/v1/accounts/${accountId}`;\n\n const response = await axios.get(accountInfoUrl);\n const accountInfo = response.data;\n\n if (accountInfo && accountInfo.memo) {\n return accountInfo.memo;\n }\n\n this.logger.error(`No memo found for account ${accountId}`);\n\n if (attempt < maxRetries - 1) {\n await new Promise((resolve) => setTimeout(resolve, 2000));\n }\n } catch (e: any) {\n const error = e as Error;\n const logMessage = `Error getting account memo (attempt ${attempt + 1}): ${error.message}`;\n this.logger.error(logMessage);\n\n if (attempt < maxRetries - 1) {\n await new Promise((resolve) => setTimeout(resolve, 2000));\n }\n }\n }\n\n return null;\n }\n\n /**\n * Retrieves topic information for a given topic ID from the mirror node.\n * @param topicId The ID of the topic to retrieve information for.\n * @returns A promise that resolves to the topic information.\n * @throws An error if the topic ID is invalid or the information cannot be retrieved.\n */\n async getTopicInfo(topicId: string): Promise<TopicResponse> {\n try {\n const topicInfoUrl = `${this.baseUrl}/api/v1/topics/${topicId}`;\n const response = await axios.get(topicInfoUrl);\n return response.data;\n } catch (e: any) {\n const error = e as Error;\n const logMessage = `Error retrieving topic information: ${error.message}`;\n this.logger.error(logMessage);\n throw new Error(logMessage);\n }\n }\n\n /**\n * Retrieves custom fees for a given topic ID from the mirror node.\n * @param topicId The ID of the topic to retrieve custom fees for.\n * @returns A promise that resolves to the custom fees for the given topic.\n * @throws An error if the topic ID is invalid or the custom fees cannot be retrieved.\n */\n async getTopicFees(topicId: string): Promise<CustomFees | null> {\n try {\n const topicInfo = await this.getTopicInfo(topicId);\n return topicInfo.custom_fees;\n } catch (e: any) {\n const error = e as Error;\n const logMessage = `Error retrieving topic fees: ${error.message}`;\n this.logger.error(logMessage);\n return null;\n }\n }\n\n /**\n * Retrieves the current HBAR price from the mirror node.\n * @param date The date to retrieve the HBAR price for.\n * @returns A promise that resolves to the HBAR price for the given date.\n * @throws An error if the date is invalid or the price cannot be retrieved.\n */\n async getHBARPrice(date: Date): Promise<number | null> {\n try {\n const timestamp = Timestamp.fromDate(date).toString();\n\n const request = await fetch(\n `https://mainnet-public.mirrornode.hedera.com/api/v1/network/exchangerate?timestamp=${timestamp}`\n );\n const response = (await request.json()) as HBARPrice;\n\n const usdPrice =\n Number(response?.current_rate?.cent_equivalent) /\n Number(response?.current_rate?.hbar_equivalent) /\n 100;\n\n return usdPrice;\n } catch (e: any) {\n const error = e as Error;\n const logMessage = `Error retrieving HBAR price: ${error.message}`;\n this.logger.error(logMessage);\n return null;\n }\n }\n\n /**\n * Retrieves token information for a given token ID from the mirror node.\n * @param tokenId The ID of the token to retrieve information for.\n * @returns A promise that resolves to the token information.\n * @throws An error if the token ID is invalid or the information cannot be retrieved.\n */\n async getTokenInfo(tokenId: string): Promise<TokenInfoResponse | null> {\n this.logger.debug(`Fetching token info for ${tokenId}`);\n try {\n const tokenInfoUrl = `${this.baseUrl}/api/v1/tokens/${tokenId}`;\n const response = await axios.get<TokenInfoResponse>(tokenInfoUrl);\n if (response.data) {\n this.logger.trace(`Token info found for ${tokenId}:`, response.data);\n return response.data;\n }\n this.logger.warn(`No token info found for ${tokenId}`);\n return null;\n } catch (e: any) {\n const error = e as Error;\n const logMessage = `Error fetching token info for ${tokenId}: ${error.message}`;\n this.logger.error(logMessage);\n\n return null;\n }\n }\n\n /**\n * Retrieves messages for a given topic ID from the mirror node.\n * @param topicId The ID of the topic to retrieve messages for.\n * @returns A promise that resolves to the messages for the given topic.\n * @throws An error if the topic ID is invalid or the messages cannot be retrieved.\n */\n async getTopicMessages(topicId: string): Promise<HCSMessage[]> {\n this.logger.trace(`Querying messages for topic ${topicId}`);\n\n let nextUrl = `${this.baseUrl}/api/v1/topics/${topicId}/messages`;\n const messages: HCSMessage[] = [];\n\n while (nextUrl) {\n try {\n const response = await axios.get<TopicMessagesResponse>(nextUrl);\n const data = response.data;\n\n if (data.messages && data.messages.length > 0) {\n for (const message of data.messages) {\n try {\n if (!message.message) {\n continue;\n }\n\n let messageContent: string;\n try {\n if (this.isServerEnvironment) {\n messageContent = Buffer.from(\n message.message,\n 'base64'\n ).toString('utf-8');\n } else {\n messageContent = new TextDecoder().decode(\n Uint8Array.from(atob(message.message), (c) =>\n c.charCodeAt(0)\n )\n );\n }\n } catch (error) {\n const logMessage = `Error decoding message: ${error}`;\n this.logger.error(logMessage);\n continue;\n }\n\n let messageJson;\n try {\n messageJson = JSON.parse(messageContent);\n } catch (error) {\n const logMessage = `Invalid JSON message content: ${messageContent}`;\n this.logger.error(logMessage);\n return;\n }\n\n messageJson.sequence_number = message.sequence_number;\n messages.push({\n ...messageJson,\n consensus_timestamp: message.consensus_timestamp,\n sequence_number: message.sequence_number,\n created: new Date(Number(message.consensus_timestamp) * 1000),\n });\n } catch (error: any) {\n const logMessage = `Error processing message: ${error.message}`;\n this.logger.error(logMessage);\n }\n }\n }\n\n nextUrl = data.links?.next ? `${this.baseUrl}${data.links.next}` : '';\n } catch (e: any) {\n const error = e as Error;\n const logMessage = `Error querying topic messages: ${error.message} on ${topicId}`;\n this.logger.error(logMessage);\n throw new Error(logMessage);\n }\n }\n\n return messages;\n }\n\n /**\n * Requests account information for a given account ID from the mirror node.\n * @param accountId The ID of the account to retrieve information for.\n * @returns A promise that resolves to the account information.\n * @throws An error if the account ID is invalid or the information cannot be retrieved.\n */\n async requestAccount(accountId: string): Promise<AccountResponse> {\n try {\n const accountInfoUrl = `${this.baseUrl}/api/v1/accounts/${accountId}`;\n const response = await axios.get(accountInfoUrl);\n if (!response.data) {\n throw new Error(\n `Failed to make request to mirror node for account: ${accountId}`\n );\n }\n return response.data;\n } catch (e: any) {\n const error = e as Error;\n const logMessage = `Failed to fetch account: ${error.message}`;\n this.logger.error(logMessage);\n throw new Error(logMessage);\n }\n }\n\n /**\n * Checks if a user has access to a given key list.\n * @param keyBytes The key list to check access for.\n * @param userPublicKey The public key of the user to check access for.\n * @returns A promise that resolves to true if the user has access, false otherwise.\n */\n async checkKeyListAccess(\n keyBytes: Buffer,\n userPublicKey: PublicKey\n ): Promise<boolean> {\n try {\n const key = proto.Key.decode(keyBytes);\n return this.evaluateKeyAccess(key, userPublicKey);\n } catch (e: any) {\n const error = e as Error;\n const logMessage = `Error decoding protobuf key: ${error.message}`;\n this.logger.error(logMessage);\n throw new Error(logMessage);\n }\n }\n\n /**\n * Evaluates the access of a given key to a user's public key.\n * @param key The key to evaluate access for.\n * @param userPublicKey The public key of the user to evaluate access for.\n * @returns A promise that resolves to true if the key has access, false otherwise.\n */\n private async evaluateKeyAccess(\n key: proto.IKey,\n userPublicKey: PublicKey\n ): Promise<boolean> {\n if (key.ed25519) {\n return this.compareEd25519Key(key.ed25519, userPublicKey);\n }\n\n if (key.keyList) {\n return this.evaluateKeyList(key.keyList, userPublicKey);\n }\n\n if (key.thresholdKey && key.thresholdKey.keys) {\n return this.evaluateKeyList(key.thresholdKey.keys, userPublicKey);\n }\n\n return false;\n }\n\n /**\n * Evaluates the access of a given key list to a user's public key.\n * @param keyList The key list to evaluate access for.\n * @param userPublicKey The public key of the user to evaluate access for.\n * @returns A promise that resolves to true if the key list has access, false otherwise.\n */\n private async evaluateKeyList(\n keyList: proto.IKeyList,\n userPublicKey: PublicKey\n ): Promise<boolean> {\n const keys = keyList.keys || [];\n\n for (const listKey of keys) {\n if (!listKey) continue;\n\n if (listKey.ed25519) {\n if (this.compareEd25519Key(listKey.ed25519, userPublicKey)) {\n return true;\n }\n } else if (listKey.keyList || listKey.thresholdKey) {\n try {\n const nestedKeyBytes = proto.Key.encode({\n ...(listKey.keyList ? { keyList: listKey.keyList } : {}),\n ...(listKey.thresholdKey\n ? { thresholdKey: listKey.thresholdKey }\n : {}),\n }).finish();\n\n const hasNestedAccess = await this.checkKeyListAccess(\n Buffer.from(nestedKeyBytes),\n userPublicKey\n );\n\n if (hasNestedAccess) {\n return true;\n }\n } catch (e: any) {\n const error = e as Error;\n const logMessage = `Error in nested key: ${error.message}`;\n this.logger.debug(logMessage);\n }\n }\n }\n\n return false;\n }\n\n /**\n * Compares an Ed25519 key with a user's public key.\n * @param keyData The Ed25519 key data to compare.\n * @param userPublicKey The public key of the user to compare with.\n * @returns A boolean indicating whether the key matches the user's public key.\n */\n private compareEd25519Key(\n keyData: Uint8Array,\n userPublicKey: PublicKey\n ): boolean {\n try {\n const decodedKey = PublicKey.fromBytes(Buffer.from(keyData));\n return decodedKey.toString() === userPublicKey.toString();\n } catch (e: any) {\n const error = e as Error;\n const logMessage = `Error comparing Ed25519 key: ${error.message}`;\n this.logger.debug(logMessage);\n return false;\n }\n }\n}\n"],"names":[],"mappings":"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"}