@hashgraphonline/standards-sdk 0.1.184 → 0.1.185

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (262) hide show
  1. package/dist/browser/hcs-25/identifiers.d.ts +24 -0
  2. package/dist/browser/hcs-25/identifiers.d.ts.map +1 -0
  3. package/dist/browser/hcs-25/index.d.ts +4 -0
  4. package/dist/browser/hcs-25/index.d.ts.map +1 -0
  5. package/dist/browser/hcs-25/scoring.d.ts +32 -0
  6. package/dist/browser/hcs-25/scoring.d.ts.map +1 -0
  7. package/dist/browser/hcs-25/types.d.ts +363 -0
  8. package/dist/browser/hcs-25/types.d.ts.map +1 -0
  9. package/dist/browser/index.d.ts +1 -0
  10. package/dist/browser/index.d.ts.map +1 -1
  11. package/dist/browser-root/hcs-25/identifiers.d.ts +24 -0
  12. package/dist/browser-root/hcs-25/identifiers.d.ts.map +1 -0
  13. package/dist/browser-root/hcs-25/index.d.ts +4 -0
  14. package/dist/browser-root/hcs-25/index.d.ts.map +1 -0
  15. package/dist/browser-root/hcs-25/scoring.d.ts +32 -0
  16. package/dist/browser-root/hcs-25/scoring.d.ts.map +1 -0
  17. package/dist/browser-root/hcs-25/types.d.ts +363 -0
  18. package/dist/browser-root/hcs-25/types.d.ts.map +1 -0
  19. package/dist/browser-root/index.d.ts +1 -0
  20. package/dist/browser-root/index.d.ts.map +1 -1
  21. package/dist/cjs/hcs-25/identifiers.d.ts +24 -0
  22. package/dist/cjs/hcs-25/identifiers.d.ts.map +1 -0
  23. package/dist/cjs/hcs-25/index.d.ts +4 -0
  24. package/dist/cjs/hcs-25/index.d.ts.map +1 -0
  25. package/dist/cjs/hcs-25/scoring.d.ts +32 -0
  26. package/dist/cjs/hcs-25/scoring.d.ts.map +1 -0
  27. package/dist/cjs/hcs-25/types.d.ts +363 -0
  28. package/dist/cjs/hcs-25/types.d.ts.map +1 -0
  29. package/dist/cjs/index.d.ts +1 -0
  30. package/dist/cjs/index.d.ts.map +1 -1
  31. package/dist/cjs/standards-sdk.cjs +1 -1
  32. package/dist/cjs/standards-sdk.cjs.map +1 -1
  33. package/dist/es/hcs-25/identifiers.d.ts +24 -0
  34. package/dist/es/hcs-25/identifiers.d.ts.map +1 -0
  35. package/dist/es/hcs-25/index.d.ts +4 -0
  36. package/dist/es/hcs-25/index.d.ts.map +1 -0
  37. package/dist/es/hcs-25/scoring.d.ts +32 -0
  38. package/dist/es/hcs-25/scoring.d.ts.map +1 -0
  39. package/dist/es/hcs-25/types.d.ts +363 -0
  40. package/dist/es/hcs-25/types.d.ts.map +1 -0
  41. package/dist/es/index.d.ts +1 -0
  42. package/dist/es/index.d.ts.map +1 -1
  43. package/dist/es/standards-sdk.es.js +62 -40
  44. package/dist/es/standards-sdk.es.js.map +1 -1
  45. package/dist/es/standards-sdk.es101.js +2 -2
  46. package/dist/es/standards-sdk.es103.js +2 -2
  47. package/dist/es/standards-sdk.es104.js +1 -1
  48. package/dist/es/standards-sdk.es106.js +1 -1
  49. package/dist/es/standards-sdk.es108.js +2 -2
  50. package/dist/es/standards-sdk.es11.js +1 -1
  51. package/dist/es/standards-sdk.es110.js +1 -1
  52. package/dist/es/standards-sdk.es111.js +2 -2
  53. package/dist/es/standards-sdk.es115.js +3 -3
  54. package/dist/es/standards-sdk.es116.js +4 -4
  55. package/dist/es/standards-sdk.es117.js +19 -251
  56. package/dist/es/standards-sdk.es117.js.map +1 -1
  57. package/dist/es/standards-sdk.es118.js +60 -475
  58. package/dist/es/standards-sdk.es118.js.map +1 -1
  59. package/dist/es/standards-sdk.es119.js +217 -86
  60. package/dist/es/standards-sdk.es119.js.map +1 -1
  61. package/dist/es/standards-sdk.es12.js +1 -1
  62. package/dist/es/standards-sdk.es120.js +242 -150
  63. package/dist/es/standards-sdk.es120.js.map +1 -1
  64. package/dist/es/standards-sdk.es121.js +470 -26
  65. package/dist/es/standards-sdk.es121.js.map +1 -1
  66. package/dist/es/standards-sdk.es122.js +103 -10
  67. package/dist/es/standards-sdk.es122.js.map +1 -1
  68. package/dist/es/standards-sdk.es123.js +145 -167
  69. package/dist/es/standards-sdk.es123.js.map +1 -1
  70. package/dist/es/standards-sdk.es124.js +30 -25
  71. package/dist/es/standards-sdk.es124.js.map +1 -1
  72. package/dist/es/standards-sdk.es125.js +10 -20
  73. package/dist/es/standards-sdk.es125.js.map +1 -1
  74. package/dist/es/standards-sdk.es126.js +159 -137
  75. package/dist/es/standards-sdk.es126.js.map +1 -1
  76. package/dist/es/standards-sdk.es127.js +27 -199
  77. package/dist/es/standards-sdk.es127.js.map +1 -1
  78. package/dist/es/standards-sdk.es128.js +15 -783
  79. package/dist/es/standards-sdk.es128.js.map +1 -1
  80. package/dist/es/standards-sdk.es129.js +157 -10
  81. package/dist/es/standards-sdk.es129.js.map +1 -1
  82. package/dist/es/standards-sdk.es13.js +1 -1
  83. package/dist/es/standards-sdk.es130.js +198 -564
  84. package/dist/es/standards-sdk.es130.js.map +1 -1
  85. package/dist/es/standards-sdk.es131.js +703 -539
  86. package/dist/es/standards-sdk.es131.js.map +1 -1
  87. package/dist/es/standards-sdk.es132.js +12 -12
  88. package/dist/es/standards-sdk.es132.js.map +1 -1
  89. package/dist/es/standards-sdk.es133.js +567 -2
  90. package/dist/es/standards-sdk.es133.js.map +1 -1
  91. package/dist/es/standards-sdk.es134.js +610 -71
  92. package/dist/es/standards-sdk.es134.js.map +1 -1
  93. package/dist/es/standards-sdk.es135.js +12 -39
  94. package/dist/es/standards-sdk.es135.js.map +1 -1
  95. package/dist/es/standards-sdk.es136.js +2 -2
  96. package/dist/es/standards-sdk.es136.js.map +1 -1
  97. package/dist/es/standards-sdk.es137.js +42 -190
  98. package/dist/es/standards-sdk.es137.js.map +1 -1
  99. package/dist/es/standards-sdk.es138.js +39 -1139
  100. package/dist/es/standards-sdk.es138.js.map +1 -1
  101. package/dist/es/standards-sdk.es139.js +2 -306
  102. package/dist/es/standards-sdk.es139.js.map +1 -1
  103. package/dist/es/standards-sdk.es14.js +1 -1
  104. package/dist/es/standards-sdk.es140.js +231 -418
  105. package/dist/es/standards-sdk.es140.js.map +1 -1
  106. package/dist/es/standards-sdk.es141.js +1135 -350
  107. package/dist/es/standards-sdk.es141.js.map +1 -1
  108. package/dist/es/standards-sdk.es142.js +268 -1084
  109. package/dist/es/standards-sdk.es142.js.map +1 -1
  110. package/dist/es/standards-sdk.es143.js +418 -204
  111. package/dist/es/standards-sdk.es143.js.map +1 -1
  112. package/dist/es/standards-sdk.es144.js +350 -1562
  113. package/dist/es/standards-sdk.es144.js.map +1 -1
  114. package/dist/es/standards-sdk.es145.js +1061 -1096
  115. package/dist/es/standards-sdk.es145.js.map +1 -1
  116. package/dist/es/standards-sdk.es146.js +204 -13
  117. package/dist/es/standards-sdk.es146.js.map +1 -1
  118. package/dist/es/standards-sdk.es147.js +1541 -233
  119. package/dist/es/standards-sdk.es147.js.map +1 -1
  120. package/dist/es/standards-sdk.es148.js +1157 -4
  121. package/dist/es/standards-sdk.es148.js.map +1 -1
  122. package/dist/es/standards-sdk.es149.js +15 -79
  123. package/dist/es/standards-sdk.es149.js.map +1 -1
  124. package/dist/es/standards-sdk.es15.js +1 -1
  125. package/dist/es/standards-sdk.es150.js +250 -78
  126. package/dist/es/standards-sdk.es150.js.map +1 -1
  127. package/dist/es/standards-sdk.es151.js +4 -60
  128. package/dist/es/standards-sdk.es151.js.map +1 -1
  129. package/dist/es/standards-sdk.es152.js +80 -2546
  130. package/dist/es/standards-sdk.es152.js.map +1 -1
  131. package/dist/es/standards-sdk.es153.js +80 -152
  132. package/dist/es/standards-sdk.es153.js.map +1 -1
  133. package/dist/es/standards-sdk.es154.js +60 -7
  134. package/dist/es/standards-sdk.es154.js.map +1 -1
  135. package/dist/es/standards-sdk.es155.js +2547 -86
  136. package/dist/es/standards-sdk.es155.js.map +1 -1
  137. package/dist/es/standards-sdk.es156.js +144 -50
  138. package/dist/es/standards-sdk.es156.js.map +1 -1
  139. package/dist/es/standards-sdk.es157.js +7 -30
  140. package/dist/es/standards-sdk.es157.js.map +1 -1
  141. package/dist/es/standards-sdk.es158.js +86 -34
  142. package/dist/es/standards-sdk.es158.js.map +1 -1
  143. package/dist/es/standards-sdk.es159.js +65 -48
  144. package/dist/es/standards-sdk.es159.js.map +1 -1
  145. package/dist/es/standards-sdk.es16.js +5 -5
  146. package/dist/es/standards-sdk.es160.js +30 -138
  147. package/dist/es/standards-sdk.es160.js.map +1 -1
  148. package/dist/es/standards-sdk.es161.js +34 -42
  149. package/dist/es/standards-sdk.es161.js.map +1 -1
  150. package/dist/es/standards-sdk.es162.js +48 -12482
  151. package/dist/es/standards-sdk.es162.js.map +1 -1
  152. package/dist/es/standards-sdk.es163.js +12479 -53
  153. package/dist/es/standards-sdk.es163.js.map +1 -1
  154. package/dist/es/standards-sdk.es164.js +124 -97
  155. package/dist/es/standards-sdk.es164.js.map +1 -1
  156. package/dist/es/standards-sdk.es165.js +35 -74
  157. package/dist/es/standards-sdk.es165.js.map +1 -1
  158. package/dist/es/standards-sdk.es166.js +14 -197
  159. package/dist/es/standards-sdk.es166.js.map +1 -1
  160. package/dist/es/standards-sdk.es167.js +54 -15
  161. package/dist/es/standards-sdk.es167.js.map +1 -1
  162. package/dist/es/standards-sdk.es168.js +90 -651
  163. package/dist/es/standards-sdk.es168.js.map +1 -1
  164. package/dist/es/standards-sdk.es169.js +70 -161
  165. package/dist/es/standards-sdk.es169.js.map +1 -1
  166. package/dist/es/standards-sdk.es170.js +187 -309
  167. package/dist/es/standards-sdk.es170.js.map +1 -1
  168. package/dist/es/standards-sdk.es171.js +661 -335
  169. package/dist/es/standards-sdk.es171.js.map +1 -1
  170. package/dist/es/standards-sdk.es172.js +64 -444
  171. package/dist/es/standards-sdk.es172.js.map +1 -1
  172. package/dist/es/standards-sdk.es173.js +142 -301
  173. package/dist/es/standards-sdk.es173.js.map +1 -1
  174. package/dist/es/standards-sdk.es174.js +310 -64
  175. package/dist/es/standards-sdk.es174.js.map +1 -1
  176. package/dist/es/standards-sdk.es175.js +337 -64
  177. package/dist/es/standards-sdk.es175.js.map +1 -1
  178. package/dist/es/standards-sdk.es176.js +438 -124
  179. package/dist/es/standards-sdk.es176.js.map +1 -1
  180. package/dist/es/standards-sdk.es177.js +310 -496
  181. package/dist/es/standards-sdk.es177.js.map +1 -1
  182. package/dist/es/standards-sdk.es178.js +60 -243
  183. package/dist/es/standards-sdk.es178.js.map +1 -1
  184. package/dist/es/standards-sdk.es179.js +118 -175
  185. package/dist/es/standards-sdk.es179.js.map +1 -1
  186. package/dist/es/standards-sdk.es18.js +12 -12
  187. package/dist/es/standards-sdk.es180.js +465 -67
  188. package/dist/es/standards-sdk.es180.js.map +1 -1
  189. package/dist/es/standards-sdk.es181.js +250 -143
  190. package/dist/es/standards-sdk.es181.js.map +1 -1
  191. package/dist/es/standards-sdk.es182.js +172 -160
  192. package/dist/es/standards-sdk.es182.js.map +1 -1
  193. package/dist/es/standards-sdk.es183.js +65 -630
  194. package/dist/es/standards-sdk.es183.js.map +1 -1
  195. package/dist/es/standards-sdk.es184.js +128 -161
  196. package/dist/es/standards-sdk.es184.js.map +1 -1
  197. package/dist/es/standards-sdk.es185.js +144 -195
  198. package/dist/es/standards-sdk.es185.js.map +1 -1
  199. package/dist/es/standards-sdk.es186.js +668 -223
  200. package/dist/es/standards-sdk.es186.js.map +1 -1
  201. package/dist/es/standards-sdk.es187.js +188 -0
  202. package/dist/es/standards-sdk.es187.js.map +1 -0
  203. package/dist/es/standards-sdk.es188.js +238 -0
  204. package/dist/es/standards-sdk.es188.js.map +1 -0
  205. package/dist/es/standards-sdk.es189.js +242 -0
  206. package/dist/es/standards-sdk.es189.js.map +1 -0
  207. package/dist/es/standards-sdk.es19.js +9 -9
  208. package/dist/es/standards-sdk.es2.js +2 -2
  209. package/dist/es/standards-sdk.es20.js +1 -1
  210. package/dist/es/standards-sdk.es21.js +1 -1
  211. package/dist/es/standards-sdk.es22.js +1 -1
  212. package/dist/es/standards-sdk.es23.js +1 -1
  213. package/dist/es/standards-sdk.es24.js +1 -1
  214. package/dist/es/standards-sdk.es25.js +1 -1
  215. package/dist/es/standards-sdk.es26.js +1 -1
  216. package/dist/es/standards-sdk.es27.js +12 -12
  217. package/dist/es/standards-sdk.es30.js +2 -2
  218. package/dist/es/standards-sdk.es31.js +4 -4
  219. package/dist/es/standards-sdk.es32.js +1 -1
  220. package/dist/es/standards-sdk.es35.js +6 -6
  221. package/dist/es/standards-sdk.es36.js +4 -4
  222. package/dist/es/standards-sdk.es37.js +2 -2
  223. package/dist/es/standards-sdk.es38.js +2 -2
  224. package/dist/es/standards-sdk.es39.js +1 -1
  225. package/dist/es/standards-sdk.es4.js +2 -2
  226. package/dist/es/standards-sdk.es40.js +1 -1
  227. package/dist/es/standards-sdk.es41.js +2 -2
  228. package/dist/es/standards-sdk.es46.js +1 -1
  229. package/dist/es/standards-sdk.es5.js +2 -2
  230. package/dist/es/standards-sdk.es51.js +1 -1
  231. package/dist/es/standards-sdk.es53.js +1 -1
  232. package/dist/es/standards-sdk.es56.js +2 -2
  233. package/dist/es/standards-sdk.es59.js +1 -1
  234. package/dist/es/standards-sdk.es6.js +2 -2
  235. package/dist/es/standards-sdk.es60.js +1 -1
  236. package/dist/es/standards-sdk.es62.js +1 -1
  237. package/dist/es/standards-sdk.es63.js +2 -2
  238. package/dist/es/standards-sdk.es64.js +1 -1
  239. package/dist/es/standards-sdk.es65.js +1 -1
  240. package/dist/es/standards-sdk.es66.js +1 -1
  241. package/dist/es/standards-sdk.es67.js +7 -7
  242. package/dist/es/standards-sdk.es69.js +1 -1
  243. package/dist/es/standards-sdk.es7.js +1 -1
  244. package/dist/es/standards-sdk.es71.js +2 -2
  245. package/dist/es/standards-sdk.es72.js +3 -3
  246. package/dist/es/standards-sdk.es75.js +5 -5
  247. package/dist/es/standards-sdk.es76.js +3 -3
  248. package/dist/es/standards-sdk.es77.js +2 -2
  249. package/dist/es/standards-sdk.es78.js +1 -1
  250. package/dist/es/standards-sdk.es81.js +2 -2
  251. package/dist/es/standards-sdk.es83.js +2 -2
  252. package/dist/es/standards-sdk.es84.js +4 -4
  253. package/dist/es/standards-sdk.es85.js +1 -1
  254. package/dist/es/standards-sdk.es88.js +1 -1
  255. package/dist/es/standards-sdk.es89.js +2 -2
  256. package/dist/es/standards-sdk.es9.js +2 -2
  257. package/dist/es/standards-sdk.es90.js +4 -4
  258. package/dist/es/standards-sdk.es94.js +3 -3
  259. package/dist/es/standards-sdk.es96.js +2 -2
  260. package/dist/es/standards-sdk.es98.js +1 -1
  261. package/dist/es/standards-sdk.es99.js +3 -3
  262. package/package.json +1 -1
