@hashgraphonline/standards-sdk 0.1.106 → 0.1.108

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 (73) hide show
  1. package/dist/cjs/hcs-10/base-client.d.ts +2 -2
  2. package/dist/cjs/hcs-10/base-client.d.ts.map +1 -1
  3. package/dist/cjs/hcs-10/sdk.d.ts +3 -2
  4. package/dist/cjs/hcs-10/sdk.d.ts.map +1 -1
  5. package/dist/cjs/hcs-10/tx.d.ts +1 -0
  6. package/dist/cjs/hcs-10/tx.d.ts.map +1 -1
  7. package/dist/cjs/hcs-11/client.d.ts +26 -26
  8. package/dist/cjs/hcs-12/validation/schemas.d.ts +10 -10
  9. package/dist/cjs/hcs-14/types.d.ts +2 -2
  10. package/dist/cjs/hcs-20/points-indexer.d.ts.map +1 -1
  11. package/dist/cjs/hcs-20/sdk.d.ts.map +1 -1
  12. package/dist/cjs/hcs-20/types.d.ts +5 -1
  13. package/dist/cjs/hcs-20/types.d.ts.map +1 -1
  14. package/dist/cjs/services/types.d.ts +2 -0
  15. package/dist/cjs/services/types.d.ts.map +1 -1
  16. package/dist/cjs/standards-sdk.cjs +16 -16
  17. package/dist/cjs/standards-sdk.cjs.map +1 -1
  18. package/dist/cjs/utils/logger.d.ts +7 -2
  19. package/dist/cjs/utils/logger.d.ts.map +1 -1
  20. package/dist/es/hcs-10/base-client.d.ts +2 -2
  21. package/dist/es/hcs-10/base-client.d.ts.map +1 -1
  22. package/dist/es/hcs-10/sdk.d.ts +3 -2
  23. package/dist/es/hcs-10/sdk.d.ts.map +1 -1
  24. package/dist/es/hcs-10/tx.d.ts +1 -0
  25. package/dist/es/hcs-10/tx.d.ts.map +1 -1
  26. package/dist/es/hcs-11/client.d.ts +26 -26
  27. package/dist/es/hcs-12/validation/schemas.d.ts +10 -10
  28. package/dist/es/hcs-14/types.d.ts +2 -2
  29. package/dist/es/hcs-20/points-indexer.d.ts.map +1 -1
  30. package/dist/es/hcs-20/sdk.d.ts.map +1 -1
  31. package/dist/es/hcs-20/types.d.ts +5 -1
  32. package/dist/es/hcs-20/types.d.ts.map +1 -1
  33. package/dist/es/services/types.d.ts +2 -0
  34. package/dist/es/services/types.d.ts.map +1 -1
  35. package/dist/es/standards-sdk.es108.js +1 -1
  36. package/dist/es/standards-sdk.es109.js +1 -1
  37. package/dist/es/standards-sdk.es11.js +24 -25
  38. package/dist/es/standards-sdk.es11.js.map +1 -1
  39. package/dist/es/standards-sdk.es110.js +5 -5
  40. package/dist/es/standards-sdk.es112.js +1 -1
  41. package/dist/es/standards-sdk.es123.js +53 -201
  42. package/dist/es/standards-sdk.es123.js.map +1 -1
  43. package/dist/es/standards-sdk.es124.js +188 -156
  44. package/dist/es/standards-sdk.es124.js.map +1 -1
  45. package/dist/es/standards-sdk.es125.js +139 -289
  46. package/dist/es/standards-sdk.es125.js.map +1 -1
  47. package/dist/es/standards-sdk.es126.js +274 -298
  48. package/dist/es/standards-sdk.es126.js.map +1 -1
  49. package/dist/es/standards-sdk.es127.js +262 -369
  50. package/dist/es/standards-sdk.es127.js.map +1 -1
  51. package/dist/es/standards-sdk.es128.js +316 -194
  52. package/dist/es/standards-sdk.es128.js.map +1 -1
  53. package/dist/es/standards-sdk.es129.js +319 -64
  54. package/dist/es/standards-sdk.es129.js.map +1 -1
  55. package/dist/es/standards-sdk.es13.js +165 -81
  56. package/dist/es/standards-sdk.es13.js.map +1 -1
  57. package/dist/es/standards-sdk.es130.js +69 -49
  58. package/dist/es/standards-sdk.es130.js.map +1 -1
  59. package/dist/es/standards-sdk.es17.js +1 -0
  60. package/dist/es/standards-sdk.es17.js.map +1 -1
  61. package/dist/es/standards-sdk.es51.js +1 -1
  62. package/dist/es/standards-sdk.es53.js +1 -1
  63. package/dist/es/standards-sdk.es67.js.map +1 -1
  64. package/dist/es/standards-sdk.es71.js +57 -36
  65. package/dist/es/standards-sdk.es71.js.map +1 -1
  66. package/dist/es/standards-sdk.es72.js +30 -34
  67. package/dist/es/standards-sdk.es72.js.map +1 -1
  68. package/dist/es/standards-sdk.es93.js +44 -37
  69. package/dist/es/standards-sdk.es93.js.map +1 -1
  70. package/dist/es/standards-sdk.es98.js +5 -5
  71. package/dist/es/utils/logger.d.ts +7 -2
  72. package/dist/es/utils/logger.d.ts.map +1 -1
  73. package/package.json +1 -3
