@hashgraphonline/standards-sdk 0.0.116 → 0.0.117
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.
- package/dist/cjs/hcs-10/sdk.d.ts +1 -0
- package/dist/cjs/hcs-10/sdk.d.ts.map +1 -1
- package/dist/cjs/{index-qpugvUCd.cjs → index-CHS2J8pS.cjs} +2 -2
- package/dist/cjs/index-CHS2J8pS.cjs.map +1 -0
- package/dist/cjs/{index-CHar8dVv-BQYxSvOg.cjs → index-CHar8dVv-B2IK-7-2.cjs} +2 -2
- package/dist/cjs/{index-CHar8dVv-BQYxSvOg.cjs.map → index-CHar8dVv-B2IK-7-2.cjs.map} +1 -1
- package/dist/cjs/standards-sdk.cjs +1 -1
- package/dist/es/hcs-10/sdk.d.ts +1 -0
- package/dist/es/hcs-10/sdk.d.ts.map +1 -1
- package/dist/es/standards-sdk.es7.js +7 -5
- package/dist/es/standards-sdk.es7.js.map +1 -1
- package/dist/umd/hcs-10/sdk.d.ts +1 -0
- package/dist/umd/hcs-10/sdk.d.ts.map +1 -1
- package/dist/umd/standards-sdk.umd.js +1 -1
- package/dist/umd/standards-sdk.umd.js.map +1 -1
- package/package.json +1 -1
- package/dist/cjs/index-qpugvUCd.cjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-CHS2J8pS.cjs","sources":["../../src/utils/logger.ts","../../src/hcs-7/evm-bridge.ts","../../node_modules/@kiloscribe/inscription-sdk/dist/es/index-Dt7aLBOw.js","../../src/utils/progress-reporter.ts","../../src/inscribe/inscriber.ts","../../src/services/mirror-node.ts","../../src/utils/topic-fee-utils.ts","../../src/utils/hrl-resolver.ts","../../src/utils/parsers/parser-utils.ts","../../src/utils/parsers/hts-parser.ts","../../src/utils/parsers/hcs-parser.ts","../../src/utils/parsers/file-parser.ts","../../src/utils/parsers/crypto-parser.ts","../../src/utils/parsers/scs-parser.ts","../../src/utils/parsers/util-parser.ts","../../src/utils/key-type-detector.ts","../../src/hcs-11/types.ts","../../src/hcs-11/client.ts","../../src/hcs-10/registrations.ts","../../src/utils/sleep.ts","../../src/hcs-10/base-client.ts","../../src/hcs-10/errors.ts","../../src/hcs-11/agent-builder.ts","../../src/hcs-10/sdk.ts","../../src/hcs-10/browser.ts","../../src/fees/types.ts","../../src/fees/fee-config-builder.ts","../../src/hcs-10/connections-manager.ts","../../src/hcs-3/src/index.ts","../../src/hcs-11/person-builder.ts","../../src/utils/transaction-parser.ts","../../src/hcs-7/wasm-bridge.ts"],"sourcesContent":["import pino from 'pino';\n\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'silent';\n\nexport interface LoggerOptions {\n level?: LogLevel;\n module?: string;\n prettyPrint?: boolean;\n silent?: boolean;\n}\nexport class Logger {\n private static instances: Map<string, Logger> = new Map();\n private logger: pino.Logger;\n private moduleContext: string;\n\n constructor(options: LoggerOptions = {}) {\n const globalDisable = process.env.DISABLE_LOGS === 'true';\n\n const shouldSilence = options.silent || globalDisable;\n const level = shouldSilence ? 'silent' : options.level || 'info';\n this.moduleContext = options.module || 'app';\n\n const shouldEnablePrettyPrint =\n !shouldSilence && options.prettyPrint !== false;\n const pinoOptions: pino.LoggerOptions = {\n level,\n enabled: !shouldSilence,\n transport: shouldEnablePrettyPrint\n ? {\n target: 'pino-pretty',\n options: {\n colorize: true,\n translateTime: 'SYS:standard',\n ignore: 'pid,hostname',\n },\n }\n : undefined,\n };\n\n this.logger = pino(pinoOptions);\n }\n\n static getInstance(options: LoggerOptions = {}): Logger {\n const moduleKey = options.module || 'default';\n\n const globalDisable = process.env.DISABLE_LOGS === 'true';\n\n if (globalDisable && Logger.instances.has(moduleKey)) {\n const existingLogger = Logger.instances.get(moduleKey)!;\n if (existingLogger.getLevel() !== 'silent') {\n Logger.instances.delete(moduleKey);\n }\n }\n\n if (!Logger.instances.has(moduleKey)) {\n Logger.instances.set(moduleKey, new Logger(options));\n }\n\n return Logger.instances.get(moduleKey)!;\n }\n\n setLogLevel(level: LogLevel): void {\n this.logger.level = level;\n }\n\n getLevel(): LogLevel {\n return this.logger.level as LogLevel;\n }\n\n setSilent(silent: boolean): void {\n if (silent) {\n this.logger.level = 'silent';\n }\n }\n\n setModule(module: string): void {\n this.moduleContext = module;\n }\n\n debug(...args: any[]): void {\n this.logger.debug({ module: this.moduleContext }, ...args);\n }\n\n info(...args: any[]): void {\n this.logger.info({ module: this.moduleContext }, ...args);\n }\n\n warn(...args: any[]): void {\n this.logger.warn({ module: this.moduleContext }, ...args);\n }\n\n error(...args: any[]): void {\n this.logger.error({ module: this.moduleContext }, ...args);\n }\n\n trace(...args: any[]): void {\n this.logger.trace({ module: this.moduleContext }, ...args);\n }\n}\n","import { AccountId, ContractId } from '@hashgraph/sdk';\nimport { EVMConfig } from './wasm-bridge';\nimport { ethers } from 'ethers';\nimport { Logger } from '../utils/logger';\n\nexport interface EVMCache {\n get(key: string): Promise<string | undefined> | string | undefined;\n set(key: string, value: string): Promise<void> | void;\n delete(key: string): Promise<void> | void;\n clear(): Promise<void> | void;\n}\n\nclass MapCache implements EVMCache {\n private cache: Map<string, string>;\n\n constructor() {\n this.cache = new Map();\n }\n\n get(key: string): string | undefined {\n return this.cache.get(key);\n }\n\n set(key: string, value: string): void {\n this.cache.set(key, value);\n }\n\n delete(key: string): void {\n this.cache.delete(key);\n }\n\n clear(): void {\n this.cache.clear();\n }\n}\n\nexport class EVMBridge {\n public network: string;\n public mirrorNodeUrl: string;\n private cache: EVMCache;\n private logger: Logger;\n\n constructor(\n network: string = 'mainnet-public',\n mirrorNodeUrl: string = `mirrornode.hedera.com/api/v1/contracts/call`,\n cache?: EVMCache,\n ) {\n this.network = network;\n this.mirrorNodeUrl = mirrorNodeUrl;\n this.cache = cache || new MapCache();\n this.logger = Logger.getInstance({ module: 'EVMBridge' });\n }\n\n async executeCommands(\n evmConfigs: EVMConfig[],\n initialState: Record<string, string> = {},\n ): Promise<{\n results: Record<string, any>;\n stateData: Record<string, any>;\n }> {\n let stateData: Record<string, any> = { ...initialState };\n const results: Record<string, any> = {};\n\n for (const config of evmConfigs) {\n const cacheKey = `${config.c.contractAddress}-${config.c.abi.name}`;\n\n // Check cache first\n const cachedResult = await this.cache.get(cacheKey);\n if (cachedResult) {\n results[config.c.abi.name] = JSON.parse(cachedResult);\n Object.assign(stateData, results[config.c.abi.name]); // Flatten the values into stateData\n continue;\n }\n\n try {\n const iface = new ethers.Interface([\n {\n ...config.c.abi,\n },\n ]);\n const command = iface.encodeFunctionData(config.c.abi.name);\n const contractId = ContractId.fromSolidityAddress(\n config.c.contractAddress,\n );\n\n const result = await this.readFromMirrorNode(\n command,\n AccountId.fromString('0.0.800'),\n contractId,\n );\n\n this.logger.info(\n `Result for ${config.c.contractAddress}:`,\n result?.result,\n );\n\n if (!result?.result) {\n this.logger.warn(\n `Failed to get result from mirror node for ${config.c.contractAddress}`,\n );\n results[config.c.abi.name] = '0';\n Object.assign(stateData, results[config.c.abi.name]); // Flatten the values into stateData\n continue;\n }\n\n const decodedResult = iface?.decodeFunctionResult(\n config.c.abi.name,\n result.result,\n );\n let processedResult: Record<string, any> = {\n values: [], // Initialize array for values\n };\n\n // Handle tuple returns and array-like results\n if (decodedResult) {\n // For tuples, ethers.js provides both array-like and named properties\n // We want to use the array-like access to ensure we get each value in order\n config.c.abi.outputs?.forEach((output, idx) => {\n const value = decodedResult[idx];\n const formattedValue = formatValue(value, output.type);\n\n // Add to values array\n processedResult.values.push(formattedValue);\n\n if (output.name) {\n processedResult[output.name] = formattedValue;\n }\n });\n }\n\n await this.cache.set(cacheKey, JSON.stringify(processedResult));\n\n results[config.c.abi.name] = processedResult;\n stateData[config.c.abi.name] = processedResult;\n } catch (error) {\n this.logger.error(\n `Error executing command for ${config.c.contractAddress}:`,\n error,\n );\n results[config.c.abi.name] = '0';\n Object.assign(stateData, results[config.c.abi.name]); // Flatten the values into stateData\n }\n }\n\n return { results, stateData };\n }\n\n async executeCommand(\n evmConfig: EVMConfig,\n stateData: Record<string, string> = {},\n ): Promise<any> {\n const { results, stateData: newStateData } = await this.executeCommands(\n [evmConfig],\n stateData,\n );\n return {\n result: results[evmConfig.c.abi.name],\n stateData: newStateData,\n };\n }\n\n async readFromMirrorNode(\n command: string,\n from: AccountId,\n to: ContractId,\n ): Promise<any> {\n try {\n const toAddress = to.toSolidityAddress();\n const fromAddress = from.toSolidityAddress();\n const response = await fetch(\n `https://${this.network}.${this.mirrorNodeUrl}`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n block: 'latest',\n data: command,\n estimate: false,\n gas: 300_000,\n gasPrice: 100000000,\n from: fromAddress.startsWith('0x')\n ? fromAddress\n : `0x${fromAddress}`,\n to: toAddress?.startsWith('0x') ? toAddress : `0x${toAddress}`,\n value: 0,\n }),\n },\n );\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n return await response.json();\n } catch (error) {\n this.logger.error('Error reading from mirror node:', error);\n return null;\n }\n }\n\n // Add method to clear cache if needed\n public async clearCache(): Promise<void> {\n await this.cache.clear();\n }\n\n // Add method to remove specific cache entry\n public async clearCacheForContract(\n contractAddress: string,\n functionName: string,\n ): Promise<void> {\n await this.cache.delete(`${contractAddress}-${functionName}`);\n }\n\n // Method to set log level for this bridge instance\n public setLogLevel(level: 'debug' | 'info' | 'warn' | 'error'): void {\n this.logger.setLogLevel(level);\n }\n}\n\nfunction formatValue(value: any, type: string): string {\n if (value === null || value === undefined) {\n return '0';\n }\n\n // Handle BigNumber objects from ethers.js\n if (value._isBigNumber) {\n return value.toString();\n }\n\n if (type.startsWith('uint') || type.startsWith('int')) {\n return String(value);\n } else if (type === 'bool') {\n return value ? 'true' : 'false';\n } else if (type === 'string') {\n return value;\n } else if (type === 'address') {\n return String(value).toLowerCase();\n } else if (type.endsWith('[]')) {\n // Handle arrays\n // @ts-ignore\n return Array.isArray(value) ? value.map(v => String(v)) : [];\n } else {\n // Default to string conversion for unknown types\n return String(value);\n }\n}\n","var __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\nimport { PrivateKey, Client, TransferTransaction } from \"@hashgraph/sdk\";\nvar buffer = {};\nvar base64Js = {};\nbase64Js.byteLength = byteLength;\nbase64Js.toByteArray = toByteArray;\nbase64Js.fromByteArray = fromByteArray;\nvar lookup = [];\nvar revLookup = [];\nvar Arr = typeof Uint8Array !== \"undefined\" ? Uint8Array : Array;\nvar code = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\nfor (var i = 0, len = code.length; i < len; ++i) {\n lookup[i] = code[i];\n revLookup[code.charCodeAt(i)] = i;\n}\nrevLookup[\"-\".charCodeAt(0)] = 62;\nrevLookup[\"_\".charCodeAt(0)] = 63;\nfunction getLens(b64) {\n var len = b64.length;\n if (len % 4 > 0) {\n throw new Error(\"Invalid string. Length must be a multiple of 4\");\n }\n var validLen = b64.indexOf(\"=\");\n if (validLen === -1) validLen = len;\n var placeHoldersLen = validLen === len ? 0 : 4 - validLen % 4;\n return [validLen, placeHoldersLen];\n}\nfunction byteLength(b64) {\n var lens = getLens(b64);\n var validLen = lens[0];\n var placeHoldersLen = lens[1];\n return (validLen + placeHoldersLen) * 3 / 4 - placeHoldersLen;\n}\nfunction _byteLength(b64, validLen, placeHoldersLen) {\n return (validLen + placeHoldersLen) * 3 / 4 - placeHoldersLen;\n}\nfunction toByteArray(b64) {\n var tmp;\n var lens = getLens(b64);\n var validLen = lens[0];\n var placeHoldersLen = lens[1];\n var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen));\n var curByte = 0;\n var len = placeHoldersLen > 0 ? validLen - 4 : validLen;\n var i;\n for (i = 0; i < len; i += 4) {\n tmp = revLookup[b64.charCodeAt(i)] << 18 | revLookup[b64.charCodeAt(i + 1)] << 12 | revLookup[b64.charCodeAt(i + 2)] << 6 | revLookup[b64.charCodeAt(i + 3)];\n arr[curByte++] = tmp >> 16 & 255;\n arr[curByte++] = tmp >> 8 & 255;\n arr[curByte++] = tmp & 255;\n }\n if (placeHoldersLen === 2) {\n tmp = revLookup[b64.charCodeAt(i)] << 2 | revLookup[b64.charCodeAt(i + 1)] >> 4;\n arr[curByte++] = tmp & 255;\n }\n if (placeHoldersLen === 1) {\n tmp = revLookup[b64.charCodeAt(i)] << 10 | revLookup[b64.charCodeAt(i + 1)] << 4 | revLookup[b64.charCodeAt(i + 2)] >> 2;\n arr[curByte++] = tmp >> 8 & 255;\n arr[curByte++] = tmp & 255;\n }\n return arr;\n}\nfunction tripletToBase64(num) {\n return lookup[num >> 18 & 63] + lookup[num >> 12 & 63] + lookup[num >> 6 & 63] + lookup[num & 63];\n}\nfunction encodeChunk(uint8, start, end) {\n var tmp;\n var output = [];\n for (var i = start; i < end; i += 3) {\n tmp = (uint8[i] << 16 & 16711680) + (uint8[i + 1] << 8 & 65280) + (uint8[i + 2] & 255);\n output.push(tripletToBase64(tmp));\n }\n return output.join(\"\");\n}\nfunction fromByteArray(uint8) {\n var tmp;\n var len = uint8.length;\n var extraBytes = len % 3;\n var parts = [];\n var maxChunkLength = 16383;\n for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n parts.push(encodeChunk(uint8, i, i + maxChunkLength > len2 ? len2 : i + maxChunkLength));\n }\n if (extraBytes === 1) {\n tmp = uint8[len - 1];\n parts.push(\n lookup[tmp >> 2] + lookup[tmp << 4 & 63] + \"==\"\n );\n } else if (extraBytes === 2) {\n tmp = (uint8[len - 2] << 8) + uint8[len - 1];\n parts.push(\n lookup[tmp >> 10] + lookup[tmp >> 4 & 63] + lookup[tmp << 2 & 63] + \"=\"\n );\n }\n return parts.join(\"\");\n}\nvar ieee754$1 = {};\n/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */\nieee754$1.read = function(buffer2, offset, isLE, mLen, nBytes) {\n var e, m;\n var eLen = nBytes * 8 - mLen - 1;\n var eMax = (1 << eLen) - 1;\n var eBias = eMax >> 1;\n var nBits = -7;\n var i = isLE ? nBytes - 1 : 0;\n var d = isLE ? -1 : 1;\n var s = buffer2[offset + i];\n i += d;\n e = s & (1 << -nBits) - 1;\n s >>= -nBits;\n nBits += eLen;\n for (; nBits > 0; e = e * 256 + buffer2[offset + i], i += d, nBits -= 8) {\n }\n m = e & (1 << -nBits) - 1;\n e >>= -nBits;\n nBits += mLen;\n for (; nBits > 0; m = m * 256 + buffer2[offset + i], i += d, nBits -= 8) {\n }\n if (e === 0) {\n e = 1 - eBias;\n } else if (e === eMax) {\n return m ? NaN : (s ? -1 : 1) * Infinity;\n } else {\n m = m + Math.pow(2, mLen);\n e = e - eBias;\n }\n return (s ? -1 : 1) * m * Math.pow(2, e - mLen);\n};\nieee754$1.write = function(buffer2, value, offset, isLE, mLen, nBytes) {\n var e, m, c;\n var eLen = nBytes * 8 - mLen - 1;\n var eMax = (1 << eLen) - 1;\n var eBias = eMax >> 1;\n var rt = mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0;\n var i = isLE ? 0 : nBytes - 1;\n var d = isLE ? 1 : -1;\n var s = value < 0 || value === 0 && 1 / value < 0 ? 1 : 0;\n value = Math.abs(value);\n if (isNaN(value) || value === Infinity) {\n m = isNaN(value) ? 1 : 0;\n e = eMax;\n } else {\n e = Math.floor(Math.log(value) / Math.LN2);\n if (value * (c = Math.pow(2, -e)) < 1) {\n e--;\n c *= 2;\n }\n if (e + eBias >= 1) {\n value += rt / c;\n } else {\n value += rt * Math.pow(2, 1 - eBias);\n }\n if (value * c >= 2) {\n e++;\n c /= 2;\n }\n if (e + eBias >= eMax) {\n m = 0;\n e = eMax;\n } else if (e + eBias >= 1) {\n m = (value * c - 1) * Math.pow(2, mLen);\n e = e + eBias;\n } else {\n m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen);\n e = 0;\n }\n }\n for (; mLen >= 8; buffer2[offset + i] = m & 255, i += d, m /= 256, mLen -= 8) {\n }\n e = e << mLen | m;\n eLen += mLen;\n for (; eLen > 0; buffer2[offset + i] = e & 255, i += d, e /= 256, eLen -= 8) {\n }\n buffer2[offset + i - d] |= s * 128;\n};\n/*!\n * The buffer module from node.js, for the browser.\n *\n * @author Feross Aboukhadijeh <https://feross.org>\n * @license MIT\n */\n(function(exports) {\n const base64 = base64Js;\n const ieee754$1$1 = ieee754$1;\n const customInspectSymbol = typeof Symbol === \"function\" && typeof Symbol[\"for\"] === \"function\" ? Symbol[\"for\"](\"nodejs.util.inspect.custom\") : null;\n exports.Buffer = Buffer3;\n exports.SlowBuffer = SlowBuffer;\n exports.INSPECT_MAX_BYTES = 50;\n const K_MAX_LENGTH = 2147483647;\n exports.kMaxLength = K_MAX_LENGTH;\n const { Uint8Array: GlobalUint8Array, ArrayBuffer: GlobalArrayBuffer, SharedArrayBuffer: GlobalSharedArrayBuffer } = globalThis;\n Buffer3.TYPED_ARRAY_SUPPORT = typedArraySupport();\n if (!Buffer3.TYPED_ARRAY_SUPPORT && typeof console !== \"undefined\" && typeof console.error === \"function\") {\n console.error(\n \"This browser lacks typed array (Uint8Array) support which is required by `buffer` v5.x. Use `buffer` v4.x if you require old browser support.\"\n );\n }\n function typedArraySupport() {\n try {\n const arr = new GlobalUint8Array(1);\n const proto = { foo: function() {\n return 42;\n } };\n Object.setPrototypeOf(proto, GlobalUint8Array.prototype);\n Object.setPrototypeOf(arr, proto);\n return arr.foo() === 42;\n } catch (e) {\n return false;\n }\n }\n Object.defineProperty(Buffer3.prototype, \"parent\", {\n enumerable: true,\n get: function() {\n if (!Buffer3.isBuffer(this)) return void 0;\n return this.buffer;\n }\n });\n Object.defineProperty(Buffer3.prototype, \"offset\", {\n enumerable: true,\n get: function() {\n if (!Buffer3.isBuffer(this)) return void 0;\n return this.byteOffset;\n }\n });\n function createBuffer(length) {\n if (length > K_MAX_LENGTH) {\n throw new RangeError('The value \"' + length + '\" is invalid for option \"size\"');\n }\n const buf = new GlobalUint8Array(length);\n Object.setPrototypeOf(buf, Buffer3.prototype);\n return buf;\n }\n function Buffer3(arg, encodingOrOffset, length) {\n if (typeof arg === \"number\") {\n if (typeof encodingOrOffset === \"string\") {\n throw new TypeError(\n 'The \"string\" argument must be of type string. Received type number'\n );\n }\n return allocUnsafe(arg);\n }\n return from(arg, encodingOrOffset, length);\n }\n Buffer3.poolSize = 8192;\n function from(value, encodingOrOffset, length) {\n if (typeof value === \"string\") {\n return fromString(value, encodingOrOffset);\n }\n if (GlobalArrayBuffer.isView(value)) {\n return fromArrayView(value);\n }\n if (value == null) {\n throw new TypeError(\n \"The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type \" + typeof value\n );\n }\n if (isInstance(value, GlobalArrayBuffer) || value && isInstance(value.buffer, GlobalArrayBuffer)) {\n return fromArrayBuffer(value, encodingOrOffset, length);\n }\n if (typeof GlobalSharedArrayBuffer !== \"undefined\" && (isInstance(value, GlobalSharedArrayBuffer) || value && isInstance(value.buffer, GlobalSharedArrayBuffer))) {\n return fromArrayBuffer(value, encodingOrOffset, length);\n }\n if (typeof value === \"number\") {\n throw new TypeError(\n 'The \"value\" argument must not be of type number. Received type number'\n );\n }\n const valueOf = value.valueOf && value.valueOf();\n if (valueOf != null && valueOf !== value) {\n return Buffer3.from(valueOf, encodingOrOffset, length);\n }\n const b = fromObject(value);\n if (b) return b;\n if (typeof Symbol !== \"undefined\" && Symbol.toPrimitive != null && typeof value[Symbol.toPrimitive] === \"function\") {\n return Buffer3.from(value[Symbol.toPrimitive](\"string\"), encodingOrOffset, length);\n }\n throw new TypeError(\n \"The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type \" + typeof value\n );\n }\n Buffer3.from = function(value, encodingOrOffset, length) {\n return from(value, encodingOrOffset, length);\n };\n Object.setPrototypeOf(Buffer3.prototype, GlobalUint8Array.prototype);\n Object.setPrototypeOf(Buffer3, GlobalUint8Array);\n function assertSize(size) {\n if (typeof size !== \"number\") {\n throw new TypeError('\"size\" argument must be of type number');\n } else if (size < 0) {\n throw new RangeError('The value \"' + size + '\" is invalid for option \"size\"');\n }\n }\n function alloc(size, fill, encoding) {\n assertSize(size);\n if (size <= 0) {\n return createBuffer(size);\n }\n if (fill !== void 0) {\n return typeof encoding === \"string\" ? createBuffer(size).fill(fill, encoding) : createBuffer(size).fill(fill);\n }\n return createBuffer(size);\n }\n Buffer3.alloc = function(size, fill, encoding) {\n return alloc(size, fill, encoding);\n };\n function allocUnsafe(size) {\n assertSize(size);\n return createBuffer(size < 0 ? 0 : checked(size) | 0);\n }\n Buffer3.allocUnsafe = function(size) {\n return allocUnsafe(size);\n };\n Buffer3.allocUnsafeSlow = function(size) {\n return allocUnsafe(size);\n };\n function fromString(string, encoding) {\n if (typeof encoding !== \"string\" || encoding === \"\") {\n encoding = \"utf8\";\n }\n if (!Buffer3.isEncoding(encoding)) {\n throw new TypeError(\"Unknown encoding: \" + encoding);\n }\n const length = byteLength2(string, encoding) | 0;\n let buf = createBuffer(length);\n const actual = buf.write(string, encoding);\n if (actual !== length) {\n buf = buf.slice(0, actual);\n }\n return buf;\n }\n function fromArrayLike(array) {\n const length = array.length < 0 ? 0 : checked(array.length) | 0;\n const buf = createBuffer(length);\n for (let i = 0; i < length; i += 1) {\n buf[i] = array[i] & 255;\n }\n return buf;\n }\n function fromArrayView(arrayView) {\n if (isInstance(arrayView, GlobalUint8Array)) {\n const copy = new GlobalUint8Array(arrayView);\n return fromArrayBuffer(copy.buffer, copy.byteOffset, copy.byteLength);\n }\n return fromArrayLike(arrayView);\n }\n function fromArrayBuffer(array, byteOffset, length) {\n if (byteOffset < 0 || array.byteLength < byteOffset) {\n throw new RangeError('\"offset\" is outside of buffer bounds');\n }\n if (array.byteLength < byteOffset + (length || 0)) {\n throw new RangeError('\"length\" is outside of buffer bounds');\n }\n let buf;\n if (byteOffset === void 0 && length === void 0) {\n buf = new GlobalUint8Array(array);\n } else if (length === void 0) {\n buf = new GlobalUint8Array(array, byteOffset);\n } else {\n buf = new GlobalUint8Array(array, byteOffset, length);\n }\n Object.setPrototypeOf(buf, Buffer3.prototype);\n return buf;\n }\n function fromObject(obj) {\n if (Buffer3.isBuffer(obj)) {\n const len = checked(obj.length) | 0;\n const buf = createBuffer(len);\n if (buf.length === 0) {\n return buf;\n }\n obj.copy(buf, 0, 0, len);\n return buf;\n }\n if (obj.length !== void 0) {\n if (typeof obj.length !== \"number\" || numberIsNaN(obj.length)) {\n return createBuffer(0);\n }\n return fromArrayLike(obj);\n }\n if (obj.type === \"Buffer\" && Array.isArray(obj.data)) {\n return fromArrayLike(obj.data);\n }\n }\n function checked(length) {\n if (length >= K_MAX_LENGTH) {\n throw new RangeError(\"Attempt to allocate Buffer larger than maximum size: 0x\" + K_MAX_LENGTH.toString(16) + \" bytes\");\n }\n return length | 0;\n }\n function SlowBuffer(length) {\n if (+length != length) {\n length = 0;\n }\n return Buffer3.alloc(+length);\n }\n Buffer3.isBuffer = function isBuffer2(b) {\n return b != null && b._isBuffer === true && b !== Buffer3.prototype;\n };\n Buffer3.compare = function compare(a, b) {\n if (isInstance(a, GlobalUint8Array)) a = Buffer3.from(a, a.offset, a.byteLength);\n if (isInstance(b, GlobalUint8Array)) b = Buffer3.from(b, b.offset, b.byteLength);\n if (!Buffer3.isBuffer(a) || !Buffer3.isBuffer(b)) {\n throw new TypeError(\n 'The \"buf1\", \"buf2\" arguments must be one of type Buffer or Uint8Array'\n );\n }\n if (a === b) return 0;\n let x = a.length;\n let y = b.length;\n for (let i = 0, len = Math.min(x, y); i < len; ++i) {\n if (a[i] !== b[i]) {\n x = a[i];\n y = b[i];\n break;\n }\n }\n if (x < y) return -1;\n if (y < x) return 1;\n return 0;\n };\n Buffer3.isEncoding = function isEncoding(encoding) {\n switch (String(encoding).toLowerCase()) {\n case \"hex\":\n case \"utf8\":\n case \"utf-8\":\n case \"ascii\":\n case \"latin1\":\n case \"binary\":\n case \"base64\":\n case \"ucs2\":\n case \"ucs-2\":\n case \"utf16le\":\n case \"utf-16le\":\n return true;\n default:\n return false;\n }\n };\n Buffer3.concat = function concat(list, length) {\n if (!Array.isArray(list)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers');\n }\n if (list.length === 0) {\n return Buffer3.alloc(0);\n }\n let i;\n if (length === void 0) {\n length = 0;\n for (i = 0; i < list.length; ++i) {\n length += list[i].length;\n }\n }\n const buffer2 = Buffer3.allocUnsafe(length);\n let pos = 0;\n for (i = 0; i < list.length; ++i) {\n let buf = list[i];\n if (isInstance(buf, GlobalUint8Array)) {\n if (pos + buf.length > buffer2.length) {\n if (!Buffer3.isBuffer(buf)) buf = Buffer3.from(buf);\n buf.copy(buffer2, pos);\n } else {\n GlobalUint8Array.prototype.set.call(\n buffer2,\n buf,\n pos\n );\n }\n } else if (!Buffer3.isBuffer(buf)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers');\n } else {\n buf.copy(buffer2, pos);\n }\n pos += buf.length;\n }\n return buffer2;\n };\n function byteLength2(string, encoding) {\n if (Buffer3.isBuffer(string)) {\n return string.length;\n }\n if (GlobalArrayBuffer.isView(string) || isInstance(string, GlobalArrayBuffer)) {\n return string.byteLength;\n }\n if (typeof string !== \"string\") {\n throw new TypeError(\n 'The \"string\" argument must be one of type string, Buffer, or ArrayBuffer. Received type ' + typeof string\n );\n }\n const len = string.length;\n const mustMatch = arguments.length > 2 && arguments[2] === true;\n if (!mustMatch && len === 0) return 0;\n let loweredCase = false;\n for (; ; ) {\n switch (encoding) {\n case \"ascii\":\n case \"latin1\":\n case \"binary\":\n return len;\n case \"utf8\":\n case \"utf-8\":\n return utf8ToBytes(string).length;\n case \"ucs2\":\n case \"ucs-2\":\n case \"utf16le\":\n case \"utf-16le\":\n return len * 2;\n case \"hex\":\n return len >>> 1;\n case \"base64\":\n return base64ToBytes(string).length;\n default:\n if (loweredCase) {\n return mustMatch ? -1 : utf8ToBytes(string).length;\n }\n encoding = (\"\" + encoding).toLowerCase();\n loweredCase = true;\n }\n }\n }\n Buffer3.byteLength = byteLength2;\n function slowToString(encoding, start, end) {\n let loweredCase = false;\n if (start === void 0 || start < 0) {\n start = 0;\n }\n if (start > this.length) {\n return \"\";\n }\n if (end === void 0 || end > this.length) {\n end = this.length;\n }\n if (end <= 0) {\n return \"\";\n }\n end >>>= 0;\n start >>>= 0;\n if (end <= start) {\n return \"\";\n }\n if (!encoding) encoding = \"utf8\";\n while (true) {\n switch (encoding) {\n case \"hex\":\n return hexSlice(this, start, end);\n case \"utf8\":\n case \"utf-8\":\n return utf8Slice(this, start, end);\n case \"ascii\":\n return asciiSlice(this, start, end);\n case \"latin1\":\n case \"binary\":\n return latin1Slice(this, start, end);\n case \"base64\":\n return base64Slice(this, start, end);\n case \"ucs2\":\n case \"ucs-2\":\n case \"utf16le\":\n case \"utf-16le\":\n return utf16leSlice(this, start, end);\n default:\n if (loweredCase) throw new TypeError(\"Unknown encoding: \" + encoding);\n encoding = (encoding + \"\").toLowerCase();\n loweredCase = true;\n }\n }\n }\n Buffer3.prototype._isBuffer = true;\n function swap(b, n, m) {\n const i = b[n];\n b[n] = b[m];\n b[m] = i;\n }\n Buffer3.prototype.swap16 = function swap16() {\n const len = this.length;\n if (len % 2 !== 0) {\n throw new RangeError(\"Buffer size must be a multiple of 16-bits\");\n }\n for (let i = 0; i < len; i += 2) {\n swap(this, i, i + 1);\n }\n return this;\n };\n Buffer3.prototype.swap32 = function swap32() {\n const len = this.length;\n if (len % 4 !== 0) {\n throw new RangeError(\"Buffer size must be a multiple of 32-bits\");\n }\n for (let i = 0; i < len; i += 4) {\n swap(this, i, i + 3);\n swap(this, i + 1, i + 2);\n }\n return this;\n };\n Buffer3.prototype.swap64 = function swap64() {\n const len = this.length;\n if (len % 8 !== 0) {\n throw new RangeError(\"Buffer size must be a multiple of 64-bits\");\n }\n for (let i = 0; i < len; i += 8) {\n swap(this, i, i + 7);\n swap(this, i + 1, i + 6);\n swap(this, i + 2, i + 5);\n swap(this, i + 3, i + 4);\n }\n return this;\n };\n Buffer3.prototype.toString = function toString3() {\n const length = this.length;\n if (length === 0) return \"\";\n if (arguments.length === 0) return utf8Slice(this, 0, length);\n return slowToString.apply(this, arguments);\n };\n Buffer3.prototype.toLocaleString = Buffer3.prototype.toString;\n Buffer3.prototype.equals = function equals(b) {\n if (!Buffer3.isBuffer(b)) throw new TypeError(\"Argument must be a Buffer\");\n if (this === b) return true;\n return Buffer3.compare(this, b) === 0;\n };\n Buffer3.prototype.inspect = function inspect() {\n let str = \"\";\n const max = exports.INSPECT_MAX_BYTES;\n str = this.toString(\"hex\", 0, max).replace(/(.{2})/g, \"$1 \").trim();\n if (this.length > max) str += \" ... \";\n return \"<Buffer \" + str + \">\";\n };\n if (customInspectSymbol) {\n Buffer3.prototype[customInspectSymbol] = Buffer3.prototype.inspect;\n }\n Buffer3.prototype.compare = function compare(target, start, end, thisStart, thisEnd) {\n if (isInstance(target, GlobalUint8Array)) {\n target = Buffer3.from(target, target.offset, target.byteLength);\n }\n if (!Buffer3.isBuffer(target)) {\n throw new TypeError(\n 'The \"target\" argument must be one of type Buffer or Uint8Array. Received type ' + typeof target\n );\n }\n if (start === void 0) {\n start = 0;\n }\n if (end === void 0) {\n end = target ? target.length : 0;\n }\n if (thisStart === void 0) {\n thisStart = 0;\n }\n if (thisEnd === void 0) {\n thisEnd = this.length;\n }\n if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n throw new RangeError(\"out of range index\");\n }\n if (thisStart >= thisEnd && start >= end) {\n return 0;\n }\n if (thisStart >= thisEnd) {\n return -1;\n }\n if (start >= end) {\n return 1;\n }\n start >>>= 0;\n end >>>= 0;\n thisStart >>>= 0;\n thisEnd >>>= 0;\n if (this === target) return 0;\n let x = thisEnd - thisStart;\n let y = end - start;\n const len = Math.min(x, y);\n const thisCopy = this.slice(thisStart, thisEnd);\n const targetCopy = target.slice(start, end);\n for (let i = 0; i < len; ++i) {\n if (thisCopy[i] !== targetCopy[i]) {\n x = thisCopy[i];\n y = targetCopy[i];\n break;\n }\n }\n if (x < y) return -1;\n if (y < x) return 1;\n return 0;\n };\n function bidirectionalIndexOf(buffer2, val, byteOffset, encoding, dir) {\n if (buffer2.length === 0) return -1;\n if (typeof byteOffset === \"string\") {\n encoding = byteOffset;\n byteOffset = 0;\n } else if (byteOffset > 2147483647) {\n byteOffset = 2147483647;\n } else if (byteOffset < -2147483648) {\n byteOffset = -2147483648;\n }\n byteOffset = +byteOffset;\n if (numberIsNaN(byteOffset)) {\n byteOffset = dir ? 0 : buffer2.length - 1;\n }\n if (byteOffset < 0) byteOffset = buffer2.length + byteOffset;\n if (byteOffset >= buffer2.length) {\n if (dir) return -1;\n else byteOffset = buffer2.length - 1;\n } else if (byteOffset < 0) {\n if (dir) byteOffset = 0;\n else return -1;\n }\n if (typeof val === \"string\") {\n val = Buffer3.from(val, encoding);\n }\n if (Buffer3.isBuffer(val)) {\n if (val.length === 0) {\n return -1;\n }\n return arrayIndexOf(buffer2, val, byteOffset, encoding, dir);\n } else if (typeof val === \"number\") {\n val = val & 255;\n if (typeof GlobalUint8Array.prototype.indexOf === \"function\") {\n if (dir) {\n return GlobalUint8Array.prototype.indexOf.call(buffer2, val, byteOffset);\n } else {\n return GlobalUint8Array.prototype.lastIndexOf.call(buffer2, val, byteOffset);\n }\n }\n return arrayIndexOf(buffer2, [val], byteOffset, encoding, dir);\n }\n throw new TypeError(\"val must be string, number or Buffer\");\n }\n function arrayIndexOf(arr, val, byteOffset, encoding, dir) {\n let indexSize = 1;\n let arrLength = arr.length;\n let valLength = val.length;\n if (encoding !== void 0) {\n encoding = String(encoding).toLowerCase();\n if (encoding === \"ucs2\" || encoding === \"ucs-2\" || encoding === \"utf16le\" || encoding === \"utf-16le\") {\n if (arr.length < 2 || val.length < 2) {\n return -1;\n }\n indexSize = 2;\n arrLength /= 2;\n valLength /= 2;\n byteOffset /= 2;\n }\n }\n function read(buf, i2) {\n if (indexSize === 1) {\n return buf[i2];\n } else {\n return buf.readUInt16BE(i2 * indexSize);\n }\n }\n let i;\n if (dir) {\n let foundIndex = -1;\n for (i = byteOffset; i < arrLength; i++) {\n if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n if (foundIndex === -1) foundIndex = i;\n if (i - foundIndex + 1 === valLength) return foundIndex * indexSize;\n } else {\n if (foundIndex !== -1) i -= i - foundIndex;\n foundIndex = -1;\n }\n }\n } else {\n if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength;\n for (i = byteOffset; i >= 0; i--) {\n let found = true;\n for (let j = 0; j < valLength; j++) {\n if (read(arr, i + j) !== read(val, j)) {\n found = false;\n break;\n }\n }\n if (found) return i;\n }\n }\n return -1;\n }\n Buffer3.prototype.includes = function includes(val, byteOffset, encoding) {\n return this.indexOf(val, byteOffset, encoding) !== -1;\n };\n Buffer3.prototype.indexOf = function indexOf(val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, true);\n };\n Buffer3.prototype.lastIndexOf = function lastIndexOf(val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, false);\n };\n function hexWrite(buf, string, offset, length) {\n offset = Number(offset) || 0;\n const remaining = buf.length - offset;\n if (!length) {\n length = remaining;\n } else {\n length = Number(length);\n if (length > remaining) {\n length = remaining;\n }\n }\n const strLen = string.length;\n if (length > strLen / 2) {\n length = strLen / 2;\n }\n let i;\n for (i = 0; i < length; ++i) {\n const parsed = parseInt(string.substr(i * 2, 2), 16);\n if (numberIsNaN(parsed)) return i;\n buf[offset + i] = parsed;\n }\n return i;\n }\n function utf8Write(buf, string, offset, length) {\n return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length);\n }\n function asciiWrite(buf, string, offset, length) {\n return blitBuffer(asciiToBytes(string), buf, offset, length);\n }\n function base64Write(buf, string, offset, length) {\n return blitBuffer(base64ToBytes(string), buf, offset, length);\n }\n function ucs2Write(buf, string, offset, length) {\n return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length);\n }\n Buffer3.prototype.write = function write(string, offset, length, encoding) {\n if (offset === void 0) {\n encoding = \"utf8\";\n length = this.length;\n offset = 0;\n } else if (length === void 0 && typeof offset === \"string\") {\n encoding = offset;\n length = this.length;\n offset = 0;\n } else if (isFinite(offset)) {\n offset = offset >>> 0;\n if (isFinite(length)) {\n length = length >>> 0;\n if (encoding === void 0) encoding = \"utf8\";\n } else {\n encoding = length;\n length = void 0;\n }\n } else {\n throw new Error(\n \"Buffer.write(string, encoding, offset[, length]) is no longer supported\"\n );\n }\n const remaining = this.length - offset;\n if (length === void 0 || length > remaining) length = remaining;\n if (string.length > 0 && (length < 0 || offset < 0) || offset > this.length) {\n throw new RangeError(\"Attempt to write outside buffer bounds\");\n }\n if (!encoding) encoding = \"utf8\";\n let loweredCase = false;\n for (; ; ) {\n switch (encoding) {\n case \"hex\":\n return hexWrite(this, string, offset, length);\n case \"utf8\":\n case \"utf-8\":\n return utf8Write(this, string, offset, length);\n case \"ascii\":\n case \"latin1\":\n case \"binary\":\n return asciiWrite(this, string, offset, length);\n case \"base64\":\n return base64Write(this, string, offset, length);\n case \"ucs2\":\n case \"ucs-2\":\n case \"utf16le\":\n case \"utf-16le\":\n return ucs2Write(this, string, offset, length);\n default:\n if (loweredCase) throw new TypeError(\"Unknown encoding: \" + encoding);\n encoding = (\"\" + encoding).toLowerCase();\n loweredCase = true;\n }\n }\n };\n Buffer3.prototype.toJSON = function toJSON2() {\n return {\n type: \"Buffer\",\n data: Array.prototype.slice.call(this._arr || this, 0)\n };\n };\n function base64Slice(buf, start, end) {\n if (start === 0 && end === buf.length) {\n return base64.fromByteArray(buf);\n } else {\n return base64.fromByteArray(buf.slice(start, end));\n }\n }\n function utf8Slice(buf, start, end) {\n end = Math.min(buf.length, end);\n const res = [];\n let i = start;\n while (i < end) {\n const firstByte = buf[i];\n let codePoint = null;\n let bytesPerSequence = firstByte > 239 ? 4 : firstByte > 223 ? 3 : firstByte > 191 ? 2 : 1;\n if (i + bytesPerSequence <= end) {\n let secondByte, thirdByte, fourthByte, tempCodePoint;\n switch (bytesPerSequence) {\n case 1:\n if (firstByte < 128) {\n codePoint = firstByte;\n }\n break;\n case 2:\n secondByte = buf[i + 1];\n if ((secondByte & 192) === 128) {\n tempCodePoint = (firstByte & 31) << 6 | secondByte & 63;\n if (tempCodePoint > 127) {\n codePoint = tempCodePoint;\n }\n }\n break;\n case 3:\n secondByte = buf[i + 1];\n thirdByte = buf[i + 2];\n if ((secondByte & 192) === 128 && (thirdByte & 192) === 128) {\n tempCodePoint = (firstByte & 15) << 12 | (secondByte & 63) << 6 | thirdByte & 63;\n if (tempCodePoint > 2047 && (tempCodePoint < 55296 || tempCodePoint > 57343)) {\n codePoint = tempCodePoint;\n }\n }\n break;\n case 4:\n secondByte = buf[i + 1];\n thirdByte = buf[i + 2];\n fourthByte = buf[i + 3];\n if ((secondByte & 192) === 128 && (thirdByte & 192) === 128 && (fourthByte & 192) === 128) {\n tempCodePoint = (firstByte & 15) << 18 | (secondByte & 63) << 12 | (thirdByte & 63) << 6 | fourthByte & 63;\n if (tempCodePoint > 65535 && tempCodePoint < 1114112) {\n codePoint = tempCodePoint;\n }\n }\n }\n }\n if (codePoint === null) {\n codePoint = 65533;\n bytesPerSequence = 1;\n } else if (codePoint > 65535) {\n codePoint -= 65536;\n res.push(codePoint >>> 10 & 1023 | 55296);\n codePoint = 56320 | codePoint & 1023;\n }\n res.push(codePoint);\n i += bytesPerSequence;\n }\n return decodeCodePointsArray(res);\n }\n const MAX_ARGUMENTS_LENGTH = 4096;\n function decodeCodePointsArray(codePoints) {\n const len = codePoints.length;\n if (len <= MAX_ARGUMENTS_LENGTH) {\n return String.fromCharCode.apply(String, codePoints);\n }\n let res = \"\";\n let i = 0;\n while (i < len) {\n res += String.fromCharCode.apply(\n String,\n codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n );\n }\n return res;\n }\n function asciiSlice(buf, start, end) {\n let ret = \"\";\n end = Math.min(buf.length, end);\n for (let i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i] & 127);\n }\n return ret;\n }\n function latin1Slice(buf, start, end) {\n let ret = \"\";\n end = Math.min(buf.length, end);\n for (let i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i]);\n }\n return ret;\n }\n function hexSlice(buf, start, end) {\n const len = buf.length;\n if (!start || start < 0) start = 0;\n if (!end || end < 0 || end > len) end = len;\n let out = \"\";\n for (let i = start; i < end; ++i) {\n out += hexSliceLookupTable[buf[i]];\n }\n return out;\n }\n function utf16leSlice(buf, start, end) {\n const bytes = buf.slice(start, end);\n let res = \"\";\n for (let i = 0; i < bytes.length - 1; i += 2) {\n res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256);\n }\n return res;\n }\n Buffer3.prototype.slice = function slice(start, end) {\n const len = this.length;\n start = ~~start;\n end = end === void 0 ? len : ~~end;\n if (start < 0) {\n start += len;\n if (start < 0) start = 0;\n } else if (start > len) {\n start = len;\n }\n if (end < 0) {\n end += len;\n if (end < 0) end = 0;\n } else if (end > len) {\n end = len;\n }\n if (end < start) end = start;\n const newBuf = this.subarray(start, end);\n Object.setPrototypeOf(newBuf, Buffer3.prototype);\n return newBuf;\n };\n function checkOffset(offset, ext, length) {\n if (offset % 1 !== 0 || offset < 0) throw new RangeError(\"offset is not uint\");\n if (offset + ext > length) throw new RangeError(\"Trying to access beyond buffer length\");\n }\n Buffer3.prototype.readUintLE = Buffer3.prototype.readUIntLE = function readUIntLE(offset, byteLength3, noAssert) {\n offset = offset >>> 0;\n byteLength3 = byteLength3 >>> 0;\n if (!noAssert) checkOffset(offset, byteLength3, this.length);\n let val = this[offset];\n let mul = 1;\n let i = 0;\n while (++i < byteLength3 && (mul *= 256)) {\n val += this[offset + i] * mul;\n }\n return val;\n };\n Buffer3.prototype.readUintBE = Buffer3.prototype.readUIntBE = function readUIntBE(offset, byteLength3, noAssert) {\n offset = offset >>> 0;\n byteLength3 = byteLength3 >>> 0;\n if (!noAssert) {\n checkOffset(offset, byteLength3, this.length);\n }\n let val = this[offset + --byteLength3];\n let mul = 1;\n while (byteLength3 > 0 && (mul *= 256)) {\n val += this[offset + --byteLength3] * mul;\n }\n return val;\n };\n Buffer3.prototype.readUint8 = Buffer3.prototype.readUInt8 = function readUInt8(offset, noAssert) {\n offset = offset >>> 0;\n if (!noAssert) checkOffset(offset, 1, this.length);\n return this[offset];\n };\n Buffer3.prototype.readUint16LE = Buffer3.prototype.readUInt16LE = function readUInt16LE(offset, noAssert) {\n offset = offset >>> 0;\n if (!noAssert) checkOffset(offset, 2, this.length);\n return this[offset] | this[offset + 1] << 8;\n };\n Buffer3.prototype.readUint16BE = Buffer3.prototype.readUInt16BE = function readUInt16BE(offset, noAssert) {\n offset = offset >>> 0;\n if (!noAssert) checkOffset(offset, 2, this.length);\n return this[offset] << 8 | this[offset + 1];\n };\n Buffer3.prototype.readUint32LE = Buffer3.prototype.readUInt32LE = function readUInt32LE(offset, noAssert) {\n offset = offset >>> 0;\n if (!noAssert) checkOffset(offset, 4, this.length);\n return (this[offset] | this[offset + 1] << 8 | this[offset + 2] << 16) + this[offset + 3] * 16777216;\n };\n Buffer3.prototype.readUint32BE = Buffer3.prototype.readUInt32BE = function readUInt32BE(offset, noAssert) {\n offset = offset >>> 0;\n if (!noAssert) checkOffset(offset, 4, this.length);\n return this[offset] * 16777216 + (this[offset + 1] << 16 | this[offset + 2] << 8 | this[offset + 3]);\n };\n Buffer3.prototype.readBigUInt64LE = defineBigIntMethod(function readBigUInt64LE(offset) {\n offset = offset >>> 0;\n validateNumber(offset, \"offset\");\n const first = this[offset];\n const last = this[offset + 7];\n if (first === void 0 || last === void 0) {\n boundsError(offset, this.length - 8);\n }\n const lo = first + this[++offset] * 2 ** 8 + this[++offset] * 2 ** 16 + this[++offset] * 2 ** 24;\n const hi = this[++offset] + this[++offset] * 2 ** 8 + this[++offset] * 2 ** 16 + last * 2 ** 24;\n return BigInt(lo) + (BigInt(hi) << BigInt(32));\n });\n Buffer3.prototype.readBigUInt64BE = defineBigIntMethod(function readBigUInt64BE(offset) {\n offset = offset >>> 0;\n validateNumber(offset, \"offset\");\n const first = this[offset];\n const last = this[offset + 7];\n if (first === void 0 || last === void 0) {\n boundsError(offset, this.length - 8);\n }\n const hi = first * 2 ** 24 + this[++offset] * 2 ** 16 + this[++offset] * 2 ** 8 + this[++offset];\n const lo = this[++offset] * 2 ** 24 + this[++offset] * 2 ** 16 + this[++offset] * 2 ** 8 + last;\n return (BigInt(hi) << BigInt(32)) + BigInt(lo);\n });\n Buffer3.prototype.readIntLE = function readIntLE(offset, byteLength3, noAssert) {\n offset = offset >>> 0;\n byteLength3 = byteLength3 >>> 0;\n if (!noAssert) checkOffset(offset, byteLength3, this.length);\n let val = this[offset];\n let mul = 1;\n let i = 0;\n while (++i < byteLength3 && (mul *= 256)) {\n val += this[offset + i] * mul;\n }\n mul *= 128;\n if (val >= mul) val -= Math.pow(2, 8 * byteLength3);\n return val;\n };\n Buffer3.prototype.readIntBE = function readIntBE(offset, byteLength3, noAssert) {\n offset = offset >>> 0;\n byteLength3 = byteLength3 >>> 0;\n if (!noAssert) checkOffset(offset, byteLength3, this.length);\n let i = byteLength3;\n let mul = 1;\n let val = this[offset + --i];\n while (i > 0 && (mul *= 256)) {\n val += this[offset + --i] * mul;\n }\n mul *= 128;\n if (val >= mul) val -= Math.pow(2, 8 * byteLength3);\n return val;\n };\n Buffer3.prototype.readInt8 = function readInt8(offset, noAssert) {\n offset = offset >>> 0;\n if (!noAssert) checkOffset(offset, 1, this.length);\n if (!(this[offset] & 128)) return this[offset];\n return (255 - this[offset] + 1) * -1;\n };\n Buffer3.prototype.readInt16LE = function readInt16LE(offset, noAssert) {\n offset = offset >>> 0;\n if (!noAssert) checkOffset(offset, 2, this.length);\n const val = this[offset] | this[offset + 1] << 8;\n return val & 32768 ? val | 4294901760 : val;\n };\n Buffer3.prototype.readInt16BE = function readInt16BE(offset, noAssert) {\n offset = offset >>> 0;\n if (!noAssert) checkOffset(offset, 2, this.length);\n const val = this[offset + 1] | this[offset] << 8;\n return val & 32768 ? val | 4294901760 : val;\n };\n Buffer3.prototype.readInt32LE = function readInt32LE(offset, noAssert) {\n offset = offset >>> 0;\n if (!noAssert) checkOffset(offset, 4, this.length);\n return this[offset] | this[offset + 1] << 8 | this[offset + 2] << 16 | this[offset + 3] << 24;\n };\n Buffer3.prototype.readInt32BE = function readInt32BE(offset, noAssert) {\n offset = offset >>> 0;\n if (!noAssert) checkOffset(offset, 4, this.length);\n return this[offset] << 24 | this[offset + 1] << 16 | this[offset + 2] << 8 | this[offset + 3];\n };\n Buffer3.prototype.readBigInt64LE = defineBigIntMethod(function readBigInt64LE(offset) {\n offset = offset >>> 0;\n validateNumber(offset, \"offset\");\n const first = this[offset];\n const last = this[offset + 7];\n if (first === void 0 || last === void 0) {\n boundsError(offset, this.length - 8);\n }\n const val = this[offset + 4] + this[offset + 5] * 2 ** 8 + this[offset + 6] * 2 ** 16 + (last << 24);\n return (BigInt(val) << BigInt(32)) + BigInt(first + this[++offset] * 2 ** 8 + this[++offset] * 2 ** 16 + this[++offset] * 2 ** 24);\n });\n Buffer3.prototype.readBigInt64BE = defineBigIntMethod(function readBigInt64BE(offset) {\n offset = offset >>> 0;\n validateNumber(offset, \"offset\");\n const first = this[offset];\n const last = this[offset + 7];\n if (first === void 0 || last === void 0) {\n boundsError(offset, this.length - 8);\n }\n const val = (first << 24) + // Overflow\n this[++offset] * 2 ** 16 + this[++offset] * 2 ** 8 + this[++offset];\n return (BigInt(val) << BigInt(32)) + BigInt(this[++offset] * 2 ** 24 + this[++offset] * 2 ** 16 + this[++offset] * 2 ** 8 + last);\n });\n Buffer3.prototype.readFloatLE = function readFloatLE(offset, noAssert) {\n offset = offset >>> 0;\n if (!noAssert) checkOffset(offset, 4, this.length);\n return ieee754$1$1.read(this, offset, true, 23, 4);\n };\n Buffer3.prototype.readFloatBE = function readFloatBE(offset, noAssert) {\n offset = offset >>> 0;\n if (!noAssert) checkOffset(offset, 4, this.length);\n return ieee754$1$1.read(this, offset, false, 23, 4);\n };\n Buffer3.prototype.readDoubleLE = function readDoubleLE(offset, noAssert) {\n offset = offset >>> 0;\n if (!noAssert) checkOffset(offset, 8, this.length);\n return ieee754$1$1.read(this, offset, true, 52, 8);\n };\n Buffer3.prototype.readDoubleBE = function readDoubleBE(offset, noAssert) {\n offset = offset >>> 0;\n if (!noAssert) checkOffset(offset, 8, this.length);\n return ieee754$1$1.read(this, offset, false, 52, 8);\n };\n function checkInt(buf, value, offset, ext, max, min) {\n if (!Buffer3.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance');\n if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds');\n if (offset + ext > buf.length) throw new RangeError(\"Index out of range\");\n }\n Buffer3.prototype.writeUintLE = Buffer3.prototype.writeUIntLE = function writeUIntLE(value, offset, byteLength3, noAssert) {\n value = +value;\n offset = offset >>> 0;\n byteLength3 = byteLength3 >>> 0;\n if (!noAssert) {\n const maxBytes = Math.pow(2, 8 * byteLength3) - 1;\n checkInt(this, value, offset, byteLength3, maxBytes, 0);\n }\n let mul = 1;\n let i = 0;\n this[offset] = value & 255;\n while (++i < byteLength3 && (mul *= 256)) {\n this[offset + i] = value / mul & 255;\n }\n return offset + byteLength3;\n };\n Buffer3.prototype.writeUintBE = Buffer3.prototype.writeUIntBE = function writeUIntBE(value, offset, byteLength3, noAssert) {\n value = +value;\n offset = offset >>> 0;\n byteLength3 = byteLength3 >>> 0;\n if (!noAssert) {\n const maxBytes = Math.pow(2, 8 * byteLength3) - 1;\n checkInt(this, value, offset, byteLength3, maxBytes, 0);\n }\n let i = byteLength3 - 1;\n let mul = 1;\n this[offset + i] = value & 255;\n while (--i >= 0 && (mul *= 256)) {\n this[offset + i] = value / mul & 255;\n }\n return offset + byteLength3;\n };\n Buffer3.prototype.writeUint8 = Buffer3.prototype.writeUInt8 = function writeUInt8(value, offset, noAssert) {\n value = +value;\n offset = offset >>> 0;\n if (!noAssert) checkInt(this, value, offset, 1, 255, 0);\n this[offset] = value & 255;\n return offset + 1;\n };\n Buffer3.prototype.writeUint16LE = Buffer3.prototype.writeUInt16LE = function writeUInt16LE(value, offset, noAssert) {\n value = +value;\n offset = offset >>> 0;\n if (!noAssert) checkInt(this, value, offset, 2, 65535, 0);\n this[offset] = value & 255;\n this[offset + 1] = value >>> 8;\n return offset + 2;\n };\n Buffer3.prototype.writeUint16BE = Buffer3.prototype.writeUInt16BE = function writeUInt16BE(value, offset, noAssert) {\n value = +value;\n offset = offset >>> 0;\n if (!noAssert) checkInt(this, value, offset, 2, 65535, 0);\n this[offset] = value >>> 8;\n this[offset + 1] = value & 255;\n return offset + 2;\n };\n Buffer3.prototype.writeUint32LE = Buffer3.prototype.writeUInt32LE = function writeUInt32LE(value, offset, noAssert) {\n value = +value;\n offset = offset >>> 0;\n if (!noAssert) checkInt(this, value, offset, 4, 4294967295, 0);\n this[offset + 3] = value >>> 24;\n this[offset + 2] = value >>> 16;\n this[offset + 1] = value >>> 8;\n this[offset] = value & 255;\n return offset + 4;\n };\n Buffer3.prototype.writeUint32BE = Buffer3.prototype.writeUInt32BE = function writeUInt32BE(value, offset, noAssert) {\n value = +value;\n offset = offset >>> 0;\n if (!noAssert) checkInt(this, value, offset, 4, 4294967295, 0);\n this[offset] = value >>> 24;\n this[offset + 1] = value >>> 16;\n this[offset + 2] = value >>> 8;\n this[offset + 3] = value & 255;\n return offset + 4;\n };\n function wrtBigUInt64LE(buf, value, offset, min, max) {\n checkIntBI(value, min, max, buf, offset, 7);\n let lo = Number(value & BigInt(4294967295));\n buf[offset++] = lo;\n lo = lo >> 8;\n buf[offset++] = lo;\n lo = lo >> 8;\n buf[offset++] = lo;\n lo = lo >> 8;\n buf[offset++] = lo;\n let hi = Number(value >> BigInt(32) & BigInt(4294967295));\n buf[offset++] = hi;\n hi = hi >> 8;\n buf[offset++] = hi;\n hi = hi >> 8;\n buf[offset++] = hi;\n hi = hi >> 8;\n buf[offset++] = hi;\n return offset;\n }\n function wrtBigUInt64BE(buf, value, offset, min, max) {\n checkIntBI(value, min, max, buf, offset, 7);\n let lo = Number(value & BigInt(4294967295));\n buf[offset + 7] = lo;\n lo = lo >> 8;\n buf[offset + 6] = lo;\n lo = lo >> 8;\n buf[offset + 5] = lo;\n lo = lo >> 8;\n buf[offset + 4] = lo;\n let hi = Number(value >> BigInt(32) & BigInt(4294967295));\n buf[offset + 3] = hi;\n hi = hi >> 8;\n buf[offset + 2] = hi;\n hi = hi >> 8;\n buf[offset + 1] = hi;\n hi = hi >> 8;\n buf[offset] = hi;\n return offset + 8;\n }\n Buffer3.prototype.writeBigUInt64LE = defineBigIntMethod(function writeBigUInt64LE(value, offset = 0) {\n return wrtBigUInt64LE(this, value, offset, BigInt(0), BigInt(\"0xffffffffffffffff\"));\n });\n Buffer3.prototype.writeBigUInt64BE = defineBigIntMethod(function writeBigUInt64BE(value, offset = 0) {\n return wrtBigUInt64BE(this, value, offset, BigInt(0), BigInt(\"0xffffffffffffffff\"));\n });\n Buffer3.prototype.writeIntLE = function writeIntLE(value, offset, byteLength3, noAssert) {\n value = +value;\n offset = offset >>> 0;\n if (!noAssert) {\n const limit = Math.pow(2, 8 * byteLength3 - 1);\n checkInt(this, value, offset, byteLength3, limit - 1, -limit);\n }\n let i = 0;\n let mul = 1;\n let sub = 0;\n this[offset] = value & 255;\n while (++i < byteLength3 && (mul *= 256)) {\n if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n sub = 1;\n }\n this[offset + i] = (value / mul >> 0) - sub & 255;\n }\n return offset + byteLength3;\n };\n Buffer3.prototype.writeIntBE = function writeIntBE(value, offset, byteLength3, noAssert) {\n value = +value;\n offset = offset >>> 0;\n if (!noAssert) {\n const limit = Math.pow(2, 8 * byteLength3 - 1);\n checkInt(this, value, offset, byteLength3, limit - 1, -limit);\n }\n let i = byteLength3 - 1;\n let mul = 1;\n let sub = 0;\n this[offset + i] = value & 255;\n while (--i >= 0 && (mul *= 256)) {\n if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n sub = 1;\n }\n this[offset + i] = (value / mul >> 0) - sub & 255;\n }\n return offset + byteLength3;\n };\n Buffer3.prototype.writeInt8 = function writeInt8(value, offset, noAssert) {\n value = +value;\n offset = offset >>> 0;\n if (!noAssert) checkInt(this, value, offset, 1, 127, -128);\n if (value < 0) value = 255 + value + 1;\n this[offset] = value & 255;\n return offset + 1;\n };\n Buffer3.prototype.writeInt16LE = function writeInt16LE(value, offset, noAssert) {\n value = +value;\n offset = offset >>> 0;\n if (!noAssert) checkInt(this, value, offset, 2, 32767, -32768);\n this[offset] = value & 255;\n this[offset + 1] = value >>> 8;\n return offset + 2;\n };\n Buffer3.prototype.writeInt16BE = function writeInt16BE(value, offset, noAssert) {\n value = +value;\n offset = offset >>> 0;\n if (!noAssert) checkInt(this, value, offset, 2, 32767, -32768);\n this[offset] = value >>> 8;\n this[offset + 1] = value & 255;\n return offset + 2;\n };\n Buffer3.prototype.writeInt32LE = function writeInt32LE(value, offset, noAssert) {\n value = +value;\n offset = offset >>> 0;\n if (!noAssert) checkInt(this, value, offset, 4, 2147483647, -2147483648);\n this[offset] = value & 255;\n this[offset + 1] = value >>> 8;\n this[offset + 2] = value >>> 16;\n this[offset + 3] = value >>> 24;\n return offset + 4;\n };\n Buffer3.prototype.writeInt32BE = function writeInt32BE(value, offset, noAssert) {\n value = +value;\n offset = offset >>> 0;\n if (!noAssert) checkInt(this, value, offset, 4, 2147483647, -2147483648);\n if (value < 0) value = 4294967295 + value + 1;\n this[offset] = value >>> 24;\n this[offset + 1] = value >>> 16;\n this[offset + 2] = value >>> 8;\n this[offset + 3] = value & 255;\n return offset + 4;\n };\n Buffer3.prototype.writeBigInt64LE = defineBigIntMethod(function writeBigInt64LE(value, offset = 0) {\n return wrtBigUInt64LE(this, value, offset, -BigInt(\"0x8000000000000000\"), BigInt(\"0x7fffffffffffffff\"));\n });\n Buffer3.prototype.writeBigInt64BE = defineBigIntMethod(function writeBigInt64BE(value, offset = 0) {\n return wrtBigUInt64BE(this, value, offset, -BigInt(\"0x8000000000000000\"), BigInt(\"0x7fffffffffffffff\"));\n });\n function checkIEEE754(buf, value, offset, ext, max, min) {\n if (offset + ext > buf.length) throw new RangeError(\"Index out of range\");\n if (offset < 0) throw new RangeError(\"Index out of range\");\n }\n function writeFloat(buf, value, offset, littleEndian, noAssert) {\n value = +value;\n offset = offset >>> 0;\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 4);\n }\n ieee754$1$1.write(buf, value, offset, littleEndian, 23, 4);\n return offset + 4;\n }\n Buffer3.prototype.writeFloatLE = function writeFloatLE(value, offset, noAssert) {\n return writeFloat(this, value, offset, true, noAssert);\n };\n Buffer3.prototype.writeFloatBE = function writeFloatBE(value, offset, noAssert) {\n return writeFloat(this, value, offset, false, noAssert);\n };\n function writeDouble(buf, value, offset, littleEndian, noAssert) {\n value = +value;\n offset = offset >>> 0;\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 8);\n }\n ieee754$1$1.write(buf, value, offset, littleEndian, 52, 8);\n return offset + 8;\n }\n Buffer3.prototype.writeDoubleLE = function writeDoubleLE(value, offset, noAssert) {\n return writeDouble(this, value, offset, true, noAssert);\n };\n Buffer3.prototype.writeDoubleBE = function writeDoubleBE(value, offset, noAssert) {\n return writeDouble(this, value, offset, false, noAssert);\n };\n Buffer3.prototype.copy = function copy(target, targetStart, start, end) {\n if (!Buffer3.isBuffer(target)) throw new TypeError(\"argument should be a Buffer\");\n if (!start) start = 0;\n if (!end && end !== 0) end = this.length;\n if (targetStart >= target.length) targetStart = target.length;\n if (!targetStart) targetStart = 0;\n if (end > 0 && end < start) end = start;\n if (end === start) return 0;\n if (target.length === 0 || this.length === 0) return 0;\n if (targetStart < 0) {\n throw new RangeError(\"targetStart out of bounds\");\n }\n if (start < 0 || start >= this.length) throw new RangeError(\"Index out of range\");\n if (end < 0) throw new RangeError(\"sourceEnd out of bounds\");\n if (end > this.length) end = this.length;\n if (target.length - targetStart < end - start) {\n end = target.length - targetStart + start;\n }\n const len = end - start;\n if (this === target && typeof GlobalUint8Array.prototype.copyWithin === \"function\") {\n this.copyWithin(targetStart, start, end);\n } else {\n GlobalUint8Array.prototype.set.call(\n target,\n this.subarray(start, end),\n targetStart\n );\n }\n return len;\n };\n Buffer3.prototype.fill = function fill(val, start, end, encoding) {\n if (typeof val === \"string\") {\n if (typeof start === \"string\") {\n encoding = start;\n start = 0;\n end = this.length;\n } else if (typeof end === \"string\") {\n encoding = end;\n end = this.length;\n }\n if (encoding !== void 0 && typeof encoding !== \"string\") {\n throw new TypeError(\"encoding must be a string\");\n }\n if (typeof encoding === \"string\" && !Buffer3.isEncoding(encoding)) {\n throw new TypeError(\"Unknown encoding: \" + encoding);\n }\n if (val.length === 1) {\n const code2 = val.charCodeAt(0);\n if (encoding === \"utf8\" && code2 < 128 || encoding === \"latin1\") {\n val = code2;\n }\n }\n } else if (typeof val === \"number\") {\n val = val & 255;\n } else if (typeof val === \"boolean\") {\n val = Number(val);\n }\n if (start < 0 || this.length < start || this.length < end) {\n throw new RangeError(\"Out of range index\");\n }\n if (end <= start) {\n return this;\n }\n start = start >>> 0;\n end = end === void 0 ? this.length : end >>> 0;\n if (!val) val = 0;\n let i;\n if (typeof val === \"number\") {\n for (i = start; i < end; ++i) {\n this[i] = val;\n }\n } else {\n const bytes = Buffer3.isBuffer(val) ? val : Buffer3.from(val, encoding);\n const len = bytes.length;\n if (len === 0) {\n throw new TypeError('The value \"' + val + '\" is invalid for argument \"value\"');\n }\n for (i = 0; i < end - start; ++i) {\n this[i + start] = bytes[i % len];\n }\n }\n return this;\n };\n const errors = {};\n function E(sym, getMessage, Base) {\n errors[sym] = class NodeError extends Base {\n constructor() {\n super();\n Object.defineProperty(this, \"message\", {\n value: getMessage.apply(this, arguments),\n writable: true,\n configurable: true\n });\n this.name = `${this.name} [${sym}]`;\n this.stack;\n delete this.name;\n }\n get code() {\n return sym;\n }\n set code(value) {\n Object.defineProperty(this, \"code\", {\n configurable: true,\n enumerable: true,\n value,\n writable: true\n });\n }\n toString() {\n return `${this.name} [${sym}]: ${this.message}`;\n }\n };\n }\n E(\n \"ERR_BUFFER_OUT_OF_BOUNDS\",\n function(name) {\n if (name) {\n return `${name} is outside of buffer bounds`;\n }\n return \"Attempt to access memory outside buffer bounds\";\n },\n RangeError\n );\n E(\n \"ERR_INVALID_ARG_TYPE\",\n function(name, actual) {\n return `The \"${name}\" argument must be of type number. Received type ${typeof actual}`;\n },\n TypeError\n );\n E(\n \"ERR_OUT_OF_RANGE\",\n function(str, range, input) {\n let msg = `The value of \"${str}\" is out of range.`;\n let received = input;\n if (Number.isInteger(input) && Math.abs(input) > 2 ** 32) {\n received = addNumericalSeparator(String(input));\n } else if (typeof input === \"bigint\") {\n received = String(input);\n if (input > BigInt(2) ** BigInt(32) || input < -(BigInt(2) ** BigInt(32))) {\n received = addNumericalSeparator(received);\n }\n received += \"n\";\n }\n msg += ` It must be ${range}. Received ${received}`;\n return msg;\n },\n RangeError\n );\n function addNumericalSeparator(val) {\n let res = \"\";\n let i = val.length;\n const start = val[0] === \"-\" ? 1 : 0;\n for (; i >= start + 4; i -= 3) {\n res = `_${val.slice(i - 3, i)}${res}`;\n }\n return `${val.slice(0, i)}${res}`;\n }\n function checkBounds(buf, offset, byteLength3) {\n validateNumber(offset, \"offset\");\n if (buf[offset] === void 0 || buf[offset + byteLength3] === void 0) {\n boundsError(offset, buf.length - (byteLength3 + 1));\n }\n }\n function checkIntBI(value, min, max, buf, offset, byteLength3) {\n if (value > max || value < min) {\n const n = typeof min === \"bigint\" ? \"n\" : \"\";\n let range;\n {\n if (min === 0 || min === BigInt(0)) {\n range = `>= 0${n} and < 2${n} ** ${(byteLength3 + 1) * 8}${n}`;\n } else {\n range = `>= -(2${n} ** ${(byteLength3 + 1) * 8 - 1}${n}) and < 2 ** ${(byteLength3 + 1) * 8 - 1}${n}`;\n }\n }\n throw new errors.ERR_OUT_OF_RANGE(\"value\", range, value);\n }\n checkBounds(buf, offset, byteLength3);\n }\n function validateNumber(value, name) {\n if (typeof value !== \"number\") {\n throw new errors.ERR_INVALID_ARG_TYPE(name, \"number\", value);\n }\n }\n function boundsError(value, length, type) {\n if (Math.floor(value) !== value) {\n validateNumber(value, type);\n throw new errors.ERR_OUT_OF_RANGE(\"offset\", \"an integer\", value);\n }\n if (length < 0) {\n throw new errors.ERR_BUFFER_OUT_OF_BOUNDS();\n }\n throw new errors.ERR_OUT_OF_RANGE(\n \"offset\",\n `>= ${0} and <= ${length}`,\n value\n );\n }\n const INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g;\n function base64clean(str) {\n str = str.split(\"=\")[0];\n str = str.trim().replace(INVALID_BASE64_RE, \"\");\n if (str.length < 2) return \"\";\n while (str.length % 4 !== 0) {\n str = str + \"=\";\n }\n return str;\n }\n function utf8ToBytes(string, units) {\n units = units || Infinity;\n let codePoint;\n const length = string.length;\n let leadSurrogate = null;\n const bytes = [];\n for (let i = 0; i < length; ++i) {\n codePoint = string.charCodeAt(i);\n if (codePoint > 55295 && codePoint < 57344) {\n if (!leadSurrogate) {\n if (codePoint > 56319) {\n if ((units -= 3) > -1) bytes.push(239, 191, 189);\n continue;\n } else if (i + 1 === length) {\n if ((units -= 3) > -1) bytes.push(239, 191, 189);\n continue;\n }\n leadSurrogate = codePoint;\n continue;\n }\n if (codePoint < 56320) {\n if ((units -= 3) > -1) bytes.push(239, 191, 189);\n leadSurrogate = codePoint;\n continue;\n }\n codePoint = (leadSurrogate - 55296 << 10 | codePoint - 56320) + 65536;\n } else if (leadSurrogate) {\n if ((units -= 3) > -1) bytes.push(239, 191, 189);\n }\n leadSurrogate = null;\n if (codePoint < 128) {\n if ((units -= 1) < 0) break;\n bytes.push(codePoint);\n } else if (codePoint < 2048) {\n if ((units -= 2) < 0) break;\n bytes.push(\n codePoint >> 6 | 192,\n codePoint & 63 | 128\n );\n } else if (codePoint < 65536) {\n if ((units -= 3) < 0) break;\n bytes.push(\n codePoint >> 12 | 224,\n codePoint >> 6 & 63 | 128,\n codePoint & 63 | 128\n );\n } else if (codePoint < 1114112) {\n if ((units -= 4) < 0) break;\n bytes.push(\n codePoint >> 18 | 240,\n codePoint >> 12 & 63 | 128,\n codePoint >> 6 & 63 | 128,\n codePoint & 63 | 128\n );\n } else {\n throw new Error(\"Invalid code point\");\n }\n }\n return bytes;\n }\n function asciiToBytes(str) {\n const byteArray = [];\n for (let i = 0; i < str.length; ++i) {\n byteArray.push(str.charCodeAt(i) & 255);\n }\n return byteArray;\n }\n function utf16leToBytes(str, units) {\n let c, hi, lo;\n const byteArray = [];\n for (let i = 0; i < str.length; ++i) {\n if ((units -= 2) < 0) break;\n c = str.charCodeAt(i);\n hi = c >> 8;\n lo = c % 256;\n byteArray.push(lo);\n byteArray.push(hi);\n }\n return byteArray;\n }\n function base64ToBytes(str) {\n return base64.toByteArray(base64clean(str));\n }\n function blitBuffer(src, dst, offset, length) {\n let i;\n for (i = 0; i < length; ++i) {\n if (i + offset >= dst.length || i >= src.length) break;\n dst[i + offset] = src[i];\n }\n return i;\n }\n function isInstance(obj, type) {\n return obj instanceof type || obj != null && obj.constructor != null && obj.constructor.name != null && obj.constructor.name === type.name;\n }\n function numberIsNaN(obj) {\n return obj !== obj;\n }\n const hexSliceLookupTable = function() {\n const alphabet = \"0123456789abcdef\";\n const table = new Array(256);\n for (let i = 0; i < 16; ++i) {\n const i16 = i * 16;\n for (let j = 0; j < 16; ++j) {\n table[i16 + j] = alphabet[i] + alphabet[j];\n }\n }\n return table;\n }();\n function defineBigIntMethod(fn) {\n return typeof BigInt === \"undefined\" ? BufferBigIntNotDefined : fn;\n }\n function BufferBigIntNotDefined() {\n throw new Error(\"BigInt not supported\");\n }\n})(buffer);\nconst Buffer2 = buffer.Buffer;\nconst Buffer$1 = buffer.Buffer;\nconst global = globalThis || void 0 || self;\nfunction getDefaultExportFromCjs(x) {\n return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, \"default\") ? x[\"default\"] : x;\n}\nvar browser = { exports: {} };\nvar process = browser.exports = {};\nvar cachedSetTimeout;\nvar cachedClearTimeout;\nfunction defaultSetTimout() {\n throw new Error(\"setTimeout has not been defined\");\n}\nfunction defaultClearTimeout() {\n throw new Error(\"clearTimeout has not been defined\");\n}\n(function() {\n try {\n if (typeof setTimeout === \"function\") {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === \"function\") {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n})();\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n return setTimeout(fun, 0);\n }\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n return cachedSetTimeout(fun, 0);\n } catch (e) {\n try {\n return cachedSetTimeout.call(null, fun, 0);\n } catch (e2) {\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n return clearTimeout(marker);\n }\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n return cachedClearTimeout(marker);\n } catch (e) {\n try {\n return cachedClearTimeout.call(null, marker);\n } catch (e2) {\n return cachedClearTimeout.call(this, marker);\n }\n }\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n var len = queue.length;\n while (len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\nprocess.nextTick = function(fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function() {\n this.fun.apply(null, this.array);\n};\nprocess.title = \"browser\";\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = \"\";\nprocess.versions = {};\nfunction noop$1() {\n}\nprocess.on = noop$1;\nprocess.addListener = noop$1;\nprocess.once = noop$1;\nprocess.off = noop$1;\nprocess.removeListener = noop$1;\nprocess.removeAllListeners = noop$1;\nprocess.emit = noop$1;\nprocess.prependListener = noop$1;\nprocess.prependOnceListener = noop$1;\nprocess.listeners = function(name) {\n return [];\n};\nprocess.binding = function(name) {\n throw new Error(\"process.binding is not supported\");\n};\nprocess.cwd = function() {\n return \"/\";\n};\nprocess.chdir = function(dir) {\n throw new Error(\"process.chdir is not supported\");\n};\nprocess.umask = function() {\n return 0;\n};\nvar browserExports = browser.exports;\nconst process$1 = /* @__PURE__ */ getDefaultExportFromCjs(browserExports);\nfunction bind(fn, thisArg) {\n return function wrap() {\n return fn.apply(thisArg, arguments);\n };\n}\nconst { toString } = Object.prototype;\nconst { getPrototypeOf } = Object;\nconst kindOf = /* @__PURE__ */ ((cache) => (thing) => {\n const str = toString.call(thing);\n return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());\n})(/* @__PURE__ */ Object.create(null));\nconst kindOfTest = (type) => {\n type = type.toLowerCase();\n return (thing) => kindOf(thing) === type;\n};\nconst typeOfTest = (type) => (thing) => typeof thing === type;\nconst { isArray } = Array;\nconst isUndefined = typeOfTest(\"undefined\");\nfunction isBuffer(val) {\n return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor) && isFunction(val.constructor.isBuffer) && val.constructor.isBuffer(val);\n}\nconst isArrayBuffer = kindOfTest(\"ArrayBuffer\");\nfunction isArrayBufferView(val) {\n let result;\n if (typeof ArrayBuffer !== \"undefined\" && ArrayBuffer.isView) {\n result = ArrayBuffer.isView(val);\n } else {\n result = val && val.buffer && isArrayBuffer(val.buffer);\n }\n return result;\n}\nconst isString = typeOfTest(\"string\");\nconst isFunction = typeOfTest(\"function\");\nconst isNumber = typeOfTest(\"number\");\nconst isObject = (thing) => thing !== null && typeof thing === \"object\";\nconst isBoolean = (thing) => thing === true || thing === false;\nconst isPlainObject = (val) => {\n if (kindOf(val) !== \"object\") {\n return false;\n }\n const prototype2 = getPrototypeOf(val);\n return (prototype2 === null || prototype2 === Object.prototype || Object.getPrototypeOf(prototype2) === null) && !(Symbol.toStringTag in val) && !(Symbol.iterator in val);\n};\nconst isDate = kindOfTest(\"Date\");\nconst isFile = kindOfTest(\"File\");\nconst isBlob = kindOfTest(\"Blob\");\nconst isFileList = kindOfTest(\"FileList\");\nconst isStream = (val) => isObject(val) && isFunction(val.pipe);\nconst isFormData = (thing) => {\n let kind;\n return thing && (typeof FormData === \"function\" && thing instanceof FormData || isFunction(thing.append) && ((kind = kindOf(thing)) === \"formdata\" || // detect form-data instance\n kind === \"object\" && isFunction(thing.toString) && thing.toString() === \"[object FormData]\"));\n};\nconst isURLSearchParams = kindOfTest(\"URLSearchParams\");\nconst [isReadableStream, isRequest, isResponse, isHeaders] = [\"ReadableStream\", \"Request\", \"Response\", \"Headers\"].map(kindOfTest);\nconst trim = (str) => str.trim ? str.trim() : str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, \"\");\nfunction forEach(obj, fn, { allOwnKeys = false } = {}) {\n if (obj === null || typeof obj === \"undefined\") {\n return;\n }\n let i;\n let l;\n if (typeof obj !== \"object\") {\n obj = [obj];\n }\n if (isArray(obj)) {\n for (i = 0, l = obj.length; i < l; i++) {\n fn.call(null, obj[i], i, obj);\n }\n } else {\n const keys = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj);\n const len = keys.length;\n let key;\n for (i = 0; i < len; i++) {\n key = keys[i];\n fn.call(null, obj[key], key, obj);\n }\n }\n}\nfunction findKey(obj, key) {\n key = key.toLowerCase();\n const keys = Object.keys(obj);\n let i = keys.length;\n let _key;\n while (i-- > 0) {\n _key = keys[i];\n if (key === _key.toLowerCase()) {\n return _key;\n }\n }\n return null;\n}\nconst _global = (() => {\n if (typeof globalThis !== \"undefined\") return globalThis;\n return typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : global;\n})();\nconst isContextDefined = (context) => !isUndefined(context) && context !== _global;\nfunction merge() {\n const { caseless } = isContextDefined(this) && this || {};\n const result = {};\n const assignValue = (val, key) => {\n const targetKey = caseless && findKey(result, key) || key;\n if (isPlainObject(result[targetKey]) && isPlainObject(val)) {\n result[targetKey] = merge(result[targetKey], val);\n } else if (isPlainObject(val)) {\n result[targetKey] = merge({}, val);\n } else if (isArray(val)) {\n result[targetKey] = val.slice();\n } else {\n result[targetKey] = val;\n }\n };\n for (let i = 0, l = arguments.length; i < l; i++) {\n arguments[i] && forEach(arguments[i], assignValue);\n }\n return result;\n}\nconst extend = (a, b, thisArg, { allOwnKeys } = {}) => {\n forEach(b, (val, key) => {\n if (thisArg && isFunction(val)) {\n a[key] = bind(val, thisArg);\n } else {\n a[key] = val;\n }\n }, { allOwnKeys });\n return a;\n};\nconst stripBOM = (content) => {\n if (content.charCodeAt(0) === 65279) {\n content = content.slice(1);\n }\n return content;\n};\nconst inherits = (constructor, superConstructor, props, descriptors2) => {\n constructor.prototype = Object.create(superConstructor.prototype, descriptors2);\n constructor.prototype.constructor = constructor;\n Object.defineProperty(constructor, \"super\", {\n value: superConstructor.prototype\n });\n props && Object.assign(constructor.prototype, props);\n};\nconst toFlatObject = (sourceObj, destObj, filter2, propFilter) => {\n let props;\n let i;\n let prop;\n const merged = {};\n destObj = destObj || {};\n if (sourceObj == null) return destObj;\n do {\n props = Object.getOwnPropertyNames(sourceObj);\n i = props.length;\n while (i-- > 0) {\n prop = props[i];\n if ((!propFilter || propFilter(prop, sourceObj, destObj)) && !merged[prop]) {\n destObj[prop] = sourceObj[prop];\n merged[prop] = true;\n }\n }\n sourceObj = filter2 !== false && getPrototypeOf(sourceObj);\n } while (sourceObj && (!filter2 || filter2(sourceObj, destObj)) && sourceObj !== Object.prototype);\n return destObj;\n};\nconst endsWith = (str, searchString, position) => {\n str = String(str);\n if (position === void 0 || position > str.length) {\n position = str.length;\n }\n position -= searchString.length;\n const lastIndex = str.indexOf(searchString, position);\n return lastIndex !== -1 && lastIndex === position;\n};\nconst toArray = (thing) => {\n if (!thing) return null;\n if (isArray(thing)) return thing;\n let i = thing.length;\n if (!isNumber(i)) return null;\n const arr = new Array(i);\n while (i-- > 0) {\n arr[i] = thing[i];\n }\n return arr;\n};\nconst isTypedArray = /* @__PURE__ */ ((TypedArray) => {\n return (thing) => {\n return TypedArray && thing instanceof TypedArray;\n };\n})(typeof Uint8Array !== \"undefined\" && getPrototypeOf(Uint8Array));\nconst forEachEntry = (obj, fn) => {\n const generator = obj && obj[Symbol.iterator];\n const iterator = generator.call(obj);\n let result;\n while ((result = iterator.next()) && !result.done) {\n const pair = result.value;\n fn.call(obj, pair[0], pair[1]);\n }\n};\nconst matchAll = (regExp, str) => {\n let matches;\n const arr = [];\n while ((matches = regExp.exec(str)) !== null) {\n arr.push(matches);\n }\n return arr;\n};\nconst isHTMLForm = kindOfTest(\"HTMLFormElement\");\nconst toCamelCase = (str) => {\n return str.toLowerCase().replace(\n /[-_\\s]([a-z\\d])(\\w*)/g,\n function replacer(m, p1, p2) {\n return p1.toUpperCase() + p2;\n }\n );\n};\nconst hasOwnProperty = (({ hasOwnProperty: hasOwnProperty2 }) => (obj, prop) => hasOwnProperty2.call(obj, prop))(Object.prototype);\nconst isRegExp = kindOfTest(\"RegExp\");\nconst reduceDescriptors = (obj, reducer) => {\n const descriptors2 = Object.getOwnPropertyDescriptors(obj);\n const reducedDescriptors = {};\n forEach(descriptors2, (descriptor, name) => {\n let ret;\n if ((ret = reducer(descriptor, name, obj)) !== false) {\n reducedDescriptors[name] = ret || descriptor;\n }\n });\n Object.defineProperties(obj, reducedDescriptors);\n};\nconst freezeMethods = (obj) => {\n reduceDescriptors(obj, (descriptor, name) => {\n if (isFunction(obj) && [\"arguments\", \"caller\", \"callee\"].indexOf(name) !== -1) {\n return false;\n }\n const value = obj[name];\n if (!isFunction(value)) return;\n descriptor.enumerable = false;\n if (\"writable\" in descriptor) {\n descriptor.writable = false;\n return;\n }\n if (!descriptor.set) {\n descriptor.set = () => {\n throw Error(\"Can not rewrite read-only method '\" + name + \"'\");\n };\n }\n });\n};\nconst toObjectSet = (arrayOrString, delimiter) => {\n const obj = {};\n const define = (arr) => {\n arr.forEach((value) => {\n obj[value] = true;\n });\n };\n isArray(arrayOrString) ? define(arrayOrString) : define(String(arrayOrString).split(delimiter));\n return obj;\n};\nconst noop = () => {\n};\nconst toFiniteNumber = (value, defaultValue) => {\n return value != null && Number.isFinite(value = +value) ? value : defaultValue;\n};\nfunction isSpecCompliantForm(thing) {\n return !!(thing && isFunction(thing.append) && thing[Symbol.toStringTag] === \"FormData\" && thing[Symbol.iterator]);\n}\nconst toJSONObject = (obj) => {\n const stack = new Array(10);\n const visit = (source, i) => {\n if (isObject(source)) {\n if (stack.indexOf(source) >= 0) {\n return;\n }\n if (!(\"toJSON\" in source)) {\n stack[i] = source;\n const target = isArray(source) ? [] : {};\n forEach(source, (value, key) => {\n const reducedValue = visit(value, i + 1);\n !isUndefined(reducedValue) && (target[key] = reducedValue);\n });\n stack[i] = void 0;\n return target;\n }\n }\n return source;\n };\n return visit(obj, 0);\n};\nconst isAsyncFn = kindOfTest(\"AsyncFunction\");\nconst isThenable = (thing) => thing && (isObject(thing) || isFunction(thing)) && isFunction(thing.then) && isFunction(thing.catch);\nconst _setImmediate = ((setImmediateSupported, postMessageSupported) => {\n if (setImmediateSupported) {\n return setImmediate;\n }\n return postMessageSupported ? ((token, callbacks) => {\n _global.addEventListener(\"message\", ({ source, data }) => {\n if (source === _global && data === token) {\n callbacks.length && callbacks.shift()();\n }\n }, false);\n return (cb) => {\n callbacks.push(cb);\n _global.postMessage(token, \"*\");\n };\n })(`axios@${Math.random()}`, []) : (cb) => setTimeout(cb);\n})(\n typeof setImmediate === \"function\",\n isFunction(_global.postMessage)\n);\nconst asap = typeof queueMicrotask !== \"undefined\" ? queueMicrotask.bind(_global) : typeof process$1 !== \"undefined\" && process$1.nextTick || _setImmediate;\nconst utils$1 = {\n isArray,\n isArrayBuffer,\n isBuffer,\n isFormData,\n isArrayBufferView,\n isString,\n isNumber,\n isBoolean,\n isObject,\n isPlainObject,\n isReadableStream,\n isRequest,\n isResponse,\n isHeaders,\n isUndefined,\n isDate,\n isFile,\n isBlob,\n isRegExp,\n isFunction,\n isStream,\n isURLSearchParams,\n isTypedArray,\n isFileList,\n forEach,\n merge,\n extend,\n trim,\n stripBOM,\n inherits,\n toFlatObject,\n kindOf,\n kindOfTest,\n endsWith,\n toArray,\n forEachEntry,\n matchAll,\n isHTMLForm,\n hasOwnProperty,\n hasOwnProp: hasOwnProperty,\n // an alias to avoid ESLint no-prototype-builtins detection\n reduceDescriptors,\n freezeMethods,\n toObjectSet,\n toCamelCase,\n noop,\n toFiniteNumber,\n findKey,\n global: _global,\n isContextDefined,\n isSpecCompliantForm,\n toJSONObject,\n isAsyncFn,\n isThenable,\n setImmediate: _setImmediate,\n asap\n};\nfunction AxiosError(message, code2, config, request, response) {\n Error.call(this);\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n } else {\n this.stack = new Error().stack;\n }\n this.message = message;\n this.name = \"AxiosError\";\n code2 && (this.code = code2);\n config && (this.config = config);\n request && (this.request = request);\n if (response) {\n this.response = response;\n this.status = response.status ? response.status : null;\n }\n}\nutils$1.inherits(AxiosError, Error, {\n toJSON: function toJSON() {\n return {\n // Standard\n message: this.message,\n name: this.name,\n // Microsoft\n description: this.description,\n number: this.number,\n // Mozilla\n fileName: this.fileName,\n lineNumber: this.lineNumber,\n columnNumber: this.columnNumber,\n stack: this.stack,\n // Axios\n config: utils$1.toJSONObject(this.config),\n code: this.code,\n status: this.status\n };\n }\n});\nconst prototype$1 = AxiosError.prototype;\nconst descriptors = {};\n[\n \"ERR_BAD_OPTION_VALUE\",\n \"ERR_BAD_OPTION\",\n \"ECONNABORTED\",\n \"ETIMEDOUT\",\n \"ERR_NETWORK\",\n \"ERR_FR_TOO_MANY_REDIRECTS\",\n \"ERR_DEPRECATED\",\n \"ERR_BAD_RESPONSE\",\n \"ERR_BAD_REQUEST\",\n \"ERR_CANCELED\",\n \"ERR_NOT_SUPPORT\",\n \"ERR_INVALID_URL\"\n // eslint-disable-next-line func-names\n].forEach((code2) => {\n descriptors[code2] = { value: code2 };\n});\nObject.defineProperties(AxiosError, descriptors);\nObject.defineProperty(prototype$1, \"isAxiosError\", { value: true });\nAxiosError.from = (error, code2, config, request, response, customProps) => {\n const axiosError = Object.create(prototype$1);\n utils$1.toFlatObject(error, axiosError, function filter2(obj) {\n return obj !== Error.prototype;\n }, (prop) => {\n return prop !== \"isAxiosError\";\n });\n AxiosError.call(axiosError, error.message, code2, config, request, response);\n axiosError.cause = error;\n axiosError.name = error.name;\n customProps && Object.assign(axiosError, customProps);\n return axiosError;\n};\nconst httpAdapter = null;\nfunction isVisitable(thing) {\n return utils$1.isPlainObject(thing) || utils$1.isArray(thing);\n}\nfunction removeBrackets(key) {\n return utils$1.endsWith(key, \"[]\") ? key.slice(0, -2) : key;\n}\nfunction renderKey(path, key, dots) {\n if (!path) return key;\n return path.concat(key).map(function each(token, i) {\n token = removeBrackets(token);\n return !dots && i ? \"[\" + token + \"]\" : token;\n }).join(dots ? \".\" : \"\");\n}\nfunction isFlatArray(arr) {\n return utils$1.isArray(arr) && !arr.some(isVisitable);\n}\nconst predicates = utils$1.toFlatObject(utils$1, {}, null, function filter(prop) {\n return /^is[A-Z]/.test(prop);\n});\nfunction toFormData(obj, formData, options) {\n if (!utils$1.isObject(obj)) {\n throw new TypeError(\"target must be an object\");\n }\n formData = formData || new FormData();\n options = utils$1.toFlatObject(options, {\n metaTokens: true,\n dots: false,\n indexes: false\n }, false, function defined(option, source) {\n return !utils$1.isUndefined(source[option]);\n });\n const metaTokens = options.metaTokens;\n const visitor = options.visitor || defaultVisitor;\n const dots = options.dots;\n const indexes = options.indexes;\n const _Blob = options.Blob || typeof Blob !== \"undefined\" && Blob;\n const useBlob = _Blob && utils$1.isSpecCompliantForm(formData);\n if (!utils$1.isFunction(visitor)) {\n throw new TypeError(\"visitor must be a function\");\n }\n function convertValue(value) {\n if (value === null) return \"\";\n if (utils$1.isDate(value)) {\n return value.toISOString();\n }\n if (!useBlob && utils$1.isBlob(value)) {\n throw new AxiosError(\"Blob is not supported. Use a Buffer instead.\");\n }\n if (utils$1.isArrayBuffer(value) || utils$1.isTypedArray(value)) {\n return useBlob && typeof Blob === \"function\" ? new Blob([value]) : Buffer2.from(value);\n }\n return value;\n }\n function defaultVisitor(value, key, path) {\n let arr = value;\n if (value && !path && typeof value === \"object\") {\n if (utils$1.endsWith(key, \"{}\")) {\n key = metaTokens ? key : key.slice(0, -2);\n value = JSON.stringify(value);\n } else if (utils$1.isArray(value) && isFlatArray(value) || (utils$1.isFileList(value) || utils$1.endsWith(key, \"[]\")) && (arr = utils$1.toArray(value))) {\n key = removeBrackets(key);\n arr.forEach(function each(el, index) {\n !(utils$1.isUndefined(el) || el === null) && formData.append(\n // eslint-disable-next-line no-nested-ternary\n indexes === true ? renderKey([key], index, dots) : indexes === null ? key : key + \"[]\",\n convertValue(el)\n );\n });\n return false;\n }\n }\n if (isVisitable(value)) {\n return true;\n }\n formData.append(renderKey(path, key, dots), convertValue(value));\n return false;\n }\n const stack = [];\n const exposedHelpers = Object.assign(predicates, {\n defaultVisitor,\n convertValue,\n isVisitable\n });\n function build(value, path) {\n if (utils$1.isUndefined(value)) return;\n if (stack.indexOf(value) !== -1) {\n throw Error(\"Circular reference detected in \" + path.join(\".\"));\n }\n stack.push(value);\n utils$1.forEach(value, function each(el, key) {\n const result = !(utils$1.isUndefined(el) || el === null) && visitor.call(\n formData,\n el,\n utils$1.isString(key) ? key.trim() : key,\n path,\n exposedHelpers\n );\n if (result === true) {\n build(el, path ? path.concat(key) : [key]);\n }\n });\n stack.pop();\n }\n if (!utils$1.isObject(obj)) {\n throw new TypeError(\"data must be an object\");\n }\n build(obj);\n return formData;\n}\nfunction encode$1(str) {\n const charMap = {\n \"!\": \"%21\",\n \"'\": \"%27\",\n \"(\": \"%28\",\n \")\": \"%29\",\n \"~\": \"%7E\",\n \"%20\": \"+\",\n \"%00\": \"\\0\"\n };\n return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match) {\n return charMap[match];\n });\n}\nfunction AxiosURLSearchParams(params, options) {\n this._pairs = [];\n params && toFormData(params, this, options);\n}\nconst prototype = AxiosURLSearchParams.prototype;\nprototype.append = function append(name, value) {\n this._pairs.push([name, value]);\n};\nprototype.toString = function toString2(encoder) {\n const _encode = encoder ? function(value) {\n return encoder.call(this, value, encode$1);\n } : encode$1;\n return this._pairs.map(function each(pair) {\n return _encode(pair[0]) + \"=\" + _encode(pair[1]);\n }, \"\").join(\"&\");\n};\nfunction encode(val) {\n return encodeURIComponent(val).replace(/%3A/gi, \":\").replace(/%24/g, \"$\").replace(/%2C/gi, \",\").replace(/%20/g, \"+\").replace(/%5B/gi, \"[\").replace(/%5D/gi, \"]\");\n}\nfunction buildURL(url, params, options) {\n if (!params) {\n return url;\n }\n const _encode = options && options.encode || encode;\n if (utils$1.isFunction(options)) {\n options = {\n serialize: options\n };\n }\n const serializeFn = options && options.serialize;\n let serializedParams;\n if (serializeFn) {\n serializedParams = serializeFn(params, options);\n } else {\n serializedParams = utils$1.isURLSearchParams(params) ? params.toString() : new AxiosURLSearchParams(params, options).toString(_encode);\n }\n if (serializedParams) {\n const hashmarkIndex = url.indexOf(\"#\");\n if (hashmarkIndex !== -1) {\n url = url.slice(0, hashmarkIndex);\n }\n url += (url.indexOf(\"?\") === -1 ? \"?\" : \"&\") + serializedParams;\n }\n return url;\n}\nclass InterceptorManager {\n constructor() {\n this.handlers = [];\n }\n /**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n *\n * @return {Number} An ID used to remove interceptor later\n */\n use(fulfilled, rejected, options) {\n this.handlers.push({\n fulfilled,\n rejected,\n synchronous: options ? options.synchronous : false,\n runWhen: options ? options.runWhen : null\n });\n return this.handlers.length - 1;\n }\n /**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n *\n * @returns {Boolean} `true` if the interceptor was removed, `false` otherwise\n */\n eject(id) {\n if (this.handlers[id]) {\n this.handlers[id] = null;\n }\n }\n /**\n * Clear all interceptors from the stack\n *\n * @returns {void}\n */\n clear() {\n if (this.handlers) {\n this.handlers = [];\n }\n }\n /**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n *\n * @returns {void}\n */\n forEach(fn) {\n utils$1.forEach(this.handlers, function forEachHandler(h) {\n if (h !== null) {\n fn(h);\n }\n });\n }\n}\nconst transitionalDefaults = {\n silentJSONParsing: true,\n forcedJSONParsing: true,\n clarifyTimeoutError: false\n};\nconst URLSearchParams$1 = typeof URLSearchParams !== \"undefined\" ? URLSearchParams : AxiosURLSearchParams;\nconst FormData$1 = typeof FormData !== \"undefined\" ? FormData : null;\nconst Blob$1 = typeof Blob !== \"undefined\" ? Blob : null;\nconst platform$1 = {\n isBrowser: true,\n classes: {\n URLSearchParams: URLSearchParams$1,\n FormData: FormData$1,\n Blob: Blob$1\n },\n protocols: [\"http\", \"https\", \"file\", \"blob\", \"url\", \"data\"]\n};\nconst hasBrowserEnv = typeof window !== \"undefined\" && typeof document !== \"undefined\";\nconst _navigator = typeof navigator === \"object\" && navigator || void 0;\nconst hasStandardBrowserEnv = hasBrowserEnv && (!_navigator || [\"ReactNative\", \"NativeScript\", \"NS\"].indexOf(_navigator.product) < 0);\nconst hasStandardBrowserWebWorkerEnv = (() => {\n return typeof WorkerGlobalScope !== \"undefined\" && // eslint-disable-next-line no-undef\n self instanceof WorkerGlobalScope && typeof self.importScripts === \"function\";\n})();\nconst origin = hasBrowserEnv && window.location.href || \"http://localhost\";\nconst utils = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n __proto__: null,\n hasBrowserEnv,\n hasStandardBrowserEnv,\n hasStandardBrowserWebWorkerEnv,\n navigator: _navigator,\n origin\n}, Symbol.toStringTag, { value: \"Module\" }));\nconst platform = {\n ...utils,\n ...platform$1\n};\nfunction toURLEncodedForm(data, options) {\n return toFormData(data, new platform.classes.URLSearchParams(), Object.assign({\n visitor: function(value, key, path, helpers) {\n if (platform.isNode && utils$1.isBuffer(value)) {\n this.append(key, value.toString(\"base64\"));\n return false;\n }\n return helpers.defaultVisitor.apply(this, arguments);\n }\n }, options));\n}\nfunction parsePropPath(name) {\n return utils$1.matchAll(/\\w+|\\[(\\w*)]/g, name).map((match) => {\n return match[0] === \"[]\" ? \"\" : match[1] || match[0];\n });\n}\nfunction arrayToObject(arr) {\n const obj = {};\n const keys = Object.keys(arr);\n let i;\n const len = keys.length;\n let key;\n for (i = 0; i < len; i++) {\n key = keys[i];\n obj[key] = arr[key];\n }\n return obj;\n}\nfunction formDataToJSON(formData) {\n function buildPath(path, value, target, index) {\n let name = path[index++];\n if (name === \"__proto__\") return true;\n const isNumericKey = Number.isFinite(+name);\n const isLast = index >= path.length;\n name = !name && utils$1.isArray(target) ? target.length : name;\n if (isLast) {\n if (utils$1.hasOwnProp(target, name)) {\n target[name] = [target[name], value];\n } else {\n target[name] = value;\n }\n return !isNumericKey;\n }\n if (!target[name] || !utils$1.isObject(target[name])) {\n target[name] = [];\n }\n const result = buildPath(path, value, target[name], index);\n if (result && utils$1.isArray(target[name])) {\n target[name] = arrayToObject(target[name]);\n }\n return !isNumericKey;\n }\n if (utils$1.isFormData(formData) && utils$1.isFunction(formData.entries)) {\n const obj = {};\n utils$1.forEachEntry(formData, (name, value) => {\n buildPath(parsePropPath(name), value, obj, 0);\n });\n return obj;\n }\n return null;\n}\nfunction stringifySafely(rawValue, parser, encoder) {\n if (utils$1.isString(rawValue)) {\n try {\n (parser || JSON.parse)(rawValue);\n return utils$1.trim(rawValue);\n } catch (e) {\n if (e.name !== \"SyntaxError\") {\n throw e;\n }\n }\n }\n return (0, JSON.stringify)(rawValue);\n}\nconst defaults = {\n transitional: transitionalDefaults,\n adapter: [\"xhr\", \"http\", \"fetch\"],\n transformRequest: [function transformRequest(data, headers) {\n const contentType = headers.getContentType() || \"\";\n const hasJSONContentType = contentType.indexOf(\"application/json\") > -1;\n const isObjectPayload = utils$1.isObject(data);\n if (isObjectPayload && utils$1.isHTMLForm(data)) {\n data = new FormData(data);\n }\n const isFormData2 = utils$1.isFormData(data);\n if (isFormData2) {\n return hasJSONContentType ? JSON.stringify(formDataToJSON(data)) : data;\n }\n if (utils$1.isArrayBuffer(data) || utils$1.isBuffer(data) || utils$1.isStream(data) || utils$1.isFile(data) || utils$1.isBlob(data) || utils$1.isReadableStream(data)) {\n return data;\n }\n if (utils$1.isArrayBufferView(data)) {\n return data.buffer;\n }\n if (utils$1.isURLSearchParams(data)) {\n headers.setContentType(\"application/x-www-form-urlencoded;charset=utf-8\", false);\n return data.toString();\n }\n let isFileList2;\n if (isObjectPayload) {\n if (contentType.indexOf(\"application/x-www-form-urlencoded\") > -1) {\n return toURLEncodedForm(data, this.formSerializer).toString();\n }\n if ((isFileList2 = utils$1.isFileList(data)) || contentType.indexOf(\"multipart/form-data\") > -1) {\n const _FormData = this.env && this.env.FormData;\n return toFormData(\n isFileList2 ? { \"files[]\": data } : data,\n _FormData && new _FormData(),\n this.formSerializer\n );\n }\n }\n if (isObjectPayload || hasJSONContentType) {\n headers.setContentType(\"application/json\", false);\n return stringifySafely(data);\n }\n return data;\n }],\n transformResponse: [function transformResponse(data) {\n const transitional2 = this.transitional || defaults.transitional;\n const forcedJSONParsing = transitional2 && transitional2.forcedJSONParsing;\n const JSONRequested = this.responseType === \"json\";\n if (utils$1.isResponse(data) || utils$1.isReadableStream(data)) {\n return data;\n }\n if (data && utils$1.isString(data) && (forcedJSONParsing && !this.responseType || JSONRequested)) {\n const silentJSONParsing = transitional2 && transitional2.silentJSONParsing;\n const strictJSONParsing = !silentJSONParsing && JSONRequested;\n try {\n return JSON.parse(data);\n } catch (e) {\n if (strictJSONParsing) {\n if (e.name === \"SyntaxError\") {\n throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, this.response);\n }\n throw e;\n }\n }\n }\n return data;\n }],\n /**\n * A timeout in milliseconds to abort a request. If set to 0 (default) a\n * timeout is not created.\n */\n timeout: 0,\n xsrfCookieName: \"XSRF-TOKEN\",\n xsrfHeaderName: \"X-XSRF-TOKEN\",\n maxContentLength: -1,\n maxBodyLength: -1,\n env: {\n FormData: platform.classes.FormData,\n Blob: platform.classes.Blob\n },\n validateStatus: function validateStatus(status) {\n return status >= 200 && status < 300;\n },\n headers: {\n common: {\n \"Accept\": \"application/json, text/plain, */*\",\n \"Content-Type\": void 0\n }\n }\n};\nutils$1.forEach([\"delete\", \"get\", \"head\", \"post\", \"put\", \"patch\"], (method) => {\n defaults.headers[method] = {};\n});\nconst ignoreDuplicateOf = utils$1.toObjectSet([\n \"age\",\n \"authorization\",\n \"content-length\",\n \"content-type\",\n \"etag\",\n \"expires\",\n \"from\",\n \"host\",\n \"if-modified-since\",\n \"if-unmodified-since\",\n \"last-modified\",\n \"location\",\n \"max-forwards\",\n \"proxy-authorization\",\n \"referer\",\n \"retry-after\",\n \"user-agent\"\n]);\nconst parseHeaders = (rawHeaders) => {\n const parsed = {};\n let key;\n let val;\n let i;\n rawHeaders && rawHeaders.split(\"\\n\").forEach(function parser(line) {\n i = line.indexOf(\":\");\n key = line.substring(0, i).trim().toLowerCase();\n val = line.substring(i + 1).trim();\n if (!key || parsed[key] && ignoreDuplicateOf[key]) {\n return;\n }\n if (key === \"set-cookie\") {\n if (parsed[key]) {\n parsed[key].push(val);\n } else {\n parsed[key] = [val];\n }\n } else {\n parsed[key] = parsed[key] ? parsed[key] + \", \" + val : val;\n }\n });\n return parsed;\n};\nconst $internals = Symbol(\"internals\");\nfunction normalizeHeader(header) {\n return header && String(header).trim().toLowerCase();\n}\nfunction normalizeValue(value) {\n if (value === false || value == null) {\n return value;\n }\n return utils$1.isArray(value) ? value.map(normalizeValue) : String(value);\n}\nfunction parseTokens(str) {\n const tokens = /* @__PURE__ */ Object.create(null);\n const tokensRE = /([^\\s,;=]+)\\s*(?:=\\s*([^,;]+))?/g;\n let match;\n while (match = tokensRE.exec(str)) {\n tokens[match[1]] = match[2];\n }\n return tokens;\n}\nconst isValidHeaderName = (str) => /^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(str.trim());\nfunction matchHeaderValue(context, value, header, filter2, isHeaderNameFilter) {\n if (utils$1.isFunction(filter2)) {\n return filter2.call(this, value, header);\n }\n if (isHeaderNameFilter) {\n value = header;\n }\n if (!utils$1.isString(value)) return;\n if (utils$1.isString(filter2)) {\n return value.indexOf(filter2) !== -1;\n }\n if (utils$1.isRegExp(filter2)) {\n return filter2.test(value);\n }\n}\nfunction formatHeader(header) {\n return header.trim().toLowerCase().replace(/([a-z\\d])(\\w*)/g, (w, char, str) => {\n return char.toUpperCase() + str;\n });\n}\nfunction buildAccessors(obj, header) {\n const accessorName = utils$1.toCamelCase(\" \" + header);\n [\"get\", \"set\", \"has\"].forEach((methodName) => {\n Object.defineProperty(obj, methodName + accessorName, {\n value: function(arg1, arg2, arg3) {\n return this[methodName].call(this, header, arg1, arg2, arg3);\n },\n configurable: true\n });\n });\n}\nclass AxiosHeaders {\n constructor(headers) {\n headers && this.set(headers);\n }\n set(header, valueOrRewrite, rewrite) {\n const self2 = this;\n function setHeader(_value, _header, _rewrite) {\n const lHeader = normalizeHeader(_header);\n if (!lHeader) {\n throw new Error(\"header name must be a non-empty string\");\n }\n const key = utils$1.findKey(self2, lHeader);\n if (!key || self2[key] === void 0 || _rewrite === true || _rewrite === void 0 && self2[key] !== false) {\n self2[key || _header] = normalizeValue(_value);\n }\n }\n const setHeaders = (headers, _rewrite) => utils$1.forEach(headers, (_value, _header) => setHeader(_value, _header, _rewrite));\n if (utils$1.isPlainObject(header) || header instanceof this.constructor) {\n setHeaders(header, valueOrRewrite);\n } else if (utils$1.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) {\n setHeaders(parseHeaders(header), valueOrRewrite);\n } else if (utils$1.isHeaders(header)) {\n for (const [key, value] of header.entries()) {\n setHeader(value, key, rewrite);\n }\n } else {\n header != null && setHeader(valueOrRewrite, header, rewrite);\n }\n return this;\n }\n get(header, parser) {\n header = normalizeHeader(header);\n if (header) {\n const key = utils$1.findKey(this, header);\n if (key) {\n const value = this[key];\n if (!parser) {\n return value;\n }\n if (parser === true) {\n return parseTokens(value);\n }\n if (utils$1.isFunction(parser)) {\n return parser.call(this, value, key);\n }\n if (utils$1.isRegExp(parser)) {\n return parser.exec(value);\n }\n throw new TypeError(\"parser must be boolean|regexp|function\");\n }\n }\n }\n has(header, matcher) {\n header = normalizeHeader(header);\n if (header) {\n const key = utils$1.findKey(this, header);\n return !!(key && this[key] !== void 0 && (!matcher || matchHeaderValue(this, this[key], key, matcher)));\n }\n return false;\n }\n delete(header, matcher) {\n const self2 = this;\n let deleted = false;\n function deleteHeader(_header) {\n _header = normalizeHeader(_header);\n if (_header) {\n const key = utils$1.findKey(self2, _header);\n if (key && (!matcher || matchHeaderValue(self2, self2[key], key, matcher))) {\n delete self2[key];\n deleted = true;\n }\n }\n }\n if (utils$1.isArray(header)) {\n header.forEach(deleteHeader);\n } else {\n deleteHeader(header);\n }\n return deleted;\n }\n clear(matcher) {\n const keys = Object.keys(this);\n let i = keys.length;\n let deleted = false;\n while (i--) {\n const key = keys[i];\n if (!matcher || matchHeaderValue(this, this[key], key, matcher, true)) {\n delete this[key];\n deleted = true;\n }\n }\n return deleted;\n }\n normalize(format) {\n const self2 = this;\n const headers = {};\n utils$1.forEach(this, (value, header) => {\n const key = utils$1.findKey(headers, header);\n if (key) {\n self2[key] = normalizeValue(value);\n delete self2[header];\n return;\n }\n const normalized = format ? formatHeader(header) : String(header).trim();\n if (normalized !== header) {\n delete self2[header];\n }\n self2[normalized] = normalizeValue(value);\n headers[normalized] = true;\n });\n return this;\n }\n concat(...targets) {\n return this.constructor.concat(this, ...targets);\n }\n toJSON(asStrings) {\n const obj = /* @__PURE__ */ Object.create(null);\n utils$1.forEach(this, (value, header) => {\n value != null && value !== false && (obj[header] = asStrings && utils$1.isArray(value) ? value.join(\", \") : value);\n });\n return obj;\n }\n [Symbol.iterator]() {\n return Object.entries(this.toJSON())[Symbol.iterator]();\n }\n toString() {\n return Object.entries(this.toJSON()).map(([header, value]) => header + \": \" + value).join(\"\\n\");\n }\n get [Symbol.toStringTag]() {\n return \"AxiosHeaders\";\n }\n static from(thing) {\n return thing instanceof this ? thing : new this(thing);\n }\n static concat(first, ...targets) {\n const computed = new this(first);\n targets.forEach((target) => computed.set(target));\n return computed;\n }\n static accessor(header) {\n const internals = this[$internals] = this[$internals] = {\n accessors: {}\n };\n const accessors = internals.accessors;\n const prototype2 = this.prototype;\n function defineAccessor(_header) {\n const lHeader = normalizeHeader(_header);\n if (!accessors[lHeader]) {\n buildAccessors(prototype2, _header);\n accessors[lHeader] = true;\n }\n }\n utils$1.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header);\n return this;\n }\n}\nAxiosHeaders.accessor([\"Content-Type\", \"Content-Length\", \"Accept\", \"Accept-Encoding\", \"User-Agent\", \"Authorization\"]);\nutils$1.reduceDescriptors(AxiosHeaders.prototype, ({ value }, key) => {\n let mapped = key[0].toUpperCase() + key.slice(1);\n return {\n get: () => value,\n set(headerValue) {\n this[mapped] = headerValue;\n }\n };\n});\nutils$1.freezeMethods(AxiosHeaders);\nfunction transformData(fns, response) {\n const config = this || defaults;\n const context = response || config;\n const headers = AxiosHeaders.from(context.headers);\n let data = context.data;\n utils$1.forEach(fns, function transform(fn) {\n data = fn.call(config, data, headers.normalize(), response ? response.status : void 0);\n });\n headers.normalize();\n return data;\n}\nfunction isCancel(value) {\n return !!(value && value.__CANCEL__);\n}\nfunction CanceledError(message, config, request) {\n AxiosError.call(this, message == null ? \"canceled\" : message, AxiosError.ERR_CANCELED, config, request);\n this.name = \"CanceledError\";\n}\nutils$1.inherits(CanceledError, AxiosError, {\n __CANCEL__: true\n});\nfunction settle(resolve, reject, response) {\n const validateStatus2 = response.config.validateStatus;\n if (!response.status || !validateStatus2 || validateStatus2(response.status)) {\n resolve(response);\n } else {\n reject(new AxiosError(\n \"Request failed with status code \" + response.status,\n [AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4],\n response.config,\n response.request,\n response\n ));\n }\n}\nfunction parseProtocol(url) {\n const match = /^([-+\\w]{1,25})(:?\\/\\/|:)/.exec(url);\n return match && match[1] || \"\";\n}\nfunction speedometer(samplesCount, min) {\n samplesCount = samplesCount || 10;\n const bytes = new Array(samplesCount);\n const timestamps = new Array(samplesCount);\n let head = 0;\n let tail = 0;\n let firstSampleTS;\n min = min !== void 0 ? min : 1e3;\n return function push(chunkLength) {\n const now = Date.now();\n const startedAt = timestamps[tail];\n if (!firstSampleTS) {\n firstSampleTS = now;\n }\n bytes[head] = chunkLength;\n timestamps[head] = now;\n let i = tail;\n let bytesCount = 0;\n while (i !== head) {\n bytesCount += bytes[i++];\n i = i % samplesCount;\n }\n head = (head + 1) % samplesCount;\n if (head === tail) {\n tail = (tail + 1) % samplesCount;\n }\n if (now - firstSampleTS < min) {\n return;\n }\n const passed = startedAt && now - startedAt;\n return passed ? Math.round(bytesCount * 1e3 / passed) : void 0;\n };\n}\nfunction throttle(fn, freq) {\n let timestamp = 0;\n let threshold = 1e3 / freq;\n let lastArgs;\n let timer;\n const invoke = (args, now = Date.now()) => {\n timestamp = now;\n lastArgs = null;\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n fn.apply(null, args);\n };\n const throttled = (...args) => {\n const now = Date.now();\n const passed = now - timestamp;\n if (passed >= threshold) {\n invoke(args, now);\n } else {\n lastArgs = args;\n if (!timer) {\n timer = setTimeout(() => {\n timer = null;\n invoke(lastArgs);\n }, threshold - passed);\n }\n }\n };\n const flush = () => lastArgs && invoke(lastArgs);\n return [throttled, flush];\n}\nconst progressEventReducer = (listener, isDownloadStream, freq = 3) => {\n let bytesNotified = 0;\n const _speedometer = speedometer(50, 250);\n return throttle((e) => {\n const loaded = e.loaded;\n const total = e.lengthComputable ? e.total : void 0;\n const progressBytes = loaded - bytesNotified;\n const rate = _speedometer(progressBytes);\n const inRange = loaded <= total;\n bytesNotified = loaded;\n const data = {\n loaded,\n total,\n progress: total ? loaded / total : void 0,\n bytes: progressBytes,\n rate: rate ? rate : void 0,\n estimated: rate && total && inRange ? (total - loaded) / rate : void 0,\n event: e,\n lengthComputable: total != null,\n [isDownloadStream ? \"download\" : \"upload\"]: true\n };\n listener(data);\n }, freq);\n};\nconst progressEventDecorator = (total, throttled) => {\n const lengthComputable = total != null;\n return [(loaded) => throttled[0]({\n lengthComputable,\n total,\n loaded\n }), throttled[1]];\n};\nconst asyncDecorator = (fn) => (...args) => utils$1.asap(() => fn(...args));\nconst isURLSameOrigin = platform.hasStandardBrowserEnv ? /* @__PURE__ */ ((origin2, isMSIE) => (url) => {\n url = new URL(url, platform.origin);\n return origin2.protocol === url.protocol && origin2.host === url.host && (isMSIE || origin2.port === url.port);\n})(\n new URL(platform.origin),\n platform.navigator && /(msie|trident)/i.test(platform.navigator.userAgent)\n) : () => true;\nconst cookies = platform.hasStandardBrowserEnv ? (\n // Standard browser envs support document.cookie\n {\n write(name, value, expires, path, domain, secure) {\n const cookie = [name + \"=\" + encodeURIComponent(value)];\n utils$1.isNumber(expires) && cookie.push(\"expires=\" + new Date(expires).toGMTString());\n utils$1.isString(path) && cookie.push(\"path=\" + path);\n utils$1.isString(domain) && cookie.push(\"domain=\" + domain);\n secure === true && cookie.push(\"secure\");\n document.cookie = cookie.join(\"; \");\n },\n read(name) {\n const match = document.cookie.match(new RegExp(\"(^|;\\\\s*)(\" + name + \")=([^;]*)\"));\n return match ? decodeURIComponent(match[3]) : null;\n },\n remove(name) {\n this.write(name, \"\", Date.now() - 864e5);\n }\n }\n) : (\n // Non-standard browser env (web workers, react-native) lack needed support.\n {\n write() {\n },\n read() {\n return null;\n },\n remove() {\n }\n }\n);\nfunction isAbsoluteURL(url) {\n return /^([a-z][a-z\\d+\\-.]*:)?\\/\\//i.test(url);\n}\nfunction combineURLs(baseURL, relativeURL) {\n return relativeURL ? baseURL.replace(/\\/?\\/$/, \"\") + \"/\" + relativeURL.replace(/^\\/+/, \"\") : baseURL;\n}\nfunction buildFullPath(baseURL, requestedURL, allowAbsoluteUrls) {\n let isRelativeUrl = !isAbsoluteURL(requestedURL);\n if (baseURL && (isRelativeUrl || allowAbsoluteUrls == false)) {\n return combineURLs(baseURL, requestedURL);\n }\n return requestedURL;\n}\nconst headersToObject = (thing) => thing instanceof AxiosHeaders ? { ...thing } : thing;\nfunction mergeConfig(config1, config2) {\n config2 = config2 || {};\n const config = {};\n function getMergedValue(target, source, prop, caseless) {\n if (utils$1.isPlainObject(target) && utils$1.isPlainObject(source)) {\n return utils$1.merge.call({ caseless }, target, source);\n } else if (utils$1.isPlainObject(source)) {\n return utils$1.merge({}, source);\n } else if (utils$1.isArray(source)) {\n return source.slice();\n }\n return source;\n }\n function mergeDeepProperties(a, b, prop, caseless) {\n if (!utils$1.isUndefined(b)) {\n return getMergedValue(a, b, prop, caseless);\n } else if (!utils$1.isUndefined(a)) {\n return getMergedValue(void 0, a, prop, caseless);\n }\n }\n function valueFromConfig2(a, b) {\n if (!utils$1.isUndefined(b)) {\n return getMergedValue(void 0, b);\n }\n }\n function defaultToConfig2(a, b) {\n if (!utils$1.isUndefined(b)) {\n return getMergedValue(void 0, b);\n } else if (!utils$1.isUndefined(a)) {\n return getMergedValue(void 0, a);\n }\n }\n function mergeDirectKeys(a, b, prop) {\n if (prop in config2) {\n return getMergedValue(a, b);\n } else if (prop in config1) {\n return getMergedValue(void 0, a);\n }\n }\n const mergeMap = {\n url: valueFromConfig2,\n method: valueFromConfig2,\n data: valueFromConfig2,\n baseURL: defaultToConfig2,\n transformRequest: defaultToConfig2,\n transformResponse: defaultToConfig2,\n paramsSerializer: defaultToConfig2,\n timeout: defaultToConfig2,\n timeoutMessage: defaultToConfig2,\n withCredentials: defaultToConfig2,\n withXSRFToken: defaultToConfig2,\n adapter: defaultToConfig2,\n responseType: defaultToConfig2,\n xsrfCookieName: defaultToConfig2,\n xsrfHeaderName: defaultToConfig2,\n onUploadProgress: defaultToConfig2,\n onDownloadProgress: defaultToConfig2,\n decompress: defaultToConfig2,\n maxContentLength: defaultToConfig2,\n maxBodyLength: defaultToConfig2,\n beforeRedirect: defaultToConfig2,\n transport: defaultToConfig2,\n httpAgent: defaultToConfig2,\n httpsAgent: defaultToConfig2,\n cancelToken: defaultToConfig2,\n socketPath: defaultToConfig2,\n responseEncoding: defaultToConfig2,\n validateStatus: mergeDirectKeys,\n headers: (a, b, prop) => mergeDeepProperties(headersToObject(a), headersToObject(b), prop, true)\n };\n utils$1.forEach(Object.keys(Object.assign({}, config1, config2)), function computeConfigValue(prop) {\n const merge2 = mergeMap[prop] || mergeDeepProperties;\n const configValue = merge2(config1[prop], config2[prop], prop);\n utils$1.isUndefined(configValue) && merge2 !== mergeDirectKeys || (config[prop] = configValue);\n });\n return config;\n}\nconst resolveConfig = (config) => {\n const newConfig = mergeConfig({}, config);\n let { data, withXSRFToken, xsrfHeaderName, xsrfCookieName, headers, auth } = newConfig;\n newConfig.headers = headers = AxiosHeaders.from(headers);\n newConfig.url = buildURL(buildFullPath(newConfig.baseURL, newConfig.url, newConfig.allowAbsoluteUrls), config.params, config.paramsSerializer);\n if (auth) {\n headers.set(\n \"Authorization\",\n \"Basic \" + btoa((auth.username || \"\") + \":\" + (auth.password ? unescape(encodeURIComponent(auth.password)) : \"\"))\n );\n }\n let contentType;\n if (utils$1.isFormData(data)) {\n if (platform.hasStandardBrowserEnv || platform.hasStandardBrowserWebWorkerEnv) {\n headers.setContentType(void 0);\n } else if ((contentType = headers.getContentType()) !== false) {\n const [type, ...tokens] = contentType ? contentType.split(\";\").map((token) => token.trim()).filter(Boolean) : [];\n headers.setContentType([type || \"multipart/form-data\", ...tokens].join(\"; \"));\n }\n }\n if (platform.hasStandardBrowserEnv) {\n withXSRFToken && utils$1.isFunction(withXSRFToken) && (withXSRFToken = withXSRFToken(newConfig));\n if (withXSRFToken || withXSRFToken !== false && isURLSameOrigin(newConfig.url)) {\n const xsrfValue = xsrfHeaderName && xsrfCookieName && cookies.read(xsrfCookieName);\n if (xsrfValue) {\n headers.set(xsrfHeaderName, xsrfValue);\n }\n }\n }\n return newConfig;\n};\nconst isXHRAdapterSupported = typeof XMLHttpRequest !== \"undefined\";\nconst xhrAdapter = isXHRAdapterSupported && function(config) {\n return new Promise(function dispatchXhrRequest(resolve, reject) {\n const _config = resolveConfig(config);\n let requestData = _config.data;\n const requestHeaders = AxiosHeaders.from(_config.headers).normalize();\n let { responseType, onUploadProgress, onDownloadProgress } = _config;\n let onCanceled;\n let uploadThrottled, downloadThrottled;\n let flushUpload, flushDownload;\n function done() {\n flushUpload && flushUpload();\n flushDownload && flushDownload();\n _config.cancelToken && _config.cancelToken.unsubscribe(onCanceled);\n _config.signal && _config.signal.removeEventListener(\"abort\", onCanceled);\n }\n let request = new XMLHttpRequest();\n request.open(_config.method.toUpperCase(), _config.url, true);\n request.timeout = _config.timeout;\n function onloadend() {\n if (!request) {\n return;\n }\n const responseHeaders = AxiosHeaders.from(\n \"getAllResponseHeaders\" in request && request.getAllResponseHeaders()\n );\n const responseData = !responseType || responseType === \"text\" || responseType === \"json\" ? request.responseText : request.response;\n const response = {\n data: responseData,\n status: request.status,\n statusText: request.statusText,\n headers: responseHeaders,\n config,\n request\n };\n settle(function _resolve(value) {\n resolve(value);\n done();\n }, function _reject(err) {\n reject(err);\n done();\n }, response);\n request = null;\n }\n if (\"onloadend\" in request) {\n request.onloadend = onloadend;\n } else {\n request.onreadystatechange = function handleLoad() {\n if (!request || request.readyState !== 4) {\n return;\n }\n if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf(\"file:\") === 0)) {\n return;\n }\n setTimeout(onloadend);\n };\n }\n request.onabort = function handleAbort() {\n if (!request) {\n return;\n }\n reject(new AxiosError(\"Request aborted\", AxiosError.ECONNABORTED, config, request));\n request = null;\n };\n request.onerror = function handleError() {\n reject(new AxiosError(\"Network Error\", AxiosError.ERR_NETWORK, config, request));\n request = null;\n };\n request.ontimeout = function handleTimeout() {\n let timeoutErrorMessage = _config.timeout ? \"timeout of \" + _config.timeout + \"ms exceeded\" : \"timeout exceeded\";\n const transitional2 = _config.transitional || transitionalDefaults;\n if (_config.timeoutErrorMessage) {\n timeoutErrorMessage = _config.timeoutErrorMessage;\n }\n reject(new AxiosError(\n timeoutErrorMessage,\n transitional2.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,\n config,\n request\n ));\n request = null;\n };\n requestData === void 0 && requestHeaders.setContentType(null);\n if (\"setRequestHeader\" in request) {\n utils$1.forEach(requestHeaders.toJSON(), function setRequestHeader(val, key) {\n request.setRequestHeader(key, val);\n });\n }\n if (!utils$1.isUndefined(_config.withCredentials)) {\n request.withCredentials = !!_config.withCredentials;\n }\n if (responseType && responseType !== \"json\") {\n request.responseType = _config.responseType;\n }\n if (onDownloadProgress) {\n [downloadThrottled, flushDownload] = progressEventReducer(onDownloadProgress, true);\n request.addEventListener(\"progress\", downloadThrottled);\n }\n if (onUploadProgress && request.upload) {\n [uploadThrottled, flushUpload] = progressEventReducer(onUploadProgress);\n request.upload.addEventListener(\"progress\", uploadThrottled);\n request.upload.addEventListener(\"loadend\", flushUpload);\n }\n if (_config.cancelToken || _config.signal) {\n onCanceled = (cancel) => {\n if (!request) {\n return;\n }\n reject(!cancel || cancel.type ? new CanceledError(null, config, request) : cancel);\n request.abort();\n request = null;\n };\n _config.cancelToken && _config.cancelToken.subscribe(onCanceled);\n if (_config.signal) {\n _config.signal.aborted ? onCanceled() : _config.signal.addEventListener(\"abort\", onCanceled);\n }\n }\n const protocol = parseProtocol(_config.url);\n if (protocol && platform.protocols.indexOf(protocol) === -1) {\n reject(new AxiosError(\"Unsupported protocol \" + protocol + \":\", AxiosError.ERR_BAD_REQUEST, config));\n return;\n }\n request.send(requestData || null);\n });\n};\nconst composeSignals = (signals, timeout) => {\n const { length } = signals = signals ? signals.filter(Boolean) : [];\n if (timeout || length) {\n let controller = new AbortController();\n let aborted;\n const onabort = function(reason) {\n if (!aborted) {\n aborted = true;\n unsubscribe();\n const err = reason instanceof Error ? reason : this.reason;\n controller.abort(err instanceof AxiosError ? err : new CanceledError(err instanceof Error ? err.message : err));\n }\n };\n let timer = timeout && setTimeout(() => {\n timer = null;\n onabort(new AxiosError(`timeout ${timeout} of ms exceeded`, AxiosError.ETIMEDOUT));\n }, timeout);\n const unsubscribe = () => {\n if (signals) {\n timer && clearTimeout(timer);\n timer = null;\n signals.forEach((signal2) => {\n signal2.unsubscribe ? signal2.unsubscribe(onabort) : signal2.removeEventListener(\"abort\", onabort);\n });\n signals = null;\n }\n };\n signals.forEach((signal2) => signal2.addEventListener(\"abort\", onabort));\n const { signal } = controller;\n signal.unsubscribe = () => utils$1.asap(unsubscribe);\n return signal;\n }\n};\nconst streamChunk = function* (chunk, chunkSize) {\n let len = chunk.byteLength;\n if (len < chunkSize) {\n yield chunk;\n return;\n }\n let pos = 0;\n let end;\n while (pos < len) {\n end = pos + chunkSize;\n yield chunk.slice(pos, end);\n pos = end;\n }\n};\nconst readBytes = async function* (iterable, chunkSize) {\n for await (const chunk of readStream(iterable)) {\n yield* streamChunk(chunk, chunkSize);\n }\n};\nconst readStream = async function* (stream) {\n if (stream[Symbol.asyncIterator]) {\n yield* stream;\n return;\n }\n const reader = stream.getReader();\n try {\n for (; ; ) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n yield value;\n }\n } finally {\n await reader.cancel();\n }\n};\nconst trackStream = (stream, chunkSize, onProgress, onFinish) => {\n const iterator = readBytes(stream, chunkSize);\n let bytes = 0;\n let done;\n let _onFinish = (e) => {\n if (!done) {\n done = true;\n onFinish && onFinish(e);\n }\n };\n return new ReadableStream({\n async pull(controller) {\n try {\n const { done: done2, value } = await iterator.next();\n if (done2) {\n _onFinish();\n controller.close();\n return;\n }\n let len = value.byteLength;\n if (onProgress) {\n let loadedBytes = bytes += len;\n onProgress(loadedBytes);\n }\n controller.enqueue(new Uint8Array(value));\n } catch (err) {\n _onFinish(err);\n throw err;\n }\n },\n cancel(reason) {\n _onFinish(reason);\n return iterator.return();\n }\n }, {\n highWaterMark: 2\n });\n};\nconst isFetchSupported = typeof fetch === \"function\" && typeof Request === \"function\" && typeof Response === \"function\";\nconst isReadableStreamSupported = isFetchSupported && typeof ReadableStream === \"function\";\nconst encodeText = isFetchSupported && (typeof TextEncoder === \"function\" ? /* @__PURE__ */ ((encoder) => (str) => encoder.encode(str))(new TextEncoder()) : async (str) => new Uint8Array(await new Response(str).arrayBuffer()));\nconst test = (fn, ...args) => {\n try {\n return !!fn(...args);\n } catch (e) {\n return false;\n }\n};\nconst supportsRequestStream = isReadableStreamSupported && test(() => {\n let duplexAccessed = false;\n const hasContentType = new Request(platform.origin, {\n body: new ReadableStream(),\n method: \"POST\",\n get duplex() {\n duplexAccessed = true;\n return \"half\";\n }\n }).headers.has(\"Content-Type\");\n return duplexAccessed && !hasContentType;\n});\nconst DEFAULT_CHUNK_SIZE = 64 * 1024;\nconst supportsResponseStream = isReadableStreamSupported && test(() => utils$1.isReadableStream(new Response(\"\").body));\nconst resolvers = {\n stream: supportsResponseStream && ((res) => res.body)\n};\nisFetchSupported && ((res) => {\n [\"text\", \"arrayBuffer\", \"blob\", \"formData\", \"stream\"].forEach((type) => {\n !resolvers[type] && (resolvers[type] = utils$1.isFunction(res[type]) ? (res2) => res2[type]() : (_, config) => {\n throw new AxiosError(`Response type '${type}' is not supported`, AxiosError.ERR_NOT_SUPPORT, config);\n });\n });\n})(new Response());\nconst getBodyLength = async (body) => {\n if (body == null) {\n return 0;\n }\n if (utils$1.isBlob(body)) {\n return body.size;\n }\n if (utils$1.isSpecCompliantForm(body)) {\n const _request = new Request(platform.origin, {\n method: \"POST\",\n body\n });\n return (await _request.arrayBuffer()).byteLength;\n }\n if (utils$1.isArrayBufferView(body) || utils$1.isArrayBuffer(body)) {\n return body.byteLength;\n }\n if (utils$1.isURLSearchParams(body)) {\n body = body + \"\";\n }\n if (utils$1.isString(body)) {\n return (await encodeText(body)).byteLength;\n }\n};\nconst resolveBodyLength = async (headers, body) => {\n const length = utils$1.toFiniteNumber(headers.getContentLength());\n return length == null ? getBodyLength(body) : length;\n};\nconst fetchAdapter = isFetchSupported && (async (config) => {\n let {\n url,\n method,\n data,\n signal,\n cancelToken,\n timeout,\n onDownloadProgress,\n onUploadProgress,\n responseType,\n headers,\n withCredentials = \"same-origin\",\n fetchOptions\n } = resolveConfig(config);\n responseType = responseType ? (responseType + \"\").toLowerCase() : \"text\";\n let composedSignal = composeSignals([signal, cancelToken && cancelToken.toAbortSignal()], timeout);\n let request;\n const unsubscribe = composedSignal && composedSignal.unsubscribe && (() => {\n composedSignal.unsubscribe();\n });\n let requestContentLength;\n try {\n if (onUploadProgress && supportsRequestStream && method !== \"get\" && method !== \"head\" && (requestContentLength = await resolveBodyLength(headers, data)) !== 0) {\n let _request = new Request(url, {\n method: \"POST\",\n body: data,\n duplex: \"half\"\n });\n let contentTypeHeader;\n if (utils$1.isFormData(data) && (contentTypeHeader = _request.headers.get(\"content-type\"))) {\n headers.setContentType(contentTypeHeader);\n }\n if (_request.body) {\n const [onProgress, flush] = progressEventDecorator(\n requestContentLength,\n progressEventReducer(asyncDecorator(onUploadProgress))\n );\n data = trackStream(_request.body, DEFAULT_CHUNK_SIZE, onProgress, flush);\n }\n }\n if (!utils$1.isString(withCredentials)) {\n withCredentials = withCredentials ? \"include\" : \"omit\";\n }\n const isCredentialsSupported = \"credentials\" in Request.prototype;\n request = new Request(url, {\n ...fetchOptions,\n signal: composedSignal,\n method: method.toUpperCase(),\n headers: headers.normalize().toJSON(),\n body: data,\n duplex: \"half\",\n credentials: isCredentialsSupported ? withCredentials : void 0\n });\n let response = await fetch(request);\n const isStreamResponse = supportsResponseStream && (responseType === \"stream\" || responseType === \"response\");\n if (supportsResponseStream && (onDownloadProgress || isStreamResponse && unsubscribe)) {\n const options = {};\n [\"status\", \"statusText\", \"headers\"].forEach((prop) => {\n options[prop] = response[prop];\n });\n const responseContentLength = utils$1.toFiniteNumber(response.headers.get(\"content-length\"));\n const [onProgress, flush] = onDownloadProgress && progressEventDecorator(\n responseContentLength,\n progressEventReducer(asyncDecorator(onDownloadProgress), true)\n ) || [];\n response = new Response(\n trackStream(response.body, DEFAULT_CHUNK_SIZE, onProgress, () => {\n flush && flush();\n unsubscribe && unsubscribe();\n }),\n options\n );\n }\n responseType = responseType || \"text\";\n let responseData = await resolvers[utils$1.findKey(resolvers, responseType) || \"text\"](response, config);\n !isStreamResponse && unsubscribe && unsubscribe();\n return await new Promise((resolve, reject) => {\n settle(resolve, reject, {\n data: responseData,\n headers: AxiosHeaders.from(response.headers),\n status: response.status,\n statusText: response.statusText,\n config,\n request\n });\n });\n } catch (err) {\n unsubscribe && unsubscribe();\n if (err && err.name === \"TypeError\" && /fetch/i.test(err.message)) {\n throw Object.assign(\n new AxiosError(\"Network Error\", AxiosError.ERR_NETWORK, config, request),\n {\n cause: err.cause || err\n }\n );\n }\n throw AxiosError.from(err, err && err.code, config, request);\n }\n});\nconst knownAdapters = {\n http: httpAdapter,\n xhr: xhrAdapter,\n fetch: fetchAdapter\n};\nutils$1.forEach(knownAdapters, (fn, value) => {\n if (fn) {\n try {\n Object.defineProperty(fn, \"name\", { value });\n } catch (e) {\n }\n Object.defineProperty(fn, \"adapterName\", { value });\n }\n});\nconst renderReason = (reason) => `- ${reason}`;\nconst isResolvedHandle = (adapter) => utils$1.isFunction(adapter) || adapter === null || adapter === false;\nconst adapters = {\n getAdapter: (adapters2) => {\n adapters2 = utils$1.isArray(adapters2) ? adapters2 : [adapters2];\n const { length } = adapters2;\n let nameOrAdapter;\n let adapter;\n const rejectedReasons = {};\n for (let i = 0; i < length; i++) {\n nameOrAdapter = adapters2[i];\n let id;\n adapter = nameOrAdapter;\n if (!isResolvedHandle(nameOrAdapter)) {\n adapter = knownAdapters[(id = String(nameOrAdapter)).toLowerCase()];\n if (adapter === void 0) {\n throw new AxiosError(`Unknown adapter '${id}'`);\n }\n }\n if (adapter) {\n break;\n }\n rejectedReasons[id || \"#\" + i] = adapter;\n }\n if (!adapter) {\n const reasons = Object.entries(rejectedReasons).map(\n ([id, state]) => `adapter ${id} ` + (state === false ? \"is not supported by the environment\" : \"is not available in the build\")\n );\n let s = length ? reasons.length > 1 ? \"since :\\n\" + reasons.map(renderReason).join(\"\\n\") : \" \" + renderReason(reasons[0]) : \"as no adapter specified\";\n throw new AxiosError(\n `There is no suitable adapter to dispatch the request ` + s,\n \"ERR_NOT_SUPPORT\"\n );\n }\n return adapter;\n },\n adapters: knownAdapters\n};\nfunction throwIfCancellationRequested(config) {\n if (config.cancelToken) {\n config.cancelToken.throwIfRequested();\n }\n if (config.signal && config.signal.aborted) {\n throw new CanceledError(null, config);\n }\n}\nfunction dispatchRequest(config) {\n throwIfCancellationRequested(config);\n config.headers = AxiosHeaders.from(config.headers);\n config.data = transformData.call(\n config,\n config.transformRequest\n );\n if ([\"post\", \"put\", \"patch\"].indexOf(config.method) !== -1) {\n config.headers.setContentType(\"application/x-www-form-urlencoded\", false);\n }\n const adapter = adapters.getAdapter(config.adapter || defaults.adapter);\n return adapter(config).then(function onAdapterResolution(response) {\n throwIfCancellationRequested(config);\n response.data = transformData.call(\n config,\n config.transformResponse,\n response\n );\n response.headers = AxiosHeaders.from(response.headers);\n return response;\n }, function onAdapterRejection(reason) {\n if (!isCancel(reason)) {\n throwIfCancellationRequested(config);\n if (reason && reason.response) {\n reason.response.data = transformData.call(\n config,\n config.transformResponse,\n reason.response\n );\n reason.response.headers = AxiosHeaders.from(reason.response.headers);\n }\n }\n return Promise.reject(reason);\n });\n}\nconst VERSION = \"1.8.4\";\nconst validators$1 = {};\n[\"object\", \"boolean\", \"number\", \"function\", \"string\", \"symbol\"].forEach((type, i) => {\n validators$1[type] = function validator2(thing) {\n return typeof thing === type || \"a\" + (i < 1 ? \"n \" : \" \") + type;\n };\n});\nconst deprecatedWarnings = {};\nvalidators$1.transitional = function transitional(validator2, version, message) {\n function formatMessage(opt, desc) {\n return \"[Axios v\" + VERSION + \"] Transitional option '\" + opt + \"'\" + desc + (message ? \". \" + message : \"\");\n }\n return (value, opt, opts) => {\n if (validator2 === false) {\n throw new AxiosError(\n formatMessage(opt, \" has been removed\" + (version ? \" in \" + version : \"\")),\n AxiosError.ERR_DEPRECATED\n );\n }\n if (version && !deprecatedWarnings[opt]) {\n deprecatedWarnings[opt] = true;\n console.warn(\n formatMessage(\n opt,\n \" has been deprecated since v\" + version + \" and will be removed in the near future\"\n )\n );\n }\n return validator2 ? validator2(value, opt, opts) : true;\n };\n};\nvalidators$1.spelling = function spelling(correctSpelling) {\n return (value, opt) => {\n console.warn(`${opt} is likely a misspelling of ${correctSpelling}`);\n return true;\n };\n};\nfunction assertOptions(options, schema, allowUnknown) {\n if (typeof options !== \"object\") {\n throw new AxiosError(\"options must be an object\", AxiosError.ERR_BAD_OPTION_VALUE);\n }\n const keys = Object.keys(options);\n let i = keys.length;\n while (i-- > 0) {\n const opt = keys[i];\n const validator2 = schema[opt];\n if (validator2) {\n const value = options[opt];\n const result = value === void 0 || validator2(value, opt, options);\n if (result !== true) {\n throw new AxiosError(\"option \" + opt + \" must be \" + result, AxiosError.ERR_BAD_OPTION_VALUE);\n }\n continue;\n }\n if (allowUnknown !== true) {\n throw new AxiosError(\"Unknown option \" + opt, AxiosError.ERR_BAD_OPTION);\n }\n }\n}\nconst validator = {\n assertOptions,\n validators: validators$1\n};\nconst validators = validator.validators;\nclass Axios {\n constructor(instanceConfig) {\n this.defaults = instanceConfig;\n this.interceptors = {\n request: new InterceptorManager(),\n response: new InterceptorManager()\n };\n }\n /**\n * Dispatch a request\n *\n * @param {String|Object} configOrUrl The config specific for this request (merged with this.defaults)\n * @param {?Object} config\n *\n * @returns {Promise} The Promise to be fulfilled\n */\n async request(configOrUrl, config) {\n try {\n return await this._request(configOrUrl, config);\n } catch (err) {\n if (err instanceof Error) {\n let dummy = {};\n Error.captureStackTrace ? Error.captureStackTrace(dummy) : dummy = new Error();\n const stack = dummy.stack ? dummy.stack.replace(/^.+\\n/, \"\") : \"\";\n try {\n if (!err.stack) {\n err.stack = stack;\n } else if (stack && !String(err.stack).endsWith(stack.replace(/^.+\\n.+\\n/, \"\"))) {\n err.stack += \"\\n\" + stack;\n }\n } catch (e) {\n }\n }\n throw err;\n }\n }\n _request(configOrUrl, config) {\n if (typeof configOrUrl === \"string\") {\n config = config || {};\n config.url = configOrUrl;\n } else {\n config = configOrUrl || {};\n }\n config = mergeConfig(this.defaults, config);\n const { transitional: transitional2, paramsSerializer, headers } = config;\n if (transitional2 !== void 0) {\n validator.assertOptions(transitional2, {\n silentJSONParsing: validators.transitional(validators.boolean),\n forcedJSONParsing: validators.transitional(validators.boolean),\n clarifyTimeoutError: validators.transitional(validators.boolean)\n }, false);\n }\n if (paramsSerializer != null) {\n if (utils$1.isFunction(paramsSerializer)) {\n config.paramsSerializer = {\n serialize: paramsSerializer\n };\n } else {\n validator.assertOptions(paramsSerializer, {\n encode: validators.function,\n serialize: validators.function\n }, true);\n }\n }\n if (config.allowAbsoluteUrls !== void 0) ;\n else if (this.defaults.allowAbsoluteUrls !== void 0) {\n config.allowAbsoluteUrls = this.defaults.allowAbsoluteUrls;\n } else {\n config.allowAbsoluteUrls = true;\n }\n validator.assertOptions(config, {\n baseUrl: validators.spelling(\"baseURL\"),\n withXsrfToken: validators.spelling(\"withXSRFToken\")\n }, true);\n config.method = (config.method || this.defaults.method || \"get\").toLowerCase();\n let contextHeaders = headers && utils$1.merge(\n headers.common,\n headers[config.method]\n );\n headers && utils$1.forEach(\n [\"delete\", \"get\", \"head\", \"post\", \"put\", \"patch\", \"common\"],\n (method) => {\n delete headers[method];\n }\n );\n config.headers = AxiosHeaders.concat(contextHeaders, headers);\n const requestInterceptorChain = [];\n let synchronousRequestInterceptors = true;\n this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n if (typeof interceptor.runWhen === \"function\" && interceptor.runWhen(config) === false) {\n return;\n }\n synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;\n requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);\n });\n const responseInterceptorChain = [];\n this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);\n });\n let promise;\n let i = 0;\n let len;\n if (!synchronousRequestInterceptors) {\n const chain = [dispatchRequest.bind(this), void 0];\n chain.unshift.apply(chain, requestInterceptorChain);\n chain.push.apply(chain, responseInterceptorChain);\n len = chain.length;\n promise = Promise.resolve(config);\n while (i < len) {\n promise = promise.then(chain[i++], chain[i++]);\n }\n return promise;\n }\n len = requestInterceptorChain.length;\n let newConfig = config;\n i = 0;\n while (i < len) {\n const onFulfilled = requestInterceptorChain[i++];\n const onRejected = requestInterceptorChain[i++];\n try {\n newConfig = onFulfilled(newConfig);\n } catch (error) {\n onRejected.call(this, error);\n break;\n }\n }\n try {\n promise = dispatchRequest.call(this, newConfig);\n } catch (error) {\n return Promise.reject(error);\n }\n i = 0;\n len = responseInterceptorChain.length;\n while (i < len) {\n promise = promise.then(responseInterceptorChain[i++], responseInterceptorChain[i++]);\n }\n return promise;\n }\n getUri(config) {\n config = mergeConfig(this.defaults, config);\n const fullPath = buildFullPath(config.baseURL, config.url, config.allowAbsoluteUrls);\n return buildURL(fullPath, config.params, config.paramsSerializer);\n }\n}\nutils$1.forEach([\"delete\", \"get\", \"head\", \"options\"], function forEachMethodNoData(method) {\n Axios.prototype[method] = function(url, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n url,\n data: (config || {}).data\n }));\n };\n});\nutils$1.forEach([\"post\", \"put\", \"patch\"], function forEachMethodWithData(method) {\n function generateHTTPMethod(isForm) {\n return function httpMethod(url, data, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n headers: isForm ? {\n \"Content-Type\": \"multipart/form-data\"\n } : {},\n url,\n data\n }));\n };\n }\n Axios.prototype[method] = generateHTTPMethod();\n Axios.prototype[method + \"Form\"] = generateHTTPMethod(true);\n});\nclass CancelToken {\n constructor(executor) {\n if (typeof executor !== \"function\") {\n throw new TypeError(\"executor must be a function.\");\n }\n let resolvePromise;\n this.promise = new Promise(function promiseExecutor(resolve) {\n resolvePromise = resolve;\n });\n const token = this;\n this.promise.then((cancel) => {\n if (!token._listeners) return;\n let i = token._listeners.length;\n while (i-- > 0) {\n token._listeners[i](cancel);\n }\n token._listeners = null;\n });\n this.promise.then = (onfulfilled) => {\n let _resolve;\n const promise = new Promise((resolve) => {\n token.subscribe(resolve);\n _resolve = resolve;\n }).then(onfulfilled);\n promise.cancel = function reject() {\n token.unsubscribe(_resolve);\n };\n return promise;\n };\n executor(function cancel(message, config, request) {\n if (token.reason) {\n return;\n }\n token.reason = new CanceledError(message, config, request);\n resolvePromise(token.reason);\n });\n }\n /**\n * Throws a `CanceledError` if cancellation has been requested.\n */\n throwIfRequested() {\n if (this.reason) {\n throw this.reason;\n }\n }\n /**\n * Subscribe to the cancel signal\n */\n subscribe(listener) {\n if (this.reason) {\n listener(this.reason);\n return;\n }\n if (this._listeners) {\n this._listeners.push(listener);\n } else {\n this._listeners = [listener];\n }\n }\n /**\n * Unsubscribe from the cancel signal\n */\n unsubscribe(listener) {\n if (!this._listeners) {\n return;\n }\n const index = this._listeners.indexOf(listener);\n if (index !== -1) {\n this._listeners.splice(index, 1);\n }\n }\n toAbortSignal() {\n const controller = new AbortController();\n const abort = (err) => {\n controller.abort(err);\n };\n this.subscribe(abort);\n controller.signal.unsubscribe = () => this.unsubscribe(abort);\n return controller.signal;\n }\n /**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */\n static source() {\n let cancel;\n const token = new CancelToken(function executor(c) {\n cancel = c;\n });\n return {\n token,\n cancel\n };\n }\n}\nfunction spread(callback) {\n return function wrap(arr) {\n return callback.apply(null, arr);\n };\n}\nfunction isAxiosError(payload) {\n return utils$1.isObject(payload) && payload.isAxiosError === true;\n}\nconst HttpStatusCode = {\n Continue: 100,\n SwitchingProtocols: 101,\n Processing: 102,\n EarlyHints: 103,\n Ok: 200,\n Created: 201,\n Accepted: 202,\n NonAuthoritativeInformation: 203,\n NoContent: 204,\n ResetContent: 205,\n PartialContent: 206,\n MultiStatus: 207,\n AlreadyReported: 208,\n ImUsed: 226,\n MultipleChoices: 300,\n MovedPermanently: 301,\n Found: 302,\n SeeOther: 303,\n NotModified: 304,\n UseProxy: 305,\n Unused: 306,\n TemporaryRedirect: 307,\n PermanentRedirect: 308,\n BadRequest: 400,\n Unauthorized: 401,\n PaymentRequired: 402,\n Forbidden: 403,\n NotFound: 404,\n MethodNotAllowed: 405,\n NotAcceptable: 406,\n ProxyAuthenticationRequired: 407,\n RequestTimeout: 408,\n Conflict: 409,\n Gone: 410,\n LengthRequired: 411,\n PreconditionFailed: 412,\n PayloadTooLarge: 413,\n UriTooLong: 414,\n UnsupportedMediaType: 415,\n RangeNotSatisfiable: 416,\n ExpectationFailed: 417,\n ImATeapot: 418,\n MisdirectedRequest: 421,\n UnprocessableEntity: 422,\n Locked: 423,\n FailedDependency: 424,\n TooEarly: 425,\n UpgradeRequired: 426,\n PreconditionRequired: 428,\n TooManyRequests: 429,\n RequestHeaderFieldsTooLarge: 431,\n UnavailableForLegalReasons: 451,\n InternalServerError: 500,\n NotImplemented: 501,\n BadGateway: 502,\n ServiceUnavailable: 503,\n GatewayTimeout: 504,\n HttpVersionNotSupported: 505,\n VariantAlsoNegotiates: 506,\n InsufficientStorage: 507,\n LoopDetected: 508,\n NotExtended: 510,\n NetworkAuthenticationRequired: 511\n};\nObject.entries(HttpStatusCode).forEach(([key, value]) => {\n HttpStatusCode[value] = key;\n});\nfunction createInstance(defaultConfig) {\n const context = new Axios(defaultConfig);\n const instance = bind(Axios.prototype.request, context);\n utils$1.extend(instance, Axios.prototype, context, { allOwnKeys: true });\n utils$1.extend(instance, context, null, { allOwnKeys: true });\n instance.create = function create(instanceConfig) {\n return createInstance(mergeConfig(defaultConfig, instanceConfig));\n };\n return instance;\n}\nconst axios = createInstance(defaults);\naxios.Axios = Axios;\naxios.CanceledError = CanceledError;\naxios.CancelToken = CancelToken;\naxios.isCancel = isCancel;\naxios.VERSION = VERSION;\naxios.toFormData = toFormData;\naxios.AxiosError = AxiosError;\naxios.Cancel = axios.CanceledError;\naxios.all = function all(promises) {\n return Promise.all(promises);\n};\naxios.spread = spread;\naxios.isAxiosError = isAxiosError;\naxios.mergeConfig = mergeConfig;\naxios.AxiosHeaders = AxiosHeaders;\naxios.formToJSON = (thing) => formDataToJSON(utils$1.isHTMLForm(thing) ? new FormData(thing) : thing);\naxios.getAdapter = adapters.getAdapter;\naxios.HttpStatusCode = HttpStatusCode;\naxios.default = axios;\nconst _Logger = class _Logger {\n constructor() {\n __publicField(this, \"isProduction\");\n this.isProduction = process$1.env.NODE_ENV === \"production\";\n }\n static getInstance() {\n if (!_Logger.instance) {\n _Logger.instance = new _Logger();\n }\n return _Logger.instance;\n }\n debug(message, ...args) {\n if (!this.isProduction) {\n console.debug(message, ...args);\n }\n }\n info(message, ...args) {\n if (!this.isProduction) {\n console.info(message, ...args);\n }\n }\n warn(message, ...args) {\n console.warn(message, ...args);\n }\n error(message, ...args) {\n console.error(message, ...args);\n }\n};\n__publicField(_Logger, \"instance\");\nlet Logger = _Logger;\nclass ValidationError extends Error {\n constructor(message) {\n super(message);\n this.name = \"ValidationError\";\n }\n}\nclass Auth {\n constructor(config) {\n __publicField(this, \"accountId\");\n __publicField(this, \"privateKey\");\n __publicField(this, \"baseUrl\");\n __publicField(this, \"network\");\n this.accountId = config.accountId;\n this.privateKey = PrivateKey.fromStringED25519(config.privateKey);\n this.network = config.network || \"mainnet\";\n this.baseUrl = config.baseUrl || \"https://kiloscribe.com\";\n }\n async authenticate() {\n var _a, _b, _c;\n const requestSignatureResponse = await axios.get(\n `${this.baseUrl}/api/auth/request-signature`,\n {\n headers: {\n \"x-session\": this.accountId\n }\n }\n );\n if (!((_a = requestSignatureResponse.data) == null ? void 0 : _a.message)) {\n throw new Error(\"Failed to get signature message\");\n }\n const message = requestSignatureResponse.data.message;\n const signature = await this.signMessage(message);\n const authResponse = await axios.post(\n `${this.baseUrl}/api/auth/authenticate`,\n {\n authData: {\n id: this.accountId,\n signature,\n data: message,\n network: this.network\n },\n include: \"apiKey\"\n }\n );\n if (!((_c = (_b = authResponse.data) == null ? void 0 : _b.user) == null ? void 0 : _c.sessionToken)) {\n throw new Error(\"Authentication failed\");\n }\n return {\n apiKey: authResponse.data.apiKey\n };\n }\n async signMessage(message) {\n const messageBytes = new TextEncoder().encode(message);\n const signatureBytes = await this.privateKey.sign(messageBytes);\n return Buffer$1.from(signatureBytes).toString(\"hex\");\n }\n}\nclass ClientAuth {\n constructor(config) {\n __publicField(this, \"accountId\");\n __publicField(this, \"signer\");\n __publicField(this, \"baseUrl\");\n __publicField(this, \"network\");\n __publicField(this, \"logger\");\n this.accountId = config.accountId;\n this.signer = config.signer;\n this.network = config.network || \"mainnet\";\n this.baseUrl = config.baseUrl || \"https://kiloscribe.com\";\n this.logger = config.logger;\n }\n async authenticate() {\n var _a, _b, _c;\n const requestSignatureResponse = await axios.get(\n `${this.baseUrl}/api/auth/request-signature`,\n {\n headers: {\n \"x-session\": this.accountId\n }\n }\n );\n if (!((_a = requestSignatureResponse.data) == null ? void 0 : _a.message)) {\n throw new Error(\"Failed to get signature message\");\n }\n const message = requestSignatureResponse.data.message;\n const signature = await this.signMessage(JSON.stringify(message));\n const authResponse = await axios.post(\n `${this.baseUrl}/api/auth/authenticate`,\n {\n authData: {\n id: this.accountId,\n signature,\n data: message,\n network: this.network\n },\n include: \"apiKey\"\n }\n );\n if (!((_c = (_b = authResponse.data) == null ? void 0 : _b.user) == null ? void 0 : _c.sessionToken)) {\n throw new Error(\"Authentication failed\");\n }\n return {\n apiKey: authResponse.data.apiKey\n };\n }\n async signMessage(message) {\n try {\n const messageBytes = new TextEncoder().encode(message);\n this.logger.debug(`signing message`);\n const signatureBytes = await this.signer.sign([messageBytes], {\n encoding: \"utf-8\"\n });\n return Buffer$1.from(signatureBytes == null ? void 0 : signatureBytes[0].signature).toString(\"hex\");\n } catch (e) {\n this.logger.error(`Failed to sign message`, e);\n throw new Error(\"Failed to sign message\");\n }\n }\n}\nvar ieee754 = {};\n/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */\nvar hasRequiredIeee754;\nfunction requireIeee754() {\n if (hasRequiredIeee754) return ieee754;\n hasRequiredIeee754 = 1;\n ieee754.read = function(buffer2, offset, isLE, mLen, nBytes) {\n var e, m;\n var eLen = nBytes * 8 - mLen - 1;\n var eMax = (1 << eLen) - 1;\n var eBias = eMax >> 1;\n var nBits = -7;\n var i = isLE ? nBytes - 1 : 0;\n var d = isLE ? -1 : 1;\n var s = buffer2[offset + i];\n i += d;\n e = s & (1 << -nBits) - 1;\n s >>= -nBits;\n nBits += eLen;\n for (; nBits > 0; e = e * 256 + buffer2[offset + i], i += d, nBits -= 8) {\n }\n m = e & (1 << -nBits) - 1;\n e >>= -nBits;\n nBits += mLen;\n for (; nBits > 0; m = m * 256 + buffer2[offset + i], i += d, nBits -= 8) {\n }\n if (e === 0) {\n e = 1 - eBias;\n } else if (e === eMax) {\n return m ? NaN : (s ? -1 : 1) * Infinity;\n } else {\n m = m + Math.pow(2, mLen);\n e = e - eBias;\n }\n return (s ? -1 : 1) * m * Math.pow(2, e - mLen);\n };\n ieee754.write = function(buffer2, value, offset, isLE, mLen, nBytes) {\n var e, m, c;\n var eLen = nBytes * 8 - mLen - 1;\n var eMax = (1 << eLen) - 1;\n var eBias = eMax >> 1;\n var rt = mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0;\n var i = isLE ? 0 : nBytes - 1;\n var d = isLE ? 1 : -1;\n var s = value < 0 || value === 0 && 1 / value < 0 ? 1 : 0;\n value = Math.abs(value);\n if (isNaN(value) || value === Infinity) {\n m = isNaN(value) ? 1 : 0;\n e = eMax;\n } else {\n e = Math.floor(Math.log(value) / Math.LN2);\n if (value * (c = Math.pow(2, -e)) < 1) {\n e--;\n c *= 2;\n }\n if (e + eBias >= 1) {\n value += rt / c;\n } else {\n value += rt * Math.pow(2, 1 - eBias);\n }\n if (value * c >= 2) {\n e++;\n c /= 2;\n }\n if (e + eBias >= eMax) {\n m = 0;\n e = eMax;\n } else if (e + eBias >= 1) {\n m = (value * c - 1) * Math.pow(2, mLen);\n e = e + eBias;\n } else {\n m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen);\n e = 0;\n }\n }\n for (; mLen >= 8; buffer2[offset + i] = m & 255, i += d, m /= 256, mLen -= 8) {\n }\n e = e << mLen | m;\n eLen += mLen;\n for (; eLen > 0; buffer2[offset + i] = e & 255, i += d, e /= 256, eLen -= 8) {\n }\n buffer2[offset + i - d] |= s * 128;\n };\n return ieee754;\n}\nrequireIeee754();\nfunction dv(array) {\n return new DataView(array.buffer, array.byteOffset);\n}\nconst UINT8 = {\n len: 1,\n get(array, offset) {\n return dv(array).getUint8(offset);\n },\n put(array, offset, value) {\n dv(array).setUint8(offset, value);\n return offset + 1;\n }\n};\nconst UINT16_LE = {\n len: 2,\n get(array, offset) {\n return dv(array).getUint16(offset, true);\n },\n put(array, offset, value) {\n dv(array).setUint16(offset, value, true);\n return offset + 2;\n }\n};\nconst UINT16_BE = {\n len: 2,\n get(array, offset) {\n return dv(array).getUint16(offset);\n },\n put(array, offset, value) {\n dv(array).setUint16(offset, value);\n return offset + 2;\n }\n};\nconst UINT32_LE = {\n len: 4,\n get(array, offset) {\n return dv(array).getUint32(offset, true);\n },\n put(array, offset, value) {\n dv(array).setUint32(offset, value, true);\n return offset + 4;\n }\n};\nconst UINT32_BE = {\n len: 4,\n get(array, offset) {\n return dv(array).getUint32(offset);\n },\n put(array, offset, value) {\n dv(array).setUint32(offset, value);\n return offset + 4;\n }\n};\nconst INT32_BE = {\n len: 4,\n get(array, offset) {\n return dv(array).getInt32(offset);\n },\n put(array, offset, value) {\n dv(array).setInt32(offset, value);\n return offset + 4;\n }\n};\nconst UINT64_LE = {\n len: 8,\n get(array, offset) {\n return dv(array).getBigUint64(offset, true);\n },\n put(array, offset, value) {\n dv(array).setBigUint64(offset, value, true);\n return offset + 8;\n }\n};\nclass StringType {\n constructor(len, encoding) {\n this.len = len;\n this.encoding = encoding;\n }\n get(uint8Array, offset) {\n return Buffer$1.from(uint8Array).toString(this.encoding, offset, offset + this.len);\n }\n}\nconst defaultMessages = \"End-Of-Stream\";\nclass EndOfStreamError extends Error {\n constructor() {\n super(defaultMessages);\n }\n}\nclass Deferred {\n constructor() {\n this.resolve = () => null;\n this.reject = () => null;\n this.promise = new Promise((resolve, reject) => {\n this.reject = reject;\n this.resolve = resolve;\n });\n }\n}\nclass AbstractStreamReader {\n constructor() {\n this.maxStreamReadSize = 1 * 1024 * 1024;\n this.endOfStream = false;\n this.peekQueue = [];\n }\n async peek(uint8Array, offset, length) {\n const bytesRead = await this.read(uint8Array, offset, length);\n this.peekQueue.push(uint8Array.subarray(offset, offset + bytesRead));\n return bytesRead;\n }\n async read(buffer2, offset, length) {\n if (length === 0) {\n return 0;\n }\n let bytesRead = this.readFromPeekBuffer(buffer2, offset, length);\n bytesRead += await this.readRemainderFromStream(buffer2, offset + bytesRead, length - bytesRead);\n if (bytesRead === 0) {\n throw new EndOfStreamError();\n }\n return bytesRead;\n }\n /**\n * Read chunk from stream\n * @param buffer - Target Uint8Array (or Buffer) to store data read from stream in\n * @param offset - Offset target\n * @param length - Number of bytes to read\n * @returns Number of bytes read\n */\n readFromPeekBuffer(buffer2, offset, length) {\n let remaining = length;\n let bytesRead = 0;\n while (this.peekQueue.length > 0 && remaining > 0) {\n const peekData = this.peekQueue.pop();\n if (!peekData)\n throw new Error(\"peekData should be defined\");\n const lenCopy = Math.min(peekData.length, remaining);\n buffer2.set(peekData.subarray(0, lenCopy), offset + bytesRead);\n bytesRead += lenCopy;\n remaining -= lenCopy;\n if (lenCopy < peekData.length) {\n this.peekQueue.push(peekData.subarray(lenCopy));\n }\n }\n return bytesRead;\n }\n async readRemainderFromStream(buffer2, offset, initialRemaining) {\n let remaining = initialRemaining;\n let bytesRead = 0;\n while (remaining > 0 && !this.endOfStream) {\n const reqLen = Math.min(remaining, this.maxStreamReadSize);\n const chunkLen = await this.readFromStream(buffer2, offset + bytesRead, reqLen);\n if (chunkLen === 0)\n break;\n bytesRead += chunkLen;\n remaining -= chunkLen;\n }\n return bytesRead;\n }\n}\nclass StreamReader extends AbstractStreamReader {\n constructor(s) {\n super();\n this.s = s;\n this.deferred = null;\n if (!s.read || !s.once) {\n throw new Error(\"Expected an instance of stream.Readable\");\n }\n this.s.once(\"end\", () => this.reject(new EndOfStreamError()));\n this.s.once(\"error\", (err) => this.reject(err));\n this.s.once(\"close\", () => this.reject(new Error(\"Stream closed\")));\n }\n /**\n * Read chunk from stream\n * @param buffer Target Uint8Array (or Buffer) to store data read from stream in\n * @param offset Offset target\n * @param length Number of bytes to read\n * @returns Number of bytes read\n */\n async readFromStream(buffer2, offset, length) {\n if (this.endOfStream) {\n return 0;\n }\n const readBuffer = this.s.read(length);\n if (readBuffer) {\n buffer2.set(readBuffer, offset);\n return readBuffer.length;\n }\n const request = {\n buffer: buffer2,\n offset,\n length,\n deferred: new Deferred()\n };\n this.deferred = request.deferred;\n this.s.once(\"readable\", () => {\n this.readDeferred(request);\n });\n return request.deferred.promise;\n }\n /**\n * Process deferred read request\n * @param request Deferred read request\n */\n readDeferred(request) {\n const readBuffer = this.s.read(request.length);\n if (readBuffer) {\n request.buffer.set(readBuffer, request.offset);\n request.deferred.resolve(readBuffer.length);\n this.deferred = null;\n } else {\n this.s.once(\"readable\", () => {\n this.readDeferred(request);\n });\n }\n }\n reject(err) {\n this.endOfStream = true;\n if (this.deferred) {\n this.deferred.reject(err);\n this.deferred = null;\n }\n }\n async abort() {\n this.reject(new Error(\"abort\"));\n }\n async close() {\n return this.abort();\n }\n}\nclass AbstractTokenizer {\n constructor(fileInfo) {\n this.position = 0;\n this.numBuffer = new Uint8Array(8);\n this.fileInfo = fileInfo ? fileInfo : {};\n }\n /**\n * Read a token from the tokenizer-stream\n * @param token - The token to read\n * @param position - If provided, the desired position in the tokenizer-stream\n * @returns Promise with token data\n */\n async readToken(token, position = this.position) {\n const uint8Array = new Uint8Array(token.len);\n const len = await this.readBuffer(uint8Array, { position });\n if (len < token.len)\n throw new EndOfStreamError();\n return token.get(uint8Array, 0);\n }\n /**\n * Peek a token from the tokenizer-stream.\n * @param token - Token to peek from the tokenizer-stream.\n * @param position - Offset where to begin reading within the file. If position is null, data will be read from the current file position.\n * @returns Promise with token data\n */\n async peekToken(token, position = this.position) {\n const uint8Array = new Uint8Array(token.len);\n const len = await this.peekBuffer(uint8Array, { position });\n if (len < token.len)\n throw new EndOfStreamError();\n return token.get(uint8Array, 0);\n }\n /**\n * Read a numeric token from the stream\n * @param token - Numeric token\n * @returns Promise with number\n */\n async readNumber(token) {\n const len = await this.readBuffer(this.numBuffer, { length: token.len });\n if (len < token.len)\n throw new EndOfStreamError();\n return token.get(this.numBuffer, 0);\n }\n /**\n * Read a numeric token from the stream\n * @param token - Numeric token\n * @returns Promise with number\n */\n async peekNumber(token) {\n const len = await this.peekBuffer(this.numBuffer, { length: token.len });\n if (len < token.len)\n throw new EndOfStreamError();\n return token.get(this.numBuffer, 0);\n }\n /**\n * Ignore number of bytes, advances the pointer in under tokenizer-stream.\n * @param length - Number of bytes to ignore\n * @return resolves the number of bytes ignored, equals length if this available, otherwise the number of bytes available\n */\n async ignore(length) {\n if (this.fileInfo.size !== void 0) {\n const bytesLeft = this.fileInfo.size - this.position;\n if (length > bytesLeft) {\n this.position += bytesLeft;\n return bytesLeft;\n }\n }\n this.position += length;\n return length;\n }\n async close() {\n }\n normalizeOptions(uint8Array, options) {\n if (options && options.position !== void 0 && options.position < this.position) {\n throw new Error(\"`options.position` must be equal or greater than `tokenizer.position`\");\n }\n if (options) {\n return {\n mayBeLess: options.mayBeLess === true,\n offset: options.offset ? options.offset : 0,\n length: options.length ? options.length : uint8Array.length - (options.offset ? options.offset : 0),\n position: options.position ? options.position : this.position\n };\n }\n return {\n mayBeLess: false,\n offset: 0,\n length: uint8Array.length,\n position: this.position\n };\n }\n}\nconst maxBufferSize = 256e3;\nclass ReadStreamTokenizer extends AbstractTokenizer {\n constructor(streamReader, fileInfo) {\n super(fileInfo);\n this.streamReader = streamReader;\n }\n /**\n * Get file information, an HTTP-client may implement this doing a HEAD request\n * @return Promise with file information\n */\n async getFileInfo() {\n return this.fileInfo;\n }\n /**\n * Read buffer from tokenizer\n * @param uint8Array - Target Uint8Array to fill with data read from the tokenizer-stream\n * @param options - Read behaviour options\n * @returns Promise with number of bytes read\n */\n async readBuffer(uint8Array, options) {\n const normOptions = this.normalizeOptions(uint8Array, options);\n const skipBytes = normOptions.position - this.position;\n if (skipBytes > 0) {\n await this.ignore(skipBytes);\n return this.readBuffer(uint8Array, options);\n } else if (skipBytes < 0) {\n throw new Error(\"`options.position` must be equal or greater than `tokenizer.position`\");\n }\n if (normOptions.length === 0) {\n return 0;\n }\n const bytesRead = await this.streamReader.read(uint8Array, normOptions.offset, normOptions.length);\n this.position += bytesRead;\n if ((!options || !options.mayBeLess) && bytesRead < normOptions.length) {\n throw new EndOfStreamError();\n }\n return bytesRead;\n }\n /**\n * Peek (read ahead) buffer from tokenizer\n * @param uint8Array - Uint8Array (or Buffer) to write data to\n * @param options - Read behaviour options\n * @returns Promise with number of bytes peeked\n */\n async peekBuffer(uint8Array, options) {\n const normOptions = this.normalizeOptions(uint8Array, options);\n let bytesRead = 0;\n if (normOptions.position) {\n const skipBytes = normOptions.position - this.position;\n if (skipBytes > 0) {\n const skipBuffer = new Uint8Array(normOptions.length + skipBytes);\n bytesRead = await this.peekBuffer(skipBuffer, { mayBeLess: normOptions.mayBeLess });\n uint8Array.set(skipBuffer.subarray(skipBytes), normOptions.offset);\n return bytesRead - skipBytes;\n } else if (skipBytes < 0) {\n throw new Error(\"Cannot peek from a negative offset in a stream\");\n }\n }\n if (normOptions.length > 0) {\n try {\n bytesRead = await this.streamReader.peek(uint8Array, normOptions.offset, normOptions.length);\n } catch (err) {\n if (options && options.mayBeLess && err instanceof EndOfStreamError) {\n return 0;\n }\n throw err;\n }\n if (!normOptions.mayBeLess && bytesRead < normOptions.length) {\n throw new EndOfStreamError();\n }\n }\n return bytesRead;\n }\n async ignore(length) {\n const bufSize = Math.min(maxBufferSize, length);\n const buf = new Uint8Array(bufSize);\n let totBytesRead = 0;\n while (totBytesRead < length) {\n const remaining = length - totBytesRead;\n const bytesRead = await this.readBuffer(buf, { length: Math.min(bufSize, remaining) });\n if (bytesRead < 0) {\n return bytesRead;\n }\n totBytesRead += bytesRead;\n }\n return totBytesRead;\n }\n}\nclass BufferTokenizer extends AbstractTokenizer {\n /**\n * Construct BufferTokenizer\n * @param uint8Array - Uint8Array to tokenize\n * @param fileInfo - Pass additional file information to the tokenizer\n */\n constructor(uint8Array, fileInfo) {\n super(fileInfo);\n this.uint8Array = uint8Array;\n this.fileInfo.size = this.fileInfo.size ? this.fileInfo.size : uint8Array.length;\n }\n /**\n * Read buffer from tokenizer\n * @param uint8Array - Uint8Array to tokenize\n * @param options - Read behaviour options\n * @returns {Promise<number>}\n */\n async readBuffer(uint8Array, options) {\n if (options && options.position) {\n if (options.position < this.position) {\n throw new Error(\"`options.position` must be equal or greater than `tokenizer.position`\");\n }\n this.position = options.position;\n }\n const bytesRead = await this.peekBuffer(uint8Array, options);\n this.position += bytesRead;\n return bytesRead;\n }\n /**\n * Peek (read ahead) buffer from tokenizer\n * @param uint8Array\n * @param options - Read behaviour options\n * @returns {Promise<number>}\n */\n async peekBuffer(uint8Array, options) {\n const normOptions = this.normalizeOptions(uint8Array, options);\n const bytes2read = Math.min(this.uint8Array.length - normOptions.position, normOptions.length);\n if (!normOptions.mayBeLess && bytes2read < normOptions.length) {\n throw new EndOfStreamError();\n } else {\n uint8Array.set(this.uint8Array.subarray(normOptions.position, normOptions.position + bytes2read), normOptions.offset);\n return bytes2read;\n }\n }\n async close() {\n }\n}\nfunction fromStream(stream, fileInfo) {\n fileInfo = fileInfo ? fileInfo : {};\n return new ReadStreamTokenizer(new StreamReader(stream), fileInfo);\n}\nfunction fromBuffer(uint8Array, fileInfo) {\n return new BufferTokenizer(uint8Array, fileInfo);\n}\nfunction stringToBytes(string) {\n return [...string].map((character) => character.charCodeAt(0));\n}\nfunction tarHeaderChecksumMatches(buffer2, offset = 0) {\n const readSum = Number.parseInt(buffer2.toString(\"utf8\", 148, 154).replace(/\\0.*$/, \"\").trim(), 8);\n if (Number.isNaN(readSum)) {\n return false;\n }\n let sum = 8 * 32;\n for (let index = offset; index < offset + 148; index++) {\n sum += buffer2[index];\n }\n for (let index = offset + 156; index < offset + 512; index++) {\n sum += buffer2[index];\n }\n return readSum === sum;\n}\nconst uint32SyncSafeToken = {\n get: (buffer2, offset) => buffer2[offset + 3] & 127 | buffer2[offset + 2] << 7 | buffer2[offset + 1] << 14 | buffer2[offset] << 21,\n len: 4\n};\nconst extensions = [\n \"jpg\",\n \"png\",\n \"apng\",\n \"gif\",\n \"webp\",\n \"flif\",\n \"xcf\",\n \"cr2\",\n \"cr3\",\n \"orf\",\n \"arw\",\n \"dng\",\n \"nef\",\n \"rw2\",\n \"raf\",\n \"tif\",\n \"bmp\",\n \"icns\",\n \"jxr\",\n \"psd\",\n \"indd\",\n \"zip\",\n \"tar\",\n \"rar\",\n \"gz\",\n \"bz2\",\n \"7z\",\n \"dmg\",\n \"mp4\",\n \"mid\",\n \"mkv\",\n \"webm\",\n \"mov\",\n \"avi\",\n \"mpg\",\n \"mp2\",\n \"mp3\",\n \"m4a\",\n \"oga\",\n \"ogg\",\n \"ogv\",\n \"opus\",\n \"flac\",\n \"wav\",\n \"spx\",\n \"amr\",\n \"pdf\",\n \"epub\",\n \"elf\",\n \"macho\",\n \"exe\",\n \"swf\",\n \"rtf\",\n \"wasm\",\n \"woff\",\n \"woff2\",\n \"eot\",\n \"ttf\",\n \"otf\",\n \"ico\",\n \"flv\",\n \"ps\",\n \"xz\",\n \"sqlite\",\n \"nes\",\n \"crx\",\n \"xpi\",\n \"cab\",\n \"deb\",\n \"ar\",\n \"rpm\",\n \"Z\",\n \"lz\",\n \"cfb\",\n \"mxf\",\n \"mts\",\n \"blend\",\n \"bpg\",\n \"docx\",\n \"pptx\",\n \"xlsx\",\n \"3gp\",\n \"3g2\",\n \"j2c\",\n \"jp2\",\n \"jpm\",\n \"jpx\",\n \"mj2\",\n \"aif\",\n \"qcp\",\n \"odt\",\n \"ods\",\n \"odp\",\n \"xml\",\n \"mobi\",\n \"heic\",\n \"cur\",\n \"ktx\",\n \"ape\",\n \"wv\",\n \"dcm\",\n \"ics\",\n \"glb\",\n \"pcap\",\n \"dsf\",\n \"lnk\",\n \"alias\",\n \"voc\",\n \"ac3\",\n \"m4v\",\n \"m4p\",\n \"m4b\",\n \"f4v\",\n \"f4p\",\n \"f4b\",\n \"f4a\",\n \"mie\",\n \"asf\",\n \"ogm\",\n \"ogx\",\n \"mpc\",\n \"arrow\",\n \"shp\",\n \"aac\",\n \"mp1\",\n \"it\",\n \"s3m\",\n \"xm\",\n \"ai\",\n \"skp\",\n \"avif\",\n \"eps\",\n \"lzh\",\n \"pgp\",\n \"asar\",\n \"stl\",\n \"chm\",\n \"3mf\",\n \"zst\",\n \"jxl\",\n \"vcf\",\n \"jls\",\n \"pst\",\n \"dwg\",\n \"parquet\",\n \"class\",\n \"arj\",\n \"cpio\",\n \"ace\",\n \"avro\",\n \"icc\",\n \"fbx\"\n];\nconst mimeTypes = [\n \"image/jpeg\",\n \"image/png\",\n \"image/gif\",\n \"image/webp\",\n \"image/flif\",\n \"image/x-xcf\",\n \"image/x-canon-cr2\",\n \"image/x-canon-cr3\",\n \"image/tiff\",\n \"image/bmp\",\n \"image/vnd.ms-photo\",\n \"image/vnd.adobe.photoshop\",\n \"application/x-indesign\",\n \"application/epub+zip\",\n \"application/x-xpinstall\",\n \"application/vnd.oasis.opendocument.text\",\n \"application/vnd.oasis.opendocument.spreadsheet\",\n \"application/vnd.oasis.opendocument.presentation\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n \"application/zip\",\n \"application/x-tar\",\n \"application/x-rar-compressed\",\n \"application/gzip\",\n \"application/x-bzip2\",\n \"application/x-7z-compressed\",\n \"application/x-apple-diskimage\",\n \"application/x-apache-arrow\",\n \"video/mp4\",\n \"audio/midi\",\n \"video/x-matroska\",\n \"video/webm\",\n \"video/quicktime\",\n \"video/vnd.avi\",\n \"audio/vnd.wave\",\n \"audio/qcelp\",\n \"audio/x-ms-asf\",\n \"video/x-ms-asf\",\n \"application/vnd.ms-asf\",\n \"video/mpeg\",\n \"video/3gpp\",\n \"audio/mpeg\",\n \"audio/mp4\",\n // RFC 4337\n \"audio/opus\",\n \"video/ogg\",\n \"audio/ogg\",\n \"application/ogg\",\n \"audio/x-flac\",\n \"audio/ape\",\n \"audio/wavpack\",\n \"audio/amr\",\n \"application/pdf\",\n \"application/x-elf\",\n \"application/x-mach-binary\",\n \"application/x-msdownload\",\n \"application/x-shockwave-flash\",\n \"application/rtf\",\n \"application/wasm\",\n \"font/woff\",\n \"font/woff2\",\n \"application/vnd.ms-fontobject\",\n \"font/ttf\",\n \"font/otf\",\n \"image/x-icon\",\n \"video/x-flv\",\n \"application/postscript\",\n \"application/eps\",\n \"application/x-xz\",\n \"application/x-sqlite3\",\n \"application/x-nintendo-nes-rom\",\n \"application/x-google-chrome-extension\",\n \"application/vnd.ms-cab-compressed\",\n \"application/x-deb\",\n \"application/x-unix-archive\",\n \"application/x-rpm\",\n \"application/x-compress\",\n \"application/x-lzip\",\n \"application/x-cfb\",\n \"application/x-mie\",\n \"application/mxf\",\n \"video/mp2t\",\n \"application/x-blender\",\n \"image/bpg\",\n \"image/j2c\",\n \"image/jp2\",\n \"image/jpx\",\n \"image/jpm\",\n \"image/mj2\",\n \"audio/aiff\",\n \"application/xml\",\n \"application/x-mobipocket-ebook\",\n \"image/heif\",\n \"image/heif-sequence\",\n \"image/heic\",\n \"image/heic-sequence\",\n \"image/icns\",\n \"image/ktx\",\n \"application/dicom\",\n \"audio/x-musepack\",\n \"text/calendar\",\n \"text/vcard\",\n \"model/gltf-binary\",\n \"application/vnd.tcpdump.pcap\",\n \"audio/x-dsf\",\n // Non-standard\n \"application/x.ms.shortcut\",\n // Invented by us\n \"application/x.apple.alias\",\n // Invented by us\n \"audio/x-voc\",\n \"audio/vnd.dolby.dd-raw\",\n \"audio/x-m4a\",\n \"image/apng\",\n \"image/x-olympus-orf\",\n \"image/x-sony-arw\",\n \"image/x-adobe-dng\",\n \"image/x-nikon-nef\",\n \"image/x-panasonic-rw2\",\n \"image/x-fujifilm-raf\",\n \"video/x-m4v\",\n \"video/3gpp2\",\n \"application/x-esri-shape\",\n \"audio/aac\",\n \"audio/x-it\",\n \"audio/x-s3m\",\n \"audio/x-xm\",\n \"video/MP1S\",\n \"video/MP2P\",\n \"application/vnd.sketchup.skp\",\n \"image/avif\",\n \"application/x-lzh-compressed\",\n \"application/pgp-encrypted\",\n \"application/x-asar\",\n \"model/stl\",\n \"application/vnd.ms-htmlhelp\",\n \"model/3mf\",\n \"image/jxl\",\n \"application/zstd\",\n \"image/jls\",\n \"application/vnd.ms-outlook\",\n \"image/vnd.dwg\",\n \"application/x-parquet\",\n \"application/java-vm\",\n \"application/x-arj\",\n \"application/x-cpio\",\n \"application/x-ace-compressed\",\n \"application/avro\",\n \"application/vnd.iccprofile\",\n \"application/x.autodesk.fbx\"\n // Invented by us\n];\nconst minimumBytes = 4100;\nasync function fileTypeFromBuffer(input) {\n return new FileTypeParser().fromBuffer(input);\n}\nfunction _check(buffer2, headers, options) {\n options = {\n offset: 0,\n ...options\n };\n for (const [index, header] of headers.entries()) {\n if (options.mask) {\n if (header !== (options.mask[index] & buffer2[index + options.offset])) {\n return false;\n }\n } else if (header !== buffer2[index + options.offset]) {\n return false;\n }\n }\n return true;\n}\nclass FileTypeParser {\n constructor(options) {\n this.detectors = options == null ? void 0 : options.customDetectors;\n this.fromTokenizer = this.fromTokenizer.bind(this);\n this.fromBuffer = this.fromBuffer.bind(this);\n this.parse = this.parse.bind(this);\n }\n async fromTokenizer(tokenizer) {\n const initialPosition = tokenizer.position;\n for (const detector of this.detectors || []) {\n const fileType = await detector(tokenizer);\n if (fileType) {\n return fileType;\n }\n if (initialPosition !== tokenizer.position) {\n return void 0;\n }\n }\n return this.parse(tokenizer);\n }\n async fromBuffer(input) {\n if (!(input instanceof Uint8Array || input instanceof ArrayBuffer)) {\n throw new TypeError(`Expected the \\`input\\` argument to be of type \\`Uint8Array\\` or \\`Buffer\\` or \\`ArrayBuffer\\`, got \\`${typeof input}\\``);\n }\n const buffer2 = input instanceof Uint8Array ? input : new Uint8Array(input);\n if (!((buffer2 == null ? void 0 : buffer2.length) > 1)) {\n return;\n }\n return this.fromTokenizer(fromBuffer(buffer2));\n }\n async fromBlob(blob) {\n const buffer2 = await blob.arrayBuffer();\n return this.fromBuffer(new Uint8Array(buffer2));\n }\n async fromStream(stream) {\n const tokenizer = await fromStream(stream);\n try {\n return await this.fromTokenizer(tokenizer);\n } finally {\n await tokenizer.close();\n }\n }\n async toDetectionStream(readableStream, options = {}) {\n const { default: stream } = await import(\"./index-CHar8dVv.js\").then((n) => n.i);\n const { sampleSize = minimumBytes } = options;\n return new Promise((resolve, reject) => {\n readableStream.on(\"error\", reject);\n readableStream.once(\"readable\", () => {\n (async () => {\n try {\n const pass = new stream.PassThrough();\n const outputStream = stream.pipeline ? stream.pipeline(readableStream, pass, () => {\n }) : readableStream.pipe(pass);\n const chunk = readableStream.read(sampleSize) ?? readableStream.read() ?? Buffer$1.alloc(0);\n try {\n pass.fileType = await this.fromBuffer(chunk);\n } catch (error) {\n if (error instanceof EndOfStreamError) {\n pass.fileType = void 0;\n } else {\n reject(error);\n }\n }\n resolve(outputStream);\n } catch (error) {\n reject(error);\n }\n })();\n });\n });\n }\n check(header, options) {\n return _check(this.buffer, header, options);\n }\n checkString(header, options) {\n return this.check(stringToBytes(header), options);\n }\n async parse(tokenizer) {\n this.buffer = Buffer$1.alloc(minimumBytes);\n if (tokenizer.fileInfo.size === void 0) {\n tokenizer.fileInfo.size = Number.MAX_SAFE_INTEGER;\n }\n this.tokenizer = tokenizer;\n await tokenizer.peekBuffer(this.buffer, { length: 12, mayBeLess: true });\n if (this.check([66, 77])) {\n return {\n ext: \"bmp\",\n mime: \"image/bmp\"\n };\n }\n if (this.check([11, 119])) {\n return {\n ext: \"ac3\",\n mime: \"audio/vnd.dolby.dd-raw\"\n };\n }\n if (this.check([120, 1])) {\n return {\n ext: \"dmg\",\n mime: \"application/x-apple-diskimage\"\n };\n }\n if (this.check([77, 90])) {\n return {\n ext: \"exe\",\n mime: \"application/x-msdownload\"\n };\n }\n if (this.check([37, 33])) {\n await tokenizer.peekBuffer(this.buffer, { length: 24, mayBeLess: true });\n if (this.checkString(\"PS-Adobe-\", { offset: 2 }) && this.checkString(\" EPSF-\", { offset: 14 })) {\n return {\n ext: \"eps\",\n mime: \"application/eps\"\n };\n }\n return {\n ext: \"ps\",\n mime: \"application/postscript\"\n };\n }\n if (this.check([31, 160]) || this.check([31, 157])) {\n return {\n ext: \"Z\",\n mime: \"application/x-compress\"\n };\n }\n if (this.check([199, 113])) {\n return {\n ext: \"cpio\",\n mime: \"application/x-cpio\"\n };\n }\n if (this.check([96, 234])) {\n return {\n ext: \"arj\",\n mime: \"application/x-arj\"\n };\n }\n if (this.check([239, 187, 191])) {\n this.tokenizer.ignore(3);\n return this.parse(tokenizer);\n }\n if (this.check([71, 73, 70])) {\n return {\n ext: \"gif\",\n mime: \"image/gif\"\n };\n }\n if (this.check([73, 73, 188])) {\n return {\n ext: \"jxr\",\n mime: \"image/vnd.ms-photo\"\n };\n }\n if (this.check([31, 139, 8])) {\n return {\n ext: \"gz\",\n mime: \"application/gzip\"\n };\n }\n if (this.check([66, 90, 104])) {\n return {\n ext: \"bz2\",\n mime: \"application/x-bzip2\"\n };\n }\n if (this.checkString(\"ID3\")) {\n await tokenizer.ignore(6);\n const id3HeaderLength = await tokenizer.readToken(uint32SyncSafeToken);\n if (tokenizer.position + id3HeaderLength > tokenizer.fileInfo.size) {\n return {\n ext: \"mp3\",\n mime: \"audio/mpeg\"\n };\n }\n await tokenizer.ignore(id3HeaderLength);\n return this.fromTokenizer(tokenizer);\n }\n if (this.checkString(\"MP+\")) {\n return {\n ext: \"mpc\",\n mime: \"audio/x-musepack\"\n };\n }\n if ((this.buffer[0] === 67 || this.buffer[0] === 70) && this.check([87, 83], { offset: 1 })) {\n return {\n ext: \"swf\",\n mime: \"application/x-shockwave-flash\"\n };\n }\n if (this.check([255, 216, 255])) {\n if (this.check([247], { offset: 3 })) {\n return {\n ext: \"jls\",\n mime: \"image/jls\"\n };\n }\n return {\n ext: \"jpg\",\n mime: \"image/jpeg\"\n };\n }\n if (this.check([79, 98, 106, 1])) {\n return {\n ext: \"avro\",\n mime: \"application/avro\"\n };\n }\n if (this.checkString(\"FLIF\")) {\n return {\n ext: \"flif\",\n mime: \"image/flif\"\n };\n }\n if (this.checkString(\"8BPS\")) {\n return {\n ext: \"psd\",\n mime: \"image/vnd.adobe.photoshop\"\n };\n }\n if (this.checkString(\"WEBP\", { offset: 8 })) {\n return {\n ext: \"webp\",\n mime: \"image/webp\"\n };\n }\n if (this.checkString(\"MPCK\")) {\n return {\n ext: \"mpc\",\n mime: \"audio/x-musepack\"\n };\n }\n if (this.checkString(\"FORM\")) {\n return {\n ext: \"aif\",\n mime: \"audio/aiff\"\n };\n }\n if (this.checkString(\"icns\", { offset: 0 })) {\n return {\n ext: \"icns\",\n mime: \"image/icns\"\n };\n }\n if (this.check([80, 75, 3, 4])) {\n try {\n while (tokenizer.position + 30 < tokenizer.fileInfo.size) {\n await tokenizer.readBuffer(this.buffer, { length: 30 });\n const zipHeader = {\n compressedSize: this.buffer.readUInt32LE(18),\n uncompressedSize: this.buffer.readUInt32LE(22),\n filenameLength: this.buffer.readUInt16LE(26),\n extraFieldLength: this.buffer.readUInt16LE(28)\n };\n zipHeader.filename = await tokenizer.readToken(new StringType(zipHeader.filenameLength, \"utf-8\"));\n await tokenizer.ignore(zipHeader.extraFieldLength);\n if (zipHeader.filename === \"META-INF/mozilla.rsa\") {\n return {\n ext: \"xpi\",\n mime: \"application/x-xpinstall\"\n };\n }\n if (zipHeader.filename.endsWith(\".rels\") || zipHeader.filename.endsWith(\".xml\")) {\n const type = zipHeader.filename.split(\"/\")[0];\n switch (type) {\n case \"_rels\":\n break;\n case \"word\":\n return {\n ext: \"docx\",\n mime: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\"\n };\n case \"ppt\":\n return {\n ext: \"pptx\",\n mime: \"application/vnd.openxmlformats-officedocument.presentationml.presentation\"\n };\n case \"xl\":\n return {\n ext: \"xlsx\",\n mime: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"\n };\n default:\n break;\n }\n }\n if (zipHeader.filename.startsWith(\"xl/\")) {\n return {\n ext: \"xlsx\",\n mime: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"\n };\n }\n if (zipHeader.filename.startsWith(\"3D/\") && zipHeader.filename.endsWith(\".model\")) {\n return {\n ext: \"3mf\",\n mime: \"model/3mf\"\n };\n }\n if (zipHeader.filename === \"mimetype\" && zipHeader.compressedSize === zipHeader.uncompressedSize) {\n let mimeType = await tokenizer.readToken(new StringType(zipHeader.compressedSize, \"utf-8\"));\n mimeType = mimeType.trim();\n switch (mimeType) {\n case \"application/epub+zip\":\n return {\n ext: \"epub\",\n mime: \"application/epub+zip\"\n };\n case \"application/vnd.oasis.opendocument.text\":\n return {\n ext: \"odt\",\n mime: \"application/vnd.oasis.opendocument.text\"\n };\n case \"application/vnd.oasis.opendocument.spreadsheet\":\n return {\n ext: \"ods\",\n mime: \"application/vnd.oasis.opendocument.spreadsheet\"\n };\n case \"application/vnd.oasis.opendocument.presentation\":\n return {\n ext: \"odp\",\n mime: \"application/vnd.oasis.opendocument.presentation\"\n };\n default:\n }\n }\n if (zipHeader.compressedSize === 0) {\n let nextHeaderIndex = -1;\n while (nextHeaderIndex < 0 && tokenizer.position < tokenizer.fileInfo.size) {\n await tokenizer.peekBuffer(this.buffer, { mayBeLess: true });\n nextHeaderIndex = this.buffer.indexOf(\"504B0304\", 0, \"hex\");\n await tokenizer.ignore(nextHeaderIndex >= 0 ? nextHeaderIndex : this.buffer.length);\n }\n } else {\n await tokenizer.ignore(zipHeader.compressedSize);\n }\n }\n } catch (error) {\n if (!(error instanceof EndOfStreamError)) {\n throw error;\n }\n }\n return {\n ext: \"zip\",\n mime: \"application/zip\"\n };\n }\n if (this.checkString(\"OggS\")) {\n await tokenizer.ignore(28);\n const type = Buffer$1.alloc(8);\n await tokenizer.readBuffer(type);\n if (_check(type, [79, 112, 117, 115, 72, 101, 97, 100])) {\n return {\n ext: \"opus\",\n mime: \"audio/opus\"\n };\n }\n if (_check(type, [128, 116, 104, 101, 111, 114, 97])) {\n return {\n ext: \"ogv\",\n mime: \"video/ogg\"\n };\n }\n if (_check(type, [1, 118, 105, 100, 101, 111, 0])) {\n return {\n ext: \"ogm\",\n mime: \"video/ogg\"\n };\n }\n if (_check(type, [127, 70, 76, 65, 67])) {\n return {\n ext: \"oga\",\n mime: \"audio/ogg\"\n };\n }\n if (_check(type, [83, 112, 101, 101, 120, 32, 32])) {\n return {\n ext: \"spx\",\n mime: \"audio/ogg\"\n };\n }\n if (_check(type, [1, 118, 111, 114, 98, 105, 115])) {\n return {\n ext: \"ogg\",\n mime: \"audio/ogg\"\n };\n }\n return {\n ext: \"ogx\",\n mime: \"application/ogg\"\n };\n }\n if (this.check([80, 75]) && (this.buffer[2] === 3 || this.buffer[2] === 5 || this.buffer[2] === 7) && (this.buffer[3] === 4 || this.buffer[3] === 6 || this.buffer[3] === 8)) {\n return {\n ext: \"zip\",\n mime: \"application/zip\"\n };\n }\n if (this.checkString(\"ftyp\", { offset: 4 }) && (this.buffer[8] & 96) !== 0) {\n const brandMajor = this.buffer.toString(\"binary\", 8, 12).replace(\"\\0\", \" \").trim();\n switch (brandMajor) {\n case \"avif\":\n case \"avis\":\n return { ext: \"avif\", mime: \"image/avif\" };\n case \"mif1\":\n return { ext: \"heic\", mime: \"image/heif\" };\n case \"msf1\":\n return { ext: \"heic\", mime: \"image/heif-sequence\" };\n case \"heic\":\n case \"heix\":\n return { ext: \"heic\", mime: \"image/heic\" };\n case \"hevc\":\n case \"hevx\":\n return { ext: \"heic\", mime: \"image/heic-sequence\" };\n case \"qt\":\n return { ext: \"mov\", mime: \"video/quicktime\" };\n case \"M4V\":\n case \"M4VH\":\n case \"M4VP\":\n return { ext: \"m4v\", mime: \"video/x-m4v\" };\n case \"M4P\":\n return { ext: \"m4p\", mime: \"video/mp4\" };\n case \"M4B\":\n return { ext: \"m4b\", mime: \"audio/mp4\" };\n case \"M4A\":\n return { ext: \"m4a\", mime: \"audio/x-m4a\" };\n case \"F4V\":\n return { ext: \"f4v\", mime: \"video/mp4\" };\n case \"F4P\":\n return { ext: \"f4p\", mime: \"video/mp4\" };\n case \"F4A\":\n return { ext: \"f4a\", mime: \"audio/mp4\" };\n case \"F4B\":\n return { ext: \"f4b\", mime: \"audio/mp4\" };\n case \"crx\":\n return { ext: \"cr3\", mime: \"image/x-canon-cr3\" };\n default:\n if (brandMajor.startsWith(\"3g\")) {\n if (brandMajor.startsWith(\"3g2\")) {\n return { ext: \"3g2\", mime: \"video/3gpp2\" };\n }\n return { ext: \"3gp\", mime: \"video/3gpp\" };\n }\n return { ext: \"mp4\", mime: \"video/mp4\" };\n }\n }\n if (this.checkString(\"MThd\")) {\n return {\n ext: \"mid\",\n mime: \"audio/midi\"\n };\n }\n if (this.checkString(\"wOFF\") && (this.check([0, 1, 0, 0], { offset: 4 }) || this.checkString(\"OTTO\", { offset: 4 }))) {\n return {\n ext: \"woff\",\n mime: \"font/woff\"\n };\n }\n if (this.checkString(\"wOF2\") && (this.check([0, 1, 0, 0], { offset: 4 }) || this.checkString(\"OTTO\", { offset: 4 }))) {\n return {\n ext: \"woff2\",\n mime: \"font/woff2\"\n };\n }\n if (this.check([212, 195, 178, 161]) || this.check([161, 178, 195, 212])) {\n return {\n ext: \"pcap\",\n mime: \"application/vnd.tcpdump.pcap\"\n };\n }\n if (this.checkString(\"DSD \")) {\n return {\n ext: \"dsf\",\n mime: \"audio/x-dsf\"\n // Non-standard\n };\n }\n if (this.checkString(\"LZIP\")) {\n return {\n ext: \"lz\",\n mime: \"application/x-lzip\"\n };\n }\n if (this.checkString(\"fLaC\")) {\n return {\n ext: \"flac\",\n mime: \"audio/x-flac\"\n };\n }\n if (this.check([66, 80, 71, 251])) {\n return {\n ext: \"bpg\",\n mime: \"image/bpg\"\n };\n }\n if (this.checkString(\"wvpk\")) {\n return {\n ext: \"wv\",\n mime: \"audio/wavpack\"\n };\n }\n if (this.checkString(\"%PDF\")) {\n try {\n await tokenizer.ignore(1350);\n const maxBufferSize2 = 10 * 1024 * 1024;\n const buffer2 = Buffer$1.alloc(Math.min(maxBufferSize2, tokenizer.fileInfo.size));\n await tokenizer.readBuffer(buffer2, { mayBeLess: true });\n if (buffer2.includes(Buffer$1.from(\"AIPrivateData\"))) {\n return {\n ext: \"ai\",\n mime: \"application/postscript\"\n };\n }\n } catch (error) {\n if (!(error instanceof EndOfStreamError)) {\n throw error;\n }\n }\n return {\n ext: \"pdf\",\n mime: \"application/pdf\"\n };\n }\n if (this.check([0, 97, 115, 109])) {\n return {\n ext: \"wasm\",\n mime: \"application/wasm\"\n };\n }\n if (this.check([73, 73])) {\n const fileType = await this.readTiffHeader(false);\n if (fileType) {\n return fileType;\n }\n }\n if (this.check([77, 77])) {\n const fileType = await this.readTiffHeader(true);\n if (fileType) {\n return fileType;\n }\n }\n if (this.checkString(\"MAC \")) {\n return {\n ext: \"ape\",\n mime: \"audio/ape\"\n };\n }\n if (this.check([26, 69, 223, 163])) {\n async function readField() {\n const msb = await tokenizer.peekNumber(UINT8);\n let mask = 128;\n let ic = 0;\n while ((msb & mask) === 0 && mask !== 0) {\n ++ic;\n mask >>= 1;\n }\n const id = Buffer$1.alloc(ic + 1);\n await tokenizer.readBuffer(id);\n return id;\n }\n async function readElement() {\n const id = await readField();\n const lengthField = await readField();\n lengthField[0] ^= 128 >> lengthField.length - 1;\n const nrLength = Math.min(6, lengthField.length);\n return {\n id: id.readUIntBE(0, id.length),\n len: lengthField.readUIntBE(lengthField.length - nrLength, nrLength)\n };\n }\n async function readChildren(children) {\n while (children > 0) {\n const element = await readElement();\n if (element.id === 17026) {\n const rawValue = await tokenizer.readToken(new StringType(element.len, \"utf-8\"));\n return rawValue.replace(/\\00.*$/g, \"\");\n }\n await tokenizer.ignore(element.len);\n --children;\n }\n }\n const re = await readElement();\n const docType = await readChildren(re.len);\n switch (docType) {\n case \"webm\":\n return {\n ext: \"webm\",\n mime: \"video/webm\"\n };\n case \"matroska\":\n return {\n ext: \"mkv\",\n mime: \"video/x-matroska\"\n };\n default:\n return;\n }\n }\n if (this.check([82, 73, 70, 70])) {\n if (this.check([65, 86, 73], { offset: 8 })) {\n return {\n ext: \"avi\",\n mime: \"video/vnd.avi\"\n };\n }\n if (this.check([87, 65, 86, 69], { offset: 8 })) {\n return {\n ext: \"wav\",\n mime: \"audio/vnd.wave\"\n };\n }\n if (this.check([81, 76, 67, 77], { offset: 8 })) {\n return {\n ext: \"qcp\",\n mime: \"audio/qcelp\"\n };\n }\n }\n if (this.checkString(\"SQLi\")) {\n return {\n ext: \"sqlite\",\n mime: \"application/x-sqlite3\"\n };\n }\n if (this.check([78, 69, 83, 26])) {\n return {\n ext: \"nes\",\n mime: \"application/x-nintendo-nes-rom\"\n };\n }\n if (this.checkString(\"Cr24\")) {\n return {\n ext: \"crx\",\n mime: \"application/x-google-chrome-extension\"\n };\n }\n if (this.checkString(\"MSCF\") || this.checkString(\"ISc(\")) {\n return {\n ext: \"cab\",\n mime: \"application/vnd.ms-cab-compressed\"\n };\n }\n if (this.check([237, 171, 238, 219])) {\n return {\n ext: \"rpm\",\n mime: \"application/x-rpm\"\n };\n }\n if (this.check([197, 208, 211, 198])) {\n return {\n ext: \"eps\",\n mime: \"application/eps\"\n };\n }\n if (this.check([40, 181, 47, 253])) {\n return {\n ext: \"zst\",\n mime: \"application/zstd\"\n };\n }\n if (this.check([127, 69, 76, 70])) {\n return {\n ext: \"elf\",\n mime: \"application/x-elf\"\n };\n }\n if (this.check([33, 66, 68, 78])) {\n return {\n ext: \"pst\",\n mime: \"application/vnd.ms-outlook\"\n };\n }\n if (this.checkString(\"PAR1\")) {\n return {\n ext: \"parquet\",\n mime: \"application/x-parquet\"\n };\n }\n if (this.check([207, 250, 237, 254])) {\n return {\n ext: \"macho\",\n mime: \"application/x-mach-binary\"\n };\n }\n if (this.check([79, 84, 84, 79, 0])) {\n return {\n ext: \"otf\",\n mime: \"font/otf\"\n };\n }\n if (this.checkString(\"#!AMR\")) {\n return {\n ext: \"amr\",\n mime: \"audio/amr\"\n };\n }\n if (this.checkString(\"{\\\\rtf\")) {\n return {\n ext: \"rtf\",\n mime: \"application/rtf\"\n };\n }\n if (this.check([70, 76, 86, 1])) {\n return {\n ext: \"flv\",\n mime: \"video/x-flv\"\n };\n }\n if (this.checkString(\"IMPM\")) {\n return {\n ext: \"it\",\n mime: \"audio/x-it\"\n };\n }\n if (this.checkString(\"-lh0-\", { offset: 2 }) || this.checkString(\"-lh1-\", { offset: 2 }) || this.checkString(\"-lh2-\", { offset: 2 }) || this.checkString(\"-lh3-\", { offset: 2 }) || this.checkString(\"-lh4-\", { offset: 2 }) || this.checkString(\"-lh5-\", { offset: 2 }) || this.checkString(\"-lh6-\", { offset: 2 }) || this.checkString(\"-lh7-\", { offset: 2 }) || this.checkString(\"-lzs-\", { offset: 2 }) || this.checkString(\"-lz4-\", { offset: 2 }) || this.checkString(\"-lz5-\", { offset: 2 }) || this.checkString(\"-lhd-\", { offset: 2 })) {\n return {\n ext: \"lzh\",\n mime: \"application/x-lzh-compressed\"\n };\n }\n if (this.check([0, 0, 1, 186])) {\n if (this.check([33], { offset: 4, mask: [241] })) {\n return {\n ext: \"mpg\",\n // May also be .ps, .mpeg\n mime: \"video/MP1S\"\n };\n }\n if (this.check([68], { offset: 4, mask: [196] })) {\n return {\n ext: \"mpg\",\n // May also be .mpg, .m2p, .vob or .sub\n mime: \"video/MP2P\"\n };\n }\n }\n if (this.checkString(\"ITSF\")) {\n return {\n ext: \"chm\",\n mime: \"application/vnd.ms-htmlhelp\"\n };\n }\n if (this.check([202, 254, 186, 190])) {\n return {\n ext: \"class\",\n mime: \"application/java-vm\"\n };\n }\n if (this.check([253, 55, 122, 88, 90, 0])) {\n return {\n ext: \"xz\",\n mime: \"application/x-xz\"\n };\n }\n if (this.checkString(\"<?xml \")) {\n return {\n ext: \"xml\",\n mime: \"application/xml\"\n };\n }\n if (this.check([55, 122, 188, 175, 39, 28])) {\n return {\n ext: \"7z\",\n mime: \"application/x-7z-compressed\"\n };\n }\n if (this.check([82, 97, 114, 33, 26, 7]) && (this.buffer[6] === 0 || this.buffer[6] === 1)) {\n return {\n ext: \"rar\",\n mime: \"application/x-rar-compressed\"\n };\n }\n if (this.checkString(\"solid \")) {\n return {\n ext: \"stl\",\n mime: \"model/stl\"\n };\n }\n if (this.checkString(\"AC\")) {\n const version = this.buffer.toString(\"binary\", 2, 6);\n if (version.match(\"^d*\") && version >= 1e3 && version <= 1050) {\n return {\n ext: \"dwg\",\n mime: \"image/vnd.dwg\"\n };\n }\n }\n if (this.checkString(\"070707\")) {\n return {\n ext: \"cpio\",\n mime: \"application/x-cpio\"\n };\n }\n if (this.checkString(\"BLENDER\")) {\n return {\n ext: \"blend\",\n mime: \"application/x-blender\"\n };\n }\n if (this.checkString(\"!<arch>\")) {\n await tokenizer.ignore(8);\n const string = await tokenizer.readToken(new StringType(13, \"ascii\"));\n if (string === \"debian-binary\") {\n return {\n ext: \"deb\",\n mime: \"application/x-deb\"\n };\n }\n return {\n ext: \"ar\",\n mime: \"application/x-unix-archive\"\n };\n }\n if (this.checkString(\"**ACE\", { offset: 7 })) {\n await tokenizer.peekBuffer(this.buffer, { length: 14, mayBeLess: true });\n if (this.checkString(\"**\", { offset: 12 })) {\n return {\n ext: \"ace\",\n mime: \"application/x-ace-compressed\"\n };\n }\n }\n if (this.check([137, 80, 78, 71, 13, 10, 26, 10])) {\n await tokenizer.ignore(8);\n async function readChunkHeader() {\n return {\n length: await tokenizer.readToken(INT32_BE),\n type: await tokenizer.readToken(new StringType(4, \"binary\"))\n };\n }\n do {\n const chunk = await readChunkHeader();\n if (chunk.length < 0) {\n return;\n }\n switch (chunk.type) {\n case \"IDAT\":\n return {\n ext: \"png\",\n mime: \"image/png\"\n };\n case \"acTL\":\n return {\n ext: \"apng\",\n mime: \"image/apng\"\n };\n default:\n await tokenizer.ignore(chunk.length + 4);\n }\n } while (tokenizer.position + 8 < tokenizer.fileInfo.size);\n return {\n ext: \"png\",\n mime: \"image/png\"\n };\n }\n if (this.check([65, 82, 82, 79, 87, 49, 0, 0])) {\n return {\n ext: \"arrow\",\n mime: \"application/x-apache-arrow\"\n };\n }\n if (this.check([103, 108, 84, 70, 2, 0, 0, 0])) {\n return {\n ext: \"glb\",\n mime: \"model/gltf-binary\"\n };\n }\n if (this.check([102, 114, 101, 101], { offset: 4 }) || this.check([109, 100, 97, 116], { offset: 4 }) || this.check([109, 111, 111, 118], { offset: 4 }) || this.check([119, 105, 100, 101], { offset: 4 })) {\n return {\n ext: \"mov\",\n mime: \"video/quicktime\"\n };\n }\n if (this.check([73, 73, 82, 79, 8, 0, 0, 0, 24])) {\n return {\n ext: \"orf\",\n mime: \"image/x-olympus-orf\"\n };\n }\n if (this.checkString(\"gimp xcf \")) {\n return {\n ext: \"xcf\",\n mime: \"image/x-xcf\"\n };\n }\n if (this.check([73, 73, 85, 0, 24, 0, 0, 0, 136, 231, 116, 216])) {\n return {\n ext: \"rw2\",\n mime: \"image/x-panasonic-rw2\"\n };\n }\n if (this.check([48, 38, 178, 117, 142, 102, 207, 17, 166, 217])) {\n async function readHeader() {\n const guid = Buffer$1.alloc(16);\n await tokenizer.readBuffer(guid);\n return {\n id: guid,\n size: Number(await tokenizer.readToken(UINT64_LE))\n };\n }\n await tokenizer.ignore(30);\n while (tokenizer.position + 24 < tokenizer.fileInfo.size) {\n const header = await readHeader();\n let payload = header.size - 24;\n if (_check(header.id, [145, 7, 220, 183, 183, 169, 207, 17, 142, 230, 0, 192, 12, 32, 83, 101])) {\n const typeId = Buffer$1.alloc(16);\n payload -= await tokenizer.readBuffer(typeId);\n if (_check(typeId, [64, 158, 105, 248, 77, 91, 207, 17, 168, 253, 0, 128, 95, 92, 68, 43])) {\n return {\n ext: \"asf\",\n mime: \"audio/x-ms-asf\"\n };\n }\n if (_check(typeId, [192, 239, 25, 188, 77, 91, 207, 17, 168, 253, 0, 128, 95, 92, 68, 43])) {\n return {\n ext: \"asf\",\n mime: \"video/x-ms-asf\"\n };\n }\n break;\n }\n await tokenizer.ignore(payload);\n }\n return {\n ext: \"asf\",\n mime: \"application/vnd.ms-asf\"\n };\n }\n if (this.check([171, 75, 84, 88, 32, 49, 49, 187, 13, 10, 26, 10])) {\n return {\n ext: \"ktx\",\n mime: \"image/ktx\"\n };\n }\n if ((this.check([126, 16, 4]) || this.check([126, 24, 4])) && this.check([48, 77, 73, 69], { offset: 4 })) {\n return {\n ext: \"mie\",\n mime: \"application/x-mie\"\n };\n }\n if (this.check([39, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], { offset: 2 })) {\n return {\n ext: \"shp\",\n mime: \"application/x-esri-shape\"\n };\n }\n if (this.check([255, 79, 255, 81])) {\n return {\n ext: \"j2c\",\n mime: \"image/j2c\"\n };\n }\n if (this.check([0, 0, 0, 12, 106, 80, 32, 32, 13, 10, 135, 10])) {\n await tokenizer.ignore(20);\n const type = await tokenizer.readToken(new StringType(4, \"ascii\"));\n switch (type) {\n case \"jp2 \":\n return {\n ext: \"jp2\",\n mime: \"image/jp2\"\n };\n case \"jpx \":\n return {\n ext: \"jpx\",\n mime: \"image/jpx\"\n };\n case \"jpm \":\n return {\n ext: \"jpm\",\n mime: \"image/jpm\"\n };\n case \"mjp2\":\n return {\n ext: \"mj2\",\n mime: \"image/mj2\"\n };\n default:\n return;\n }\n }\n if (this.check([255, 10]) || this.check([0, 0, 0, 12, 74, 88, 76, 32, 13, 10, 135, 10])) {\n return {\n ext: \"jxl\",\n mime: \"image/jxl\"\n };\n }\n if (this.check([254, 255])) {\n if (this.check([0, 60, 0, 63, 0, 120, 0, 109, 0, 108], { offset: 2 })) {\n return {\n ext: \"xml\",\n mime: \"application/xml\"\n };\n }\n return void 0;\n }\n if (this.check([0, 0, 1, 186]) || this.check([0, 0, 1, 179])) {\n return {\n ext: \"mpg\",\n mime: \"video/mpeg\"\n };\n }\n if (this.check([0, 1, 0, 0, 0])) {\n return {\n ext: \"ttf\",\n mime: \"font/ttf\"\n };\n }\n if (this.check([0, 0, 1, 0])) {\n return {\n ext: \"ico\",\n mime: \"image/x-icon\"\n };\n }\n if (this.check([0, 0, 2, 0])) {\n return {\n ext: \"cur\",\n mime: \"image/x-icon\"\n };\n }\n if (this.check([208, 207, 17, 224, 161, 177, 26, 225])) {\n return {\n ext: \"cfb\",\n mime: \"application/x-cfb\"\n };\n }\n await tokenizer.peekBuffer(this.buffer, { length: Math.min(256, tokenizer.fileInfo.size), mayBeLess: true });\n if (this.check([97, 99, 115, 112], { offset: 36 })) {\n return {\n ext: \"icc\",\n mime: \"application/vnd.iccprofile\"\n };\n }\n if (this.checkString(\"BEGIN:\")) {\n if (this.checkString(\"VCARD\", { offset: 6 })) {\n return {\n ext: \"vcf\",\n mime: \"text/vcard\"\n };\n }\n if (this.checkString(\"VCALENDAR\", { offset: 6 })) {\n return {\n ext: \"ics\",\n mime: \"text/calendar\"\n };\n }\n }\n if (this.checkString(\"FUJIFILMCCD-RAW\")) {\n return {\n ext: \"raf\",\n mime: \"image/x-fujifilm-raf\"\n };\n }\n if (this.checkString(\"Extended Module:\")) {\n return {\n ext: \"xm\",\n mime: \"audio/x-xm\"\n };\n }\n if (this.checkString(\"Creative Voice File\")) {\n return {\n ext: \"voc\",\n mime: \"audio/x-voc\"\n };\n }\n if (this.check([4, 0, 0, 0]) && this.buffer.length >= 16) {\n const jsonSize = this.buffer.readUInt32LE(12);\n if (jsonSize > 12 && this.buffer.length >= jsonSize + 16) {\n try {\n const header = this.buffer.slice(16, jsonSize + 16).toString();\n const json = JSON.parse(header);\n if (json.files) {\n return {\n ext: \"asar\",\n mime: \"application/x-asar\"\n };\n }\n } catch {\n }\n }\n }\n if (this.check([6, 14, 43, 52, 2, 5, 1, 1, 13, 1, 2, 1, 1, 2])) {\n return {\n ext: \"mxf\",\n mime: \"application/mxf\"\n };\n }\n if (this.checkString(\"SCRM\", { offset: 44 })) {\n return {\n ext: \"s3m\",\n mime: \"audio/x-s3m\"\n };\n }\n if (this.check([71]) && this.check([71], { offset: 188 })) {\n return {\n ext: \"mts\",\n mime: \"video/mp2t\"\n };\n }\n if (this.check([71], { offset: 4 }) && this.check([71], { offset: 196 })) {\n return {\n ext: \"mts\",\n mime: \"video/mp2t\"\n };\n }\n if (this.check([66, 79, 79, 75, 77, 79, 66, 73], { offset: 60 })) {\n return {\n ext: \"mobi\",\n mime: \"application/x-mobipocket-ebook\"\n };\n }\n if (this.check([68, 73, 67, 77], { offset: 128 })) {\n return {\n ext: \"dcm\",\n mime: \"application/dicom\"\n };\n }\n if (this.check([76, 0, 0, 0, 1, 20, 2, 0, 0, 0, 0, 0, 192, 0, 0, 0, 0, 0, 0, 70])) {\n return {\n ext: \"lnk\",\n mime: \"application/x.ms.shortcut\"\n // Invented by us\n };\n }\n if (this.check([98, 111, 111, 107, 0, 0, 0, 0, 109, 97, 114, 107, 0, 0, 0, 0])) {\n return {\n ext: \"alias\",\n mime: \"application/x.apple.alias\"\n // Invented by us\n };\n }\n if (this.checkString(\"Kaydara FBX Binary \\0\")) {\n return {\n ext: \"fbx\",\n mime: \"application/x.autodesk.fbx\"\n // Invented by us\n };\n }\n if (this.check([76, 80], { offset: 34 }) && (this.check([0, 0, 1], { offset: 8 }) || this.check([1, 0, 2], { offset: 8 }) || this.check([2, 0, 2], { offset: 8 }))) {\n return {\n ext: \"eot\",\n mime: \"application/vnd.ms-fontobject\"\n };\n }\n if (this.check([6, 6, 237, 245, 216, 29, 70, 229, 189, 49, 239, 231, 254, 116, 183, 29])) {\n return {\n ext: \"indd\",\n mime: \"application/x-indesign\"\n };\n }\n await tokenizer.peekBuffer(this.buffer, { length: Math.min(512, tokenizer.fileInfo.size), mayBeLess: true });\n if (tarHeaderChecksumMatches(this.buffer)) {\n return {\n ext: \"tar\",\n mime: \"application/x-tar\"\n };\n }\n if (this.check([255, 254])) {\n if (this.check([60, 0, 63, 0, 120, 0, 109, 0, 108, 0], { offset: 2 })) {\n return {\n ext: \"xml\",\n mime: \"application/xml\"\n };\n }\n if (this.check([255, 14, 83, 0, 107, 0, 101, 0, 116, 0, 99, 0, 104, 0, 85, 0, 112, 0, 32, 0, 77, 0, 111, 0, 100, 0, 101, 0, 108, 0], { offset: 2 })) {\n return {\n ext: \"skp\",\n mime: \"application/vnd.sketchup.skp\"\n };\n }\n return void 0;\n }\n if (this.checkString(\"-----BEGIN PGP MESSAGE-----\")) {\n return {\n ext: \"pgp\",\n mime: \"application/pgp-encrypted\"\n };\n }\n if (this.buffer.length >= 2 && this.check([255, 224], { offset: 0, mask: [255, 224] })) {\n if (this.check([16], { offset: 1, mask: [22] })) {\n if (this.check([8], { offset: 1, mask: [8] })) {\n return {\n ext: \"aac\",\n mime: \"audio/aac\"\n };\n }\n return {\n ext: \"aac\",\n mime: \"audio/aac\"\n };\n }\n if (this.check([2], { offset: 1, mask: [6] })) {\n return {\n ext: \"mp3\",\n mime: \"audio/mpeg\"\n };\n }\n if (this.check([4], { offset: 1, mask: [6] })) {\n return {\n ext: \"mp2\",\n mime: \"audio/mpeg\"\n };\n }\n if (this.check([6], { offset: 1, mask: [6] })) {\n return {\n ext: \"mp1\",\n mime: \"audio/mpeg\"\n };\n }\n }\n }\n async readTiffTag(bigEndian) {\n const tagId = await this.tokenizer.readToken(bigEndian ? UINT16_BE : UINT16_LE);\n this.tokenizer.ignore(10);\n switch (tagId) {\n case 50341:\n return {\n ext: \"arw\",\n mime: \"image/x-sony-arw\"\n };\n case 50706:\n return {\n ext: \"dng\",\n mime: \"image/x-adobe-dng\"\n };\n }\n }\n async readTiffIFD(bigEndian) {\n const numberOfTags = await this.tokenizer.readToken(bigEndian ? UINT16_BE : UINT16_LE);\n for (let n = 0; n < numberOfTags; ++n) {\n const fileType = await this.readTiffTag(bigEndian);\n if (fileType) {\n return fileType;\n }\n }\n }\n async readTiffHeader(bigEndian) {\n const version = (bigEndian ? UINT16_BE : UINT16_LE).get(this.buffer, 2);\n const ifdOffset = (bigEndian ? UINT32_BE : UINT32_LE).get(this.buffer, 4);\n if (version === 42) {\n if (ifdOffset >= 6) {\n if (this.checkString(\"CR\", { offset: 8 })) {\n return {\n ext: \"cr2\",\n mime: \"image/x-canon-cr2\"\n };\n }\n if (ifdOffset >= 8 && (this.check([28, 0, 254, 0], { offset: 8 }) || this.check([31, 0, 11, 0], { offset: 8 }))) {\n return {\n ext: \"nef\",\n mime: \"image/x-nikon-nef\"\n };\n }\n }\n await this.tokenizer.ignore(ifdOffset);\n const fileType = await this.readTiffIFD(bigEndian);\n return fileType ?? {\n ext: \"tif\",\n mime: \"image/tiff\"\n };\n }\n if (version === 43) {\n return {\n ext: \"tif\",\n mime: \"image/tiff\"\n };\n }\n }\n}\nnew Set(extensions);\nnew Set(mimeTypes);\nconst _InscriptionSDK = class _InscriptionSDK {\n constructor(config) {\n __publicField(this, \"client\");\n __publicField(this, \"config\");\n __publicField(this, \"logger\", Logger.getInstance());\n this.config = config;\n if (!config.apiKey) {\n throw new ValidationError(\"API key is required\");\n }\n if (!config.network) {\n throw new ValidationError(\"Network is required\");\n }\n const headers = {\n \"x-api-key\": config.apiKey,\n \"Content-Type\": \"application/json\"\n };\n this.client = axios.create({\n baseURL: \"https://v2-api.tier.bot/api\",\n headers\n });\n this.logger = Logger.getInstance();\n }\n async getFileMetadata(url) {\n try {\n const response = await axios.get(url);\n const mimeType = response.headers[\"content-type\"] || \"\";\n return {\n size: parseInt(response.headers[\"content-length\"] || \"0\", 10),\n mimeType\n };\n } catch (error) {\n this.logger.error(\"Error fetching file metadata:\", error);\n throw new ValidationError(\"Unable to fetch file metadata\");\n }\n }\n /**\n * Gets the MIME type for a file based on its extension.\n * @param fileName - The name of the file.\n * @returns The MIME type of the file.\n * @throws ValidationError if the file has no extension.\n */\n getMimeType(fileName) {\n const extension = fileName.toLowerCase().split(\".\").pop();\n if (!extension) {\n throw new ValidationError(\"File must have an extension\");\n }\n const mimeType = _InscriptionSDK.VALID_MIME_TYPES[extension];\n if (!mimeType) {\n throw new ValidationError(`Unsupported file type: ${extension}`);\n }\n return mimeType;\n }\n /**\n * Validates the request object.\n * @param request - The request object to validate.\n * @throws ValidationError if the request is invalid.\n */\n validateRequest(request) {\n this.logger.debug(\"Validating request:\", request);\n if (!request.holderId || request.holderId.trim() === \"\") {\n this.logger.warn(\"holderId is missing or empty\");\n throw new ValidationError(\"holderId is required\");\n }\n if (!_InscriptionSDK.VALID_MODES.includes(request.mode)) {\n throw new ValidationError(\n `Invalid mode: ${request.mode}. Must be one of: ${_InscriptionSDK.VALID_MODES.join(\", \")}`\n );\n }\n if (request.mode === \"hashinal\") {\n if (!request.jsonFileURL && !request.metadataObject) {\n throw new ValidationError(\n \"Hashinal mode requires either jsonFileURL or metadataObject\"\n );\n }\n }\n if (request.onlyJSONCollection && request.mode !== \"hashinal-collection\") {\n throw new ValidationError(\n \"onlyJSONCollection can only be used with hashinal-collection mode\"\n );\n }\n this.validateFileInput(request.file);\n }\n /**\n * Normalizes the MIME type to a standard format.\n * @param mimeType - The MIME type to normalize.\n * @returns The normalized MIME type.\n */\n normalizeMimeType(mimeType) {\n if (mimeType === \"image/vnd.microsoft.icon\") {\n this.logger.debug(\n \"Normalizing MIME type from image/vnd.microsoft.icon to image/x-icon\"\n );\n return \"image/x-icon\";\n }\n return mimeType;\n }\n validateMimeType(mimeType) {\n const validMimeTypes = Object.values(_InscriptionSDK.VALID_MIME_TYPES);\n if (validMimeTypes.includes(mimeType)) {\n return true;\n }\n if (mimeType === \"image/vnd.microsoft.icon\") {\n this.logger.debug(\n \"Accepting alternative MIME type for ICO: image/vnd.microsoft.icon\"\n );\n return true;\n }\n return false;\n }\n validateFileInput(file) {\n if (file.type === \"base64\") {\n if (!file.base64) {\n throw new ValidationError(\"Base64 data is required\");\n }\n const base64Data = file.base64.replace(/^data:.*?;base64,/, \"\");\n const size = Math.ceil(base64Data.length * 0.75);\n if (size > _InscriptionSDK.MAX_BASE64_SIZE) {\n throw new ValidationError(\n `File size exceeds maximum limit of ${_InscriptionSDK.MAX_BASE64_SIZE / 1024 / 1024}MB`\n );\n }\n const mimeType = file.mimeType || this.getMimeType(file.fileName);\n if (!this.validateMimeType(mimeType)) {\n throw new ValidationError(\n \"File must have one of the supported MIME types\"\n );\n }\n if (file.mimeType === \"image/vnd.microsoft.icon\") {\n file.mimeType = this.normalizeMimeType(file.mimeType);\n }\n } else if (file.type === \"url\") {\n if (!file.url) {\n throw new ValidationError(\"URL is required\");\n }\n }\n }\n async detectMimeTypeFromBase64(base64Data) {\n if (base64Data.startsWith(\"data:\")) {\n const matches = base64Data.match(/^data:([^;]+);base64,/);\n if (matches && matches.length > 1) {\n return matches[1];\n }\n }\n try {\n const sanitizedBase64 = base64Data.replace(/\\s/g, \"\");\n const buffer2 = Buffer2.from(sanitizedBase64, \"base64\");\n const typeResult = await fileTypeFromBuffer(buffer2);\n return (typeResult == null ? void 0 : typeResult.mime) || \"application/octet-stream\";\n } catch (err) {\n this.logger.warn(\"Failed to detect MIME type from buffer\");\n return \"application/octet-stream\";\n }\n }\n /**\n * Starts an inscription and returns the transaction bytes.\n * @param request - The request object containing the file to inscribe and the client configuration\n * @returns The transaction bytes of the started inscription\n * @throws ValidationError if the request is invalid\n * @throws Error if the inscription fails\n */\n async startInscription(request) {\n var _a, _b;\n try {\n this.validateRequest(request);\n let mimeType = request.file.mimeType;\n if (request.file.type === \"url\") {\n const fileMetadata = await this.getFileMetadata(request.file.url);\n mimeType = fileMetadata.mimeType || mimeType;\n if (fileMetadata.size > _InscriptionSDK.MAX_URL_FILE_SIZE) {\n throw new ValidationError(\n `File size exceeds maximum URL file limit of ${_InscriptionSDK.MAX_URL_FILE_SIZE / 1024 / 1024}MB`\n );\n }\n } else if (request.file.type === \"base64\") {\n mimeType = await this.detectMimeTypeFromBase64(request.file.base64);\n }\n if (mimeType === \"image/vnd.microsoft.icon\") {\n mimeType = this.normalizeMimeType(mimeType);\n }\n if (request.jsonFileURL) {\n const jsonMetadata = await this.getFileMetadata(request.jsonFileURL);\n if (jsonMetadata.mimeType !== \"application/json\") {\n throw new ValidationError(\n \"JSON file must be of type application/json\"\n );\n }\n }\n const requestBody = {\n holderId: request.holderId,\n mode: request.mode,\n network: this.config.network,\n onlyJSONCollection: request.onlyJSONCollection ? 1 : 0,\n creator: request.creator,\n description: request.description,\n fileStandard: request.fileStandard,\n metadataObject: request.metadataObject,\n jsonFileURL: request.jsonFileURL\n };\n let response;\n if (request.file.type === \"url\") {\n response = await this.client.post(\"/inscriptions/start-inscription\", {\n ...requestBody,\n fileURL: request.file.url\n });\n } else {\n response = await this.client.post(\"/inscriptions/start-inscription\", {\n ...requestBody,\n fileBase64: request.file.base64,\n fileName: request.file.fileName,\n fileMimeType: mimeType || this.getMimeType(request.file.fileName)\n });\n }\n return response.data;\n } catch (error) {\n if (error instanceof ValidationError) {\n throw error;\n }\n if (axios.isAxiosError(error)) {\n throw new Error(\n ((_b = (_a = error.response) == null ? void 0 : _a.data) == null ? void 0 : _b.message) || \"Failed to start inscription\"\n );\n }\n throw error;\n }\n }\n /**\n * Executes a transaction with the provided transaction bytes,\n * typically called after inscribing a file through `startInscription`.\n * @param transactionBytes - The bytes of the transaction to execute.\n * @param clientConfig - The configuration for the Hedera client.\n * @returns The transaction receipt.\n * @throws ValidationError if the transaction bytes are invalid.\n * @throws Error if the execution fails.\n */\n async executeTransaction(transactionBytes, clientConfig) {\n try {\n const client = clientConfig.network === \"mainnet\" ? Client.forMainnet() : Client.forTestnet();\n const privateKey = PrivateKey.fromString(clientConfig.privateKey);\n client.setOperator(clientConfig.accountId, privateKey);\n const transaction = TransferTransaction.fromBytes(\n Buffer2.from(transactionBytes, \"base64\")\n );\n const signedTransaction = await transaction.sign(privateKey);\n const executeTx = await signedTransaction.execute(client);\n const receipt = await executeTx.getReceipt(client);\n const status = receipt.status.toString();\n if (status !== \"SUCCESS\") {\n throw new Error(`Transaction failed with status: ${status}`);\n }\n return executeTx.transactionId.toString();\n } catch (error) {\n throw new Error(\n `Failed to execute transaction: ${error instanceof Error ? error.message : \"Unknown error\"}`\n );\n }\n }\n /**\n * Executes a transaction with the provided transaction bytes using a Signer,\n * typically called after inscribing a file through `startInscription`.\n * @param transactionBytes - The bytes of the transaction to execute.\n * @param clientConfig - The configuration for the Hedera client.\n * @returns The transaction receipt.\n * @throws ValidationError if the transaction bytes are invalid.\n * @throws Error if the execution fails.\n */\n async executeTransactionWithSigner(transactionBytes, signer) {\n try {\n const transaction = TransferTransaction.fromBytes(\n Buffer2.from(transactionBytes, \"base64\")\n );\n const executeTx = await transaction.executeWithSigner(signer);\n const receipt = await executeTx.getReceiptWithSigner(signer);\n const status = receipt.status.toString();\n if (status !== \"SUCCESS\") {\n throw new Error(`Transaction failed with status: ${status}`);\n }\n return executeTx.transactionId.toString();\n } catch (error) {\n throw new Error(\n `Failed to execute transaction: ${error instanceof Error ? error.message : \"Unknown error\"}`\n );\n }\n }\n /**\n * Inscribes a file and executes the transaction. Note that base64 files are limited to 2MB, while URL files are limited to 100MB.\n * @param request - The request object containing the file to inscribe and the client configuration\n * @param clientConfig - The configuration for the Hedera network and account\n * @returns The transaction ID of the executed transaction\n * @throws ValidationError if the request is invalid\n * @throws Error if the transaction execution fails\n */\n async inscribeAndExecute(request, clientConfig) {\n const inscriptionResponse = await this.startInscription(request);\n if (!inscriptionResponse.transactionBytes) {\n this.logger.error(\n \"No transaction bytes returned from inscription request\",\n inscriptionResponse\n );\n throw new Error(\"No transaction bytes returned from inscription request\");\n }\n this.logger.info(\"executing transaction\");\n const transactionId = await this.executeTransaction(\n inscriptionResponse.transactionBytes,\n clientConfig\n );\n return {\n jobId: inscriptionResponse.tx_id,\n transactionId\n };\n }\n /**\n * Inscribes a file and executes the transaction. Note that base64 files are limited to 2MB, while URL files are limited to 100MB.\n * @param request - The request object containing the file to inscribe and the client configuration\n * @param clientConfig - The configuration for the Hedera network and account\n * @returns The transaction ID of the executed transaction\n * @throws ValidationError if the request is invalid\n * @throws Error if the transaction execution fails\n */\n async inscribe(request, signer) {\n const inscriptionResponse = await this.startInscription(request);\n if (!inscriptionResponse.transactionBytes) {\n this.logger.error(\n \"No transaction bytes returned from inscription request\",\n inscriptionResponse\n );\n throw new Error(\"No transaction bytes returned from inscription request\");\n }\n this.logger.info(\"executing transaction\");\n const transactionId = await this.executeTransactionWithSigner(\n inscriptionResponse.transactionBytes,\n signer\n );\n return {\n jobId: inscriptionResponse.tx_id,\n transactionId\n };\n }\n async retryWithBackoff(operation, maxRetries = 3, baseDelay = 1e3) {\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n try {\n return await operation();\n } catch (error) {\n if (attempt === maxRetries - 1) {\n throw error;\n }\n const delay = baseDelay * Math.pow(2, attempt);\n await new Promise((resolve) => setTimeout(resolve, delay));\n this.logger.debug(\n `Retry attempt ${attempt + 1}/${maxRetries} after ${delay}ms delay`\n );\n }\n }\n throw new Error(\"Retry operation failed\");\n }\n /**\n * Retrieves an inscription by its transaction id. Call this function on an interval\n * so you can retrieve the status. Store the transaction id in your database if you\n * need to reference it later on\n * @param txId - The ID of the inscription to retrieve\n * @returns The retrieved inscription\n * @throws ValidationError if the ID is invalid\n * @throws Error if the retrieval fails\n */\n async retrieveInscription(txId) {\n if (!txId) {\n throw new ValidationError(\"Transaction ID is required\");\n }\n try {\n return await this.retryWithBackoff(async () => {\n const response = await this.client.get(\n `/inscriptions/retrieve-inscription?id=${txId}`\n );\n const result = response.data;\n return { ...result, jobId: result.id };\n });\n } catch (error) {\n this.logger.error(\"Failed to retrieve inscription:\", error);\n throw error;\n }\n }\n /**\n * Fetch inscription numbers with optional filtering and sorting\n * @param params Query parameters for filtering and sorting inscriptions\n * @returns Array of inscription details\n */\n async getInscriptionNumbers(params = {}) {\n try {\n const response = await this.client.get(\"/inscriptions/numbers\", {\n params\n });\n return response.data;\n } catch (error) {\n this.logger.error(\"Failed to fetch inscription numbers:\", error);\n throw error;\n }\n }\n /**\n * Authenticates the SDK with the provided configuration\n * @param config - The configuration for authentication\n * @returns The authentication result\n */\n static async authenticate(config) {\n const auth = new Auth(config);\n return auth.authenticate();\n }\n /**\n * Creates an instance of the InscriptionSDK with authentication.\n * Useful for cases where you don't have an API key but need to authenticate from server-side\n * with a private key.\n * @param config - The configuration for authentication\n * @returns An instance of the InscriptionSDK\n */\n static async createWithAuth(config) {\n const auth = config.type === \"client\" ? new ClientAuth({\n ...config,\n logger: Logger.getInstance()\n }) : new Auth(config);\n const { apiKey } = await auth.authenticate();\n return new _InscriptionSDK({\n apiKey,\n network: config.network || \"mainnet\"\n });\n }\n async waitForInscription(txId, maxAttempts = 30, intervalMs = 4e3, checkCompletion = false, progressCallback) {\n var _a;\n let attempts = 0;\n let highestPercentSoFar = 0;\n const reportProgress = (stage, message, percent, details) => {\n if (progressCallback) {\n try {\n highestPercentSoFar = Math.max(highestPercentSoFar, percent);\n progressCallback({\n stage,\n message,\n progressPercent: highestPercentSoFar,\n details: {\n ...details,\n txId,\n currentAttempt: attempts,\n maxAttempts\n }\n });\n } catch (err) {\n this.logger.warn(`Error in progress callback: ${err}`);\n }\n }\n };\n reportProgress(\"confirming\", \"Starting inscription verification\", 0);\n while (attempts < maxAttempts) {\n reportProgress(\n \"confirming\",\n `Verifying inscription status (attempt ${attempts + 1}/${maxAttempts})`,\n 5,\n { attempt: attempts + 1 }\n );\n const result = await this.retrieveInscription(txId);\n if (result.error) {\n reportProgress(\"verifying\", `Error: ${result.error}`, 100, {\n error: result.error\n });\n throw new Error(result.error);\n }\n let progressPercent = 5;\n if (result.messages !== void 0 && result.maxMessages !== void 0 && result.maxMessages > 0) {\n progressPercent = Math.min(\n 95,\n 5 + result.messages / result.maxMessages * 90\n );\n if (result.completed) {\n progressPercent = 100;\n }\n } else if (result.status === \"processing\") {\n progressPercent = 10;\n } else if (result.completed) {\n progressPercent = 100;\n }\n reportProgress(\n result.completed ? \"completed\" : \"confirming\",\n result.completed ? \"Inscription completed successfully\" : `Processing inscription (${result.status})`,\n progressPercent,\n {\n status: result.status,\n messagesProcessed: result.messages,\n maxMessages: result.maxMessages,\n messageCount: result.messages,\n completed: result.completed,\n confirmedMessages: result.confirmedMessages,\n result\n }\n );\n const isHashinal = result.mode === \"hashinal\";\n const isDynamic = ((_a = result.fileStandard) == null ? void 0 : _a.toString()) === \"6\";\n if (isHashinal && result.topic_id && result.jsonTopicId) {\n if (!checkCompletion || result.completed) {\n reportProgress(\n \"completed\",\n \"Inscription verification complete\",\n 100,\n { result }\n );\n return result;\n }\n }\n if (!isHashinal && !isDynamic && result.topic_id) {\n if (!checkCompletion || result.completed) {\n reportProgress(\n \"completed\",\n \"Inscription verification complete\",\n 100,\n { result }\n );\n return result;\n }\n }\n if (isDynamic && result.topic_id && result.jsonTopicId && result.registryTopicId) {\n if (!checkCompletion || result.completed) {\n reportProgress(\n \"completed\",\n \"Inscription verification complete\",\n 100,\n { result }\n );\n return result;\n }\n }\n await new Promise((resolve) => setTimeout(resolve, intervalMs));\n attempts++;\n }\n reportProgress(\n \"verifying\",\n `Inscription ${txId} did not complete within ${maxAttempts} attempts`,\n 100,\n { timedOut: true }\n );\n throw new Error(\n `Inscription ${txId} did not complete within ${maxAttempts} attempts`\n );\n }\n /**\n * Fetch inscriptions owned by a specific holder\n * @param params Query parameters for retrieving holder's inscriptions\n * @returns Array of inscription details owned by the holder\n */\n async getHolderInscriptions(params) {\n var _a, _b;\n if (!params.holderId) {\n throw new ValidationError(\"Holder ID is required\");\n }\n try {\n const queryParams = {\n holderId: params.holderId\n };\n if (params.includeCollections) {\n queryParams.includeCollections = \"1\";\n }\n const response = await this.client.get(\"/inscriptions/holder-inscriptions\", {\n params: queryParams\n });\n return response.data;\n } catch (error) {\n this.logger.error(\"Failed to fetch holder inscriptions:\", error);\n if (axios.isAxiosError(error)) {\n throw new Error(\n ((_b = (_a = error.response) == null ? void 0 : _a.data) == null ? void 0 : _b.message) || \"Failed to fetch holder inscriptions\"\n );\n }\n throw error;\n }\n }\n};\n__publicField(_InscriptionSDK, \"VALID_MODES\", [\n \"file\",\n \"upload\",\n \"hashinal\",\n \"hashinal-collection\"\n]);\n__publicField(_InscriptionSDK, \"MAX_BASE64_SIZE\", 2 * 1024 * 1024);\n__publicField(_InscriptionSDK, \"MAX_URL_FILE_SIZE\", 100 * 1024 * 1024);\n__publicField(_InscriptionSDK, \"VALID_MIME_TYPES\", {\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n png: \"image/png\",\n gif: \"image/gif\",\n ico: \"image/x-icon\",\n heic: \"image/heic\",\n heif: \"image/heif\",\n bmp: \"image/bmp\",\n webp: \"image/webp\",\n tiff: \"image/tiff\",\n tif: \"image/tiff\",\n svg: \"image/svg+xml\",\n mp4: \"video/mp4\",\n webm: \"video/webm\",\n mp3: \"audio/mpeg\",\n pdf: \"application/pdf\",\n doc: \"application/msword\",\n docx: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n xls: \"application/vnd.ms-excel\",\n xlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n ppt: \"application/vnd.ms-powerpoint\",\n pptx: \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n html: \"text/html\",\n htm: \"text/html\",\n css: \"text/css\",\n php: \"application/x-httpd-php\",\n java: \"text/x-java-source\",\n js: \"application/javascript\",\n mjs: \"application/javascript\",\n csv: \"text/csv\",\n json: \"application/json\",\n txt: \"text/plain\",\n glb: \"model/gltf-binary\",\n wav: \"audio/wav\",\n ogg: \"audio/ogg\",\n oga: \"audio/ogg\",\n flac: \"audio/flac\",\n aac: \"audio/aac\",\n m4a: \"audio/mp4\",\n avi: \"video/x-msvideo\",\n mov: \"video/quicktime\",\n mkv: \"video/x-matroska\",\n m4v: \"video/mp4\",\n mpg: \"video/mpeg\",\n mpeg: \"video/mpeg\",\n ts: \"application/typescript\",\n zip: \"application/zip\",\n rar: \"application/vnd.rar\",\n tar: \"application/x-tar\",\n gz: \"application/gzip\",\n \"7z\": \"application/x-7z-compressed\",\n xml: \"application/xml\",\n yaml: \"application/yaml\",\n yml: \"application/yaml\",\n md: \"text/markdown\",\n markdown: \"text/markdown\",\n rtf: \"application/rtf\",\n gltf: \"model/gltf+json\",\n usdz: \"model/vnd.usdz+zip\",\n obj: \"model/obj\",\n stl: \"model/stl\",\n fbx: \"application/octet-stream\",\n ttf: \"font/ttf\",\n otf: \"font/otf\",\n woff: \"font/woff\",\n woff2: \"font/woff2\",\n eot: \"application/vnd.ms-fontobject\",\n psd: \"application/vnd.adobe.photoshop\",\n ai: \"application/postscript\",\n eps: \"application/postscript\",\n ps: \"application/postscript\",\n sqlite: \"application/x-sqlite3\",\n db: \"application/x-sqlite3\",\n apk: \"application/vnd.android.package-archive\",\n ics: \"text/calendar\",\n vcf: \"text/vcard\",\n py: \"text/x-python\",\n rb: \"text/x-ruby\",\n go: \"text/x-go\",\n rs: \"text/x-rust\",\n typescript: \"application/typescript\",\n jsx: \"text/jsx\",\n tsx: \"text/tsx\",\n sql: \"application/sql\",\n toml: \"application/toml\",\n avif: \"image/avif\",\n jxl: \"image/jxl\",\n weba: \"audio/webm\"\n});\nlet InscriptionSDK = _InscriptionSDK;\nexport {\n Auth as A,\n ClientAuth as C,\n InscriptionSDK as I,\n ValidationError as V,\n process$1 as p\n};\n//# sourceMappingURL=index-Dt7aLBOw.js.map\n","import { Logger } from './logger';\n\nexport type ProgressStage =\n | 'preparing'\n | 'submitting'\n | 'confirming'\n | 'verifying'\n | 'completed'\n | 'failed';\n\nexport interface ProgressData {\n stage: ProgressStage;\n message: string;\n progressPercent: number;\n details?: Record<string, any>;\n}\n\nexport type ProgressCallback = (data: ProgressData) => void;\n\nexport interface ProgressReporterOptions {\n module?: string;\n callback?: ProgressCallback;\n logger?: Logger;\n logProgress?: boolean;\n minPercent?: number;\n maxPercent?: number;\n}\n\n/**\n * ProgressReporter is a singleton class that reports progress of a task.\n * Can be used in a generalized fashion.\n */\nexport class ProgressReporter {\n private static instance: ProgressReporter;\n private module: string;\n private callback?: ProgressCallback;\n private logger: Logger;\n private logProgress: boolean;\n private minPercent: number;\n private maxPercent: number;\n private lastReportedPercent: number;\n private lastReportedTime: number;\n private throttleMs: number;\n\n constructor(options: ProgressReporterOptions = {}) {\n this.module = options.module || 'Progress';\n this.callback = options.callback;\n this.logger =\n options.logger ||\n new Logger({\n level: 'info',\n module: 'ProgressReporter',\n });\n this.logProgress = options.logProgress ?? true;\n this.minPercent = options.minPercent ?? 0;\n this.maxPercent = options.maxPercent ?? 100;\n this.lastReportedPercent = -1;\n this.lastReportedTime = 0;\n this.throttleMs = 100;\n }\n\n static getInstance(options: ProgressReporterOptions = {}): ProgressReporter {\n if (!ProgressReporter.instance) {\n ProgressReporter.instance = new ProgressReporter(options);\n } else {\n if (options.callback) {\n ProgressReporter.instance.setCallback(options.callback);\n }\n if (options.module) {\n ProgressReporter.instance.setModule(options.module);\n }\n if (options.logger) {\n ProgressReporter.instance.setLogger(options.logger);\n }\n if (options.minPercent !== undefined) {\n ProgressReporter.instance.setMinPercent(options.minPercent);\n }\n if (options.maxPercent !== undefined) {\n ProgressReporter.instance.setMaxPercent(options.maxPercent);\n }\n }\n return ProgressReporter.instance;\n }\n\n setCallback(callback: ProgressCallback): void {\n this.callback = callback;\n }\n\n setModule(module: string): void {\n this.module = module;\n }\n\n setLogger(logger: Logger): void {\n this.logger = logger;\n }\n\n setMinPercent(minPercent: number): void {\n this.minPercent = minPercent;\n }\n\n setMaxPercent(maxPercent: number): void {\n this.maxPercent = maxPercent;\n }\n\n createSubProgress(options: {\n minPercent: number;\n maxPercent: number;\n logPrefix?: string;\n }): ProgressReporter {\n const subReporter = new ProgressReporter({\n module: this.module,\n logger: this.logger,\n logProgress: this.logProgress,\n minPercent: options.minPercent,\n maxPercent: options.maxPercent,\n });\n\n const logPrefix = options.logPrefix || '';\n\n subReporter.setCallback(data => {\n const scaledPercent = this.scalePercent(\n data.progressPercent,\n options.minPercent,\n options.maxPercent,\n );\n\n let formattedMessage = data.message;\n if (logPrefix && !formattedMessage.startsWith(logPrefix)) {\n formattedMessage = `${logPrefix}: ${formattedMessage}`;\n }\n\n this.report({\n stage: data.stage,\n message: formattedMessage,\n progressPercent: scaledPercent,\n details: data.details,\n });\n });\n\n return subReporter;\n }\n\n report(data: ProgressData): void {\n const rawPercent = data.progressPercent;\n const percent = Math.max(0, Math.min(100, rawPercent));\n\n const scaledPercent = this.scalePercent(percent, 0, 100);\n\n const now = Date.now();\n if (\n scaledPercent === this.lastReportedPercent &&\n now - this.lastReportedTime < this.throttleMs &&\n data.stage !== 'completed' &&\n data.stage !== 'failed'\n ) {\n return;\n }\n\n this.lastReportedPercent = scaledPercent;\n this.lastReportedTime = now;\n\n const progressData = {\n ...data,\n progressPercent: scaledPercent,\n };\n\n if (this.logProgress) {\n this.logger.debug(\n `[${this.module}] [${data.stage.toUpperCase()}] ${\n data.message\n } (${scaledPercent.toFixed(1)}%)`,\n data.details,\n );\n }\n\n if (this.callback) {\n try {\n this.callback(progressData);\n } catch (err) {\n this.logger.warn(`Error in progress callback: ${err}`);\n }\n }\n }\n\n private scalePercent(\n percent: number,\n sourceMin: number,\n sourceMax: number,\n ): number {\n const range = this.maxPercent - this.minPercent;\n const sourceRange = sourceMax - sourceMin;\n const scaleFactor = range / sourceRange;\n\n return this.minPercent + (percent - sourceMin) * scaleFactor;\n }\n\n preparing(\n message: string,\n percent: number,\n details?: Record<string, any>,\n ): void {\n this.report({\n stage: 'preparing',\n message,\n progressPercent: percent,\n details,\n });\n }\n\n submitting(\n message: string,\n percent: number,\n details?: Record<string, any>,\n ): void {\n this.report({\n stage: 'submitting',\n message,\n progressPercent: percent,\n details,\n });\n }\n\n confirming(\n message: string,\n percent: number,\n details?: Record<string, any>,\n ): void {\n this.report({\n stage: 'confirming',\n message,\n progressPercent: percent,\n details,\n });\n }\n\n verifying(\n message: string,\n percent: number,\n details?: Record<string, any>,\n ): void {\n this.report({\n stage: 'verifying',\n message,\n progressPercent: percent,\n details,\n });\n }\n\n completed(message: string, details?: Record<string, any>): void {\n this.report({ stage: 'completed', message, progressPercent: 100, details });\n }\n\n failed(message: string, details?: Record<string, any>): void {\n this.report({\n stage: 'failed',\n message,\n progressPercent: this.lastReportedPercent,\n details,\n });\n }\n}\n","import { InscriptionSDK } from '@kiloscribe/inscription-sdk';\nimport {\n InscriptionOptions,\n InscriptionResult,\n RetrievedInscriptionResult,\n HederaClientConfig,\n} from './types';\nimport type { DAppSigner } from '@hashgraph/hedera-wallet-connect';\nimport { Logger } from '../utils/logger';\nimport { ProgressCallback, ProgressReporter } from '../utils/progress-reporter';\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\nexport type InscriptionResponse =\n | { confirmed: false; result: InscriptionResult; sdk: InscriptionSDK }\n | {\n confirmed: true;\n result: InscriptionResult;\n inscription: RetrievedInscriptionResult;\n sdk: InscriptionSDK;\n };\n\nexport async function inscribe(\n input: InscriptionInput,\n clientConfig: HederaClientConfig,\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 ...(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.mode === 'hashinal' && options.metadata) {\n validateHashinalMetadata(options.metadata, logger);\n }\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 });\n } else {\n logger.debug('Initializing InscriptionSDK with server auth');\n sdk = await InscriptionSDK.createWithAuth({\n type: 'server',\n accountId: clientConfig.accountId,\n privateKey: clientConfig.privateKey,\n network: clientConfig.network || 'mainnet',\n });\n }\n\n const baseRequest = {\n holderId: clientConfig.accountId,\n metadata: options.metadata || {},\n tags: options.tags || [],\n mode: options.mode || 'file',\n chunkSize: options.chunkSize,\n };\n\n let request: any;\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 request = {\n ...baseRequest,\n file: {\n type: 'path',\n path: input.path,\n },\n };\n break;\n\n case 'buffer':\n request = {\n ...baseRequest,\n file: {\n type: 'base64',\n base64: Buffer.from(input.buffer).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 result = await sdk.inscribeAndExecute(request, clientConfig);\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 ...(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.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',\n });\n } else {\n logger.debug('Initializing InscriptionSDK with client auth');\n sdk = await InscriptionSDK.createWithAuth({\n type: 'client',\n accountId,\n signer: signer,\n network: options.network || 'mainnet',\n });\n }\n\n const baseRequest = {\n holderId: accountId,\n metadata: options.metadata || {},\n tags: options.tags || [],\n mode: options.mode || 'file',\n chunkSize: options.chunkSize,\n };\n\n let request: any;\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 request = {\n ...baseRequest,\n file: {\n type: 'path',\n path: input.path,\n },\n };\n break;\n\n case 'buffer':\n request = {\n ...baseRequest,\n file: {\n type: 'base64',\n base64: Buffer.from(input.buffer).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('Preparing to inscribe content with signer', {\n type: input.type,\n mode: options.mode || 'file',\n holderId: accountId,\n });\n\n const result = await sdk.inscribe(\n {\n ...request,\n holderId: accountId,\n },\n signer,\n );\n logger.info('Inscription started', {\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 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\nfunction validateHashinalMetadata(metadata: any, logger: any): 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\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?: Function,\n ) => Promise<RetrievedInscriptionResult>;\n\n const wrappedCallback = (data: any) => {\n const stage = data.stage || 'confirming';\n const message = data.message || 'Processing inscription';\n const percent = data.progressPercent || 50;\n\n progressReporter.report({\n stage: stage,\n message: message,\n progressPercent: percent,\n details: {},\n });\n };\n\n return await waitMethod(\n transactionId,\n maxAttempts,\n intervalMs,\n true,\n wrappedCallback,\n );\n } catch (e) {\n console.log(e);\n // Fall back to standard method if progress callback fails\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","import { PublicKey, Timestamp, AccountId } from '@hashgraph/sdk';\nimport axios, { AxiosRequestConfig } from 'axios';\nimport { Logger } from '../utils/logger';\nimport { HCSMessage } from '../hcs-10/base-client';\nimport { proto } from '@hashgraph/proto';\nimport {\n AccountResponse,\n CustomFees,\n HBARPrice,\n ScheduleInfo,\n TokenInfoResponse,\n TopicMessagesResponse,\n TopicResponse,\n Transaction as HederaTransaction,\n AccountTokenBalance,\n AccountTokensResponse,\n NftDetail,\n AccountNftsResponse,\n ContractCallQueryResponse,\n TokenAirdrop,\n TokenAirdropsResponse,\n Block,\n BlocksResponse,\n ContractResult,\n ContractResultsResponse,\n ContractLog,\n ContractLogsResponse,\n ContractAction,\n ContractActionsResponse,\n ContractEntity,\n ContractsResponse,\n ContractState,\n ContractStateResponse,\n NftInfo,\n NftsResponse,\n NetworkInfo,\n NetworkFees,\n NetworkSupply,\n NetworkStake,\n OpcodesResponse,\n} from './types';\nimport { NetworkType } from '../utils/types';\n\n/**\n * Configuration for retry attempts.\n */\nexport interface RetryConfig {\n maxRetries?: number;\n initialDelayMs?: number;\n maxDelayMs?: number;\n backoffFactor?: number;\n}\n\n/**\n * Configuration for custom mirror node providers.\n *\n * @example\n * // Using HGraph with API key in URL\n * const config = {\n * customUrl: 'https://mainnet.hedera.api.hgraph.dev/v1/<API-KEY>',\n * apiKey: 'your-api-key-here'\n * };\n *\n * @example\n * // Using custom provider with API key in headers\n * const config = {\n * customUrl: 'https://custom-mirror-node.com',\n * apiKey: 'your-api-key',\n * headers: {\n * 'X-Custom-Header': 'value'\n * }\n * };\n */\nexport interface MirrorNodeConfig {\n /** Custom mirror node URL. Can include <API-KEY> placeholder for URL-based API keys. */\n customUrl?: string;\n /** API key for authentication. Will be used in both Authorization header and URL replacement. */\n apiKey?: string;\n /** Additional custom headers to include with requests. */\n headers?: Record<string, string>;\n}\n\nexport class HederaMirrorNode {\n private network: NetworkType;\n private baseUrl: string;\n private logger: Logger;\n private isServerEnvironment: boolean;\n private apiKey?: string;\n private customHeaders: Record<string, string>;\n\n private maxRetries: number = 3;\n private initialDelayMs: number = 1000;\n private maxDelayMs: number = 30000;\n private backoffFactor: number = 2;\n\n constructor(network: NetworkType, logger?: Logger, config?: MirrorNodeConfig) {\n this.network = network;\n this.apiKey = config?.apiKey;\n this.customHeaders = config?.headers || {};\n this.baseUrl = config?.customUrl || this.getMirrorNodeUrl();\n this.logger =\n logger ||\n new Logger({\n level: 'debug',\n module: 'MirrorNode',\n });\n this.isServerEnvironment = typeof window === 'undefined';\n\n if (config?.customUrl) {\n this.logger.info(`Using custom mirror node URL: ${config.customUrl}`);\n }\n if (config?.apiKey) {\n this.logger.info('Using API key for mirror node requests');\n }\n }\n\n /**\n * Configures the retry mechanism for API requests.\n * @param config The retry configuration.\n */\n public configureRetry(config: RetryConfig): void {\n this.maxRetries = config.maxRetries ?? this.maxRetries;\n this.initialDelayMs = config.initialDelayMs ?? this.initialDelayMs;\n this.maxDelayMs = config.maxDelayMs ?? this.maxDelayMs;\n this.backoffFactor = config.backoffFactor ?? this.backoffFactor;\n this.logger.info(\n `Retry configuration updated: maxRetries=${this.maxRetries}, initialDelayMs=${this.initialDelayMs}, maxDelayMs=${this.maxDelayMs}, backoffFactor=${this.backoffFactor}`,\n );\n }\n\n /**\n * Updates the mirror node configuration.\n * @param config The new mirror node configuration.\n */\n public configureMirrorNode(config: MirrorNodeConfig): void {\n if (config.customUrl) {\n this.baseUrl = config.customUrl;\n this.logger.info(`Updated mirror node URL: ${config.customUrl}`);\n }\n if (config.apiKey) {\n this.apiKey = config.apiKey;\n this.logger.info('Updated API key for mirror node requests');\n }\n if (config.headers) {\n this.customHeaders = { ...this.customHeaders, ...config.headers };\n this.logger.info('Updated custom headers for mirror node requests');\n }\n }\n\n /**\n * Constructs a full URL for API requests, handling custom providers with API keys in the path.\n * @param endpoint The API endpoint (e.g., '/api/v1/accounts/0.0.123')\n * @returns The full URL for the request\n */\n private constructUrl(endpoint: string): string {\n if (this.baseUrl.includes('<API-KEY>') && this.apiKey) {\n const baseUrlWithKey = this.baseUrl.replace('<API-KEY>', this.apiKey);\n return endpoint.startsWith('/')\n ? `${baseUrlWithKey}${endpoint}`\n : `${baseUrlWithKey}/${endpoint}`;\n }\n return endpoint.startsWith('/')\n ? `${this.baseUrl}${endpoint}`\n : `${this.baseUrl}/${endpoint}`;\n }\n\n private getMirrorNodeUrl(): string {\n return this.network === 'mainnet'\n ? 'https://mainnet-public.mirrornode.hedera.com'\n : 'https://testnet.mirrornode.hedera.com';\n }\n\n getBaseUrl(): string {\n return this.baseUrl;\n }\n\n /**\n * Retrieves the public key for a given account ID from the mirror node.\n * @param accountId The ID of the account to retrieve the public key for.\n * @returns A promise that resolves to the public key for the given account.\n * @throws An error if the account ID is invalid or the public key cannot be retrieved.\n */\n async getPublicKey(accountId: string): Promise<PublicKey> {\n this.logger.info(`Getting public key for account ${accountId}`);\n\n const accountInfo = await this.requestAccount(accountId);\n\n try {\n if (!accountInfo || !accountInfo.key) {\n throw new Error(\n `Failed to retrieve public key for account ID: ${accountId}`,\n );\n }\n\n return PublicKey.fromString(accountInfo.key.key);\n } catch (e: any) {\n const error = e as Error;\n const logMessage = `Error fetching public key from Mirror Node: ${error.message}`;\n this.logger.error(logMessage);\n throw new Error(logMessage);\n }\n }\n\n /**\n * Retrieves the memo for a given account ID from the mirror node.\n * @param accountId The ID of the account to retrieve the memo for.\n * @returns A promise that resolves to the memo for the given account.\n * @throws An error if the account ID is invalid or the memo cannot be retrieved.\n */\n async getAccountMemo(accountId: string): Promise<string | null> {\n this.logger.info(`Getting account memo for account ID: ${accountId}`);\n\n try {\n const accountInfo = await this._requestWithRetry<AccountResponse>(\n `/api/v1/accounts/${accountId}`,\n );\n\n if (accountInfo?.memo) {\n return accountInfo.memo;\n }\n this.logger.warn(`No memo found for account ${accountId}`);\n return null;\n } catch (e: any) {\n const error = e as Error;\n this.logger.error(\n `Failed to get account memo for ${accountId} after retries: ${error.message}`,\n );\n return null;\n }\n }\n\n /**\n * Retrieves topic information for a given topic ID from the mirror node.\n * @param topicId The ID of the topic to retrieve information for.\n * @returns A promise that resolves to the topic information.\n * @throws An error if the topic ID is invalid or the information cannot be retrieved.\n */\n async getTopicInfo(topicId: string): Promise<TopicResponse> {\n try {\n this.logger.debug(`Fetching topic info for ${topicId}`);\n const data = await this._requestWithRetry<TopicResponse>(\n `/api/v1/topics/${topicId}`,\n );\n return data;\n } catch (e: any) {\n const error = e as Error;\n const logMessage = `Error retrieving topic information for ${topicId} after retries: ${error.message}`;\n this.logger.error(logMessage);\n throw new Error(logMessage);\n }\n }\n\n /**\n * Retrieves custom fees for a given topic ID from the mirror node.\n * @param topicId The ID of the topic to retrieve custom fees for.\n * @returns A promise that resolves to the custom fees for the given topic.\n * @throws An error if the topic ID is invalid or the custom fees cannot be retrieved.\n */\n async getTopicFees(topicId: string): Promise<CustomFees | null> {\n try {\n const topicInfo = await this.getTopicInfo(topicId);\n return topicInfo.custom_fees;\n } catch (e: any) {\n const error = e as Error;\n const logMessage = `Error retrieving topic fees: ${error.message}`;\n this.logger.error(logMessage);\n return null;\n }\n }\n\n /**\n * Retrieves the current HBAR price from the mirror node.\n * @param date The date to retrieve the HBAR price for.\n * @returns A promise that resolves to the HBAR price for the given date.\n * @throws An error if the date is invalid or the price cannot be retrieved.\n */\n async getHBARPrice(date: Date): Promise<number | null> {\n try {\n const timestamp = Timestamp.fromDate(date).toString();\n this.logger.debug(`Fetching HBAR price for timestamp ${timestamp}`);\n\n const response = await this._requestWithRetry<HBARPrice>(\n `/api/v1/network/exchangerate?timestamp=${timestamp}`,\n );\n\n const usdPrice =\n Number(response?.current_rate?.cent_equivalent) /\n Number(response?.current_rate?.hbar_equivalent) /\n 100;\n\n return usdPrice;\n } catch (e: any) {\n const error = e as Error;\n const logMessage = `Error retrieving HBAR price: ${error.message}`;\n this.logger.error(logMessage);\n return null;\n }\n }\n\n /**\n * Retrieves token information for a given token ID from the mirror node.\n * @param tokenId The ID of the token to retrieve information for.\n * @returns A promise that resolves to the token information.\n * @throws An error if the token ID is invalid or the information cannot be retrieved.\n */\n async getTokenInfo(tokenId: string): Promise<TokenInfoResponse | null> {\n this.logger.debug(`Fetching token info for ${tokenId}`);\n try {\n const data = await this._requestWithRetry<TokenInfoResponse>(\n `/api/v1/tokens/${tokenId}`,\n );\n if (data) {\n this.logger.trace(`Token info found for ${tokenId}:`, data);\n return data;\n }\n this.logger.warn(`No token info found for ${tokenId}`);\n return null;\n } catch (e: any) {\n const error = e as Error;\n const logMessage = `Error fetching token info for ${tokenId}: ${error.message}`;\n this.logger.error(logMessage);\n\n return null;\n }\n }\n\n /**\n * Retrieves messages for a given topic ID from the mirror node.\n * @param topicId The ID of the topic to retrieve messages for.\n * @returns A promise that resolves to the messages for the given topic.\n * @throws An error if the topic ID is invalid or the messages cannot be retrieved.\n */\n async getTopicMessages(topicId: string): Promise<HCSMessage[]> {\n this.logger.trace(`Querying messages for topic ${topicId}`);\n\n let nextEndpoint = `/api/v1/topics/${topicId}/messages`;\n const messages: HCSMessage[] = [];\n\n while (nextEndpoint) {\n try {\n const data =\n await this._requestWithRetry<TopicMessagesResponse>(nextEndpoint);\n\n if (data.messages && data.messages.length > 0) {\n for (const message of data.messages) {\n try {\n if (!message.message) {\n continue;\n }\n\n let messageContent: string;\n try {\n if (this.isServerEnvironment) {\n messageContent = Buffer.from(\n message.message,\n 'base64',\n ).toString('utf-8');\n } else {\n messageContent = new TextDecoder().decode(\n Uint8Array.from(atob(message.message), c =>\n c.charCodeAt(0),\n ),\n );\n }\n } catch (error) {\n const logMessage = `Error decoding message: ${error}`;\n this.logger.error(logMessage);\n continue;\n }\n\n let messageJson;\n try {\n messageJson = JSON.parse(messageContent);\n } catch (error) {\n const logMessage = `Invalid JSON message content: ${messageContent}`;\n this.logger.error(logMessage);\n continue;\n }\n\n messageJson.sequence_number = message.sequence_number;\n messages.push({\n ...messageJson,\n consensus_timestamp: message.consensus_timestamp,\n sequence_number: message.sequence_number,\n created: new Date(Number(message.consensus_timestamp) * 1000),\n });\n } catch (error: any) {\n const logMessage = `Error processing message: ${error.message}`;\n this.logger.error(logMessage);\n }\n }\n }\n\n nextEndpoint = data.links?.next || '';\n } catch (e: any) {\n const error = e as Error;\n const logMessage = `Error querying topic messages for topic ${topicId} (endpoint: ${nextEndpoint}) after retries: ${error.message}`;\n this.logger.error(logMessage);\n throw new Error(logMessage);\n }\n }\n\n return messages;\n }\n\n /**\n * Requests account information for a given account ID from the mirror node.\n * @param accountId The ID of the account to retrieve information for.\n * @returns A promise that resolves to the account information.\n * @throws An error if the account ID is invalid or the information cannot be retrieved.\n */\n async requestAccount(accountId: string): Promise<AccountResponse> {\n try {\n this.logger.debug(`Requesting account info for ${accountId}`);\n const data = await this._requestWithRetry<AccountResponse>(\n `/api/v1/accounts/${accountId}`,\n );\n if (!data) {\n throw new Error(\n `No data received from mirror node for account: ${accountId}`,\n );\n }\n return data;\n } catch (e: any) {\n const error = e as Error;\n const logMessage = `Failed to fetch account ${accountId} after retries: ${error.message}`;\n this.logger.error(logMessage);\n throw new Error(logMessage);\n }\n }\n\n /**\n * Checks if a user has access to a given key list.\n * @param keyBytes The key list to check access for.\n * @param userPublicKey The public key of the user to check access for.\n * @returns A promise that resolves to true if the user has access, false otherwise.\n */\n async checkKeyListAccess(\n keyBytes: Buffer,\n userPublicKey: PublicKey,\n ): Promise<boolean> {\n try {\n const key = proto.Key.decode(keyBytes);\n return this.evaluateKeyAccess(key, userPublicKey);\n } catch (e: any) {\n const error = e as Error;\n const logMessage = `Error decoding protobuf key: ${error.message}`;\n this.logger.error(logMessage);\n throw new Error(logMessage);\n }\n }\n\n /**\n * Evaluates the access of a given key to a user's public key.\n * @param key The key to evaluate access for.\n * @param userPublicKey The public key of the user to evaluate access for.\n * @returns A promise that resolves to true if the key has access, false otherwise.\n */\n private async evaluateKeyAccess(\n key: proto.IKey,\n userPublicKey: PublicKey,\n ): Promise<boolean> {\n if (key.ed25519) {\n return this.compareEd25519Key(key.ed25519, userPublicKey);\n }\n\n if (key.keyList) {\n return this.evaluateKeyList(key.keyList, userPublicKey);\n }\n\n if (key.thresholdKey && key.thresholdKey.keys) {\n return this.evaluateKeyList(key.thresholdKey.keys, userPublicKey);\n }\n\n return false;\n }\n\n /**\n * Evaluates the access of a given key list to a user's public key.\n * @param keyList The key list to evaluate access for.\n * @param userPublicKey The public key of the user to evaluate access for.\n * @returns A promise that resolves to true if the key list has access, false otherwise.\n */\n private async evaluateKeyList(\n keyList: proto.IKeyList,\n userPublicKey: PublicKey,\n ): Promise<boolean> {\n const keys = keyList.keys || [];\n\n for (const listKey of keys) {\n if (!listKey) continue;\n\n if (listKey.ed25519) {\n if (this.compareEd25519Key(listKey.ed25519, userPublicKey)) {\n return true;\n }\n } else if (listKey.keyList || listKey.thresholdKey) {\n try {\n const nestedKeyBytes = proto.Key.encode({\n ...(listKey.keyList ? { keyList: listKey.keyList } : {}),\n ...(listKey.thresholdKey\n ? { thresholdKey: listKey.thresholdKey }\n : {}),\n }).finish();\n\n const hasNestedAccess = await this.checkKeyListAccess(\n Buffer.from(nestedKeyBytes),\n userPublicKey,\n );\n\n if (hasNestedAccess) {\n return true;\n }\n } catch (e: any) {\n const error = e as Error;\n const logMessage = `Error in nested key: ${error.message}`;\n this.logger.debug(logMessage);\n }\n }\n }\n\n return false;\n }\n\n /**\n * Compares an Ed25519 key with a user's public key.\n * @param keyData The Ed25519 key data to compare.\n * @param userPublicKey The public key of the user to compare with.\n * @returns A boolean indicating whether the key matches the user's public key.\n */\n private compareEd25519Key(\n keyData: Uint8Array,\n userPublicKey: PublicKey,\n ): boolean {\n try {\n const decodedKey = PublicKey.fromBytes(Buffer.from(keyData));\n return decodedKey.toString() === userPublicKey.toString();\n } catch (e: any) {\n const error = e as Error;\n const logMessage = `Error comparing Ed25519 key: ${error.message}`;\n this.logger.debug(logMessage);\n return false;\n }\n }\n\n /**\n * Retrieves information about a scheduled transaction\n * @param scheduleId The ID of the scheduled transaction\n * @returns A promise that resolves to the scheduled transaction information\n */\n async getScheduleInfo(scheduleId: string): Promise<ScheduleInfo | null> {\n try {\n this.logger.info(\n `Getting information for scheduled transaction ${scheduleId}`,\n );\n\n const data = await this._requestWithRetry<ScheduleInfo>(\n `/api/v1/schedules/${scheduleId}`,\n );\n\n if (data) {\n return data;\n }\n\n this.logger.warn(\n `No schedule info found for ${scheduleId} after retries.`,\n );\n return null;\n } catch (error: any) {\n this.logger.error(\n `Error fetching schedule info for ${scheduleId} after retries: ${error.message}`,\n );\n return null;\n }\n }\n\n /**\n * Checks the status of a scheduled transaction\n * @param scheduleId The schedule ID to check\n * @returns Status of the scheduled transaction\n */\n public async getScheduledTransactionStatus(scheduleId: string): Promise<{\n executed: boolean;\n executedDate?: Date;\n deleted: boolean;\n }> {\n try {\n this.logger.info(\n `Checking status of scheduled transaction ${scheduleId}`,\n );\n\n const scheduleInfo = await this.getScheduleInfo(scheduleId);\n\n if (!scheduleInfo) {\n throw new Error(`Schedule ${scheduleId} not found`);\n }\n\n return {\n executed: Boolean(scheduleInfo.executed_timestamp),\n executedDate: scheduleInfo.executed_timestamp\n ? new Date(Number(scheduleInfo.executed_timestamp) * 1000)\n : undefined,\n deleted: scheduleInfo.deleted || false,\n };\n } catch (error) {\n this.logger.error(\n `Error checking scheduled transaction status: ${error}`,\n );\n throw error;\n }\n }\n\n /**\n * Retrieves details for a given transaction ID or hash from the mirror node.\n * @param transactionIdOrHash The ID or hash of the transaction.\n * @returns A promise that resolves to the transaction details.\n * @throws An error if the transaction ID/hash is invalid or details cannot be retrieved.\n */\n async getTransaction(\n transactionIdOrHash: string,\n ): Promise<HederaTransaction | null> {\n this.logger.info(\n `Getting transaction details for ID/hash: ${transactionIdOrHash}`,\n );\n\n try {\n const response = await this._requestWithRetry<{\n transactions: HederaTransaction[];\n }>(`/api/v1/transactions/${transactionIdOrHash}`);\n\n if (response?.transactions?.length > 0) {\n this.logger.trace(\n `Transaction details found for ${transactionIdOrHash}:`,\n response.transactions[0],\n );\n return response.transactions[0];\n }\n\n this.logger.warn(\n `No transaction details found for ${transactionIdOrHash} or unexpected response structure.`,\n );\n return null;\n } catch (e: any) {\n const error = e as Error;\n this.logger.error(\n `Failed to get transaction details for ${transactionIdOrHash} after retries: ${error.message}`,\n );\n return null;\n }\n }\n\n /**\n * Private helper to make GET requests with retry logic using Axios.\n */\n private async _requestWithRetry<T>(\n endpoint: string,\n axiosConfig?: AxiosRequestConfig,\n ): Promise<T> {\n let attempt = 0;\n let delay = this.initialDelayMs;\n const url = this.constructUrl(endpoint);\n\n const config: AxiosRequestConfig = {\n ...axiosConfig,\n headers: {\n ...this.customHeaders,\n ...axiosConfig?.headers,\n },\n };\n\n if (this.apiKey) {\n config.headers = {\n ...config.headers,\n Authorization: `Bearer ${this.apiKey}`,\n 'X-API-Key': this.apiKey,\n };\n }\n\n while (attempt < this.maxRetries) {\n try {\n const response = await axios.get<T>(url, config);\n return response.data;\n } catch (error: any) {\n attempt++;\n const isLastAttempt = attempt >= this.maxRetries;\n const statusCode = error.response?.status;\n\n if (\n statusCode &&\n statusCode > 404 &&\n statusCode < 500 &&\n statusCode !== 429\n ) {\n this.logger.error(\n `Client error for ${url} (status ${statusCode}): ${error.message}. Not retrying.`,\n );\n throw error;\n }\n\n if (isLastAttempt) {\n this.logger.error(\n `Max retries (${this.maxRetries}) reached for ${url}. Last error: ${error.message}`,\n );\n throw error;\n }\n\n this.logger.warn(\n `Attempt ${attempt}/${this.maxRetries} failed for ${url}: ${error.message}. Retrying in ${delay}ms...`,\n );\n await new Promise(resolve => setTimeout(resolve, delay));\n delay = Math.min(delay * this.backoffFactor, this.maxDelayMs);\n }\n }\n\n throw new Error(\n `Failed to fetch data from ${url} after ${this.maxRetries} attempts.`,\n );\n }\n\n /**\n * Private helper to make fetch requests with retry logic.\n */\n private async _fetchWithRetry<T>(\n url: string,\n fetchOptions?: RequestInit,\n ): Promise<T> {\n let attempt = 0;\n let delay = this.initialDelayMs;\n\n const headers: Record<string, string> = {\n ...this.customHeaders,\n };\n\n if (fetchOptions?.headers) {\n if (fetchOptions.headers instanceof Headers) {\n fetchOptions.headers.forEach((value, key) => {\n headers[key] = value;\n });\n } else if (Array.isArray(fetchOptions.headers)) {\n fetchOptions.headers.forEach(([key, value]) => {\n headers[key] = value;\n });\n } else {\n Object.assign(headers, fetchOptions.headers);\n }\n }\n\n if (this.apiKey) {\n headers['Authorization'] = `Bearer ${this.apiKey}`;\n headers['X-API-Key'] = this.apiKey;\n }\n\n const options: RequestInit = {\n ...fetchOptions,\n headers,\n };\n\n while (attempt < this.maxRetries) {\n try {\n const request = await fetch(url, options);\n if (!request.ok) {\n if (\n request.status >= 400 &&\n request.status < 500 &&\n request.status !== 429\n ) {\n this.logger.error(\n `Client error for ${url} (status ${request.status}): ${request.statusText}. Not retrying.`,\n );\n throw new Error(\n `Fetch failed with status ${request.status}: ${request.statusText} for URL: ${url}`,\n );\n }\n throw new Error(\n `Fetch failed with status ${request.status}: ${request.statusText} for URL: ${url}`,\n );\n }\n const response = (await request.json()) as T;\n return response;\n } catch (error: any) {\n attempt++;\n if (attempt >= this.maxRetries) {\n this.logger.error(\n `Max retries (${this.maxRetries}) reached for ${url}. Last error: ${error.message}`,\n );\n throw error;\n }\n this.logger.warn(\n `Attempt ${attempt}/${this.maxRetries} failed for ${url}: ${error.message}. Retrying in ${delay}ms...`,\n );\n await new Promise(resolve => setTimeout(resolve, delay));\n delay = Math.min(delay * this.backoffFactor, this.maxDelayMs);\n }\n }\n throw new Error(\n `Failed to fetch data from ${url} after ${this.maxRetries} attempts.`,\n );\n }\n\n /**\n * Retrieves the numerical balance (in HBAR) for a given account ID.\n * @param accountId The ID of the account.\n * @returns A promise that resolves to the HBAR balance or null if an error occurs.\n */\n async getAccountBalance(accountId: string): Promise<number | null> {\n this.logger.info(`Getting balance for account ${accountId}`);\n try {\n const accountInfo = await this.requestAccount(accountId);\n if (accountInfo && accountInfo.balance) {\n const hbarBalance = accountInfo.balance.balance / 100_000_000;\n return hbarBalance;\n }\n this.logger.warn(\n `Could not retrieve balance for account ${accountId} from account info.`,\n );\n return null;\n } catch (error: any) {\n this.logger.error(\n `Error fetching numerical balance for account ${accountId}: ${error.message}`,\n );\n return null;\n }\n }\n\n /**\n * Retrieves messages for a given topic ID with optional filters.\n * @param topicId The ID of the topic.\n * @param sequenceNumber Filter by sequence number (e.g., \"gt:10\", \"lte:20\").\n * @param startTime Filter by consensus timestamp (e.g., \"gt:1629400000.000000000\").\n * @param endTime Filter by consensus timestamp (e.g., \"lt:1629500000.000000000\").\n * @param limit The maximum number of messages to return.\n * @returns A promise that resolves to an array of HCSMessages or null.\n */\n async getTopicMessagesByFilter(\n topicId: string,\n options?: {\n sequenceNumber?: string;\n startTime?: string;\n endTime?: string;\n limit?: number;\n order?: 'asc' | 'desc';\n },\n ): Promise<HCSMessage[] | null> {\n this.logger.trace(\n `Querying messages for topic ${topicId} with filters: ${JSON.stringify(\n options,\n )}`,\n );\n\n let nextUrl = `/api/v1/topics/${topicId}/messages`;\n const params = new URLSearchParams();\n\n if (options?.limit) {\n params.append('limit', options.limit.toString());\n }\n if (options?.sequenceNumber) {\n params.append('sequencenumber', options.sequenceNumber);\n }\n if (options?.startTime) {\n params.append('timestamp', `gte:${options.startTime}`);\n }\n if (options?.endTime) {\n params.append('timestamp', `lt:${options.endTime}`);\n }\n if (options?.order) {\n params.append('order', options.order);\n }\n\n const queryString = params.toString();\n if (queryString) {\n nextUrl += `?${queryString}`;\n }\n\n const messages: HCSMessage[] = [];\n let pagesFetched = 0;\n const maxPages = 10;\n\n try {\n while (nextUrl && pagesFetched < maxPages) {\n pagesFetched++;\n const data =\n await this._requestWithRetry<TopicMessagesResponse>(nextUrl);\n\n if (data.messages && data.messages.length > 0) {\n for (const message of data.messages) {\n try {\n if (!message.message) {\n continue;\n }\n let messageContent: string;\n if (this.isServerEnvironment) {\n messageContent = Buffer.from(\n message.message,\n 'base64',\n ).toString('utf-8');\n } else {\n messageContent = new TextDecoder().decode(\n Uint8Array.from(atob(message.message), c => c.charCodeAt(0)),\n );\n }\n let messageJson = {};\n try {\n messageJson = JSON.parse(messageContent);\n } catch (parseError) {\n this.logger.debug(\n `Message content is not valid JSON, using raw: ${messageContent}`,\n );\n messageJson = { raw_content: messageContent };\n }\n\n const parsedContent = messageJson as any;\n\n const hcsMsg: HCSMessage = {\n ...parsedContent,\n consensus_timestamp: message.consensus_timestamp,\n sequence_number: message.sequence_number,\n payer_account_id: message.payer_account_id,\n topic_id: message.topic_id,\n running_hash: message.running_hash,\n running_hash_version: message.running_hash_version,\n chunk_info: message.chunk_info,\n created: new Date(\n Number(message.consensus_timestamp.split('.')[0]) * 1000 +\n Number(message.consensus_timestamp.split('.')[1] || 0) /\n 1_000_000,\n ),\n payer: message.payer_account_id,\n };\n\n messages.push(hcsMsg);\n } catch (error: any) {\n this.logger.error(\n `Error processing individual message: ${error.message}`,\n );\n }\n }\n }\n if (options?.limit && messages.length >= options.limit) break;\n nextUrl = data.links?.next ? `${data.links.next}` : '';\n }\n return messages;\n } catch (e: any) {\n const error = e as Error;\n this.logger.error(\n `Error querying filtered topic messages for ${topicId}: ${error.message}`,\n );\n return null;\n }\n }\n\n /**\n * Retrieves token balances for a given account ID.\n * @param accountId The ID of the account.\n * @param limit The maximum number of tokens to return.\n * @returns A promise that resolves to an array of AccountTokenBalance or null.\n */\n async getAccountTokens(\n accountId: string,\n limit: number = 100,\n ): Promise<AccountTokenBalance[] | null> {\n this.logger.info(`Getting tokens for account ${accountId}`);\n let allTokens: AccountTokenBalance[] = [];\n let endpoint = `/api/v1/accounts/${accountId}/tokens?limit=${limit}`;\n\n try {\n for (let i = 0; i < 10 && endpoint; i++) {\n const response =\n await this._requestWithRetry<AccountTokensResponse>(endpoint);\n if (response && response.tokens) {\n allTokens = allTokens.concat(response.tokens);\n }\n endpoint = response.links?.next || '';\n if (!endpoint || (limit && allTokens.length >= limit)) {\n if (limit && allTokens.length > limit) {\n allTokens = allTokens.slice(0, limit);\n }\n break;\n }\n }\n return allTokens;\n } catch (error: any) {\n this.logger.error(\n `Error fetching tokens for account ${accountId}: ${error.message}`,\n );\n return null;\n }\n }\n\n /**\n * Retrieves transaction details by consensus timestamp.\n * @param timestamp The consensus timestamp of the transaction (e.g., \"1629400000.000000000\").\n * @returns A promise that resolves to the transaction details or null.\n */\n async getTransactionByTimestamp(\n timestamp: string,\n ): Promise<HederaTransaction[]> {\n this.logger.info(`Getting transaction by timestamp: ${timestamp}`);\n\n try {\n const response = await this._requestWithRetry<{\n transactions: HederaTransaction[];\n }>(`/api/v1/transactions?timestamp=${timestamp}&limit=1`);\n\n return response.transactions;\n } catch (error: unknown) {\n this.logger.error(\n `Error fetching transaction by timestamp ${timestamp}: ${error}`,\n );\n return [];\n }\n }\n\n /**\n * Retrieves NFTs for a given account ID, optionally filtered by token ID.\n * @param accountId The ID of the account.\n * @param tokenId Optional ID of the token to filter NFTs by.\n * @param limit The maximum number of NFTs to return per page (API has its own max).\n * @returns A promise that resolves to an array of NftDetail or null.\n */\n async getAccountNfts(\n accountId: string,\n tokenId?: string,\n limit: number = 100,\n ): Promise<NftDetail[] | null> {\n this.logger.info(\n `Getting NFTs for account ${accountId}${\n tokenId ? ` for token ${tokenId}` : ''\n }`,\n );\n let allNfts: NftDetail[] = [];\n let endpoint = `/api/v1/accounts/${accountId}/nfts?limit=${limit}`;\n if (tokenId) {\n endpoint += `&token.id=${tokenId}`;\n }\n\n try {\n for (let i = 0; i < 10 && endpoint; i++) {\n const response =\n await this._requestWithRetry<AccountNftsResponse>(endpoint);\n if (response && response.nfts) {\n const nftsWithUri = response.nfts.map(nft => {\n let tokenUri: string | undefined = undefined;\n if (nft.metadata) {\n try {\n if (this.isServerEnvironment) {\n tokenUri = Buffer.from(nft.metadata, 'base64').toString(\n 'utf-8',\n );\n } else {\n tokenUri = new TextDecoder().decode(\n Uint8Array.from(atob(nft.metadata), c => c.charCodeAt(0)),\n );\n }\n } catch (e) {\n this.logger.warn(\n `Failed to decode metadata for NFT ${nft.token_id} SN ${\n nft.serial_number\n }: ${(e as Error).message}`,\n );\n }\n }\n return { ...nft, token_uri: tokenUri };\n });\n allNfts = allNfts.concat(nftsWithUri);\n }\n endpoint = response.links?.next || '';\n if (!endpoint) break;\n }\n return allNfts;\n } catch (error: any) {\n this.logger.error(\n `Error fetching NFTs for account ${accountId}: ${error.message}`,\n );\n return null;\n }\n }\n\n /**\n * Validates NFT ownership by checking if a specific serial number of a token ID exists for an account.\n * @param accountId The ID of the account.\n * @param tokenId The ID of the NFT's token.\n * @param serialNumber The serial number of the NFT.\n * @returns A promise that resolves to the NftDetail if owned, or null otherwise.\n */\n async validateNFTOwnership(\n accountId: string,\n tokenId: string,\n serialNumber: number,\n ): Promise<NftDetail | null> {\n this.logger.info(\n `Validating ownership of NFT ${tokenId} SN ${serialNumber} for account ${accountId}`,\n );\n try {\n const nfts = await this.getAccountNfts(accountId, tokenId);\n if (nfts) {\n const foundNft = nfts.find(\n nft => nft.token_id === tokenId && nft.serial_number === serialNumber,\n );\n return foundNft || null;\n }\n return null;\n } catch (error: any) {\n this.logger.error(`Error validating NFT ownership: ${error.message}`);\n return null;\n }\n }\n\n /**\n * Performs a read-only query against a smart contract (eth_call like).\n * @param contractIdOrAddress The contract ID (e.g., \"0.0.123\") or EVM address (e.g., \"0x...\").\n * @param functionSelector The function selector and encoded parameters (e.g., \"0xabcdef12...\").\n * @param payerAccountId The account ID of the payer (not strictly payer for read-only, but often required as 'from').\n * @param estimate Whether this is an estimate call. Mirror node might not support this directly in /contracts/call for true estimation.\n * @param block Block parameter, e.g., \"latest\", \"pending\", or block number.\n * @param value The value in tinybars to send with the call (for payable view/pure functions, usually 0).\n * @returns A promise that resolves to the contract call query response or null.\n */\n async readSmartContractQuery(\n contractIdOrAddress: string,\n functionSelector: string,\n payerAccountId: string,\n options?: {\n estimate?: boolean;\n block?: string;\n value?: number;\n gas?: number;\n gasPrice?: number;\n },\n ): Promise<ContractCallQueryResponse | null> {\n this.logger.info(\n `Reading smart contract ${contractIdOrAddress} with selector ${functionSelector}`,\n );\n\n const toAddress = contractIdOrAddress.startsWith('0x')\n ? contractIdOrAddress\n : `0x${AccountId.fromString(contractIdOrAddress).toSolidityAddress()}`;\n const fromAddress = payerAccountId.startsWith('0x')\n ? payerAccountId\n : `0x${AccountId.fromString(payerAccountId).toSolidityAddress()}`;\n\n const body: any = {\n block: options?.block || 'latest',\n data: functionSelector,\n estimate: options?.estimate || false,\n from: fromAddress,\n to: toAddress,\n gas: options?.gas,\n gasPrice: options?.gasPrice,\n value: options?.value || 0,\n };\n\n Object.keys(body).forEach(key => {\n const K = key as keyof typeof body;\n if (body[K] === undefined) {\n delete body[K];\n }\n });\n\n try {\n const url = this.constructUrl('/api/v1/contracts/call');\n const response = await this._fetchWithRetry<ContractCallQueryResponse>(\n url,\n {\n method: 'POST',\n body: JSON.stringify(body),\n headers: {\n 'Content-Type': 'application/json',\n },\n },\n );\n return response;\n } catch (error: any) {\n this.logger.error(\n `Error reading smart contract ${contractIdOrAddress}: ${error.message}`,\n );\n return null;\n }\n }\n\n /**\n * Retrieves outstanding token airdrops sent by an account.\n * @param accountId The ID of the account that sent the airdrops.\n * @param options Optional parameters for filtering airdrops.\n * @returns A promise that resolves to an array of TokenAirdrop or null.\n */\n async getOutstandingTokenAirdrops(\n accountId: string,\n options?: {\n limit?: number;\n order?: 'asc' | 'desc';\n receiverId?: string;\n serialNumber?: string;\n tokenId?: string;\n },\n ): Promise<TokenAirdrop[] | null> {\n this.logger.info(\n `Getting outstanding token airdrops sent by account ${accountId}`,\n );\n let endpoint = `/api/v1/accounts/${accountId}/airdrops/outstanding`;\n const params = new URLSearchParams();\n\n if (options?.limit) {\n params.append('limit', options.limit.toString());\n }\n if (options?.order) {\n params.append('order', options.order);\n }\n if (options?.receiverId) {\n params.append('receiver.id', options.receiverId);\n }\n if (options?.serialNumber) {\n params.append('serialnumber', options.serialNumber);\n }\n if (options?.tokenId) {\n params.append('token.id', options.tokenId);\n }\n\n const queryString = params.toString();\n if (queryString) {\n endpoint += `?${queryString}`;\n }\n\n try {\n const response =\n await this._requestWithRetry<TokenAirdropsResponse>(endpoint);\n return response.airdrops || [];\n } catch (error: any) {\n this.logger.error(\n `Error fetching outstanding token airdrops for account ${accountId}: ${error.message}`,\n );\n return null;\n }\n }\n\n /**\n * Retrieves pending token airdrops received by an account.\n * @param accountId The ID of the account that received the airdrops.\n * @param options Optional parameters for filtering airdrops.\n * @returns A promise that resolves to an array of TokenAirdrop or null.\n */\n async getPendingTokenAirdrops(\n accountId: string,\n options?: {\n limit?: number;\n order?: 'asc' | 'desc';\n senderId?: string;\n serialNumber?: string;\n tokenId?: string;\n },\n ): Promise<TokenAirdrop[] | null> {\n this.logger.info(\n `Getting pending token airdrops received by account ${accountId}`,\n );\n let endpoint = `/api/v1/accounts/${accountId}/airdrops/pending`;\n const params = new URLSearchParams();\n\n if (options?.limit) {\n params.append('limit', options.limit.toString());\n }\n if (options?.order) {\n params.append('order', options.order);\n }\n if (options?.senderId) {\n params.append('sender.id', options.senderId);\n }\n if (options?.serialNumber) {\n params.append('serialnumber', options.serialNumber);\n }\n if (options?.tokenId) {\n params.append('token.id', options.tokenId);\n }\n\n const queryString = params.toString();\n if (queryString) {\n endpoint += `?${queryString}`;\n }\n\n try {\n const response =\n await this._requestWithRetry<TokenAirdropsResponse>(endpoint);\n return response.airdrops || [];\n } catch (error: any) {\n this.logger.error(\n `Error fetching pending token airdrops for account ${accountId}: ${error.message}`,\n );\n return null;\n }\n }\n\n /**\n * Retrieves blocks from the network.\n * @param options Optional parameters for filtering blocks.\n * @returns A promise that resolves to an array of Block or null.\n */\n async getBlocks(options?: {\n limit?: number;\n order?: 'asc' | 'desc';\n timestamp?: string;\n blockNumber?: string;\n }): Promise<Block[] | null> {\n this.logger.info('Getting blocks from the network');\n let endpoint = `/api/v1/blocks`;\n const params = new URLSearchParams();\n\n if (options?.limit) {\n params.append('limit', options.limit.toString());\n }\n if (options?.order) {\n params.append('order', options.order);\n }\n if (options?.timestamp) {\n params.append('timestamp', options.timestamp);\n }\n if (options?.blockNumber) {\n params.append('block.number', options.blockNumber);\n }\n\n const queryString = params.toString();\n if (queryString) {\n endpoint += `?${queryString}`;\n }\n\n try {\n const response = await this._requestWithRetry<BlocksResponse>(endpoint);\n return response.blocks || [];\n } catch (error: any) {\n this.logger.error(`Error fetching blocks: ${error.message}`);\n return null;\n }\n }\n\n /**\n * Retrieves a specific block by number or hash.\n * @param blockNumberOrHash The block number or hash.\n * @returns A promise that resolves to a Block or null.\n */\n async getBlock(blockNumberOrHash: string): Promise<Block | null> {\n this.logger.info(`Getting block ${blockNumberOrHash}`);\n try {\n const response = await this._requestWithRetry<Block>(\n `/api/v1/blocks/${blockNumberOrHash}`,\n );\n return response;\n } catch (error: any) {\n this.logger.error(\n `Error fetching block ${blockNumberOrHash}: ${error.message}`,\n );\n return null;\n }\n }\n\n /**\n * Retrieves contract entities from the network.\n * @param options Optional parameters for filtering contracts.\n * @returns A promise that resolves to an array of ContractEntity or null.\n */\n async getContracts(options?: {\n contractId?: string;\n limit?: number;\n order?: 'asc' | 'desc';\n }): Promise<ContractEntity[] | null> {\n this.logger.info('Getting contracts from the network');\n let url = `/api/v1/contracts`;\n const params = new URLSearchParams();\n\n if (options?.contractId) {\n params.append('contract.id', options.contractId);\n }\n if (options?.limit) {\n params.append('limit', options.limit.toString());\n }\n if (options?.order) {\n params.append('order', options.order);\n }\n\n const queryString = params.toString();\n if (queryString) {\n url += `?${queryString}`;\n }\n\n try {\n const response = await this._requestWithRetry<ContractsResponse>(url);\n return response.contracts || [];\n } catch (error: any) {\n this.logger.error(`Error fetching contracts: ${error.message}`);\n return null;\n }\n }\n\n /**\n * Retrieves a specific contract by ID or address.\n * @param contractIdOrAddress The contract ID or EVM address.\n * @param timestamp Optional timestamp for historical data.\n * @returns A promise that resolves to a ContractEntity or null.\n */\n async getContract(\n contractIdOrAddress: string,\n timestamp?: string,\n ): Promise<ContractEntity | null> {\n this.logger.info(`Getting contract ${contractIdOrAddress}`);\n let url = `/api/v1/contracts/${contractIdOrAddress}`;\n\n if (timestamp) {\n url += `?timestamp=${timestamp}`;\n }\n\n try {\n const response = await this._requestWithRetry<ContractEntity>(url);\n return response;\n } catch (error: any) {\n this.logger.error(\n `Error fetching contract ${contractIdOrAddress}: ${error.message}`,\n );\n return null;\n }\n }\n\n /**\n * Retrieves contract results from the network.\n * @param options Optional parameters for filtering contract results.\n * @returns A promise that resolves to an array of ContractResult or null.\n */\n async getContractResults(options?: {\n from?: string;\n blockHash?: string;\n blockNumber?: string;\n internal?: boolean;\n limit?: number;\n order?: 'asc' | 'desc';\n timestamp?: string;\n transactionIndex?: number;\n }): Promise<ContractResult[] | null> {\n this.logger.info('Getting contract results from the network');\n let url = `/api/v1/contracts/results`;\n const params = new URLSearchParams();\n\n if (options?.from) {\n params.append('from', options.from);\n }\n if (options?.blockHash) {\n params.append('block.hash', options.blockHash);\n }\n if (options?.blockNumber) {\n params.append('block.number', options.blockNumber);\n }\n if (options?.internal !== undefined) {\n params.append('internal', options.internal.toString());\n }\n if (options?.limit) {\n params.append('limit', options.limit.toString());\n }\n if (options?.order) {\n params.append('order', options.order);\n }\n if (options?.timestamp) {\n params.append('timestamp', options.timestamp);\n }\n if (options?.transactionIndex) {\n params.append('transaction.index', options.transactionIndex.toString());\n }\n\n const queryString = params.toString();\n if (queryString) {\n url += `?${queryString}`;\n }\n\n try {\n const response =\n await this._requestWithRetry<ContractResultsResponse>(url);\n return response.results || [];\n } catch (error: any) {\n this.logger.error(`Error fetching contract results: ${error.message}`);\n return null;\n }\n }\n\n /**\n * Retrieves a specific contract result by transaction ID or hash.\n * @param transactionIdOrHash The transaction ID or hash.\n * @param nonce Optional nonce filter.\n * @returns A promise that resolves to a ContractResult or null.\n */\n async getContractResult(\n transactionIdOrHash: string,\n nonce?: number,\n ): Promise<ContractResult | null> {\n this.logger.info(`Getting contract result for ${transactionIdOrHash}`);\n let url = `/api/v1/contracts/results/${transactionIdOrHash}`;\n\n if (nonce !== undefined) {\n url += `?nonce=${nonce}`;\n }\n\n try {\n const response = await this._requestWithRetry<ContractResult>(url);\n return response;\n } catch (error: any) {\n this.logger.error(\n `Error fetching contract result for ${transactionIdOrHash}: ${error.message}`,\n );\n return null;\n }\n }\n\n /**\n * Retrieves contract results for a specific contract.\n * @param contractIdOrAddress The contract ID or EVM address.\n * @param options Optional parameters for filtering.\n * @returns A promise that resolves to an array of ContractResult or null.\n */\n async getContractResultsByContract(\n contractIdOrAddress: string,\n options?: {\n blockHash?: string;\n blockNumber?: string;\n from?: string;\n internal?: boolean;\n limit?: number;\n order?: 'asc' | 'desc';\n timestamp?: string;\n transactionIndex?: number;\n },\n ): Promise<ContractResult[] | null> {\n this.logger.info(\n `Getting contract results for contract ${contractIdOrAddress}`,\n );\n let url = `/api/v1/contracts/${contractIdOrAddress}/results`;\n const params = new URLSearchParams();\n\n if (options?.blockHash) {\n params.append('block.hash', options.blockHash);\n }\n if (options?.blockNumber) {\n params.append('block.number', options.blockNumber);\n }\n if (options?.from) {\n params.append('from', options.from);\n }\n if (options?.internal !== undefined) {\n params.append('internal', options.internal.toString());\n }\n if (options?.limit) {\n params.append('limit', options.limit.toString());\n }\n if (options?.order) {\n params.append('order', options.order);\n }\n if (options?.timestamp) {\n params.append('timestamp', options.timestamp);\n }\n if (options?.transactionIndex) {\n params.append('transaction.index', options.transactionIndex.toString());\n }\n\n const queryString = params.toString();\n if (queryString) {\n url += `?${queryString}`;\n }\n\n try {\n const response =\n await this._requestWithRetry<ContractResultsResponse>(url);\n return response.results || [];\n } catch (error: any) {\n this.logger.error(\n `Error fetching contract results for ${contractIdOrAddress}: ${error.message}`,\n );\n return null;\n }\n }\n\n /**\n * Retrieves contract state for a specific contract.\n * @param contractIdOrAddress The contract ID or EVM address.\n * @param options Optional parameters for filtering.\n * @returns A promise that resolves to an array of ContractState or null.\n */\n async getContractState(\n contractIdOrAddress: string,\n options?: {\n limit?: number;\n order?: 'asc' | 'desc';\n slot?: string;\n timestamp?: string;\n },\n ): Promise<ContractState[] | null> {\n this.logger.info(`Getting contract state for ${contractIdOrAddress}`);\n let url = `/api/v1/contracts/${contractIdOrAddress}/state`;\n const params = new URLSearchParams();\n\n if (options?.limit) {\n params.append('limit', options.limit.toString());\n }\n if (options?.order) {\n params.append('order', options.order);\n }\n if (options?.slot) {\n params.append('slot', options.slot);\n }\n if (options?.timestamp) {\n params.append('timestamp', options.timestamp);\n }\n\n const queryString = params.toString();\n if (queryString) {\n url += `?${queryString}`;\n }\n\n try {\n const response = await this._requestWithRetry<ContractStateResponse>(url);\n return response.state || [];\n } catch (error: any) {\n this.logger.error(\n `Error fetching contract state for ${contractIdOrAddress}: ${error.message}`,\n );\n return null;\n }\n }\n\n /**\n * Retrieves contract actions for a specific transaction.\n * @param transactionIdOrHash The transaction ID or hash.\n * @param options Optional parameters for filtering.\n * @returns A promise that resolves to an array of ContractAction or null.\n */\n async getContractActions(\n transactionIdOrHash: string,\n options?: {\n index?: string;\n limit?: number;\n order?: 'asc' | 'desc';\n },\n ): Promise<ContractAction[] | null> {\n this.logger.info(`Getting contract actions for ${transactionIdOrHash}`);\n let url = `/api/v1/contracts/results/${transactionIdOrHash}/actions`;\n const params = new URLSearchParams();\n\n if (options?.index) {\n params.append('index', options.index);\n }\n if (options?.limit) {\n params.append('limit', options.limit.toString());\n }\n if (options?.order) {\n params.append('order', options.order);\n }\n\n const queryString = params.toString();\n if (queryString) {\n url += `?${queryString}`;\n }\n\n try {\n const response =\n await this._requestWithRetry<ContractActionsResponse>(url);\n return response.actions || [];\n } catch (error: any) {\n this.logger.error(\n `Error fetching contract actions for ${transactionIdOrHash}: ${error.message}`,\n );\n return null;\n }\n }\n\n /**\n * Retrieves contract logs from the network.\n * @param options Optional parameters for filtering logs.\n * @returns A promise that resolves to an array of ContractLog or null.\n */\n async getContractLogs(options?: {\n index?: string;\n limit?: number;\n order?: 'asc' | 'desc';\n timestamp?: string;\n topic0?: string;\n topic1?: string;\n topic2?: string;\n topic3?: string;\n transactionHash?: string;\n }): Promise<ContractLog[] | null> {\n this.logger.info('Getting contract logs from the network');\n let url = `/api/v1/contracts/results/logs`;\n const params = new URLSearchParams();\n\n if (options?.index) {\n params.append('index', options.index);\n }\n if (options?.limit) {\n params.append('limit', options.limit.toString());\n }\n if (options?.order) {\n params.append('order', options.order);\n }\n if (options?.timestamp) {\n params.append('timestamp', options.timestamp);\n }\n if (options?.topic0) {\n params.append('topic0', options.topic0);\n }\n if (options?.topic1) {\n params.append('topic1', options.topic1);\n }\n if (options?.topic2) {\n params.append('topic2', options.topic2);\n }\n if (options?.topic3) {\n params.append('topic3', options.topic3);\n }\n if (options?.transactionHash) {\n params.append('transaction.hash', options.transactionHash);\n }\n\n const queryString = params.toString();\n if (queryString) {\n url += `?${queryString}`;\n }\n\n try {\n const response = await this._requestWithRetry<ContractLogsResponse>(url);\n return response.logs || [];\n } catch (error: any) {\n this.logger.error(`Error fetching contract logs: ${error.message}`);\n return null;\n }\n }\n\n /**\n * Retrieves contract logs for a specific contract.\n * @param contractIdOrAddress The contract ID or EVM address.\n * @param options Optional parameters for filtering logs.\n * @returns A promise that resolves to an array of ContractLog or null.\n */\n async getContractLogsByContract(\n contractIdOrAddress: string,\n options?: {\n index?: string;\n limit?: number;\n order?: 'asc' | 'desc';\n timestamp?: string;\n topic0?: string;\n topic1?: string;\n topic2?: string;\n topic3?: string;\n },\n ): Promise<ContractLog[] | null> {\n this.logger.info(\n `Getting contract logs for contract ${contractIdOrAddress}`,\n );\n let url = `/api/v1/contracts/${contractIdOrAddress}/results/logs`;\n const params = new URLSearchParams();\n\n if (options?.index) {\n params.append('index', options.index);\n }\n if (options?.limit) {\n params.append('limit', options.limit.toString());\n }\n if (options?.order) {\n params.append('order', options.order);\n }\n if (options?.timestamp) {\n params.append('timestamp', options.timestamp);\n }\n if (options?.topic0) {\n params.append('topic0', options.topic0);\n }\n if (options?.topic1) {\n params.append('topic1', options.topic1);\n }\n if (options?.topic2) {\n params.append('topic2', options.topic2);\n }\n if (options?.topic3) {\n params.append('topic3', options.topic3);\n }\n\n const queryString = params.toString();\n if (queryString) {\n url += `?${queryString}`;\n }\n\n try {\n const response = await this._requestWithRetry<ContractLogsResponse>(url);\n return response.logs || [];\n } catch (error: any) {\n this.logger.error(\n `Error fetching contract logs for ${contractIdOrAddress}: ${error.message}`,\n );\n return null;\n }\n }\n\n /**\n * Retrieves NFT information by token ID and serial number.\n * @param tokenId The token ID.\n * @param serialNumber The serial number of the NFT.\n * @returns A promise that resolves to an NftInfo or null.\n */\n async getNftInfo(\n tokenId: string,\n serialNumber: number,\n ): Promise<NftInfo | null> {\n this.logger.info(`Getting NFT info for ${tokenId}/${serialNumber}`);\n const url = `/api/v1/tokens/${tokenId}/nfts/${serialNumber}`;\n\n try {\n const response = await this._requestWithRetry<NftInfo>(url);\n return response;\n } catch (error: any) {\n this.logger.error(\n `Error fetching NFT info for ${tokenId}/${serialNumber}: ${error.message}`,\n );\n return null;\n }\n }\n\n /**\n * Retrieves NFTs for a specific token.\n * @param tokenId The token ID.\n * @param options Optional parameters for filtering NFTs.\n * @returns A promise that resolves to an array of NftInfo or null.\n */\n async getNftsByToken(\n tokenId: string,\n options?: {\n accountId?: string;\n limit?: number;\n order?: 'asc' | 'desc';\n serialNumber?: string;\n },\n ): Promise<NftInfo[] | null> {\n this.logger.info(`Getting NFTs for token ${tokenId}`);\n let url = `/api/v1/tokens/${tokenId}/nfts`;\n const params = new URLSearchParams();\n\n if (options?.accountId) {\n params.append('account.id', options.accountId);\n }\n if (options?.limit) {\n params.append('limit', options.limit.toString());\n }\n if (options?.order) {\n params.append('order', options.order);\n }\n if (options?.serialNumber) {\n params.append('serialnumber', options.serialNumber);\n }\n\n const queryString = params.toString();\n if (queryString) {\n url += `?${queryString}`;\n }\n\n try {\n const response = await this._requestWithRetry<NftsResponse>(url);\n return response.nfts || [];\n } catch (error: any) {\n this.logger.error(\n `Error fetching NFTs for token ${tokenId}: ${error.message}`,\n );\n return null;\n }\n }\n\n /**\n * Retrieves network information.\n * @returns A promise that resolves to NetworkInfo or null.\n */\n async getNetworkInfo(): Promise<NetworkInfo | null> {\n this.logger.info('Getting network information');\n const url = `/api/v1/network/nodes`;\n\n try {\n const response = await this._requestWithRetry<NetworkInfo>(url);\n return response;\n } catch (error: any) {\n this.logger.error(`Error fetching network info: ${error.message}`);\n return null;\n }\n }\n\n /**\n * Retrieves network fees.\n * @param timestamp Optional timestamp for historical fees.\n * @returns A promise that resolves to NetworkFees or null.\n */\n async getNetworkFees(timestamp?: string): Promise<NetworkFees | null> {\n this.logger.info('Getting network fees');\n let url = `/api/v1/network/fees`;\n\n if (timestamp) {\n url += `?timestamp=${timestamp}`;\n }\n\n try {\n const response = await this._requestWithRetry<NetworkFees>(url);\n return response;\n } catch (error: any) {\n this.logger.error(`Error fetching network fees: ${error.message}`);\n return null;\n }\n }\n\n /**\n * Retrieves network supply information.\n * @param timestamp Optional timestamp for historical supply data.\n * @returns A promise that resolves to NetworkSupply or null.\n */\n async getNetworkSupply(timestamp?: string): Promise<NetworkSupply | null> {\n this.logger.info('Getting network supply');\n let url = `/api/v1/network/supply`;\n\n if (timestamp) {\n url += `?timestamp=${timestamp}`;\n }\n\n try {\n const response = await this._requestWithRetry<NetworkSupply>(url);\n return response;\n } catch (error: any) {\n this.logger.error(`Error fetching network supply: ${error.message}`);\n return null;\n }\n }\n\n /**\n * Retrieves network stake information.\n * @param timestamp Optional timestamp for historical stake data.\n * @returns A promise that resolves to NetworkStake or null.\n */\n async getNetworkStake(timestamp?: string): Promise<NetworkStake | null> {\n this.logger.info('Getting network stake');\n let url = `/api/v1/network/stake`;\n\n if (timestamp) {\n url += `?timestamp=${timestamp}`;\n }\n\n try {\n const response = await this._requestWithRetry<NetworkStake>(url);\n return response;\n } catch (error: any) {\n this.logger.error(`Error fetching network stake: ${error.message}`);\n return null;\n }\n }\n\n /**\n * Retrieves opcode traces for a specific transaction.\n * @param transactionIdOrHash The transaction ID or hash.\n * @param options Optional parameters for trace details.\n * @returns A promise that resolves to an OpcodesResponse or null.\n */\n async getOpcodeTraces(\n transactionIdOrHash: string,\n options?: {\n stack?: boolean;\n memory?: boolean;\n storage?: boolean;\n },\n ): Promise<OpcodesResponse | null> {\n this.logger.info(`Getting opcode traces for ${transactionIdOrHash}`);\n let url = `/api/v1/contracts/results/${transactionIdOrHash}/opcodes`;\n const params = new URLSearchParams();\n\n if (options?.stack !== undefined) {\n params.append('stack', options.stack.toString());\n }\n if (options?.memory !== undefined) {\n params.append('memory', options.memory.toString());\n }\n if (options?.storage !== undefined) {\n params.append('storage', options.storage.toString());\n }\n\n const queryString = params.toString();\n if (queryString) {\n url += `?${queryString}`;\n }\n\n try {\n const response = await this._requestWithRetry<OpcodesResponse>(url);\n return response;\n } catch (error: any) {\n this.logger.error(\n `Error fetching opcode traces for ${transactionIdOrHash}: ${error.message}`,\n );\n return null;\n }\n }\n}\n","import { PublicKey } from '@hashgraph/sdk';\nimport { Logger } from './logger';\nimport { HederaMirrorNode } from '../services/mirror-node';\n\n/**\n * Converts account IDs to public keys for fee exemption\n * @param client Hedera client instance\n * @param accountIds Array of account IDs to convert to public keys\n * @param network The network to use for retrieving public keys\n * @param logger Optional logger instance\n * @returns Array of public keys\n */\nexport async function accountIdsToExemptKeys(\n accountIds: string[],\n network: string,\n logger?: Logger,\n): Promise<PublicKey[]> {\n const mirrorNode = new HederaMirrorNode(\n network as 'mainnet' | 'testnet',\n logger,\n );\n const exemptKeys: PublicKey[] = [];\n\n for (const accountId of accountIds) {\n try {\n const publicKey = await mirrorNode.getPublicKey(accountId);\n exemptKeys.push(publicKey);\n } catch (error) {\n if (logger) {\n logger.warn(\n `Could not get public key for account ${accountId}: ${error}`,\n );\n }\n }\n }\n\n return exemptKeys;\n}\n","import axios from 'axios';\nimport { Logger, LogLevel } from './logger';\nimport { NetworkType } from './types';\n\n/**\n * Options for HRL resolution\n */\nexport interface HRLResolutionOptions {\n network: NetworkType;\n returnRaw?: boolean;\n cdnEndpoint?: string;\n}\n\n/**\n * Result of an HRL resolution operation\n */\nexport interface HRLResolutionResult {\n content: string | ArrayBuffer;\n contentType: string;\n topicId: string;\n isBinary: boolean;\n}\n\nexport interface ContentWithType {\n content: string | ArrayBuffer;\n contentType: string;\n isBinary: boolean;\n}\n\n/**\n * Utility class for resolving Hedera Resource Locators across the SDK\n */\nexport class HRLResolver {\n private logger: Logger;\n private defaultEndpoint = 'https://kiloscribe.com/api/inscription-cdn';\n\n constructor(logLevel: LogLevel = 'info') {\n this.logger = Logger.getInstance({\n level: logLevel,\n module: 'HRLResolver',\n });\n }\n\n /**\n * Determines if a MIME type represents binary content\n */\n private isBinaryContentType(mimeType: string): boolean {\n const binaryTypes = [\n 'image/',\n 'audio/',\n 'video/',\n 'application/octet-stream',\n 'application/pdf',\n 'application/zip',\n 'application/gzip',\n 'application/x-binary',\n 'application/vnd.ms-',\n 'application/x-msdownload',\n 'application/x-shockwave-flash',\n 'font/',\n 'application/wasm',\n ];\n\n return binaryTypes.some(prefix => mimeType.startsWith(prefix));\n }\n\n /**\n * Parses an HRL string into its components\n */\n public parseHRL(hrl: string): { standard: string; topicId: string } | null {\n if (!hrl) {\n return null;\n }\n\n const hrlPattern = /^hcs:\\/\\/(\\d+)\\/([0-9]+\\.[0-9]+\\.[0-9]+)$/;\n const match = hrl.match(hrlPattern);\n\n if (!match) {\n return null;\n }\n\n return {\n standard: match[1],\n topicId: match[2],\n };\n }\n\n /**\n * Validates if a string is a valid HRL\n */\n public isValidHRL(hrl: string): boolean {\n if (!hrl || typeof hrl !== 'string') {\n return false;\n }\n\n const parsed = this.parseHRL(hrl);\n if (!parsed) {\n return false;\n }\n\n const topicIdPattern = /^[0-9]+\\.[0-9]+\\.[0-9]+$/;\n if (!topicIdPattern.test(parsed.topicId)) {\n return false;\n }\n\n return true;\n }\n\n public async getContentWithType(\n hrl: string,\n options: HRLResolutionOptions,\n ): Promise<ContentWithType> {\n if (!this.isValidHRL(hrl)) {\n return {\n content: hrl,\n contentType: 'text/plain',\n isBinary: false,\n };\n }\n\n try {\n const result = await this.resolveHRL(hrl, options);\n return {\n content: result.content,\n contentType: result.contentType,\n isBinary: result.isBinary,\n };\n } catch (e: any) {\n const error = e as Error;\n const logMessage = `Error resolving HRL for content and type: ${error.message}`;\n this.logger.error(logMessage);\n throw new Error(logMessage);\n }\n }\n\n /**\n * Resolves HRL content with proper content type detection\n */\n public async resolveHRL(\n hrl: string,\n options: HRLResolutionOptions,\n ): Promise<HRLResolutionResult> {\n const parsed = this.parseHRL(hrl);\n\n if (!parsed) {\n throw new Error(`Invalid HRL format: ${hrl}`);\n }\n\n const { standard, topicId } = parsed;\n\n this.logger.debug(\n `Resolving HRL reference: standard=${standard}, topicId=${topicId}`,\n );\n\n try {\n const cdnEndpoint = options.cdnEndpoint || this.defaultEndpoint;\n const cdnUrl = `${cdnEndpoint}/${topicId}?network=${options.network}`;\n\n this.logger.debug(`Fetching content from CDN: ${cdnUrl}`);\n const headResponse = await axios.head(cdnUrl);\n const contentType = headResponse.headers['content-type'] || '';\n const isBinary = this.isBinaryContentType(contentType);\n\n if (isBinary || options.returnRaw) {\n const response = await axios.get(cdnUrl, {\n responseType: 'arraybuffer',\n });\n\n return {\n content: response.data,\n contentType,\n topicId,\n isBinary: true,\n };\n }\n\n if (contentType === 'application/json') {\n const response = await axios.get(cdnUrl, {\n responseType: 'json',\n });\n\n if (!response.data) {\n throw new Error(`Failed to fetch content from topic: ${topicId}`);\n }\n\n return {\n content: response.data,\n contentType,\n topicId,\n isBinary: false,\n };\n }\n\n const response = await axios.get(cdnUrl);\n\n if (!response.data) {\n throw new Error(`Failed to fetch content from topic: ${topicId}`);\n }\n\n let content: string;\n\n if (typeof response.data === 'object') {\n content =\n response.data.content ||\n response.data.text ||\n JSON.stringify(response.data);\n } else {\n content = response.data;\n }\n\n return {\n content,\n contentType,\n topicId,\n isBinary: false,\n };\n } catch (e: any) {\n const error = e as Error;\n const logMessage = `Error resolving HRL reference: ${error.message}`;\n this.logger.error(logMessage);\n throw new Error(logMessage);\n }\n }\n}\n","import { proto } from '@hashgraph/proto';\nimport { ContractId } from '@hashgraph/sdk';\nimport { Buffer } from 'buffer';\n\nexport function parseKey(\n key: proto.IKey | null | undefined,\n): string | undefined {\n if (!key) {\n return undefined;\n }\n\n if (key.contractID) {\n return `ContractID: ${new ContractId(\n key.contractID.shardNum ?? 0,\n key.contractID.realmNum ?? 0,\n key.contractID.contractNum ?? 0,\n ).toString()}`;\n }\n if (key.ed25519) {\n return `ED25519: ${Buffer.from(key.ed25519).toString('hex')}`;\n }\n if (key.ECDSASecp256k1) {\n return `ECDSA_secp256k1: ${Buffer.from(key.ECDSASecp256k1).toString(\n 'hex',\n )}`;\n }\n if (key?.keyList?.keys?.length > 0) {\n const keys = key.keyList.keys.map(k => parseKey(k)).filter(Boolean);\n return `KeyList (${keys.length} keys): [${keys.join(', ')}]`;\n }\n if (key?.thresholdKey?.keys?.keys?.length > 0) {\n const keys = key.thresholdKey.keys.keys\n .map(k => parseKey(k))\n .filter(Boolean);\n return `ThresholdKey (${key.thresholdKey.threshold} of ${\n keys.length\n }): [${keys.join(', ')}]`;\n }\n if (key.delegatableContractId) {\n return `DelegatableContractID: ${new ContractId(\n key.delegatableContractId.shardNum ?? 0,\n key.delegatableContractId.realmNum ?? 0,\n key.delegatableContractId.contractNum ?? 0,\n ).toString()}`;\n }\n if (Object.keys(key).length === 0) {\n return 'Empty Key Structure';\n }\n\n return 'Unknown or Unset Key Type';\n}\n","import { proto } from '@hashgraph/proto';\nimport { AccountId, TokenId, Long } from '@hashgraph/sdk';\nimport {\n TokenCreationData,\n TokenMintData,\n TokenBurnData,\n TokenUpdateData,\n TokenFeeScheduleUpdateData,\n TokenFreezeData,\n TokenUnfreezeData,\n TokenGrantKycData,\n TokenRevokeKycData,\n TokenPauseData,\n TokenUnpauseData,\n TokenWipeAccountData,\n TokenDeleteData,\n TokenAssociateData,\n TokenDissociateData,\n CustomFeeData,\n FixedFeeData,\n FractionalFeeData,\n RoyaltyFeeData,\n} from '../transaction-parser-types';\nimport { parseKey } from './parser-utils';\nimport { Buffer } from 'buffer';\n\nexport class HTSParser {\n static parseTokenCreate(\n body: proto.ITokenCreateTransactionBody,\n ): TokenCreationData | undefined {\n if (!body) return undefined;\n const data: TokenCreationData = {};\n if (body.name) {\n data.tokenName = body.name;\n }\n if (body.symbol) {\n data.tokenSymbol = body.symbol;\n }\n if (body.treasury) {\n data.treasuryAccountId = new AccountId(\n body.treasury.shardNum ?? 0,\n body.treasury.realmNum ?? 0,\n body.treasury.accountNum ?? 0,\n ).toString();\n }\n if (body.initialSupply) {\n data.initialSupply = Long.fromValue(body.initialSupply).toString();\n }\n if (body.decimals !== undefined && body.decimals !== null) {\n data.decimals = Long.fromValue(body.decimals).toNumber();\n }\n if (body.maxSupply) {\n data.maxSupply = Long.fromValue(body.maxSupply).toString();\n }\n if (body.memo) {\n data.memo = body.memo;\n }\n if (body.tokenType !== null && body.tokenType !== undefined) {\n data.tokenType = proto.TokenType[body.tokenType];\n }\n if (body.supplyType !== null && body.supplyType !== undefined) {\n data.supplyType = proto.TokenSupplyType[body.supplyType];\n }\n data.adminKey = parseKey(body.adminKey);\n data.kycKey = parseKey(body.kycKey);\n data.freezeKey = parseKey(body.freezeKey);\n data.wipeKey = parseKey(body.wipeKey);\n data.supplyKey = parseKey(body.supplyKey);\n data.feeScheduleKey = parseKey(body.feeScheduleKey);\n data.pauseKey = parseKey(body.pauseKey);\n if (body.autoRenewAccount) {\n data.autoRenewAccount = new AccountId(\n body.autoRenewAccount.shardNum ?? 0,\n body.autoRenewAccount.realmNum ?? 0,\n body.autoRenewAccount.accountNum ?? 0,\n ).toString();\n }\n if (body.autoRenewPeriod?.seconds) {\n data.autoRenewPeriod = Long.fromValue(\n body.autoRenewPeriod.seconds,\n ).toString();\n }\n if (body.customFees && body.customFees.length > 0) {\n data.customFees = body.customFees.map(fee => {\n const feeCollectorAccountId = fee.feeCollectorAccountId\n ? new AccountId(\n fee.feeCollectorAccountId.shardNum ?? 0,\n fee.feeCollectorAccountId.realmNum ?? 0,\n fee.feeCollectorAccountId.accountNum ?? 0,\n ).toString()\n : 'Not Set';\n const commonFeeData = {\n feeCollectorAccountId,\n allCollectorsAreExempt: fee.allCollectorsAreExempt || false,\n };\n if (fee.fixedFee) {\n return {\n ...commonFeeData,\n feeType: 'FIXED_FEE',\n fixedFee: {\n amount: Long.fromValue(fee.fixedFee.amount || 0).toString(),\n denominatingTokenId: fee.fixedFee.denominatingTokenId\n ? new TokenId(\n fee.fixedFee.denominatingTokenId.shardNum ?? 0,\n fee.fixedFee.denominatingTokenId.realmNum ?? 0,\n fee.fixedFee.denominatingTokenId.tokenNum ?? 0,\n ).toString()\n : undefined,\n },\n };\n } else if (fee.fractionalFee) {\n return {\n ...commonFeeData,\n feeType: 'FRACTIONAL_FEE',\n fractionalFee: {\n numerator: Long.fromValue(\n fee.fractionalFee.fractionalAmount?.numerator || 0,\n ).toString(),\n denominator: Long.fromValue(\n fee.fractionalFee.fractionalAmount?.denominator || 1,\n ).toString(),\n minimumAmount: Long.fromValue(\n fee.fractionalFee.minimumAmount || 0,\n ).toString(),\n maximumAmount: Long.fromValue(\n fee.fractionalFee.maximumAmount || 0,\n ).toString(),\n netOfTransfers: fee.fractionalFee.netOfTransfers || false,\n },\n };\n } else if (fee.royaltyFee) {\n let fallbackFeeData: FixedFeeData | undefined = undefined;\n if (fee.royaltyFee.fallbackFee) {\n fallbackFeeData = {\n amount: Long.fromValue(\n fee.royaltyFee.fallbackFee.amount || 0,\n ).toString(),\n denominatingTokenId: fee.royaltyFee.fallbackFee\n .denominatingTokenId\n ? new TokenId(\n fee.royaltyFee.fallbackFee.denominatingTokenId.shardNum ??\n 0,\n fee.royaltyFee.fallbackFee.denominatingTokenId.realmNum ??\n 0,\n fee.royaltyFee.fallbackFee.denominatingTokenId.tokenNum ??\n 0,\n ).toString()\n : undefined,\n };\n }\n return {\n ...commonFeeData,\n feeType: 'ROYALTY_FEE',\n royaltyFee: {\n numerator: Long.fromValue(\n fee.royaltyFee.exchangeValueFraction?.numerator || 0,\n ).toString(),\n denominator: Long.fromValue(\n fee.royaltyFee.exchangeValueFraction?.denominator || 1,\n ).toString(),\n fallbackFee: fallbackFeeData,\n },\n };\n }\n return {\n ...commonFeeData,\n feeType: 'FIXED_FEE',\n fixedFee: { amount: '0' },\n } as CustomFeeData;\n });\n }\n return data;\n }\n\n static parseTokenMint(\n body: proto.ITokenMintTransactionBody,\n ): TokenMintData | undefined {\n if (\n !body ||\n !body.token ||\n body.amount === null ||\n body.amount === undefined\n ) {\n return undefined;\n }\n const data: TokenMintData = {\n tokenId: new TokenId(\n body.token.shardNum ?? 0,\n body.token.realmNum ?? 0,\n body.token.tokenNum ?? 0,\n ).toString(),\n amount: Long.fromValue(body.amount).toNumber(),\n };\n if (body.metadata && body.metadata.length > 0) {\n data.metadata = body.metadata.map(meta =>\n Buffer.from(meta).toString('base64'),\n );\n }\n return data;\n }\n\n static parseTokenBurn(\n body: proto.ITokenBurnTransactionBody,\n ): TokenBurnData | undefined {\n if (\n !body ||\n !body.token ||\n body.amount === null ||\n body.amount === undefined\n ) {\n return undefined;\n }\n const data: TokenBurnData = {\n tokenId: new TokenId(\n body.token.shardNum ?? 0,\n body.token.realmNum ?? 0,\n body.token.tokenNum ?? 0,\n ).toString(),\n amount: Long.fromValue(body.amount).toNumber(),\n };\n if (body.serialNumbers && body.serialNumbers.length > 0) {\n data.serialNumbers = body.serialNumbers.map(sn =>\n Long.fromValue(sn).toNumber(),\n );\n }\n return data;\n }\n\n static parseTokenUpdate(\n body: proto.ITokenUpdateTransactionBody,\n ): TokenUpdateData | undefined {\n if (!body) return undefined;\n const data: TokenUpdateData = {};\n if (body.token) {\n data.tokenId = new TokenId(\n body.token.shardNum ?? 0,\n body.token.realmNum ?? 0,\n body.token.tokenNum ?? 0,\n ).toString();\n }\n if (body.name) {\n data.name = body.name;\n }\n if (body.symbol) {\n data.symbol = body.symbol;\n }\n if (body.treasury) {\n data.treasuryAccountId = new AccountId(\n body.treasury.shardNum ?? 0,\n body.treasury.realmNum ?? 0,\n body.treasury.accountNum ?? 0,\n ).toString();\n }\n data.adminKey = parseKey(body.adminKey);\n data.kycKey = parseKey(body.kycKey);\n data.freezeKey = parseKey(body.freezeKey);\n data.wipeKey = parseKey(body.wipeKey);\n data.supplyKey = parseKey(body.supplyKey);\n data.feeScheduleKey = parseKey(body.feeScheduleKey);\n data.pauseKey = parseKey(body.pauseKey);\n if (body.autoRenewAccount) {\n data.autoRenewAccountId = new AccountId(\n body.autoRenewAccount.shardNum ?? 0,\n body.autoRenewAccount.realmNum ?? 0,\n body.autoRenewAccount.accountNum ?? 0,\n ).toString();\n }\n if (body.autoRenewPeriod?.seconds) {\n data.autoRenewPeriod = Long.fromValue(\n body.autoRenewPeriod.seconds,\n ).toString();\n }\n if (body.memo?.value !== undefined) {\n data.memo = body.memo.value;\n }\n if (body.expiry?.seconds) {\n data.expiry = `${Long.fromValue(body.expiry.seconds).toString()}.${\n body.expiry.nanos\n }`;\n }\n return data;\n }\n\n static parseTokenFeeScheduleUpdate(\n body: proto.ITokenFeeScheduleUpdateTransactionBody,\n ): TokenFeeScheduleUpdateData | undefined {\n if (!body) return undefined;\n const data: TokenFeeScheduleUpdateData = {};\n if (body.tokenId) {\n data.tokenId = new TokenId(\n body.tokenId.shardNum ?? 0,\n body.tokenId.realmNum ?? 0,\n body.tokenId.tokenNum ?? 0,\n ).toString();\n }\n if (body.customFees && body.customFees.length > 0) {\n data.customFees = body.customFees.map(fee => {\n const feeCollectorAccountId = fee.feeCollectorAccountId\n ? new AccountId(\n fee.feeCollectorAccountId.shardNum ?? 0,\n fee.feeCollectorAccountId.realmNum ?? 0,\n fee.feeCollectorAccountId.accountNum ?? 0,\n ).toString()\n : 'Not Set';\n const commonFeeData = {\n feeCollectorAccountId,\n allCollectorsAreExempt: fee.allCollectorsAreExempt || false,\n };\n if (fee.fixedFee) {\n return {\n ...commonFeeData,\n feeType: 'FIXED_FEE',\n fixedFee: {\n amount: Long.fromValue(fee.fixedFee.amount || 0).toString(),\n denominatingTokenId: fee.fixedFee.denominatingTokenId\n ? new TokenId(\n fee.fixedFee.denominatingTokenId.shardNum ?? 0,\n fee.fixedFee.denominatingTokenId.realmNum ?? 0,\n fee.fixedFee.denominatingTokenId.tokenNum ?? 0,\n ).toString()\n : undefined,\n },\n };\n } else if (fee.fractionalFee) {\n return {\n ...commonFeeData,\n feeType: 'FRACTIONAL_FEE',\n fractionalFee: {\n numerator: Long.fromValue(\n fee.fractionalFee.fractionalAmount?.numerator || 0,\n ).toString(),\n denominator: Long.fromValue(\n fee.fractionalFee.fractionalAmount?.denominator || 1,\n ).toString(),\n minimumAmount: Long.fromValue(\n fee.fractionalFee.minimumAmount || 0,\n ).toString(),\n maximumAmount: Long.fromValue(\n fee.fractionalFee.maximumAmount || 0,\n ).toString(),\n netOfTransfers: fee.fractionalFee.netOfTransfers || false,\n },\n };\n } else if (fee.royaltyFee) {\n let fallbackFeeData: FixedFeeData | undefined = undefined;\n if (fee.royaltyFee.fallbackFee) {\n fallbackFeeData = {\n amount: Long.fromValue(\n fee.royaltyFee.fallbackFee.amount || 0,\n ).toString(),\n denominatingTokenId: fee.royaltyFee.fallbackFee\n .denominatingTokenId\n ? new TokenId(\n fee.royaltyFee.fallbackFee.denominatingTokenId.shardNum ??\n 0,\n fee.royaltyFee.fallbackFee.denominatingTokenId.realmNum ??\n 0,\n fee.royaltyFee.fallbackFee.denominatingTokenId.tokenNum ??\n 0,\n ).toString()\n : undefined,\n };\n }\n return {\n ...commonFeeData,\n feeType: 'ROYALTY_FEE',\n royaltyFee: {\n numerator: Long.fromValue(\n fee.royaltyFee.exchangeValueFraction?.numerator || 0,\n ).toString(),\n denominator: Long.fromValue(\n fee.royaltyFee.exchangeValueFraction?.denominator || 1,\n ).toString(),\n fallbackFee: fallbackFeeData,\n },\n };\n }\n return {\n ...commonFeeData,\n feeType: 'FIXED_FEE',\n fixedFee: { amount: '0' },\n } as CustomFeeData;\n });\n }\n return data;\n }\n\n static parseTokenFreeze(\n body: proto.ITokenFreezeAccountTransactionBody,\n ): TokenFreezeData | undefined {\n if (!body) return undefined;\n const data: TokenFreezeData = {};\n if (body.token) {\n data.tokenId = new TokenId(\n body.token.shardNum ?? 0,\n body.token.realmNum ?? 0,\n body.token.tokenNum ?? 0,\n ).toString();\n }\n if (body.account) {\n data.accountId = new AccountId(\n body.account.shardNum ?? 0,\n body.account.realmNum ?? 0,\n body.account.accountNum ?? 0,\n ).toString();\n }\n return data;\n }\n\n static parseTokenUnfreeze(\n body: proto.ITokenUnfreezeAccountTransactionBody,\n ): TokenUnfreezeData | undefined {\n if (!body) return undefined;\n const data: TokenUnfreezeData = {};\n if (body.token) {\n data.tokenId = new TokenId(\n body.token.shardNum ?? 0,\n body.token.realmNum ?? 0,\n body.token.tokenNum ?? 0,\n ).toString();\n }\n if (body.account) {\n data.accountId = new AccountId(\n body.account.shardNum ?? 0,\n body.account.realmNum ?? 0,\n body.account.accountNum ?? 0,\n ).toString();\n }\n return data;\n }\n\n static parseTokenGrantKyc(\n body: proto.ITokenGrantKycTransactionBody,\n ): TokenGrantKycData | undefined {\n if (!body) return undefined;\n const data: TokenGrantKycData = {};\n if (body.token) {\n data.tokenId = new TokenId(\n body.token.shardNum ?? 0,\n body.token.realmNum ?? 0,\n body.token.tokenNum ?? 0,\n ).toString();\n }\n if (body.account) {\n data.accountId = new AccountId(\n body.account.shardNum ?? 0,\n body.account.realmNum ?? 0,\n body.account.accountNum ?? 0,\n ).toString();\n }\n return data;\n }\n\n static parseTokenRevokeKyc(\n body: proto.ITokenRevokeKycTransactionBody,\n ): TokenRevokeKycData | undefined {\n if (!body) return undefined;\n const data: TokenRevokeKycData = {};\n if (body.token) {\n data.tokenId = new TokenId(\n body.token.shardNum ?? 0,\n body.token.realmNum ?? 0,\n body.token.tokenNum ?? 0,\n ).toString();\n }\n if (body.account) {\n data.accountId = new AccountId(\n body.account.shardNum ?? 0,\n body.account.realmNum ?? 0,\n body.account.accountNum ?? 0,\n ).toString();\n }\n return data;\n }\n\n static parseTokenPause(\n body: proto.ITokenPauseTransactionBody,\n ): TokenPauseData | undefined {\n if (!body) return undefined;\n const data: TokenPauseData = {};\n if (body.token) {\n data.tokenId = new TokenId(\n body.token.shardNum ?? 0,\n body.token.realmNum ?? 0,\n body.token.tokenNum ?? 0,\n ).toString();\n }\n return data;\n }\n\n static parseTokenUnpause(\n body: proto.ITokenUnpauseTransactionBody,\n ): TokenUnpauseData | undefined {\n if (!body) return undefined;\n const data: TokenUnpauseData = {};\n if (body.token) {\n data.tokenId = new TokenId(\n body.token.shardNum ?? 0,\n body.token.realmNum ?? 0,\n body.token.tokenNum ?? 0,\n ).toString();\n }\n return data;\n }\n\n static parseTokenWipeAccount(\n body: proto.ITokenWipeAccountTransactionBody,\n ): TokenWipeAccountData | undefined {\n if (!body) return undefined;\n const data: TokenWipeAccountData = {};\n if (body.token) {\n data.tokenId = new TokenId(\n body.token.shardNum ?? 0,\n body.token.realmNum ?? 0,\n body.token.tokenNum ?? 0,\n ).toString();\n }\n if (body.account) {\n data.accountId = new AccountId(\n body.account.shardNum ?? 0,\n body.account.realmNum ?? 0,\n body.account.accountNum ?? 0,\n ).toString();\n }\n if (body.serialNumbers && body.serialNumbers.length > 0) {\n data.serialNumbers = body.serialNumbers.map(sn =>\n Long.fromValue(sn).toString(),\n );\n }\n if (body.amount) {\n data.amount = Long.fromValue(body.amount).toString();\n }\n return data;\n }\n\n static parseTokenDelete(\n body: proto.ITokenDeleteTransactionBody,\n ): TokenDeleteData | undefined {\n if (!body) return undefined;\n const data: TokenDeleteData = {};\n if (body.token) {\n data.tokenId = new TokenId(\n body.token.shardNum ?? 0,\n body.token.realmNum ?? 0,\n body.token.tokenNum ?? 0,\n ).toString();\n }\n return data;\n }\n\n static parseTokenAssociate(\n body: proto.ITokenAssociateTransactionBody,\n ): TokenAssociateData | undefined {\n if (!body) return undefined;\n const data: TokenAssociateData = {};\n if (body.account) {\n data.accountId = new AccountId(\n body.account.shardNum ?? 0,\n body.account.realmNum ?? 0,\n body.account.accountNum ?? 0,\n ).toString();\n }\n if (body.tokens && body.tokens.length > 0) {\n data.tokenIds = body.tokens.map(t =>\n new TokenId(\n t.shardNum ?? 0,\n t.realmNum ?? 0,\n t.tokenNum ?? 0,\n ).toString(),\n );\n }\n return data;\n }\n\n static parseTokenDissociate(\n body: proto.ITokenDissociateTransactionBody,\n ): TokenDissociateData | undefined {\n if (!body) return undefined;\n const data: TokenDissociateData = {};\n if (body.account) {\n data.accountId = new AccountId(\n body.account.shardNum ?? 0,\n body.account.realmNum ?? 0,\n body.account.accountNum ?? 0,\n ).toString();\n }\n if (body.tokens && body.tokens.length > 0) {\n data.tokenIds = body.tokens.map(t =>\n new TokenId(\n t.shardNum ?? 0,\n t.realmNum ?? 0,\n t.tokenNum ?? 0,\n ).toString(),\n );\n }\n return data;\n }\n}\n","import { proto } from '@hashgraph/proto';\nimport { AccountId, Long } from '@hashgraph/sdk';\nimport {\n ConsensusCreateTopicData,\n ConsensusSubmitMessageData,\n ConsensusUpdateTopicData,\n ConsensusDeleteTopicData,\n} from '../transaction-parser-types';\nimport { parseKey } from './parser-utils';\nimport { Buffer } from 'buffer';\n\nexport class HCSParser {\n static parseConsensusCreateTopic(\n body: proto.IConsensusCreateTopicTransactionBody,\n ): ConsensusCreateTopicData | undefined {\n if (!body) return undefined;\n const data: ConsensusCreateTopicData = {};\n if (body.memo) {\n data.memo = body.memo;\n }\n data.adminKey = parseKey(body.adminKey);\n data.submitKey = parseKey(body.submitKey);\n if (body.autoRenewPeriod?.seconds) {\n data.autoRenewPeriod = Long.fromValue(\n body.autoRenewPeriod.seconds,\n ).toString();\n }\n if (body.autoRenewAccount) {\n data.autoRenewAccountId = new AccountId(\n body.autoRenewAccount.shardNum ?? 0,\n body.autoRenewAccount.realmNum ?? 0,\n body.autoRenewAccount.accountNum ?? 0,\n ).toString();\n }\n return data;\n }\n\n static parseConsensusSubmitMessage(\n body: proto.IConsensusSubmitMessageTransactionBody,\n ): ConsensusSubmitMessageData | undefined {\n if (!body) return undefined;\n const data: ConsensusSubmitMessageData = {};\n if (body.topicID) {\n data.topicId = `${body.topicID.shardNum ?? 0}.${\n body.topicID.realmNum ?? 0\n }.${body.topicID.topicNum ?? 0}`;\n }\n if (body.message?.length > 0) {\n const messageBuffer = Buffer.from(body.message);\n const utf8String = messageBuffer.toString('utf8');\n if (\n /[\\x00-\\x08\\x0B\\x0E-\\x1F\\x7F]/.test(utf8String) ||\n utf8String.includes('\\uFFFD')\n ) {\n data.message = messageBuffer.toString('base64');\n data.messageEncoding = 'base64';\n } else {\n data.message = utf8String;\n data.messageEncoding = 'utf8';\n }\n }\n if (body.chunkInfo) {\n if (body.chunkInfo.initialTransactionID) {\n const txId = body.chunkInfo.initialTransactionID.accountID;\n const taValidStart =\n body.chunkInfo.initialTransactionID.transactionValidStart;\n if (txId && taValidStart) {\n data.chunkInfoInitialTransactionID = `${txId.shardNum ?? 0}.${\n txId.realmNum ?? 0\n }.${txId.accountNum ?? 0}@${taValidStart.seconds ?? 0}.${\n taValidStart.nanos ?? 0\n }`;\n }\n }\n if (\n body.chunkInfo.number !== undefined &&\n body.chunkInfo.number !== null\n ) {\n data.chunkInfoNumber = body.chunkInfo.number;\n }\n if (body.chunkInfo.total !== undefined && body.chunkInfo.total !== null) {\n data.chunkInfoTotal = body.chunkInfo.total;\n }\n }\n return data;\n }\n\n static parseConsensusUpdateTopic(\n body: proto.IConsensusUpdateTopicTransactionBody,\n ): ConsensusUpdateTopicData | undefined {\n if (!body) return undefined;\n const data: ConsensusUpdateTopicData = {};\n if (body.topicID) {\n data.topicId = `${body.topicID.shardNum}.${body.topicID.realmNum}.${body.topicID.topicNum}`;\n }\n if (body.memo?.value !== undefined) {\n data.memo = body.memo.value;\n }\n if (body.adminKey === null) {\n data.clearAdminKey = true;\n data.adminKey = undefined;\n } else if (body.adminKey) {\n data.adminKey = parseKey(body.adminKey);\n } else {\n data.adminKey = undefined;\n }\n if (body.submitKey === null) {\n data.clearSubmitKey = true;\n data.submitKey = undefined;\n } else if (body.submitKey) {\n data.submitKey = parseKey(body.submitKey);\n } else {\n data.submitKey = undefined;\n }\n if (body.autoRenewPeriod?.seconds) {\n data.autoRenewPeriod = Long.fromValue(\n body.autoRenewPeriod.seconds,\n ).toString();\n }\n if (body.autoRenewAccount) {\n data.autoRenewAccountId = new AccountId(\n body.autoRenewAccount.shardNum ?? 0,\n body.autoRenewAccount.realmNum ?? 0,\n body.autoRenewAccount.accountNum ?? 0,\n ).toString();\n }\n return data;\n }\n\n static parseConsensusDeleteTopic(\n body: proto.IConsensusDeleteTopicTransactionBody,\n ): ConsensusDeleteTopicData | undefined {\n if (!body) return undefined;\n const data: ConsensusDeleteTopicData = {};\n if (body.topicID) {\n data.topicId = `${body.topicID.shardNum}.${body.topicID.realmNum ?? 0}.${\n body.topicID.topicNum ?? 0\n }`;\n }\n return data;\n }\n}\n","import { proto } from '@hashgraph/proto';\nimport { Long } from '@hashgraph/sdk';\nimport {\n FileCreateData,\n FileAppendData,\n FileUpdateData,\n FileDeleteData,\n} from '../transaction-parser-types';\nimport { parseKey } from './parser-utils';\nimport { Buffer } from 'buffer';\n\nexport class FileParser {\n static parseFileCreate(\n body: proto.IFileCreateTransactionBody,\n ): FileCreateData | undefined {\n if (!body) return undefined;\n const data: FileCreateData = {};\n if (body.expirationTime?.seconds) {\n data.expirationTime = `${Long.fromValue(\n body.expirationTime.seconds,\n ).toString()}.${body.expirationTime.nanos}`;\n }\n if (body.keys) {\n data.keys = parseKey({ keyList: body.keys });\n }\n if (body.contents) {\n data.contents = Buffer.from(body.contents).toString('base64');\n }\n if (body.memo) {\n data.memo = body.memo;\n }\n return data;\n }\n\n static parseFileAppend(\n body: proto.IFileAppendTransactionBody,\n ): FileAppendData | undefined {\n if (!body) return undefined;\n const data: FileAppendData = {};\n if (body.fileID) {\n data.fileId = `${body.fileID.shardNum ?? 0}.${\n body.fileID.realmNum ?? 0\n }.${body.fileID.fileNum ?? 0}`;\n }\n if (body.contents) {\n data.contents = Buffer.from(body.contents).toString('base64');\n }\n return data;\n }\n\n static parseFileUpdate(\n body: proto.IFileUpdateTransactionBody,\n ): FileUpdateData | undefined {\n if (!body) return undefined;\n const data: FileUpdateData = {};\n if (body.fileID) {\n data.fileId = `${body.fileID.shardNum ?? 0}.${\n body.fileID.realmNum ?? 0\n }.${body.fileID.fileNum ?? 0}`;\n }\n if (body.expirationTime?.seconds) {\n data.expirationTime = `${Long.fromValue(\n body.expirationTime.seconds,\n ).toString()}.${body.expirationTime.nanos}`;\n }\n if (body.keys) {\n data.keys = parseKey({ keyList: body.keys });\n }\n if (body.contents) {\n data.contents = Buffer.from(body.contents).toString('base64');\n }\n if (body.memo?.value !== undefined) {\n data.memo = body.memo.value;\n }\n return data;\n }\n\n static parseFileDelete(\n body: proto.IFileDeleteTransactionBody,\n ): FileDeleteData | undefined {\n if (!body) return undefined;\n const data: FileDeleteData = {};\n if (body.fileID) {\n data.fileId = `${body.fileID.shardNum ?? 0}.${\n body.fileID.realmNum ?? 0\n }.${body.fileID.fileNum ?? 0}`;\n }\n return data;\n }\n}\n","import { proto } from '@hashgraph/proto';\nimport { AccountId, TokenId, Hbar, HbarUnit, Long } from '@hashgraph/sdk';\nimport {\n AccountAmount,\n TokenAmount,\n CryptoDeleteData,\n CryptoCreateAccountData,\n CryptoUpdateAccountData,\n CryptoApproveAllowanceData,\n CryptoDeleteAllowanceData,\n NftAllowance,\n} from '../transaction-parser-types';\nimport { parseKey } from './parser-utils';\n\nexport class CryptoParser {\n static parseCryptoTransfers(\n cryptoTransfer: proto.ICryptoTransferTransactionBody,\n result: { transfers: AccountAmount[]; tokenTransfers: TokenAmount[] },\n ): void {\n if (cryptoTransfer.transfers?.accountAmounts) {\n result.transfers = cryptoTransfer.transfers.accountAmounts.map(aa => {\n const accountId = new AccountId(\n aa.accountID!.shardNum ?? 0,\n aa.accountID!.realmNum ?? 0,\n aa.accountID!.accountNum ?? 0,\n );\n const hbarAmount = Hbar.fromTinybars(Long.fromValue(aa.amount!));\n return {\n accountId: accountId.toString(),\n amount: hbarAmount.toString(HbarUnit.Hbar),\n isDecimal: true,\n };\n });\n }\n if (cryptoTransfer.tokenTransfers) {\n for (const tokenTransferList of cryptoTransfer.tokenTransfers) {\n const tokenId = new TokenId(\n tokenTransferList.token!.shardNum ?? 0,\n tokenTransferList.token!.realmNum ?? 0,\n tokenTransferList.token!.tokenNum ?? 0,\n );\n if (tokenTransferList.transfers) {\n for (const transfer of tokenTransferList.transfers) {\n const accountId = new AccountId(\n transfer.accountID!.shardNum ?? 0,\n transfer.accountID!.realmNum ?? 0,\n transfer.accountID!.accountNum ?? 0,\n );\n const tokenAmount = Long.fromValue(transfer.amount!).toNumber();\n result.tokenTransfers.push({\n tokenId: tokenId.toString(),\n accountId: accountId.toString(),\n amount: tokenAmount,\n });\n }\n }\n }\n }\n }\n\n static parseCryptoDelete(\n body: proto.ICryptoDeleteTransactionBody,\n ): CryptoDeleteData | undefined {\n if (!body) return undefined;\n const data: CryptoDeleteData = {};\n if (body.deleteAccountID) {\n data.deleteAccountId = new AccountId(\n body.deleteAccountID.shardNum ?? 0,\n body.deleteAccountID.realmNum ?? 0,\n body.deleteAccountID.accountNum ?? 0,\n ).toString();\n }\n if (body.transferAccountID) {\n data.transferAccountId = new AccountId(\n body.transferAccountID.shardNum ?? 0,\n body.transferAccountID.realmNum ?? 0,\n body.transferAccountID.accountNum ?? 0,\n ).toString();\n }\n return data;\n }\n\n static parseCryptoCreateAccount(\n body: proto.ICryptoCreateTransactionBody,\n ): CryptoCreateAccountData | undefined {\n if (!body) return undefined;\n const data: CryptoCreateAccountData = {};\n if (body.initialBalance) {\n data.initialBalance = Hbar.fromTinybars(\n Long.fromValue(body.initialBalance),\n ).toString(HbarUnit.Hbar);\n }\n if (body.key) {\n data.key = parseKey(body.key);\n }\n if (body.receiverSigRequired !== undefined) {\n data.receiverSigRequired = body.receiverSigRequired;\n }\n if (body.autoRenewPeriod?.seconds) {\n data.autoRenewPeriod = Long.fromValue(\n body.autoRenewPeriod.seconds,\n ).toString();\n }\n if (body.memo) {\n data.memo = body.memo;\n }\n if (body.maxAutomaticTokenAssociations !== undefined) {\n data.maxAutomaticTokenAssociations = body.maxAutomaticTokenAssociations;\n }\n if (body.stakedAccountId) {\n data.stakedAccountId = new AccountId(\n body.stakedAccountId.shardNum ?? 0,\n body.stakedAccountId.realmNum ?? 0,\n body.stakedAccountId.accountNum ?? 0,\n ).toString();\n } else if (body.stakedNodeId !== null && body.stakedNodeId !== undefined) {\n data.stakedNodeId = Long.fromValue(body.stakedNodeId).toString();\n }\n if (body.declineReward !== undefined) {\n data.declineReward = body.declineReward;\n }\n if (body.alias && body.alias.length > 0) {\n data.alias = Buffer.from(body.alias).toString('hex');\n }\n return data;\n }\n\n static parseCryptoUpdateAccount(\n body: proto.ICryptoUpdateTransactionBody,\n ): CryptoUpdateAccountData | undefined {\n if (!body) return undefined;\n const data: CryptoUpdateAccountData = {};\n if (body.accountIDToUpdate) {\n data.accountIdToUpdate = new AccountId(\n body.accountIDToUpdate.shardNum ?? 0,\n body.accountIDToUpdate.realmNum ?? 0,\n body.accountIDToUpdate.accountNum ?? 0,\n ).toString();\n }\n if (body.key) {\n data.key = parseKey(body.key);\n }\n if (body.expirationTime?.seconds) {\n data.expirationTime = `${Long.fromValue(\n body.expirationTime.seconds,\n ).toString()}.${body.expirationTime.nanos}`;\n }\n if (\n body.receiverSigRequired !== null &&\n body.receiverSigRequired !== undefined\n ) {\n data.receiverSigRequired = Boolean(body.receiverSigRequired);\n }\n if (body.autoRenewPeriod?.seconds) {\n data.autoRenewPeriod = Long.fromValue(\n body.autoRenewPeriod.seconds,\n ).toString();\n }\n if (body.memo?.value !== undefined) {\n data.memo = body.memo.value;\n }\n if (body.maxAutomaticTokenAssociations?.value !== undefined) {\n data.maxAutomaticTokenAssociations =\n body.maxAutomaticTokenAssociations.value;\n }\n if (body.stakedAccountId) {\n data.stakedAccountId = new AccountId(\n body.stakedAccountId.shardNum ?? 0,\n body.stakedAccountId.realmNum ?? 0,\n body.stakedAccountId.accountNum ?? 0,\n ).toString();\n data.stakedNodeId = undefined;\n } else if (body.stakedNodeId !== null && body.stakedNodeId !== undefined) {\n data.stakedNodeId = Long.fromValue(body.stakedNodeId).toString();\n data.stakedAccountId = undefined;\n } else {\n data.stakedAccountId = undefined;\n data.stakedNodeId = undefined;\n }\n if (body.declineReward !== null && body.declineReward !== undefined) {\n data.declineReward = Boolean(body.declineReward);\n }\n return data;\n }\n\n static parseCryptoApproveAllowance(\n body: proto.ICryptoApproveAllowanceTransactionBody,\n ): CryptoApproveAllowanceData | undefined {\n if (!body) return undefined;\n const data: CryptoApproveAllowanceData = {};\n if (body.cryptoAllowances && body.cryptoAllowances.length > 0) {\n data.hbarAllowances = body.cryptoAllowances.map(a => ({\n ownerAccountId: new AccountId(\n a.owner!.shardNum ?? 0,\n a.owner!.realmNum ?? 0,\n a.owner!.accountNum ?? 0,\n ).toString(),\n spenderAccountId: new AccountId(\n a.spender!.shardNum ?? 0,\n a.spender!.realmNum ?? 0,\n a.spender!.accountNum ?? 0,\n ).toString(),\n amount: Hbar.fromTinybars(Long.fromValue(a.amount!)).toString(\n HbarUnit.Hbar,\n ),\n }));\n }\n if (body.tokenAllowances && body.tokenAllowances.length > 0) {\n data.tokenAllowances = body.tokenAllowances.map(a => ({\n tokenId: new TokenId(\n a.tokenId!.shardNum ?? 0,\n a.tokenId!.realmNum ?? 0,\n a.tokenId!.tokenNum ?? 0,\n ).toString(),\n ownerAccountId: new AccountId(\n a.owner!.shardNum ?? 0,\n a.owner!.realmNum ?? 0,\n a.owner!.accountNum ?? 0,\n ).toString(),\n spenderAccountId: new AccountId(\n a.spender!.shardNum ?? 0,\n a.spender!.realmNum ?? 0,\n a.spender!.accountNum ?? 0,\n ).toString(),\n amount: Long.fromValue(a.amount!).toString(),\n }));\n }\n if (body.nftAllowances && body.nftAllowances.length > 0) {\n data.nftAllowances = body.nftAllowances.map(a => {\n const allowance: NftAllowance = {};\n if (a.tokenId)\n allowance.tokenId = new TokenId(\n a.tokenId.shardNum ?? 0,\n a.tokenId.realmNum ?? 0,\n a.tokenId.tokenNum ?? 0,\n ).toString();\n if (a.owner)\n allowance.ownerAccountId = new AccountId(\n a.owner.shardNum ?? 0,\n a.owner.realmNum ?? 0,\n a.owner.accountNum ?? 0,\n ).toString();\n if (a.spender)\n allowance.spenderAccountId = new AccountId(\n a.spender.shardNum ?? 0,\n a.spender.realmNum ?? 0,\n a.spender.accountNum ?? 0,\n ).toString();\n if (a.serialNumbers && a.serialNumbers.length > 0)\n allowance.serialNumbers = a.serialNumbers.map(sn =>\n Long.fromValue(sn).toString(),\n );\n if (a.approvedForAll?.value !== undefined)\n allowance.approvedForAll = a.approvedForAll.value;\n if (a.delegatingSpender)\n allowance.delegatingSpender = new AccountId(\n a.delegatingSpender.shardNum ?? 0,\n a.delegatingSpender.realmNum ?? 0,\n a.delegatingSpender.accountNum ?? 0,\n ).toString();\n return allowance;\n });\n }\n return data;\n }\n\n static parseCryptoDeleteAllowance(\n body: proto.ICryptoDeleteAllowanceTransactionBody,\n ): CryptoDeleteAllowanceData | undefined {\n if (!body) return undefined;\n const data: CryptoDeleteAllowanceData = {};\n if (body.nftAllowances && body.nftAllowances.length > 0) {\n data.nftAllowancesToRemove = body.nftAllowances.map(a => ({\n ownerAccountId: new AccountId(\n a.owner!.shardNum ?? 0,\n a.owner!.realmNum ?? 0,\n a.owner!.accountNum ?? 0,\n ).toString(),\n tokenId: new TokenId(\n a.tokenId!.shardNum ?? 0,\n a.tokenId!.realmNum ?? 0,\n a.tokenId!.tokenNum ?? 0,\n ).toString(),\n serialNumbers: a.serialNumbers\n ? a.serialNumbers.map(sn => Long.fromValue(sn).toString())\n : [],\n }));\n }\n return data;\n }\n}\n","import { proto } from '@hashgraph/proto';\nimport { ContractId, Hbar, HbarUnit, Long } from '@hashgraph/sdk';\nimport {\n ContractCallData,\n ContractCreateData,\n ContractUpdateData,\n ContractDeleteData,\n} from '../transaction-parser-types';\nimport { Buffer } from 'buffer';\nimport { parseKey } from './parser-utils';\nimport { AccountId, FileId } from '@hashgraph/sdk';\n\nexport class SCSParser {\n static parseContractCall(\n body: proto.IContractCallTransactionBody,\n ): ContractCallData | undefined {\n if (!body) return undefined;\n const hbarAmount = Hbar.fromTinybars(Long.fromValue(body.amount ?? 0));\n const data: ContractCallData = {\n contractId: new ContractId(\n body.contractID!.shardNum ?? 0,\n body.contractID!.realmNum ?? 0,\n body.contractID!.contractNum ?? 0,\n ).toString(),\n gas: Long.fromValue(body.gas ?? 0).toNumber(),\n amount: parseFloat(hbarAmount.toString(HbarUnit.Hbar)),\n };\n if (body.functionParameters) {\n data.functionParameters = Buffer.from(body.functionParameters).toString(\n 'hex',\n );\n if (data.functionParameters.length >= 8) {\n data.functionName = data.functionParameters.substring(0, 8);\n }\n }\n return data;\n }\n\n static parseContractCreate(\n body: proto.IContractCreateTransactionBody,\n ): ContractCreateData | undefined {\n if (!body) return undefined;\n const data: ContractCreateData = {};\n if (body.initialBalance) {\n data.initialBalance = Hbar.fromTinybars(\n Long.fromValue(body.initialBalance),\n ).toString(HbarUnit.Hbar);\n }\n if (body.gas) {\n data.gas = Long.fromValue(body.gas).toString();\n }\n if (body.adminKey) {\n data.adminKey = parseKey(body.adminKey);\n }\n if (body.constructorParameters) {\n data.constructorParameters = Buffer.from(\n body.constructorParameters,\n ).toString('hex');\n }\n if (body.memo) {\n data.memo = body.memo;\n }\n if (body.autoRenewPeriod?.seconds) {\n data.autoRenewPeriod = Long.fromValue(\n body.autoRenewPeriod.seconds,\n ).toString();\n }\n if (body.stakedAccountId) {\n data.stakedAccountId = new AccountId(\n body.stakedAccountId.shardNum ?? 0,\n body.stakedAccountId.realmNum ?? 0,\n body.stakedAccountId.accountNum ?? 0,\n ).toString();\n } else if (body.stakedNodeId !== null && body.stakedNodeId !== undefined) {\n data.stakedNodeId = Long.fromValue(body.stakedNodeId).toString();\n }\n if (body.declineReward !== undefined) {\n data.declineReward = body.declineReward;\n }\n if (body.maxAutomaticTokenAssociations !== undefined) {\n data.maxAutomaticTokenAssociations = body.maxAutomaticTokenAssociations;\n }\n if (body.fileID) {\n data.initcodeSource = 'fileID';\n data.initcode = new FileId(\n body.fileID.shardNum ?? 0,\n body.fileID.realmNum ?? 0,\n body.fileID.fileNum ?? 0,\n ).toString();\n } else if (body.initcode && body.initcode.length > 0) {\n data.initcodeSource = 'bytes';\n data.initcode = Buffer.from(body.initcode).toString('hex');\n }\n return data;\n }\n\n static parseContractUpdate(\n body: proto.IContractUpdateTransactionBody,\n ): ContractUpdateData | undefined {\n if (!body) return undefined;\n const data: ContractUpdateData = {};\n if (body.contractID) {\n data.contractIdToUpdate = new ContractId(\n body.contractID.shardNum ?? 0,\n body.contractID.realmNum ?? 0,\n body.contractID.contractNum ?? 0,\n ).toString();\n }\n if (body.adminKey) {\n data.adminKey = parseKey(body.adminKey);\n }\n if (body.expirationTime?.seconds) {\n data.expirationTime = `${Long.fromValue(\n body.expirationTime.seconds,\n ).toString()}.${body.expirationTime.nanos}`;\n }\n if (body.autoRenewPeriod?.seconds) {\n data.autoRenewPeriod = Long.fromValue(\n body.autoRenewPeriod.seconds,\n ).toString();\n }\n\n if (body.memo) {\n const memoAsAny = body.memo as any;\n if (\n memoAsAny &&\n typeof memoAsAny === 'object' &&\n memoAsAny.hasOwnProperty('value')\n ) {\n const memoVal = memoAsAny.value;\n data.memo =\n memoVal === null || memoVal === undefined\n ? undefined\n : String(memoVal);\n } else if (typeof memoAsAny === 'string') {\n data.memo = memoAsAny;\n } else {\n data.memo = undefined;\n }\n } else {\n data.memo = undefined;\n }\n\n if (body.stakedAccountId) {\n data.stakedAccountId = new AccountId(\n body.stakedAccountId.shardNum ?? 0,\n body.stakedAccountId.realmNum ?? 0,\n body.stakedAccountId.accountNum ?? 0,\n ).toString();\n data.stakedNodeId = undefined;\n } else if (\n body.stakedNodeId !== null &&\n body.stakedNodeId !== undefined &&\n Long.fromValue(body.stakedNodeId).notEquals(-1)\n ) {\n data.stakedNodeId = Long.fromValue(body.stakedNodeId).toString();\n data.stakedAccountId = undefined;\n } else {\n data.stakedNodeId = undefined;\n data.stakedAccountId = undefined;\n }\n if (body.declineReward?.value !== undefined) {\n data.declineReward = body.declineReward.value;\n }\n if (body.maxAutomaticTokenAssociations?.value !== undefined) {\n data.maxAutomaticTokenAssociations =\n body.maxAutomaticTokenAssociations.value;\n }\n if (body.autoRenewAccountId) {\n data.autoRenewAccountId = new AccountId(\n body.autoRenewAccountId.shardNum ?? 0,\n body.autoRenewAccountId.realmNum ?? 0,\n body.autoRenewAccountId.accountNum ?? 0,\n ).toString();\n }\n return data;\n }\n\n static parseContractDelete(\n body: proto.IContractDeleteTransactionBody,\n ): ContractDeleteData | undefined {\n if (!body) return undefined;\n const data: ContractDeleteData = {};\n if (body.contractID) {\n data.contractIdToDelete = new ContractId(\n body.contractID.shardNum ?? 0,\n body.contractID.realmNum ?? 0,\n body.contractID.contractNum ?? 0,\n ).toString();\n }\n if (body.transferAccountID) {\n data.transferAccountId = new AccountId(\n body.transferAccountID.shardNum ?? 0,\n body.transferAccountID.realmNum ?? 0,\n body.transferAccountID.accountNum ?? 0,\n ).toString();\n } else if (body.transferContractID) {\n data.transferContractId = new ContractId(\n body.transferContractID.shardNum ?? 0,\n body.transferContractID.realmNum ?? 0,\n body.transferContractID.contractNum ?? 0,\n ).toString();\n }\n return data;\n }\n}\n","import { proto } from '@hashgraph/proto';\nimport { UtilPrngData } from '../transaction-parser-types';\n\nexport class UtilParser {\n static parseUtilPrng(\n body: proto.IUtilPrngTransactionBody,\n ): UtilPrngData | undefined {\n if (!body) return undefined;\n const data: UtilPrngData = {};\n if (body.range && body.range !== 0) {\n data.range = body.range;\n }\n return data;\n }\n}\n","import { PrivateKey } from '@hashgraph/sdk';\n\nexport type KeyType = 'ed25519' | 'ecdsa';\n\nexport interface KeyDetectionResult {\n detectedType: KeyType;\n privateKey: PrivateKey;\n}\n\n/**\n * Detects the key type from a private key string and returns the parsed PrivateKey\n * @param privateKeyString The private key string to detect type from\n * @returns The detected key type and parsed PrivateKey\n * @throws Error if the private key cannot be parsed\n */\nexport function detectKeyTypeFromString(\n privateKeyString: string,\n): KeyDetectionResult {\n let detectedType: KeyType = 'ed25519';\n\n if (privateKeyString.startsWith('0x')) {\n detectedType = 'ecdsa';\n } else if (privateKeyString.startsWith('302e020100300506032b6570')) {\n detectedType = 'ed25519';\n } else if (privateKeyString.startsWith('3030020100300706052b8104000a')) {\n detectedType = 'ecdsa';\n } else if (privateKeyString.length === 96) {\n detectedType = 'ed25519';\n } else if (privateKeyString.length === 88) {\n detectedType = 'ecdsa';\n }\n\n try {\n const privateKey =\n detectedType === 'ecdsa'\n ? PrivateKey.fromStringECDSA(privateKeyString)\n : PrivateKey.fromStringED25519(privateKeyString);\n return { detectedType, privateKey };\n } catch (parseError) {\n const alternateType = detectedType === 'ecdsa' ? 'ed25519' : 'ecdsa';\n try {\n const privateKey =\n alternateType === 'ecdsa'\n ? PrivateKey.fromStringECDSA(privateKeyString)\n : PrivateKey.fromStringED25519(privateKeyString);\n return { detectedType: alternateType, privateKey };\n } catch (secondError) {\n throw new Error(\n `Failed to parse private key as either ED25519 or ECDSA: ${parseError}`,\n );\n }\n }\n}\n","import type { Signer } from '@hashgraph/sdk';\nimport type { DAppSigner } from '@hashgraph/hedera-wallet-connect';\nimport { RegistrationProgressCallback } from '../hcs-10/types';\nimport { LogLevel } from '../utils/logger';\nimport { FeeConfigBuilderInterface } from '../fees';\nimport { NetworkType } from '../utils/types';\n\nexport enum ProfileType {\n PERSONAL = 0,\n AI_AGENT = 1,\n}\n\nexport enum AIAgentType {\n MANUAL = 0,\n AUTONOMOUS = 1,\n}\n\nexport enum EndpointType {\n REST = 0,\n WEBSOCKET = 1,\n GRPC = 2,\n}\n\nexport enum AIAgentCapability {\n TEXT_GENERATION = 0,\n IMAGE_GENERATION = 1,\n AUDIO_GENERATION = 2,\n VIDEO_GENERATION = 3,\n CODE_GENERATION = 4,\n LANGUAGE_TRANSLATION = 5,\n SUMMARIZATION_EXTRACTION = 6,\n KNOWLEDGE_RETRIEVAL = 7,\n DATA_INTEGRATION = 8,\n MARKET_INTELLIGENCE = 9,\n TRANSACTION_ANALYTICS = 10,\n SMART_CONTRACT_AUDIT = 11,\n GOVERNANCE_FACILITATION = 12,\n SECURITY_MONITORING = 13,\n COMPLIANCE_ANALYSIS = 14,\n FRAUD_DETECTION = 15,\n MULTI_AGENT_COORDINATION = 16,\n API_INTEGRATION = 17,\n WORKFLOW_AUTOMATION = 18,\n}\n\nexport type SocialPlatform =\n | 'twitter'\n | 'github'\n | 'discord'\n | 'telegram'\n | 'linkedin'\n | 'youtube'\n | 'website'\n | 'x';\n\nexport interface SocialLink {\n platform: SocialPlatform;\n handle: string;\n}\n\nexport interface AIAgentDetails {\n type: AIAgentType;\n capabilities: AIAgentCapability[];\n model: string;\n creator?: string;\n}\n\nexport interface BaseProfile {\n version: string;\n type: ProfileType;\n display_name: string;\n alias?: string;\n bio?: string;\n socials?: SocialLink[];\n profileImage?: string;\n properties?: Record<string, any>;\n inboundTopicId?: string;\n outboundTopicId?: string;\n}\n\nexport interface PersonalProfile extends BaseProfile {\n type: ProfileType.PERSONAL;\n}\n\nexport interface AIAgentProfile extends BaseProfile {\n type: ProfileType.AI_AGENT;\n aiAgent: AIAgentDetails;\n}\n\nexport type HCS11Profile = PersonalProfile | AIAgentProfile;\n\nexport enum InboundTopicType {\n PUBLIC = 'PUBLIC',\n CONTROLLED = 'CONTROLLED',\n FEE_BASED = 'FEE_BASED',\n}\n\nexport interface HCS11Auth {\n operatorId: string;\n privateKey?: string;\n signer?: DAppSigner | Signer;\n}\n\nexport interface HCS11ClientConfig {\n network: NetworkType;\n auth: HCS11Auth;\n logLevel?: LogLevel;\n silent?: boolean;\n keyType?: 'ed25519' | 'ecdsa';\n}\n\nexport interface TransactionResult<T = unknown> {\n success: boolean;\n error?: string;\n result?: T;\n}\n\nexport interface InscribeProfileResponse {\n profileTopicId: string;\n transactionId: string;\n success: boolean;\n error?: string;\n inboundTopicId?: string;\n outboundTopicId?: string;\n}\n\nexport interface InscribeImageResponse {\n imageTopicId: string;\n transactionId: string;\n success: boolean;\n error?: string;\n}\n\nexport interface AgentMetadata {\n type: 'autonomous' | 'manual';\n model?: string;\n socials?: { [key in SocialPlatform]?: string };\n creator?: string;\n properties?: Record<string, any>;\n}\n\nexport interface ProgressOptions {\n progressCallback?: RegistrationProgressCallback;\n}\n\nexport interface InscribeImageOptions extends ProgressOptions {\n waitForConfirmation?: boolean;\n}\n\nexport interface InscribeProfileOptions extends ProgressOptions {\n waitForConfirmation?: boolean;\n}\n\nexport interface AgentConfiguration {\n name: string;\n alias: string;\n bio: string;\n capabilities: number[];\n metadata: AgentMetadata;\n pfpBuffer?: Buffer;\n pfpFileName?: string;\n network: NetworkType;\n inboundTopicType: InboundTopicType;\n feeConfig?: FeeConfigBuilderInterface;\n connectionFeeConfig?: FeeConfigBuilderInterface;\n existingAccount?: {\n accountId: string;\n privateKey: string;\n };\n existingPfpTopicId?: string;\n}\n\nexport interface PersonConfig extends BaseProfile {\n type: ProfileType.PERSONAL;\n pfpBuffer?: Buffer;\n pfpFileName?: string;\n}\n\nexport const SUPPORTED_SOCIAL_PLATFORMS: SocialPlatform[] = [\n 'twitter',\n 'github',\n 'discord',\n 'telegram',\n 'linkedin',\n 'youtube',\n 'website',\n 'x',\n];\n\nexport const capabilityNameToCapabilityMap: Record<string, AIAgentCapability> =\n {\n text_generation: AIAgentCapability.TEXT_GENERATION,\n image_generation: AIAgentCapability.IMAGE_GENERATION,\n audio_generation: AIAgentCapability.AUDIO_GENERATION,\n video_generation: AIAgentCapability.VIDEO_GENERATION,\n code_generation: AIAgentCapability.CODE_GENERATION,\n language_translation: AIAgentCapability.LANGUAGE_TRANSLATION,\n summarization: AIAgentCapability.SUMMARIZATION_EXTRACTION,\n extraction: AIAgentCapability.SUMMARIZATION_EXTRACTION,\n knowledge_retrieval: AIAgentCapability.KNOWLEDGE_RETRIEVAL,\n data_integration: AIAgentCapability.DATA_INTEGRATION,\n data_visualization: AIAgentCapability.DATA_INTEGRATION,\n market_intelligence: AIAgentCapability.MARKET_INTELLIGENCE,\n transaction_analytics: AIAgentCapability.TRANSACTION_ANALYTICS,\n smart_contract_audit: AIAgentCapability.SMART_CONTRACT_AUDIT,\n governance: AIAgentCapability.GOVERNANCE_FACILITATION,\n security_monitoring: AIAgentCapability.SECURITY_MONITORING,\n compliance_analysis: AIAgentCapability.COMPLIANCE_ANALYSIS,\n fraud_detection: AIAgentCapability.FRAUD_DETECTION,\n multi_agent: AIAgentCapability.MULTI_AGENT_COORDINATION,\n api_integration: AIAgentCapability.API_INTEGRATION,\n workflow_automation: AIAgentCapability.WORKFLOW_AUTOMATION,\n };\n\nexport interface AgentMetadata {\n type: 'autonomous' | 'manual';\n model?: string;\n socials?: {\n twitter?: string;\n discord?: string;\n github?: string;\n website?: string;\n x?: string;\n linkedin?: string;\n youtube?: string;\n telegram?: string;\n };\n creator?: string;\n properties?: Record<string, any>;\n}\n","import {\n AccountId,\n AccountUpdateTransaction,\n Client,\n PrivateKey,\n Status,\n Transaction,\n} from '@hashgraph/sdk';\nimport {\n inscribe,\n inscribeWithSigner,\n InscriptionInput,\n InscriptionOptions,\n} from '../inscribe';\nimport { Logger, detectKeyTypeFromString } from '../utils';\nimport * as mime from 'mime-types';\nimport { z, ZodIssue } from 'zod';\nimport type { DAppSigner } from '@hashgraph/hedera-wallet-connect';\nimport { ProgressReporter } from '../utils/progress-reporter';\nimport { HederaMirrorNode } from '../services';\nimport { TopicInfo } from '../services/types';\nimport {\n ProfileType,\n AIAgentType,\n AIAgentCapability,\n SocialLink,\n PersonalProfile,\n AIAgentProfile,\n HCS11Profile,\n HCS11Auth,\n HCS11ClientConfig,\n TransactionResult,\n InscribeProfileResponse,\n InscribeImageResponse,\n AgentMetadata,\n InscribeImageOptions,\n InscribeProfileOptions,\n capabilityNameToCapabilityMap,\n} from './types';\n\nconst SocialLinkSchema = z.object({\n platform: z.string().min(1),\n handle: z.string().min(1),\n});\n\nconst AIAgentDetailsSchema = z.object({\n type: z.nativeEnum(AIAgentType),\n capabilities: z.array(z.nativeEnum(AIAgentCapability)).min(1),\n model: z.string().min(1),\n creator: z.string().optional(),\n});\n\nconst BaseProfileSchema = z.object({\n version: z.string().min(1),\n type: z.nativeEnum(ProfileType),\n display_name: z.string().min(1),\n alias: z.string().optional(),\n bio: z.string().optional(),\n socials: z.array(SocialLinkSchema).optional(),\n profileImage: z.string().optional(),\n properties: z.record(z.any()).optional(),\n inboundTopicId: z.string().optional(),\n outboundTopicId: z.string().optional(),\n});\n\nconst PersonalProfileSchema = BaseProfileSchema.extend({\n type: z.literal(ProfileType.PERSONAL),\n language: z.string().optional(),\n timezone: z.string().optional(),\n});\n\nconst AIAgentProfileSchema = BaseProfileSchema.extend({\n type: z.literal(ProfileType.AI_AGENT),\n aiAgent: AIAgentDetailsSchema,\n});\n\nconst HCS11ProfileSchema = z.union([\n PersonalProfileSchema,\n AIAgentProfileSchema,\n]);\n\nexport class HCS11Client {\n private client: Client;\n private auth: HCS11Auth;\n private network: string;\n private logger: Logger;\n private mirrorNode: HederaMirrorNode;\n private keyType: 'ed25519' | 'ecdsa';\n private operatorId: string;\n\n constructor(config: HCS11ClientConfig) {\n this.client =\n config.network === 'mainnet' ? Client.forMainnet() : Client.forTestnet();\n this.auth = config.auth;\n this.network = config.network;\n this.operatorId = config.auth.operatorId;\n \n this.logger = Logger.getInstance({\n level: config.logLevel || 'info',\n module: 'HCS-11',\n silent: config.silent,\n });\n \n this.mirrorNode = new HederaMirrorNode(\n this.network as 'mainnet' | 'testnet',\n this.logger,\n );\n\n if (this.auth.privateKey) {\n if (config.keyType) {\n this.keyType = config.keyType;\n this.initializeOperatorWithKeyType();\n } else {\n try {\n const keyDetection = detectKeyTypeFromString(this.auth.privateKey);\n this.keyType = keyDetection.detectedType;\n this.client.setOperator(this.operatorId, keyDetection.privateKey);\n } catch (error) {\n this.logger.warn('Failed to detect key type from private key format, will query mirror node');\n this.keyType = 'ed25519';\n }\n \n this.initializeOperator();\n }\n }\n }\n\n public getClient(): Client {\n return this.client;\n }\n\n public getOperatorId(): string {\n return this.auth.operatorId;\n }\n\n public async initializeOperator() {\n const account = await this.mirrorNode.requestAccount(this.operatorId);\n const keyType = account?.key?._type;\n\n if (keyType && keyType.includes('ECDSA')) {\n this.keyType = 'ecdsa';\n } else if (keyType && keyType.includes('ED25519')) {\n this.keyType = 'ed25519';\n } else {\n this.keyType = 'ed25519';\n }\n\n this.initializeOperatorWithKeyType();\n }\n\n private initializeOperatorWithKeyType() {\n if (!this.auth.privateKey) {\n return;\n }\n\n const PK =\n this.keyType === 'ecdsa'\n ? PrivateKey.fromStringECDSA(this.auth.privateKey)\n : PrivateKey.fromStringED25519(this.auth.privateKey);\n\n this.client.setOperator(this.operatorId, PK);\n }\n\n public createPersonalProfile(\n displayName: string,\n options?: {\n alias?: string;\n bio?: string;\n socials?: SocialLink[];\n profileImage?: string;\n language?: string;\n timezone?: string;\n properties?: Record<string, any>;\n inboundTopicId?: string;\n outboundTopicId?: string;\n },\n ): PersonalProfile {\n return {\n version: '1.0',\n type: ProfileType.PERSONAL,\n display_name: displayName,\n alias: options?.alias,\n bio: options?.bio,\n socials: options?.socials,\n profileImage: options?.profileImage,\n properties: options?.properties,\n inboundTopicId: options?.inboundTopicId,\n outboundTopicId: options?.outboundTopicId,\n };\n }\n\n public createAIAgentProfile(\n displayName: string,\n agentType: AIAgentType,\n capabilities: AIAgentCapability[],\n model: string,\n options?: {\n alias?: string;\n bio?: string;\n socials?: SocialLink[];\n profileImage?: string;\n properties?: Record<string, any>;\n inboundTopicId?: string;\n outboundTopicId?: string;\n creator?: string;\n },\n ): AIAgentProfile {\n const validation = this.validateProfile({\n version: '1.0',\n type: ProfileType.AI_AGENT,\n display_name: displayName,\n alias: options?.alias,\n bio: options?.bio,\n socials: options?.socials,\n profileImage: options?.profileImage,\n properties: options?.properties,\n inboundTopicId: options?.inboundTopicId,\n outboundTopicId: options?.outboundTopicId,\n aiAgent: {\n type: agentType,\n capabilities,\n model,\n creator: options?.creator,\n },\n });\n\n if (!validation.valid) {\n throw new Error(\n `Invalid AI Agent Profile: ${validation.errors.join(', ')}`,\n );\n }\n\n return {\n version: '1.0',\n type: ProfileType.AI_AGENT,\n display_name: displayName,\n alias: options?.alias,\n bio: options?.bio,\n socials: options?.socials,\n profileImage: options?.profileImage,\n properties: options?.properties,\n inboundTopicId: options?.inboundTopicId,\n outboundTopicId: options?.outboundTopicId,\n aiAgent: {\n type: agentType,\n capabilities,\n model,\n creator: options?.creator,\n },\n };\n }\n\n public validateProfile(profile: unknown): {\n valid: boolean;\n errors: string[];\n } {\n const result = HCS11ProfileSchema.safeParse(profile);\n\n if (result.success) {\n return { valid: true, errors: [] };\n }\n\n const formattedErrors = result.error.errors.map((err: ZodIssue) => {\n const path = err.path.join('.');\n let message = err.message;\n\n if (err.code === 'invalid_type') {\n message = `Expected ${err.expected}, got ${err.received}`;\n } else if (err.code === 'invalid_enum_value') {\n const validOptions = (err as any).options?.join(', ');\n message = `Invalid value. Valid options are: ${validOptions}`;\n } else if (err.code === 'too_small' && err.type === 'string') {\n message = 'Cannot be empty';\n }\n\n return `${path}: ${message}`;\n });\n\n return { valid: false, errors: formattedErrors };\n }\n\n public profileToJSONString(profile: HCS11Profile): string {\n return JSON.stringify(profile);\n }\n\n public parseProfileFromString(profileStr: string): HCS11Profile | null {\n try {\n const parsedProfile = JSON.parse(profileStr);\n const validation = this.validateProfile(parsedProfile);\n if (!validation.valid) {\n this.logger.error('Invalid profile format:', validation.errors);\n return null;\n }\n return parsedProfile as HCS11Profile;\n } catch (error) {\n this.logger.error('Error parsing profile:');\n return null;\n }\n }\n\n public setProfileForAccountMemo(\n topicId: string,\n topicStandard: 1 | 2 | 7 = 1,\n ): string {\n return `hcs-11:hcs://${topicStandard}/${topicId}`;\n }\n\n private async executeTransaction<T>(\n transaction: Transaction,\n ): Promise<TransactionResult<T>> {\n try {\n if (this.auth.privateKey) {\n const signedTx = await transaction.signWithOperator(this.client);\n const response = await signedTx.execute(this.client);\n const receipt = await response.getReceipt(this.client);\n\n if (receipt.status.toString() !== Status.Success.toString()) {\n return {\n success: false,\n error: `Transaction failed: ${receipt.status.toString()}`,\n };\n }\n\n return {\n success: true,\n result: receipt as T,\n };\n }\n\n if (!this.auth.signer) {\n throw new Error('No valid authentication method provided');\n }\n\n const signer = this.auth.signer;\n const frozenTransaction = await transaction.freezeWithSigner(signer);\n const response = await frozenTransaction.executeWithSigner(signer);\n const receipt = await response.getReceiptWithSigner(signer);\n\n if (receipt.status.toString() !== Status.Success.toString()) {\n return {\n success: false,\n error: `Transaction failed: ${receipt.status.toString()}: ${Status.Success.toString()}`,\n };\n }\n\n return {\n success: true,\n result: receipt as T,\n };\n } catch (error) {\n return {\n success: false,\n error:\n error instanceof Error\n ? error.message\n : 'Unknown error during transaction execution',\n };\n }\n }\n\n public async inscribeImage(\n buffer: Buffer,\n fileName: string,\n options?: InscribeImageOptions,\n ): Promise<InscribeImageResponse> {\n try {\n const progressCallback = options?.progressCallback;\n const progressReporter = new ProgressReporter({\n module: 'HCS11-Image',\n logger: this.logger,\n callback: progressCallback as any,\n });\n\n progressReporter.preparing('Preparing to inscribe image', 0);\n\n const mimeType = mime.lookup(fileName) || 'application/octet-stream';\n\n const waitForConfirmation = options?.waitForConfirmation ?? true;\n\n let inscriptionResponse;\n if (this.auth.signer) {\n if ('accountId' in this.auth.signer) {\n progressReporter.preparing('Using signer for inscription', 10);\n\n inscriptionResponse = await inscribeWithSigner(\n {\n type: 'buffer',\n buffer,\n fileName,\n mimeType,\n },\n this.auth.signer as DAppSigner,\n {\n network: this.network as 'mainnet' | 'testnet',\n waitForConfirmation,\n waitMaxAttempts: 150,\n waitIntervalMs: 4000,\n logging: {\n level: 'debug',\n },\n progressCallback: (data: any) => {\n const adjustedPercent = 10 + (data.progressPercent || 0) * 0.8;\n progressReporter.report({\n stage: data.stage,\n message: data.message,\n progressPercent: adjustedPercent,\n details: data.details,\n });\n },\n },\n );\n } else {\n progressReporter.failed(\n 'Signer must be a DAppSigner for inscription',\n );\n throw new Error('Signer must be a DAppSigner for inscription');\n }\n } else {\n if (!this.auth.privateKey) {\n progressReporter.failed('Private key is required for inscription');\n this.logger.error('Private key is required for inscription');\n throw new Error('Private key is required for inscription');\n }\n\n progressReporter.preparing('Using private key for inscription', 10);\n\n inscriptionResponse = await inscribe(\n {\n type: 'buffer',\n buffer,\n fileName,\n mimeType,\n },\n {\n accountId: this.auth.operatorId,\n privateKey: this.auth.privateKey,\n network: this.network as 'mainnet' | 'testnet',\n },\n {\n waitForConfirmation,\n waitMaxAttempts: 150,\n waitIntervalMs: 2000,\n logging: {\n level: 'debug',\n },\n progressCallback: (data: any) => {\n const adjustedPercent = 10 + (data.progressPercent || 0) * 0.8;\n progressReporter.report({\n stage: data.stage,\n message: data.message,\n progressPercent: adjustedPercent,\n details: data.details,\n });\n },\n },\n );\n }\n\n if (inscriptionResponse.confirmed) {\n progressReporter.completed('Image inscription completed', {\n topic_id: inscriptionResponse.inscription.topic_id,\n });\n return {\n imageTopicId: inscriptionResponse.inscription.topic_id || '',\n transactionId: inscriptionResponse.result.jobId,\n success: true,\n };\n } else {\n progressReporter.verifying('Waiting for inscription confirmation', 50, {\n jobId: inscriptionResponse.result.jobId,\n });\n return {\n imageTopicId: '',\n transactionId: inscriptionResponse.result.jobId,\n success: false,\n error: 'Inscription not confirmed',\n };\n }\n } catch (error: any) {\n this.logger.error('Error inscribing image:', error);\n return {\n imageTopicId: '',\n transactionId: '',\n success: false,\n error: error.message || 'Error inscribing image',\n };\n }\n }\n\n public async inscribeProfile(\n profile: HCS11Profile,\n options?: InscribeProfileOptions,\n ): Promise<InscribeProfileResponse> {\n this.logger.info('Inscribing HCS-11 profile');\n\n const progressCallback = options?.progressCallback;\n const progressReporter = new ProgressReporter({\n module: 'HCS11-Profile',\n logger: this.logger,\n callback: progressCallback as any,\n });\n\n progressReporter.preparing('Validating profile data', 5);\n\n const validation = this.validateProfile(profile);\n if (!validation.valid) {\n progressReporter.failed(\n `Invalid profile: ${validation.errors.join(', ')}`,\n );\n return {\n profileTopicId: '',\n transactionId: '',\n success: false,\n error: `Invalid profile: ${validation.errors.join(', ')}`,\n };\n }\n\n progressReporter.preparing('Formatting profile for inscription', 15);\n\n const profileJson = this.profileToJSONString(profile);\n const fileName = `profile-${profile.display_name\n .toLowerCase()\n .replace(/\\s+/g, '-')}.json`;\n\n try {\n const contentBuffer = Buffer.from(profileJson, 'utf-8');\n const contentType = 'application/json';\n\n progressReporter.preparing('Preparing profile for inscription', 20);\n\n const input: InscriptionInput = {\n type: 'buffer',\n buffer: contentBuffer,\n fileName,\n mimeType: contentType,\n };\n\n const inscriptionOptions: InscriptionOptions = {\n waitForConfirmation: true,\n mode: 'file',\n network: this.network as 'mainnet' | 'testnet',\n waitMaxAttempts: 100,\n waitIntervalMs: 2000,\n progressCallback: (data: any) => {\n const adjustedPercent =\n 20 + Number(data?.progressPercent || 0) * 0.75;\n progressReporter?.report({\n stage: data.stage,\n message: data.message,\n progressPercent: adjustedPercent,\n details: data.details,\n });\n },\n };\n\n progressReporter.submitting('Submitting profile to Hedera network', 30);\n\n const inscriptionResponse = this.auth.privateKey\n ? await inscribe(\n input,\n {\n accountId: this.auth.operatorId,\n privateKey: this.auth.privateKey,\n network: this.network as 'mainnet' | 'testnet',\n },\n inscriptionOptions,\n )\n : await inscribeWithSigner(\n input,\n this.auth.signer as DAppSigner,\n inscriptionOptions,\n );\n\n if (\n !inscriptionResponse.confirmed ||\n !inscriptionResponse.inscription.topic_id\n ) {\n progressReporter.failed('Failed to inscribe profile content');\n return {\n profileTopicId: '',\n transactionId: '',\n success: false,\n error: 'Failed to inscribe profile content',\n };\n }\n\n const topicId = inscriptionResponse.inscription.topic_id;\n\n progressReporter.completed('Profile inscription completed', {\n topicId,\n transactionId: inscriptionResponse.result.transactionId,\n });\n\n return {\n profileTopicId: topicId,\n transactionId: inscriptionResponse.result.transactionId,\n success: true,\n };\n } catch (error: any) {\n progressReporter.failed(\n `Error inscribing profile: ${error.message || 'Unknown error'}`,\n );\n return {\n profileTopicId: '',\n transactionId: '',\n success: false,\n error: error.message || 'Unknown error during inscription',\n };\n }\n }\n\n public async updateAccountMemoWithProfile(\n accountId: string | AccountId,\n profileTopicId: string,\n ): Promise<TransactionResult> {\n try {\n this.logger.info(\n `Updating account memo for ${accountId} with profile ${profileTopicId}`,\n );\n const memo = this.setProfileForAccountMemo(profileTopicId);\n\n const transaction = new AccountUpdateTransaction()\n .setAccountMemo(memo)\n .setAccountId(accountId);\n\n return this.executeTransaction(transaction);\n } catch (error) {\n this.logger.error(\n `Error updating account memo: ${\n error instanceof Error ? error.message : 'Unknown error'\n }`,\n );\n return {\n success: false,\n error:\n error instanceof Error\n ? error.message\n : 'Unknown error updating account memo',\n };\n }\n }\n\n /**\n * Creates and inscribes a profile.\n *\n * @param profile - The profile to create and inscribe.\n * @param updateAccountMemo - Whether to update the account memo with the profile.\n * @param options - Optional configuration options.\n * @returns A promise that resolves to the inscription result.\n */\n public async createAndInscribeProfile(\n profile: HCS11Profile,\n updateAccountMemo = true,\n options?: InscribeProfileOptions,\n ): Promise<InscribeProfileResponse> {\n const progressCallback = options?.progressCallback;\n const progressReporter = new ProgressReporter({\n module: 'HCS11-ProfileCreation',\n logger: this.logger,\n callback: progressCallback as any,\n });\n\n progressReporter.preparing('Starting profile creation process', 0);\n\n const inscriptionProgress = progressReporter.createSubProgress({\n minPercent: 0,\n maxPercent: 80,\n logPrefix: 'Inscription',\n });\n\n const inscriptionResult = await this.inscribeProfile(profile, {\n ...options,\n progressCallback: (data: any) => {\n inscriptionProgress.report({\n stage: data.stage,\n message: data.message,\n progressPercent: data.progressPercent,\n details: data.details,\n });\n },\n });\n\n if (!inscriptionResult?.success) {\n progressReporter.failed('Profile inscription failed', {\n error: inscriptionResult?.error,\n });\n return inscriptionResult;\n }\n\n progressReporter.confirming('Profile inscribed, updating account memo', 85);\n\n if (updateAccountMemo) {\n const memoResult = await this.updateAccountMemoWithProfile(\n this.auth.operatorId,\n inscriptionResult.profileTopicId,\n );\n\n if (!memoResult.success) {\n progressReporter.failed('Failed to update account memo', {\n error: memoResult?.error,\n });\n return {\n ...inscriptionResult,\n success: false,\n error: memoResult?.error,\n };\n }\n }\n\n progressReporter.completed('Profile creation completed successfully', {\n profileTopicId: inscriptionResult.profileTopicId,\n transactionId: inscriptionResult.transactionId,\n });\n\n return inscriptionResult;\n }\n\n /**\n * Gets the capabilities from the capability names.\n *\n * @param capabilityNames - The capability names to get the capabilities for.\n * @returns The capabilities.\n */\n public async getCapabilitiesFromTags(\n capabilityNames: string[],\n ): Promise<number[]> {\n const capabilities: number[] = [];\n\n if (capabilityNames.length === 0) {\n return [AIAgentCapability.TEXT_GENERATION];\n }\n\n for (const capabilityName of capabilityNames) {\n const capability =\n capabilityNameToCapabilityMap[capabilityName.toLowerCase()];\n if (capability !== undefined && !capabilities.includes(capability)) {\n capabilities.push(capability);\n }\n }\n\n if (capabilities.length === 0) {\n capabilities.push(AIAgentCapability.TEXT_GENERATION);\n }\n\n return capabilities;\n }\n\n /**\n * Gets the agent type from the metadata.\n *\n * @param metadata - The metadata of the agent.\n * @returns The agent type.\n */\n public getAgentTypeFromMetadata(metadata: AgentMetadata): AIAgentType {\n if (metadata.type === 'autonomous') {\n return AIAgentType.AUTONOMOUS;\n } else {\n return AIAgentType.MANUAL;\n }\n }\n\n /**\n * Fetches a profile from the account memo.\n *\n * @param accountId - The account ID of the agent to fetch the profile for.\n * @param network - The network to use for the fetch.\n * @returns A promise that resolves to the profile.\n */\n public async fetchProfileByAccountId(\n accountId: string | AccountId,\n network?: string,\n ): Promise<{\n success: boolean;\n profile?: HCS11Profile;\n error?: string;\n topicInfo?: TopicInfo;\n }> {\n try {\n this.logger.info(\n `Fetching profile for account ${accountId.toString()} on ${\n this.network\n }`,\n );\n\n const memo = await this.mirrorNode.getAccountMemo(accountId.toString());\n\n this.logger.info(`Got account memo: ${memo}`);\n\n if (!memo?.startsWith('hcs-11:')) {\n return {\n success: false,\n error: `Account ${accountId.toString()} does not have a valid HCS-11 memo`,\n };\n }\n\n this.logger.info(`Found HCS-11 memo: ${memo}`);\n\n const protocolReference = memo.substring(7);\n\n if (protocolReference?.startsWith('hcs://')) {\n const hcsFormat = protocolReference.match(/hcs:\\/\\/(\\d+)\\/(.+)/);\n\n if (!hcsFormat) {\n return {\n success: false,\n error: `Invalid HCS protocol reference format: ${protocolReference}`,\n };\n }\n\n const [_, protocolId, profileTopicId] = hcsFormat;\n const networkParam = network || this.network || 'mainnet';\n\n this.logger.info(\n `Retrieving profile from Kiloscribe CDN: ${profileTopicId}`,\n );\n const cdnUrl = `https://kiloscribe.com/api/inscription-cdn/${profileTopicId}?network=${networkParam}`;\n\n try {\n const response = await fetch(cdnUrl);\n\n if (!response.ok) {\n return {\n success: false,\n error: `Failed to fetch profile from Kiloscribe CDN: ${response.statusText}`,\n };\n }\n\n const profileData = await response.json();\n\n if (!profileData) {\n return {\n success: false,\n error: `No profile data found for topic ${profileTopicId}`,\n };\n }\n\n return {\n success: true,\n profile: profileData,\n topicInfo: {\n inboundTopic: profileData.inboundTopicId,\n outboundTopic: profileData.outboundTopicId,\n profileTopicId,\n },\n };\n } catch (cdnError: any) {\n this.logger.error(\n `Error retrieving from Kiloscribe CDN: ${cdnError.message}`,\n );\n return {\n success: false,\n error: `Error retrieving from Kiloscribe CDN: ${cdnError.message}`,\n };\n }\n } else if (protocolReference.startsWith('ipfs://')) {\n this.logger.warn('IPFS protocol references are not fully supported');\n const response = await fetch(\n `https://ipfs.io/ipfs/${protocolReference.replace('ipfs://', '')}`,\n );\n const profileData = await response.json();\n return {\n success: true,\n profile: profileData,\n topicInfo: {\n inboundTopic: profileData.inboundTopicId,\n outboundTopic: profileData.outboundTopicId,\n profileTopicId: profileData.profileTopicId,\n },\n };\n } else if (protocolReference.startsWith('ar://')) {\n const arTxId = protocolReference.replace('ar://', '');\n const response = await fetch(`https://arweave.net/${arTxId}`);\n\n if (!response.ok) {\n return {\n success: false,\n error: `Failed to fetch profile from Arweave ${arTxId}: ${response.statusText}`,\n };\n }\n\n const profileData = await response.json();\n\n return {\n success: true,\n profile: profileData,\n topicInfo: {\n inboundTopic: profileData.inboundTopicId,\n outboundTopic: profileData.outboundTopicId,\n profileTopicId: profileData.profileTopicId,\n },\n };\n } else {\n return {\n success: false,\n error: `Invalid protocol reference format: ${protocolReference}`,\n };\n }\n } catch (error: any) {\n this.logger.error(`Error fetching profile: ${error.message}`);\n return {\n success: false,\n error: `Error fetching profile: ${error.message}`,\n };\n }\n }\n}\n","import { Logger } from '../utils/logger';\nimport { HCS11Client } from '../hcs-11/client';\nimport { sleep } from '../utils/sleep';\nimport {\n RegistrationSearchResult,\n RegistrationResult,\n RegistrationsApiResponse,\n RegistrationSearchOptions,\n} from './types';\n\nexport interface RegistrationStatusResponse {\n status: 'pending' | 'success' | 'failed';\n error?: string;\n}\n\nexport abstract class Registration {\n /**\n * Checks the status of a registration request.\n *\n * @param transactionId - The transaction ID of the registration.\n * @param network - The network to use for the registration.\n * @param baseUrl - The base URL of the guarded registry.\n * @param logger - The logger to use for logging.\n * @returns A promise that resolves to the registration status response.\n */\n protected async checkRegistrationStatus(\n transactionId: string,\n network: string,\n baseUrl: string,\n logger?: Logger,\n ): Promise<RegistrationStatusResponse> {\n try {\n const response = await fetch(`${baseUrl}/api/request-confirm`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-Network': network,\n },\n body: JSON.stringify({ transaction_id: transactionId }),\n });\n\n if (!response.ok) {\n const error = `Failed to confirm registration: ${response.statusText}`;\n if (logger) {\n logger.error(error);\n }\n throw new Error(error);\n }\n\n return (await response.json()) as RegistrationStatusResponse;\n } catch (error: any) {\n if (logger) {\n logger.error(`Error checking registration status: ${error.message}`);\n }\n throw error;\n }\n }\n\n /**\n * Waits for a registration to be confirmed.\n *\n * @param transactionId - The transaction ID of the registration.\n * @param network - The network to use for the registration.\n * @param baseUrl - The base URL of the guarded registry.\n * @param maxAttempts - The maximum number of attempts to check the registration status.\n * @param delayMs - The delay in milliseconds between attempts.\n * @param logger - The logger to use for logging.\n * @returns A promise that resolves to true if the registration is confirmed, false otherwise.\n */\n async waitForRegistrationConfirmation(\n transactionId: string,\n network: string,\n baseUrl: string,\n maxAttempts: number = 60,\n delayMs: number = 2000,\n logger?: Logger,\n ): Promise<boolean> {\n let attempts = 0;\n while (attempts < maxAttempts) {\n if (logger) {\n logger.info(\n `Checking registration status. Attempt ${attempts + 1}/${maxAttempts}`,\n );\n }\n\n const status = await this.checkRegistrationStatus(\n transactionId,\n network,\n baseUrl,\n logger,\n );\n\n if (status.status === 'success') {\n if (logger) {\n logger.info('Registration confirmed successfully');\n }\n return true;\n }\n\n if (status.status === 'failed') {\n if (logger) {\n logger.error('Registration confirmation failed');\n }\n throw new Error('Registration confirmation failed');\n }\n\n if (logger) {\n logger.info(\n `Registration still pending. Waiting ${delayMs}ms before next attempt`,\n );\n }\n await new Promise(resolve => setTimeout(resolve, delayMs));\n attempts++;\n }\n\n if (logger) {\n logger.warn(`Registration not confirmed after ${maxAttempts} attempts`);\n }\n return false;\n }\n\n /**\n * Executes a registration request for an agent.\n *\n * @param accountId - The account ID of the agent to register.\n * @param network - The network to use for the registration.\n * @param baseUrl - The base URL of the guarded registry.\n * @param logger - The logger to use for logging.\n * @returns A promise that resolves to the registration result.\n */\n async executeRegistration(\n accountId: string,\n network: string = 'mainnet',\n baseUrl: string = 'https://moonscape.tech',\n logger?: Logger,\n ): Promise<RegistrationResult> {\n try {\n if (logger) {\n logger.info('Registering agent with guarded registry');\n }\n\n try {\n const hcs11Client = new HCS11Client({\n network: network as 'mainnet' | 'testnet',\n auth: { operatorId: '0.0.0' },\n });\n logger?.info(\n `Fetching profile by account ID ${accountId} on ${network}`,\n );\n await sleep(5000);\n const profileResult = await hcs11Client.fetchProfileByAccountId(\n accountId,\n network,\n );\n logger?.info('Profile fetched', profileResult);\n\n if (profileResult?.error) {\n logger?.error('Error fetching profile', profileResult.error);\n return {\n error: profileResult.error,\n success: false,\n };\n }\n if (!profileResult?.success || !profileResult?.profile) {\n if (logger) {\n logger.error('Profile not found for agent registration');\n }\n return {\n error: 'Profile not found for the provided account ID',\n success: false,\n };\n }\n\n if (!profileResult.profile.inboundTopicId) {\n if (logger) {\n logger.error('Missing inbound topic ID in profile');\n }\n return {\n error: 'Profile is missing required inbound topic ID',\n success: false,\n };\n }\n\n if (!profileResult.profile.outboundTopicId) {\n if (logger) {\n logger.error('Missing outbound topic ID in profile');\n }\n return {\n error: 'Profile is missing required outbound topic ID',\n success: false,\n };\n }\n\n if (logger) {\n logger.info(\n `Profile validation successful. Inbound topic: ${profileResult.profile.inboundTopicId}, Outbound topic: ${profileResult.profile.outboundTopicId}`,\n );\n }\n } catch (profileError: any) {\n if (logger) {\n logger.error(`Error validating profile: ${profileError.message}`);\n }\n return {\n error: `Error validating profile: ${profileError.message}`,\n success: false,\n };\n }\n\n const response = await fetch(`${baseUrl}/api/request-register`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: '*/*',\n 'Accept-Language': 'en;q=0.5',\n Origin: baseUrl,\n Referer: `${baseUrl}/`,\n 'X-Network': network,\n },\n body: JSON.stringify({\n accountId,\n }),\n });\n\n const data = (await response.json()) as RegistrationsApiResponse;\n\n if (!response.ok) {\n if (data.details?.length > 0) {\n return {\n validationErrors: data.details,\n error: data.error || 'Validation failed',\n success: false,\n };\n }\n return {\n error: data.error || 'Failed to register agent',\n success: false,\n };\n }\n\n if (logger) {\n logger.info(\n `Created new registration request. Transaction ID: ${data.transaction_id}`,\n );\n }\n\n return {\n transactionId: data.transaction_id,\n transaction: data.transaction,\n success: true,\n };\n } catch (error: any) {\n return {\n error: `Error during registration request: ${error.message}`,\n success: false,\n };\n }\n }\n\n /**\n * Finds registrations based on the provided options.\n *\n * @param options - The options for searching registrations.\n * @param baseUrl - The base URL of the guarded registry.\n * @returns A promise that resolves to the registration search result.\n */\n async findRegistrations(\n options: RegistrationSearchOptions = {},\n baseUrl: string = 'https://moonscape.tech',\n ): Promise<RegistrationSearchResult> {\n try {\n const queryParams = new URLSearchParams();\n options.tags?.forEach(tag => queryParams.append('tags', tag.toString()));\n if (options.accountId) {\n queryParams.append('accountId', options.accountId);\n }\n if (options.network) {\n queryParams.append('network', options.network);\n }\n\n const response = await fetch(\n `${baseUrl}/api/registrations?${queryParams}`,\n {\n headers: {\n Accept: '*/*',\n 'Accept-Language': 'en;q=0.5',\n Origin: baseUrl,\n Referer: `${baseUrl}/`,\n },\n },\n );\n\n if (!response.ok) {\n const error = await response.text();\n return {\n registrations: [],\n error: error || 'Failed to fetch registrations',\n success: false,\n };\n }\n\n const data = (await response.json()) as RegistrationsApiResponse;\n if (data.error) {\n return {\n registrations: [],\n error: data.error,\n success: false,\n };\n }\n\n return {\n registrations: data.registrations || [],\n success: true,\n };\n } catch (e) {\n const error = e as Error;\n return {\n registrations: [],\n error: `Error fetching registrations: ${error.message}`,\n success: false,\n };\n }\n }\n}\n","export const sleep = (ms: number) =>\n new Promise(resolve => setTimeout(resolve, ms));\n","import { Logger, LogLevel } from '../utils/logger';\nimport { Registration } from './registrations';\nimport { HCS11Client } from '../hcs-11/client';\nimport {\n AccountResponse,\n TopicResponse,\n ScheduleInfo,\n} from '../services/types';\nimport { TopicInfo } from '../services/types';\nimport { TransactionReceipt, PrivateKey, PublicKey } from '@hashgraph/sdk';\nimport axios from 'axios';\nimport { NetworkType } from '../utils/types';\nimport { HederaMirrorNode, MirrorNodeConfig } from '../services';\nimport {\n WaitForConnectionConfirmationResponse,\n TransactMessage,\n} from './types';\nimport { HRLResolver } from '../utils/hrl-resolver';\n\nexport enum Hcs10MemoType {\n INBOUND = 'inbound',\n OUTBOUND = 'outbound',\n CONNECTION = 'connection',\n}\n\n/**\n * Configuration for HCS-10 client.\n *\n * @example\n * // Using default Hedera mirror nodes\n * const config = {\n * network: 'testnet',\n * logLevel: 'info'\n * };\n *\n * @example\n * // Using HGraph custom mirror node provider\n * const config = {\n * network: 'mainnet',\n * logLevel: 'info',\n * mirrorNode: {\n * customUrl: 'https://mainnet.hedera.api.hgraph.dev/v1/<API-KEY>',\n * apiKey: 'your-hgraph-api-key'\n * }\n * };\n *\n * @example\n * // Using custom mirror node with headers\n * const config = {\n * network: 'testnet',\n * mirrorNode: {\n * customUrl: 'https://custom-mirror.example.com',\n * apiKey: 'your-api-key',\n * headers: {\n * 'X-Custom-Header': 'value'\n * }\n * }\n * };\n */\nexport interface HCS10Config {\n /** The Hedera network to connect to */\n network: 'mainnet' | 'testnet';\n /** Log level for the client */\n logLevel?: LogLevel;\n /** Whether to pretty print logs */\n prettyPrint?: boolean;\n /** Fee amount for transactions that require fees */\n feeAmount?: number;\n /** Custom mirror node configuration */\n mirrorNode?: MirrorNodeConfig;\n /** Whether to run logger in silent mode */\n silent?: boolean;\n /** The key type to use for the operator */\n keyType?: 'ed25519' | 'ecdsa';\n}\n\nexport interface HCSMessage {\n p: 'hcs-10';\n op:\n | 'connection_request'\n | 'connection_created'\n | 'message'\n | 'close_connection'\n | 'transaction';\n data?: string;\n created?: Date;\n consensus_timestamp?: string;\n m?: string;\n payer: string;\n outbound_topic_id?: string;\n connection_request_id?: number;\n confirmed_request_id?: number;\n connection_topic_id?: string;\n connected_account_id?: string;\n requesting_account_id?: string;\n connection_id?: number;\n sequence_number: number;\n operator_id?: string;\n reason?: string;\n close_method?: string;\n schedule_id?: string;\n}\n\nexport interface ProfileResponse {\n profile: any;\n topicInfo?: TopicInfo;\n success: boolean;\n error?: string;\n}\n\nexport abstract class HCS10BaseClient extends Registration {\n protected network: string;\n protected logger: Logger;\n protected feeAmount: number;\n public mirrorNode: HederaMirrorNode;\n\n protected operatorId: string;\n\n constructor(config: HCS10Config) {\n super();\n this.network = config.network;\n this.logger = Logger.getInstance({\n level: config.logLevel || 'info',\n module: 'HCS10-BaseClient',\n prettyPrint: config.prettyPrint,\n silent: config.silent,\n });\n this.mirrorNode = new HederaMirrorNode(\n config.network as NetworkType,\n this.logger,\n config.mirrorNode,\n );\n this.feeAmount = config.feeAmount || 0.001;\n }\n\n abstract submitPayload(\n topicId: string,\n payload: object | string,\n submitKey?: PrivateKey,\n requiresFee?: boolean,\n ): Promise<TransactionReceipt>;\n\n abstract getAccountAndSigner(): { accountId: string; signer: any };\n\n /**\n * Updates the mirror node configuration.\n * @param config The new mirror node configuration.\n */\n public configureMirrorNode(config: MirrorNodeConfig): void {\n this.mirrorNode.configureMirrorNode(config);\n this.logger.info('Mirror node configuration updated');\n }\n\n public extractTopicFromOperatorId(operatorId: string): string {\n if (!operatorId) {\n return '';\n }\n const parts = operatorId.split('@');\n if (parts.length > 0) {\n return parts[0];\n }\n return '';\n }\n\n public extractAccountFromOperatorId(operatorId: string): string {\n if (!operatorId) {\n return '';\n }\n const parts = operatorId.split('@');\n if (parts.length > 1) {\n return parts[1];\n }\n return '';\n }\n\n /**\n * Get a stream of messages from a connection topic\n * @param topicId The connection topic ID to get messages from\n * @returns A stream of filtered messages valid for connection topics\n */\n public async getMessageStream(\n topicId: string,\n ): Promise<{ messages: HCSMessage[] }> {\n try {\n const messages = await this.mirrorNode.getTopicMessages(topicId);\n const validOps = ['message', 'close_connection', 'transaction'];\n\n const filteredMessages = messages.filter(msg => {\n if (msg.p !== 'hcs-10' || !validOps.includes(msg.op)) {\n return false;\n }\n\n if (msg.op === 'message' || msg.op === 'close_connection') {\n if (!msg.operator_id) {\n return false;\n }\n\n if (!this.isValidOperatorId(msg.operator_id)) {\n return false;\n }\n\n if (msg.op === 'message' && !msg.data) {\n return false;\n }\n }\n\n if (msg.op === 'transaction') {\n if (!msg.operator_id || !msg.schedule_id) {\n return false;\n }\n\n if (!this.isValidOperatorId(msg.operator_id)) {\n return false;\n }\n }\n\n return true;\n });\n\n return {\n messages: filteredMessages,\n };\n } catch (error: any) {\n if (this.logger) {\n this.logger.error(`Error fetching messages: ${error.message}`);\n }\n return { messages: [] };\n }\n }\n\n /**\n * Public method to retrieve topic information using the internal mirror node client.\n *\n * @param topicId The ID of the topic to query.\n * @returns Topic information or null if not found or an error occurs.\n */\n async getPublicTopicInfo(topicId: string): Promise<TopicResponse | null> {\n try {\n return await this.mirrorNode.getTopicInfo(topicId);\n } catch (error) {\n this.logger.error(\n `Error getting public topic info for ${topicId}:`,\n error,\n );\n return null;\n }\n }\n\n /**\n * Checks if a user can submit to a topic and determines if a fee is required\n * @param topicId The topic ID to check\n * @param userAccountId The account ID of the user attempting to submit\n * @returns Object with canSubmit, requiresFee, and optional reason\n */\n public async canSubmitToTopic(\n topicId: string,\n userAccountId: string,\n ): Promise<{ canSubmit: boolean; requiresFee: boolean; reason?: string }> {\n try {\n const topicInfo = await this.mirrorNode.getTopicInfo(topicId);\n\n if (!topicInfo) {\n return {\n canSubmit: false,\n requiresFee: false,\n reason: 'Topic does not exist',\n };\n }\n\n if (!topicInfo.submit_key?.key) {\n return { canSubmit: true, requiresFee: false };\n }\n\n try {\n const userPublicKey = await this.mirrorNode.getPublicKey(userAccountId);\n\n if (topicInfo.submit_key._type === 'ProtobufEncoded') {\n const keyBytes = Buffer.from(topicInfo.submit_key.key, 'hex');\n const hasAccess = await this.mirrorNode.checkKeyListAccess(\n keyBytes,\n userPublicKey,\n );\n\n if (hasAccess) {\n return { canSubmit: true, requiresFee: false };\n }\n } else {\n const topicSubmitKey = PublicKey.fromString(topicInfo.submit_key.key);\n if (userPublicKey.toString() === topicSubmitKey.toString()) {\n return { canSubmit: true, requiresFee: false };\n }\n }\n } catch (error) {\n this.logger.error(\n `Key validation error: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n\n if (\n topicInfo.fee_schedule_key?.key &&\n topicInfo.custom_fees?.fixed_fees?.length > 0\n ) {\n return {\n canSubmit: true,\n requiresFee: true,\n reason: 'Requires fee payment via HIP-991',\n };\n }\n\n return {\n canSubmit: false,\n requiresFee: false,\n reason: 'User does not have submit permission for this topic',\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n this.logger.error(`Topic submission validation error: ${errorMessage}`);\n return {\n canSubmit: false,\n requiresFee: false,\n reason: `Error: ${errorMessage}`,\n };\n }\n }\n\n /**\n * Get all messages from a topic\n * @param topicId The topic ID to get messages from\n * @returns All messages from the topic\n */\n public async getMessages(\n topicId: string,\n ): Promise<{ messages: HCSMessage[] }> {\n try {\n const messages = await this.mirrorNode.getTopicMessages(topicId);\n\n const validatedMessages = messages.filter(msg => {\n if (msg.p !== 'hcs-10') {\n return false;\n }\n\n if (msg.op === 'message') {\n if (!msg.data) {\n return false;\n }\n\n if (msg.operator_id) {\n if (!this.isValidOperatorId(msg.operator_id)) {\n return false;\n }\n }\n }\n\n return true;\n });\n\n return {\n messages: validatedMessages,\n };\n } catch (error: any) {\n if (this.logger) {\n this.logger.error(`Error fetching messages: ${error.message}`);\n }\n return { messages: [] };\n }\n }\n\n /**\n * Requests an account from the mirror node\n * @param account The account ID to request\n * @returns The account response\n */\n public async requestAccount(account: string): Promise<AccountResponse> {\n try {\n if (!account) {\n throw new Error('Account ID is required');\n }\n return await this.mirrorNode.requestAccount(account);\n } catch (e) {\n this.logger.error('Failed to fetch account', e);\n throw e;\n }\n }\n\n /**\n * Retrieves the memo for an account\n * @param accountId The account ID to retrieve the memo for\n * @returns The memo\n */\n public async getAccountMemo(accountId: string): Promise<string | null> {\n return await this.mirrorNode.getAccountMemo(accountId);\n }\n\n /**\n * Retrieves the profile for an account\n * @param accountId The account ID to retrieve the profile for\n * @param disableCache Whether to disable caching of the result\n * @returns The profile\n */\n public async retrieveProfile(\n accountId: string,\n disableCache?: boolean,\n ): Promise<ProfileResponse> {\n this.logger.debug(`Retrieving profile for account: ${accountId}`);\n\n const cacheKey = `${accountId}-${this.network}`;\n\n if (!disableCache) {\n const cachedProfileResponse = HCS10Cache.getInstance().get(cacheKey);\n if (cachedProfileResponse) {\n this.logger.debug(`Cache hit for profile: ${accountId}`);\n return cachedProfileResponse;\n }\n }\n try {\n const hcs11Client = new HCS11Client({\n network: this.network as 'mainnet' | 'testnet',\n auth: {\n operatorId: '0.0.0', // Read-only operations only\n },\n logLevel: 'info',\n });\n\n const profileResult = await hcs11Client.fetchProfileByAccountId(\n accountId,\n this.network,\n );\n\n if (!profileResult?.success) {\n this.logger.error(\n `Failed to retrieve profile for account ID: ${accountId}`,\n profileResult?.error,\n );\n return {\n profile: null,\n success: false,\n error:\n profileResult?.error ||\n `Failed to retrieve profile for account ID: ${accountId}`,\n };\n }\n\n const profile = profileResult.profile;\n let topicInfo: TopicInfo | null = null;\n\n if (\n profileResult.topicInfo?.inboundTopic &&\n profileResult.topicInfo?.outboundTopic &&\n profileResult.topicInfo?.profileTopicId\n ) {\n topicInfo = {\n inboundTopic: profileResult.topicInfo.inboundTopic,\n outboundTopic: profileResult.topicInfo.outboundTopic,\n profileTopicId: profileResult.topicInfo.profileTopicId,\n };\n }\n\n const responseToCache: ProfileResponse = {\n profile,\n topicInfo,\n success: true,\n };\n HCS10Cache.getInstance().set(cacheKey, responseToCache);\n return responseToCache;\n } catch (e: any) {\n const error = e as Error;\n const logMessage = `Failed to retrieve profile: ${error.message}`;\n this.logger.error(logMessage);\n return {\n profile: null,\n success: false,\n error: logMessage,\n };\n }\n }\n\n /**\n * @deprecated Use retrieveCommunicationTopics instead\n * @param accountId The account ID to retrieve the outbound connect topic for\n * @returns {TopicInfo} Topic Info from target profile.\n */\n public async retrieveOutboundConnectTopic(\n accountId: string,\n ): Promise<TopicInfo> {\n return await this.retrieveCommunicationTopics(accountId, true);\n }\n\n /**\n * Retrieves the communication topics for an account\n * @param accountId The account ID to retrieve the communication topics for\n * @param disableCache Whether to disable caching of the result\n * @returns {TopicInfo} Topic Info from target profile.\n */\n public async retrieveCommunicationTopics(\n accountId: string,\n disableCache?: boolean,\n ): Promise<TopicInfo> {\n try {\n const profileResponse = await this.retrieveProfile(\n accountId,\n disableCache,\n );\n\n if (!profileResponse?.success) {\n throw new Error(profileResponse.error || 'Failed to retrieve profile');\n }\n\n const profile = profileResponse.profile;\n\n if (!profile.inboundTopicId || !profile.outboundTopicId) {\n throw new Error(\n `Invalid HCS-11 profile for HCS-10 agent: missing inboundTopicId or outboundTopicId`,\n );\n }\n\n if (!profileResponse.topicInfo) {\n throw new Error(\n `TopicInfo is missing in the profile for account ${accountId}`,\n );\n }\n\n return profileResponse.topicInfo;\n } catch (e: any) {\n const error = e as Error;\n const logMessage = `Failed to retrieve topic info: ${error.message}`;\n this.logger.error(logMessage);\n throw error;\n }\n }\n\n /**\n * Retrieves outbound messages for an agent\n * @param agentAccountId The account ID of the agent\n * @returns The outbound messages\n */\n public async retrieveOutboundMessages(\n agentAccountId: string,\n ): Promise<HCSMessage[]> {\n try {\n const topicInfo = await this.retrieveCommunicationTopics(agentAccountId);\n if (!topicInfo) {\n this.logger.warn(\n `No outbound connect topic found for agentAccountId: ${agentAccountId}`,\n );\n return [];\n }\n const response = await this.getMessages(topicInfo.outboundTopic);\n return response.messages.filter(\n msg =>\n msg.p === 'hcs-10' &&\n (msg.op === 'connection_request' ||\n msg.op === 'connection_created' ||\n msg.op === 'message'),\n );\n } catch (e: any) {\n const error = e as Error;\n const logMessage = `Failed to retrieve outbound messages: ${error.message}`;\n this.logger.error(logMessage);\n return [];\n }\n }\n\n /**\n * Checks if a connection has been created for an agent\n * @param agentAccountId The account ID of the agent\n * @param connectionId The ID of the connection\n * @returns True if the connection has been created, false otherwise\n */\n public async hasConnectionCreated(\n agentAccountId: string,\n connectionId: number,\n ): Promise<boolean> {\n try {\n const outBoundTopic =\n await this.retrieveCommunicationTopics(agentAccountId);\n const messages = await this.retrieveOutboundMessages(\n outBoundTopic.outboundTopic,\n );\n return messages.some(\n msg =>\n msg.op === 'connection_created' && msg.connection_id === connectionId,\n );\n } catch (e: any) {\n const error = e as Error;\n const logMessage = `Failed to check connection created: ${error.message}`;\n this.logger.error(logMessage);\n return false;\n }\n }\n\n /**\n * Gets message content, resolving any HRL references if needed\n * @param data The data string that may contain an HRL reference\n * @param forceRaw Whether to force returning raw binary data\n * @returns The resolved content\n */\n async getMessageContent(\n data: string,\n forceRaw = false,\n ): Promise<string | ArrayBuffer> {\n if (!data.match(/^hcs:\\/\\/(\\d+)\\/([0-9]+\\.[0-9]+\\.[0-9]+)$/)) {\n return data;\n }\n\n try {\n const resolver = new HRLResolver(this.logger.getLevel());\n\n if (!resolver.isValidHRL(data)) {\n return data;\n }\n\n const result = await resolver.resolveHRL(data, {\n network: this.network as 'mainnet' | 'testnet',\n returnRaw: forceRaw,\n });\n\n return result.content;\n } catch (e: any) {\n const error = e as Error;\n const logMessage = `Error resolving HRL reference: ${error.message}`;\n this.logger.error(logMessage);\n throw new Error(logMessage);\n }\n }\n\n /**\n * Gets message content with its content type, resolving any HRL references if needed\n * @param data The data string that may contain an HRL reference\n * @param forceRaw Whether to force returning raw binary data\n * @returns The resolved content along with content type information\n */\n async getMessageContentWithType(\n data: string,\n forceRaw = false,\n ): Promise<{\n content: string | ArrayBuffer;\n contentType: string;\n isBinary: boolean;\n }> {\n if (!data.match(/^hcs:\\/\\/(\\d+)\\/([0-9]+\\.[0-9]+\\.[0-9]+)$/)) {\n return {\n content: data,\n contentType: 'text/plain',\n isBinary: false,\n };\n }\n\n try {\n const resolver = new HRLResolver(this.logger.getLevel());\n\n return await resolver.getContentWithType(data, {\n network: this.network as 'mainnet' | 'testnet',\n returnRaw: forceRaw,\n });\n } catch (e: any) {\n const error = e as Error;\n const logMessage = `Error resolving HRL reference with type: ${error.message}`;\n this.logger.error(logMessage);\n throw new Error(logMessage);\n }\n }\n\n /**\n * Submits a connection request to an inbound topic\n * @param inboundTopicId The ID of the inbound topic\n * @param memo An optional memo for the message\n * @returns The transaction receipt\n */\n async submitConnectionRequest(\n inboundTopicId: string,\n memo: string,\n ): Promise<TransactionReceipt> {\n const accountResponse = this.getAccountAndSigner();\n if (!accountResponse?.accountId) {\n throw new Error('Operator account ID is not set');\n }\n const operatorId = await this.getOperatorId();\n const accountId = accountResponse.accountId;\n\n const submissionCheck = await this.canSubmitToTopic(\n inboundTopicId,\n accountId,\n );\n\n if (!submissionCheck?.canSubmit) {\n throw new Error(`Cannot submit to topic: ${submissionCheck.reason}`);\n }\n\n const inboundAccountOwner =\n await this.retrieveInboundAccountId(inboundTopicId);\n\n if (!inboundAccountOwner) {\n throw new Error('Failed to retrieve topic info account ID');\n }\n\n const connectionRequestMessage = {\n p: 'hcs-10',\n op: 'connection_request',\n operator_id: operatorId,\n m: memo,\n };\n\n const requiresFee = submissionCheck.requiresFee;\n const response = await this.submitPayload(\n inboundTopicId,\n connectionRequestMessage,\n undefined,\n requiresFee,\n );\n\n this.logger.info(\n `Submitted connection request to topic ID: ${inboundTopicId}`,\n );\n\n const outboundTopic = await this.retrieveCommunicationTopics(accountId);\n\n if (!outboundTopic) {\n throw new Error('Failed to retrieve outbound topic');\n }\n\n const responseSequenceNumber = response.topicSequenceNumber?.toNumber();\n\n if (!responseSequenceNumber) {\n throw new Error('Failed to get response sequence number');\n }\n\n const requestorOperatorId = `${inboundTopicId}@${inboundAccountOwner}`;\n\n await this.submitPayload(outboundTopic.outboundTopic, {\n ...connectionRequestMessage,\n outbound_topic_id: outboundTopic.outboundTopic,\n connection_request_id: responseSequenceNumber,\n operator_id: requestorOperatorId,\n });\n\n return response;\n }\n\n /**\n * Records an outbound connection confirmation\n * @param outboundTopicId The ID of the outbound topic\n * @param connectionRequestId The ID of the connection request\n * @param confirmedRequestId The ID of the confirmed request\n * @param connectionTopicId The ID of the connection topic\n * @param operatorId The operator ID of the original message sender.\n * @param memo An optional memo for the message\n */\n public async recordOutboundConnectionConfirmation({\n outboundTopicId,\n requestorOutboundTopicId,\n connectionRequestId,\n confirmedRequestId,\n connectionTopicId,\n operatorId,\n memo,\n }: {\n outboundTopicId: string;\n requestorOutboundTopicId: string;\n connectionRequestId: number;\n confirmedRequestId: number;\n connectionTopicId: string;\n operatorId: string;\n memo: string;\n }): Promise<TransactionReceipt> {\n const payload = {\n p: 'hcs-10',\n op: 'connection_created',\n connection_topic_id: connectionTopicId,\n outbound_topic_id: outboundTopicId,\n requestor_outbound_topic_id: requestorOutboundTopicId,\n confirmed_request_id: confirmedRequestId,\n connection_request_id: connectionRequestId,\n operator_id: operatorId,\n m: memo,\n };\n return await this.submitPayload(outboundTopicId, payload);\n }\n\n /**\n * Waits for confirmation of a connection request\n * @param inboundTopicId Inbound topic ID\n * @param connectionRequestId Connection request ID\n * @param maxAttempts Maximum number of attempts\n * @param delayMs Delay between attempts in milliseconds\n * @returns Connection confirmation details\n */\n async waitForConnectionConfirmation(\n inboundTopicId: string,\n connectionRequestId: number,\n maxAttempts = 60,\n delayMs = 2000,\n recordConfirmation = true,\n ): Promise<WaitForConnectionConfirmationResponse> {\n this.logger.info(\n `Waiting for connection confirmation on inbound topic ${inboundTopicId} for request ID ${connectionRequestId}`,\n );\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n this.logger.info(\n `Attempt ${attempt + 1}/${maxAttempts} to find connection confirmation`,\n );\n const messages = await this.mirrorNode.getTopicMessages(inboundTopicId);\n\n const connectionCreatedMessages = messages.filter(\n m => m.op === 'connection_created',\n );\n\n this.logger.info(\n `Found ${connectionCreatedMessages.length} connection_created messages`,\n );\n\n if (connectionCreatedMessages.length > 0) {\n for (const message of connectionCreatedMessages) {\n if (Number(message.connection_id) === Number(connectionRequestId)) {\n const confirmationResult = {\n connectionTopicId: message.connection_topic_id,\n sequence_number: Number(message.sequence_number),\n confirmedBy: message.operator_id,\n memo: message.m,\n };\n\n const confirmedByAccountId = this.extractAccountFromOperatorId(\n confirmationResult.confirmedBy,\n );\n\n const account = this.getAccountAndSigner();\n const confirmedByConnectionTopics =\n await this.retrieveCommunicationTopics(confirmedByAccountId);\n\n const agentConnectionTopics =\n await this.retrieveCommunicationTopics(account.accountId);\n\n this.logger.info(\n 'Connection confirmation found',\n confirmationResult,\n );\n\n if (recordConfirmation) {\n /**\n * Record's the confirmation of the connection request from the\n * confirmedBy account to the agent account.\n */\n await this.recordOutboundConnectionConfirmation({\n requestorOutboundTopicId:\n confirmedByConnectionTopics.outboundTopic,\n outboundTopicId: agentConnectionTopics.outboundTopic,\n connectionRequestId,\n confirmedRequestId: confirmationResult.sequence_number,\n connectionTopicId: confirmationResult.connectionTopicId,\n operatorId: confirmationResult.confirmedBy,\n memo: confirmationResult.memo || 'Connection confirmed',\n });\n }\n\n return confirmationResult;\n }\n }\n }\n\n if (attempt < maxAttempts - 1) {\n this.logger.info(\n `No matching confirmation found, waiting ${delayMs}ms before retrying...`,\n );\n await new Promise(resolve => setTimeout(resolve, delayMs));\n }\n }\n\n throw new Error(\n `Connection confirmation not found after ${maxAttempts} attempts for request ID ${connectionRequestId}`,\n );\n }\n\n /**\n * Retrieves the operator ID for the current agent\n * @param disableCache Whether to disable caching of the result\n * @returns The operator ID\n */\n public async getOperatorId(disableCache?: boolean): Promise<string> {\n if (this.operatorId && !disableCache) {\n return this.operatorId;\n }\n\n const accountResponse = this.getAccountAndSigner();\n\n if (!accountResponse.accountId) {\n throw new Error('Operator ID not found');\n }\n\n const profile = await this.retrieveProfile(accountResponse.accountId);\n\n if (!profile.success) {\n throw new Error('Failed to retrieve profile');\n }\n\n const operatorId = `${profile.topicInfo?.inboundTopic}@${accountResponse.accountId}`;\n this.operatorId = operatorId;\n return operatorId;\n }\n\n /**\n * Retrieves the account ID of the owner of an inbound topic\n * @param inboundTopicId The ID of the inbound topic\n * @returns The account ID of the owner of the inbound topic\n */\n public async retrieveInboundAccountId(\n inboundTopicId: string,\n ): Promise<string> {\n const topicInfo = await this.mirrorNode.getTopicInfo(inboundTopicId);\n\n if (!topicInfo?.memo) {\n throw new Error('Failed to retrieve topic info');\n }\n\n const topicInfoMemo = topicInfo.memo.toString();\n const topicInfoParts = topicInfoMemo.split(':');\n const inboundAccountOwner = topicInfoParts?.[4];\n\n if (!inboundAccountOwner) {\n throw new Error('Failed to retrieve topic info account ID');\n }\n\n return inboundAccountOwner;\n }\n\n public clearCache(): void {\n HCS10Cache.getInstance().clear();\n }\n\n /**\n * Generates a standard HCS-10 memo string.\n * @param type The type of topic memo ('inbound', 'outbound', 'connection').\n * @param options Configuration options for the memo.\n * @returns The formatted memo string.\n * @protected\n */\n protected _generateHcs10Memo(\n type: Hcs10MemoType,\n options: {\n ttl?: number;\n accountId?: string;\n inboundTopicId?: string;\n connectionId?: number;\n },\n ): string {\n const ttl = options.ttl ?? 60;\n\n switch (type) {\n case Hcs10MemoType.INBOUND:\n if (!options.accountId) {\n throw new Error('accountId is required for inbound memo');\n }\n return `hcs-10:0:${ttl}:0:${options.accountId}`;\n case Hcs10MemoType.OUTBOUND:\n return `hcs-10:0:${ttl}:1`;\n case Hcs10MemoType.CONNECTION:\n if (!options.inboundTopicId || options.connectionId === undefined) {\n throw new Error(\n 'inboundTopicId and connectionId are required for connection memo',\n );\n }\n return `hcs-10:1:${ttl}:2:${options.inboundTopicId}:${options.connectionId}`;\n default:\n throw new Error(`Invalid HCS-10 memo type: ${type}`);\n }\n }\n\n protected async checkRegistrationStatus(\n transactionId: string,\n network: string,\n baseUrl: string,\n ): Promise<{ status: 'pending' | 'success' | 'failed' }> {\n try {\n const response = await fetch(`${baseUrl}/api/request-confirm`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-Network': network,\n },\n body: JSON.stringify({ transaction_id: transactionId }),\n });\n\n if (!response.ok) {\n throw new Error(\n `Failed to confirm registration: ${response.statusText}`,\n );\n }\n\n return await response.json();\n } catch (e: any) {\n const error = e as Error;\n const logMessage = `Error checking registration status: ${error.message}`;\n this.logger.error(logMessage);\n throw error;\n }\n }\n\n /**\n * Validates if an operator_id follows the correct format (agentTopicId@accountId)\n * @param operatorId The operator ID to validate\n * @returns True if the format is valid, false otherwise\n */\n protected isValidOperatorId(operatorId: string): boolean {\n if (!operatorId) {\n return false;\n }\n\n const parts = operatorId.split('@');\n\n if (parts.length !== 2) {\n return false;\n }\n\n const agentTopicId = parts[0];\n const accountId = parts[1];\n\n if (!agentTopicId) {\n return false;\n }\n\n if (!accountId) {\n return false;\n }\n\n const hederaIdPattern = /^[0-9]+\\.[0-9]+\\.[0-9]+$/;\n\n if (!hederaIdPattern.test(accountId)) {\n return false;\n }\n\n if (!hederaIdPattern.test(agentTopicId)) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Retrieves all transaction requests from a topic\n * @param topicId The topic ID to retrieve transactions from\n * @param limit Optional maximum number of messages to retrieve\n * @returns Array of transaction requests sorted by timestamp (newest first)\n */\n public async getTransactionRequests(\n topicId: string,\n limit?: number,\n ): Promise<TransactMessage[]> {\n this.logger.debug(`Retrieving transaction requests from topic ${topicId}`);\n\n const { messages } = await this.getMessageStream(topicId);\n\n const transactOperations = (\n messages\n .filter(m => m.op === 'transaction' && m.schedule_id)\n .map(m => ({\n operator_id: m.operator_id || '',\n schedule_id: m.schedule_id || '',\n data: m.data || '',\n memo: m.m,\n sequence_number: Number(m.sequence_number),\n })) as unknown as TransactMessage[]\n ).sort((a, b) => {\n if (a.sequence_number && b.sequence_number) {\n return b.sequence_number - a.sequence_number;\n }\n return 0;\n });\n\n const result = limit\n ? transactOperations.slice(0, limit)\n : transactOperations;\n\n return result;\n }\n}\n\nexport class HCS10Cache {\n private static instance: HCS10Cache;\n private cache: Map<string, ProfileResponse>;\n private cacheExpiry: Map<string, number>;\n private readonly CACHE_TTL = 3600000;\n\n private constructor() {\n this.cache = new Map();\n this.cacheExpiry = new Map();\n }\n\n static getInstance(): HCS10Cache {\n if (!HCS10Cache.instance) {\n HCS10Cache.instance = new HCS10Cache();\n }\n return HCS10Cache.instance;\n }\n\n set(key: string, value: ProfileResponse): void {\n this.cache.set(key, value);\n this.cacheExpiry.set(key, Date.now() + this.CACHE_TTL);\n }\n\n get(key: string): ProfileResponse | undefined {\n const expiry = this.cacheExpiry.get(key);\n if (expiry && expiry > Date.now()) {\n return this.cache.get(key);\n }\n if (expiry) {\n this.cache.delete(key);\n this.cacheExpiry.delete(key);\n }\n return undefined;\n }\n\n clear(): void {\n this.cache.clear();\n this.cacheExpiry.clear();\n }\n}\n","export class PayloadSizeError extends Error {\n constructor(\n message: string,\n public payloadSize: number,\n ) {\n super(message);\n this.name = 'PayloadSizeError';\n }\n}\n\nexport class AccountCreationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'AccountCreationError';\n }\n}\n\nexport class TopicCreationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'TopicCreationError';\n }\n}\n\nexport class ConnectionConfirmationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ConnectionConfirmationError';\n }\n}\n\n// Add more custom error classes as needed\n","import {\n InboundTopicType,\n AgentConfiguration,\n AgentMetadata,\n AIAgentCapability,\n SocialPlatform,\n} from './types';\nimport { Logger } from '../utils/logger';\nimport { FeeConfigBuilderInterface } from '../fees';\nimport { NetworkType } from '../utils/types';\n\n/**\n * AgentBuilder is a builder class for creating agent configurations.\n * It provides a fluent interface for setting various properties of the agent.\n *\n * Example usage:\n * ```typescript\n * const agentBuilder = new AgentBuilder();\n * agentBuilder.setName('My Agent');\n * agentBuilder.setDescription('This is my agent');\n * agentBuilder.setCapabilities([AIAgentCapability.CREATE_CONTENT]);\n * agentBuilder.setModel('gpt-4o');\n * agentBuilder.setCreator('John Doe');\n * agentBuilder.addSocial('twitter', 'JohnDoe');\n * agentBuilder.addProperty('key', 'value');\n * const agentConfig = agentBuilder.build();\n * ```\n *\n */\nexport class AgentBuilder {\n private config: Partial<AgentConfiguration> = {};\n private logger: Logger;\n\n constructor() {\n this.logger = Logger.getInstance({\n module: 'AgentBuilder',\n });\n }\n\n setName(name: string): this {\n this.config.name = name;\n return this;\n }\n\n setAlias(alias: string): this {\n this.config.alias = alias;\n return this;\n }\n\n setBio(bio: string): this {\n this.config.bio = bio;\n return this;\n }\n\n /**\n * @deprecated Use setBio instead\n */\n setDescription(description: string): this {\n this.config.bio = description;\n return this;\n }\n\n setCapabilities(capabilities: AIAgentCapability[]): this {\n this.config.capabilities = capabilities;\n return this;\n }\n\n /**\n * @deprecated Use setType instead\n */\n setAgentType(type: 'autonomous' | 'manual'): this {\n if (!this.config.metadata) {\n this.config.metadata = { type };\n } else {\n this.config.metadata.type = type;\n }\n return this;\n }\n\n setType(type: 'autonomous' | 'manual'): this {\n if (!this.config.metadata) {\n this.config.metadata = { type };\n } else {\n this.config.metadata.type = type;\n }\n return this;\n }\n\n setModel(model: string): this {\n if (!this.config.metadata) {\n this.config.metadata = { type: 'manual' };\n }\n this.config.metadata.model = model;\n return this;\n }\n\n setCreator(creator: string): this {\n if (!this.config.metadata) {\n this.config.metadata = { type: 'manual' };\n }\n this.config.metadata.creator = creator;\n return this;\n }\n\n addSocial(platform: SocialPlatform, handle: string): this {\n if (!this.config.metadata) {\n this.config.metadata = { type: 'manual' };\n }\n if (!this.config.metadata.socials) {\n this.config.metadata.socials = {};\n }\n this.config.metadata.socials[platform] = handle;\n return this;\n }\n\n addProperty(key: string, value: any): this {\n if (!this.config.metadata) {\n this.config.metadata = { type: 'manual' };\n }\n if (!this.config.metadata.properties) {\n this.config.metadata.properties = {};\n }\n this.config.metadata.properties[key] = value;\n return this;\n }\n\n setMetadata(metadata: AgentMetadata): this {\n this.config.metadata = metadata;\n return this;\n }\n\n setProfilePicture(pfpBuffer: Buffer, pfpFileName: string): this {\n this.config.pfpBuffer = pfpBuffer;\n this.config.pfpFileName = pfpFileName;\n return this;\n }\n\n setExistingProfilePicture(pfpTopicId: string): this {\n this.config.existingPfpTopicId = pfpTopicId;\n return this;\n }\n\n setNetwork(network: NetworkType): this {\n this.config.network = network;\n return this;\n }\n\n setInboundTopicType(inboundTopicType: InboundTopicType): this {\n this.config.inboundTopicType = inboundTopicType;\n return this;\n }\n\n setFeeConfig(feeConfigBuilder: FeeConfigBuilderInterface): this {\n this.config.feeConfig = feeConfigBuilder;\n return this;\n }\n\n setConnectionFeeConfig(feeConfigBuilder: FeeConfigBuilderInterface): this {\n this.config.connectionFeeConfig = feeConfigBuilder;\n return this;\n }\n\n setExistingAccount(accountId: string, privateKey: string): this {\n this.config.existingAccount = { accountId, privateKey };\n return this;\n }\n\n build(): AgentConfiguration {\n if (!this.config.name) {\n throw new Error('Agent display name is required');\n }\n\n if (!this.config.bio) {\n this.logger?.warn('Agent description is not set');\n }\n\n if (!this.config.pfpBuffer && !this.config.existingPfpTopicId) {\n this.logger.warn('No profile picture provided or referenced.');\n }\n\n if (!this.config.network) {\n throw new Error('Network is required');\n }\n\n if (!this.config.inboundTopicType) {\n this.config.inboundTopicType = InboundTopicType.PUBLIC;\n }\n\n if (!this.config.capabilities) {\n this.config.capabilities = [];\n }\n\n if (!this.config.metadata) {\n this.config.metadata = { type: 'manual' };\n } else if (!this.config.metadata.type) {\n this.config.metadata.type = 'manual';\n }\n\n if (\n this.config.inboundTopicType === InboundTopicType.FEE_BASED &&\n !this.config.feeConfig\n ) {\n throw new Error('Fee configuration is required for fee-based topics');\n }\n\n return this.config as AgentConfiguration;\n }\n}\n","import {\n Client,\n AccountCreateTransaction,\n PrivateKey,\n Hbar,\n KeyList,\n TopicCreateTransaction,\n TopicMessageSubmitTransaction,\n TopicId,\n Transaction,\n TransactionResponse,\n TransactionReceipt,\n PublicKey,\n AccountId,\n CustomFixedFee,\n TokenId,\n ScheduleCreateTransaction,\n Timestamp,\n} from '@hashgraph/sdk';\nimport {\n PayloadSizeError,\n AccountCreationError,\n TopicCreationError,\n ConnectionConfirmationError,\n} from './errors';\nimport {\n InscriptionSDK,\n RetrievedInscriptionResult,\n} from '@kiloscribe/inscription-sdk';\nimport { Logger, LogLevel, detectKeyTypeFromString } from '../utils';\nimport { HCS10BaseClient } from './base-client';\nimport * as mime from 'mime-types';\nimport {\n HCSClientConfig,\n CreateAccountResponse,\n CreateAgentResponse,\n StoreHCS11ProfileResponse,\n AgentRegistrationResult,\n HandleConnectionRequestResponse,\n WaitForConnectionConfirmationResponse,\n GetAccountAndSignerResponse,\n AgentCreationState,\n RegistrationProgressCallback,\n InscribePfpResponse,\n} from './types';\nimport { MirrorNodeConfig } from '../services';\nimport {\n HCS11Client,\n AgentMetadata as HCS11AgentMetadata,\n SocialLink,\n SocialPlatform,\n InboundTopicType,\n AgentMetadata,\n} from '../hcs-11';\nimport { FeeConfigBuilderInterface, TopicFeeConfig } from '../fees';\nimport { accountIdsToExemptKeys } from '../utils/topic-fee-utils';\nimport { Hcs10MemoType } from './base-client';\nimport { AgentBuilder } from '../hcs-11/agent-builder';\nimport { inscribe } from '../inscribe/inscriber';\nimport { TokenFeeConfig } from '../fees/types';\nimport { addSeconds } from 'date-fns';\n\nexport class HCS10Client extends HCS10BaseClient {\n private client: Client;\n private operatorPrivateKey: string;\n private operatorAccountId: string;\n declare protected network: string;\n declare protected logger: Logger;\n protected guardedRegistryBaseUrl: string;\n private hcs11Client: HCS11Client;\n private keyType: 'ed25519' | 'ecdsa';\n\n constructor(config: HCSClientConfig) {\n super({\n network: config.network,\n logLevel: config.logLevel,\n prettyPrint: config.prettyPrint,\n feeAmount: config.feeAmount,\n mirrorNode: config.mirrorNode,\n silent: config.silent,\n keyType: config.keyType,\n });\n this.client =\n config.network === 'mainnet' ? Client.forMainnet() : Client.forTestnet();\n this.operatorPrivateKey = config.operatorPrivateKey;\n\n this.operatorAccountId = config.operatorId;\n if (config.keyType) {\n this.keyType = config.keyType;\n const PK =\n this.keyType === 'ecdsa'\n ? PrivateKey.fromStringECDSA(this.operatorPrivateKey)\n : PrivateKey.fromStringED25519(this.operatorPrivateKey);\n this.client.setOperator(config.operatorId, PK);\n } else {\n try {\n const keyDetection = detectKeyTypeFromString(this.operatorPrivateKey);\n this.client.setOperator(config.operatorId, keyDetection.privateKey);\n this.keyType = keyDetection.detectedType;\n } catch (error) {\n this.logger.warn(\n 'Failed to detect key type from private key format, will query mirror node',\n );\n this.keyType = 'ed25519';\n }\n\n this.initializeOperator();\n }\n\n this.network = config.network;\n this.logger = Logger.getInstance({\n level: config.logLevel || 'info',\n module: 'HCS-SDK',\n silent: config.silent,\n });\n this.guardedRegistryBaseUrl =\n config.guardedRegistryBaseUrl || 'https://moonscape.tech';\n\n this.hcs11Client = new HCS11Client({\n network: config.network,\n auth: {\n operatorId: config.operatorId,\n privateKey: config.operatorPrivateKey,\n },\n logLevel: config.logLevel,\n silent: config.silent,\n keyType: config.keyType,\n });\n }\n\n public async initializeOperator(): Promise<{\n accountId: string;\n privateKey: string;\n keyType: 'ed25519' | 'ecdsa';\n client: Client;\n }> {\n const account = await this.requestAccount(this.operatorAccountId);\n const keyType = account?.key?._type;\n\n if (keyType.includes('ECDSA')) {\n this.keyType = 'ecdsa';\n } else if (keyType.includes('ED25519')) {\n this.keyType = 'ed25519';\n } else {\n this.keyType = 'ed25519';\n }\n\n const PK =\n this.keyType === 'ecdsa'\n ? PrivateKey.fromStringECDSA(this.operatorPrivateKey)\n : PrivateKey.fromStringED25519(this.operatorPrivateKey);\n\n this.logger.debug(\n `Setting operator: ${this.operatorId} with key type: ${this.keyType}`,\n );\n\n this.client.setOperator(this.operatorAccountId, PK);\n\n return {\n accountId: this.operatorAccountId,\n privateKey: this.operatorPrivateKey,\n keyType: this.keyType,\n client: this.client,\n };\n }\n\n public getClient() {\n return this.client;\n }\n\n /**\n * Creates a new Hedera account\n * @param initialBalance Optional initial balance in HBAR (default: 50)\n * @returns Object with account ID and private key\n */\n async createAccount(\n initialBalance: number = 50,\n ): Promise<CreateAccountResponse> {\n if (!this.keyType) {\n await this.initializeOperator();\n }\n\n this.logger.info(\n `Creating new account with ${initialBalance} HBAR initial balance`,\n );\n const newKey = PrivateKey.generateED25519();\n\n const accountTransaction = new AccountCreateTransaction()\n .setKeyWithoutAlias(newKey.publicKey)\n .setInitialBalance(new Hbar(initialBalance));\n\n this.logger.debug('Executing account creation transaction');\n const accountResponse = await accountTransaction.execute(this.client);\n const accountReceipt = await accountResponse.getReceipt(this.client);\n const newAccountId = accountReceipt.accountId;\n\n if (!newAccountId) {\n this.logger.error('Account creation failed: accountId is null');\n throw new AccountCreationError(\n 'Failed to create account: accountId is null',\n );\n }\n\n this.logger.info(\n `Account created successfully: ${newAccountId.toString()}`,\n );\n return {\n accountId: newAccountId.toString(),\n privateKey: newKey.toString(),\n };\n }\n\n /**\n * Creates an inbound topic for an agent\n * @param accountId The account ID associated with the inbound topic\n * @param topicType Type of inbound topic (public, controlled, or fee-based)\n * @param ttl Optional Time-To-Live for the topic memo, defaults to 60\n * @param feeConfigBuilder Optional fee configuration builder for fee-based topics\n * @returns The topic ID of the created inbound topic\n */\n async createInboundTopic(\n accountId: string,\n topicType: InboundTopicType,\n ttl: number = 60,\n feeConfigBuilder?: FeeConfigBuilderInterface,\n ): Promise<string> {\n if (!this.keyType) {\n await this.initializeOperator();\n }\n\n const memo = this._generateHcs10Memo(Hcs10MemoType.INBOUND, {\n accountId,\n ttl,\n });\n\n let submitKey: boolean | PublicKey | KeyList | undefined;\n let finalFeeConfig: TopicFeeConfig | undefined;\n\n switch (topicType) {\n case InboundTopicType.PUBLIC:\n submitKey = false;\n break;\n case InboundTopicType.CONTROLLED:\n submitKey = true;\n break;\n case InboundTopicType.FEE_BASED:\n submitKey = false;\n if (!feeConfigBuilder) {\n throw new Error(\n 'Fee configuration builder is required for fee-based topics',\n );\n }\n\n const internalFees = (feeConfigBuilder as any)\n .customFees as TokenFeeConfig[];\n internalFees.forEach(fee => {\n if (!fee.feeCollectorAccountId) {\n this.logger.debug(\n `Defaulting fee collector for token ${\n fee.feeTokenId || 'HBAR'\n } to agent ${accountId}`,\n );\n fee.feeCollectorAccountId = accountId;\n }\n });\n\n finalFeeConfig = feeConfigBuilder.build();\n break;\n default:\n throw new Error(`Unsupported inbound topic type: ${topicType}`);\n }\n\n return this.createTopic(memo, true, submitKey, finalFeeConfig);\n }\n\n /**\n * Creates a new agent with inbound and outbound topics\n * @param builder The agent builder object\n * @param ttl Optional Time-To-Live for the topic memos, defaults to 60\n * @param existingState Optional existing state to resume from\n * @returns Object with topic IDs\n */\n async createAgent(\n builder: AgentBuilder,\n ttl: number = 60,\n existingState?: Partial<AgentCreationState>,\n ): Promise<CreateAgentResponse> {\n if (!this.keyType) {\n await this.initializeOperator();\n }\n\n const config = builder.build();\n\n let outboundTopicId = existingState?.outboundTopicId || '';\n let inboundTopicId = existingState?.inboundTopicId || '';\n let pfpTopicId =\n existingState?.pfpTopicId || config.existingPfpTopicId || '';\n let profileTopicId = existingState?.profileTopicId || '';\n\n const accountId = this.client.operatorAccountId?.toString();\n if (!accountId) {\n throw new Error('Failed to retrieve operator account ID');\n }\n\n if (!outboundTopicId) {\n const outboundMemo = this._generateHcs10Memo(Hcs10MemoType.OUTBOUND, {\n ttl,\n });\n outboundTopicId = await this.createTopic(outboundMemo, true, true);\n this.logger.info(`Created new outbound topic ID: ${outboundTopicId}`);\n } else {\n this.logger.info(`Using existing outbound topic ID: ${outboundTopicId}`);\n }\n\n if (!inboundTopicId) {\n inboundTopicId = await this.createInboundTopic(\n accountId,\n config.inboundTopicType,\n ttl,\n config.inboundTopicType === InboundTopicType.FEE_BASED\n ? config.feeConfig\n : undefined,\n );\n this.logger.info(`Created new inbound topic ID: ${inboundTopicId}`);\n } else {\n this.logger.info(`Using existing inbound topic ID: ${inboundTopicId}`);\n }\n\n if (!pfpTopicId && config.pfpBuffer && config.pfpBuffer.length > 0) {\n this.logger.info('Inscribing new profile picture');\n const pfpResult = await this.inscribePfp(\n config.pfpBuffer,\n config.pfpFileName,\n );\n pfpTopicId = pfpResult.pfpTopicId;\n this.logger.info(\n `Profile picture inscribed with topic ID: ${pfpTopicId}`,\n );\n } else if (pfpTopicId) {\n this.logger.info(\n `Using existing profile picture with topic ID: ${pfpTopicId}`,\n );\n }\n\n if (!profileTopicId) {\n const profileResult = await this.storeHCS11Profile(\n config.name,\n config.bio,\n inboundTopicId,\n outboundTopicId,\n config.capabilities,\n config.metadata,\n config.pfpBuffer && config.pfpBuffer.length > 0 && !pfpTopicId\n ? config.pfpBuffer\n : undefined,\n config.pfpFileName,\n pfpTopicId,\n );\n profileTopicId = profileResult.profileTopicId;\n this.logger.info(`Profile stored with topic ID: ${profileTopicId}`);\n } else {\n this.logger.info(`Using existing profile topic ID: ${profileTopicId}`);\n }\n\n return {\n inboundTopicId,\n outboundTopicId,\n pfpTopicId,\n profileTopicId,\n };\n }\n\n /**\n * Inscribes a profile picture to Hedera\n * @param buffer Profile picture buffer\n * @param fileName Filename\n * @returns Response with topic ID and transaction ID\n */\n async inscribePfp(\n buffer: Buffer,\n fileName: string,\n ): Promise<InscribePfpResponse> {\n try {\n this.logger.info('Inscribing profile picture using HCS-11 client');\n\n const imageResult = await this.hcs11Client.inscribeImage(\n buffer,\n fileName,\n );\n\n if (!imageResult.success) {\n this.logger.error(\n `Failed to inscribe profile picture: ${imageResult.error}`,\n );\n throw new Error(\n imageResult?.error || 'Failed to inscribe profile picture',\n );\n }\n\n this.logger.info(\n `Successfully inscribed profile picture with topic ID: ${imageResult.imageTopicId}`,\n );\n return {\n pfpTopicId: imageResult.imageTopicId,\n transactionId: imageResult.transactionId,\n success: true,\n };\n } catch (e: any) {\n const error = e as Error;\n const logMessage = `Error inscribing profile picture: ${error.message}`;\n this.logger.error(logMessage);\n return {\n pfpTopicId: '',\n transactionId: '',\n success: false,\n error: error.message,\n };\n }\n }\n\n /**\n * Stores an HCS-11 profile for an agent\n * @param agentName Agent name\n * @param agentBio Agent description\n * @param inboundTopicId Inbound topic ID\n * @param outboundTopicId Outbound topic ID\n * @param capabilities Agent capability tags\n * @param metadata Additional metadata\n * @param pfpBuffer Optional profile picture buffer\n * @param pfpFileName Optional profile picture filename\n * @returns Response with topic IDs and transaction ID\n */\n async storeHCS11Profile(\n agentName: string,\n agentBio: string,\n inboundTopicId: string,\n outboundTopicId: string,\n capabilities: number[] = [],\n metadata: AgentMetadata,\n pfpBuffer?: Buffer,\n pfpFileName?: string,\n existingPfpTopicId?: string,\n ): Promise<StoreHCS11ProfileResponse> {\n try {\n let pfpTopicId = existingPfpTopicId || '';\n\n if (!pfpTopicId && pfpBuffer && pfpFileName) {\n this.logger.info('Inscribing profile picture for HCS-11 profile');\n const pfpResult = await this.inscribePfp(pfpBuffer, pfpFileName);\n if (!pfpResult.success) {\n this.logger.warn(\n `Failed to inscribe profile picture: ${pfpResult.error}, proceeding without pfp`,\n );\n } else {\n pfpTopicId = pfpResult.pfpTopicId;\n }\n } else if (existingPfpTopicId) {\n this.logger.info(\n `Using existing profile picture with topic ID: ${existingPfpTopicId} for HCS-11 profile`,\n );\n pfpTopicId = existingPfpTopicId;\n }\n\n const agentType = this.hcs11Client.getAgentTypeFromMetadata({\n type: metadata.type || 'autonomous',\n } as HCS11AgentMetadata);\n\n const formattedSocials: SocialLink[] | undefined = metadata.socials\n ? (Object.entries(metadata.socials)\n .filter(([_, handle]) => handle)\n .map(([platform, handle]) => ({\n platform: platform as SocialPlatform,\n handle: handle as string,\n })) as SocialLink[])\n : undefined;\n\n const profile = this.hcs11Client.createAIAgentProfile(\n agentName,\n agentType,\n capabilities,\n metadata.model || 'unknown',\n {\n alias: agentName.toLowerCase().replace(/\\s+/g, '_'),\n bio: agentBio,\n profileImage: pfpTopicId ? `hcs://1/${pfpTopicId}` : undefined,\n socials: formattedSocials,\n properties: metadata.properties,\n inboundTopicId,\n outboundTopicId,\n creator: metadata.creator,\n },\n );\n\n const profileResult = await this.hcs11Client.createAndInscribeProfile(\n profile,\n true,\n );\n\n if (!profileResult.success) {\n this.logger.error(`Failed to inscribe profile: ${profileResult.error}`);\n throw new Error(profileResult.error || 'Failed to inscribe profile');\n }\n\n this.logger.info(\n `Profile inscribed with topic ID: ${profileResult.profileTopicId}, transaction ID: ${profileResult.transactionId}`,\n );\n\n return {\n profileTopicId: profileResult.profileTopicId,\n pfpTopicId,\n transactionId: profileResult.transactionId,\n success: true,\n };\n } catch (e: any) {\n const error = e as Error;\n const logMessage = `Error storing HCS-11 profile: ${error.message}`;\n this.logger.error(logMessage);\n return {\n profileTopicId: '',\n pfpTopicId: '',\n transactionId: '',\n success: false,\n error: error.message,\n };\n }\n }\n\n private async setupFees(\n transaction: TopicCreateTransaction,\n feeConfig: TopicFeeConfig,\n additionalExemptAccounts: string[] = [],\n ): Promise<TopicCreateTransaction> {\n let modifiedTransaction = transaction;\n if (!this.client.operatorPublicKey) {\n return modifiedTransaction;\n }\n\n if (!feeConfig.customFees || feeConfig.customFees.length === 0) {\n this.logger.warn('No custom fees provided in fee config for setupFees');\n return modifiedTransaction;\n }\n\n if (feeConfig.customFees.length > 10) {\n this.logger.warn(\n 'More than 10 custom fees provided, only the first 10 will be used',\n );\n feeConfig.customFees = feeConfig.customFees.slice(0, 10);\n }\n\n const customFees = feeConfig.customFees\n .map(fee => {\n if (!fee.feeCollectorAccountId) {\n this.logger.error(\n 'Internal Error: Fee collector ID missing in setupFees',\n );\n return null;\n }\n if (fee.type === 'FIXED_FEE') {\n const customFee = new CustomFixedFee()\n .setAmount(Number(fee.feeAmount.amount))\n .setFeeCollectorAccountId(\n AccountId.fromString(fee.feeCollectorAccountId),\n );\n\n if (fee.feeTokenId) {\n customFee.setDenominatingTokenId(\n TokenId.fromString(fee.feeTokenId),\n );\n }\n\n return customFee;\n }\n return null;\n })\n .filter(Boolean) as CustomFixedFee[];\n\n if (customFees.length === 0) {\n this.logger.warn('No valid custom fees to apply in setupFees');\n return modifiedTransaction;\n }\n\n const exemptAccountIds = [\n ...(feeConfig.exemptAccounts || []),\n ...additionalExemptAccounts,\n ];\n\n if (exemptAccountIds.length > 0) {\n modifiedTransaction = await this.setupExemptKeys(\n transaction,\n exemptAccountIds,\n );\n }\n\n return modifiedTransaction\n .setFeeScheduleKey(this.client.operatorPublicKey)\n .setCustomFees(customFees);\n }\n\n private async setupExemptKeys(\n transaction: TopicCreateTransaction,\n exemptAccountIds: string[],\n ): Promise<TopicCreateTransaction> {\n let modifiedTransaction = transaction;\n const uniqueExemptAccountIds = Array.from(new Set(exemptAccountIds));\n const filteredExemptAccounts = uniqueExemptAccountIds.filter(\n account => account !== this.client.operatorAccountId?.toString(),\n );\n\n let exemptKeys: PublicKey[] = [];\n if (filteredExemptAccounts.length > 0) {\n try {\n exemptKeys = await accountIdsToExemptKeys(\n filteredExemptAccounts,\n this.network,\n this.logger,\n );\n } catch (e: any) {\n const error = e as Error;\n const logMessage = `Error getting exempt keys: ${error.message}, continuing without exempt keys`;\n this.logger.warn(logMessage);\n }\n }\n\n if (exemptKeys.length > 0) {\n modifiedTransaction = modifiedTransaction.setFeeExemptKeys(exemptKeys);\n }\n\n return modifiedTransaction;\n }\n\n /**\n * Handles a connection request from another account\n * @param inboundTopicId Inbound topic ID of your agent\n * @param requestingAccountId Requesting account ID\n * @param connectionRequestId Connection request ID\n * @param connectionFeeConfig Optional fee configuration for the connection topic\n * @param ttl Optional ttl parameter with default\n * @returns Response with connection details\n */\n async handleConnectionRequest(\n inboundTopicId: string,\n requestingAccountId: string,\n connectionRequestId: number,\n connectionFeeConfig?: FeeConfigBuilderInterface,\n ttl: number = 60,\n ): Promise<HandleConnectionRequestResponse> {\n const memo = this._generateHcs10Memo(Hcs10MemoType.CONNECTION, {\n ttl,\n inboundTopicId,\n connectionId: connectionRequestId,\n });\n this.logger.info(\n `Handling connection request ${connectionRequestId} from ${requestingAccountId}`,\n );\n\n const accountId = this.getClient().operatorAccountId?.toString();\n if (!accountId) {\n throw new Error('Failed to retrieve operator account ID');\n }\n\n let requesterKey = await this.mirrorNode.getPublicKey(requestingAccountId);\n const accountKey = await this.mirrorNode.getPublicKey(accountId);\n\n if (!accountKey) {\n throw new Error('Failed to retrieve public key');\n }\n\n const thresholdKey = new KeyList([accountKey, requesterKey], 1);\n\n let connectionTopicId: string;\n\n try {\n if (connectionFeeConfig) {\n const feeConfig = connectionFeeConfig.build();\n const modifiedFeeConfig = {\n ...feeConfig,\n exemptAccounts: [...(feeConfig.exemptAccounts || [])],\n };\n\n connectionTopicId = await this.createTopic(\n memo,\n thresholdKey,\n thresholdKey,\n modifiedFeeConfig,\n );\n } else {\n connectionTopicId = await this.createTopic(\n memo,\n thresholdKey,\n thresholdKey,\n );\n }\n\n this.logger.info(`Created new connection topic ID: ${connectionTopicId}`);\n } catch (error) {\n const logMessage = `Failed to create connection topic: ${error}`;\n this.logger.error(logMessage);\n throw new TopicCreationError(logMessage);\n }\n\n const operatorId = `${inboundTopicId}@${accountId}`;\n\n const confirmedConnectionSequenceNumber = await this.confirmConnection(\n inboundTopicId,\n connectionTopicId,\n requestingAccountId,\n connectionRequestId,\n 'Connection accepted. Looking forward to collaborating!',\n );\n\n const accountTopics = await this.retrieveCommunicationTopics(accountId);\n\n const requestingAccountTopics =\n await this.retrieveCommunicationTopics(requestingAccountId);\n\n const requestingAccountOperatorId = `${requestingAccountTopics.inboundTopic}@${requestingAccountId}`;\n\n await this.recordOutboundConnectionConfirmation({\n outboundTopicId: accountTopics.outboundTopic,\n requestorOutboundTopicId: requestingAccountTopics.outboundTopic,\n connectionRequestId: connectionRequestId,\n confirmedRequestId: confirmedConnectionSequenceNumber,\n connectionTopicId,\n operatorId: requestingAccountOperatorId,\n memo: `Connection established with ${requestingAccountId}`,\n });\n\n return {\n connectionTopicId,\n confirmedConnectionSequenceNumber,\n operatorId,\n };\n }\n\n /**\n * Confirms a connection request from another account\n * @param inboundTopicId Inbound topic ID\n * @param connectionTopicId Connection topic ID\n * @param connectedAccountId Connected account ID\n * @param connectionId Connection ID\n * @param memo Memo for the connection request\n * @param submitKey Optional submit key\n * @returns Sequence number of the confirmed connection\n */\n async confirmConnection(\n inboundTopicId: string,\n connectionTopicId: string,\n connectedAccountId: string,\n connectionId: number,\n memo: string,\n submitKey?: PrivateKey,\n ): Promise<number> {\n const operatorId = await this.getOperatorId();\n this.logger.info(`Confirming connection with ID ${connectionId}`);\n const payload = {\n p: 'hcs-10',\n op: 'connection_created',\n connection_topic_id: connectionTopicId,\n connected_account_id: connectedAccountId,\n operator_id: operatorId,\n connection_id: connectionId,\n m: memo,\n };\n\n const submissionCheck = await this.canSubmitToTopic(\n inboundTopicId,\n this.client.operatorAccountId?.toString() || '',\n );\n\n const result = await this.submitPayload(\n inboundTopicId,\n payload,\n submitKey,\n submissionCheck.requiresFee,\n );\n\n const sequenceNumber = result.topicSequenceNumber?.toNumber();\n\n if (!sequenceNumber) {\n throw new ConnectionConfirmationError(\n 'Failed to confirm connection: sequence number is null',\n );\n }\n\n return sequenceNumber;\n }\n\n async sendMessage(\n connectionTopicId: string,\n data: string,\n memo?: string,\n submitKey?: PrivateKey,\n options?: {\n progressCallback?: RegistrationProgressCallback;\n waitMaxAttempts?: number;\n waitIntervalMs?: number;\n },\n ): Promise<TransactionReceipt> {\n const submissionCheck = await this.canSubmitToTopic(\n connectionTopicId,\n this.client.operatorAccountId?.toString() || '',\n );\n\n const operatorId = await this.getOperatorId();\n\n const payload = {\n p: 'hcs-10',\n op: 'message',\n operator_id: operatorId,\n data,\n m: memo,\n };\n\n const payloadString = JSON.stringify(payload);\n const isLargePayload = Buffer.from(payloadString).length > 1000;\n\n if (isLargePayload) {\n this.logger.info(\n 'Message payload exceeds 1000 bytes, storing via inscription',\n );\n try {\n const contentBuffer = Buffer.from(data);\n const fileName = `message-${Date.now()}.json`;\n const inscriptionResult = await this.inscribeFile(\n contentBuffer,\n fileName,\n {\n progressCallback: options?.progressCallback,\n waitMaxAttempts: options?.waitMaxAttempts,\n waitIntervalMs: options?.waitIntervalMs,\n },\n );\n\n if (inscriptionResult?.topic_id) {\n payload.data = `hcs://1/${inscriptionResult.topic_id}`;\n this.logger.info(\n `Large message inscribed with topic ID: ${inscriptionResult.topic_id}`,\n );\n } else {\n throw new Error('Failed to inscribe large message content');\n }\n } catch (error: any) {\n const logMessage = `Error inscribing large message: ${error.message}`;\n this.logger.error(logMessage);\n throw new Error(logMessage);\n }\n }\n\n this.logger.info('Submitting message to connection topic', payload);\n return await this.submitPayload(\n connectionTopicId,\n payload,\n submitKey,\n submissionCheck.requiresFee,\n );\n }\n\n async createTopic(\n memo: string,\n adminKey?: boolean | PublicKey | KeyList,\n submitKey?: boolean | PublicKey | KeyList,\n feeConfig?: TopicFeeConfig,\n ): Promise<string> {\n this.logger.info('Creating topic');\n const transaction = new TopicCreateTransaction().setTopicMemo(memo);\n\n if (adminKey) {\n if (\n typeof adminKey === 'boolean' &&\n adminKey &&\n this.client.operatorPublicKey\n ) {\n transaction.setAdminKey(this.client.operatorPublicKey);\n transaction.setAutoRenewAccountId(this.client.operatorAccountId!);\n } else if (adminKey instanceof PublicKey || adminKey instanceof KeyList) {\n transaction.setAdminKey(adminKey);\n if (this.client.operatorAccountId) {\n transaction.setAutoRenewAccountId(this.client.operatorAccountId);\n }\n }\n }\n\n if (submitKey) {\n if (\n typeof submitKey === 'boolean' &&\n submitKey &&\n this.client.operatorPublicKey\n ) {\n transaction.setSubmitKey(this.client.operatorPublicKey);\n } else if (\n submitKey instanceof PublicKey ||\n submitKey instanceof KeyList\n ) {\n transaction.setSubmitKey(submitKey);\n }\n }\n\n if (feeConfig) {\n await this.setupFees(transaction, feeConfig);\n }\n\n this.logger.debug('Executing topic creation transaction');\n const txResponse = await transaction.execute(this.client);\n const receipt = await txResponse.getReceipt(this.client);\n\n if (!receipt.topicId) {\n this.logger.error('Failed to create topic: topicId is null');\n throw new Error('Failed to create topic: topicId is null');\n }\n\n const topicId = receipt.topicId.toString();\n return topicId;\n }\n\n public async submitPayload(\n topicId: string,\n payload: object | string,\n submitKey?: PrivateKey,\n requiresFee: boolean = false,\n ): Promise<TransactionReceipt> {\n const message =\n typeof payload === 'string' ? payload : JSON.stringify(payload);\n\n const payloadSizeInBytes = Buffer.byteLength(message, 'utf8');\n if (payloadSizeInBytes > 1000) {\n throw new PayloadSizeError(\n 'Payload size exceeds 1000 bytes limit',\n payloadSizeInBytes,\n );\n }\n\n const transaction = new TopicMessageSubmitTransaction()\n .setTopicId(TopicId.fromString(topicId))\n .setMessage(message);\n\n if (requiresFee) {\n this.logger.info(\n 'Topic requires fee payment, setting max transaction fee',\n );\n transaction.setMaxTransactionFee(new Hbar(this.feeAmount));\n }\n\n let transactionResponse: TransactionResponse;\n if (submitKey) {\n const frozenTransaction = transaction.freezeWith(this.client);\n const signedTransaction = await frozenTransaction.sign(submitKey);\n transactionResponse = await signedTransaction.execute(this.client);\n } else {\n transactionResponse = await transaction.execute(this.client);\n }\n\n const receipt = await transactionResponse.getReceipt(this.client);\n if (!receipt) {\n this.logger.error('Failed to submit message: receipt is null');\n throw new Error('Failed to submit message: receipt is null');\n }\n this.logger.info('Message submitted successfully');\n return receipt;\n }\n\n async inscribeFile(\n buffer: Buffer,\n fileName: string,\n options?: {\n progressCallback?: RegistrationProgressCallback;\n waitMaxAttempts?: number;\n waitIntervalMs?: number;\n },\n ): Promise<RetrievedInscriptionResult> {\n this.logger.info('Inscribing file');\n if (!this.client.operatorAccountId) {\n this.logger.error('Operator account ID is not set');\n throw new Error('Operator account ID is not set');\n }\n\n if (!this.operatorPrivateKey) {\n this.logger.error('Operator private key is not set');\n throw new Error('Operator private key is not set');\n }\n\n const mimeType = mime.lookup(fileName) || 'application/octet-stream';\n\n const sdk = await InscriptionSDK.createWithAuth({\n type: 'server',\n accountId: this.client.operatorAccountId.toString(),\n privateKey: this.operatorPrivateKey.toString(),\n network: this.network as 'testnet' | 'mainnet',\n });\n\n const inscriptionOptions = {\n mode: 'file' as const,\n waitForConfirmation: true,\n waitMaxAttempts: options?.waitMaxAttempts || 30,\n waitIntervalMs: options?.waitIntervalMs || 4000,\n progressCallback: options?.progressCallback,\n logging: {\n level: this.logger.getLevel ? this.logger.getLevel() : 'info',\n },\n };\n\n const response = await inscribe(\n {\n type: 'buffer',\n buffer,\n fileName,\n mimeType,\n },\n {\n accountId: this.client.operatorAccountId.toString(),\n privateKey: this.operatorPrivateKey.toString(),\n network: this.network as 'testnet' | 'mainnet',\n },\n inscriptionOptions,\n sdk,\n );\n\n if (!response.confirmed || !response.inscription) {\n throw new Error('Inscription was not confirmed');\n }\n\n return response.inscription;\n }\n\n /**\n * Waits for confirmation of a connection request\n * @param inboundTopicId Inbound topic ID\n * @param connectionRequestId Connection request ID\n * @param maxAttempts Maximum number of attempts\n * @param delayMs Delay between attempts in milliseconds\n * @returns Connection confirmation details\n */\n async waitForConnectionConfirmation(\n inboundTopicId: string,\n connectionRequestId: number,\n maxAttempts = 60,\n delayMs = 2000,\n recordConfirmation = true,\n ): Promise<WaitForConnectionConfirmationResponse> {\n this.logger.info(\n `Waiting for connection confirmation on inbound topic ${inboundTopicId} for request ID ${connectionRequestId}`,\n );\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n this.logger.info(\n `Attempt ${attempt + 1}/${maxAttempts} to find connection confirmation`,\n );\n const messages = await this.mirrorNode.getTopicMessages(inboundTopicId);\n\n const connectionCreatedMessages = messages.filter(\n m => m.op === 'connection_created',\n );\n\n this.logger.info(\n `Found ${connectionCreatedMessages.length} connection_created messages`,\n );\n\n if (connectionCreatedMessages.length > 0) {\n for (const message of connectionCreatedMessages) {\n if (Number(message.connection_id) === Number(connectionRequestId)) {\n const confirmationResult = {\n connectionTopicId: message.connection_topic_id,\n sequence_number: Number(message.sequence_number),\n confirmedBy: message.operator_id,\n memo: message.m,\n };\n\n const confirmedByAccountId = this.extractAccountFromOperatorId(\n confirmationResult.confirmedBy,\n );\n\n const account = this.getAccountAndSigner();\n const confirmedByConnectionTopics =\n await this.retrieveCommunicationTopics(confirmedByAccountId);\n\n const agentConnectionTopics =\n await this.retrieveCommunicationTopics(account.accountId);\n\n this.logger.info(\n 'Connection confirmation found',\n confirmationResult,\n );\n\n if (recordConfirmation) {\n /**\n * Record's the confirmation of the connection request from the\n * confirmedBy account to the agent account.\n */\n await this.recordOutboundConnectionConfirmation({\n requestorOutboundTopicId:\n confirmedByConnectionTopics.outboundTopic,\n outboundTopicId: agentConnectionTopics.outboundTopic,\n connectionRequestId,\n confirmedRequestId: confirmationResult.sequence_number,\n connectionTopicId: confirmationResult.connectionTopicId,\n operatorId: confirmationResult.confirmedBy,\n memo: confirmationResult.memo || 'Connection confirmed',\n });\n }\n\n return confirmationResult;\n }\n }\n }\n\n if (attempt < maxAttempts - 1) {\n this.logger.info(\n `No matching confirmation found, waiting ${delayMs}ms before retrying...`,\n );\n await new Promise(resolve => setTimeout(resolve, delayMs));\n }\n }\n\n throw new Error(\n `Connection confirmation not found after ${maxAttempts} attempts for request ID ${connectionRequestId}`,\n );\n }\n\n getAccountAndSigner(): GetAccountAndSignerResponse {\n const PK =\n this.keyType === 'ecdsa'\n ? PrivateKey.fromStringECDSA(this.operatorPrivateKey)\n : PrivateKey.fromStringED25519(this.operatorPrivateKey);\n\n return {\n accountId: this.client.operatorAccountId!.toString()!,\n signer: PK,\n };\n }\n\n /**\n * Creates and registers an agent with a Guarded registry.\n *\n * This function performs the following steps:\n * 1. Creates a new account if no existing account is provided.\n * 2. Initializes an HCS10 client with the new account.\n * 3. Creates an agent on the client.\n * 4. Registers the agent with the Hashgraph Online Guarded Registry.\n *\n * @param builder The agent builder object\n * @param options Optional configuration including progress callback and state management\n * @returns Agent registration result\n */\n async createAndRegisterAgent(\n builder: AgentBuilder,\n options?: {\n baseUrl?: string;\n progressCallback?: RegistrationProgressCallback;\n existingState?: AgentCreationState;\n initialBalance?: number;\n },\n ): Promise<AgentRegistrationResult> {\n try {\n const config = builder.build();\n const progressCallback = options?.progressCallback;\n const baseUrl = options?.baseUrl || this.guardedRegistryBaseUrl;\n\n let state =\n options?.existingState ||\n ({\n currentStage: 'init',\n completedPercentage: 0,\n createdResources: [],\n } as AgentCreationState);\n\n state.agentMetadata = config.metadata;\n\n if (progressCallback) {\n progressCallback({\n stage: 'preparing',\n message: 'Starting agent creation process',\n progressPercent: 0,\n details: { state },\n });\n }\n\n let account = config.existingAccount;\n let agentClient: HCS10Client;\n\n if (\n !state.inboundTopicId ||\n !state.outboundTopicId ||\n !state.profileTopicId\n ) {\n if (!account) {\n if (\n state.createdResources &&\n state.createdResources.some(r => r.startsWith('account:'))\n ) {\n const accountResource = state.createdResources.find(r =>\n r.startsWith('account:'),\n );\n const existingAccountId = accountResource?.split(':')[1];\n\n if (existingAccountId && config.existingAccount) {\n account = config.existingAccount;\n this.logger.info(\n `Resuming with existing account: ${existingAccountId}`,\n );\n } else {\n account = await this.createAccount(options?.initialBalance);\n state.createdResources = state.createdResources || [];\n state.createdResources.push(`account:${account.accountId}`);\n }\n } else {\n account = await this.createAccount(options?.initialBalance);\n state.createdResources = state.createdResources || [];\n state.createdResources.push(`account:${account.accountId}`);\n }\n }\n\n if (progressCallback) {\n progressCallback({\n stage: 'preparing',\n message: 'Created account or using existing account',\n progressPercent: 20,\n details: { state, account },\n });\n }\n\n agentClient = new HCS10Client({\n network: config.network,\n operatorId: account.accountId,\n operatorPrivateKey: account.privateKey,\n operatorPublicKey: PrivateKey.fromString(\n account.privateKey,\n ).publicKey.toString(),\n logLevel: 'info' as LogLevel,\n guardedRegistryBaseUrl: baseUrl,\n });\n\n if (progressCallback) {\n progressCallback({\n stage: 'preparing',\n message: 'Initialized agent client',\n progressPercent: 25,\n details: { state },\n });\n }\n\n let outboundTopicId = state.outboundTopicId;\n let inboundTopicId = state.inboundTopicId;\n let pfpTopicId = state.pfpTopicId;\n let profileTopicId = state.profileTopicId;\n\n if (!outboundTopicId || !inboundTopicId || !profileTopicId) {\n if (pfpTopicId) {\n builder.setExistingProfilePicture(pfpTopicId);\n }\n\n const createResult = await agentClient.createAgent(\n builder,\n 60,\n state,\n );\n\n outboundTopicId = createResult.outboundTopicId;\n inboundTopicId = createResult.inboundTopicId;\n pfpTopicId = createResult.pfpTopicId;\n profileTopicId = createResult.profileTopicId;\n\n state.outboundTopicId = outboundTopicId;\n state.inboundTopicId = inboundTopicId;\n state.pfpTopicId = pfpTopicId;\n state.profileTopicId = profileTopicId;\n\n if (!state.createdResources) {\n state.createdResources = [];\n }\n\n if (\n pfpTopicId &&\n !state.createdResources.includes(`pfp:${pfpTopicId}`)\n ) {\n state.createdResources.push(`pfp:${pfpTopicId}`);\n }\n if (!state.createdResources.includes(`inbound:${inboundTopicId}`)) {\n state.createdResources.push(`inbound:${inboundTopicId}`);\n }\n if (!state.createdResources.includes(`outbound:${outboundTopicId}`)) {\n state.createdResources.push(`outbound:${outboundTopicId}`);\n }\n if (!state.createdResources.includes(`profile:${profileTopicId}`)) {\n state.createdResources.push(`profile:${profileTopicId}`);\n }\n }\n\n state.currentStage = 'profile';\n state.completedPercentage = 60;\n\n if (progressCallback) {\n progressCallback({\n stage: 'submitting',\n message: 'Created agent with topics and profile',\n progressPercent: 60,\n details: {\n state,\n outboundTopicId,\n inboundTopicId,\n pfpTopicId,\n profileTopicId,\n },\n });\n }\n } else {\n account = account || config.existingAccount;\n if (!account) {\n throw new Error(\n 'Cannot resume registration without account information',\n );\n }\n\n agentClient = new HCS10Client({\n network: config.network,\n operatorId: account.accountId,\n operatorPrivateKey: account.privateKey,\n operatorPublicKey: PrivateKey.fromString(\n account.privateKey,\n ).publicKey.toString(),\n logLevel: 'info' as LogLevel,\n guardedRegistryBaseUrl: baseUrl,\n });\n\n this.logger.info('Resuming registration with existing state', {\n inboundTopicId: state.inboundTopicId,\n outboundTopicId: state.outboundTopicId,\n profileTopicId: state.profileTopicId,\n pfpTopicId: state.pfpTopicId,\n });\n }\n\n const operatorId = `${state.inboundTopicId}@${account.accountId}`;\n\n if (\n state.currentStage !== 'complete' ||\n !state.createdResources?.includes(\n `registration:${state.inboundTopicId}`,\n )\n ) {\n const registrationResult =\n await agentClient.registerAgentWithGuardedRegistry(\n account.accountId,\n config.network,\n {\n progressCallback: data => {\n const adjustedPercent = 60 + (data.progressPercent || 0) * 0.4;\n if (progressCallback) {\n progressCallback({\n stage: data.stage,\n message: data.message,\n progressPercent: adjustedPercent,\n details: {\n ...data.details,\n outboundTopicId: state.outboundTopicId,\n inboundTopicId: state.inboundTopicId,\n pfpTopicId: state.pfpTopicId,\n profileTopicId: state.profileTopicId,\n operatorId,\n state: data.details?.state || state,\n },\n });\n }\n },\n existingState: state,\n },\n );\n\n if (!registrationResult.success) {\n return {\n ...registrationResult,\n state,\n };\n }\n\n state = registrationResult.state || state;\n }\n\n if (progressCallback) {\n progressCallback({\n stage: 'completed',\n message: 'Agent creation and registration complete',\n progressPercent: 100,\n details: {\n outboundTopicId: state.outboundTopicId,\n inboundTopicId: state.inboundTopicId,\n pfpTopicId: state.pfpTopicId,\n profileTopicId: state.profileTopicId,\n operatorId,\n state,\n },\n });\n }\n\n return {\n success: true,\n state,\n metadata: {\n accountId: account.accountId,\n privateKey: account.privateKey,\n operatorId,\n inboundTopicId: state.inboundTopicId!,\n outboundTopicId: state.outboundTopicId!,\n profileTopicId: state.profileTopicId!,\n pfpTopicId: state.pfpTopicId!,\n },\n };\n } catch (e: any) {\n const error = e as Error;\n const logMessage = `Failed to create and register agent: ${error.message}`;\n this.logger.error(logMessage);\n return {\n error: error.message,\n success: false,\n state:\n options?.existingState ||\n ({\n currentStage: 'init',\n completedPercentage: 0,\n error: error.message,\n } as AgentCreationState),\n };\n }\n }\n\n /**\n * Registers an agent with the guarded registry\n * @param accountId Account ID to register\n * @param inboundTopicId Inbound topic ID for the agent\n * @param network Network type ('mainnet' or 'testnet')\n * @param options Optional configuration including progress callback and confirmation settings\n * @returns Registration result\n */\n async registerAgentWithGuardedRegistry(\n accountId: string,\n network: string = this.network,\n options?: {\n progressCallback?: RegistrationProgressCallback;\n maxAttempts?: number;\n delayMs?: number;\n existingState?: AgentCreationState;\n },\n ): Promise<AgentRegistrationResult> {\n try {\n this.logger.info('Registering agent with guarded registry');\n\n const maxAttempts = options?.maxAttempts ?? 60;\n const delayMs = options?.delayMs ?? 2000;\n const progressCallback = options?.progressCallback;\n let state =\n options?.existingState ||\n ({\n currentStage: 'registration',\n completedPercentage: 0,\n createdResources: [],\n } as AgentCreationState);\n\n if (progressCallback) {\n progressCallback({\n stage: 'preparing',\n message: 'Preparing agent registration',\n progressPercent: 10,\n details: {\n state,\n },\n });\n }\n\n const registrationResult = await this.executeRegistration(\n accountId,\n network,\n this.guardedRegistryBaseUrl,\n this.logger,\n );\n\n if (!registrationResult.success) {\n return {\n ...registrationResult,\n state,\n };\n }\n\n if (progressCallback) {\n progressCallback({\n stage: 'submitting',\n message: 'Submitting registration to registry',\n progressPercent: 30,\n details: {\n transactionId: registrationResult.transactionId,\n state,\n },\n });\n }\n\n if (registrationResult.transaction) {\n const transaction = Transaction.fromBytes(\n Buffer.from(registrationResult.transaction, 'base64'),\n );\n\n this.logger.info(`Processing registration transaction`);\n await transaction.execute(this.client);\n this.logger.info(`Successfully processed registration transaction`);\n }\n\n if (progressCallback) {\n progressCallback({\n stage: 'confirming',\n message: 'Confirming registration transaction',\n progressPercent: 60,\n details: {\n accountId,\n transactionId: registrationResult.transactionId,\n state,\n },\n });\n }\n\n const confirmed = await this.waitForRegistrationConfirmation(\n registrationResult.transactionId!,\n network,\n this.guardedRegistryBaseUrl,\n maxAttempts,\n delayMs,\n this.logger,\n );\n\n state.currentStage = 'complete';\n state.completedPercentage = 100;\n if (!state.createdResources) {\n state.createdResources = [];\n }\n if (registrationResult.transactionId) {\n state.createdResources.push(\n `registration:${registrationResult.transactionId}`,\n );\n }\n\n if (progressCallback) {\n progressCallback({\n stage: 'completed',\n message: 'Agent registration complete',\n progressPercent: 100,\n details: {\n confirmed,\n transactionId: registrationResult.transactionId,\n state,\n },\n });\n }\n\n return {\n ...registrationResult,\n confirmed,\n state,\n };\n } catch (e: any) {\n const error = e as Error;\n const logMessage = `Failed to register agent: ${error.message}`;\n this.logger.error(logMessage);\n return {\n error: error.message,\n success: false,\n };\n }\n }\n\n /**\n * Registers an agent with the guarded registry. Should be called by a registry.\n * @param registryTopicId - The topic ID of the guarded registry.\n * @param accountId - The account ID of the agent\n * @param inboundTopicId - The topic ID of the inbound topic\n * @param memo - The memo of the agent\n * @param submitKey - The submit key of the agent\n */\n async registerAgent(\n registryTopicId: string,\n accountId: string,\n inboundTopicId: string,\n memo: string,\n submitKey?: PrivateKey,\n ): Promise<void> {\n this.logger.info('Registering agent');\n const payload = {\n p: 'hcs-10',\n op: 'register',\n account_id: accountId,\n inbound_topic_id: inboundTopicId,\n m: memo,\n };\n\n await this.submitPayload(registryTopicId, payload, submitKey);\n }\n\n async getInboundTopicType(topicId: string): Promise<InboundTopicType> {\n try {\n const topicInfo = await this.mirrorNode.getTopicInfo(topicId);\n\n if (!topicInfo) {\n throw new Error('Topic does not exist');\n }\n\n const hasSubmitKey = topicInfo.submit_key && topicInfo.submit_key.key;\n\n if (!hasSubmitKey) {\n return InboundTopicType.PUBLIC;\n }\n\n const hasFeeScheduleKey =\n topicInfo.fee_schedule_key && topicInfo.fee_schedule_key.key;\n\n if (hasFeeScheduleKey && topicInfo.custom_fees) {\n const customFees = topicInfo.custom_fees;\n\n if (\n customFees &&\n customFees.fixed_fees &&\n customFees.fixed_fees.length > 0\n ) {\n this.logger.info(\n `Topic ${topicId} is fee-based with ${customFees.fixed_fees.length} custom fees`,\n );\n return InboundTopicType.FEE_BASED;\n }\n }\n\n return InboundTopicType.CONTROLLED;\n } catch (e: any) {\n const error = e as Error;\n const logMessage = `Error determining topic type: ${error.message}`;\n this.logger.error(logMessage);\n throw new Error(logMessage);\n }\n }\n\n getNetwork(): string {\n return this.network;\n }\n\n getLogger(): Logger {\n return this.logger;\n }\n\n /**\n * Public method to get the operator account ID configured for this client instance.\n * @returns The operator account ID string, or null if not set.\n */\n getOperatorAccountId(): string | null {\n return this.client.operatorAccountId?.toString() ?? null;\n }\n\n /**\n * Creates a scheduled transaction from a transaction object\n * @param transaction The transaction to schedule\n * @param memo Optional memo to include with the scheduled transaction\n * @param expirationTime Optional expiration time in seconds from now\n * @returns Object with schedule ID and transaction ID\n */\n private async createScheduledTransaction(\n transaction: Transaction,\n memo?: string,\n expirationTime?: number,\n schedulePayerAccountId?: string,\n ): Promise<{\n scheduleId: string;\n transactionId: string;\n }> {\n this.logger.info('Creating scheduled transaction');\n\n const scheduleTransaction = new ScheduleCreateTransaction()\n .setScheduledTransaction(transaction)\n .setPayerAccountId(\n schedulePayerAccountId\n ? AccountId.fromString(schedulePayerAccountId)\n : this.client.operatorAccountId,\n );\n\n if (memo) {\n scheduleTransaction.setScheduleMemo(memo);\n }\n\n if (expirationTime) {\n const expirationDate = addSeconds(new Date(), expirationTime);\n const timestamp = Timestamp.fromDate(expirationDate);\n scheduleTransaction.setExpirationTime(timestamp);\n }\n\n this.logger.debug('Executing schedule create transaction');\n const scheduleResponse = await scheduleTransaction.execute(this.client);\n const scheduleReceipt = await scheduleResponse.getReceipt(this.client);\n\n if (!scheduleReceipt.scheduleId) {\n this.logger.error(\n 'Failed to create scheduled transaction: scheduleId is null',\n );\n throw new Error(\n 'Failed to create scheduled transaction: scheduleId is null',\n );\n }\n\n const scheduleId = scheduleReceipt.scheduleId.toString();\n const transactionId = scheduleResponse.transactionId.toString();\n\n this.logger.info(\n `Scheduled transaction created successfully: ${scheduleId}`,\n );\n\n return {\n scheduleId,\n transactionId,\n };\n }\n\n /**\n * Sends a transaction operation on a connection topic\n * @param connectionTopicId Connection topic ID\n * @param scheduleId Schedule ID of the scheduled transaction\n * @param data Human-readable description of the transaction, can also be a JSON string or HRL\n * @param submitKey Optional submit key\n * @param options Optional parameters including memo (timestamp is no longer used here)\n * @returns Transaction receipt\n */\n private async sendTransactionOperation(\n connectionTopicId: string,\n scheduleId: string,\n data: string,\n submitKey?: PrivateKey,\n options?: {\n memo?: string;\n },\n ): Promise<TransactionReceipt> {\n const submissionCheck = await this.canSubmitToTopic(\n connectionTopicId,\n this.client.operatorAccountId?.toString() || '',\n );\n\n const operatorId = await this.getOperatorId();\n\n const payload = {\n p: 'hcs-10',\n op: 'transaction',\n operator_id: operatorId,\n schedule_id: scheduleId,\n data,\n m: options?.memo,\n };\n\n this.logger.info(\n 'Submitting transaction operation to connection topic',\n payload,\n );\n return await this.submitPayload(\n connectionTopicId,\n payload,\n submitKey,\n submissionCheck.requiresFee,\n );\n }\n\n /**\n * Creates and sends a transaction operation in one call\n * @param connectionTopicId Connection topic ID for sending the transaction operation\n * @param transaction The transaction to schedule\n * @param data Human-readable description of the transaction, can also be a JSON string or HRL\n * @param options Optional parameters for schedule creation and operation memo\n * @returns Object with schedule details (including scheduleId and its transactionId) and HCS-10 operation receipt\n */\n async sendTransaction(\n connectionTopicId: string,\n transaction: Transaction,\n data: string,\n options?: {\n scheduleMemo?: string;\n expirationTime?: number;\n submitKey?: PrivateKey;\n operationMemo?: string;\n schedulePayerAccountId?: string;\n },\n ): Promise<{\n scheduleId: string;\n transactionId: string;\n receipt: TransactionReceipt;\n }> {\n this.logger.info(\n 'Creating scheduled transaction and sending transaction operation',\n );\n\n const { scheduleId, transactionId } = await this.createScheduledTransaction(\n transaction,\n options?.scheduleMemo,\n options?.expirationTime,\n options?.schedulePayerAccountId,\n );\n\n const receipt = await this.sendTransactionOperation(\n connectionTopicId,\n scheduleId,\n data,\n options?.submitKey,\n {\n memo: options?.operationMemo,\n },\n );\n\n return {\n scheduleId,\n transactionId,\n receipt,\n };\n }\n}\n","import {\n KeyList,\n PublicKey,\n TopicCreateTransaction,\n TopicMessageSubmitTransaction,\n TransactionReceipt,\n PrivateKey,\n Hbar,\n AccountId,\n} from '@hashgraph/sdk';\nimport { HashinalsWalletConnectSDK } from '@hashgraphonline/hashinal-wc';\nimport { Logger, LogLevel } from '../utils/logger';\nimport {\n InscriptionSDK,\n RetrievedInscriptionResult,\n} from '@kiloscribe/inscription-sdk';\nimport { HCS10BaseClient } from './base-client';\nimport * as mime from 'mime-types';\nimport {\n AgentConfig,\n InscribePfpResponse,\n StoreHCS11ProfileResponse,\n AgentRegistrationResult,\n HandleConnectionRequestResponse,\n RegistrationProgressCallback,\n AgentCreationState,\n GetAccountAndSignerResponse,\n} from './types';\nimport {\n HCS11Client,\n AgentMetadata as AIAgentMetadata,\n InscribeProfileResponse,\n SocialLink,\n SocialPlatform,\n} from '../hcs-11';\nimport { ProgressReporter } from '../utils/progress-reporter';\nimport { Transaction } from '@hashgraph/sdk';\nimport { AgentBuilder } from '../hcs-11/agent-builder';\nimport { PersonBuilder } from '../hcs-11/person-builder';\nimport { Hcs10MemoType } from './base-client';\nimport { inscribeWithSigner } from '../inscribe/inscriber';\n\nconst isBrowser = typeof window !== 'undefined';\n\n/**\n * Configuration for HCS-10 browser client.\n *\n * @example\n * // Using default Hedera mirror nodes\n * const config = {\n * network: 'testnet',\n * hwc: walletConnectSDK\n * };\n *\n * @example\n * // Using HGraph custom mirror node provider\n * const config = {\n * network: 'mainnet',\n * hwc: walletConnectSDK,\n * mirrorNode: {\n * customUrl: 'https://mainnet.hedera.api.hgraph.dev/v1/<API-KEY>',\n * apiKey: 'your-hgraph-api-key'\n * }\n * };\n */\nexport type BrowserHCSClientConfig = {\n /** The Hedera network to connect to */\n network: 'mainnet' | 'testnet';\n /** Hashinals WalletConnect SDK instance */\n hwc: HashinalsWalletConnectSDK;\n /** Log level for the client */\n logLevel?: LogLevel;\n /** Whether to pretty print logs */\n prettyPrint?: boolean;\n /** Guarded registry topic ID (deprecated) */\n guardedRegistryTopicId?: string;\n /** Base URL for the guarded registry */\n guardedRegistryBaseUrl?: string;\n /** Default fee amount for HIP-991 fee payments */\n feeAmount?: number;\n /** Custom mirror node configuration */\n mirrorNode?: import('../services').MirrorNodeConfig;\n /** Whether to run logger in silent mode */\n silent?: boolean;\n};\n\nexport type BrowserAgentConfig = Omit<\n AgentConfig<BrowserHCSClient>,\n 'privateKey'\n> & {\n client: BrowserHCSClient;\n};\n\nexport type RegisteredAgent = {\n outboundTopicId: string;\n inboundTopicId: string;\n pfpTopicId: string;\n profileTopicId: string;\n error?: string;\n success: boolean;\n state: AgentCreationState;\n};\n\nexport class BrowserHCSClient extends HCS10BaseClient {\n private hwc: HashinalsWalletConnectSDK;\n declare protected logger: Logger;\n private guardedRegistryBaseUrl: string;\n private hcs11Client: HCS11Client | null = null;\n\n constructor(config: BrowserHCSClientConfig) {\n super({\n network: config.network,\n logLevel: config.logLevel,\n prettyPrint: config.prettyPrint,\n feeAmount: config.feeAmount,\n mirrorNode: config.mirrorNode,\n silent: config.silent,\n });\n\n this.hwc = config.hwc;\n if (!config.guardedRegistryBaseUrl) {\n this.guardedRegistryBaseUrl = 'https://moonscape.tech';\n } else {\n this.guardedRegistryBaseUrl = config.guardedRegistryBaseUrl;\n }\n\n let logLevel: LogLevel;\n if (config.logLevel) {\n logLevel = config.logLevel;\n } else {\n logLevel = 'info';\n }\n\n this.logger = Logger.getInstance({\n level: logLevel,\n module: 'HCS-Browser',\n prettyPrint: config.prettyPrint,\n silent: config.silent,\n });\n\n if (isBrowser) {\n try {\n const { accountId, signer } = this.getAccountAndSigner();\n\n this.hcs11Client = new HCS11Client({\n network: config.network,\n auth: {\n operatorId: accountId,\n signer: signer as any,\n },\n logLevel: config.logLevel,\n silent: config.silent,\n });\n } catch (err) {\n this.logger.warn(`Failed to initialize HCS11Client: ${err}`);\n }\n } else {\n this.logger.error(\n 'BrowserHCSClient initialized in server environment - browser-specific features will not be available. Use HCS10Client instead.',\n );\n }\n }\n\n async sendMessage(\n connectionTopicId: string,\n data: string,\n memo?: string,\n submitKey?: PrivateKey,\n options?: {\n progressCallback?: RegistrationProgressCallback;\n waitMaxAttempts?: number;\n waitIntervalMs?: number;\n },\n ): Promise<TransactionReceipt> {\n this.logger.info('Sending message');\n const operatorId = await this.getOperatorId();\n\n const payload = {\n p: 'hcs-10',\n op: 'message',\n operator_id: operatorId,\n data,\n m: memo,\n };\n\n const submissionCheck = await this.canSubmitToTopic(\n connectionTopicId,\n this.hwc.getAccountInfo().accountId,\n );\n\n const payloadString = JSON.stringify(payload);\n const isLargePayload = Buffer.from(payloadString).length > 1000;\n\n if (isLargePayload) {\n this.logger.info(\n 'Message payload exceeds 1000 bytes, storing via inscription',\n );\n try {\n const contentBuffer = Buffer.from(data);\n const fileName = `message-${Date.now()}.json`;\n const inscriptionResult = await this.inscribeFile(\n contentBuffer,\n fileName,\n {\n progressCallback: options?.progressCallback,\n waitMaxAttempts: options?.waitMaxAttempts,\n waitIntervalMs: options?.waitIntervalMs,\n },\n );\n\n if (inscriptionResult?.topic_id) {\n payload.data = `hcs://1/${inscriptionResult.topic_id}`;\n this.logger.info(\n `Large message inscribed with topic ID: ${inscriptionResult.topic_id}`,\n );\n } else {\n throw new Error('Failed to inscribe large message content');\n }\n } catch (error) {\n this.logger.error('Error inscribing large message:', error);\n throw new Error(\n `Failed to handle large message: ${\n error instanceof Error ? error.message : 'Unknown error'\n }`,\n );\n }\n }\n\n return await this.submitPayload(\n connectionTopicId,\n payload,\n submitKey,\n submissionCheck.requiresFee,\n );\n }\n\n async getPublicKey(accountId: string): Promise<PublicKey> {\n return await this.mirrorNode.getPublicKey(accountId);\n }\n\n async handleConnectionRequest(\n inboundTopicId: string,\n requestingAccountId: string,\n connectionId: number,\n connectionMemo: string = 'Connection accepted. Looking forward to collaborating!',\n ttl: number = 60,\n ): Promise<HandleConnectionRequestResponse> {\n this.logger.info('Handling connection request');\n const userAccountId = this.hwc.getAccountInfo().accountId;\n if (!userAccountId) {\n throw new Error('Failed to retrieve user account ID');\n }\n\n const requesterKey =\n await this.mirrorNode.getPublicKey(requestingAccountId);\n const accountKey = await this.mirrorNode.getPublicKey(userAccountId);\n\n if (!accountKey) {\n throw new Error('Failed to retrieve public key');\n }\n\n const thresholdKey = new KeyList([accountKey, requesterKey], 1);\n const memo = this._generateHcs10Memo(Hcs10MemoType.CONNECTION, {\n ttl,\n inboundTopicId,\n connectionId,\n });\n\n const transaction = new TopicCreateTransaction()\n .setTopicMemo(memo)\n .setAutoRenewAccountId(AccountId.fromString(userAccountId))\n .setAdminKey(thresholdKey)\n .setSubmitKey(thresholdKey);\n\n this.logger.debug('Executing topic creation transaction');\n const txResponse = await this.hwc.executeTransactionWithErrorHandling(\n transaction,\n false,\n );\n if (txResponse?.error) {\n this.logger.error(txResponse.error);\n throw new Error(txResponse.error);\n }\n\n const resultReceipt = txResponse?.result;\n if (!resultReceipt?.topicId) {\n this.logger.error('Failed to create topic: topicId is null');\n throw new Error('Failed to create topic: topicId is null');\n }\n\n const connectionTopicId = resultReceipt.topicId.toString();\n const operatorId = `${inboundTopicId}@${userAccountId}`;\n const confirmedConnectionSequenceNumber = await this.confirmConnection(\n inboundTopicId,\n connectionTopicId,\n requestingAccountId,\n connectionId,\n operatorId,\n connectionMemo,\n );\n\n const accountTopics = await this.retrieveCommunicationTopics(userAccountId);\n\n const requestingAccountTopics =\n await this.retrieveCommunicationTopics(requestingAccountId);\n\n const requestingAccountOperatorId = `${requestingAccountTopics.inboundTopic}@${requestingAccountId}`;\n\n await this.recordOutboundConnectionConfirmation({\n outboundTopicId: accountTopics.outboundTopic,\n requestorOutboundTopicId: requestingAccountTopics.outboundTopic,\n connectionRequestId: connectionId,\n confirmedRequestId: confirmedConnectionSequenceNumber,\n connectionTopicId,\n operatorId: requestingAccountOperatorId,\n memo: `Connection established with ${requestingAccountId}`,\n });\n\n return {\n connectionTopicId,\n confirmedConnectionSequenceNumber,\n operatorId,\n };\n }\n\n async confirmConnection(\n inboundTopicId: string,\n connectionTopicId: string,\n connectedAccountId: string,\n connectionId: number,\n operatorId: string,\n memo: string,\n ): Promise<number> {\n this.logger.info('Confirming connection');\n const payload = {\n p: 'hcs-10',\n op: 'connection_created',\n connection_topic_id: connectionTopicId,\n connected_account_id: connectedAccountId,\n operator_id: operatorId,\n connection_id: connectionId,\n m: memo,\n };\n\n const transactionResponse = await this.submitPayload(\n inboundTopicId,\n payload,\n );\n if (!transactionResponse?.topicSequenceNumber) {\n this.logger.error(\n 'Failed to confirm connection: sequence number is null',\n );\n throw new Error('Failed to confirm connection: sequence number is null');\n }\n return transactionResponse.topicSequenceNumber.toNumber();\n }\n\n async create(\n builder: AgentBuilder | PersonBuilder,\n options?: {\n progressCallback?: RegistrationProgressCallback;\n existingState?: AgentCreationState;\n ttl?: number;\n updateAccountMemo?: boolean;\n },\n ): Promise<RegisteredAgent | InscribeProfileResponse> {\n const progressCallback = options?.progressCallback;\n const progressReporter = new ProgressReporter({\n module: 'ProfileCreate',\n logger: this.logger,\n callback: progressCallback as any,\n });\n\n try {\n const isAgentBuilder = builder instanceof AgentBuilder;\n\n let state;\n if (options?.existingState) {\n state = options.existingState;\n } else {\n state = {\n currentStage: 'init',\n completedPercentage: 0,\n createdResources: [],\n } as AgentCreationState;\n }\n\n if (isAgentBuilder) {\n this.logger.info('Creating Agent Profile and HCS-10 Topics');\n const agentConfig = (builder as AgentBuilder).build();\n state.agentMetadata = agentConfig.metadata;\n } else {\n this.logger.info('Creating Person HCS-11 Profile');\n }\n\n progressReporter.preparing(\n `Starting ${isAgentBuilder ? 'agent' : 'person'} resource creation`,\n 0,\n {\n state,\n },\n );\n\n const {\n inboundTopicId,\n outboundTopicId,\n state: updatedState,\n } = await this.createCommunicationTopics(options, progressReporter);\n\n state = updatedState;\n\n if (!isAgentBuilder) {\n (builder as PersonBuilder).setInboundTopicId(inboundTopicId);\n (builder as PersonBuilder).setOutboundTopicId(outboundTopicId);\n }\n\n let pfpTopicId: string | undefined;\n let hasPfpBuffer: Buffer | undefined;\n let pfpFileName: string | undefined;\n\n if (isAgentBuilder) {\n const agentProfile = (builder as AgentBuilder).build();\n pfpTopicId = agentProfile.existingPfpTopicId || state.pfpTopicId;\n hasPfpBuffer = agentProfile.pfpBuffer;\n pfpFileName = agentProfile.pfpFileName || 'pfp.png';\n } else {\n const personProfile = (builder as PersonBuilder).build();\n pfpTopicId = state.pfpTopicId;\n hasPfpBuffer = personProfile.pfpBuffer;\n pfpFileName = personProfile.pfpFileName;\n }\n\n if (!pfpTopicId && hasPfpBuffer && pfpFileName) {\n pfpTopicId = await this.handleProfilePictureCreation(\n hasPfpBuffer,\n pfpFileName,\n state,\n progressReporter,\n );\n } else if (pfpTopicId) {\n progressReporter.preparing(\n `Using existing profile picture: ${pfpTopicId}`,\n 50,\n { state },\n );\n state.pfpTopicId = pfpTopicId;\n }\n\n await this.createAndInscribeProfile(\n isAgentBuilder,\n builder as any,\n pfpTopicId,\n state,\n inboundTopicId,\n outboundTopicId,\n options,\n progressReporter,\n );\n\n state.currentStage = 'complete';\n state.completedPercentage = 100;\n progressReporter.completed(\n `${isAgentBuilder ? 'Agent' : 'Person'} profile created successfully`,\n {\n profileTopicId: state.profileTopicId,\n inboundTopicId,\n outboundTopicId,\n pfpTopicId,\n state,\n },\n );\n\n let outTopicId = '';\n if (state.outboundTopicId) {\n outTopicId = state.outboundTopicId;\n }\n\n let inTopicId = '';\n if (state.inboundTopicId) {\n inTopicId = state.inboundTopicId;\n }\n\n let profilePicTopicId = '';\n if (state.pfpTopicId) {\n profilePicTopicId = state.pfpTopicId;\n }\n\n let profTopicId = '';\n if (state.profileTopicId) {\n profTopicId = state.profileTopicId;\n }\n\n return {\n outboundTopicId: outTopicId,\n inboundTopicId: inTopicId,\n pfpTopicId: profilePicTopicId,\n profileTopicId: profTopicId,\n success: true,\n state,\n } as RegisteredAgent | InscribeProfileResponse;\n } catch (error: any) {\n progressReporter.failed('Error during profile creation', {\n error: error.message,\n });\n return {\n outboundTopicId: '',\n inboundTopicId: '',\n pfpTopicId: '',\n profileTopicId: '',\n success: false,\n error: error.message,\n state: {\n currentStage: 'init',\n completedPercentage: 0,\n error: error.message,\n } as AgentCreationState,\n } as RegisteredAgent;\n }\n }\n\n private async handleProfilePictureCreation(\n pfpBuffer: Buffer,\n pfpFileName: string,\n state: AgentCreationState,\n progressReporter: ProgressReporter,\n ): Promise<string> {\n state.currentStage = 'pfp';\n progressReporter.preparing('Creating profile picture', 30, {\n state,\n });\n\n const pfpProgress = progressReporter.createSubProgress({\n minPercent: 30,\n maxPercent: 50,\n logPrefix: 'PFP',\n });\n\n const pfpResult = await this.inscribePfp(pfpBuffer, pfpFileName, {\n progressCallback: data =>\n pfpProgress.report({\n ...data,\n progressPercent: data.progressPercent ?? 0,\n details: { ...data.details, state },\n }),\n });\n\n if (!pfpResult.success) {\n let errorMessage = 'Failed to inscribe profile picture';\n if (pfpResult.error) {\n errorMessage = pfpResult.error;\n }\n throw new Error(errorMessage);\n }\n\n const pfpTopicId = pfpResult.pfpTopicId;\n state.pfpTopicId = pfpTopicId;\n\n if (state.createdResources) {\n state.createdResources.push(`pfp:${state.pfpTopicId}`);\n }\n\n progressReporter.preparing('Profile picture created', 50, { state });\n\n return pfpTopicId;\n }\n\n private async createAndInscribeProfile(\n isAgentBuilder: boolean,\n builder: AgentBuilder | PersonBuilder,\n pfpTopicId: string | undefined,\n state: AgentCreationState,\n inboundTopicId: string,\n outboundTopicId: string,\n options?: {\n updateAccountMemo?: boolean;\n },\n progressReporter?: ProgressReporter,\n ): Promise<void> {\n if (!this.hcs11Client) {\n if (progressReporter) {\n progressReporter.failed('HCS11Client is not available');\n }\n throw new Error('HCS11Client is not available');\n }\n\n this.logger.info('Creating and inscribing profile');\n if (!state.profileTopicId) {\n if (progressReporter) {\n progressReporter.preparing(\n `Storing HCS-11 ${isAgentBuilder ? 'agent' : 'person'} profile`,\n 80,\n );\n }\n\n const profileProgress = progressReporter?.createSubProgress({\n minPercent: 80,\n maxPercent: 95,\n logPrefix: 'StoreProfile',\n });\n\n let hcs11Profile;\n\n if (isAgentBuilder) {\n const agentProfile = (builder as AgentBuilder).build();\n\n const socialLinks = agentProfile.metadata?.socials\n ? Object.entries(agentProfile.metadata.socials).map(\n ([platform, handle]) => ({\n platform: platform as SocialPlatform,\n handle: handle as string,\n }),\n )\n : [];\n\n hcs11Profile = this.hcs11Client.createAIAgentProfile(\n agentProfile.name,\n agentProfile.metadata?.type === 'manual' ? 0 : 1,\n agentProfile.capabilities || [],\n agentProfile.metadata?.model || 'unknown',\n {\n alias: agentProfile.name.toLowerCase().replace(/\\s+/g, '_'),\n bio: agentProfile.bio,\n profileImage: pfpTopicId ? `hcs://1/${pfpTopicId}` : undefined,\n socials: socialLinks,\n properties: agentProfile.metadata?.properties || {},\n inboundTopicId,\n outboundTopicId,\n creator: agentProfile.metadata?.creator,\n },\n );\n } else {\n const personProfile = (builder as PersonBuilder).build();\n\n const { pfpBuffer, pfpFileName, ...cleanProfile } = personProfile;\n\n hcs11Profile = this.hcs11Client.createPersonalProfile(\n personProfile.display_name,\n {\n alias: personProfile.alias,\n bio: personProfile.bio,\n socials: personProfile.socials,\n profileImage: pfpTopicId\n ? `hcs://1/${pfpTopicId}`\n : personProfile.profileImage,\n properties: personProfile.properties,\n inboundTopicId,\n outboundTopicId,\n },\n );\n }\n\n const profileResult = await this.hcs11Client.createAndInscribeProfile(\n hcs11Profile,\n options?.updateAccountMemo ?? true,\n {\n progressCallback: data =>\n profileProgress?.report({\n ...data,\n progressPercent: data.progressPercent ?? 0,\n }),\n },\n );\n\n if (!profileResult.success) {\n if (progressReporter) {\n progressReporter.failed(\n `Failed to inscribe ${isAgentBuilder ? 'agent' : 'person'} profile`,\n {\n error: profileResult.error,\n },\n );\n }\n\n let errorMessage = `Failed to inscribe ${\n isAgentBuilder ? 'agent' : 'person'\n } profile`;\n if (profileResult.error) {\n errorMessage = profileResult.error;\n }\n throw new Error(errorMessage);\n }\n\n state.profileTopicId = profileResult.profileTopicId;\n\n if (state.createdResources) {\n state.createdResources.push(`profile:${profileResult.profileTopicId}`);\n }\n\n if (progressReporter) {\n progressReporter.preparing('HCS-11 Profile stored', 95, { state });\n }\n } else if (progressReporter) {\n progressReporter.preparing(\n `Using existing ${isAgentBuilder ? 'agent' : 'person'} profile`,\n 95,\n {\n state,\n },\n );\n }\n }\n\n private initializeRegistrationState(\n inboundTopicId: string,\n existingState?: AgentCreationState,\n ): AgentCreationState {\n const state = existingState || {\n inboundTopicId,\n currentStage: 'registration',\n completedPercentage: 0,\n createdResources: [],\n };\n\n if (\n state.currentStage !== 'registration' &&\n state.currentStage !== 'complete'\n ) {\n state.currentStage = 'registration';\n }\n\n return state;\n }\n\n private updateStateForCompletedRegistration(\n state: AgentCreationState,\n inboundTopicId: string,\n ): void {\n state.currentStage = 'complete';\n state.completedPercentage = 100;\n if (state.createdResources) {\n state.createdResources.push(`registration:${inboundTopicId}`);\n }\n }\n\n async registerAgentWithGuardedRegistry(\n accountId: string,\n network: string = this.network,\n options?: {\n progressCallback?: RegistrationProgressCallback;\n maxAttempts?: number;\n delayMs?: number;\n existingState?: AgentCreationState;\n },\n ): Promise<AgentRegistrationResult> {\n try {\n this.logger.info('Registering agent with guarded registry');\n\n const agentProfile = await this.retrieveProfile(accountId);\n const inboundTopicId = agentProfile.topicInfo.inboundTopic;\n const state = this.initializeRegistrationState(\n inboundTopicId,\n options?.existingState,\n );\n const progressReporter = new ProgressReporter({\n module: 'AgentRegistration',\n logger: this.logger,\n callback: options?.progressCallback,\n });\n\n progressReporter.preparing('Preparing agent registration', 10, {\n inboundTopicId,\n accountId,\n });\n\n const registrationResult = await this.executeRegistration(\n accountId,\n network as string,\n this.guardedRegistryBaseUrl,\n this.logger,\n );\n\n if (!registrationResult.success) {\n return {\n ...registrationResult,\n state,\n };\n }\n\n progressReporter.submitting('Submitting registration to registry', 30, {\n transactionId: registrationResult.transactionId,\n });\n\n if (registrationResult.transaction) {\n const transaction = Transaction.fromBytes(\n Buffer.from(registrationResult.transaction, 'base64'),\n );\n\n this.logger.info(`Processing registration transaction`);\n const txResult = await this.hwc.executeTransactionWithErrorHandling(\n transaction as any,\n true,\n );\n\n if (txResult.error) {\n return {\n ...registrationResult,\n error: txResult.error,\n success: false,\n state,\n };\n }\n\n this.logger.info(`Successfully processed registration transaction`);\n }\n\n progressReporter.confirming('Confirming registration transaction', 60, {\n accountId,\n inboundTopicId,\n transactionId: registrationResult.transactionId,\n });\n\n const maxAttempts = options?.maxAttempts ?? 60;\n const delayMs = options?.delayMs ?? 2000;\n\n const confirmed = await this.waitForRegistrationConfirmation(\n registrationResult.transactionId!,\n network,\n this.guardedRegistryBaseUrl,\n maxAttempts,\n delayMs,\n this.logger,\n );\n\n this.updateStateForCompletedRegistration(state, inboundTopicId);\n\n progressReporter.completed('Agent registration complete', {\n transactionId: registrationResult.transactionId,\n inboundTopicId,\n state,\n confirmed,\n });\n\n return {\n ...registrationResult,\n confirmed,\n state,\n };\n } catch (error: any) {\n this.logger.error(`Registration error: ${error.message}`);\n return {\n error: `Error during registration: ${error.message}`,\n success: false,\n state: {\n currentStage: 'registration',\n completedPercentage: 0,\n error: error.message,\n },\n };\n }\n }\n\n async createAndRegisterAgent(\n builder: AgentBuilder,\n options?: {\n progressCallback?: RegistrationProgressCallback;\n maxAttempts?: number;\n delayMs?: number;\n existingState?: AgentCreationState;\n baseUrl?: string;\n },\n ): Promise<AgentRegistrationResult> {\n try {\n const agentConfig = builder.build();\n const progressCallback = options?.progressCallback;\n const progressReporter = new ProgressReporter({\n module: 'AgentCreateRegister',\n logger: this.logger,\n callback: progressCallback as any,\n });\n\n let state =\n options?.existingState ||\n ({\n currentStage: 'init',\n completedPercentage: 0,\n createdResources: [],\n } as AgentCreationState);\n\n state.agentMetadata = agentConfig.metadata;\n\n progressReporter.preparing('Starting agent creation process', 0, {\n state,\n });\n\n if (\n state.currentStage !== 'complete' ||\n !state.inboundTopicId ||\n !state.outboundTopicId ||\n !state.profileTopicId\n ) {\n const createResult = await this.create(builder, {\n progressCallback: (progress: any) => {\n const adjustedPercent = (progress.progressPercent || 0) * 0.3;\n progressReporter.report({\n ...progress,\n progressPercent: adjustedPercent,\n details: {\n ...progress.details,\n state: progress.details?.state || state,\n },\n });\n },\n existingState: state,\n updateAccountMemo: false,\n });\n\n if (!('state' in createResult)) {\n throw new Error('Create method did not return expected agent state.');\n }\n\n if (!createResult.success) {\n throw new Error(\n createResult.error || 'Failed to create agent resources',\n );\n }\n\n state = createResult.state;\n state.agentMetadata = agentConfig.metadata;\n }\n\n progressReporter.preparing(\n `Agent creation status: ${state.currentStage}, ${state.completedPercentage}%`,\n 30,\n { state },\n );\n\n const { accountId } = this.getAccountAndSigner();\n\n if (\n state.currentStage !== 'complete' ||\n !state.createdResources?.includes(\n `registration:${state.inboundTopicId}`,\n )\n ) {\n if (options?.baseUrl) {\n this.guardedRegistryBaseUrl = options.baseUrl;\n }\n\n const registrationResult = await this.registerAgentWithGuardedRegistry(\n accountId,\n agentConfig.network,\n {\n progressCallback: progress => {\n const adjustedPercent =\n 30 + (progress.progressPercent || 0) * 0.7;\n progressReporter.report({\n ...progress,\n progressPercent: adjustedPercent,\n details: {\n ...progress.details,\n state: progress.details?.state || state,\n },\n });\n },\n maxAttempts: options?.maxAttempts,\n delayMs: options?.delayMs,\n existingState: state,\n },\n );\n\n if (!registrationResult.success) {\n throw new Error(\n registrationResult.error ||\n 'Failed to register agent with registry',\n );\n }\n\n state = registrationResult.state;\n\n if (state.profileTopicId) {\n await this.hcs11Client?.updateAccountMemoWithProfile(\n accountId,\n state.profileTopicId,\n );\n }\n }\n\n progressReporter.completed('Agent creation and registration complete', {\n state,\n });\n\n return {\n success: true,\n state,\n metadata: {\n accountId,\n operatorId: `${state.inboundTopicId}@${accountId}`,\n inboundTopicId: state.inboundTopicId!,\n outboundTopicId: state.outboundTopicId!,\n profileTopicId: state.profileTopicId!,\n pfpTopicId: state.pfpTopicId!,\n privateKey: null,\n ...state.agentMetadata,\n },\n };\n } catch (error: any) {\n this.logger.error(\n `Failed to create and register agent: ${error.message}`,\n );\n return {\n success: false,\n error: `Failed to create and register agent: ${error.message}`,\n state:\n options?.existingState ||\n ({\n currentStage: 'init',\n completedPercentage: 0,\n error: error.message,\n } as AgentCreationState),\n };\n }\n }\n\n async storeHCS11Profile(\n agentName: string,\n agentBio: string,\n inboundTopicId: string,\n outboundTopicId: string,\n capabilities: number[] = [],\n metadata: Record<string, any> = {},\n pfpBuffer?: Buffer,\n pfpFileName?: string,\n existingPfpTopicId?: string,\n options?: {\n progressCallback?: RegistrationProgressCallback;\n },\n ): Promise<StoreHCS11ProfileResponse> {\n try {\n const progressCallback = options?.progressCallback;\n const progressReporter = new ProgressReporter({\n module: 'StoreHCS11Profile',\n logger: this.logger,\n callback: progressCallback as any,\n });\n\n progressReporter.preparing('Preparing agent profile data', 0);\n\n let pfpTopicId = existingPfpTopicId;\n\n if (!pfpTopicId && pfpBuffer && pfpFileName) {\n const pfpProgress = progressReporter.createSubProgress({\n minPercent: 0,\n maxPercent: 60,\n logPrefix: 'PFP',\n });\n\n const pfpResult = await this.inscribePfp(pfpBuffer, pfpFileName, {\n progressCallback: data => {\n pfpProgress.report({\n stage: data.stage,\n message: data.message,\n progressPercent: data.progressPercent || 0,\n details: data.details,\n });\n },\n });\n\n if (!pfpResult.success) {\n progressReporter.failed(\n 'Failed to inscribe profile picture, continuing without PFP',\n );\n } else {\n pfpTopicId = pfpResult.pfpTopicId;\n }\n } else if (existingPfpTopicId) {\n progressReporter.preparing(\n `Using existing profile picture: ${existingPfpTopicId}`,\n 30,\n );\n } else {\n progressReporter.preparing('No profile picture provided', 30);\n }\n\n if (!this.hcs11Client) {\n progressReporter.failed(\n 'HCS11Client is not available in this environment',\n );\n return {\n profileTopicId: '',\n success: false,\n error: 'HCS11Client is not available in this environment',\n transactionId: '',\n };\n }\n\n const agentType = this.hcs11Client.getAgentTypeFromMetadata({\n type: metadata.type || 'autonomous',\n } as AIAgentMetadata);\n\n progressReporter.preparing('Building agent profile', 65);\n\n const formattedSocials: SocialLink[] | undefined = metadata.socials\n ? Object.entries(metadata.socials)\n .filter(([_, handle]) => handle)\n .map(([platform, handle]) => ({\n platform: platform as SocialPlatform,\n handle: handle as string,\n }))\n : undefined;\n\n const profile = this.hcs11Client.createAIAgentProfile(\n agentName,\n agentType,\n capabilities,\n metadata.model || 'unknown',\n {\n alias: agentName.toLowerCase().replace(/\\s+/g, '_'),\n bio: agentBio,\n profileImage: pfpTopicId ? `hcs://1/${pfpTopicId}` : undefined,\n socials: formattedSocials,\n properties: {\n version: metadata.version || '1.0.0',\n creator: metadata.creator || 'Unknown',\n supported_languages: metadata.supported_languages || ['en'],\n permissions: metadata.permissions || [],\n model_details: metadata.model_details,\n training: metadata.training,\n capabilities_description: metadata.capabilities_description,\n ...metadata,\n },\n inboundTopicId,\n outboundTopicId,\n creator: metadata.creator,\n },\n );\n\n const profileProgress = progressReporter.createSubProgress({\n minPercent: 65,\n maxPercent: 100,\n logPrefix: 'Profile',\n });\n\n const profileResult = await this.hcs11Client.createAndInscribeProfile(\n profile,\n true,\n {\n progressCallback: profileData => {\n profileProgress.report({\n stage: profileData.stage,\n message: profileData.message,\n progressPercent: profileData.progressPercent || 0,\n details: profileData.details,\n });\n },\n },\n );\n\n if (!profileResult.success) {\n progressReporter.failed('Failed to inscribe profile');\n return {\n profileTopicId: '',\n success: false,\n error: profileResult.error || 'Failed to inscribe profile',\n transactionId: profileResult.transactionId || '',\n };\n }\n\n progressReporter.completed('Profile stored successfully', {\n profileTopicId: profileResult.profileTopicId,\n });\n\n return {\n profileTopicId: profileResult.profileTopicId,\n pfpTopicId,\n success: true,\n transactionId: profileResult.transactionId || '',\n };\n } catch (error: any) {\n this.logger.error(`Error storing HCS11 profile: ${error.message}`);\n return {\n profileTopicId: '',\n success: false,\n error: error.message,\n transactionId: '',\n };\n }\n }\n\n async createTopic(\n memo: string,\n adminKey?: boolean,\n submitKey?: boolean,\n ): Promise<{\n success: boolean;\n topicId?: string;\n error?: string;\n }> {\n this.logger.info('Creating topic');\n const { accountId, signer } = this.getAccountAndSigner();\n\n const transaction = new TopicCreateTransaction().setTopicMemo(memo);\n\n const publicKey = await this.mirrorNode.getPublicKey(accountId);\n\n if (adminKey && publicKey) {\n transaction.setAdminKey(publicKey);\n transaction.setAutoRenewAccountId(accountId);\n }\n\n if (submitKey && publicKey) {\n transaction.setSubmitKey(publicKey);\n }\n\n const transactionResponse =\n await this.hwc.executeTransactionWithErrorHandling(\n transaction as any,\n false,\n );\n\n const error = transactionResponse.error;\n\n if (error) {\n this.logger.error(error);\n return {\n success: false,\n error,\n };\n }\n\n const resultReceipt = transactionResponse.result;\n\n if (!resultReceipt?.topicId) {\n this.logger.error('Failed to create topic: topicId is null');\n return {\n success: false,\n error: 'Failed to create topic: topicId is null',\n };\n }\n\n return {\n success: true,\n topicId: resultReceipt.topicId.toString(),\n };\n }\n\n public async submitPayload(\n topicId: string,\n payload: object | string,\n submitKey?: PrivateKey,\n requiresFee?: boolean,\n ): Promise<TransactionReceipt> {\n this.logger.debug(`Submitting payload to topic ${topicId}`);\n\n let message: string;\n if (typeof payload === 'string') {\n message = payload;\n } else {\n message = JSON.stringify(payload);\n }\n\n const transaction = new TopicMessageSubmitTransaction()\n .setTopicId(topicId)\n .setMessage(message);\n\n let transactionResponse: {\n result?: TransactionReceipt;\n error?: string;\n };\n\n if (requiresFee) {\n this.logger.info(\n 'Topic requires fee payment, setting max transaction fee',\n );\n transaction.setMaxTransactionFee(new Hbar(this.feeAmount));\n }\n\n if (submitKey) {\n const { accountId, signer } = this.getAccountAndSigner();\n transaction.freezeWithSigner(signer as any);\n const signedTransaction = await transaction.sign(submitKey);\n transactionResponse = await this.hwc.executeTransactionWithErrorHandling(\n signedTransaction,\n true,\n );\n } else {\n transactionResponse = await this.hwc.executeTransactionWithErrorHandling(\n transaction,\n false,\n );\n }\n\n if (transactionResponse?.error) {\n this.logger.error(\n `Failed to submit payload: ${transactionResponse.error}`,\n );\n throw new Error(`Failed to submit payload: ${transactionResponse.error}`);\n }\n\n if (!transactionResponse?.result) {\n this.logger.error(\n 'Failed to submit message: receipt is null or undefined',\n );\n throw new Error('Failed to submit message: receipt is null or undefined');\n }\n\n this.logger.debug('Payload submitted successfully via HWC');\n return transactionResponse.result;\n }\n\n async inscribeFile(\n buffer: Buffer,\n fileName: string,\n options?: {\n progressCallback?: RegistrationProgressCallback;\n waitMaxAttempts?: number;\n waitIntervalMs?: number;\n },\n ): Promise<RetrievedInscriptionResult> {\n const { accountId, signer } = this.getAccountAndSigner();\n\n const mimeType = mime.lookup(fileName) || 'application/octet-stream';\n\n const sdk = await InscriptionSDK.createWithAuth({\n type: 'client',\n accountId: accountId,\n signer: signer as any,\n network: this.network as 'testnet' | 'mainnet',\n });\n\n const inscriptionOptions = {\n mode: 'file' as const,\n waitForConfirmation: true,\n waitMaxAttempts: options?.waitMaxAttempts || 30,\n waitIntervalMs: options?.waitIntervalMs || 4000,\n progressCallback: options?.progressCallback,\n logging: {\n level: this.logger.getLevel ? this.logger.getLevel() : 'info',\n },\n };\n\n const response = await inscribeWithSigner(\n {\n type: 'buffer',\n buffer,\n fileName,\n mimeType,\n },\n signer as any,\n {\n ...inscriptionOptions,\n network: this.network as 'testnet' | 'mainnet',\n },\n sdk,\n );\n\n if (!response.confirmed || !response.inscription) {\n throw new Error('Inscription was not confirmed');\n }\n\n return response.inscription;\n }\n\n getAccountAndSigner(): GetAccountAndSignerResponse {\n const accountInfo = this?.hwc?.getAccountInfo();\n const accountId = accountInfo?.accountId?.toString();\n const signer = this?.hwc?.dAppConnector?.signers?.find(s => {\n return s.getAccountId().toString() === accountId;\n });\n\n if (!signer) {\n this.logger.error('Failed to find signer', {\n accountId,\n signers: this?.hwc?.dAppConnector?.signers,\n accountInfo,\n });\n throw new Error('Failed to find signer');\n }\n\n return { accountId, signer: signer as any };\n }\n\n /**\n * Inscribes a profile picture (PFP) on HCS-11.\n *\n * @param buffer - The buffer containing the PFP image.\n * @param fileName - The name of the file containing the PFP image.\n * @param options - Optional configuration options.\n * @returns A promise that resolves to the topic ID of the inscribed PFP.\n */\n async inscribePfp(\n buffer: Buffer,\n fileName: string,\n options?: {\n progressCallback?: RegistrationProgressCallback;\n },\n ): Promise<InscribePfpResponse> {\n try {\n const progressCallback = options?.progressCallback;\n const progressReporter = new ProgressReporter({\n module: 'PFP-Inscription',\n logger: this.logger,\n callback: progressCallback as any,\n });\n\n if (!this.hcs11Client) {\n progressReporter.failed(\n 'HCS11Client is not available in this environment',\n );\n return {\n pfpTopicId: '',\n success: false,\n error: 'HCS11Client is not available in this environment',\n transactionId: '',\n };\n }\n\n progressReporter.preparing('Preparing to inscribe profile picture', 10);\n this.logger.info('Inscribing profile picture using HCS-11 client');\n\n const wrappedProgressCallback = (data: any) => {\n progressReporter.report({\n stage: data.stage || 'confirming',\n message: data.message || 'Processing PFP inscription',\n progressPercent: data.progressPercent || 50,\n details: data.details,\n });\n };\n\n const imageResult = await this.hcs11Client.inscribeImage(\n buffer,\n fileName,\n { progressCallback: wrappedProgressCallback },\n );\n\n if (!imageResult.success) {\n let errorMessage = 'Failed to inscribe profile picture';\n if (imageResult.error) {\n errorMessage = imageResult.error;\n }\n\n let txId = '';\n if (imageResult.transactionId) {\n txId = imageResult.transactionId;\n }\n\n return {\n pfpTopicId: '',\n success: false,\n error: errorMessage,\n transactionId: txId,\n };\n }\n\n progressReporter.completed('Successfully inscribed profile picture', {\n pfpTopicId: imageResult.imageTopicId,\n });\n\n this.logger.info(\n `Successfully inscribed profile picture with topic ID: ${imageResult.imageTopicId}`,\n );\n return {\n pfpTopicId: imageResult.imageTopicId,\n success: true,\n transactionId: imageResult.transactionId || '',\n };\n } catch (error: any) {\n this.logger.error(`Error inscribing profile picture: ${error.message}`);\n return {\n pfpTopicId: '',\n success: false,\n error: error.message,\n transactionId: '',\n };\n }\n }\n\n private async createCommunicationTopics(\n options?: {\n existingState?: AgentCreationState;\n ttl?: number;\n },\n progressReporter?: ProgressReporter,\n ): Promise<{\n inboundTopicId: string;\n outboundTopicId: string;\n state: AgentCreationState;\n }> {\n let state =\n options?.existingState ||\n ({\n currentStage: 'init',\n completedPercentage: 0,\n createdResources: [],\n } as AgentCreationState);\n\n if (progressReporter) {\n progressReporter.preparing('Starting communication topic creation', 0, {\n state,\n });\n }\n\n const { accountId } = this.getAccountAndSigner();\n if (!state.outboundTopicId) {\n state.currentStage = 'topics';\n if (progressReporter) {\n progressReporter.preparing('Creating outbound topic', 5, {\n state,\n });\n }\n const outboundMemo = this._generateHcs10Memo(Hcs10MemoType.OUTBOUND, {\n ttl: options?.ttl,\n accountId,\n });\n const outboundResult = await this.createTopic(outboundMemo, true, true);\n if (!outboundResult.success || !outboundResult.topicId) {\n throw new Error(\n outboundResult.error || 'Failed to create outbound topic',\n );\n }\n state.outboundTopicId = outboundResult.topicId;\n if (state.createdResources)\n state.createdResources.push(`outbound:${state.outboundTopicId}`);\n }\n\n if (!state.inboundTopicId) {\n state.currentStage = 'topics';\n if (progressReporter) {\n progressReporter.preparing('Creating inbound topic', 10, {\n state,\n });\n }\n const inboundMemo = this._generateHcs10Memo(Hcs10MemoType.INBOUND, {\n ttl: options?.ttl,\n accountId,\n });\n // TODO: mimic SDK's createInboundTopic\n const inboundResult = await this.createTopic(inboundMemo, true, false);\n if (!inboundResult.success || !inboundResult.topicId) {\n throw new Error(\n inboundResult.error || 'Failed to create inbound topic',\n );\n }\n state.inboundTopicId = inboundResult.topicId;\n if (state.createdResources)\n state.createdResources.push(`inbound:${state.inboundTopicId}`);\n }\n\n return {\n inboundTopicId: state.inboundTopicId,\n outboundTopicId: state.outboundTopicId,\n state,\n };\n }\n}\n","export interface FeeConfigBuilderInterface {\n addHbarFee(\n hbarAmount: number,\n collectorAccountId?: string,\n exemptAccountIds?: string[],\n ): FeeConfigBuilderInterface;\n addTokenFee(\n tokenAmount: number,\n feeTokenId: string,\n collectorAccountId?: string,\n decimals?: number,\n exemptAccountIds?: string[],\n ): Promise<FeeConfigBuilderInterface>;\n build(): TopicFeeConfig;\n}\n\nexport enum CustomFeeType {\n FIXED_FEE = 'FIXED_FEE',\n FRACTIONAL_FEE = 'FRACTIONAL_FEE',\n ROYALTY_FEE = 'ROYALTY_FEE',\n}\n\nexport type FeeAmount = {\n amount: number;\n decimals?: number;\n};\n\nexport interface TokenFeeConfig {\n feeAmount: FeeAmount;\n feeCollectorAccountId: string;\n feeTokenId?: string;\n exemptAccounts: string[];\n type: CustomFeeType;\n}\n\nexport interface TopicFeeConfig {\n customFees: TokenFeeConfig[];\n exemptAccounts: string[];\n}\n","import {\n FeeConfigBuilderInterface,\n TokenFeeConfig,\n TopicFeeConfig,\n CustomFeeType,\n} from './types';\nimport { HederaMirrorNode } from '../services/mirror-node';\nimport { Logger } from '../utils/logger';\nimport { NetworkType } from '../utils/types';\n\n/**\n * FeeConfigBuilder provides a fluent interface for creating fee configurations\n * for HCS-10 topics. This makes it easy to configure fees without dealing with\n * the complexity of the underlying fee structure.\n *\n * Example usage:\n *\n * // Super simple one-liner with the factory method\n * const simpleFeeConfig = FeeConfigBuilder.forHbar(5, '0.0.12345', NetworkType.TESTNET, new Logger(), ['0.0.67890']);\n *\n * // With multiple fees:\n * const multipleFeeConfig = new FeeConfigBuilder({\n * network: NetworkType.TESTNET,\n * logger: new Logger(),\n * defaultCollectorAccountId: '0.0.12345',\n * defaultExemptAccountIds: ['0.0.67890']\n * })\n * .withHbarFee(1) // 1 HBAR fee\n * .withTokenFee(10, '0.0.54321') // 10 units of token 0.0.54321\n * .build();\n *\n * With Agent Builder\n * const agent = new AgentBuilder()\n * .setName('Fee Collector Agent')\n * .setDescription('An agent that collects fees')\n * .setInboundTopicType(InboundTopicType.FEE_BASED)\n * .setFeeConfig(FeeConfigBuilder.forHbar(1, '0.0.12345', NetworkType.TESTNET, new Logger(), ['0.0.67890']))\n * .setNetwork('testnet')\n .build();\n\n * Directly with client\n * const client = new HCS10Client(config);\n * const connectionFeeConfig = new FeeConfigBuilder({\n * network: NetworkType.TESTNET,\n * logger: new Logger(),\n * defaultCollectorAccountId: client.getAccountAndSigner().accountId,\n * defaultExemptAccountIds: ['0.0.67890']\n * })\n * .withHbarFee(0.5) // 0.5 HBAR (simple!)\n * .build();\n\n * const result = await client.handleConnectionRequest(\n * inboundTopicId,\n * requestingAccountId,\n * connectionRequestId,\n * connectionFeeConfig\n * );\n*/\nexport interface FeeConfigBuilderOptions {\n network: NetworkType;\n logger: Logger;\n defaultCollectorAccountId?: string;\n}\n\nexport class FeeConfigBuilder implements FeeConfigBuilderInterface {\n private customFees: TokenFeeConfig[] = [];\n private mirrorNode: HederaMirrorNode;\n private logger: Logger;\n private defaultCollectorAccountId: string;\n\n constructor(options: FeeConfigBuilderOptions) {\n this.logger = options.logger;\n this.mirrorNode = new HederaMirrorNode(options.network, options.logger);\n this.defaultCollectorAccountId = options.defaultCollectorAccountId || '';\n }\n\n /**\n * Static factory method to create a FeeConfigBuilder with a single HBAR fee.\n * @param hbarAmount Amount in HBAR.\n * @param collectorAccountId Optional account ID to collect the fee. If omitted or undefined, defaults to the agent's own account ID during topic creation.\n * @param network Network type ('mainnet' or 'testnet').\n * @param logger Logger instance.\n * @param exemptAccounts Optional array of account IDs exempt from this fee.\n * @returns A configured FeeConfigBuilder instance.\n */\n static forHbar(\n hbarAmount: number,\n collectorAccountId: string | undefined,\n network: NetworkType,\n logger: Logger,\n exemptAccounts: string[] = [],\n ): FeeConfigBuilder {\n const builder = new FeeConfigBuilder({\n network,\n logger,\n defaultCollectorAccountId: collectorAccountId,\n });\n return builder.addHbarFee(hbarAmount, collectorAccountId, exemptAccounts);\n }\n\n /**\n * Static factory method to create a FeeConfigBuilder with a single token fee.\n * Automatically fetches token decimals if not provided.\n * @param tokenAmount Amount of tokens.\n * @param feeTokenId Token ID for the fee.\n * @param collectorAccountId Optional account ID to collect the fee. If omitted or undefined, defaults to the agent's own account ID during topic creation.\n * @param network Network type ('mainnet' or 'testnet').\n * @param logger Logger instance.\n * @param exemptAccounts Optional array of account IDs exempt from this fee.\n * @param decimals Optional decimals for the token (fetched if omitted).\n * @returns A Promise resolving to a configured FeeConfigBuilder instance.\n */\n static async forToken(\n tokenAmount: number,\n feeTokenId: string,\n collectorAccountId: string | undefined,\n network: NetworkType,\n logger: Logger,\n exemptAccounts: string[] = [],\n decimals?: number,\n ): Promise<FeeConfigBuilder> {\n const builder = new FeeConfigBuilder({\n network,\n logger,\n defaultCollectorAccountId: collectorAccountId,\n });\n await builder.addTokenFee(\n tokenAmount,\n feeTokenId,\n collectorAccountId,\n decimals,\n exemptAccounts,\n );\n return builder;\n }\n\n /**\n * Adds an HBAR fee configuration to the builder.\n * Allows chaining multiple fee additions.\n * @param hbarAmount The amount in HBAR (e.g., 0.5).\n * @param collectorAccountId Optional. The account ID to collect this fee. If omitted, defaults to the agent's own account ID during topic creation.\n * @param exemptAccountIds Optional. Accounts specifically exempt from *this* HBAR fee.\n * @returns This FeeConfigBuilder instance for chaining.\n */\n addHbarFee(\n hbarAmount: number,\n collectorAccountId?: string,\n exemptAccountIds: string[] = [],\n ): FeeConfigBuilder {\n if (hbarAmount <= 0) {\n throw new Error('HBAR amount must be greater than zero');\n }\n\n this.customFees.push({\n feeAmount: {\n amount: hbarAmount * 100_000_000,\n decimals: 0,\n },\n feeCollectorAccountId: collectorAccountId || '',\n feeTokenId: undefined,\n exemptAccounts: [...exemptAccountIds],\n type: CustomFeeType.FIXED_FEE,\n });\n\n return this;\n }\n\n /**\n * Adds a token fee configuration to the builder.\n * Allows chaining multiple fee additions.\n * Fetches token decimals automatically if not provided.\n * @param tokenAmount The amount of the specified token.\n * @param feeTokenId The ID of the token to charge the fee in.\n * @param collectorAccountId Optional. The account ID to collect this fee. If omitted, defaults to the agent's own account ID during topic creation.\n * @param decimals Optional. The number of decimals for the token. If omitted, it will be fetched from the mirror node.\n * @param exemptAccountIds Optional. Accounts specifically exempt from *this* token fee.\n * @returns A Promise resolving to this FeeConfigBuilder instance for chaining.\n */\n async addTokenFee(\n tokenAmount: number,\n feeTokenId: string,\n collectorAccountId?: string,\n decimals?: number,\n exemptAccountIds: string[] = [],\n ): Promise<FeeConfigBuilder> {\n if (tokenAmount <= 0) {\n throw new Error('Token amount must be greater than zero');\n }\n if (!feeTokenId) {\n throw new Error('Fee token ID is required when adding a token fee');\n }\n\n let finalDecimals = decimals;\n if (finalDecimals === undefined) {\n try {\n const tokenInfo = await this.mirrorNode.getTokenInfo(feeTokenId);\n if (tokenInfo?.decimals) {\n finalDecimals = parseInt(tokenInfo.decimals, 10);\n this.logger.info(\n `Fetched decimals for ${feeTokenId}: ${finalDecimals}`,\n );\n } else {\n this.logger.warn(\n `Could not fetch decimals for ${feeTokenId}, defaulting to 0.`,\n );\n finalDecimals = 0;\n }\n } catch (error) {\n this.logger.error(\n `Error fetching decimals for ${feeTokenId}, defaulting to 0: ${error}`,\n );\n finalDecimals = 0;\n }\n }\n\n this.customFees.push({\n feeAmount: {\n amount: tokenAmount * 10 ** finalDecimals,\n decimals: finalDecimals,\n },\n feeCollectorAccountId: collectorAccountId || '',\n feeTokenId: feeTokenId,\n exemptAccounts: [...exemptAccountIds],\n type: CustomFeeType.FIXED_FEE,\n });\n\n return this;\n }\n\n /**\n * Builds the final TopicFeeConfig object.\n * @returns The TopicFeeConfig containing all added custom fees and a consolidated list of unique exempt accounts.\n * @throws Error if no fees have been added.\n * @throws Error if more than 10 fees have been added.\n */\n build(): TopicFeeConfig {\n if (this.customFees.length === 0) {\n throw new Error(\n 'At least one fee must be added using addHbarFee/addTokenFee or created using forHbar/forToken',\n );\n }\n\n if (this.customFees.length > 10) {\n throw new Error('Maximum of 10 custom fees per topic allowed');\n }\n\n const allExemptAccounts = new Set<string>();\n this.customFees.forEach(fee => {\n fee.exemptAccounts.forEach(account => allExemptAccounts.add(account));\n });\n\n return {\n customFees: this.customFees,\n exemptAccounts: Array.from(allExemptAccounts),\n };\n }\n}\n","import { Logger, LoggerOptions } from '../utils/logger';\nimport { HCSMessage, HCS10BaseClient } from './base-client';\nimport { AIAgentProfile } from '../hcs-11';\nimport { TransactMessage } from './types';\n\n/**\n * Represents a connection request between agents\n */\nexport interface ConnectionRequest {\n id: number;\n requesterId: string;\n requesterTopicId: string;\n targetAccountId: string;\n targetTopicId: string;\n operatorId: string;\n sequenceNumber: number;\n created: Date;\n memo?: string;\n status: 'pending' | 'confirmed' | 'rejected';\n}\n\n/**\n * Represents an active connection between agents\n */\nexport interface Connection {\n connectionTopicId: string;\n targetAccountId: string;\n targetAgentName?: string;\n targetInboundTopicId?: string;\n targetOutboundTopicId?: string;\n status: 'pending' | 'established' | 'needs_confirmation' | 'closed';\n isPending: boolean;\n needsConfirmation: boolean;\n memo?: string;\n created: Date;\n lastActivity?: Date;\n profileInfo?: AIAgentProfile;\n connectionRequestId?: number;\n confirmedRequestId?: number;\n requesterOutboundTopicId?: string;\n inboundRequestId?: number;\n closedReason?: string;\n closeMethod?: string;\n uniqueRequestKey?: string;\n originTopicId?: string;\n processed: boolean;\n}\n\n/**\n * Options for the connections manager\n */\nexport interface ConnectionsManagerOptions {\n logLevel?: 'debug' | 'info' | 'warn' | 'error';\n filterPendingAccountIds?: string[];\n baseClient: HCS10BaseClient;\n silent?: boolean;\n}\n\n/**\n * Defines the interface for a connections manager that handles HCS-10 connections\n * This interface represents the public API of ConnectionsManager\n */\nexport interface IConnectionsManager {\n /**\n * Fetches and processes connection data using the configured client\n * @param accountId - The account ID to fetch connection data for\n * @returns A promise that resolves to an array of Connection objects\n */\n fetchConnectionData(accountId: string): Promise<Connection[]>;\n\n /**\n * Process outbound messages to track connection requests and confirmations\n * @param messages - The messages to process\n * @param accountId - The account ID that sent the messages\n * @returns Array of connections after processing\n */\n processOutboundMessages(\n messages: HCSMessage[],\n accountId: string,\n ): Connection[];\n\n /**\n * Process inbound messages to track connection requests and confirmations\n * @param messages - The messages to process\n * @returns Array of connections after processing\n */\n processInboundMessages(messages: HCSMessage[]): Connection[];\n\n /**\n * Process connection topic messages to update last activity time\n * @param connectionTopicId - The topic ID of the connection\n * @param messages - The messages to process\n * @returns The updated connection or undefined if not found\n */\n processConnectionMessages(\n connectionTopicId: string,\n messages: HCSMessage[],\n ): Connection | undefined;\n\n /**\n * Adds or updates profile information for a connection\n * @param accountId - The account ID to add profile info for\n * @param profile - The profile information\n */\n addProfileInfo(accountId: string, profile: AIAgentProfile): void;\n\n /**\n * Gets all connections\n * @returns Array of all connections that should be visible\n */\n getAllConnections(): Connection[];\n\n /**\n * Gets all pending connection requests\n * @returns Array of pending connection requests\n */\n getPendingRequests(): Connection[];\n\n /**\n * Gets all active (established) connections\n * @returns Array of active connections\n */\n getActiveConnections(): Connection[];\n\n /**\n * Gets all connections needing confirmation\n * @returns Array of connections needing confirmation\n */\n getConnectionsNeedingConfirmation(): Connection[];\n\n /**\n * Gets a connection by its topic ID\n * @param connectionTopicId - The topic ID to look up\n * @returns The connection with the given topic ID, or undefined if not found\n */\n getConnectionByTopicId(connectionTopicId: string): Connection | undefined;\n\n /**\n * Gets a connection by account ID\n * @param accountId - The account ID to look up\n * @returns The connection with the given account ID, or undefined if not found\n */\n getConnectionByAccountId(accountId: string): Connection | undefined;\n\n /**\n * Gets all connections for a specific account ID\n * @param accountId - The account ID to look up\n * @returns Array of connections for the given account ID\n */\n getConnectionsByAccountId(accountId: string): Connection[];\n\n /**\n * Updates or adds a connection\n * @param connection - The connection to update or add\n */\n updateOrAddConnection(connection: Connection): void;\n\n /**\n * Clears all tracked connections and requests\n */\n clearAll(): void;\n\n /**\n * Checks if a given connection request has been processed already\n * This uses a combination of topic ID and request ID to uniquely identify requests\n *\n * @param inboundTopicId - The inbound topic ID where the request was received\n * @param requestId - The sequence number (request ID)\n * @returns True if this specific request has been processed, false otherwise\n */\n isConnectionRequestProcessed(\n inboundTopicId: string,\n requestId: number,\n ): boolean;\n\n /**\n * Marks a specific connection request as processed\n *\n * @param inboundTopicId - The inbound topic ID where the request was received\n * @param requestId - The sequence number (request ID)\n * @returns True if a matching connection was found and marked, false otherwise\n */\n markConnectionRequestProcessed(\n inboundTopicId: string,\n requestId: number,\n ): boolean;\n\n /**\n * Gets pending transactions from a specific connection\n * @param connectionTopicId - The connection topic ID to check for transactions\n * @param limit - Optional limit for the number of transactions to return\n * @returns Array of pending transaction messages sorted by timestamp (newest first)\n */\n getPendingTransactions(\n connectionTopicId: string,\n limit?: number,\n ): Promise<TransactMessage[]>;\n\n /**\n * Gets the status of a scheduled transaction\n * @param scheduleId - The schedule ID to check\n * @returns Status of the scheduled transaction\n */\n getScheduledTransactionStatus(scheduleId: string): Promise<{\n executed: boolean;\n executedTimestamp?: string;\n deleted: boolean;\n expirationTime?: string;\n }>;\n\n /**\n * Gets the timestamp of the last message sent by the specified operator on the connection topic\n * @param connectionTopicId - The topic ID to check\n * @param operatorAccountId - The account ID of the operator\n * @returns The timestamp of the last message or undefined if no messages found\n */\n getLastOperatorActivity(\n connectionTopicId: string,\n operatorAccountId: string,\n ): Promise<Date | undefined>;\n}\n\n/**\n * ConnectionsManager provides a unified way to track and manage HCS-10 connections\n * across different applications. It works with both frontend and backend implementations.\n */\nexport class ConnectionsManager implements IConnectionsManager {\n private logger: Logger;\n private connections: Map<string, Connection> = new Map();\n private pendingRequests: Map<string, ConnectionRequest> = new Map();\n private profileCache: Map<string, AIAgentProfile> = new Map();\n private filterPendingAccountIds: Set<string> = new Set();\n private baseClient: HCS10BaseClient;\n\n /**\n * Creates a new ConnectionsManager instance\n */\n constructor(options: ConnectionsManagerOptions) {\n const loggerOptions: LoggerOptions = {\n module: 'ConnectionsManager',\n level: options?.logLevel || 'info',\n prettyPrint: true,\n silent: options?.silent,\n };\n this.logger = new Logger(loggerOptions);\n\n if (options?.filterPendingAccountIds) {\n this.filterPendingAccountIds = new Set(options.filterPendingAccountIds);\n }\n\n if (!options.baseClient) {\n throw new Error('ConnectionsManager requires a baseClient to operate');\n }\n\n this.baseClient = options.baseClient;\n }\n\n /**\n * Fetches and processes connection data using the configured client\n * @param accountId - The account ID to fetch connection data for\n * @returns A promise that resolves to an array of Connection objects\n */\n async fetchConnectionData(accountId: string): Promise<Connection[]> {\n try {\n const topicInfo =\n await this.baseClient.retrieveCommunicationTopics(accountId);\n\n const isValidTopicId = (topicId: string): boolean => {\n return Boolean(topicId) && !topicId.includes(':');\n };\n\n if (\n !isValidTopicId(topicInfo.inboundTopic) ||\n !isValidTopicId(topicInfo.outboundTopic)\n ) {\n this.logger.warn(\n 'Invalid topic IDs detected in retrieved communication topics',\n );\n return this.getAllConnections();\n }\n\n const [outboundMessagesResult, inboundMessagesResult] = await Promise.all(\n [\n this.baseClient.getMessages(topicInfo.outboundTopic),\n this.baseClient.getMessages(topicInfo.inboundTopic),\n ],\n );\n\n this.processOutboundMessages(\n outboundMessagesResult.messages || [],\n accountId,\n );\n this.processInboundMessages(inboundMessagesResult.messages || []);\n\n const pendingCount = Array.from(this.connections.values()).filter(\n conn => conn.status === 'pending' || conn.isPending,\n ).length;\n this.logger.debug(\n `Processed ${\n outboundMessagesResult.messages?.length || 0\n } outbound and ${\n inboundMessagesResult.messages?.length || 0\n } inbound messages. Found ${pendingCount} pending connections.`,\n );\n\n await this.checkTargetInboundTopicsForConfirmations();\n await this.checkOutboundRequestsForConfirmations();\n await this.fetchProfilesForConnections();\n await this.fetchConnectionActivity();\n\n return this.getAllConnections();\n } catch (error) {\n this.logger.error('Error fetching connection data:', error);\n return this.getAllConnections();\n }\n }\n\n /**\n * Checks target agent inbound topics to find confirmations for pending requests\n * that might not be visible in our local messages\n */\n private async checkTargetInboundTopicsForConfirmations(): Promise<void> {\n const pendingConnections = Array.from(this.connections.values()).filter(\n conn =>\n (conn.isPending || conn.status === 'pending') &&\n conn.targetInboundTopicId,\n );\n\n if (pendingConnections.length === 0) {\n return;\n }\n\n const pendingRequestsByTarget = new Map<string, Connection[]>();\n\n pendingConnections.forEach(conn => {\n if (conn.targetInboundTopicId) {\n const requests =\n pendingRequestsByTarget.get(conn.targetInboundTopicId) || [];\n requests.push(conn);\n pendingRequestsByTarget.set(conn.targetInboundTopicId, requests);\n }\n });\n\n const MAX_FETCH_ATTEMPTS = 2;\n const FETCH_DELAY_MS = 500;\n\n for (const [\n targetInboundTopicId,\n requests,\n ] of pendingRequestsByTarget.entries()) {\n for (let attempt = 1; attempt <= MAX_FETCH_ATTEMPTS; attempt++) {\n try {\n const targetMessagesResult =\n await this.baseClient.getMessages(targetInboundTopicId);\n const targetMessages = targetMessagesResult.messages || [];\n\n let confirmedAny = false;\n\n for (const conn of requests) {\n const requestId = conn.connectionRequestId;\n if (!requestId) {\n continue;\n }\n\n const confirmationMsg = targetMessages.find(msg => {\n if (msg.op !== 'connection_created' || !msg.connection_topic_id) {\n return false;\n }\n\n if (msg.connection_id !== requestId) {\n return false;\n }\n\n if (conn.uniqueRequestKey) {\n const keyParts = conn.uniqueRequestKey.split(':');\n if (keyParts.length > 1) {\n const operatorIdPart = keyParts[1];\n\n if (msg.operator_id && msg.operator_id === operatorIdPart) {\n return true;\n }\n\n if (msg.connected_account_id === conn.targetAccountId) {\n return true;\n }\n }\n }\n\n return true;\n });\n\n if (confirmationMsg?.connection_topic_id) {\n confirmedAny = true;\n\n const connectionTopicId = confirmationMsg.connection_topic_id;\n\n let pendingKey = conn.uniqueRequestKey;\n\n const newConnection: Connection = {\n connectionTopicId,\n targetAccountId: conn.targetAccountId,\n targetAgentName: conn.targetAgentName,\n targetInboundTopicId: conn.targetInboundTopicId,\n status: 'established',\n isPending: false,\n needsConfirmation: false,\n created: new Date(confirmationMsg.created || conn.created),\n profileInfo: conn.profileInfo,\n connectionRequestId: requestId,\n uniqueRequestKey: conn.uniqueRequestKey,\n originTopicId: conn.originTopicId,\n processed: conn.processed,\n memo: conn.memo,\n };\n\n this.connections.set(connectionTopicId, newConnection);\n\n if (pendingKey) {\n this.connections.delete(pendingKey);\n }\n\n this.logger.debug(\n `Confirmed connection in target inbound topic: ${connectionTopicId}`,\n );\n }\n }\n\n if (confirmedAny || attempt === MAX_FETCH_ATTEMPTS) {\n break;\n }\n\n await new Promise(resolve => setTimeout(resolve, FETCH_DELAY_MS));\n } catch (error) {\n this.logger.debug(\n `Error fetching target inbound topic ${targetInboundTopicId}:`,\n error,\n );\n if (attempt === MAX_FETCH_ATTEMPTS) {\n break;\n }\n await new Promise(resolve => setTimeout(resolve, FETCH_DELAY_MS));\n }\n }\n }\n }\n\n /**\n * Checks target agents' inbound topics for confirmations of our outbound connection requests\n * This complements checkTargetInboundTopicsForConfirmations by looking for confirmations\n * that might have been sent to the target agent's inbound topic rather than our own\n */\n private async checkOutboundRequestsForConfirmations(): Promise<void> {\n const allConnections = Array.from(this.connections.values());\n this.logger.info(`Total connections in map: ${allConnections.length}`);\n\n const pendingByStatus = allConnections.filter(\n conn => conn.status === 'pending',\n );\n this.logger.info(\n `Connections with status='pending': ${pendingByStatus.length}`,\n );\n\n const pendingConnections = allConnections.filter(\n conn => conn.status === 'pending',\n );\n\n if (!Boolean(pendingConnections?.length)) {\n this.logger.info('No pending connections found');\n return;\n }\n\n for (const conn of pendingConnections) {\n this.logger.debug(\n `Processing pending connection: ${conn.connectionTopicId}`,\n );\n\n if (!conn.targetAccountId) {\n this.logger.debug(\n `Skipping connection ${conn.connectionTopicId} - no targetAccountId`,\n );\n continue;\n }\n\n let targetInboundTopicId = conn.targetInboundTopicId;\n if (!targetInboundTopicId) {\n try {\n const profileResponse = await this.baseClient.retrieveProfile(\n conn.targetAccountId,\n );\n if (profileResponse?.profile?.inboundTopicId) {\n targetInboundTopicId = profileResponse.profile.inboundTopicId;\n this.connections.set(conn.connectionTopicId, {\n ...conn,\n targetInboundTopicId,\n });\n this.logger.debug(\n `Updated connection ${conn.connectionTopicId} with inbound topic ID: ${targetInboundTopicId}`,\n );\n } else {\n this.logger.debug(\n `Couldn't get inbound topic ID for account ${conn.targetAccountId}`,\n );\n continue;\n }\n } catch (error) {\n this.logger.debug(\n `Error fetching profile for ${conn.targetAccountId}: ${error}`,\n );\n continue;\n }\n }\n\n if (!targetInboundTopicId || targetInboundTopicId.includes(':')) {\n this.logger.debug(\n `Skipping invalid inbound topic format: ${targetInboundTopicId}`,\n );\n continue;\n }\n\n const requestId = conn.connectionRequestId || conn.inboundRequestId;\n if (!requestId) {\n this.logger.debug(\n `Skipping connection ${conn.connectionTopicId} - no request ID`,\n );\n continue;\n }\n\n try {\n this.logger.debug(\n `Checking for confirmations on topic ${targetInboundTopicId} for request ID ${requestId}`,\n );\n const targetMessagesResult =\n await this.baseClient.getMessages(targetInboundTopicId);\n const targetMessages = targetMessagesResult.messages || [];\n\n const confirmationMsg = targetMessages.find(\n msg =>\n msg.op === 'connection_created' &&\n msg.connection_id === requestId &&\n msg.connection_topic_id,\n );\n\n if (confirmationMsg?.connection_topic_id) {\n const connectionTopicId = confirmationMsg.connection_topic_id;\n this.logger.info(\n `Found confirmation for request #${requestId} to ${conn.targetAccountId} on their inbound topic`,\n );\n\n this.connections.set(conn.connectionTopicId, {\n ...conn,\n connectionTopicId,\n status: 'established',\n isPending: false,\n needsConfirmation: false,\n created: new Date(confirmationMsg.created || conn.created),\n lastActivity: new Date(confirmationMsg.created || conn.created),\n });\n } else {\n this.logger.debug(\n `No confirmation found for request ID ${requestId} on topic ${targetInboundTopicId}`,\n );\n }\n } catch (error) {\n this.logger.warn(\n `Error checking for confirmations on target inbound topic for ${conn.targetAccountId}: ${error}`,\n );\n }\n }\n }\n\n /**\n * Fetches profiles for all connected accounts\n * @param accountId - The account ID making the request\n */\n private async fetchProfilesForConnections(): Promise<void> {\n const targetAccountIds = new Set<string>();\n\n for (const connection of this.connections.values()) {\n if (\n connection.targetAccountId &&\n !this.profileCache.has(connection.targetAccountId)\n ) {\n targetAccountIds.add(connection.targetAccountId);\n }\n }\n\n const accountIdPromises = Array.from(targetAccountIds).map(\n async targetId => {\n try {\n const profileResponse =\n await this.baseClient.retrieveProfile(targetId);\n if (profileResponse.success && profileResponse.profile) {\n this.addProfileInfo(targetId, profileResponse.profile);\n\n this.updatePendingConnectionsWithProfileInfo(\n targetId,\n profileResponse.profile,\n );\n }\n } catch (error) {\n this.logger.debug(`Failed to fetch profile for ${targetId}:`, error);\n }\n },\n );\n\n await Promise.allSettled(accountIdPromises);\n }\n\n /**\n * Updates pending connections with inbound topic IDs from profile info\n * @param accountId - The account ID to update connections for\n * @param profile - The profile containing the inbound topic ID\n */\n private updatePendingConnectionsWithProfileInfo(\n accountId: string,\n profile: AIAgentProfile,\n ): void {\n const pendingConnections = Array.from(this.connections.values()).filter(\n conn =>\n conn.targetAccountId === accountId &&\n (conn.isPending || conn.needsConfirmation) &&\n !conn.targetInboundTopicId,\n );\n\n if (pendingConnections.length > 0 && profile.inboundTopicId) {\n for (const conn of pendingConnections) {\n const updatedConn = {\n ...conn,\n targetInboundTopicId: profile.inboundTopicId,\n };\n this.connections.set(conn.connectionTopicId, updatedConn);\n }\n }\n }\n\n /**\n * Fetches activity from active connection topics\n * Updates the lastActivity timestamp for each connection based on latest messages\n * @returns Promise that resolves when all activity has been fetched\n */\n private async fetchConnectionActivity(): Promise<void> {\n const activeConnections = this.getActiveConnections();\n\n const validConnections = activeConnections.filter(connection => {\n const topicId = connection.connectionTopicId;\n\n if (!topicId || topicId.includes(':') || !topicId.match(/^0\\.0\\.\\d+$/)) {\n this.logger.debug(\n `Skipping activity fetch for invalid topic ID format: ${topicId}`,\n );\n return false;\n }\n return true;\n });\n\n const activityPromises = validConnections.map(async connection => {\n try {\n const topicId = connection.connectionTopicId;\n const messagesResult = await this.baseClient.getMessages(topicId);\n\n if (messagesResult?.messages?.length > 0) {\n this.processConnectionMessages(topicId, messagesResult.messages);\n }\n } catch (error) {\n this.logger.debug(\n `Failed to fetch activity for ${connection.connectionTopicId}:`,\n error,\n );\n }\n });\n\n await Promise.allSettled(activityPromises);\n }\n\n /**\n * Checks if an account should be filtered, taking into account existing established connections\n * @param accountId - The account ID to check\n * @returns True if the account should be filtered, false otherwise\n */\n private shouldFilterAccount(accountId: string): boolean {\n if (!this.filterPendingAccountIds.has(accountId)) {\n return false;\n }\n\n if (this.hasEstablishedConnectionWithAccount(accountId)) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Process outbound messages to track connection requests and confirmations\n * @param messages - The messages to process\n * @param accountId - The account ID that sent the messages\n * @returns Array of connections after processing\n */\n processOutboundMessages(\n messages: HCSMessage[],\n accountId: string,\n ): Connection[] {\n if (!Boolean(messages?.length)) {\n return Array.from(this.connections.values());\n }\n\n const requestMessages = messages.filter(\n msg => msg.op === 'connection_request' && msg.connection_request_id,\n );\n\n for (const msg of requestMessages) {\n const requestId = msg.connection_request_id!;\n const operatorId = msg.operator_id || '';\n const targetAccountId =\n this.baseClient.extractAccountFromOperatorId(operatorId);\n const targetInboundTopicId =\n this.baseClient.extractTopicFromOperatorId(operatorId);\n\n if (this.shouldFilterAccount(targetAccountId)) {\n this.logger.debug(\n `Filtering out outbound request to account: ${targetAccountId}`,\n );\n continue;\n }\n\n const isAlreadyConfirmed = Array.from(this.connections.values()).some(\n conn =>\n conn.connectionRequestId === requestId &&\n !conn.isPending &&\n conn.targetAccountId === targetAccountId,\n );\n\n const pendingKey = `req-${requestId}:${operatorId}`;\n\n if (!isAlreadyConfirmed && !this.pendingRequests.has(pendingKey)) {\n const pendingRequest = {\n id: requestId,\n requesterId: accountId,\n requesterTopicId: msg.outbound_topic_id || '',\n targetAccountId,\n targetTopicId: targetInboundTopicId,\n operatorId,\n sequenceNumber: msg.sequence_number,\n created: msg.created || new Date(),\n memo: msg.m,\n status: 'pending' as 'pending' | 'confirmed' | 'rejected',\n };\n\n this.pendingRequests.set(pendingKey, pendingRequest);\n\n if (!this.connections.has(pendingKey)) {\n const pendingConnection = {\n connectionTopicId: pendingKey,\n targetAccountId,\n targetInboundTopicId,\n status: 'pending' as\n | 'pending'\n | 'established'\n | 'needs_confirmation'\n | 'closed',\n isPending: true,\n needsConfirmation: false,\n created: msg.created || new Date(),\n connectionRequestId: requestId,\n uniqueRequestKey: pendingKey,\n originTopicId: msg.outbound_topic_id || '',\n processed: false,\n memo: msg.m,\n };\n\n this.connections.set(pendingKey, pendingConnection);\n }\n }\n }\n\n const confirmationMessages = messages.filter(\n msg =>\n msg.op === 'connection_created' &&\n msg.connection_topic_id &&\n msg.connection_request_id,\n );\n\n for (const msg of confirmationMessages) {\n const requestId = msg.connection_request_id!;\n const connectionTopicId = msg.connection_topic_id!;\n const targetAccountId = this.baseClient.extractAccountFromOperatorId(\n msg.operator_id || '',\n );\n\n if (this.shouldFilterAccount(targetAccountId)) {\n this.logger.debug(\n `Filtering out outbound confirmation to account: ${targetAccountId}`,\n );\n continue;\n }\n\n const pendingKey = `req-${requestId}:${msg.operator_id}`;\n\n const pendingRequest = this.pendingRequests.get(pendingKey);\n if (pendingRequest) {\n pendingRequest.status = 'confirmed';\n }\n\n if (this.connections.has(pendingKey)) {\n this.connections.delete(pendingKey);\n }\n\n if (!this.connections.has(connectionTopicId)) {\n this.connections.set(connectionTopicId, {\n connectionTopicId,\n targetAccountId,\n status: 'established',\n isPending: false,\n needsConfirmation: false,\n created: msg.created || new Date(),\n connectionRequestId: requestId,\n confirmedRequestId: msg.confirmed_request_id,\n requesterOutboundTopicId: msg.outbound_topic_id,\n uniqueRequestKey: pendingKey,\n originTopicId: msg.outbound_topic_id || '',\n processed: false,\n memo: msg.m,\n });\n } else {\n const conn = this.connections.get(connectionTopicId)!;\n this.connections.set(connectionTopicId, {\n ...conn,\n status: 'established',\n isPending: false,\n needsConfirmation: false,\n connectionRequestId: requestId,\n confirmedRequestId: msg.confirmed_request_id,\n requesterOutboundTopicId: msg.outbound_topic_id,\n uniqueRequestKey: pendingKey,\n originTopicId: msg.outbound_topic_id || '',\n processed: false,\n memo: msg.m,\n });\n }\n }\n\n const closedMessages = messages.filter(\n msg =>\n (msg.op as string) === 'connection_closed' ||\n (msg.op === 'close_connection' && msg.connection_topic_id),\n );\n\n for (const msg of closedMessages) {\n const connectionTopicId = msg.connection_topic_id!;\n\n if (this.connections.has(connectionTopicId)) {\n const conn = this.connections.get(connectionTopicId)!;\n if (\n this.shouldFilterAccount(conn.targetAccountId) &&\n conn.status !== 'established'\n ) {\n continue;\n }\n\n const uniqueKey =\n msg.connection_request_id && msg.operator_id\n ? `req-${msg.connection_request_id}:${msg.operator_id}`\n : undefined;\n\n this.connections.set(connectionTopicId, {\n ...conn,\n status: 'closed',\n isPending: false,\n needsConfirmation: false,\n lastActivity: msg.created || new Date(),\n closedReason: msg.reason,\n closeMethod: msg.close_method,\n uniqueRequestKey: uniqueKey,\n originTopicId: conn.originTopicId,\n processed: false,\n memo: msg.m,\n });\n }\n }\n\n return Array.from(this.connections.values()).filter(\n conn =>\n conn.status === 'established' ||\n conn.status === 'closed' ||\n !this.filterPendingAccountIds.has(conn.targetAccountId),\n );\n }\n\n /**\n * Process inbound messages to track connection requests and confirmations\n * @param messages - The messages to process\n * @returns Array of connections after processing\n */\n processInboundMessages(messages: HCSMessage[]): Connection[] {\n if (!Boolean(messages?.length)) {\n return Array.from(this.connections.values());\n }\n\n const requestMessages = messages.filter(\n msg => msg.op === 'connection_request' && msg.sequence_number,\n );\n\n const confirmationMessages = messages.filter(\n msg =>\n msg.op === 'connection_created' &&\n msg.connection_topic_id &&\n msg.connection_id,\n );\n\n for (const msg of requestMessages) {\n const sequenceNumber = msg.sequence_number;\n const operatorId = msg.operator_id || '';\n const requestorAccountId =\n this.baseClient.extractAccountFromOperatorId(operatorId);\n const requestorTopicId =\n this.baseClient.extractTopicFromOperatorId(operatorId);\n\n if (this.shouldFilterAccount(requestorAccountId)) {\n this.logger.debug(\n `Filtering out request from account: ${requestorAccountId}`,\n );\n continue;\n }\n\n const needsConfirmKey = `inb-${sequenceNumber}:${operatorId}`;\n\n const hasCreated = confirmationMessages.some(\n m => m.connection_id === sequenceNumber,\n );\n\n if (hasCreated) {\n this.logger.debug(\n `Skipping request from ${requestorAccountId} as it has already been confirmed`,\n );\n continue;\n }\n\n if (!this.connections.has(needsConfirmKey)) {\n this.connections.set(needsConfirmKey, {\n connectionTopicId: needsConfirmKey,\n targetAccountId: requestorAccountId,\n targetInboundTopicId: requestorTopicId,\n status: 'needs_confirmation',\n isPending: false,\n needsConfirmation: true,\n created: msg.created || new Date(),\n inboundRequestId: sequenceNumber,\n uniqueRequestKey: needsConfirmKey,\n originTopicId: requestorTopicId,\n processed: false,\n memo: msg.m,\n });\n }\n }\n\n for (const msg of confirmationMessages) {\n const sequenceNumber = msg.connection_id!;\n const connectionTopicId = msg.connection_topic_id!;\n const connectedAccountId = msg.connected_account_id || '';\n const operatorId = msg.operator_id || '';\n\n if (this.shouldFilterAccount(connectedAccountId)) {\n this.logger.debug(\n `Filtering out confirmation for account: ${connectedAccountId}`,\n );\n continue;\n }\n\n const needsConfirmKey = `inb-${sequenceNumber}:${operatorId}`;\n\n if (this.connections.has(needsConfirmKey)) {\n this.connections.delete(needsConfirmKey);\n }\n\n if (!this.connections.has(connectionTopicId)) {\n this.connections.set(connectionTopicId, {\n connectionTopicId,\n targetAccountId: connectedAccountId,\n status: 'established',\n isPending: false,\n needsConfirmation: false,\n created: msg.created || new Date(),\n inboundRequestId: sequenceNumber,\n uniqueRequestKey: needsConfirmKey,\n originTopicId: msg.connection_topic_id,\n processed: false,\n memo: msg.m,\n });\n } else {\n const conn = this.connections.get(connectionTopicId)!;\n this.connections.set(connectionTopicId, {\n ...conn,\n status: 'established',\n isPending: false,\n needsConfirmation: false,\n inboundRequestId: sequenceNumber,\n uniqueRequestKey: needsConfirmKey,\n originTopicId: msg.connection_topic_id,\n processed: false,\n memo: msg.m,\n });\n }\n }\n\n return Array.from(this.connections.values()).filter(\n conn =>\n conn.status === 'established' ||\n conn.status === 'closed' ||\n !this.filterPendingAccountIds.has(conn.targetAccountId),\n );\n }\n\n /**\n * Process connection topic messages to update last activity time\n * @param connectionTopicId - The topic ID of the connection\n * @param messages - The messages to process\n * @returns The updated connection or undefined if not found\n */\n processConnectionMessages(\n connectionTopicId: string,\n messages: HCSMessage[],\n ): Connection | undefined {\n if (\n !messages ||\n messages.length === 0 ||\n !this.connections.has(connectionTopicId)\n ) {\n return this.connections.get(connectionTopicId);\n }\n\n const latestMessage = messages\n .filter(m => m.created)\n .sort((a, b) => {\n const dateA = a.created ? new Date(a.created).getTime() : 0;\n const dateB = b.created ? new Date(b.created).getTime() : 0;\n return dateB - dateA;\n })[0];\n\n if (latestMessage?.created) {\n const conn = this.connections.get(connectionTopicId)!;\n this.connections.set(connectionTopicId, {\n ...conn,\n lastActivity: latestMessage.created,\n });\n }\n\n const closeMessage = messages.find(msg => msg.op === 'close_connection');\n if (closeMessage) {\n const conn = this.connections.get(connectionTopicId)!;\n this.connections.set(connectionTopicId, {\n ...conn,\n status: 'closed',\n lastActivity: closeMessage.created || new Date(),\n closedReason: closeMessage.reason,\n closeMethod: 'explicit',\n });\n }\n\n return this.connections.get(connectionTopicId);\n }\n\n /**\n * Adds or updates profile information for a connection\n * @param accountId - The account ID to add profile info for\n * @param profile - The profile information\n */\n addProfileInfo(accountId: string, profile: AIAgentProfile): void {\n this.profileCache.set(accountId, profile);\n\n const matchingConnections = Array.from(this.connections.values()).filter(\n conn => conn.targetAccountId === accountId,\n );\n\n for (const conn of matchingConnections) {\n this.connections.set(conn.connectionTopicId, {\n ...conn,\n profileInfo: profile,\n targetAgentName: profile.display_name,\n targetInboundTopicId: profile.inboundTopicId,\n targetOutboundTopicId: profile.outboundTopicId,\n });\n }\n }\n\n /**\n * Gets all connections\n * @returns Array of all connections that should be visible\n */\n getAllConnections(): Connection[] {\n const connections = Array.from(this.connections.values()).filter(\n conn =>\n conn.status === 'established' ||\n conn.status === 'closed' ||\n !this.filterPendingAccountIds.has(conn.targetAccountId),\n );\n return connections;\n }\n\n /**\n * Gets all pending connection requests\n * @returns Array of pending connection requests\n */\n getPendingRequests(): Connection[] {\n const pendingConnections = Array.from(this.connections.values()).filter(\n conn => {\n return (\n conn.isPending &&\n !this.filterPendingAccountIds.has(conn.targetAccountId)\n );\n },\n );\n\n return pendingConnections;\n }\n\n /**\n * Helper method to check if there's an established connection with an account\n * @param accountId - The account ID to check\n * @returns True if there's an established connection, false otherwise\n */\n private hasEstablishedConnectionWithAccount(accountId: string): boolean {\n return Array.from(this.connections.values()).some(\n conn =>\n conn.targetAccountId === accountId && conn.status === 'established',\n );\n }\n\n /**\n * Gets all active (established) connections\n * @returns Array of active connections\n */\n getActiveConnections(): Connection[] {\n return Array.from(this.connections.values()).filter(\n conn => conn.status === 'established',\n );\n }\n\n /**\n * Gets all connections needing confirmation\n * @returns Array of connections needing confirmation\n */\n getConnectionsNeedingConfirmation(): Connection[] {\n return Array.from(this.connections.values()).filter(\n conn =>\n conn.needsConfirmation &&\n !this.filterPendingAccountIds.has(conn.targetAccountId),\n );\n }\n\n /**\n * Gets a connection by its topic ID\n * @param connectionTopicId - The topic ID to look up\n * @returns The connection with the given topic ID, or undefined if not found\n */\n getConnectionByTopicId(connectionTopicId: string): Connection | undefined {\n return this.connections.get(connectionTopicId);\n }\n\n /**\n * Gets a connection by account ID\n * @param accountId - The account ID to look up\n * @returns The connection with the given account ID, or undefined if not found\n */\n getConnectionByAccountId(accountId: string): Connection | undefined {\n return Array.from(this.connections.values()).find(\n conn =>\n conn.targetAccountId === accountId && conn.status === 'established',\n );\n }\n\n /**\n * Gets all connections for a specific account ID\n * @param accountId - The account ID to look up\n * @returns Array of connections for the given account ID\n */\n getConnectionsByAccountId(accountId: string): Connection[] {\n return Array.from(this.connections.values()).filter(\n conn => conn.targetAccountId === accountId,\n );\n }\n\n /**\n * Updates or adds a connection\n * @param connection - The connection to update or add\n */\n updateOrAddConnection(connection: Connection): void {\n this.connections.set(connection.connectionTopicId, connection);\n }\n\n /**\n * Clears all tracked connections and requests\n */\n clearAll(): void {\n this.connections.clear();\n this.pendingRequests.clear();\n }\n\n /**\n * Checks if a given connection request has been processed already\n * This uses a combination of topic ID and request ID to uniquely identify requests\n *\n * @param inboundTopicId - The inbound topic ID where the request was received\n * @param requestId - The sequence number (request ID)\n * @returns True if this specific request has been processed, false otherwise\n */\n isConnectionRequestProcessed(\n inboundTopicId: string,\n requestId: number,\n ): boolean {\n for (const conn of this.connections.values()) {\n if (\n conn.originTopicId === inboundTopicId &&\n conn.inboundRequestId === requestId &&\n conn.processed\n ) {\n return true;\n }\n\n if (\n conn.originTopicId === inboundTopicId &&\n conn.connectionRequestId === requestId &&\n conn.processed\n ) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Marks a specific connection request as processed\n *\n * @param inboundTopicId - The inbound topic ID where the request was received\n * @param requestId - The sequence number (request ID)\n * @returns True if a matching connection was found and marked, false otherwise\n */\n markConnectionRequestProcessed(\n inboundTopicId: string,\n requestId: number,\n ): boolean {\n let found = false;\n\n for (const [key, conn] of this.connections.entries()) {\n if (\n conn.originTopicId === inboundTopicId &&\n conn.inboundRequestId === requestId\n ) {\n this.connections.set(key, {\n ...conn,\n processed: true,\n });\n found = true;\n this.logger.debug(\n `Marked inbound connection request #${requestId} on topic ${inboundTopicId} as processed`,\n );\n }\n\n if (\n conn.originTopicId === inboundTopicId &&\n conn.connectionRequestId === requestId\n ) {\n this.connections.set(key, {\n ...conn,\n processed: true,\n });\n found = true;\n this.logger.debug(\n `Marked outbound connection request #${requestId} on topic ${inboundTopicId} as processed`,\n );\n }\n }\n\n return found;\n }\n\n /**\n * Gets pending transactions from a specific connection\n * @param connectionTopicId - The connection topic ID to check for transactions\n * @param limit - Optional limit for the number of transactions to return\n * @returns Array of pending transaction messages sorted by timestamp (newest first)\n */\n async getPendingTransactions(\n connectionTopicId: string,\n limit?: number,\n ): Promise<TransactMessage[]> {\n try {\n const transactMessages = await this.baseClient.getTransactionRequests(\n connectionTopicId,\n limit,\n );\n\n const pendingTransactions: TransactMessage[] = [];\n\n for (const transaction of transactMessages) {\n try {\n const status =\n await this.baseClient.mirrorNode.getScheduledTransactionStatus(\n transaction.schedule_id,\n );\n\n if (!status.executed && !status.deleted) {\n pendingTransactions.push(transaction);\n }\n } catch (error) {\n this.logger.error(`Error checking transaction status: ${error}`);\n pendingTransactions.push(transaction);\n }\n }\n\n return pendingTransactions;\n } catch (error) {\n this.logger.error(`Error getting pending transactions: ${error}`);\n return [];\n }\n }\n\n /**\n * Gets the status of a scheduled transaction\n * @param scheduleId - The schedule ID to check\n * @returns Status of the scheduled transaction\n */\n async getScheduledTransactionStatus(scheduleId: string): Promise<{\n executed: boolean;\n executedTimestamp?: string;\n deleted: boolean;\n expirationTime?: string;\n }> {\n return this.baseClient.mirrorNode.getScheduledTransactionStatus(scheduleId);\n }\n\n /**\n * Gets the timestamp of the last message sent by the specified operator on the connection topic\n * @param connectionTopicId - The topic ID to check\n * @param operatorAccountId - The account ID of the operator\n * @returns The timestamp of the last message or undefined if no messages found\n */\n async getLastOperatorActivity(\n connectionTopicId: string,\n operatorAccountId: string,\n ): Promise<Date | undefined> {\n try {\n const { messages } =\n await this.baseClient.getMessageStream(connectionTopicId);\n\n const operatorMessages = messages.filter(\n msg =>\n msg.operator_id &&\n msg.operator_id.includes(operatorAccountId) &&\n msg.created,\n );\n\n if (operatorMessages.length === 0) {\n return undefined;\n }\n\n operatorMessages.sort(\n (a, b) => b.created!.getTime() - a.created!.getTime(),\n );\n\n return operatorMessages[0].created;\n } catch (error) {\n this.logger.error(`Error getting last operator activity: ${error}`);\n return undefined;\n }\n }\n}\n","import {\n HCSSDK,\n LoadQueueItem,\n HCSConfigMapping,\n HCSConfig,\n LoadType,\n} from './types';\nimport { Logger } from '../../utils/logger';\n\nexport const sleep = (ms: number) => {\n return new Promise(resolve => setTimeout(resolve, ms));\n};\n\nexport class HCS implements HCSSDK {\n config: HCSConfig;\n configMapping: HCSConfigMapping;\n LoadedScripts: Record<string, string>;\n LoadedWasm: Record<string, WebAssembly.Instance>;\n LoadedImages: Record<string, string>;\n LoadedVideos: Record<string, string>;\n LoadedAudios: Record<string, HTMLAudioElement>;\n LoadedAudioUrls: Record<string, string>;\n LoadedGLBs: Record<string, string>;\n scriptLoadedEvent: Event;\n loadQueue: LoadQueueItem[];\n isProcessingQueue: boolean;\n private modelViewerLoaded: boolean = false;\n private modelViewerLoading: Promise<void> | null = null;\n private logger: Logger;\n\n constructor() {\n this.config = {\n cdnUrl: 'https://kiloscribe.com/api/inscription-cdn/',\n network: 'mainnet',\n retryAttempts: 3,\n retryBackoff: 300,\n debug: false,\n showLoadingIndicator: false,\n loadingCallbackName: null,\n };\n this.configMapping = {\n hcsCdnUrl: 'cdnUrl',\n hcsNetwork: 'network',\n hcsRetryAttempts: 'retryAttempts',\n hcsRetryBackoff: 'retryBackoff',\n hcsDebug: 'debug',\n hcsShowLoadingIndicator: 'showLoadingIndicator',\n hcsLoadingCallbackName: 'loadingCallbackName',\n };\n this.LoadedScripts = {};\n this.LoadedWasm = {};\n this.LoadedImages = {};\n this.LoadedVideos = {};\n this.LoadedAudios = {};\n this.LoadedAudioUrls = {};\n this.LoadedGLBs = {};\n this.scriptLoadedEvent = new Event('HCSScriptLoaded');\n this.loadQueue = [] as LoadQueueItem[];\n this.isProcessingQueue = false;\n\n try {\n this.logger = Logger.getInstance({\n module: 'HCS-3',\n level: this.config.debug ? 'debug' : 'error',\n });\n } catch (e) {\n this.logger = this.createFallbackLogger();\n }\n }\n\n private createFallbackLogger(): Logger {\n const fallbackLogger = {\n debug: (...args: any[]) =>\n this.config.debug && console.debug('[HCS-3]', ...args),\n info: (...args: any[]) =>\n this.config.debug && console.info('[HCS-3]', ...args),\n warn: (...args: any[]) => console.warn('[HCS-3]', ...args),\n error: (...args: any[]) => console.error('[HCS-3]', ...args),\n setLogLevel: (level: string) => {\n this.config.debug = level === 'debug';\n },\n } as unknown as Logger;\n\n return fallbackLogger;\n }\n\n log(...args: any[]): void {\n if (args.length === 0) {\n this.logger.debug('');\n } else if (args.length === 1) {\n this.logger.debug(String(args[0]));\n } else {\n const message = String(args[0]);\n const data = args.slice(1);\n this.logger.debug(message, data);\n }\n }\n\n error(...args: any[]): void {\n if (args.length === 0) {\n this.logger.error('');\n } else if (args.length === 1) {\n this.logger.error(String(args[0]));\n } else {\n const message = String(args[0]);\n const data = args.slice(1);\n this.logger.error(message, data);\n }\n }\n\n loadConfigFromHTML(): void {\n const configScript = document.querySelector(\n 'script[data-hcs-config]',\n ) as HTMLScriptElement | null;\n if (configScript) {\n Object.keys(this.configMapping).forEach(dataAttr => {\n if (configScript.dataset[dataAttr]) {\n const configKey =\n this.configMapping[dataAttr as keyof HCSConfigMapping];\n let value: any = configScript.dataset[dataAttr];\n\n if (value === 'true') value = true;\n if (value === 'false') value = false;\n if (!isNaN(Number(value)) && value !== '') value = Number(value);\n\n (this.config as any)[configKey] = value;\n }\n });\n\n // Update logger level based on debug setting\n this.logger.setLogLevel(this.config.debug ? 'debug' : 'error');\n }\n this.log('Loaded config:', this.config);\n }\n\n updateLoadingStatus(id: string, status: string): void {\n if (this.LoadedScripts[id] === 'loaded') {\n return;\n }\n if (this.config.showLoadingIndicator) {\n console.log('[HCS Loading] ' + id + ' : ' + status);\n }\n this.LoadedScripts[id] = status;\n if (\n this.config.loadingCallbackName &&\n typeof (window as any)[this.config.loadingCallbackName] === 'function'\n ) {\n const callback = (window as any)[this.config.loadingCallbackName];\n if (typeof callback === 'function') {\n callback(id, status);\n }\n }\n }\n\n async fetchWithRetry(\n url: string,\n retries: number = this.config.retryAttempts,\n backoff: number = this.config.retryBackoff,\n ): Promise<Response> {\n try {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error('HTTP error! status: ' + response.status);\n }\n return response;\n } catch (error) {\n if (retries > 0) {\n this.log(\n 'Retrying fetch for ' + url + ' Attempts left: ' + (retries - 1),\n );\n await this.sleep(backoff);\n return this.fetchWithRetry(url, retries - 1, backoff * 2);\n }\n throw error;\n }\n }\n\n sleep(ms: number) {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n\n isDuplicate(topicId: string): boolean {\n return !!this.LoadedScripts[topicId];\n }\n\n async retrieveHCS1Data(\n topicId: string,\n cdnUrl: string = this.config.cdnUrl,\n network: string = this.config.network,\n ): Promise<Blob> {\n const cleanNetwork = network.replace(/['\"]+/g, '');\n const response = await this.fetchWithRetry(\n cdnUrl + topicId + '?network=' + cleanNetwork,\n );\n return await response.blob();\n }\n\n async loadScript(scriptElement: HTMLElement): Promise<void> {\n const src = scriptElement.getAttribute('data-src');\n const scriptId = scriptElement.getAttribute('data-script-id');\n const topicId = src?.split('/').pop();\n const type = scriptElement.getAttribute('type');\n const isRequired = scriptElement.hasAttribute('data-required');\n const isModule = scriptElement.getAttribute('type') === 'module';\n\n if (this.isDuplicate(topicId || '')) {\n return;\n }\n\n this.updateLoadingStatus(scriptId!, 'loading');\n\n try {\n const cdnUrl =\n scriptElement.getAttribute('data-cdn-url') || this.config.cdnUrl;\n const network =\n scriptElement.getAttribute('data-network') || this.config.network;\n\n const blob = await this.retrieveHCS1Data(topicId!, cdnUrl, network);\n\n if (type === 'wasm') {\n const arrayBuffer = await blob.arrayBuffer();\n const wasmModule = await WebAssembly.compile(arrayBuffer);\n this.LoadedWasm[scriptId!] = await WebAssembly.instantiate(wasmModule, {\n env: {},\n ...(scriptElement.dataset as any),\n });\n this.updateLoadingStatus(scriptId!, 'loaded');\n window.dispatchEvent(this.scriptLoadedEvent);\n this.log('Loaded wasm: ' + scriptId);\n } else {\n const content = await blob.text();\n const script = document.createElement('script');\n script.textContent = content;\n script.className = 'hcs-inline-script';\n // Copy over the script ID to the inlined script\n if (scriptId) {\n script.setAttribute('data-loaded-script-id', scriptId);\n }\n\n if (isModule) {\n script.type = 'module';\n const moduleBlob = new Blob([content], {\n type: 'application/javascript',\n });\n script.src = URL.createObjectURL(moduleBlob);\n }\n\n document.body.appendChild(script);\n\n this.updateLoadingStatus(scriptId!, 'loaded');\n window.dispatchEvent(this.scriptLoadedEvent);\n this.log('Loaded script: ' + scriptId);\n\n script.onerror = error => {\n this.error('Failed to load ' + type + ': ' + scriptId, error);\n this.updateLoadingStatus(scriptId!, 'failed');\n if (isRequired) {\n throw error;\n }\n };\n }\n } catch (error) {\n this.error('Failed to load ' + type + ': ' + scriptId, error);\n this.updateLoadingStatus(scriptId!, 'failed');\n if (isRequired) {\n throw error;\n }\n }\n }\n\n async loadModuleExports(scriptId: string): Promise<any> {\n const script = document.querySelector(\n 'script[data-loaded-script-id=\"' + scriptId + '\"]',\n );\n if (!script) {\n throw new Error('Module script with id ' + scriptId + ' not found');\n }\n const scriptSrc = script.getAttribute('src');\n if (!scriptSrc) {\n throw new Error('Module script ' + scriptId + ' has no src attribute');\n }\n\n try {\n return await import(/* webpackIgnore: true */ scriptSrc);\n } catch (error) {\n this.error('Failed to import module', error);\n throw error;\n }\n }\n\n async loadStylesheet(linkElement: HTMLElement): Promise<void> {\n const src = linkElement.getAttribute('data-src');\n const stylesheetId = linkElement.getAttribute('data-script-id');\n const topicId = src?.split('/').pop();\n const isRequired = linkElement.hasAttribute('data-required');\n if (this.isDuplicate(topicId || '')) {\n return;\n }\n\n this.updateLoadingStatus(stylesheetId!, 'loading');\n\n try {\n const cdnUrl =\n linkElement.getAttribute('data-cdn-url') || this.config.cdnUrl;\n const network =\n linkElement.getAttribute('data-network') || this.config.network;\n\n const blob = await this.retrieveHCS1Data(topicId!, cdnUrl, network);\n const cssContent = await blob.text();\n const style = document.createElement('style');\n style.textContent = cssContent;\n document.head.appendChild(style);\n\n this.updateLoadingStatus(stylesheetId!, 'loaded');\n window.dispatchEvent(this.scriptLoadedEvent);\n this.log('Loaded and inlined stylesheet: ' + stylesheetId);\n } catch (error) {\n this.error('Failed to load stylesheet: ' + stylesheetId, error);\n this.updateLoadingStatus(stylesheetId!, 'failed');\n if (isRequired) {\n throw error;\n }\n }\n }\n\n async loadImage(imageElement: HTMLElement): Promise<void> {\n const src = imageElement.getAttribute('data-src');\n const topicId = src?.split('/').pop();\n\n this.log('Loading image: ' + topicId);\n this.updateLoadingStatus('Image: ' + topicId!, 'loaded');\n\n try {\n const cdnUrl =\n imageElement.getAttribute('data-cdn-url') || this.config.cdnUrl;\n const network =\n imageElement.getAttribute('data-network') || this.config.network;\n\n const blob = await this.retrieveHCS1Data(topicId!, cdnUrl, network);\n const objectURL = URL.createObjectURL(blob);\n (imageElement as HTMLImageElement).src = objectURL;\n this.LoadedImages[topicId!] = objectURL;\n this.updateLoadingStatus('Image: ' + topicId!, 'loaded');\n this.log('Loaded image: ' + topicId);\n } catch (error) {\n this.error('Failed to load image: ' + topicId, error);\n this.updateLoadingStatus('Image: ' + topicId!, 'failed');\n }\n }\n\n async loadMedia(\n mediaElement: HTMLElement,\n mediaType: 'video' | 'audio',\n ): Promise<void> {\n const src = mediaElement.getAttribute('data-src');\n const topicId = src?.split('/').pop();\n\n this.log('Loading ' + mediaType + ': ' + topicId);\n this.updateLoadingStatus(mediaType + ': ' + topicId!, 'loading');\n\n try {\n const cdnUrl =\n mediaElement.getAttribute('data-cdn-url') || this.config.cdnUrl;\n const network =\n mediaElement.getAttribute('data-network') || this.config.network;\n\n const blob = await this.retrieveHCS1Data(topicId!, cdnUrl, network);\n const objectURL = URL.createObjectURL(blob);\n (mediaElement as HTMLMediaElement).src = objectURL;\n\n if (mediaType === 'video') {\n this.LoadedVideos[topicId!] = objectURL;\n } else {\n this.LoadedAudioUrls[topicId!] = objectURL;\n }\n\n this.updateLoadingStatus(mediaType + ': ' + topicId!, 'loaded');\n this.log('Loaded ' + mediaType + ': ' + topicId);\n } catch (error) {\n this.error('Failed to load ' + mediaType + ': ' + topicId, error);\n this.updateLoadingStatus(mediaType + ': ' + topicId!, 'failed');\n }\n }\n\n private async loadModelViewer(): Promise<void> {\n if (this.modelViewerLoading) return this.modelViewerLoading;\n if (this.modelViewerLoaded) return Promise.resolve();\n\n this.modelViewerLoading = new Promise<void>(resolve => {\n const modelViewerScript = document.createElement('script');\n modelViewerScript.setAttribute('data-src', 'hcs://1/0.0.7293044');\n modelViewerScript.setAttribute('data-script-id', 'model-viewer');\n modelViewerScript.setAttribute('type', 'module');\n\n window.addEventListener(\n 'HCSScriptLoaded',\n () => {\n this.modelViewerLoaded = true;\n resolve();\n },\n { once: true },\n );\n\n this.loadScript(modelViewerScript);\n });\n\n return this.modelViewerLoading;\n }\n\n async loadGLB(glbElement: HTMLElement): Promise<void> {\n await this.loadModelViewer();\n\n const src = glbElement.getAttribute('data-src');\n const topicId = src?.split('/').pop();\n\n this.log('Loading GLB: ' + topicId);\n this.updateLoadingStatus('GLB: ' + topicId!, 'loading');\n\n try {\n const cdnUrl =\n glbElement.getAttribute('data-cdn-url') || this.config.cdnUrl;\n const network =\n glbElement.getAttribute('data-network') || this.config.network;\n\n let modelViewer: HTMLElement;\n if (glbElement.tagName.toLowerCase() !== 'model-viewer') {\n modelViewer = document.createElement('model-viewer');\n Array.from(glbElement.attributes).forEach(attr => {\n modelViewer.setAttribute(attr.name, attr.value);\n });\n modelViewer.setAttribute('camera-controls', '');\n modelViewer.setAttribute('auto-rotate', '');\n modelViewer.setAttribute('ar', '');\n glbElement.parentNode?.replaceChild(modelViewer, glbElement);\n } else {\n modelViewer = glbElement;\n }\n\n const blob = await this.retrieveHCS1Data(topicId!, cdnUrl, network);\n const objectURL = URL.createObjectURL(blob);\n modelViewer.setAttribute('src', objectURL);\n this.LoadedGLBs[topicId!] = objectURL;\n\n this.updateLoadingStatus('GLB: ' + topicId!, 'loaded');\n this.log('Loaded GLB: ' + topicId);\n } catch (error) {\n this.error('Failed to load GLB: ' + topicId, error);\n this.updateLoadingStatus('GLB: ' + topicId!, 'failed');\n }\n }\n\n async loadResource(\n element: HTMLElement,\n type: LoadType,\n order: number,\n ): Promise<void> {\n return new Promise(resolve => {\n this.loadQueue.push({ element, type, order, resolve });\n this.processQueue();\n });\n }\n\n async processQueue(): Promise<void> {\n if (this.isProcessingQueue) return;\n this.isProcessingQueue = true;\n\n while (this.loadQueue.length > 0) {\n const item = this.loadQueue.shift()!;\n try {\n if (item.type === 'script') {\n await this.loadScript(item.element);\n } else if (item.type === 'image') {\n await this.loadImage(item.element);\n } else if (item.type === 'video' || item.type === 'audio') {\n await this.loadMedia(item.element, item.type as 'video' | 'audio');\n } else if (item.type === 'glb') {\n await this.loadGLB(item.element);\n } else if (item.type === 'css') {\n await this.loadStylesheet(item.element);\n }\n item.resolve();\n } catch (error) {\n this.error('Error processing queue item:', error);\n if (\n item.type === 'script' &&\n item.element.hasAttribute('data-required')\n ) {\n break;\n }\n }\n }\n\n this.isProcessingQueue = false;\n }\n\n private async replaceHCSInStyle(styleContent: string): Promise<string> {\n let newContent = styleContent;\n let startIndex = newContent.indexOf('hcs://');\n\n while (startIndex !== -1) {\n let endIndex = startIndex;\n while (\n endIndex < newContent.length &&\n ![\"'\", '\"', ' ', ')'].includes(newContent[endIndex])\n ) {\n endIndex++;\n }\n\n const hcsUrl = newContent.substring(startIndex, endIndex);\n const topicId = hcsUrl.split('/').pop()!;\n\n try {\n const cdnUrl = this.config.cdnUrl;\n const network = this.config.network;\n\n const blob = await this.retrieveHCS1Data(topicId, cdnUrl, network);\n const objectURL = URL.createObjectURL(blob);\n\n newContent =\n newContent.substring(0, startIndex) +\n objectURL +\n newContent.substring(endIndex);\n\n this.LoadedImages[topicId] = objectURL;\n this.log('Replaced CSS HCS URL: ' + hcsUrl + ' with ' + objectURL);\n } catch (error) {\n this.error('Failed to load CSS image: ' + topicId, error);\n }\n\n startIndex = newContent.indexOf('hcs://', startIndex + 1);\n }\n\n return newContent;\n }\n\n private async processInlineStyles(): Promise<void> {\n const elementsWithStyle = document.querySelectorAll('[style*=\"hcs://\"]');\n this.log(\n 'Found ' +\n elementsWithStyle.length +\n ' elements with HCS style references',\n );\n\n for (const element of Array.from(elementsWithStyle)) {\n const style = element.getAttribute('style');\n if (style) {\n this.log('Processing style: ' + style);\n const newStyle = await this.replaceHCSInStyle(style);\n if (style !== newStyle) {\n element.setAttribute('style', newStyle);\n this.log('Updated style to: ' + newStyle);\n }\n }\n }\n\n const styleTags = document.querySelectorAll('style');\n for (const styleTag of Array.from(styleTags)) {\n if (styleTag.textContent?.includes('hcs://')) {\n const newContent = await this.replaceHCSInStyle(styleTag.textContent);\n if (styleTag.textContent !== newContent) {\n styleTag.textContent = newContent;\n }\n }\n }\n }\n\n async init(): Promise<void> {\n this.loadConfigFromHTML();\n\n return new Promise(resolve => {\n const initializeObserver = async () => {\n const scriptElements = document.querySelectorAll(\n 'script[data-src^=\"hcs://\"]',\n );\n const imageElements = document.querySelectorAll(\n 'img[data-src^=\"hcs://\"], img[src^=\"hcs://\"]',\n );\n const videoElements = document.querySelectorAll(\n 'video[data-src^=\"hcs://\"], video[src^=\"hcs://\"]',\n );\n const audioElements = document.querySelectorAll(\n 'audio[data-src^=\"hcs://\"], audio[src^=\"hcs://\"]',\n );\n const glbElements = document.querySelectorAll(\n 'model-viewer[data-src^=\"hcs://\"]',\n );\n const cssElements = document.querySelectorAll(\n 'link[data-src^=\"hcs://\"]',\n );\n\n // Convert src to data-src for HCS URLs\n document.querySelectorAll('[src^=\"hcs://\"]').forEach(element => {\n const src = element.getAttribute('src');\n if (src) {\n element.setAttribute('data-src', src);\n element.removeAttribute('src');\n }\n });\n\n await this.processInlineStyles();\n\n const loadPromises: Promise<void>[] = [];\n\n [\n { elements: scriptElements, type: 'script' },\n { elements: imageElements, type: 'image' },\n { elements: videoElements, type: 'video' },\n { elements: audioElements, type: 'audio' },\n { elements: glbElements, type: 'glb' },\n { elements: cssElements, type: 'css' },\n ].forEach(({ elements, type }) => {\n elements.forEach(element => {\n const order =\n parseInt(element.getAttribute('data-load-order') || '') ||\n Infinity;\n loadPromises.push(\n this.loadResource(\n element as HTMLElement,\n type as LoadType,\n order,\n ),\n );\n });\n });\n\n await Promise.all(loadPromises);\n\n const observer = new MutationObserver(mutations => {\n mutations.forEach(mutation => {\n mutation.addedNodes.forEach(node => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const element = node as HTMLElement;\n\n if (element.getAttribute('style')?.includes('hcs://')) {\n this.processInlineStyles();\n }\n\n if (\n element.tagName.toLowerCase() === 'style' &&\n element.textContent?.includes('hcs://')\n ) {\n this.processInlineStyles();\n }\n\n // Handle both src and data-src attributes\n if (element.getAttribute('src')?.startsWith('hcs://')) {\n const src = element.getAttribute('src')!;\n element.setAttribute('data-src', src);\n element.removeAttribute('src');\n\n // Immediately process the element based on its type\n const tagName = element.tagName.toLowerCase();\n switch (tagName) {\n case 'img':\n this.loadResource(element, 'image', Infinity);\n break;\n case 'video':\n this.loadResource(element, 'video', Infinity);\n break;\n case 'audio':\n this.loadResource(element, 'audio', Infinity);\n break;\n case 'script':\n this.loadResource(element, 'script', Infinity);\n break;\n }\n }\n\n // Also check data-src in case it was set directly\n if (element.matches('script[data-src^=\"hcs://\"]')) {\n this.loadResource(element, 'script', Infinity);\n } else if (element.matches('img[data-src^=\"hcs://\"]')) {\n this.loadResource(element, 'image', Infinity);\n } else if (element.matches('video[data-src^=\"hcs://\"]')) {\n this.loadResource(element, 'video', Infinity);\n } else if (element.matches('audio[data-src^=\"hcs://\"]')) {\n this.loadResource(element, 'audio', Infinity);\n } else if (\n element.matches('model-viewer[data-src^=\"hcs://\"]')\n ) {\n this.loadResource(element, 'glb', Infinity);\n } else if (element.matches('link[data-src^=\"hcs://\"]')) {\n this.loadResource(element, 'css', Infinity);\n }\n\n // Check children of added nodes for HCS URLs\n const childrenWithHCS = element.querySelectorAll(\n '[data-src^=\"hcs://\"], [src^=\"hcs://\"]',\n );\n childrenWithHCS.forEach(child => {\n const childElement = child as HTMLElement;\n const tagName = childElement.tagName.toLowerCase();\n\n // Convert src to data-src if needed\n const src = childElement.getAttribute('src');\n if (src?.startsWith('hcs://')) {\n childElement.setAttribute('data-src', src);\n childElement.removeAttribute('src');\n }\n\n // Process based on tag type\n switch (tagName) {\n case 'script':\n this.loadResource(childElement, 'script', Infinity);\n break;\n case 'img':\n this.loadResource(childElement, 'image', Infinity);\n break;\n case 'video':\n this.loadResource(childElement, 'video', Infinity);\n break;\n case 'audio':\n this.loadResource(childElement, 'audio', Infinity);\n break;\n case 'model-viewer':\n this.loadResource(childElement, 'glb', Infinity);\n break;\n case 'link':\n this.loadResource(childElement, 'css', Infinity);\n break;\n }\n });\n }\n });\n\n // Handle attribute changes\n if (mutation.type === 'attributes') {\n const element = mutation.target as HTMLElement;\n if (\n mutation.attributeName === 'style' &&\n element.getAttribute('style')?.includes('hcs://')\n ) {\n this.processInlineStyles();\n } else if (mutation.attributeName === 'src') {\n const src = element.getAttribute('src');\n if (src?.startsWith('hcs://')) {\n element.setAttribute('data-src', src);\n element.removeAttribute('src');\n const type = element.tagName.toLowerCase();\n if (['img', 'video', 'audio'].includes(type)) {\n this.loadResource(element, type as LoadType, Infinity);\n }\n }\n }\n }\n });\n });\n\n if (document.body) {\n observer.observe(document.body, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['style', 'src', 'data-src'],\n });\n } else {\n document.addEventListener('DOMContentLoaded', () => {\n observer.observe(document.body, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['style', 'src', 'data-src'],\n });\n });\n }\n\n resolve();\n };\n\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', initializeObserver);\n } else {\n initializeObserver();\n }\n });\n }\n\n async preloadImage(topicId: string): Promise<string> {\n this.log('Loading image:' + topicId);\n this.updateLoadingStatus('image: ' + topicId, 'loading');\n const blob = await this.retrieveHCS1Data(topicId);\n const objectURL = URL.createObjectURL(blob);\n this.LoadedImages[topicId!] = objectURL;\n this.updateLoadingStatus('image: ' + topicId, 'loaded');\n return objectURL;\n }\n\n async preloadAudio(topicId: string): Promise<string> {\n const audioElement = document.createElement('audio');\n audioElement.setAttribute('data-topic-id', topicId);\n audioElement.setAttribute('data-src', 'hcs://1/' + topicId);\n document.body.appendChild(audioElement);\n\n await this.loadMedia(audioElement, 'audio');\n\n const cachedAudio = document.querySelector(\n 'audio[data-topic-id=\"' + topicId + '\"]',\n ) as HTMLAudioElement;\n\n if (cachedAudio) {\n this.LoadedAudioUrls[topicId] = cachedAudio.src;\n } else {\n console.error('Failed to preload audio: ' + topicId);\n }\n return this.LoadedAudioUrls[topicId];\n }\n\n async playAudio(topicId: string, volume = 1.0) {\n const audioUrl = this.LoadedAudioUrls[topicId];\n\n if (audioUrl) {\n const audio = new Audio(audioUrl);\n audio.volume = volume;\n this.LoadedAudios[topicId] = audio;\n\n audio.play().catch(error => {\n console.error('Failed to play audio:', error);\n });\n\n audio.addEventListener('ended', () => {\n audio.remove();\n delete this.LoadedAudios[topicId];\n });\n } else {\n console.error('Audio not preloaded: ' + topicId);\n }\n }\n\n async pauseAudio(topicId: string) {\n const audioElement = document.querySelector(\n 'audio[data-topic-id=\"' + topicId + '\"]',\n ) as HTMLAudioElement;\n\n if (audioElement) {\n console.log('found element', audioElement);\n audioElement.pause();\n this.LoadedAudios[topicId]?.pause();\n } else {\n this.LoadedAudios[topicId]?.pause();\n }\n }\n\n async loadAndPlayAudio(topicId: string, autoplay = false, volume = 1.0) {\n let existingAudioElement = document.querySelector(\n 'audio[data-topic-id=\"' + topicId + '\"]',\n ) as HTMLAudioElement;\n\n if (existingAudioElement) {\n existingAudioElement.volume = volume;\n await existingAudioElement.play();\n } else {\n const audioElement = document.createElement('audio');\n audioElement.volume = volume;\n if (autoplay) {\n audioElement.setAttribute('autoplay', 'autoplay');\n }\n audioElement.setAttribute('data-topic-id', topicId);\n audioElement.setAttribute('data-src', 'hcs://1/' + topicId);\n\n document.body.appendChild(audioElement);\n\n await this.loadMedia(audioElement, 'audio');\n\n existingAudioElement = document.querySelector(\n 'audio[data-topic-id=\"' + topicId + '\"]',\n ) as HTMLAudioElement;\n if (!autoplay) {\n await existingAudioElement.play();\n }\n }\n }\n}\n","import { HCS11Profile, SocialLink, SocialPlatform } from './types';\nimport { Logger } from '../utils/logger';\n\nexport class PersonBuilder {\n private config: Partial<\n HCS11Profile & { pfpBuffer?: Buffer; pfpFileName?: string }\n > = {\n version: '1.0',\n type: 0,\n };\n private logger: Logger;\n\n constructor() {\n this.logger = Logger.getInstance({\n module: 'PersonBuilder',\n });\n }\n\n setName(name: string): this {\n this.config.display_name = name;\n return this;\n }\n\n setAlias(alias: string): this {\n this.config.alias = alias;\n return this;\n }\n\n setBio(bio: string): this {\n this.config.bio = bio;\n return this;\n }\n\n /**\n * @deprecated Use setBio instead\n */\n setDescription(description: string): this {\n return this.setBio(description);\n }\n\n addSocial(platform: SocialPlatform, handle: string): this {\n if (!this.config.socials) {\n this.config.socials = [];\n }\n const existingSocial = this.config.socials.find(\n (s: SocialLink) => s.platform === platform,\n );\n if (!existingSocial) {\n this.config.socials.push({ platform, handle });\n } else {\n existingSocial.handle = handle;\n }\n return this;\n }\n\n setProfileImage(profileImage: string): this {\n this.config.profileImage = profileImage;\n return this;\n }\n\n setProfilePicture(pfpBuffer: Buffer, pfpFileName: string): this {\n this.config.pfpBuffer = pfpBuffer;\n this.config.pfpFileName = pfpFileName;\n return this;\n }\n\n setExistingProfilePicture(pfpTopicId: string): this {\n this.config.profileImage = `hcs://1/${pfpTopicId}`;\n return this;\n }\n\n addProperty(key: string, value: any): this {\n if (!this.config.properties) {\n this.config.properties = {};\n }\n this.config.properties[key] = value;\n return this;\n }\n\n setInboundTopicId(topicId: string): this {\n this.config.inboundTopicId = topicId;\n return this;\n }\n\n setOutboundTopicId(topicId: string): this {\n this.config.outboundTopicId = topicId;\n return this;\n }\n\n getProfilePicture(): { pfpBuffer?: Buffer; pfpFileName?: string } {\n return {\n pfpBuffer: this.config.pfpBuffer,\n pfpFileName: this.config.pfpFileName,\n };\n }\n\n build(): HCS11Profile & { pfpBuffer?: Buffer; pfpFileName?: string } {\n if (!this.config.display_name) {\n throw new Error('Display name is required for the profile');\n }\n\n if (!this.config.bio) {\n this.logger.warn('No bio provided for person profile');\n }\n\n if (!this.config.pfpBuffer && !this.config.profileImage) {\n this.logger.warn('No profile picture provided or referenced');\n }\n\n return {\n version: this.config.version!,\n type: 0,\n display_name: this.config.display_name,\n alias: this.config.alias,\n bio: this.config.bio,\n socials: this.config.socials,\n profileImage: this.config.profileImage,\n properties: this.config.properties,\n inboundTopicId: this.config.inboundTopicId,\n outboundTopicId: this.config.outboundTopicId,\n pfpBuffer: this.config.pfpBuffer,\n pfpFileName: this.config.pfpFileName,\n };\n }\n}\n","import { proto } from '@hashgraph/proto';\nimport { Buffer } from 'buffer';\nimport { Hbar, HbarUnit, Long } from '@hashgraph/sdk';\nimport { ethers } from 'ethers';\nimport { TokenAmount, ParsedTransaction } from './transaction-parser-types'; // Import all types\nimport { HTSParser } from './parsers/hts-parser'; // Import HTSParser\nimport { HCSParser } from './parsers/hcs-parser'; // Import HCSParser\nimport { FileParser } from './parsers/file-parser'; // Import FileParser\nimport { CryptoParser } from './parsers/crypto-parser'; // Import CryptoParser\nimport { SCSParser } from './parsers/scs-parser'; // Import SCSParser\nimport { UtilParser } from './parsers/util-parser'; // Import UtilParser\n\n/**\n * Types for transaction parsing results\n */\n\nexport class TransactionParser {\n /**\n * Parse a base64 encoded transaction body and return structured data\n * @param transactionBodyBase64 - The base64 encoded transaction body\n * @returns The parsed transaction\n */\n static parseTransactionBody(\n transactionBodyBase64: string,\n ): ParsedTransaction {\n try {\n const buffer = ethers.decodeBase64(transactionBodyBase64);\n const txBody = proto.SchedulableTransactionBody.decode(buffer);\n\n const transactionType = this.getTransactionType(txBody);\n\n const result: ParsedTransaction = {\n type: transactionType,\n humanReadableType: this.getHumanReadableType(transactionType),\n transfers: [],\n tokenTransfers: [],\n raw: txBody,\n };\n\n if (txBody.memo) {\n result.memo = txBody.memo;\n }\n\n if (txBody.transactionFee) {\n const hbarAmount = Hbar.fromTinybars(\n Long.fromValue(txBody.transactionFee),\n );\n result.transactionFee = hbarAmount.toString(HbarUnit.Hbar);\n }\n\n if (txBody.cryptoTransfer) {\n CryptoParser.parseCryptoTransfers(txBody.cryptoTransfer, result);\n }\n\n if (txBody.cryptoDelete) {\n result.cryptoDelete = CryptoParser.parseCryptoDelete(\n txBody.cryptoDelete,\n );\n }\n\n if (txBody.cryptoCreateAccount) {\n result.cryptoCreateAccount = CryptoParser.parseCryptoCreateAccount(\n txBody.cryptoCreateAccount,\n );\n }\n\n if (txBody.cryptoUpdateAccount) {\n result.cryptoUpdateAccount = CryptoParser.parseCryptoUpdateAccount(\n txBody.cryptoUpdateAccount,\n );\n }\n\n if (txBody.cryptoApproveAllowance) {\n result.cryptoApproveAllowance =\n CryptoParser.parseCryptoApproveAllowance(\n txBody.cryptoApproveAllowance,\n );\n }\n\n if (txBody.cryptoDeleteAllowance) {\n result.cryptoDeleteAllowance = CryptoParser.parseCryptoDeleteAllowance(\n txBody.cryptoDeleteAllowance,\n );\n }\n\n if (txBody.contractCall) {\n result.contractCall = SCSParser.parseContractCall(txBody.contractCall);\n }\n\n if (txBody.contractCreateInstance) {\n result.contractCreate = SCSParser.parseContractCreate(\n txBody.contractCreateInstance,\n );\n }\n\n if (txBody.contractUpdateInstance) {\n result.contractUpdate = SCSParser.parseContractUpdate(\n txBody.contractUpdateInstance,\n );\n }\n\n if (txBody.contractDeleteInstance) {\n result.contractDelete = SCSParser.parseContractDelete(\n txBody.contractDeleteInstance,\n );\n }\n\n if (txBody.tokenCreation) {\n result.tokenCreation = HTSParser.parseTokenCreate(txBody.tokenCreation);\n }\n\n if (txBody.tokenMint) {\n result.tokenMint = HTSParser.parseTokenMint(txBody.tokenMint);\n }\n\n if (txBody.tokenBurn) {\n result.tokenBurn = HTSParser.parseTokenBurn(txBody.tokenBurn);\n }\n\n if (txBody.tokenUpdate) {\n result.tokenUpdate = HTSParser.parseTokenUpdate(txBody.tokenUpdate);\n }\n\n if (txBody.tokenFeeScheduleUpdate) {\n result.tokenFeeScheduleUpdate = HTSParser.parseTokenFeeScheduleUpdate(\n txBody.tokenFeeScheduleUpdate,\n );\n }\n\n if (txBody.tokenFreeze) {\n result.tokenFreeze = HTSParser.parseTokenFreeze(txBody.tokenFreeze);\n }\n\n if (txBody.tokenUnfreeze) {\n result.tokenUnfreeze = HTSParser.parseTokenUnfreeze(\n txBody.tokenUnfreeze,\n );\n }\n\n if (txBody.tokenGrantKyc) {\n result.tokenGrantKyc = HTSParser.parseTokenGrantKyc(\n txBody.tokenGrantKyc,\n );\n }\n\n if (txBody.tokenRevokeKyc) {\n result.tokenRevokeKyc = HTSParser.parseTokenRevokeKyc(\n txBody.tokenRevokeKyc,\n );\n }\n\n if (txBody.tokenPause) {\n result.tokenPause = HTSParser.parseTokenPause(txBody.tokenPause);\n }\n\n if (txBody.tokenUnpause) {\n result.tokenUnpause = HTSParser.parseTokenUnpause(txBody.tokenUnpause);\n }\n\n if (txBody.tokenWipe) {\n result.tokenWipeAccount = HTSParser.parseTokenWipeAccount(\n txBody.tokenWipe,\n );\n }\n\n if (txBody.tokenDeletion) {\n result.tokenDelete = HTSParser.parseTokenDelete(txBody.tokenDeletion);\n }\n\n if (txBody.tokenAssociate) {\n result.tokenAssociate = HTSParser.parseTokenAssociate(\n txBody.tokenAssociate,\n );\n }\n\n if (txBody.tokenDissociate) {\n result.tokenDissociate = HTSParser.parseTokenDissociate(\n txBody.tokenDissociate,\n );\n }\n\n if (txBody.consensusCreateTopic) {\n result.consensusCreateTopic = HCSParser.parseConsensusCreateTopic(\n txBody.consensusCreateTopic,\n );\n }\n\n if (txBody.consensusSubmitMessage) {\n result.consensusSubmitMessage = HCSParser.parseConsensusSubmitMessage(\n txBody.consensusSubmitMessage,\n );\n }\n\n if (txBody.consensusUpdateTopic) {\n result.consensusUpdateTopic = HCSParser.parseConsensusUpdateTopic(\n txBody.consensusUpdateTopic,\n );\n }\n\n if (txBody.consensusDeleteTopic) {\n result.consensusDeleteTopic = HCSParser.parseConsensusDeleteTopic(\n txBody.consensusDeleteTopic,\n );\n }\n\n if (txBody.fileCreate) {\n result.fileCreate = FileParser.parseFileCreate(txBody.fileCreate);\n }\n\n if (txBody.fileAppend) {\n result.fileAppend = FileParser.parseFileAppend(txBody.fileAppend);\n }\n\n if (txBody.fileUpdate) {\n result.fileUpdate = FileParser.parseFileUpdate(txBody.fileUpdate);\n }\n\n if (txBody.fileDelete) {\n result.fileDelete = FileParser.parseFileDelete(txBody.fileDelete);\n }\n\n if (txBody.utilPrng) {\n result.utilPrng = UtilParser.parseUtilPrng(txBody.utilPrng);\n }\n\n return result;\n } catch (error) {\n throw new Error(\n `Failed to parse transaction body: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n }\n\n /**\n * Parse details from a complete schedule response\n * @param scheduleResponse - The schedule response to parse\n * @returns The parsed transaction\n */\n static parseScheduleResponse(scheduleResponse: {\n transaction_body: string;\n memo?: string;\n }): ParsedTransaction {\n if (!scheduleResponse.transaction_body) {\n throw new Error('Schedule response missing transaction_body');\n }\n\n const parsed = this.parseTransactionBody(scheduleResponse.transaction_body);\n\n if (scheduleResponse.memo) {\n parsed.memo = scheduleResponse.memo;\n }\n\n return parsed;\n }\n\n /**\n * Determine the transaction type\n * @param txBody - The transaction body to determine the type of\n * @returns The type of the transaction\n */\n private static getTransactionType(\n txBody: proto.SchedulableTransactionBody,\n ): string {\n let transactionType = 'unknown';\n\n if (txBody.cryptoTransfer) {\n transactionType = 'cryptoTransfer';\n } else if (txBody.cryptoCreateAccount) {\n transactionType = 'cryptoCreateAccount';\n } else if (txBody.cryptoUpdateAccount) {\n transactionType = 'cryptoUpdateAccount';\n } else if (txBody.cryptoApproveAllowance) {\n transactionType = 'cryptoApproveAllowance';\n } else if (txBody.cryptoDeleteAllowance) {\n transactionType = 'cryptoDeleteAllowance';\n } else if (txBody.cryptoDelete) {\n transactionType = 'cryptoDelete';\n } else if (txBody.consensusCreateTopic) {\n transactionType = 'consensusCreateTopic';\n } else if (txBody.consensusUpdateTopic) {\n transactionType = 'consensusUpdateTopic';\n } else if (txBody.consensusSubmitMessage) {\n transactionType = 'consensusSubmitMessage';\n } else if (txBody.consensusDeleteTopic) {\n transactionType = 'consensusDeleteTopic';\n } else if (txBody.fileCreate) {\n transactionType = 'fileCreate';\n } else if (txBody.fileAppend) {\n transactionType = 'fileAppend';\n } else if (txBody.fileUpdate) {\n transactionType = 'fileUpdate';\n } else if (txBody.fileDelete) {\n transactionType = 'fileDelete';\n } else if (txBody.contractCall) {\n transactionType = 'contractCall';\n } else if (txBody.contractCreateInstance) {\n transactionType = 'contractCreate';\n } else if (txBody.contractUpdateInstance) {\n transactionType = 'contractUpdate';\n } else if (txBody.contractDeleteInstance) {\n transactionType = 'contractDelete';\n } else if (txBody.tokenCreation) {\n transactionType = 'tokenCreate';\n } else if (txBody.tokenUpdate) {\n transactionType = 'tokenUpdate';\n } else if (txBody.tokenDeletion) {\n transactionType = 'tokenDelete';\n } else if (txBody.tokenAssociate) {\n transactionType = 'tokenAssociate';\n } else if (txBody.tokenDissociate) {\n transactionType = 'tokenDissociate';\n } else if (txBody.tokenMint) {\n transactionType = 'tokenMint';\n } else if (txBody.tokenBurn) {\n transactionType = 'tokenBurn';\n } else if (txBody.tokenFeeScheduleUpdate) {\n transactionType = 'tokenFeeScheduleUpdate';\n } else if (txBody.tokenFreeze) {\n transactionType = 'tokenFreeze';\n } else if (txBody.tokenUnfreeze) {\n transactionType = 'tokenUnfreeze';\n } else if (txBody.tokenGrantKyc) {\n transactionType = 'tokenGrantKyc';\n } else if (txBody.tokenRevokeKyc) {\n transactionType = 'tokenRevokeKyc';\n } else if (txBody.tokenPause) {\n transactionType = 'tokenPause';\n } else if (txBody.tokenUnpause) {\n transactionType = 'tokenUnpause';\n } else if (txBody.tokenWipe) {\n transactionType = 'tokenWipe';\n } else if (txBody.utilPrng) {\n transactionType = 'utilPrng';\n }\n\n return transactionType;\n }\n\n /**\n * Convert technical transaction type to human-readable format\n * @param type - The technical transaction type\n * @returns The human-readable transaction type\n */\n private static getHumanReadableType(type: string): string {\n const typeMap: Record<string, string> = {\n cryptoTransfer: 'HBAR Transfer',\n cryptoCreateAccount: 'Create Account',\n cryptoUpdateAccount: 'Update Account',\n cryptoDeleteAccount: 'Delete Account',\n cryptoApproveAllowance: 'Approve Allowance',\n cryptoDeleteAllowance: 'Delete Allowance',\n cryptoDelete: 'Delete Account',\n\n consensusCreateTopic: 'Create Topic',\n consensusUpdateTopic: 'Update Topic',\n consensusSubmitMessage: 'Submit Message',\n consensusDeleteTopic: 'Delete Topic',\n\n fileCreate: 'Create File',\n fileAppend: 'Append File',\n fileUpdate: 'Update File',\n fileDelete: 'Delete File',\n\n contractCall: 'Contract Call',\n contractCreate: 'Create Contract',\n contractUpdate: 'Update Contract',\n contractDelete: 'Delete Contract',\n ethereumTransaction: 'Ethereum Transaction',\n\n tokenCreate: 'Create Token',\n tokenUpdate: 'Update Token',\n tokenDelete: 'Delete Token',\n tokenAssociate: 'Associate Token',\n tokenDissociate: 'Dissociate Token',\n tokenMint: 'Mint Token',\n tokenBurn: 'Burn Token',\n tokenFeeScheduleUpdate: 'Update Token Fee Schedule',\n tokenFreeze: 'Freeze Token',\n tokenUnfreeze: 'Unfreeze Token',\n tokenGrantKyc: 'Grant KYC',\n tokenRevokeKyc: 'Revoke KYC',\n tokenPause: 'Pause Token',\n tokenUnpause: 'Unpause Token',\n tokenWipe: 'Wipe Token',\n\n scheduleCreate: 'Create Schedule',\n scheduleSign: 'Sign Schedule',\n\n utilPrng: 'Generate Random Number',\n\n unknown: 'Unknown Transaction',\n };\n\n let result: string;\n if (typeMap[type]) {\n result = typeMap[type];\n } else {\n result = 'Unknown Transaction';\n }\n\n return result;\n }\n\n /**\n * Get a human-readable summary of the transaction\n * @param parsedTx - The parsed transaction\n * @returns The human-readable summary of the transaction\n */\n static getTransactionSummary(parsedTx: ParsedTransaction): string {\n if (parsedTx.type === 'cryptoTransfer') {\n const senders = [];\n const receivers = [];\n\n for (const transfer of parsedTx.transfers) {\n const originalAmountFloat = parseFloat(transfer.amount);\n\n let displayStr = transfer.amount;\n if (displayStr.startsWith('-')) {\n displayStr = displayStr.substring(1);\n }\n displayStr = displayStr.replace(/\\s*ℏ$/, '');\n\n if (originalAmountFloat < 0) {\n senders.push(`${transfer.accountId} (${displayStr} ℏ)`);\n } else if (originalAmountFloat > 0) {\n receivers.push(`${transfer.accountId} (${displayStr} ℏ)`);\n }\n }\n\n if (senders.length > 0 && receivers.length > 0) {\n return `Transfer of HBAR from ${senders.join(', ')} to ${receivers.join(\n ', ',\n )}`;\n } else {\n return parsedTx.humanReadableType;\n }\n } else if (parsedTx.contractCall) {\n let contractCallSummary = `Contract call to ${parsedTx.contractCall.contractId} with ${parsedTx.contractCall.gas} gas`;\n\n if (parsedTx.contractCall.amount > 0) {\n contractCallSummary += ` and ${parsedTx.contractCall.amount} HBAR`;\n }\n\n if (parsedTx.contractCall.functionName) {\n contractCallSummary += ` calling function ${parsedTx.contractCall.functionName}`;\n }\n\n return contractCallSummary;\n } else if (parsedTx.tokenMint) {\n return `Mint ${parsedTx.tokenMint.amount} tokens for token ${parsedTx.tokenMint.tokenId}`;\n } else if (parsedTx.tokenBurn) {\n return `Burn ${parsedTx.tokenBurn.amount} tokens for token ${parsedTx.tokenBurn.tokenId}`;\n } else if (parsedTx.tokenCreation) {\n let summary = `Create token ${\n parsedTx.tokenCreation.tokenName || '(No Name)'\n } (${parsedTx.tokenCreation.tokenSymbol || '(No Symbol)'})`;\n if (parsedTx.tokenCreation.initialSupply) {\n summary += ` with initial supply ${parsedTx.tokenCreation.initialSupply}`;\n }\n if (parsedTx.tokenCreation.customFees?.length) {\n summary += ` including ${parsedTx.tokenCreation.customFees.length} custom fee(s)`;\n }\n return summary;\n } else if (parsedTx.tokenTransfers.length > 0) {\n const tokenGroups: Record<string, TokenAmount[]> = {};\n\n for (const transfer of parsedTx.tokenTransfers) {\n if (!tokenGroups[transfer.tokenId]) {\n tokenGroups[transfer.tokenId] = [];\n }\n tokenGroups[transfer.tokenId].push(transfer);\n }\n\n const tokenSummaries = [];\n\n for (const [tokenId, transfers] of Object.entries(tokenGroups)) {\n const tokenSenders = [];\n const tokenReceivers = [];\n\n for (const transfer of transfers) {\n const transferAmountValue = parseFloat(transfer.amount.toString());\n if (transferAmountValue < 0) {\n tokenSenders.push(\n `${transfer.accountId} (${Math.abs(transferAmountValue)})`,\n );\n } else if (transferAmountValue > 0) {\n tokenReceivers.push(\n `${transfer.accountId} (${transferAmountValue})`,\n );\n }\n }\n\n if (tokenSenders.length > 0 && tokenReceivers.length > 0) {\n tokenSummaries.push(\n `Transfer of token ${tokenId} from ${tokenSenders.join(\n ', ',\n )} to ${tokenReceivers.join(', ')}`,\n );\n }\n }\n\n if (tokenSummaries.length > 0) {\n return tokenSummaries.join('; ');\n } else {\n return parsedTx.humanReadableType;\n }\n } else if (parsedTx.consensusCreateTopic) {\n let summary = `Create new topic`;\n if (parsedTx.consensusCreateTopic.memo) {\n summary += ` with memo \"${parsedTx.consensusCreateTopic.memo}\"`;\n }\n if (parsedTx.consensusCreateTopic.autoRenewAccountId) {\n summary += `, auto-renew by ${parsedTx.consensusCreateTopic.autoRenewAccountId}`;\n }\n return summary;\n } else if (parsedTx.consensusSubmitMessage) {\n let summary = `Submit message`;\n if (parsedTx.consensusSubmitMessage.topicId) {\n summary += ` to topic ${parsedTx.consensusSubmitMessage.topicId}`;\n }\n if (parsedTx.consensusSubmitMessage.message) {\n if (parsedTx.consensusSubmitMessage.messageEncoding === 'utf8') {\n const messagePreview =\n parsedTx.consensusSubmitMessage.message.substring(0, 70);\n summary += `: \"${messagePreview}${\n parsedTx.consensusSubmitMessage.message.length > 70 ? '...' : ''\n }\"`;\n } else {\n summary += ` (binary message data, length: ${\n Buffer.from(parsedTx.consensusSubmitMessage.message, 'base64')\n .length\n } bytes)`;\n }\n }\n if (\n parsedTx.consensusSubmitMessage.chunkInfoNumber &&\n parsedTx.consensusSubmitMessage.chunkInfoTotal\n ) {\n summary += ` (chunk ${parsedTx.consensusSubmitMessage.chunkInfoNumber}/${parsedTx.consensusSubmitMessage.chunkInfoTotal})`;\n }\n return summary;\n } else if (parsedTx.fileCreate) {\n let summary = 'Create File';\n if (parsedTx.fileCreate.memo) {\n summary += ` with memo \"${parsedTx.fileCreate.memo}\"`;\n }\n if (parsedTx.fileCreate.contents) {\n summary += ` (includes content)`;\n }\n return summary;\n } else if (parsedTx.fileAppend) {\n return `Append to File ${parsedTx.fileAppend.fileId || '(Unknown ID)'}`;\n } else if (parsedTx.fileUpdate) {\n return `Update File ${parsedTx.fileUpdate.fileId || '(Unknown ID)'}`;\n } else if (parsedTx.fileDelete) {\n return `Delete File ${parsedTx.fileDelete.fileId || '(Unknown ID)'}`;\n } else if (parsedTx.consensusUpdateTopic) {\n return `Update Topic ${\n parsedTx.consensusUpdateTopic.topicId || '(Unknown ID)'\n }`;\n } else if (parsedTx.consensusDeleteTopic) {\n return `Delete Topic ${\n parsedTx.consensusDeleteTopic.topicId || '(Unknown ID)'\n }`;\n } else if (parsedTx.tokenUpdate) {\n return `Update Token ${parsedTx.tokenUpdate.tokenId || '(Unknown ID)'}`;\n } else if (parsedTx.tokenFeeScheduleUpdate) {\n return `Update Fee Schedule for Token ${\n parsedTx.tokenFeeScheduleUpdate.tokenId || '(Unknown ID)'\n }`;\n } else if (parsedTx.utilPrng) {\n let summary = 'Generate Random Number';\n if (parsedTx.utilPrng.range && parsedTx.utilPrng.range > 0) {\n summary += ` (range up to ${parsedTx.utilPrng.range - 1})`;\n }\n return summary;\n } else if (parsedTx.tokenFreeze) {\n return `Freeze Token ${parsedTx.tokenFreeze.tokenId} for Account ${parsedTx.tokenFreeze.accountId}`;\n } else if (parsedTx.tokenUnfreeze) {\n return `Unfreeze Token ${parsedTx.tokenUnfreeze.tokenId} for Account ${parsedTx.tokenUnfreeze.accountId}`;\n } else if (parsedTx.tokenGrantKyc) {\n return `Grant KYC for Token ${parsedTx.tokenGrantKyc.tokenId} to Account ${parsedTx.tokenGrantKyc.accountId}`;\n } else if (parsedTx.tokenRevokeKyc) {\n return `Revoke KYC for Token ${parsedTx.tokenRevokeKyc.tokenId} from Account ${parsedTx.tokenRevokeKyc.accountId}`;\n } else if (parsedTx.tokenPause) {\n return `Pause Token ${parsedTx.tokenPause.tokenId}`;\n } else if (parsedTx.tokenUnpause) {\n return `Unpause Token ${parsedTx.tokenUnpause.tokenId}`;\n } else if (parsedTx.tokenWipeAccount) {\n let summary = `Wipe Token ${parsedTx.tokenWipeAccount.tokenId} from Account ${parsedTx.tokenWipeAccount.accountId}`;\n if (parsedTx.tokenWipeAccount.serialNumbers?.length) {\n summary += ` (Serials: ${parsedTx.tokenWipeAccount.serialNumbers.join(\n ', ',\n )})`;\n }\n if (parsedTx.tokenWipeAccount.amount) {\n summary += ` (Amount: ${parsedTx.tokenWipeAccount.amount})`;\n }\n return summary;\n } else if (parsedTx.tokenDelete) {\n return `Delete Token ${parsedTx.tokenDelete.tokenId}`;\n } else if (parsedTx.tokenAssociate) {\n return `Associate Account ${\n parsedTx.tokenAssociate.accountId\n } with Tokens: ${parsedTx.tokenAssociate.tokenIds?.join(', ')}`;\n } else if (parsedTx.tokenDissociate) {\n return `Dissociate Account ${\n parsedTx.tokenDissociate.accountId\n } from Tokens: ${parsedTx.tokenDissociate.tokenIds?.join(', ')}`;\n } else if (parsedTx.cryptoDelete) {\n return `Delete Account ${parsedTx.cryptoDelete.deleteAccountId}`;\n }\n if (parsedTx.cryptoCreateAccount) {\n let summary = 'Create Account';\n if (\n parsedTx.cryptoCreateAccount.initialBalance &&\n parsedTx.cryptoCreateAccount.initialBalance !== '0'\n ) {\n summary += ` with balance ${parsedTx.cryptoCreateAccount.initialBalance}`;\n }\n if (parsedTx.cryptoCreateAccount.alias) {\n summary += ` (Alias: ${parsedTx.cryptoCreateAccount.alias})`;\n }\n return summary;\n }\n if (parsedTx.cryptoUpdateAccount) {\n return `Update Account ${\n parsedTx.cryptoUpdateAccount.accountIdToUpdate || '(Unknown ID)'\n }`;\n }\n if (parsedTx.cryptoApproveAllowance) {\n let count =\n (parsedTx.cryptoApproveAllowance.hbarAllowances?.length || 0) +\n (parsedTx.cryptoApproveAllowance.tokenAllowances?.length || 0) +\n (parsedTx.cryptoApproveAllowance.nftAllowances?.length || 0);\n return `Approve ${count} Crypto Allowance(s)`;\n }\n if (parsedTx.cryptoDeleteAllowance) {\n return `Delete ${\n parsedTx.cryptoDeleteAllowance.nftAllowancesToRemove?.length || 0\n } NFT Crypto Allowance(s)`;\n }\n if (parsedTx.contractCreate) {\n let summary = 'Create Contract';\n if (parsedTx.contractCreate.memo) {\n summary += ` (Memo: ${parsedTx.contractCreate.memo})`;\n }\n return summary;\n }\n if (parsedTx.contractUpdate) {\n return `Update Contract ${\n parsedTx.contractUpdate.contractIdToUpdate || '(Unknown ID)'\n }`;\n }\n if (parsedTx.contractDelete) {\n let summary = `Delete Contract ${\n parsedTx.contractDelete.contractIdToDelete || '(Unknown ID)'\n }`;\n if (parsedTx.contractDelete.transferAccountId) {\n summary += ` (Transfer to Account: ${parsedTx.contractDelete.transferAccountId})`;\n } else if (parsedTx.contractDelete.transferContractId) {\n summary += ` (Transfer to Contract: ${parsedTx.contractDelete.transferContractId})`;\n }\n return summary;\n }\n if (\n parsedTx.humanReadableType &&\n parsedTx.humanReadableType !== 'Unknown Transaction'\n ) {\n return parsedTx.humanReadableType;\n }\n if (parsedTx.tokenTransfers.length > 0) {\n const tokenGroups: Record<string, TokenAmount[]> = {};\n for (const transfer of parsedTx.tokenTransfers) {\n if (!tokenGroups[transfer.tokenId]) {\n tokenGroups[transfer.tokenId] = [];\n }\n tokenGroups[transfer.tokenId].push(transfer);\n }\n const tokenSummaries = [];\n for (const [tokenId, transfers] of Object.entries(tokenGroups)) {\n const tokenSenders = transfers\n .filter(t => t.amount < 0)\n .map(t => `${t.accountId} (${Math.abs(t.amount)})`);\n const tokenReceivers = transfers\n .filter(t => t.amount > 0)\n .map(t => `${t.accountId} (${t.amount})`);\n if (tokenSenders.length > 0 && tokenReceivers.length > 0) {\n tokenSummaries.push(\n `Transfer of token ${tokenId} from ${tokenSenders.join(\n ', ',\n )} to ${tokenReceivers.join(', ')}`,\n );\n } else if (tokenReceivers.length > 0) {\n tokenSummaries.push(\n `Token ${tokenId} received by ${tokenReceivers.join(', ')}`,\n );\n } else if (tokenSenders.length > 0) {\n tokenSummaries.push(\n `Token ${tokenId} sent from ${tokenSenders.join(', ')}`,\n );\n }\n }\n if (tokenSummaries.length > 0) return tokenSummaries.join('; ');\n }\n\n return 'Unknown Transaction';\n }\n}\n","// TextEncoder and TextDecoder are available globally in modern browsers\n// and in Node.js without explicit import\nimport { Logger } from '../utils/logger';\n\nexport interface BaseMessage {\n p: string;\n op: string;\n m: string;\n t?: string;\n t_id?: string;\n d?: Record<string, unknown>;\n}\n\nexport interface EVMConfig extends BaseMessage {\n c: {\n contractAddress: string;\n abi: {\n inputs: Array<{\n name: string;\n type: string;\n }>;\n name: string;\n outputs: Array<{\n name: string;\n type: string;\n }>;\n stateMutability: string;\n type: string;\n };\n };\n}\n\nexport interface WASMConfig extends BaseMessage {\n c: {\n wasmTopicId: string;\n inputType: {\n stateData: Record<string, string>;\n };\n outputType: {\n type: string;\n format: string;\n };\n };\n}\n\nexport interface WasmExports extends WebAssembly.Exports {\n __wbindgen_add_to_stack_pointer: (a: number) => number;\n __wbindgen_malloc: (a: number, b: number) => number;\n __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number;\n __wbindgen_free: (a: number, b: number, c: number) => void;\n memory: WebAssembly.Memory;\n process_state: (state_json: string, messages_json: string) => string;\n get_params: () => string;\n [key: string]: any;\n}\n\nexport class WasmBridge {\n wasm: WasmExports | null = null;\n private WASM_VECTOR_LEN: number = 0;\n private cachedUint8Memory: Uint8Array | null = null;\n private cachedDataViewMemory: DataView | null = null;\n private readonly textEncoder: TextEncoder;\n private readonly textDecoder: TextDecoder;\n private logger: Logger;\n\n constructor() {\n this.textEncoder = new TextEncoder();\n this.textDecoder = new TextDecoder('utf-8', {\n ignoreBOM: true,\n fatal: true,\n });\n this.textDecoder.decode();\n this.logger = Logger.getInstance({ module: 'WasmBridge' });\n }\n\n setLogLevel(level: 'debug' | 'info' | 'warn' | 'error'): void {\n this.logger.setLogLevel(level);\n }\n\n get wasmInstance(): WasmExports {\n if (!this.wasm) {\n throw new Error('WASM not initialized');\n }\n return this.wasm;\n }\n\n private getUint8Memory(): Uint8Array {\n if (!this.wasm) {\n throw new Error('WASM not initialized');\n }\n if (\n this.cachedUint8Memory === null ||\n this.cachedUint8Memory.byteLength === 0\n ) {\n this.cachedUint8Memory = new Uint8Array(this.wasm.memory.buffer);\n }\n return this.cachedUint8Memory;\n }\n\n private getDataViewMemory(): DataView {\n if (!this.wasm) {\n throw new Error('WASM not initialized');\n }\n if (\n this.cachedDataViewMemory === null ||\n this.cachedDataViewMemory.buffer !== this.wasm.memory.buffer\n ) {\n this.cachedDataViewMemory = new DataView(this.wasm.memory.buffer);\n }\n return this.cachedDataViewMemory;\n }\n\n private encodeString(\n arg: string,\n view: Uint8Array,\n ): { read: number; written: number } {\n if (arg.length === 0) {\n return { read: 0, written: 0 };\n }\n\n const buf = this.textEncoder.encode(arg);\n view.set(buf);\n return { read: arg.length, written: buf.length };\n }\n\n private passStringToWasm(\n arg: string,\n malloc: (a: number, b: number) => number,\n realloc?: (a: number, b: number, c: number, d: number) => number,\n ): number {\n if (realloc === undefined) {\n const buf = this.textEncoder.encode(arg);\n const ptr = malloc(buf.length, 1);\n const view = this.getUint8Memory();\n view.set(buf, ptr);\n this.WASM_VECTOR_LEN = buf.length;\n return ptr;\n }\n\n let len = this.textEncoder.encode(arg).length;\n let ptr = malloc(len, 1);\n\n const mem = this.getUint8Memory();\n\n let offset = 0;\n\n for (; offset < len; offset++) {\n const code = arg.charCodeAt(offset);\n if (code > 0x7f) break;\n mem[ptr + offset] = code;\n }\n\n if (offset !== len) {\n if (offset !== 0) {\n arg = arg.slice(offset);\n }\n ptr = realloc(\n ptr,\n len,\n (len = offset + this.textEncoder.encode(arg).length * 3),\n 1,\n );\n const view = this.getUint8Memory().subarray(ptr + offset, ptr + len);\n const ret = this.encodeString(arg, view);\n\n offset += ret.written;\n }\n\n this.WASM_VECTOR_LEN = offset;\n return ptr;\n }\n\n private getStringFromWasm(ptr: number, len: number): string {\n ptr = ptr >>> 0;\n return this.textDecoder.decode(\n this.getUint8Memory().subarray(ptr, ptr + len),\n );\n }\n\n createWasmFunction(\n wasmFn: (...args: any[]) => any,\n ): (...args: string[]) => string {\n if (!this.wasm) {\n throw new Error('WASM not initialized');\n }\n\n return (...args: string[]): string => {\n const retptr = this.wasm!.__wbindgen_add_to_stack_pointer(-16);\n let deferred: [number, number] = [0, 0];\n\n try {\n const ptrLenPairs = args.map(arg => {\n const ptr = this.passStringToWasm(\n arg,\n this.wasm!.__wbindgen_malloc,\n this.wasm!.__wbindgen_realloc,\n );\n return [ptr, this.WASM_VECTOR_LEN];\n });\n\n const wasmArgs = [retptr, ...ptrLenPairs.flat()];\n\n wasmFn.apply(this.wasm, wasmArgs);\n\n const r0 = this.getDataViewMemory().getInt32(retptr + 4 * 0, true);\n const r1 = this.getDataViewMemory().getInt32(retptr + 4 * 1, true);\n deferred = [r0, r1];\n\n return this.getStringFromWasm(r0, r1);\n } finally {\n this.wasm!.__wbindgen_add_to_stack_pointer(16);\n this.wasm!.__wbindgen_free(deferred[0], deferred[1], 1);\n }\n };\n }\n\n async initWasm(wasmBytes: BufferSource): Promise<WasmExports> {\n const bridge = this;\n const imports = {\n __wbindgen_placeholder__: {\n __wbindgen_throw: function (ptr: number, len: number) {\n const message = bridge.getStringFromWasm(ptr, len);\n bridge.logger.error(`WASM error: ${message}`);\n throw new Error(message);\n },\n },\n };\n\n try {\n this.logger.debug('Compiling WASM module');\n const wasmModule = await WebAssembly.compile(wasmBytes);\n this.logger.debug('Instantiating WASM module');\n const wasmInstance = await WebAssembly.instantiate(wasmModule, imports);\n this.wasm = wasmInstance.exports as WasmExports;\n this.logger.info('WASM module initialized successfully');\n return this.wasm;\n } catch (error) {\n this.logger.error('Failed to initialize WASM module', error);\n throw error;\n }\n }\n\n createStateData(wasmConfig: WASMConfig, stateData: Record<string, any> = {}) {\n let dynamicStateData: Record<string, any> = {};\n\n if (wasmConfig?.c?.inputType?.stateData) {\n // Special case: if we have latestRoundData with all the fields we need\n if (\n stateData.latestRoundData &&\n Object.keys(wasmConfig.c.inputType.stateData).every(\n key => key in stateData.latestRoundData,\n )\n ) {\n // Return the nested structure for Chainlink\n dynamicStateData.latestRoundData = {};\n Object.entries(wasmConfig.c.inputType.stateData).forEach(([key, _]) => {\n dynamicStateData.latestRoundData[key] = String(\n stateData.latestRoundData[key],\n );\n });\n } else {\n // Handle flat structure (launchpage case)\n Object.entries(wasmConfig.c.inputType.stateData).forEach(\n ([key, type]) => {\n const result = stateData[key];\n if (\n result &&\n typeof result === 'object' &&\n 'values' in result &&\n result.values.length > 0\n ) {\n dynamicStateData[key] = String(result.values[0]);\n } else {\n dynamicStateData[key] = this.getDefaultValueForType(\n type as string,\n );\n }\n },\n );\n }\n }\n return dynamicStateData;\n }\n\n private getDefaultValueForType(type: string): string {\n if (\n type.startsWith('uint') ||\n type.startsWith('int') ||\n type === 'number'\n ) {\n return '0';\n } else if (type === 'bool') {\n return 'false';\n } else {\n return '';\n }\n }\n\n executeWasm(stateData: Record<string, any>, messages: BaseMessage[]) {\n if (!this.wasm) {\n this.logger.error('WASM not initialized');\n throw new Error('WASM not initialized');\n }\n\n try {\n this.logger.debug('Executing WASM with stateData', stateData);\n const fn = this.createWasmFunction(this.wasmInstance.process_state);\n return fn(JSON.stringify(stateData), JSON.stringify(messages));\n } catch (error) {\n this.logger.error('Error executing WASM', error);\n throw error;\n }\n }\n\n getParams(): string {\n const fn = this.createWasmFunction(this.wasmInstance.get_params);\n return fn();\n }\n}\n"],"names":["Logger$1","_a","constructor","options","globalDisable","process","env","DISABLE_LOGS","shouldSilence","silent","level","this","moduleContext","module","pinoOptions","enabled","transport","prettyPrint","target","colorize","translateTime","ignore","logger","pino","getInstance","moduleKey","instances","has","get","getLevel","delete","set","setLogLevel","setSilent","setModule","debug","args","info","warn","error","trace","Map","MapCache","cache","key","value","clear","formatValue","type","_isBigNumber","toString","startsWith","String","toLowerCase","endsWith","Array","isArray","map","v","__defProp","Object","defineProperty","__publicField","obj","enumerable","configurable","writable","__defNormalProp","buffer","base64Js","b64","lens","getLens","validLen","placeHoldersLen","tmp","i","arr","Arr","_byteLength","curByte","len","revLookup","charCodeAt","uint8","length","extraBytes","parts","maxChunkLength","len2","push","encodeChunk","lookup","join","Uint8Array","code","Error","indexOf","start","end","num","output","ieee754$1","buffer2","offset","isLE","mLen","nBytes","e","m","eLen","eMax","eBias","nBits","d","s","NaN","Infinity","Math","pow","c","rt","abs","isNaN","floor","log","LN2","exports","base64","ieee754$1$1","customInspectSymbol","Symbol","Buffer","Buffer3","SlowBuffer","alloc","INSPECT_MAX_BYTES","K_MAX_LENGTH","kMaxLength","GlobalUint8Array","ArrayBuffer","GlobalArrayBuffer","SharedArrayBuffer","GlobalSharedArrayBuffer","globalThis","createBuffer","RangeError","buf","setPrototypeOf","prototype","arg","encodingOrOffset","TypeError","allocUnsafe","from","string","encoding","isEncoding","byteLength2","actual","write","slice","fromString","isView","arrayView","isInstance","copy","fromArrayBuffer","byteOffset","byteLength","fromArrayLike","fromArrayView","valueOf","b","isBuffer","checked","numberIsNaN","data","fromObject","toPrimitive","assertSize","size","array","mustMatch","arguments","loweredCase","utf8ToBytes","base64ToBytes","slowToString","hexSlice","utf8Slice","asciiSlice","latin1Slice","base64Slice","utf16leSlice","swap","n","bidirectionalIndexOf","val","dir","arrayIndexOf","call","lastIndexOf","indexSize","arrLength","valLength","read","i2","readUInt16BE","foundIndex","found","j","hexWrite","Number","remaining","strLen","parsed","parseInt","substr","utf8Write","blitBuffer","asciiWrite","str","byteArray","asciiToBytes","base64Write","ucs2Write","units","hi","lo","utf16leToBytes","fromByteArray","min","res","firstByte","codePoint","bytesPerSequence","secondByte","thirdByte","fourthByte","tempCodePoint","codePoints","MAX_ARGUMENTS_LENGTH","fromCharCode","apply","decodeCodePointsArray","TYPED_ARRAY_SUPPORT","proto","foo","typedArraySupport","console","poolSize","fill","allocUnsafeSlow","_isBuffer","compare","a","x","y","concat","list","pos","swap16","swap32","swap64","toLocaleString","equals","inspect","max","replace","trim","thisStart","thisEnd","thisCopy","targetCopy","includes","isFinite","toJSON","_arr","ret","out","hexSliceLookupTable","bytes","checkOffset","ext","checkInt","wrtBigUInt64LE","checkIntBI","BigInt","wrtBigUInt64BE","checkIEEE754","writeFloat","littleEndian","noAssert","writeDouble","newBuf","subarray","readUintLE","readUIntLE","byteLength3","mul","readUintBE","readUIntBE","readUint8","readUInt8","readUint16LE","readUInt16LE","readUint16BE","readUint32LE","readUInt32LE","readUint32BE","readUInt32BE","readBigUInt64LE","defineBigIntMethod","validateNumber","first","last","boundsError","readBigUInt64BE","readIntLE","readIntBE","readInt8","readInt16LE","readInt16BE","readInt32LE","readInt32BE","readBigInt64LE","readBigInt64BE","readFloatLE","readFloatBE","readDoubleLE","readDoubleBE","writeUintLE","writeUIntLE","writeUintBE","writeUIntBE","writeUint8","writeUInt8","writeUint16LE","writeUInt16LE","writeUint16BE","writeUInt16BE","writeUint32LE","writeUInt32LE","writeUint32BE","writeUInt32BE","writeBigUInt64LE","writeBigUInt64BE","writeIntLE","limit","sub","writeIntBE","writeInt8","writeInt16LE","writeInt16BE","writeInt32LE","writeInt32BE","writeBigInt64LE","writeBigInt64BE","writeFloatLE","writeFloatBE","writeDoubleLE","writeDoubleBE","targetStart","copyWithin","code2","errors","E","sym","getMessage","Base","super","name","stack","message","addNumericalSeparator","range","ERR_OUT_OF_RANGE","checkBounds","ERR_INVALID_ARG_TYPE","ERR_BUFFER_OUT_OF_BOUNDS","input","msg","received","isInteger","INVALID_BASE64_RE","leadSurrogate","toByteArray","split","base64clean","src","dst","alphabet","table","i16","fn","BufferBigIntNotDefined","Buffer2","Buffer$1","global","self","getDefaultExportFromCjs","__esModule","hasOwnProperty","cachedSetTimeout","cachedClearTimeout","browser","defaultSetTimout","defaultClearTimeout","runTimeout","fun","setTimeout","e2","clearTimeout","currentQueue","queue","draining","queueIndex","cleanUpNextTick","drainQueue","timeout","run","marker","runClearTimeout","Item","noop$1","nextTick","title","argv","version","versions","on","addListener","once","off","removeListener","removeAllListeners","emit","prependListener","prependOnceListener","listeners","binding","cwd","chdir","umask","process$1","bind","thisArg","getPrototypeOf","kindOf","thing","create","kindOfTest","typeOfTest","isUndefined","isArrayBuffer","isString","isFunction","isNumber","isObject","isPlainObject","prototype2","toStringTag","iterator","isDate","isFile","isBlob","isFileList","isURLSearchParams","isReadableStream","isRequest","isResponse","isHeaders","forEach","allOwnKeys","l","keys","getOwnPropertyNames","findKey","_key","_global","window","isContextDefined","context","isTypedArray","TypedArray","isHTMLForm","hasOwnProperty2","prop","isRegExp","reduceDescriptors","reducer","descriptors2","getOwnPropertyDescriptors","reducedDescriptors","descriptor","defineProperties","isAsyncFn","_setImmediate","setImmediateSupported","setImmediate","postMessageSupported","postMessage","token","random","callbacks","addEventListener","source","shift","cb","asap","queueMicrotask","utils$1","isFormData","kind","FormData","append","isArrayBufferView","result","isBoolean","isStream","pipe","merge","caseless","assignValue","targetKey","extend","stripBOM","content","inherits","superConstructor","props","assign","toFlatObject","sourceObj","destObj","filter2","propFilter","merged","searchString","position","lastIndex","toArray","forEachEntry","next","done","pair","matchAll","regExp","matches","exec","hasOwnProp","freezeMethods","toObjectSet","arrayOrString","delimiter","define","toCamelCase","p1","p2","toUpperCase","noop","toFiniteNumber","defaultValue","isSpecCompliantForm","toJSONObject","visit","reducedValue","isThenable","then","catch","AxiosError","config","request","response","captureStackTrace","status","description","number","fileName","lineNumber","columnNumber","prototype$1","descriptors","customProps","axiosError","cause","isVisitable","removeBrackets","renderKey","path","dots","predicates","test","toFormData","formData","metaTokens","indexes","option","visitor","defaultVisitor","useBlob","Blob","convertValue","toISOString","JSON","stringify","some","isFlatArray","el","index","exposedHelpers","build","pop","encode$1","charMap","encodeURIComponent","match","AxiosURLSearchParams","params","_pairs","encode","buildURL","url","_encode","serialize","serializeFn","serializedParams","hashmarkIndex","encoder","InterceptorManager","handlers","use","fulfilled","rejected","synchronous","runWhen","eject","id","h","transitionalDefaults","silentJSONParsing","forcedJSONParsing","clarifyTimeoutError","platform$1","isBrowser","classes","URLSearchParams","protocols","hasBrowserEnv","document","_navigator","navigator","hasStandardBrowserEnv","product","hasStandardBrowserWebWorkerEnv","WorkerGlobalScope","importScripts","origin","location","href","platform","freeze","__proto__","formDataToJSON","buildPath","isNumericKey","isLast","arrayToObject","entries","parsePropPath","defaults","transitional","adapter","transformRequest","headers","contentType","getContentType","hasJSONContentType","isObjectPayload","setContentType","isFileList2","helpers","isNode","toURLEncodedForm","formSerializer","_FormData","rawValue","parser","parse","stringifySafely","transformResponse","transitional2","JSONRequested","responseType","strictJSONParsing","ERR_BAD_RESPONSE","xsrfCookieName","xsrfHeaderName","maxContentLength","maxBodyLength","validateStatus","common","Accept","method","ignoreDuplicateOf","$internals","normalizeHeader","header","normalizeValue","matchHeaderValue","isHeaderNameFilter","AxiosHeaders","valueOrRewrite","rewrite","self2","setHeader","_value","_header","_rewrite","lHeader","setHeaders","rawHeaders","line","substring","parseHeaders","tokens","tokensRE","parseTokens","matcher","deleted","deleteHeader","normalize","format","normalized","w","char","formatHeader","targets","asStrings","computed","accessor","accessors","defineAccessor","accessorName","methodName","arg1","arg2","arg3","buildAccessors","transformData","fns","isCancel","__CANCEL__","CanceledError","ERR_CANCELED","settle","resolve","reject","validateStatus2","ERR_BAD_REQUEST","mapped","headerValue","progressEventReducer","listener","isDownloadStream","freq","bytesNotified","_speedometer","samplesCount","timestamps","firstSampleTS","head","tail","chunkLength","now","Date","startedAt","bytesCount","passed","round","speedometer","lastArgs","timer","timestamp","threshold","invoke","throttle","loaded","total","lengthComputable","progressBytes","rate","progress","estimated","event","progressEventDecorator","throttled","asyncDecorator","isURLSameOrigin","origin2","isMSIE","URL","protocol","host","port","userAgent","cookies","expires","domain","secure","cookie","toGMTString","RegExp","decodeURIComponent","remove","buildFullPath","baseURL","requestedURL","allowAbsoluteUrls","isRelativeUrl","relativeURL","combineURLs","headersToObject","mergeConfig","config1","config2","getMergedValue","mergeDeepProperties","valueFromConfig2","defaultToConfig2","mergeDirectKeys","mergeMap","paramsSerializer","timeoutMessage","withCredentials","withXSRFToken","onUploadProgress","onDownloadProgress","decompress","beforeRedirect","httpAgent","httpsAgent","cancelToken","socketPath","responseEncoding","merge2","configValue","resolveConfig","newConfig","auth","btoa","username","password","unescape","filter","Boolean","xsrfValue","xhrAdapter","XMLHttpRequest","Promise","_config","requestData","requestHeaders","onCanceled","uploadThrottled","downloadThrottled","flushUpload","flushDownload","unsubscribe","signal","removeEventListener","onloadend","responseHeaders","getAllResponseHeaders","err","responseText","statusText","open","onreadystatechange","readyState","responseURL","onabort","ECONNABORTED","onerror","ERR_NETWORK","ontimeout","timeoutErrorMessage","ETIMEDOUT","setRequestHeader","upload","cancel","abort","subscribe","aborted","parseProtocol","send","composeSignals","signals","controller","AbortController","reason","signal2","streamChunk","chunk","chunkSize","readStream","async","stream","asyncIterator","reader","getReader","trackStream","onProgress","onFinish","iterable","readBytes","_onFinish","ReadableStream","pull","done2","close","loadedBytes","enqueue","return","highWaterMark","isFetchSupported","fetch","Request","Response","isReadableStreamSupported","encodeText","TextEncoder","arrayBuffer","supportsRequestStream","duplexAccessed","hasContentType","body","duplex","supportsResponseStream","resolvers","res2","_","ERR_NOT_SUPPORT","resolveBodyLength","getContentLength","_request","getBodyLength","knownAdapters","http","xhr","fetchOptions","composedSignal","toAbortSignal","requestContentLength","contentTypeHeader","flush","isCredentialsSupported","credentials","isStreamResponse","responseContentLength","responseData","renderReason","isResolvedHandle","adapters","adapters2","nameOrAdapter","rejectedReasons","reasons","state","throwIfCancellationRequested","throwIfRequested","dispatchRequest","VERSION","validators$1","deprecatedWarnings","validator2","formatMessage","opt","desc","opts","ERR_DEPRECATED","spelling","correctSpelling","validator","assertOptions","schema","allowUnknown","ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","validators","Axios","instanceConfig","interceptors","configOrUrl","dummy","boolean","function","baseUrl","withXsrfToken","contextHeaders","requestInterceptorChain","synchronousRequestInterceptors","interceptor","unshift","responseInterceptorChain","promise","chain","onFulfilled","onRejected","getUri","generateHTTPMethod","isForm","CancelToken","executor","resolvePromise","_listeners","onfulfilled","_resolve","splice","HttpStatusCode","Continue","SwitchingProtocols","Processing","EarlyHints","Ok","Created","Accepted","NonAuthoritativeInformation","NoContent","ResetContent","PartialContent","MultiStatus","AlreadyReported","ImUsed","MultipleChoices","MovedPermanently","Found","SeeOther","NotModified","UseProxy","Unused","TemporaryRedirect","PermanentRedirect","BadRequest","Unauthorized","PaymentRequired","Forbidden","NotFound","MethodNotAllowed","NotAcceptable","ProxyAuthenticationRequired","RequestTimeout","Conflict","Gone","LengthRequired","PreconditionFailed","PayloadTooLarge","UriTooLong","UnsupportedMediaType","RangeNotSatisfiable","ExpectationFailed","ImATeapot","MisdirectedRequest","UnprocessableEntity","Locked","FailedDependency","TooEarly","UpgradeRequired","PreconditionRequired","TooManyRequests","RequestHeaderFieldsTooLarge","UnavailableForLegalReasons","InternalServerError","NotImplemented","BadGateway","ServiceUnavailable","GatewayTimeout","HttpVersionNotSupported","VariantAlsoNegotiates","InsufficientStorage","LoopDetected","NotExtended","NetworkAuthenticationRequired","axios","createInstance","defaultConfig","instance","Cancel","all","promises","spread","callback","isAxiosError","payload","formToJSON","getAdapter","default","_Logger","isProduction","NODE_ENV","_Logger2","Logger","ValidationError","Auth","accountId","privateKey","PrivateKey","fromStringED25519","network","authenticate","_b","_c","requestSignatureResponse","signature","signMessage","authResponse","post","authData","include","user","sessionToken","apiKey","messageBytes","signatureBytes","sign","ClientAuth","signer","dv","DataView","UINT8","getUint8","put","setUint8","UINT16_LE","getUint16","setUint16","UINT16_BE","UINT32_LE","getUint32","setUint32","UINT32_BE","INT32_BE","getInt32","setInt32","UINT64_LE","getBigUint64","setBigUint64","StringType","uint8Array","EndOfStreamError","Deferred","AbstractStreamReader","maxStreamReadSize","endOfStream","peekQueue","peek","bytesRead","readFromPeekBuffer","readRemainderFromStream","peekData","lenCopy","initialRemaining","reqLen","chunkLen","readFromStream","StreamReader","deferred","readBuffer","readDeferred","AbstractTokenizer","fileInfo","numBuffer","readToken","peekToken","peekBuffer","readNumber","peekNumber","bytesLeft","normalizeOptions","mayBeLess","ReadStreamTokenizer","streamReader","getFileInfo","normOptions","skipBytes","skipBuffer","bufSize","totBytesRead","BufferTokenizer","bytes2read","uint32SyncSafeToken","minimumBytes","_check","mask","FileTypeParser","detectors","customDetectors","fromTokenizer","fromBuffer","tokenizer","initialPosition","detector","fileType","fromBlob","blob","fromStream","toDetectionStream","readableStream","require","sampleSize","pass","PassThrough","outputStream","pipeline","check","checkString","character","MAX_SAFE_INTEGER","mime","id3HeaderLength","zipHeader","compressedSize","uncompressedSize","filenameLength","extraFieldLength","filename","mimeType","nextHeaderIndex","brandMajor","maxBufferSize2","readTiffHeader","readField","msb","ic","readElement","lengthField","nrLength","readChildren","children","element","re","readChunkHeader","readHeader","guid","typeId","jsonSize","files","readSum","sum","tarHeaderChecksumMatches","readTiffTag","bigEndian","tagId","readTiffIFD","numberOfTags","ifdOffset","Set","_InscriptionSDK","client","getFileMetadata","getMimeType","extension","VALID_MIME_TYPES","validateRequest","holderId","VALID_MODES","mode","jsonFileURL","metadataObject","onlyJSONCollection","validateFileInput","file","normalizeMimeType","validateMimeType","values","base64Data","ceil","MAX_BASE64_SIZE","detectMimeTypeFromBase64","sanitizedBase64","typeResult","fileTypeFromBuffer","startInscription","fileMetadata","MAX_URL_FILE_SIZE","requestBody","creator","fileStandard","fileURL","fileBase64","fileMimeType","executeTransaction","transactionBytes","clientConfig","Client","forMainnet","forTestnet","setOperator","transaction","TransferTransaction","fromBytes","signedTransaction","executeTx","execute","getReceipt","transactionId","executeTransactionWithSigner","executeWithSigner","getReceiptWithSigner","inscribeAndExecute","inscriptionResponse","jobId","tx_id","inscribe","retryWithBackoff","operation","maxRetries","baseDelay","attempt","delay","retrieveInscription","txId","getInscriptionNumbers","createWithAuth","waitForInscription","maxAttempts","intervalMs","checkCompletion","progressCallback","attempts","highestPercentSoFar","reportProgress","stage","percent","details","progressPercent","currentAttempt","messages","maxMessages","completed","messagesProcessed","messageCount","confirmedMessages","isHashinal","isDynamic","topic_id","jsonTopicId","registryTopicId","timedOut","getHolderInscriptions","queryParams","includeCollections","jpg","jpeg","png","gif","ico","heic","heif","bmp","webp","tiff","tif","svg","mp4","webm","mp3","pdf","doc","docx","xls","xlsx","ppt","pptx","html","htm","css","php","java","js","mjs","csv","json","txt","glb","wav","ogg","oga","flac","aac","m4a","avi","mov","mkv","m4v","mpg","mpeg","ts","zip","rar","tar","gz","xml","yaml","yml","md","markdown","rtf","gltf","usdz","stl","fbx","ttf","otf","woff","woff2","eot","psd","ai","eps","ps","sqlite","db","apk","ics","vcf","py","rb","go","rs","typescript","jsx","tsx","sql","toml","avif","jxl","weba","InscriptionSDK","ProgressReporter","logProgress","minPercent","maxPercent","lastReportedPercent","lastReportedTime","throttleMs","setCallback","setLogger","setMinPercent","setMaxPercent","createSubProgress","subReporter","logPrefix","scaledPercent","scalePercent","formattedMessage","report","rawPercent","progressData","toFixed","sourceMin","sourceMax","scaleFactor","preparing","submitting","confirming","verifying","failed","existingSDK","logging","bufferSize","sdk","metadata","validateHashinalMetadata","baseRequest","tags","waitForConfirmation","waitMaxAttempts","waitIntervalMs","inscription","waitForInscriptionConfirmation","confirmed","inscribeWithSigner","getAccountId","missingFields","field","hasAttributes","attributes","hasProperties","properties","progressReporter","waitMethod","wrappedCallback","HederaMirrorNode","initialDelayMs","maxDelayMs","backoffFactor","customHeaders","customUrl","getMirrorNodeUrl","isServerEnvironment","configureRetry","configureMirrorNode","constructUrl","endpoint","baseUrlWithKey","getBaseUrl","getPublicKey","accountInfo","requestAccount","PublicKey","logMessage","getAccountMemo","_requestWithRetry","memo","getTopicInfo","topicId","getTopicFees","custom_fees","getHBARPrice","date","Timestamp","fromDate","current_rate","cent_equivalent","hbar_equivalent","getTokenInfo","tokenId","getTopicMessages","nextEndpoint","messageContent","messageJson","TextDecoder","decode","atob","sequence_number","consensus_timestamp","created","links","checkKeyListAccess","keyBytes","userPublicKey","Key","evaluateKeyAccess","ed25519","compareEd25519Key","keyList","evaluateKeyList","thresholdKey","listKey","nestedKeyBytes","finish","keyData","getScheduleInfo","scheduleId","getScheduledTransactionStatus","scheduleInfo","executed","executed_timestamp","executedDate","getTransaction","transactionIdOrHash","transactions","axiosConfig","Authorization","isLastAttempt","statusCode","_fetchWithRetry","Headers","ok","getAccountBalance","balance","getTopicMessagesByFilter","nextUrl","sequenceNumber","startTime","endTime","order","queryString","pagesFetched","parseError","raw_content","hcsMsg","payer_account_id","running_hash","running_hash_version","chunk_info","payer","getAccountTokens","allTokens","getTransactionByTimestamp","getAccountNfts","allNfts","nfts","nftsWithUri","nft","tokenUri","token_id","serial_number","token_uri","validateNFTOwnership","serialNumber","find","readSmartContractQuery","contractIdOrAddress","functionSelector","payerAccountId","toAddress","AccountId","toSolidityAddress","fromAddress","block","estimate","to","gas","gasPrice","K","getOutstandingTokenAirdrops","receiverId","airdrops","getPendingTokenAirdrops","senderId","getBlocks","blockNumber","blocks","getBlock","blockNumberOrHash","getContracts","contractId","contracts","getContract","getContractResults","blockHash","internal","transactionIndex","results","getContractResult","nonce","getContractResultsByContract","getContractState","slot","getContractActions","actions","getContractLogs","topic0","topic1","topic2","topic3","transactionHash","logs","getContractLogsByContract","getNftInfo","getNftsByToken","getNetworkInfo","getNetworkFees","getNetworkSupply","getNetworkStake","getOpcodeTraces","memory","storage","accountIdsToExemptKeys","accountIds","mirrorNode","exemptKeys","publicKey","HRLResolver","logLevel","defaultEndpoint","isBinaryContentType","prefix","parseHRL","hrl","standard","isValidHRL","getContentWithType","isBinary","resolveHRL","cdnUrl","cdnEndpoint","returnRaw","text","parseKey","contractID","ContractId","shardNum","realmNum","contractNum","ECDSASecp256k1","k","delegatableContractId","HTSParser","parseTokenCreate","tokenName","symbol","tokenSymbol","treasury","treasuryAccountId","accountNum","initialSupply","Long","fromValue","decimals","toNumber","maxSupply","tokenType","TokenType","supplyType","TokenSupplyType","adminKey","kycKey","freezeKey","wipeKey","supplyKey","feeScheduleKey","pauseKey","autoRenewAccount","autoRenewPeriod","seconds","customFees","fee","commonFeeData","feeCollectorAccountId","allCollectorsAreExempt","fixedFee","feeType","amount","denominatingTokenId","TokenId","tokenNum","fractionalFee","numerator","fractionalAmount","denominator","minimumAmount","maximumAmount","netOfTransfers","royaltyFee","fallbackFeeData","fallbackFee","exchangeValueFraction","parseTokenMint","meta","parseTokenBurn","serialNumbers","sn","parseTokenUpdate","autoRenewAccountId","expiry","nanos","parseTokenFeeScheduleUpdate","parseTokenFreeze","account","parseTokenUnfreeze","parseTokenGrantKyc","parseTokenRevokeKyc","parseTokenPause","parseTokenUnpause","parseTokenWipeAccount","parseTokenDelete","parseTokenAssociate","tokenIds","t","parseTokenDissociate","HCSParser","parseConsensusCreateTopic","submitKey","parseConsensusSubmitMessage","topicID","topicNum","messageBuffer","utf8String","messageEncoding","chunkInfo","initialTransactionID","accountID","taValidStart","transactionValidStart","chunkInfoInitialTransactionID","chunkInfoNumber","chunkInfoTotal","parseConsensusUpdateTopic","clearAdminKey","clearSubmitKey","parseConsensusDeleteTopic","FileParser","parseFileCreate","expirationTime","contents","parseFileAppend","fileID","fileId","fileNum","parseFileUpdate","parseFileDelete","CryptoParser","parseCryptoTransfers","cryptoTransfer","transfers","accountAmounts","aa","hbarAmount","Hbar","fromTinybars","HbarUnit","isDecimal","tokenTransfers","tokenTransferList","transfer","tokenAmount","parseCryptoDelete","deleteAccountID","deleteAccountId","transferAccountID","transferAccountId","parseCryptoCreateAccount","initialBalance","receiverSigRequired","maxAutomaticTokenAssociations","stakedAccountId","stakedNodeId","declineReward","alias","parseCryptoUpdateAccount","accountIDToUpdate","accountIdToUpdate","parseCryptoApproveAllowance","cryptoAllowances","hbarAllowances","ownerAccountId","owner","spenderAccountId","spender","tokenAllowances","nftAllowances","allowance","approvedForAll","delegatingSpender","parseCryptoDeleteAllowance","nftAllowancesToRemove","SCSParser","parseContractCall","parseFloat","functionParameters","functionName","parseContractCreate","constructorParameters","initcodeSource","initcode","FileId","parseContractUpdate","contractIdToUpdate","memoAsAny","memoVal","notEquals","parseContractDelete","contractIdToDelete","transferContractID","transferContractId","UtilParser","parseUtilPrng","detectKeyTypeFromString","privateKeyString","detectedType","fromStringECDSA","alternateType","secondError","ProfileType","AIAgentType","EndpointType","AIAgentCapability","InboundTopicType","capabilityNameToCapabilityMap","text_generation","image_generation","audio_generation","video_generation","code_generation","language_translation","summarization","extraction","knowledge_retrieval","data_integration","data_visualization","market_intelligence","transaction_analytics","smart_contract_audit","governance","security_monitoring","compliance_analysis","fraud_detection","multi_agent","api_integration","workflow_automation","SocialLinkSchema","z","object","handle","AIAgentDetailsSchema","nativeEnum","capabilities","model","optional","BaseProfileSchema","display_name","bio","socials","profileImage","record","any","inboundTopicId","outboundTopicId","PersonalProfileSchema","literal","PERSONAL","language","timezone","AIAgentProfileSchema","AI_AGENT","aiAgent","HCS11ProfileSchema","union","HCS11Client","operatorId","keyType","initializeOperatorWithKeyType","keyDetection","initializeOperator","getClient","getOperatorId","_type","PK","createPersonalProfile","displayName","createAIAgentProfile","agentType","validation","validateProfile","valid","profile","safeParse","success","expected","validOptions","profileToJSONString","parseProfileFromString","profileStr","parsedProfile","setProfileForAccountMemo","topicStandard","signedTx","signWithOperator","receipt","Status","Success","frozenTransaction","freezeWithSigner","inscribeImage","adjustedPercent","imageTopicId","inscribeProfile","profileTopicId","profileJson","contentBuffer","inscriptionOptions","updateAccountMemoWithProfile","AccountUpdateTransaction","setAccountMemo","setAccountId","createAndInscribeProfile","updateAccountMemo","inscriptionProgress","inscriptionResult","memoResult","getCapabilitiesFromTags","capabilityNames","TEXT_GENERATION","capabilityName","capability","getAgentTypeFromMetadata","AUTONOMOUS","MANUAL","fetchProfileByAccountId","protocolReference","profileData","topicInfo","inboundTopic","outboundTopic","arTxId","hcsFormat","protocolId","networkParam","cdnError","Registration","checkRegistrationStatus","transaction_id","waitForRegistrationConfirmation","delayMs","executeRegistration","hcs11Client","ms","profileResult","profileError","Origin","Referer","validationErrors","findRegistrations","tag","registrations","Hcs10MemoType","HCS10BaseClient","feeAmount","extractTopicFromOperatorId","extractAccountFromOperatorId","getMessageStream","validOps","p","op","operator_id","isValidOperatorId","schedule_id","getPublicTopicInfo","canSubmitToTopic","userAccountId","canSubmit","requiresFee","submit_key","topicSubmitKey","fee_schedule_key","fixed_fees","errorMessage","getMessages","retrieveProfile","disableCache","cacheKey","cachedProfileResponse","HCS10Cache","responseToCache","retrieveOutboundConnectTopic","retrieveCommunicationTopics","profileResponse","retrieveOutboundMessages","agentAccountId","hasConnectionCreated","connectionId","outBoundTopic","connection_id","getMessageContent","forceRaw","resolver","getMessageContentWithType","submitConnectionRequest","accountResponse","getAccountAndSigner","submissionCheck","inboundAccountOwner","retrieveInboundAccountId","connectionRequestMessage","submitPayload","responseSequenceNumber","topicSequenceNumber","requestorOperatorId","outbound_topic_id","connection_request_id","recordOutboundConnectionConfirmation","requestorOutboundTopicId","connectionRequestId","confirmedRequestId","connectionTopicId","connection_topic_id","requestor_outbound_topic_id","confirmed_request_id","waitForConnectionConfirmation","recordConfirmation","connectionCreatedMessages","confirmationResult","confirmedBy","confirmedByAccountId","confirmedByConnectionTopics","agentConnectionTopics","topicInfoParts","clearCache","_generateHcs10Memo","ttl","agentTopicId","hederaIdPattern","getTransactionRequests","transactOperations","sort","CACHE_TTL","cacheExpiry","PayloadSizeError","payloadSize","AccountCreationError","TopicCreationError","ConnectionConfirmationError","AgentBuilder","setName","setAlias","setBio","setDescription","setCapabilities","setAgentType","setType","setModel","setCreator","addSocial","addProperty","setMetadata","setProfilePicture","pfpBuffer","pfpFileName","setExistingProfilePicture","pfpTopicId","existingPfpTopicId","setNetwork","setInboundTopicType","inboundTopicType","setFeeConfig","feeConfigBuilder","feeConfig","setConnectionFeeConfig","connectionFeeConfig","setExistingAccount","existingAccount","PUBLIC","FEE_BASED","HCS10Client","operatorPrivateKey","operatorAccountId","guardedRegistryBaseUrl","createAccount","newKey","generateED25519","accountTransaction","AccountCreateTransaction","setKeyWithoutAlias","setInitialBalance","newAccountId","createInboundTopic","topicType","INBOUND","finalFeeConfig","CONTROLLED","feeTokenId","createTopic","createAgent","builder","existingState","outboundMemo","OUTBOUND","inscribePfp","storeHCS11Profile","imageResult","agentName","agentBio","pfpResult","formattedSocials","setupFees","additionalExemptAccounts","modifiedTransaction","operatorPublicKey","customFee","CustomFixedFee","setAmount","setFeeCollectorAccountId","setDenominatingTokenId","exemptAccountIds","exemptAccounts","setupExemptKeys","setFeeScheduleKey","setCustomFees","filteredExemptAccounts","setFeeExemptKeys","handleConnectionRequest","requestingAccountId","CONNECTION","requesterKey","accountKey","KeyList","modifiedFeeConfig","confirmedConnectionSequenceNumber","confirmConnection","accountTopics","requestingAccountTopics","requestingAccountOperatorId","connectedAccountId","connected_account_id","sendMessage","payloadString","inscribeFile","TopicCreateTransaction","setTopicMemo","setAdminKey","setAutoRenewAccountId","setSubmitKey","txResponse","payloadSizeInBytes","TopicMessageSubmitTransaction","setTopicId","TopicId","setMessage","transactionResponse","setMaxTransactionFee","freezeWith","createAndRegisterAgent","currentStage","completedPercentage","createdResources","agentMetadata","agentClient","r","accountResource","existingAccountId","createResult","registrationResult","registerAgentWithGuardedRegistry","Transaction","registerAgent","account_id","inbound_topic_id","getInboundTopicType","getNetwork","getLogger","getOperatorAccountId","createScheduledTransaction","schedulePayerAccountId","scheduleTransaction","ScheduleCreateTransaction","setScheduledTransaction","setPayerAccountId","setScheduleMemo","expirationDate","addSeconds","setExpirationTime","scheduleResponse","scheduleReceipt","sendTransactionOperation","sendTransaction","scheduleMemo","operationMemo","CustomFeeType","FeeConfigBuilder","defaultCollectorAccountId","forHbar","collectorAccountId","addHbarFee","forToken","addTokenFee","FIXED_FEE","finalDecimals","tokenInfo","allExemptAccounts","add","hwc","getAccountInfo","connectionMemo","executeTransactionWithErrorHandling","resultReceipt","isAgentBuilder","agentConfig","updatedState","createCommunicationTopics","hasPfpBuffer","setInboundTopicId","setOutboundTopicId","agentProfile","personProfile","handleProfilePictureCreation","outTopicId","inTopicId","profilePicTopicId","profTopicId","pfpProgress","profileProgress","hcs11Profile","socialLinks","cleanProfile","initializeRegistrationState","updateStateForCompletedRegistration","txResult","supported_languages","permissions","model_details","training","capabilities_description","dAppConnector","signers","wrappedProgressCallback","outboundResult","inboundMemo","inboundResult","connections","pendingRequests","profileCache","filterPendingAccountIds","loggerOptions","baseClient","fetchConnectionData","isValidTopicId","getAllConnections","outboundMessagesResult","inboundMessagesResult","processOutboundMessages","processInboundMessages","pendingCount","conn","isPending","checkTargetInboundTopicsForConfirmations","checkOutboundRequestsForConfirmations","fetchProfilesForConnections","fetchConnectionActivity","pendingConnections","targetInboundTopicId","pendingRequestsByTarget","requests","targetMessages","confirmedAny","requestId","confirmationMsg","uniqueRequestKey","keyParts","operatorIdPart","targetAccountId","pendingKey","newConnection","targetAgentName","needsConfirmation","profileInfo","originTopicId","processed","allConnections","pendingByStatus","inboundRequestId","targetMessagesResult","lastActivity","targetAccountIds","connection","accountIdPromises","targetId","addProfileInfo","updatePendingConnectionsWithProfileInfo","allSettled","updatedConn","activityPromises","getActiveConnections","messagesResult","processConnectionMessages","shouldFilterAccount","hasEstablishedConnectionWithAccount","requestMessages","isAlreadyConfirmed","pendingRequest","requesterId","requesterTopicId","targetTopicId","pendingConnection","confirmationMessages","requesterOutboundTopicId","closedMessages","uniqueKey","closedReason","closeMethod","close_method","requestorAccountId","requestorTopicId","needsConfirmKey","latestMessage","dateA","getTime","closeMessage","matchingConnections","targetOutboundTopicId","getPendingRequests","getConnectionsNeedingConfirmation","getConnectionByTopicId","getConnectionByAccountId","getConnectionsByAccountId","updateOrAddConnection","clearAll","isConnectionRequestProcessed","markConnectionRequestProcessed","getPendingTransactions","transactMessages","pendingTransactions","getLastOperatorActivity","operatorMessages","mirrorNodeUrl","executeCommands","evmConfigs","initialState","stateData","contractAddress","abi","cachedResult","iface","ethers","Interface","command","encodeFunctionData","fromSolidityAddress","readFromMirrorNode","decodedResult","decodeFunctionResult","processedResult","outputs","idx","formattedValue","executeCommand","evmConfig","newStateData","clearCacheForContract","modelViewerLoaded","modelViewerLoading","retryAttempts","retryBackoff","showLoadingIndicator","loadingCallbackName","configMapping","hcsCdnUrl","hcsNetwork","hcsRetryAttempts","hcsRetryBackoff","hcsDebug","hcsShowLoadingIndicator","hcsLoadingCallbackName","LoadedScripts","LoadedWasm","LoadedImages","LoadedVideos","LoadedAudios","LoadedAudioUrls","LoadedGLBs","scriptLoadedEvent","Event","loadQueue","isProcessingQueue","createFallbackLogger","loadConfigFromHTML","configScript","querySelector","dataAttr","dataset","configKey","updateLoadingStatus","fetchWithRetry","retries","backoff","sleep","isDuplicate","retrieveHCS1Data","cleanNetwork","loadScript","scriptElement","getAttribute","scriptId","isRequired","hasAttribute","isModule","wasmModule","WebAssembly","compile","instantiate","dispatchEvent","script","createElement","textContent","className","setAttribute","moduleBlob","createObjectURL","appendChild","loadModuleExports","scriptSrc","import","loadStylesheet","linkElement","stylesheetId","cssContent","style","loadImage","imageElement","objectURL","loadMedia","mediaElement","mediaType","loadModelViewer","modelViewerScript","loadGLB","glbElement","modelViewer","tagName","attr","parentNode","replaceChild","loadResource","processQueue","item","replaceHCSInStyle","styleContent","newContent","startIndex","endIndex","hcsUrl","processInlineStyles","elementsWithStyle","querySelectorAll","newStyle","styleTags","styleTag","init","initializeObserver","scriptElements","imageElements","videoElements","audioElements","glbElements","cssElements","removeAttribute","loadPromises","elements","observer","MutationObserver","mutations","mutation","addedNodes","node","nodeType","Node","ELEMENT_NODE","child","childElement","attributeName","observe","childList","subtree","attributeFilter","preloadImage","preloadAudio","audioElement","cachedAudio","playAudio","volume","audioUrl","audio","Audio","play","pauseAudio","pause","loadAndPlayAudio","autoplay","existingAudioElement","existingSocial","setProfileImage","getProfilePicture","parseTransactionBody","transactionBodyBase64","decodeBase64","txBody","SchedulableTransactionBody","transactionType","getTransactionType","humanReadableType","getHumanReadableType","raw","transactionFee","cryptoDelete","cryptoCreateAccount","cryptoUpdateAccount","cryptoApproveAllowance","cryptoDeleteAllowance","contractCall","contractCreateInstance","contractCreate","contractUpdateInstance","contractUpdate","contractDeleteInstance","contractDelete","tokenCreation","tokenMint","tokenBurn","tokenUpdate","tokenFeeScheduleUpdate","tokenFreeze","tokenUnfreeze","tokenGrantKyc","tokenRevokeKyc","tokenPause","tokenUnpause","tokenWipe","tokenWipeAccount","tokenDeletion","tokenDelete","tokenAssociate","tokenDissociate","consensusCreateTopic","consensusSubmitMessage","consensusUpdateTopic","consensusDeleteTopic","fileCreate","fileAppend","fileUpdate","fileDelete","utilPrng","parseScheduleResponse","transaction_body","typeMap","cryptoDeleteAccount","ethereumTransaction","tokenCreate","scheduleCreate","scheduleSign","unknown","getTransactionSummary","parsedTx","senders","receivers","originalAmountFloat","displayStr","contractCallSummary","summary","tokenGroups","tokenSummaries","tokenSenders","tokenReceivers","transferAmountValue","wasm","WASM_VECTOR_LEN","cachedUint8Memory","cachedDataViewMemory","textEncoder","textDecoder","ignoreBOM","fatal","wasmInstance","getUint8Memory","getDataViewMemory","encodeString","view","written","passStringToWasm","malloc","realloc","ptr","mem","getStringFromWasm","createWasmFunction","wasmFn","retptr","__wbindgen_add_to_stack_pointer","wasmArgs","__wbindgen_malloc","__wbindgen_realloc","flat","r0","r1","__wbindgen_free","initWasm","wasmBytes","bridge","imports","__wbindgen_placeholder__","__wbindgen_throw","createStateData","wasmConfig","dynamicStateData","inputType","latestRoundData","every","getDefaultValueForType","executeWasm","process_state","getParams","get_params","formattedTransactionId","originalTransactionId","hasApiKey","hasAccountId","hasPrivateKey"],"mappings":"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AAA,CACT,CACF,CAEF,oBAAM4B,CAAeqB,GACnB,MAAMvzB,GAAWuzB,EAAYnH,GAAYH,IAAWllC,IAAIjB,KAAKyD,OAAQ,GAC/DoqC,GAAaJ,EAAY/G,GAAYH,IAAWtlC,IAAIjB,KAAKyD,OAAQ,GACvE,GAAgB,KAAZyW,EAAgB,CAClB,GAAI2zB,GAAa,EAAG,CAClB,GAAI7tC,KAAKqrC,YAAY,KAAM,CAAExlC,OAAQ,IAC5B,MAAA,CACLoL,IAAK,MACLu6B,KAAM,qBAGN,GAAAqC,GAAa,IAAM7tC,KAAKorC,MAAM,CAAC,GAAI,EAAG,IAAK,GAAI,CAAEvlC,OAAQ,KAAQ7F,KAAKorC,MAAM,CAAC,GAAI,EAAG,GAAI,GAAI,CAAEvlC,OAAQ,KACjG,MAAA,CACLoL,IAAK,MACLu6B,KAAM,oBAEV,OAEIxrC,KAAKqqC,UAAU3pC,OAAOmtC,GAE5B,aADuB7tC,KAAK2tC,YAAYF,IACrB,CACjBx8B,IAAK,MACLu6B,KAAM,aACR,CAEF,GAAgB,KAAZtxB,EACK,MAAA,CACLjJ,IAAK,MACLu6B,KAAM,aAEV,EAGJ,IAAIsC,IA5jDe,CACjB,MACA,MACA,OACA,MACA,OACA,OACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,OACA,MACA,MACA,OACA,MACA,MACA,MACA,KACA,MACA,KACA,MACA,MACA,MACA,MACA,OACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,OACA,OACA,MACA,MACA,MACA,MACA,OACA,MACA,QACA,MACA,MACA,MACA,OACA,OACA,QACA,MACA,MACA,MACA,MACA,MACA,KACA,KACA,SACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,IACA,KACA,MACA,MACA,MACA,QACA,MACA,OACA,OACA,OACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,OACA,OACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,OACA,MACA,MACA,QACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,QACA,MACA,MACA,MACA,KACA,MACA,KACA,KACA,MACA,OACA,MACA,MACA,MACA,OACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,UACA,QACA,MACA,OACA,MACA,OACA,MACA,QAq6CF,IAAIA,IAn6Cc,CAChB,aACA,YACA,YACA,aACA,aACA,cACA,oBACA,oBACA,aACA,YACA,qBACA,4BACA,yBACA,uBACA,0BACA,0CACA,iDACA,kDACA,0EACA,4EACA,oEACA,kBACA,oBACA,+BACA,mBACA,sBACA,8BACA,gCACA,6BACA,YACA,aACA,mBACA,aACA,kBACA,gBACA,iBACA,cACA,iBACA,iBACA,yBACA,aACA,aACA,aACA,YAEA,aACA,YACA,YACA,kBACA,eACA,YACA,gBACA,YACA,kBACA,oBACA,4BACA,2BACA,gCACA,kBACA,mBACA,YACA,aACA,gCACA,WACA,WACA,eACA,cACA,yBACA,kBACA,mBACA,wBACA,iCACA,wCACA,oCACA,oBACA,6BACA,oBACA,yBACA,qBACA,oBACA,oBACA,kBACA,aACA,wBACA,YACA,YACA,YACA,YACA,YACA,YACA,aACA,kBACA,iCACA,aACA,sBACA,aACA,sBACA,aACA,YACA,oBACA,mBACA,gBACA,aACA,oBACA,+BACA,cAEA,4BAEA,4BAEA,cACA,yBACA,cACA,aACA,sBACA,mBACA,oBACA,oBACA,wBACA,uBACA,cACA,cACA,2BACA,YACA,aACA,cACA,aACA,aACA,aACA,+BACA,aACA,+BACA,4BACA,qBACA,YACA,8BACA,YACA,YACA,mBACA,YACA,6BACA,gBACA,wBACA,sBACA,oBACA,qBACA,+BACA,mBACA,6BACA,+BA6wCF,MAAMC,GAAkB,MAAMA,EAC5B,WAAAxuC,CAAY0jB,GAKN,GAJJ9f,EAAcnD,KAAM,UACpBmD,EAAcnD,KAAM,UACpBmD,EAAcnD,KAAM,SAAUmkC,GAAOtjC,eACrCb,KAAKijB,OAASA,GACTA,EAAOs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","x_google_ignoreList":[2]}
|