@hashgraphonline/standards-sdk 0.1.141 → 0.1.143
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -1
- package/dist/cjs/hcs-11/client.d.ts.map +1 -1
- package/dist/cjs/hcs-11/types.d.ts +1 -0
- package/dist/cjs/hcs-11/types.d.ts.map +1 -1
- package/dist/cjs/hcs-16/base-client.d.ts.map +1 -1
- package/dist/cjs/hcs-17/types.d.ts.map +1 -1
- package/dist/cjs/hcs-20/sdk.d.ts.map +1 -1
- package/dist/cjs/hcs-20/types.d.ts +9 -8
- package/dist/cjs/hcs-20/types.d.ts.map +1 -1
- package/dist/cjs/hcs-21/base-client.d.ts +14 -12
- package/dist/cjs/hcs-21/base-client.d.ts.map +1 -1
- package/dist/cjs/hcs-21/browser.d.ts +17 -7
- package/dist/cjs/hcs-21/browser.d.ts.map +1 -1
- package/dist/cjs/hcs-21/index.d.ts +1 -0
- package/dist/cjs/hcs-21/index.d.ts.map +1 -1
- package/dist/cjs/hcs-21/sdk.d.ts +70 -6
- package/dist/cjs/hcs-21/sdk.d.ts.map +1 -1
- package/dist/cjs/hcs-21/tx.d.ts +6 -2
- package/dist/cjs/hcs-21/tx.d.ts.map +1 -1
- package/dist/cjs/hcs-21/types.d.ts +751 -66
- package/dist/cjs/hcs-21/types.d.ts.map +1 -1
- package/dist/cjs/hcs-21/verify.d.ts +6 -0
- package/dist/cjs/hcs-21/verify.d.ts.map +1 -0
- package/dist/cjs/inscribe/inscriber.d.ts +3 -1
- package/dist/cjs/inscribe/inscriber.d.ts.map +1 -1
- package/dist/cjs/inscribe/quote-cache.d.ts.map +1 -1
- package/dist/cjs/inscribe/types.d.ts +7 -0
- package/dist/cjs/inscribe/types.d.ts.map +1 -1
- package/dist/cjs/services/registry-broker/client.d.ts +4 -3
- package/dist/cjs/services/registry-broker/client.d.ts.map +1 -1
- package/dist/cjs/services/registry-broker/private-key-signer.d.ts.map +1 -1
- package/dist/cjs/services/registry-broker/schemas.d.ts +49 -25
- package/dist/cjs/services/registry-broker/schemas.d.ts.map +1 -1
- package/dist/cjs/services/registry-broker/types.d.ts +1 -2
- package/dist/cjs/services/registry-broker/types.d.ts.map +1 -1
- package/dist/cjs/services/types.d.ts +1 -0
- package/dist/cjs/services/types.d.ts.map +1 -1
- package/dist/cjs/standards-sdk.cjs +2 -2
- package/dist/cjs/standards-sdk.cjs.map +1 -1
- package/dist/cjs/utils/dynamic-import.d.ts +1 -0
- package/dist/cjs/utils/dynamic-import.d.ts.map +1 -1
- package/dist/es/hcs-11/client.d.ts.map +1 -1
- package/dist/es/hcs-11/types.d.ts +1 -0
- package/dist/es/hcs-11/types.d.ts.map +1 -1
- package/dist/es/hcs-16/base-client.d.ts.map +1 -1
- package/dist/es/hcs-17/types.d.ts.map +1 -1
- package/dist/es/hcs-20/sdk.d.ts.map +1 -1
- package/dist/es/hcs-20/types.d.ts +9 -8
- package/dist/es/hcs-20/types.d.ts.map +1 -1
- package/dist/es/hcs-21/base-client.d.ts +14 -12
- package/dist/es/hcs-21/base-client.d.ts.map +1 -1
- package/dist/es/hcs-21/browser.d.ts +17 -7
- package/dist/es/hcs-21/browser.d.ts.map +1 -1
- package/dist/es/hcs-21/index.d.ts +1 -0
- package/dist/es/hcs-21/index.d.ts.map +1 -1
- package/dist/es/hcs-21/sdk.d.ts +70 -6
- package/dist/es/hcs-21/sdk.d.ts.map +1 -1
- package/dist/es/hcs-21/tx.d.ts +6 -2
- package/dist/es/hcs-21/tx.d.ts.map +1 -1
- package/dist/es/hcs-21/types.d.ts +751 -66
- package/dist/es/hcs-21/types.d.ts.map +1 -1
- package/dist/es/hcs-21/verify.d.ts +6 -0
- package/dist/es/hcs-21/verify.d.ts.map +1 -0
- package/dist/es/inscribe/inscriber.d.ts +3 -1
- package/dist/es/inscribe/inscriber.d.ts.map +1 -1
- package/dist/es/inscribe/quote-cache.d.ts.map +1 -1
- package/dist/es/inscribe/types.d.ts +7 -0
- package/dist/es/inscribe/types.d.ts.map +1 -1
- package/dist/es/services/registry-broker/client.d.ts +4 -3
- package/dist/es/services/registry-broker/client.d.ts.map +1 -1
- package/dist/es/services/registry-broker/private-key-signer.d.ts.map +1 -1
- package/dist/es/services/registry-broker/schemas.d.ts +49 -25
- package/dist/es/services/registry-broker/schemas.d.ts.map +1 -1
- package/dist/es/services/registry-broker/types.d.ts +1 -2
- package/dist/es/services/registry-broker/types.d.ts.map +1 -1
- package/dist/es/services/types.d.ts +1 -0
- package/dist/es/services/types.d.ts.map +1 -1
- package/dist/es/standards-sdk.es.js +64 -51
- package/dist/es/standards-sdk.es.js.map +1 -1
- package/dist/es/standards-sdk.es10.js +2 -2
- package/dist/es/standards-sdk.es100.js +26 -229
- package/dist/es/standards-sdk.es100.js.map +1 -1
- package/dist/es/standards-sdk.es101.js +228 -109
- package/dist/es/standards-sdk.es101.js.map +1 -1
- package/dist/es/standards-sdk.es102.js +94 -15
- package/dist/es/standards-sdk.es102.js.map +1 -1
- package/dist/es/standards-sdk.es103.js +30 -80
- package/dist/es/standards-sdk.es103.js.map +1 -1
- package/dist/es/standards-sdk.es104.js +80 -27
- package/dist/es/standards-sdk.es104.js.map +1 -1
- package/dist/es/standards-sdk.es105.js +25 -136
- package/dist/es/standards-sdk.es105.js.map +1 -1
- package/dist/es/standards-sdk.es106.js +140 -27
- package/dist/es/standards-sdk.es106.js.map +1 -1
- package/dist/es/standards-sdk.es107.js +27 -20
- package/dist/es/standards-sdk.es107.js.map +1 -1
- package/dist/es/standards-sdk.es108.js +18 -156
- package/dist/es/standards-sdk.es108.js.map +1 -1
- package/dist/es/standards-sdk.es109.js +148 -196
- package/dist/es/standards-sdk.es109.js.map +1 -1
- package/dist/es/standards-sdk.es110.js +160 -747
- package/dist/es/standards-sdk.es110.js.map +1 -1
- package/dist/es/standards-sdk.es111.js +786 -9
- package/dist/es/standards-sdk.es111.js.map +1 -1
- package/dist/es/standards-sdk.es112.js +13 -567
- package/dist/es/standards-sdk.es112.js.map +1 -1
- package/dist/es/standards-sdk.es113.js +541 -576
- package/dist/es/standards-sdk.es113.js.map +1 -1
- package/dist/es/standards-sdk.es114.js +601 -12
- package/dist/es/standards-sdk.es114.js.map +1 -1
- package/dist/es/standards-sdk.es115.js +13 -2
- package/dist/es/standards-sdk.es115.js.map +1 -1
- package/dist/es/standards-sdk.es116.js +2 -83
- package/dist/es/standards-sdk.es116.js.map +1 -1
- package/dist/es/standards-sdk.es117.js +80 -36
- package/dist/es/standards-sdk.es117.js.map +1 -1
- package/dist/es/standards-sdk.es118.js +39 -2
- package/dist/es/standards-sdk.es118.js.map +1 -1
- package/dist/es/standards-sdk.es119.js +2 -223
- package/dist/es/standards-sdk.es119.js.map +1 -1
- package/dist/es/standards-sdk.es12.js +1 -1
- package/dist/es/standards-sdk.es120.js +193 -1110
- package/dist/es/standards-sdk.es120.js.map +1 -1
- package/dist/es/standards-sdk.es121.js +1059 -225
- package/dist/es/standards-sdk.es121.js.map +1 -1
- package/dist/es/standards-sdk.es122.js +303 -419
- package/dist/es/standards-sdk.es122.js.map +1 -1
- package/dist/es/standards-sdk.es123.js +418 -351
- package/dist/es/standards-sdk.es123.js.map +1 -1
- package/dist/es/standards-sdk.es124.js +348 -754
- package/dist/es/standards-sdk.es124.js.map +1 -1
- package/dist/es/standards-sdk.es125.js +854 -178
- package/dist/es/standards-sdk.es125.js.map +1 -1
- package/dist/es/standards-sdk.es126.js +153 -1512
- package/dist/es/standards-sdk.es126.js.map +1 -1
- package/dist/es/standards-sdk.es127.js +1373 -1977
- package/dist/es/standards-sdk.es127.js.map +1 -1
- package/dist/es/standards-sdk.es128.js +2211 -50
- package/dist/es/standards-sdk.es128.js.map +1 -1
- package/dist/es/standards-sdk.es129.js +59 -79
- package/dist/es/standards-sdk.es129.js.map +1 -1
- package/dist/es/standards-sdk.es13.js +1 -1
- package/dist/es/standards-sdk.es130.js +80 -152
- package/dist/es/standards-sdk.es130.js.map +1 -1
- package/dist/es/standards-sdk.es131.js +159 -7
- package/dist/es/standards-sdk.es131.js.map +1 -1
- package/dist/es/standards-sdk.es132.js +7 -86
- package/dist/es/standards-sdk.es132.js.map +1 -1
- package/dist/es/standards-sdk.es133.js +65 -44
- package/dist/es/standards-sdk.es133.js.map +1 -1
- package/dist/es/standards-sdk.es134.js +65 -28
- package/dist/es/standards-sdk.es134.js.map +1 -1
- package/dist/es/standards-sdk.es135.js +28 -138
- package/dist/es/standards-sdk.es135.js.map +1 -1
- package/dist/es/standards-sdk.es136.js +133 -37
- package/dist/es/standards-sdk.es136.js.map +1 -1
- package/dist/es/standards-sdk.es137.js +42 -732
- package/dist/es/standards-sdk.es137.js.map +1 -1
- package/dist/es/standards-sdk.es138.js +746 -12254
- package/dist/es/standards-sdk.es138.js.map +1 -1
- package/dist/es/standards-sdk.es139.js +12269 -12
- package/dist/es/standards-sdk.es139.js.map +1 -1
- package/dist/es/standards-sdk.es14.js +1 -1
- package/dist/es/standards-sdk.es141.js +20 -2
- package/dist/es/standards-sdk.es141.js.map +1 -1
- package/dist/es/standards-sdk.es142.js +13 -168
- package/dist/es/standards-sdk.es142.js.map +1 -1
- package/dist/es/standards-sdk.es143.js +139 -289
- package/dist/es/standards-sdk.es143.js.map +1 -1
- package/dist/es/standards-sdk.es144.js +274 -298
- package/dist/es/standards-sdk.es144.js.map +1 -1
- package/dist/es/standards-sdk.es145.js +262 -369
- package/dist/es/standards-sdk.es145.js.map +1 -1
- package/dist/es/standards-sdk.es146.js +316 -194
- package/dist/es/standards-sdk.es146.js.map +1 -1
- package/dist/es/standards-sdk.es147.js +319 -64
- package/dist/es/standards-sdk.es147.js.map +1 -1
- package/dist/es/standards-sdk.es148.js +79 -0
- package/dist/es/standards-sdk.es148.js.map +1 -0
- package/dist/es/standards-sdk.es15.js +1 -1
- package/dist/es/standards-sdk.es16.js +1 -1
- package/dist/es/standards-sdk.es17.js +5 -10
- package/dist/es/standards-sdk.es17.js.map +1 -1
- package/dist/es/standards-sdk.es19.js +12 -16
- package/dist/es/standards-sdk.es19.js.map +1 -1
- package/dist/es/standards-sdk.es20.js +9 -13
- package/dist/es/standards-sdk.es20.js.map +1 -1
- package/dist/es/standards-sdk.es21.js +1 -1
- package/dist/es/standards-sdk.es22.js +1 -1
- package/dist/es/standards-sdk.es23.js +1 -1
- package/dist/es/standards-sdk.es24.js +1 -1
- package/dist/es/standards-sdk.es25.js +1 -1
- package/dist/es/standards-sdk.es26.js +1 -1
- package/dist/es/standards-sdk.es27.js +1 -1
- package/dist/es/standards-sdk.es28.js +16 -18
- package/dist/es/standards-sdk.es28.js.map +1 -1
- package/dist/es/standards-sdk.es29.js.map +1 -1
- package/dist/es/standards-sdk.es3.js +2 -2
- package/dist/es/standards-sdk.es31.js +2 -2
- package/dist/es/standards-sdk.es32.js +4 -4
- package/dist/es/standards-sdk.es33.js +1 -1
- package/dist/es/standards-sdk.es36.js +8 -12
- package/dist/es/standards-sdk.es36.js.map +1 -1
- package/dist/es/standards-sdk.es37.js +4 -4
- package/dist/es/standards-sdk.es38.js +2 -2
- package/dist/es/standards-sdk.es39.js +2 -2
- package/dist/es/standards-sdk.es40.js +1 -1
- package/dist/es/standards-sdk.es41.js +1 -1
- package/dist/es/standards-sdk.es42.js +2 -2
- package/dist/es/standards-sdk.es47.js +1 -1
- package/dist/es/standards-sdk.es5.js +2 -2
- package/dist/es/standards-sdk.es52.js +1 -1
- package/dist/es/standards-sdk.es54.js +1 -1
- package/dist/es/standards-sdk.es57.js +1 -1
- package/dist/es/standards-sdk.es6.js +2 -2
- package/dist/es/standards-sdk.es61.js +7 -11
- package/dist/es/standards-sdk.es61.js.map +1 -1
- package/dist/es/standards-sdk.es65.js +2 -2
- package/dist/es/standards-sdk.es66.js +3 -3
- package/dist/es/standards-sdk.es69.js +2 -2
- package/dist/es/standards-sdk.es7.js +2 -2
- package/dist/es/standards-sdk.es70.js +3 -3
- package/dist/es/standards-sdk.es71.js +2 -2
- package/dist/es/standards-sdk.es72.js +1 -1
- package/dist/es/standards-sdk.es73.js.map +1 -1
- package/dist/es/standards-sdk.es75.js +2 -2
- package/dist/es/standards-sdk.es77.js +5 -3
- package/dist/es/standards-sdk.es77.js.map +1 -1
- package/dist/es/standards-sdk.es78.js +4 -10
- package/dist/es/standards-sdk.es78.js.map +1 -1
- package/dist/es/standards-sdk.es79.js +1 -1
- package/dist/es/standards-sdk.es8.js +1 -1
- package/dist/es/standards-sdk.es80.js +113 -29
- package/dist/es/standards-sdk.es80.js.map +1 -1
- package/dist/es/standards-sdk.es82.js +23 -4
- package/dist/es/standards-sdk.es82.js.map +1 -1
- package/dist/es/standards-sdk.es83.js +39 -14
- package/dist/es/standards-sdk.es83.js.map +1 -1
- package/dist/es/standards-sdk.es84.js +198 -17
- package/dist/es/standards-sdk.es84.js.map +1 -1
- package/dist/es/standards-sdk.es85.js +256 -9
- package/dist/es/standards-sdk.es85.js.map +1 -1
- package/dist/es/standards-sdk.es86.js +55 -21
- package/dist/es/standards-sdk.es86.js.map +1 -1
- package/dist/es/standards-sdk.es87.js +22 -75
- package/dist/es/standards-sdk.es87.js.map +1 -1
- package/dist/es/standards-sdk.es88.js +45 -30
- package/dist/es/standards-sdk.es88.js.map +1 -1
- package/dist/es/standards-sdk.es89.js +57 -22
- package/dist/es/standards-sdk.es89.js.map +1 -1
- package/dist/es/standards-sdk.es90.js +28 -23
- package/dist/es/standards-sdk.es90.js.map +1 -1
- package/dist/es/standards-sdk.es91.js +23 -167
- package/dist/es/standards-sdk.es91.js.map +1 -1
- package/dist/es/standards-sdk.es92.js +158 -119
- package/dist/es/standards-sdk.es92.js.map +1 -1
- package/dist/es/standards-sdk.es93.js +68 -95
- package/dist/es/standards-sdk.es93.js.map +1 -1
- package/dist/es/standards-sdk.es94.js +136 -119
- package/dist/es/standards-sdk.es94.js.map +1 -1
- package/dist/es/standards-sdk.es95.js +139 -39
- package/dist/es/standards-sdk.es95.js.map +1 -1
- package/dist/es/standards-sdk.es96.js +42 -257
- package/dist/es/standards-sdk.es96.js.map +1 -1
- package/dist/es/standards-sdk.es97.js +243 -80
- package/dist/es/standards-sdk.es97.js.map +1 -1
- package/dist/es/standards-sdk.es98.js +47 -48
- package/dist/es/standards-sdk.es98.js.map +1 -1
- package/dist/es/standards-sdk.es99.js +100 -28
- package/dist/es/standards-sdk.es99.js.map +1 -1
- package/dist/es/utils/dynamic-import.d.ts +1 -0
- package/dist/es/utils/dynamic-import.d.ts.map +1 -1
- package/package.json +3 -3
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { Client, Status } from "@hashgraph/sdk";
|
|
2
|
-
import { createNodeOperatorContext } from "./standards-sdk.
|
|
3
|
-
import { Logger } from "./standards-sdk.
|
|
2
|
+
import { createNodeOperatorContext } from "./standards-sdk.es136.js";
|
|
3
|
+
import { Logger } from "./standards-sdk.es106.js";
|
|
4
4
|
import { HCS21BaseClient } from "./standards-sdk.es83.js";
|
|
5
|
-
import {
|
|
5
|
+
import { metadataDocumentSchema, HCS21TopicType, HCS21ManifestPointerPattern } from "./standards-sdk.es80.js";
|
|
6
6
|
import { buildHcs21CreateRegistryTx, buildHcs21MessageTx } from "./standards-sdk.es82.js";
|
|
7
|
+
import { buildHcs2CreateRegistryTx, buildHcs2RegisterTx } from "./standards-sdk.es72.js";
|
|
8
|
+
import { HCS2RegistryType } from "./standards-sdk.es68.js";
|
|
7
9
|
import { HCS21ValidationError } from "./standards-sdk.es81.js";
|
|
8
|
-
import { inscribe } from "./standards-sdk.
|
|
9
|
-
import { getTopicId } from "./standards-sdk.
|
|
10
|
+
import { inscribe } from "./standards-sdk.es125.js";
|
|
11
|
+
import { getTopicId } from "./standards-sdk.es115.js";
|
|
10
12
|
class HCS21Client extends HCS21BaseClient {
|
|
11
13
|
constructor(config) {
|
|
12
14
|
const logger = config.logger || new Logger({ level: config.logLevel || "info", module: "HCS-21" });
|
|
@@ -30,21 +32,25 @@ class HCS21Client extends HCS21BaseClient {
|
|
|
30
32
|
}
|
|
31
33
|
async inscribeMetadata(params) {
|
|
32
34
|
await this.operatorCtx.ensureInitialized();
|
|
33
|
-
const
|
|
35
|
+
const metadataPayload = metadataDocumentSchema.parse(params.document);
|
|
36
|
+
const metadataJson = JSON.stringify(metadataPayload, null, 2);
|
|
34
37
|
const buffer = Buffer.from(metadataJson, "utf8");
|
|
38
|
+
const connectionMode = params.inscriptionOptions?.connectionMode ?? (params.inscriptionOptions?.websocket === false ? "http" : "auto");
|
|
35
39
|
const inscriptionOptions = {
|
|
36
40
|
waitForConfirmation: true,
|
|
41
|
+
connectionMode,
|
|
42
|
+
websocket: params.inscriptionOptions?.websocket ?? false,
|
|
37
43
|
...params.inscriptionOptions || {},
|
|
38
44
|
metadata: {
|
|
39
45
|
...params.inscriptionOptions?.metadata || {},
|
|
40
|
-
...
|
|
46
|
+
...metadataPayload
|
|
41
47
|
}
|
|
42
48
|
};
|
|
43
49
|
const inscription = await inscribe(
|
|
44
50
|
{
|
|
45
51
|
type: "buffer",
|
|
46
52
|
buffer,
|
|
47
|
-
fileName: params.fileName || `hcs21-
|
|
53
|
+
fileName: params.fileName || `hcs21-adapter-manifest-${Date.now()}.json`,
|
|
48
54
|
mimeType: "application/json"
|
|
49
55
|
},
|
|
50
56
|
{
|
|
@@ -56,7 +62,7 @@ class HCS21Client extends HCS21BaseClient {
|
|
|
56
62
|
);
|
|
57
63
|
if (!inscription.confirmed || !inscription.inscription) {
|
|
58
64
|
throw new HCS21ValidationError(
|
|
59
|
-
"Failed to inscribe
|
|
65
|
+
"Failed to inscribe HCS-21 metadata",
|
|
60
66
|
"invalid_payload"
|
|
61
67
|
);
|
|
62
68
|
}
|
|
@@ -68,18 +74,22 @@ class HCS21Client extends HCS21BaseClient {
|
|
|
68
74
|
);
|
|
69
75
|
}
|
|
70
76
|
const rawSequence = inscription.inscription.sequence_number ?? inscription.inscription.sequenceNumber;
|
|
71
|
-
const pointerResult = await this.
|
|
77
|
+
const pointerResult = await this.resolveManifestPointer(
|
|
72
78
|
topicId,
|
|
73
79
|
rawSequence
|
|
74
80
|
);
|
|
81
|
+
const declarationManifestSequence = inscription.result?.manifest_sequence;
|
|
75
82
|
const resultDetails = inscription.result && "jobId" in inscription.result ? {
|
|
76
83
|
jobId: inscription.result.jobId,
|
|
77
|
-
transactionId: inscription.result.transactionId
|
|
84
|
+
transactionId: inscription.result.transactionId,
|
|
85
|
+
totalCostHbar: inscription.costSummary?.totalCostHbar,
|
|
86
|
+
costBreakdown: inscription.costSummary?.breakdown
|
|
78
87
|
} : {};
|
|
79
88
|
return {
|
|
80
89
|
pointer: pointerResult.pointer,
|
|
81
90
|
topicId,
|
|
82
91
|
sequenceNumber: pointerResult.sequenceNumber,
|
|
92
|
+
manifestSequence: declarationManifestSequence || pointerResult.sequenceNumber,
|
|
83
93
|
...resultDetails
|
|
84
94
|
};
|
|
85
95
|
}
|
|
@@ -88,6 +98,8 @@ class HCS21Client extends HCS21BaseClient {
|
|
|
88
98
|
const tx = buildHcs21CreateRegistryTx({
|
|
89
99
|
ttl: params.ttl,
|
|
90
100
|
indexed: params.indexed,
|
|
101
|
+
type: params.type,
|
|
102
|
+
metaTopicId: params.metaTopicId,
|
|
91
103
|
adminKey: params.adminKey,
|
|
92
104
|
submitKey: params.submitKey,
|
|
93
105
|
operatorPublicKey: this.operatorCtx.operatorKey.publicKey
|
|
@@ -105,6 +117,175 @@ class HCS21Client extends HCS21BaseClient {
|
|
|
105
117
|
}
|
|
106
118
|
return receipt.topicId.toString();
|
|
107
119
|
}
|
|
120
|
+
async createAdapterVersionPointerTopic(params) {
|
|
121
|
+
await this.operatorCtx.ensureInitialized();
|
|
122
|
+
const tx = buildHcs2CreateRegistryTx({
|
|
123
|
+
registryType: HCS2RegistryType.NON_INDEXED,
|
|
124
|
+
ttl: params.ttl,
|
|
125
|
+
adminKey: params.adminKey,
|
|
126
|
+
submitKey: params.submitKey,
|
|
127
|
+
memoOverride: params.memoOverride,
|
|
128
|
+
operatorPublicKey: this.operatorCtx.operatorKey.publicKey
|
|
129
|
+
});
|
|
130
|
+
if (params.transactionMemo) {
|
|
131
|
+
tx.setTransactionMemo(params.transactionMemo);
|
|
132
|
+
}
|
|
133
|
+
const response = await tx.execute(this.client);
|
|
134
|
+
const receipt = await response.getReceipt(this.client);
|
|
135
|
+
if (receipt.status !== Status.Success || !receipt.topicId) {
|
|
136
|
+
throw new HCS21ValidationError(
|
|
137
|
+
"Failed to create HCS-2 registry version topic",
|
|
138
|
+
"invalid_payload"
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
return receipt.topicId.toString();
|
|
142
|
+
}
|
|
143
|
+
async createRegistryDiscoveryTopic(params) {
|
|
144
|
+
await this.operatorCtx.ensureInitialized();
|
|
145
|
+
const tx = buildHcs2CreateRegistryTx({
|
|
146
|
+
registryType: HCS2RegistryType.INDEXED,
|
|
147
|
+
ttl: params.ttl,
|
|
148
|
+
adminKey: params.adminKey,
|
|
149
|
+
submitKey: params.submitKey,
|
|
150
|
+
memoOverride: params.memoOverride,
|
|
151
|
+
operatorPublicKey: this.operatorCtx.operatorKey.publicKey
|
|
152
|
+
});
|
|
153
|
+
if (params.transactionMemo) {
|
|
154
|
+
tx.setTransactionMemo(params.transactionMemo);
|
|
155
|
+
}
|
|
156
|
+
const response = await tx.execute(this.client);
|
|
157
|
+
const receipt = await response.getReceipt(this.client);
|
|
158
|
+
if (receipt.status !== Status.Success || !receipt.topicId) {
|
|
159
|
+
throw new HCS21ValidationError(
|
|
160
|
+
"Failed to create registry-of-registries topic",
|
|
161
|
+
"invalid_payload"
|
|
162
|
+
);
|
|
163
|
+
}
|
|
164
|
+
return receipt.topicId.toString();
|
|
165
|
+
}
|
|
166
|
+
async createAdapterCategoryTopic(params) {
|
|
167
|
+
await this.operatorCtx.ensureInitialized();
|
|
168
|
+
const tx = buildHcs21CreateRegistryTx({
|
|
169
|
+
ttl: params.ttl,
|
|
170
|
+
indexed: params.indexed ?? 0,
|
|
171
|
+
type: HCS21TopicType.ADAPTER_CATEGORY,
|
|
172
|
+
metaTopicId: params.metaTopicId,
|
|
173
|
+
adminKey: params.adminKey,
|
|
174
|
+
submitKey: params.submitKey,
|
|
175
|
+
operatorPublicKey: this.operatorCtx.operatorKey.publicKey
|
|
176
|
+
});
|
|
177
|
+
if (params.transactionMemo) {
|
|
178
|
+
tx.setTransactionMemo(params.transactionMemo);
|
|
179
|
+
}
|
|
180
|
+
const response = await tx.execute(this.client);
|
|
181
|
+
const receipt = await response.getReceipt(this.client);
|
|
182
|
+
if (receipt.status !== Status.Success || !receipt.topicId) {
|
|
183
|
+
throw new HCS21ValidationError(
|
|
184
|
+
"Failed to create adapter category topic",
|
|
185
|
+
"invalid_payload"
|
|
186
|
+
);
|
|
187
|
+
}
|
|
188
|
+
return receipt.topicId.toString();
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Publish a pointer from a version topic to the active declaration topic.
|
|
192
|
+
* Version pointer messages carry no metadata.
|
|
193
|
+
*/
|
|
194
|
+
async publishVersionPointer(params) {
|
|
195
|
+
await this.operatorCtx.ensureInitialized();
|
|
196
|
+
const tx = buildHcs2RegisterTx({
|
|
197
|
+
registryTopicId: params.versionTopicId,
|
|
198
|
+
targetTopicId: params.declarationTopicId,
|
|
199
|
+
memo: params.memo,
|
|
200
|
+
analyticsMemo: params.transactionMemo
|
|
201
|
+
});
|
|
202
|
+
const response = await tx.execute(this.client);
|
|
203
|
+
const receipt = await response.getReceipt(this.client);
|
|
204
|
+
if (receipt.status !== Status.Success) {
|
|
205
|
+
throw new HCS21ValidationError(
|
|
206
|
+
"Failed to publish registry version pointer",
|
|
207
|
+
"invalid_payload"
|
|
208
|
+
);
|
|
209
|
+
}
|
|
210
|
+
return {
|
|
211
|
+
sequenceNumber: receipt.topicSequenceNumber?.toNumber(),
|
|
212
|
+
transactionId: response.transactionId.toString()
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
async resolveVersionPointer(versionTopicId) {
|
|
216
|
+
const [latest] = await this.mirrorNode.getTopicMessages(versionTopicId, {
|
|
217
|
+
limit: 1,
|
|
218
|
+
order: "desc"
|
|
219
|
+
});
|
|
220
|
+
if (!latest) {
|
|
221
|
+
throw new HCS21ValidationError(
|
|
222
|
+
"Version pointer topic has no messages",
|
|
223
|
+
"invalid_payload"
|
|
224
|
+
);
|
|
225
|
+
}
|
|
226
|
+
const declarationTopicId = latest.t_id;
|
|
227
|
+
if (typeof declarationTopicId !== "string" || declarationTopicId.length === 0) {
|
|
228
|
+
throw new HCS21ValidationError(
|
|
229
|
+
"Version pointer topic does not include a declaration topic ID (`t_id`)",
|
|
230
|
+
"invalid_payload"
|
|
231
|
+
);
|
|
232
|
+
}
|
|
233
|
+
const rawSequence = typeof latest.sequence_number === "number" ? latest.sequence_number : Number(latest.sequence_number);
|
|
234
|
+
const sequenceNumber = Number.isFinite(rawSequence) ? rawSequence : 0;
|
|
235
|
+
return {
|
|
236
|
+
versionTopicId,
|
|
237
|
+
declarationTopicId,
|
|
238
|
+
sequenceNumber,
|
|
239
|
+
payer: latest.payer,
|
|
240
|
+
memo: latest.m,
|
|
241
|
+
op: latest.op
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
async registerCategoryTopic(params) {
|
|
245
|
+
await this.operatorCtx.ensureInitialized();
|
|
246
|
+
const tx = buildHcs2RegisterTx({
|
|
247
|
+
registryTopicId: params.discoveryTopicId,
|
|
248
|
+
targetTopicId: params.categoryTopicId,
|
|
249
|
+
metadata: params.metadata,
|
|
250
|
+
memo: params.memo,
|
|
251
|
+
analyticsMemo: params.transactionMemo
|
|
252
|
+
});
|
|
253
|
+
const response = await tx.execute(this.client);
|
|
254
|
+
const receipt = await response.getReceipt(this.client);
|
|
255
|
+
if (receipt.status !== Status.Success) {
|
|
256
|
+
throw new HCS21ValidationError(
|
|
257
|
+
"Failed to register adapter category topic",
|
|
258
|
+
"invalid_payload"
|
|
259
|
+
);
|
|
260
|
+
}
|
|
261
|
+
return {
|
|
262
|
+
sequenceNumber: receipt.topicSequenceNumber?.toNumber(),
|
|
263
|
+
transactionId: response.transactionId.toString()
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
async publishCategoryEntry(params) {
|
|
267
|
+
await this.operatorCtx.ensureInitialized();
|
|
268
|
+
const memo = params.memo ?? `adapter:${params.adapterId}`;
|
|
269
|
+
const tx = buildHcs2RegisterTx({
|
|
270
|
+
registryTopicId: params.categoryTopicId,
|
|
271
|
+
targetTopicId: params.versionTopicId,
|
|
272
|
+
metadata: params.metadata,
|
|
273
|
+
memo,
|
|
274
|
+
analyticsMemo: params.transactionMemo
|
|
275
|
+
});
|
|
276
|
+
const response = await tx.execute(this.client);
|
|
277
|
+
const receipt = await response.getReceipt(this.client);
|
|
278
|
+
if (receipt.status !== Status.Success) {
|
|
279
|
+
throw new HCS21ValidationError(
|
|
280
|
+
"Failed to publish adapter category entry",
|
|
281
|
+
"invalid_payload"
|
|
282
|
+
);
|
|
283
|
+
}
|
|
284
|
+
return {
|
|
285
|
+
sequenceNumber: receipt.topicSequenceNumber?.toNumber(),
|
|
286
|
+
transactionId: response.transactionId.toString()
|
|
287
|
+
};
|
|
288
|
+
}
|
|
108
289
|
async publishDeclaration(params) {
|
|
109
290
|
await this.operatorCtx.ensureInitialized();
|
|
110
291
|
const declaration = this.normalizeDeclarationInput(params.declaration);
|
|
@@ -132,7 +313,7 @@ class HCS21Client extends HCS21BaseClient {
|
|
|
132
313
|
}
|
|
133
314
|
return this.buildDeclaration(declaration);
|
|
134
315
|
}
|
|
135
|
-
async
|
|
316
|
+
async resolveManifestPointer(topicId, sequence) {
|
|
136
317
|
const numericSequence = typeof sequence === "string" ? Number(sequence) : sequence;
|
|
137
318
|
let resolvedSequence = typeof numericSequence === "number" && Number.isFinite(numericSequence) ? numericSequence : void 0;
|
|
138
319
|
if (!resolvedSequence) {
|
|
@@ -142,7 +323,7 @@ class HCS21Client extends HCS21BaseClient {
|
|
|
142
323
|
});
|
|
143
324
|
if (!latest || !latest.sequence_number) {
|
|
144
325
|
throw new HCS21ValidationError(
|
|
145
|
-
"Unable to resolve
|
|
326
|
+
"Unable to resolve manifest sequence number",
|
|
146
327
|
"invalid_payload"
|
|
147
328
|
);
|
|
148
329
|
}
|
|
@@ -150,14 +331,14 @@ class HCS21Client extends HCS21BaseClient {
|
|
|
150
331
|
}
|
|
151
332
|
if (!Number.isFinite(resolvedSequence)) {
|
|
152
333
|
throw new HCS21ValidationError(
|
|
153
|
-
"Invalid
|
|
334
|
+
"Invalid manifest sequence number",
|
|
154
335
|
"invalid_payload"
|
|
155
336
|
);
|
|
156
337
|
}
|
|
157
|
-
const pointer = `hcs://1/${topicId}
|
|
158
|
-
if (!
|
|
338
|
+
const pointer = `hcs://1/${topicId}`;
|
|
339
|
+
if (!HCS21ManifestPointerPattern.test(pointer)) {
|
|
159
340
|
throw new HCS21ValidationError(
|
|
160
|
-
"
|
|
341
|
+
"Manifest pointer format is invalid",
|
|
161
342
|
"invalid_payload"
|
|
162
343
|
);
|
|
163
344
|
}
|
|
@@ -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 HCS21MetadataPointerPattern,\n PackageDeclaration,\n PackageMetadataPointer,\n PackageMetadataRecord,\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 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: PackageDeclaration | BuildDeclarationParams;\n transactionMemo?: string;\n}\n\nexport interface InscribePackageMetadataParams {\n metadata: PackageMetadataRecord;\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: InscribePackageMetadataParams,\n ): Promise<PackageMetadataPointer> {\n await this.operatorCtx.ensureInitialized();\n\n const metadataJson = JSON.stringify(params.metadata, null, 2);\n const buffer = Buffer.from(metadataJson, 'utf8');\n const inscriptionOptions: InscriptionOptions = {\n waitForConfirmation: true,\n ...(params.inscriptionOptions || {}),\n metadata: {\n ...(params.inscriptionOptions?.metadata || {}),\n ...params.metadata,\n },\n };\n\n const inscription = await inscribe(\n {\n type: 'buffer',\n buffer,\n fileName:\n params.fileName || `hcs21-package-metadata-${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 package 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.resolveMetadataPointer(\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 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: PackageDeclaration | BuildDeclarationParams,\n ): PackageDeclaration {\n if ('p' in declaration) {\n return this.validateDeclaration(declaration);\n }\n return this.buildDeclaration(declaration);\n }\n\n private async resolveMetadataPointer(\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 metadata 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 metadata sequence number',\n 'invalid_payload',\n );\n }\n\n const pointer = `hcs://1/${topicId}/${resolvedSequence}`;\n\n if (!HCS21MetadataPointerPattern.test(pointer)) {\n throw new HCS21ValidationError(\n 'Metadata 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 { 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":"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"}
|
|
@@ -1,34 +1,281 @@
|
|
|
1
|
+
import { Status, PublicKey, TransactionId, AccountId } from "@hashgraph/sdk";
|
|
1
2
|
import { HCS21BaseClient } from "./standards-sdk.es83.js";
|
|
3
|
+
import { HCS21TopicType } from "./standards-sdk.es80.js";
|
|
4
|
+
import { HCS21ValidationError } from "./standards-sdk.es81.js";
|
|
5
|
+
import { buildHcs21CreateRegistryTx, buildHcs21MessageTx } from "./standards-sdk.es82.js";
|
|
6
|
+
import { buildHcs2CreateRegistryTx, buildHcs2RegisterTx } from "./standards-sdk.es72.js";
|
|
7
|
+
import { HCS2RegistryType } from "./standards-sdk.es68.js";
|
|
2
8
|
class HCS21BrowserClient extends HCS21BaseClient {
|
|
3
9
|
constructor(config) {
|
|
4
10
|
super({ network: config.network, logger: config.logger });
|
|
5
11
|
this.hwc = config.hwc;
|
|
6
12
|
}
|
|
13
|
+
async createRegistryTopic(params) {
|
|
14
|
+
const { publicKey } = await this.getSignerContext();
|
|
15
|
+
const tx = buildHcs21CreateRegistryTx({
|
|
16
|
+
ttl: params.ttl,
|
|
17
|
+
indexed: params.indexed,
|
|
18
|
+
type: params.type,
|
|
19
|
+
metaTopicId: params.metaTopicId,
|
|
20
|
+
adminKey: params.adminKey,
|
|
21
|
+
submitKey: params.submitKey,
|
|
22
|
+
operatorPublicKey: publicKey
|
|
23
|
+
});
|
|
24
|
+
if (params.transactionMemo) {
|
|
25
|
+
tx.setTransactionMemo(params.transactionMemo);
|
|
26
|
+
}
|
|
27
|
+
const { receipt } = await this.executeWithWallet(tx);
|
|
28
|
+
if (receipt.status !== Status.Success || !receipt.topicId) {
|
|
29
|
+
throw new HCS21ValidationError(
|
|
30
|
+
"Failed to create HCS-21 registry topic",
|
|
31
|
+
"invalid_payload"
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
return receipt.topicId.toString();
|
|
35
|
+
}
|
|
36
|
+
async createAdapterVersionPointerTopic(params) {
|
|
37
|
+
const { publicKey } = await this.getSignerContext();
|
|
38
|
+
const tx = buildHcs2CreateRegistryTx({
|
|
39
|
+
registryType: HCS2RegistryType.NON_INDEXED,
|
|
40
|
+
ttl: params.ttl,
|
|
41
|
+
adminKey: params.adminKey,
|
|
42
|
+
submitKey: params.submitKey,
|
|
43
|
+
memoOverride: params.memoOverride,
|
|
44
|
+
operatorPublicKey: publicKey
|
|
45
|
+
});
|
|
46
|
+
if (params.transactionMemo) {
|
|
47
|
+
tx.setTransactionMemo(params.transactionMemo);
|
|
48
|
+
}
|
|
49
|
+
const { receipt } = await this.executeWithWallet(tx);
|
|
50
|
+
if (receipt.status !== Status.Success || !receipt.topicId) {
|
|
51
|
+
throw new HCS21ValidationError(
|
|
52
|
+
"Failed to create HCS-2 registry version topic",
|
|
53
|
+
"invalid_payload"
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
return receipt.topicId.toString();
|
|
57
|
+
}
|
|
58
|
+
async createRegistryDiscoveryTopic(params) {
|
|
59
|
+
const { publicKey } = await this.getSignerContext();
|
|
60
|
+
const tx = buildHcs2CreateRegistryTx({
|
|
61
|
+
registryType: HCS2RegistryType.INDEXED,
|
|
62
|
+
ttl: params.ttl,
|
|
63
|
+
adminKey: params.adminKey,
|
|
64
|
+
submitKey: params.submitKey,
|
|
65
|
+
memoOverride: params.memoOverride,
|
|
66
|
+
operatorPublicKey: publicKey
|
|
67
|
+
});
|
|
68
|
+
if (params.transactionMemo) {
|
|
69
|
+
tx.setTransactionMemo(params.transactionMemo);
|
|
70
|
+
}
|
|
71
|
+
const { receipt } = await this.executeWithWallet(tx);
|
|
72
|
+
if (receipt.status !== Status.Success || !receipt.topicId) {
|
|
73
|
+
throw new HCS21ValidationError(
|
|
74
|
+
"Failed to create registry-of-registries topic",
|
|
75
|
+
"invalid_payload"
|
|
76
|
+
);
|
|
77
|
+
}
|
|
78
|
+
return receipt.topicId.toString();
|
|
79
|
+
}
|
|
80
|
+
async createAdapterCategoryTopic(params) {
|
|
81
|
+
const { publicKey } = await this.getSignerContext();
|
|
82
|
+
const tx = buildHcs21CreateRegistryTx({
|
|
83
|
+
ttl: params.ttl,
|
|
84
|
+
indexed: params.indexed ?? 0,
|
|
85
|
+
type: HCS21TopicType.ADAPTER_CATEGORY,
|
|
86
|
+
metaTopicId: params.metaTopicId,
|
|
87
|
+
adminKey: params.adminKey,
|
|
88
|
+
submitKey: params.submitKey,
|
|
89
|
+
operatorPublicKey: publicKey
|
|
90
|
+
});
|
|
91
|
+
if (params.transactionMemo) {
|
|
92
|
+
tx.setTransactionMemo(params.transactionMemo);
|
|
93
|
+
}
|
|
94
|
+
const { receipt } = await this.executeWithWallet(tx);
|
|
95
|
+
if (receipt.status !== Status.Success || !receipt.topicId) {
|
|
96
|
+
throw new HCS21ValidationError(
|
|
97
|
+
"Failed to create adapter category topic",
|
|
98
|
+
"invalid_payload"
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
return receipt.topicId.toString();
|
|
102
|
+
}
|
|
103
|
+
async publishVersionPointer(params) {
|
|
104
|
+
const tx = buildHcs2RegisterTx({
|
|
105
|
+
registryTopicId: params.versionTopicId,
|
|
106
|
+
targetTopicId: params.declarationTopicId,
|
|
107
|
+
memo: params.memo,
|
|
108
|
+
analyticsMemo: params.transactionMemo
|
|
109
|
+
});
|
|
110
|
+
const { receipt, transactionId } = await this.executeWithWallet(tx);
|
|
111
|
+
if (receipt.status !== Status.Success) {
|
|
112
|
+
throw new HCS21ValidationError(
|
|
113
|
+
"Failed to publish registry version pointer",
|
|
114
|
+
"invalid_payload"
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
return {
|
|
118
|
+
sequenceNumber: this.toNumber(receipt.topicSequenceNumber),
|
|
119
|
+
transactionId
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
async resolveVersionPointer(versionTopicId) {
|
|
123
|
+
const [latest] = await this.mirrorNode.getTopicMessages(versionTopicId, {
|
|
124
|
+
limit: 1,
|
|
125
|
+
order: "desc"
|
|
126
|
+
});
|
|
127
|
+
if (!latest) {
|
|
128
|
+
throw new HCS21ValidationError(
|
|
129
|
+
"Version pointer topic has no messages",
|
|
130
|
+
"invalid_payload"
|
|
131
|
+
);
|
|
132
|
+
}
|
|
133
|
+
const declarationTopicId = latest.t_id;
|
|
134
|
+
if (typeof declarationTopicId !== "string" || declarationTopicId.length === 0) {
|
|
135
|
+
throw new HCS21ValidationError(
|
|
136
|
+
"Version pointer topic does not include a declaration topic ID (`t_id`)",
|
|
137
|
+
"invalid_payload"
|
|
138
|
+
);
|
|
139
|
+
}
|
|
140
|
+
const rawSequence = typeof latest.sequence_number === "number" ? latest.sequence_number : Number(latest.sequence_number);
|
|
141
|
+
const sequenceNumber = Number.isFinite(rawSequence) ? rawSequence : 0;
|
|
142
|
+
return {
|
|
143
|
+
versionTopicId,
|
|
144
|
+
declarationTopicId,
|
|
145
|
+
sequenceNumber,
|
|
146
|
+
payer: latest.payer,
|
|
147
|
+
memo: latest.m,
|
|
148
|
+
op: latest.op
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
async registerCategoryTopic(params) {
|
|
152
|
+
const tx = buildHcs2RegisterTx({
|
|
153
|
+
registryTopicId: params.discoveryTopicId,
|
|
154
|
+
targetTopicId: params.categoryTopicId,
|
|
155
|
+
metadata: params.metadata,
|
|
156
|
+
memo: params.memo,
|
|
157
|
+
analyticsMemo: params.transactionMemo
|
|
158
|
+
});
|
|
159
|
+
const { receipt, transactionId } = await this.executeWithWallet(tx);
|
|
160
|
+
if (receipt.status !== Status.Success) {
|
|
161
|
+
throw new HCS21ValidationError(
|
|
162
|
+
"Failed to register adapter category topic",
|
|
163
|
+
"invalid_payload"
|
|
164
|
+
);
|
|
165
|
+
}
|
|
166
|
+
return {
|
|
167
|
+
sequenceNumber: this.toNumber(receipt.topicSequenceNumber),
|
|
168
|
+
transactionId
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
async publishCategoryEntry(params) {
|
|
172
|
+
const memo = params.memo ?? `adapter:${params.adapterId}`;
|
|
173
|
+
const tx = buildHcs2RegisterTx({
|
|
174
|
+
registryTopicId: params.categoryTopicId,
|
|
175
|
+
targetTopicId: params.versionTopicId,
|
|
176
|
+
metadata: params.metadata,
|
|
177
|
+
memo,
|
|
178
|
+
analyticsMemo: params.transactionMemo
|
|
179
|
+
});
|
|
180
|
+
const { receipt, transactionId } = await this.executeWithWallet(tx);
|
|
181
|
+
if (receipt.status !== Status.Success) {
|
|
182
|
+
throw new HCS21ValidationError(
|
|
183
|
+
"Failed to publish adapter category entry",
|
|
184
|
+
"invalid_payload"
|
|
185
|
+
);
|
|
186
|
+
}
|
|
187
|
+
return {
|
|
188
|
+
sequenceNumber: this.toNumber(receipt.topicSequenceNumber),
|
|
189
|
+
transactionId
|
|
190
|
+
};
|
|
191
|
+
}
|
|
7
192
|
async publishDeclaration(params) {
|
|
8
193
|
const declaration = "p" in params.declaration ? this.validateDeclaration(params.declaration) : this.buildDeclaration(params.declaration);
|
|
9
|
-
|
|
10
|
-
params.topicId,
|
|
11
|
-
|
|
12
|
-
|
|
194
|
+
const tx = buildHcs21MessageTx({
|
|
195
|
+
topicId: params.topicId,
|
|
196
|
+
declaration,
|
|
197
|
+
transactionMemo: params.transactionMemo
|
|
198
|
+
});
|
|
199
|
+
const { receipt, transactionId } = await this.executeWithWallet(tx);
|
|
200
|
+
if (receipt.status !== Status.Success) {
|
|
201
|
+
throw new HCS21ValidationError(
|
|
202
|
+
"Failed to submit HCS-21 declaration",
|
|
203
|
+
"invalid_payload"
|
|
204
|
+
);
|
|
205
|
+
}
|
|
206
|
+
return {
|
|
207
|
+
sequenceNumber: this.toNumber(receipt.topicSequenceNumber),
|
|
208
|
+
transactionId
|
|
209
|
+
};
|
|
13
210
|
}
|
|
14
|
-
async fetchDeclarations(topicId) {
|
|
211
|
+
async fetchDeclarations(topicId, options) {
|
|
15
212
|
const { messages = [] } = await this.hwc.getMessages(topicId);
|
|
16
213
|
const envelopes = [];
|
|
17
214
|
for (const message of messages) {
|
|
215
|
+
if (!message || message.p !== "hcs-21") {
|
|
216
|
+
continue;
|
|
217
|
+
}
|
|
18
218
|
try {
|
|
19
|
-
const declaration = this.validateDeclaration(message
|
|
219
|
+
const declaration = this.validateDeclaration(message);
|
|
20
220
|
envelopes.push({
|
|
21
221
|
declaration,
|
|
22
222
|
consensusTimestamp: message.consensus_timestamp,
|
|
23
|
-
sequenceNumber: Number(message.sequence_number
|
|
24
|
-
payer: message.
|
|
223
|
+
sequenceNumber: Number(message.sequence_number ?? 0),
|
|
224
|
+
payer: message.payer
|
|
25
225
|
});
|
|
26
226
|
} catch (error) {
|
|
27
227
|
const detail = error instanceof Error ? error.message : "unknown error";
|
|
28
228
|
this.logger.warn(`Skipping invalid HCS-21 browser message: ${detail}`);
|
|
29
229
|
}
|
|
30
230
|
}
|
|
31
|
-
|
|
231
|
+
const ordered = options?.order === "desc" ? [...envelopes].sort((a, b) => b.sequenceNumber - a.sequenceNumber) : envelopes;
|
|
232
|
+
if (options?.limit && options.limit > 0) {
|
|
233
|
+
return ordered.slice(0, options.limit);
|
|
234
|
+
}
|
|
235
|
+
return ordered;
|
|
236
|
+
}
|
|
237
|
+
async getSignerContext() {
|
|
238
|
+
if (this.signerCache) {
|
|
239
|
+
return this.signerCache;
|
|
240
|
+
}
|
|
241
|
+
const accountInfo = this.hwc.getAccountInfo?.();
|
|
242
|
+
const accountId = typeof accountInfo === "string" ? accountInfo : accountInfo?.accountId;
|
|
243
|
+
if (!accountId) {
|
|
244
|
+
throw new HCS21ValidationError(
|
|
245
|
+
"Wallet is not connected",
|
|
246
|
+
"invalid_payload"
|
|
247
|
+
);
|
|
248
|
+
}
|
|
249
|
+
const accountResponse = await this.hwc.requestAccount(accountId);
|
|
250
|
+
const key = accountResponse?.key?.key;
|
|
251
|
+
if (!key) {
|
|
252
|
+
throw new HCS21ValidationError(
|
|
253
|
+
"Unable to resolve wallet public key",
|
|
254
|
+
"invalid_payload"
|
|
255
|
+
);
|
|
256
|
+
}
|
|
257
|
+
const publicKey = PublicKey.fromString(key);
|
|
258
|
+
this.signerCache = { accountId, publicKey };
|
|
259
|
+
return this.signerCache;
|
|
260
|
+
}
|
|
261
|
+
async executeWithWallet(tx) {
|
|
262
|
+
const { accountId } = await this.getSignerContext();
|
|
263
|
+
const txId = TransactionId.generate(AccountId.fromString(accountId));
|
|
264
|
+
tx.setTransactionId(txId);
|
|
265
|
+
const receipt = await this.hwc.executeTransaction(tx, false);
|
|
266
|
+
return {
|
|
267
|
+
receipt,
|
|
268
|
+
transactionId: txId.toString()
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
toNumber(value) {
|
|
272
|
+
if (typeof value === "number") {
|
|
273
|
+
return value;
|
|
274
|
+
}
|
|
275
|
+
if (value && typeof value.toNumber === "function") {
|
|
276
|
+
return value.toNumber();
|
|
277
|
+
}
|
|
278
|
+
return void 0;
|
|
32
279
|
}
|
|
33
280
|
}
|
|
34
281
|
export {
|