@@ -1,108 +1,239 @@
1
- import { z } from "zod";
2
- import { hcs26TopicTypeEnumSchema, HCS26_PROTOCOL, hcs26OperationEnumSchema } from "./standards-sdk.es117.js";
3
- const HCS26_DEFAULT_TTL_SECONDS = 86400;
4
- function toPositiveInt(value) {
5
- if (!Number.isFinite(value)) {
6
- throw new Error("Expected a finite number");
7
- }
8
- const intValue = Math.floor(value);
9
- if (intValue <= 0) {
10
- throw new Error("Expected a positive integer");
11
- }
12
- return intValue;
1
+ import { isValidAdapterId, isValidComponentKey, isValidComponentName } from "./standards-sdk.es117.js";
2
+ import { HCS25_DEFAULT_STALE_MULTIPLIER, HCS25_DEFAULT_ROUNDING_DECIMALS, hcs25SubjectSchema, hcs25SignalSnapshotSchema, HCS25_DEFAULT_WEIGHT, HCS25_DEFAULT_CONTRIBUTION_MODE } from "./standards-sdk.es118.js";
3
+ function clampScore(value) {
4
+ return Math.min(100, Math.max(0, value));
13
5
  }
14
- function buildHcs26TopicMemo(input) {
15
- const indexed = input.indexed ?? true;
16
- const ttlSeconds = toPositiveInt(
17
- input.ttlSeconds ?? HCS26_DEFAULT_TTL_SECONDS
18
- );
19
- const topicType = hcs26TopicTypeEnumSchema.parse(input.topicType);
20
- const indexedSegment = indexed ? "0" : "1";
21
- return `${HCS26_PROTOCOL}:${indexedSegment}:${ttlSeconds}:${topicType}`;
6
+ function roundScore(value, decimals = 2) {
7
+ const factor = 10 ** decimals;
8
+ return Math.round(value * factor) / factor;
22
9
  }
23
- function parseHcs26TopicMemo(memoRaw) {
24
- const memo = memoRaw.trim();
25
- if (!memo) {
26
- return null;
10
+ function compileScoringConfig(input) {
11
+ if (!Number.isInteger(input.version) || input.version < 0) {
12
+ throw new TypeError(
13
+ "trustScoreConfigVersion must be a non-negative integer"
14
+ );
27
15
  }
28
- const match = memo.match(/^hcs-26:(\d+):(\d+):(\d+)$/);
29
- if (!match) {
30
- return null;
16
+ if (!Array.isArray(input.adapters) || input.adapters.length === 0) {
17
+ throw new TypeError("at least one trust adapter is required");
31
18
  }
32
- const indexedSegment = Number(match[1]);
33
- const ttlSeconds = Number(match[2]);
34
- const topicType = Number(match[3]);
35
- if (![indexedSegment, ttlSeconds, topicType].every(Number.isFinite)) {
36
- return null;
19
+ const seenAdapterIds = /* @__PURE__ */ new Set();
20
+ for (const adapter of input.adapters) {
21
+ validateAdapter(adapter, seenAdapterIds);
22
+ seenAdapterIds.add(adapter.id);
37
23
  }
38
- const parsedTopicType = hcs26TopicTypeEnumSchema.safeParse(topicType);
39
- if (!parsedTopicType.success) {
40
- return null;
24
+ const staleMultiplier = input.staleMultiplier ?? HCS25_DEFAULT_STALE_MULTIPLIER;
25
+ if (!Number.isFinite(staleMultiplier) || staleMultiplier < 0 || staleMultiplier > 1) {
26
+ throw new TypeError("staleMultiplier must be a number in [0, 1]");
41
27
  }
42
- if (indexedSegment !== 0 && indexedSegment !== 1) {
43
- return null;
28
+ const roundingDecimals = input.roundingDecimals ?? HCS25_DEFAULT_ROUNDING_DECIMALS;
29
+ if (!Number.isInteger(roundingDecimals) || roundingDecimals < 0 || roundingDecimals > 6) {
30
+ throw new TypeError("roundingDecimals must be an integer in [0, 6]");
44
31
  }
45
32
  return {
46
- protocol: HCS26_PROTOCOL,
47
- indexed: indexedSegment === 0,
48
- ttlSeconds,
49
- topicType: parsedTopicType.data
33
+ version: input.version,
34
+ adapters: input.adapters,
35
+ staleMultiplier,
36
+ roundingDecimals,
37
+ computeConfidence: input.computeConfidence ?? false
50
38
  };
51
39
  }
52
- function buildHcs26TransactionMemo(input) {
53
- const operation = hcs26OperationEnumSchema.parse(input.operation);
54
- const topicType = hcs26TopicTypeEnumSchema.parse(input.topicType);
55
- return `${HCS26_PROTOCOL}:op:${operation}:${topicType}`;
40
+ function validateAdapter(adapter, seenAdapterIds) {
41
+ if (typeof adapter.id !== "string" || !isValidAdapterId(adapter.id)) {
42
+ throw new TypeError(
43
+ `invalid adapterId "${String(adapter.id)}": adapter identifiers must match ^[a-z][a-z0-9]*(-[a-z][a-z0-9]*)*$`
44
+ );
45
+ }
46
+ if (seenAdapterIds.has(adapter.id)) {
47
+ throw new TypeError(
48
+ `duplicate adapterId "${adapter.id}": adapter identifiers must be unique within a configuration`
49
+ );
50
+ }
51
+ if (adapter.weight !== void 0 && (!Number.isFinite(adapter.weight) || adapter.weight < 0)) {
52
+ throw new TypeError(
53
+ `adapter "${adapter.id}" weight must be a finite non-negative number`
54
+ );
55
+ }
56
+ if (!Array.isArray(adapter.components) || adapter.components.length === 0) {
57
+ throw new TypeError(
58
+ `adapter "${adapter.id}" must declare at least one component`
59
+ );
60
+ }
61
+ if (adapter.defaultComponentKey !== void 0 && !isValidComponentKey(adapter.defaultComponentKey)) {
62
+ throw new TypeError(
63
+ `adapter "${adapter.id}" defaultComponentKey must be a valid component key`
64
+ );
65
+ }
66
+ for (const component of adapter.components) {
67
+ if (typeof component.name !== "string" || !isValidComponentName(component.name)) {
68
+ throw new TypeError(
69
+ `adapter "${adapter.id}" component name "${String(component.name)}" is not a valid component key segment`
70
+ );
71
+ }
72
+ if (component.weight !== void 0 && (!Number.isFinite(component.weight) || component.weight < 0)) {
73
+ throw new TypeError(
74
+ `adapter "${adapter.id}" component "${component.name}" weight must be a finite non-negative number`
75
+ );
76
+ }
77
+ if (typeof component.normalize !== "function") {
78
+ throw new TypeError(
79
+ `adapter "${adapter.id}" component "${component.name}" must declare a normalize function`
80
+ );
81
+ }
82
+ }
56
83
  }
57
- function parseHcs26TransactionMemo(memoRaw) {
58
- const memo = memoRaw.trim();
59
- if (!memo) {
60
- return null;
84
+ function isAdapterApplicable(adapter, subject) {
85
+ if (adapter.includeRegistries) {
86
+ if (subject.registry === void 0 || !adapter.includeRegistries.includes(subject.registry)) {
87
+ return false;
88
+ }
61
89
  }
62
- const match = memo.match(/^hcs-26:op:(\d+):(\d+)$/);
63
- if (!match) {
64
- return null;
90
+ if (adapter.excludeRegistries && subject.registry !== void 0 && adapter.excludeRegistries.includes(subject.registry)) {
91
+ return false;
65
92
  }
66
- const operation = Number(match[1]);
67
- const topicType = Number(match[2]);
68
- if (![operation, topicType].every(Number.isFinite)) {
69
- return null;
93
+ if (adapter.appliesTo && !adapter.appliesTo(subject)) {
94
+ return false;
70
95
  }
71
- const parsedOperation = hcs26OperationEnumSchema.safeParse(operation);
72
- if (!parsedOperation.success) {
73
- return null;
96
+ return true;
97
+ }
98
+ function computeTrustScore(input) {
99
+ const config = compileScoringConfig(input.config);
100
+ const subject = hcs25SubjectSchema.parse(input.subject);
101
+ const snapshot = hcs25SignalSnapshotSchema.parse(input.snapshot);
102
+ const context = { subject, snapshot, config };
103
+ const adapterScores = [];
104
+ const trustScores = {};
105
+ for (const adapter of config.adapters) {
106
+ const adapterScore = scoreAdapter(adapter, subject, context, config);
107
+ adapterScores.push(adapterScore);
108
+ if (adapterScore.applicable) {
109
+ for (const component of adapterScore.components) {
110
+ trustScores[component.key] = component.value;
111
+ }
112
+ }
74
113
  }
75
- const parsedTopicType = hcs26TopicTypeEnumSchema.safeParse(topicType);
76
- if (!parsedTopicType.success) {
77
- return null;
114
+ const denominator = adapterScores.filter((score) => score.inDenominator);
115
+ const totalWeight = denominator.reduce((sum, score) => sum + score.weight, 0);
116
+ const weightedSum = denominator.reduce(
117
+ (sum, score) => sum + score.total * score.weight,
118
+ 0
119
+ );
120
+ const total = totalWeight > 0 ? roundScore(weightedSum / totalWeight, config.roundingDecimals) : 0;
121
+ trustScores.total = total;
122
+ const record = {
123
+ trustScore: total,
124
+ trustScores,
125
+ trustScoreConfigVersion: config.version,
126
+ trustScoreUpdatedAt: (input.now ?? /* @__PURE__ */ new Date()).toISOString(),
127
+ breakdown: { adapters: adapterScores }
128
+ };
129
+ if (config.computeConfidence) {
130
+ record.trustConfidence = computeConfidence(denominator, totalWeight);
131
+ }
132
+ return record;
133
+ }
134
+ function scoreAdapter(adapter, subject, context, config) {
135
+ const weight = adapter.weight ?? HCS25_DEFAULT_WEIGHT;
136
+ const contributionMode = adapter.contributionMode ?? HCS25_DEFAULT_CONTRIBUTION_MODE;
137
+ const applicable = isAdapterApplicable(adapter, subject);
138
+ const components = [];
139
+ const unavailable = [];
140
+ if (applicable) {
141
+ for (const component of adapter.components) {
142
+ const key = `${adapter.id}.${component.name}`;
143
+ const normalized = normalizeComponent(component.normalize(context));
144
+ if (normalized === null) {
145
+ if (component.nonScorableWhenUnavailable) {
146
+ unavailable.push(key);
147
+ } else {
148
+ components.push({
149
+ key,
150
+ value: 0,
151
+ status: "missing",
152
+ weight: resolveWeight(component.weight)
153
+ });
154
+ }
155
+ continue;
156
+ }
157
+ const value = normalized.status === "stale" ? clampScore(normalized.value * config.staleMultiplier) : clampScore(normalized.value);
158
+ components.push({
159
+ key,
160
+ value,
161
+ status: normalized.status,
162
+ weight: resolveWeight(component.weight)
163
+ });
164
+ }
165
+ if (components.length === 0 && contributionMode !== HCS25_DEFAULT_CONTRIBUTION_MODE) {
166
+ const defaultKey = adapter.defaultComponentKey ?? `${adapter.id}.score`;
167
+ components.push({
168
+ key: defaultKey,
169
+ value: 0,
170
+ status: "missing",
171
+ weight: HCS25_DEFAULT_WEIGHT
172
+ });
173
+ }
174
+ }
175
+ let inDenominator = false;
176
+ if (applicable) {
177
+ inDenominator = contributionMode === "conditional" ? components.length > 0 : true;
178
+ if (weight === 0) {
179
+ inDenominator = false;
180
+ }
78
181
  }
79
182
  return {
80
- protocol: HCS26_PROTOCOL,
81
- operation: parsedOperation.data,
82
- topicType: parsedTopicType.data
183
+ adapterId: adapter.id,
184
+ contributionMode,
185
+ applicable,
186
+ inDenominator,
187
+ weight,
188
+ components,
189
+ unavailable,
190
+ total: adapterTotal(components, config.roundingDecimals)
83
191
  };
84
192
  }
85
- const hcs26TopicMemoSchema = z.string().transform((value) => {
86
- const parsed = parseHcs26TopicMemo(value);
87
- if (!parsed) {
88
- throw new Error("Invalid HCS-26 topic memo");
89
- }
90
- return parsed;
91
- });
92
- const hcs26TransactionMemoSchema = z.string().transform((value) => {
93
- const parsed = parseHcs26TransactionMemo(value);
94
- if (!parsed) {
95
- throw new Error("Invalid HCS-26 transaction memo");
96
- }
97
- return parsed;
98
- });
193
+ function normalizeComponent(normalized) {
194
+ if (!Number.isFinite(normalized.value)) {
195
+ return null;
196
+ }
197
+ if (normalized.status === "missing" || normalized.status === "timeout" || normalized.status === "error") {
198
+ return null;
199
+ }
200
+ return normalized;
201
+ }
202
+ function resolveWeight(weight) {
203
+ return weight ?? HCS25_DEFAULT_WEIGHT;
204
+ }
205
+ function adapterTotal(components, roundingDecimals) {
206
+ if (components.length === 0) {
207
+ return 0;
208
+ }
209
+ let weightedSum = 0;
210
+ let totalWeight = 0;
211
+ for (const component of components) {
212
+ weightedSum += component.value * component.weight;
213
+ totalWeight += component.weight;
214
+ }
215
+ const mean = totalWeight > 0 ? weightedSum / totalWeight : 0;
216
+ return roundScore(clampScore(mean), roundingDecimals);
217
+ }
218
+ function computeConfidence(denominator, totalWeight) {
219
+ if (totalWeight <= 0) {
220
+ return 0;
221
+ }
222
+ let weightedSum = 0;
223
+ for (const adapter of denominator) {
224
+ const okCount = adapter.components.filter(
225
+ (component) => component.status === "ok"
226
+ ).length;
227
+ const adapterConfidence = adapter.components.length > 0 ? okCount / adapter.components.length : 0;
228
+ weightedSum += adapter.weight * adapterConfidence;
229
+ }
230
+ return roundScore(weightedSum / totalWeight, 4);
231
+ }
99
232
  export {
100
- HCS26_DEFAULT_TTL_SECONDS,
101
- buildHcs26TopicMemo,
102
- buildHcs26TransactionMemo,
103
- hcs26TopicMemoSchema,
104
- hcs26TransactionMemoSchema,
105
- parseHcs26TopicMemo,
106
- parseHcs26TransactionMemo
233
+ clampScore,
234
+ compileScoringConfig,
235
+ computeTrustScore,
236
+ isAdapterApplicable,
237
+ roundScore
107
238
  };
108
239
  //# sourceMappingURL=standards-sdk.es119.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"standards-sdk.es119.js","sources":["../../src/hcs-26/memos.ts"],"sourcesContent":["import { z } from 'zod';\nimport {\n HCS26_PROTOCOL,\n hcs26OperationEnumSchema,\n hcs26TopicTypeEnumSchema,\n type Hcs26OperationEnum,\n type Hcs26TopicTypeEnum,\n} from './types';\n\nexport type Hcs26TopicMemo = {\n protocol: typeof HCS26_PROTOCOL;\n indexed: boolean;\n ttlSeconds: number;\n topicType: Hcs26TopicTypeEnum;\n};\n\nexport const HCS26_DEFAULT_TTL_SECONDS = 86400;\n\nfunction toPositiveInt(value: number): number {\n if (!Number.isFinite(value)) {\n throw new Error('Expected a finite number');\n }\n const intValue = Math.floor(value);\n if (intValue <= 0) {\n throw new Error('Expected a positive integer');\n }\n return intValue;\n}\n\nexport function buildHcs26TopicMemo(input: {\n indexed?: boolean;\n ttlSeconds?: number;\n topicType: Hcs26TopicTypeEnum;\n}): string {\n const indexed = input.indexed ?? true;\n const ttlSeconds = toPositiveInt(\n input.ttlSeconds ?? HCS26_DEFAULT_TTL_SECONDS,\n );\n const topicType = hcs26TopicTypeEnumSchema.parse(input.topicType);\n\n // HCS-2 memo convention: indexed topics use \"0\" in the second segment.\n const indexedSegment = indexed ? '0' : '1';\n return `${HCS26_PROTOCOL}:${indexedSegment}:${ttlSeconds}:${topicType}`;\n}\n\nexport function parseHcs26TopicMemo(memoRaw: string): Hcs26TopicMemo | null {\n const memo = memoRaw.trim();\n if (!memo) {\n return null;\n }\n\n const match = memo.match(/^hcs-26:(\\d+):(\\d+):(\\d+)$/);\n if (!match) {\n return null;\n }\n\n const indexedSegment = Number(match[1]);\n const ttlSeconds = Number(match[2]);\n const topicType = Number(match[3]);\n\n if (![indexedSegment, ttlSeconds, topicType].every(Number.isFinite)) {\n return null;\n }\n\n const parsedTopicType = hcs26TopicTypeEnumSchema.safeParse(topicType);\n if (!parsedTopicType.success) {\n return null;\n }\n\n if (indexedSegment !== 0 && indexedSegment !== 1) {\n return null;\n }\n\n return {\n protocol: HCS26_PROTOCOL,\n indexed: indexedSegment === 0,\n ttlSeconds,\n topicType: parsedTopicType.data,\n };\n}\n\nexport function buildHcs26TransactionMemo(input: {\n operation: Hcs26OperationEnum;\n topicType: Hcs26TopicTypeEnum;\n}): string {\n const operation = hcs26OperationEnumSchema.parse(input.operation);\n const topicType = hcs26TopicTypeEnumSchema.parse(input.topicType);\n return `${HCS26_PROTOCOL}:op:${operation}:${topicType}`;\n}\n\nexport type Hcs26TransactionMemo = {\n protocol: typeof HCS26_PROTOCOL;\n operation: Hcs26OperationEnum;\n topicType: Hcs26TopicTypeEnum;\n};\n\nexport function parseHcs26TransactionMemo(\n memoRaw: string,\n): Hcs26TransactionMemo | null {\n const memo = memoRaw.trim();\n if (!memo) {\n return null;\n }\n\n const match = memo.match(/^hcs-26:op:(\\d+):(\\d+)$/);\n if (!match) {\n return null;\n }\n\n const operation = Number(match[1]);\n const topicType = Number(match[2]);\n if (![operation, topicType].every(Number.isFinite)) {\n return null;\n }\n\n const parsedOperation = hcs26OperationEnumSchema.safeParse(operation);\n if (!parsedOperation.success) {\n return null;\n }\n const parsedTopicType = hcs26TopicTypeEnumSchema.safeParse(topicType);\n if (!parsedTopicType.success) {\n return null;\n }\n\n return {\n protocol: HCS26_PROTOCOL,\n operation: parsedOperation.data,\n topicType: parsedTopicType.data,\n };\n}\n\nexport const hcs26TopicMemoSchema = z.string().transform(value => {\n const parsed = parseHcs26TopicMemo(value);\n if (!parsed) {\n throw new Error('Invalid HCS-26 topic memo');\n }\n return parsed;\n});\n\nexport const hcs26TransactionMemoSchema = z.string().transform(value => {\n const parsed = parseHcs26TransactionMemo(value);\n if (!parsed) {\n throw new Error('Invalid HCS-26 transaction memo');\n }\n return parsed;\n});\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"standards-sdk.es119.js","sources":["../../src/hcs-25/scoring.ts"],"sourcesContent":["import {\n isValidAdapterId,\n isValidComponentKey,\n isValidComponentName,\n} from './identifiers';\nimport {\n HCS25_DEFAULT_CONTRIBUTION_MODE,\n HCS25_DEFAULT_ROUNDING_DECIMALS,\n HCS25_DEFAULT_STALE_MULTIPLIER,\n HCS25_DEFAULT_WEIGHT,\n hcs25SignalSnapshotSchema,\n hcs25SubjectSchema,\n} from './types';\nimport type {\n Hcs25AdapterDefinition,\n Hcs25AdapterScore,\n Hcs25ComponentResult,\n Hcs25ContributionMode,\n Hcs25NormalizedValue,\n Hcs25ScoringConfig,\n Hcs25ScoringConfigInput,\n Hcs25SignalSnapshot,\n Hcs25Subject,\n Hcs25TrustScoreRecord,\n} from './types';\n\n/**\n * Clamps a finite component value into the HCS-25 range [0, 100].\n */\nexport function clampScore(value: number): number {\n return Math.min(100, Math.max(0, value));\n}\n\n/**\n * Rounds a value to a stable decimal precision (default 2, per HCS-25).\n */\nexport function roundScore(value: number, decimals = 2): number {\n const factor = 10 ** decimals;\n return Math.round(value * factor) / factor;\n}\n\n/**\n * Validates an adapter set and resolves configuration defaults. The returned\n * configuration is safe to pass to {@link computeTrustScore}.\n */\nexport function compileScoringConfig(\n input: Hcs25ScoringConfigInput,\n): Hcs25ScoringConfig {\n if (!Number.isInteger(input.version) || input.version < 0) {\n throw new TypeError(\n 'trustScoreConfigVersion must be a non-negative integer',\n );\n }\n\n if (!Array.isArray(input.adapters) || input.adapters.length === 0) {\n throw new TypeError('at least one trust adapter is required');\n }\n\n const seenAdapterIds = new Set<string>();\n for (const adapter of input.adapters) {\n validateAdapter(adapter, seenAdapterIds);\n seenAdapterIds.add(adapter.id);\n }\n\n const staleMultiplier =\n input.staleMultiplier ?? HCS25_DEFAULT_STALE_MULTIPLIER;\n if (\n !Number.isFinite(staleMultiplier) ||\n staleMultiplier < 0 ||\n staleMultiplier > 1\n ) {\n throw new TypeError('staleMultiplier must be a number in [0, 1]');\n }\n\n const roundingDecimals =\n input.roundingDecimals ?? HCS25_DEFAULT_ROUNDING_DECIMALS;\n if (\n !Number.isInteger(roundingDecimals) ||\n roundingDecimals < 0 ||\n roundingDecimals > 6\n ) {\n throw new TypeError('roundingDecimals must be an integer in [0, 6]');\n }\n\n return {\n version: input.version,\n adapters: input.adapters,\n staleMultiplier,\n roundingDecimals,\n computeConfidence: input.computeConfidence ?? false,\n };\n}\n\nfunction validateAdapter(\n adapter: Hcs25AdapterDefinition,\n seenAdapterIds: Set<string>,\n): void {\n if (typeof adapter.id !== 'string' || !isValidAdapterId(adapter.id)) {\n throw new TypeError(\n `invalid adapterId \"${String(adapter.id)}\": adapter identifiers must match ^[a-z][a-z0-9]*(-[a-z][a-z0-9]*)*$`,\n );\n }\n\n if (seenAdapterIds.has(adapter.id)) {\n throw new TypeError(\n `duplicate adapterId \"${adapter.id}\": adapter identifiers must be unique within a configuration`,\n );\n }\n\n if (\n adapter.weight !== undefined &&\n (!Number.isFinite(adapter.weight) || adapter.weight < 0)\n ) {\n throw new TypeError(\n `adapter \"${adapter.id}\" weight must be a finite non-negative number`,\n );\n }\n\n if (!Array.isArray(adapter.components) || adapter.components.length === 0) {\n throw new TypeError(\n `adapter \"${adapter.id}\" must declare at least one component`,\n );\n }\n\n if (\n adapter.defaultComponentKey !== undefined &&\n !isValidComponentKey(adapter.defaultComponentKey)\n ) {\n throw new TypeError(\n `adapter \"${adapter.id}\" defaultComponentKey must be a valid component key`,\n );\n }\n\n for (const component of adapter.components) {\n if (\n typeof component.name !== 'string' ||\n !isValidComponentName(component.name)\n ) {\n throw new TypeError(\n `adapter \"${adapter.id}\" component name \"${String(component.name)}\" is not a valid component key segment`,\n );\n }\n\n if (\n component.weight !== undefined &&\n (!Number.isFinite(component.weight) || component.weight < 0)\n ) {\n throw new TypeError(\n `adapter \"${adapter.id}\" component \"${component.name}\" weight must be a finite non-negative number`,\n );\n }\n\n if (typeof component.normalize !== 'function') {\n throw new TypeError(\n `adapter \"${adapter.id}\" component \"${component.name}\" must declare a normalize function`,\n );\n }\n }\n}\n\n/**\n * Evaluates adapter applicability against a subject using registry\n * include/exclude lists and the optional appliesTo predicate.\n */\nexport function isAdapterApplicable(\n adapter: Hcs25AdapterDefinition,\n subject: Hcs25Subject,\n): boolean {\n if (adapter.includeRegistries) {\n if (\n subject.registry === undefined ||\n !adapter.includeRegistries.includes(subject.registry)\n ) {\n return false;\n }\n }\n\n if (\n adapter.excludeRegistries &&\n subject.registry !== undefined &&\n adapter.excludeRegistries.includes(subject.registry)\n ) {\n return false;\n }\n\n if (adapter.appliesTo && !adapter.appliesTo(subject)) {\n return false;\n }\n\n return true;\n}\n\nexport interface Hcs25ComputeTrustScoreInput {\n subject: Hcs25Subject;\n snapshot: Hcs25SignalSnapshot;\n config: Hcs25ScoringConfigInput;\n now?: Date;\n}\n\n/**\n * Computes the composite AI Trust Score for a subject from a signal snapshot\n * and scoring configuration, following HCS-25 normalization, missing/stale\n * handling, applicability, and weighted-aggregation rules.\n */\nexport function computeTrustScore(\n input: Hcs25ComputeTrustScoreInput,\n): Hcs25TrustScoreRecord {\n const config = compileScoringConfig(input.config);\n const subject = hcs25SubjectSchema.parse(input.subject);\n const snapshot = hcs25SignalSnapshotSchema.parse(input.snapshot);\n const context = { subject, snapshot, config };\n\n const adapterScores: Hcs25AdapterScore[] = [];\n const trustScores: Record<string, number> = {};\n\n for (const adapter of config.adapters) {\n const adapterScore = scoreAdapter(adapter, subject, context, config);\n adapterScores.push(adapterScore);\n\n if (adapterScore.applicable) {\n for (const component of adapterScore.components) {\n trustScores[component.key] = component.value;\n }\n }\n }\n\n const denominator = adapterScores.filter(score => score.inDenominator);\n const totalWeight = denominator.reduce((sum, score) => sum + score.weight, 0);\n const weightedSum = denominator.reduce(\n (sum, score) => sum + score.total * score.weight,\n 0,\n );\n const total =\n totalWeight > 0\n ? roundScore(weightedSum / totalWeight, config.roundingDecimals)\n : 0;\n\n trustScores.total = total;\n\n const record: Hcs25TrustScoreRecord = {\n trustScore: total,\n trustScores,\n trustScoreConfigVersion: config.version,\n trustScoreUpdatedAt: (input.now ?? new Date()).toISOString(),\n breakdown: { adapters: adapterScores },\n };\n\n if (config.computeConfidence) {\n record.trustConfidence = computeConfidence(denominator, totalWeight);\n }\n\n return record;\n}\n\nfunction scoreAdapter(\n adapter: Hcs25AdapterDefinition,\n subject: Hcs25Subject,\n context: {\n subject: Hcs25Subject;\n snapshot: Hcs25SignalSnapshot;\n config: Hcs25ScoringConfig;\n },\n config: Hcs25ScoringConfig,\n): Hcs25AdapterScore {\n const weight = adapter.weight ?? HCS25_DEFAULT_WEIGHT;\n const contributionMode: Hcs25ContributionMode =\n adapter.contributionMode ?? HCS25_DEFAULT_CONTRIBUTION_MODE;\n const applicable = isAdapterApplicable(adapter, subject);\n\n const components: Hcs25ComponentResult[] = [];\n const unavailable: string[] = [];\n\n if (applicable) {\n for (const component of adapter.components) {\n const key = `${adapter.id}.${component.name}`;\n const normalized = normalizeComponent(component.normalize(context));\n\n if (normalized === null) {\n if (component.nonScorableWhenUnavailable) {\n unavailable.push(key);\n } else {\n components.push({\n key,\n value: 0,\n status: 'missing',\n weight: resolveWeight(component.weight),\n });\n }\n continue;\n }\n\n const value =\n normalized.status === 'stale'\n ? clampScore(normalized.value * config.staleMultiplier)\n : clampScore(normalized.value);\n\n components.push({\n key,\n value,\n status: normalized.status,\n weight: resolveWeight(component.weight),\n });\n }\n\n if (\n components.length === 0 &&\n contributionMode !== HCS25_DEFAULT_CONTRIBUTION_MODE\n ) {\n const defaultKey = adapter.defaultComponentKey ?? `${adapter.id}.score`;\n components.push({\n key: defaultKey,\n value: 0,\n status: 'missing',\n weight: HCS25_DEFAULT_WEIGHT,\n });\n }\n }\n\n let inDenominator = false;\n if (applicable) {\n inDenominator =\n contributionMode === 'conditional' ? components.length > 0 : true;\n if (weight === 0) {\n inDenominator = false;\n }\n }\n\n return {\n adapterId: adapter.id,\n contributionMode,\n applicable,\n inDenominator,\n weight,\n components,\n unavailable,\n total: adapterTotal(components, config.roundingDecimals),\n };\n}\n\nfunction normalizeComponent(\n normalized: Hcs25NormalizedValue,\n): Hcs25NormalizedValue | null {\n if (!Number.isFinite(normalized.value)) {\n return null;\n }\n\n if (\n normalized.status === 'missing' ||\n normalized.status === 'timeout' ||\n normalized.status === 'error'\n ) {\n return null;\n }\n\n return normalized;\n}\n\nfunction resolveWeight(weight: number | undefined): number {\n return weight ?? HCS25_DEFAULT_WEIGHT;\n}\n\nfunction adapterTotal(\n components: Hcs25ComponentResult[],\n roundingDecimals: number,\n): number {\n if (components.length === 0) {\n return 0;\n }\n\n let weightedSum = 0;\n let totalWeight = 0;\n for (const component of components) {\n weightedSum += component.value * component.weight;\n totalWeight += component.weight;\n }\n\n const mean = totalWeight > 0 ? weightedSum / totalWeight : 0;\n return roundScore(clampScore(mean), roundingDecimals);\n}\n\nfunction computeConfidence(\n denominator: Hcs25AdapterScore[],\n totalWeight: number,\n): number {\n if (totalWeight <= 0) {\n return 0;\n }\n\n let weightedSum = 0;\n for (const adapter of denominator) {\n const okCount = adapter.components.filter(\n component => component.status === 'ok',\n ).length;\n const adapterConfidence =\n adapter.components.length > 0 ? okCount / adapter.components.length : 0;\n weightedSum += adapter.weight * adapterConfidence;\n }\n\n return roundScore(weightedSum / totalWeight, 4);\n}\n"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { buildTopicCreateTx, buildMessageTx } from "./standards-sdk.es161.js";
1
+ import { buildTopicCreateTx, buildMessageTx } from "./standards-sdk.es165.js";
2
2
  import { HCS7ConfigType, HCS7Operation } from "./standards-sdk.es8.js";
3
3
  function buildHcs7CreateRegistryTx(params) {
4
4
  const memo = `hcs-7:indexed:${params.ttl}`;