@hashgraphonline/standards-sdk 0.1.141-canary.2 → 0.1.141-canary.20

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 (242) hide show
  1. package/README.md +13 -1
  2. package/dist/cjs/hcs-16/base-client.d.ts.map +1 -1
  3. package/dist/cjs/hcs-17/types.d.ts.map +1 -1
  4. package/dist/cjs/hcs-21/base-client.d.ts +4 -3
  5. package/dist/cjs/hcs-21/base-client.d.ts.map +1 -1
  6. package/dist/cjs/hcs-21/index.d.ts +1 -0
  7. package/dist/cjs/hcs-21/index.d.ts.map +1 -1
  8. package/dist/cjs/hcs-21/sdk.d.ts.map +1 -1
  9. package/dist/cjs/hcs-21/tx.d.ts.map +1 -1
  10. package/dist/cjs/hcs-21/types.d.ts +135 -64
  11. package/dist/cjs/hcs-21/types.d.ts.map +1 -1
  12. package/dist/cjs/hcs-21/verify.d.ts +6 -0
  13. package/dist/cjs/hcs-21/verify.d.ts.map +1 -0
  14. package/dist/cjs/inscribe/inscriber.d.ts +1 -0
  15. package/dist/cjs/inscribe/inscriber.d.ts.map +1 -1
  16. package/dist/cjs/inscribe/quote-cache.d.ts.map +1 -1
  17. package/dist/cjs/services/registry-broker/client.d.ts +4 -3
  18. package/dist/cjs/services/registry-broker/client.d.ts.map +1 -1
  19. package/dist/cjs/services/registry-broker/private-key-signer.d.ts.map +1 -1
  20. package/dist/cjs/services/registry-broker/schemas.d.ts +38 -38
  21. package/dist/cjs/services/registry-broker/schemas.d.ts.map +1 -1
  22. package/dist/cjs/standards-sdk.cjs +2 -2
  23. package/dist/cjs/standards-sdk.cjs.map +1 -1
  24. package/dist/cjs/utils/dynamic-import.d.ts +1 -0
  25. package/dist/cjs/utils/dynamic-import.d.ts.map +1 -1
  26. package/dist/es/hcs-16/base-client.d.ts.map +1 -1
  27. package/dist/es/hcs-17/types.d.ts.map +1 -1
  28. package/dist/es/hcs-21/base-client.d.ts +4 -3
  29. package/dist/es/hcs-21/base-client.d.ts.map +1 -1
  30. package/dist/es/hcs-21/index.d.ts +1 -0
  31. package/dist/es/hcs-21/index.d.ts.map +1 -1
  32. package/dist/es/hcs-21/sdk.d.ts.map +1 -1
  33. package/dist/es/hcs-21/tx.d.ts.map +1 -1
  34. package/dist/es/hcs-21/types.d.ts +135 -64
  35. package/dist/es/hcs-21/types.d.ts.map +1 -1
  36. package/dist/es/hcs-21/verify.d.ts +6 -0
  37. package/dist/es/hcs-21/verify.d.ts.map +1 -0
  38. package/dist/es/inscribe/inscriber.d.ts +1 -0
  39. package/dist/es/inscribe/inscriber.d.ts.map +1 -1
  40. package/dist/es/inscribe/quote-cache.d.ts.map +1 -1
  41. package/dist/es/services/registry-broker/client.d.ts +4 -3
  42. package/dist/es/services/registry-broker/client.d.ts.map +1 -1
  43. package/dist/es/services/registry-broker/private-key-signer.d.ts.map +1 -1
  44. package/dist/es/services/registry-broker/schemas.d.ts +38 -38
  45. package/dist/es/services/registry-broker/schemas.d.ts.map +1 -1
  46. package/dist/es/standards-sdk.es.js +58 -50
  47. package/dist/es/standards-sdk.es.js.map +1 -1
  48. package/dist/es/standards-sdk.es10.js +2 -2
  49. package/dist/es/standards-sdk.es100.js +26 -229
  50. package/dist/es/standards-sdk.es100.js.map +1 -1
  51. package/dist/es/standards-sdk.es101.js +228 -109
  52. package/dist/es/standards-sdk.es101.js.map +1 -1
  53. package/dist/es/standards-sdk.es102.js +94 -15
  54. package/dist/es/standards-sdk.es102.js.map +1 -1
  55. package/dist/es/standards-sdk.es103.js +30 -80
  56. package/dist/es/standards-sdk.es103.js.map +1 -1
  57. package/dist/es/standards-sdk.es104.js +80 -27
  58. package/dist/es/standards-sdk.es104.js.map +1 -1
  59. package/dist/es/standards-sdk.es105.js +25 -136
  60. package/dist/es/standards-sdk.es105.js.map +1 -1
  61. package/dist/es/standards-sdk.es106.js +140 -27
  62. package/dist/es/standards-sdk.es106.js.map +1 -1
  63. package/dist/es/standards-sdk.es107.js +27 -20
  64. package/dist/es/standards-sdk.es107.js.map +1 -1
  65. package/dist/es/standards-sdk.es108.js +18 -156
  66. package/dist/es/standards-sdk.es108.js.map +1 -1
  67. package/dist/es/standards-sdk.es109.js +148 -196
  68. package/dist/es/standards-sdk.es109.js.map +1 -1
  69. package/dist/es/standards-sdk.es110.js +160 -747
  70. package/dist/es/standards-sdk.es110.js.map +1 -1
  71. package/dist/es/standards-sdk.es111.js +786 -9
  72. package/dist/es/standards-sdk.es111.js.map +1 -1
  73. package/dist/es/standards-sdk.es112.js +13 -567
  74. package/dist/es/standards-sdk.es112.js.map +1 -1
  75. package/dist/es/standards-sdk.es113.js +541 -576
  76. package/dist/es/standards-sdk.es113.js.map +1 -1
  77. package/dist/es/standards-sdk.es114.js +601 -12
  78. package/dist/es/standards-sdk.es114.js.map +1 -1
  79. package/dist/es/standards-sdk.es115.js +13 -2
  80. package/dist/es/standards-sdk.es115.js.map +1 -1
  81. package/dist/es/standards-sdk.es116.js +2 -83
  82. package/dist/es/standards-sdk.es116.js.map +1 -1
  83. package/dist/es/standards-sdk.es117.js +80 -36
  84. package/dist/es/standards-sdk.es117.js.map +1 -1
  85. package/dist/es/standards-sdk.es118.js +39 -2
  86. package/dist/es/standards-sdk.es118.js.map +1 -1
  87. package/dist/es/standards-sdk.es119.js +2 -223
  88. package/dist/es/standards-sdk.es119.js.map +1 -1
  89. package/dist/es/standards-sdk.es12.js +1 -1
  90. package/dist/es/standards-sdk.es120.js +193 -1110
  91. package/dist/es/standards-sdk.es120.js.map +1 -1
  92. package/dist/es/standards-sdk.es121.js +1059 -225
  93. package/dist/es/standards-sdk.es121.js.map +1 -1
  94. package/dist/es/standards-sdk.es122.js +303 -419
  95. package/dist/es/standards-sdk.es122.js.map +1 -1
  96. package/dist/es/standards-sdk.es123.js +418 -351
  97. package/dist/es/standards-sdk.es123.js.map +1 -1
  98. package/dist/es/standards-sdk.es124.js +348 -785
  99. package/dist/es/standards-sdk.es124.js.map +1 -1
  100. package/dist/es/standards-sdk.es125.js +748 -183
  101. package/dist/es/standards-sdk.es125.js.map +1 -1
  102. package/dist/es/standards-sdk.es126.js +153 -1512
  103. package/dist/es/standards-sdk.es126.js.map +1 -1
  104. package/dist/es/standards-sdk.es127.js +1373 -1977
  105. package/dist/es/standards-sdk.es127.js.map +1 -1
  106. package/dist/es/standards-sdk.es128.js +2206 -50
  107. package/dist/es/standards-sdk.es128.js.map +1 -1
  108. package/dist/es/standards-sdk.es129.js +59 -79
  109. package/dist/es/standards-sdk.es129.js.map +1 -1
  110. package/dist/es/standards-sdk.es13.js +1 -1
  111. package/dist/es/standards-sdk.es130.js +80 -152
  112. package/dist/es/standards-sdk.es130.js.map +1 -1
  113. package/dist/es/standards-sdk.es131.js +159 -7
  114. package/dist/es/standards-sdk.es131.js.map +1 -1
  115. package/dist/es/standards-sdk.es132.js +7 -86
  116. package/dist/es/standards-sdk.es132.js.map +1 -1
  117. package/dist/es/standards-sdk.es133.js +65 -44
  118. package/dist/es/standards-sdk.es133.js.map +1 -1
  119. package/dist/es/standards-sdk.es134.js +65 -28
  120. package/dist/es/standards-sdk.es134.js.map +1 -1
  121. package/dist/es/standards-sdk.es135.js +69 -125
  122. package/dist/es/standards-sdk.es135.js.map +1 -1
  123. package/dist/es/standards-sdk.es136.js +28 -42
  124. package/dist/es/standards-sdk.es136.js.map +1 -1
  125. package/dist/es/standards-sdk.es137.js +2 -2
  126. package/dist/es/standards-sdk.es138.js +138 -760
  127. package/dist/es/standards-sdk.es138.js.map +1 -1
  128. package/dist/es/standards-sdk.es139.js +746 -12254
  129. package/dist/es/standards-sdk.es139.js.map +1 -1
  130. package/dist/es/standards-sdk.es14.js +1 -1
  131. package/dist/es/standards-sdk.es140.js +12235 -133
  132. package/dist/es/standards-sdk.es140.js.map +1 -1
  133. package/dist/es/standards-sdk.es141.js +34 -314
  134. package/dist/es/standards-sdk.es141.js.map +1 -1
  135. package/dist/es/standards-sdk.es142.js +55 -345
  136. package/dist/es/standards-sdk.es142.js.map +1 -1
  137. package/dist/es/standards-sdk.es143.js +129 -410
  138. package/dist/es/standards-sdk.es143.js.map +1 -1
  139. package/dist/es/standards-sdk.es144.js +200 -209
  140. package/dist/es/standards-sdk.es144.js.map +1 -1
  141. package/dist/es/standards-sdk.es145.js +334 -64
  142. package/dist/es/standards-sdk.es145.js.map +1 -1
  143. package/dist/es/standards-sdk.es146.js +452 -55
  144. package/dist/es/standards-sdk.es146.js.map +1 -1
  145. package/dist/es/standards-sdk.es147.js +319 -52
  146. package/dist/es/standards-sdk.es147.js.map +1 -1
  147. package/dist/es/standards-sdk.es148.js +79 -0
  148. package/dist/es/standards-sdk.es148.js.map +1 -0
  149. package/dist/es/standards-sdk.es15.js +1 -1
  150. package/dist/es/standards-sdk.es16.js +1 -1
  151. package/dist/es/standards-sdk.es17.js +5 -10
  152. package/dist/es/standards-sdk.es17.js.map +1 -1
  153. package/dist/es/standards-sdk.es19.js +12 -16
  154. package/dist/es/standards-sdk.es19.js.map +1 -1
  155. package/dist/es/standards-sdk.es2.js +26 -72
  156. package/dist/es/standards-sdk.es2.js.map +1 -1
  157. package/dist/es/standards-sdk.es20.js +9 -13
  158. package/dist/es/standards-sdk.es20.js.map +1 -1
  159. package/dist/es/standards-sdk.es21.js +1 -1
  160. package/dist/es/standards-sdk.es22.js +1 -1
  161. package/dist/es/standards-sdk.es23.js +1 -1
  162. package/dist/es/standards-sdk.es24.js +1 -1
  163. package/dist/es/standards-sdk.es25.js +1 -1
  164. package/dist/es/standards-sdk.es26.js +1 -1
  165. package/dist/es/standards-sdk.es27.js +1 -1
  166. package/dist/es/standards-sdk.es28.js +12 -16
  167. package/dist/es/standards-sdk.es28.js.map +1 -1
  168. package/dist/es/standards-sdk.es3.js +2 -2
  169. package/dist/es/standards-sdk.es31.js +2 -2
  170. package/dist/es/standards-sdk.es32.js +4 -4
  171. package/dist/es/standards-sdk.es33.js +1 -1
  172. package/dist/es/standards-sdk.es36.js +7 -12
  173. package/dist/es/standards-sdk.es36.js.map +1 -1
  174. package/dist/es/standards-sdk.es37.js +4 -4
  175. package/dist/es/standards-sdk.es38.js +2 -2
  176. package/dist/es/standards-sdk.es39.js +2 -2
  177. package/dist/es/standards-sdk.es40.js +1 -1
  178. package/dist/es/standards-sdk.es41.js +1 -1
  179. package/dist/es/standards-sdk.es42.js +2 -2
  180. package/dist/es/standards-sdk.es47.js +1 -1
  181. package/dist/es/standards-sdk.es5.js +2 -2
  182. package/dist/es/standards-sdk.es52.js +1 -1
  183. package/dist/es/standards-sdk.es54.js +1 -1
  184. package/dist/es/standards-sdk.es57.js +2 -2
  185. package/dist/es/standards-sdk.es59.js +1 -1
  186. package/dist/es/standards-sdk.es6.js +2 -2
  187. package/dist/es/standards-sdk.es60.js +1 -1
  188. package/dist/es/standards-sdk.es61.js +7 -11
  189. package/dist/es/standards-sdk.es61.js.map +1 -1
  190. package/dist/es/standards-sdk.es63.js +1 -1
  191. package/dist/es/standards-sdk.es65.js +1 -1
  192. package/dist/es/standards-sdk.es66.js +2 -2
  193. package/dist/es/standards-sdk.es69.js +2 -2
  194. package/dist/es/standards-sdk.es7.js +2 -2
  195. package/dist/es/standards-sdk.es70.js +3 -3
  196. package/dist/es/standards-sdk.es71.js +2 -2
  197. package/dist/es/standards-sdk.es72.js +1 -1
  198. package/dist/es/standards-sdk.es75.js +2 -2
  199. package/dist/es/standards-sdk.es77.js +2 -2
  200. package/dist/es/standards-sdk.es78.js +4 -10
  201. package/dist/es/standards-sdk.es78.js.map +1 -1
  202. package/dist/es/standards-sdk.es79.js +1 -1
  203. package/dist/es/standards-sdk.es8.js +1 -1
  204. package/dist/es/standards-sdk.es80.js +26 -15
  205. package/dist/es/standards-sdk.es80.js.map +1 -1
  206. package/dist/es/standards-sdk.es82.js +12 -4
  207. package/dist/es/standards-sdk.es82.js.map +1 -1
  208. package/dist/es/standards-sdk.es83.js +7 -6
  209. package/dist/es/standards-sdk.es83.js.map +1 -1
  210. package/dist/es/standards-sdk.es84.js +7 -5
  211. package/dist/es/standards-sdk.es84.js.map +1 -1
  212. package/dist/es/standards-sdk.es86.js +55 -21
  213. package/dist/es/standards-sdk.es86.js.map +1 -1
  214. package/dist/es/standards-sdk.es87.js +22 -75
  215. package/dist/es/standards-sdk.es87.js.map +1 -1
  216. package/dist/es/standards-sdk.es88.js +45 -30
  217. package/dist/es/standards-sdk.es88.js.map +1 -1
  218. package/dist/es/standards-sdk.es89.js +57 -22
  219. package/dist/es/standards-sdk.es89.js.map +1 -1
  220. package/dist/es/standards-sdk.es90.js +28 -23
  221. package/dist/es/standards-sdk.es90.js.map +1 -1
  222. package/dist/es/standards-sdk.es91.js +23 -167
  223. package/dist/es/standards-sdk.es91.js.map +1 -1
  224. package/dist/es/standards-sdk.es92.js +158 -119
  225. package/dist/es/standards-sdk.es92.js.map +1 -1
  226. package/dist/es/standards-sdk.es93.js +68 -95
  227. package/dist/es/standards-sdk.es93.js.map +1 -1
  228. package/dist/es/standards-sdk.es94.js +136 -119
  229. package/dist/es/standards-sdk.es94.js.map +1 -1
  230. package/dist/es/standards-sdk.es95.js +139 -39
  231. package/dist/es/standards-sdk.es95.js.map +1 -1
  232. package/dist/es/standards-sdk.es96.js +42 -257
  233. package/dist/es/standards-sdk.es96.js.map +1 -1
  234. package/dist/es/standards-sdk.es97.js +243 -80
  235. package/dist/es/standards-sdk.es97.js.map +1 -1
  236. package/dist/es/standards-sdk.es98.js +47 -48
  237. package/dist/es/standards-sdk.es98.js.map +1 -1
  238. package/dist/es/standards-sdk.es99.js +100 -28
  239. package/dist/es/standards-sdk.es99.js.map +1 -1
  240. package/dist/es/utils/dynamic-import.d.ts +1 -0
  241. package/dist/es/utils/dynamic-import.d.ts.map +1 -1
  242. package/package.json +63 -61
