@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.
Files changed (165) hide show
  1. package/README.md +20 -7
  2. package/dist/browser/hcs-10/sdk.d.ts.map +1 -1
  3. package/dist/browser/hcs-10/types.d.ts +3 -1
  4. package/dist/browser/hcs-10/types.d.ts.map +1 -1
  5. package/dist/browser/hcs-11/client.d.ts.map +1 -1
  6. package/dist/browser/hcs-11/types.d.ts +2 -1
  7. package/dist/browser/hcs-11/types.d.ts.map +1 -1
  8. package/dist/browser/hcs-12/sdk.d.ts +2 -0
  9. package/dist/browser/hcs-12/sdk.d.ts.map +1 -1
  10. package/dist/browser/hcs-15/sdk.d.ts.map +1 -1
  11. package/dist/browser/hcs-15/types.d.ts +2 -1
  12. package/dist/browser/hcs-15/types.d.ts.map +1 -1
  13. package/dist/browser/hcs-16/sdk.d.ts +2 -1
  14. package/dist/browser/hcs-16/sdk.d.ts.map +1 -1
  15. package/dist/browser/hcs-17/sdk.d.ts.map +1 -1
  16. package/dist/browser/hcs-17/types.d.ts +2 -1
  17. package/dist/browser/hcs-17/types.d.ts.map +1 -1
  18. package/dist/browser/hcs-18/sdk.d.ts +2 -1
  19. package/dist/browser/hcs-18/sdk.d.ts.map +1 -1
  20. package/dist/browser/hcs-2/client.d.ts +2 -1
  21. package/dist/browser/hcs-2/client.d.ts.map +1 -1
  22. package/dist/browser/hcs-20/sdk.d.ts.map +1 -1
  23. package/dist/browser/hcs-20/types.d.ts +2 -1
  24. package/dist/browser/hcs-20/types.d.ts.map +1 -1
  25. package/dist/browser/hcs-21/sdk.d.ts +2 -1
  26. package/dist/browser/hcs-21/sdk.d.ts.map +1 -1
  27. package/dist/browser/hcs-5/sdk.d.ts.map +1 -1
  28. package/dist/browser/hcs-5/types.d.ts +2 -1
  29. package/dist/browser/hcs-5/types.d.ts.map +1 -1
  30. package/dist/browser/hcs-6/sdk.d.ts +2 -1
  31. package/dist/browser/hcs-6/sdk.d.ts.map +1 -1
  32. package/dist/browser/hcs-7/sdk.d.ts.map +1 -1
  33. package/dist/browser/hcs-7/types.d.ts +2 -1
  34. package/dist/browser/hcs-7/types.d.ts.map +1 -1
  35. package/dist/browser/standards-sdk.browser.js +4 -3
  36. package/dist/browser/standards-sdk.browser.js.map +1 -1
  37. package/dist/cjs/hcs-10/sdk.d.ts.map +1 -1
  38. package/dist/cjs/hcs-10/types.d.ts +3 -1
  39. package/dist/cjs/hcs-10/types.d.ts.map +1 -1
  40. package/dist/cjs/hcs-11/client.d.ts.map +1 -1
  41. package/dist/cjs/hcs-11/types.d.ts +2 -1
  42. package/dist/cjs/hcs-11/types.d.ts.map +1 -1
  43. package/dist/cjs/hcs-12/sdk.d.ts +2 -0
  44. package/dist/cjs/hcs-12/sdk.d.ts.map +1 -1
  45. package/dist/cjs/hcs-15/sdk.d.ts.map +1 -1
  46. package/dist/cjs/hcs-15/types.d.ts +2 -1
  47. package/dist/cjs/hcs-15/types.d.ts.map +1 -1
  48. package/dist/cjs/hcs-16/sdk.d.ts +2 -1
  49. package/dist/cjs/hcs-16/sdk.d.ts.map +1 -1
  50. package/dist/cjs/hcs-17/sdk.d.ts.map +1 -1
  51. package/dist/cjs/hcs-17/types.d.ts +2 -1
  52. package/dist/cjs/hcs-17/types.d.ts.map +1 -1
  53. package/dist/cjs/hcs-18/sdk.d.ts +2 -1
  54. package/dist/cjs/hcs-18/sdk.d.ts.map +1 -1
  55. package/dist/cjs/hcs-2/client.d.ts +2 -1
  56. package/dist/cjs/hcs-2/client.d.ts.map +1 -1
  57. package/dist/cjs/hcs-20/sdk.d.ts.map +1 -1
  58. package/dist/cjs/hcs-20/types.d.ts +2 -1
  59. package/dist/cjs/hcs-20/types.d.ts.map +1 -1
  60. package/dist/cjs/hcs-21/sdk.d.ts +2 -1
  61. package/dist/cjs/hcs-21/sdk.d.ts.map +1 -1
  62. package/dist/cjs/hcs-5/sdk.d.ts.map +1 -1
  63. package/dist/cjs/hcs-5/types.d.ts +2 -1
  64. package/dist/cjs/hcs-5/types.d.ts.map +1 -1
  65. package/dist/cjs/hcs-6/sdk.d.ts +2 -1
  66. package/dist/cjs/hcs-6/sdk.d.ts.map +1 -1
  67. package/dist/cjs/hcs-7/sdk.d.ts.map +1 -1
  68. package/dist/cjs/hcs-7/types.d.ts +2 -1
  69. package/dist/cjs/hcs-7/types.d.ts.map +1 -1
  70. package/dist/cjs/standards-sdk.cjs +1 -1
  71. package/dist/cjs/standards-sdk.cjs.map +1 -1
  72. package/dist/es/hcs-10/sdk.d.ts.map +1 -1
  73. package/dist/es/hcs-10/types.d.ts +3 -1
  74. package/dist/es/hcs-10/types.d.ts.map +1 -1
  75. package/dist/es/hcs-11/client.d.ts.map +1 -1
  76. package/dist/es/hcs-11/types.d.ts +2 -1
  77. package/dist/es/hcs-11/types.d.ts.map +1 -1
  78. package/dist/es/hcs-12/sdk.d.ts +2 -0
  79. package/dist/es/hcs-12/sdk.d.ts.map +1 -1
  80. package/dist/es/hcs-15/sdk.d.ts.map +1 -1
  81. package/dist/es/hcs-15/types.d.ts +2 -1
  82. package/dist/es/hcs-15/types.d.ts.map +1 -1
  83. package/dist/es/hcs-16/sdk.d.ts +2 -1
  84. package/dist/es/hcs-16/sdk.d.ts.map +1 -1
  85. package/dist/es/hcs-17/sdk.d.ts.map +1 -1
  86. package/dist/es/hcs-17/types.d.ts +2 -1
  87. package/dist/es/hcs-17/types.d.ts.map +1 -1
  88. package/dist/es/hcs-18/sdk.d.ts +2 -1
  89. package/dist/es/hcs-18/sdk.d.ts.map +1 -1
  90. package/dist/es/hcs-2/client.d.ts +2 -1
  91. package/dist/es/hcs-2/client.d.ts.map +1 -1
  92. package/dist/es/hcs-20/sdk.d.ts.map +1 -1
  93. package/dist/es/hcs-20/types.d.ts +2 -1
  94. package/dist/es/hcs-20/types.d.ts.map +1 -1
  95. package/dist/es/hcs-21/sdk.d.ts +2 -1
  96. package/dist/es/hcs-21/sdk.d.ts.map +1 -1
  97. package/dist/es/hcs-5/sdk.d.ts.map +1 -1
  98. package/dist/es/hcs-5/types.d.ts +2 -1
  99. package/dist/es/hcs-5/types.d.ts.map +1 -1
  100. package/dist/es/hcs-6/sdk.d.ts +2 -1
  101. package/dist/es/hcs-6/sdk.d.ts.map +1 -1
  102. package/dist/es/hcs-7/sdk.d.ts.map +1 -1
  103. package/dist/es/hcs-7/types.d.ts +2 -1
  104. package/dist/es/hcs-7/types.d.ts.map +1 -1
  105. package/dist/es/standards-sdk.es102.js.map +1 -1
  106. package/dist/es/standards-sdk.es104.js +1 -1
  107. package/dist/es/standards-sdk.es104.js.map +1 -1
  108. package/dist/es/standards-sdk.es108.js +1 -1
  109. package/dist/es/standards-sdk.es108.js.map +1 -1
  110. package/dist/es/standards-sdk.es11.js +2 -1
  111. package/dist/es/standards-sdk.es11.js.map +1 -1
  112. package/dist/es/standards-sdk.es137.js +1 -1
  113. package/dist/es/standards-sdk.es138.js +1 -1
  114. package/dist/es/standards-sdk.es143.js +1 -1
  115. package/dist/es/standards-sdk.es155.js +54 -12480
  116. package/dist/es/standards-sdk.es155.js.map +1 -1
  117. package/dist/es/standards-sdk.es156.js +76 -48
  118. package/dist/es/standards-sdk.es156.js.map +1 -1
  119. package/dist/es/standards-sdk.es157.js +66 -69
  120. package/dist/es/standards-sdk.es157.js.map +1 -1
  121. package/dist/es/standards-sdk.es158.js +180 -61
  122. package/dist/es/standards-sdk.es158.js.map +1 -1
  123. package/dist/es/standards-sdk.es159.js +12438 -156
  124. package/dist/es/standards-sdk.es159.js.map +1 -1
  125. package/dist/es/standards-sdk.es169.js +1 -1
  126. package/dist/es/standards-sdk.es173.js +1 -1
  127. package/dist/es/standards-sdk.es18.js +4 -3
  128. package/dist/es/standards-sdk.es18.js.map +1 -1
  129. package/dist/es/standards-sdk.es19.js +1 -1
  130. package/dist/es/standards-sdk.es27.js +2 -2
  131. package/dist/es/standards-sdk.es27.js.map +1 -1
  132. package/dist/es/standards-sdk.es28.js.map +1 -1
  133. package/dist/es/standards-sdk.es30.js +1 -1
  134. package/dist/es/standards-sdk.es31.js +1 -1
  135. package/dist/es/standards-sdk.es35.js +1 -1
  136. package/dist/es/standards-sdk.es36.js +2 -2
  137. package/dist/es/standards-sdk.es36.js.map +1 -1
  138. package/dist/es/standards-sdk.es37.js +1 -1
  139. package/dist/es/standards-sdk.es4.js +1 -1
  140. package/dist/es/standards-sdk.es4.js.map +1 -1
  141. package/dist/es/standards-sdk.es56.js +1 -1
  142. package/dist/es/standards-sdk.es59.js +1 -1
  143. package/dist/es/standards-sdk.es60.js +1 -1
  144. package/dist/es/standards-sdk.es62.js +1 -1
  145. package/dist/es/standards-sdk.es63.js +2 -2
  146. package/dist/es/standards-sdk.es64.js +1 -1
  147. package/dist/es/standards-sdk.es65.js +1 -1
  148. package/dist/es/standards-sdk.es66.js +1 -1
  149. package/dist/es/standards-sdk.es69.js +1 -1
  150. package/dist/es/standards-sdk.es70.js.map +1 -1
  151. package/dist/es/standards-sdk.es72.js +2 -1
  152. package/dist/es/standards-sdk.es72.js.map +1 -1
  153. package/dist/es/standards-sdk.es75.js +2 -2
  154. package/dist/es/standards-sdk.es75.js.map +1 -1
  155. package/dist/es/standards-sdk.es79.js.map +1 -1
  156. package/dist/es/standards-sdk.es8.js.map +1 -1
  157. package/dist/es/standards-sdk.es83.js +5 -3
  158. package/dist/es/standards-sdk.es83.js.map +1 -1
  159. package/dist/es/standards-sdk.es90.js +1 -1
  160. package/dist/es/standards-sdk.es90.js.map +1 -1
  161. package/dist/es/standards-sdk.es94.js +1 -1
  162. package/dist/es/standards-sdk.es94.js.map +1 -1
  163. package/dist/es/standards-sdk.es99.js +1 -1
  164. package/dist/es/standards-sdk.es99.js.map +1 -1
  165. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"standards-sdk.es83.js","sources":["../../src/hcs-20/sdk.ts"],"sourcesContent":["/**\n * SDK implementation of HCS-20 client for server-side usage\n */\n\nimport {\n AccountId,\n TopicCreateTransaction,\n TopicMessageSubmitTransaction,\n PrivateKey,\n Client,\n TransactionReceipt,\n TransactionResponse,\n Status,\n} from '@hashgraph/sdk';\nimport { HCS20BaseClient } from './base-client';\nimport {\n SDKHCS20ClientConfig,\n DeployPointsOptions,\n MintPointsOptions,\n TransferPointsOptions,\n BurnPointsOptions,\n RegisterTopicOptions,\n PointsInfo,\n PointsTransaction,\n HCS20DeployMessage,\n HCS20RegisterMessage,\n} from './types';\nimport {\n PointsDeploymentError,\n PointsTransferError,\n PointsBurnError,\n PointsValidationError,\n} from './errors';\nimport { sleep } from '../utils/sleep';\nimport {\n createNodeOperatorContext,\n type NodeOperatorContext,\n} from '../common/node-operator-resolver';\nimport { HCS2Client } from '../hcs-2/client';\nimport {\n buildHcs20DeployTx,\n buildHcs20MintTx,\n buildHcs20TransferTx,\n buildHcs20BurnTx,\n buildHcs20RegisterTx,\n} from './tx';\n\n/**\n * SDK-specific HCS-20 client for server-side operations\n */\nexport class HCS20Client extends HCS20BaseClient {\n private client: Client;\n private operatorAccountId: AccountId;\n private operatorId: string;\n private operatorCtx: NodeOperatorContext;\n\n constructor(config: SDKHCS20ClientConfig) {\n super(config);\n\n this.operatorAccountId =\n typeof config.operatorId === 'string'\n ? AccountId.fromString(config.operatorId)\n : config.operatorId;\n this.operatorId = this.operatorAccountId.toString();\n\n const baseClient =\n this.network === 'mainnet' ? Client.forMainnet() : Client.forTestnet();\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: baseClient,\n });\n\n this.client = this.operatorCtx.client;\n void this.operatorCtx.ensureInitialized();\n }\n\n /**\n * Ensure operator is initialized before operations\n */\n private async ensureInitialized(): Promise<void> {\n await this.operatorCtx.ensureInitialized();\n }\n\n /**\n * Submit a payload to a topic\n */\n private async submitPayload(\n transaction: TopicMessageSubmitTransaction,\n submitKey?: PrivateKey,\n ): Promise<{ receipt: TransactionReceipt; transactionId: string }> {\n let transactionResponse: TransactionResponse;\n if (submitKey) {\n const frozenTransaction = transaction.freezeWith(this.client);\n const signedTransaction = await frozenTransaction.sign(submitKey);\n transactionResponse = await signedTransaction.execute(this.client);\n } else {\n transactionResponse = await transaction.execute(this.client);\n }\n\n const receipt = await transactionResponse.getReceipt(this.client);\n if (!receipt || receipt.status !== Status.Success) {\n throw new Error('Failed to submit message to topic');\n }\n\n return {\n receipt,\n transactionId: transactionResponse.transactionId!.toString(),\n };\n }\n\n /**\n * Create a public topic for HCS-20 (for testnet)\n */\n async createPublicTopic(memo?: string): Promise<string> {\n await this.ensureInitialized();\n\n this.logger.info('Creating public HCS-20 topic...');\n\n const topicCreateTx = await new TopicCreateTransaction()\n .setTopicMemo(memo || 'HCS-20 Public Topic')\n .execute(this.client);\n\n const receipt = await topicCreateTx.getReceipt(this.client);\n if (receipt.status !== Status.Success || !receipt.topicId) {\n throw new Error('Failed to create public topic');\n }\n\n const topicId = receipt.topicId.toString();\n this.logger.info(`Created public topic: ${topicId}`);\n\n this.publicTopicId = topicId;\n\n return topicId;\n }\n\n /**\n * Create a registry topic for HCS-20\n */\n async createRegistryTopic(): Promise<string> {\n await this.ensureInitialized();\n\n this.logger.info('Creating HCS-20 registry topic...');\n\n const hcs2Client = new HCS2Client({\n operatorId: this.operatorId,\n operatorKey: this.operatorCtx.operatorKey,\n network: this.network,\n });\n\n const topicCreateResponse = await hcs2Client.createRegistry({\n submitKey: this.operatorCtx.operatorKey,\n adminKey: this.operatorCtx.operatorKey,\n });\n\n if (!topicCreateResponse.success) {\n throw new Error('Failed to create registry topic');\n }\n\n const topicId = topicCreateResponse.topicId;\n this.logger.info(`Created registry topic: ${topicId}`);\n\n this.registryTopicId = topicId;\n\n return topicId;\n }\n\n /**\n * Deploy new points\n */\n async deployPoints(options: DeployPointsOptions): Promise<PointsInfo> {\n await this.ensureInitialized();\n const { progressCallback } = options;\n\n try {\n progressCallback?.({\n stage: 'creating-topic',\n percentage: 20,\n });\n\n let topicId: string;\n\n const hcs2Client = new HCS2Client({\n operatorId: this.operatorId,\n operatorKey: this.operatorCtx.operatorKey,\n network: this.network,\n });\n\n if (options.usePrivateTopic) {\n const topicCreateResponse = await hcs2Client.createRegistry({\n submitKey: this.operatorCtx.operatorKey,\n adminKey: this.operatorCtx.operatorKey,\n });\n\n if (!topicCreateResponse.success) {\n throw new PointsDeploymentError(\n 'Failed to create topic',\n options.tick,\n );\n }\n\n topicId = topicCreateResponse.topicId;\n this.logger.info(`Created private topic: ${topicId}`);\n } else {\n topicId = this.publicTopicId;\n }\n\n progressCallback?.({\n stage: 'submitting-deploy',\n percentage: 50,\n topicId,\n });\n\n const deployMessage: HCS20DeployMessage = {\n p: 'hcs-20',\n op: 'deploy',\n name: options.name,\n tick: this.normalizeTick(options.tick),\n max: options.maxSupply,\n lim: options.limitPerMint,\n metadata: options.metadata,\n m: options.topicMemo,\n };\n\n const validation = this.validateMessage(deployMessage);\n if (!validation.valid) {\n throw new PointsValidationError(\n 'Invalid deploy message',\n validation.errors!,\n );\n }\n\n const deployTransaction = buildHcs20DeployTx({\n topicId,\n name: options.name,\n tick: options.tick,\n max: options.maxSupply,\n lim: options.limitPerMint,\n metadata: options.metadata,\n memo: options.topicMemo,\n });\n\n const { transactionId: deployTxId } =\n await this.submitPayload(deployTransaction);\n\n progressCallback?.({\n stage: 'confirming',\n percentage: 80,\n topicId,\n deployTxId,\n });\n\n await this.waitForMirrorNodeConfirmation(topicId, deployTxId);\n\n progressCallback?.({\n stage: 'complete',\n percentage: 100,\n topicId,\n deployTxId,\n });\n\n const pointsInfo: PointsInfo = {\n name: options.name,\n tick: this.normalizeTick(options.tick),\n maxSupply: options.maxSupply,\n limitPerMint: options.limitPerMint,\n metadata: options.metadata,\n topicId,\n deployerAccountId: this.operatorId,\n currentSupply: '0',\n deploymentTimestamp: new Date().toISOString(),\n isPrivate: options.usePrivateTopic || false,\n };\n\n return pointsInfo;\n } catch (error) {\n progressCallback?.({\n stage: 'complete',\n percentage: 100,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n throw error;\n }\n }\n\n /**\n * Mint points\n */\n async mintPoints(options: MintPointsOptions): Promise<PointsTransaction> {\n await this.ensureInitialized();\n const { progressCallback } = options;\n\n try {\n progressCallback?.({\n stage: 'validating',\n percentage: 20,\n });\n\n const normalizedTick = this.normalizeTick(options.tick);\n\n progressCallback?.({\n stage: 'submitting',\n percentage: 50,\n });\n\n const topicId = options.topicId\n ? this.topicToString(options.topicId)\n : this.publicTopicId;\n const mintTransaction = buildHcs20MintTx({\n topicId,\n tick: options.tick,\n amt: options.amount,\n to: this.accountToString(options.to),\n memo: options.memo,\n });\n\n const { transactionId: mintTxId } =\n await this.submitPayload(mintTransaction);\n\n progressCallback?.({\n stage: 'confirming',\n percentage: 80,\n mintTxId,\n });\n\n if (!options.disableMirrorCheck) {\n await this.waitForMirrorNodeConfirmation(topicId, mintTxId);\n }\n\n progressCallback?.({\n stage: 'complete',\n percentage: 100,\n mintTxId,\n });\n\n const transaction: PointsTransaction = {\n id: mintTxId,\n operation: 'mint',\n tick: normalizedTick,\n amount: options.amount,\n to: this.accountToString(options.to),\n timestamp: new Date().toISOString(),\n sequenceNumber: 0,\n topicId,\n transactionId: mintTxId,\n memo: options.memo,\n };\n\n return transaction;\n } catch (error) {\n progressCallback?.({\n stage: 'complete',\n percentage: 100,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n throw error;\n }\n }\n\n /**\n * Transfer points\n */\n async transferPoints(\n options: TransferPointsOptions,\n ): Promise<PointsTransaction> {\n await this.ensureInitialized();\n const { progressCallback } = options;\n\n try {\n progressCallback?.({\n stage: 'validating-balance',\n percentage: 20,\n });\n\n const normalizedTick = this.normalizeTick(options.tick);\n const fromAccount = this.accountToString(options.from);\n const toAccount = this.accountToString(options.to);\n\n if (fromAccount !== this.operatorId) {\n throw new PointsTransferError(\n 'For public topics, transaction payer must match sender',\n options.tick,\n fromAccount,\n toAccount,\n options.amount,\n );\n }\n\n progressCallback?.({\n stage: 'submitting',\n percentage: 50,\n });\n\n const topicId = options.topicId\n ? this.topicToString(options.topicId)\n : this.publicTopicId;\n const transferTransaction = buildHcs20TransferTx({\n topicId,\n tick: options.tick,\n amt: options.amount,\n from: fromAccount,\n to: toAccount,\n memo: options.memo,\n });\n\n const { transactionId: transferTxId } =\n await this.submitPayload(transferTransaction);\n\n progressCallback?.({\n stage: 'confirming',\n percentage: 80,\n transferTxId,\n });\n\n await this.waitForMirrorNodeConfirmation(topicId, transferTxId);\n\n progressCallback?.({\n stage: 'complete',\n percentage: 100,\n transferTxId,\n });\n\n const transaction: PointsTransaction = {\n id: transferTxId,\n operation: 'transfer',\n tick: normalizedTick,\n amount: options.amount,\n from: fromAccount,\n to: toAccount,\n timestamp: new Date().toISOString(),\n sequenceNumber: 0,\n topicId,\n transactionId: transferTxId,\n memo: options.memo,\n };\n\n return transaction;\n } catch (error) {\n progressCallback?.({\n stage: 'complete',\n percentage: 100,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n throw error;\n }\n }\n\n /**\n * Burn points\n */\n async burnPoints(options: BurnPointsOptions): Promise<PointsTransaction> {\n await this.ensureInitialized();\n const { progressCallback } = options;\n\n try {\n progressCallback?.({\n stage: 'validating-balance',\n percentage: 20,\n });\n\n const normalizedTick = this.normalizeTick(options.tick);\n const fromAccount = this.accountToString(options.from);\n\n if (fromAccount !== this.operatorId) {\n throw new PointsBurnError(\n 'For public topics, transaction payer must match burner',\n options.tick,\n fromAccount,\n options.amount,\n );\n }\n\n progressCallback?.({\n stage: 'submitting',\n percentage: 50,\n });\n\n const topicId = options.topicId\n ? this.topicToString(options.topicId)\n : this.publicTopicId;\n const burnTransaction = buildHcs20BurnTx({\n topicId,\n tick: options.tick,\n amt: options.amount,\n from: fromAccount,\n memo: options.memo,\n });\n\n const { transactionId: burnTxId } =\n await this.submitPayload(burnTransaction);\n\n progressCallback?.({\n stage: 'confirming',\n percentage: 80,\n burnTxId,\n });\n\n await this.waitForMirrorNodeConfirmation(topicId, burnTxId);\n\n progressCallback?.({\n stage: 'complete',\n percentage: 100,\n burnTxId,\n });\n\n const transaction: PointsTransaction = {\n id: burnTxId,\n operation: 'burn',\n tick: normalizedTick,\n amount: options.amount,\n from: fromAccount,\n timestamp: new Date().toISOString(),\n sequenceNumber: 0,\n topicId,\n transactionId: burnTxId,\n memo: options.memo,\n };\n\n return transaction;\n } catch (error) {\n progressCallback?.({\n stage: 'complete',\n percentage: 100,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n throw error;\n }\n }\n\n /**\n * Register a topic in the registry\n */\n async registerTopic(options: RegisterTopicOptions): Promise<void> {\n await this.ensureInitialized();\n const { progressCallback } = options;\n\n try {\n progressCallback?.({\n stage: 'validating',\n percentage: 20,\n });\n\n const registerMessage: HCS20RegisterMessage = {\n p: 'hcs-20',\n op: 'register',\n name: options.name,\n metadata: options.metadata,\n private: options.isPrivate,\n t_id: this.topicToString(options.topicId),\n m: options.memo,\n };\n\n const validation = this.validateMessage(registerMessage);\n if (!validation.valid) {\n throw new PointsValidationError(\n 'Invalid register message',\n validation.errors!,\n );\n }\n\n if (!this.registryTopicId) {\n throw new PointsDeploymentError(\n 'Registry topic not available',\n options.name,\n );\n }\n\n progressCallback?.({\n stage: 'submitting',\n percentage: 50,\n });\n\n const registerTransaction = buildHcs20RegisterTx({\n registryTopicId: this.registryTopicId,\n name: options.name,\n topicId: this.topicToString(options.topicId),\n isPrivate: options.isPrivate,\n metadata: options.metadata,\n memo: options.memo,\n });\n\n const { transactionId: registerTxId } = await this.submitPayload(\n registerTransaction,\n this.operatorCtx.operatorKey,\n );\n\n progressCallback?.({\n stage: 'confirming',\n percentage: 80,\n registerTxId,\n });\n\n await this.waitForMirrorNodeConfirmation(\n this.registryTopicId,\n registerTxId,\n );\n\n progressCallback?.({\n stage: 'complete',\n percentage: 100,\n registerTxId,\n });\n\n this.logger.info(`Registered topic ${options.topicId} in registry`);\n } catch (error) {\n progressCallback?.({\n stage: 'complete',\n percentage: 100,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n throw error;\n }\n }\n\n /**\n * Wait for mirror node to index a message\n */\n private async waitForMirrorNodeConfirmation(\n topicId: string,\n transactionId: string,\n maxRetries = 10,\n ): Promise<void> {\n for (let i = 0; i < maxRetries; i++) {\n try {\n const messages = await this.mirrorNode.getTopicMessages(topicId, {\n limit: 10,\n order: 'desc',\n });\n\n const found = messages.some(message => {\n if (typeof message !== 'object' || message === null) {\n return false;\n }\n const candidate = message as { consensus_timestamp?: unknown };\n return typeof candidate.consensus_timestamp === 'string';\n });\n\n if (found) {\n this.logger.debug(\n `Transaction ${transactionId} confirmed on mirror node`,\n );\n return;\n }\n } catch (error) {\n this.logger.debug(`Mirror node check attempt ${i + 1} failed:`, error);\n }\n\n await sleep(2000);\n }\n\n this.logger.warn(\n `Transaction ${transactionId} not found on mirror node after ${maxRetries} attempts`,\n );\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"standards-sdk.es83.js","sources":["../../src/hcs-20/sdk.ts"],"sourcesContent":["/**\n * SDK implementation of HCS-20 client for server-side usage\n */\n\nimport {\n AccountId,\n TopicCreateTransaction,\n TopicMessageSubmitTransaction,\n PrivateKey,\n Client,\n TransactionReceipt,\n TransactionResponse,\n Status,\n} from '@hashgraph/sdk';\nimport { HCS20BaseClient } from './base-client';\nimport {\n SDKHCS20ClientConfig,\n DeployPointsOptions,\n MintPointsOptions,\n TransferPointsOptions,\n BurnPointsOptions,\n RegisterTopicOptions,\n PointsInfo,\n PointsTransaction,\n HCS20DeployMessage,\n HCS20RegisterMessage,\n} from './types';\nimport {\n PointsDeploymentError,\n PointsTransferError,\n PointsBurnError,\n PointsValidationError,\n} from './errors';\nimport { sleep } from '../utils/sleep';\nimport {\n createNodeOperatorContext,\n type NodeOperatorContext,\n} from '../common/node-operator-resolver';\nimport { HCS2Client } from '../hcs-2/client';\nimport {\n buildHcs20DeployTx,\n buildHcs20MintTx,\n buildHcs20TransferTx,\n buildHcs20BurnTx,\n buildHcs20RegisterTx,\n} from './tx';\n\n/**\n * SDK-specific HCS-20 client for server-side operations\n */\nexport class HCS20Client extends HCS20BaseClient {\n private client: Client;\n private operatorAccountId: AccountId;\n private operatorId: string;\n private operatorCtx: NodeOperatorContext;\n\n constructor(config: SDKHCS20ClientConfig) {\n super(config);\n\n this.operatorAccountId =\n typeof config.operatorId === 'string'\n ? AccountId.fromString(config.operatorId)\n : config.operatorId;\n this.operatorId = this.operatorAccountId.toString();\n\n const baseClient =\n config.client ??\n (this.network === 'mainnet' ? Client.forMainnet() : Client.forTestnet());\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: baseClient,\n });\n\n this.client = this.operatorCtx.client;\n void this.operatorCtx.ensureInitialized();\n }\n\n /**\n * Ensure operator is initialized before operations\n */\n private async ensureInitialized(): Promise<void> {\n await this.operatorCtx.ensureInitialized();\n }\n\n /**\n * Submit a payload to a topic\n */\n private async submitPayload(\n transaction: TopicMessageSubmitTransaction,\n submitKey?: PrivateKey,\n ): Promise<{ receipt: TransactionReceipt; transactionId: string }> {\n let transactionResponse: TransactionResponse;\n if (submitKey) {\n const frozenTransaction = transaction.freezeWith(this.client);\n const signedTransaction = await frozenTransaction.sign(submitKey);\n transactionResponse = await signedTransaction.execute(this.client);\n } else {\n transactionResponse = await transaction.execute(this.client);\n }\n\n const receipt = await transactionResponse.getReceipt(this.client);\n if (!receipt || receipt.status !== Status.Success) {\n throw new Error('Failed to submit message to topic');\n }\n\n return {\n receipt,\n transactionId: transactionResponse.transactionId!.toString(),\n };\n }\n\n /**\n * Create a public topic for HCS-20 (for testnet)\n */\n async createPublicTopic(memo?: string): Promise<string> {\n await this.ensureInitialized();\n\n this.logger.info('Creating public HCS-20 topic...');\n\n const topicCreateTx = await new TopicCreateTransaction()\n .setTopicMemo(memo || 'HCS-20 Public Topic')\n .execute(this.client);\n\n const receipt = await topicCreateTx.getReceipt(this.client);\n if (receipt.status !== Status.Success || !receipt.topicId) {\n throw new Error('Failed to create public topic');\n }\n\n const topicId = receipt.topicId.toString();\n this.logger.info(`Created public topic: ${topicId}`);\n\n this.publicTopicId = topicId;\n\n return topicId;\n }\n\n /**\n * Create a registry topic for HCS-20\n */\n async createRegistryTopic(): Promise<string> {\n await this.ensureInitialized();\n\n this.logger.info('Creating HCS-20 registry topic...');\n\n const hcs2Client = new HCS2Client({\n operatorId: this.operatorId,\n operatorKey: this.operatorCtx.operatorKey,\n network: this.network,\n client: this.client,\n });\n\n const topicCreateResponse = await hcs2Client.createRegistry({\n submitKey: this.operatorCtx.operatorKey,\n adminKey: this.operatorCtx.operatorKey,\n });\n\n if (!topicCreateResponse.success) {\n throw new Error('Failed to create registry topic');\n }\n\n const topicId = topicCreateResponse.topicId;\n this.logger.info(`Created registry topic: ${topicId}`);\n\n this.registryTopicId = topicId;\n\n return topicId;\n }\n\n /**\n * Deploy new points\n */\n async deployPoints(options: DeployPointsOptions): Promise<PointsInfo> {\n await this.ensureInitialized();\n const { progressCallback } = options;\n\n try {\n progressCallback?.({\n stage: 'creating-topic',\n percentage: 20,\n });\n\n let topicId: string;\n\n const hcs2Client = new HCS2Client({\n operatorId: this.operatorId,\n operatorKey: this.operatorCtx.operatorKey,\n network: this.network,\n client: this.client,\n });\n\n if (options.usePrivateTopic) {\n const topicCreateResponse = await hcs2Client.createRegistry({\n submitKey: this.operatorCtx.operatorKey,\n adminKey: this.operatorCtx.operatorKey,\n });\n\n if (!topicCreateResponse.success) {\n throw new PointsDeploymentError(\n 'Failed to create topic',\n options.tick,\n );\n }\n\n topicId = topicCreateResponse.topicId;\n this.logger.info(`Created private topic: ${topicId}`);\n } else {\n topicId = this.publicTopicId;\n }\n\n progressCallback?.({\n stage: 'submitting-deploy',\n percentage: 50,\n topicId,\n });\n\n const deployMessage: HCS20DeployMessage = {\n p: 'hcs-20',\n op: 'deploy',\n name: options.name,\n tick: this.normalizeTick(options.tick),\n max: options.maxSupply,\n lim: options.limitPerMint,\n metadata: options.metadata,\n m: options.topicMemo,\n };\n\n const validation = this.validateMessage(deployMessage);\n if (!validation.valid) {\n throw new PointsValidationError(\n 'Invalid deploy message',\n validation.errors!,\n );\n }\n\n const deployTransaction = buildHcs20DeployTx({\n topicId,\n name: options.name,\n tick: options.tick,\n max: options.maxSupply,\n lim: options.limitPerMint,\n metadata: options.metadata,\n memo: options.topicMemo,\n });\n\n const { transactionId: deployTxId } =\n await this.submitPayload(deployTransaction);\n\n progressCallback?.({\n stage: 'confirming',\n percentage: 80,\n topicId,\n deployTxId,\n });\n\n await this.waitForMirrorNodeConfirmation(topicId, deployTxId);\n\n progressCallback?.({\n stage: 'complete',\n percentage: 100,\n topicId,\n deployTxId,\n });\n\n const pointsInfo: PointsInfo = {\n name: options.name,\n tick: this.normalizeTick(options.tick),\n maxSupply: options.maxSupply,\n limitPerMint: options.limitPerMint,\n metadata: options.metadata,\n topicId,\n deployerAccountId: this.operatorId,\n currentSupply: '0',\n deploymentTimestamp: new Date().toISOString(),\n isPrivate: options.usePrivateTopic || false,\n };\n\n return pointsInfo;\n } catch (error) {\n progressCallback?.({\n stage: 'complete',\n percentage: 100,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n throw error;\n }\n }\n\n /**\n * Mint points\n */\n async mintPoints(options: MintPointsOptions): Promise<PointsTransaction> {\n await this.ensureInitialized();\n const { progressCallback } = options;\n\n try {\n progressCallback?.({\n stage: 'validating',\n percentage: 20,\n });\n\n const normalizedTick = this.normalizeTick(options.tick);\n\n progressCallback?.({\n stage: 'submitting',\n percentage: 50,\n });\n\n const topicId = options.topicId\n ? this.topicToString(options.topicId)\n : this.publicTopicId;\n const mintTransaction = buildHcs20MintTx({\n topicId,\n tick: options.tick,\n amt: options.amount,\n to: this.accountToString(options.to),\n memo: options.memo,\n });\n\n const { transactionId: mintTxId } =\n await this.submitPayload(mintTransaction);\n\n progressCallback?.({\n stage: 'confirming',\n percentage: 80,\n mintTxId,\n });\n\n if (!options.disableMirrorCheck) {\n await this.waitForMirrorNodeConfirmation(topicId, mintTxId);\n }\n\n progressCallback?.({\n stage: 'complete',\n percentage: 100,\n mintTxId,\n });\n\n const transaction: PointsTransaction = {\n id: mintTxId,\n operation: 'mint',\n tick: normalizedTick,\n amount: options.amount,\n to: this.accountToString(options.to),\n timestamp: new Date().toISOString(),\n sequenceNumber: 0,\n topicId,\n transactionId: mintTxId,\n memo: options.memo,\n };\n\n return transaction;\n } catch (error) {\n progressCallback?.({\n stage: 'complete',\n percentage: 100,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n throw error;\n }\n }\n\n /**\n * Transfer points\n */\n async transferPoints(\n options: TransferPointsOptions,\n ): Promise<PointsTransaction> {\n await this.ensureInitialized();\n const { progressCallback } = options;\n\n try {\n progressCallback?.({\n stage: 'validating-balance',\n percentage: 20,\n });\n\n const normalizedTick = this.normalizeTick(options.tick);\n const fromAccount = this.accountToString(options.from);\n const toAccount = this.accountToString(options.to);\n\n if (fromAccount !== this.operatorId) {\n throw new PointsTransferError(\n 'For public topics, transaction payer must match sender',\n options.tick,\n fromAccount,\n toAccount,\n options.amount,\n );\n }\n\n progressCallback?.({\n stage: 'submitting',\n percentage: 50,\n });\n\n const topicId = options.topicId\n ? this.topicToString(options.topicId)\n : this.publicTopicId;\n const transferTransaction = buildHcs20TransferTx({\n topicId,\n tick: options.tick,\n amt: options.amount,\n from: fromAccount,\n to: toAccount,\n memo: options.memo,\n });\n\n const { transactionId: transferTxId } =\n await this.submitPayload(transferTransaction);\n\n progressCallback?.({\n stage: 'confirming',\n percentage: 80,\n transferTxId,\n });\n\n await this.waitForMirrorNodeConfirmation(topicId, transferTxId);\n\n progressCallback?.({\n stage: 'complete',\n percentage: 100,\n transferTxId,\n });\n\n const transaction: PointsTransaction = {\n id: transferTxId,\n operation: 'transfer',\n tick: normalizedTick,\n amount: options.amount,\n from: fromAccount,\n to: toAccount,\n timestamp: new Date().toISOString(),\n sequenceNumber: 0,\n topicId,\n transactionId: transferTxId,\n memo: options.memo,\n };\n\n return transaction;\n } catch (error) {\n progressCallback?.({\n stage: 'complete',\n percentage: 100,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n throw error;\n }\n }\n\n /**\n * Burn points\n */\n async burnPoints(options: BurnPointsOptions): Promise<PointsTransaction> {\n await this.ensureInitialized();\n const { progressCallback } = options;\n\n try {\n progressCallback?.({\n stage: 'validating-balance',\n percentage: 20,\n });\n\n const normalizedTick = this.normalizeTick(options.tick);\n const fromAccount = this.accountToString(options.from);\n\n if (fromAccount !== this.operatorId) {\n throw new PointsBurnError(\n 'For public topics, transaction payer must match burner',\n options.tick,\n fromAccount,\n options.amount,\n );\n }\n\n progressCallback?.({\n stage: 'submitting',\n percentage: 50,\n });\n\n const topicId = options.topicId\n ? this.topicToString(options.topicId)\n : this.publicTopicId;\n const burnTransaction = buildHcs20BurnTx({\n topicId,\n tick: options.tick,\n amt: options.amount,\n from: fromAccount,\n memo: options.memo,\n });\n\n const { transactionId: burnTxId } =\n await this.submitPayload(burnTransaction);\n\n progressCallback?.({\n stage: 'confirming',\n percentage: 80,\n burnTxId,\n });\n\n await this.waitForMirrorNodeConfirmation(topicId, burnTxId);\n\n progressCallback?.({\n stage: 'complete',\n percentage: 100,\n burnTxId,\n });\n\n const transaction: PointsTransaction = {\n id: burnTxId,\n operation: 'burn',\n tick: normalizedTick,\n amount: options.amount,\n from: fromAccount,\n timestamp: new Date().toISOString(),\n sequenceNumber: 0,\n topicId,\n transactionId: burnTxId,\n memo: options.memo,\n };\n\n return transaction;\n } catch (error) {\n progressCallback?.({\n stage: 'complete',\n percentage: 100,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n throw error;\n }\n }\n\n /**\n * Register a topic in the registry\n */\n async registerTopic(options: RegisterTopicOptions): Promise<void> {\n await this.ensureInitialized();\n const { progressCallback } = options;\n\n try {\n progressCallback?.({\n stage: 'validating',\n percentage: 20,\n });\n\n const registerMessage: HCS20RegisterMessage = {\n p: 'hcs-20',\n op: 'register',\n name: options.name,\n metadata: options.metadata,\n private: options.isPrivate,\n t_id: this.topicToString(options.topicId),\n m: options.memo,\n };\n\n const validation = this.validateMessage(registerMessage);\n if (!validation.valid) {\n throw new PointsValidationError(\n 'Invalid register message',\n validation.errors!,\n );\n }\n\n if (!this.registryTopicId) {\n throw new PointsDeploymentError(\n 'Registry topic not available',\n options.name,\n );\n }\n\n progressCallback?.({\n stage: 'submitting',\n percentage: 50,\n });\n\n const registerTransaction = buildHcs20RegisterTx({\n registryTopicId: this.registryTopicId,\n name: options.name,\n topicId: this.topicToString(options.topicId),\n isPrivate: options.isPrivate,\n metadata: options.metadata,\n memo: options.memo,\n });\n\n const { transactionId: registerTxId } = await this.submitPayload(\n registerTransaction,\n this.operatorCtx.operatorKey,\n );\n\n progressCallback?.({\n stage: 'confirming',\n percentage: 80,\n registerTxId,\n });\n\n await this.waitForMirrorNodeConfirmation(\n this.registryTopicId,\n registerTxId,\n );\n\n progressCallback?.({\n stage: 'complete',\n percentage: 100,\n registerTxId,\n });\n\n this.logger.info(`Registered topic ${options.topicId} in registry`);\n } catch (error) {\n progressCallback?.({\n stage: 'complete',\n percentage: 100,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n throw error;\n }\n }\n\n /**\n * Wait for mirror node to index a message\n */\n private async waitForMirrorNodeConfirmation(\n topicId: string,\n transactionId: string,\n maxRetries = 10,\n ): Promise<void> {\n for (let i = 0; i < maxRetries; i++) {\n try {\n const messages = await this.mirrorNode.getTopicMessages(topicId, {\n limit: 10,\n order: 'desc',\n });\n\n const found = messages.some(message => {\n if (typeof message !== 'object' || message === null) {\n return false;\n }\n const candidate = message as { consensus_timestamp?: unknown };\n return typeof candidate.consensus_timestamp === 'string';\n });\n\n if (found) {\n this.logger.debug(\n `Transaction ${transactionId} confirmed on mirror node`,\n );\n return;\n }\n } catch (error) {\n this.logger.debug(`Mirror node check attempt ${i + 1} failed:`, error);\n }\n\n await sleep(2000);\n }\n\n this.logger.warn(\n `Transaction ${transactionId} not found on mirror node after ${maxRetries} attempts`,\n );\n }\n}\n"],"names":[],"mappings":"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"}
@@ -17,7 +17,7 @@ class HCS21Client extends HCS21BaseClient {
17
17
  logger,
18
18
  mirrorNodeUrl: config.mirrorNodeUrl
19
19
  });
20
- const baseClient = config.network === "mainnet" ? Client.forMainnet() : Client.forTestnet();
20
+ const baseClient = config.client ?? (config.network === "mainnet" ? Client.forMainnet() : Client.forTestnet());
21
21
  this.operatorCtx = createNodeOperatorContext({
22
22
  network: config.network,
23
23
  operatorId: config.operatorId,
@@ -1 +1 @@
1
- {"version":3,"file":"standards-sdk.es90.js","sources":["../../src/hcs-21/sdk.ts"],"sourcesContent":["import {\n Client,\n PrivateKey,\n Status,\n TopicCreateTransaction,\n} from '@hashgraph/sdk';\nimport {\n createNodeOperatorContext,\n NodeOperatorContext,\n} from '../common/node-operator-resolver';\nimport { Logger, ILogger, LogLevel } from '../utils/logger';\nimport { NetworkType } from '../utils/types';\nimport { HCS21BaseClient, BuildDeclarationParams } from './base-client';\nimport {\n AdapterDeclaration,\n HCS21ManifestPointerPattern,\n HCS21MetadataDocument,\n HCS21TopicType,\n ManifestPointer,\n metadataDocumentSchema,\n} from './types';\nimport { buildHcs21CreateRegistryTx, buildHcs21MessageTx } from './tx';\nimport { buildHcs2CreateRegistryTx, buildHcs2RegisterTx } from '../hcs-2/tx';\nimport { HCS2RegistryType } from '../hcs-2/types';\nimport { HCS21ValidationError } from './errors';\nimport { MaybeKey } from '../common/tx/tx-utils';\nimport { inscribe } from '../inscribe/inscriber';\nimport type { InscriptionOptions } from '../inscribe/types';\nimport { getTopicId } from '../utils/topic-id-utils';\n\nexport interface HCS21ClientConfig {\n network: NetworkType;\n operatorId: string;\n operatorKey: string | PrivateKey;\n keyType?: 'ed25519' | 'ecdsa';\n logLevel?: LogLevel;\n logger?: ILogger;\n mirrorNodeUrl?: string;\n}\n\nexport interface CreateRegistryTopicParams {\n ttl: number;\n indexed?: 0 | 1;\n type?: HCS21TopicType;\n metaTopicId?: string;\n adminKey?: MaybeKey;\n submitKey?: MaybeKey;\n transactionMemo?: string;\n}\n\nexport interface PublishDeclarationResult {\n sequenceNumber?: number;\n transactionId: string;\n}\n\nexport interface PublishDeclarationParams {\n topicId: string;\n declaration: AdapterDeclaration | BuildDeclarationParams;\n transactionMemo?: string;\n}\n\nexport interface InscribeMetadataParams {\n document: HCS21MetadataDocument;\n fileName?: string;\n inscriptionOptions?: InscriptionOptions;\n}\n\nexport interface CreateAdapterVersionPointerTopicParams {\n ttl: number;\n adminKey?: MaybeKey;\n submitKey?: MaybeKey;\n transactionMemo?: string;\n memoOverride?: string;\n}\n\nexport interface CreateRegistryDiscoveryTopicParams {\n ttl: number;\n adminKey?: MaybeKey;\n submitKey?: MaybeKey;\n transactionMemo?: string;\n memoOverride?: string;\n}\n\nexport interface CreateAdapterCategoryTopicParams {\n ttl: number;\n indexed?: 0 | 1;\n metaTopicId?: string;\n adminKey?: MaybeKey;\n submitKey?: MaybeKey;\n transactionMemo?: string;\n}\n\nexport interface PublishVersionPointerParams {\n versionTopicId: string;\n declarationTopicId: string;\n memo?: string;\n transactionMemo?: string;\n}\n\nexport interface RegisterCategoryTopicParams {\n discoveryTopicId: string;\n categoryTopicId: string;\n metadata?: string;\n memo?: string;\n transactionMemo?: string;\n}\n\nexport interface PublishCategoryEntryParams {\n categoryTopicId: string;\n adapterId: string;\n versionTopicId: string;\n metadata?: string;\n memo?: string;\n transactionMemo?: string;\n}\n\nexport interface VersionPointerResolution {\n versionTopicId: string;\n declarationTopicId: string;\n sequenceNumber: number;\n payer?: string;\n memo?: string;\n op?: string;\n}\n\nexport class HCS21Client extends HCS21BaseClient {\n private readonly client: Client;\n private readonly operatorCtx: NodeOperatorContext;\n\n constructor(config: HCS21ClientConfig) {\n const logger =\n config.logger ||\n new Logger({ level: config.logLevel || 'info', module: 'HCS-21' });\n super({\n network: config.network,\n logger,\n mirrorNodeUrl: config.mirrorNodeUrl,\n });\n\n const baseClient =\n config.network === 'mainnet' ? Client.forMainnet() : Client.forTestnet();\n\n this.operatorCtx = createNodeOperatorContext({\n network: config.network,\n operatorId: config.operatorId,\n operatorKey: config.operatorKey,\n keyType: config.keyType,\n mirrorNode: this.mirrorNode,\n logger: this.logger,\n client: baseClient,\n });\n\n void this.operatorCtx.ensureInitialized();\n this.client = this.operatorCtx.client;\n }\n\n async inscribeMetadata(\n params: InscribeMetadataParams,\n ): Promise<ManifestPointer> {\n await this.operatorCtx.ensureInitialized();\n\n const metadataPayload = metadataDocumentSchema.parse(params.document);\n const metadataJson = JSON.stringify(metadataPayload, null, 2);\n const buffer = Buffer.from(metadataJson, 'utf8');\n const connectionMode =\n params.inscriptionOptions?.connectionMode ??\n (params.inscriptionOptions?.websocket === false ? 'http' : 'auto');\n const inscriptionOptions: InscriptionOptions = {\n waitForConfirmation: true,\n connectionMode,\n websocket: params.inscriptionOptions?.websocket ?? false,\n ...(params.inscriptionOptions || {}),\n metadata: {\n ...(params.inscriptionOptions?.metadata || {}),\n ...metadataPayload,\n },\n };\n\n const inscription = await inscribe(\n {\n type: 'buffer',\n buffer,\n fileName:\n params.fileName || `hcs21-adapter-manifest-${Date.now()}.json`,\n mimeType: 'application/json',\n },\n {\n accountId: this.operatorCtx.operatorId.toString(),\n privateKey: this.operatorCtx.operatorKey,\n network: this.network,\n },\n inscriptionOptions,\n );\n\n if (!inscription.confirmed || !inscription.inscription) {\n throw new HCS21ValidationError(\n 'Failed to inscribe HCS-21 metadata',\n 'invalid_payload',\n );\n }\n\n const topicId =\n (inscription.inscription as { jsonTopicId?: string }).jsonTopicId ||\n (inscription.inscription as { topic_id?: string }).topic_id ||\n getTopicId(inscription.inscription);\n\n if (!topicId) {\n throw new HCS21ValidationError(\n 'Metadata inscription did not return a topic ID',\n 'invalid_payload',\n );\n }\n\n const rawSequence =\n (inscription.inscription as { sequence_number?: number })\n .sequence_number ??\n (inscription.inscription as { sequenceNumber?: number }).sequenceNumber;\n\n const pointerResult = await this.resolveManifestPointer(\n topicId,\n rawSequence,\n );\n\n const declarationManifestSequence = (\n inscription.result as { manifest_sequence?: number }\n )?.manifest_sequence;\n\n const resultDetails =\n inscription.result && 'jobId' in inscription.result\n ? {\n jobId: inscription.result.jobId,\n transactionId: inscription.result.transactionId,\n totalCostHbar: inscription.costSummary?.totalCostHbar,\n costBreakdown: inscription.costSummary?.breakdown,\n }\n : {};\n\n return {\n pointer: pointerResult.pointer,\n topicId,\n sequenceNumber: pointerResult.sequenceNumber,\n manifestSequence:\n declarationManifestSequence || pointerResult.sequenceNumber,\n ...resultDetails,\n };\n }\n\n async createRegistryTopic(\n params: CreateRegistryTopicParams,\n ): Promise<string> {\n await this.operatorCtx.ensureInitialized();\n\n const tx: TopicCreateTransaction = buildHcs21CreateRegistryTx({\n ttl: params.ttl,\n indexed: params.indexed,\n type: params.type,\n metaTopicId: params.metaTopicId,\n adminKey: params.adminKey,\n submitKey: params.submitKey,\n operatorPublicKey: this.operatorCtx.operatorKey.publicKey,\n });\n\n if (params.transactionMemo) {\n tx.setTransactionMemo(params.transactionMemo);\n }\n\n const response = await tx.execute(this.client);\n const receipt = await response.getReceipt(this.client);\n\n if (receipt.status !== Status.Success || !receipt.topicId) {\n throw new HCS21ValidationError(\n 'Failed to create HCS-21 registry topic',\n 'invalid_payload',\n );\n }\n\n return receipt.topicId.toString();\n }\n\n async createAdapterVersionPointerTopic(\n params: CreateAdapterVersionPointerTopicParams,\n ): Promise<string> {\n await this.operatorCtx.ensureInitialized();\n\n const tx = buildHcs2CreateRegistryTx({\n registryType: HCS2RegistryType.NON_INDEXED,\n ttl: params.ttl,\n adminKey: params.adminKey,\n submitKey: params.submitKey,\n memoOverride: params.memoOverride,\n operatorPublicKey: this.operatorCtx.operatorKey.publicKey,\n });\n\n if (params.transactionMemo) {\n tx.setTransactionMemo(params.transactionMemo);\n }\n\n const response = await tx.execute(this.client);\n const receipt = await response.getReceipt(this.client);\n\n if (receipt.status !== Status.Success || !receipt.topicId) {\n throw new HCS21ValidationError(\n 'Failed to create HCS-2 registry version topic',\n 'invalid_payload',\n );\n }\n\n return receipt.topicId.toString();\n }\n\n async createRegistryDiscoveryTopic(\n params: CreateRegistryDiscoveryTopicParams,\n ): Promise<string> {\n await this.operatorCtx.ensureInitialized();\n\n const tx = buildHcs2CreateRegistryTx({\n registryType: HCS2RegistryType.INDEXED,\n ttl: params.ttl,\n adminKey: params.adminKey,\n submitKey: params.submitKey,\n memoOverride: params.memoOverride,\n operatorPublicKey: this.operatorCtx.operatorKey.publicKey,\n });\n\n if (params.transactionMemo) {\n tx.setTransactionMemo(params.transactionMemo);\n }\n\n const response = await tx.execute(this.client);\n const receipt = await response.getReceipt(this.client);\n\n if (receipt.status !== Status.Success || !receipt.topicId) {\n throw new HCS21ValidationError(\n 'Failed to create registry-of-registries topic',\n 'invalid_payload',\n );\n }\n\n return receipt.topicId.toString();\n }\n\n async createAdapterCategoryTopic(\n params: CreateAdapterCategoryTopicParams,\n ): Promise<string> {\n await this.operatorCtx.ensureInitialized();\n\n const tx: TopicCreateTransaction = buildHcs21CreateRegistryTx({\n ttl: params.ttl,\n indexed: params.indexed ?? 0,\n type: HCS21TopicType.ADAPTER_CATEGORY,\n metaTopicId: params.metaTopicId,\n adminKey: params.adminKey,\n submitKey: params.submitKey,\n operatorPublicKey: this.operatorCtx.operatorKey.publicKey,\n });\n\n if (params.transactionMemo) {\n tx.setTransactionMemo(params.transactionMemo);\n }\n\n const response = await tx.execute(this.client);\n const receipt = await response.getReceipt(this.client);\n\n if (receipt.status !== Status.Success || !receipt.topicId) {\n throw new HCS21ValidationError(\n 'Failed to create adapter category topic',\n 'invalid_payload',\n );\n }\n\n return receipt.topicId.toString();\n }\n\n /**\n * Publish a pointer from a version topic to the active declaration topic.\n * Version pointer messages carry no metadata.\n */\n async publishVersionPointer(\n params: PublishVersionPointerParams,\n ): Promise<PublishDeclarationResult> {\n await this.operatorCtx.ensureInitialized();\n\n const tx = buildHcs2RegisterTx({\n registryTopicId: params.versionTopicId,\n targetTopicId: params.declarationTopicId,\n memo: params.memo,\n analyticsMemo: params.transactionMemo,\n });\n\n const response = await tx.execute(this.client);\n const receipt = await response.getReceipt(this.client);\n\n if (receipt.status !== Status.Success) {\n throw new HCS21ValidationError(\n 'Failed to publish registry version pointer',\n 'invalid_payload',\n );\n }\n\n return {\n sequenceNumber: receipt.topicSequenceNumber?.toNumber(),\n transactionId: response.transactionId.toString(),\n };\n }\n\n async resolveVersionPointer(\n versionTopicId: string,\n ): Promise<VersionPointerResolution> {\n const [latest] = await this.mirrorNode.getTopicMessages(versionTopicId, {\n limit: 1,\n order: 'desc',\n });\n\n if (!latest) {\n throw new HCS21ValidationError(\n 'Version pointer topic has no messages',\n 'invalid_payload',\n );\n }\n\n const declarationTopicId = (latest as { t_id?: unknown }).t_id;\n\n if (\n typeof declarationTopicId !== 'string' ||\n declarationTopicId.length === 0\n ) {\n throw new HCS21ValidationError(\n 'Version pointer topic does not include a declaration topic ID (`t_id`)',\n 'invalid_payload',\n );\n }\n\n const rawSequence =\n typeof latest.sequence_number === 'number'\n ? latest.sequence_number\n : Number(latest.sequence_number);\n const sequenceNumber = Number.isFinite(rawSequence) ? rawSequence : 0;\n\n return {\n versionTopicId,\n declarationTopicId,\n sequenceNumber,\n payer: (latest as { payer?: string }).payer,\n memo: (latest as { m?: string }).m,\n op: (latest as { op?: string }).op,\n };\n }\n\n async registerCategoryTopic(\n params: RegisterCategoryTopicParams,\n ): Promise<PublishDeclarationResult> {\n await this.operatorCtx.ensureInitialized();\n\n const tx = buildHcs2RegisterTx({\n registryTopicId: params.discoveryTopicId,\n targetTopicId: params.categoryTopicId,\n metadata: params.metadata,\n memo: params.memo,\n analyticsMemo: params.transactionMemo,\n });\n\n const response = await tx.execute(this.client);\n const receipt = await response.getReceipt(this.client);\n\n if (receipt.status !== Status.Success) {\n throw new HCS21ValidationError(\n 'Failed to register adapter category topic',\n 'invalid_payload',\n );\n }\n\n return {\n sequenceNumber: receipt.topicSequenceNumber?.toNumber(),\n transactionId: response.transactionId.toString(),\n };\n }\n\n async publishCategoryEntry(\n params: PublishCategoryEntryParams,\n ): Promise<PublishDeclarationResult> {\n await this.operatorCtx.ensureInitialized();\n\n const memo = params.memo ?? `adapter:${params.adapterId}`;\n const tx = buildHcs2RegisterTx({\n registryTopicId: params.categoryTopicId,\n targetTopicId: params.versionTopicId,\n metadata: params.metadata,\n memo,\n analyticsMemo: params.transactionMemo,\n });\n\n const response = await tx.execute(this.client);\n const receipt = await response.getReceipt(this.client);\n\n if (receipt.status !== Status.Success) {\n throw new HCS21ValidationError(\n 'Failed to publish adapter category entry',\n 'invalid_payload',\n );\n }\n\n return {\n sequenceNumber: receipt.topicSequenceNumber?.toNumber(),\n transactionId: response.transactionId.toString(),\n };\n }\n\n async publishDeclaration(\n params: PublishDeclarationParams,\n ): Promise<PublishDeclarationResult> {\n await this.operatorCtx.ensureInitialized();\n\n const declaration = this.normalizeDeclarationInput(params.declaration);\n const tx = buildHcs21MessageTx({\n topicId: params.topicId,\n declaration,\n transactionMemo: params.transactionMemo,\n });\n\n const response = await tx.execute(this.client);\n const receipt = await response.getReceipt(this.client);\n\n if (receipt.status !== Status.Success) {\n throw new HCS21ValidationError(\n 'Failed to submit HCS-21 declaration',\n 'invalid_payload',\n );\n }\n\n return {\n sequenceNumber: receipt.topicSequenceNumber?.toNumber(),\n transactionId: response.transactionId.toString(),\n };\n }\n\n private normalizeDeclarationInput(\n declaration: AdapterDeclaration | BuildDeclarationParams,\n ): AdapterDeclaration {\n if ('p' in declaration) {\n return this.validateDeclaration(declaration);\n }\n return this.buildDeclaration(declaration);\n }\n\n private async resolveManifestPointer(\n topicId: string,\n sequence?: number,\n ): Promise<{ pointer: string; sequenceNumber: number }> {\n const numericSequence =\n typeof sequence === 'string' ? Number(sequence) : sequence;\n let resolvedSequence =\n typeof numericSequence === 'number' && Number.isFinite(numericSequence)\n ? numericSequence\n : undefined;\n\n if (!resolvedSequence) {\n const [latest] = await this.mirrorNode.getTopicMessages(topicId, {\n limit: 1,\n order: 'desc',\n });\n\n if (!latest || !latest.sequence_number) {\n throw new HCS21ValidationError(\n 'Unable to resolve manifest sequence number',\n 'invalid_payload',\n );\n }\n\n resolvedSequence = Number(latest.sequence_number);\n }\n\n if (!Number.isFinite(resolvedSequence)) {\n throw new HCS21ValidationError(\n 'Invalid manifest sequence number',\n 'invalid_payload',\n );\n }\n\n const pointer = `hcs://1/${topicId}`;\n\n if (!HCS21ManifestPointerPattern.test(pointer)) {\n throw new HCS21ValidationError(\n 'Manifest pointer format is invalid',\n 'invalid_payload',\n );\n }\n\n return { pointer, sequenceNumber: resolvedSequence };\n }\n}\n"],"names":[],"mappings":";;;;;;;;;;;AA6HO,MAAM,oBAAoB,gBAAgB;AAAA,EAI/C,YAAY,QAA2B;AACrC,UAAM,SACJ,OAAO,UACP,IAAI,OAAO,EAAE,OAAO,OAAO,YAAY,QAAQ,QAAQ,SAAA,CAAU;AACnE,UAAM;AAAA,MACJ,SAAS,OAAO;AAAA,MAChB;AAAA,MACA,eAAe,OAAO;AAAA,IAAA,CACvB;AAED,UAAM,aACJ,OAAO,YAAY,YAAY,OAAO,WAAA,IAAe,OAAO,WAAA;AAE9D,SAAK,cAAc,0BAA0B;AAAA,MAC3C,SAAS,OAAO;AAAA,MAChB,YAAY,OAAO;AAAA,MACnB,aAAa,OAAO;AAAA,MACpB,SAAS,OAAO;AAAA,MAChB,YAAY,KAAK;AAAA,MACjB,QAAQ,KAAK;AAAA,MACb,QAAQ;AAAA,IAAA,CACT;AAED,SAAK,KAAK,YAAY,kBAAA;AACtB,SAAK,SAAS,KAAK,YAAY;AAAA,EACjC;AAAA,EAEA,MAAM,iBACJ,QAC0B;AAC1B,UAAM,KAAK,YAAY,kBAAA;AAEvB,UAAM,kBAAkB,uBAAuB,MAAM,OAAO,QAAQ;AACpE,UAAM,eAAe,KAAK,UAAU,iBAAiB,MAAM,CAAC;AAC5D,UAAM,SAAS,OAAO,KAAK,cAAc,MAAM;AAC/C,UAAM,iBACJ,OAAO,oBAAoB,mBAC1B,OAAO,oBAAoB,cAAc,QAAQ,SAAS;AAC7D,UAAM,qBAAyC;AAAA,MAC7C,qBAAqB;AAAA,MACrB;AAAA,MACA,WAAW,OAAO,oBAAoB,aAAa;AAAA,MACnD,GAAI,OAAO,sBAAsB,CAAA;AAAA,MACjC,UAAU;AAAA,QACR,GAAI,OAAO,oBAAoB,YAAY,CAAA;AAAA,QAC3C,GAAG;AAAA,MAAA;AAAA,IACL;AAGF,UAAM,cAAc,MAAM;AAAA,MACxB;AAAA,QACE,MAAM;AAAA,QACN;AAAA,QACA,UACE,OAAO,YAAY,0BAA0B,KAAK,KAAK;AAAA,QACzD,UAAU;AAAA,MAAA;AAAA,MAEZ;AAAA,QACE,WAAW,KAAK,YAAY,WAAW,SAAA;AAAA,QACvC,YAAY,KAAK,YAAY;AAAA,QAC7B,SAAS,KAAK;AAAA,MAAA;AAAA,MAEhB;AAAA,IAAA;AAGF,QAAI,CAAC,YAAY,aAAa,CAAC,YAAY,aAAa;AACtD,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ;AAEA,UAAM,UACH,YAAY,YAAyC,eACrD,YAAY,YAAsC,YACnD,WAAW,YAAY,WAAW;AAEpC,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ;AAEA,UAAM,cACH,YAAY,YACV,mBACF,YAAY,YAA4C;AAE3D,UAAM,gBAAgB,MAAM,KAAK;AAAA,MAC/B;AAAA,MACA;AAAA,IAAA;AAGF,UAAM,8BACJ,YAAY,QACX;AAEH,UAAM,gBACJ,YAAY,UAAU,WAAW,YAAY,SACzC;AAAA,MACE,OAAO,YAAY,OAAO;AAAA,MAC1B,eAAe,YAAY,OAAO;AAAA,MAClC,eAAe,YAAY,aAAa;AAAA,MACxC,eAAe,YAAY,aAAa;AAAA,IAAA,IAE1C,CAAA;AAEN,WAAO;AAAA,MACL,SAAS,cAAc;AAAA,MACvB;AAAA,MACA,gBAAgB,cAAc;AAAA,MAC9B,kBACE,+BAA+B,cAAc;AAAA,MAC/C,GAAG;AAAA,IAAA;AAAA,EAEP;AAAA,EAEA,MAAM,oBACJ,QACiB;AACjB,UAAM,KAAK,YAAY,kBAAA;AAEvB,UAAM,KAA6B,2BAA2B;AAAA,MAC5D,KAAK,OAAO;AAAA,MACZ,SAAS,OAAO;AAAA,MAChB,MAAM,OAAO;AAAA,MACb,aAAa,OAAO;AAAA,MACpB,UAAU,OAAO;AAAA,MACjB,WAAW,OAAO;AAAA,MAClB,mBAAmB,KAAK,YAAY,YAAY;AAAA,IAAA,CACjD;AAED,QAAI,OAAO,iBAAiB;AAC1B,SAAG,mBAAmB,OAAO,eAAe;AAAA,IAC9C;AAEA,UAAM,WAAW,MAAM,GAAG,QAAQ,KAAK,MAAM;AAC7C,UAAM,UAAU,MAAM,SAAS,WAAW,KAAK,MAAM;AAErD,QAAI,QAAQ,WAAW,OAAO,WAAW,CAAC,QAAQ,SAAS;AACzD,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ;AAEA,WAAO,QAAQ,QAAQ,SAAA;AAAA,EACzB;AAAA,EAEA,MAAM,iCACJ,QACiB;AACjB,UAAM,KAAK,YAAY,kBAAA;AAEvB,UAAM,KAAK,0BAA0B;AAAA,MACnC,cAAc,iBAAiB;AAAA,MAC/B,KAAK,OAAO;AAAA,MACZ,UAAU,OAAO;AAAA,MACjB,WAAW,OAAO;AAAA,MAClB,cAAc,OAAO;AAAA,MACrB,mBAAmB,KAAK,YAAY,YAAY;AAAA,IAAA,CACjD;AAED,QAAI,OAAO,iBAAiB;AAC1B,SAAG,mBAAmB,OAAO,eAAe;AAAA,IAC9C;AAEA,UAAM,WAAW,MAAM,GAAG,QAAQ,KAAK,MAAM;AAC7C,UAAM,UAAU,MAAM,SAAS,WAAW,KAAK,MAAM;AAErD,QAAI,QAAQ,WAAW,OAAO,WAAW,CAAC,QAAQ,SAAS;AACzD,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ;AAEA,WAAO,QAAQ,QAAQ,SAAA;AAAA,EACzB;AAAA,EAEA,MAAM,6BACJ,QACiB;AACjB,UAAM,KAAK,YAAY,kBAAA;AAEvB,UAAM,KAAK,0BAA0B;AAAA,MACnC,cAAc,iBAAiB;AAAA,MAC/B,KAAK,OAAO;AAAA,MACZ,UAAU,OAAO;AAAA,MACjB,WAAW,OAAO;AAAA,MAClB,cAAc,OAAO;AAAA,MACrB,mBAAmB,KAAK,YAAY,YAAY;AAAA,IAAA,CACjD;AAED,QAAI,OAAO,iBAAiB;AAC1B,SAAG,mBAAmB,OAAO,eAAe;AAAA,IAC9C;AAEA,UAAM,WAAW,MAAM,GAAG,QAAQ,KAAK,MAAM;AAC7C,UAAM,UAAU,MAAM,SAAS,WAAW,KAAK,MAAM;AAErD,QAAI,QAAQ,WAAW,OAAO,WAAW,CAAC,QAAQ,SAAS;AACzD,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ;AAEA,WAAO,QAAQ,QAAQ,SAAA;AAAA,EACzB;AAAA,EAEA,MAAM,2BACJ,QACiB;AACjB,UAAM,KAAK,YAAY,kBAAA;AAEvB,UAAM,KAA6B,2BAA2B;AAAA,MAC5D,KAAK,OAAO;AAAA,MACZ,SAAS,OAAO,WAAW;AAAA,MAC3B,MAAM,eAAe;AAAA,MACrB,aAAa,OAAO;AAAA,MACpB,UAAU,OAAO;AAAA,MACjB,WAAW,OAAO;AAAA,MAClB,mBAAmB,KAAK,YAAY,YAAY;AAAA,IAAA,CACjD;AAED,QAAI,OAAO,iBAAiB;AAC1B,SAAG,mBAAmB,OAAO,eAAe;AAAA,IAC9C;AAEA,UAAM,WAAW,MAAM,GAAG,QAAQ,KAAK,MAAM;AAC7C,UAAM,UAAU,MAAM,SAAS,WAAW,KAAK,MAAM;AAErD,QAAI,QAAQ,WAAW,OAAO,WAAW,CAAC,QAAQ,SAAS;AACzD,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ;AAEA,WAAO,QAAQ,QAAQ,SAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,sBACJ,QACmC;AACnC,UAAM,KAAK,YAAY,kBAAA;AAEvB,UAAM,KAAK,oBAAoB;AAAA,MAC7B,iBAAiB,OAAO;AAAA,MACxB,eAAe,OAAO;AAAA,MACtB,MAAM,OAAO;AAAA,MACb,eAAe,OAAO;AAAA,IAAA,CACvB;AAED,UAAM,WAAW,MAAM,GAAG,QAAQ,KAAK,MAAM;AAC7C,UAAM,UAAU,MAAM,SAAS,WAAW,KAAK,MAAM;AAErD,QAAI,QAAQ,WAAW,OAAO,SAAS;AACrC,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ;AAEA,WAAO;AAAA,MACL,gBAAgB,QAAQ,qBAAqB,SAAA;AAAA,MAC7C,eAAe,SAAS,cAAc,SAAA;AAAA,IAAS;AAAA,EAEnD;AAAA,EAEA,MAAM,sBACJ,gBACmC;AACnC,UAAM,CAAC,MAAM,IAAI,MAAM,KAAK,WAAW,iBAAiB,gBAAgB;AAAA,MACtE,OAAO;AAAA,MACP,OAAO;AAAA,IAAA,CACR;AAED,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ;AAEA,UAAM,qBAAsB,OAA8B;AAE1D,QACE,OAAO,uBAAuB,YAC9B,mBAAmB,WAAW,GAC9B;AACA,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ;AAEA,UAAM,cACJ,OAAO,OAAO,oBAAoB,WAC9B,OAAO,kBACP,OAAO,OAAO,eAAe;AACnC,UAAM,iBAAiB,OAAO,SAAS,WAAW,IAAI,cAAc;AAEpE,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAQ,OAA8B;AAAA,MACtC,MAAO,OAA0B;AAAA,MACjC,IAAK,OAA2B;AAAA,IAAA;AAAA,EAEpC;AAAA,EAEA,MAAM,sBACJ,QACmC;AACnC,UAAM,KAAK,YAAY,kBAAA;AAEvB,UAAM,KAAK,oBAAoB;AAAA,MAC7B,iBAAiB,OAAO;AAAA,MACxB,eAAe,OAAO;AAAA,MACtB,UAAU,OAAO;AAAA,MACjB,MAAM,OAAO;AAAA,MACb,eAAe,OAAO;AAAA,IAAA,CACvB;AAED,UAAM,WAAW,MAAM,GAAG,QAAQ,KAAK,MAAM;AAC7C,UAAM,UAAU,MAAM,SAAS,WAAW,KAAK,MAAM;AAErD,QAAI,QAAQ,WAAW,OAAO,SAAS;AACrC,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ;AAEA,WAAO;AAAA,MACL,gBAAgB,QAAQ,qBAAqB,SAAA;AAAA,MAC7C,eAAe,SAAS,cAAc,SAAA;AAAA,IAAS;AAAA,EAEnD;AAAA,EAEA,MAAM,qBACJ,QACmC;AACnC,UAAM,KAAK,YAAY,kBAAA;AAEvB,UAAM,OAAO,OAAO,QAAQ,WAAW,OAAO,SAAS;AACvD,UAAM,KAAK,oBAAoB;AAAA,MAC7B,iBAAiB,OAAO;AAAA,MACxB,eAAe,OAAO;AAAA,MACtB,UAAU,OAAO;AAAA,MACjB;AAAA,MACA,eAAe,OAAO;AAAA,IAAA,CACvB;AAED,UAAM,WAAW,MAAM,GAAG,QAAQ,KAAK,MAAM;AAC7C,UAAM,UAAU,MAAM,SAAS,WAAW,KAAK,MAAM;AAErD,QAAI,QAAQ,WAAW,OAAO,SAAS;AACrC,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ;AAEA,WAAO;AAAA,MACL,gBAAgB,QAAQ,qBAAqB,SAAA;AAAA,MAC7C,eAAe,SAAS,cAAc,SAAA;AAAA,IAAS;AAAA,EAEnD;AAAA,EAEA,MAAM,mBACJ,QACmC;AACnC,UAAM,KAAK,YAAY,kBAAA;AAEvB,UAAM,cAAc,KAAK,0BAA0B,OAAO,WAAW;AACrE,UAAM,KAAK,oBAAoB;AAAA,MAC7B,SAAS,OAAO;AAAA,MAChB;AAAA,MACA,iBAAiB,OAAO;AAAA,IAAA,CACzB;AAED,UAAM,WAAW,MAAM,GAAG,QAAQ,KAAK,MAAM;AAC7C,UAAM,UAAU,MAAM,SAAS,WAAW,KAAK,MAAM;AAErD,QAAI,QAAQ,WAAW,OAAO,SAAS;AACrC,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ;AAEA,WAAO;AAAA,MACL,gBAAgB,QAAQ,qBAAqB,SAAA;AAAA,MAC7C,eAAe,SAAS,cAAc,SAAA;AAAA,IAAS;AAAA,EAEnD;AAAA,EAEQ,0BACN,aACoB;AACpB,QAAI,OAAO,aAAa;AACtB,aAAO,KAAK,oBAAoB,WAAW;AAAA,IAC7C;AACA,WAAO,KAAK,iBAAiB,WAAW;AAAA,EAC1C;AAAA,EAEA,MAAc,uBACZ,SACA,UACsD;AACtD,UAAM,kBACJ,OAAO,aAAa,WAAW,OAAO,QAAQ,IAAI;AACpD,QAAI,mBACF,OAAO,oBAAoB,YAAY,OAAO,SAAS,eAAe,IAClE,kBACA;AAEN,QAAI,CAAC,kBAAkB;AACrB,YAAM,CAAC,MAAM,IAAI,MAAM,KAAK,WAAW,iBAAiB,SAAS;AAAA,QAC/D,OAAO;AAAA,QACP,OAAO;AAAA,MAAA,CACR;AAED,UAAI,CAAC,UAAU,CAAC,OAAO,iBAAiB;AACtC,cAAM,IAAI;AAAA,UACR;AAAA,UACA;AAAA,QAAA;AAAA,MAEJ;AAEA,yBAAmB,OAAO,OAAO,eAAe;AAAA,IAClD;AAEA,QAAI,CAAC,OAAO,SAAS,gBAAgB,GAAG;AACtC,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ;AAEA,UAAM,UAAU,WAAW,OAAO;AAElC,QAAI,CAAC,4BAA4B,KAAK,OAAO,GAAG;AAC9C,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ;AAEA,WAAO,EAAE,SAAS,gBAAgB,iBAAA;AAAA,EACpC;AACF;"}
1
+ {"version":3,"file":"standards-sdk.es90.js","sources":["../../src/hcs-21/sdk.ts"],"sourcesContent":["import {\n Client,\n PrivateKey,\n Status,\n TopicCreateTransaction,\n} from '@hashgraph/sdk';\nimport {\n createNodeOperatorContext,\n NodeOperatorContext,\n} from '../common/node-operator-resolver';\nimport { Logger, ILogger, LogLevel } from '../utils/logger';\nimport { NetworkType } from '../utils/types';\nimport { HCS21BaseClient, BuildDeclarationParams } from './base-client';\nimport {\n AdapterDeclaration,\n HCS21ManifestPointerPattern,\n HCS21MetadataDocument,\n HCS21TopicType,\n ManifestPointer,\n metadataDocumentSchema,\n} from './types';\nimport { buildHcs21CreateRegistryTx, buildHcs21MessageTx } from './tx';\nimport { buildHcs2CreateRegistryTx, buildHcs2RegisterTx } from '../hcs-2/tx';\nimport { HCS2RegistryType } from '../hcs-2/types';\nimport { HCS21ValidationError } from './errors';\nimport { MaybeKey } from '../common/tx/tx-utils';\nimport { inscribe } from '../inscribe/inscriber';\nimport type { InscriptionOptions } from '../inscribe/types';\nimport { getTopicId } from '../utils/topic-id-utils';\n\nexport interface HCS21ClientConfig {\n network: NetworkType;\n operatorId: string;\n operatorKey: string | PrivateKey;\n keyType?: 'ed25519' | 'ecdsa';\n logLevel?: LogLevel;\n logger?: ILogger;\n mirrorNodeUrl?: string;\n client?: Client;\n}\n\nexport interface CreateRegistryTopicParams {\n ttl: number;\n indexed?: 0 | 1;\n type?: HCS21TopicType;\n metaTopicId?: string;\n adminKey?: MaybeKey;\n submitKey?: MaybeKey;\n transactionMemo?: string;\n}\n\nexport interface PublishDeclarationResult {\n sequenceNumber?: number;\n transactionId: string;\n}\n\nexport interface PublishDeclarationParams {\n topicId: string;\n declaration: AdapterDeclaration | BuildDeclarationParams;\n transactionMemo?: string;\n}\n\nexport interface InscribeMetadataParams {\n document: HCS21MetadataDocument;\n fileName?: string;\n inscriptionOptions?: InscriptionOptions;\n}\n\nexport interface CreateAdapterVersionPointerTopicParams {\n ttl: number;\n adminKey?: MaybeKey;\n submitKey?: MaybeKey;\n transactionMemo?: string;\n memoOverride?: string;\n}\n\nexport interface CreateRegistryDiscoveryTopicParams {\n ttl: number;\n adminKey?: MaybeKey;\n submitKey?: MaybeKey;\n transactionMemo?: string;\n memoOverride?: string;\n}\n\nexport interface CreateAdapterCategoryTopicParams {\n ttl: number;\n indexed?: 0 | 1;\n metaTopicId?: string;\n adminKey?: MaybeKey;\n submitKey?: MaybeKey;\n transactionMemo?: string;\n}\n\nexport interface PublishVersionPointerParams {\n versionTopicId: string;\n declarationTopicId: string;\n memo?: string;\n transactionMemo?: string;\n}\n\nexport interface RegisterCategoryTopicParams {\n discoveryTopicId: string;\n categoryTopicId: string;\n metadata?: string;\n memo?: string;\n transactionMemo?: string;\n}\n\nexport interface PublishCategoryEntryParams {\n categoryTopicId: string;\n adapterId: string;\n versionTopicId: string;\n metadata?: string;\n memo?: string;\n transactionMemo?: string;\n}\n\nexport interface VersionPointerResolution {\n versionTopicId: string;\n declarationTopicId: string;\n sequenceNumber: number;\n payer?: string;\n memo?: string;\n op?: string;\n}\n\nexport class HCS21Client extends HCS21BaseClient {\n private readonly client: Client;\n private readonly operatorCtx: NodeOperatorContext;\n\n constructor(config: HCS21ClientConfig) {\n const logger =\n config.logger ||\n new Logger({ level: config.logLevel || 'info', module: 'HCS-21' });\n super({\n network: config.network,\n logger,\n mirrorNodeUrl: config.mirrorNodeUrl,\n });\n\n const baseClient =\n config.client ??\n (config.network === 'mainnet' ? Client.forMainnet() : Client.forTestnet());\n\n this.operatorCtx = createNodeOperatorContext({\n network: config.network,\n operatorId: config.operatorId,\n operatorKey: config.operatorKey,\n keyType: config.keyType,\n mirrorNode: this.mirrorNode,\n logger: this.logger,\n client: baseClient,\n });\n\n void this.operatorCtx.ensureInitialized();\n this.client = this.operatorCtx.client;\n }\n\n async inscribeMetadata(\n params: InscribeMetadataParams,\n ): Promise<ManifestPointer> {\n await this.operatorCtx.ensureInitialized();\n\n const metadataPayload = metadataDocumentSchema.parse(params.document);\n const metadataJson = JSON.stringify(metadataPayload, null, 2);\n const buffer = Buffer.from(metadataJson, 'utf8');\n const connectionMode =\n params.inscriptionOptions?.connectionMode ??\n (params.inscriptionOptions?.websocket === false ? 'http' : 'auto');\n const inscriptionOptions: InscriptionOptions = {\n waitForConfirmation: true,\n connectionMode,\n websocket: params.inscriptionOptions?.websocket ?? false,\n ...(params.inscriptionOptions || {}),\n metadata: {\n ...(params.inscriptionOptions?.metadata || {}),\n ...metadataPayload,\n },\n };\n\n const inscription = await inscribe(\n {\n type: 'buffer',\n buffer,\n fileName:\n params.fileName || `hcs21-adapter-manifest-${Date.now()}.json`,\n mimeType: 'application/json',\n },\n {\n accountId: this.operatorCtx.operatorId.toString(),\n privateKey: this.operatorCtx.operatorKey,\n network: this.network,\n },\n inscriptionOptions,\n );\n\n if (!inscription.confirmed || !inscription.inscription) {\n throw new HCS21ValidationError(\n 'Failed to inscribe HCS-21 metadata',\n 'invalid_payload',\n );\n }\n\n const topicId =\n (inscription.inscription as { jsonTopicId?: string }).jsonTopicId ||\n (inscription.inscription as { topic_id?: string }).topic_id ||\n getTopicId(inscription.inscription);\n\n if (!topicId) {\n throw new HCS21ValidationError(\n 'Metadata inscription did not return a topic ID',\n 'invalid_payload',\n );\n }\n\n const rawSequence =\n (inscription.inscription as { sequence_number?: number })\n .sequence_number ??\n (inscription.inscription as { sequenceNumber?: number }).sequenceNumber;\n\n const pointerResult = await this.resolveManifestPointer(\n topicId,\n rawSequence,\n );\n\n const declarationManifestSequence = (\n inscription.result as { manifest_sequence?: number }\n )?.manifest_sequence;\n\n const resultDetails =\n inscription.result && 'jobId' in inscription.result\n ? {\n jobId: inscription.result.jobId,\n transactionId: inscription.result.transactionId,\n totalCostHbar: inscription.costSummary?.totalCostHbar,\n costBreakdown: inscription.costSummary?.breakdown,\n }\n : {};\n\n return {\n pointer: pointerResult.pointer,\n topicId,\n sequenceNumber: pointerResult.sequenceNumber,\n manifestSequence:\n declarationManifestSequence || pointerResult.sequenceNumber,\n ...resultDetails,\n };\n }\n\n async createRegistryTopic(\n params: CreateRegistryTopicParams,\n ): Promise<string> {\n await this.operatorCtx.ensureInitialized();\n\n const tx: TopicCreateTransaction = buildHcs21CreateRegistryTx({\n ttl: params.ttl,\n indexed: params.indexed,\n type: params.type,\n metaTopicId: params.metaTopicId,\n adminKey: params.adminKey,\n submitKey: params.submitKey,\n operatorPublicKey: this.operatorCtx.operatorKey.publicKey,\n });\n\n if (params.transactionMemo) {\n tx.setTransactionMemo(params.transactionMemo);\n }\n\n const response = await tx.execute(this.client);\n const receipt = await response.getReceipt(this.client);\n\n if (receipt.status !== Status.Success || !receipt.topicId) {\n throw new HCS21ValidationError(\n 'Failed to create HCS-21 registry topic',\n 'invalid_payload',\n );\n }\n\n return receipt.topicId.toString();\n }\n\n async createAdapterVersionPointerTopic(\n params: CreateAdapterVersionPointerTopicParams,\n ): Promise<string> {\n await this.operatorCtx.ensureInitialized();\n\n const tx = buildHcs2CreateRegistryTx({\n registryType: HCS2RegistryType.NON_INDEXED,\n ttl: params.ttl,\n adminKey: params.adminKey,\n submitKey: params.submitKey,\n memoOverride: params.memoOverride,\n operatorPublicKey: this.operatorCtx.operatorKey.publicKey,\n });\n\n if (params.transactionMemo) {\n tx.setTransactionMemo(params.transactionMemo);\n }\n\n const response = await tx.execute(this.client);\n const receipt = await response.getReceipt(this.client);\n\n if (receipt.status !== Status.Success || !receipt.topicId) {\n throw new HCS21ValidationError(\n 'Failed to create HCS-2 registry version topic',\n 'invalid_payload',\n );\n }\n\n return receipt.topicId.toString();\n }\n\n async createRegistryDiscoveryTopic(\n params: CreateRegistryDiscoveryTopicParams,\n ): Promise<string> {\n await this.operatorCtx.ensureInitialized();\n\n const tx = buildHcs2CreateRegistryTx({\n registryType: HCS2RegistryType.INDEXED,\n ttl: params.ttl,\n adminKey: params.adminKey,\n submitKey: params.submitKey,\n memoOverride: params.memoOverride,\n operatorPublicKey: this.operatorCtx.operatorKey.publicKey,\n });\n\n if (params.transactionMemo) {\n tx.setTransactionMemo(params.transactionMemo);\n }\n\n const response = await tx.execute(this.client);\n const receipt = await response.getReceipt(this.client);\n\n if (receipt.status !== Status.Success || !receipt.topicId) {\n throw new HCS21ValidationError(\n 'Failed to create registry-of-registries topic',\n 'invalid_payload',\n );\n }\n\n return receipt.topicId.toString();\n }\n\n async createAdapterCategoryTopic(\n params: CreateAdapterCategoryTopicParams,\n ): Promise<string> {\n await this.operatorCtx.ensureInitialized();\n\n const tx: TopicCreateTransaction = buildHcs21CreateRegistryTx({\n ttl: params.ttl,\n indexed: params.indexed ?? 0,\n type: HCS21TopicType.ADAPTER_CATEGORY,\n metaTopicId: params.metaTopicId,\n adminKey: params.adminKey,\n submitKey: params.submitKey,\n operatorPublicKey: this.operatorCtx.operatorKey.publicKey,\n });\n\n if (params.transactionMemo) {\n tx.setTransactionMemo(params.transactionMemo);\n }\n\n const response = await tx.execute(this.client);\n const receipt = await response.getReceipt(this.client);\n\n if (receipt.status !== Status.Success || !receipt.topicId) {\n throw new HCS21ValidationError(\n 'Failed to create adapter category topic',\n 'invalid_payload',\n );\n }\n\n return receipt.topicId.toString();\n }\n\n /**\n * Publish a pointer from a version topic to the active declaration topic.\n * Version pointer messages carry no metadata.\n */\n async publishVersionPointer(\n params: PublishVersionPointerParams,\n ): Promise<PublishDeclarationResult> {\n await this.operatorCtx.ensureInitialized();\n\n const tx = buildHcs2RegisterTx({\n registryTopicId: params.versionTopicId,\n targetTopicId: params.declarationTopicId,\n memo: params.memo,\n analyticsMemo: params.transactionMemo,\n });\n\n const response = await tx.execute(this.client);\n const receipt = await response.getReceipt(this.client);\n\n if (receipt.status !== Status.Success) {\n throw new HCS21ValidationError(\n 'Failed to publish registry version pointer',\n 'invalid_payload',\n );\n }\n\n return {\n sequenceNumber: receipt.topicSequenceNumber?.toNumber(),\n transactionId: response.transactionId.toString(),\n };\n }\n\n async resolveVersionPointer(\n versionTopicId: string,\n ): Promise<VersionPointerResolution> {\n const [latest] = await this.mirrorNode.getTopicMessages(versionTopicId, {\n limit: 1,\n order: 'desc',\n });\n\n if (!latest) {\n throw new HCS21ValidationError(\n 'Version pointer topic has no messages',\n 'invalid_payload',\n );\n }\n\n const declarationTopicId = (latest as { t_id?: unknown }).t_id;\n\n if (\n typeof declarationTopicId !== 'string' ||\n declarationTopicId.length === 0\n ) {\n throw new HCS21ValidationError(\n 'Version pointer topic does not include a declaration topic ID (`t_id`)',\n 'invalid_payload',\n );\n }\n\n const rawSequence =\n typeof latest.sequence_number === 'number'\n ? latest.sequence_number\n : Number(latest.sequence_number);\n const sequenceNumber = Number.isFinite(rawSequence) ? rawSequence : 0;\n\n return {\n versionTopicId,\n declarationTopicId,\n sequenceNumber,\n payer: (latest as { payer?: string }).payer,\n memo: (latest as { m?: string }).m,\n op: (latest as { op?: string }).op,\n };\n }\n\n async registerCategoryTopic(\n params: RegisterCategoryTopicParams,\n ): Promise<PublishDeclarationResult> {\n await this.operatorCtx.ensureInitialized();\n\n const tx = buildHcs2RegisterTx({\n registryTopicId: params.discoveryTopicId,\n targetTopicId: params.categoryTopicId,\n metadata: params.metadata,\n memo: params.memo,\n analyticsMemo: params.transactionMemo,\n });\n\n const response = await tx.execute(this.client);\n const receipt = await response.getReceipt(this.client);\n\n if (receipt.status !== Status.Success) {\n throw new HCS21ValidationError(\n 'Failed to register adapter category topic',\n 'invalid_payload',\n );\n }\n\n return {\n sequenceNumber: receipt.topicSequenceNumber?.toNumber(),\n transactionId: response.transactionId.toString(),\n };\n }\n\n async publishCategoryEntry(\n params: PublishCategoryEntryParams,\n ): Promise<PublishDeclarationResult> {\n await this.operatorCtx.ensureInitialized();\n\n const memo = params.memo ?? `adapter:${params.adapterId}`;\n const tx = buildHcs2RegisterTx({\n registryTopicId: params.categoryTopicId,\n targetTopicId: params.versionTopicId,\n metadata: params.metadata,\n memo,\n analyticsMemo: params.transactionMemo,\n });\n\n const response = await tx.execute(this.client);\n const receipt = await response.getReceipt(this.client);\n\n if (receipt.status !== Status.Success) {\n throw new HCS21ValidationError(\n 'Failed to publish adapter category entry',\n 'invalid_payload',\n );\n }\n\n return {\n sequenceNumber: receipt.topicSequenceNumber?.toNumber(),\n transactionId: response.transactionId.toString(),\n };\n }\n\n async publishDeclaration(\n params: PublishDeclarationParams,\n ): Promise<PublishDeclarationResult> {\n await this.operatorCtx.ensureInitialized();\n\n const declaration = this.normalizeDeclarationInput(params.declaration);\n const tx = buildHcs21MessageTx({\n topicId: params.topicId,\n declaration,\n transactionMemo: params.transactionMemo,\n });\n\n const response = await tx.execute(this.client);\n const receipt = await response.getReceipt(this.client);\n\n if (receipt.status !== Status.Success) {\n throw new HCS21ValidationError(\n 'Failed to submit HCS-21 declaration',\n 'invalid_payload',\n );\n }\n\n return {\n sequenceNumber: receipt.topicSequenceNumber?.toNumber(),\n transactionId: response.transactionId.toString(),\n };\n }\n\n private normalizeDeclarationInput(\n declaration: AdapterDeclaration | BuildDeclarationParams,\n ): AdapterDeclaration {\n if ('p' in declaration) {\n return this.validateDeclaration(declaration);\n }\n return this.buildDeclaration(declaration);\n }\n\n private async resolveManifestPointer(\n topicId: string,\n sequence?: number,\n ): Promise<{ pointer: string; sequenceNumber: number }> {\n const numericSequence =\n typeof sequence === 'string' ? Number(sequence) : sequence;\n let resolvedSequence =\n typeof numericSequence === 'number' && Number.isFinite(numericSequence)\n ? numericSequence\n : undefined;\n\n if (!resolvedSequence) {\n const [latest] = await this.mirrorNode.getTopicMessages(topicId, {\n limit: 1,\n order: 'desc',\n });\n\n if (!latest || !latest.sequence_number) {\n throw new HCS21ValidationError(\n 'Unable to resolve manifest sequence number',\n 'invalid_payload',\n );\n }\n\n resolvedSequence = Number(latest.sequence_number);\n }\n\n if (!Number.isFinite(resolvedSequence)) {\n throw new HCS21ValidationError(\n 'Invalid manifest sequence number',\n 'invalid_payload',\n );\n }\n\n const pointer = `hcs://1/${topicId}`;\n\n if (!HCS21ManifestPointerPattern.test(pointer)) {\n throw new HCS21ValidationError(\n 'Manifest pointer format is invalid',\n 'invalid_payload',\n );\n }\n\n return { pointer, sequenceNumber: resolvedSequence };\n }\n}\n"],"names":[],"mappings":"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"}
@@ -13,7 +13,7 @@ class HCS15Client extends HCS15BaseClient {
13
13
  keyType: config.keyType,
14
14
  mirrorNode: this.mirrorNode,
15
15
  logger: this.logger,
16
- client: this.network === "mainnet" ? Client.forMainnet() : Client.forTestnet()
16
+ client: config.client ?? (this.network === "mainnet" ? Client.forMainnet() : Client.forTestnet())
17
17
  });
18
18
  this.client = this.operatorCtx.client;
19
19
  }
@@ -1 +1 @@
1
- {"version":3,"file":"standards-sdk.es94.js","sources":["../../src/hcs-15/sdk.ts"],"sourcesContent":["import {\n AccountId,\n Client,\n Hbar,\n PrivateKey,\n PublicKey,\n TransactionReceipt,\n} from '@hashgraph/sdk';\nimport { NetworkType } from '../utils/types';\nimport {\n createNodeOperatorContext,\n type NodeOperatorContext,\n} from '../common/node-operator-resolver';\nimport {\n buildHcs15BaseAccountCreateTx,\n buildHcs15PetalAccountCreateTx,\n} from './tx';\nimport type {\n PetalProfileOptions,\n PetalProfileResult,\n SDKHCS15ClientConfig,\n} from './types';\nimport { HCS15BaseClient } from './base-client';\n\nexport class HCS15Client extends HCS15BaseClient {\n private readonly operatorCtx: NodeOperatorContext;\n private readonly client: Client;\n private readonly operatorId: AccountId;\n\n constructor(config: SDKHCS15ClientConfig) {\n super(config);\n this.operatorId = AccountId.fromString(config.operatorId);\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:\n this.network === 'mainnet' ? Client.forMainnet() : Client.forTestnet(),\n });\n this.client = this.operatorCtx.client;\n }\n\n public getKeyType(): 'ed25519' | 'ecdsa' {\n return this.operatorCtx.keyType;\n }\n\n public async close(): Promise<void> {\n try {\n this.client.close();\n } catch {}\n }\n\n private async ensureOperatorReady(): Promise<void> {\n await this.operatorCtx.ensureInitialized();\n }\n\n /**\n * Create a new base account with a newly generated ECDSA key and EVM alias.\n */\n async createBaseAccount(options?: {\n initialBalance?: number;\n maxAutomaticTokenAssociations?: number;\n accountMemo?: string;\n transactionMemo?: string;\n }): Promise<{\n accountId: string;\n privateKey: PrivateKey;\n privateKeyHex: string;\n publicKey: PublicKey;\n evmAddress: string;\n receipt: TransactionReceipt;\n }> {\n await this.ensureOperatorReady();\n const priv = PrivateKey.generateECDSA();\n const pub = priv.publicKey;\n const tx = buildHcs15BaseAccountCreateTx({\n publicKey: pub,\n initialBalance: new Hbar(options?.initialBalance ?? 10),\n maxAutomaticTokenAssociations: options?.maxAutomaticTokenAssociations,\n accountMemo: options?.accountMemo,\n transactionMemo: options?.transactionMemo,\n });\n const resp = await tx.execute(this.client);\n const receipt = await resp.getReceipt(this.client);\n if (!receipt.accountId) {\n throw new Error('HCS-15 BASE_ACCOUNT_CREATE_FAILED');\n }\n const accountId = receipt.accountId.toString();\n const evmAddress = `0x${pub.toEvmAddress()}`;\n this.logger.info('Created HCS-15 base account', { accountId, evmAddress });\n return {\n accountId,\n privateKey: priv,\n privateKeyHex: priv.toStringRaw(),\n publicKey: pub,\n evmAddress,\n receipt,\n };\n }\n\n /**\n * Create a Petal account that reuses the base account ECDSA key (no alias).\n */\n async createPetalAccount(params: {\n basePrivateKey: string | PrivateKey;\n initialBalance?: number;\n maxAutomaticTokenAssociations?: number;\n accountMemo?: string;\n transactionMemo?: string;\n profile?: PetalProfileOptions;\n }): Promise<{\n accountId: string;\n receipt: TransactionReceipt;\n profile?: PetalProfileResult;\n }> {\n await this.ensureOperatorReady();\n const baseKey =\n typeof params.basePrivateKey === 'string'\n ? PrivateKey.fromStringECDSA(params.basePrivateKey)\n : params.basePrivateKey;\n const pub = baseKey.publicKey;\n const tx = buildHcs15PetalAccountCreateTx({\n publicKey: pub,\n initialBalance: new Hbar(params.initialBalance ?? 1),\n maxAutomaticTokenAssociations: params.maxAutomaticTokenAssociations,\n accountMemo: params.accountMemo,\n transactionMemo: params.transactionMemo,\n });\n const resp = await tx.execute(this.client);\n const receipt = await resp.getReceipt(this.client);\n if (!receipt.accountId) {\n throw new Error('HCS-15 PETAL_ACCOUNT_CREATE_FAILED');\n }\n const accountId = receipt.accountId.toString();\n this.logger.info('Created HCS-15 petal account', { accountId });\n let profile: PetalProfileResult | undefined;\n if (params.profile) {\n profile = await this.createPetalProfile({\n accountId,\n basePrivateKey: baseKey,\n profile: params.profile,\n });\n }\n return { accountId, receipt, profile };\n }\n\n private async createPetalProfile(params: {\n accountId: string;\n basePrivateKey: PrivateKey;\n profile: PetalProfileOptions;\n }): Promise<PetalProfileResult> {\n const { HCS10Client } = await import('../hcs-10');\n const { PersonBuilder } = await import('../hcs-11');\n const hcs10 = new HCS10Client({\n network: this.network,\n operatorId: params.accountId,\n operatorPrivateKey: params.basePrivateKey.toString(),\n logLevel: this.logger.getLevel(),\n });\n\n try {\n const builder = new PersonBuilder()\n .setName(params.profile.displayName)\n .setBaseAccount(params.profile.baseAccountId);\n\n if (params.profile.alias) {\n builder.setAlias(params.profile.alias);\n }\n\n if (params.profile.bio) {\n builder.setBio(params.profile.bio);\n }\n\n if (params.profile.profileImage) {\n builder.setProfileImage(params.profile.profileImage);\n }\n\n if (params.profile.socials) {\n for (const social of params.profile.socials) {\n builder.addSocial(social.platform, social.handle);\n }\n }\n\n if (params.profile.properties) {\n for (const [key, value] of Object.entries(params.profile.properties)) {\n builder.addProperty(key, value);\n }\n }\n\n const result = await hcs10.create(builder, {\n ttl: params.profile.ttl ?? 300,\n updateAccountMemo: true,\n });\n\n if ('success' in result && result.success === false) {\n throw new Error(result.error ?? 'Failed to create petal profile');\n }\n\n const inboundTopicId =\n 'inboundTopicId' in result ? result.inboundTopicId : '';\n const outboundTopicId =\n 'outboundTopicId' in result ? result.outboundTopicId : '';\n const profileTopicId =\n 'profileTopicId' in result ? result.profileTopicId : '';\n\n if (!profileTopicId) {\n throw new Error('Failed to resolve petal profile topic ID');\n }\n\n return {\n profileTopicId,\n inboundTopicId,\n outboundTopicId,\n };\n } finally {\n try {\n hcs10.getClient().close();\n } catch {}\n }\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"standards-sdk.es94.js","sources":["../../src/hcs-15/sdk.ts"],"sourcesContent":["import {\n AccountId,\n Client,\n Hbar,\n PrivateKey,\n PublicKey,\n TransactionReceipt,\n} from '@hashgraph/sdk';\nimport { NetworkType } from '../utils/types';\nimport {\n createNodeOperatorContext,\n type NodeOperatorContext,\n} from '../common/node-operator-resolver';\nimport {\n buildHcs15BaseAccountCreateTx,\n buildHcs15PetalAccountCreateTx,\n} from './tx';\nimport type {\n PetalProfileOptions,\n PetalProfileResult,\n SDKHCS15ClientConfig,\n} from './types';\nimport { HCS15BaseClient } from './base-client';\n\nexport class HCS15Client extends HCS15BaseClient {\n private readonly operatorCtx: NodeOperatorContext;\n private readonly client: Client;\n private readonly operatorId: AccountId;\n\n constructor(config: SDKHCS15ClientConfig) {\n super(config);\n this.operatorId = AccountId.fromString(config.operatorId);\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:\n config.client ??\n (this.network === 'mainnet'\n ? Client.forMainnet()\n : Client.forTestnet()),\n });\n this.client = this.operatorCtx.client;\n }\n\n public getKeyType(): 'ed25519' | 'ecdsa' {\n return this.operatorCtx.keyType;\n }\n\n public async close(): Promise<void> {\n try {\n this.client.close();\n } catch {}\n }\n\n private async ensureOperatorReady(): Promise<void> {\n await this.operatorCtx.ensureInitialized();\n }\n\n /**\n * Create a new base account with a newly generated ECDSA key and EVM alias.\n */\n async createBaseAccount(options?: {\n initialBalance?: number;\n maxAutomaticTokenAssociations?: number;\n accountMemo?: string;\n transactionMemo?: string;\n }): Promise<{\n accountId: string;\n privateKey: PrivateKey;\n privateKeyHex: string;\n publicKey: PublicKey;\n evmAddress: string;\n receipt: TransactionReceipt;\n }> {\n await this.ensureOperatorReady();\n const priv = PrivateKey.generateECDSA();\n const pub = priv.publicKey;\n const tx = buildHcs15BaseAccountCreateTx({\n publicKey: pub,\n initialBalance: new Hbar(options?.initialBalance ?? 10),\n maxAutomaticTokenAssociations: options?.maxAutomaticTokenAssociations,\n accountMemo: options?.accountMemo,\n transactionMemo: options?.transactionMemo,\n });\n const resp = await tx.execute(this.client);\n const receipt = await resp.getReceipt(this.client);\n if (!receipt.accountId) {\n throw new Error('HCS-15 BASE_ACCOUNT_CREATE_FAILED');\n }\n const accountId = receipt.accountId.toString();\n const evmAddress = `0x${pub.toEvmAddress()}`;\n this.logger.info('Created HCS-15 base account', { accountId, evmAddress });\n return {\n accountId,\n privateKey: priv,\n privateKeyHex: priv.toStringRaw(),\n publicKey: pub,\n evmAddress,\n receipt,\n };\n }\n\n /**\n * Create a Petal account that reuses the base account ECDSA key (no alias).\n */\n async createPetalAccount(params: {\n basePrivateKey: string | PrivateKey;\n initialBalance?: number;\n maxAutomaticTokenAssociations?: number;\n accountMemo?: string;\n transactionMemo?: string;\n profile?: PetalProfileOptions;\n }): Promise<{\n accountId: string;\n receipt: TransactionReceipt;\n profile?: PetalProfileResult;\n }> {\n await this.ensureOperatorReady();\n const baseKey =\n typeof params.basePrivateKey === 'string'\n ? PrivateKey.fromStringECDSA(params.basePrivateKey)\n : params.basePrivateKey;\n const pub = baseKey.publicKey;\n const tx = buildHcs15PetalAccountCreateTx({\n publicKey: pub,\n initialBalance: new Hbar(params.initialBalance ?? 1),\n maxAutomaticTokenAssociations: params.maxAutomaticTokenAssociations,\n accountMemo: params.accountMemo,\n transactionMemo: params.transactionMemo,\n });\n const resp = await tx.execute(this.client);\n const receipt = await resp.getReceipt(this.client);\n if (!receipt.accountId) {\n throw new Error('HCS-15 PETAL_ACCOUNT_CREATE_FAILED');\n }\n const accountId = receipt.accountId.toString();\n this.logger.info('Created HCS-15 petal account', { accountId });\n let profile: PetalProfileResult | undefined;\n if (params.profile) {\n profile = await this.createPetalProfile({\n accountId,\n basePrivateKey: baseKey,\n profile: params.profile,\n });\n }\n return { accountId, receipt, profile };\n }\n\n private async createPetalProfile(params: {\n accountId: string;\n basePrivateKey: PrivateKey;\n profile: PetalProfileOptions;\n }): Promise<PetalProfileResult> {\n const { HCS10Client } = await import('../hcs-10');\n const { PersonBuilder } = await import('../hcs-11');\n const hcs10 = new HCS10Client({\n network: this.network,\n operatorId: params.accountId,\n operatorPrivateKey: params.basePrivateKey.toString(),\n logLevel: this.logger.getLevel(),\n });\n\n try {\n const builder = new PersonBuilder()\n .setName(params.profile.displayName)\n .setBaseAccount(params.profile.baseAccountId);\n\n if (params.profile.alias) {\n builder.setAlias(params.profile.alias);\n }\n\n if (params.profile.bio) {\n builder.setBio(params.profile.bio);\n }\n\n if (params.profile.profileImage) {\n builder.setProfileImage(params.profile.profileImage);\n }\n\n if (params.profile.socials) {\n for (const social of params.profile.socials) {\n builder.addSocial(social.platform, social.handle);\n }\n }\n\n if (params.profile.properties) {\n for (const [key, value] of Object.entries(params.profile.properties)) {\n builder.addProperty(key, value);\n }\n }\n\n const result = await hcs10.create(builder, {\n ttl: params.profile.ttl ?? 300,\n updateAccountMemo: true,\n });\n\n if ('success' in result && result.success === false) {\n throw new Error(result.error ?? 'Failed to create petal profile');\n }\n\n const inboundTopicId =\n 'inboundTopicId' in result ? result.inboundTopicId : '';\n const outboundTopicId =\n 'outboundTopicId' in result ? result.outboundTopicId : '';\n const profileTopicId =\n 'profileTopicId' in result ? result.profileTopicId : '';\n\n if (!profileTopicId) {\n throw new Error('Failed to resolve petal profile topic ID');\n }\n\n return {\n profileTopicId,\n inboundTopicId,\n outboundTopicId,\n };\n } finally {\n try {\n hcs10.getClient().close();\n } catch {}\n }\n }\n}\n"],"names":[],"mappings":"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"}
@@ -17,7 +17,7 @@ class HCS16Client extends HCS16BaseClient {
17
17
  keyType: config.keyType,
18
18
  mirrorNode: mirror,
19
19
  logger: this.logger,
20
- client: config.network === "mainnet" ? Client.forMainnet() : Client.forTestnet()
20
+ client: config.client ?? (config.network === "mainnet" ? Client.forMainnet() : Client.forTestnet())
21
21
  });
22
22
  this.client = this.operatorCtx.client;
23
23
  }
@@ -1 +1 @@
1
- {"version":3,"file":"standards-sdk.es99.js","sources":["../../src/hcs-16/sdk.ts"],"sourcesContent":["import {\n Client,\n AccountId,\n PublicKey,\n KeyList,\n TransactionReceipt,\n Hbar,\n ScheduleSignTransaction,\n PrivateKey,\n} from '@hashgraph/sdk';\nimport type { NetworkType } from '../utils/types';\nimport type { Logger } from '../utils/logger';\nimport { HCS11Client } from '../hcs-11';\nimport {\n createNodeOperatorContext,\n type NodeOperatorContext,\n} from '../common/node-operator-resolver';\nimport { HederaMirrorNode } from '../services/mirror-node';\nimport { HCS16BaseClient } from './base-client';\nimport {\n buildHcs16CreateFloraTopicTx,\n buildHcs16FloraCreatedTx,\n buildHcs16TransactionTx,\n buildHcs16StateUpdateTx,\n} from './tx';\nimport { FloraTopicType, type FloraMember, type FloraProfile } from './types';\nimport {\n buildHcs16FloraJoinRequestTx,\n buildHcs16FloraJoinVoteTx,\n buildHcs16FloraJoinAcceptedTx,\n buildHcs16CreateAccountTx,\n} from './tx';\n\nexport interface HCS16ClientConfig {\n network: NetworkType;\n operatorId: string;\n operatorKey: string;\n keyType?: 'ecdsa' | 'ed25519';\n logger?: Logger;\n}\n\nexport interface FloraProfileOptions {\n floraAccountId: string;\n displayName: string;\n members: FloraMember[];\n threshold: number;\n topics: { communication: string; transaction: string; state: string };\n inboundTopicId?: string;\n outboundTopicId?: string;\n bio?: string;\n metadata?: Record<string, unknown>;\n policies?: Record<string, string>;\n signerKeys: PrivateKey[];\n}\n\n/**\n * Node SDK client for HCS‑16 Flora operations.\n */\nexport class HCS16Client extends HCS16BaseClient {\n private readonly client: Client;\n private readonly operatorId: AccountId;\n private readonly operatorCtx: NodeOperatorContext;\n\n constructor(config: HCS16ClientConfig) {\n super({ network: config.network, logger: config.logger });\n this.operatorId = AccountId.fromString(config.operatorId);\n const mirror = new HederaMirrorNode(config.network, this.logger);\n this.operatorCtx = createNodeOperatorContext({\n network: config.network,\n operatorId: this.operatorId,\n operatorKey: config.operatorKey,\n keyType: config.keyType,\n mirrorNode: mirror,\n logger: this.logger,\n client:\n config.network === 'mainnet'\n ? Client.forMainnet()\n : Client.forTestnet(),\n });\n this.client = this.operatorCtx.client;\n }\n\n private async ensureOperatorReady(): Promise<void> {\n await this.operatorCtx.ensureInitialized();\n }\n\n /**\n * Create a Flora topic with memo `hcs-16:<floraAccountId>:<topicType>`.\n */\n async createFloraTopic(params: {\n floraAccountId: string;\n topicType: FloraTopicType;\n adminKey?: PublicKey | KeyList;\n submitKey?: PublicKey | KeyList;\n autoRenewAccountId?: string;\n signerKeys?: PrivateKey[];\n }): Promise<string> {\n await this.ensureOperatorReady();\n const tx = buildHcs16CreateFloraTopicTx({\n floraAccountId: params.floraAccountId,\n topicType: params.topicType,\n adminKey: params.adminKey,\n submitKey: params.submitKey,\n operatorPublicKey: this.client.operatorPublicKey || undefined,\n autoRenewAccountId: params.autoRenewAccountId,\n });\n const signerKeys = params.signerKeys ?? [];\n if (signerKeys.length > 0) {\n const frozen = await tx.freezeWith(this.client);\n let signed = frozen;\n for (const key of signerKeys) {\n signed = await signed.sign(key);\n }\n const resp = await signed.execute(this.client);\n const receipt = await resp.getReceipt(this.client);\n if (!receipt.topicId) {\n throw new Error('Failed to create Flora topic');\n }\n return receipt.topicId.toString();\n }\n const resp = await tx.execute(this.client);\n const receipt = await resp.getReceipt(this.client);\n if (!receipt.topicId) {\n throw new Error('Failed to create Flora topic');\n }\n return receipt.topicId.toString();\n }\n\n async createFloraAccount(params: {\n keyList: KeyList;\n initialBalanceHbar?: number;\n maxAutomaticTokenAssociations?: number;\n }): Promise<{ accountId: string; receipt: TransactionReceipt }> {\n await this.ensureOperatorReady();\n const tx = buildHcs16CreateAccountTx({\n keyList: params.keyList,\n initialBalanceHbar: params.initialBalanceHbar,\n maxAutomaticTokenAssociations: params.maxAutomaticTokenAssociations,\n });\n const resp = await tx.execute(this.client);\n const receipt = await resp.getReceipt(this.client);\n if (!receipt.accountId) {\n throw new Error('Failed to create Flora account');\n }\n return { accountId: receipt.accountId.toString(), receipt };\n }\n\n async sendFloraCreated(params: {\n topicId: string;\n operatorId: string;\n floraAccountId: string;\n topics: { communication: string; transaction: string; state: string };\n }): Promise<TransactionReceipt> {\n await this.ensureOperatorReady();\n const tx = buildHcs16FloraCreatedTx(params);\n const resp = await tx.execute(this.client);\n return resp.getReceipt(this.client);\n }\n\n /**\n * Send HCS-16 transaction (preferred). scheduleId is the ScheduleId entity (e.g., 0.0.12345).\n */\n async sendTransaction(params: {\n topicId: string;\n operatorId: string;\n scheduleId: string;\n data?: string;\n }): Promise<TransactionReceipt> {\n await this.ensureOperatorReady();\n const tx = buildHcs16TransactionTx(params);\n const resp = await tx.execute(this.client);\n return resp.getReceipt(this.client);\n }\n\n /**\n * Sign a scheduled transaction by ScheduleId entity using provided signer key (PrivateKey).\n * The signer must be a valid member key for the scheduled transaction to count toward threshold.\n */\n async signSchedule(params: {\n scheduleId: string;\n signerKey: PrivateKey;\n }): Promise<TransactionReceipt> {\n await this.ensureOperatorReady();\n const tx = await new ScheduleSignTransaction()\n .setScheduleId(params.scheduleId)\n .freezeWith(this.client);\n const signed = await tx.sign(params.signerKey);\n const resp = await signed.execute(this.client);\n return resp.getReceipt(this.client);\n }\n\n async sendStateUpdate(params: {\n topicId: string;\n operatorId: string;\n hash: string;\n epoch?: number;\n accountId?: string;\n topics?: string[];\n memo?: string;\n transactionMemo?: string;\n signerKeys?: PrivateKey[];\n }): Promise<TransactionReceipt> {\n await this.ensureOperatorReady();\n const tx = buildHcs16StateUpdateTx({\n topicId: params.topicId,\n operatorId: params.operatorId,\n hash: params.hash,\n epoch: params.epoch,\n accountId: params.accountId,\n topics: params.topics,\n memo: params.memo,\n transactionMemo: params.transactionMemo,\n });\n if (params.signerKeys && params.signerKeys.length > 0) {\n const frozen = await tx.freezeWith(this.client);\n let signed = frozen;\n for (const key of params.signerKeys) {\n signed = await signed.sign(key);\n }\n const resp = await signed.execute(this.client);\n return resp.getReceipt(this.client);\n }\n const resp = await tx.execute(this.client);\n return resp.getReceipt(this.client);\n }\n\n async sendFloraJoinRequest(params: {\n topicId: string;\n operatorId: string;\n accountId: string;\n connectionRequestId: number;\n connectionTopicId: string;\n connectionSeq: number;\n signerKey?: PrivateKey;\n }): Promise<TransactionReceipt> {\n await this.ensureOperatorReady();\n const tx = buildHcs16FloraJoinRequestTx(params);\n if (params.signerKey) {\n const frozen = await tx.freezeWith(this.client);\n const signed = await frozen.sign(params.signerKey);\n const resp = await signed.execute(this.client);\n return resp.getReceipt(this.client);\n }\n const resp = await tx.execute(this.client);\n return resp.getReceipt(this.client);\n }\n\n async sendFloraJoinVote(params: {\n topicId: string;\n operatorId: string;\n accountId: string;\n approve: boolean;\n connectionRequestId: number;\n connectionSeq: number;\n signerKey?: PrivateKey;\n }): Promise<TransactionReceipt> {\n await this.ensureOperatorReady();\n const tx = buildHcs16FloraJoinVoteTx(params);\n if (params.signerKey) {\n const frozen = await tx.freezeWith(this.client);\n const signed = await frozen.sign(params.signerKey);\n const resp = await signed.execute(this.client);\n return resp.getReceipt(this.client);\n }\n const resp = await tx.execute(this.client);\n return resp.getReceipt(this.client);\n }\n\n async sendFloraJoinAccepted(params: {\n topicId: string;\n operatorId: string;\n members: string[];\n epoch?: number;\n signerKeys?: PrivateKey[];\n }): Promise<TransactionReceipt> {\n await this.ensureOperatorReady();\n const tx = buildHcs16FloraJoinAcceptedTx(params);\n if (params.signerKeys && params.signerKeys.length > 0) {\n const frozen = await tx.freezeWith(this.client);\n let signed = frozen;\n for (const key of params.signerKeys) {\n signed = await signed.sign(key);\n }\n const resp = await signed.execute(this.client);\n return resp.getReceipt(this.client);\n }\n const resp = await tx.execute(this.client);\n return resp.getReceipt(this.client);\n }\n\n /**\n * Resolve member public keys from Mirror Node and build a KeyList with the given threshold.\n */\n async assembleKeyList(params: {\n members: string[];\n threshold: number;\n }): Promise<KeyList> {\n return super.assembleKeyList(params);\n }\n\n /**\n * Create a Flora account with a threshold KeyList, then create the three Flora topics.\n * Returns the Flora account ID and the topic IDs.\n */\n async createFloraAccountWithTopics(params: {\n members: string[];\n threshold: number;\n initialBalanceHbar?: number;\n autoRenewAccountId?: string;\n }): Promise<{\n floraAccountId: string;\n topics: { communication: string; transaction: string; state: string };\n }> {\n await this.ensureOperatorReady();\n const keyList = await this.assembleKeyList({\n members: params.members,\n threshold: params.threshold,\n });\n const submitList = await this.assembleSubmitKeyList(params.members);\n\n const createAcc = buildHcs16CreateAccountTx({\n keyList,\n initialBalanceHbar:\n typeof params.initialBalanceHbar === 'number'\n ? params.initialBalanceHbar\n : 5,\n maxAutomaticTokenAssociations: -1,\n });\n const accResp = await createAcc.execute(this.client);\n const accReceipt = await accResp.getReceipt(this.client);\n if (!accReceipt.accountId) {\n throw new Error('Failed to create Flora account');\n }\n const floraAccountId = accReceipt.accountId.toString();\n\n const {\n communication: commTx,\n transaction: trnTx,\n state: stateTx,\n } = this.buildFloraTopicCreateTxs({\n floraAccountId,\n keyList,\n submitList,\n autoRenewAccountId: params.autoRenewAccountId,\n });\n\n const commR = await commTx\n .execute(this.client)\n .then(r => r.getReceipt(this.client));\n const trnR = await trnTx\n .execute(this.client)\n .then(r => r.getReceipt(this.client));\n const stateR = await stateTx\n .execute(this.client)\n .then(r => r.getReceipt(this.client));\n const topics = {\n communication: commR.topicId!.toString(),\n transaction: trnR.topicId!.toString(),\n state: stateR.topicId!.toString(),\n };\n return { floraAccountId, topics };\n }\n\n async createFloraProfile(params: FloraProfileOptions): Promise<{\n profileTopicId: string;\n transactionId: string;\n }> {\n await this.ensureOperatorReady();\n if (params.signerKeys.length === 0) {\n throw new Error('Flora profile creation requires signer keys');\n }\n\n const profile: FloraProfile = {\n version: '1.0',\n type: 3,\n display_name: params.displayName,\n members: params.members,\n threshold: params.threshold,\n topics: params.topics,\n inboundTopicId: params.inboundTopicId ?? params.topics.communication,\n outboundTopicId: params.outboundTopicId ?? params.topics.transaction,\n bio: params.bio,\n metadata: params.metadata,\n policies: params.policies,\n };\n\n const hcs11 = new HCS11Client({\n network: this.network,\n auth: {\n operatorId: this.operatorId.toString(),\n privateKey: this.operatorCtx.operatorKey.toString(),\n },\n logLevel: this.logger.getLevel(),\n });\n\n try {\n await hcs11.initializeOperator();\n const profileResult = await hcs11.inscribeProfile(profile);\n if (!profileResult.success) {\n throw new Error(\n profileResult.error ?? 'Failed to inscribe Flora profile',\n );\n }\n\n const memoResult = await hcs11.updateAccountMemoWithProfile(\n params.floraAccountId,\n profileResult.profileTopicId,\n params.signerKeys,\n );\n\n if (!memoResult.success) {\n throw new Error(\n memoResult.error ?? 'Failed to update Flora account memo',\n );\n }\n\n return {\n profileTopicId: profileResult.profileTopicId,\n transactionId: profileResult.transactionId,\n };\n } finally {\n try {\n hcs11.getClient().close();\n } catch {}\n }\n }\n\n /**\n * Convenience: publish flora_created on the communication topic.\n */\n async publishFloraCreated(params: {\n communicationTopicId: string;\n operatorId: string;\n floraAccountId: string;\n topics: { communication: string; transaction: string; state: string };\n }): Promise<TransactionReceipt> {\n await this.ensureOperatorReady();\n const tx = buildHcs16FloraCreatedTx({\n topicId: params.communicationTopicId,\n operatorId: params.operatorId,\n floraAccountId: params.floraAccountId,\n topics: params.topics,\n });\n const resp = await tx.execute(this.client);\n return resp.getReceipt(this.client);\n }\n}\n"],"names":["resp","receipt"],"mappings":"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"}
1
+ {"version":3,"file":"standards-sdk.es99.js","sources":["../../src/hcs-16/sdk.ts"],"sourcesContent":["import {\n Client,\n AccountId,\n PublicKey,\n KeyList,\n TransactionReceipt,\n Hbar,\n ScheduleSignTransaction,\n PrivateKey,\n} from '@hashgraph/sdk';\nimport type { NetworkType } from '../utils/types';\nimport type { Logger } from '../utils/logger';\nimport { HCS11Client } from '../hcs-11';\nimport {\n createNodeOperatorContext,\n type NodeOperatorContext,\n} from '../common/node-operator-resolver';\nimport { HederaMirrorNode } from '../services/mirror-node';\nimport { HCS16BaseClient } from './base-client';\nimport {\n buildHcs16CreateFloraTopicTx,\n buildHcs16FloraCreatedTx,\n buildHcs16TransactionTx,\n buildHcs16StateUpdateTx,\n} from './tx';\nimport { FloraTopicType, type FloraMember, type FloraProfile } from './types';\nimport {\n buildHcs16FloraJoinRequestTx,\n buildHcs16FloraJoinVoteTx,\n buildHcs16FloraJoinAcceptedTx,\n buildHcs16CreateAccountTx,\n} from './tx';\n\nexport interface HCS16ClientConfig {\n network: NetworkType;\n operatorId: string;\n operatorKey: string;\n keyType?: 'ecdsa' | 'ed25519';\n logger?: Logger;\n client?: Client;\n}\n\nexport interface FloraProfileOptions {\n floraAccountId: string;\n displayName: string;\n members: FloraMember[];\n threshold: number;\n topics: { communication: string; transaction: string; state: string };\n inboundTopicId?: string;\n outboundTopicId?: string;\n bio?: string;\n metadata?: Record<string, unknown>;\n policies?: Record<string, string>;\n signerKeys: PrivateKey[];\n}\n\n/**\n * Node SDK client for HCS‑16 Flora operations.\n */\nexport class HCS16Client extends HCS16BaseClient {\n private readonly client: Client;\n private readonly operatorId: AccountId;\n private readonly operatorCtx: NodeOperatorContext;\n\n constructor(config: HCS16ClientConfig) {\n super({ network: config.network, logger: config.logger });\n this.operatorId = AccountId.fromString(config.operatorId);\n const mirror = new HederaMirrorNode(config.network, this.logger);\n this.operatorCtx = createNodeOperatorContext({\n network: config.network,\n operatorId: this.operatorId,\n operatorKey: config.operatorKey,\n keyType: config.keyType,\n mirrorNode: mirror,\n logger: this.logger,\n client:\n config.client ??\n (config.network === 'mainnet'\n ? Client.forMainnet()\n : Client.forTestnet()),\n });\n this.client = this.operatorCtx.client;\n }\n\n private async ensureOperatorReady(): Promise<void> {\n await this.operatorCtx.ensureInitialized();\n }\n\n /**\n * Create a Flora topic with memo `hcs-16:<floraAccountId>:<topicType>`.\n */\n async createFloraTopic(params: {\n floraAccountId: string;\n topicType: FloraTopicType;\n adminKey?: PublicKey | KeyList;\n submitKey?: PublicKey | KeyList;\n autoRenewAccountId?: string;\n signerKeys?: PrivateKey[];\n }): Promise<string> {\n await this.ensureOperatorReady();\n const tx = buildHcs16CreateFloraTopicTx({\n floraAccountId: params.floraAccountId,\n topicType: params.topicType,\n adminKey: params.adminKey,\n submitKey: params.submitKey,\n operatorPublicKey: this.client.operatorPublicKey || undefined,\n autoRenewAccountId: params.autoRenewAccountId,\n });\n const signerKeys = params.signerKeys ?? [];\n if (signerKeys.length > 0) {\n const frozen = await tx.freezeWith(this.client);\n let signed = frozen;\n for (const key of signerKeys) {\n signed = await signed.sign(key);\n }\n const resp = await signed.execute(this.client);\n const receipt = await resp.getReceipt(this.client);\n if (!receipt.topicId) {\n throw new Error('Failed to create Flora topic');\n }\n return receipt.topicId.toString();\n }\n const resp = await tx.execute(this.client);\n const receipt = await resp.getReceipt(this.client);\n if (!receipt.topicId) {\n throw new Error('Failed to create Flora topic');\n }\n return receipt.topicId.toString();\n }\n\n async createFloraAccount(params: {\n keyList: KeyList;\n initialBalanceHbar?: number;\n maxAutomaticTokenAssociations?: number;\n }): Promise<{ accountId: string; receipt: TransactionReceipt }> {\n await this.ensureOperatorReady();\n const tx = buildHcs16CreateAccountTx({\n keyList: params.keyList,\n initialBalanceHbar: params.initialBalanceHbar,\n maxAutomaticTokenAssociations: params.maxAutomaticTokenAssociations,\n });\n const resp = await tx.execute(this.client);\n const receipt = await resp.getReceipt(this.client);\n if (!receipt.accountId) {\n throw new Error('Failed to create Flora account');\n }\n return { accountId: receipt.accountId.toString(), receipt };\n }\n\n async sendFloraCreated(params: {\n topicId: string;\n operatorId: string;\n floraAccountId: string;\n topics: { communication: string; transaction: string; state: string };\n }): Promise<TransactionReceipt> {\n await this.ensureOperatorReady();\n const tx = buildHcs16FloraCreatedTx(params);\n const resp = await tx.execute(this.client);\n return resp.getReceipt(this.client);\n }\n\n /**\n * Send HCS-16 transaction (preferred). scheduleId is the ScheduleId entity (e.g., 0.0.12345).\n */\n async sendTransaction(params: {\n topicId: string;\n operatorId: string;\n scheduleId: string;\n data?: string;\n }): Promise<TransactionReceipt> {\n await this.ensureOperatorReady();\n const tx = buildHcs16TransactionTx(params);\n const resp = await tx.execute(this.client);\n return resp.getReceipt(this.client);\n }\n\n /**\n * Sign a scheduled transaction by ScheduleId entity using provided signer key (PrivateKey).\n * The signer must be a valid member key for the scheduled transaction to count toward threshold.\n */\n async signSchedule(params: {\n scheduleId: string;\n signerKey: PrivateKey;\n }): Promise<TransactionReceipt> {\n await this.ensureOperatorReady();\n const tx = await new ScheduleSignTransaction()\n .setScheduleId(params.scheduleId)\n .freezeWith(this.client);\n const signed = await tx.sign(params.signerKey);\n const resp = await signed.execute(this.client);\n return resp.getReceipt(this.client);\n }\n\n async sendStateUpdate(params: {\n topicId: string;\n operatorId: string;\n hash: string;\n epoch?: number;\n accountId?: string;\n topics?: string[];\n memo?: string;\n transactionMemo?: string;\n signerKeys?: PrivateKey[];\n }): Promise<TransactionReceipt> {\n await this.ensureOperatorReady();\n const tx = buildHcs16StateUpdateTx({\n topicId: params.topicId,\n operatorId: params.operatorId,\n hash: params.hash,\n epoch: params.epoch,\n accountId: params.accountId,\n topics: params.topics,\n memo: params.memo,\n transactionMemo: params.transactionMemo,\n });\n if (params.signerKeys && params.signerKeys.length > 0) {\n const frozen = await tx.freezeWith(this.client);\n let signed = frozen;\n for (const key of params.signerKeys) {\n signed = await signed.sign(key);\n }\n const resp = await signed.execute(this.client);\n return resp.getReceipt(this.client);\n }\n const resp = await tx.execute(this.client);\n return resp.getReceipt(this.client);\n }\n\n async sendFloraJoinRequest(params: {\n topicId: string;\n operatorId: string;\n accountId: string;\n connectionRequestId: number;\n connectionTopicId: string;\n connectionSeq: number;\n signerKey?: PrivateKey;\n }): Promise<TransactionReceipt> {\n await this.ensureOperatorReady();\n const tx = buildHcs16FloraJoinRequestTx(params);\n if (params.signerKey) {\n const frozen = await tx.freezeWith(this.client);\n const signed = await frozen.sign(params.signerKey);\n const resp = await signed.execute(this.client);\n return resp.getReceipt(this.client);\n }\n const resp = await tx.execute(this.client);\n return resp.getReceipt(this.client);\n }\n\n async sendFloraJoinVote(params: {\n topicId: string;\n operatorId: string;\n accountId: string;\n approve: boolean;\n connectionRequestId: number;\n connectionSeq: number;\n signerKey?: PrivateKey;\n }): Promise<TransactionReceipt> {\n await this.ensureOperatorReady();\n const tx = buildHcs16FloraJoinVoteTx(params);\n if (params.signerKey) {\n const frozen = await tx.freezeWith(this.client);\n const signed = await frozen.sign(params.signerKey);\n const resp = await signed.execute(this.client);\n return resp.getReceipt(this.client);\n }\n const resp = await tx.execute(this.client);\n return resp.getReceipt(this.client);\n }\n\n async sendFloraJoinAccepted(params: {\n topicId: string;\n operatorId: string;\n members: string[];\n epoch?: number;\n signerKeys?: PrivateKey[];\n }): Promise<TransactionReceipt> {\n await this.ensureOperatorReady();\n const tx = buildHcs16FloraJoinAcceptedTx(params);\n if (params.signerKeys && params.signerKeys.length > 0) {\n const frozen = await tx.freezeWith(this.client);\n let signed = frozen;\n for (const key of params.signerKeys) {\n signed = await signed.sign(key);\n }\n const resp = await signed.execute(this.client);\n return resp.getReceipt(this.client);\n }\n const resp = await tx.execute(this.client);\n return resp.getReceipt(this.client);\n }\n\n /**\n * Resolve member public keys from Mirror Node and build a KeyList with the given threshold.\n */\n async assembleKeyList(params: {\n members: string[];\n threshold: number;\n }): Promise<KeyList> {\n return super.assembleKeyList(params);\n }\n\n /**\n * Create a Flora account with a threshold KeyList, then create the three Flora topics.\n * Returns the Flora account ID and the topic IDs.\n */\n async createFloraAccountWithTopics(params: {\n members: string[];\n threshold: number;\n initialBalanceHbar?: number;\n autoRenewAccountId?: string;\n }): Promise<{\n floraAccountId: string;\n topics: { communication: string; transaction: string; state: string };\n }> {\n await this.ensureOperatorReady();\n const keyList = await this.assembleKeyList({\n members: params.members,\n threshold: params.threshold,\n });\n const submitList = await this.assembleSubmitKeyList(params.members);\n\n const createAcc = buildHcs16CreateAccountTx({\n keyList,\n initialBalanceHbar:\n typeof params.initialBalanceHbar === 'number'\n ? params.initialBalanceHbar\n : 5,\n maxAutomaticTokenAssociations: -1,\n });\n const accResp = await createAcc.execute(this.client);\n const accReceipt = await accResp.getReceipt(this.client);\n if (!accReceipt.accountId) {\n throw new Error('Failed to create Flora account');\n }\n const floraAccountId = accReceipt.accountId.toString();\n\n const {\n communication: commTx,\n transaction: trnTx,\n state: stateTx,\n } = this.buildFloraTopicCreateTxs({\n floraAccountId,\n keyList,\n submitList,\n autoRenewAccountId: params.autoRenewAccountId,\n });\n\n const commR = await commTx\n .execute(this.client)\n .then(r => r.getReceipt(this.client));\n const trnR = await trnTx\n .execute(this.client)\n .then(r => r.getReceipt(this.client));\n const stateR = await stateTx\n .execute(this.client)\n .then(r => r.getReceipt(this.client));\n const topics = {\n communication: commR.topicId!.toString(),\n transaction: trnR.topicId!.toString(),\n state: stateR.topicId!.toString(),\n };\n return { floraAccountId, topics };\n }\n\n async createFloraProfile(params: FloraProfileOptions): Promise<{\n profileTopicId: string;\n transactionId: string;\n }> {\n await this.ensureOperatorReady();\n if (params.signerKeys.length === 0) {\n throw new Error('Flora profile creation requires signer keys');\n }\n\n const profile: FloraProfile = {\n version: '1.0',\n type: 3,\n display_name: params.displayName,\n members: params.members,\n threshold: params.threshold,\n topics: params.topics,\n inboundTopicId: params.inboundTopicId ?? params.topics.communication,\n outboundTopicId: params.outboundTopicId ?? params.topics.transaction,\n bio: params.bio,\n metadata: params.metadata,\n policies: params.policies,\n };\n\n const hcs11 = new HCS11Client({\n network: this.network,\n auth: {\n operatorId: this.operatorId.toString(),\n privateKey: this.operatorCtx.operatorKey.toString(),\n },\n logLevel: this.logger.getLevel(),\n });\n\n try {\n await hcs11.initializeOperator();\n const profileResult = await hcs11.inscribeProfile(profile);\n if (!profileResult.success) {\n throw new Error(\n profileResult.error ?? 'Failed to inscribe Flora profile',\n );\n }\n\n const memoResult = await hcs11.updateAccountMemoWithProfile(\n params.floraAccountId,\n profileResult.profileTopicId,\n params.signerKeys,\n );\n\n if (!memoResult.success) {\n throw new Error(\n memoResult.error ?? 'Failed to update Flora account memo',\n );\n }\n\n return {\n profileTopicId: profileResult.profileTopicId,\n transactionId: profileResult.transactionId,\n };\n } finally {\n try {\n hcs11.getClient().close();\n } catch {}\n }\n }\n\n /**\n * Convenience: publish flora_created on the communication topic.\n */\n async publishFloraCreated(params: {\n communicationTopicId: string;\n operatorId: string;\n floraAccountId: string;\n topics: { communication: string; transaction: string; state: string };\n }): Promise<TransactionReceipt> {\n await this.ensureOperatorReady();\n const tx = buildHcs16FloraCreatedTx({\n topicId: params.communicationTopicId,\n operatorId: params.operatorId,\n floraAccountId: params.floraAccountId,\n topics: params.topics,\n });\n const resp = await tx.execute(this.client);\n return resp.getReceipt(this.client);\n }\n}\n"],"names":["resp","receipt"],"mappings":";;;;;;;AA2DO,MAAM,oBAAoB,gBAAgB;AAAA,EAK/C,YAAY,QAA2B;AACrC,UAAM,EAAE,SAAS,OAAO,SAAS,QAAQ,OAAO,QAAQ;AACxD,SAAK,aAAa,UAAU,WAAW,OAAO,UAAU;AACxD,UAAM,SAAS,IAAI,iBAAiB,OAAO,SAAS,KAAK,MAAM;AAC/D,SAAK,cAAc,0BAA0B;AAAA,MAC3C,SAAS,OAAO;AAAA,MAChB,YAAY,KAAK;AAAA,MACjB,aAAa,OAAO;AAAA,MACpB,SAAS,OAAO;AAAA,MAChB,YAAY;AAAA,MACZ,QAAQ,KAAK;AAAA,MACb,QACE,OAAO,WACN,OAAO,YAAY,YAChB,OAAO,WAAA,IACP,OAAO,WAAA;AAAA,IAAW,CACzB;AACD,SAAK,SAAS,KAAK,YAAY;AAAA,EACjC;AAAA,EAEA,MAAc,sBAAqC;AACjD,UAAM,KAAK,YAAY,kBAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAiB,QAOH;AAClB,UAAM,KAAK,oBAAA;AACX,UAAM,KAAK,6BAA6B;AAAA,MACtC,gBAAgB,OAAO;AAAA,MACvB,WAAW,OAAO;AAAA,MAClB,UAAU,OAAO;AAAA,MACjB,WAAW,OAAO;AAAA,MAClB,mBAAmB,KAAK,OAAO,qBAAqB;AAAA,MACpD,oBAAoB,OAAO;AAAA,IAAA,CAC5B;AACD,UAAM,aAAa,OAAO,cAAc,CAAA;AACxC,QAAI,WAAW,SAAS,GAAG;AACzB,YAAM,SAAS,MAAM,GAAG,WAAW,KAAK,MAAM;AAC9C,UAAI,SAAS;AACb,iBAAW,OAAO,YAAY;AAC5B,iBAAS,MAAM,OAAO,KAAK,GAAG;AAAA,MAChC;AACA,YAAMA,QAAO,MAAM,OAAO,QAAQ,KAAK,MAAM;AAC7C,YAAMC,WAAU,MAAMD,MAAK,WAAW,KAAK,MAAM;AACjD,UAAI,CAACC,SAAQ,SAAS;AACpB,cAAM,IAAI,MAAM,8BAA8B;AAAA,MAChD;AACA,aAAOA,SAAQ,QAAQ,SAAA;AAAA,IACzB;AACA,UAAM,OAAO,MAAM,GAAG,QAAQ,KAAK,MAAM;AACzC,UAAM,UAAU,MAAM,KAAK,WAAW,KAAK,MAAM;AACjD,QAAI,CAAC,QAAQ,SAAS;AACpB,YAAM,IAAI,MAAM,8BAA8B;AAAA,IAChD;AACA,WAAO,QAAQ,QAAQ,SAAA;AAAA,EACzB;AAAA,EAEA,MAAM,mBAAmB,QAIuC;AAC9D,UAAM,KAAK,oBAAA;AACX,UAAM,KAAK,0BAA0B;AAAA,MACnC,SAAS,OAAO;AAAA,MAChB,oBAAoB,OAAO;AAAA,MAC3B,+BAA+B,OAAO;AAAA,IAAA,CACvC;AACD,UAAM,OAAO,MAAM,GAAG,QAAQ,KAAK,MAAM;AACzC,UAAM,UAAU,MAAM,KAAK,WAAW,KAAK,MAAM;AACjD,QAAI,CAAC,QAAQ,WAAW;AACtB,YAAM,IAAI,MAAM,gCAAgC;AAAA,IAClD;AACA,WAAO,EAAE,WAAW,QAAQ,UAAU,SAAA,GAAY,QAAA;AAAA,EACpD;AAAA,EAEA,MAAM,iBAAiB,QAKS;AAC9B,UAAM,KAAK,oBAAA;AACX,UAAM,KAAK,yBAAyB,MAAM;AAC1C,UAAM,OAAO,MAAM,GAAG,QAAQ,KAAK,MAAM;AACzC,WAAO,KAAK,WAAW,KAAK,MAAM;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,QAKU;AAC9B,UAAM,KAAK,oBAAA;AACX,UAAM,KAAK,wBAAwB,MAAM;AACzC,UAAM,OAAO,MAAM,GAAG,QAAQ,KAAK,MAAM;AACzC,WAAO,KAAK,WAAW,KAAK,MAAM;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,aAAa,QAGa;AAC9B,UAAM,KAAK,oBAAA;AACX,UAAM,KAAK,MAAM,IAAI,wBAAA,EAClB,cAAc,OAAO,UAAU,EAC/B,WAAW,KAAK,MAAM;AACzB,UAAM,SAAS,MAAM,GAAG,KAAK,OAAO,SAAS;AAC7C,UAAM,OAAO,MAAM,OAAO,QAAQ,KAAK,MAAM;AAC7C,WAAO,KAAK,WAAW,KAAK,MAAM;AAAA,EACpC;AAAA,EAEA,MAAM,gBAAgB,QAUU;AAC9B,UAAM,KAAK,oBAAA;AACX,UAAM,KAAK,wBAAwB;AAAA,MACjC,SAAS,OAAO;AAAA,MAChB,YAAY,OAAO;AAAA,MACnB,MAAM,OAAO;AAAA,MACb,OAAO,OAAO;AAAA,MACd,WAAW,OAAO;AAAA,MAClB,QAAQ,OAAO;AAAA,MACf,MAAM,OAAO;AAAA,MACb,iBAAiB,OAAO;AAAA,IAAA,CACzB;AACD,QAAI,OAAO,cAAc,OAAO,WAAW,SAAS,GAAG;AACrD,YAAM,SAAS,MAAM,GAAG,WAAW,KAAK,MAAM;AAC9C,UAAI,SAAS;AACb,iBAAW,OAAO,OAAO,YAAY;AACnC,iBAAS,MAAM,OAAO,KAAK,GAAG;AAAA,MAChC;AACA,YAAMD,QAAO,MAAM,OAAO,QAAQ,KAAK,MAAM;AAC7C,aAAOA,MAAK,WAAW,KAAK,MAAM;AAAA,IACpC;AACA,UAAM,OAAO,MAAM,GAAG,QAAQ,KAAK,MAAM;AACzC,WAAO,KAAK,WAAW,KAAK,MAAM;AAAA,EACpC;AAAA,EAEA,MAAM,qBAAqB,QAQK;AAC9B,UAAM,KAAK,oBAAA;AACX,UAAM,KAAK,6BAA6B,MAAM;AAC9C,QAAI,OAAO,WAAW;AACpB,YAAM,SAAS,MAAM,GAAG,WAAW,KAAK,MAAM;AAC9C,YAAM,SAAS,MAAM,OAAO,KAAK,OAAO,SAAS;AACjD,YAAMA,QAAO,MAAM,OAAO,QAAQ,KAAK,MAAM;AAC7C,aAAOA,MAAK,WAAW,KAAK,MAAM;AAAA,IACpC;AACA,UAAM,OAAO,MAAM,GAAG,QAAQ,KAAK,MAAM;AACzC,WAAO,KAAK,WAAW,KAAK,MAAM;AAAA,EACpC;AAAA,EAEA,MAAM,kBAAkB,QAQQ;AAC9B,UAAM,KAAK,oBAAA;AACX,UAAM,KAAK,0BAA0B,MAAM;AAC3C,QAAI,OAAO,WAAW;AACpB,YAAM,SAAS,MAAM,GAAG,WAAW,KAAK,MAAM;AAC9C,YAAM,SAAS,MAAM,OAAO,KAAK,OAAO,SAAS;AACjD,YAAMA,QAAO,MAAM,OAAO,QAAQ,KAAK,MAAM;AAC7C,aAAOA,MAAK,WAAW,KAAK,MAAM;AAAA,IACpC;AACA,UAAM,OAAO,MAAM,GAAG,QAAQ,KAAK,MAAM;AACzC,WAAO,KAAK,WAAW,KAAK,MAAM;AAAA,EACpC;AAAA,EAEA,MAAM,sBAAsB,QAMI;AAC9B,UAAM,KAAK,oBAAA;AACX,UAAM,KAAK,8BAA8B,MAAM;AAC/C,QAAI,OAAO,cAAc,OAAO,WAAW,SAAS,GAAG;AACrD,YAAM,SAAS,MAAM,GAAG,WAAW,KAAK,MAAM;AAC9C,UAAI,SAAS;AACb,iBAAW,OAAO,OAAO,YAAY;AACnC,iBAAS,MAAM,OAAO,KAAK,GAAG;AAAA,MAChC;AACA,YAAMA,QAAO,MAAM,OAAO,QAAQ,KAAK,MAAM;AAC7C,aAAOA,MAAK,WAAW,KAAK,MAAM;AAAA,IACpC;AACA,UAAM,OAAO,MAAM,GAAG,QAAQ,KAAK,MAAM;AACzC,WAAO,KAAK,WAAW,KAAK,MAAM;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,QAGD;AACnB,WAAO,MAAM,gBAAgB,MAAM;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,6BAA6B,QAQhC;AACD,UAAM,KAAK,oBAAA;AACX,UAAM,UAAU,MAAM,KAAK,gBAAgB;AAAA,MACzC,SAAS,OAAO;AAAA,MAChB,WAAW,OAAO;AAAA,IAAA,CACnB;AACD,UAAM,aAAa,MAAM,KAAK,sBAAsB,OAAO,OAAO;AAElE,UAAM,YAAY,0BAA0B;AAAA,MAC1C;AAAA,MACA,oBACE,OAAO,OAAO,uBAAuB,WACjC,OAAO,qBACP;AAAA,MACN,+BAA+B;AAAA,IAAA,CAChC;AACD,UAAM,UAAU,MAAM,UAAU,QAAQ,KAAK,MAAM;AACnD,UAAM,aAAa,MAAM,QAAQ,WAAW,KAAK,MAAM;AACvD,QAAI,CAAC,WAAW,WAAW;AACzB,YAAM,IAAI,MAAM,gCAAgC;AAAA,IAClD;AACA,UAAM,iBAAiB,WAAW,UAAU,SAAA;AAE5C,UAAM;AAAA,MACJ,eAAe;AAAA,MACf,aAAa;AAAA,MACb,OAAO;AAAA,IAAA,IACL,KAAK,yBAAyB;AAAA,MAChC;AAAA,MACA;AAAA,MACA;AAAA,MACA,oBAAoB,OAAO;AAAA,IAAA,CAC5B;AAED,UAAM,QAAQ,MAAM,OACjB,QAAQ,KAAK,MAAM,EACnB,KAAK,CAAA,MAAK,EAAE,WAAW,KAAK,MAAM,CAAC;AACtC,UAAM,OAAO,MAAM,MAChB,QAAQ,KAAK,MAAM,EACnB,KAAK,CAAA,MAAK,EAAE,WAAW,KAAK,MAAM,CAAC;AACtC,UAAM,SAAS,MAAM,QAClB,QAAQ,KAAK,MAAM,EACnB,KAAK,CAAA,MAAK,EAAE,WAAW,KAAK,MAAM,CAAC;AACtC,UAAM,SAAS;AAAA,MACb,eAAe,MAAM,QAAS,SAAA;AAAA,MAC9B,aAAa,KAAK,QAAS,SAAA;AAAA,MAC3B,OAAO,OAAO,QAAS,SAAA;AAAA,IAAS;AAElC,WAAO,EAAE,gBAAgB,OAAA;AAAA,EAC3B;AAAA,EAEA,MAAM,mBAAmB,QAGtB;AACD,UAAM,KAAK,oBAAA;AACX,QAAI,OAAO,WAAW,WAAW,GAAG;AAClC,YAAM,IAAI,MAAM,6CAA6C;AAAA,IAC/D;AAEA,UAAM,UAAwB;AAAA,MAC5B,SAAS;AAAA,MACT,MAAM;AAAA,MACN,cAAc,OAAO;AAAA,MACrB,SAAS,OAAO;AAAA,MAChB,WAAW,OAAO;AAAA,MAClB,QAAQ,OAAO;AAAA,MACf,gBAAgB,OAAO,kBAAkB,OAAO,OAAO;AAAA,MACvD,iBAAiB,OAAO,mBAAmB,OAAO,OAAO;AAAA,MACzD,KAAK,OAAO;AAAA,MACZ,UAAU,OAAO;AAAA,MACjB,UAAU,OAAO;AAAA,IAAA;AAGnB,UAAM,QAAQ,IAAI,YAAY;AAAA,MAC5B,SAAS,KAAK;AAAA,MACd,MAAM;AAAA,QACJ,YAAY,KAAK,WAAW,SAAA;AAAA,QAC5B,YAAY,KAAK,YAAY,YAAY,SAAA;AAAA,MAAS;AAAA,MAEpD,UAAU,KAAK,OAAO,SAAA;AAAA,IAAS,CAChC;AAED,QAAI;AACF,YAAM,MAAM,mBAAA;AACZ,YAAM,gBAAgB,MAAM,MAAM,gBAAgB,OAAO;AACzD,UAAI,CAAC,cAAc,SAAS;AAC1B,cAAM,IAAI;AAAA,UACR,cAAc,SAAS;AAAA,QAAA;AAAA,MAE3B;AAEA,YAAM,aAAa,MAAM,MAAM;AAAA,QAC7B,OAAO;AAAA,QACP,cAAc;AAAA,QACd,OAAO;AAAA,MAAA;AAGT,UAAI,CAAC,WAAW,SAAS;AACvB,cAAM,IAAI;AAAA,UACR,WAAW,SAAS;AAAA,QAAA;AAAA,MAExB;AAEA,aAAO;AAAA,QACL,gBAAgB,cAAc;AAAA,QAC9B,eAAe,cAAc;AAAA,MAAA;AAAA,IAEjC,UAAA;AACE,UAAI;AACF,cAAM,UAAA,EAAY,MAAA;AAAA,MACpB,QAAQ;AAAA,MAAC;AAAA,IACX;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAoB,QAKM;AAC9B,UAAM,KAAK,oBAAA;AACX,UAAM,KAAK,yBAAyB;AAAA,MAClC,SAAS,OAAO;AAAA,MAChB,YAAY,OAAO;AAAA,MACnB,gBAAgB,OAAO;AAAA,MACvB,QAAQ,OAAO;AAAA,IAAA,CAChB;AACD,UAAM,OAAO,MAAM,GAAG,QAAQ,KAAK,MAAM;AACzC,WAAO,KAAK,WAAW,KAAK,MAAM;AAAA,EACpC;AACF;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hashgraphonline/standards-sdk",
3
- "version": "0.1.166",
3
+ "version": "0.1.168",
4
4
  "description": "The Hashgraph Online Standards SDK provides a complete implementation of the Hiero Consensus Standards (HCS), giving developers all the tools needed to build wonderful decentralized applications on the Hashgraph network. https://hol.org",
5
5
  "type": "module",
6
6
  "files": [