@hashgraphonline/standards-sdk 0.1.168 → 0.1.170
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 +1 -0
- package/dist/browser/hcs-11/client.d.ts.map +1 -1
- package/dist/browser/hcs-21/sdk.d.ts.map +1 -1
- package/dist/browser/hcs-27/base-client.d.ts +41 -0
- package/dist/browser/hcs-27/base-client.d.ts.map +1 -0
- package/dist/browser/hcs-27/index.d.ts +6 -0
- package/dist/browser/hcs-27/index.d.ts.map +1 -0
- package/dist/browser/hcs-27/memos.d.ts +5 -0
- package/dist/browser/hcs-27/memos.d.ts.map +1 -0
- package/dist/browser/hcs-27/merkle.d.ts +23 -0
- package/dist/browser/hcs-27/merkle.d.ts.map +1 -0
- package/dist/browser/hcs-27/sdk.d.ts +23 -0
- package/dist/browser/hcs-27/sdk.d.ts.map +1 -0
- package/dist/browser/hcs-27/types.d.ts +1611 -0
- package/dist/browser/hcs-27/types.d.ts.map +1 -0
- package/dist/browser/index.d.ts +1 -0
- package/dist/browser/index.d.ts.map +1 -1
- package/dist/browser/standards-sdk.browser.js +29 -5
- package/dist/browser/standards-sdk.browser.js.map +1 -1
- package/dist/browser/utils/key-type-detector.d.ts.map +1 -1
- package/dist/cjs/hcs-11/client.d.ts.map +1 -1
- package/dist/cjs/hcs-21/sdk.d.ts.map +1 -1
- package/dist/cjs/hcs-27/base-client.d.ts +41 -0
- package/dist/cjs/hcs-27/base-client.d.ts.map +1 -0
- package/dist/cjs/hcs-27/index.d.ts +6 -0
- package/dist/cjs/hcs-27/index.d.ts.map +1 -0
- package/dist/cjs/hcs-27/memos.d.ts +5 -0
- package/dist/cjs/hcs-27/memos.d.ts.map +1 -0
- package/dist/cjs/hcs-27/merkle.d.ts +23 -0
- package/dist/cjs/hcs-27/merkle.d.ts.map +1 -0
- package/dist/cjs/hcs-27/sdk.d.ts +23 -0
- package/dist/cjs/hcs-27/sdk.d.ts.map +1 -0
- package/dist/cjs/hcs-27/types.d.ts +1611 -0
- package/dist/cjs/hcs-27/types.d.ts.map +1 -0
- package/dist/cjs/index.d.ts +1 -0
- package/dist/cjs/index.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/key-type-detector.d.ts.map +1 -1
- package/dist/es/hcs-11/client.d.ts.map +1 -1
- package/dist/es/hcs-21/sdk.d.ts.map +1 -1
- package/dist/es/hcs-27/base-client.d.ts +41 -0
- package/dist/es/hcs-27/base-client.d.ts.map +1 -0
- package/dist/es/hcs-27/index.d.ts +6 -0
- package/dist/es/hcs-27/index.d.ts.map +1 -0
- package/dist/es/hcs-27/memos.d.ts +5 -0
- package/dist/es/hcs-27/memos.d.ts.map +1 -0
- package/dist/es/hcs-27/merkle.d.ts +23 -0
- package/dist/es/hcs-27/merkle.d.ts.map +1 -0
- package/dist/es/hcs-27/sdk.d.ts +23 -0
- package/dist/es/hcs-27/sdk.d.ts.map +1 -0
- package/dist/es/hcs-27/types.d.ts +1611 -0
- package/dist/es/hcs-27/types.d.ts.map +1 -0
- package/dist/es/index.d.ts +1 -0
- package/dist/es/index.d.ts.map +1 -1
- package/dist/es/standards-sdk.es.js +67 -38
- package/dist/es/standards-sdk.es.js.map +1 -1
- package/dist/es/standards-sdk.es101.js +2 -2
- package/dist/es/standards-sdk.es103.js +2 -2
- package/dist/es/standards-sdk.es104.js +1 -1
- package/dist/es/standards-sdk.es106.js +1 -1
- package/dist/es/standards-sdk.es108.js +2 -2
- package/dist/es/standards-sdk.es11.js +1 -1
- package/dist/es/standards-sdk.es110.js +1 -1
- package/dist/es/standards-sdk.es111.js +2 -2
- package/dist/es/standards-sdk.es112.js +151 -234
- package/dist/es/standards-sdk.es112.js.map +1 -1
- package/dist/es/standards-sdk.es113.js +20 -471
- package/dist/es/standards-sdk.es113.js.map +1 -1
- package/dist/es/standards-sdk.es114.js +263 -104
- package/dist/es/standards-sdk.es114.js.map +1 -1
- package/dist/es/standards-sdk.es115.js +167 -138
- package/dist/es/standards-sdk.es115.js.map +1 -1
- package/dist/es/standards-sdk.es116.js +315 -29
- package/dist/es/standards-sdk.es116.js.map +1 -1
- package/dist/es/standards-sdk.es117.js +250 -10
- package/dist/es/standards-sdk.es117.js.map +1 -1
- package/dist/es/standards-sdk.es118.js +448 -152
- package/dist/es/standards-sdk.es118.js.map +1 -1
- package/dist/es/standards-sdk.es119.js +101 -25
- 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 +155 -17
- package/dist/es/standards-sdk.es120.js.map +1 -1
- package/dist/es/standards-sdk.es121.js +29 -155
- package/dist/es/standards-sdk.es121.js.map +1 -1
- package/dist/es/standards-sdk.es122.js +9 -200
- package/dist/es/standards-sdk.es122.js.map +1 -1
- package/dist/es/standards-sdk.es123.js +146 -754
- package/dist/es/standards-sdk.es123.js.map +1 -1
- package/dist/es/standards-sdk.es124.js +27 -11
- package/dist/es/standards-sdk.es124.js.map +1 -1
- package/dist/es/standards-sdk.es125.js +19 -564
- package/dist/es/standards-sdk.es125.js.map +1 -1
- package/dist/es/standards-sdk.es126.js +140 -582
- package/dist/es/standards-sdk.es126.js.map +1 -1
- package/dist/es/standards-sdk.es127.js +202 -12
- package/dist/es/standards-sdk.es127.js.map +1 -1
- package/dist/es/standards-sdk.es128.js +790 -2
- package/dist/es/standards-sdk.es128.js.map +1 -1
- package/dist/es/standards-sdk.es129.js +10 -84
- 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 +567 -40
- package/dist/es/standards-sdk.es130.js.map +1 -1
- package/dist/es/standards-sdk.es131.js +626 -2
- package/dist/es/standards-sdk.es131.js.map +1 -1
- package/dist/es/standards-sdk.es132.js +12 -234
- package/dist/es/standards-sdk.es132.js.map +1 -1
- package/dist/es/standards-sdk.es133.js +2 -1140
- package/dist/es/standards-sdk.es133.js.map +1 -1
- package/dist/es/standards-sdk.es134.js +73 -292
- package/dist/es/standards-sdk.es134.js.map +1 -1
- package/dist/es/standards-sdk.es135.js +36 -418
- package/dist/es/standards-sdk.es135.js.map +1 -1
- package/dist/es/standards-sdk.es136.js +2 -355
- package/dist/es/standards-sdk.es136.js.map +1 -1
- package/dist/es/standards-sdk.es137.js +198 -1079
- package/dist/es/standards-sdk.es137.js.map +1 -1
- package/dist/es/standards-sdk.es138.js +1107 -175
- package/dist/es/standards-sdk.es138.js.map +1 -1
- package/dist/es/standards-sdk.es139.js +218 -1479
- package/dist/es/standards-sdk.es139.js.map +1 -1
- package/dist/es/standards-sdk.es14.js +1 -1
- package/dist/es/standards-sdk.es140.js +422 -1500
- package/dist/es/standards-sdk.es140.js.map +1 -1
- package/dist/es/standards-sdk.es141.js +351 -13
- package/dist/es/standards-sdk.es141.js.map +1 -1
- package/dist/es/standards-sdk.es142.js +1102 -73
- package/dist/es/standards-sdk.es142.js.map +1 -1
- package/dist/es/standards-sdk.es143.js +203 -76
- package/dist/es/standards-sdk.es143.js.map +1 -1
- package/dist/es/standards-sdk.es144.js +1459 -830
- package/dist/es/standards-sdk.es144.js.map +1 -1
- package/dist/es/standards-sdk.es145.js +1499 -59
- package/dist/es/standards-sdk.es145.js.map +1 -1
- package/dist/es/standards-sdk.es146.js +14 -156
- package/dist/es/standards-sdk.es146.js.map +1 -1
- package/dist/es/standards-sdk.es147.js +87 -7
- package/dist/es/standards-sdk.es147.js.map +1 -1
- package/dist/es/standards-sdk.es148.js +74 -79
- package/dist/es/standards-sdk.es148.js.map +1 -1
- package/dist/es/standards-sdk.es149.js +934 -61
- package/dist/es/standards-sdk.es149.js.map +1 -1
- package/dist/es/standards-sdk.es15.js +1 -1
- package/dist/es/standards-sdk.es150.js +60 -30
- package/dist/es/standards-sdk.es150.js.map +1 -1
- package/dist/es/standards-sdk.es151.js +159 -34
- package/dist/es/standards-sdk.es151.js.map +1 -1
- package/dist/es/standards-sdk.es152.js +7 -48
- package/dist/es/standards-sdk.es152.js.map +1 -1
- package/dist/es/standards-sdk.es153.js +70 -122
- package/dist/es/standards-sdk.es153.js.map +1 -1
- package/dist/es/standards-sdk.es154.js +58 -35
- package/dist/es/standards-sdk.es154.js.map +1 -1
- package/dist/es/standards-sdk.es155.js +30 -56
- package/dist/es/standards-sdk.es155.js.map +1 -1
- package/dist/es/standards-sdk.es156.js +34 -84
- package/dist/es/standards-sdk.es156.js.map +1 -1
- package/dist/es/standards-sdk.es157.js +48 -81
- package/dist/es/standards-sdk.es157.js.map +1 -1
- package/dist/es/standards-sdk.es158.js +124 -186
- package/dist/es/standards-sdk.es158.js.map +1 -1
- package/dist/es/standards-sdk.es159.js +34 -12474
- package/dist/es/standards-sdk.es159.js.map +1 -1
- package/dist/es/standards-sdk.es16.js +5 -5
- package/dist/es/standards-sdk.es160.js +12477 -12
- package/dist/es/standards-sdk.es160.js.map +1 -1
- package/dist/es/standards-sdk.es161.js +51 -68
- package/dist/es/standards-sdk.es161.js.map +1 -1
- package/dist/es/standards-sdk.es162.js +67 -533
- package/dist/es/standards-sdk.es162.js.map +1 -1
- package/dist/es/standards-sdk.es163.js +70 -161
- package/dist/es/standards-sdk.es163.js.map +1 -1
- package/dist/es/standards-sdk.es164.js +187 -309
- package/dist/es/standards-sdk.es164.js.map +1 -1
- package/dist/es/standards-sdk.es165.js +13 -342
- package/dist/es/standards-sdk.es165.js.map +1 -1
- package/dist/es/standards-sdk.es166.js +538 -441
- package/dist/es/standards-sdk.es166.js.map +1 -1
- package/dist/es/standards-sdk.es167.js +142 -301
- package/dist/es/standards-sdk.es167.js.map +1 -1
- package/dist/es/standards-sdk.es168.js +310 -64
- package/dist/es/standards-sdk.es168.js.map +1 -1
- package/dist/es/standards-sdk.es169.js +332 -158
- package/dist/es/standards-sdk.es169.js.map +1 -1
- package/dist/es/standards-sdk.es170.js +441 -210
- package/dist/es/standards-sdk.es170.js.map +1 -1
- package/dist/es/standards-sdk.es171.js +314 -222
- package/dist/es/standards-sdk.es171.js.map +1 -1
- package/dist/es/standards-sdk.es172.js +65 -108
- package/dist/es/standards-sdk.es172.js.map +1 -1
- package/dist/es/standards-sdk.es173.js +61 -114
- package/dist/es/standards-sdk.es173.js.map +1 -1
- package/dist/es/standards-sdk.es174.js +151 -140
- package/dist/es/standards-sdk.es174.js.map +1 -1
- package/dist/es/standards-sdk.es175.js +193 -156
- package/dist/es/standards-sdk.es175.js.map +1 -1
- package/dist/es/standards-sdk.es176.js +221 -121
- package/dist/es/standards-sdk.es176.js.map +1 -1
- package/dist/es/standards-sdk.es177.js +81 -293
- package/dist/es/standards-sdk.es177.js.map +1 -1
- package/dist/es/standards-sdk.es178.js +114 -247
- package/dist/es/standards-sdk.es178.js.map +1 -1
- package/dist/es/standards-sdk.es179.js +119 -110
- package/dist/es/standards-sdk.es179.js.map +1 -1
- package/dist/es/standards-sdk.es18.js +12 -12
- package/dist/es/standards-sdk.es180.js +188 -0
- package/dist/es/standards-sdk.es180.js.map +1 -0
- package/dist/es/standards-sdk.es181.js +142 -0
- package/dist/es/standards-sdk.es181.js.map +1 -0
- package/dist/es/standards-sdk.es182.js +334 -0
- package/dist/es/standards-sdk.es182.js.map +1 -0
- package/dist/es/standards-sdk.es183.js +262 -0
- package/dist/es/standards-sdk.es183.js.map +1 -0
- package/dist/es/standards-sdk.es184.js +155 -0
- package/dist/es/standards-sdk.es184.js.map +1 -0
- package/dist/es/standards-sdk.es19.js +9 -9
- package/dist/es/standards-sdk.es2.js +2 -2
- package/dist/es/standards-sdk.es20.js +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 +12 -12
- package/dist/es/standards-sdk.es27.js.map +1 -1
- package/dist/es/standards-sdk.es30.js +2 -2
- package/dist/es/standards-sdk.es31.js +4 -4
- package/dist/es/standards-sdk.es32.js +1 -1
- package/dist/es/standards-sdk.es35.js +6 -6
- package/dist/es/standards-sdk.es36.js +4 -4
- package/dist/es/standards-sdk.es37.js +2 -2
- package/dist/es/standards-sdk.es38.js +2 -2
- package/dist/es/standards-sdk.es39.js +1 -1
- package/dist/es/standards-sdk.es4.js +2 -2
- package/dist/es/standards-sdk.es40.js +1 -1
- package/dist/es/standards-sdk.es41.js +2 -2
- package/dist/es/standards-sdk.es46.js +1 -1
- package/dist/es/standards-sdk.es5.js +2 -2
- package/dist/es/standards-sdk.es51.js +1 -1
- package/dist/es/standards-sdk.es53.js +1 -1
- package/dist/es/standards-sdk.es56.js +2 -2
- package/dist/es/standards-sdk.es59.js +1 -1
- package/dist/es/standards-sdk.es6.js +2 -2
- package/dist/es/standards-sdk.es60.js +1 -1
- package/dist/es/standards-sdk.es62.js +1 -1
- package/dist/es/standards-sdk.es63.js +2 -2
- package/dist/es/standards-sdk.es64.js +1 -1
- package/dist/es/standards-sdk.es65.js +1 -1
- package/dist/es/standards-sdk.es66.js +1 -1
- package/dist/es/standards-sdk.es67.js +7 -7
- package/dist/es/standards-sdk.es69.js +1 -1
- package/dist/es/standards-sdk.es7.js +1 -1
- package/dist/es/standards-sdk.es71.js +2 -2
- package/dist/es/standards-sdk.es72.js +3 -3
- package/dist/es/standards-sdk.es75.js +5 -5
- package/dist/es/standards-sdk.es76.js +3 -3
- package/dist/es/standards-sdk.es77.js +2 -2
- package/dist/es/standards-sdk.es78.js +1 -1
- package/dist/es/standards-sdk.es81.js +2 -2
- package/dist/es/standards-sdk.es83.js +2 -2
- package/dist/es/standards-sdk.es84.js +4 -4
- package/dist/es/standards-sdk.es85.js +1 -1
- package/dist/es/standards-sdk.es88.js +1 -1
- package/dist/es/standards-sdk.es89.js +2 -2
- package/dist/es/standards-sdk.es9.js +2 -2
- package/dist/es/standards-sdk.es90.js +4 -4
- package/dist/es/standards-sdk.es90.js.map +1 -1
- package/dist/es/standards-sdk.es94.js +3 -3
- package/dist/es/standards-sdk.es96.js +2 -2
- package/dist/es/standards-sdk.es98.js +1 -1
- package/dist/es/standards-sdk.es99.js +3 -3
- package/dist/es/utils/key-type-detector.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1,37 +1,323 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
1
|
+
import { AccountId, Client, TopicCreateTransaction, TopicId, TopicMessageSubmitTransaction, PublicKey, KeyList, PrivateKey } from "@hashgraph/sdk";
|
|
2
|
+
import { randomUUID, createHash } from "crypto";
|
|
3
|
+
import { InscriptionSDK } from "./standards-sdk.es160.js";
|
|
4
|
+
import { createNodeOperatorContext } from "./standards-sdk.es158.js";
|
|
5
|
+
import { inscribe } from "./standards-sdk.es142.js";
|
|
6
|
+
import { getTopicId } from "./standards-sdk.es132.js";
|
|
7
|
+
import { HCS27BaseClient } from "./standards-sdk.es115.js";
|
|
8
|
+
import { toHCS27CheckpointMetadata, hcs27CheckpointMetadataSchema, hcs27CheckpointMessageSchema } from "./standards-sdk.es112.js";
|
|
9
|
+
const MAX_PAYLOAD_BYTES = 1024;
|
|
10
|
+
class HCS27Client extends HCS27BaseClient {
|
|
11
|
+
constructor(config) {
|
|
12
|
+
super(config);
|
|
13
|
+
this.topicSubmitKeySigners = /* @__PURE__ */ new Map();
|
|
14
|
+
this.operatorId = typeof config.operatorId === "string" ? AccountId.fromString(config.operatorId) : config.operatorId;
|
|
15
|
+
let resolvedClient = config.client;
|
|
16
|
+
if (!resolvedClient) {
|
|
17
|
+
if (config.network === "mainnet") {
|
|
18
|
+
resolvedClient = Client.forMainnet();
|
|
19
|
+
} else {
|
|
20
|
+
resolvedClient = Client.forTestnet();
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
this.operatorCtx = createNodeOperatorContext({
|
|
24
|
+
network: this.network,
|
|
25
|
+
operatorId: this.operatorId,
|
|
26
|
+
operatorKey: config.operatorKey,
|
|
27
|
+
keyType: config.keyType,
|
|
28
|
+
mirrorNode: this.mirrorNode,
|
|
29
|
+
logger: this.logger,
|
|
30
|
+
client: resolvedClient
|
|
31
|
+
});
|
|
32
|
+
this.client = this.operatorCtx.client;
|
|
33
|
+
}
|
|
34
|
+
getKeyType() {
|
|
35
|
+
return this.operatorCtx.keyType;
|
|
36
|
+
}
|
|
37
|
+
async createCheckpointTopic(options = {}) {
|
|
38
|
+
await this.operatorCtx.ensureInitialized();
|
|
39
|
+
const transaction = new TopicCreateTransaction().setTopicMemo(
|
|
40
|
+
this.buildTopicMemo(options.ttl)
|
|
41
|
+
);
|
|
42
|
+
const adminKeyMaterial = this.resolveTopicKeyMaterial(options.adminKey);
|
|
43
|
+
this.assertSignableTopicKey(options.adminKey, adminKeyMaterial, "adminKey");
|
|
44
|
+
if (adminKeyMaterial.publicKey) {
|
|
45
|
+
transaction.setAdminKey(adminKeyMaterial.publicKey);
|
|
46
|
+
}
|
|
47
|
+
const submitKeyMaterial = this.resolveTopicKeyMaterial(options.submitKey);
|
|
48
|
+
this.assertSignableTopicKey(
|
|
49
|
+
options.submitKey,
|
|
50
|
+
submitKeyMaterial,
|
|
51
|
+
"submitKey"
|
|
52
|
+
);
|
|
53
|
+
if (submitKeyMaterial.publicKey) {
|
|
54
|
+
transaction.setSubmitKey(submitKeyMaterial.publicKey);
|
|
55
|
+
}
|
|
56
|
+
if (options.transactionMemo?.trim()) {
|
|
57
|
+
transaction.setTransactionMemo(options.transactionMemo.trim());
|
|
58
|
+
}
|
|
59
|
+
let response;
|
|
60
|
+
if (adminKeyMaterial.signer || submitKeyMaterial.signer) {
|
|
61
|
+
const frozenTransaction = await transaction.freezeWith(this.client);
|
|
62
|
+
let signedTransaction = frozenTransaction;
|
|
63
|
+
if (adminKeyMaterial.signer) {
|
|
64
|
+
signedTransaction = await signedTransaction.sign(
|
|
65
|
+
adminKeyMaterial.signer
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
if (submitKeyMaterial.signer) {
|
|
69
|
+
signedTransaction = await signedTransaction.sign(
|
|
70
|
+
submitKeyMaterial.signer
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
response = await signedTransaction.execute(this.client);
|
|
74
|
+
} else {
|
|
75
|
+
response = await transaction.execute(this.client);
|
|
76
|
+
}
|
|
77
|
+
const receipt = await response.getReceipt(this.client);
|
|
78
|
+
if (!receipt.topicId) {
|
|
79
|
+
throw new Error("Failed to create checkpoint topic: topicId empty");
|
|
80
|
+
}
|
|
81
|
+
if (submitKeyMaterial.signer) {
|
|
82
|
+
this.topicSubmitKeySigners.set(
|
|
83
|
+
receipt.topicId.toString(),
|
|
84
|
+
submitKeyMaterial.signer
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
topicId: receipt.topicId.toString(),
|
|
89
|
+
transactionId: response.transactionId.toString()
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
async publishCheckpoint(topicId, metadata, messageMemo, transactionMemo) {
|
|
93
|
+
await this.operatorCtx.ensureInitialized();
|
|
94
|
+
const normalizedTopicId = TopicId.fromString(topicId).toString();
|
|
95
|
+
const parsedMetadata = toHCS27CheckpointMetadata(
|
|
96
|
+
hcs27CheckpointMetadataSchema.parse(metadata)
|
|
97
|
+
);
|
|
98
|
+
const { message, inlineResolvedMetadata } = await this.prepareCheckpointPayload(parsedMetadata, messageMemo);
|
|
99
|
+
if (typeof message.metadata === "string" && inlineResolvedMetadata) {
|
|
100
|
+
await this.validateCheckpointMessage(message, async (reference) => {
|
|
101
|
+
if (reference === message.metadata) {
|
|
102
|
+
return inlineResolvedMetadata;
|
|
103
|
+
}
|
|
104
|
+
return this.resolveHCS1Reference(reference);
|
|
17
105
|
});
|
|
18
|
-
|
|
106
|
+
} else {
|
|
107
|
+
await this.validateCheckpointMessage(message);
|
|
19
108
|
}
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
109
|
+
const transaction = new TopicMessageSubmitTransaction().setTopicId(TopicId.fromString(normalizedTopicId)).setMessage(JSON.stringify(message)).setTransactionMemo(
|
|
110
|
+
transactionMemo?.trim() || this.buildTransactionMemo()
|
|
111
|
+
);
|
|
112
|
+
const submitKeySigner = this.topicSubmitKeySigners.get(normalizedTopicId);
|
|
113
|
+
const response = submitKeySigner ? await (await transaction.freezeWith(this.client)).sign(submitKeySigner).then((signedTransaction) => signedTransaction.execute(this.client)) : await transaction.execute(this.client);
|
|
114
|
+
const receipt = await response.getReceipt(this.client);
|
|
115
|
+
return {
|
|
116
|
+
transactionId: response.transactionId.toString(),
|
|
117
|
+
sequenceNumber: this.parseSequenceNumber(receipt.topicSequenceNumber),
|
|
118
|
+
receipt
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
registerTopicSubmitKey(topicId, submitKey) {
|
|
122
|
+
const submitKeyMaterial = this.resolveTopicKeyMaterial(submitKey);
|
|
123
|
+
if (!submitKeyMaterial.signer) {
|
|
124
|
+
throw new Error(
|
|
125
|
+
"submitKey must include a private key so the client can sign private-topic submissions"
|
|
126
|
+
);
|
|
127
|
+
}
|
|
128
|
+
this.topicSubmitKeySigners.set(
|
|
129
|
+
TopicId.fromString(topicId).toString(),
|
|
130
|
+
submitKeyMaterial.signer
|
|
131
|
+
);
|
|
132
|
+
}
|
|
133
|
+
resolveTopicKeyMaterial(input) {
|
|
134
|
+
if (input === void 0 || input === false) {
|
|
135
|
+
return {};
|
|
136
|
+
}
|
|
137
|
+
if (input instanceof PublicKey || input instanceof KeyList) {
|
|
138
|
+
return { publicKey: input };
|
|
139
|
+
}
|
|
140
|
+
if (input instanceof PrivateKey) {
|
|
141
|
+
return { publicKey: input.publicKey, signer: input };
|
|
142
|
+
}
|
|
143
|
+
if (typeof input === "boolean") {
|
|
144
|
+
return input ? { publicKey: this.operatorCtx.operatorKey.publicKey } : {};
|
|
145
|
+
}
|
|
146
|
+
if (typeof input === "string") {
|
|
147
|
+
if (input.trim().length === 0) {
|
|
148
|
+
throw new Error("topic key string cannot be empty");
|
|
149
|
+
}
|
|
150
|
+
try {
|
|
151
|
+
return { publicKey: PublicKey.fromString(input) };
|
|
152
|
+
} catch (publicKeyError) {
|
|
153
|
+
try {
|
|
154
|
+
const signer = PrivateKey.fromString(input);
|
|
155
|
+
return { publicKey: signer.publicKey, signer };
|
|
156
|
+
} catch (privateKeyError) {
|
|
157
|
+
throw new Error(
|
|
158
|
+
`Failed to parse topic key as PublicKey or PrivateKey: ${String(
|
|
159
|
+
publicKeyError
|
|
160
|
+
)}; ${String(privateKeyError)}`
|
|
161
|
+
);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return {};
|
|
166
|
+
}
|
|
167
|
+
assertSignableTopicKey(input, material, fieldName) {
|
|
168
|
+
if (!input || typeof input === "boolean" || material.signer) {
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
if (material.publicKey && !this.operatorCanSignTopicKey(material.publicKey)) {
|
|
172
|
+
throw new Error(
|
|
173
|
+
`${fieldName} must include a private key or use true to reuse the operator key`
|
|
174
|
+
);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
operatorCanSignTopicKey(publicKey) {
|
|
178
|
+
if (publicKey instanceof PublicKey) {
|
|
179
|
+
return this.operatorCtx.operatorKey.publicKey.equals(publicKey);
|
|
180
|
+
}
|
|
181
|
+
return this.operatorCanSignKeyList(publicKey);
|
|
182
|
+
}
|
|
183
|
+
operatorCanSignKeyList(keyList) {
|
|
184
|
+
const keys = keyList.toArray();
|
|
185
|
+
const threshold = keyList.threshold ?? keys.length;
|
|
186
|
+
if (threshold > 1 || keys.length === 0) {
|
|
187
|
+
return false;
|
|
188
|
+
}
|
|
189
|
+
return keys.some((key) => {
|
|
190
|
+
if (key instanceof PublicKey) {
|
|
191
|
+
return this.operatorCtx.operatorKey.publicKey.equals(key);
|
|
192
|
+
}
|
|
193
|
+
if (key instanceof KeyList) {
|
|
194
|
+
return this.operatorCanSignKeyList(key);
|
|
195
|
+
}
|
|
196
|
+
return false;
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
parseSequenceNumber(value) {
|
|
200
|
+
const parsed = BigInt(value.toString());
|
|
201
|
+
if (parsed > BigInt(Number.MAX_SAFE_INTEGER)) {
|
|
202
|
+
throw new Error(
|
|
203
|
+
"topicSequenceNumber exceeds Number.MAX_SAFE_INTEGER and cannot be represented safely"
|
|
204
|
+
);
|
|
205
|
+
}
|
|
206
|
+
return Number(parsed);
|
|
207
|
+
}
|
|
208
|
+
async prepareCheckpointPayload(metadata, messageMemo) {
|
|
209
|
+
const normalizedMemo = messageMemo?.trim();
|
|
210
|
+
if (normalizedMemo && normalizedMemo.length > 299) {
|
|
211
|
+
throw new Error(
|
|
212
|
+
"messageMemo must be 299 characters or fewer for HCS-27 checkpoints"
|
|
213
|
+
);
|
|
214
|
+
}
|
|
215
|
+
const inlineMessage = {
|
|
216
|
+
p: "hcs-27",
|
|
217
|
+
op: "register",
|
|
218
|
+
metadata,
|
|
219
|
+
...normalizedMemo ? { m: normalizedMemo } : {}
|
|
220
|
+
};
|
|
221
|
+
const inlinePayload = JSON.stringify(inlineMessage);
|
|
222
|
+
if (Buffer.byteLength(inlinePayload, "utf8") <= MAX_PAYLOAD_BYTES) {
|
|
223
|
+
return { message: inlineMessage };
|
|
224
|
+
}
|
|
225
|
+
const metadataBytes = Buffer.from(JSON.stringify(metadata), "utf8");
|
|
226
|
+
const digest = this.sha256Base64Url(metadataBytes);
|
|
227
|
+
hcs27CheckpointMessageSchema.parse({
|
|
228
|
+
p: "hcs-27",
|
|
229
|
+
op: "register",
|
|
230
|
+
metadata: "hcs://1/18446744073709551615.18446744073709551615.18446744073709551615",
|
|
231
|
+
metadata_digest: {
|
|
232
|
+
alg: "sha-256",
|
|
233
|
+
b64u: digest
|
|
234
|
+
},
|
|
235
|
+
...normalizedMemo ? { m: normalizedMemo } : {}
|
|
236
|
+
});
|
|
237
|
+
const maxReferencePayload = JSON.stringify({
|
|
238
|
+
p: "hcs-27",
|
|
239
|
+
op: "register",
|
|
240
|
+
metadata: "hcs://1/18446744073709551615.18446744073709551615.18446744073709551615",
|
|
241
|
+
metadata_digest: {
|
|
242
|
+
alg: "sha-256",
|
|
243
|
+
b64u: digest
|
|
244
|
+
},
|
|
245
|
+
...normalizedMemo ? { m: normalizedMemo } : {}
|
|
30
246
|
});
|
|
247
|
+
if (Buffer.byteLength(maxReferencePayload, "utf8") > MAX_PAYLOAD_BYTES) {
|
|
248
|
+
throw new Error(
|
|
249
|
+
`checkpoint overflow pointer message exceeds ${MAX_PAYLOAD_BYTES} bytes`
|
|
250
|
+
);
|
|
251
|
+
}
|
|
252
|
+
const reference = await this.publishMetadataHCS1(metadataBytes);
|
|
253
|
+
const overflowMessage = {
|
|
254
|
+
p: "hcs-27",
|
|
255
|
+
op: "register",
|
|
256
|
+
metadata: reference,
|
|
257
|
+
metadata_digest: {
|
|
258
|
+
alg: "sha-256",
|
|
259
|
+
b64u: digest
|
|
260
|
+
},
|
|
261
|
+
...normalizedMemo ? { m: normalizedMemo } : {}
|
|
262
|
+
};
|
|
263
|
+
const overflowPayload = JSON.stringify(overflowMessage);
|
|
264
|
+
if (Buffer.byteLength(overflowPayload, "utf8") > MAX_PAYLOAD_BYTES) {
|
|
265
|
+
throw new Error(
|
|
266
|
+
`checkpoint overflow pointer message still exceeds ${MAX_PAYLOAD_BYTES} bytes`
|
|
267
|
+
);
|
|
268
|
+
}
|
|
269
|
+
return {
|
|
270
|
+
message: overflowMessage,
|
|
271
|
+
inlineResolvedMetadata: metadataBytes
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
async publishMetadataHCS1(metadataBytes) {
|
|
275
|
+
if (this.network !== "testnet" && this.network !== "mainnet") {
|
|
276
|
+
throw new Error(
|
|
277
|
+
`HCS-1 metadata publication is only supported on testnet and mainnet, got ${this.network}`
|
|
278
|
+
);
|
|
279
|
+
}
|
|
280
|
+
const authOptions = {
|
|
281
|
+
accountId: this.operatorId.toString(),
|
|
282
|
+
privateKey: this.operatorCtx.operatorKey,
|
|
283
|
+
network: this.network
|
|
284
|
+
};
|
|
285
|
+
if (!this.inscriptionSDK) {
|
|
286
|
+
this.inscriptionSDK = await InscriptionSDK.createWithAuth({
|
|
287
|
+
type: "server",
|
|
288
|
+
...authOptions
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
const response = await inscribe(
|
|
292
|
+
{
|
|
293
|
+
type: "buffer",
|
|
294
|
+
buffer: metadataBytes,
|
|
295
|
+
fileName: `hcs27-checkpoint-${randomUUID()}.json`,
|
|
296
|
+
mimeType: "application/json"
|
|
297
|
+
},
|
|
298
|
+
authOptions,
|
|
299
|
+
{
|
|
300
|
+
mode: "file",
|
|
301
|
+
fileStandard: "hcs-1",
|
|
302
|
+
waitForConfirmation: true,
|
|
303
|
+
waitMaxAttempts: 120,
|
|
304
|
+
waitIntervalMs: 2e3
|
|
305
|
+
},
|
|
306
|
+
this.inscriptionSDK
|
|
307
|
+
);
|
|
308
|
+
const topicId = getTopicId(response.inscription);
|
|
309
|
+
if (!topicId) {
|
|
310
|
+
throw new Error(
|
|
311
|
+
"Failed to inscribe overflow HCS-27 metadata: no topic ID returned"
|
|
312
|
+
);
|
|
313
|
+
}
|
|
314
|
+
return `hcs://1/${topicId}`;
|
|
315
|
+
}
|
|
316
|
+
sha256Base64Url(payload) {
|
|
317
|
+
return createHash("sha256").update(payload).digest("base64url");
|
|
31
318
|
}
|
|
32
319
|
}
|
|
33
320
|
export {
|
|
34
|
-
|
|
35
|
-
createRegistryBrokerVerificationProvider
|
|
321
|
+
HCS27Client
|
|
36
322
|
};
|
|
37
323
|
//# sourceMappingURL=standards-sdk.es116.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standards-sdk.es116.js","sources":["../../src/hcs-26/sdk.ts"],"sourcesContent":["import type { RegistryBrokerClient } from '../services/registry-broker/client/base-client';\nimport { getSkillVerificationStatus } from '../services/registry-broker/client/skills';\nimport type { SkillVerificationStatusResponse } from '../services/registry-broker/types';\nimport {\n HCS26BaseClient,\n type HCS26ClientConfig,\n type HCS26SkillVerificationProvider,\n type HCS26SkillVerificationStatus,\n} from './base-client';\n\nexport interface SDKHCS26ClientConfig extends HCS26ClientConfig {\n registryBrokerClient?: RegistryBrokerClient;\n}\n\nfunction mapVerification(\n status: SkillVerificationStatusResponse,\n): HCS26SkillVerificationStatus {\n const pendingRequest = status.pendingRequest ?? undefined;\n return {\n name: status.name,\n verified: status.verified,\n previouslyVerified: status.previouslyVerified,\n ...(pendingRequest ? { pendingRequest } : {}),\n };\n}\n\nexport function createRegistryBrokerVerificationProvider(\n client: RegistryBrokerClient,\n): HCS26SkillVerificationProvider {\n return {\n async getSkillVerificationStatus(params: { name: string }) {\n const status = await getSkillVerificationStatus(client, {\n name: params.name,\n });\n return mapVerification(status);\n },\n };\n}\n\nexport class HCS26Client extends HCS26BaseClient {\n constructor(config: SDKHCS26ClientConfig) {\n const provider =\n config.verificationProvider ??\n (config.registryBrokerClient\n ? createRegistryBrokerVerificationProvider(config.registryBrokerClient)\n : undefined);\n\n super({\n network: config.network,\n logger: config.logger,\n mirrorNode: config.mirrorNode,\n verificationProvider: provider,\n });\n }\n}\n"],"names":[],"mappings":";;AAcA,SAAS,gBACP,QAC8B;AAC9B,QAAM,iBAAiB,OAAO,kBAAkB;AAChD,SAAO;AAAA,IACL,MAAM,OAAO;AAAA,IACb,UAAU,OAAO;AAAA,IACjB,oBAAoB,OAAO;AAAA,IAC3B,GAAI,iBAAiB,EAAE,mBAAmB,CAAA;AAAA,EAAC;AAE/C;AAEO,SAAS,yCACd,QACgC;AAChC,SAAO;AAAA,IACL,MAAM,2BAA2B,QAA0B;AACzD,YAAM,SAAS,MAAM,2BAA2B,QAAQ;AAAA,QACtD,MAAM,OAAO;AAAA,MAAA,CACd;AACD,aAAO,gBAAgB,MAAM;AAAA,IAC/B;AAAA,EAAA;AAEJ;AAEO,MAAM,oBAAoB,gBAAgB;AAAA,EAC/C,YAAY,QAA8B;AACxC,UAAM,WACJ,OAAO,yBACN,OAAO,uBACJ,yCAAyC,OAAO,oBAAoB,IACpE;AAEN,UAAM;AAAA,MACJ,SAAS,OAAO;AAAA,MAChB,QAAQ,OAAO;AAAA,MACf,YAAY,OAAO;AAAA,MACnB,sBAAsB;AAAA,IAAA,CACvB;AAAA,EACH;AACF;"}
|
|
1
|
+
{"version":3,"file":"standards-sdk.es116.js","sources":["../../src/hcs-27/sdk.ts"],"sourcesContent":["import {\n AccountId,\n Client,\n KeyList,\n PrivateKey,\n PublicKey,\n TopicCreateTransaction,\n TopicId,\n TopicMessageSubmitTransaction,\n} from '@hashgraph/sdk';\nimport { createHash, randomUUID } from 'crypto';\nimport { InscriptionSDK } from '@kiloscribe/inscription-sdk';\nimport {\n createNodeOperatorContext,\n type NodeOperatorContext,\n} from '../common/node-operator-resolver';\nimport { inscribe } from '../inscribe/inscriber';\nimport { getTopicId } from '../utils/topic-id-utils';\nimport { HCS27BaseClient } from './base-client';\nimport {\n hcs27CheckpointMetadataSchema,\n hcs27CheckpointMessageSchema,\n type HCS27CheckpointMessage,\n type HCS27CheckpointMetadata,\n type HCS27CreateCheckpointTopicOptions,\n type HCS27CreateCheckpointTopicResult,\n type HCS27PublishCheckpointResult,\n type HCS27TopicKey,\n type SDKHCS27ClientConfig,\n toHCS27CheckpointMetadata,\n} from './types';\n\nconst MAX_PAYLOAD_BYTES = 1024;\n\nexport class HCS27Client extends HCS27BaseClient {\n private readonly client: Client;\n private readonly operatorId: AccountId;\n private readonly operatorCtx: NodeOperatorContext;\n private inscriptionSDK?: InscriptionSDK;\n private readonly topicSubmitKeySigners = new Map<string, PrivateKey>();\n\n constructor(config: SDKHCS27ClientConfig) {\n super(config);\n this.operatorId =\n typeof config.operatorId === 'string'\n ? AccountId.fromString(config.operatorId)\n : config.operatorId;\n\n let resolvedClient = config.client;\n if (!resolvedClient) {\n if (config.network === 'mainnet') {\n resolvedClient = Client.forMainnet();\n } else {\n resolvedClient = Client.forTestnet();\n }\n }\n\n this.operatorCtx = createNodeOperatorContext({\n network: this.network,\n operatorId: this.operatorId,\n operatorKey: config.operatorKey,\n keyType: config.keyType,\n mirrorNode: this.mirrorNode,\n logger: this.logger,\n client: resolvedClient,\n });\n this.client = this.operatorCtx.client;\n }\n\n getKeyType(): 'ed25519' | 'ecdsa' {\n return this.operatorCtx.keyType;\n }\n\n async createCheckpointTopic(\n options: HCS27CreateCheckpointTopicOptions = {},\n ): Promise<HCS27CreateCheckpointTopicResult> {\n await this.operatorCtx.ensureInitialized();\n\n const transaction = new TopicCreateTransaction().setTopicMemo(\n this.buildTopicMemo(options.ttl),\n );\n\n const adminKeyMaterial = this.resolveTopicKeyMaterial(options.adminKey);\n this.assertSignableTopicKey(options.adminKey, adminKeyMaterial, 'adminKey');\n if (adminKeyMaterial.publicKey) {\n transaction.setAdminKey(adminKeyMaterial.publicKey);\n }\n\n const submitKeyMaterial = this.resolveTopicKeyMaterial(options.submitKey);\n this.assertSignableTopicKey(\n options.submitKey,\n submitKeyMaterial,\n 'submitKey',\n );\n if (submitKeyMaterial.publicKey) {\n transaction.setSubmitKey(submitKeyMaterial.publicKey);\n }\n\n if (options.transactionMemo?.trim()) {\n transaction.setTransactionMemo(options.transactionMemo.trim());\n }\n\n let response;\n if (adminKeyMaterial.signer || submitKeyMaterial.signer) {\n const frozenTransaction = await transaction.freezeWith(this.client);\n let signedTransaction = frozenTransaction;\n if (adminKeyMaterial.signer) {\n signedTransaction = await signedTransaction.sign(\n adminKeyMaterial.signer,\n );\n }\n if (submitKeyMaterial.signer) {\n signedTransaction = await signedTransaction.sign(\n submitKeyMaterial.signer,\n );\n }\n response = await signedTransaction.execute(this.client);\n } else {\n response = await transaction.execute(this.client);\n }\n const receipt = await response.getReceipt(this.client);\n if (!receipt.topicId) {\n throw new Error('Failed to create checkpoint topic: topicId empty');\n }\n if (submitKeyMaterial.signer) {\n this.topicSubmitKeySigners.set(\n receipt.topicId.toString(),\n submitKeyMaterial.signer,\n );\n }\n\n return {\n topicId: receipt.topicId.toString(),\n transactionId: response.transactionId.toString(),\n };\n }\n\n async publishCheckpoint(\n topicId: string,\n metadata: HCS27CheckpointMetadata,\n messageMemo?: string,\n transactionMemo?: string,\n ): Promise<HCS27PublishCheckpointResult> {\n await this.operatorCtx.ensureInitialized();\n const normalizedTopicId = TopicId.fromString(topicId).toString();\n const parsedMetadata = toHCS27CheckpointMetadata(\n hcs27CheckpointMetadataSchema.parse(metadata),\n );\n const { message, inlineResolvedMetadata } =\n await this.prepareCheckpointPayload(parsedMetadata, messageMemo);\n\n if (typeof message.metadata === 'string' && inlineResolvedMetadata) {\n await this.validateCheckpointMessage(message, async reference => {\n if (reference === message.metadata) {\n return inlineResolvedMetadata;\n }\n return this.resolveHCS1Reference(reference);\n });\n } else {\n await this.validateCheckpointMessage(message);\n }\n\n const transaction = new TopicMessageSubmitTransaction()\n .setTopicId(TopicId.fromString(normalizedTopicId))\n .setMessage(JSON.stringify(message))\n .setTransactionMemo(\n transactionMemo?.trim() || this.buildTransactionMemo(),\n );\n const submitKeySigner = this.topicSubmitKeySigners.get(normalizedTopicId);\n const response = submitKeySigner\n ? await (await transaction.freezeWith(this.client))\n .sign(submitKeySigner)\n .then(signedTransaction => signedTransaction.execute(this.client))\n : await transaction.execute(this.client);\n\n const receipt = await response.getReceipt(this.client);\n\n return {\n transactionId: response.transactionId.toString(),\n sequenceNumber: this.parseSequenceNumber(receipt.topicSequenceNumber),\n receipt,\n };\n }\n\n registerTopicSubmitKey(topicId: string, submitKey: HCS27TopicKey): void {\n const submitKeyMaterial = this.resolveTopicKeyMaterial(submitKey);\n if (!submitKeyMaterial.signer) {\n throw new Error(\n 'submitKey must include a private key so the client can sign private-topic submissions',\n );\n }\n this.topicSubmitKeySigners.set(\n TopicId.fromString(topicId).toString(),\n submitKeyMaterial.signer,\n );\n }\n\n private resolveTopicKeyMaterial(input?: HCS27TopicKey): {\n publicKey?: PublicKey | KeyList;\n signer?: PrivateKey;\n } {\n if (input === undefined || input === false) {\n return {};\n }\n if (input instanceof PublicKey || input instanceof KeyList) {\n return { publicKey: input };\n }\n if (input instanceof PrivateKey) {\n return { publicKey: input.publicKey, signer: input };\n }\n if (typeof input === 'boolean') {\n return input ? { publicKey: this.operatorCtx.operatorKey.publicKey } : {};\n }\n if (typeof input === 'string') {\n if (input.trim().length === 0) {\n throw new Error('topic key string cannot be empty');\n }\n try {\n return { publicKey: PublicKey.fromString(input) };\n } catch (publicKeyError) {\n try {\n const signer = PrivateKey.fromString(input);\n return { publicKey: signer.publicKey, signer };\n } catch (privateKeyError) {\n throw new Error(\n `Failed to parse topic key as PublicKey or PrivateKey: ${String(\n publicKeyError,\n )}; ${String(privateKeyError)}`,\n );\n }\n }\n }\n return {};\n }\n\n private assertSignableTopicKey(\n input: HCS27TopicKey | undefined,\n material: { publicKey?: PublicKey | KeyList; signer?: PrivateKey },\n fieldName: 'adminKey' | 'submitKey',\n ): void {\n if (!input || typeof input === 'boolean' || material.signer) {\n return;\n }\n if (\n material.publicKey &&\n !this.operatorCanSignTopicKey(material.publicKey)\n ) {\n throw new Error(\n `${fieldName} must include a private key or use true to reuse the operator key`,\n );\n }\n }\n\n private operatorCanSignTopicKey(publicKey: PublicKey | KeyList): boolean {\n if (publicKey instanceof PublicKey) {\n return this.operatorCtx.operatorKey.publicKey.equals(publicKey);\n }\n return this.operatorCanSignKeyList(publicKey);\n }\n\n private operatorCanSignKeyList(keyList: KeyList): boolean {\n const keys = keyList.toArray();\n const threshold = keyList.threshold ?? keys.length;\n if (threshold > 1 || keys.length === 0) {\n return false;\n }\n\n return keys.some(key => {\n if (key instanceof PublicKey) {\n return this.operatorCtx.operatorKey.publicKey.equals(key);\n }\n if (key instanceof KeyList) {\n return this.operatorCanSignKeyList(key);\n }\n return false;\n });\n }\n\n private parseSequenceNumber(\n value: { toString(): string } | number | bigint | string,\n ): number {\n const parsed = BigInt(value.toString());\n if (parsed > BigInt(Number.MAX_SAFE_INTEGER)) {\n throw new Error(\n 'topicSequenceNumber exceeds Number.MAX_SAFE_INTEGER and cannot be represented safely',\n );\n }\n return Number(parsed);\n }\n\n private async prepareCheckpointPayload(\n metadata: HCS27CheckpointMetadata,\n messageMemo?: string,\n ): Promise<{\n message: HCS27CheckpointMessage;\n inlineResolvedMetadata?: Buffer;\n }> {\n const normalizedMemo = messageMemo?.trim();\n if (normalizedMemo && normalizedMemo.length > 299) {\n throw new Error(\n 'messageMemo must be 299 characters or fewer for HCS-27 checkpoints',\n );\n }\n\n const inlineMessage: HCS27CheckpointMessage = {\n p: 'hcs-27',\n op: 'register',\n metadata,\n ...(normalizedMemo ? { m: normalizedMemo } : {}),\n };\n const inlinePayload = JSON.stringify(inlineMessage);\n if (Buffer.byteLength(inlinePayload, 'utf8') <= MAX_PAYLOAD_BYTES) {\n return { message: inlineMessage };\n }\n\n const metadataBytes = Buffer.from(JSON.stringify(metadata), 'utf8');\n const digest = this.sha256Base64Url(metadataBytes);\n hcs27CheckpointMessageSchema.parse({\n p: 'hcs-27',\n op: 'register',\n metadata:\n 'hcs://1/18446744073709551615.18446744073709551615.18446744073709551615',\n metadata_digest: {\n alg: 'sha-256',\n b64u: digest,\n },\n ...(normalizedMemo ? { m: normalizedMemo } : {}),\n });\n\n const maxReferencePayload = JSON.stringify({\n p: 'hcs-27',\n op: 'register',\n metadata:\n 'hcs://1/18446744073709551615.18446744073709551615.18446744073709551615',\n metadata_digest: {\n alg: 'sha-256',\n b64u: digest,\n },\n ...(normalizedMemo ? { m: normalizedMemo } : {}),\n });\n if (Buffer.byteLength(maxReferencePayload, 'utf8') > MAX_PAYLOAD_BYTES) {\n throw new Error(\n `checkpoint overflow pointer message exceeds ${MAX_PAYLOAD_BYTES} bytes`,\n );\n }\n\n const reference = await this.publishMetadataHCS1(metadataBytes);\n const overflowMessage: HCS27CheckpointMessage = {\n p: 'hcs-27',\n op: 'register',\n metadata: reference,\n metadata_digest: {\n alg: 'sha-256',\n b64u: digest,\n },\n ...(normalizedMemo ? { m: normalizedMemo } : {}),\n };\n const overflowPayload = JSON.stringify(overflowMessage);\n if (Buffer.byteLength(overflowPayload, 'utf8') > MAX_PAYLOAD_BYTES) {\n throw new Error(\n `checkpoint overflow pointer message still exceeds ${MAX_PAYLOAD_BYTES} bytes`,\n );\n }\n\n return {\n message: overflowMessage,\n inlineResolvedMetadata: metadataBytes,\n };\n }\n\n private async publishMetadataHCS1(metadataBytes: Buffer): Promise<string> {\n if (this.network !== 'testnet' && this.network !== 'mainnet') {\n throw new Error(\n `HCS-1 metadata publication is only supported on testnet and mainnet, got ${this.network}`,\n );\n }\n\n const authOptions = {\n accountId: this.operatorId.toString(),\n privateKey: this.operatorCtx.operatorKey,\n network: this.network,\n };\n\n if (!this.inscriptionSDK) {\n this.inscriptionSDK = await InscriptionSDK.createWithAuth({\n type: 'server',\n ...authOptions,\n });\n }\n\n const response = await inscribe(\n {\n type: 'buffer',\n buffer: metadataBytes,\n fileName: `hcs27-checkpoint-${randomUUID()}.json`,\n mimeType: 'application/json',\n },\n authOptions,\n {\n mode: 'file',\n fileStandard: 'hcs-1',\n waitForConfirmation: true,\n waitMaxAttempts: 120,\n waitIntervalMs: 2000,\n },\n this.inscriptionSDK,\n );\n\n const topicId = getTopicId(response.inscription);\n if (!topicId) {\n throw new Error(\n 'Failed to inscribe overflow HCS-27 metadata: no topic ID returned',\n );\n }\n\n return `hcs://1/${topicId}`;\n }\n\n private sha256Base64Url(payload: Buffer): string {\n return createHash('sha256').update(payload).digest('base64url');\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,255 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
const HCS26_PROTOCOL = "hcs-26";
|
|
3
|
+
const hcs26TopicTypeEnumSchema = z.union([
|
|
4
|
+
z.literal(0),
|
|
5
|
+
// discovery
|
|
6
|
+
z.literal(1),
|
|
7
|
+
// version
|
|
8
|
+
z.literal(2)
|
|
9
|
+
// reputation (optional)
|
|
10
|
+
]);
|
|
11
|
+
const hcs26OperationEnumSchema = z.union([
|
|
12
|
+
z.literal(0),
|
|
13
|
+
// register
|
|
14
|
+
z.literal(1),
|
|
15
|
+
// update
|
|
16
|
+
z.literal(2),
|
|
17
|
+
// delete
|
|
18
|
+
z.literal(3)
|
|
19
|
+
// migrate
|
|
20
|
+
]);
|
|
21
|
+
const topicIdSchema = z.string().regex(/^[0-9]+\.[0-9]+\.[0-9]+$/);
|
|
22
|
+
const hcs1HrlSchema = z.string().regex(/^hcs:\/\/1\/[0-9]+\.[0-9]+\.[0-9]+$/);
|
|
23
|
+
const decentralizedAssetUriSchema = z.string().regex(
|
|
24
|
+
/^(hcs:\/\/1\/[0-9]+\.[0-9]+\.[0-9]+|ipfs:\/\/\S+|ar:\/\/\S+|ord:\/\/\S+)$/
|
|
25
|
+
);
|
|
26
|
+
const semverSchema = z.string().regex(
|
|
27
|
+
/^v?(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-([0-9A-Za-z.-]+))?(?:\+[0-9A-Za-z.-]+)?$/
|
|
28
|
+
);
|
|
29
|
+
function validateNormalizedRelativePath(pathRaw) {
|
|
30
|
+
const path = pathRaw.trim();
|
|
31
|
+
if (!path) {
|
|
32
|
+
throw new Error("Path must be non-empty");
|
|
33
|
+
}
|
|
34
|
+
if (path.startsWith("/")) {
|
|
35
|
+
throw new Error("Path must be relative");
|
|
36
|
+
}
|
|
37
|
+
if (path.includes("\\")) {
|
|
38
|
+
throw new Error('Path must use "/" separators');
|
|
39
|
+
}
|
|
40
|
+
const segments = path.split("/");
|
|
41
|
+
for (const segment of segments) {
|
|
42
|
+
if (!segment || segment === "." || segment === "..") {
|
|
43
|
+
throw new Error(
|
|
44
|
+
'Path must be normalized (no ".", "..", or empty segments)'
|
|
45
|
+
);
|
|
46
|
+
}
|
|
10
47
|
}
|
|
11
48
|
}
|
|
49
|
+
const hcs1HrlOptionalSchema = z.string().regex(/^hcs:\/\/1\/[0-9]+\.[0-9]+\.[0-9]+$/).optional();
|
|
50
|
+
const discoveryMetadataAuthorSchema = z.union([
|
|
51
|
+
z.string().min(1),
|
|
52
|
+
z.object({
|
|
53
|
+
name: z.string().min(1),
|
|
54
|
+
contact: z.string().min(1).optional(),
|
|
55
|
+
url: z.string().url().optional()
|
|
56
|
+
}).passthrough()
|
|
57
|
+
]);
|
|
58
|
+
const hcs26DiscoveryMetadataSchema = z.object({
|
|
59
|
+
name: z.string().min(1),
|
|
60
|
+
description: z.string().min(1),
|
|
61
|
+
author: discoveryMetadataAuthorSchema,
|
|
62
|
+
license: z.string().min(1),
|
|
63
|
+
tags: z.array(
|
|
64
|
+
z.union([
|
|
65
|
+
z.number().int().positive(),
|
|
66
|
+
z.string().regex(/^(0|[1-9]\d*)$/).transform((value) => Number.parseInt(value, 10))
|
|
67
|
+
])
|
|
68
|
+
).optional(),
|
|
69
|
+
homepage: z.string().url().optional(),
|
|
70
|
+
icon: z.union([z.string().url(), decentralizedAssetUriSchema]).optional(),
|
|
71
|
+
icon_hcs1: hcs1HrlOptionalSchema,
|
|
72
|
+
languages: z.array(z.string().min(1)).optional(),
|
|
73
|
+
capabilities: z.array(z.string().min(1)).optional(),
|
|
74
|
+
repo: z.string().url().optional(),
|
|
75
|
+
commit: z.string().regex(/^[0-9a-f]{7,64}$/i, "commit must be a git commit SHA").optional()
|
|
76
|
+
}).passthrough();
|
|
77
|
+
const hcs26DiscoveryMetadataPatchSchema = hcs26DiscoveryMetadataSchema.partial().passthrough();
|
|
78
|
+
const hcs26DiscoveryRegisterSchema = z.object({
|
|
79
|
+
p: z.literal(HCS26_PROTOCOL),
|
|
80
|
+
op: z.literal("register"),
|
|
81
|
+
t_id: topicIdSchema,
|
|
82
|
+
account_id: z.string().min(1),
|
|
83
|
+
metadata: z.union([hcs26DiscoveryMetadataSchema, hcs1HrlSchema]),
|
|
84
|
+
m: z.string().max(500).optional(),
|
|
85
|
+
sequence_number: z.number().int().optional()
|
|
86
|
+
}).passthrough();
|
|
87
|
+
const hcs26DiscoveryRegisterLegacySchema = z.object({
|
|
88
|
+
p: z.literal(HCS26_PROTOCOL),
|
|
89
|
+
op: z.literal("register"),
|
|
90
|
+
version_registry: topicIdSchema,
|
|
91
|
+
publisher: z.string().min(1),
|
|
92
|
+
metadata: z.union([hcs26DiscoveryMetadataSchema, hcs1HrlSchema]),
|
|
93
|
+
m: z.string().max(500).optional(),
|
|
94
|
+
sequence_number: z.number().int().optional()
|
|
95
|
+
}).passthrough();
|
|
96
|
+
const hcs26DiscoveryUpdateSchema = z.object({
|
|
97
|
+
p: z.literal(HCS26_PROTOCOL),
|
|
98
|
+
op: z.literal("update"),
|
|
99
|
+
uid: z.string().min(1),
|
|
100
|
+
account_id: z.string().min(1).optional(),
|
|
101
|
+
metadata: z.union([hcs26DiscoveryMetadataPatchSchema, hcs1HrlSchema]).optional(),
|
|
102
|
+
m: z.string().max(500).optional(),
|
|
103
|
+
sequence_number: z.number().int().optional()
|
|
104
|
+
}).passthrough();
|
|
105
|
+
const hcs26DiscoveryUpdateLegacySchema = z.object({
|
|
106
|
+
p: z.literal(HCS26_PROTOCOL),
|
|
107
|
+
op: z.literal("update"),
|
|
108
|
+
uid: z.string().min(1),
|
|
109
|
+
publisher: z.string().min(1).optional(),
|
|
110
|
+
metadata: z.union([hcs26DiscoveryMetadataPatchSchema, hcs1HrlSchema]).optional(),
|
|
111
|
+
m: z.string().max(500).optional(),
|
|
112
|
+
sequence_number: z.number().int().optional()
|
|
113
|
+
}).passthrough();
|
|
114
|
+
const hcs26DiscoveryDeleteSchema = z.object({
|
|
115
|
+
p: z.literal(HCS26_PROTOCOL),
|
|
116
|
+
op: z.literal("delete"),
|
|
117
|
+
uid: z.string().min(1),
|
|
118
|
+
m: z.string().max(500).optional(),
|
|
119
|
+
sequence_number: z.number().int().optional()
|
|
120
|
+
}).passthrough();
|
|
121
|
+
const hcs26DiscoveryMigrateSchema = z.object({
|
|
122
|
+
p: z.literal(HCS26_PROTOCOL),
|
|
123
|
+
op: z.literal("migrate"),
|
|
124
|
+
m: z.string().max(500).optional(),
|
|
125
|
+
sequence_number: z.number().int().optional()
|
|
126
|
+
}).passthrough();
|
|
127
|
+
const checksumSchema = z.string().regex(/^sha256:[0-9a-f]{64}$/);
|
|
128
|
+
const hcs26VersionRegisterSchema = z.object({
|
|
129
|
+
p: z.literal(HCS26_PROTOCOL),
|
|
130
|
+
op: z.literal("register"),
|
|
131
|
+
skill_uid: z.number().int().positive(),
|
|
132
|
+
version: semverSchema,
|
|
133
|
+
t_id: topicIdSchema,
|
|
134
|
+
checksum: checksumSchema.optional(),
|
|
135
|
+
status: z.enum(["active", "deprecated", "yanked"]).optional(),
|
|
136
|
+
m: z.string().max(500).optional(),
|
|
137
|
+
sequence_number: z.number().int().optional()
|
|
138
|
+
}).passthrough();
|
|
139
|
+
const hcs26VersionRegisterLegacySchema = z.object({
|
|
140
|
+
p: z.literal(HCS26_PROTOCOL),
|
|
141
|
+
op: z.literal("register"),
|
|
142
|
+
skill_uid: z.number().int().positive(),
|
|
143
|
+
version: semverSchema,
|
|
144
|
+
manifest_hcs1: hcs1HrlSchema,
|
|
145
|
+
checksum: checksumSchema.optional(),
|
|
146
|
+
status: z.enum(["active", "deprecated", "yanked"]).optional(),
|
|
147
|
+
m: z.string().max(500).optional(),
|
|
148
|
+
sequence_number: z.number().int().optional()
|
|
149
|
+
}).passthrough();
|
|
150
|
+
const hcs26VersionUpdateSchema = z.object({
|
|
151
|
+
p: z.literal(HCS26_PROTOCOL),
|
|
152
|
+
op: z.literal("update"),
|
|
153
|
+
uid: z.string().min(1),
|
|
154
|
+
status: z.enum(["active", "deprecated", "yanked"]).optional(),
|
|
155
|
+
m: z.string().max(500).optional(),
|
|
156
|
+
sequence_number: z.number().int().optional()
|
|
157
|
+
}).passthrough();
|
|
158
|
+
const hcs26VersionDeleteSchema = z.object({
|
|
159
|
+
p: z.literal(HCS26_PROTOCOL),
|
|
160
|
+
op: z.literal("delete"),
|
|
161
|
+
uid: z.string().min(1),
|
|
162
|
+
m: z.string().max(500).optional(),
|
|
163
|
+
sequence_number: z.number().int().optional()
|
|
164
|
+
}).passthrough();
|
|
165
|
+
const hcs26VersionMigrateSchema = z.object({
|
|
166
|
+
p: z.literal(HCS26_PROTOCOL),
|
|
167
|
+
op: z.literal("migrate"),
|
|
168
|
+
m: z.string().max(500).optional(),
|
|
169
|
+
sequence_number: z.number().int().optional()
|
|
170
|
+
}).passthrough();
|
|
171
|
+
const hcs26ManifestFileSchema = z.object({
|
|
172
|
+
path: z.string().min(1).superRefine((value, ctx) => {
|
|
173
|
+
try {
|
|
174
|
+
validateNormalizedRelativePath(value);
|
|
175
|
+
} catch (error) {
|
|
176
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
177
|
+
ctx.addIssue({ code: z.ZodIssueCode.custom, message });
|
|
178
|
+
}
|
|
179
|
+
}),
|
|
180
|
+
hrl: hcs1HrlSchema,
|
|
181
|
+
sha256: z.string().regex(/^[0-9a-f]{64}$/),
|
|
182
|
+
mime: z.string().min(1)
|
|
183
|
+
}).passthrough();
|
|
184
|
+
const hcs26SkillManifestSchema = z.object({
|
|
185
|
+
name: z.string().min(1),
|
|
186
|
+
description: z.string().min(1),
|
|
187
|
+
version: semverSchema,
|
|
188
|
+
license: z.string().min(1),
|
|
189
|
+
author: discoveryMetadataAuthorSchema,
|
|
190
|
+
tags: z.array(
|
|
191
|
+
z.union([
|
|
192
|
+
z.number().int().positive(),
|
|
193
|
+
z.string().regex(/^(0|[1-9]\d*)$/).transform((value) => Number.parseInt(value, 10))
|
|
194
|
+
])
|
|
195
|
+
).optional(),
|
|
196
|
+
homepage: z.string().url().optional(),
|
|
197
|
+
languages: z.array(z.string().min(1)).optional(),
|
|
198
|
+
repo: z.string().url().optional(),
|
|
199
|
+
commit: z.string().regex(/^[0-9a-f]{7,64}$/i, "commit must be a git commit SHA").optional(),
|
|
200
|
+
entrypoints: z.array(
|
|
201
|
+
z.object({
|
|
202
|
+
path: z.string().min(1),
|
|
203
|
+
language: z.string().min(1),
|
|
204
|
+
args: z.array(z.string()).optional()
|
|
205
|
+
}).passthrough()
|
|
206
|
+
).optional(),
|
|
207
|
+
files: z.array(hcs26ManifestFileSchema).min(1)
|
|
208
|
+
}).passthrough().superRefine((value, ctx) => {
|
|
209
|
+
const hasSkillMd = value.files.some((file) => file.path === "SKILL.md");
|
|
210
|
+
if (!hasSkillMd) {
|
|
211
|
+
ctx.addIssue({
|
|
212
|
+
code: z.ZodIssueCode.custom,
|
|
213
|
+
message: 'SKILL.md must be present in the manifest files list with path "SKILL.md".',
|
|
214
|
+
path: ["files"]
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
});
|
|
218
|
+
const hcs26DiscoveryMessageSchema = z.union([
|
|
219
|
+
hcs26DiscoveryRegisterSchema,
|
|
220
|
+
hcs26DiscoveryRegisterLegacySchema,
|
|
221
|
+
hcs26DiscoveryUpdateSchema,
|
|
222
|
+
hcs26DiscoveryUpdateLegacySchema,
|
|
223
|
+
hcs26DiscoveryDeleteSchema,
|
|
224
|
+
hcs26DiscoveryMigrateSchema
|
|
225
|
+
]);
|
|
226
|
+
const hcs26VersionMessageSchema = z.union([
|
|
227
|
+
hcs26VersionRegisterSchema,
|
|
228
|
+
hcs26VersionRegisterLegacySchema,
|
|
229
|
+
hcs26VersionUpdateSchema,
|
|
230
|
+
hcs26VersionDeleteSchema,
|
|
231
|
+
hcs26VersionMigrateSchema
|
|
232
|
+
]);
|
|
12
233
|
export {
|
|
13
|
-
|
|
234
|
+
HCS26_PROTOCOL,
|
|
235
|
+
hcs26DiscoveryDeleteSchema,
|
|
236
|
+
hcs26DiscoveryMessageSchema,
|
|
237
|
+
hcs26DiscoveryMetadataPatchSchema,
|
|
238
|
+
hcs26DiscoveryMetadataSchema,
|
|
239
|
+
hcs26DiscoveryMigrateSchema,
|
|
240
|
+
hcs26DiscoveryRegisterLegacySchema,
|
|
241
|
+
hcs26DiscoveryRegisterSchema,
|
|
242
|
+
hcs26DiscoveryUpdateLegacySchema,
|
|
243
|
+
hcs26DiscoveryUpdateSchema,
|
|
244
|
+
hcs26ManifestFileSchema,
|
|
245
|
+
hcs26OperationEnumSchema,
|
|
246
|
+
hcs26SkillManifestSchema,
|
|
247
|
+
hcs26TopicTypeEnumSchema,
|
|
248
|
+
hcs26VersionDeleteSchema,
|
|
249
|
+
hcs26VersionMessageSchema,
|
|
250
|
+
hcs26VersionMigrateSchema,
|
|
251
|
+
hcs26VersionRegisterLegacySchema,
|
|
252
|
+
hcs26VersionRegisterSchema,
|
|
253
|
+
hcs26VersionUpdateSchema
|
|
14
254
|
};
|
|
15
255
|
//# sourceMappingURL=standards-sdk.es117.js.map
|