@hashgraphonline/standards-sdk 0.1.141-canary.14 → 0.1.141-canary.16

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 (105) hide show
  1. package/README.md +10 -0
  2. package/dist/cjs/hcs-16/base-client.d.ts.map +1 -1
  3. package/dist/cjs/hcs-17/types.d.ts.map +1 -1
  4. package/dist/cjs/hcs-21/types.d.ts +30 -0
  5. package/dist/cjs/hcs-21/types.d.ts.map +1 -1
  6. package/dist/cjs/inscribe/inscriber.d.ts.map +1 -1
  7. package/dist/cjs/inscribe/quote-cache.d.ts.map +1 -1
  8. package/dist/cjs/inscribe/types.d.ts +2 -0
  9. package/dist/cjs/inscribe/types.d.ts.map +1 -1
  10. package/dist/cjs/services/registry-broker/client.d.ts.map +1 -1
  11. package/dist/cjs/services/registry-broker/private-key-signer.d.ts.map +1 -1
  12. package/dist/cjs/services/registry-broker/schemas.d.ts +16 -16
  13. package/dist/cjs/standards-sdk.cjs +2 -2
  14. package/dist/cjs/standards-sdk.cjs.map +1 -1
  15. package/dist/cjs/utils/dynamic-import.d.ts +1 -0
  16. package/dist/cjs/utils/dynamic-import.d.ts.map +1 -1
  17. package/dist/es/hcs-16/base-client.d.ts.map +1 -1
  18. package/dist/es/hcs-17/types.d.ts.map +1 -1
  19. package/dist/es/hcs-21/types.d.ts +30 -0
  20. package/dist/es/hcs-21/types.d.ts.map +1 -1
  21. package/dist/es/inscribe/inscriber.d.ts.map +1 -1
  22. package/dist/es/inscribe/quote-cache.d.ts.map +1 -1
  23. package/dist/es/inscribe/types.d.ts +2 -0
  24. package/dist/es/inscribe/types.d.ts.map +1 -1
  25. package/dist/es/services/registry-broker/client.d.ts.map +1 -1
  26. package/dist/es/services/registry-broker/private-key-signer.d.ts.map +1 -1
  27. package/dist/es/services/registry-broker/schemas.d.ts +16 -16
  28. package/dist/es/standards-sdk.es100.js +1 -1
  29. package/dist/es/standards-sdk.es102.js +1 -1
  30. package/dist/es/standards-sdk.es104.js +1 -1
  31. package/dist/es/standards-sdk.es110.js +1 -2
  32. package/dist/es/standards-sdk.es110.js.map +1 -1
  33. package/dist/es/standards-sdk.es12.js +1 -1
  34. package/dist/es/standards-sdk.es125.js +68 -123
  35. package/dist/es/standards-sdk.es125.js.map +1 -1
  36. package/dist/es/standards-sdk.es126.js +2 -2
  37. package/dist/es/standards-sdk.es126.js.map +1 -1
  38. package/dist/es/standards-sdk.es128.js +7 -22
  39. package/dist/es/standards-sdk.es128.js.map +1 -1
  40. package/dist/es/standards-sdk.es129.js +6 -11
  41. package/dist/es/standards-sdk.es129.js.map +1 -1
  42. package/dist/es/standards-sdk.es13.js +1 -1
  43. package/dist/es/standards-sdk.es135.js +82 -28
  44. package/dist/es/standards-sdk.es135.js.map +1 -1
  45. package/dist/es/standards-sdk.es136.js +28 -138
  46. package/dist/es/standards-sdk.es136.js.map +1 -1
  47. package/dist/es/standards-sdk.es137.js +766 -42
  48. package/dist/es/standards-sdk.es137.js.map +1 -1
  49. package/dist/es/standards-sdk.es138.js +12254 -746
  50. package/dist/es/standards-sdk.es138.js.map +1 -1
  51. package/dist/es/standards-sdk.es139.js +105 -12241
  52. package/dist/es/standards-sdk.es139.js.map +1 -1
  53. package/dist/es/standards-sdk.es140.js +36 -50
  54. package/dist/es/standards-sdk.es140.js.map +1 -1
  55. package/dist/es/standards-sdk.es141.js +49 -57
  56. package/dist/es/standards-sdk.es141.js.map +1 -1
  57. package/dist/es/standards-sdk.es17.js +1 -2
  58. package/dist/es/standards-sdk.es17.js.map +1 -1
  59. package/dist/es/standards-sdk.es19.js +4 -5
  60. package/dist/es/standards-sdk.es19.js.map +1 -1
  61. package/dist/es/standards-sdk.es2.js +26 -72
  62. package/dist/es/standards-sdk.es2.js.map +1 -1
  63. package/dist/es/standards-sdk.es20.js +2 -3
  64. package/dist/es/standards-sdk.es20.js.map +1 -1
  65. package/dist/es/standards-sdk.es23.js +1 -1
  66. package/dist/es/standards-sdk.es28.js +4 -5
  67. package/dist/es/standards-sdk.es28.js.map +1 -1
  68. package/dist/es/standards-sdk.es31.js +1 -1
  69. package/dist/es/standards-sdk.es32.js +1 -1
  70. package/dist/es/standards-sdk.es36.js +2 -3
  71. package/dist/es/standards-sdk.es36.js.map +1 -1
  72. package/dist/es/standards-sdk.es37.js +3 -3
  73. package/dist/es/standards-sdk.es38.js +1 -1
  74. package/dist/es/standards-sdk.es5.js +1 -1
  75. package/dist/es/standards-sdk.es54.js +1 -1
  76. package/dist/es/standards-sdk.es57.js +1 -1
  77. package/dist/es/standards-sdk.es59.js +1 -1
  78. package/dist/es/standards-sdk.es60.js +1 -1
  79. package/dist/es/standards-sdk.es61.js +2 -3
  80. package/dist/es/standards-sdk.es61.js.map +1 -1
  81. package/dist/es/standards-sdk.es63.js +1 -1
  82. package/dist/es/standards-sdk.es66.js +1 -1
  83. package/dist/es/standards-sdk.es69.js +2 -2
  84. package/dist/es/standards-sdk.es70.js +1 -1
  85. package/dist/es/standards-sdk.es72.js +1 -1
  86. package/dist/es/standards-sdk.es77.js +1 -1
  87. package/dist/es/standards-sdk.es78.js +1 -2
  88. package/dist/es/standards-sdk.es78.js.map +1 -1
  89. package/dist/es/standards-sdk.es79.js +1 -1
  90. package/dist/es/standards-sdk.es8.js +1 -1
  91. package/dist/es/standards-sdk.es80.js +4 -1
  92. package/dist/es/standards-sdk.es80.js.map +1 -1
  93. package/dist/es/standards-sdk.es82.js +1 -1
  94. package/dist/es/standards-sdk.es84.js +1 -1
  95. package/dist/es/standards-sdk.es88.js +1 -1
  96. package/dist/es/standards-sdk.es92.js +1 -1
  97. package/dist/es/standards-sdk.es93.js +1 -1
  98. package/dist/es/standards-sdk.es95.js +7 -2
  99. package/dist/es/standards-sdk.es95.js.map +1 -1
  100. package/dist/es/standards-sdk.es96.js +3 -0
  101. package/dist/es/standards-sdk.es96.js.map +1 -1
  102. package/dist/es/standards-sdk.es98.js +1 -1
  103. package/dist/es/utils/dynamic-import.d.ts +1 -0
  104. package/dist/es/utils/dynamic-import.d.ts.map +1 -1
  105. package/package.json +1 -1
@@ -1,10 +1,9 @@
1
- import { InscriptionSDK, ValidationError } from "./standards-sdk.es139.js";
1
+ import { InscriptionSDK } from "./standards-sdk.es138.js";
2
2
  import { Logger } from "./standards-sdk.es106.js";
3
3
  import { ProgressReporter } from "./standards-sdk.es109.js";
4
4
  import { TransactionParser } from "./standards-sdk.es111.js";
5
5
  import { isBrowser } from "./standards-sdk.es119.js";
6
6
  import { fileTypeFromBuffer } from "file-type";
7
- import { sleep } from "./standards-sdk.es116.js";
8
7
  import { validateQuoteParameters, getCachedQuote, getOrCreateSDK, cacheQuote } from "./standards-sdk.es126.js";
9
8
  let nodeModules = {};