@@ -1,12 +1,12 @@
1
1
  import { Client, Status } from "@hashgraph/sdk";
2
- import { createNodeOperatorContext } from "./standards-sdk.es135.js";
3
- import { Logger } from "./standards-sdk.es105.js";
2
+ import { createNodeOperatorContext } from "./standards-sdk.es138.js";
3
+ import { Logger } from "./standards-sdk.es106.js";
4
4
  import { HCS21BaseClient } from "./standards-sdk.es83.js";
5
5
  import { metadataDocumentSchema, HCS21ManifestPointerPattern } from "./standards-sdk.es80.js";
6
6
  import { buildHcs21CreateRegistryTx, buildHcs21MessageTx } from "./standards-sdk.es82.js";
7
7
  import { HCS21ValidationError } from "./standards-sdk.es81.js";
8
- import { inscribe } from "./standards-sdk.es124.js";
9
- import { getTopicId } from "./standards-sdk.es114.js";
8
+ import { inscribe } from "./standards-sdk.es125.js";
9
+ import { getTopicId } from "./standards-sdk.es115.js";
10
10
  class HCS21Client extends HCS21BaseClient {
11
11
  constructor(config) {
12
12
  const logger = config.logger || new Logger({ level: config.logLevel || "info", module: "HCS-21" });
@@ -76,6 +76,7 @@ class HCS21Client extends HCS21BaseClient {
76
76
  topicId,
77
77
  rawSequence
78
78
  );
79
+ const declarationManifestSequence = inscription.result?.manifest_sequence;
79
80
  const resultDetails = inscription.result && "jobId" in inscription.result ? {
80
81
  jobId: inscription.result.jobId,
81
82
  transactionId: inscription.result.transactionId
@@ -84,6 +85,7 @@ class HCS21Client extends HCS21BaseClient {
84
85
  pointer: pointerResult.pointer,
85
86
  topicId,
86
87
  sequenceNumber: pointerResult.sequenceNumber,
88
+ manifestSequence: declarationManifestSequence || pointerResult.sequenceNumber,
87
89
  ...resultDetails
88
90
  };
89
91
  }
@@ -160,7 +162,7 @@ class HCS21Client extends HCS21BaseClient {
160
162
  "invalid_payload"
161
163
  );
162
164
  }
163
- const pointer = `hcs://1/${topicId}/${resolvedSequence}`;
165
+ const pointer = `hcs://1/${topicId}`;
164
166
  if (!HCS21ManifestPointerPattern.test(pointer)) {
165
167
  throw new HCS21ValidationError(
166
168
  "Manifest pointer format is invalid",
@@ -1 +1 @@
1
- {"version":3,"file":"standards-sdk.es84.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 { 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 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: 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 resultDetails =\n inscription.result && 'jobId' in inscription.result\n ? {\n jobId: inscription.result.jobId,\n transactionId: inscription.result.transactionId,\n }\n : {};\n\n return {\n pointer: pointerResult.pointer,\n topicId,\n sequenceNumber: 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 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}/${resolvedSequence}`;\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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"}
1
+ {"version":3,"file":"standards-sdk.es84.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 { 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 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: 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 })?.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 }\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 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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"}
@@ -1,30 +1,64 @@
1
- import { AccountCreateTransaction, Hbar } from "@hashgraph/sdk";
2
- function buildHcs15BaseAccountCreateTx(params) {
3
- const tx = new AccountCreateTransaction().setECDSAKeyWithAlias(params.publicKey).setInitialBalance(
4
- params.initialBalance instanceof Hbar ? params.initialBalance : new Hbar(params.initialBalance ?? 1)
5
- );
6
- if (typeof params.maxAutomaticTokenAssociations === "number") {
7
- tx.setMaxAutomaticTokenAssociations(params.maxAutomaticTokenAssociations);
1
+ import { PublicKey } from "@hashgraph/sdk";
2
+ import { createHash } from "crypto";
3
+ function sortObject(value) {
4
+ if (Array.isArray(value)) {
5
+ return value.map(sortObject);
8
6
  }
9
- if (params.accountMemo) {
10
- tx.setAccountMemo(params.accountMemo);
7
+ if (value && typeof value === "object") {
8
+ const entries = Object.entries(value).sort(
9
+ ([a], [b]) => a < b ? -1 : a > b ? 1 : 0
10
+ );
11
+ const sorted = {};
12
+ for (const [key, val] of entries) {
13
+ sorted[key] = sortObject(val);
14
+ }
15
+ return sorted;
11
16
  }
12
- return tx;
17
+ return value;
13
18
  }
14
- function buildHcs15PetalAccountCreateTx(params) {
15
- const tx = new AccountCreateTransaction().setKeyWithoutAlias(params.publicKey).setInitialBalance(
16
- params.initialBalance instanceof Hbar ? params.initialBalance : new Hbar(params.initialBalance ?? 1)
17
- );
18
- if (typeof params.maxAutomaticTokenAssociations === "number") {
19
- tx.setMaxAutomaticTokenAssociations(params.maxAutomaticTokenAssociations);
19
+ function canonicalize(value) {
20
+ const sorted = sortObject(value);
21
+ return JSON.stringify(sorted);
22
+ }
23
+ function verifyDeclarationSignature(declaration, publisherPublicKey) {
24
+ if (!declaration.signature) {
25
+ return false;
26
+ }
27
+ try {
28
+ const { signature, ...unsigned } = declaration;
29
+ const payload = canonicalize(unsigned);
30
+ const signatureBytes = Buffer.from(signature, "base64");
31
+ const publicKey = PublicKey.fromString(publisherPublicKey);
32
+ return publicKey.verify(Buffer.from(payload, "utf8"), signatureBytes);
33
+ } catch {
34
+ return false;
20
35
  }
21
- if (params.accountMemo) {
22
- tx.setAccountMemo(params.accountMemo);
36
+ }
37
+ function verifyManifestSignature(manifest, signatureBase64, publisherPublicKey) {
38
+ try {
39
+ const payload = canonicalize(manifest);
40
+ const signatureBytes = Buffer.from(signatureBase64, "base64");
41
+ const publicKey = PublicKey.fromString(publisherPublicKey);
42
+ return publicKey.verify(Buffer.from(payload, "utf8"), signatureBytes);
43
+ } catch {
44
+ return false;
23
45
  }
24
- return tx;
46
+ }
47
+ function normalizeDigest(value) {
48
+ return value.replace(/^sha384[-:]?/i, "").trim().toLowerCase();
49
+ }
50
+ function verifyArtifactDigest(artifact, expectedDigest) {
51
+ const hash = createHash("sha384");
52
+ hash.update(artifact);
53
+ const hex = hash.digest("hex").toLowerCase();
54
+ const base64 = Buffer.from(hex, "hex").toString("base64").toLowerCase();
55
+ const expected = normalizeDigest(expectedDigest);
56
+ return expected === hex || expected === base64;
25
57
  }
26
58
  export {
27
- buildHcs15BaseAccountCreateTx,
28
- buildHcs15PetalAccountCreateTx
59
+ canonicalize,
60
+ verifyArtifactDigest,
61
+ verifyDeclarationSignature,
62
+ verifyManifestSignature
29
63
  };
30
64
  //# sourceMappingURL=standards-sdk.es86.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"standards-sdk.es86.js","sources":["../../src/hcs-15/tx.ts"],"sourcesContent":["import { AccountCreateTransaction, Hbar, PublicKey } from '@hashgraph/sdk';\n\n/**\n * Build AccountCreateTransaction for an HCS-15 base account.\n * Uses an ECDSA public key and sets the EVM alias from it.\n */\nexport function buildHcs15BaseAccountCreateTx(params: {\n publicKey: PublicKey;\n initialBalance?: Hbar | number;\n maxAutomaticTokenAssociations?: number;\n accountMemo?: string;\n}): AccountCreateTransaction {\n const tx = new AccountCreateTransaction()\n .setECDSAKeyWithAlias(params.publicKey)\n .setInitialBalance(\n params.initialBalance instanceof Hbar\n ? params.initialBalance\n : new Hbar(params.initialBalance ?? 1),\n );\n\n if (typeof params.maxAutomaticTokenAssociations === 'number') {\n tx.setMaxAutomaticTokenAssociations(params.maxAutomaticTokenAssociations);\n }\n if (params.accountMemo) {\n tx.setAccountMemo(params.accountMemo);\n }\n return tx;\n}\n\n/**\n * Build AccountCreateTransaction for an HCS-15 Petal account.\n * Reuses the same public key as the base account, without alias.\n */\nexport function buildHcs15PetalAccountCreateTx(params: {\n publicKey: PublicKey;\n initialBalance?: Hbar | number;\n maxAutomaticTokenAssociations?: number;\n accountMemo?: string;\n}): AccountCreateTransaction {\n const tx = new AccountCreateTransaction()\n .setKeyWithoutAlias(params.publicKey)\n .setInitialBalance(\n params.initialBalance instanceof Hbar\n ? params.initialBalance\n : new Hbar(params.initialBalance ?? 1),\n );\n\n if (typeof params.maxAutomaticTokenAssociations === 'number') {\n tx.setMaxAutomaticTokenAssociations(params.maxAutomaticTokenAssociations);\n }\n if (params.accountMemo) {\n tx.setAccountMemo(params.accountMemo);\n }\n return tx;\n}\n"],"names":[],"mappings":";AAMO,SAAS,8BAA8B,QAKjB;AAC3B,QAAM,KAAK,IAAI,yBAAA,EACZ,qBAAqB,OAAO,SAAS,EACrC;AAAA,IACC,OAAO,0BAA0B,OAC7B,OAAO,iBACP,IAAI,KAAK,OAAO,kBAAkB,CAAC;AAAA,EAAA;AAG3C,MAAI,OAAO,OAAO,kCAAkC,UAAU;AAC5D,OAAG,iCAAiC,OAAO,6BAA6B;AAAA,EAC1E;AACA,MAAI,OAAO,aAAa;AACtB,OAAG,eAAe,OAAO,WAAW;AAAA,EACtC;AACA,SAAO;AACT;AAMO,SAAS,+BAA+B,QAKlB;AAC3B,QAAM,KAAK,IAAI,yBAAA,EACZ,mBAAmB,OAAO,SAAS,EACnC;AAAA,IACC,OAAO,0BAA0B,OAC7B,OAAO,iBACP,IAAI,KAAK,OAAO,kBAAkB,CAAC;AAAA,EAAA;AAG3C,MAAI,OAAO,OAAO,kCAAkC,UAAU;AAC5D,OAAG,iCAAiC,OAAO,6BAA6B;AAAA,EAC1E;AACA,MAAI,OAAO,aAAa;AACtB,OAAG,eAAe,OAAO,WAAW;AAAA,EACtC;AACA,SAAO;AACT;"}
1
+ {"version":3,"file":"standards-sdk.es86.js","sources":["../../src/hcs-21/verify.ts"],"sourcesContent":["import { PublicKey } from '@hashgraph/sdk';\nimport { createHash } from 'crypto';\nimport { AdapterDeclaration } from './types';\n\ntype JsonValue = string | number | boolean | null | JsonValue[] | { [key: string]: JsonValue };\n\nfunction sortObject(value: JsonValue): JsonValue {\n if (Array.isArray(value)) {\n return value.map(sortObject) as JsonValue;\n }\n if (value && typeof value === 'object') {\n const entries = Object.entries(value as Record<string, JsonValue>).sort(\n ([a], [b]) => (a < b ? -1 : a > b ? 1 : 0),\n );\n const sorted: Record<string, JsonValue> = {};\n for (const [key, val] of entries) {\n sorted[key] = sortObject(val);\n }\n return sorted;\n }\n return value;\n}\n\nexport function canonicalize(value: unknown): string {\n const sorted = sortObject(value as JsonValue);\n return JSON.stringify(sorted);\n}\n\nexport function verifyDeclarationSignature(\n declaration: AdapterDeclaration,\n publisherPublicKey: string,\n): boolean {\n if (!declaration.signature) {\n return false;\n }\n try {\n const { signature, ...unsigned } = declaration;\n const payload = canonicalize(unsigned);\n const signatureBytes = Buffer.from(signature, 'base64');\n const publicKey = PublicKey.fromString(publisherPublicKey);\n return publicKey.verify(Buffer.from(payload, 'utf8'), signatureBytes);\n } catch {\n return false;\n }\n}\n\nexport function verifyManifestSignature(\n manifest: unknown,\n signatureBase64: string,\n publisherPublicKey: string,\n): boolean {\n try {\n const payload = canonicalize(manifest as JsonValue);\n const signatureBytes = Buffer.from(signatureBase64, 'base64');\n const publicKey = PublicKey.fromString(publisherPublicKey);\n return publicKey.verify(Buffer.from(payload, 'utf8'), signatureBytes);\n } catch {\n return false;\n }\n}\n\nfunction normalizeDigest(value: string): string {\n return value.replace(/^sha384[-:]?/i, '').trim().toLowerCase();\n}\n\nexport function verifyArtifactDigest(\n artifact: Buffer | Uint8Array,\n expectedDigest: string,\n): boolean {\n const hash = createHash('sha384');\n hash.update(artifact);\n const hex = hash.digest('hex').toLowerCase();\n const base64 = Buffer.from(hex, 'hex').toString('base64').toLowerCase();\n const expected = normalizeDigest(expectedDigest);\n return expected === hex || expected === base64;\n}\n"],"names":[],"mappings":";;AAMA,SAAS,WAAW,OAA6B;AAC/C,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,IAAI,UAAU;AAAA,EAC7B;AACA,MAAI,SAAS,OAAO,UAAU,UAAU;AACtC,UAAM,UAAU,OAAO,QAAQ,KAAkC,EAAE;AAAA,MACjE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAO,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI;AAAA,IAAA;AAE1C,UAAM,SAAoC,CAAA;AAC1C,eAAW,CAAC,KAAK,GAAG,KAAK,SAAS;AAChC,aAAO,GAAG,IAAI,WAAW,GAAG;AAAA,IAC9B;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,SAAS,aAAa,OAAwB;AACnD,QAAM,SAAS,WAAW,KAAkB;AAC5C,SAAO,KAAK,UAAU,MAAM;AAC9B;AAEO,SAAS,2BACd,aACA,oBACS;AACT,MAAI,CAAC,YAAY,WAAW;AAC1B,WAAO;AAAA,EACT;AACA,MAAI;AACF,UAAM,EAAE,WAAW,GAAG,SAAA,IAAa;AACnC,UAAM,UAAU,aAAa,QAAQ;AACrC,UAAM,iBAAiB,OAAO,KAAK,WAAW,QAAQ;AACtD,UAAM,YAAY,UAAU,WAAW,kBAAkB;AACzD,WAAO,UAAU,OAAO,OAAO,KAAK,SAAS,MAAM,GAAG,cAAc;AAAA,EACtE,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,wBACd,UACA,iBACA,oBACS;AACT,MAAI;AACF,UAAM,UAAU,aAAa,QAAqB;AAClD,UAAM,iBAAiB,OAAO,KAAK,iBAAiB,QAAQ;AAC5D,UAAM,YAAY,UAAU,WAAW,kBAAkB;AACzD,WAAO,UAAU,OAAO,OAAO,KAAK,SAAS,MAAM,GAAG,cAAc;AAAA,EACtE,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,gBAAgB,OAAuB;AAC9C,SAAO,MAAM,QAAQ,iBAAiB,EAAE,EAAE,KAAA,EAAO,YAAA;AACnD;AAEO,SAAS,qBACd,UACA,gBACS;AACT,QAAM,OAAO,WAAW,QAAQ;AAChC,OAAK,OAAO,QAAQ;AACpB,QAAM,MAAM,KAAK,OAAO,KAAK,EAAE,YAAA;AAC/B,QAAM,SAAS,OAAO,KAAK,KAAK,KAAK,EAAE,SAAS,QAAQ,EAAE,YAAA;AAC1D,QAAM,WAAW,gBAAgB,cAAc;AAC/C,SAAO,aAAa,OAAO,aAAa;AAC1C;"}
@@ -1,83 +1,30 @@
1
- import { AccountId, Client, PrivateKey, Hbar } from "@hashgraph/sdk";
2
- import { createNodeOperatorContext } from "./standards-sdk.es135.js";
3
- import { buildHcs15BaseAccountCreateTx, buildHcs15PetalAccountCreateTx } from "./standards-sdk.es86.js";
4
- import { HCS15BaseClient } from "./standards-sdk.es89.js";
5
- class HCS15Client extends HCS15BaseClient {
6
- constructor(config) {
7
- super(config);
8
- this.operatorId = AccountId.fromString(config.operatorId);
9
- this.operatorCtx = createNodeOperatorContext({
10
- network: this.network,
11
- operatorId: this.operatorId,
12
- operatorKey: config.operatorKey,
13
- keyType: config.keyType,
14
- mirrorNode: this.mirrorNode,
15
- logger: this.logger,
16
- client: this.network === "mainnet" ? Client.forMainnet() : Client.forTestnet()
17
- });
18
- this.client = this.operatorCtx.client;
1
+ import { AccountCreateTransaction, Hbar } from "@hashgraph/sdk";
2
+ function buildHcs15BaseAccountCreateTx(params) {
3
+ const tx = new AccountCreateTransaction().setECDSAKeyWithAlias(params.publicKey).setInitialBalance(
4
+ params.initialBalance instanceof Hbar ? params.initialBalance : new Hbar(params.initialBalance ?? 1)
5
+ );
6
+ if (typeof params.maxAutomaticTokenAssociations === "number") {
7
+ tx.setMaxAutomaticTokenAssociations(params.maxAutomaticTokenAssociations);
19
8
  }
20
- getKeyType() {
21
- return this.operatorCtx.keyType;
9
+ if (params.accountMemo) {
10
+ tx.setAccountMemo(params.accountMemo);
22
11
  }
23
- async close() {
24
- try {
25
- this.client.close();
26
- } catch {
27
- }
28
- }
29
- /**
30
- * Create a new base account with a newly generated ECDSA key and EVM alias.
31
- */
32
- async createBaseAccount(options) {
33
- const priv = PrivateKey.generateECDSA();
34
- const pub = priv.publicKey;
35
- const tx = buildHcs15BaseAccountCreateTx({
36
- publicKey: pub,
37
- initialBalance: new Hbar(options?.initialBalance ?? 10),
38
- maxAutomaticTokenAssociations: options?.maxAutomaticTokenAssociations,
39
- accountMemo: options?.accountMemo
40
- });
41
- const resp = await tx.execute(this.client);
42
- const receipt = await resp.getReceipt(this.client);
43
- if (!receipt.accountId) {
44
- throw new Error("HCS-15 BASE_ACCOUNT_CREATE_FAILED");
45
- }
46
- const accountId = receipt.accountId.toString();
47
- const evmAddress = `0x${pub.toEvmAddress()}`;
48
- this.logger.info("Created HCS-15 base account", { accountId, evmAddress });
49
- return {
50
- accountId,
51
- privateKey: priv,
52
- privateKeyHex: priv.toStringRaw(),
53
- publicKey: pub,
54
- evmAddress,
55
- receipt
56
- };
12
+ return tx;
13
+ }
14
+ function buildHcs15PetalAccountCreateTx(params) {
15
+ const tx = new AccountCreateTransaction().setKeyWithoutAlias(params.publicKey).setInitialBalance(
16
+ params.initialBalance instanceof Hbar ? params.initialBalance : new Hbar(params.initialBalance ?? 1)
17
+ );
18
+ if (typeof params.maxAutomaticTokenAssociations === "number") {
19
+ tx.setMaxAutomaticTokenAssociations(params.maxAutomaticTokenAssociations);
57
20
  }
58
- /**
59
- * Create a Petal account that reuses the base account ECDSA key (no alias).
60
- */
61
- async createPetalAccount(params) {
62
- const baseKey = typeof params.basePrivateKey === "string" ? PrivateKey.fromStringECDSA(params.basePrivateKey) : params.basePrivateKey;
63
- const pub = baseKey.publicKey;
64
- const tx = buildHcs15PetalAccountCreateTx({
65
- publicKey: pub,
66
- initialBalance: new Hbar(params.initialBalance ?? 1),
67
- maxAutomaticTokenAssociations: params.maxAutomaticTokenAssociations,
68
- accountMemo: params.accountMemo
69
- });
70
- const resp = await tx.execute(this.client);
71
- const receipt = await resp.getReceipt(this.client);
72
- if (!receipt.accountId) {
73
- throw new Error("HCS-15 PETAL_ACCOUNT_CREATE_FAILED");
74
- }
75
- const accountId = receipt.accountId.toString();
76
- this.logger.info("Created HCS-15 petal account", { accountId });
77
- return { accountId, receipt };
21
+ if (params.accountMemo) {
22
+ tx.setAccountMemo(params.accountMemo);
78
23
  }
24
+ return tx;
79
25
  }
80
26
  export {
81
- HCS15Client
27
+ buildHcs15BaseAccountCreateTx,
28
+ buildHcs15PetalAccountCreateTx
82
29
  };
83
30
  //# sourceMappingURL=standards-sdk.es87.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"standards-sdk.es87.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 { SDKHCS15ClientConfig } 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 /**\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 }): Promise<{\n accountId: string;\n privateKey: PrivateKey;\n privateKeyHex: string;\n publicKey: PublicKey;\n evmAddress: string;\n receipt: TransactionReceipt;\n }> {\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 });\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 }): Promise<{ accountId: string; receipt: TransactionReceipt }> {\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 });\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 return { accountId, receipt };\n }\n}\n"],"names":[],"mappings":";;;;AAoBO,MAAM,oBAAoB,gBAAgB;AAAA,EAK/C,YAAY,QAA8B;AACxC,UAAM,MAAM;AACZ,SAAK,aAAa,UAAU,WAAW,OAAO,UAAU;AACxD,SAAK,cAAc,0BAA0B;AAAA,MAC3C,SAAS,KAAK;AAAA,MACd,YAAY,KAAK;AAAA,MACjB,aAAa,OAAO;AAAA,MACpB,SAAS,OAAO;AAAA,MAChB,YAAY,KAAK;AAAA,MACjB,QAAQ,KAAK;AAAA,MACb,QACE,KAAK,YAAY,YAAY,OAAO,WAAA,IAAe,OAAO,WAAA;AAAA,IAAW,CACxE;AACD,SAAK,SAAS,KAAK,YAAY;AAAA,EACjC;AAAA,EAEO,aAAkC;AACvC,WAAO,KAAK,YAAY;AAAA,EAC1B;AAAA,EAEA,MAAa,QAAuB;AAClC,QAAI;AACF,WAAK,OAAO,MAAA;AAAA,IACd,QAAQ;AAAA,IAAC;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAkB,SAWrB;AACD,UAAM,OAAO,WAAW,cAAA;AACxB,UAAM,MAAM,KAAK;AACjB,UAAM,KAAK,8BAA8B;AAAA,MACvC,WAAW;AAAA,MACX,gBAAgB,IAAI,KAAK,SAAS,kBAAkB,EAAE;AAAA,MACtD,+BAA+B,SAAS;AAAA,MACxC,aAAa,SAAS;AAAA,IAAA,CACvB;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,mCAAmC;AAAA,IACrD;AACA,UAAM,YAAY,QAAQ,UAAU,SAAA;AACpC,UAAM,aAAa,KAAK,IAAI,aAAA,CAAc;AAC1C,SAAK,OAAO,KAAK,+BAA+B,EAAE,WAAW,YAAY;AACzE,WAAO;AAAA,MACL;AAAA,MACA,YAAY;AAAA,MACZ,eAAe,KAAK,YAAA;AAAA,MACpB,WAAW;AAAA,MACX;AAAA,MACA;AAAA,IAAA;AAAA,EAEJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAmB,QAKuC;AAC9D,UAAM,UACJ,OAAO,OAAO,mBAAmB,WAC7B,WAAW,gBAAgB,OAAO,cAAc,IAChD,OAAO;AACb,UAAM,MAAM,QAAQ;AACpB,UAAM,KAAK,+BAA+B;AAAA,MACxC,WAAW;AAAA,MACX,gBAAgB,IAAI,KAAK,OAAO,kBAAkB,CAAC;AAAA,MACnD,+BAA+B,OAAO;AAAA,MACtC,aAAa,OAAO;AAAA,IAAA,CACrB;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,oCAAoC;AAAA,IACtD;AACA,UAAM,YAAY,QAAQ,UAAU,SAAA;AACpC,SAAK,OAAO,KAAK,gCAAgC,EAAE,WAAW;AAC9D,WAAO,EAAE,WAAW,QAAA;AAAA,EACtB;AACF;"}
1
+ {"version":3,"file":"standards-sdk.es87.js","sources":["../../src/hcs-15/tx.ts"],"sourcesContent":["import { AccountCreateTransaction, Hbar, PublicKey } from '@hashgraph/sdk';\n\n/**\n * Build AccountCreateTransaction for an HCS-15 base account.\n * Uses an ECDSA public key and sets the EVM alias from it.\n */\nexport function buildHcs15BaseAccountCreateTx(params: {\n publicKey: PublicKey;\n initialBalance?: Hbar | number;\n maxAutomaticTokenAssociations?: number;\n accountMemo?: string;\n}): AccountCreateTransaction {\n const tx = new AccountCreateTransaction()\n .setECDSAKeyWithAlias(params.publicKey)\n .setInitialBalance(\n params.initialBalance instanceof Hbar\n ? params.initialBalance\n : new Hbar(params.initialBalance ?? 1),\n );\n\n if (typeof params.maxAutomaticTokenAssociations === 'number') {\n tx.setMaxAutomaticTokenAssociations(params.maxAutomaticTokenAssociations);\n }\n if (params.accountMemo) {\n tx.setAccountMemo(params.accountMemo);\n }\n return tx;\n}\n\n/**\n * Build AccountCreateTransaction for an HCS-15 Petal account.\n * Reuses the same public key as the base account, without alias.\n */\nexport function buildHcs15PetalAccountCreateTx(params: {\n publicKey: PublicKey;\n initialBalance?: Hbar | number;\n maxAutomaticTokenAssociations?: number;\n accountMemo?: string;\n}): AccountCreateTransaction {\n const tx = new AccountCreateTransaction()\n .setKeyWithoutAlias(params.publicKey)\n .setInitialBalance(\n params.initialBalance instanceof Hbar\n ? params.initialBalance\n : new Hbar(params.initialBalance ?? 1),\n );\n\n if (typeof params.maxAutomaticTokenAssociations === 'number') {\n tx.setMaxAutomaticTokenAssociations(params.maxAutomaticTokenAssociations);\n }\n if (params.accountMemo) {\n tx.setAccountMemo(params.accountMemo);\n }\n return tx;\n}\n"],"names":[],"mappings":";AAMO,SAAS,8BAA8B,QAKjB;AAC3B,QAAM,KAAK,IAAI,yBAAA,EACZ,qBAAqB,OAAO,SAAS,EACrC;AAAA,IACC,OAAO,0BAA0B,OAC7B,OAAO,iBACP,IAAI,KAAK,OAAO,kBAAkB,CAAC;AAAA,EAAA;AAG3C,MAAI,OAAO,OAAO,kCAAkC,UAAU;AAC5D,OAAG,iCAAiC,OAAO,6BAA6B;AAAA,EAC1E;AACA,MAAI,OAAO,aAAa;AACtB,OAAG,eAAe,OAAO,WAAW;AAAA,EACtC;AACA,SAAO;AACT;AAMO,SAAS,+BAA+B,QAKlB;AAC3B,QAAM,KAAK,IAAI,yBAAA,EACZ,mBAAmB,OAAO,SAAS,EACnC;AAAA,IACC,OAAO,0BAA0B,OAC7B,OAAO,iBACP,IAAI,KAAK,OAAO,kBAAkB,CAAC;AAAA,EAAA;AAG3C,MAAI,OAAO,OAAO,kCAAkC,UAAU;AAC5D,OAAG,iCAAiC,OAAO,6BAA6B;AAAA,EAC1E;AACA,MAAI,OAAO,aAAa;AACtB,OAAG,eAAe,OAAO,WAAW;AAAA,EACtC;AACA,SAAO;AACT;"}
@@ -1,22 +1,35 @@
1
- import { PrivateKey, Hbar } from "@hashgraph/sdk";
2
- import { HCS15BaseClient } from "./standards-sdk.es89.js";
3
- import { buildHcs15BaseAccountCreateTx, buildHcs15PetalAccountCreateTx } from "./standards-sdk.es86.js";
4
- class HCS15BrowserClient extends HCS15BaseClient {
1
+ import { AccountId, Client, PrivateKey, Hbar } from "@hashgraph/sdk";
2
+ import { createNodeOperatorContext } from "./standards-sdk.es138.js";
3
+ import { buildHcs15BaseAccountCreateTx, buildHcs15PetalAccountCreateTx } from "./standards-sdk.es87.js";
4
+ import { HCS15BaseClient } from "./standards-sdk.es90.js";
5
+ class HCS15Client extends HCS15BaseClient {
5
6
  constructor(config) {
6
7
  super(config);
7
- this.signer = config.signer || config.hwc?.dAppConnector?.signers?.[0];
8
+ this.operatorId = AccountId.fromString(config.operatorId);
9
+ this.operatorCtx = createNodeOperatorContext({
10
+ network: this.network,
11
+ operatorId: this.operatorId,
12
+ operatorKey: config.operatorKey,
13
+ keyType: config.keyType,
14
+ mirrorNode: this.mirrorNode,
15
+ logger: this.logger,
16
+ client: this.network === "mainnet" ? Client.forMainnet() : Client.forTestnet()
17
+ });
18
+ this.client = this.operatorCtx.client;
19
+ }
20
+ getKeyType() {
21
+ return this.operatorCtx.keyType;
8
22
  }
9
- requireSigner() {
10
- if (!this.signer) {
11
- throw new Error("HCS-15 Browser client requires an active DAppSigner");
23
+ async close() {
24
+ try {
25
+ this.client.close();
26
+ } catch {
12
27
  }
13
- return this.signer;
14
28
  }
15
29
  /**
16
- * Create a new base account with a new ECDSA key and EVM alias using a connected wallet signer.
30
+ * Create a new base account with a newly generated ECDSA key and EVM alias.
17
31
  */
18
32
  async createBaseAccount(options) {
19
- const signer = this.requireSigner();
20
33
  const priv = PrivateKey.generateECDSA();
21
34
  const pub = priv.publicKey;
22
35
  const tx = buildHcs15BaseAccountCreateTx({
@@ -25,44 +38,46 @@ class HCS15BrowserClient extends HCS15BaseClient {
25
38
  maxAutomaticTokenAssociations: options?.maxAutomaticTokenAssociations,
26
39
  accountMemo: options?.accountMemo
27
40
  });
28
- const frozen = await tx.freezeWithSigner(signer);
29
- const res = await frozen.executeWithSigner(signer);
30
- const receipt = await res.getReceiptWithSigner(signer);
31
- const accountId = receipt?.accountId?.toString?.();
41
+ const resp = await tx.execute(this.client);
42
+ const receipt = await resp.getReceipt(this.client);
43
+ if (!receipt.accountId) {
44
+ throw new Error("HCS-15 BASE_ACCOUNT_CREATE_FAILED");
45
+ }
46
+ const accountId = receipt.accountId.toString();
32
47
  const evmAddress = `0x${pub.toEvmAddress()}`;
33
- this.logger.info("Created HCS-15 base account (browser)", {
34
- accountId,
35
- evmAddress
36
- });
48
+ this.logger.info("Created HCS-15 base account", { accountId, evmAddress });
37
49
  return {
38
50
  accountId,
39
51
  privateKey: priv,
40
52
  privateKeyHex: priv.toStringRaw(),
41
53
  publicKey: pub,
42
- evmAddress
54
+ evmAddress,
55
+ receipt
43
56
  };
44
57
  }
45
58
  /**
46
- * Create a petal account reusing a base ECDSA key, via wallet signer.
59
+ * Create a Petal account that reuses the base account ECDSA key (no alias).
47
60
  */
48
61
  async createPetalAccount(params) {
49
- const signer = this.requireSigner();
50
62
  const baseKey = typeof params.basePrivateKey === "string" ? PrivateKey.fromStringECDSA(params.basePrivateKey) : params.basePrivateKey;
63
+ const pub = baseKey.publicKey;
51
64
  const tx = buildHcs15PetalAccountCreateTx({
52
- publicKey: baseKey.publicKey,
65
+ publicKey: pub,
53
66
  initialBalance: new Hbar(params.initialBalance ?? 1),
54
67
  maxAutomaticTokenAssociations: params.maxAutomaticTokenAssociations,
55
68
  accountMemo: params.accountMemo
56
69
  });
57
- const frozen = await tx.freezeWithSigner(signer);
58
- const res = await frozen.executeWithSigner(signer);
59
- const receipt = await res.getReceiptWithSigner(signer);
60
- const accountId = receipt?.accountId?.toString?.();
61
- this.logger.info("Created HCS-15 petal account (browser)", { accountId });
62
- return { accountId };
70
+ const resp = await tx.execute(this.client);
71
+ const receipt = await resp.getReceipt(this.client);
72
+ if (!receipt.accountId) {
73
+ throw new Error("HCS-15 PETAL_ACCOUNT_CREATE_FAILED");
74
+ }
75
+ const accountId = receipt.accountId.toString();
76
+ this.logger.info("Created HCS-15 petal account", { accountId });
77
+ return { accountId, receipt };
63
78
  }
64
79
  }
65
80
  export {
66
- HCS15BrowserClient
81
+ HCS15Client
67
82
  };
68
83
  //# sourceMappingURL=standards-sdk.es88.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"standards-sdk.es88.js","sources":["../../src/hcs-15/browser.ts"],"sourcesContent":["import type { DAppSigner } from '@hashgraph/hedera-wallet-connect';\nimport type {\n PublicKey,\n PrivateKey,\n TransactionResponse,\n} from '@hashgraph/sdk';\nimport { PrivateKey as SDKPrivateKey, Hbar } from '@hashgraph/sdk';\nimport type { BrowserHCS15ClientConfig } from './types';\n\nimport { HCS15BaseClient } from './base-client';\nimport {\n buildHcs15BaseAccountCreateTx,\n buildHcs15PetalAccountCreateTx,\n} from './tx';\n\nexport class HCS15BrowserClient extends HCS15BaseClient {\n private readonly signer?: DAppSigner;\n\n constructor(config: BrowserHCS15ClientConfig) {\n super(config);\n this.signer = config.signer || config.hwc?.dAppConnector?.signers?.[0];\n }\n\n private requireSigner(): DAppSigner {\n if (!this.signer) {\n throw new Error('HCS-15 Browser client requires an active DAppSigner');\n }\n return this.signer as DAppSigner;\n }\n\n /**\n * Create a new base account with a new ECDSA key and EVM alias using a connected wallet signer.\n */\n async createBaseAccount(options?: {\n initialBalance?: number;\n maxAutomaticTokenAssociations?: number;\n accountMemo?: string;\n }): Promise<{\n accountId?: string;\n privateKey: PrivateKey;\n privateKeyHex: string;\n publicKey: PublicKey;\n evmAddress: string;\n }> {\n const signer = this.requireSigner();\n const priv = SDKPrivateKey.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 });\n const frozen = await tx.freezeWithSigner(signer);\n const res: TransactionResponse = await frozen.executeWithSigner(signer);\n const receipt = await res.getReceiptWithSigner(signer as any);\n const accountId = receipt?.accountId?.toString?.();\n const evmAddress = `0x${pub.toEvmAddress()}`;\n this.logger.info('Created HCS-15 base account (browser)', {\n accountId,\n evmAddress,\n });\n return {\n accountId,\n privateKey: priv,\n privateKeyHex: priv.toStringRaw(),\n publicKey: pub,\n evmAddress,\n };\n }\n\n /**\n * Create a petal account reusing a base ECDSA key, via wallet signer.\n */\n async createPetalAccount(params: {\n basePrivateKey: string | PrivateKey;\n initialBalance?: number;\n maxAutomaticTokenAssociations?: number;\n accountMemo?: string;\n }): Promise<{ accountId?: string }> {\n const signer = this.requireSigner();\n const baseKey =\n typeof params.basePrivateKey === 'string'\n ? SDKPrivateKey.fromStringECDSA(params.basePrivateKey)\n : params.basePrivateKey;\n const tx = buildHcs15PetalAccountCreateTx({\n publicKey: baseKey.publicKey,\n initialBalance: new Hbar(params.initialBalance ?? 1),\n maxAutomaticTokenAssociations: params.maxAutomaticTokenAssociations,\n accountMemo: params.accountMemo,\n });\n const frozen = await tx.freezeWithSigner(signer);\n const res: TransactionResponse = await frozen.executeWithSigner(signer);\n const receipt = await res.getReceiptWithSigner(signer as any);\n const accountId = receipt?.accountId?.toString?.();\n this.logger.info('Created HCS-15 petal account (browser)', { accountId });\n return { accountId };\n }\n}\n"],"names":["SDKPrivateKey"],"mappings":";;;AAeO,MAAM,2BAA2B,gBAAgB;AAAA,EAGtD,YAAY,QAAkC;AAC5C,UAAM,MAAM;AACZ,SAAK,SAAS,OAAO,UAAU,OAAO,KAAK,eAAe,UAAU,CAAC;AAAA,EACvE;AAAA,EAEQ,gBAA4B;AAClC,QAAI,CAAC,KAAK,QAAQ;AAChB,YAAM,IAAI,MAAM,qDAAqD;AAAA,IACvE;AACA,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAkB,SAUrB;AACD,UAAM,SAAS,KAAK,cAAA;AACpB,UAAM,OAAOA,WAAc,cAAA;AAC3B,UAAM,MAAM,KAAK;AACjB,UAAM,KAAK,8BAA8B;AAAA,MACvC,WAAW;AAAA,MACX,gBAAgB,IAAI,KAAK,SAAS,kBAAkB,EAAE;AAAA,MACtD,+BAA+B,SAAS;AAAA,MACxC,aAAa,SAAS;AAAA,IAAA,CACvB;AACD,UAAM,SAAS,MAAM,GAAG,iBAAiB,MAAM;AAC/C,UAAM,MAA2B,MAAM,OAAO,kBAAkB,MAAM;AACtE,UAAM,UAAU,MAAM,IAAI,qBAAqB,MAAa;AAC5D,UAAM,YAAY,SAAS,WAAW,WAAA;AACtC,UAAM,aAAa,KAAK,IAAI,aAAA,CAAc;AAC1C,SAAK,OAAO,KAAK,yCAAyC;AAAA,MACxD;AAAA,MACA;AAAA,IAAA,CACD;AACD,WAAO;AAAA,MACL;AAAA,MACA,YAAY;AAAA,MACZ,eAAe,KAAK,YAAA;AAAA,MACpB,WAAW;AAAA,MACX;AAAA,IAAA;AAAA,EAEJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAmB,QAKW;AAClC,UAAM,SAAS,KAAK,cAAA;AACpB,UAAM,UACJ,OAAO,OAAO,mBAAmB,WAC7BA,WAAc,gBAAgB,OAAO,cAAc,IACnD,OAAO;AACb,UAAM,KAAK,+BAA+B;AAAA,MACxC,WAAW,QAAQ;AAAA,MACnB,gBAAgB,IAAI,KAAK,OAAO,kBAAkB,CAAC;AAAA,MACnD,+BAA+B,OAAO;AAAA,MACtC,aAAa,OAAO;AAAA,IAAA,CACrB;AACD,UAAM,SAAS,MAAM,GAAG,iBAAiB,MAAM;AAC/C,UAAM,MAA2B,MAAM,OAAO,kBAAkB,MAAM;AACtE,UAAM,UAAU,MAAM,IAAI,qBAAqB,MAAa;AAC5D,UAAM,YAAY,SAAS,WAAW,WAAA;AACtC,SAAK,OAAO,KAAK,0CAA0C,EAAE,WAAW;AACxE,WAAO,EAAE,UAAA;AAAA,EACX;AACF;"}
1
+ {"version":3,"file":"standards-sdk.es88.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 { SDKHCS15ClientConfig } 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 /**\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 }): Promise<{\n accountId: string;\n privateKey: PrivateKey;\n privateKeyHex: string;\n publicKey: PublicKey;\n evmAddress: string;\n receipt: TransactionReceipt;\n }> {\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 });\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 }): Promise<{ accountId: string; receipt: TransactionReceipt }> {\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 });\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 return { accountId, receipt };\n }\n}\n"],"names":[],"mappings":";;;;AAoBO,MAAM,oBAAoB,gBAAgB;AAAA,EAK/C,YAAY,QAA8B;AACxC,UAAM,MAAM;AACZ,SAAK,aAAa,UAAU,WAAW,OAAO,UAAU;AACxD,SAAK,cAAc,0BAA0B;AAAA,MAC3C,SAAS,KAAK;AAAA,MACd,YAAY,KAAK;AAAA,MACjB,aAAa,OAAO;AAAA,MACpB,SAAS,OAAO;AAAA,MAChB,YAAY,KAAK;AAAA,MACjB,QAAQ,KAAK;AAAA,MACb,QACE,KAAK,YAAY,YAAY,OAAO,WAAA,IAAe,OAAO,WAAA;AAAA,IAAW,CACxE;AACD,SAAK,SAAS,KAAK,YAAY;AAAA,EACjC;AAAA,EAEO,aAAkC;AACvC,WAAO,KAAK,YAAY;AAAA,EAC1B;AAAA,EAEA,MAAa,QAAuB;AAClC,QAAI;AACF,WAAK,OAAO,MAAA;AAAA,IACd,QAAQ;AAAA,IAAC;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAkB,SAWrB;AACD,UAAM,OAAO,WAAW,cAAA;AACxB,UAAM,MAAM,KAAK;AACjB,UAAM,KAAK,8BAA8B;AAAA,MACvC,WAAW;AAAA,MACX,gBAAgB,IAAI,KAAK,SAAS,kBAAkB,EAAE;AAAA,MACtD,+BAA+B,SAAS;AAAA,MACxC,aAAa,SAAS;AAAA,IAAA,CACvB;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,mCAAmC;AAAA,IACrD;AACA,UAAM,YAAY,QAAQ,UAAU,SAAA;AACpC,UAAM,aAAa,KAAK,IAAI,aAAA,CAAc;AAC1C,SAAK,OAAO,KAAK,+BAA+B,EAAE,WAAW,YAAY;AACzE,WAAO;AAAA,MACL;AAAA,MACA,YAAY;AAAA,MACZ,eAAe,KAAK,YAAA;AAAA,MACpB,WAAW;AAAA,MACX;AAAA,MACA;AAAA,IAAA;AAAA,EAEJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAmB,QAKuC;AAC9D,UAAM,UACJ,OAAO,OAAO,mBAAmB,WAC7B,WAAW,gBAAgB,OAAO,cAAc,IAChD,OAAO;AACb,UAAM,MAAM,QAAQ;AACpB,UAAM,KAAK,+BAA+B;AAAA,MACxC,WAAW;AAAA,MACX,gBAAgB,IAAI,KAAK,OAAO,kBAAkB,CAAC;AAAA,MACnD,+BAA+B,OAAO;AAAA,MACtC,aAAa,OAAO;AAAA,IAAA,CACrB;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,oCAAoC;AAAA,IACtD;AACA,UAAM,YAAY,QAAQ,UAAU,SAAA;AACpC,SAAK,OAAO,KAAK,gCAAgC,EAAE,WAAW;AAC9D,WAAO,EAAE,WAAW,QAAA;AAAA,EACtB;AACF;"}
@@ -1,33 +1,68 @@
1
- import { HederaMirrorNode } from "./standards-sdk.es126.js";
2
- import { Logger } from "./standards-sdk.es105.js";
3
- class HCS15BaseClient {
1
+ import { PrivateKey, Hbar } from "@hashgraph/sdk";
2
+ import { HCS15BaseClient } from "./standards-sdk.es90.js";
3
+ import { buildHcs15BaseAccountCreateTx, buildHcs15PetalAccountCreateTx } from "./standards-sdk.es87.js";
4
+ class HCS15BrowserClient extends HCS15BaseClient {
4
5
  constructor(config) {
5
- this.network = config.network;
6
- this.logger = config.logger || new Logger({
7
- module: "HCS-15",
8
- level: config.logLevel || "info"
6
+ super(config);
7
+ this.signer = config.signer || config.hwc?.dAppConnector?.signers?.[0];
8
+ }
9
+ requireSigner() {
10
+ if (!this.signer) {
11
+ throw new Error("HCS-15 Browser client requires an active DAppSigner");
12
+ }
13
+ return this.signer;
14
+ }
15
+ /**
16
+ * Create a new base account with a new ECDSA key and EVM alias using a connected wallet signer.
17
+ */
18
+ async createBaseAccount(options) {
19
+ const signer = this.requireSigner();
20
+ const priv = PrivateKey.generateECDSA();
21
+ const pub = priv.publicKey;
22
+ const tx = buildHcs15BaseAccountCreateTx({
23
+ publicKey: pub,
24
+ initialBalance: new Hbar(options?.initialBalance ?? 10),
25
+ maxAutomaticTokenAssociations: options?.maxAutomaticTokenAssociations,
26
+ accountMemo: options?.accountMemo
9
27
  });
10
- this.mirrorNode = new HederaMirrorNode(this.network, this.logger, {
11
- customUrl: config.mirrorNodeUrl
28
+ const frozen = await tx.freezeWithSigner(signer);
29
+ const res = await frozen.executeWithSigner(signer);
30
+ const receipt = await res.getReceiptWithSigner(signer);
31
+ const accountId = receipt?.accountId?.toString?.();
32
+ const evmAddress = `0x${pub.toEvmAddress()}`;
33
+ this.logger.info("Created HCS-15 base account (browser)", {
34
+ accountId,
35
+ evmAddress
12
36
  });
37
+ return {
38
+ accountId,
39
+ privateKey: priv,
40
+ privateKeyHex: priv.toStringRaw(),
41
+ publicKey: pub,
42
+ evmAddress
43
+ };
13
44
  }
14
45
  /**
15
- * Verify that a petal account shares the same public key as the base account.
46
+ * Create a petal account reusing a base ECDSA key, via wallet signer.
16
47
  */
17
- async verifyPetalAccount(petalAccountId, baseAccountId) {
18
- try {
19
- const petalInfo = await this.mirrorNode.requestAccount(petalAccountId);
20
- const baseInfo = await this.mirrorNode.requestAccount(baseAccountId);
21
- const petalKey = petalInfo?.key?.key || "";
22
- const baseKey = baseInfo?.key?.key || "";
23
- return petalKey !== "" && petalKey === baseKey;
24
- } catch (e) {
25
- this.logger.warn("verifyPetalAccount failed", { error: String(e) });
26
- return false;
27
- }
48
+ async createPetalAccount(params) {
49
+ const signer = this.requireSigner();
50
+ const baseKey = typeof params.basePrivateKey === "string" ? PrivateKey.fromStringECDSA(params.basePrivateKey) : params.basePrivateKey;
51
+ const tx = buildHcs15PetalAccountCreateTx({
52
+ publicKey: baseKey.publicKey,
53
+ initialBalance: new Hbar(params.initialBalance ?? 1),
54
+ maxAutomaticTokenAssociations: params.maxAutomaticTokenAssociations,
55
+ accountMemo: params.accountMemo
56
+ });
57
+ const frozen = await tx.freezeWithSigner(signer);
58
+ const res = await frozen.executeWithSigner(signer);
59
+ const receipt = await res.getReceiptWithSigner(signer);
60
+ const accountId = receipt?.accountId?.toString?.();
61
+ this.logger.info("Created HCS-15 petal account (browser)", { accountId });
62
+ return { accountId };
28
63
  }
29
64
  }
30
65
  export {
31
- HCS15BaseClient
66
+ HCS15BrowserClient
32
67
  };
33
68
  //# sourceMappingURL=standards-sdk.es89.js.map