@@ -1,207 +1,59 @@
1
- import { I as InscriptionSDK } from "./standards-sdk.es121.js";
2
- class QuoteCache {
3
- constructor() {
4
- this.cache = /* @__PURE__ */ new Map();
5
- this.maxSize = 100;
6
- this.defaultTtlMs = 5 * 60 * 1e3;
7
- }
8
- // 5 minutes
9
- /**
10
- * Generate cache key from input parameters
11
- */
12
- generateKey(key) {
13
- return `${key.inputHash}-${key.clientConfigHash}-${key.optionsHash}`;
14
- }
15
- /**
16
- * Hash object to string for cache key
17
- */
18
- hashObject(obj) {
19
- return Buffer.from(JSON.stringify(obj)).toString("base64").slice(0, 16);
20
- }
21
- /**
22
- * Create cache key from parameters
23
- */
24
- createCacheKey(input, clientConfig, options) {
25
- return {
26
- inputHash: this.hashObject(input),
27
- clientConfigHash: this.hashObject({
28
- accountId: clientConfig.accountId,
29
- network: clientConfig.network
30
- }),
31
- optionsHash: this.hashObject({
32
- mode: options.mode,
33
- apiKey: options.apiKey ? "present" : "absent",
34
- network: options.network,
35
- metadata: options.metadata
36
- })
37
- };
38
- }
39
- /**
40
- * Get cached quote if available and not expired
41
- */
42
- get(key) {
43
- const cacheKey = this.generateKey(key);
44
- const entry = this.cache.get(cacheKey);
45
- if (!entry) {
46
- return null;
47
- }
48
- const now = Date.now();
49
- if (now - entry.timestamp > entry.ttlMs) {
50
- this.cache.delete(cacheKey);
51
- return null;
52
- }
53
- this.cache.delete(cacheKey);
54
- this.cache.set(cacheKey, entry);
55
- return entry.quote;
56
- }
57
- /**
58
- * Store quote in cache
59
- */
60
- set(key, quote, ttlMs = this.defaultTtlMs) {
61
- const cacheKey = this.generateKey(key);
62
- if (this.cache.size >= this.maxSize) {
63
- const firstKey = this.cache.keys().next().value;
64
- if (firstKey) {
65
- this.cache.delete(firstKey);
66
- }
67
- }
68
- this.cache.set(cacheKey, {
69
- quote,
70
- timestamp: Date.now(),
71
- ttlMs
72
- });
73
- }
74
- /**
75
- * Clear all cached entries
76
- */
77
- clear() {
78
- this.cache.clear();
79
- }
80
- }
81
- class SDKCache {
82
- constructor() {
83
- this.cache = /* @__PURE__ */ new Map();
84
- this.maxSize = 10;
85
- this.defaultTtlMs = 30 * 60 * 1e3;
86
- }
87
- // 30 minutes
88
- /**
89
- * Generate config key for SDK instance
90
- */
91
- generateConfigKey(config) {
92
- return Buffer.from(JSON.stringify(config)).toString("base64");
93
- }
94
- /**
95
- * Get cached SDK instance
96
- */
97
- get(config) {
98
- const configKey = this.generateConfigKey(config);
99
- const entry = this.cache.get(configKey);
100
- if (!entry) {
101
- return null;
102
- }
103
- const now = Date.now();
104
- if (now - entry.timestamp > this.defaultTtlMs) {
105
- this.cache.delete(configKey);
106
- return null;
107
- }
108
- return entry.sdk;
109
- }
110
- /**
111
- * Store SDK instance in cache
112
- */
113
- set(config, sdk) {
114
- const configKey = this.generateConfigKey(config);
115
- if (this.cache.size >= this.maxSize) {
116
- const firstKey = this.cache.keys().next().value;
117
- if (firstKey) {
118
- this.cache.delete(firstKey);
119
- }
120
- }
121
- this.cache.set(configKey, {
122
- sdk,
123
- timestamp: Date.now(),
124
- config: configKey
125
- });
126
- }
127
- /**
128
- * Clear all cached SDK instances
129
- */
130
- clear() {
131
- this.cache.clear();
132
- }
133
- }
134
- const quoteCache = new QuoteCache();
135
- const sdkCache = new SDKCache();
136
- async function getOrCreateSDK(clientConfig, options, existingSDK) {
137
- if (existingSDK) {
138
- return existingSDK;
139
- }
140
- const cacheConfig = {
141
- apiKey: options.apiKey,
142
- accountId: clientConfig.accountId,
143
- network: clientConfig.network || "mainnet",
144
- authType: options.apiKey ? "api" : "server"
145
- };
146
- const cachedSDK = sdkCache.get(cacheConfig);
147
- if (cachedSDK) {
148
- return cachedSDK;
149
- }
150
- let sdk;
151
- if (options.apiKey) {
152
- sdk = new InscriptionSDK({
153
- apiKey: options.apiKey,
154
- network: clientConfig.network || "mainnet"
155
- });
156
- } else {
157
- sdk = await InscriptionSDK.createWithAuth({
158
- type: "server",
159
- accountId: clientConfig.accountId,
160
- privateKey: typeof clientConfig.privateKey === "string" ? clientConfig.privateKey : clientConfig.privateKey.toString(),
161
- network: clientConfig.network || "mainnet"
162
- });
163
- }
164
- sdkCache.set(cacheConfig, sdk);
165
- return sdk;
1
+ const ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
2
+ const BASE = 58;
3
+ function base58Encode(bytes) {
4
+ if (bytes.length === 0) return "";
5
+ let zeros = 0;
6
+ while (zeros < bytes.length && bytes[zeros] === 0) zeros++;
7
+ if (zeros === bytes.length) return "1".repeat(zeros);
8
+ const digits = [0];
9
+ for (let i = zeros; i < bytes.length; i++) {
10
+ let carry = bytes[i];
11
+ for (let j = 0; j < digits.length; j++) {
12
+ const val = (digits[j] << 8) + carry;
13
+ digits[j] = val % BASE;
14
+ carry = val / BASE | 0;
15
+ }
16
+ while (carry > 0) {
17
+ digits.push(carry % BASE);
18
+ carry = carry / BASE | 0;
19
+ }
20
+ }
21
+ let result = "";
22
+ for (let i = 0; i < zeros; i++) result += "1";
23
+ for (let i = digits.length - 1; i >= 0; i--) result += ALPHABET[digits[i]];
24
+ return result;
166
25
  }
167
- function getCachedQuote(input, clientConfig, options) {
168
- const cacheKey = quoteCache.createCacheKey(input, clientConfig, options);
169
- return quoteCache.get(cacheKey);
26
+ function base58Decode(text) {
27
+ if (text.length === 0) return new Uint8Array(0);
28
+ let zeros = 0;
29
+ while (zeros < text.length && text[zeros] === "1") zeros++;
30
+ const b256 = [];
31
+ for (let i = zeros; i < text.length; i++) {
32
+ const ch = text[i];
33
+ const val = ALPHABET.indexOf(ch);
34
+ if (val === -1) throw new Error("Invalid Base58 character");
35
+ let carry = val;
36
+ for (let j = 0; j < b256.length; j++) {
37
+ const x = b256[j] * BASE + carry;
38
+ b256[j] = x & 255;
39
+ carry = x >> 8;
40
+ }
41
+ while (carry > 0) {
42
+ b256.push(carry & 255);
43
+ carry >>= 8;
44
+ }
45
+ }
46
+ for (let i = 0; i < zeros; i++) b256.push(0);
47
+ b256.reverse();
48
+ return Uint8Array.from(b256);
170
49
  }
171
- function cacheQuote(input, clientConfig, options, quote) {
172
- const cacheKey = quoteCache.createCacheKey(input, clientConfig, options);
173
- const quoteTtlMs = 10 * 60 * 1e3;
174
- quoteCache.set(cacheKey, quote, quoteTtlMs);
175
- }
176
- function validateQuoteParameters(input, clientConfig, options) {
177
- if (!input || typeof input !== "object" || !("type" in input)) {
178
- throw new Error("Invalid inscription input: type is required");
179
- }
180
- if (!clientConfig || !clientConfig.accountId) {
181
- throw new Error("Invalid client config: accountId is required");
182
- }
183
- if (!options) {
184
- throw new Error("Options are required");
185
- }
186
- if (options.mode === "hashinal") {
187
- if (!options.metadata) {
188
- throw new Error("Hashinal mode requires metadata");
189
- }
190
- const requiredFields = ["name", "creator", "description", "type"];
191
- const missingFields = requiredFields.filter(
192
- (field) => !options.metadata || !options.metadata[field]
193
- );
194
- if (missingFields.length > 0) {
195
- throw new Error(
196
- `Missing required Hashinal metadata fields: ${missingFields.join(", ")}`
197
- );
198
- }
199
- }
50
+ function multibaseB58btcDecode(zText) {
51
+ if (!zText.startsWith("z")) throw new Error("Invalid multibase base58btc");
52
+ return base58Decode(zText.slice(1));
200
53
  }
201
54
  export {
202
- cacheQuote,
203
- getCachedQuote,
204
- getOrCreateSDK,
205
- validateQuoteParameters
55
+ base58Decode,
56
+ base58Encode,
57
+ multibaseB58btcDecode
206
58
  };
207
59
  //# sourceMappingURL=standards-sdk.es123.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"standards-sdk.es123.js","sources":["../../src/inscribe/quote-cache.ts"],"sourcesContent":["/**\n * Performance optimization utilities for quote generation\n */\n\nimport { InscriptionSDK } from '@kiloscribe/inscription-sdk';\nimport { HederaClientConfig, InscriptionOptions, QuoteResult, NodeHederaClientConfig } 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 cacheConfig = {\n apiKey: options.apiKey,\n accountId: clientConfig.accountId,\n network: clientConfig.network || 'mainnet',\n authType: options.apiKey ? 'api' : 'server',\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 });\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 });\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.es123.js","sources":["../../src/hcs-14/base58.ts"],"sourcesContent":["/**\n * Minimal Base58 encoder/decoder (Bitcoin alphabet) with no external dependencies.\n */\n\nconst ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';\nconst BASE = 58;\n\nfunction countLeadingZeros(bytes: Uint8Array): number {\n let zeros = 0;\n for (let i = 0; i < bytes.length && bytes[i] === 0; i++) {\n zeros++;\n }\n return zeros;\n}\n\nexport function base58Encode(bytes: Uint8Array): string {\n if (bytes.length === 0) return '';\n\n let zeros = 0;\n while (zeros < bytes.length && bytes[zeros] === 0) zeros++;\n\n if (zeros === bytes.length) return '1'.repeat(zeros);\n\n const digits: number[] = [0];\n for (let i = zeros; i < bytes.length; i++) {\n let carry = bytes[i];\n for (let j = 0; j < digits.length; j++) {\n const val = (digits[j] << 8) + carry;\n digits[j] = val % BASE;\n carry = (val / BASE) | 0;\n }\n while (carry > 0) {\n digits.push(carry % BASE);\n carry = (carry / BASE) | 0;\n }\n }\n\n let result = '';\n for (let i = 0; i < zeros; i++) result += '1';\n for (let i = digits.length - 1; i >= 0; i--) result += ALPHABET[digits[i]];\n return result;\n}\n\nexport function base58Decode(text: string): Uint8Array {\n if (text.length === 0) return new Uint8Array(0);\n\n let zeros = 0;\n while (zeros < text.length && text[zeros] === '1') zeros++;\n\n const b256: number[] = [];\n for (let i = zeros; i < text.length; i++) {\n const ch = text[i];\n const val = ALPHABET.indexOf(ch);\n if (val === -1) throw new Error('Invalid Base58 character');\n\n let carry = val;\n for (let j = 0; j < b256.length; j++) {\n const x = b256[j] * BASE + carry;\n b256[j] = x & 0xff;\n carry = x >> 8;\n }\n while (carry > 0) {\n b256.push(carry & 0xff);\n carry >>= 8;\n }\n }\n\n for (let i = 0; i < zeros; i++) b256.push(0);\n b256.reverse();\n return Uint8Array.from(b256);\n}\n\nexport function multibaseB58btcDecode(zText: string): Uint8Array {\n if (!zText.startsWith('z')) throw new Error('Invalid multibase base58btc');\n return base58Decode(zText.slice(1));\n}\n"],"names":[],"mappings":"AAIA,MAAM,WAAW;AACjB,MAAM,OAAO;AAUN,SAAS,aAAa,OAA2B;AACtD,MAAI,MAAM,WAAW,EAAG,QAAO;AAE/B,MAAI,QAAQ;AACZ,SAAO,QAAQ,MAAM,UAAU,MAAM,KAAK,MAAM,EAAG;AAEnD,MAAI,UAAU,MAAM,OAAQ,QAAO,IAAI,OAAO,KAAK;AAEnD,QAAM,SAAmB,CAAC,CAAC;AAC3B,WAAS,IAAI,OAAO,IAAI,MAAM,QAAQ,KAAK;AACzC,QAAI,QAAQ,MAAM,CAAC;AACnB,aAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,YAAM,OAAO,OAAO,CAAC,KAAK,KAAK;AAC/B,aAAO,CAAC,IAAI,MAAM;AAClB,cAAS,MAAM,OAAQ;AAAA,IACzB;AACA,WAAO,QAAQ,GAAG;AAChB,aAAO,KAAK,QAAQ,IAAI;AACxB,cAAS,QAAQ,OAAQ;AAAA,IAC3B;AAAA,EACF;AAEA,MAAI,SAAS;AACb,WAAS,IAAI,GAAG,IAAI,OAAO,IAAK,WAAU;AAC1C,WAAS,IAAI,OAAO,SAAS,GAAG,KAAK,GAAG,IAAK,WAAU,SAAS,OAAO,CAAC,CAAC;AACzE,SAAO;AACT;AAEO,SAAS,aAAa,MAA0B;AACrD,MAAI,KAAK,WAAW,EAAG,QAAO,IAAI,WAAW,CAAC;AAE9C,MAAI,QAAQ;AACZ,SAAO,QAAQ,KAAK,UAAU,KAAK,KAAK,MAAM,IAAK;AAEnD,QAAM,OAAiB,CAAA;AACvB,WAAS,IAAI,OAAO,IAAI,KAAK,QAAQ,KAAK;AACxC,UAAM,KAAK,KAAK,CAAC;AACjB,UAAM,MAAM,SAAS,QAAQ,EAAE;AAC/B,QAAI,QAAQ,GAAI,OAAM,IAAI,MAAM,0BAA0B;AAE1D,QAAI,QAAQ;AACZ,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,YAAM,IAAI,KAAK,CAAC,IAAI,OAAO;AAC3B,WAAK,CAAC,IAAI,IAAI;AACd,cAAQ,KAAK;AAAA,IACf;AACA,WAAO,QAAQ,GAAG;AAChB,WAAK,KAAK,QAAQ,GAAI;AACtB,gBAAU;AAAA,IACZ;AAAA,EACF;AAEA,WAAS,IAAI,GAAG,IAAI,OAAO,IAAK,MAAK,KAAK,CAAC;AAC3C,OAAK,QAAA;AACL,SAAO,WAAW,KAAK,IAAI;AAC7B;AAEO,SAAS,sBAAsB,OAA2B;AAC/D,MAAI,CAAC,MAAM,WAAW,GAAG,EAAG,OAAM,IAAI,MAAM,6BAA6B;AACzE,SAAO,aAAa,MAAM,MAAM,CAAC,CAAC;AACpC;"}
@@ -1,175 +1,207 @@
1
- import { Long, AccountId } from "@hashgraph/sdk";
2
- import { parseKey } from "./standards-sdk.es129.js";
3
- import { Buffer } from "buffer";
4
- class HCSParser {
5
- static parseConsensusCreateTopic(body) {
6
- if (!body) return void 0;
7
- const data = {};
8
- if (body.memo) {
9
- data.memo = body.memo;
10
- }
11
- data.adminKey = parseKey(body.adminKey);
12
- data.submitKey = parseKey(body.submitKey);
13
- if (body.autoRenewPeriod?.seconds) {
14
- data.autoRenewPeriod = Long.fromValue(
15
- body.autoRenewPeriod.seconds
16
- ).toString();
17
- }
18
- if (body.autoRenewAccount) {
19
- data.autoRenewAccountId = new AccountId(
20
- body.autoRenewAccount.shardNum ?? 0,
21
- body.autoRenewAccount.realmNum ?? 0,
22
- body.autoRenewAccount.accountNum ?? 0
23
- ).toString();
24
- }
25
- return data;
1
+ import { I as InscriptionSDK } from "./standards-sdk.es121.js";
2
+ class QuoteCache {
3
+ constructor() {
4
+ this.cache = /* @__PURE__ */ new Map();
5
+ this.maxSize = 100;
6
+ this.defaultTtlMs = 5 * 60 * 1e3;
7
+ }
8
+ // 5 minutes
9
+ /**
10
+ * Generate cache key from input parameters
11
+ */
12
+ generateKey(key) {
13
+ return `${key.inputHash}-${key.clientConfigHash}-${key.optionsHash}`;
14
+ }
15
+ /**
16
+ * Hash object to string for cache key
17
+ */
18
+ hashObject(obj) {
19
+ return Buffer.from(JSON.stringify(obj)).toString("base64").slice(0, 16);
26
20
  }
27
- static parseConsensusSubmitMessage(body) {
28
- if (!body) return void 0;
29
- const data = {};
30
- if (body.topicID) {
31
- data.topicId = `${body.topicID.shardNum ?? 0}.${body.topicID.realmNum ?? 0}.${body.topicID.topicNum ?? 0}`;
21
+ /**
22
+ * Create cache key from parameters
23
+ */
24
+ createCacheKey(input, clientConfig, options) {
25
+ return {
26
+ inputHash: this.hashObject(input),
27
+ clientConfigHash: this.hashObject({
28
+ accountId: clientConfig.accountId,
29
+ network: clientConfig.network
30
+ }),
31
+ optionsHash: this.hashObject({
32
+ mode: options.mode,
33
+ apiKey: options.apiKey ? "present" : "absent",
34
+ network: options.network,
35
+ metadata: options.metadata
36
+ })
37
+ };
38
+ }
39
+ /**
40
+ * Get cached quote if available and not expired
41
+ */
42
+ get(key) {
43
+ const cacheKey = this.generateKey(key);
44
+ const entry = this.cache.get(cacheKey);
45
+ if (!entry) {
46
+ return null;
32
47
  }
33
- if (body.message?.length > 0) {
34
- const messageBuffer = Buffer.from(body.message);
35
- const utf8String = messageBuffer.toString("utf8");
36
- if (/[\x00-\x08\x0B\x0E-\x1F\x7F]/.test(utf8String) || utf8String.includes("�")) {
37
- data.message = messageBuffer.toString("base64");
38
- data.messageEncoding = "base64";
39
- } else {
40
- data.message = utf8String;
41
- data.messageEncoding = "utf8";
42
- }
48
+ const now = Date.now();
49
+ if (now - entry.timestamp > entry.ttlMs) {
50
+ this.cache.delete(cacheKey);
51
+ return null;
43
52
  }
44
- if (body.chunkInfo) {
45
- if (body.chunkInfo.initialTransactionID) {
46
- const txId = body.chunkInfo.initialTransactionID.accountID;
47
- const taValidStart = body.chunkInfo.initialTransactionID.transactionValidStart;
48
- if (txId && taValidStart) {
49
- data.chunkInfoInitialTransactionID = `${txId.shardNum ?? 0}.${txId.realmNum ?? 0}.${txId.accountNum ?? 0}@${taValidStart.seconds ?? 0}.${taValidStart.nanos ?? 0}`;
50
- }
51
- }
52
- if (body.chunkInfo.number !== void 0 && body.chunkInfo.number !== null) {
53
- data.chunkInfoNumber = body.chunkInfo.number;
54
- }
55
- if (body.chunkInfo.total !== void 0 && body.chunkInfo.total !== null) {
56
- data.chunkInfoTotal = body.chunkInfo.total;
53
+ this.cache.delete(cacheKey);
54
+ this.cache.set(cacheKey, entry);
55
+ return entry.quote;
56
+ }
57
+ /**
58
+ * Store quote in cache
59
+ */
60
+ set(key, quote, ttlMs = this.defaultTtlMs) {
61
+ const cacheKey = this.generateKey(key);
62
+ if (this.cache.size >= this.maxSize) {
63
+ const firstKey = this.cache.keys().next().value;
64
+ if (firstKey) {
65
+ this.cache.delete(firstKey);
57
66
  }
58
67
  }
59
- return data;
68
+ this.cache.set(cacheKey, {
69
+ quote,
70
+ timestamp: Date.now(),
71
+ ttlMs
72
+ });
60
73
  }
61
- static parseConsensusUpdateTopic(body) {
62
- if (!body) return void 0;
63
- const data = {};
64
- if (body.topicID) {
65
- data.topicId = `${body.topicID.shardNum}.${body.topicID.realmNum}.${body.topicID.topicNum}`;
66
- }
67
- if (body.memo?.value !== void 0) {
68
- data.memo = body.memo.value;
69
- }
70
- if (body.adminKey === null) {
71
- data.clearAdminKey = true;
72
- data.adminKey = void 0;
73
- } else if (body.adminKey) {
74
- data.adminKey = parseKey(body.adminKey);
75
- } else {
76
- data.adminKey = void 0;
77
- }
78
- if (body.submitKey === null) {
79
- data.clearSubmitKey = true;
80
- data.submitKey = void 0;
81
- } else if (body.submitKey) {
82
- data.submitKey = parseKey(body.submitKey);
83
- } else {
84
- data.submitKey = void 0;
85
- }
86
- if (body.autoRenewPeriod?.seconds) {
87
- data.autoRenewPeriod = Long.fromValue(
88
- body.autoRenewPeriod.seconds
89
- ).toString();
74
+ /**
75
+ * Clear all cached entries
76
+ */
77
+ clear() {
78
+ this.cache.clear();
79
+ }
80
+ }
81
+ class SDKCache {
82
+ constructor() {
83
+ this.cache = /* @__PURE__ */ new Map();
84
+ this.maxSize = 10;
85
+ this.defaultTtlMs = 30 * 60 * 1e3;
86
+ }
87
+ // 30 minutes
88
+ /**
89
+ * Generate config key for SDK instance
90
+ */
91
+ generateConfigKey(config) {
92
+ return Buffer.from(JSON.stringify(config)).toString("base64");
93
+ }
94
+ /**
95
+ * Get cached SDK instance
96
+ */
97
+ get(config) {
98
+ const configKey = this.generateConfigKey(config);
99
+ const entry = this.cache.get(configKey);
100
+ if (!entry) {
101
+ return null;
90
102
  }
91
- if (body.autoRenewAccount) {
92
- data.autoRenewAccountId = new AccountId(
93
- body.autoRenewAccount.shardNum ?? 0,
94
- body.autoRenewAccount.realmNum ?? 0,
95
- body.autoRenewAccount.accountNum ?? 0
96
- ).toString();
103
+ const now = Date.now();
104
+ if (now - entry.timestamp > this.defaultTtlMs) {
105
+ this.cache.delete(configKey);
106
+ return null;
97
107
  }
98
- return data;
108
+ return entry.sdk;
99
109
  }
100
- static parseConsensusDeleteTopic(body) {
101
- if (!body) return void 0;
102
- const data = {};
103
- if (body.topicID) {
104
- data.topicId = `${body.topicID.shardNum}.${body.topicID.realmNum ?? 0}.${body.topicID.topicNum ?? 0}`;
110
+ /**
111
+ * Store SDK instance in cache
112
+ */
113
+ set(config, sdk) {
114
+ const configKey = this.generateConfigKey(config);
115
+ if (this.cache.size >= this.maxSize) {
116
+ const firstKey = this.cache.keys().next().value;
117
+ if (firstKey) {
118
+ this.cache.delete(firstKey);
119
+ }
105
120
  }
106
- return data;
121
+ this.cache.set(configKey, {
122
+ sdk,
123
+ timestamp: Date.now(),
124
+ config: configKey
125
+ });
107
126
  }
108
127
  /**
109
- * Parse HCS transaction from Transaction object with comprehensive extraction
110
- * This is the unified entry point that handles both protobuf and internal field extraction
128
+ * Clear all cached SDK instances
111
129
  */
112
- static parseFromTransactionObject(transaction) {
113
- try {
114
- const transactionBody = transaction._transactionBody;
115
- if (!transactionBody) {
116
- return {};
117
- }
118
- if (transactionBody.consensusCreateTopic) {
119
- const consensusCreateTopic = this.parseConsensusCreateTopic(
120
- transactionBody.consensusCreateTopic
121
- );
122
- if (consensusCreateTopic) {
123
- return {
124
- type: "TOPICCREATE",
125
- humanReadableType: "Topic Create",
126
- consensusCreateTopic
127
- };
128
- }
129
- }
130
- if (transactionBody.consensusSubmitMessage) {
131
- const consensusSubmitMessage = this.parseConsensusSubmitMessage(
132
- transactionBody.consensusSubmitMessage
133
- );
134
- if (consensusSubmitMessage) {
135
- return {
136
- type: "CONSENSUSSUBMITMESSAGE",
137
- humanReadableType: "Submit Message",
138
- consensusSubmitMessage
139
- };
140
- }
141
- }
142
- if (transactionBody.consensusUpdateTopic) {
143
- const consensusUpdateTopic = this.parseConsensusUpdateTopic(
144
- transactionBody.consensusUpdateTopic
145
- );
146
- if (consensusUpdateTopic) {
147
- return {
148
- type: "TOPICUPDATE",
149
- humanReadableType: "Topic Update",
150
- consensusUpdateTopic
151
- };
152
- }
153
- }
154
- if (transactionBody.consensusDeleteTopic) {
155
- const consensusDeleteTopic = this.parseConsensusDeleteTopic(
156
- transactionBody.consensusDeleteTopic
157
- );
158
- if (consensusDeleteTopic) {
159
- return {
160
- type: "TOPICDELETE",
161
- humanReadableType: "Topic Delete",
162
- consensusDeleteTopic
163
- };
164
- }
165
- }
166
- return {};
167
- } catch (error) {
168
- return {};
130
+ clear() {
131
+ this.cache.clear();
132
+ }
133
+ }
134
+ const quoteCache = new QuoteCache();
135
+ const sdkCache = new SDKCache();
136
+ async function getOrCreateSDK(clientConfig, options, existingSDK) {
137
+ if (existingSDK) {
138
+ return existingSDK;
139
+ }
140
+ const cacheConfig = {
141
+ apiKey: options.apiKey,
142
+ accountId: clientConfig.accountId,
143
+ network: clientConfig.network || "mainnet",
144
+ authType: options.apiKey ? "api" : "server"
145
+ };
146
+ const cachedSDK = sdkCache.get(cacheConfig);
147
+ if (cachedSDK) {
148
+ return cachedSDK;
149
+ }
150
+ let sdk;
151
+ if (options.apiKey) {
152
+ sdk = new InscriptionSDK({
153
+ apiKey: options.apiKey,
154
+ network: clientConfig.network || "mainnet"
155
+ });
156
+ } else {
157
+ sdk = await InscriptionSDK.createWithAuth({
158
+ type: "server",
159
+ accountId: clientConfig.accountId,
160
+ privateKey: typeof clientConfig.privateKey === "string" ? clientConfig.privateKey : clientConfig.privateKey.toString(),
161
+ network: clientConfig.network || "mainnet"
162
+ });
163
+ }
164
+ sdkCache.set(cacheConfig, sdk);
165
+ return sdk;
166
+ }
167
+ function getCachedQuote(input, clientConfig, options) {
168
+ const cacheKey = quoteCache.createCacheKey(input, clientConfig, options);
169
+ return quoteCache.get(cacheKey);
170
+ }
171
+ function cacheQuote(input, clientConfig, options, quote) {
172
+ const cacheKey = quoteCache.createCacheKey(input, clientConfig, options);
173
+ const quoteTtlMs = 10 * 60 * 1e3;
174
+ quoteCache.set(cacheKey, quote, quoteTtlMs);
175
+ }
176
+ function validateQuoteParameters(input, clientConfig, options) {
177
+ if (!input || typeof input !== "object" || !("type" in input)) {
178
+ throw new Error("Invalid inscription input: type is required");
179
+ }
180
+ if (!clientConfig || !clientConfig.accountId) {
181
+ throw new Error("Invalid client config: accountId is required");
182
+ }
183
+ if (!options) {
184
+ throw new Error("Options are required");
185
+ }
186
+ if (options.mode === "hashinal") {
187
+ if (!options.metadata) {
188
+ throw new Error("Hashinal mode requires metadata");
189
+ }
190
+ const requiredFields = ["name", "creator", "description", "type"];
191
+ const missingFields = requiredFields.filter(
192
+ (field) => !options.metadata || !options.metadata[field]
193
+ );
194
+ if (missingFields.length > 0) {
195
+ throw new Error(
196
+ `Missing required Hashinal metadata fields: ${missingFields.join(", ")}`
197
+ );
169
198
  }
170
199
  }
171
200
  }
172
201
  export {
173
- HCSParser
202
+ cacheQuote,
203
+ getCachedQuote,
204
+ getOrCreateSDK,
205
+ validateQuoteParameters
174
206
  };
175
207
  //# sourceMappingURL=standards-sdk.es124.js.map