10
9
  async function loadNodeModules() {
@@ -103,10 +102,10 @@ async function inscribe(input, clientConfig, options, existingSDK) {
103
102
  if (options.mode === "hashinal" && options.metadata) {
104
103
  validateHashinalMetadata(options.metadata, logger);
105
104
  }
106
- const connectionMode = options.connectionMode ?? (options.websocket === false ? "http" : "auto");
107
- const intervalMs = options.waitIntervalMs ?? 4e3;
108
- const waitForCompletion = !options.waitForConfirmation;
109
105
  let sdk;
106
+ const connectionMode = options.connectionMode || "auto";
107
+ const baseUrl = options.baseUrl;
108
+ const wsBaseUrl = options.wsBaseUrl;
110
109
  if (existingSDK) {
111
110
  logger.debug("Using existing InscriptionSDK instance");
112
111
  sdk = existingSDK;
@@ -115,7 +114,9 @@ async function inscribe(input, clientConfig, options, existingSDK) {
115
114
  sdk = new InscriptionSDK({
116
115
  apiKey: options.apiKey,
117
116
  network: clientConfig.network || "mainnet",
118
- connectionMode
117
+ connectionMode,
118
+ ...baseUrl ? { baseUrl } : {},
119
+ ...wsBaseUrl ? { wsBaseUrl } : {}
119
120
  });
120
121
  } else {
121
122
  logger.debug("Initializing InscriptionSDK with server auth");
@@ -125,7 +126,9 @@ async function inscribe(input, clientConfig, options, existingSDK) {
125
126
  accountId: normalized.accountId,
126
127
  privateKey: normalized.privateKey,
127
128
  network: normalized.network || "mainnet",
128
- connectionMode
129
+ connectionMode,
130
+ ...baseUrl ? { baseUrl } : {},
131
+ ...wsBaseUrl ? { wsBaseUrl } : {}
129
132
  });
130
133
  }
131
134
  const baseRequest = {
@@ -188,73 +191,27 @@ async function inscribe(input, clientConfig, options, existingSDK) {
188
191
  holderId: clientConfig.accountId
189
192
  });
190
193
  const normalizedCfg = normalizeClientConfig(clientConfig);
191
- const result = await sdk.inscribeAndExecute(
192
- request,
193
- normalizedCfg,
194
- void 0,
195
- {
196
- waitForCompletion,
197
- maxWaitTime: 18e4,
198
- checkInterval: intervalMs
199
- }
200
- );
201
- const baseTransactionId = result.jobId || result.transactionId;
202
- logger.info("Inscription service response", {
203
- jobId: result.jobId,
204
- transactionId: result.transactionId,
205
- holderId: clientConfig.accountId,
206
- network: clientConfig.network
207
- });
208
- let transactionId = baseTransactionId;
194
+ const result = await sdk.inscribeAndExecute(request, normalizedCfg);
209
195
  logger.info("Starting to inscribe.", {
210
196
  type: input.type,
211
197
  mode: options.mode || "file",
212
- transactionId
198
+ transactionId: result.jobId
213
199
  });
214
200
  if (options.waitForConfirmation) {
215
- const trackingIds = [result.jobId, transactionId].filter(
216
- (id) => typeof id === "string" && id.length > 0
201
+ logger.debug("Waiting for inscription confirmation", {
202
+ transactionId: result.jobId,
203
+ maxAttempts: options.waitMaxAttempts,
204
+ intervalMs: options.waitIntervalMs
205
+ });
206
+ const inscription = await waitForInscriptionConfirmation(
207
+ sdk,
208
+ result.jobId,
209
+ options.waitMaxAttempts,
210
+ options.waitIntervalMs,
211
+ options.progressCallback
217
212
  );
218
- if (!trackingIds.length) {
219
- throw new ValidationError("Transaction ID is required for confirmation");
220
- }
221
- let inscription;
222
- let lastError;
223
- for (const trackingId of trackingIds) {
224
- logger.debug("Waiting for inscription confirmation", {
225
- transactionId: trackingId,
226
- maxAttempts: options.waitMaxAttempts,
227
- intervalMs
228
- });
229
- try {
230
- inscription = await waitForInscriptionConfirmation(
231
- sdk,
232
- trackingId,
233
- options.waitMaxAttempts,
234
- intervalMs,
235
- options.progressCallback
236
- );
237
- transactionId = trackingId;
238
- break;
239
- } catch (error) {
240
- lastError = error;
241
- const status = error.response?.status;
242
- logger.warn("Inscription confirmation attempt failed", {
243
- trackingId,
244
- status,
245
- error
246
- });
247
- const notFound = typeof status === "number" && status === 404;
248
- if (!notFound) {
249
- throw error;
250
- }
251
- }
252
- }
253
- if (!inscription) {
254
- throw lastError instanceof Error ? lastError : new Error("Failed to confirm inscription");
255
- }
256
213
  logger.info("Inscription confirmation received", {
257
- transactionId
214
+ transactionId: result.jobId
258
215
  });
259
216
  return {
260
217
  confirmed: true,
@@ -301,7 +258,6 @@ async function inscribeWithSigner(input, signer, options, existingSDK) {
301
258
  }
302
259
  const accountId = signer.getAccountId().toString();
303
260
  logger.debug("Using account ID from signer", { accountId });
304
- const connectionMode = options.connectionMode ?? (options.websocket === false ? "http" : "auto");
305
261
  let sdk;
306
262
  if (existingSDK) {
307
263
  logger.debug("Using existing InscriptionSDK instance");
@@ -311,18 +267,16 @@ async function inscribeWithSigner(input, signer, options, existingSDK) {
311
267
  sdk = new InscriptionSDK({
312
268
  apiKey: options.apiKey,
313
269
  network: options.network || "mainnet",
314
- connectionMode
270
+ connectionMode: "websocket"
315
271
  });
316
272
  } else {
317
- logger.debug(
318
- "Initializing InscriptionSDK with client auth (wallet signer)"
319
- );
273
+ logger.debug("Initializing InscriptionSDK with client auth (websocket)");
320
274
  sdk = await InscriptionSDK.createWithAuth({
321
275
  type: "client",
322
276
  accountId,
323
277
  signer,
324
278
  network: options.network || "mainnet",
325
- connectionMode
279
+ connectionMode: "websocket"
326
280
  });
327
281
  }
328
282
  const baseRequest = {
@@ -752,58 +706,49 @@ async function waitForInscriptionConfirmation(sdk, transactionId, maxAttempts =
752
706
  maxAttempts,
753
707
  intervalMs
754
708
  });
755
- for (let attempt = 1; attempt <= maxAttempts; attempt++) {
756
- progressReporter.verifying("Checking inscription status", void 0, {
757
- attempt,
758
- maxAttempts
759
- });
760
- try {
761
- const result = await sdk.retrieveInscription(transactionId);
762
- if (result.status === "completed" || result.completed) {
763
- progressReporter.completed("Inscription confirmed", { transactionId });
764
- return result;
765
- }
766
- progressReporter.verifying("Inscription still processing", void 0, {
767
- transactionId,
768
- status: result.status
769
- });
770
- } catch (error) {
771
- const notFound = typeof error.response?.status === "number" && error.response?.status === 404;
772
- if (!notFound) {
773
- logger.error("Error waiting for inscription confirmation", {
774
- transactionId,
775
- attempt,
776
- error
777
- });
778
- progressReporter.failed("Inscription confirmation failed", {
779
- transactionId,
780
- error
781
- });
782
- throw error;
783
- }
784
- logger.debug("Inscription not found yet, retrying", {
785
- transactionId,
786
- attempt
709
+ try {
710
+ const waitMethod = sdk.waitForInscription.bind(sdk);
711
+ const wrappedCallback = (data) => {
712
+ const stageRaw = data.stage || "confirming";
713
+ const allowedStages = [
714
+ "preparing",
715
+ "submitting",
716
+ "confirming",
717
+ "verifying",
718
+ "completed",
719
+ "failed"
720
+ ];
721
+ const stage = allowedStages.includes(stageRaw) ? stageRaw : "confirming";
722
+ const message = data.message || "Processing inscription";
723
+ const percent = data.progressPercent || 50;
724
+ progressReporter.report({
725
+ stage,
726
+ message,
727
+ progressPercent: percent,
728
+ details: data.details
787
729
  });
788
- }
789
- if (attempt < maxAttempts) {
790
- await sleep(intervalMs);
791
- }
730
+ };
731
+ return await waitMethod(
732
+ transactionId,
733
+ maxAttempts,
734
+ intervalMs,
735
+ true,
736
+ wrappedCallback
737
+ );
738
+ } catch (e) {
739
+ logger.debug("Falling back to standard waitForInscription method", {
740
+ error: e
741
+ });
742
+ progressReporter.verifying("Verifying inscription status", 50, {
743
+ error: e
744
+ });
745
+ return await sdk.waitForInscription(
746
+ transactionId,
747
+ maxAttempts,
748
+ intervalMs,
749
+ true
750
+ );
792
751
  }
793
- const timeoutError = new Error(
794
- `Inscription confirmation timed out after ${maxAttempts} attempts`
795
- );
796
- logger.error("Error waiting for inscription confirmation", {
797
- transactionId,
798
- maxAttempts,
799
- intervalMs,
800
- error: timeoutError
801
- });
802
- progressReporter.failed("Inscription confirmation failed", {
803
- transactionId,
804
- error: timeoutError
805
- });
806
- throw timeoutError;
807
752
  } catch (error) {
808
753
  logger.error("Error waiting for inscription confirmation", {
809
754
  transactionId,
@@ -1 +1 @@
1
- {"version":3,"file":"standards-sdk.es125.js","sources":["../../src/inscribe/inscriber.ts"],"sourcesContent":["import { InscriptionSDK, ValidationError } from '@kiloscribe/inscription-sdk';\nimport {\n InscriptionOptions,\n InscriptionResult,\n RetrievedInscriptionResult,\n HederaClientConfig,\n QuoteResult,\n StartInscriptionRequest,\n InscriptionJobResponse,\n NodeHederaClientConfig,\n} from './types';\nimport type { DAppSigner } from '@hashgraph/hedera-wallet-connect';\nimport { Logger, ILogger } from '../utils/logger';\nimport { ProgressCallback, ProgressReporter } from '../utils/progress-reporter';\nimport { TransactionParser } from '../utils/transaction-parser';\nimport { isBrowser } from '../utils/is-browser';\nimport { fileTypeFromBuffer } from 'file-type';\nimport { sleep } from '../utils/sleep';\nimport {\n getOrCreateSDK,\n getCachedQuote,\n cacheQuote,\n validateQuoteParameters,\n} from './quote-cache';\n\nlet nodeModules: {\n readFileSync?: (path: string) => Buffer;\n basename?: (path: string) => string;\n extname?: (path: string) => string;\n} = {};\n\nasync function loadNodeModules(): Promise<void> {\n if (isBrowser || nodeModules.readFileSync) {\n return;\n }\n\n try {\n const globalObj = typeof global !== 'undefined' ? global : globalThis;\n const req = globalObj.process?.mainModule?.require || globalObj.require;\n\n if (typeof req === 'function') {\n const fs = req('fs');\n const path = req('path');\n\n nodeModules.readFileSync = fs.readFileSync;\n nodeModules.basename = path.basename;\n nodeModules.extname = path.extname;\n } else {\n throw new Error('require function not available');\n }\n } catch (error) {\n console.warn(\n 'Node.js modules not available, file path operations will be disabled',\n );\n }\n}\n\nexport type InscriptionInput =\n | { type: 'url'; url: string }\n | { type: 'file'; path: string }\n | {\n type: 'buffer';\n buffer: ArrayBuffer | Buffer;\n fileName: string;\n mimeType?: string;\n };\n\n/**\n * Convert file path to base64 with mime type detection\n * Note: This function only works in Node.js environment\n */\nasync function convertFileToBase64(filePath: string): Promise<{\n base64: string;\n fileName: string;\n mimeType: string;\n}> {\n if (isBrowser) {\n throw new Error(\n 'File path operations are not supported in browser environment. Use buffer input type instead.',\n );\n }\n\n await loadNodeModules();\n\n if (\n !nodeModules.readFileSync ||\n !nodeModules.basename ||\n !nodeModules.extname\n ) {\n throw new Error(\n 'Node.js file system modules are not available. Cannot read file from path.',\n );\n }\n\n try {\n const buffer = nodeModules.readFileSync(filePath);\n const base64 = buffer.toString('base64');\n const fileName = nodeModules.basename(filePath);\n\n let mimeType = 'application/octet-stream';\n try {\n const fileTypeResult = await fileTypeFromBuffer(buffer);\n if (fileTypeResult) {\n mimeType = fileTypeResult.mime;\n }\n } catch (error) {\n const ext = nodeModules.extname(filePath).toLowerCase();\n const mimeMap: Record<string, string> = {\n '.txt': 'text/plain',\n '.json': 'application/json',\n '.html': 'text/html',\n '.css': 'text/css',\n '.js': 'application/javascript',\n '.png': 'image/png',\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.gif': 'image/gif',\n '.svg': 'image/svg+xml',\n '.pdf': 'application/pdf',\n };\n mimeType = mimeMap[ext] || 'application/octet-stream';\n }\n\n return { base64, fileName, mimeType };\n } catch (error) {\n throw new Error(\n `Failed to read file ${filePath}: ${(error as Error).message}`,\n );\n }\n}\n\nexport interface InscriptionResponse {\n confirmed: boolean;\n result: InscriptionResult | QuoteResult;\n inscription?: RetrievedInscriptionResult;\n sdk?: InscriptionSDK;\n quote?: boolean;\n}\n\nfunction normalizeClientConfig(\n cfg: NodeHederaClientConfig,\n): HederaClientConfig {\n return {\n accountId: cfg.accountId,\n privateKey:\n typeof cfg.privateKey === 'string'\n ? cfg.privateKey\n : cfg.privateKey.toString(),\n network: cfg.network,\n };\n}\n\nexport async function inscribe(\n input: InscriptionInput,\n clientConfig: NodeHederaClientConfig,\n options: InscriptionOptions,\n existingSDK?: InscriptionSDK,\n): Promise<InscriptionResponse> {\n const logger = Logger.getInstance({\n module: 'Inscriber',\n ...options.logging,\n });\n\n logger.info('Starting inscription process', {\n type: input.type,\n mode: options.mode || 'file',\n quoteOnly: options.quoteOnly || false,\n ...(input.type === 'url' ? { url: input.url } : {}),\n ...(input.type === 'file' ? { path: input.path } : {}),\n ...(input.type === 'buffer'\n ? { fileName: input.fileName, bufferSize: input.buffer.byteLength }\n : {}),\n });\n\n try {\n if (options.quoteOnly) {\n logger.debug('Quote-only mode requested, generating quote');\n return await generateQuote(input, clientConfig, options, existingSDK);\n }\n\n if (options.mode === 'hashinal' && options.metadata) {\n validateHashinalMetadata(options.metadata, logger);\n }\n\n const connectionMode =\n options.connectionMode ??\n (options.websocket === false ? 'http' : 'auto');\n const intervalMs = options.waitIntervalMs ?? 4000;\n const waitForCompletion = !options.waitForConfirmation;\n\n let sdk: InscriptionSDK;\n\n if (existingSDK) {\n logger.debug('Using existing InscriptionSDK instance');\n sdk = existingSDK;\n } else if (options.apiKey) {\n logger.debug('Initializing InscriptionSDK with API key');\n sdk = new InscriptionSDK({\n apiKey: options.apiKey,\n network: clientConfig.network || 'mainnet',\n connectionMode,\n });\n } else {\n logger.debug('Initializing InscriptionSDK with server auth');\n const normalized = normalizeClientConfig(clientConfig);\n sdk = await InscriptionSDK.createWithAuth({\n type: 'server',\n accountId: normalized.accountId,\n privateKey: normalized.privateKey,\n network: normalized.network || 'mainnet',\n connectionMode,\n });\n }\n\n const baseRequest = {\n holderId: clientConfig.accountId,\n metadata: options.metadata || {},\n tags: options.tags || [],\n mode: options.mode || 'file',\n fileStandard: options.fileStandard,\n chunkSize: options.chunkSize,\n };\n\n let request: StartInscriptionRequest;\n switch (input.type) {\n case 'url':\n request = {\n ...baseRequest,\n file: {\n type: 'url',\n url: input.url,\n },\n };\n break;\n\n case 'file': {\n const fileData = await convertFileToBase64(input.path);\n request = {\n ...baseRequest,\n file: {\n type: 'base64',\n base64: fileData.base64,\n fileName: fileData.fileName,\n mimeType: fileData.mimeType,\n },\n };\n break;\n }\n\n case 'buffer':\n request = {\n ...baseRequest,\n file: {\n type: 'base64',\n base64: Buffer.from(\n input.buffer instanceof ArrayBuffer\n ? new Uint8Array(input.buffer)\n : input.buffer,\n ).toString('base64'),\n fileName: input.fileName,\n mimeType: input.mimeType,\n },\n };\n break;\n }\n\n if (options.mode === 'hashinal') {\n request.metadataObject = options.metadata;\n request.creator = options.metadata?.creator || clientConfig.accountId;\n request.description = options.metadata?.description;\n\n if (options.jsonFileURL) {\n request.jsonFileURL = options.jsonFileURL;\n }\n }\n\n logger.debug('Preparing to inscribe content', {\n type: input.type,\n mode: options.mode || 'file',\n holderId: clientConfig.accountId,\n });\n\n const normalizedCfg = normalizeClientConfig(clientConfig);\n const result = await sdk.inscribeAndExecute(\n request,\n normalizedCfg,\n undefined,\n {\n waitForCompletion,\n maxWaitTime: 180000,\n checkInterval: intervalMs,\n },\n );\n const baseTransactionId = result.jobId || result.transactionId;\n logger.info('Inscription service response', {\n jobId: result.jobId,\n transactionId: result.transactionId,\n holderId: clientConfig.accountId,\n network: clientConfig.network,\n });\n let transactionId = baseTransactionId;\n logger.info('Starting to inscribe.', {\n type: input.type,\n mode: options.mode || 'file',\n transactionId,\n });\n\n if (options.waitForConfirmation) {\n const trackingIds = [result.jobId, transactionId].filter(\n (id): id is string => typeof id === 'string' && id.length > 0,\n );\n\n if (!trackingIds.length) {\n throw new ValidationError('Transaction ID is required for confirmation');\n }\n\n let inscription: RetrievedInscriptionResult | undefined;\n let lastError: unknown;\n\n for (const trackingId of trackingIds) {\n logger.debug('Waiting for inscription confirmation', {\n transactionId: trackingId,\n maxAttempts: options.waitMaxAttempts,\n intervalMs,\n });\n\n try {\n inscription = await waitForInscriptionConfirmation(\n sdk,\n trackingId,\n options.waitMaxAttempts,\n intervalMs,\n options.progressCallback,\n );\n transactionId = trackingId;\n break;\n } catch (error) {\n lastError = error;\n const status =\n (error as { response?: { status?: number } }).response?.status;\n\n logger.warn('Inscription confirmation attempt failed', {\n trackingId,\n status,\n error,\n });\n\n const notFound = typeof status === 'number' && status === 404;\n if (!notFound) {\n throw error;\n }\n }\n }\n\n if (!inscription) {\n throw lastError instanceof Error\n ? lastError\n : new Error('Failed to confirm inscription');\n }\n\n logger.info('Inscription confirmation received', {\n transactionId,\n });\n\n return {\n confirmed: true,\n result,\n inscription,\n sdk,\n };\n }\n\n return {\n confirmed: false,\n result,\n sdk,\n };\n } catch (error) {\n logger.error('Error during inscription process', error);\n throw error;\n }\n}\n\nexport async function inscribeWithSigner(\n input: InscriptionInput,\n signer: DAppSigner,\n options: InscriptionOptions,\n existingSDK?: InscriptionSDK,\n): Promise<InscriptionResponse> {\n const logger = Logger.getInstance({\n module: 'Inscriber',\n ...options.logging,\n });\n\n logger.info('Starting inscription process with signer', {\n type: input.type,\n mode: options.mode || 'file',\n quoteOnly: options.quoteOnly || false,\n ...(input.type === 'url' ? { url: input.url } : {}),\n ...(input.type === 'file' ? { path: input.path } : {}),\n ...(input.type === 'buffer'\n ? { fileName: input.fileName, bufferSize: input.buffer.byteLength }\n : {}),\n });\n try {\n if (options.quoteOnly) {\n logger.debug('Quote-only mode requested with signer, generating quote');\n const clientConfig = {\n accountId: signer.getAccountId().toString(),\n privateKey: '',\n network: options.network || 'mainnet',\n };\n return await generateQuote(input, clientConfig, options, existingSDK);\n }\n\n if (options.mode === 'hashinal' && options.metadata) {\n validateHashinalMetadata(options.metadata, logger);\n }\n\n const accountId = signer.getAccountId().toString();\n logger.debug('Using account ID from signer', { accountId });\n\n const connectionMode =\n options.connectionMode ??\n (options.websocket === false ? 'http' : 'auto');\n\n let sdk: InscriptionSDK;\n\n if (existingSDK) {\n logger.debug('Using existing InscriptionSDK instance');\n sdk = existingSDK;\n } else if (options.apiKey) {\n logger.debug('Initializing InscriptionSDK with API key');\n sdk = new InscriptionSDK({\n apiKey: options.apiKey,\n network: (options.network || 'mainnet') as 'mainnet' | 'testnet',\n connectionMode,\n });\n } else {\n logger.debug(\n 'Initializing InscriptionSDK with client auth (wallet signer)',\n );\n sdk = await InscriptionSDK.createWithAuth({\n type: 'client',\n accountId,\n signer: signer,\n network: (options.network || 'mainnet') as 'mainnet' | 'testnet',\n connectionMode,\n });\n }\n\n const baseRequest = {\n holderId: accountId,\n metadata: options.metadata || {},\n tags: options.tags || [],\n mode: options.mode || 'file',\n fileStandard: options.fileStandard,\n chunkSize: options.chunkSize,\n };\n\n let request: StartInscriptionRequest;\n switch (input.type) {\n case 'url':\n request = {\n ...baseRequest,\n file: {\n type: 'url',\n url: input.url,\n },\n };\n break;\n\n case 'file': {\n const fileData = await convertFileToBase64(input.path);\n request = {\n ...baseRequest,\n file: {\n type: 'base64',\n base64: fileData.base64,\n fileName: fileData.fileName,\n mimeType: fileData.mimeType,\n },\n };\n break;\n }\n\n case 'buffer':\n request = {\n ...baseRequest,\n file: {\n type: 'base64',\n base64: Buffer.from(\n input.buffer instanceof ArrayBuffer\n ? new Uint8Array(input.buffer)\n : input.buffer,\n ).toString('base64'),\n fileName: input.fileName,\n mimeType: input.mimeType,\n },\n };\n break;\n }\n\n if (options.mode === 'hashinal') {\n request.metadataObject = options.metadata;\n request.creator = options.metadata?.creator || accountId;\n request.description = options.metadata?.description;\n\n if (options.jsonFileURL) {\n request.jsonFileURL = options.jsonFileURL;\n }\n }\n\n logger.debug('Starting inscription via startInscription (websocket)', {\n type: input.type,\n mode: options.mode || 'file',\n holderId: accountId,\n usesStartInscription: true,\n });\n\n const startResult = (await sdk.startInscription({\n ...request,\n holderId: accountId,\n network: (options.network || 'mainnet') as 'mainnet' | 'testnet',\n })) as InscriptionJobResponse;\n\n logger.info('about to start inscription', {\n type: input.type,\n mode: options.mode || 'file',\n jobId: startResult.id || startResult.tx_id,\n ...startResult,\n });\n\n if (typeof startResult?.transactionBytes === 'string') {\n logger.debug('Executing inscription transaction with signer from bytes');\n await sdk.executeTransactionWithSigner(\n startResult.transactionBytes,\n signer,\n );\n } else if (startResult?.transactionBytes?.type === 'Buffer') {\n logger.debug('Executing inscription transaction with signer from buffer');\n await sdk.executeTransactionWithSigner(\n Buffer.from(startResult.transactionBytes.data).toString('base64'),\n signer,\n );\n }\n\n if (options.waitForConfirmation) {\n logger.debug('Waiting for inscription confirmation (websocket)', {\n jobId: startResult.id || startResult.tx_id,\n maxAttempts: options.waitMaxAttempts,\n intervalMs: options.waitIntervalMs,\n });\n\n const trackingId = startResult.tx_id || startResult.id;\n const inscription = await waitForInscriptionConfirmation(\n sdk,\n trackingId,\n options.waitMaxAttempts,\n options.waitIntervalMs,\n options.progressCallback,\n );\n\n logger.info('Inscription confirmation received', {\n jobId: trackingId,\n });\n\n return {\n confirmed: true,\n result: {\n jobId: startResult.id || startResult.tx_id,\n transactionId: startResult.tx_id || '',\n topic_id: startResult.topic_id,\n status: startResult.status,\n completed: startResult.completed,\n },\n inscription,\n sdk,\n };\n }\n\n return {\n confirmed: false,\n result: {\n jobId: startResult.id || startResult.tx_id,\n transactionId: startResult.tx_id || '',\n topic_id: startResult.topic_id,\n status: startResult.status,\n completed: startResult.completed,\n },\n sdk,\n };\n } catch (error) {\n logger.error('Error during inscription process', error);\n throw error;\n }\n}\n\nexport async function retrieveInscription(\n transactionId: string,\n options: InscriptionOptions & { accountId?: string; privateKey?: string },\n): Promise<RetrievedInscriptionResult> {\n const logger = Logger.getInstance({\n module: 'Inscriber',\n ...(options?.logging || {}),\n });\n\n const formattedTransactionId = transactionId.includes('@')\n ? `${transactionId.split('@')[0]}-${transactionId\n .split('@')[1]\n .replace(/\\./g, '-')}`\n : transactionId;\n\n logger.info('Retrieving inscription', {\n originalTransactionId: transactionId,\n formattedTransactionId,\n });\n\n try {\n let sdk: InscriptionSDK;\n\n if (options?.apiKey) {\n logger.debug('Initializing InscriptionSDK with API key');\n sdk = new InscriptionSDK({\n apiKey: options.apiKey,\n network: options.network || 'mainnet',\n });\n } else if (options?.accountId && options?.privateKey) {\n logger.debug('Initializing InscriptionSDK with server auth');\n sdk = await InscriptionSDK.createWithAuth({\n type: 'server',\n accountId: options.accountId,\n privateKey: options.privateKey,\n network: options.network || 'mainnet',\n });\n } else {\n const error = new Error(\n 'Either API key or account ID and private key are required for retrieving inscriptions',\n );\n logger.error('Missing authentication credentials', {\n hasApiKey: Boolean(options?.apiKey),\n hasAccountId: Boolean(options?.accountId),\n hasPrivateKey: Boolean(options?.privateKey),\n });\n throw error;\n }\n\n logger.debug('Initialized SDK for inscription retrieval', {\n formattedTransactionId,\n network: options.network || 'mainnet',\n });\n\n const result = await sdk.retrieveInscription(formattedTransactionId);\n logger.info('Successfully retrieved inscription', {\n formattedTransactionId,\n });\n\n return result;\n } catch (error) {\n logger.error('Error retrieving inscription', {\n formattedTransactionId,\n error,\n });\n throw error;\n }\n}\n\nexport type { InscriptionOptions } from './types';\n\nfunction validateHashinalMetadata(\n metadata: Record<string, unknown>,\n logger: ILogger,\n): void {\n const requiredFields = ['name', 'creator', 'description', 'type'];\n const missingFields = requiredFields.filter(field => !metadata[field]);\n\n if (missingFields.length > 0) {\n const error = new Error(\n `Missing required Hashinal metadata fields: ${missingFields.join(', ')}`,\n );\n logger.error('Hashinal metadata validation failed', { missingFields });\n throw error;\n }\n\n logger.debug('Hashinal metadata validation passed', {\n name: metadata.name,\n creator: metadata.creator,\n description: metadata.description,\n type: metadata.type,\n hasAttributes: !!metadata.attributes,\n hasProperties: !!metadata.properties,\n });\n}\n\n/**\n * Generate a quote for an inscription without executing it\n * @param input - The inscription input data\n * @param clientConfig - Hedera client configuration\n * @param options - Inscription options\n * @param existingSDK - Optional existing SDK instance\n * @returns Promise containing the quote result\n */\nexport async function generateQuote(\n input: InscriptionInput,\n clientConfig: NodeHederaClientConfig,\n options: InscriptionOptions,\n existingSDK?: InscriptionSDK,\n): Promise<InscriptionResponse> {\n const logger = Logger.getInstance({\n module: 'Inscriber',\n ...options.logging,\n });\n\n logger.info('Generating inscription quote', {\n type: input.type,\n mode: options.mode || 'file',\n ...(input.type === 'url' ? { url: input.url } : {}),\n ...(input.type === 'file' ? { path: input.path } : {}),\n ...(input.type === 'buffer'\n ? { fileName: input.fileName, bufferSize: input.buffer.byteLength }\n : {}),\n });\n\n try {\n validateQuoteParameters(input, clientConfig, options);\n\n const cachedQuote = getCachedQuote(input, clientConfig, options);\n\n if (cachedQuote) {\n logger.debug('Returning cached quote');\n return {\n confirmed: false,\n quote: true,\n result: cachedQuote,\n };\n }\n\n if (options.mode === 'hashinal' && options.metadata) {\n validateHashinalMetadata(options.metadata, logger);\n }\n\n const sdk = await getOrCreateSDK(clientConfig, options, existingSDK);\n\n const baseRequest = {\n holderId: clientConfig.accountId,\n metadata: options.metadata || {},\n tags: options.tags || [],\n mode: options.mode || 'file',\n fileStandard: options.fileStandard,\n chunkSize: options.chunkSize,\n };\n\n let request: StartInscriptionRequest;\n switch (input.type) {\n case 'url':\n request = {\n ...baseRequest,\n file: {\n type: 'url',\n url: input.url,\n },\n };\n break;\n\n case 'file': {\n const fileData = await convertFileToBase64(input.path);\n request = {\n ...baseRequest,\n file: {\n type: 'base64',\n base64: fileData.base64,\n fileName: fileData.fileName,\n mimeType: fileData.mimeType,\n },\n };\n break;\n }\n\n case 'buffer':\n request = {\n ...baseRequest,\n file: {\n type: 'base64',\n base64: Buffer.from(\n input.buffer instanceof ArrayBuffer\n ? new Uint8Array(input.buffer)\n : input.buffer,\n ).toString('base64'),\n fileName: input.fileName,\n mimeType: input.mimeType,\n },\n };\n break;\n }\n\n if (options.mode === 'hashinal') {\n request.metadataObject = options.metadata;\n request.creator = options.metadata?.creator || clientConfig.accountId;\n request.description = options.metadata?.description;\n\n if (options.jsonFileURL) {\n request.jsonFileURL = options.jsonFileURL;\n }\n }\n\n logger.debug('Calling inscription SDK startInscription for quote', {\n type: input.type,\n mode: options.mode || 'file',\n holderId: clientConfig.accountId,\n });\n\n const inscriptionResponse = await sdk.startInscription(request);\n\n logger.debug('Received inscription response for quote parsing', {\n hasTransactionBytes: !!inscriptionResponse.transactionBytes,\n bytesLength: inscriptionResponse.transactionBytes?.length || 0,\n transactionBytesType: typeof inscriptionResponse.transactionBytes,\n totalCost: (inscriptionResponse as InscriptionJobResponse).totalCost,\n });\n\n const quote = await parseTransactionForQuote(\n inscriptionResponse as InscriptionJobResponse,\n logger,\n );\n\n cacheQuote(input, clientConfig, options, quote);\n\n logger.info('Successfully generated inscription quote', {\n totalCostHbar: quote.totalCostHbar,\n });\n\n return {\n confirmed: false,\n quote: true,\n result: quote,\n };\n } catch (error) {\n logger.error('Error generating inscription quote', error);\n throw error;\n }\n}\n\n/**\n * Parse inscription response to extract HBAR cost information\n * @param inscriptionResponse - Response from inscription SDK\n * @param logger - Logger instance for debugging\n * @returns Promise containing the quote result\n */\nasync function parseTransactionForQuote(\n inscriptionResponse: InscriptionJobResponse,\n logger: ILogger,\n): Promise<QuoteResult> {\n try {\n let totalCostHbar = '0.001';\n\n if (\n inscriptionResponse.totalCost &&\n typeof inscriptionResponse.totalCost === 'number'\n ) {\n const hbarAmount = inscriptionResponse.totalCost / 100000000;\n totalCostHbar = hbarAmount.toString();\n\n logger.debug('Using totalCost from inscription response', {\n totalCostTinybars: inscriptionResponse.totalCost,\n totalCostHbar: totalCostHbar,\n });\n } else if (inscriptionResponse.transactionBytes) {\n logger.debug('Parsing transaction bytes for cost information');\n\n try {\n let transactionBytesString: string;\n\n if (typeof inscriptionResponse.transactionBytes === 'string') {\n transactionBytesString = inscriptionResponse.transactionBytes;\n } else if (\n inscriptionResponse.transactionBytes &&\n typeof inscriptionResponse.transactionBytes === 'object' &&\n 'data' in inscriptionResponse.transactionBytes\n ) {\n const buffer = Buffer.from(inscriptionResponse.transactionBytes.data);\n transactionBytesString = buffer.toString('base64');\n } else {\n throw new Error('Invalid transactionBytes format');\n }\n\n logger.debug('About to parse transaction bytes', {\n bytesLength: transactionBytesString.length,\n bytesPreview: transactionBytesString.slice(0, 100),\n });\n\n const parsedTransaction = await TransactionParser.parseTransactionBytes(\n transactionBytesString,\n { includeRaw: false },\n );\n\n logger.debug('Parsed transaction for quote', {\n type: parsedTransaction.type,\n hasTransfers: !!parsedTransaction.transfers,\n transferCount: parsedTransaction.transfers?.length || 0,\n transfers: parsedTransaction.transfers,\n });\n\n let totalTransferAmount = 0;\n\n if (\n parsedTransaction.transfers &&\n parsedTransaction.transfers.length > 0\n ) {\n for (const transfer of parsedTransaction.transfers) {\n const transferAmount =\n typeof transfer.amount === 'string'\n ? parseFloat(transfer.amount)\n : transfer.amount;\n\n if (transferAmount < 0) {\n const amountHbar = Math.abs(transferAmount);\n totalTransferAmount += amountHbar;\n\n logger.debug('Found HBAR transfer', {\n from: transfer.accountId,\n to: 'service',\n amount: amountHbar,\n });\n }\n }\n }\n\n if (totalTransferAmount > 0) {\n totalCostHbar = totalTransferAmount.toString();\n logger.debug('Using parsed transaction transfer amount', {\n totalTransferAmount,\n totalCostHbar,\n });\n }\n } catch (parseError) {\n logger.warn(\n 'Could not parse transaction bytes, using totalCost fallback',\n {\n error: parseError,\n errorMessage:\n parseError instanceof Error\n ? parseError.message\n : String(parseError),\n },\n );\n }\n }\n\n const transfers = [\n {\n to: 'Inscription Service',\n amount: totalCostHbar,\n description: `Inscription fee (${totalCostHbar} HBAR)`,\n },\n ];\n\n const validUntil = new Date(Date.now() + 15 * 60 * 1000).toISOString();\n\n const quote: QuoteResult = {\n totalCostHbar,\n validUntil,\n breakdown: {\n transfers,\n },\n };\n\n logger.debug('Successfully parsed transaction for quote', {\n totalCostHbar: quote.totalCostHbar,\n transferCount: transfers.length,\n hasTransactionBytes: !!inscriptionResponse.transactionBytes,\n hasTotalCost: !!inscriptionResponse.totalCost,\n });\n\n return quote;\n } catch (error) {\n logger.error('Error parsing transaction for quote', error);\n throw error;\n }\n}\n\nexport async function waitForInscriptionConfirmation(\n sdk: InscriptionSDK,\n transactionId: string,\n maxAttempts: number = 30,\n intervalMs: number = 4000,\n progressCallback?: ProgressCallback,\n): Promise<RetrievedInscriptionResult> {\n const logger = Logger.getInstance({ module: 'Inscriber' });\n const progressReporter = new ProgressReporter({\n module: 'Inscriber',\n logger,\n callback: progressCallback,\n });\n\n try {\n logger.debug('Waiting for inscription confirmation', {\n transactionId,\n maxAttempts,\n intervalMs,\n });\n\n progressReporter.preparing('Preparing for inscription confirmation', 5, {\n transactionId,\n maxAttempts,\n intervalMs,\n });\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n progressReporter.verifying('Checking inscription status', undefined, {\n attempt,\n maxAttempts,\n });\n\n try {\n const result = await sdk.retrieveInscription(transactionId);\n if (result.status === 'completed' || result.completed) {\n progressReporter.completed('Inscription confirmed', { transactionId });\n return result;\n }\n\n progressReporter.verifying('Inscription still processing', undefined, {\n transactionId,\n status: result.status,\n });\n } catch (error) {\n const notFound =\n typeof (error as { response?: { status?: number } }).response\n ?.status === 'number' &&\n (error as { response?: { status?: number } }).response?.status ===\n 404;\n\n if (!notFound) {\n logger.error('Error waiting for inscription confirmation', {\n transactionId,\n attempt,\n error,\n });\n progressReporter.failed('Inscription confirmation failed', {\n transactionId,\n error,\n });\n throw error;\n }\n\n logger.debug('Inscription not found yet, retrying', {\n transactionId,\n attempt,\n });\n }\n\n if (attempt < maxAttempts) {\n await sleep(intervalMs);\n }\n }\n\n const timeoutError = new Error(\n `Inscription confirmation timed out after ${maxAttempts} attempts`,\n );\n logger.error('Error waiting for inscription confirmation', {\n transactionId,\n maxAttempts,\n intervalMs,\n error: timeoutError,\n });\n progressReporter.failed('Inscription confirmation failed', {\n transactionId,\n error: timeoutError,\n });\n throw timeoutError;\n } catch (error) {\n logger.error('Error waiting for inscription confirmation', {\n transactionId,\n maxAttempts,\n intervalMs,\n error,\n });\n\n progressReporter.failed('Inscription confirmation failed', {\n transactionId,\n error,\n });\n\n throw error;\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"standards-sdk.es125.js","sources":["../../src/inscribe/inscriber.ts"],"sourcesContent":["import { InscriptionSDK } from '@kiloscribe/inscription-sdk';\nimport {\n InscriptionOptions,\n InscriptionResult,\n RetrievedInscriptionResult,\n HederaClientConfig,\n QuoteResult,\n StartInscriptionRequest,\n InscriptionJobResponse,\n NodeHederaClientConfig,\n} from './types';\nimport type { DAppSigner } from '@hashgraph/hedera-wallet-connect';\nimport { Logger, ILogger } from '../utils/logger';\nimport { ProgressCallback, ProgressReporter } from '../utils/progress-reporter';\nimport { TransactionParser } from '../utils/transaction-parser';\nimport { isBrowser } from '../utils/is-browser';\nimport { fileTypeFromBuffer } from 'file-type';\nimport {\n getOrCreateSDK,\n getCachedQuote,\n cacheQuote,\n validateQuoteParameters,\n} from './quote-cache';\n\nlet nodeModules: {\n readFileSync?: (path: string) => Buffer;\n basename?: (path: string) => string;\n extname?: (path: string) => string;\n} = {};\n\nasync function loadNodeModules(): Promise<void> {\n if (isBrowser || nodeModules.readFileSync) {\n return;\n }\n\n try {\n const globalObj = typeof global !== 'undefined' ? global : globalThis;\n const req = globalObj.process?.mainModule?.require || globalObj.require;\n\n if (typeof req === 'function') {\n const fs = req('fs');\n const path = req('path');\n\n nodeModules.readFileSync = fs.readFileSync;\n nodeModules.basename = path.basename;\n nodeModules.extname = path.extname;\n } else {\n throw new Error('require function not available');\n }\n } catch (error) {\n console.warn(\n 'Node.js modules not available, file path operations will be disabled',\n );\n }\n}\n\nexport type InscriptionInput =\n | { type: 'url'; url: string }\n | { type: 'file'; path: string }\n | {\n type: 'buffer';\n buffer: ArrayBuffer | Buffer;\n fileName: string;\n mimeType?: string;\n };\n\n/**\n * Convert file path to base64 with mime type detection\n * Note: This function only works in Node.js environment\n */\nasync function convertFileToBase64(filePath: string): Promise<{\n base64: string;\n fileName: string;\n mimeType: string;\n}> {\n if (isBrowser) {\n throw new Error(\n 'File path operations are not supported in browser environment. Use buffer input type instead.',\n );\n }\n\n await loadNodeModules();\n\n if (\n !nodeModules.readFileSync ||\n !nodeModules.basename ||\n !nodeModules.extname\n ) {\n throw new Error(\n 'Node.js file system modules are not available. Cannot read file from path.',\n );\n }\n\n try {\n const buffer = nodeModules.readFileSync(filePath);\n const base64 = buffer.toString('base64');\n const fileName = nodeModules.basename(filePath);\n\n let mimeType = 'application/octet-stream';\n try {\n const fileTypeResult = await fileTypeFromBuffer(buffer);\n if (fileTypeResult) {\n mimeType = fileTypeResult.mime;\n }\n } catch (error) {\n const ext = nodeModules.extname(filePath).toLowerCase();\n const mimeMap: Record<string, string> = {\n '.txt': 'text/plain',\n '.json': 'application/json',\n '.html': 'text/html',\n '.css': 'text/css',\n '.js': 'application/javascript',\n '.png': 'image/png',\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.gif': 'image/gif',\n '.svg': 'image/svg+xml',\n '.pdf': 'application/pdf',\n };\n mimeType = mimeMap[ext] || 'application/octet-stream';\n }\n\n return { base64, fileName, mimeType };\n } catch (error) {\n throw new Error(\n `Failed to read file ${filePath}: ${(error as Error).message}`,\n );\n }\n}\n\nexport interface InscriptionResponse {\n confirmed: boolean;\n result: InscriptionResult | QuoteResult;\n inscription?: RetrievedInscriptionResult;\n sdk?: InscriptionSDK;\n quote?: boolean;\n}\n\nfunction normalizeClientConfig(\n cfg: NodeHederaClientConfig,\n): HederaClientConfig {\n return {\n accountId: cfg.accountId,\n privateKey:\n typeof cfg.privateKey === 'string'\n ? cfg.privateKey\n : cfg.privateKey.toString(),\n network: cfg.network,\n };\n}\n\nexport async function inscribe(\n input: InscriptionInput,\n clientConfig: NodeHederaClientConfig,\n options: InscriptionOptions,\n existingSDK?: InscriptionSDK,\n): Promise<InscriptionResponse> {\n const logger = Logger.getInstance({\n module: 'Inscriber',\n ...options.logging,\n });\n\n logger.info('Starting inscription process', {\n type: input.type,\n mode: options.mode || 'file',\n quoteOnly: options.quoteOnly || false,\n ...(input.type === 'url' ? { url: input.url } : {}),\n ...(input.type === 'file' ? { path: input.path } : {}),\n ...(input.type === 'buffer'\n ? { fileName: input.fileName, bufferSize: input.buffer.byteLength }\n : {}),\n });\n\n try {\n if (options.quoteOnly) {\n logger.debug('Quote-only mode requested, generating quote');\n return await generateQuote(input, clientConfig, options, existingSDK);\n }\n\n if (options.mode === 'hashinal' && options.metadata) {\n validateHashinalMetadata(options.metadata, logger);\n }\n\n let sdk: InscriptionSDK;\n\n const connectionMode = options.connectionMode || 'auto';\n const baseUrl = options.baseUrl;\n const wsBaseUrl = options.wsBaseUrl;\n\n if (existingSDK) {\n logger.debug('Using existing InscriptionSDK instance');\n sdk = existingSDK;\n } else if (options.apiKey) {\n logger.debug('Initializing InscriptionSDK with API key');\n sdk = new InscriptionSDK({\n apiKey: options.apiKey,\n network: clientConfig.network || 'mainnet',\n connectionMode,\n ...(baseUrl ? { baseUrl } : {}),\n ...(wsBaseUrl ? { wsBaseUrl } : {}),\n });\n } else {\n logger.debug('Initializing InscriptionSDK with server auth');\n const normalized = normalizeClientConfig(clientConfig);\n sdk = await InscriptionSDK.createWithAuth({\n type: 'server',\n accountId: normalized.accountId,\n privateKey: normalized.privateKey,\n network: normalized.network || 'mainnet',\n connectionMode,\n ...(baseUrl ? { baseUrl } : {}),\n ...(wsBaseUrl ? { wsBaseUrl } : {}),\n });\n }\n\n const baseRequest = {\n holderId: clientConfig.accountId,\n metadata: options.metadata || {},\n tags: options.tags || [],\n mode: options.mode || 'file',\n fileStandard: options.fileStandard,\n chunkSize: options.chunkSize,\n };\n\n let request: StartInscriptionRequest;\n switch (input.type) {\n case 'url':\n request = {\n ...baseRequest,\n file: {\n type: 'url',\n url: input.url,\n },\n };\n break;\n\n case 'file': {\n const fileData = await convertFileToBase64(input.path);\n request = {\n ...baseRequest,\n file: {\n type: 'base64',\n base64: fileData.base64,\n fileName: fileData.fileName,\n mimeType: fileData.mimeType,\n },\n };\n break;\n }\n\n case 'buffer':\n request = {\n ...baseRequest,\n file: {\n type: 'base64',\n base64: Buffer.from(\n input.buffer instanceof ArrayBuffer\n ? new Uint8Array(input.buffer)\n : input.buffer,\n ).toString('base64'),\n fileName: input.fileName,\n mimeType: input.mimeType,\n },\n };\n break;\n }\n\n if (options.mode === 'hashinal') {\n request.metadataObject = options.metadata;\n request.creator = options.metadata?.creator || clientConfig.accountId;\n request.description = options.metadata?.description;\n\n if (options.jsonFileURL) {\n request.jsonFileURL = options.jsonFileURL;\n }\n }\n\n logger.debug('Preparing to inscribe content', {\n type: input.type,\n mode: options.mode || 'file',\n holderId: clientConfig.accountId,\n });\n\n const normalizedCfg = normalizeClientConfig(clientConfig);\n const result = await sdk.inscribeAndExecute(request, normalizedCfg);\n logger.info('Starting to inscribe.', {\n type: input.type,\n mode: options.mode || 'file',\n transactionId: result.jobId,\n });\n\n if (options.waitForConfirmation) {\n logger.debug('Waiting for inscription confirmation', {\n transactionId: result.jobId,\n maxAttempts: options.waitMaxAttempts,\n intervalMs: options.waitIntervalMs,\n });\n\n const inscription = await waitForInscriptionConfirmation(\n sdk,\n result.jobId,\n options.waitMaxAttempts,\n options.waitIntervalMs,\n options.progressCallback,\n );\n\n logger.info('Inscription confirmation received', {\n transactionId: result.jobId,\n });\n\n return {\n confirmed: true,\n result,\n inscription,\n sdk,\n };\n }\n\n return {\n confirmed: false,\n result,\n sdk,\n };\n } catch (error) {\n logger.error('Error during inscription process', error);\n throw error;\n }\n}\n\nexport async function inscribeWithSigner(\n input: InscriptionInput,\n signer: DAppSigner,\n options: InscriptionOptions,\n existingSDK?: InscriptionSDK,\n): Promise<InscriptionResponse> {\n const logger = Logger.getInstance({\n module: 'Inscriber',\n ...options.logging,\n });\n\n logger.info('Starting inscription process with signer', {\n type: input.type,\n mode: options.mode || 'file',\n quoteOnly: options.quoteOnly || false,\n ...(input.type === 'url' ? { url: input.url } : {}),\n ...(input.type === 'file' ? { path: input.path } : {}),\n ...(input.type === 'buffer'\n ? { fileName: input.fileName, bufferSize: input.buffer.byteLength }\n : {}),\n });\n try {\n if (options.quoteOnly) {\n logger.debug('Quote-only mode requested with signer, generating quote');\n const clientConfig = {\n accountId: signer.getAccountId().toString(),\n privateKey: '',\n network: options.network || 'mainnet',\n };\n return await generateQuote(input, clientConfig, options, existingSDK);\n }\n\n if (options.mode === 'hashinal' && options.metadata) {\n validateHashinalMetadata(options.metadata, logger);\n }\n\n const accountId = signer.getAccountId().toString();\n logger.debug('Using account ID from signer', { accountId });\n\n let sdk: InscriptionSDK;\n\n if (existingSDK) {\n logger.debug('Using existing InscriptionSDK instance');\n sdk = existingSDK;\n } else if (options.apiKey) {\n logger.debug('Initializing InscriptionSDK with API key');\n sdk = new InscriptionSDK({\n apiKey: options.apiKey,\n network: (options.network || 'mainnet') as 'mainnet' | 'testnet',\n connectionMode: 'websocket',\n });\n } else {\n logger.debug('Initializing InscriptionSDK with client auth (websocket)');\n sdk = await InscriptionSDK.createWithAuth({\n type: 'client',\n accountId,\n signer: signer,\n network: (options.network || 'mainnet') as 'mainnet' | 'testnet',\n connectionMode: 'websocket',\n });\n }\n\n const baseRequest = {\n holderId: accountId,\n metadata: options.metadata || {},\n tags: options.tags || [],\n mode: options.mode || 'file',\n fileStandard: options.fileStandard,\n chunkSize: options.chunkSize,\n };\n\n let request: StartInscriptionRequest;\n switch (input.type) {\n case 'url':\n request = {\n ...baseRequest,\n file: {\n type: 'url',\n url: input.url,\n },\n };\n break;\n\n case 'file': {\n const fileData = await convertFileToBase64(input.path);\n request = {\n ...baseRequest,\n file: {\n type: 'base64',\n base64: fileData.base64,\n fileName: fileData.fileName,\n mimeType: fileData.mimeType,\n },\n };\n break;\n }\n\n case 'buffer':\n request = {\n ...baseRequest,\n file: {\n type: 'base64',\n base64: Buffer.from(\n input.buffer instanceof ArrayBuffer\n ? new Uint8Array(input.buffer)\n : input.buffer,\n ).toString('base64'),\n fileName: input.fileName,\n mimeType: input.mimeType,\n },\n };\n break;\n }\n\n if (options.mode === 'hashinal') {\n request.metadataObject = options.metadata;\n request.creator = options.metadata?.creator || accountId;\n request.description = options.metadata?.description;\n\n if (options.jsonFileURL) {\n request.jsonFileURL = options.jsonFileURL;\n }\n }\n\n logger.debug('Starting inscription via startInscription (websocket)', {\n type: input.type,\n mode: options.mode || 'file',\n holderId: accountId,\n usesStartInscription: true,\n });\n\n const startResult = (await sdk.startInscription({\n ...request,\n holderId: accountId,\n network: (options.network || 'mainnet') as 'mainnet' | 'testnet',\n })) as InscriptionJobResponse;\n\n logger.info('about to start inscription', {\n type: input.type,\n mode: options.mode || 'file',\n jobId: startResult.id || startResult.tx_id,\n ...startResult,\n });\n\n if (typeof startResult?.transactionBytes === 'string') {\n logger.debug('Executing inscription transaction with signer from bytes');\n await sdk.executeTransactionWithSigner(\n startResult.transactionBytes,\n signer,\n );\n } else if (startResult?.transactionBytes?.type === 'Buffer') {\n logger.debug('Executing inscription transaction with signer from buffer');\n await sdk.executeTransactionWithSigner(\n Buffer.from(startResult.transactionBytes.data).toString('base64'),\n signer,\n );\n }\n\n if (options.waitForConfirmation) {\n logger.debug('Waiting for inscription confirmation (websocket)', {\n jobId: startResult.id || startResult.tx_id,\n maxAttempts: options.waitMaxAttempts,\n intervalMs: options.waitIntervalMs,\n });\n\n const trackingId = startResult.tx_id || startResult.id;\n const inscription = await waitForInscriptionConfirmation(\n sdk,\n trackingId,\n options.waitMaxAttempts,\n options.waitIntervalMs,\n options.progressCallback,\n );\n\n logger.info('Inscription confirmation received', {\n jobId: trackingId,\n });\n\n return {\n confirmed: true,\n result: {\n jobId: startResult.id || startResult.tx_id,\n transactionId: startResult.tx_id || '',\n topic_id: startResult.topic_id,\n status: startResult.status,\n completed: startResult.completed,\n },\n inscription,\n sdk,\n };\n }\n\n return {\n confirmed: false,\n result: {\n jobId: startResult.id || startResult.tx_id,\n transactionId: startResult.tx_id || '',\n topic_id: startResult.topic_id,\n status: startResult.status,\n completed: startResult.completed,\n },\n sdk,\n };\n } catch (error) {\n logger.error('Error during inscription process', error);\n throw error;\n }\n}\n\nexport async function retrieveInscription(\n transactionId: string,\n options: InscriptionOptions & { accountId?: string; privateKey?: string },\n): Promise<RetrievedInscriptionResult> {\n const logger = Logger.getInstance({\n module: 'Inscriber',\n ...(options?.logging || {}),\n });\n\n const formattedTransactionId = transactionId.includes('@')\n ? `${transactionId.split('@')[0]}-${transactionId\n .split('@')[1]\n .replace(/\\./g, '-')}`\n : transactionId;\n\n logger.info('Retrieving inscription', {\n originalTransactionId: transactionId,\n formattedTransactionId,\n });\n\n try {\n let sdk: InscriptionSDK;\n\n if (options?.apiKey) {\n logger.debug('Initializing InscriptionSDK with API key');\n sdk = new InscriptionSDK({\n apiKey: options.apiKey,\n network: options.network || 'mainnet',\n });\n } else if (options?.accountId && options?.privateKey) {\n logger.debug('Initializing InscriptionSDK with server auth');\n sdk = await InscriptionSDK.createWithAuth({\n type: 'server',\n accountId: options.accountId,\n privateKey: options.privateKey,\n network: options.network || 'mainnet',\n });\n } else {\n const error = new Error(\n 'Either API key or account ID and private key are required for retrieving inscriptions',\n );\n logger.error('Missing authentication credentials', {\n hasApiKey: Boolean(options?.apiKey),\n hasAccountId: Boolean(options?.accountId),\n hasPrivateKey: Boolean(options?.privateKey),\n });\n throw error;\n }\n\n logger.debug('Initialized SDK for inscription retrieval', {\n formattedTransactionId,\n network: options.network || 'mainnet',\n });\n\n const result = await sdk.retrieveInscription(formattedTransactionId);\n logger.info('Successfully retrieved inscription', {\n formattedTransactionId,\n });\n\n return result;\n } catch (error) {\n logger.error('Error retrieving inscription', {\n formattedTransactionId,\n error,\n });\n throw error;\n }\n}\n\nexport type { InscriptionOptions } from './types';\n\nfunction validateHashinalMetadata(\n metadata: Record<string, unknown>,\n logger: ILogger,\n): void {\n const requiredFields = ['name', 'creator', 'description', 'type'];\n const missingFields = requiredFields.filter(field => !metadata[field]);\n\n if (missingFields.length > 0) {\n const error = new Error(\n `Missing required Hashinal metadata fields: ${missingFields.join(', ')}`,\n );\n logger.error('Hashinal metadata validation failed', { missingFields });\n throw error;\n }\n\n logger.debug('Hashinal metadata validation passed', {\n name: metadata.name,\n creator: metadata.creator,\n description: metadata.description,\n type: metadata.type,\n hasAttributes: !!metadata.attributes,\n hasProperties: !!metadata.properties,\n });\n}\n\n/**\n * Generate a quote for an inscription without executing it\n * @param input - The inscription input data\n * @param clientConfig - Hedera client configuration\n * @param options - Inscription options\n * @param existingSDK - Optional existing SDK instance\n * @returns Promise containing the quote result\n */\nexport async function generateQuote(\n input: InscriptionInput,\n clientConfig: NodeHederaClientConfig,\n options: InscriptionOptions,\n existingSDK?: InscriptionSDK,\n): Promise<InscriptionResponse> {\n const logger = Logger.getInstance({\n module: 'Inscriber',\n ...options.logging,\n });\n\n logger.info('Generating inscription quote', {\n type: input.type,\n mode: options.mode || 'file',\n ...(input.type === 'url' ? { url: input.url } : {}),\n ...(input.type === 'file' ? { path: input.path } : {}),\n ...(input.type === 'buffer'\n ? { fileName: input.fileName, bufferSize: input.buffer.byteLength }\n : {}),\n });\n\n try {\n validateQuoteParameters(input, clientConfig, options);\n\n const cachedQuote = getCachedQuote(input, clientConfig, options);\n\n if (cachedQuote) {\n logger.debug('Returning cached quote');\n return {\n confirmed: false,\n quote: true,\n result: cachedQuote,\n };\n }\n\n if (options.mode === 'hashinal' && options.metadata) {\n validateHashinalMetadata(options.metadata, logger);\n }\n\n const sdk = await getOrCreateSDK(clientConfig, options, existingSDK);\n\n const baseRequest = {\n holderId: clientConfig.accountId,\n metadata: options.metadata || {},\n tags: options.tags || [],\n mode: options.mode || 'file',\n fileStandard: options.fileStandard,\n chunkSize: options.chunkSize,\n };\n\n let request: StartInscriptionRequest;\n switch (input.type) {\n case 'url':\n request = {\n ...baseRequest,\n file: {\n type: 'url',\n url: input.url,\n },\n };\n break;\n\n case 'file': {\n const fileData = await convertFileToBase64(input.path);\n request = {\n ...baseRequest,\n file: {\n type: 'base64',\n base64: fileData.base64,\n fileName: fileData.fileName,\n mimeType: fileData.mimeType,\n },\n };\n break;\n }\n\n case 'buffer':\n request = {\n ...baseRequest,\n file: {\n type: 'base64',\n base64: Buffer.from(\n input.buffer instanceof ArrayBuffer\n ? new Uint8Array(input.buffer)\n : input.buffer,\n ).toString('base64'),\n fileName: input.fileName,\n mimeType: input.mimeType,\n },\n };\n break;\n }\n\n if (options.mode === 'hashinal') {\n request.metadataObject = options.metadata;\n request.creator = options.metadata?.creator || clientConfig.accountId;\n request.description = options.metadata?.description;\n\n if (options.jsonFileURL) {\n request.jsonFileURL = options.jsonFileURL;\n }\n }\n\n logger.debug('Calling inscription SDK startInscription for quote', {\n type: input.type,\n mode: options.mode || 'file',\n holderId: clientConfig.accountId,\n });\n\n const inscriptionResponse = await sdk.startInscription(request);\n\n logger.debug('Received inscription response for quote parsing', {\n hasTransactionBytes: !!inscriptionResponse.transactionBytes,\n bytesLength: inscriptionResponse.transactionBytes?.length || 0,\n transactionBytesType: typeof inscriptionResponse.transactionBytes,\n totalCost: (inscriptionResponse as InscriptionJobResponse).totalCost,\n });\n\n const quote = await parseTransactionForQuote(\n inscriptionResponse as InscriptionJobResponse,\n logger,\n );\n\n cacheQuote(input, clientConfig, options, quote);\n\n logger.info('Successfully generated inscription quote', {\n totalCostHbar: quote.totalCostHbar,\n });\n\n return {\n confirmed: false,\n quote: true,\n result: quote,\n };\n } catch (error) {\n logger.error('Error generating inscription quote', error);\n throw error;\n }\n}\n\n/**\n * Parse inscription response to extract HBAR cost information\n * @param inscriptionResponse - Response from inscription SDK\n * @param logger - Logger instance for debugging\n * @returns Promise containing the quote result\n */\nasync function parseTransactionForQuote(\n inscriptionResponse: InscriptionJobResponse,\n logger: ILogger,\n): Promise<QuoteResult> {\n try {\n let totalCostHbar = '0.001';\n\n if (\n inscriptionResponse.totalCost &&\n typeof inscriptionResponse.totalCost === 'number'\n ) {\n const hbarAmount = inscriptionResponse.totalCost / 100000000;\n totalCostHbar = hbarAmount.toString();\n\n logger.debug('Using totalCost from inscription response', {\n totalCostTinybars: inscriptionResponse.totalCost,\n totalCostHbar: totalCostHbar,\n });\n } else if (inscriptionResponse.transactionBytes) {\n logger.debug('Parsing transaction bytes for cost information');\n\n try {\n let transactionBytesString: string;\n\n if (typeof inscriptionResponse.transactionBytes === 'string') {\n transactionBytesString = inscriptionResponse.transactionBytes;\n } else if (\n inscriptionResponse.transactionBytes &&\n typeof inscriptionResponse.transactionBytes === 'object' &&\n 'data' in inscriptionResponse.transactionBytes\n ) {\n const buffer = Buffer.from(inscriptionResponse.transactionBytes.data);\n transactionBytesString = buffer.toString('base64');\n } else {\n throw new Error('Invalid transactionBytes format');\n }\n\n logger.debug('About to parse transaction bytes', {\n bytesLength: transactionBytesString.length,\n bytesPreview: transactionBytesString.slice(0, 100),\n });\n\n const parsedTransaction = await TransactionParser.parseTransactionBytes(\n transactionBytesString,\n { includeRaw: false },\n );\n\n logger.debug('Parsed transaction for quote', {\n type: parsedTransaction.type,\n hasTransfers: !!parsedTransaction.transfers,\n transferCount: parsedTransaction.transfers?.length || 0,\n transfers: parsedTransaction.transfers,\n });\n\n let totalTransferAmount = 0;\n\n if (\n parsedTransaction.transfers &&\n parsedTransaction.transfers.length > 0\n ) {\n for (const transfer of parsedTransaction.transfers) {\n const transferAmount =\n typeof transfer.amount === 'string'\n ? parseFloat(transfer.amount)\n : transfer.amount;\n\n if (transferAmount < 0) {\n const amountHbar = Math.abs(transferAmount);\n totalTransferAmount += amountHbar;\n\n logger.debug('Found HBAR transfer', {\n from: transfer.accountId,\n to: 'service',\n amount: amountHbar,\n });\n }\n }\n }\n\n if (totalTransferAmount > 0) {\n totalCostHbar = totalTransferAmount.toString();\n logger.debug('Using parsed transaction transfer amount', {\n totalTransferAmount,\n totalCostHbar,\n });\n }\n } catch (parseError) {\n logger.warn(\n 'Could not parse transaction bytes, using totalCost fallback',\n {\n error: parseError,\n errorMessage:\n parseError instanceof Error\n ? parseError.message\n : String(parseError),\n },\n );\n }\n }\n\n const transfers = [\n {\n to: 'Inscription Service',\n amount: totalCostHbar,\n description: `Inscription fee (${totalCostHbar} HBAR)`,\n },\n ];\n\n const validUntil = new Date(Date.now() + 15 * 60 * 1000).toISOString();\n\n const quote: QuoteResult = {\n totalCostHbar,\n validUntil,\n breakdown: {\n transfers,\n },\n };\n\n logger.debug('Successfully parsed transaction for quote', {\n totalCostHbar: quote.totalCostHbar,\n transferCount: transfers.length,\n hasTransactionBytes: !!inscriptionResponse.transactionBytes,\n hasTotalCost: !!inscriptionResponse.totalCost,\n });\n\n return quote;\n } catch (error) {\n logger.error('Error parsing transaction for quote', error);\n throw error;\n }\n}\n\nexport async function waitForInscriptionConfirmation(\n sdk: InscriptionSDK,\n transactionId: string,\n maxAttempts: number = 30,\n intervalMs: number = 4000,\n progressCallback?: ProgressCallback,\n): Promise<RetrievedInscriptionResult> {\n const logger = Logger.getInstance({ module: 'Inscriber' });\n const progressReporter = new ProgressReporter({\n module: 'Inscriber',\n logger,\n callback: progressCallback,\n });\n\n try {\n logger.debug('Waiting for inscription confirmation', {\n transactionId,\n maxAttempts,\n intervalMs,\n });\n\n progressReporter.preparing('Preparing for inscription confirmation', 5, {\n transactionId,\n maxAttempts,\n intervalMs,\n });\n\n try {\n const waitMethod = sdk.waitForInscription.bind(sdk) as (\n txId: string,\n maxAttempts: number,\n intervalMs: number,\n checkCompletion: boolean,\n progressCallback?: (data: {\n stage?: string;\n message?: string;\n progressPercent?: number;\n details?: unknown;\n }) => void,\n ) => Promise<RetrievedInscriptionResult>;\n\n const wrappedCallback = (data: {\n stage?: string;\n message?: string;\n progressPercent?: number;\n details?: unknown;\n }) => {\n const stageRaw = data.stage || 'confirming';\n const allowedStages = [\n 'preparing',\n 'submitting',\n 'confirming',\n 'verifying',\n 'completed',\n 'failed',\n ] as const;\n const stage = (\n allowedStages.includes(stageRaw as (typeof allowedStages)[number])\n ? stageRaw\n : 'confirming'\n ) as (typeof allowedStages)[number];\n\n const message = data.message || 'Processing inscription';\n const percent = data.progressPercent || 50;\n\n progressReporter.report({\n stage,\n message,\n progressPercent: percent,\n details: data.details as Record<string, unknown> | undefined,\n });\n };\n\n return await waitMethod(\n transactionId,\n maxAttempts,\n intervalMs,\n true,\n wrappedCallback,\n );\n } catch (e) {\n logger.debug('Falling back to standard waitForInscription method', {\n error: e,\n });\n progressReporter.verifying('Verifying inscription status', 50, {\n error: e,\n });\n\n return await sdk.waitForInscription(\n transactionId,\n maxAttempts,\n intervalMs,\n true,\n );\n }\n } catch (error) {\n logger.error('Error waiting for inscription confirmation', {\n transactionId,\n maxAttempts,\n intervalMs,\n error,\n });\n\n progressReporter.failed('Inscription confirmation failed', {\n transactionId,\n error,\n });\n\n throw error;\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { InscriptionSDK } from "./standards-sdk.es139.js";
1
+ import { InscriptionSDK } from "./standards-sdk.es138.js";
2
2
  class QuoteCache {
3
3
  constructor() {
4
4
  this.cache = /* @__PURE__ */ new Map();
@@ -137,7 +137,7 @@ async function getOrCreateSDK(clientConfig, options, existingSDK) {
137
137
  if (existingSDK) {
138
138
  return existingSDK;
139
139
  }
140
- const connectionMode = options.connectionMode || (options.websocket === false ? "http" : "auto");
140
+ const connectionMode = options.connectionMode ?? "auto";
141
141
  const cacheConfig = {
142
142
  apiKey: options.apiKey,
143
143
  accountId: clientConfig.accountId,
@@ -1 +1 @@
1
- {"version":3,"file":"standards-sdk.es126.js","sources":["../../src/inscribe/quote-cache.ts"],"sourcesContent":["/**\n * Performance optimization utilities for quote generation\n */\n\nimport { InscriptionSDK } from '@kiloscribe/inscription-sdk';\nimport {\n InscriptionOptions,\n QuoteResult,\n NodeHederaClientConfig,\n} from './types';\n\ninterface CacheKey {\n inputHash: string;\n clientConfigHash: string;\n optionsHash: string;\n}\n\ninterface CacheEntry {\n quote: QuoteResult;\n timestamp: number;\n ttlMs: number;\n}\n\ninterface SDKCacheEntry {\n sdk: InscriptionSDK;\n timestamp: number;\n config: string;\n}\n\n/**\n * LRU Cache for quote results to improve performance\n */\nclass QuoteCache {\n private cache = new Map<string, CacheEntry>();\n private maxSize = 100;\n private defaultTtlMs = 5 * 60 * 1000; // 5 minutes\n\n /**\n * Generate cache key from input parameters\n */\n private generateKey(key: CacheKey): string {\n return `${key.inputHash}-${key.clientConfigHash}-${key.optionsHash}`;\n }\n\n /**\n * Hash object to string for cache key\n */\n private hashObject(obj: unknown): string {\n return Buffer.from(JSON.stringify(obj)).toString('base64').slice(0, 16);\n }\n\n /**\n * Create cache key from parameters\n */\n createCacheKey(\n input: unknown,\n clientConfig: NodeHederaClientConfig,\n options: InscriptionOptions,\n ): CacheKey {\n return {\n inputHash: this.hashObject(input),\n clientConfigHash: this.hashObject({\n accountId: clientConfig.accountId,\n network: clientConfig.network,\n }),\n optionsHash: this.hashObject({\n mode: options.mode,\n apiKey: options.apiKey ? 'present' : 'absent',\n network: options.network,\n metadata: options.metadata,\n }),\n };\n }\n\n /**\n * Get cached quote if available and not expired\n */\n get(key: CacheKey): QuoteResult | null {\n const cacheKey = this.generateKey(key);\n const entry = this.cache.get(cacheKey);\n\n if (!entry) {\n return null;\n }\n\n const now = Date.now();\n if (now - entry.timestamp > entry.ttlMs) {\n this.cache.delete(cacheKey);\n return null;\n }\n\n this.cache.delete(cacheKey);\n this.cache.set(cacheKey, entry);\n\n return entry.quote;\n }\n\n /**\n * Store quote in cache\n */\n set(\n key: CacheKey,\n quote: QuoteResult,\n ttlMs: number = this.defaultTtlMs,\n ): void {\n const cacheKey = this.generateKey(key);\n\n if (this.cache.size >= this.maxSize) {\n const firstKey = this.cache.keys().next().value;\n if (firstKey) {\n this.cache.delete(firstKey);\n }\n }\n\n this.cache.set(cacheKey, {\n quote,\n timestamp: Date.now(),\n ttlMs,\n });\n }\n\n /**\n * Clear all cached entries\n */\n clear(): void {\n this.cache.clear();\n }\n}\n\n/**\n * SDK instance cache for reuse\n */\nclass SDKCache {\n private cache = new Map<string, SDKCacheEntry>();\n private maxSize = 10;\n private defaultTtlMs = 30 * 60 * 1000; // 30 minutes\n\n /**\n * Generate config key for SDK instance\n */\n private generateConfigKey(config: unknown): string {\n return Buffer.from(JSON.stringify(config)).toString('base64');\n }\n\n /**\n * Get cached SDK instance\n */\n get(config: Record<string, unknown>): InscriptionSDK | null {\n const configKey = this.generateConfigKey(config);\n const entry = this.cache.get(configKey);\n\n if (!entry) {\n return null;\n }\n\n const now = Date.now();\n if (now - entry.timestamp > this.defaultTtlMs) {\n this.cache.delete(configKey);\n return null;\n }\n\n return entry.sdk;\n }\n\n /**\n * Store SDK instance in cache\n */\n set(config: Record<string, unknown>, sdk: InscriptionSDK): void {\n const configKey = this.generateConfigKey(config);\n\n if (this.cache.size >= this.maxSize) {\n const firstKey = this.cache.keys().next().value;\n if (firstKey) {\n this.cache.delete(firstKey);\n }\n }\n\n this.cache.set(configKey, {\n sdk,\n timestamp: Date.now(),\n config: configKey,\n });\n }\n\n /**\n * Clear all cached SDK instances\n */\n clear(): void {\n this.cache.clear();\n }\n}\n\nconst quoteCache = new QuoteCache();\nconst sdkCache = new SDKCache();\n\n/**\n * Get or create SDK instance with caching\n */\nexport async function getOrCreateSDK(\n clientConfig: NodeHederaClientConfig,\n options: InscriptionOptions,\n existingSDK?: InscriptionSDK,\n): Promise<InscriptionSDK> {\n if (existingSDK) {\n return existingSDK;\n }\n\n const connectionMode =\n options.connectionMode || (options.websocket === false ? 'http' : 'auto');\n\n const cacheConfig = {\n apiKey: options.apiKey,\n accountId: clientConfig.accountId,\n network: clientConfig.network || 'mainnet',\n authType: options.apiKey ? 'api' : 'server',\n connectionMode,\n };\n\n const cachedSDK = sdkCache.get(cacheConfig);\n if (cachedSDK) {\n return cachedSDK;\n }\n\n let sdk: InscriptionSDK;\n\n if (options.apiKey) {\n sdk = new InscriptionSDK({\n apiKey: options.apiKey,\n network: clientConfig.network || 'mainnet',\n connectionMode,\n });\n } else {\n sdk = await InscriptionSDK.createWithAuth({\n type: 'server',\n accountId: clientConfig.accountId,\n privateKey:\n typeof clientConfig.privateKey === 'string'\n ? clientConfig.privateKey\n : clientConfig.privateKey.toString(),\n network: clientConfig.network || 'mainnet',\n connectionMode,\n });\n }\n\n sdkCache.set(cacheConfig, sdk);\n return sdk;\n}\n\n/**\n * Check if quote is cached and return it if valid\n */\nexport function getCachedQuote(\n input: unknown,\n clientConfig: NodeHederaClientConfig,\n options: InscriptionOptions,\n): QuoteResult | null {\n const cacheKey = quoteCache.createCacheKey(input, clientConfig, options);\n return quoteCache.get(cacheKey);\n}\n\n/**\n * Cache a generated quote\n */\nexport function cacheQuote(\n input: unknown,\n clientConfig: NodeHederaClientConfig,\n options: InscriptionOptions,\n quote: QuoteResult,\n): void {\n const cacheKey = quoteCache.createCacheKey(input, clientConfig, options);\n const quoteTtlMs = 10 * 60 * 1000;\n quoteCache.set(cacheKey, quote, quoteTtlMs);\n}\n\n/**\n * Pre-validate parameters for early error detection\n */\nexport function validateQuoteParameters(\n input: unknown,\n clientConfig: NodeHederaClientConfig,\n options: InscriptionOptions,\n): void {\n if (!input || typeof input !== 'object' || !('type' in input)) {\n throw new Error('Invalid inscription input: type is required');\n }\n\n if (!clientConfig || !clientConfig.accountId) {\n throw new Error('Invalid client config: accountId is required');\n }\n\n if (!options) {\n throw new Error('Options are required');\n }\n\n if (options.mode === 'hashinal') {\n if (!options.metadata) {\n throw new Error('Hashinal mode requires metadata');\n }\n\n const requiredFields = ['name', 'creator', 'description', 'type'];\n const missingFields = requiredFields.filter(\n field => !options.metadata || !options.metadata[field],\n );\n\n if (missingFields.length > 0) {\n throw new Error(\n `Missing required Hashinal metadata fields: ${missingFields.join(', ')}`,\n );\n }\n }\n}\n\n/**\n * Clear all caches (useful for testing or memory management)\n */\nexport function clearAllCaches(): void {\n quoteCache.clear();\n sdkCache.clear();\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"standards-sdk.es126.js","sources":["../../src/inscribe/quote-cache.ts"],"sourcesContent":["/**\n * Performance optimization utilities for quote generation\n */\n\nimport { InscriptionSDK } from '@kiloscribe/inscription-sdk';\nimport {\n InscriptionOptions,\n QuoteResult,\n NodeHederaClientConfig,\n} from './types';\n\ninterface CacheKey {\n inputHash: string;\n clientConfigHash: string;\n optionsHash: string;\n}\n\ninterface CacheEntry {\n quote: QuoteResult;\n timestamp: number;\n ttlMs: number;\n}\n\ninterface SDKCacheEntry {\n sdk: InscriptionSDK;\n timestamp: number;\n config: string;\n}\n\n/**\n * LRU Cache for quote results to improve performance\n */\nclass QuoteCache {\n private cache = new Map<string, CacheEntry>();\n private maxSize = 100;\n private defaultTtlMs = 5 * 60 * 1000; // 5 minutes\n\n /**\n * Generate cache key from input parameters\n */\n private generateKey(key: CacheKey): string {\n return `${key.inputHash}-${key.clientConfigHash}-${key.optionsHash}`;\n }\n\n /**\n * Hash object to string for cache key\n */\n private hashObject(obj: unknown): string {\n return Buffer.from(JSON.stringify(obj)).toString('base64').slice(0, 16);\n }\n\n /**\n * Create cache key from parameters\n */\n createCacheKey(\n input: unknown,\n clientConfig: NodeHederaClientConfig,\n options: InscriptionOptions,\n ): CacheKey {\n return {\n inputHash: this.hashObject(input),\n clientConfigHash: this.hashObject({\n accountId: clientConfig.accountId,\n network: clientConfig.network,\n }),\n optionsHash: this.hashObject({\n mode: options.mode,\n apiKey: options.apiKey ? 'present' : 'absent',\n network: options.network,\n metadata: options.metadata,\n }),\n };\n }\n\n /**\n * Get cached quote if available and not expired\n */\n get(key: CacheKey): QuoteResult | null {\n const cacheKey = this.generateKey(key);\n const entry = this.cache.get(cacheKey);\n\n if (!entry) {\n return null;\n }\n\n const now = Date.now();\n if (now - entry.timestamp > entry.ttlMs) {\n this.cache.delete(cacheKey);\n return null;\n }\n\n this.cache.delete(cacheKey);\n this.cache.set(cacheKey, entry);\n\n return entry.quote;\n }\n\n /**\n * Store quote in cache\n */\n set(\n key: CacheKey,\n quote: QuoteResult,\n ttlMs: number = this.defaultTtlMs,\n ): void {\n const cacheKey = this.generateKey(key);\n\n if (this.cache.size >= this.maxSize) {\n const firstKey = this.cache.keys().next().value;\n if (firstKey) {\n this.cache.delete(firstKey);\n }\n }\n\n this.cache.set(cacheKey, {\n quote,\n timestamp: Date.now(),\n ttlMs,\n });\n }\n\n /**\n * Clear all cached entries\n */\n clear(): void {\n this.cache.clear();\n }\n}\n\n/**\n * SDK instance cache for reuse\n */\nclass SDKCache {\n private cache = new Map<string, SDKCacheEntry>();\n private maxSize = 10;\n private defaultTtlMs = 30 * 60 * 1000; // 30 minutes\n\n /**\n * Generate config key for SDK instance\n */\n private generateConfigKey(config: unknown): string {\n return Buffer.from(JSON.stringify(config)).toString('base64');\n }\n\n /**\n * Get cached SDK instance\n */\n get(config: Record<string, unknown>): InscriptionSDK | null {\n const configKey = this.generateConfigKey(config);\n const entry = this.cache.get(configKey);\n\n if (!entry) {\n return null;\n }\n\n const now = Date.now();\n if (now - entry.timestamp > this.defaultTtlMs) {\n this.cache.delete(configKey);\n return null;\n }\n\n return entry.sdk;\n }\n\n /**\n * Store SDK instance in cache\n */\n set(config: Record<string, unknown>, sdk: InscriptionSDK): void {\n const configKey = this.generateConfigKey(config);\n\n if (this.cache.size >= this.maxSize) {\n const firstKey = this.cache.keys().next().value;\n if (firstKey) {\n this.cache.delete(firstKey);\n }\n }\n\n this.cache.set(configKey, {\n sdk,\n timestamp: Date.now(),\n config: configKey,\n });\n }\n\n /**\n * Clear all cached SDK instances\n */\n clear(): void {\n this.cache.clear();\n }\n}\n\nconst quoteCache = new QuoteCache();\nconst sdkCache = new SDKCache();\n\n/**\n * Get or create SDK instance with caching\n */\nexport async function getOrCreateSDK(\n clientConfig: NodeHederaClientConfig,\n options: InscriptionOptions,\n existingSDK?: InscriptionSDK,\n): Promise<InscriptionSDK> {\n if (existingSDK) {\n return existingSDK;\n }\n\n const connectionMode = options.connectionMode ?? 'auto';\n\n const cacheConfig = {\n apiKey: options.apiKey,\n accountId: clientConfig.accountId,\n network: clientConfig.network || 'mainnet',\n authType: options.apiKey ? 'api' : 'server',\n connectionMode,\n };\n\n const cachedSDK = sdkCache.get(cacheConfig);\n if (cachedSDK) {\n return cachedSDK;\n }\n\n let sdk: InscriptionSDK;\n\n if (options.apiKey) {\n sdk = new InscriptionSDK({\n apiKey: options.apiKey,\n network: clientConfig.network || 'mainnet',\n connectionMode,\n });\n } else {\n sdk = await InscriptionSDK.createWithAuth({\n type: 'server',\n accountId: clientConfig.accountId,\n privateKey:\n typeof clientConfig.privateKey === 'string'\n ? clientConfig.privateKey\n : clientConfig.privateKey.toString(),\n network: clientConfig.network || 'mainnet',\n connectionMode,\n });\n }\n\n sdkCache.set(cacheConfig, sdk);\n return sdk;\n}\n\n/**\n * Check if quote is cached and return it if valid\n */\nexport function getCachedQuote(\n input: unknown,\n clientConfig: NodeHederaClientConfig,\n options: InscriptionOptions,\n): QuoteResult | null {\n const cacheKey = quoteCache.createCacheKey(input, clientConfig, options);\n return quoteCache.get(cacheKey);\n}\n\n/**\n * Cache a generated quote\n */\nexport function cacheQuote(\n input: unknown,\n clientConfig: NodeHederaClientConfig,\n options: InscriptionOptions,\n quote: QuoteResult,\n): void {\n const cacheKey = quoteCache.createCacheKey(input, clientConfig, options);\n const quoteTtlMs = 10 * 60 * 1000;\n quoteCache.set(cacheKey, quote, quoteTtlMs);\n}\n\n/**\n * Pre-validate parameters for early error detection\n */\nexport function validateQuoteParameters(\n input: unknown,\n clientConfig: NodeHederaClientConfig,\n options: InscriptionOptions,\n): void {\n if (!input || typeof input !== 'object' || !('type' in input)) {\n throw new Error('Invalid inscription input: type is required');\n }\n\n if (!clientConfig || !clientConfig.accountId) {\n throw new Error('Invalid client config: accountId is required');\n }\n\n if (!options) {\n throw new Error('Options are required');\n }\n\n if (options.mode === 'hashinal') {\n if (!options.metadata) {\n throw new Error('Hashinal mode requires metadata');\n }\n\n const requiredFields = ['name', 'creator', 'description', 'type'];\n const missingFields = requiredFields.filter(\n field => !options.metadata || !options.metadata[field],\n );\n\n if (missingFields.length > 0) {\n throw new Error(\n `Missing required Hashinal metadata fields: ${missingFields.join(', ')}`,\n );\n }\n }\n}\n\n/**\n * Clear all caches (useful for testing or memory management)\n */\nexport function clearAllCaches(): void {\n quoteCache.clear();\n sdkCache.clear();\n}\n"],"names":[],"mappings":"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"}
@@ -1,31 +1,16 @@
1
1
  import * as path from "node:path";
2
2
  import { Buffer } from "node:buffer";
3
3
  import { randomBytes, createHash, createCipheriv, createDecipheriv } from "node:crypto";
4
- import { createRequire } from "node:module";
5
4
  import { secp256k1 } from "@noble/curves/secp256k1.js";
6
5
  import { canonicalizeLedgerNetwork } from "./standards-sdk.es130.js";
7
- import { searchResponseSchema, statsResponseSchema, registriesResponseSchema, additionalRegistryCatalogResponseSchema, popularResponseSchema, resolveResponseSchema, registerAgentResponseSchema, registrationQuoteResponseSchema, registrationProgressResponseSchema, creditPurchaseResponseSchema, x402MinimumsResponseSchema, x402CreditPurchaseResponseSchema, ledgerChallengeResponseSchema, ledgerVerifyResponseSchema, protocolsResponseSchema, detectProtocolResponseSchema, registrySearchByNamespaceSchema, vectorSearchResponseSchema, searchStatusResponseSchema, adapterDetailsResponseSchema, websocketStatsResponseSchema, metricsSummaryResponseSchema, uaidValidationResponseSchema, uaidConnectionStatusSchema, dashboardStatsResponseSchema, adaptersResponseSchema, searchFacetsResponseSchema, createSessionResponseSchema, chatHistorySnapshotResponseSchema, chatHistoryCompactionResponseSchema, sessionEncryptionStatusResponseSchema, encryptionHandshakeResponseSchema, registerEncryptionKeyResponseSchema, sendMessageResponseSchema } from "./standards-sdk.es138.js";
6
+ import { searchResponseSchema, statsResponseSchema, registriesResponseSchema, additionalRegistryCatalogResponseSchema, popularResponseSchema, resolveResponseSchema, registerAgentResponseSchema, registrationQuoteResponseSchema, registrationProgressResponseSchema, creditPurchaseResponseSchema, x402MinimumsResponseSchema, x402CreditPurchaseResponseSchema, ledgerChallengeResponseSchema, ledgerVerifyResponseSchema, protocolsResponseSchema, detectProtocolResponseSchema, registrySearchByNamespaceSchema, vectorSearchResponseSchema, searchStatusResponseSchema, adapterDetailsResponseSchema, websocketStatsResponseSchema, metricsSummaryResponseSchema, uaidValidationResponseSchema, uaidConnectionStatusSchema, dashboardStatsResponseSchema, adaptersResponseSchema, searchFacetsResponseSchema, createSessionResponseSchema, chatHistorySnapshotResponseSchema, chatHistoryCompactionResponseSchema, sessionEncryptionStatusResponseSchema, encryptionHandshakeResponseSchema, registerEncryptionKeyResponseSchema, sendMessageResponseSchema } from "./standards-sdk.es137.js";
8
7
  import { ZodError } from "zod";
9
8
  import { createPrivateKeySigner } from "./standards-sdk.es129.js";
10
- const createNodeRequire = () => {
11
- const metaUrl = typeof import.meta !== "undefined" && typeof import.meta.url === "string" ? import.meta.url : void 0;
12
- try {
13
- return createRequire(metaUrl ?? `${process.cwd()}/.hol-rb-client.cjs`);
14
- } catch {
15
- return null;
16
- }
17
- };
18
- const getFs = () => {
19
- const loader = createNodeRequire();
20
- if (!loader) {
21
- return null;
22
- }
23
- try {
24
- const fsModule = loader("node:fs");
25
- if (fsModule && typeof fsModule.existsSync === "function" && typeof fsModule.readFileSync === "function" && typeof fsModule.writeFileSync === "function" && typeof fsModule.appendFileSync === "function") {
26
- return fsModule;
27
- }
28
- } catch {
9
+ import { optionalImport } from "./standards-sdk.es135.js";
10
+ const getFs = async () => {
11
+ const fsModule = await optionalImport("node:fs");
12
+ if (fsModule && typeof fsModule.existsSync === "function" && typeof fsModule.readFileSync === "function" && typeof fsModule.writeFileSync === "function" && typeof fsModule.appendFileSync === "function") {
13
+ return fsModule;
29
14
  }
30
15
  return null;
31
16
  };
@@ -1706,7 +1691,7 @@ class RegistryBrokerClient {
1706
1691
  const envVar = options.envVar ?? "RB_ENCRYPTION_PRIVATE_KEY";
1707
1692
  const resolvedPath = options.envPath ? path.resolve(options.envPath) : void 0;
1708
1693
  if (resolvedPath) {
1709
- const fsModule = getFs();
1694
+ const fsModule = await getFs();
1710
1695
  if (!fsModule) {
1711
1696
  throw new Error(
1712
1697
  "File system module is not available; cannot write encryption key env file"