@hashgraphonline/standards-sdk 0.1.166 → 0.1.168
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/README.md +20 -7
- package/dist/browser/hcs-10/sdk.d.ts.map +1 -1
- package/dist/browser/hcs-10/types.d.ts +3 -1
- package/dist/browser/hcs-10/types.d.ts.map +1 -1
- package/dist/browser/hcs-11/client.d.ts.map +1 -1
- package/dist/browser/hcs-11/types.d.ts +2 -1
- package/dist/browser/hcs-11/types.d.ts.map +1 -1
- package/dist/browser/hcs-12/sdk.d.ts +2 -0
- package/dist/browser/hcs-12/sdk.d.ts.map +1 -1
- package/dist/browser/hcs-15/sdk.d.ts.map +1 -1
- package/dist/browser/hcs-15/types.d.ts +2 -1
- package/dist/browser/hcs-15/types.d.ts.map +1 -1
- package/dist/browser/hcs-16/sdk.d.ts +2 -1
- package/dist/browser/hcs-16/sdk.d.ts.map +1 -1
- package/dist/browser/hcs-17/sdk.d.ts.map +1 -1
- package/dist/browser/hcs-17/types.d.ts +2 -1
- package/dist/browser/hcs-17/types.d.ts.map +1 -1
- package/dist/browser/hcs-18/sdk.d.ts +2 -1
- package/dist/browser/hcs-18/sdk.d.ts.map +1 -1
- package/dist/browser/hcs-2/client.d.ts +2 -1
- package/dist/browser/hcs-2/client.d.ts.map +1 -1
- package/dist/browser/hcs-20/sdk.d.ts.map +1 -1
- package/dist/browser/hcs-20/types.d.ts +2 -1
- package/dist/browser/hcs-20/types.d.ts.map +1 -1
- package/dist/browser/hcs-21/sdk.d.ts +2 -1
- package/dist/browser/hcs-21/sdk.d.ts.map +1 -1
- package/dist/browser/hcs-5/sdk.d.ts.map +1 -1
- package/dist/browser/hcs-5/types.d.ts +2 -1
- package/dist/browser/hcs-5/types.d.ts.map +1 -1
- package/dist/browser/hcs-6/sdk.d.ts +2 -1
- package/dist/browser/hcs-6/sdk.d.ts.map +1 -1
- package/dist/browser/hcs-7/sdk.d.ts.map +1 -1
- package/dist/browser/hcs-7/types.d.ts +2 -1
- package/dist/browser/hcs-7/types.d.ts.map +1 -1
- package/dist/browser/standards-sdk.browser.js +4 -3
- package/dist/browser/standards-sdk.browser.js.map +1 -1
- package/dist/cjs/hcs-10/sdk.d.ts.map +1 -1
- package/dist/cjs/hcs-10/types.d.ts +3 -1
- package/dist/cjs/hcs-10/types.d.ts.map +1 -1
- package/dist/cjs/hcs-11/client.d.ts.map +1 -1
- package/dist/cjs/hcs-11/types.d.ts +2 -1
- package/dist/cjs/hcs-11/types.d.ts.map +1 -1
- package/dist/cjs/hcs-12/sdk.d.ts +2 -0
- package/dist/cjs/hcs-12/sdk.d.ts.map +1 -1
- package/dist/cjs/hcs-15/sdk.d.ts.map +1 -1
- package/dist/cjs/hcs-15/types.d.ts +2 -1
- package/dist/cjs/hcs-15/types.d.ts.map +1 -1
- package/dist/cjs/hcs-16/sdk.d.ts +2 -1
- package/dist/cjs/hcs-16/sdk.d.ts.map +1 -1
- package/dist/cjs/hcs-17/sdk.d.ts.map +1 -1
- package/dist/cjs/hcs-17/types.d.ts +2 -1
- package/dist/cjs/hcs-17/types.d.ts.map +1 -1
- package/dist/cjs/hcs-18/sdk.d.ts +2 -1
- package/dist/cjs/hcs-18/sdk.d.ts.map +1 -1
- package/dist/cjs/hcs-2/client.d.ts +2 -1
- package/dist/cjs/hcs-2/client.d.ts.map +1 -1
- package/dist/cjs/hcs-20/sdk.d.ts.map +1 -1
- package/dist/cjs/hcs-20/types.d.ts +2 -1
- package/dist/cjs/hcs-20/types.d.ts.map +1 -1
- package/dist/cjs/hcs-21/sdk.d.ts +2 -1
- package/dist/cjs/hcs-21/sdk.d.ts.map +1 -1
- package/dist/cjs/hcs-5/sdk.d.ts.map +1 -1
- package/dist/cjs/hcs-5/types.d.ts +2 -1
- package/dist/cjs/hcs-5/types.d.ts.map +1 -1
- package/dist/cjs/hcs-6/sdk.d.ts +2 -1
- package/dist/cjs/hcs-6/sdk.d.ts.map +1 -1
- package/dist/cjs/hcs-7/sdk.d.ts.map +1 -1
- package/dist/cjs/hcs-7/types.d.ts +2 -1
- package/dist/cjs/hcs-7/types.d.ts.map +1 -1
- package/dist/cjs/standards-sdk.cjs +1 -1
- package/dist/cjs/standards-sdk.cjs.map +1 -1
- package/dist/es/hcs-10/sdk.d.ts.map +1 -1
- package/dist/es/hcs-10/types.d.ts +3 -1
- package/dist/es/hcs-10/types.d.ts.map +1 -1
- package/dist/es/hcs-11/client.d.ts.map +1 -1
- package/dist/es/hcs-11/types.d.ts +2 -1
- package/dist/es/hcs-11/types.d.ts.map +1 -1
- package/dist/es/hcs-12/sdk.d.ts +2 -0
- package/dist/es/hcs-12/sdk.d.ts.map +1 -1
- package/dist/es/hcs-15/sdk.d.ts.map +1 -1
- package/dist/es/hcs-15/types.d.ts +2 -1
- package/dist/es/hcs-15/types.d.ts.map +1 -1
- package/dist/es/hcs-16/sdk.d.ts +2 -1
- package/dist/es/hcs-16/sdk.d.ts.map +1 -1
- package/dist/es/hcs-17/sdk.d.ts.map +1 -1
- package/dist/es/hcs-17/types.d.ts +2 -1
- package/dist/es/hcs-17/types.d.ts.map +1 -1
- package/dist/es/hcs-18/sdk.d.ts +2 -1
- package/dist/es/hcs-18/sdk.d.ts.map +1 -1
- package/dist/es/hcs-2/client.d.ts +2 -1
- package/dist/es/hcs-2/client.d.ts.map +1 -1
- package/dist/es/hcs-20/sdk.d.ts.map +1 -1
- package/dist/es/hcs-20/types.d.ts +2 -1
- package/dist/es/hcs-20/types.d.ts.map +1 -1
- package/dist/es/hcs-21/sdk.d.ts +2 -1
- package/dist/es/hcs-21/sdk.d.ts.map +1 -1
- package/dist/es/hcs-5/sdk.d.ts.map +1 -1
- package/dist/es/hcs-5/types.d.ts +2 -1
- package/dist/es/hcs-5/types.d.ts.map +1 -1
- package/dist/es/hcs-6/sdk.d.ts +2 -1
- package/dist/es/hcs-6/sdk.d.ts.map +1 -1
- package/dist/es/hcs-7/sdk.d.ts.map +1 -1
- package/dist/es/hcs-7/types.d.ts +2 -1
- package/dist/es/hcs-7/types.d.ts.map +1 -1
- package/dist/es/standards-sdk.es102.js.map +1 -1
- package/dist/es/standards-sdk.es104.js +1 -1
- package/dist/es/standards-sdk.es104.js.map +1 -1
- package/dist/es/standards-sdk.es108.js +1 -1
- package/dist/es/standards-sdk.es108.js.map +1 -1
- package/dist/es/standards-sdk.es11.js +2 -1
- package/dist/es/standards-sdk.es11.js.map +1 -1
- package/dist/es/standards-sdk.es137.js +1 -1
- package/dist/es/standards-sdk.es138.js +1 -1
- package/dist/es/standards-sdk.es143.js +1 -1
- package/dist/es/standards-sdk.es155.js +54 -12480
- package/dist/es/standards-sdk.es155.js.map +1 -1
- package/dist/es/standards-sdk.es156.js +76 -48
- package/dist/es/standards-sdk.es156.js.map +1 -1
- package/dist/es/standards-sdk.es157.js +66 -69
- package/dist/es/standards-sdk.es157.js.map +1 -1
- package/dist/es/standards-sdk.es158.js +180 -61
- package/dist/es/standards-sdk.es158.js.map +1 -1
- package/dist/es/standards-sdk.es159.js +12438 -156
- package/dist/es/standards-sdk.es159.js.map +1 -1
- package/dist/es/standards-sdk.es169.js +1 -1
- package/dist/es/standards-sdk.es173.js +1 -1
- package/dist/es/standards-sdk.es18.js +4 -3
- package/dist/es/standards-sdk.es18.js.map +1 -1
- package/dist/es/standards-sdk.es19.js +1 -1
- package/dist/es/standards-sdk.es27.js +2 -2
- package/dist/es/standards-sdk.es27.js.map +1 -1
- package/dist/es/standards-sdk.es28.js.map +1 -1
- package/dist/es/standards-sdk.es30.js +1 -1
- package/dist/es/standards-sdk.es31.js +1 -1
- package/dist/es/standards-sdk.es35.js +1 -1
- package/dist/es/standards-sdk.es36.js +2 -2
- package/dist/es/standards-sdk.es36.js.map +1 -1
- package/dist/es/standards-sdk.es37.js +1 -1
- package/dist/es/standards-sdk.es4.js +1 -1
- package/dist/es/standards-sdk.es4.js.map +1 -1
- package/dist/es/standards-sdk.es56.js +1 -1
- package/dist/es/standards-sdk.es59.js +1 -1
- package/dist/es/standards-sdk.es60.js +1 -1
- package/dist/es/standards-sdk.es62.js +1 -1
- package/dist/es/standards-sdk.es63.js +2 -2
- package/dist/es/standards-sdk.es64.js +1 -1
- package/dist/es/standards-sdk.es65.js +1 -1
- package/dist/es/standards-sdk.es66.js +1 -1
- package/dist/es/standards-sdk.es69.js +1 -1
- package/dist/es/standards-sdk.es70.js.map +1 -1
- package/dist/es/standards-sdk.es72.js +2 -1
- package/dist/es/standards-sdk.es72.js.map +1 -1
- package/dist/es/standards-sdk.es75.js +2 -2
- package/dist/es/standards-sdk.es75.js.map +1 -1
- package/dist/es/standards-sdk.es79.js.map +1 -1
- package/dist/es/standards-sdk.es8.js.map +1 -1
- package/dist/es/standards-sdk.es83.js +5 -3
- package/dist/es/standards-sdk.es83.js.map +1 -1
- package/dist/es/standards-sdk.es90.js +1 -1
- package/dist/es/standards-sdk.es90.js.map +1 -1
- package/dist/es/standards-sdk.es94.js +1 -1
- package/dist/es/standards-sdk.es94.js.map +1 -1
- package/dist/es/standards-sdk.es99.js +1 -1
- package/dist/es/standards-sdk.es99.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standards-sdk.es4.js","sources":["../../src/hcs-6/sdk.ts"],"sourcesContent":["import { HCS6BaseClient } from './base-client';\nimport {\n HCS6ClientConfig,\n HCS6CreateHashinalOptions,\n HCS6CreateHashinalResponse,\n HCS6RegisterOptions,\n HCS6RegisterEntryOptions,\n HCS6TopicRegistrationResponse,\n HCS6RegistryOperationResponse,\n HCS6QueryRegistryOptions,\n HCS6TopicRegistry,\n HCS6Message,\n HCS6RegistryType,\n HCS6MintOptions,\n HCS6InscribeAndMintOptions,\n HCS6MintResponse,\n buildHcs6Hrl,\n} from './types';\nimport {\n Client,\n TopicCreateTransaction,\n TopicMessageSubmitTransaction,\n PrivateKey,\n TopicId,\n TransactionReceipt,\n AccountId,\n PublicKey,\n TokenMintTransaction,\n TokenId,\n} from '@hashgraph/sdk';\nimport { NetworkType } from '../utils/types';\nimport { buildHcs6CreateRegistryTx } from './tx';\nimport {\n NodeOperatorResolver,\n createNodeOperatorContext,\n type NodeOperatorContext,\n} from '../common/node-operator-resolver';\nimport {\n inscribe,\n type InscriptionInput,\n type InscriptionOptions,\n} from '../inscribe/inscriber';\n\nexport interface SDKHCS6ClientConfig extends HCS6ClientConfig {\n operatorId: string | AccountId;\n operatorKey: string | PrivateKey;\n keyType?: 'ed25519' | 'ecdsa';\n}\n\nexport class HCS6Client extends HCS6BaseClient {\n private client: Client;\n private operatorId: AccountId;\n private operatorCtx: NodeOperatorContext;\n\n constructor(config: SDKHCS6ClientConfig) {\n super({\n network: config.network,\n logLevel: config.logLevel,\n silent: config.silent,\n mirrorNodeUrl: config.mirrorNodeUrl,\n logger: config.logger,\n });\n\n this.operatorId =\n typeof config.operatorId === 'string'\n ? AccountId.fromString(config.operatorId)\n : config.operatorId;\n\n this.operatorCtx = createNodeOperatorContext({\n network: this.network,\n operatorId: this.operatorId,\n operatorKey: config.operatorKey,\n keyType: config.keyType,\n mirrorNode: this.mirrorNode,\n logger: this.logger,\n client: this.createClient(config.network),\n });\n this.client = this.operatorCtx.client;\n }\n\n private async ensureInitialized(): Promise<void> {\n await this.operatorCtx.ensureInitialized();\n }\n\n private createClient(network: NetworkType): Client {\n if (network === 'mainnet') {\n return Client.forMainnet();\n } else {\n return Client.forTestnet();\n }\n }\n\n public close(): void {\n this.logger.info('HCS-6 client closed.');\n }\n\n public getKeyType(): 'ed25519' | 'ecdsa' {\n return this.operatorCtx.keyType;\n }\n\n public getOperatorKey(): PrivateKey {\n return this.operatorCtx.operatorKey;\n }\n\n public async submitMessage(\n topicId: string,\n payload: HCS6Message,\n ): Promise<TransactionReceipt> {\n return this.submitMessageWithKey(topicId, payload, undefined);\n }\n\n public async submitMessageWithKey(\n topicId: string,\n payload: HCS6Message,\n submitKey?: string | PrivateKey,\n ): Promise<TransactionReceipt> {\n const { valid, errors } = this.validateMessage(payload);\n if (!valid) {\n throw new Error(`Invalid HCS-6 message: ${errors.join(', ')}`);\n }\n\n let tx = new TopicMessageSubmitTransaction()\n .setTopicId(TopicId.fromString(topicId))\n .setMessage(JSON.stringify(payload));\n\n if (!submitKey) {\n const txResponse = await tx.execute(this.client);\n return await txResponse.getReceipt(this.client);\n }\n const privateKey =\n typeof submitKey === 'string'\n ? PrivateKey.fromString(submitKey)\n : submitKey;\n const frozen = await tx.freezeWith(this.client);\n await frozen.sign(privateKey);\n const resp = await frozen.execute(this.client);\n return await resp.getReceipt(this.client);\n }\n\n public async registerEntryWithKey(\n registryTopicId: string,\n options: HCS6RegisterEntryOptions,\n submitKey?: string | PrivateKey,\n ): Promise<HCS6RegistryOperationResponse> {\n try {\n const payload: HCS6Message = this.createRegisterMessage(\n options.targetTopicId,\n options.memo,\n );\n const receipt = await this.submitMessageWithKey(\n registryTopicId,\n payload,\n submitKey,\n );\n const sequenceNumber = (\n receipt as TransactionReceipt\n ).topicSequenceNumber?.toNumber();\n return { success: true, receipt, sequenceNumber };\n } catch (error) {\n this.logger.error(`Failed to register HCS-6 entry: ${error}`);\n return { success: false, error: String(error) };\n }\n }\n\n public async createRegistry(\n options: { ttl?: number; submitKey?: string | boolean | PrivateKey } = {},\n ): Promise<HCS6TopicRegistrationResponse> {\n try {\n await this.ensureInitialized();\n const ttl = options.ttl ?? 86400;\n if (!(ttl >= 3600)) {\n throw new Error('TTL must be at least 3600 seconds (1 hour)');\n }\n let submitKeyPublic: PublicKey | undefined;\n let submitKeyPrivate: PrivateKey | undefined;\n if (options.submitKey) {\n if (typeof options.submitKey === 'string') {\n try {\n submitKeyPublic = PublicKey.fromString(options.submitKey);\n } catch {\n const keyBytes = Buffer.from(\n options.submitKey.replace(/^0x/i, ''),\n 'hex',\n );\n submitKeyPublic =\n this.operatorCtx.keyType === 'ed25519'\n ? PublicKey.fromBytesED25519(keyBytes)\n : PublicKey.fromBytesECDSA(keyBytes);\n }\n } else if (typeof options.submitKey === 'boolean') {\n submitKeyPublic = this.operatorCtx.operatorKey.publicKey;\n } else {\n submitKeyPublic = options.submitKey.publicKey;\n submitKeyPrivate = options.submitKey;\n }\n }\n\n let transaction = buildHcs6CreateRegistryTx({\n ttl,\n submitKey: submitKeyPublic,\n adminKey: this.operatorCtx.operatorKey.publicKey,\n operatorPublicKey: this.operatorCtx.operatorKey.publicKey,\n });\n\n const frozenTx = await transaction.freezeWith(this.client);\n if (submitKeyPrivate) {\n await frozenTx.sign(submitKeyPrivate);\n }\n const txResponse = await frozenTx.execute(this.client);\n const receipt = await txResponse.getReceipt(this.client);\n const topicId = receipt.topicId;\n if (!topicId) {\n throw new Error(\n 'Failed to create HCS-6 registry: No topic ID in receipt',\n );\n }\n return {\n success: true,\n topicId: topicId.toString(),\n transactionId: txResponse.transactionId.toString(),\n };\n } catch (error) {\n this.logger.error(`Failed to create HCS-6 registry: ${error}`);\n return {\n success: false,\n error: `Failed to create HCS-6 registry: ${error}`,\n };\n }\n }\n\n public async registerEntry(\n registryTopicId: string,\n options: HCS6RegisterEntryOptions,\n ): Promise<HCS6RegistryOperationResponse> {\n await this.ensureInitialized();\n return this.registerEntryWithKey(registryTopicId, options, undefined);\n }\n\n public async getRegistry(\n topicId: string,\n options: HCS6QueryRegistryOptions = {},\n ): Promise<HCS6TopicRegistry> {\n await this.ensureInitialized();\n const topicInfo = await this.mirrorNode.getTopicInfo(topicId);\n const memo = topicInfo.memo || '';\n const match = memo.match(/^hcs-6:(\\d):(\\d+)$/);\n if (!match) {\n throw new Error(\n `Topic ${topicId} is not an HCS-6 registry (invalid memo format)`,\n );\n }\n const ttl = parseInt(match[2]);\n const regType = parseInt(match[1]) as HCS6RegistryType;\n const messages = await this.mirrorNode.getTopicMessages(topicId, {\n sequenceNumber:\n options.skip && options.skip > 0 ? `gt:${options.skip}` : undefined,\n limit: options.limit ?? 100,\n order: options.order ?? 'asc',\n });\n const entries = messages\n .map(m => {\n try {\n const decoded = m as unknown as HCS6Message & {\n consensus_timestamp?: string;\n sequence_number: number;\n payer?: string;\n };\n const { valid } = this.validateMessage(\n decoded as unknown as HCS6Message,\n );\n if (!valid) return null;\n return {\n topicId,\n sequence: decoded.sequence_number,\n timestamp: decoded.consensus_timestamp || '',\n payer: decoded.payer || '',\n message: decoded as unknown as HCS6Message,\n consensus_timestamp: decoded.consensus_timestamp || '',\n registry_type: regType,\n };\n } catch {\n return null;\n }\n })\n .filter(\n (\n v,\n ): v is {\n topicId: string;\n sequence: number;\n timestamp: string;\n payer: string;\n message: HCS6Message;\n consensus_timestamp: string;\n registry_type: HCS6RegistryType;\n } => Boolean(v),\n );\n const latest = entries.length > 0 ? entries[entries.length - 1] : undefined;\n return {\n topicId,\n registryType: regType,\n ttl,\n entries,\n latestEntry: latest,\n };\n }\n\n public async mint(options: HCS6MintOptions): Promise<HCS6MintResponse> {\n try {\n await this.ensureInitialized();\n if (!options.metadataTopicId) {\n return {\n success: false,\n error: 'metadataTopicId is required for mint()',\n };\n }\n const metadata = buildHcs6Hrl(options.metadataTopicId);\n let tx = new TokenMintTransaction()\n .setTokenId(TokenId.fromString(options.tokenId))\n .setMetadata([Buffer.from(metadata)]);\n const frozen = await tx.freezeWith(this.client);\n\n if (options.supplyKey) {\n const resolver = new NodeOperatorResolver({\n mirrorNode: this.mirrorNode,\n logger: this.logger,\n });\n const privKey =\n typeof options.supplyKey === 'string'\n ? await resolver.resolveSupplyKey(\n options.tokenId,\n options.supplyKey,\n this.operatorCtx.keyType,\n )\n : options.supplyKey;\n await frozen.sign(privKey);\n }\n\n const resp = await frozen.execute(this.client);\n const receipt = await resp.getReceipt(this.client);\n const serial =\n receipt.serials && receipt.serials[0]\n ? Number(receipt.serials[0].toString())\n : undefined;\n return {\n success: true,\n serialNumber: serial,\n transactionId: resp.transactionId?.toString?.(),\n metadata,\n };\n } catch (e) {\n return { success: false, error: String(e) };\n }\n }\n\n public async inscribeAndMint(\n options: HCS6InscribeAndMintOptions,\n ): Promise<HCS6MintResponse> {\n try {\n await this.ensureInitialized();\n const inscribeOptions: InscriptionOptions = {\n ...(options.inscriptionOptions as InscriptionOptions | undefined),\n mode: 'hashinal',\n waitForConfirmation: true,\n };\n const result = await inscribe(\n options.inscriptionInput as InscriptionInput,\n {\n accountId: this.operatorId.toString(),\n privateKey: this.operatorCtx.operatorKey,\n network: this.network,\n },\n inscribeOptions,\n );\n if (!result.confirmed || !result.inscription) {\n return { success: false, error: 'Failed to inscribe content' };\n }\n const topicId =\n result.inscription.jsonTopicId || result.inscription.topic_id;\n if (!topicId) {\n return { success: false, error: 'No topic ID from inscription' };\n }\n return await this.mint({\n tokenId: options.tokenId,\n metadataTopicId: topicId,\n supplyKey: options.supplyKey,\n memo: options.memo,\n });\n } catch (e) {\n return { success: false, error: String(e) };\n }\n }\n\n public async createHashinal(\n options: HCS6CreateHashinalOptions,\n ): Promise<HCS6CreateHashinalResponse> {\n try {\n await this.ensureInitialized();\n\n let registryTopicId: string;\n let registryTransactionId: string | undefined;\n\n if (options.registryTopicId) {\n registryTopicId = options.registryTopicId;\n const topicInfo = await this.mirrorNode.getTopicInfo(registryTopicId);\n const memo = topicInfo.memo || '';\n if (!/^hcs-6:\\d:\\d+$/.test(memo)) {\n throw new Error(\n `Topic ${registryTopicId} is not a valid HCS-6 registry`,\n );\n }\n } else {\n const res = await this.createRegistry({\n ttl: options.ttl,\n submitKey: true,\n });\n if (!res.success || !res.topicId) {\n throw new Error(res.error || 'Failed to create HCS-6 registry');\n }\n registryTopicId = res.topicId;\n registryTransactionId = res.transactionId;\n }\n\n const inscriptionBuffer = Buffer.from(JSON.stringify(options.metadata));\n const inscribeOptions: InscriptionOptions = {\n ...(options.inscriptionOptions as InscriptionOptions | undefined),\n mode: 'hashinal',\n metadata: options.metadata,\n waitForConfirmation: true,\n };\n\n const result = await inscribe(\n {\n type: 'buffer',\n buffer: inscriptionBuffer,\n fileName: 'metadata.json',\n mimeType: 'application/json',\n },\n {\n accountId: this.operatorId.toString(),\n privateKey: this.operatorCtx.operatorKey,\n network: this.network,\n },\n inscribeOptions,\n );\n\n if (!result.confirmed || !result.inscription) {\n throw new Error('Failed to inscribe metadata');\n }\n const topicId =\n result.inscription.jsonTopicId || result.inscription.topic_id;\n if (!topicId) {\n throw new Error('No inscription topic ID available');\n }\n\n const reg = await this.registerEntryWithKey(\n registryTopicId,\n {\n targetTopicId: topicId,\n memo: options.memo || 'Dynamic hashinal registration',\n },\n options.submitKey,\n );\n if (!reg.success) {\n throw new Error(reg.error || 'Failed to register entry');\n }\n\n return {\n success: true,\n registryTopicId,\n inscriptionTopicId: topicId,\n transactionId: registryTransactionId,\n };\n } catch (e) {\n return { success: false, error: String(e) };\n }\n }\n\n public async register(\n options: HCS6RegisterOptions,\n ): Promise<HCS6CreateHashinalResponse> {\n try {\n await this.ensureInitialized();\n\n let registryTopicId: string;\n let registryTransactionId: string | undefined;\n\n if (options.registryTopicId) {\n registryTopicId = options.registryTopicId;\n const topicInfo = await this.mirrorNode.getTopicInfo(registryTopicId);\n const memo = topicInfo.memo || '';\n if (!/^hcs-6:\\d:\\d+$/.test(memo)) {\n throw new Error(\n `Topic ${registryTopicId} is not a valid HCS-6 registry`,\n );\n }\n } else {\n const res = await this.createRegistry({\n ttl: options.ttl,\n submitKey: true,\n });\n if (!res.success || !res.topicId) {\n throw new Error(res.error || 'Failed to create HCS-6 registry');\n }\n registryTopicId = res.topicId;\n registryTransactionId = res.transactionId;\n }\n\n let inscriptionInput: InscriptionInput;\n if (options.data?.base64) {\n const buffer = Buffer.from(options.data.base64, 'base64');\n inscriptionInput = {\n type: 'buffer',\n buffer,\n fileName: `data.${options.data.mimeType?.split('/')[1] || 'bin'}`,\n mimeType: options.data.mimeType || 'application/octet-stream',\n };\n } else if (options.data?.url) {\n inscriptionInput = { type: 'url', url: options.data.url };\n } else {\n inscriptionInput = {\n type: 'buffer',\n buffer: Buffer.from(JSON.stringify(options.metadata)),\n fileName: 'metadata.json',\n mimeType: 'application/json',\n };\n }\n\n const inscribeOptions: InscriptionOptions = {\n ...(options.inscriptionOptions as InscriptionOptions | undefined),\n mode: 'hashinal',\n metadata: options.metadata,\n waitForConfirmation: true,\n };\n\n const result = await inscribe(\n inscriptionInput,\n {\n accountId: this.operatorId.toString(),\n privateKey: this.operatorCtx.operatorKey,\n network: this.network,\n },\n inscribeOptions,\n );\n if (!result.confirmed || !result.inscription) {\n throw new Error('Failed to inscribe data');\n }\n const topicId =\n result.inscription.jsonTopicId || result.inscription.topic_id;\n if (!topicId) {\n throw new Error('No inscription topic ID available');\n }\n\n const reg = await this.registerEntryWithKey(\n registryTopicId,\n {\n targetTopicId: topicId,\n memo: options.memo || 'Dynamic hashinal registration',\n },\n options.submitKey,\n );\n if (!reg.success) {\n throw new Error(reg.error || 'Failed to register entry');\n }\n\n return {\n success: true,\n registryTopicId,\n inscriptionTopicId: topicId,\n transactionId: registryTransactionId,\n };\n } catch (e) {\n return { success: false, error: String(e) };\n }\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"standards-sdk.es4.js","sources":["../../src/hcs-6/sdk.ts"],"sourcesContent":["import { HCS6BaseClient } from './base-client';\nimport {\n HCS6ClientConfig,\n HCS6CreateHashinalOptions,\n HCS6CreateHashinalResponse,\n HCS6RegisterOptions,\n HCS6RegisterEntryOptions,\n HCS6TopicRegistrationResponse,\n HCS6RegistryOperationResponse,\n HCS6QueryRegistryOptions,\n HCS6TopicRegistry,\n HCS6Message,\n HCS6RegistryType,\n HCS6MintOptions,\n HCS6InscribeAndMintOptions,\n HCS6MintResponse,\n buildHcs6Hrl,\n} from './types';\nimport {\n Client,\n TopicCreateTransaction,\n TopicMessageSubmitTransaction,\n PrivateKey,\n TopicId,\n TransactionReceipt,\n AccountId,\n PublicKey,\n TokenMintTransaction,\n TokenId,\n} from '@hashgraph/sdk';\nimport { NetworkType } from '../utils/types';\nimport { buildHcs6CreateRegistryTx } from './tx';\nimport {\n NodeOperatorResolver,\n createNodeOperatorContext,\n type NodeOperatorContext,\n} from '../common/node-operator-resolver';\nimport {\n inscribe,\n type InscriptionInput,\n type InscriptionOptions,\n} from '../inscribe/inscriber';\n\nexport interface SDKHCS6ClientConfig extends HCS6ClientConfig {\n operatorId: string | AccountId;\n operatorKey: string | PrivateKey;\n keyType?: 'ed25519' | 'ecdsa';\n client?: Client;\n}\n\nexport class HCS6Client extends HCS6BaseClient {\n private client: Client;\n private operatorId: AccountId;\n private operatorCtx: NodeOperatorContext;\n\n constructor(config: SDKHCS6ClientConfig) {\n super({\n network: config.network,\n logLevel: config.logLevel,\n silent: config.silent,\n mirrorNodeUrl: config.mirrorNodeUrl,\n logger: config.logger,\n });\n\n this.operatorId =\n typeof config.operatorId === 'string'\n ? AccountId.fromString(config.operatorId)\n : config.operatorId;\n\n this.operatorCtx = createNodeOperatorContext({\n network: this.network,\n operatorId: this.operatorId,\n operatorKey: config.operatorKey,\n keyType: config.keyType,\n mirrorNode: this.mirrorNode,\n logger: this.logger,\n client: config.client ?? this.createClient(config.network),\n });\n this.client = this.operatorCtx.client;\n }\n\n private async ensureInitialized(): Promise<void> {\n await this.operatorCtx.ensureInitialized();\n }\n\n private createClient(network: NetworkType): Client {\n if (network === 'mainnet') {\n return Client.forMainnet();\n } else {\n return Client.forTestnet();\n }\n }\n\n public close(): void {\n this.logger.info('HCS-6 client closed.');\n }\n\n public getKeyType(): 'ed25519' | 'ecdsa' {\n return this.operatorCtx.keyType;\n }\n\n public getOperatorKey(): PrivateKey {\n return this.operatorCtx.operatorKey;\n }\n\n public async submitMessage(\n topicId: string,\n payload: HCS6Message,\n ): Promise<TransactionReceipt> {\n return this.submitMessageWithKey(topicId, payload, undefined);\n }\n\n public async submitMessageWithKey(\n topicId: string,\n payload: HCS6Message,\n submitKey?: string | PrivateKey,\n ): Promise<TransactionReceipt> {\n const { valid, errors } = this.validateMessage(payload);\n if (!valid) {\n throw new Error(`Invalid HCS-6 message: ${errors.join(', ')}`);\n }\n\n let tx = new TopicMessageSubmitTransaction()\n .setTopicId(TopicId.fromString(topicId))\n .setMessage(JSON.stringify(payload));\n\n if (!submitKey) {\n const txResponse = await tx.execute(this.client);\n return await txResponse.getReceipt(this.client);\n }\n const privateKey =\n typeof submitKey === 'string'\n ? PrivateKey.fromString(submitKey)\n : submitKey;\n const frozen = await tx.freezeWith(this.client);\n await frozen.sign(privateKey);\n const resp = await frozen.execute(this.client);\n return await resp.getReceipt(this.client);\n }\n\n public async registerEntryWithKey(\n registryTopicId: string,\n options: HCS6RegisterEntryOptions,\n submitKey?: string | PrivateKey,\n ): Promise<HCS6RegistryOperationResponse> {\n try {\n const payload: HCS6Message = this.createRegisterMessage(\n options.targetTopicId,\n options.memo,\n );\n const receipt = await this.submitMessageWithKey(\n registryTopicId,\n payload,\n submitKey,\n );\n const sequenceNumber = (\n receipt as TransactionReceipt\n ).topicSequenceNumber?.toNumber();\n return { success: true, receipt, sequenceNumber };\n } catch (error) {\n this.logger.error(`Failed to register HCS-6 entry: ${error}`);\n return { success: false, error: String(error) };\n }\n }\n\n public async createRegistry(\n options: { ttl?: number; submitKey?: string | boolean | PrivateKey } = {},\n ): Promise<HCS6TopicRegistrationResponse> {\n try {\n await this.ensureInitialized();\n const ttl = options.ttl ?? 86400;\n if (!(ttl >= 3600)) {\n throw new Error('TTL must be at least 3600 seconds (1 hour)');\n }\n let submitKeyPublic: PublicKey | undefined;\n let submitKeyPrivate: PrivateKey | undefined;\n if (options.submitKey) {\n if (typeof options.submitKey === 'string') {\n try {\n submitKeyPublic = PublicKey.fromString(options.submitKey);\n } catch {\n const keyBytes = Buffer.from(\n options.submitKey.replace(/^0x/i, ''),\n 'hex',\n );\n submitKeyPublic =\n this.operatorCtx.keyType === 'ed25519'\n ? PublicKey.fromBytesED25519(keyBytes)\n : PublicKey.fromBytesECDSA(keyBytes);\n }\n } else if (typeof options.submitKey === 'boolean') {\n submitKeyPublic = this.operatorCtx.operatorKey.publicKey;\n } else {\n submitKeyPublic = options.submitKey.publicKey;\n submitKeyPrivate = options.submitKey;\n }\n }\n\n let transaction = buildHcs6CreateRegistryTx({\n ttl,\n submitKey: submitKeyPublic,\n adminKey: this.operatorCtx.operatorKey.publicKey,\n operatorPublicKey: this.operatorCtx.operatorKey.publicKey,\n });\n\n const frozenTx = await transaction.freezeWith(this.client);\n if (submitKeyPrivate) {\n await frozenTx.sign(submitKeyPrivate);\n }\n const txResponse = await frozenTx.execute(this.client);\n const receipt = await txResponse.getReceipt(this.client);\n const topicId = receipt.topicId;\n if (!topicId) {\n throw new Error(\n 'Failed to create HCS-6 registry: No topic ID in receipt',\n );\n }\n return {\n success: true,\n topicId: topicId.toString(),\n transactionId: txResponse.transactionId.toString(),\n };\n } catch (error) {\n this.logger.error(`Failed to create HCS-6 registry: ${error}`);\n return {\n success: false,\n error: `Failed to create HCS-6 registry: ${error}`,\n };\n }\n }\n\n public async registerEntry(\n registryTopicId: string,\n options: HCS6RegisterEntryOptions,\n ): Promise<HCS6RegistryOperationResponse> {\n await this.ensureInitialized();\n return this.registerEntryWithKey(registryTopicId, options, undefined);\n }\n\n public async getRegistry(\n topicId: string,\n options: HCS6QueryRegistryOptions = {},\n ): Promise<HCS6TopicRegistry> {\n await this.ensureInitialized();\n const topicInfo = await this.mirrorNode.getTopicInfo(topicId);\n const memo = topicInfo.memo || '';\n const match = memo.match(/^hcs-6:(\\d):(\\d+)$/);\n if (!match) {\n throw new Error(\n `Topic ${topicId} is not an HCS-6 registry (invalid memo format)`,\n );\n }\n const ttl = parseInt(match[2]);\n const regType = parseInt(match[1]) as HCS6RegistryType;\n const messages = await this.mirrorNode.getTopicMessages(topicId, {\n sequenceNumber:\n options.skip && options.skip > 0 ? `gt:${options.skip}` : undefined,\n limit: options.limit ?? 100,\n order: options.order ?? 'asc',\n });\n const entries = messages\n .map(m => {\n try {\n const decoded = m as unknown as HCS6Message & {\n consensus_timestamp?: string;\n sequence_number: number;\n payer?: string;\n };\n const { valid } = this.validateMessage(\n decoded as unknown as HCS6Message,\n );\n if (!valid) return null;\n return {\n topicId,\n sequence: decoded.sequence_number,\n timestamp: decoded.consensus_timestamp || '',\n payer: decoded.payer || '',\n message: decoded as unknown as HCS6Message,\n consensus_timestamp: decoded.consensus_timestamp || '',\n registry_type: regType,\n };\n } catch {\n return null;\n }\n })\n .filter(\n (\n v,\n ): v is {\n topicId: string;\n sequence: number;\n timestamp: string;\n payer: string;\n message: HCS6Message;\n consensus_timestamp: string;\n registry_type: HCS6RegistryType;\n } => Boolean(v),\n );\n const latest = entries.length > 0 ? entries[entries.length - 1] : undefined;\n return {\n topicId,\n registryType: regType,\n ttl,\n entries,\n latestEntry: latest,\n };\n }\n\n public async mint(options: HCS6MintOptions): Promise<HCS6MintResponse> {\n try {\n await this.ensureInitialized();\n if (!options.metadataTopicId) {\n return {\n success: false,\n error: 'metadataTopicId is required for mint()',\n };\n }\n const metadata = buildHcs6Hrl(options.metadataTopicId);\n let tx = new TokenMintTransaction()\n .setTokenId(TokenId.fromString(options.tokenId))\n .setMetadata([Buffer.from(metadata)]);\n const frozen = await tx.freezeWith(this.client);\n\n if (options.supplyKey) {\n const resolver = new NodeOperatorResolver({\n mirrorNode: this.mirrorNode,\n logger: this.logger,\n });\n const privKey =\n typeof options.supplyKey === 'string'\n ? await resolver.resolveSupplyKey(\n options.tokenId,\n options.supplyKey,\n this.operatorCtx.keyType,\n )\n : options.supplyKey;\n await frozen.sign(privKey);\n }\n\n const resp = await frozen.execute(this.client);\n const receipt = await resp.getReceipt(this.client);\n const serial =\n receipt.serials && receipt.serials[0]\n ? Number(receipt.serials[0].toString())\n : undefined;\n return {\n success: true,\n serialNumber: serial,\n transactionId: resp.transactionId?.toString?.(),\n metadata,\n };\n } catch (e) {\n return { success: false, error: String(e) };\n }\n }\n\n public async inscribeAndMint(\n options: HCS6InscribeAndMintOptions,\n ): Promise<HCS6MintResponse> {\n try {\n await this.ensureInitialized();\n const inscribeOptions: InscriptionOptions = {\n ...(options.inscriptionOptions as InscriptionOptions | undefined),\n mode: 'hashinal',\n waitForConfirmation: true,\n };\n const result = await inscribe(\n options.inscriptionInput as InscriptionInput,\n {\n accountId: this.operatorId.toString(),\n privateKey: this.operatorCtx.operatorKey,\n network: this.network,\n },\n inscribeOptions,\n );\n if (!result.confirmed || !result.inscription) {\n return { success: false, error: 'Failed to inscribe content' };\n }\n const topicId =\n result.inscription.jsonTopicId || result.inscription.topic_id;\n if (!topicId) {\n return { success: false, error: 'No topic ID from inscription' };\n }\n return await this.mint({\n tokenId: options.tokenId,\n metadataTopicId: topicId,\n supplyKey: options.supplyKey,\n memo: options.memo,\n });\n } catch (e) {\n return { success: false, error: String(e) };\n }\n }\n\n public async createHashinal(\n options: HCS6CreateHashinalOptions,\n ): Promise<HCS6CreateHashinalResponse> {\n try {\n await this.ensureInitialized();\n\n let registryTopicId: string;\n let registryTransactionId: string | undefined;\n\n if (options.registryTopicId) {\n registryTopicId = options.registryTopicId;\n const topicInfo = await this.mirrorNode.getTopicInfo(registryTopicId);\n const memo = topicInfo.memo || '';\n if (!/^hcs-6:\\d:\\d+$/.test(memo)) {\n throw new Error(\n `Topic ${registryTopicId} is not a valid HCS-6 registry`,\n );\n }\n } else {\n const res = await this.createRegistry({\n ttl: options.ttl,\n submitKey: true,\n });\n if (!res.success || !res.topicId) {\n throw new Error(res.error || 'Failed to create HCS-6 registry');\n }\n registryTopicId = res.topicId;\n registryTransactionId = res.transactionId;\n }\n\n const inscriptionBuffer = Buffer.from(JSON.stringify(options.metadata));\n const inscribeOptions: InscriptionOptions = {\n ...(options.inscriptionOptions as InscriptionOptions | undefined),\n mode: 'hashinal',\n metadata: options.metadata,\n waitForConfirmation: true,\n };\n\n const result = await inscribe(\n {\n type: 'buffer',\n buffer: inscriptionBuffer,\n fileName: 'metadata.json',\n mimeType: 'application/json',\n },\n {\n accountId: this.operatorId.toString(),\n privateKey: this.operatorCtx.operatorKey,\n network: this.network,\n },\n inscribeOptions,\n );\n\n if (!result.confirmed || !result.inscription) {\n throw new Error('Failed to inscribe metadata');\n }\n const topicId =\n result.inscription.jsonTopicId || result.inscription.topic_id;\n if (!topicId) {\n throw new Error('No inscription topic ID available');\n }\n\n const reg = await this.registerEntryWithKey(\n registryTopicId,\n {\n targetTopicId: topicId,\n memo: options.memo || 'Dynamic hashinal registration',\n },\n options.submitKey,\n );\n if (!reg.success) {\n throw new Error(reg.error || 'Failed to register entry');\n }\n\n return {\n success: true,\n registryTopicId,\n inscriptionTopicId: topicId,\n transactionId: registryTransactionId,\n };\n } catch (e) {\n return { success: false, error: String(e) };\n }\n }\n\n public async register(\n options: HCS6RegisterOptions,\n ): Promise<HCS6CreateHashinalResponse> {\n try {\n await this.ensureInitialized();\n\n let registryTopicId: string;\n let registryTransactionId: string | undefined;\n\n if (options.registryTopicId) {\n registryTopicId = options.registryTopicId;\n const topicInfo = await this.mirrorNode.getTopicInfo(registryTopicId);\n const memo = topicInfo.memo || '';\n if (!/^hcs-6:\\d:\\d+$/.test(memo)) {\n throw new Error(\n `Topic ${registryTopicId} is not a valid HCS-6 registry`,\n );\n }\n } else {\n const res = await this.createRegistry({\n ttl: options.ttl,\n submitKey: true,\n });\n if (!res.success || !res.topicId) {\n throw new Error(res.error || 'Failed to create HCS-6 registry');\n }\n registryTopicId = res.topicId;\n registryTransactionId = res.transactionId;\n }\n\n let inscriptionInput: InscriptionInput;\n if (options.data?.base64) {\n const buffer = Buffer.from(options.data.base64, 'base64');\n inscriptionInput = {\n type: 'buffer',\n buffer,\n fileName: `data.${options.data.mimeType?.split('/')[1] || 'bin'}`,\n mimeType: options.data.mimeType || 'application/octet-stream',\n };\n } else if (options.data?.url) {\n inscriptionInput = { type: 'url', url: options.data.url };\n } else {\n inscriptionInput = {\n type: 'buffer',\n buffer: Buffer.from(JSON.stringify(options.metadata)),\n fileName: 'metadata.json',\n mimeType: 'application/json',\n };\n }\n\n const inscribeOptions: InscriptionOptions = {\n ...(options.inscriptionOptions as InscriptionOptions | undefined),\n mode: 'hashinal',\n metadata: options.metadata,\n waitForConfirmation: true,\n };\n\n const result = await inscribe(\n inscriptionInput,\n {\n accountId: this.operatorId.toString(),\n privateKey: this.operatorCtx.operatorKey,\n network: this.network,\n },\n inscribeOptions,\n );\n if (!result.confirmed || !result.inscription) {\n throw new Error('Failed to inscribe data');\n }\n const topicId =\n result.inscription.jsonTopicId || result.inscription.topic_id;\n if (!topicId) {\n throw new Error('No inscription topic ID available');\n }\n\n const reg = await this.registerEntryWithKey(\n registryTopicId,\n {\n targetTopicId: topicId,\n memo: options.memo || 'Dynamic hashinal registration',\n },\n options.submitKey,\n );\n if (!reg.success) {\n throw new Error(reg.error || 'Failed to register entry');\n }\n\n return {\n success: true,\n registryTopicId,\n inscriptionTopicId: topicId,\n transactionId: registryTransactionId,\n };\n } catch (e) {\n return { success: false, error: String(e) };\n }\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { getCryptoAdapter } from "./standards-sdk.es132.js";
|
|
2
|
-
import { base58Encode } from "./standards-sdk.
|
|
2
|
+
import { base58Encode } from "./standards-sdk.es155.js";
|
|
3
3
|
import { canonicalizeAgentData } from "./standards-sdk.es55.js";
|
|
4
4
|
function encodeMultibaseB58btc(input) {
|
|
5
5
|
const bytes = Buffer.from(input, "utf8");
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { isUaidProfileResolverAdapter, isDidProfileResolverAdapter, isDidResolverAdapter } from "./standards-sdk.es58.js";
|
|
2
2
|
import { HieroDidResolver } from "./standards-sdk.es60.js";
|
|
3
3
|
import { parseHcs14Did } from "./standards-sdk.es56.js";
|
|
4
|
-
import { multibaseB58btcDecode } from "./standards-sdk.
|
|
4
|
+
import { multibaseB58btcDecode } from "./standards-sdk.es155.js";
|
|
5
5
|
class ResolverRegistry {
|
|
6
6
|
constructor() {
|
|
7
7
|
this.resolvers = [];
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { nodeDnsTxtLookup } from "./standards-sdk.es66.js";
|
|
2
|
-
import { isFqdn, normalizeDomain, parseSemicolonFields } from "./standards-sdk.
|
|
2
|
+
import { isFqdn, normalizeDomain, parseSemicolonFields } from "./standards-sdk.es157.js";
|
|
3
3
|
const AID_DNS_WEB_PROFILE_ID = "hcs-14.profile.aid-dns-web";
|
|
4
4
|
function buildErrorProfile(uaid, code, message, details) {
|
|
5
5
|
const error = {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { nodeDnsTxtLookup } from "./standards-sdk.es66.js";
|
|
2
|
-
import { isFqdn, normalizeDomain } from "./standards-sdk.
|
|
3
|
-
import { normalizeAnsVersion, isValidAnsProfileVersion, parseAnsDnsTxtRecord, toErrorMessage, parseAnsAgentCard, extractEndpointCandidates, selectPreferredEndpoint } from "./standards-sdk.
|
|
2
|
+
import { isFqdn, normalizeDomain } from "./standards-sdk.es157.js";
|
|
3
|
+
import { normalizeAnsVersion, isValidAnsProfileVersion, parseAnsDnsTxtRecord, toErrorMessage, parseAnsAgentCard, extractEndpointCandidates, selectPreferredEndpoint } from "./standards-sdk.es158.js";
|
|
4
4
|
const ANS_DNS_WEB_PROFILE_ID = "hcs-14.profile.ans-dns-web";
|
|
5
5
|
const UAID_UNSPECIFIED_PARAM_VALUE = "0";
|
|
6
6
|
function buildErrorProfile(uaid, code, message, details) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { nodeDnsTxtLookup } from "./standards-sdk.es66.js";
|
|
2
|
-
import { uaidTargetFromParsed, isFqdn, normalizeDomain, buildCanonicalUaid, parseSemicolonFields } from "./standards-sdk.
|
|
2
|
+
import { uaidTargetFromParsed, isFqdn, normalizeDomain, buildCanonicalUaid, parseSemicolonFields } from "./standards-sdk.es157.js";
|
|
3
3
|
import { AID_DNS_WEB_PROFILE_ID } from "./standards-sdk.es62.js";
|
|
4
4
|
import { ANS_DNS_WEB_PROFILE_ID } from "./standards-sdk.es63.js";
|
|
5
5
|
import { UAID_DID_RESOLUTION_PROFILE_ID } from "./standards-sdk.es65.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standards-sdk.es70.js","sources":["../../src/hcs-5/types.ts"],"sourcesContent":["import { Logger, LogLevel } from '../utils/logger';\nimport { NetworkType } from '../utils/types';\nimport { PrivateKey } from '@hashgraph/sdk';\nimport type { InscriptionOptions } from '../inscribe/types';\nimport type { InscriptionInput } from '../inscribe/inscriber';\n\n/**\n * Configuration for HCS-5 client\n */\nexport interface HCS5ClientConfig {\n network: NetworkType;\n logLevel?: LogLevel;\n silent?: boolean;\n logger?: Logger;\n operatorId: string;\n operatorKey: string | PrivateKey;\n}\n\n/**\n * Options for minting a Hashinal onto an existing HTS NFT token\n */\nexport interface HCS5MintOptions {\n tokenId: string;\n metadataTopicId?: string;\n supplyKey?: string | PrivateKey;\n memo?: string;\n}\n\n/**\n * Options for inscribing content (HCS-1) then minting as a HCS-5 Hashinal\n */\nexport interface HCS5CreateHashinalOptions {\n tokenId: string;\n inscriptionInput: InscriptionInput;\n inscriptionOptions: InscriptionOptions & { waitForConfirmation?: boolean };\n supplyKey?: string | PrivateKey;\n memo?: string;\n}\n\n/**\n * Mint response\n */\nexport interface HCS5MintResponse {\n success: boolean;\n serialNumber?: number;\n transactionId?: string;\n metadata?: string;\n error?: string;\n}\n\n/**\n * Utility to build an HRL for HCS-1\n */\nexport function buildHcs1Hrl(topicId: string): string {\n return `hcs://1/${topicId}`;\n}\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"standards-sdk.es70.js","sources":["../../src/hcs-5/types.ts"],"sourcesContent":["import { Logger, LogLevel } from '../utils/logger';\nimport { NetworkType } from '../utils/types';\nimport { Client, PrivateKey } from '@hashgraph/sdk';\nimport type { InscriptionOptions } from '../inscribe/types';\nimport type { InscriptionInput } from '../inscribe/inscriber';\n\n/**\n * Configuration for HCS-5 client\n */\nexport interface HCS5ClientConfig {\n network: NetworkType;\n logLevel?: LogLevel;\n silent?: boolean;\n logger?: Logger;\n operatorId: string;\n operatorKey: string | PrivateKey;\n client?: Client;\n}\n\n/**\n * Options for minting a Hashinal onto an existing HTS NFT token\n */\nexport interface HCS5MintOptions {\n tokenId: string;\n metadataTopicId?: string;\n supplyKey?: string | PrivateKey;\n memo?: string;\n}\n\n/**\n * Options for inscribing content (HCS-1) then minting as a HCS-5 Hashinal\n */\nexport interface HCS5CreateHashinalOptions {\n tokenId: string;\n inscriptionInput: InscriptionInput;\n inscriptionOptions: InscriptionOptions & { waitForConfirmation?: boolean };\n supplyKey?: string | PrivateKey;\n memo?: string;\n}\n\n/**\n * Mint response\n */\nexport interface HCS5MintResponse {\n success: boolean;\n serialNumber?: number;\n transactionId?: string;\n metadata?: string;\n error?: string;\n}\n\n/**\n * Utility to build an HRL for HCS-1\n */\nexport function buildHcs1Hrl(topicId: string): string {\n return `hcs://1/${topicId}`;\n}\n"],"names":[],"mappings":"AAsDO,SAAS,aAAa,SAAyB;AACpD,SAAO,WAAW,OAAO;AAC3B;"}
|
|
@@ -13,7 +13,8 @@ class HCS5Client extends HCS5BaseClient {
|
|
|
13
13
|
operatorId: this.operatorId,
|
|
14
14
|
operatorKey: config.operatorKey,
|
|
15
15
|
mirrorNode: this.mirrorNode,
|
|
16
|
-
logger: this.logger
|
|
16
|
+
logger: this.logger,
|
|
17
|
+
client: config.client
|
|
17
18
|
});
|
|
18
19
|
this.client = this.operatorCtx.client;
|
|
19
20
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standards-sdk.es72.js","sources":["../../src/hcs-5/sdk.ts"],"sourcesContent":["import { HCS5BaseClient } from './base-client';\nimport {\n HCS5ClientConfig,\n HCS5CreateHashinalOptions,\n HCS5MintOptions,\n HCS5MintResponse,\n buildHcs1Hrl,\n} from './types';\nimport { Client, TokenId, PrivateKey, AccountId } from '@hashgraph/sdk';\nimport { NetworkType } from '../utils/types';\nimport { inscribe } from '../inscribe/inscriber';\nimport { buildHcs5MintTx, buildHcs5MintWithHrlTx } from './tx';\nimport {\n NodeOperatorResolver,\n createNodeOperatorContext,\n type NodeOperatorContext,\n} from '../common/node-operator-resolver';\n\nexport class HCS5Client extends HCS5BaseClient {\n private client: Client;\n private operatorId: AccountId;\n private operatorCtx: NodeOperatorContext;\n\n constructor(config: HCS5ClientConfig) {\n super(config);\n\n this.operatorId = AccountId.fromString(config.operatorId);\n this.operatorCtx = createNodeOperatorContext({\n network: this.network,\n operatorId: this.operatorId,\n operatorKey: config.operatorKey,\n mirrorNode: this.mirrorNode,\n logger: this.logger,\n });\n this.client = this.operatorCtx.client;\n }\n\n private async ensureInitialized(): Promise<void> {\n await this.operatorCtx.ensureInitialized();\n }\n\n async mint(options: HCS5MintOptions): Promise<HCS5MintResponse> {\n try {\n await this.ensureInitialized();\n if (!options.metadataTopicId) {\n return {\n success: false,\n error: 'metadataTopicId is required for mint()',\n };\n }\n\n const metadata = buildHcs1Hrl(options.metadataTopicId);\n const tx = buildHcs5MintTx({ tokenId: options.tokenId, metadata });\n const frozen = await tx.freezeWith(this.client);\n\n if (options.supplyKey) {\n const resolver = new NodeOperatorResolver({\n mirrorNode: this.mirrorNode,\n logger: this.logger,\n });\n const privKey =\n typeof options.supplyKey === 'string'\n ? await resolver.resolveSupplyKey(\n options.tokenId,\n options.supplyKey,\n this.operatorCtx.keyType,\n )\n : options.supplyKey;\n await frozen.sign(privKey);\n }\n\n const resp = await frozen.execute(this.client);\n const receipt = await resp.getReceipt(this.client);\n const serial =\n receipt.serials && receipt.serials[0]\n ? Number(receipt.serials[0].toString())\n : undefined;\n\n return {\n success: true,\n serialNumber: serial,\n transactionId: resp.transactionId?.toString?.(),\n metadata,\n };\n } catch (e) {\n const error = e as Error;\n this.logger.error(`Failed to mint HCS-5 Hashinal: ${error.message}`);\n return { success: false, error: error.message };\n }\n }\n\n async createHashinal(\n options: HCS5CreateHashinalOptions,\n ): Promise<HCS5MintResponse> {\n try {\n await this.ensureInitialized();\n const inscription = await inscribe(\n options.inscriptionInput,\n {\n accountId: this.operatorId.toString(),\n privateKey: this.operatorCtx.operatorKey,\n network: this.network,\n },\n {\n ...(options.inscriptionOptions || {}),\n mode: 'hashinal',\n waitForConfirmation: true,\n },\n );\n\n if (!inscription.confirmed || !inscription.inscription) {\n return { success: false, error: 'Failed to inscribe content' };\n }\n\n const topicId =\n inscription.inscription.jsonTopicId || inscription.inscription.topic_id;\n if (!topicId) {\n return { success: false, error: 'No topic ID from inscription' };\n }\n\n return await this.mint({\n tokenId: options.tokenId,\n metadataTopicId: topicId,\n supplyKey: options.supplyKey,\n memo: options.memo,\n });\n } catch (e) {\n const error = e as Error;\n this.logger.error(\n `Failed to inscribe and mint HCS-5 Hashinal: ${error.message}`,\n );\n return { success: false, error: error.message };\n }\n }\n}\n"],"names":[],"mappings":";;;;;;AAkBO,MAAM,mBAAmB,eAAe;AAAA,EAK7C,YAAY,QAA0B;AACpC,UAAM,MAAM;AAEZ,SAAK,aAAa,UAAU,WAAW,OAAO,UAAU;AACxD,SAAK,cAAc,0BAA0B;AAAA,MAC3C,SAAS,KAAK;AAAA,MACd,YAAY,KAAK;AAAA,MACjB,aAAa,OAAO;AAAA,MACpB,YAAY,KAAK;AAAA,MACjB,QAAQ,KAAK;AAAA,IAAA,
|
|
1
|
+
{"version":3,"file":"standards-sdk.es72.js","sources":["../../src/hcs-5/sdk.ts"],"sourcesContent":["import { HCS5BaseClient } from './base-client';\nimport {\n HCS5ClientConfig,\n HCS5CreateHashinalOptions,\n HCS5MintOptions,\n HCS5MintResponse,\n buildHcs1Hrl,\n} from './types';\nimport { Client, TokenId, PrivateKey, AccountId } from '@hashgraph/sdk';\nimport { NetworkType } from '../utils/types';\nimport { inscribe } from '../inscribe/inscriber';\nimport { buildHcs5MintTx, buildHcs5MintWithHrlTx } from './tx';\nimport {\n NodeOperatorResolver,\n createNodeOperatorContext,\n type NodeOperatorContext,\n} from '../common/node-operator-resolver';\n\nexport class HCS5Client extends HCS5BaseClient {\n private client: Client;\n private operatorId: AccountId;\n private operatorCtx: NodeOperatorContext;\n\n constructor(config: HCS5ClientConfig) {\n super(config);\n\n this.operatorId = AccountId.fromString(config.operatorId);\n this.operatorCtx = createNodeOperatorContext({\n network: this.network,\n operatorId: this.operatorId,\n operatorKey: config.operatorKey,\n mirrorNode: this.mirrorNode,\n logger: this.logger,\n client: config.client,\n });\n this.client = this.operatorCtx.client;\n }\n\n private async ensureInitialized(): Promise<void> {\n await this.operatorCtx.ensureInitialized();\n }\n\n async mint(options: HCS5MintOptions): Promise<HCS5MintResponse> {\n try {\n await this.ensureInitialized();\n if (!options.metadataTopicId) {\n return {\n success: false,\n error: 'metadataTopicId is required for mint()',\n };\n }\n\n const metadata = buildHcs1Hrl(options.metadataTopicId);\n const tx = buildHcs5MintTx({ tokenId: options.tokenId, metadata });\n const frozen = await tx.freezeWith(this.client);\n\n if (options.supplyKey) {\n const resolver = new NodeOperatorResolver({\n mirrorNode: this.mirrorNode,\n logger: this.logger,\n });\n const privKey =\n typeof options.supplyKey === 'string'\n ? await resolver.resolveSupplyKey(\n options.tokenId,\n options.supplyKey,\n this.operatorCtx.keyType,\n )\n : options.supplyKey;\n await frozen.sign(privKey);\n }\n\n const resp = await frozen.execute(this.client);\n const receipt = await resp.getReceipt(this.client);\n const serial =\n receipt.serials && receipt.serials[0]\n ? Number(receipt.serials[0].toString())\n : undefined;\n\n return {\n success: true,\n serialNumber: serial,\n transactionId: resp.transactionId?.toString?.(),\n metadata,\n };\n } catch (e) {\n const error = e as Error;\n this.logger.error(`Failed to mint HCS-5 Hashinal: ${error.message}`);\n return { success: false, error: error.message };\n }\n }\n\n async createHashinal(\n options: HCS5CreateHashinalOptions,\n ): Promise<HCS5MintResponse> {\n try {\n await this.ensureInitialized();\n const inscription = await inscribe(\n options.inscriptionInput,\n {\n accountId: this.operatorId.toString(),\n privateKey: this.operatorCtx.operatorKey,\n network: this.network,\n },\n {\n ...(options.inscriptionOptions || {}),\n mode: 'hashinal',\n waitForConfirmation: true,\n },\n );\n\n if (!inscription.confirmed || !inscription.inscription) {\n return { success: false, error: 'Failed to inscribe content' };\n }\n\n const topicId =\n inscription.inscription.jsonTopicId || inscription.inscription.topic_id;\n if (!topicId) {\n return { success: false, error: 'No topic ID from inscription' };\n }\n\n return await this.mint({\n tokenId: options.tokenId,\n metadataTopicId: topicId,\n supplyKey: options.supplyKey,\n memo: options.memo,\n });\n } catch (e) {\n const error = e as Error;\n this.logger.error(\n `Failed to inscribe and mint HCS-5 Hashinal: ${error.message}`,\n );\n return { success: false, error: error.message };\n }\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -6,7 +6,7 @@ import { createNodeOperatorContext } from "./standards-sdk.es153.js";
|
|
|
6
6
|
import { buildMessageTx } from "./standards-sdk.es154.js";
|
|
7
7
|
import { buildHcs2CreateRegistryTx } from "./standards-sdk.es78.js";
|
|
8
8
|
import { inscribe } from "./standards-sdk.es137.js";
|
|
9
|
-
import { InscriptionSDK } from "./standards-sdk.
|
|
9
|
+
import { InscriptionSDK } from "./standards-sdk.es159.js";
|
|
10
10
|
import { getTopicId } from "./standards-sdk.es127.js";
|
|
11
11
|
const MAX_PAYLOAD_BYTES = 1024;
|
|
12
12
|
const HCS1_HRL_PATTERN = /^hcs:\/\/1\/(\d+\.\d+\.\d+)$/;
|
|
@@ -32,7 +32,7 @@ const _HCS2Client = class _HCS2Client extends HCS2BaseClient {
|
|
|
32
32
|
keyType: config.keyType,
|
|
33
33
|
mirrorNode: this.mirrorNode,
|
|
34
34
|
logger: this.logger,
|
|
35
|
-
client: this.createClient(config.network)
|
|
35
|
+
client: config.client ?? this.createClient(config.network)
|
|
36
36
|
});
|
|
37
37
|
this.client = this.operatorCtx.client;
|
|
38
38
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standards-sdk.es75.js","sources":["../../src/hcs-2/client.ts"],"sourcesContent":["import {\n Client,\n TopicCreateTransaction,\n TopicMessageSubmitTransaction,\n PrivateKey,\n TopicId,\n TransactionReceipt,\n AccountId,\n PublicKey,\n} from '@hashgraph/sdk';\nimport { randomUUID } from 'crypto';\nimport { HCS2BaseClient } from './base-client';\nimport {\n HCS2ClientConfig,\n HCS2Message,\n HCS2Operation,\n HCS2RegistryType,\n TopicRegistrationResponse,\n RegistryOperationResponse,\n TopicRegistry,\n CreateRegistryOptions,\n RegisterEntryOptions,\n UpdateEntryOptions,\n DeleteEntryOptions,\n MigrateTopicOptions,\n QueryRegistryOptions,\n RegistryEntry,\n} from './types';\nimport { NetworkType } from '../utils/types';\nimport {\n NodeOperatorResolver,\n createNodeOperatorContext,\n type NodeOperatorContext,\n} from '../common/node-operator-resolver';\nimport { buildMessageTx } from '../common/tx/tx-utils';\nimport { buildHcs2CreateRegistryTx } from './tx';\nimport { inscribe } from '../inscribe/inscriber';\nimport { InscriptionSDK } from '@kiloscribe/inscription-sdk';\nimport { getTopicId } from '../utils/topic-id-utils';\n\n/** Maximum message payload size before overflow inscription is triggered. */\nconst MAX_PAYLOAD_BYTES = 1024;\n\n/** Regex that matches an HCS-1 HRL like \"hcs://1/0.0.12345\". */\nconst HCS1_HRL_PATTERN = /^hcs:\\/\\/1\\/(\\d+\\.\\d+\\.\\d+)$/;\n\n/**\n * SDK client configuration for HCS-2\n */\nexport interface SDKHCS2ClientConfig extends HCS2ClientConfig {\n operatorId: string | AccountId;\n operatorKey: string | PrivateKey;\n keyType?: 'ed25519' | 'ecdsa';\n}\n\n/**\n * SDK client for HCS-2 operations\n */\nexport class HCS2Client extends HCS2BaseClient {\n private static readonly operationAnalyticsCode: Record<\n HCS2Operation,\n number\n > = {\n [HCS2Operation.REGISTER]: 0,\n [HCS2Operation.UPDATE]: 1,\n [HCS2Operation.DELETE]: 2,\n [HCS2Operation.MIGRATE]: 3,\n };\n\n private client: Client;\n private operatorId: AccountId;\n private operatorCtx: NodeOperatorContext;\n private readonly registryTypeCache = new Map<string, HCS2RegistryType>();\n private inscriptionSDK?: InscriptionSDK;\n\n /**\n * Create a new HCS-2 client\n * @param config Client configuration\n */\n constructor(config: SDKHCS2ClientConfig) {\n super({\n network: config.network,\n logLevel: config.logLevel,\n silent: config.silent,\n mirrorNodeUrl: config.mirrorNodeUrl,\n logger: config.logger,\n });\n\n this.operatorId =\n typeof config.operatorId === 'string'\n ? AccountId.fromString(config.operatorId)\n : config.operatorId;\n\n this.operatorCtx = createNodeOperatorContext({\n network: this.network,\n operatorId: this.operatorId,\n operatorKey: config.operatorKey,\n keyType: config.keyType,\n mirrorNode: this.mirrorNode,\n logger: this.logger,\n client: this.createClient(config.network),\n });\n this.client = this.operatorCtx.client;\n }\n\n /**\n * Initialize the Hedera client with operator information\n */\n private async ensureInitialized(): Promise<void> {\n await this.operatorCtx.ensureInitialized();\n }\n\n /**\n * Create a Hedera client for the specified network\n * @param network The network to connect to\n * @returns The Hedera client\n */\n private createClient(network: NetworkType): Client {\n if (network === 'mainnet') {\n return Client.forMainnet();\n } else {\n return Client.forTestnet();\n }\n }\n\n /**\n * Create a new registry topic\n * @param options Registry creation options\n * @returns Promise resolving to the transaction result\n */\n async createRegistry(\n options: CreateRegistryOptions = {},\n ): Promise<TopicRegistrationResponse> {\n try {\n await this.ensureInitialized();\n const registryType = options.registryType ?? HCS2RegistryType.INDEXED;\n const ttl = options.ttl ?? 86400; // Default TTL: 24 hours\n\n const memo = this.generateRegistryMemo(registryType, ttl);\n\n let adminKeyPrivate: PrivateKey | undefined;\n let adminPublicKey: PublicKey | undefined;\n if (options.adminKey) {\n if (typeof options.adminKey === 'string') {\n try {\n adminPublicKey = PublicKey.fromString(options.adminKey);\n } catch {\n const keyBytes = Buffer.from(\n options.adminKey.replace(/^0x/i, ''),\n 'hex',\n );\n adminPublicKey =\n this.operatorCtx.keyType === 'ed25519'\n ? PublicKey.fromBytesED25519(keyBytes)\n : PublicKey.fromBytesECDSA(keyBytes);\n }\n } else if (typeof options.adminKey === 'boolean') {\n adminPublicKey = this.operatorCtx.operatorKey.publicKey;\n } else {\n adminPublicKey = options.adminKey.publicKey;\n adminKeyPrivate = options.adminKey;\n }\n }\n\n let submitKeyPrivate: PrivateKey | undefined;\n let submitPublicKey: PublicKey | undefined;\n if (options.submitKey) {\n if (typeof options.submitKey === 'string') {\n try {\n submitPublicKey = PublicKey.fromString(options.submitKey);\n } catch {\n const keyBytes = Buffer.from(\n options.submitKey.replace(/^0x/i, ''),\n 'hex',\n );\n submitPublicKey =\n this.operatorCtx.keyType === 'ed25519'\n ? PublicKey.fromBytesED25519(keyBytes)\n : PublicKey.fromBytesECDSA(keyBytes);\n }\n } else if (typeof options.submitKey === 'boolean') {\n submitPublicKey = this.operatorCtx.operatorKey.publicKey;\n } else {\n submitPublicKey = options.submitKey.publicKey;\n submitKeyPrivate = options.submitKey;\n }\n }\n\n const transaction = buildHcs2CreateRegistryTx({\n registryType,\n ttl,\n adminKey: adminPublicKey,\n submitKey: submitPublicKey,\n operatorPublicKey: this.operatorCtx.operatorKey.publicKey,\n });\n\n const frozenTx = await transaction.freezeWith(this.client);\n\n if (adminKeyPrivate) {\n await frozenTx.sign(adminKeyPrivate);\n }\n\n if (submitKeyPrivate) {\n await frozenTx.sign(submitKeyPrivate);\n }\n\n const txResponse = await frozenTx.execute(this.client);\n\n const receipt = await txResponse.getReceipt(this.client);\n const topicId = receipt.topicId;\n\n if (!topicId) {\n throw new Error('Failed to create registry: No topic ID in receipt');\n }\n\n const topicIdStr = topicId.toString();\n this.registryTypeCache.set(topicIdStr, registryType);\n\n this.logger.info(\n `Created registry topic: ${topicIdStr} (${registryType === HCS2RegistryType.INDEXED ? 'Indexed' : 'Non-indexed'}, TTL: ${ttl}s)`,\n );\n\n return {\n success: true,\n topicId: topicIdStr,\n transactionId: txResponse.transactionId.toString(),\n };\n } catch (error) {\n this.logger.error(`Failed to create registry: ${error}`);\n return {\n success: false,\n error: `Failed to create registry: ${error}`,\n };\n }\n }\n\n /**\n * Register a new entry in the registry\n * @param registryTopicId The topic ID of the registry\n * @param options Registration options\n * @param protocol Optional protocol version (defaults to 'hcs-2')\n * @returns Promise resolving to the operation result\n */\n async registerEntry(\n registryTopicId: string,\n options: RegisterEntryOptions,\n protocol: string = 'hcs-2',\n ): Promise<RegistryOperationResponse> {\n try {\n await this.ensureInitialized();\n const message = this.createRegisterMessage(\n options.targetTopicId,\n options.metadata,\n options.memo,\n protocol,\n );\n\n const registryType =\n options.registryType ??\n (await this.resolveRegistryType(registryTopicId));\n this.registryTypeCache.set(registryTopicId, registryType);\n const analyticsMemo =\n options.analyticsMemo ??\n this.buildAnalyticsMemo(HCS2Operation.REGISTER, registryType);\n\n const receipt = await this.submitMessage(\n registryTopicId,\n message,\n analyticsMemo,\n );\n\n this.logger.info(\n `Registered entry in registry ${registryTopicId} pointing to topic ${options.targetTopicId} using protocol ${protocol}`,\n );\n\n return {\n success: true,\n receipt,\n sequenceNumber: receipt.topicSequenceNumber?.low ?? undefined,\n };\n } catch (error) {\n this.logger.error(`Failed to register entry: ${error}`);\n return {\n success: false,\n error: `Failed to register entry: ${error}`,\n };\n }\n }\n\n /**\n * Update an existing entry in the registry (indexed registries only)\n * @param registryTopicId The topic ID of the registry\n * @param options Update options\n * @returns Promise resolving to the operation result\n */\n async updateEntry(\n registryTopicId: string,\n options: UpdateEntryOptions,\n ): Promise<RegistryOperationResponse> {\n try {\n await this.ensureInitialized();\n const registryInfo = await this.mirrorNode.getTopicInfo(registryTopicId);\n const memoInfo = this.parseRegistryTypeFromMemo(registryInfo.memo);\n\n if (!memoInfo || memoInfo.registryType !== HCS2RegistryType.INDEXED) {\n throw new Error(\n 'Update operation is only valid for indexed registries',\n );\n }\n\n const message = this.createUpdateMessage(\n options.targetTopicId,\n options.uid,\n options.metadata,\n options.memo,\n );\n\n const registryType =\n options.registryType ??\n (await this.resolveRegistryType(registryTopicId));\n this.registryTypeCache.set(registryTopicId, registryType);\n const analyticsMemo =\n options.analyticsMemo ??\n this.buildAnalyticsMemo(HCS2Operation.UPDATE, registryType);\n\n const receipt = await this.submitMessage(\n registryTopicId,\n message,\n analyticsMemo,\n );\n\n this.logger.info(\n `Updated entry with UID ${options.uid} in registry ${registryTopicId}`,\n );\n\n return {\n success: true,\n receipt,\n sequenceNumber: receipt.topicSequenceNumber?.low ?? undefined,\n };\n } catch (error) {\n this.logger.error(`Failed to update entry: ${error}`);\n throw error;\n }\n }\n\n /**\n * Delete an entry from the registry (indexed registries only)\n * @param registryTopicId The topic ID of the registry\n * @param options Delete options\n * @returns Promise resolving to the operation result\n */\n async deleteEntry(\n registryTopicId: string,\n options: DeleteEntryOptions,\n ): Promise<RegistryOperationResponse> {\n try {\n await this.ensureInitialized();\n const registryInfo = await this.mirrorNode.getTopicInfo(registryTopicId);\n const memoInfo = this.parseRegistryTypeFromMemo(registryInfo.memo);\n\n if (!memoInfo || memoInfo.registryType !== HCS2RegistryType.INDEXED) {\n throw new Error(\n 'Delete operation is only valid for indexed registries',\n );\n }\n\n const message = this.createDeleteMessage(options.uid, options.memo);\n\n const registryType =\n options.registryType ??\n (await this.resolveRegistryType(registryTopicId));\n this.registryTypeCache.set(registryTopicId, registryType);\n const analyticsMemo =\n options.analyticsMemo ??\n this.buildAnalyticsMemo(HCS2Operation.DELETE, registryType);\n\n const receipt = await this.submitMessage(\n registryTopicId,\n message,\n analyticsMemo,\n );\n\n this.logger.info(\n `Deleted entry with UID ${options.uid} from registry ${registryTopicId}`,\n );\n\n return {\n success: true,\n receipt,\n sequenceNumber: receipt.topicSequenceNumber?.low ?? undefined,\n };\n } catch (error) {\n this.logger.error(`Failed to delete entry: ${error}`);\n throw error;\n }\n }\n\n /**\n * Migrate a registry to a new topic\n * @param registryTopicId The topic ID of the registry\n * @param options Migration options\n * @returns Promise resolving to the operation result\n */\n async migrateRegistry(\n registryTopicId: string,\n options: MigrateTopicOptions,\n ): Promise<RegistryOperationResponse> {\n try {\n await this.ensureInitialized();\n const message = this.createMigrateMessage(\n options.targetTopicId,\n options.metadata,\n options.memo,\n );\n\n const registryType =\n options.registryType ??\n (await this.resolveRegistryType(registryTopicId));\n this.registryTypeCache.set(registryTopicId, registryType);\n const analyticsMemo =\n options.analyticsMemo ??\n this.buildAnalyticsMemo(HCS2Operation.MIGRATE, registryType);\n\n const receipt = await this.submitMessage(\n registryTopicId,\n message,\n analyticsMemo,\n );\n\n this.logger.info(\n `Migrated registry ${registryTopicId} to ${options.targetTopicId}`,\n );\n\n return {\n success: true,\n receipt,\n sequenceNumber: receipt.topicSequenceNumber?.low ?? undefined,\n };\n } catch (error) {\n this.logger.error(`Failed to migrate registry: ${error}`);\n throw error;\n }\n }\n\n /**\n * Get all entries from a registry\n * @param topicId The topic ID of the registry\n * @param options Query options\n * @returns Promise resolving to the registry information\n */\n async getRegistry(\n topicId: string,\n options: QueryRegistryOptions = {},\n ): Promise<TopicRegistry> {\n try {\n await this.ensureInitialized();\n const topicInfo = await this.mirrorNode.getTopicInfo(topicId);\n this.logger.debug(\n `Retrieved topic info for ${topicId}: ${JSON.stringify(topicInfo)}`,\n );\n\n const memoInfo = this.parseRegistryTypeFromMemo(topicInfo.memo);\n\n if (!memoInfo) {\n throw new Error(\n `Topic ${topicId} is not an HCS-2 registry (invalid memo format)`,\n );\n }\n\n this.logger.debug(\n `Retrieving messages for topic ${topicId} with limit ${options.limit ?? 100}`,\n );\n const rawMessagesResult = (await this.mirrorNode.getTopicMessages(\n topicId,\n {\n sequenceNumber:\n options.skip && options.skip > 0 ? `gt:${options.skip}` : undefined,\n limit: options.limit ?? 100,\n order: options.order ?? 'asc',\n },\n )) as any[];\n\n const rawMessages = options.limit\n ? rawMessagesResult.slice(0, options.limit)\n : rawMessagesResult;\n\n this.logger.debug(\n `Retrieved ${rawMessagesResult.length} messages, using ${rawMessages.length} after applying limit.`,\n );\n\n const entries: RegistryEntry[] = [];\n let latestEntry: RegistryEntry | undefined;\n\n for (const msg of rawMessages) {\n try {\n let message: HCS2Message;\n\n // Build the message from the raw mirror node data\n message = {\n p: msg.p || 'hcs-2',\n op: msg.op,\n t_id: msg.t_id,\n uid: msg.uid,\n metadata: msg.metadata,\n m: msg.m,\n } as HCS2Message;\n\n // Check if metadata is an HCS-1 HRL (overflow reference)\n if (\n options.resolveOverflow &&\n typeof msg.metadata === 'string' &&\n HCS1_HRL_PATTERN.test(msg.metadata)\n ) {\n const hrlMatch = msg.metadata.match(HCS1_HRL_PATTERN);\n if (hrlMatch) {\n const refTopicId = hrlMatch[1];\n try {\n const refMessages =\n await this.mirrorNode.getTopicMessages(refTopicId);\n if (refMessages.length > 0) {\n const resolvedMsg = refMessages[0] as Record<string, unknown>;\n message = {\n p: (resolvedMsg.p as string) || 'hcs-2',\n op: resolvedMsg.op as HCS2Message['op'],\n t_id: resolvedMsg.t_id as string | undefined,\n uid: resolvedMsg.uid as string | undefined,\n metadata: resolvedMsg.metadata as string | undefined,\n m: resolvedMsg.m as string | undefined,\n } as HCS2Message;\n }\n } catch (resolveErr) {\n this.logger.warn(\n `Failed to resolve overflow ${msg.metadata}: ${resolveErr}`,\n );\n }\n }\n }\n\n const { valid, errors } = this.validateMessage(message);\n if (!valid) {\n this.logger.warn(`Invalid HCS-2 message: ${errors.join(', ')}`);\n continue;\n }\n\n const entry: RegistryEntry = {\n topicId,\n sequence: msg.sequence_number,\n timestamp: msg.consensus_timestamp,\n payer: msg.payer_account_id || msg.payer || '',\n message,\n consensus_timestamp: msg.consensus_timestamp,\n registry_type: memoInfo.registryType,\n };\n\n entries.push(entry);\n\n if (\n memoInfo.registryType === HCS2RegistryType.NON_INDEXED ||\n !latestEntry ||\n entry.timestamp > latestEntry.timestamp\n ) {\n latestEntry = entry;\n }\n } catch (error) {\n this.logger.warn(`Error processing message: ${error}`);\n }\n }\n\n this.logger.debug(\n `Processed ${entries.length} valid entries for registry ${topicId}`,\n );\n\n const registry: TopicRegistry = {\n topicId,\n registryType: memoInfo.registryType,\n ttl: memoInfo.ttl,\n entries:\n memoInfo.registryType === HCS2RegistryType.INDEXED\n ? entries\n : latestEntry\n ? [latestEntry]\n : [],\n latestEntry,\n };\n\n return registry;\n } catch (error) {\n this.logger.error(`Failed to get registry: ${error}`);\n throw error;\n }\n }\n\n private buildAnalyticsMemo(\n operation: HCS2Operation,\n registryType: HCS2RegistryType,\n ): string {\n const opCode = HCS2Client.operationAnalyticsCode[operation];\n return `hcs-2:op:${opCode}:${registryType}`;\n }\n\n private async resolveRegistryType(\n topicId: string,\n ): Promise<HCS2RegistryType> {\n const cached = this.registryTypeCache.get(topicId);\n if (cached !== undefined) {\n return cached;\n }\n\n const topicInfo = await this.mirrorNode.getTopicInfo(topicId);\n const memoInfo = this.parseRegistryTypeFromMemo(topicInfo.memo);\n if (!memoInfo) {\n throw new Error(\n `Topic ${topicId} is not an HCS-2 registry (invalid memo format)`,\n );\n }\n\n this.registryTypeCache.set(topicId, memoInfo.registryType);\n return memoInfo.registryType;\n }\n\n /**\n * Submit a message to a topic.\n * If the serialized payload exceeds 1024 bytes, the full message is\n * inscribed via HCS-1 (using the Inscriber) and a compact overflow\n * wrapper containing the HRL reference + SHA-256 digest is submitted\n * instead.\n * @param topicId The topic ID to submit to\n * @param payload The message payload\n * @param analyticsMemo Optional analytics memo for the transaction\n * @returns Promise resolving to the transaction receipt\n */\n async submitMessage(\n topicId: string,\n payload: HCS2Message,\n analyticsMemo?: string,\n ): Promise<TransactionReceipt> {\n try {\n await this.ensureInitialized();\n const { valid, errors } = this.validateMessage(payload);\n if (!valid) {\n throw new Error(`Invalid HCS-2 message: ${errors.join(', ')}`);\n }\n\n let messageString = JSON.stringify(payload);\n\n // Overflow: inscribe via HCS-1 when payload exceeds MAX_PAYLOAD_BYTES\n if (Buffer.byteLength(messageString, 'utf8') > MAX_PAYLOAD_BYTES) {\n this.logger.info(\n `HCS-2 payload exceeds ${MAX_PAYLOAD_BYTES} bytes, inscribing via HCS-1`,\n );\n\n const contentBuffer = Buffer.from(messageString, 'utf8');\n const fileName = `hcs2-overflow-${randomUUID()}.json`;\n\n if (this.network !== 'testnet' && this.network !== 'mainnet') {\n throw new Error(\n `Overflow inscription is only supported on testnet and mainnet, but network is ${this.network}`,\n );\n }\n\n const authOptions = {\n accountId: this.operatorId.toString(),\n privateKey: this.operatorCtx.operatorKey,\n network: this.network as 'testnet' | 'mainnet',\n };\n\n if (!this.inscriptionSDK) {\n this.inscriptionSDK = await InscriptionSDK.createWithAuth({\n type: 'server',\n ...authOptions,\n });\n }\n\n const inscriptionResult = await inscribe(\n {\n type: 'buffer',\n buffer: contentBuffer,\n fileName,\n mimeType: 'application/json',\n },\n authOptions,\n {\n mode: 'file' as const,\n waitForConfirmation: true,\n waitMaxAttempts: 30,\n waitIntervalMs: 4000,\n },\n this.inscriptionSDK,\n );\n\n const inscriptionTopicId = getTopicId(inscriptionResult?.inscription);\n if (!inscriptionTopicId) {\n throw new Error(\n 'Failed to inscribe overflow HCS-2 payload: no topic ID returned',\n );\n }\n\n const hrl = `hcs://1/${inscriptionTopicId}`;\n\n // Build a standard HCS-2 message with metadata set to the HRL\n const overflowMessage: HCS2Message = {\n ...payload,\n metadata: hrl,\n } as HCS2Message;\n\n this.logger.info(\n `HCS-2 payload inscribed to ${hrl}, submitting overflow wrapper`,\n );\n messageString = JSON.stringify(overflowMessage);\n }\n\n const transaction = buildMessageTx({\n topicId,\n message: messageString,\n transactionMemo: analyticsMemo,\n });\n\n const txResponse = await transaction.execute(this.client);\n\n const receipt = await txResponse.getReceipt(this.client);\n\n return receipt;\n } catch (error) {\n this.logger.error(`Failed to submit message: ${error}`);\n throw error;\n }\n }\n\n /**\n * @param topicId The topic ID to query\n * @returns Promise resolving to the topic information\n */\n public async getTopicInfo(topicId: string): Promise<any> {\n return this.mirrorNode.getTopicInfo(topicId);\n }\n\n /**\n * Close the client and release resources\n */\n public close(): void {\n this.logger.info('HCS-2 client closed.');\n }\n\n /**\n * Get the configured key type (ed25519 or ecdsa)\n */\n public getKeyType(): 'ed25519' | 'ecdsa' {\n return this.operatorCtx.keyType;\n }\n\n /**\n * Get the configured operator private key\n */\n public getOperatorKey(): PrivateKey {\n return this.operatorCtx.operatorKey;\n }\n}\n"],"names":[],"mappings":";;;;;;;;;;AAyCA,MAAM,oBAAoB;AAG1B,MAAM,mBAAmB;AAclB,MAAM,cAAN,MAAM,oBAAmB,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA,EAqB7C,YAAY,QAA6B;AACvC,UAAM;AAAA,MACJ,SAAS,OAAO;AAAA,MAChB,UAAU,OAAO;AAAA,MACjB,QAAQ,OAAO;AAAA,MACf,eAAe,OAAO;AAAA,MACtB,QAAQ,OAAO;AAAA,IAAA,CAChB;AAdH,SAAiB,wCAAwB,IAAA;AAgBvC,SAAK,aACH,OAAO,OAAO,eAAe,WACzB,UAAU,WAAW,OAAO,UAAU,IACtC,OAAO;AAEb,SAAK,cAAc,0BAA0B;AAAA,MAC3C,SAAS,KAAK;AAAA,MACd,YAAY,KAAK;AAAA,MACjB,aAAa,OAAO;AAAA,MACpB,SAAS,OAAO;AAAA,MAChB,YAAY,KAAK;AAAA,MACjB,QAAQ,KAAK;AAAA,MACb,QAAQ,KAAK,aAAa,OAAO,OAAO;AAAA,IAAA,CACzC;AACD,SAAK,SAAS,KAAK,YAAY;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,oBAAmC;AAC/C,UAAM,KAAK,YAAY,kBAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,aAAa,SAA8B;AACjD,QAAI,YAAY,WAAW;AACzB,aAAO,OAAO,WAAA;AAAA,IAChB,OAAO;AACL,aAAO,OAAO,WAAA;AAAA,IAChB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,eACJ,UAAiC,IACG;AACpC,QAAI;AACF,YAAM,KAAK,kBAAA;AACX,YAAM,eAAe,QAAQ,gBAAgB,iBAAiB;AAC9D,YAAM,MAAM,QAAQ,OAAO;AAE3B,YAAM,OAAO,KAAK,qBAAqB,cAAc,GAAG;AAExD,UAAI;AACJ,UAAI;AACJ,UAAI,QAAQ,UAAU;AACpB,YAAI,OAAO,QAAQ,aAAa,UAAU;AACxC,cAAI;AACF,6BAAiB,UAAU,WAAW,QAAQ,QAAQ;AAAA,UACxD,QAAQ;AACN,kBAAM,WAAW,OAAO;AAAA,cACtB,QAAQ,SAAS,QAAQ,QAAQ,EAAE;AAAA,cACnC;AAAA,YAAA;AAEF,6BACE,KAAK,YAAY,YAAY,YACzB,UAAU,iBAAiB,QAAQ,IACnC,UAAU,eAAe,QAAQ;AAAA,UACzC;AAAA,QACF,WAAW,OAAO,QAAQ,aAAa,WAAW;AAChD,2BAAiB,KAAK,YAAY,YAAY;AAAA,QAChD,OAAO;AACL,2BAAiB,QAAQ,SAAS;AAClC,4BAAkB,QAAQ;AAAA,QAC5B;AAAA,MACF;AAEA,UAAI;AACJ,UAAI;AACJ,UAAI,QAAQ,WAAW;AACrB,YAAI,OAAO,QAAQ,cAAc,UAAU;AACzC,cAAI;AACF,8BAAkB,UAAU,WAAW,QAAQ,SAAS;AAAA,UAC1D,QAAQ;AACN,kBAAM,WAAW,OAAO;AAAA,cACtB,QAAQ,UAAU,QAAQ,QAAQ,EAAE;AAAA,cACpC;AAAA,YAAA;AAEF,8BACE,KAAK,YAAY,YAAY,YACzB,UAAU,iBAAiB,QAAQ,IACnC,UAAU,eAAe,QAAQ;AAAA,UACzC;AAAA,QACF,WAAW,OAAO,QAAQ,cAAc,WAAW;AACjD,4BAAkB,KAAK,YAAY,YAAY;AAAA,QACjD,OAAO;AACL,4BAAkB,QAAQ,UAAU;AACpC,6BAAmB,QAAQ;AAAA,QAC7B;AAAA,MACF;AAEA,YAAM,cAAc,0BAA0B;AAAA,QAC5C;AAAA,QACA;AAAA,QACA,UAAU;AAAA,QACV,WAAW;AAAA,QACX,mBAAmB,KAAK,YAAY,YAAY;AAAA,MAAA,CACjD;AAED,YAAM,WAAW,MAAM,YAAY,WAAW,KAAK,MAAM;AAEzD,UAAI,iBAAiB;AACnB,cAAM,SAAS,KAAK,eAAe;AAAA,MACrC;AAEA,UAAI,kBAAkB;AACpB,cAAM,SAAS,KAAK,gBAAgB;AAAA,MACtC;AAEA,YAAM,aAAa,MAAM,SAAS,QAAQ,KAAK,MAAM;AAErD,YAAM,UAAU,MAAM,WAAW,WAAW,KAAK,MAAM;AACvD,YAAM,UAAU,QAAQ;AAExB,UAAI,CAAC,SAAS;AACZ,cAAM,IAAI,MAAM,mDAAmD;AAAA,MACrE;AAEA,YAAM,aAAa,QAAQ,SAAA;AAC3B,WAAK,kBAAkB,IAAI,YAAY,YAAY;AAEnD,WAAK,OAAO;AAAA,QACV,2BAA2B,UAAU,KAAK,iBAAiB,iBAAiB,UAAU,YAAY,aAAa,UAAU,GAAG;AAAA,MAAA;AAG9H,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS;AAAA,QACT,eAAe,WAAW,cAAc,SAAA;AAAA,MAAS;AAAA,IAErD,SAAS,OAAO;AACd,WAAK,OAAO,MAAM,8BAA8B,KAAK,EAAE;AACvD,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO,8BAA8B,KAAK;AAAA,MAAA;AAAA,IAE9C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,cACJ,iBACA,SACA,WAAmB,SACiB;AACpC,QAAI;AACF,YAAM,KAAK,kBAAA;AACX,YAAM,UAAU,KAAK;AAAA,QACnB,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR;AAAA,MAAA;AAGF,YAAM,eACJ,QAAQ,gBACP,MAAM,KAAK,oBAAoB,eAAe;AACjD,WAAK,kBAAkB,IAAI,iBAAiB,YAAY;AACxD,YAAM,gBACJ,QAAQ,iBACR,KAAK,mBAAmB,cAAc,UAAU,YAAY;AAE9D,YAAM,UAAU,MAAM,KAAK;AAAA,QACzB;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAGF,WAAK,OAAO;AAAA,QACV,gCAAgC,eAAe,sBAAsB,QAAQ,aAAa,mBAAmB,QAAQ;AAAA,MAAA;AAGvH,aAAO;AAAA,QACL,SAAS;AAAA,QACT;AAAA,QACA,gBAAgB,QAAQ,qBAAqB,OAAO;AAAA,MAAA;AAAA,IAExD,SAAS,OAAO;AACd,WAAK,OAAO,MAAM,6BAA6B,KAAK,EAAE;AACtD,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO,6BAA6B,KAAK;AAAA,MAAA;AAAA,IAE7C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,YACJ,iBACA,SACoC;AACpC,QAAI;AACF,YAAM,KAAK,kBAAA;AACX,YAAM,eAAe,MAAM,KAAK,WAAW,aAAa,eAAe;AACvE,YAAM,WAAW,KAAK,0BAA0B,aAAa,IAAI;AAEjE,UAAI,CAAC,YAAY,SAAS,iBAAiB,iBAAiB,SAAS;AACnE,cAAM,IAAI;AAAA,UACR;AAAA,QAAA;AAAA,MAEJ;AAEA,YAAM,UAAU,KAAK;AAAA,QACnB,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,QAAQ;AAAA,MAAA;AAGV,YAAM,eACJ,QAAQ,gBACP,MAAM,KAAK,oBAAoB,eAAe;AACjD,WAAK,kBAAkB,IAAI,iBAAiB,YAAY;AACxD,YAAM,gBACJ,QAAQ,iBACR,KAAK,mBAAmB,cAAc,QAAQ,YAAY;AAE5D,YAAM,UAAU,MAAM,KAAK;AAAA,QACzB;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAGF,WAAK,OAAO;AAAA,QACV,0BAA0B,QAAQ,GAAG,gBAAgB,eAAe;AAAA,MAAA;AAGtE,aAAO;AAAA,QACL,SAAS;AAAA,QACT;AAAA,QACA,gBAAgB,QAAQ,qBAAqB,OAAO;AAAA,MAAA;AAAA,IAExD,SAAS,OAAO;AACd,WAAK,OAAO,MAAM,2BAA2B,KAAK,EAAE;AACpD,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,YACJ,iBACA,SACoC;AACpC,QAAI;AACF,YAAM,KAAK,kBAAA;AACX,YAAM,eAAe,MAAM,KAAK,WAAW,aAAa,eAAe;AACvE,YAAM,WAAW,KAAK,0BAA0B,aAAa,IAAI;AAEjE,UAAI,CAAC,YAAY,SAAS,iBAAiB,iBAAiB,SAAS;AACnE,cAAM,IAAI;AAAA,UACR;AAAA,QAAA;AAAA,MAEJ;AAEA,YAAM,UAAU,KAAK,oBAAoB,QAAQ,KAAK,QAAQ,IAAI;AAElE,YAAM,eACJ,QAAQ,gBACP,MAAM,KAAK,oBAAoB,eAAe;AACjD,WAAK,kBAAkB,IAAI,iBAAiB,YAAY;AACxD,YAAM,gBACJ,QAAQ,iBACR,KAAK,mBAAmB,cAAc,QAAQ,YAAY;AAE5D,YAAM,UAAU,MAAM,KAAK;AAAA,QACzB;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAGF,WAAK,OAAO;AAAA,QACV,0BAA0B,QAAQ,GAAG,kBAAkB,eAAe;AAAA,MAAA;AAGxE,aAAO;AAAA,QACL,SAAS;AAAA,QACT;AAAA,QACA,gBAAgB,QAAQ,qBAAqB,OAAO;AAAA,MAAA;AAAA,IAExD,SAAS,OAAO;AACd,WAAK,OAAO,MAAM,2BAA2B,KAAK,EAAE;AACpD,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,gBACJ,iBACA,SACoC;AACpC,QAAI;AACF,YAAM,KAAK,kBAAA;AACX,YAAM,UAAU,KAAK;AAAA,QACnB,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,QAAQ;AAAA,MAAA;AAGV,YAAM,eACJ,QAAQ,gBACP,MAAM,KAAK,oBAAoB,eAAe;AACjD,WAAK,kBAAkB,IAAI,iBAAiB,YAAY;AACxD,YAAM,gBACJ,QAAQ,iBACR,KAAK,mBAAmB,cAAc,SAAS,YAAY;AAE7D,YAAM,UAAU,MAAM,KAAK;AAAA,QACzB;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAGF,WAAK,OAAO;AAAA,QACV,qBAAqB,eAAe,OAAO,QAAQ,aAAa;AAAA,MAAA;AAGlE,aAAO;AAAA,QACL,SAAS;AAAA,QACT;AAAA,QACA,gBAAgB,QAAQ,qBAAqB,OAAO;AAAA,MAAA;AAAA,IAExD,SAAS,OAAO;AACd,WAAK,OAAO,MAAM,+BAA+B,KAAK,EAAE;AACxD,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,YACJ,SACA,UAAgC,IACR;AACxB,QAAI;AACF,YAAM,KAAK,kBAAA;AACX,YAAM,YAAY,MAAM,KAAK,WAAW,aAAa,OAAO;AAC5D,WAAK,OAAO;AAAA,QACV,4BAA4B,OAAO,KAAK,KAAK,UAAU,SAAS,CAAC;AAAA,MAAA;AAGnE,YAAM,WAAW,KAAK,0BAA0B,UAAU,IAAI;AAE9D,UAAI,CAAC,UAAU;AACb,cAAM,IAAI;AAAA,UACR,SAAS,OAAO;AAAA,QAAA;AAAA,MAEpB;AAEA,WAAK,OAAO;AAAA,QACV,iCAAiC,OAAO,eAAe,QAAQ,SAAS,GAAG;AAAA,MAAA;AAE7E,YAAM,oBAAqB,MAAM,KAAK,WAAW;AAAA,QAC/C;AAAA,QACA;AAAA,UACE,gBACE,QAAQ,QAAQ,QAAQ,OAAO,IAAI,MAAM,QAAQ,IAAI,KAAK;AAAA,UAC5D,OAAO,QAAQ,SAAS;AAAA,UACxB,OAAO,QAAQ,SAAS;AAAA,QAAA;AAAA,MAC1B;AAGF,YAAM,cAAc,QAAQ,QACxB,kBAAkB,MAAM,GAAG,QAAQ,KAAK,IACxC;AAEJ,WAAK,OAAO;AAAA,QACV,aAAa,kBAAkB,MAAM,oBAAoB,YAAY,MAAM;AAAA,MAAA;AAG7E,YAAM,UAA2B,CAAA;AACjC,UAAI;AAEJ,iBAAW,OAAO,aAAa;AAC7B,YAAI;AACF,cAAI;AAGJ,oBAAU;AAAA,YACR,GAAG,IAAI,KAAK;AAAA,YACZ,IAAI,IAAI;AAAA,YACR,MAAM,IAAI;AAAA,YACV,KAAK,IAAI;AAAA,YACT,UAAU,IAAI;AAAA,YACd,GAAG,IAAI;AAAA,UAAA;AAIT,cACE,QAAQ,mBACR,OAAO,IAAI,aAAa,YACxB,iBAAiB,KAAK,IAAI,QAAQ,GAClC;AACA,kBAAM,WAAW,IAAI,SAAS,MAAM,gBAAgB;AACpD,gBAAI,UAAU;AACZ,oBAAM,aAAa,SAAS,CAAC;AAC7B,kBAAI;AACF,sBAAM,cACJ,MAAM,KAAK,WAAW,iBAAiB,UAAU;AACnD,oBAAI,YAAY,SAAS,GAAG;AAC1B,wBAAM,cAAc,YAAY,CAAC;AACjC,4BAAU;AAAA,oBACR,GAAI,YAAY,KAAgB;AAAA,oBAChC,IAAI,YAAY;AAAA,oBAChB,MAAM,YAAY;AAAA,oBAClB,KAAK,YAAY;AAAA,oBACjB,UAAU,YAAY;AAAA,oBACtB,GAAG,YAAY;AAAA,kBAAA;AAAA,gBAEnB;AAAA,cACF,SAAS,YAAY;AACnB,qBAAK,OAAO;AAAA,kBACV,8BAA8B,IAAI,QAAQ,KAAK,UAAU;AAAA,gBAAA;AAAA,cAE7D;AAAA,YACF;AAAA,UACF;AAEA,gBAAM,EAAE,OAAO,OAAA,IAAW,KAAK,gBAAgB,OAAO;AACtD,cAAI,CAAC,OAAO;AACV,iBAAK,OAAO,KAAK,0BAA0B,OAAO,KAAK,IAAI,CAAC,EAAE;AAC9D;AAAA,UACF;AAEA,gBAAM,QAAuB;AAAA,YAC3B;AAAA,YACA,UAAU,IAAI;AAAA,YACd,WAAW,IAAI;AAAA,YACf,OAAO,IAAI,oBAAoB,IAAI,SAAS;AAAA,YAC5C;AAAA,YACA,qBAAqB,IAAI;AAAA,YACzB,eAAe,SAAS;AAAA,UAAA;AAG1B,kBAAQ,KAAK,KAAK;AAElB,cACE,SAAS,iBAAiB,iBAAiB,eAC3C,CAAC,eACD,MAAM,YAAY,YAAY,WAC9B;AACA,0BAAc;AAAA,UAChB;AAAA,QACF,SAAS,OAAO;AACd,eAAK,OAAO,KAAK,6BAA6B,KAAK,EAAE;AAAA,QACvD;AAAA,MACF;AAEA,WAAK,OAAO;AAAA,QACV,aAAa,QAAQ,MAAM,+BAA+B,OAAO;AAAA,MAAA;AAGnE,YAAM,WAA0B;AAAA,QAC9B;AAAA,QACA,cAAc,SAAS;AAAA,QACvB,KAAK,SAAS;AAAA,QACd,SACE,SAAS,iBAAiB,iBAAiB,UACvC,UACA,cACE,CAAC,WAAW,IACZ,CAAA;AAAA,QACR;AAAA,MAAA;AAGF,aAAO;AAAA,IACT,SAAS,OAAO;AACd,WAAK,OAAO,MAAM,2BAA2B,KAAK,EAAE;AACpD,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEQ,mBACN,WACA,cACQ;AACR,UAAM,SAAS,YAAW,uBAAuB,SAAS;AAC1D,WAAO,YAAY,MAAM,IAAI,YAAY;AAAA,EAC3C;AAAA,EAEA,MAAc,oBACZ,SAC2B;AAC3B,UAAM,SAAS,KAAK,kBAAkB,IAAI,OAAO;AACjD,QAAI,WAAW,QAAW;AACxB,aAAO;AAAA,IACT;AAEA,UAAM,YAAY,MAAM,KAAK,WAAW,aAAa,OAAO;AAC5D,UAAM,WAAW,KAAK,0BAA0B,UAAU,IAAI;AAC9D,QAAI,CAAC,UAAU;AACb,YAAM,IAAI;AAAA,QACR,SAAS,OAAO;AAAA,MAAA;AAAA,IAEpB;AAEA,SAAK,kBAAkB,IAAI,SAAS,SAAS,YAAY;AACzD,WAAO,SAAS;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,cACJ,SACA,SACA,eAC6B;AAC7B,QAAI;AACF,YAAM,KAAK,kBAAA;AACX,YAAM,EAAE,OAAO,OAAA,IAAW,KAAK,gBAAgB,OAAO;AACtD,UAAI,CAAC,OAAO;AACV,cAAM,IAAI,MAAM,0BAA0B,OAAO,KAAK,IAAI,CAAC,EAAE;AAAA,MAC/D;AAEA,UAAI,gBAAgB,KAAK,UAAU,OAAO;AAG1C,UAAI,OAAO,WAAW,eAAe,MAAM,IAAI,mBAAmB;AAChE,aAAK,OAAO;AAAA,UACV,yBAAyB,iBAAiB;AAAA,QAAA;AAG5C,cAAM,gBAAgB,OAAO,KAAK,eAAe,MAAM;AACvD,cAAM,WAAW,iBAAiB,WAAA,CAAY;AAE9C,YAAI,KAAK,YAAY,aAAa,KAAK,YAAY,WAAW;AAC5D,gBAAM,IAAI;AAAA,YACR,iFAAiF,KAAK,OAAO;AAAA,UAAA;AAAA,QAEjG;AAEA,cAAM,cAAc;AAAA,UAClB,WAAW,KAAK,WAAW,SAAA;AAAA,UAC3B,YAAY,KAAK,YAAY;AAAA,UAC7B,SAAS,KAAK;AAAA,QAAA;AAGhB,YAAI,CAAC,KAAK,gBAAgB;AACxB,eAAK,iBAAiB,MAAM,eAAe,eAAe;AAAA,YACxD,MAAM;AAAA,YACN,GAAG;AAAA,UAAA,CACJ;AAAA,QACH;AAEA,cAAM,oBAAoB,MAAM;AAAA,UAC9B;AAAA,YACE,MAAM;AAAA,YACN,QAAQ;AAAA,YACR;AAAA,YACA,UAAU;AAAA,UAAA;AAAA,UAEZ;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,qBAAqB;AAAA,YACrB,iBAAiB;AAAA,YACjB,gBAAgB;AAAA,UAAA;AAAA,UAElB,KAAK;AAAA,QAAA;AAGP,cAAM,qBAAqB,WAAW,mBAAmB,WAAW;AACpE,YAAI,CAAC,oBAAoB;AACvB,gBAAM,IAAI;AAAA,YACR;AAAA,UAAA;AAAA,QAEJ;AAEA,cAAM,MAAM,WAAW,kBAAkB;AAGzC,cAAM,kBAA+B;AAAA,UACnC,GAAG;AAAA,UACH,UAAU;AAAA,QAAA;AAGZ,aAAK,OAAO;AAAA,UACV,8BAA8B,GAAG;AAAA,QAAA;AAEnC,wBAAgB,KAAK,UAAU,eAAe;AAAA,MAChD;AAEA,YAAM,cAAc,eAAe;AAAA,QACjC;AAAA,QACA,SAAS;AAAA,QACT,iBAAiB;AAAA,MAAA,CAClB;AAED,YAAM,aAAa,MAAM,YAAY,QAAQ,KAAK,MAAM;AAExD,YAAM,UAAU,MAAM,WAAW,WAAW,KAAK,MAAM;AAEvD,aAAO;AAAA,IACT,SAAS,OAAO;AACd,WAAK,OAAO,MAAM,6BAA6B,KAAK,EAAE;AACtD,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,aAAa,SAA+B;AACvD,WAAO,KAAK,WAAW,aAAa,OAAO;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKO,QAAc;AACnB,SAAK,OAAO,KAAK,sBAAsB;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKO,aAAkC;AACvC,WAAO,KAAK,YAAY;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKO,iBAA6B;AAClC,WAAO,KAAK,YAAY;AAAA,EAC1B;AACF;AA1rBE,YAAwB,yBAGpB;AAAA,EACF,CAAC,cAAc,QAAQ,GAAG;AAAA,EAC1B,CAAC,cAAc,MAAM,GAAG;AAAA,EACxB,CAAC,cAAc,MAAM,GAAG;AAAA,EACxB,CAAC,cAAc,OAAO,GAAG;AAAA;AARtB,IAAM,aAAN;"}
|
|
1
|
+
{"version":3,"file":"standards-sdk.es75.js","sources":["../../src/hcs-2/client.ts"],"sourcesContent":["import {\n Client,\n TopicCreateTransaction,\n TopicMessageSubmitTransaction,\n PrivateKey,\n TopicId,\n TransactionReceipt,\n AccountId,\n PublicKey,\n} from '@hashgraph/sdk';\nimport { randomUUID } from 'crypto';\nimport { HCS2BaseClient } from './base-client';\nimport {\n HCS2ClientConfig,\n HCS2Message,\n HCS2Operation,\n HCS2RegistryType,\n TopicRegistrationResponse,\n RegistryOperationResponse,\n TopicRegistry,\n CreateRegistryOptions,\n RegisterEntryOptions,\n UpdateEntryOptions,\n DeleteEntryOptions,\n MigrateTopicOptions,\n QueryRegistryOptions,\n RegistryEntry,\n} from './types';\nimport { NetworkType } from '../utils/types';\nimport {\n NodeOperatorResolver,\n createNodeOperatorContext,\n type NodeOperatorContext,\n} from '../common/node-operator-resolver';\nimport { buildMessageTx } from '../common/tx/tx-utils';\nimport { buildHcs2CreateRegistryTx } from './tx';\nimport { inscribe } from '../inscribe/inscriber';\nimport { InscriptionSDK } from '@kiloscribe/inscription-sdk';\nimport { getTopicId } from '../utils/topic-id-utils';\n\n/** Maximum message payload size before overflow inscription is triggered. */\nconst MAX_PAYLOAD_BYTES = 1024;\n\n/** Regex that matches an HCS-1 HRL like \"hcs://1/0.0.12345\". */\nconst HCS1_HRL_PATTERN = /^hcs:\\/\\/1\\/(\\d+\\.\\d+\\.\\d+)$/;\n\n/**\n * SDK client configuration for HCS-2\n */\nexport interface SDKHCS2ClientConfig extends HCS2ClientConfig {\n operatorId: string | AccountId;\n operatorKey: string | PrivateKey;\n keyType?: 'ed25519' | 'ecdsa';\n client?: Client;\n}\n\n/**\n * SDK client for HCS-2 operations\n */\nexport class HCS2Client extends HCS2BaseClient {\n private static readonly operationAnalyticsCode: Record<\n HCS2Operation,\n number\n > = {\n [HCS2Operation.REGISTER]: 0,\n [HCS2Operation.UPDATE]: 1,\n [HCS2Operation.DELETE]: 2,\n [HCS2Operation.MIGRATE]: 3,\n };\n\n private client: Client;\n private operatorId: AccountId;\n private operatorCtx: NodeOperatorContext;\n private readonly registryTypeCache = new Map<string, HCS2RegistryType>();\n private inscriptionSDK?: InscriptionSDK;\n\n /**\n * Create a new HCS-2 client\n * @param config Client configuration\n */\n constructor(config: SDKHCS2ClientConfig) {\n super({\n network: config.network,\n logLevel: config.logLevel,\n silent: config.silent,\n mirrorNodeUrl: config.mirrorNodeUrl,\n logger: config.logger,\n });\n\n this.operatorId =\n typeof config.operatorId === 'string'\n ? AccountId.fromString(config.operatorId)\n : config.operatorId;\n\n this.operatorCtx = createNodeOperatorContext({\n network: this.network,\n operatorId: this.operatorId,\n operatorKey: config.operatorKey,\n keyType: config.keyType,\n mirrorNode: this.mirrorNode,\n logger: this.logger,\n client: config.client ?? this.createClient(config.network),\n });\n this.client = this.operatorCtx.client;\n }\n\n /**\n * Initialize the Hedera client with operator information\n */\n private async ensureInitialized(): Promise<void> {\n await this.operatorCtx.ensureInitialized();\n }\n\n /**\n * Create a Hedera client for the specified network\n * @param network The network to connect to\n * @returns The Hedera client\n */\n private createClient(network: NetworkType): Client {\n if (network === 'mainnet') {\n return Client.forMainnet();\n } else {\n return Client.forTestnet();\n }\n }\n\n /**\n * Create a new registry topic\n * @param options Registry creation options\n * @returns Promise resolving to the transaction result\n */\n async createRegistry(\n options: CreateRegistryOptions = {},\n ): Promise<TopicRegistrationResponse> {\n try {\n await this.ensureInitialized();\n const registryType = options.registryType ?? HCS2RegistryType.INDEXED;\n const ttl = options.ttl ?? 86400; // Default TTL: 24 hours\n\n const memo = this.generateRegistryMemo(registryType, ttl);\n\n let adminKeyPrivate: PrivateKey | undefined;\n let adminPublicKey: PublicKey | undefined;\n if (options.adminKey) {\n if (typeof options.adminKey === 'string') {\n try {\n adminPublicKey = PublicKey.fromString(options.adminKey);\n } catch {\n const keyBytes = Buffer.from(\n options.adminKey.replace(/^0x/i, ''),\n 'hex',\n );\n adminPublicKey =\n this.operatorCtx.keyType === 'ed25519'\n ? PublicKey.fromBytesED25519(keyBytes)\n : PublicKey.fromBytesECDSA(keyBytes);\n }\n } else if (typeof options.adminKey === 'boolean') {\n adminPublicKey = this.operatorCtx.operatorKey.publicKey;\n } else {\n adminPublicKey = options.adminKey.publicKey;\n adminKeyPrivate = options.adminKey;\n }\n }\n\n let submitKeyPrivate: PrivateKey | undefined;\n let submitPublicKey: PublicKey | undefined;\n if (options.submitKey) {\n if (typeof options.submitKey === 'string') {\n try {\n submitPublicKey = PublicKey.fromString(options.submitKey);\n } catch {\n const keyBytes = Buffer.from(\n options.submitKey.replace(/^0x/i, ''),\n 'hex',\n );\n submitPublicKey =\n this.operatorCtx.keyType === 'ed25519'\n ? PublicKey.fromBytesED25519(keyBytes)\n : PublicKey.fromBytesECDSA(keyBytes);\n }\n } else if (typeof options.submitKey === 'boolean') {\n submitPublicKey = this.operatorCtx.operatorKey.publicKey;\n } else {\n submitPublicKey = options.submitKey.publicKey;\n submitKeyPrivate = options.submitKey;\n }\n }\n\n const transaction = buildHcs2CreateRegistryTx({\n registryType,\n ttl,\n adminKey: adminPublicKey,\n submitKey: submitPublicKey,\n operatorPublicKey: this.operatorCtx.operatorKey.publicKey,\n });\n\n const frozenTx = await transaction.freezeWith(this.client);\n\n if (adminKeyPrivate) {\n await frozenTx.sign(adminKeyPrivate);\n }\n\n if (submitKeyPrivate) {\n await frozenTx.sign(submitKeyPrivate);\n }\n\n const txResponse = await frozenTx.execute(this.client);\n\n const receipt = await txResponse.getReceipt(this.client);\n const topicId = receipt.topicId;\n\n if (!topicId) {\n throw new Error('Failed to create registry: No topic ID in receipt');\n }\n\n const topicIdStr = topicId.toString();\n this.registryTypeCache.set(topicIdStr, registryType);\n\n this.logger.info(\n `Created registry topic: ${topicIdStr} (${registryType === HCS2RegistryType.INDEXED ? 'Indexed' : 'Non-indexed'}, TTL: ${ttl}s)`,\n );\n\n return {\n success: true,\n topicId: topicIdStr,\n transactionId: txResponse.transactionId.toString(),\n };\n } catch (error) {\n this.logger.error(`Failed to create registry: ${error}`);\n return {\n success: false,\n error: `Failed to create registry: ${error}`,\n };\n }\n }\n\n /**\n * Register a new entry in the registry\n * @param registryTopicId The topic ID of the registry\n * @param options Registration options\n * @param protocol Optional protocol version (defaults to 'hcs-2')\n * @returns Promise resolving to the operation result\n */\n async registerEntry(\n registryTopicId: string,\n options: RegisterEntryOptions,\n protocol: string = 'hcs-2',\n ): Promise<RegistryOperationResponse> {\n try {\n await this.ensureInitialized();\n const message = this.createRegisterMessage(\n options.targetTopicId,\n options.metadata,\n options.memo,\n protocol,\n );\n\n const registryType =\n options.registryType ??\n (await this.resolveRegistryType(registryTopicId));\n this.registryTypeCache.set(registryTopicId, registryType);\n const analyticsMemo =\n options.analyticsMemo ??\n this.buildAnalyticsMemo(HCS2Operation.REGISTER, registryType);\n\n const receipt = await this.submitMessage(\n registryTopicId,\n message,\n analyticsMemo,\n );\n\n this.logger.info(\n `Registered entry in registry ${registryTopicId} pointing to topic ${options.targetTopicId} using protocol ${protocol}`,\n );\n\n return {\n success: true,\n receipt,\n sequenceNumber: receipt.topicSequenceNumber?.low ?? undefined,\n };\n } catch (error) {\n this.logger.error(`Failed to register entry: ${error}`);\n return {\n success: false,\n error: `Failed to register entry: ${error}`,\n };\n }\n }\n\n /**\n * Update an existing entry in the registry (indexed registries only)\n * @param registryTopicId The topic ID of the registry\n * @param options Update options\n * @returns Promise resolving to the operation result\n */\n async updateEntry(\n registryTopicId: string,\n options: UpdateEntryOptions,\n ): Promise<RegistryOperationResponse> {\n try {\n await this.ensureInitialized();\n const registryInfo = await this.mirrorNode.getTopicInfo(registryTopicId);\n const memoInfo = this.parseRegistryTypeFromMemo(registryInfo.memo);\n\n if (!memoInfo || memoInfo.registryType !== HCS2RegistryType.INDEXED) {\n throw new Error(\n 'Update operation is only valid for indexed registries',\n );\n }\n\n const message = this.createUpdateMessage(\n options.targetTopicId,\n options.uid,\n options.metadata,\n options.memo,\n );\n\n const registryType =\n options.registryType ??\n (await this.resolveRegistryType(registryTopicId));\n this.registryTypeCache.set(registryTopicId, registryType);\n const analyticsMemo =\n options.analyticsMemo ??\n this.buildAnalyticsMemo(HCS2Operation.UPDATE, registryType);\n\n const receipt = await this.submitMessage(\n registryTopicId,\n message,\n analyticsMemo,\n );\n\n this.logger.info(\n `Updated entry with UID ${options.uid} in registry ${registryTopicId}`,\n );\n\n return {\n success: true,\n receipt,\n sequenceNumber: receipt.topicSequenceNumber?.low ?? undefined,\n };\n } catch (error) {\n this.logger.error(`Failed to update entry: ${error}`);\n throw error;\n }\n }\n\n /**\n * Delete an entry from the registry (indexed registries only)\n * @param registryTopicId The topic ID of the registry\n * @param options Delete options\n * @returns Promise resolving to the operation result\n */\n async deleteEntry(\n registryTopicId: string,\n options: DeleteEntryOptions,\n ): Promise<RegistryOperationResponse> {\n try {\n await this.ensureInitialized();\n const registryInfo = await this.mirrorNode.getTopicInfo(registryTopicId);\n const memoInfo = this.parseRegistryTypeFromMemo(registryInfo.memo);\n\n if (!memoInfo || memoInfo.registryType !== HCS2RegistryType.INDEXED) {\n throw new Error(\n 'Delete operation is only valid for indexed registries',\n );\n }\n\n const message = this.createDeleteMessage(options.uid, options.memo);\n\n const registryType =\n options.registryType ??\n (await this.resolveRegistryType(registryTopicId));\n this.registryTypeCache.set(registryTopicId, registryType);\n const analyticsMemo =\n options.analyticsMemo ??\n this.buildAnalyticsMemo(HCS2Operation.DELETE, registryType);\n\n const receipt = await this.submitMessage(\n registryTopicId,\n message,\n analyticsMemo,\n );\n\n this.logger.info(\n `Deleted entry with UID ${options.uid} from registry ${registryTopicId}`,\n );\n\n return {\n success: true,\n receipt,\n sequenceNumber: receipt.topicSequenceNumber?.low ?? undefined,\n };\n } catch (error) {\n this.logger.error(`Failed to delete entry: ${error}`);\n throw error;\n }\n }\n\n /**\n * Migrate a registry to a new topic\n * @param registryTopicId The topic ID of the registry\n * @param options Migration options\n * @returns Promise resolving to the operation result\n */\n async migrateRegistry(\n registryTopicId: string,\n options: MigrateTopicOptions,\n ): Promise<RegistryOperationResponse> {\n try {\n await this.ensureInitialized();\n const message = this.createMigrateMessage(\n options.targetTopicId,\n options.metadata,\n options.memo,\n );\n\n const registryType =\n options.registryType ??\n (await this.resolveRegistryType(registryTopicId));\n this.registryTypeCache.set(registryTopicId, registryType);\n const analyticsMemo =\n options.analyticsMemo ??\n this.buildAnalyticsMemo(HCS2Operation.MIGRATE, registryType);\n\n const receipt = await this.submitMessage(\n registryTopicId,\n message,\n analyticsMemo,\n );\n\n this.logger.info(\n `Migrated registry ${registryTopicId} to ${options.targetTopicId}`,\n );\n\n return {\n success: true,\n receipt,\n sequenceNumber: receipt.topicSequenceNumber?.low ?? undefined,\n };\n } catch (error) {\n this.logger.error(`Failed to migrate registry: ${error}`);\n throw error;\n }\n }\n\n /**\n * Get all entries from a registry\n * @param topicId The topic ID of the registry\n * @param options Query options\n * @returns Promise resolving to the registry information\n */\n async getRegistry(\n topicId: string,\n options: QueryRegistryOptions = {},\n ): Promise<TopicRegistry> {\n try {\n await this.ensureInitialized();\n const topicInfo = await this.mirrorNode.getTopicInfo(topicId);\n this.logger.debug(\n `Retrieved topic info for ${topicId}: ${JSON.stringify(topicInfo)}`,\n );\n\n const memoInfo = this.parseRegistryTypeFromMemo(topicInfo.memo);\n\n if (!memoInfo) {\n throw new Error(\n `Topic ${topicId} is not an HCS-2 registry (invalid memo format)`,\n );\n }\n\n this.logger.debug(\n `Retrieving messages for topic ${topicId} with limit ${options.limit ?? 100}`,\n );\n const rawMessagesResult = (await this.mirrorNode.getTopicMessages(\n topicId,\n {\n sequenceNumber:\n options.skip && options.skip > 0 ? `gt:${options.skip}` : undefined,\n limit: options.limit ?? 100,\n order: options.order ?? 'asc',\n },\n )) as any[];\n\n const rawMessages = options.limit\n ? rawMessagesResult.slice(0, options.limit)\n : rawMessagesResult;\n\n this.logger.debug(\n `Retrieved ${rawMessagesResult.length} messages, using ${rawMessages.length} after applying limit.`,\n );\n\n const entries: RegistryEntry[] = [];\n let latestEntry: RegistryEntry | undefined;\n\n for (const msg of rawMessages) {\n try {\n let message: HCS2Message;\n\n // Build the message from the raw mirror node data\n message = {\n p: msg.p || 'hcs-2',\n op: msg.op,\n t_id: msg.t_id,\n uid: msg.uid,\n metadata: msg.metadata,\n m: msg.m,\n } as HCS2Message;\n\n // Check if metadata is an HCS-1 HRL (overflow reference)\n if (\n options.resolveOverflow &&\n typeof msg.metadata === 'string' &&\n HCS1_HRL_PATTERN.test(msg.metadata)\n ) {\n const hrlMatch = msg.metadata.match(HCS1_HRL_PATTERN);\n if (hrlMatch) {\n const refTopicId = hrlMatch[1];\n try {\n const refMessages =\n await this.mirrorNode.getTopicMessages(refTopicId);\n if (refMessages.length > 0) {\n const resolvedMsg = refMessages[0] as Record<string, unknown>;\n message = {\n p: (resolvedMsg.p as string) || 'hcs-2',\n op: resolvedMsg.op as HCS2Message['op'],\n t_id: resolvedMsg.t_id as string | undefined,\n uid: resolvedMsg.uid as string | undefined,\n metadata: resolvedMsg.metadata as string | undefined,\n m: resolvedMsg.m as string | undefined,\n } as HCS2Message;\n }\n } catch (resolveErr) {\n this.logger.warn(\n `Failed to resolve overflow ${msg.metadata}: ${resolveErr}`,\n );\n }\n }\n }\n\n const { valid, errors } = this.validateMessage(message);\n if (!valid) {\n this.logger.warn(`Invalid HCS-2 message: ${errors.join(', ')}`);\n continue;\n }\n\n const entry: RegistryEntry = {\n topicId,\n sequence: msg.sequence_number,\n timestamp: msg.consensus_timestamp,\n payer: msg.payer_account_id || msg.payer || '',\n message,\n consensus_timestamp: msg.consensus_timestamp,\n registry_type: memoInfo.registryType,\n };\n\n entries.push(entry);\n\n if (\n memoInfo.registryType === HCS2RegistryType.NON_INDEXED ||\n !latestEntry ||\n entry.timestamp > latestEntry.timestamp\n ) {\n latestEntry = entry;\n }\n } catch (error) {\n this.logger.warn(`Error processing message: ${error}`);\n }\n }\n\n this.logger.debug(\n `Processed ${entries.length} valid entries for registry ${topicId}`,\n );\n\n const registry: TopicRegistry = {\n topicId,\n registryType: memoInfo.registryType,\n ttl: memoInfo.ttl,\n entries:\n memoInfo.registryType === HCS2RegistryType.INDEXED\n ? entries\n : latestEntry\n ? [latestEntry]\n : [],\n latestEntry,\n };\n\n return registry;\n } catch (error) {\n this.logger.error(`Failed to get registry: ${error}`);\n throw error;\n }\n }\n\n private buildAnalyticsMemo(\n operation: HCS2Operation,\n registryType: HCS2RegistryType,\n ): string {\n const opCode = HCS2Client.operationAnalyticsCode[operation];\n return `hcs-2:op:${opCode}:${registryType}`;\n }\n\n private async resolveRegistryType(\n topicId: string,\n ): Promise<HCS2RegistryType> {\n const cached = this.registryTypeCache.get(topicId);\n if (cached !== undefined) {\n return cached;\n }\n\n const topicInfo = await this.mirrorNode.getTopicInfo(topicId);\n const memoInfo = this.parseRegistryTypeFromMemo(topicInfo.memo);\n if (!memoInfo) {\n throw new Error(\n `Topic ${topicId} is not an HCS-2 registry (invalid memo format)`,\n );\n }\n\n this.registryTypeCache.set(topicId, memoInfo.registryType);\n return memoInfo.registryType;\n }\n\n /**\n * Submit a message to a topic.\n * If the serialized payload exceeds 1024 bytes, the full message is\n * inscribed via HCS-1 (using the Inscriber) and a compact overflow\n * wrapper containing the HRL reference + SHA-256 digest is submitted\n * instead.\n * @param topicId The topic ID to submit to\n * @param payload The message payload\n * @param analyticsMemo Optional analytics memo for the transaction\n * @returns Promise resolving to the transaction receipt\n */\n async submitMessage(\n topicId: string,\n payload: HCS2Message,\n analyticsMemo?: string,\n ): Promise<TransactionReceipt> {\n try {\n await this.ensureInitialized();\n const { valid, errors } = this.validateMessage(payload);\n if (!valid) {\n throw new Error(`Invalid HCS-2 message: ${errors.join(', ')}`);\n }\n\n let messageString = JSON.stringify(payload);\n\n // Overflow: inscribe via HCS-1 when payload exceeds MAX_PAYLOAD_BYTES\n if (Buffer.byteLength(messageString, 'utf8') > MAX_PAYLOAD_BYTES) {\n this.logger.info(\n `HCS-2 payload exceeds ${MAX_PAYLOAD_BYTES} bytes, inscribing via HCS-1`,\n );\n\n const contentBuffer = Buffer.from(messageString, 'utf8');\n const fileName = `hcs2-overflow-${randomUUID()}.json`;\n\n if (this.network !== 'testnet' && this.network !== 'mainnet') {\n throw new Error(\n `Overflow inscription is only supported on testnet and mainnet, but network is ${this.network}`,\n );\n }\n\n const authOptions = {\n accountId: this.operatorId.toString(),\n privateKey: this.operatorCtx.operatorKey,\n network: this.network as 'testnet' | 'mainnet',\n };\n\n if (!this.inscriptionSDK) {\n this.inscriptionSDK = await InscriptionSDK.createWithAuth({\n type: 'server',\n ...authOptions,\n });\n }\n\n const inscriptionResult = await inscribe(\n {\n type: 'buffer',\n buffer: contentBuffer,\n fileName,\n mimeType: 'application/json',\n },\n authOptions,\n {\n mode: 'file' as const,\n waitForConfirmation: true,\n waitMaxAttempts: 30,\n waitIntervalMs: 4000,\n },\n this.inscriptionSDK,\n );\n\n const inscriptionTopicId = getTopicId(inscriptionResult?.inscription);\n if (!inscriptionTopicId) {\n throw new Error(\n 'Failed to inscribe overflow HCS-2 payload: no topic ID returned',\n );\n }\n\n const hrl = `hcs://1/${inscriptionTopicId}`;\n\n // Build a standard HCS-2 message with metadata set to the HRL\n const overflowMessage: HCS2Message = {\n ...payload,\n metadata: hrl,\n } as HCS2Message;\n\n this.logger.info(\n `HCS-2 payload inscribed to ${hrl}, submitting overflow wrapper`,\n );\n messageString = JSON.stringify(overflowMessage);\n }\n\n const transaction = buildMessageTx({\n topicId,\n message: messageString,\n transactionMemo: analyticsMemo,\n });\n\n const txResponse = await transaction.execute(this.client);\n\n const receipt = await txResponse.getReceipt(this.client);\n\n return receipt;\n } catch (error) {\n this.logger.error(`Failed to submit message: ${error}`);\n throw error;\n }\n }\n\n /**\n * @param topicId The topic ID to query\n * @returns Promise resolving to the topic information\n */\n public async getTopicInfo(topicId: string): Promise<any> {\n return this.mirrorNode.getTopicInfo(topicId);\n }\n\n /**\n * Close the client and release resources\n */\n public close(): void {\n this.logger.info('HCS-2 client closed.');\n }\n\n /**\n * Get the configured key type (ed25519 or ecdsa)\n */\n public getKeyType(): 'ed25519' | 'ecdsa' {\n return this.operatorCtx.keyType;\n }\n\n /**\n * Get the configured operator private key\n */\n public getOperatorKey(): PrivateKey {\n return this.operatorCtx.operatorKey;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standards-sdk.es79.js","sources":["../../src/hcs-20/types.ts"],"sourcesContent":["/**\n * HCS-20 Auditable Points Standard Types\n */\n\nimport { z } from 'zod';\nimport { AccountId, TopicId, PrivateKey } from '@hashgraph/sdk';\nimport type { ILogger } from '../utils/logger';\n\n/**\n * HCS-20 Constants\n */\nexport const HCS20_CONSTANTS = {\n PROTOCOL: 'hcs-20',\n PUBLIC_TOPIC_ID: '0.0.4350190',\n REGISTRY_TOPIC_ID: '0.0.4362300',\n MAX_NUMBER_LENGTH: 18,\n MAX_NAME_LENGTH: 100,\n MAX_METADATA_LENGTH: 100,\n HEDERA_ACCOUNT_REGEX:\n /^(0|(?:[1-9]\\d*))\\.(0|(?:[1-9]\\d*))\\.(0|(?:[1-9]\\d*))$/,\n} as const;\n\n/**\n * Hedera Account ID validator\n */\nconst HederaAccountIdSchema = z\n .string()\n .regex(\n HCS20_CONSTANTS.HEDERA_ACCOUNT_REGEX,\n 'Invalid Hedera account ID format',\n );\n\n/**\n * Number string validator\n */\nconst NumberStringSchema = z\n .string()\n .regex(/^\\d+$/, 'Must be a valid number')\n .max(\n HCS20_CONSTANTS.MAX_NUMBER_LENGTH,\n `Max ${HCS20_CONSTANTS.MAX_NUMBER_LENGTH} digits`,\n );\n\n/**\n * Tick validator\n */\nconst TickSchema = z\n .string()\n .min(1, 'Tick cannot be empty')\n .transform(val => val.toLowerCase().trim());\n\n/**\n * Base HCS-20 Message Schema\n */\nconst HCS20BaseMessageSchema = z.object({\n p: z.literal('hcs-20'),\n m: z.string().optional(),\n});\n\n/**\n * Deploy Points Operation Schema\n */\nexport const HCS20DeployMessageSchema = HCS20BaseMessageSchema.extend({\n op: z.literal('deploy'),\n name: z.string().min(1).max(HCS20_CONSTANTS.MAX_NAME_LENGTH),\n tick: TickSchema,\n max: NumberStringSchema,\n lim: NumberStringSchema.optional(),\n metadata: z.string().max(HCS20_CONSTANTS.MAX_METADATA_LENGTH).optional(),\n});\n\n/**\n * Mint Points Operation Schema\n */\nexport const HCS20MintMessageSchema = HCS20BaseMessageSchema.extend({\n op: z.literal('mint'),\n tick: TickSchema,\n amt: NumberStringSchema,\n to: HederaAccountIdSchema,\n});\n\n/**\n * Burn Points Operation Schema\n */\nexport const HCS20BurnMessageSchema = HCS20BaseMessageSchema.extend({\n op: z.literal('burn'),\n tick: TickSchema,\n amt: NumberStringSchema,\n from: HederaAccountIdSchema,\n});\n\n/**\n * Transfer Points Operation Schema\n */\nexport const HCS20TransferMessageSchema = HCS20BaseMessageSchema.extend({\n op: z.literal('transfer'),\n tick: TickSchema,\n amt: NumberStringSchema,\n from: HederaAccountIdSchema,\n to: HederaAccountIdSchema,\n});\n\n/**\n * Register Topic Operation Schema\n */\nexport const HCS20RegisterMessageSchema = HCS20BaseMessageSchema.extend({\n op: z.literal('register'),\n name: z.string().min(1).max(HCS20_CONSTANTS.MAX_NAME_LENGTH),\n metadata: z.string().max(HCS20_CONSTANTS.MAX_METADATA_LENGTH).optional(),\n private: z.boolean(),\n t_id: HederaAccountIdSchema,\n});\n\n/**\n * Union schema for all HCS-20 messages\n */\nexport const HCS20MessageSchema = z.discriminatedUnion('op', [\n HCS20DeployMessageSchema,\n HCS20MintMessageSchema,\n HCS20BurnMessageSchema,\n HCS20TransferMessageSchema,\n HCS20RegisterMessageSchema,\n]);\n\n/**\n * Inferred types from schemas\n */\nexport type HCS20BaseMessage = z.infer<typeof HCS20BaseMessageSchema>;\nexport type HCS20DeployMessage = z.infer<typeof HCS20DeployMessageSchema>;\nexport type HCS20MintMessage = z.infer<typeof HCS20MintMessageSchema>;\nexport type HCS20BurnMessage = z.infer<typeof HCS20BurnMessageSchema>;\nexport type HCS20TransferMessage = z.infer<typeof HCS20TransferMessageSchema>;\nexport type HCS20RegisterMessage = z.infer<typeof HCS20RegisterMessageSchema>;\nexport type HCS20Message = z.infer<typeof HCS20MessageSchema>;\nexport type HCS20Operation = HCS20Message['op'];\n\n/**\n * Points Configuration\n */\nexport interface PointsConfig {\n name: string;\n tick: string;\n maxSupply: string;\n limitPerMint?: string;\n metadata?: string;\n}\n\n/**\n * Points Information\n */\nexport interface PointsInfo extends PointsConfig {\n topicId: string;\n deployerAccountId: string;\n currentSupply: string;\n deploymentTimestamp: string;\n isPrivate: boolean;\n}\n\n/**\n * Points Balance\n */\nexport interface PointsBalance {\n tick: string;\n accountId: string;\n balance: string;\n lastUpdated: string;\n}\n\n/**\n * Points Transaction\n */\nexport interface PointsTransaction {\n id: string;\n operation: HCS20Operation;\n tick: string;\n amount?: string;\n from?: string;\n to?: string;\n timestamp: string;\n sequenceNumber: number;\n topicId: string;\n transactionId: string;\n memo?: string;\n}\n\n/**\n * HCS-20 Client Configuration\n */\nexport interface HCS20ClientConfig {\n mirrorNodeUrl?: string;\n logger?: ILogger;\n network?: 'mainnet' | 'testnet';\n registryTopicId?: string;\n publicTopicId?: string;\n}\n\n/**\n * Browser-specific HCS-20 Client Configuration\n */\nexport interface BrowserHCS20ClientConfig extends HCS20ClientConfig {\n walletConnectProjectId?: string;\n hwcMetadata?: {\n name: string;\n description: string;\n icons: string[];\n url: string;\n };\n}\n\n/**\n * SDK-specific HCS-20 Client Configuration\n */\nexport interface SDKHCS20ClientConfig extends HCS20ClientConfig {\n operatorId: string | AccountId;\n operatorKey: string | PrivateKey;\n keyType?: 'ed25519' | 'ecdsa';\n}\n\n/**\n * Deploy Points Progress\n */\nexport interface DeployPointsProgress {\n stage: 'creating-topic' | 'submitting-deploy' | 'confirming' | 'complete';\n percentage: number;\n topicId?: string;\n deployTxId?: string;\n error?: string;\n}\n\n/**\n * Deploy Points Options\n */\nexport interface DeployPointsOptions extends PointsConfig {\n usePrivateTopic?: boolean;\n topicMemo?: string;\n progressCallback?: (data: DeployPointsProgress) => void;\n}\n\n/**\n * Mint Points Progress\n */\nexport interface MintPointsProgress {\n stage: 'validating' | 'submitting' | 'confirming' | 'complete';\n percentage: number;\n mintTxId?: string;\n error?: string;\n}\n\n/**\n * Mint Points Options\n */\nexport interface MintPointsOptions {\n tick: string;\n amount: string;\n to: string | AccountId;\n memo?: string;\n topicId?: string | TopicId;\n progressCallback?: (data: MintPointsProgress) => void;\n disableMirrorCheck?: boolean;\n}\n\n/**\n * Transfer Points Progress\n */\nexport interface TransferPointsProgress {\n stage: 'validating-balance' | 'submitting' | 'confirming' | 'complete';\n percentage: number;\n transferTxId?: string;\n error?: string;\n}\n\n/**\n * Transfer Points Options\n */\nexport interface TransferPointsOptions {\n tick: string;\n amount: string;\n from: string | AccountId;\n to: string | AccountId;\n memo?: string;\n topicId?: string | TopicId;\n progressCallback?: (data: TransferPointsProgress) => void;\n}\n\n/**\n * Burn Points Progress\n */\nexport interface BurnPointsProgress {\n stage: 'validating-balance' | 'submitting' | 'confirming' | 'complete';\n percentage: number;\n burnTxId?: string;\n error?: string;\n}\n\n/**\n * Burn Points Options\n */\nexport interface BurnPointsOptions {\n tick: string;\n amount: string;\n from: string | AccountId;\n memo?: string;\n topicId?: string | TopicId;\n progressCallback?: (data: BurnPointsProgress) => void;\n}\n\n/**\n * Register Topic Progress\n */\nexport interface RegisterTopicProgress {\n stage: 'validating' | 'submitting' | 'confirming' | 'complete';\n percentage: number;\n registerTxId?: string;\n error?: string;\n}\n\n/**\n * Register Topic Options\n */\nexport interface RegisterTopicOptions {\n topicId: string | TopicId;\n name: string;\n metadata?: string;\n isPrivate: boolean;\n memo?: string;\n progressCallback?: (data: RegisterTopicProgress) => void;\n}\n\n/**\n * Query Points Options\n */\nexport interface QueryPointsOptions {\n tick?: string;\n accountId?: string | AccountId;\n topicId?: string | TopicId;\n limit?: number;\n order?: 'asc' | 'desc';\n}\n\n/**\n * Points Query Result\n */\nexport interface PointsQueryResult {\n points: PointsInfo[];\n balances?: PointsBalance[];\n transactions?: PointsTransaction[];\n totalCount: number;\n hasMore: boolean;\n nextCursor?: string;\n}\n\n/**\n * Points State\n */\nexport interface PointsState {\n deployedPoints: Map<string, PointsInfo>;\n balances: Map<string, Map<string, PointsBalance>>;\n transactions: PointsTransaction[];\n lastProcessedSequence: number;\n lastProcessedTimestamp: string;\n}\n\n/**\n * HCS-20 Registry Entry\n */\nexport interface HCS20RegistryEntry {\n name: string;\n topicId: string;\n metadata?: string;\n isPrivate: boolean;\n registeredAt: string;\n registeredBy: string;\n}\n"],"names":[],"mappings":";AAWO,MAAM,kBAAkB;AAAA,EAC7B,UAAU;AAAA,EACV,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,qBAAqB;AAAA,EACrB,sBACE;AACJ;AAKA,MAAM,wBAAwB,EAC3B,OAAA,EACA;AAAA,EACC,gBAAgB;AAAA,EAChB;AACF;AAKF,MAAM,qBAAqB,EACxB,OAAA,EACA,MAAM,SAAS,wBAAwB,EACvC;AAAA,EACC,gBAAgB;AAAA,EAChB,OAAO,gBAAgB,iBAAiB;AAC1C;AAKF,MAAM,aAAa,EAChB,OAAA,EACA,IAAI,GAAG,sBAAsB,EAC7B,UAAU,CAAA,QAAO,IAAI,YAAA,EAAc,MAAM;AAK5C,MAAM,yBAAyB,EAAE,OAAO;AAAA,EACtC,GAAG,EAAE,QAAQ,QAAQ;AAAA,EACrB,GAAG,EAAE,OAAA,EAAS,SAAA;AAChB,CAAC;AAKM,MAAM,2BAA2B,uBAAuB,OAAO;AAAA,EACpE,IAAI,EAAE,QAAQ,QAAQ;AAAA,EACtB,MAAM,EAAE,SAAS,IAAI,CAAC,EAAE,IAAI,gBAAgB,eAAe;AAAA,EAC3D,MAAM;AAAA,EACN,KAAK;AAAA,EACL,KAAK,mBAAmB,SAAA;AAAA,EACxB,UAAU,EAAE,OAAA,EAAS,IAAI,gBAAgB,mBAAmB,EAAE,SAAA;AAChE,CAAC;AAKM,MAAM,yBAAyB,uBAAuB,OAAO;AAAA,EAClE,IAAI,EAAE,QAAQ,MAAM;AAAA,EACpB,MAAM;AAAA,EACN,KAAK;AAAA,EACL,IAAI;AACN,CAAC;AAKM,MAAM,yBAAyB,uBAAuB,OAAO;AAAA,EAClE,IAAI,EAAE,QAAQ,MAAM;AAAA,EACpB,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AACR,CAAC;AAKM,MAAM,6BAA6B,uBAAuB,OAAO;AAAA,EACtE,IAAI,EAAE,QAAQ,UAAU;AAAA,EACxB,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,IAAI;AACN,CAAC;AAKM,MAAM,6BAA6B,uBAAuB,OAAO;AAAA,EACtE,IAAI,EAAE,QAAQ,UAAU;AAAA,EACxB,MAAM,EAAE,SAAS,IAAI,CAAC,EAAE,IAAI,gBAAgB,eAAe;AAAA,EAC3D,UAAU,EAAE,OAAA,EAAS,IAAI,gBAAgB,mBAAmB,EAAE,SAAA;AAAA,EAC9D,SAAS,EAAE,QAAA;AAAA,EACX,MAAM;AACR,CAAC;AAKM,MAAM,qBAAqB,EAAE,mBAAmB,MAAM;AAAA,EAC3D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;"}
|
|
1
|
+
{"version":3,"file":"standards-sdk.es79.js","sources":["../../src/hcs-20/types.ts"],"sourcesContent":["/**\n * HCS-20 Auditable Points Standard Types\n */\n\nimport { z } from 'zod';\nimport { AccountId, Client, TopicId, PrivateKey } from '@hashgraph/sdk';\nimport type { ILogger } from '../utils/logger';\n\n/**\n * HCS-20 Constants\n */\nexport const HCS20_CONSTANTS = {\n PROTOCOL: 'hcs-20',\n PUBLIC_TOPIC_ID: '0.0.4350190',\n REGISTRY_TOPIC_ID: '0.0.4362300',\n MAX_NUMBER_LENGTH: 18,\n MAX_NAME_LENGTH: 100,\n MAX_METADATA_LENGTH: 100,\n HEDERA_ACCOUNT_REGEX:\n /^(0|(?:[1-9]\\d*))\\.(0|(?:[1-9]\\d*))\\.(0|(?:[1-9]\\d*))$/,\n} as const;\n\n/**\n * Hedera Account ID validator\n */\nconst HederaAccountIdSchema = z\n .string()\n .regex(\n HCS20_CONSTANTS.HEDERA_ACCOUNT_REGEX,\n 'Invalid Hedera account ID format',\n );\n\n/**\n * Number string validator\n */\nconst NumberStringSchema = z\n .string()\n .regex(/^\\d+$/, 'Must be a valid number')\n .max(\n HCS20_CONSTANTS.MAX_NUMBER_LENGTH,\n `Max ${HCS20_CONSTANTS.MAX_NUMBER_LENGTH} digits`,\n );\n\n/**\n * Tick validator\n */\nconst TickSchema = z\n .string()\n .min(1, 'Tick cannot be empty')\n .transform(val => val.toLowerCase().trim());\n\n/**\n * Base HCS-20 Message Schema\n */\nconst HCS20BaseMessageSchema = z.object({\n p: z.literal('hcs-20'),\n m: z.string().optional(),\n});\n\n/**\n * Deploy Points Operation Schema\n */\nexport const HCS20DeployMessageSchema = HCS20BaseMessageSchema.extend({\n op: z.literal('deploy'),\n name: z.string().min(1).max(HCS20_CONSTANTS.MAX_NAME_LENGTH),\n tick: TickSchema,\n max: NumberStringSchema,\n lim: NumberStringSchema.optional(),\n metadata: z.string().max(HCS20_CONSTANTS.MAX_METADATA_LENGTH).optional(),\n});\n\n/**\n * Mint Points Operation Schema\n */\nexport const HCS20MintMessageSchema = HCS20BaseMessageSchema.extend({\n op: z.literal('mint'),\n tick: TickSchema,\n amt: NumberStringSchema,\n to: HederaAccountIdSchema,\n});\n\n/**\n * Burn Points Operation Schema\n */\nexport const HCS20BurnMessageSchema = HCS20BaseMessageSchema.extend({\n op: z.literal('burn'),\n tick: TickSchema,\n amt: NumberStringSchema,\n from: HederaAccountIdSchema,\n});\n\n/**\n * Transfer Points Operation Schema\n */\nexport const HCS20TransferMessageSchema = HCS20BaseMessageSchema.extend({\n op: z.literal('transfer'),\n tick: TickSchema,\n amt: NumberStringSchema,\n from: HederaAccountIdSchema,\n to: HederaAccountIdSchema,\n});\n\n/**\n * Register Topic Operation Schema\n */\nexport const HCS20RegisterMessageSchema = HCS20BaseMessageSchema.extend({\n op: z.literal('register'),\n name: z.string().min(1).max(HCS20_CONSTANTS.MAX_NAME_LENGTH),\n metadata: z.string().max(HCS20_CONSTANTS.MAX_METADATA_LENGTH).optional(),\n private: z.boolean(),\n t_id: HederaAccountIdSchema,\n});\n\n/**\n * Union schema for all HCS-20 messages\n */\nexport const HCS20MessageSchema = z.discriminatedUnion('op', [\n HCS20DeployMessageSchema,\n HCS20MintMessageSchema,\n HCS20BurnMessageSchema,\n HCS20TransferMessageSchema,\n HCS20RegisterMessageSchema,\n]);\n\n/**\n * Inferred types from schemas\n */\nexport type HCS20BaseMessage = z.infer<typeof HCS20BaseMessageSchema>;\nexport type HCS20DeployMessage = z.infer<typeof HCS20DeployMessageSchema>;\nexport type HCS20MintMessage = z.infer<typeof HCS20MintMessageSchema>;\nexport type HCS20BurnMessage = z.infer<typeof HCS20BurnMessageSchema>;\nexport type HCS20TransferMessage = z.infer<typeof HCS20TransferMessageSchema>;\nexport type HCS20RegisterMessage = z.infer<typeof HCS20RegisterMessageSchema>;\nexport type HCS20Message = z.infer<typeof HCS20MessageSchema>;\nexport type HCS20Operation = HCS20Message['op'];\n\n/**\n * Points Configuration\n */\nexport interface PointsConfig {\n name: string;\n tick: string;\n maxSupply: string;\n limitPerMint?: string;\n metadata?: string;\n}\n\n/**\n * Points Information\n */\nexport interface PointsInfo extends PointsConfig {\n topicId: string;\n deployerAccountId: string;\n currentSupply: string;\n deploymentTimestamp: string;\n isPrivate: boolean;\n}\n\n/**\n * Points Balance\n */\nexport interface PointsBalance {\n tick: string;\n accountId: string;\n balance: string;\n lastUpdated: string;\n}\n\n/**\n * Points Transaction\n */\nexport interface PointsTransaction {\n id: string;\n operation: HCS20Operation;\n tick: string;\n amount?: string;\n from?: string;\n to?: string;\n timestamp: string;\n sequenceNumber: number;\n topicId: string;\n transactionId: string;\n memo?: string;\n}\n\n/**\n * HCS-20 Client Configuration\n */\nexport interface HCS20ClientConfig {\n mirrorNodeUrl?: string;\n logger?: ILogger;\n network?: 'mainnet' | 'testnet';\n registryTopicId?: string;\n publicTopicId?: string;\n}\n\n/**\n * Browser-specific HCS-20 Client Configuration\n */\nexport interface BrowserHCS20ClientConfig extends HCS20ClientConfig {\n walletConnectProjectId?: string;\n hwcMetadata?: {\n name: string;\n description: string;\n icons: string[];\n url: string;\n };\n}\n\n/**\n * SDK-specific HCS-20 Client Configuration\n */\nexport interface SDKHCS20ClientConfig extends HCS20ClientConfig {\n operatorId: string | AccountId;\n operatorKey: string | PrivateKey;\n keyType?: 'ed25519' | 'ecdsa';\n client?: Client;\n}\n\n/**\n * Deploy Points Progress\n */\nexport interface DeployPointsProgress {\n stage: 'creating-topic' | 'submitting-deploy' | 'confirming' | 'complete';\n percentage: number;\n topicId?: string;\n deployTxId?: string;\n error?: string;\n}\n\n/**\n * Deploy Points Options\n */\nexport interface DeployPointsOptions extends PointsConfig {\n usePrivateTopic?: boolean;\n topicMemo?: string;\n progressCallback?: (data: DeployPointsProgress) => void;\n}\n\n/**\n * Mint Points Progress\n */\nexport interface MintPointsProgress {\n stage: 'validating' | 'submitting' | 'confirming' | 'complete';\n percentage: number;\n mintTxId?: string;\n error?: string;\n}\n\n/**\n * Mint Points Options\n */\nexport interface MintPointsOptions {\n tick: string;\n amount: string;\n to: string | AccountId;\n memo?: string;\n topicId?: string | TopicId;\n progressCallback?: (data: MintPointsProgress) => void;\n disableMirrorCheck?: boolean;\n}\n\n/**\n * Transfer Points Progress\n */\nexport interface TransferPointsProgress {\n stage: 'validating-balance' | 'submitting' | 'confirming' | 'complete';\n percentage: number;\n transferTxId?: string;\n error?: string;\n}\n\n/**\n * Transfer Points Options\n */\nexport interface TransferPointsOptions {\n tick: string;\n amount: string;\n from: string | AccountId;\n to: string | AccountId;\n memo?: string;\n topicId?: string | TopicId;\n progressCallback?: (data: TransferPointsProgress) => void;\n}\n\n/**\n * Burn Points Progress\n */\nexport interface BurnPointsProgress {\n stage: 'validating-balance' | 'submitting' | 'confirming' | 'complete';\n percentage: number;\n burnTxId?: string;\n error?: string;\n}\n\n/**\n * Burn Points Options\n */\nexport interface BurnPointsOptions {\n tick: string;\n amount: string;\n from: string | AccountId;\n memo?: string;\n topicId?: string | TopicId;\n progressCallback?: (data: BurnPointsProgress) => void;\n}\n\n/**\n * Register Topic Progress\n */\nexport interface RegisterTopicProgress {\n stage: 'validating' | 'submitting' | 'confirming' | 'complete';\n percentage: number;\n registerTxId?: string;\n error?: string;\n}\n\n/**\n * Register Topic Options\n */\nexport interface RegisterTopicOptions {\n topicId: string | TopicId;\n name: string;\n metadata?: string;\n isPrivate: boolean;\n memo?: string;\n progressCallback?: (data: RegisterTopicProgress) => void;\n}\n\n/**\n * Query Points Options\n */\nexport interface QueryPointsOptions {\n tick?: string;\n accountId?: string | AccountId;\n topicId?: string | TopicId;\n limit?: number;\n order?: 'asc' | 'desc';\n}\n\n/**\n * Points Query Result\n */\nexport interface PointsQueryResult {\n points: PointsInfo[];\n balances?: PointsBalance[];\n transactions?: PointsTransaction[];\n totalCount: number;\n hasMore: boolean;\n nextCursor?: string;\n}\n\n/**\n * Points State\n */\nexport interface PointsState {\n deployedPoints: Map<string, PointsInfo>;\n balances: Map<string, Map<string, PointsBalance>>;\n transactions: PointsTransaction[];\n lastProcessedSequence: number;\n lastProcessedTimestamp: string;\n}\n\n/**\n * HCS-20 Registry Entry\n */\nexport interface HCS20RegistryEntry {\n name: string;\n topicId: string;\n metadata?: string;\n isPrivate: boolean;\n registeredAt: string;\n registeredBy: string;\n}\n"],"names":[],"mappings":";AAWO,MAAM,kBAAkB;AAAA,EAC7B,UAAU;AAAA,EACV,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,qBAAqB;AAAA,EACrB,sBACE;AACJ;AAKA,MAAM,wBAAwB,EAC3B,OAAA,EACA;AAAA,EACC,gBAAgB;AAAA,EAChB;AACF;AAKF,MAAM,qBAAqB,EACxB,OAAA,EACA,MAAM,SAAS,wBAAwB,EACvC;AAAA,EACC,gBAAgB;AAAA,EAChB,OAAO,gBAAgB,iBAAiB;AAC1C;AAKF,MAAM,aAAa,EAChB,OAAA,EACA,IAAI,GAAG,sBAAsB,EAC7B,UAAU,CAAA,QAAO,IAAI,YAAA,EAAc,MAAM;AAK5C,MAAM,yBAAyB,EAAE,OAAO;AAAA,EACtC,GAAG,EAAE,QAAQ,QAAQ;AAAA,EACrB,GAAG,EAAE,OAAA,EAAS,SAAA;AAChB,CAAC;AAKM,MAAM,2BAA2B,uBAAuB,OAAO;AAAA,EACpE,IAAI,EAAE,QAAQ,QAAQ;AAAA,EACtB,MAAM,EAAE,SAAS,IAAI,CAAC,EAAE,IAAI,gBAAgB,eAAe;AAAA,EAC3D,MAAM;AAAA,EACN,KAAK;AAAA,EACL,KAAK,mBAAmB,SAAA;AAAA,EACxB,UAAU,EAAE,OAAA,EAAS,IAAI,gBAAgB,mBAAmB,EAAE,SAAA;AAChE,CAAC;AAKM,MAAM,yBAAyB,uBAAuB,OAAO;AAAA,EAClE,IAAI,EAAE,QAAQ,MAAM;AAAA,EACpB,MAAM;AAAA,EACN,KAAK;AAAA,EACL,IAAI;AACN,CAAC;AAKM,MAAM,yBAAyB,uBAAuB,OAAO;AAAA,EAClE,IAAI,EAAE,QAAQ,MAAM;AAAA,EACpB,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AACR,CAAC;AAKM,MAAM,6BAA6B,uBAAuB,OAAO;AAAA,EACtE,IAAI,EAAE,QAAQ,UAAU;AAAA,EACxB,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,IAAI;AACN,CAAC;AAKM,MAAM,6BAA6B,uBAAuB,OAAO;AAAA,EACtE,IAAI,EAAE,QAAQ,UAAU;AAAA,EACxB,MAAM,EAAE,SAAS,IAAI,CAAC,EAAE,IAAI,gBAAgB,eAAe;AAAA,EAC3D,UAAU,EAAE,OAAA,EAAS,IAAI,gBAAgB,mBAAmB,EAAE,SAAA;AAAA,EAC9D,SAAS,EAAE,QAAA;AAAA,EACX,MAAM;AACR,CAAC;AAKM,MAAM,qBAAqB,EAAE,mBAAmB,MAAM;AAAA,EAC3D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standards-sdk.es8.js","sources":["../../src/hcs-7/types.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"standards-sdk.es8.js","sources":["../../src/hcs-7/types.ts"],"sourcesContent":["import {\n AccountId,\n Client,\n PrivateKey,\n TransactionReceipt,\n} from '@hashgraph/sdk';\nimport { z } from 'zod';\nimport { Logger, LogLevel } from '../utils/logger';\nimport { NetworkType } from '../utils/types';\n\nexport enum HCS7Operation {\n REGISTER_CONFIG = 'register-config',\n REGISTER = 'register',\n}\n\nexport enum HCS7ConfigType {\n EVM = 'evm',\n WASM = 'wasm',\n}\n\nexport type HCS7StateValueType = 'number' | 'string' | 'bool';\n\nexport interface HCS7AbiIO {\n name?: string;\n type: string;\n}\n\nexport interface HCS7AbiDefinition {\n name: string;\n inputs: HCS7AbiIO[];\n outputs: HCS7AbiIO[];\n stateMutability: 'view' | 'pure';\n type: 'function';\n}\n\nexport interface HCS7BaseMessage {\n p: 'hcs-7';\n op: HCS7Operation;\n m?: string;\n}\n\nexport interface HCS7EvmConfigMessage extends HCS7BaseMessage {\n op: HCS7Operation.REGISTER_CONFIG;\n t: HCS7ConfigType.EVM;\n c: {\n contractAddress: string;\n abi: HCS7AbiDefinition;\n };\n}\n\nexport interface HCS7WasmConfigMessage extends HCS7BaseMessage {\n op: HCS7Operation.REGISTER_CONFIG;\n t: HCS7ConfigType.WASM;\n c: {\n wasmTopicId: string;\n inputType: {\n stateData: Record<string, HCS7StateValueType>;\n };\n outputType: {\n type: 'string';\n format: 'topic-id';\n };\n };\n}\n\nexport interface HCS7MetadataRegistrationMessage extends HCS7BaseMessage {\n op: HCS7Operation.REGISTER;\n t_id: string;\n d: {\n weight: number;\n tags: string[];\n [key: string]: unknown;\n };\n}\n\nexport type HCS7Message =\n | HCS7EvmConfigMessage\n | HCS7WasmConfigMessage\n | HCS7MetadataRegistrationMessage;\n\nexport interface HCS7ClientConfig {\n network: NetworkType;\n logLevel?: LogLevel;\n silent?: boolean;\n mirrorNodeUrl?: string;\n logger?: Logger;\n}\n\nexport interface SDKHCS7ClientConfig extends HCS7ClientConfig {\n operatorId: string | AccountId;\n operatorKey: string | PrivateKey;\n keyType?: 'ed25519' | 'ecdsa';\n client?: Client;\n}\n\nexport interface HCS7TopicRegistrationResponse {\n success: boolean;\n topicId?: string;\n transactionId?: string;\n error?: string;\n}\n\nexport interface HCS7RegistryOperationResponse {\n success: boolean;\n receipt?: TransactionReceipt;\n transactionId?: string;\n sequenceNumber?: number;\n error?: string;\n}\n\nexport interface HCS7CreateRegistryOptions {\n ttl?: number;\n submitKey?: string | boolean | PrivateKey;\n adminKey?: string | boolean | PrivateKey;\n}\n\nexport interface HCS7RegisterEvmConfigInput {\n type: HCS7ConfigType.EVM;\n contractAddress: string;\n abi: HCS7AbiDefinition;\n}\n\nexport interface HCS7RegisterWasmConfigInput {\n type: HCS7ConfigType.WASM;\n wasmTopicId: string;\n inputType: {\n stateData: Record<string, HCS7StateValueType>;\n };\n outputType: {\n type: 'string';\n format: 'topic-id';\n };\n}\n\nexport type HCS7RegisterConfigInput =\n | HCS7RegisterEvmConfigInput\n | HCS7RegisterWasmConfigInput;\n\nexport interface HCS7RegisterConfigOptions {\n registryTopicId: string;\n memo?: string;\n transactionMemo?: string;\n submitKey?: string | PrivateKey;\n config: HCS7RegisterConfigInput;\n}\n\nexport interface HCS7RegisterMetadataOptions {\n registryTopicId: string;\n metadataTopicId: string;\n memo?: string;\n weight: number;\n tags: string[];\n transactionMemo?: string;\n submitKey?: string | PrivateKey;\n data?: Record<string, unknown>;\n}\n\nexport interface HCS7RegistryEntry<TMessage extends HCS7Message = HCS7Message> {\n sequenceNumber: number;\n timestamp: string;\n payer: string;\n message: TMessage;\n}\n\nexport interface HCS7RegistryTopic {\n topicId: string;\n ttl?: number;\n entries: HCS7RegistryEntry[];\n}\n\nexport interface HCS7QueryRegistryOptions {\n limit?: number;\n order?: 'asc' | 'desc';\n next?: string;\n}\n\nconst abiIOSchema = z.object({\n name: z.string().optional(),\n type: z.string(),\n});\n\nconst abiSchema = z.object({\n name: z.string(),\n inputs: z.array(abiIOSchema),\n outputs: z.array(abiIOSchema),\n stateMutability: z.enum(['view', 'pure']),\n type: z.literal('function'),\n});\n\nconst stateValueSchema = z.enum(['number', 'string', 'bool']);\n\nconst baseMessageSchema = z.object({\n p: z.literal('hcs-7'),\n m: z.string().optional(),\n});\n\nconst evmMessageSchema = baseMessageSchema.extend({\n op: z.literal(HCS7Operation.REGISTER_CONFIG),\n t: z.literal(HCS7ConfigType.EVM),\n c: z.object({\n contractAddress: z\n .string()\n .regex(/^0x[a-fA-F0-9]{40}$/, 'Invalid contract address'),\n abi: abiSchema,\n }),\n});\n\nconst wasmMessageSchema = baseMessageSchema.extend({\n op: z.literal(HCS7Operation.REGISTER_CONFIG),\n t: z.literal(HCS7ConfigType.WASM),\n c: z.object({\n wasmTopicId: z.string(),\n inputType: z.object({\n stateData: z.record(stateValueSchema),\n }),\n outputType: z.object({\n type: z.literal('string'),\n format: z.literal('topic-id'),\n }),\n }),\n});\n\nconst metadataMessageSchema = baseMessageSchema.extend({\n op: z.literal(HCS7Operation.REGISTER),\n t_id: z.string(),\n d: z\n .object({\n weight: z.number(),\n tags: z.array(z.string()).nonempty(),\n })\n .catchall(z.unknown()),\n});\n\nexport const hcs7MessageSchema = z.union([\n evmMessageSchema,\n wasmMessageSchema,\n metadataMessageSchema,\n]);\n"],"names":["HCS7Operation","HCS7ConfigType"],"mappings":";AAUO,IAAK,kCAAAA,mBAAL;AACLA,iBAAA,iBAAA,IAAkB;AAClBA,iBAAA,UAAA,IAAW;AAFD,SAAAA;AAAA,GAAA,iBAAA,CAAA,CAAA;AAKL,IAAK,mCAAAC,oBAAL;AACLA,kBAAA,KAAA,IAAM;AACNA,kBAAA,MAAA,IAAO;AAFG,SAAAA;AAAA,GAAA,kBAAA,CAAA,CAAA;AAiKZ,MAAM,cAAc,EAAE,OAAO;AAAA,EAC3B,MAAM,EAAE,OAAA,EAAS,SAAA;AAAA,EACjB,MAAM,EAAE,OAAA;AACV,CAAC;AAED,MAAM,YAAY,EAAE,OAAO;AAAA,EACzB,MAAM,EAAE,OAAA;AAAA,EACR,QAAQ,EAAE,MAAM,WAAW;AAAA,EAC3B,SAAS,EAAE,MAAM,WAAW;AAAA,EAC5B,iBAAiB,EAAE,KAAK,CAAC,QAAQ,MAAM,CAAC;AAAA,EACxC,MAAM,EAAE,QAAQ,UAAU;AAC5B,CAAC;AAED,MAAM,mBAAmB,EAAE,KAAK,CAAC,UAAU,UAAU,MAAM,CAAC;AAE5D,MAAM,oBAAoB,EAAE,OAAO;AAAA,EACjC,GAAG,EAAE,QAAQ,OAAO;AAAA,EACpB,GAAG,EAAE,OAAA,EAAS,SAAA;AAChB,CAAC;AAED,MAAM,mBAAmB,kBAAkB,OAAO;AAAA,EAChD,IAAI,EAAE;AAAA,IAAQ;AAAA;AAAA,EAAA;AAAA,EACd,GAAG,EAAE;AAAA,IAAQ;AAAA;AAAA,EAAA;AAAA,EACb,GAAG,EAAE,OAAO;AAAA,IACV,iBAAiB,EACd,OAAA,EACA,MAAM,uBAAuB,0BAA0B;AAAA,IAC1D,KAAK;AAAA,EAAA,CACN;AACH,CAAC;AAED,MAAM,oBAAoB,kBAAkB,OAAO;AAAA,EACjD,IAAI,EAAE;AAAA,IAAQ;AAAA;AAAA,EAAA;AAAA,EACd,GAAG,EAAE;AAAA,IAAQ;AAAA;AAAA,EAAA;AAAA,EACb,GAAG,EAAE,OAAO;AAAA,IACV,aAAa,EAAE,OAAA;AAAA,IACf,WAAW,EAAE,OAAO;AAAA,MAClB,WAAW,EAAE,OAAO,gBAAgB;AAAA,IAAA,CACrC;AAAA,IACD,YAAY,EAAE,OAAO;AAAA,MACnB,MAAM,EAAE,QAAQ,QAAQ;AAAA,MACxB,QAAQ,EAAE,QAAQ,UAAU;AAAA,IAAA,CAC7B;AAAA,EAAA,CACF;AACH,CAAC;AAED,MAAM,wBAAwB,kBAAkB,OAAO;AAAA,EACrD,IAAI,EAAE;AAAA,IAAQ;AAAA;AAAA,EAAA;AAAA,EACd,MAAM,EAAE,OAAA;AAAA,EACR,GAAG,EACA,OAAO;AAAA,IACN,QAAQ,EAAE,OAAA;AAAA,IACV,MAAM,EAAE,MAAM,EAAE,OAAA,CAAQ,EAAE,SAAA;AAAA,EAAS,CACpC,EACA,SAAS,EAAE,SAAS;AACzB,CAAC;AAEM,MAAM,oBAAoB,EAAE,MAAM;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AACF,CAAC;"}
|
|
@@ -10,7 +10,7 @@ class HCS20Client extends HCS20BaseClient {
|
|
|
10
10
|
super(config);
|
|
11
11
|
this.operatorAccountId = typeof config.operatorId === "string" ? AccountId.fromString(config.operatorId) : config.operatorId;
|
|
12
12
|
this.operatorId = this.operatorAccountId.toString();
|
|
13
|
-
const baseClient = this.network === "mainnet" ? Client.forMainnet() : Client.forTestnet();
|
|
13
|
+
const baseClient = config.client ?? (this.network === "mainnet" ? Client.forMainnet() : Client.forTestnet());
|
|
14
14
|
this.operatorCtx = createNodeOperatorContext({
|
|
15
15
|
network: this.network,
|
|
16
16
|
operatorId: this.operatorId,
|
|
@@ -75,7 +75,8 @@ class HCS20Client extends HCS20BaseClient {
|
|
|
75
75
|
const hcs2Client = new HCS2Client({
|
|
76
76
|
operatorId: this.operatorId,
|
|
77
77
|
operatorKey: this.operatorCtx.operatorKey,
|
|
78
|
-
network: this.network
|
|
78
|
+
network: this.network,
|
|
79
|
+
client: this.client
|
|
79
80
|
});
|
|
80
81
|
const topicCreateResponse = await hcs2Client.createRegistry({
|
|
81
82
|
submitKey: this.operatorCtx.operatorKey,
|
|
@@ -104,7 +105,8 @@ class HCS20Client extends HCS20BaseClient {
|
|
|
104
105
|
const hcs2Client = new HCS2Client({
|
|
105
106
|
operatorId: this.operatorId,
|
|
106
107
|
operatorKey: this.operatorCtx.operatorKey,
|
|
107
|
-
network: this.network
|
|
108
|
+
network: this.network,
|
|
109
|
+
client: this.client
|
|
108
110
|
});
|
|
109
111
|
if (options.usePrivateTopic) {
|
|
110
112
|
const topicCreateResponse = await hcs2Client.createRegistry({
|