@hashgraphonline/standards-sdk 0.1.136-fix-hol-env.canary.a285980.31 → 0.1.137-feat-hcs-21.canary.5802d65.32
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/dist/cjs/hcs-21/base-client.d.ts +31 -0
- package/dist/cjs/hcs-21/base-client.d.ts.map +1 -0
- package/dist/cjs/hcs-21/browser.d.ts +20 -0
- package/dist/cjs/hcs-21/browser.d.ts.map +1 -0
- package/dist/cjs/hcs-21/errors.d.ts +6 -0
- package/dist/cjs/hcs-21/errors.d.ts.map +1 -0
- package/dist/cjs/hcs-21/index.d.ts +7 -0
- package/dist/cjs/hcs-21/index.d.ts.map +1 -0
- package/dist/cjs/hcs-21/sdk.d.ts +48 -0
- package/dist/cjs/hcs-21/sdk.d.ts.map +1 -0
- package/dist/cjs/hcs-21/tx.d.ts +20 -0
- package/dist/cjs/hcs-21/tx.d.ts.map +1 -0
- package/dist/cjs/hcs-21/types.d.ts +72 -0
- package/dist/cjs/hcs-21/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/services/types.d.ts +1 -1
- 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/es/hcs-21/base-client.d.ts +31 -0
- package/dist/es/hcs-21/base-client.d.ts.map +1 -0
- package/dist/es/hcs-21/browser.d.ts +20 -0
- package/dist/es/hcs-21/browser.d.ts.map +1 -0
- package/dist/es/hcs-21/errors.d.ts +6 -0
- package/dist/es/hcs-21/errors.d.ts.map +1 -0
- package/dist/es/hcs-21/index.d.ts +7 -0
- package/dist/es/hcs-21/index.d.ts.map +1 -0
- package/dist/es/hcs-21/sdk.d.ts +48 -0
- package/dist/es/hcs-21/sdk.d.ts.map +1 -0
- package/dist/es/hcs-21/tx.d.ts +20 -0
- package/dist/es/hcs-21/tx.d.ts.map +1 -0
- package/dist/es/hcs-21/types.d.ts +72 -0
- package/dist/es/hcs-21/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/services/types.d.ts +1 -1
- package/dist/es/services/types.d.ts.map +1 -1
- package/dist/es/standards-sdk.es.js +66 -48
- 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 +231 -28
- package/dist/es/standards-sdk.es100.js.map +1 -1
- package/dist/es/standards-sdk.es101.js +109 -18
- package/dist/es/standards-sdk.es101.js.map +1 -1
- package/dist/es/standards-sdk.es102.js +32 -158
- package/dist/es/standards-sdk.es102.js.map +1 -1
- package/dist/es/standards-sdk.es103.js +80 -204
- package/dist/es/standards-sdk.es103.js.map +1 -1
- package/dist/es/standards-sdk.es104.js +21 -780
- package/dist/es/standards-sdk.es104.js.map +1 -1
- package/dist/es/standards-sdk.es105.js +140 -11
- package/dist/es/standards-sdk.es105.js.map +1 -1
- package/dist/es/standards-sdk.es106.js +29 -567
- package/dist/es/standards-sdk.es106.js.map +1 -1
- package/dist/es/standards-sdk.es107.js +17 -597
- package/dist/es/standards-sdk.es107.js.map +1 -1
- package/dist/es/standards-sdk.es108.js +159 -12
- package/dist/es/standards-sdk.es108.js.map +1 -1
- package/dist/es/standards-sdk.es109.js +208 -2
- package/dist/es/standards-sdk.es109.js.map +1 -1
- package/dist/es/standards-sdk.es110.js +774 -67
- package/dist/es/standards-sdk.es110.js.map +1 -1
- package/dist/es/standards-sdk.es111.js +11 -37
- package/dist/es/standards-sdk.es111.js.map +1 -1
- package/dist/es/standards-sdk.es112.js +567 -2
- package/dist/es/standards-sdk.es112.js.map +1 -1
- package/dist/es/standards-sdk.es113.js +576 -197
- package/dist/es/standards-sdk.es113.js.map +1 -1
- package/dist/es/standards-sdk.es114.js +12 -1139
- package/dist/es/standards-sdk.es114.js.map +1 -1
- package/dist/es/standards-sdk.es115.js +2 -306
- package/dist/es/standards-sdk.es115.js.map +1 -1
- package/dist/es/standards-sdk.es116.js +79 -418
- package/dist/es/standards-sdk.es116.js.map +1 -1
- package/dist/es/standards-sdk.es117.js +35 -351
- package/dist/es/standards-sdk.es117.js.map +1 -1
- package/dist/es/standards-sdk.es118.js +2 -761
- package/dist/es/standards-sdk.es118.js.map +1 -1
- package/dist/es/standards-sdk.es119.js +204 -185
- 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 +1055 -1482
- package/dist/es/standards-sdk.es120.js.map +1 -1
- package/dist/es/standards-sdk.es121.js +265 -2042
- package/dist/es/standards-sdk.es121.js.map +1 -1
- package/dist/es/standards-sdk.es122.js +420 -50
- package/dist/es/standards-sdk.es122.js.map +1 -1
- package/dist/es/standards-sdk.es123.js +350 -82
- package/dist/es/standards-sdk.es123.js.map +1 -1
- package/dist/es/standards-sdk.es124.js +741 -139
- package/dist/es/standards-sdk.es124.js.map +1 -1
- package/dist/es/standards-sdk.es125.js +204 -7
- package/dist/es/standards-sdk.es125.js.map +1 -1
- package/dist/es/standards-sdk.es126.js +1533 -52
- package/dist/es/standards-sdk.es126.js.map +1 -1
- package/dist/es/standards-sdk.es127.js +2077 -59
- package/dist/es/standards-sdk.es127.js.map +1 -1
- package/dist/es/standards-sdk.es128.js +52 -28
- package/dist/es/standards-sdk.es128.js.map +1 -1
- package/dist/es/standards-sdk.es129.js +85 -692
- 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 +135 -12250
- package/dist/es/standards-sdk.es130.js.map +1 -1
- package/dist/es/standards-sdk.es131.js +7 -138
- package/dist/es/standards-sdk.es131.js.map +1 -1
- package/dist/es/standards-sdk.es132.js +80 -36
- package/dist/es/standards-sdk.es132.js.map +1 -1
- package/dist/es/standards-sdk.es133.js +58 -49
- package/dist/es/standards-sdk.es133.js.map +1 -1
- package/dist/es/standards-sdk.es134.js +28 -64
- package/dist/es/standards-sdk.es134.js.map +1 -1
- package/dist/es/standards-sdk.es135.js +118 -152
- package/dist/es/standards-sdk.es135.js.map +1 -1
- package/dist/es/standards-sdk.es136.js +34 -314
- package/dist/es/standards-sdk.es136.js.map +1 -1
- package/dist/es/standards-sdk.es137.js +694 -346
- package/dist/es/standards-sdk.es137.js.map +1 -1
- package/dist/es/standards-sdk.es138.js +12216 -395
- package/dist/es/standards-sdk.es138.js.map +1 -1
- package/dist/es/standards-sdk.es139.js +55 -330
- 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 +50 -62
- package/dist/es/standards-sdk.es140.js.map +1 -1
- package/dist/es/standards-sdk.es141.js +168 -13
- package/dist/es/standards-sdk.es141.js.map +1 -1
- package/dist/es/standards-sdk.es142.js +325 -0
- package/dist/es/standards-sdk.es142.js.map +1 -0
- package/dist/es/standards-sdk.es143.js +349 -0
- package/dist/es/standards-sdk.es143.js.map +1 -0
- package/dist/es/standards-sdk.es144.js +456 -0
- package/dist/es/standards-sdk.es144.js.map +1 -0
- package/dist/es/standards-sdk.es145.js +334 -0
- package/dist/es/standards-sdk.es145.js.map +1 -0
- package/dist/es/standards-sdk.es146.js +79 -0
- package/dist/es/standards-sdk.es146.js.map +1 -0
- package/dist/es/standards-sdk.es147.js +20 -0
- package/dist/es/standards-sdk.es147.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 -5
- package/dist/es/standards-sdk.es19.js +12 -12
- package/dist/es/standards-sdk.es20.js +9 -9
- 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 +12 -12
- 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 +6 -6
- 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 +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.es61.js +7 -7
- package/dist/es/standards-sdk.es63.js +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.es75.js +2 -2
- package/dist/es/standards-sdk.es77.js +2 -2
- package/dist/es/standards-sdk.es78.js +4 -4
- 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 +25 -27
- package/dist/es/standards-sdk.es80.js.map +1 -1
- package/dist/es/standards-sdk.es81.js +6 -78
- package/dist/es/standards-sdk.es81.js.map +1 -1
- package/dist/es/standards-sdk.es82.js +27 -64
- package/dist/es/standards-sdk.es82.js.map +1 -1
- package/dist/es/standards-sdk.es83.js +67 -23
- package/dist/es/standards-sdk.es83.js.map +1 -1
- package/dist/es/standards-sdk.es84.js +165 -23
- package/dist/es/standards-sdk.es84.js.map +1 -1
- package/dist/es/standards-sdk.es85.js +31 -166
- package/dist/es/standards-sdk.es85.js.map +1 -1
- package/dist/es/standards-sdk.es86.js +24 -127
- package/dist/es/standards-sdk.es86.js.map +1 -1
- package/dist/es/standards-sdk.es87.js +65 -142
- package/dist/es/standards-sdk.es87.js.map +1 -1
- package/dist/es/standards-sdk.es88.js +52 -127
- package/dist/es/standards-sdk.es88.js.map +1 -1
- package/dist/es/standards-sdk.es89.js +26 -41
- package/dist/es/standards-sdk.es89.js.map +1 -1
- package/dist/es/standards-sdk.es90.js +23 -261
- package/dist/es/standards-sdk.es90.js.map +1 -1
- package/dist/es/standards-sdk.es91.js +162 -93
- package/dist/es/standards-sdk.es91.js.map +1 -1
- package/dist/es/standards-sdk.es92.js +112 -83
- package/dist/es/standards-sdk.es92.js.map +1 -1
- package/dist/es/standards-sdk.es93.js +156 -28
- package/dist/es/standards-sdk.es93.js.map +1 -1
- package/dist/es/standards-sdk.es94.js +133 -225
- package/dist/es/standards-sdk.es94.js.map +1 -1
- package/dist/es/standards-sdk.es95.js +40 -108
- package/dist/es/standards-sdk.es95.js.map +1 -1
- package/dist/es/standards-sdk.es96.js +253 -24
- package/dist/es/standards-sdk.es96.js.map +1 -1
- package/dist/es/standards-sdk.es97.js +96 -80
- package/dist/es/standards-sdk.es97.js.map +1 -1
- package/dist/es/standards-sdk.es98.js +91 -21
- package/dist/es/standards-sdk.es98.js.map +1 -1
- package/dist/es/standards-sdk.es99.js +28 -141
- package/dist/es/standards-sdk.es99.js.map +1 -1
- package/package.json +2 -1
|
@@ -1,235 +1,143 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
function isArrayOfStrings(value) {
|
|
22
|
-
return Array.isArray(value) && value.every(isString);
|
|
23
|
-
}
|
|
24
|
-
function isDiscoveryMessage(value) {
|
|
25
|
-
if (!isRecord(value)) {
|
|
26
|
-
return false;
|
|
27
|
-
}
|
|
28
|
-
if (value.p !== "hcs-18") {
|
|
29
|
-
return false;
|
|
30
|
-
}
|
|
31
|
-
if (!isString(value.op)) {
|
|
32
|
-
return false;
|
|
33
|
-
}
|
|
34
|
-
const op = value.op;
|
|
35
|
-
if (!["announce", "propose", "respond", "complete", "withdraw"].includes(op)) {
|
|
36
|
-
return false;
|
|
37
|
-
}
|
|
38
|
-
return "data" in value;
|
|
39
|
-
}
|
|
40
|
-
function isAnnounceMessage(value) {
|
|
41
|
-
if (!isDiscoveryMessage(value)) {
|
|
42
|
-
return false;
|
|
43
|
-
}
|
|
44
|
-
const v = value;
|
|
45
|
-
if (v.op !== "announce") {
|
|
46
|
-
return false;
|
|
47
|
-
}
|
|
48
|
-
if (!isRecord(v.data)) {
|
|
49
|
-
return false;
|
|
50
|
-
}
|
|
51
|
-
const d = v.data;
|
|
52
|
-
if (!isString(d.account)) {
|
|
53
|
-
return false;
|
|
54
|
-
}
|
|
55
|
-
if (!isRecord(d.petal)) {
|
|
56
|
-
return false;
|
|
57
|
-
}
|
|
58
|
-
const petal = d.petal;
|
|
59
|
-
if (!isString(petal.name) || !isNumber(petal.priority)) {
|
|
60
|
-
return false;
|
|
61
|
-
}
|
|
62
|
-
if (!isRecord(d.capabilities)) {
|
|
63
|
-
return false;
|
|
64
|
-
}
|
|
65
|
-
const caps = d.capabilities;
|
|
66
|
-
if (!isArrayOfStrings(caps.protocols)) {
|
|
67
|
-
return false;
|
|
68
|
-
}
|
|
69
|
-
if ("valid_for" in d && d.valid_for !== void 0 && d.valid_for !== null && !isNumber(d.valid_for)) {
|
|
70
|
-
return false;
|
|
71
|
-
}
|
|
72
|
-
return true;
|
|
73
|
-
}
|
|
74
|
-
function isProposeMessage(value) {
|
|
75
|
-
if (!isDiscoveryMessage(value)) {
|
|
76
|
-
return false;
|
|
77
|
-
}
|
|
78
|
-
const v = value;
|
|
79
|
-
if (v.op !== "propose") {
|
|
80
|
-
return false;
|
|
81
|
-
}
|
|
82
|
-
if (!isRecord(v.data)) {
|
|
83
|
-
return false;
|
|
84
|
-
}
|
|
85
|
-
const d = v.data;
|
|
86
|
-
if (!isString(d.proposer)) {
|
|
87
|
-
return false;
|
|
88
|
-
}
|
|
89
|
-
if (!isArray(d.members)) {
|
|
90
|
-
return false;
|
|
1
|
+
import { HederaMirrorNode } from "./standards-sdk.es126.js";
|
|
2
|
+
import { KeyList } from "@hashgraph/sdk";
|
|
3
|
+
import { buildHcs16CreateFloraTopicTx } from "./standards-sdk.es91.js";
|
|
4
|
+
import { Logger } from "./standards-sdk.es105.js";
|
|
5
|
+
import { FloraTopicType } from "./standards-sdk.es90.js";
|
|
6
|
+
class HCS16BaseClient {
|
|
7
|
+
constructor(params) {
|
|
8
|
+
this.network = params.network;
|
|
9
|
+
this.logger = params.logger || new Logger({ level: "info", module: "HCS-16" });
|
|
10
|
+
this.mirrorNode = new HederaMirrorNode(this.network, this.logger, {
|
|
11
|
+
customUrl: params.mirrorNodeUrl
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
async assembleKeyList(params) {
|
|
15
|
+
const keys = [];
|
|
16
|
+
for (const accountId of params.members) {
|
|
17
|
+
const pub = await this.mirrorNode.getPublicKey(accountId);
|
|
18
|
+
keys.push(pub);
|
|
19
|
+
}
|
|
20
|
+
return new KeyList(keys, params.threshold);
|
|
91
21
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
22
|
+
async assembleSubmitKeyList(members) {
|
|
23
|
+
const keys = [];
|
|
24
|
+
for (const accountId of members) {
|
|
25
|
+
const pub = await this.mirrorNode.getPublicKey(accountId);
|
|
26
|
+
keys.push(pub);
|
|
95
27
|
}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
28
|
+
return new KeyList(keys, 1);
|
|
29
|
+
}
|
|
30
|
+
buildFloraTopicCreateTxs(params) {
|
|
31
|
+
const communication = buildHcs16CreateFloraTopicTx({
|
|
32
|
+
floraAccountId: params.floraAccountId,
|
|
33
|
+
topicType: FloraTopicType.COMMUNICATION,
|
|
34
|
+
adminKey: params.keyList,
|
|
35
|
+
submitKey: params.submitList,
|
|
36
|
+
autoRenewAccountId: params.autoRenewAccountId
|
|
37
|
+
});
|
|
38
|
+
const transaction = buildHcs16CreateFloraTopicTx({
|
|
39
|
+
floraAccountId: params.floraAccountId,
|
|
40
|
+
topicType: FloraTopicType.TRANSACTION,
|
|
41
|
+
adminKey: params.keyList,
|
|
42
|
+
submitKey: params.submitList,
|
|
43
|
+
autoRenewAccountId: params.autoRenewAccountId
|
|
44
|
+
});
|
|
45
|
+
const state = buildHcs16CreateFloraTopicTx({
|
|
46
|
+
floraAccountId: params.floraAccountId,
|
|
47
|
+
topicType: FloraTopicType.STATE,
|
|
48
|
+
adminKey: params.keyList,
|
|
49
|
+
submitKey: params.submitList,
|
|
50
|
+
autoRenewAccountId: params.autoRenewAccountId
|
|
51
|
+
});
|
|
52
|
+
return { communication, transaction, state };
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Parse an HCS‑16 Flora topic memo of the form `hcs-16:<floraAccountId>:<topicType>`.
|
|
56
|
+
*/
|
|
57
|
+
parseTopicMemo(memo) {
|
|
58
|
+
const match = memo.match(/^hcs-16:([0-9.]+):(\d)$/);
|
|
59
|
+
if (!match) {
|
|
60
|
+
return null;
|
|
99
61
|
}
|
|
100
|
-
|
|
101
|
-
|
|
62
|
+
return {
|
|
63
|
+
protocol: "hcs-16",
|
|
64
|
+
floraAccountId: match[1],
|
|
65
|
+
topicType: Number(match[2])
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Build a Flora message envelope by merging an operation body into the HCS‑16 envelope.
|
|
70
|
+
*/
|
|
71
|
+
createFloraMessage(op, operatorId, body) {
|
|
72
|
+
const payload = {
|
|
73
|
+
p: "hcs-16",
|
|
74
|
+
op,
|
|
75
|
+
operator_id: operatorId,
|
|
76
|
+
...body || {}
|
|
77
|
+
};
|
|
78
|
+
return payload;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Fetch recent HCS‑16 messages from a topic via Mirror Node.
|
|
82
|
+
*/
|
|
83
|
+
async getRecentMessages(topicId, options) {
|
|
84
|
+
const limit = options?.limit ?? 25;
|
|
85
|
+
const order = options?.order ?? "desc";
|
|
86
|
+
const items = await this.mirrorNode.getTopicMessages(topicId, { limit, order });
|
|
87
|
+
const results = [];
|
|
88
|
+
for (const raw of items) {
|
|
89
|
+
if (raw.p !== "hcs-16") {
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
const {
|
|
93
|
+
consensus_timestamp,
|
|
94
|
+
sequence_number,
|
|
95
|
+
running_hash,
|
|
96
|
+
running_hash_version,
|
|
97
|
+
topic_id,
|
|
98
|
+
payer,
|
|
99
|
+
created,
|
|
100
|
+
chunk_info,
|
|
101
|
+
...payload
|
|
102
|
+
} = raw;
|
|
103
|
+
const op = payload.op;
|
|
104
|
+
const operatorId = payload.operator_id;
|
|
105
|
+
if (options?.opFilter && op !== options.opFilter) {
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
if (typeof operatorId !== "string") {
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
const message = payload;
|
|
112
|
+
results.push({
|
|
113
|
+
message,
|
|
114
|
+
consensus_timestamp,
|
|
115
|
+
sequence_number: Number(sequence_number),
|
|
116
|
+
payer
|
|
117
|
+
});
|
|
102
118
|
}
|
|
103
|
-
|
|
104
|
-
|
|
119
|
+
return results;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Return the latest valid HCS‑16 message on a topic, if any.
|
|
123
|
+
*/
|
|
124
|
+
async getLatestMessage(topicId, opFilter) {
|
|
125
|
+
const items = await this.getRecentMessages(topicId, {
|
|
126
|
+
limit: 1,
|
|
127
|
+
order: "desc",
|
|
128
|
+
opFilter
|
|
129
|
+
});
|
|
130
|
+
if (items.length === 0) {
|
|
131
|
+
return null;
|
|
105
132
|
}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
if (!isRecord(d.config)) {
|
|
112
|
-
return false;
|
|
113
|
-
}
|
|
114
|
-
const cfg = d.config;
|
|
115
|
-
if (!isString(cfg.name) || !isNumber(cfg.threshold)) {
|
|
116
|
-
return false;
|
|
133
|
+
const first = items[0];
|
|
134
|
+
return Object.assign({}, first.message, {
|
|
135
|
+
consensus_timestamp: first.consensus_timestamp,
|
|
136
|
+
sequence_number: first.sequence_number
|
|
137
|
+
});
|
|
117
138
|
}
|
|
118
|
-
return true;
|
|
119
139
|
}
|
|
120
|
-
function isRespondMessage(value) {
|
|
121
|
-
if (!isDiscoveryMessage(value)) {
|
|
122
|
-
return false;
|
|
123
|
-
}
|
|
124
|
-
const v = value;
|
|
125
|
-
if (v.op !== "respond") {
|
|
126
|
-
return false;
|
|
127
|
-
}
|
|
128
|
-
if (!isRecord(v.data)) {
|
|
129
|
-
return false;
|
|
130
|
-
}
|
|
131
|
-
const d = v.data;
|
|
132
|
-
if (!isString(d.responder)) {
|
|
133
|
-
return false;
|
|
134
|
-
}
|
|
135
|
-
if (!isNumber(d.proposal_seq)) {
|
|
136
|
-
return false;
|
|
137
|
-
}
|
|
138
|
-
if (!isString(d.decision)) {
|
|
139
|
-
return false;
|
|
140
|
-
}
|
|
141
|
-
if (!["accept", "reject"].includes(d.decision)) {
|
|
142
|
-
return false;
|
|
143
|
-
}
|
|
144
|
-
return true;
|
|
145
|
-
}
|
|
146
|
-
function isCompleteMessage(value) {
|
|
147
|
-
if (!isDiscoveryMessage(value)) {
|
|
148
|
-
return false;
|
|
149
|
-
}
|
|
150
|
-
const v = value;
|
|
151
|
-
if (v.op !== "complete") {
|
|
152
|
-
return false;
|
|
153
|
-
}
|
|
154
|
-
if (!isRecord(v.data)) {
|
|
155
|
-
return false;
|
|
156
|
-
}
|
|
157
|
-
const d = v.data;
|
|
158
|
-
if (!isString(d.proposer)) {
|
|
159
|
-
return false;
|
|
160
|
-
}
|
|
161
|
-
if (!isNumber(d.proposal_seq)) {
|
|
162
|
-
return false;
|
|
163
|
-
}
|
|
164
|
-
if (!isString(d.flora_account)) {
|
|
165
|
-
return false;
|
|
166
|
-
}
|
|
167
|
-
if (!isRecord(d.topics)) {
|
|
168
|
-
return false;
|
|
169
|
-
}
|
|
170
|
-
const t = d.topics;
|
|
171
|
-
if (!isString(t.communication) || !isString(t.transaction) || !isString(t.state)) {
|
|
172
|
-
return false;
|
|
173
|
-
}
|
|
174
|
-
return true;
|
|
175
|
-
}
|
|
176
|
-
function isWithdrawMessage(value) {
|
|
177
|
-
if (!isDiscoveryMessage(value)) {
|
|
178
|
-
return false;
|
|
179
|
-
}
|
|
180
|
-
const v = value;
|
|
181
|
-
if (v.op !== "withdraw") {
|
|
182
|
-
return false;
|
|
183
|
-
}
|
|
184
|
-
if (!isRecord(v.data)) {
|
|
185
|
-
return false;
|
|
186
|
-
}
|
|
187
|
-
const d = v.data;
|
|
188
|
-
if (!isString(d.account)) {
|
|
189
|
-
return false;
|
|
190
|
-
}
|
|
191
|
-
if (!isNumber(d.announce_seq)) {
|
|
192
|
-
return false;
|
|
193
|
-
}
|
|
194
|
-
if ("reason" in d && d.reason !== void 0 && d.reason !== null && !isString(d.reason)) {
|
|
195
|
-
return false;
|
|
196
|
-
}
|
|
197
|
-
return true;
|
|
198
|
-
}
|
|
199
|
-
var DiscoveryState = /* @__PURE__ */ ((DiscoveryState2) => {
|
|
200
|
-
DiscoveryState2["IDLE"] = "idle";
|
|
201
|
-
DiscoveryState2["ANNOUNCED"] = "announced";
|
|
202
|
-
DiscoveryState2["PROPOSING"] = "proposing";
|
|
203
|
-
DiscoveryState2["FORMING"] = "forming";
|
|
204
|
-
DiscoveryState2["ACTIVE"] = "active";
|
|
205
|
-
DiscoveryState2["WITHDRAWN"] = "withdrawn";
|
|
206
|
-
return DiscoveryState2;
|
|
207
|
-
})(DiscoveryState || {});
|
|
208
|
-
class DiscoveryError extends Error {
|
|
209
|
-
constructor(message, code) {
|
|
210
|
-
super(message);
|
|
211
|
-
this.code = code;
|
|
212
|
-
this.name = "DiscoveryError";
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
const DiscoveryErrorCodes = {
|
|
216
|
-
INVALID_MESSAGE: "INVALID_MESSAGE",
|
|
217
|
-
TIMEOUT: "TIMEOUT",
|
|
218
|
-
INSUFFICIENT_PETALS: "INSUFFICIENT_PETALS",
|
|
219
|
-
FLORA_CREATION_FAILED: "FLORA_CREATION_FAILED",
|
|
220
|
-
ALREADY_IN_DISCOVERY: "ALREADY_IN_DISCOVERY",
|
|
221
|
-
INVALID_STATE: "INVALID_STATE"
|
|
222
|
-
};
|
|
223
140
|
export {
|
|
224
|
-
|
|
225
|
-
DiscoveryErrorCodes,
|
|
226
|
-
DiscoveryOperation,
|
|
227
|
-
DiscoveryState,
|
|
228
|
-
isAnnounceMessage,
|
|
229
|
-
isCompleteMessage,
|
|
230
|
-
isDiscoveryMessage,
|
|
231
|
-
isProposeMessage,
|
|
232
|
-
isRespondMessage,
|
|
233
|
-
isWithdrawMessage
|
|
141
|
+
HCS16BaseClient
|
|
234
142
|
};
|
|
235
143
|
//# sourceMappingURL=standards-sdk.es94.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standards-sdk.es94.js","sources":["../../src/hcs-18/types.ts"],"sourcesContent":["/**\n * HCS-18 Flora Discovery Protocol Types\n * Standard for Flora discovery and formation\n */\n\nimport { TopicId } from '@hashgraph/sdk';\n\n/**\n * HCS-18 Operation types\n */\nexport enum DiscoveryOperation {\n ANNOUNCE = 'announce',\n PROPOSE = 'propose',\n RESPOND = 'respond',\n COMPLETE = 'complete',\n WITHDRAW = 'withdraw',\n}\n\n/**\n * Base HCS-18 message structure\n */\nexport interface DiscoveryMessage {\n p: 'hcs-18';\n op: DiscoveryOperation;\n data: any;\n}\n\n/**\n * Announce operation data\n */\nexport interface AnnounceData {\n account: string;\n petal: {\n name: string;\n priority: number;\n };\n capabilities: {\n protocols: string[];\n resources?: {\n compute?: 'high' | 'medium' | 'low';\n storage?: 'high' | 'medium' | 'low';\n bandwidth?: 'high' | 'medium' | 'low';\n };\n group_preferences?: {\n sizes?: number[];\n threshold_ratios?: number[];\n };\n };\n valid_for?: number;\n}\n\n/**\n * Propose operation data\n */\nexport interface ProposeData {\n proposer: string;\n members: Array<{\n account: string;\n announce_seq?: number;\n priority: number;\n status?: 'existing' | 'proposed';\n }>;\n config: {\n name: string;\n threshold: number;\n purpose?: string;\n reason?: string;\n };\n existing_flora?: string;\n}\n\n/**\n * Respond operation data\n */\nexport interface RespondData {\n responder: string;\n proposal_seq: number;\n decision: 'accept' | 'reject';\n reason?: string;\n accepted_seq?: number;\n}\n\n/**\n * Complete operation data\n */\nexport interface CompleteData {\n proposal_seq: number;\n flora_account: string;\n topics: {\n communication: string;\n transaction: string;\n state: string;\n };\n proposer?: string;\n}\n\n/**\n * Withdraw operation data\n */\nexport interface WithdrawData {\n account: string;\n announce_seq: number;\n reason?: string;\n}\n\n/**\n * Typed message operations\n */\nexport interface AnnounceMessage extends DiscoveryMessage {\n op: DiscoveryOperation.ANNOUNCE;\n data: AnnounceData;\n}\n\nexport interface ProposeMessage extends DiscoveryMessage {\n op: DiscoveryOperation.PROPOSE;\n data: ProposeData;\n}\n\nexport interface RespondMessage extends DiscoveryMessage {\n op: DiscoveryOperation.RESPOND;\n data: RespondData;\n}\n\nexport interface CompleteMessage extends DiscoveryMessage {\n op: DiscoveryOperation.COMPLETE;\n data: CompleteData;\n}\n\nexport interface WithdrawMessage extends DiscoveryMessage {\n op: DiscoveryOperation.WITHDRAW;\n data: WithdrawData;\n}\n\n/**\n * Type guard utilities for HCS-18 discovery messages\n */\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction isString(value: unknown): value is string {\n return typeof value === 'string';\n}\n\nfunction isNumber(value: unknown): value is number {\n return typeof value === 'number' && Number.isFinite(value);\n}\n\nfunction isArray(value: unknown): value is unknown[] {\n return Array.isArray(value);\n}\n\nfunction isArrayOfStrings(value: unknown): value is string[] {\n return Array.isArray(value) && value.every(isString);\n}\n\nexport function isDiscoveryMessage(value: unknown): value is DiscoveryMessage {\n if (!isRecord(value)) {\n return false;\n }\n if (value.p !== 'hcs-18') {\n return false;\n }\n if (!isString((value as Record<string, unknown>).op)) {\n return false;\n }\n const op = (value as Record<string, unknown>).op as string;\n if (\n !['announce', 'propose', 'respond', 'complete', 'withdraw'].includes(op)\n ) {\n return false;\n }\n return 'data' in value;\n}\n\nexport function isAnnounceMessage(value: unknown): value is AnnounceMessage {\n if (!isDiscoveryMessage(value)) {\n return false;\n }\n const v = value as DiscoveryMessage;\n if (v.op !== DiscoveryOperation.ANNOUNCE) {\n return false;\n }\n if (!isRecord(v.data)) {\n return false;\n }\n const d = v.data as Record<string, unknown>;\n if (!isString(d.account)) {\n return false;\n }\n if (!isRecord(d.petal)) {\n return false;\n }\n const petal = d.petal as Record<string, unknown>;\n if (!isString(petal.name) || !isNumber(petal.priority)) {\n return false;\n }\n if (!isRecord(d.capabilities)) {\n return false;\n }\n const caps = d.capabilities as Record<string, unknown>;\n if (!isArrayOfStrings(caps.protocols)) {\n return false;\n }\n if (\n 'valid_for' in d &&\n d.valid_for !== undefined &&\n d.valid_for !== null &&\n !isNumber(d.valid_for)\n ) {\n return false;\n }\n return true;\n}\n\nexport function isProposeMessage(value: unknown): value is ProposeMessage {\n if (!isDiscoveryMessage(value)) {\n return false;\n }\n const v = value as DiscoveryMessage;\n if (v.op !== DiscoveryOperation.PROPOSE) {\n return false;\n }\n if (!isRecord(v.data)) {\n return false;\n }\n const d = v.data as Record<string, unknown>;\n if (!isString(d.proposer)) {\n return false;\n }\n if (!isArray(d.members)) {\n return false;\n }\n const membersOk = (d.members as unknown[]).every(m => {\n if (!isRecord(m)) {\n return false;\n }\n const mr = m as Record<string, unknown>;\n if (!isString(mr.account)) {\n return false;\n }\n if (!('priority' in mr) || !isNumber(mr.priority)) {\n return false;\n }\n if (\n 'announce_seq' in mr &&\n mr.announce_seq !== undefined &&\n mr.announce_seq !== null &&\n !isNumber(mr.announce_seq)\n ) {\n return false;\n }\n return true;\n });\n if (!membersOk) {\n return false;\n }\n if (!isRecord(d.config)) {\n return false;\n }\n const cfg = d.config as Record<string, unknown>;\n if (!isString(cfg.name) || !isNumber(cfg.threshold)) {\n return false;\n }\n return true;\n}\n\nexport function isRespondMessage(value: unknown): value is RespondMessage {\n if (!isDiscoveryMessage(value)) {\n return false;\n }\n const v = value as DiscoveryMessage;\n if (v.op !== DiscoveryOperation.RESPOND) {\n return false;\n }\n if (!isRecord(v.data)) {\n return false;\n }\n const d = v.data as Record<string, unknown>;\n if (!isString(d.responder)) {\n return false;\n }\n if (!isNumber(d.proposal_seq)) {\n return false;\n }\n if (!isString(d.decision)) {\n return false;\n }\n if (!['accept', 'reject'].includes(d.decision as string)) {\n return false;\n }\n return true;\n}\n\nexport function isCompleteMessage(value: unknown): value is CompleteMessage {\n if (!isDiscoveryMessage(value)) {\n return false;\n }\n const v = value as DiscoveryMessage;\n if (v.op !== DiscoveryOperation.COMPLETE) {\n return false;\n }\n if (!isRecord(v.data)) {\n return false;\n }\n const d = v.data as Record<string, unknown>;\n if (!isString(d.proposer)) {\n return false;\n }\n if (!isNumber(d.proposal_seq)) {\n return false;\n }\n if (!isString(d.flora_account)) {\n return false;\n }\n if (!isRecord(d.topics)) {\n return false;\n }\n const t = d.topics as Record<string, unknown>;\n if (\n !isString(t.communication) ||\n !isString(t.transaction) ||\n !isString(t.state)\n ) {\n return false;\n }\n return true;\n}\n\nexport function isWithdrawMessage(value: unknown): value is WithdrawMessage {\n if (!isDiscoveryMessage(value)) {\n return false;\n }\n const v = value as DiscoveryMessage;\n if (v.op !== DiscoveryOperation.WITHDRAW) {\n return false;\n }\n if (!isRecord(v.data)) {\n return false;\n }\n const d = v.data as Record<string, unknown>;\n if (!isString(d.account)) {\n return false;\n }\n if (!isNumber(d.announce_seq)) {\n return false;\n }\n if (\n 'reason' in d &&\n d.reason !== undefined &&\n d.reason !== null &&\n !isString(d.reason)\n ) {\n return false;\n }\n return true;\n}\n\n/**\n * Discovery phase states\n */\nexport enum DiscoveryState {\n IDLE = 'idle',\n ANNOUNCED = 'announced',\n PROPOSING = 'proposing',\n FORMING = 'forming',\n ACTIVE = 'active',\n WITHDRAWN = 'withdrawn',\n}\n\n/**\n * Tracked announcement with HCS metadata\n */\nexport interface TrackedAnnouncement {\n account: string;\n sequenceNumber: number;\n consensusTimestamp: string;\n data: AnnounceData;\n}\n\n/**\n * Tracked proposal with HCS metadata\n */\nexport interface TrackedProposal {\n sequenceNumber: number;\n consensusTimestamp: string;\n proposer: string;\n data: ProposeData;\n responses: Map<string, RespondData>;\n}\n\n/**\n * Flora formation result\n */\nexport interface FloraFormation {\n proposalSeq: number;\n floraAccountId: string;\n topics: {\n communication: string;\n transaction: string;\n state: string;\n };\n members: Array<{\n account: string;\n priority: number;\n }>;\n threshold: number;\n createdAt: Date;\n}\n\n/**\n * Discovery event types for monitoring\n */\nexport interface DiscoveryEvent {\n type:\n | 'announcement_received'\n | 'proposal_received'\n | 'response_received'\n | 'formation_complete'\n | 'withdrawal_received'\n | 'discovery_timeout';\n sequenceNumber?: number;\n timestamp: Date;\n data: any;\n}\n\n/**\n * Discovery configuration\n */\nexport interface DiscoveryConfig {\n discoveryTopicId: string | TopicId;\n accountId: string;\n petalName: string;\n priority: number;\n capabilities: {\n protocols: string[];\n resources?: AnnounceData['capabilities']['resources'];\n group_preferences?: AnnounceData['capabilities']['group_preferences'];\n };\n autoAcceptFilter?: (proposal: TrackedProposal) => boolean;\n onDiscoveryEvent?: (event: DiscoveryEvent) => void;\n memberPrivateKeys?: Map<string, string>;\n}\n\n/**\n * HCS-18 Errors\n */\nexport class DiscoveryError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n ) {\n super(message);\n this.name = 'DiscoveryError';\n }\n}\n\nexport const DiscoveryErrorCodes = {\n INVALID_MESSAGE: 'INVALID_MESSAGE',\n TIMEOUT: 'TIMEOUT',\n INSUFFICIENT_PETALS: 'INSUFFICIENT_PETALS',\n FLORA_CREATION_FAILED: 'FLORA_CREATION_FAILED',\n ALREADY_IN_DISCOVERY: 'ALREADY_IN_DISCOVERY',\n INVALID_STATE: 'INVALID_STATE',\n} as const;\n"],"names":["DiscoveryOperation","DiscoveryState"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"standards-sdk.es94.js","sources":["../../src/hcs-16/base-client.ts"],"sourcesContent":["import { HederaMirrorNode } from '../services/mirror-node';\nimport { KeyList, TopicCreateTransaction, PublicKey } from '@hashgraph/sdk';\nimport { buildHcs16CreateFloraTopicTx } from './tx';\nimport { Logger, ILogger } from '../utils/logger';\nimport { NetworkType } from '../utils/types';\nimport { FloraTopicType, FloraMessage, FloraOperation } from './types';\nimport type { HCSMessageWithCommonFields } from '../services/types';\n\n/**\n * Base client for HCS‑16 functionality. Provides logging, mirror‑node access,\n * memo helpers, and light message utilities shared by Node and Browser clients.\n */\nexport class HCS16BaseClient {\n protected readonly network: NetworkType;\n public mirrorNode: HederaMirrorNode;\n protected readonly logger: ILogger;\n\n constructor(params: {\n network: NetworkType;\n logger?: ILogger;\n mirrorNodeUrl?: string;\n }) {\n this.network = params.network;\n this.logger =\n params.logger || new Logger({ level: 'info', module: 'HCS-16' });\n this.mirrorNode = new HederaMirrorNode(this.network, this.logger, {\n customUrl: params.mirrorNodeUrl,\n });\n }\n\n async assembleKeyList(params: {\n members: string[];\n threshold: number;\n }): Promise<KeyList> {\n const keys: PublicKey[] = [];\n for (const accountId of params.members) {\n const pub = await this.mirrorNode.getPublicKey(accountId);\n keys.push(pub);\n }\n return new KeyList(keys, params.threshold);\n }\n\n async assembleSubmitKeyList(members: string[]): Promise<KeyList> {\n const keys: PublicKey[] = [];\n for (const accountId of members) {\n const pub = await this.mirrorNode.getPublicKey(accountId);\n keys.push(pub);\n }\n return new KeyList(keys, 1);\n }\n\n buildFloraTopicCreateTxs(params: {\n floraAccountId: string;\n keyList: KeyList;\n submitList: KeyList;\n autoRenewAccountId?: string;\n }): {\n communication: TopicCreateTransaction;\n transaction: TopicCreateTransaction;\n state: TopicCreateTransaction;\n } {\n const communication = buildHcs16CreateFloraTopicTx({\n floraAccountId: params.floraAccountId,\n topicType: FloraTopicType.COMMUNICATION,\n adminKey: params.keyList,\n submitKey: params.submitList,\n autoRenewAccountId: params.autoRenewAccountId,\n });\n const transaction = buildHcs16CreateFloraTopicTx({\n floraAccountId: params.floraAccountId,\n topicType: FloraTopicType.TRANSACTION,\n adminKey: params.keyList,\n submitKey: params.submitList,\n autoRenewAccountId: params.autoRenewAccountId,\n });\n const state = buildHcs16CreateFloraTopicTx({\n floraAccountId: params.floraAccountId,\n topicType: FloraTopicType.STATE,\n adminKey: params.keyList,\n submitKey: params.submitList,\n autoRenewAccountId: params.autoRenewAccountId,\n });\n return { communication, transaction, state };\n }\n\n /**\n * Parse an HCS‑16 Flora topic memo of the form `hcs-16:<floraAccountId>:<topicType>`.\n */\n parseTopicMemo(memo: string): {\n protocol: 'hcs-16';\n floraAccountId: string;\n topicType: FloraTopicType;\n } | null {\n const match = memo.match(/^hcs-16:([0-9.]+):(\\d)$/);\n if (!match) {\n return null;\n }\n return {\n protocol: 'hcs-16',\n floraAccountId: match[1],\n topicType: Number(match[2]) as FloraTopicType,\n };\n }\n\n /**\n * Build a Flora message envelope by merging an operation body into the HCS‑16 envelope.\n */\n protected createFloraMessage(\n op: FloraOperation,\n operatorId: string,\n body?: Record<string, unknown>,\n ): FloraMessage {\n const payload: FloraMessage = {\n p: 'hcs-16',\n op,\n operator_id: operatorId,\n ...(body || {}),\n } as FloraMessage;\n return payload;\n }\n\n /**\n * Fetch recent HCS‑16 messages from a topic via Mirror Node.\n */\n async getRecentMessages(\n topicId: string,\n options?: {\n limit?: number;\n order?: 'asc' | 'desc';\n opFilter?: FloraOperation | string;\n },\n ): Promise<\n Array<{\n message: FloraMessage;\n consensus_timestamp?: string;\n sequence_number: number;\n payer?: string;\n }>\n > {\n const limit = options?.limit ?? 25;\n const order = options?.order ?? 'desc';\n const items: HCSMessageWithCommonFields[] =\n await this.mirrorNode.getTopicMessages(topicId, { limit, order });\n\n const results: Array<{\n message: FloraMessage;\n consensus_timestamp?: string;\n sequence_number: number;\n payer?: string;\n }> = [];\n\n for (const raw of items) {\n if (raw.p !== 'hcs-16') {\n continue;\n }\n\n const {\n consensus_timestamp,\n sequence_number,\n running_hash,\n running_hash_version,\n topic_id,\n payer,\n created,\n chunk_info,\n ...payload\n } = raw as unknown as Record<string, unknown>;\n\n const op = payload.op as FloraOperation | string | undefined;\n const operatorId = payload.operator_id as string | undefined;\n\n if (options?.opFilter && op !== options.opFilter) {\n continue;\n }\n if (typeof operatorId !== 'string') {\n continue;\n }\n\n const message = payload as unknown as FloraMessage;\n\n results.push({\n message,\n consensus_timestamp: consensus_timestamp as string | undefined,\n sequence_number: Number(sequence_number),\n payer: payer as string | undefined,\n });\n }\n return results;\n }\n\n /**\n * Return the latest valid HCS‑16 message on a topic, if any.\n */\n async getLatestMessage(\n topicId: string,\n opFilter?: FloraOperation | string,\n ): Promise<\n | (FloraMessage & { consensus_timestamp?: string; sequence_number: number })\n | null\n > {\n const items = await this.getRecentMessages(topicId, {\n limit: 1,\n order: 'desc',\n opFilter,\n });\n if (items.length === 0) {\n return null;\n }\n const first = items[0];\n return Object.assign({}, first.message, {\n consensus_timestamp: first.consensus_timestamp,\n sequence_number: first.sequence_number,\n });\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,116 +1,48 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
this.operatorCtx = createNodeOperatorContext({
|
|
17
|
-
network: this.network,
|
|
18
|
-
operatorId: config.operatorId,
|
|
19
|
-
operatorKey: config.operatorKey,
|
|
20
|
-
mirrorNode: this.mirrorNode,
|
|
21
|
-
logger: this.logger,
|
|
22
|
-
client: Client.forName(this.network)
|
|
23
|
-
});
|
|
24
|
-
this.client = this.operatorCtx.client;
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
const hcs17MessageSchema = z.object({
|
|
3
|
+
p: z.literal("hcs-17"),
|
|
4
|
+
op: z.literal("state_hash"),
|
|
5
|
+
state_hash: z.string().min(1),
|
|
6
|
+
topics: z.array(z.string()),
|
|
7
|
+
account_id: z.string().min(1),
|
|
8
|
+
timestamp: z.string().optional(),
|
|
9
|
+
m: z.string().optional()
|
|
10
|
+
});
|
|
11
|
+
class StateHashError extends Error {
|
|
12
|
+
constructor(message, code) {
|
|
13
|
+
super(message);
|
|
14
|
+
this.code = code;
|
|
15
|
+
this.name = "StateHashError";
|
|
25
16
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
17
|
+
}
|
|
18
|
+
var HCS17TopicType = /* @__PURE__ */ ((HCS17TopicType2) => {
|
|
19
|
+
HCS17TopicType2[HCS17TopicType2["STATE"] = 0] = "STATE";
|
|
20
|
+
return HCS17TopicType2;
|
|
21
|
+
})(HCS17TopicType || {});
|
|
22
|
+
function generateHCS17Memo(ttl) {
|
|
23
|
+
return `hcs-17:${0}:${ttl}`;
|
|
24
|
+
}
|
|
25
|
+
function parseHCS17Memo(memo) {
|
|
26
|
+
try {
|
|
27
|
+
const match = memo.match(/^hcs-17:(\d+):(\d+)$/);
|
|
28
|
+
if (!match) {
|
|
29
|
+
return void 0;
|
|
37
30
|
}
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
operatorPublicKey,
|
|
43
|
-
memoOverride: options?.memoOverride
|
|
44
|
-
});
|
|
45
|
-
const resp = await tx.execute(this.client);
|
|
46
|
-
const receipt = await resp.getReceipt(this.client);
|
|
47
|
-
const topicId = receipt.topicId?.toString();
|
|
48
|
-
if (!topicId) {
|
|
49
|
-
throw new Error("Failed to create discovery topic");
|
|
31
|
+
const type = Number(match[1]);
|
|
32
|
+
const ttl = Number(match[2]);
|
|
33
|
+
if (Number.isNaN(type) || Number.isNaN(ttl) || ttl <= 0) {
|
|
34
|
+
return void 0;
|
|
50
35
|
}
|
|
51
|
-
return {
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
await this.ensureInitialized();
|
|
55
|
-
const message = buildHcs18AnnounceMessage(params.data);
|
|
56
|
-
const tx = buildHcs18SubmitDiscoveryMessageTx({
|
|
57
|
-
topicId: params.discoveryTopicId,
|
|
58
|
-
message,
|
|
59
|
-
transactionMemo: params.memo
|
|
60
|
-
});
|
|
61
|
-
const resp = await tx.execute(this.client);
|
|
62
|
-
const receipt = await resp.getReceipt(this.client);
|
|
63
|
-
const seq = receipt.topicSequenceNumber.toNumber();
|
|
64
|
-
return { receipt, sequenceNumber: seq };
|
|
65
|
-
}
|
|
66
|
-
async propose(params) {
|
|
67
|
-
await this.ensureInitialized();
|
|
68
|
-
const message = buildHcs18ProposeMessage(params.data);
|
|
69
|
-
const tx = buildHcs18SubmitDiscoveryMessageTx({
|
|
70
|
-
topicId: params.discoveryTopicId,
|
|
71
|
-
message,
|
|
72
|
-
transactionMemo: params.memo
|
|
73
|
-
});
|
|
74
|
-
const resp = await tx.execute(this.client);
|
|
75
|
-
const receipt = await resp.getReceipt(this.client);
|
|
76
|
-
const seq = receipt.topicSequenceNumber.toNumber();
|
|
77
|
-
return { receipt, sequenceNumber: seq };
|
|
78
|
-
}
|
|
79
|
-
async respond(params) {
|
|
80
|
-
await this.ensureInitialized();
|
|
81
|
-
const message = buildHcs18RespondMessage(params.data);
|
|
82
|
-
const tx = buildHcs18SubmitDiscoveryMessageTx({
|
|
83
|
-
topicId: params.discoveryTopicId,
|
|
84
|
-
message,
|
|
85
|
-
transactionMemo: params.memo
|
|
86
|
-
});
|
|
87
|
-
const resp = await tx.execute(this.client);
|
|
88
|
-
return await resp.getReceipt(this.client);
|
|
89
|
-
}
|
|
90
|
-
async complete(params) {
|
|
91
|
-
await this.ensureInitialized();
|
|
92
|
-
const message = buildHcs18CompleteMessage(params.data);
|
|
93
|
-
const tx = buildHcs18SubmitDiscoveryMessageTx({
|
|
94
|
-
topicId: params.discoveryTopicId,
|
|
95
|
-
message,
|
|
96
|
-
transactionMemo: params.memo
|
|
97
|
-
});
|
|
98
|
-
const resp = await tx.execute(this.client);
|
|
99
|
-
return await resp.getReceipt(this.client);
|
|
100
|
-
}
|
|
101
|
-
async withdraw(params) {
|
|
102
|
-
await this.ensureInitialized();
|
|
103
|
-
const message = buildHcs18WithdrawMessage(params.data);
|
|
104
|
-
const tx = buildHcs18SubmitDiscoveryMessageTx({
|
|
105
|
-
topicId: params.discoveryTopicId,
|
|
106
|
-
message,
|
|
107
|
-
transactionMemo: params.memo
|
|
108
|
-
});
|
|
109
|
-
const resp = await tx.execute(this.client);
|
|
110
|
-
return await resp.getReceipt(this.client);
|
|
36
|
+
return { type, ttl };
|
|
37
|
+
} catch {
|
|
38
|
+
return void 0;
|
|
111
39
|
}
|
|
112
40
|
}
|
|
113
41
|
export {
|
|
114
|
-
|
|
42
|
+
HCS17TopicType,
|
|
43
|
+
StateHashError,
|
|
44
|
+
generateHCS17Memo,
|
|
45
|
+
hcs17MessageSchema,
|
|
46
|
+
parseHCS17Memo
|
|
115
47
|
};
|
|
116
48
|
//# sourceMappingURL=standards-sdk.es95.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standards-sdk.es95.js","sources":["../../src/hcs-
|
|
1
|
+
{"version":3,"file":"standards-sdk.es95.js","sources":["../../src/hcs-17/types.ts"],"sourcesContent":["import { PublicKey, PrivateKey } from '@hashgraph/sdk';\nimport type { HashinalsWalletConnectSDK } from '@hashgraphonline/hashinal-wc';\nimport type { DAppSigner } from '@hashgraph/hedera-wallet-connect';\nimport { z } from 'zod';\nimport { Logger, LogLevel } from '../utils/logger';\nimport { NetworkType } from '../utils/types';\n\n/**\n * HCS-17 Topic state information\n */\nexport interface TopicState {\n topicId: string;\n latestRunningHash: string;\n}\n\n/**\n * HCS-17 Account state hash input\n */\nexport interface AccountStateInput {\n accountId: string;\n publicKey: PublicKey | string;\n topics: TopicState[];\n}\n\n/**\n * HCS-17 Composite state hash input for Flora/Bloom\n */\nexport interface CompositeStateInput {\n compositeAccountId: string;\n compositePublicKeyFingerprint: string;\n memberStates: Array<{\n accountId: string;\n stateHash: string;\n }>;\n compositeTopics: TopicState[];\n}\n\n/**\n * HCS-17 State hash message format\n */\nexport interface StateHashMessage {\n p: 'hcs-17';\n op: 'state_hash';\n state_hash: string;\n topics: string[];\n account_id: string;\n timestamp?: string;\n m?: string;\n}\n\nexport const hcs17MessageSchema = z.object({\n p: z.literal('hcs-17'),\n op: z.literal('state_hash'),\n state_hash: z.string().min(1),\n topics: z.array(z.string()),\n account_id: z.string().min(1),\n timestamp: z.string().optional(),\n m: z.string().optional(),\n});\n\n/**\n * HCS-17 State hash result\n */\nexport interface StateHashResult {\n stateHash: string;\n accountId: string;\n timestamp: Date;\n topicCount: number;\n}\n\n/**\n * HCS-17 Composite state hash result\n */\nexport interface CompositeStateHashResult extends StateHashResult {\n memberCount: number;\n compositeTopicCount: number;\n}\n\n/**\n * HCS-17 errors\n */\nexport class StateHashError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n ) {\n super(message);\n this.name = 'StateHashError';\n }\n}\n\n/**\n * Base configuration shared by HCS‑17 Node and Browser clients.\n */\nexport interface HCS17ClientConfig {\n network: NetworkType;\n logLevel?: LogLevel;\n silent?: boolean;\n mirrorNodeUrl?: string;\n logger?: Logger;\n}\n\n/**\n * Node SDK configuration for HCS‑17 client.\n */\nexport interface SDKHCS17ClientConfig extends HCS17ClientConfig {\n operatorId: string;\n operatorKey: string | PrivateKey;\n keyType?: 'ed25519' | 'ecdsa';\n}\n\n/**\n * Browser client configuration for HCS‑17 operations.\n */\nexport interface BrowserHCS17ClientConfig extends HCS17ClientConfig {\n hwc?: HashinalsWalletConnectSDK;\n signer?: DAppSigner;\n}\n\n/**\n * HCS‑17 topic types (numeric codes for memo encoding).\n */\nexport enum HCS17TopicType {\n STATE = 0,\n}\n\n/**\n * Generate the standard HCS‑17 topic memo: `hcs-17:<type>:<ttl>`.\n */\nexport function generateHCS17Memo(ttl: number): string {\n return `hcs-17:${HCS17TopicType.STATE}:${ttl}`;\n}\n\n/**\n * Parse an HCS‑17 memo into `{ type, ttl }` if valid.\n */\nexport function parseHCS17Memo(\n memo: string,\n): { type: HCS17TopicType; ttl: number } | undefined {\n try {\n const match = memo.match(/^hcs-17:(\\d+):(\\d+)$/);\n if (!match) {\n return undefined;\n }\n const type = Number(match[1]) as HCS17TopicType;\n const ttl = Number(match[2]);\n if (Number.isNaN(type) || Number.isNaN(ttl) || ttl <= 0) {\n return undefined;\n }\n return { type, ttl };\n } catch {\n return undefined;\n }\n}\n"],"names":["HCS17TopicType"],"mappings":";AAkDO,MAAM,qBAAqB,EAAE,OAAO;AAAA,EACzC,GAAG,EAAE,QAAQ,QAAQ;AAAA,EACrB,IAAI,EAAE,QAAQ,YAAY;AAAA,EAC1B,YAAY,EAAE,SAAS,IAAI,CAAC;AAAA,EAC5B,QAAQ,EAAE,MAAM,EAAE,QAAQ;AAAA,EAC1B,YAAY,EAAE,SAAS,IAAI,CAAC;AAAA,EAC5B,WAAW,EAAE,OAAA,EAAS,SAAA;AAAA,EACtB,GAAG,EAAE,OAAA,EAAS,SAAA;AAChB,CAAC;AAuBM,MAAM,uBAAuB,MAAM;AAAA,EACxC,YACE,SACgB,MAChB;AACA,UAAM,OAAO;AAFG,SAAA,OAAA;AAGhB,SAAK,OAAO;AAAA,EACd;AACF;AAiCO,IAAK,mCAAAA,oBAAL;AACLA,kBAAAA,gBAAA,WAAQ,CAAA,IAAR;AADU,SAAAA;AAAA,GAAA,kBAAA,CAAA,CAAA;AAOL,SAAS,kBAAkB,KAAqB;AACrD,SAAO,UAAU,KAAwB,GAAG;AAC9C;AAKO,SAAS,eACd,MACmD;AACnD,MAAI;AACF,UAAM,QAAQ,KAAK,MAAM,sBAAsB;AAC/C,QAAI,CAAC,OAAO;AACV,aAAO;AAAA,IACT;AACA,UAAM,OAAO,OAAO,MAAM,CAAC,CAAC;AAC5B,UAAM,MAAM,OAAO,MAAM,CAAC,CAAC;AAC3B,QAAI,OAAO,MAAM,IAAI,KAAK,OAAO,MAAM,GAAG,KAAK,OAAO,GAAG;AACvD,aAAO;AAAA,IACT;AACA,WAAO,EAAE,MAAM,IAAA;AAAA,EACjB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;"}
|