@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.
- package/dist/browser/hcs-25/identifiers.d.ts +24 -0
- package/dist/browser/hcs-25/identifiers.d.ts.map +1 -0
- package/dist/browser/hcs-25/index.d.ts +4 -0
- package/dist/browser/hcs-25/index.d.ts.map +1 -0
- package/dist/browser/hcs-25/scoring.d.ts +32 -0
- package/dist/browser/hcs-25/scoring.d.ts.map +1 -0
- package/dist/browser/hcs-25/types.d.ts +363 -0
- package/dist/browser/hcs-25/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-root/hcs-25/identifiers.d.ts +24 -0
- package/dist/browser-root/hcs-25/identifiers.d.ts.map +1 -0
- package/dist/browser-root/hcs-25/index.d.ts +4 -0
- package/dist/browser-root/hcs-25/index.d.ts.map +1 -0
- package/dist/browser-root/hcs-25/scoring.d.ts +32 -0
- package/dist/browser-root/hcs-25/scoring.d.ts.map +1 -0
- package/dist/browser-root/hcs-25/types.d.ts +363 -0
- package/dist/browser-root/hcs-25/types.d.ts.map +1 -0
- package/dist/browser-root/index.d.ts +1 -0
- package/dist/browser-root/index.d.ts.map +1 -1
- package/dist/cjs/hcs-25/identifiers.d.ts +24 -0
- package/dist/cjs/hcs-25/identifiers.d.ts.map +1 -0
- package/dist/cjs/hcs-25/index.d.ts +4 -0
- package/dist/cjs/hcs-25/index.d.ts.map +1 -0
- package/dist/cjs/hcs-25/scoring.d.ts +32 -0
- package/dist/cjs/hcs-25/scoring.d.ts.map +1 -0
- package/dist/cjs/hcs-25/types.d.ts +363 -0
- package/dist/cjs/hcs-25/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 +1 -1
- package/dist/cjs/standards-sdk.cjs.map +1 -1
- package/dist/es/hcs-25/identifiers.d.ts +24 -0
- package/dist/es/hcs-25/identifiers.d.ts.map +1 -0
- package/dist/es/hcs-25/index.d.ts +4 -0
- package/dist/es/hcs-25/index.d.ts.map +1 -0
- package/dist/es/hcs-25/scoring.d.ts +32 -0
- package/dist/es/hcs-25/scoring.d.ts.map +1 -0
- package/dist/es/hcs-25/types.d.ts +363 -0
- package/dist/es/hcs-25/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 +62 -40
- 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.es115.js +3 -3
- package/dist/es/standards-sdk.es116.js +4 -4
- package/dist/es/standards-sdk.es117.js +19 -251
- package/dist/es/standards-sdk.es117.js.map +1 -1
- package/dist/es/standards-sdk.es118.js +60 -475
- package/dist/es/standards-sdk.es118.js.map +1 -1
- package/dist/es/standards-sdk.es119.js +217 -86
- 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 +242 -150
- package/dist/es/standards-sdk.es120.js.map +1 -1
- package/dist/es/standards-sdk.es121.js +470 -26
- package/dist/es/standards-sdk.es121.js.map +1 -1
- package/dist/es/standards-sdk.es122.js +103 -10
- package/dist/es/standards-sdk.es122.js.map +1 -1
- package/dist/es/standards-sdk.es123.js +145 -167
- package/dist/es/standards-sdk.es123.js.map +1 -1
- package/dist/es/standards-sdk.es124.js +30 -25
- package/dist/es/standards-sdk.es124.js.map +1 -1
- package/dist/es/standards-sdk.es125.js +10 -20
- package/dist/es/standards-sdk.es125.js.map +1 -1
- package/dist/es/standards-sdk.es126.js +159 -137
- package/dist/es/standards-sdk.es126.js.map +1 -1
- package/dist/es/standards-sdk.es127.js +27 -199
- package/dist/es/standards-sdk.es127.js.map +1 -1
- package/dist/es/standards-sdk.es128.js +15 -783
- package/dist/es/standards-sdk.es128.js.map +1 -1
- package/dist/es/standards-sdk.es129.js +157 -10
- 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 +198 -564
- package/dist/es/standards-sdk.es130.js.map +1 -1
- package/dist/es/standards-sdk.es131.js +703 -539
- package/dist/es/standards-sdk.es131.js.map +1 -1
- package/dist/es/standards-sdk.es132.js +12 -12
- package/dist/es/standards-sdk.es132.js.map +1 -1
- package/dist/es/standards-sdk.es133.js +567 -2
- package/dist/es/standards-sdk.es133.js.map +1 -1
- package/dist/es/standards-sdk.es134.js +610 -71
- package/dist/es/standards-sdk.es134.js.map +1 -1
- package/dist/es/standards-sdk.es135.js +12 -39
- package/dist/es/standards-sdk.es135.js.map +1 -1
- package/dist/es/standards-sdk.es136.js +2 -2
- package/dist/es/standards-sdk.es136.js.map +1 -1
- package/dist/es/standards-sdk.es137.js +42 -190
- package/dist/es/standards-sdk.es137.js.map +1 -1
- package/dist/es/standards-sdk.es138.js +39 -1139
- package/dist/es/standards-sdk.es138.js.map +1 -1
- package/dist/es/standards-sdk.es139.js +2 -306
- 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 +231 -418
- package/dist/es/standards-sdk.es140.js.map +1 -1
- package/dist/es/standards-sdk.es141.js +1135 -350
- package/dist/es/standards-sdk.es141.js.map +1 -1
- package/dist/es/standards-sdk.es142.js +268 -1084
- package/dist/es/standards-sdk.es142.js.map +1 -1
- package/dist/es/standards-sdk.es143.js +418 -204
- package/dist/es/standards-sdk.es143.js.map +1 -1
- package/dist/es/standards-sdk.es144.js +350 -1562
- package/dist/es/standards-sdk.es144.js.map +1 -1
- package/dist/es/standards-sdk.es145.js +1061 -1096
- package/dist/es/standards-sdk.es145.js.map +1 -1
- package/dist/es/standards-sdk.es146.js +204 -13
- package/dist/es/standards-sdk.es146.js.map +1 -1
- package/dist/es/standards-sdk.es147.js +1541 -233
- package/dist/es/standards-sdk.es147.js.map +1 -1
- package/dist/es/standards-sdk.es148.js +1157 -4
- package/dist/es/standards-sdk.es148.js.map +1 -1
- package/dist/es/standards-sdk.es149.js +15 -79
- 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 +250 -78
- package/dist/es/standards-sdk.es150.js.map +1 -1
- package/dist/es/standards-sdk.es151.js +4 -60
- package/dist/es/standards-sdk.es151.js.map +1 -1
- package/dist/es/standards-sdk.es152.js +80 -2546
- package/dist/es/standards-sdk.es152.js.map +1 -1
- package/dist/es/standards-sdk.es153.js +80 -152
- package/dist/es/standards-sdk.es153.js.map +1 -1
- package/dist/es/standards-sdk.es154.js +60 -7
- package/dist/es/standards-sdk.es154.js.map +1 -1
- package/dist/es/standards-sdk.es155.js +2547 -86
- package/dist/es/standards-sdk.es155.js.map +1 -1
- package/dist/es/standards-sdk.es156.js +144 -50
- package/dist/es/standards-sdk.es156.js.map +1 -1
- package/dist/es/standards-sdk.es157.js +7 -30
- package/dist/es/standards-sdk.es157.js.map +1 -1
- package/dist/es/standards-sdk.es158.js +86 -34
- package/dist/es/standards-sdk.es158.js.map +1 -1
- package/dist/es/standards-sdk.es159.js +65 -48
- 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 +30 -138
- package/dist/es/standards-sdk.es160.js.map +1 -1
- package/dist/es/standards-sdk.es161.js +34 -42
- package/dist/es/standards-sdk.es161.js.map +1 -1
- package/dist/es/standards-sdk.es162.js +48 -12482
- package/dist/es/standards-sdk.es162.js.map +1 -1
- package/dist/es/standards-sdk.es163.js +12479 -53
- package/dist/es/standards-sdk.es163.js.map +1 -1
- package/dist/es/standards-sdk.es164.js +124 -97
- package/dist/es/standards-sdk.es164.js.map +1 -1
- package/dist/es/standards-sdk.es165.js +35 -74
- package/dist/es/standards-sdk.es165.js.map +1 -1
- package/dist/es/standards-sdk.es166.js +14 -197
- package/dist/es/standards-sdk.es166.js.map +1 -1
- package/dist/es/standards-sdk.es167.js +54 -15
- package/dist/es/standards-sdk.es167.js.map +1 -1
- package/dist/es/standards-sdk.es168.js +90 -651
- package/dist/es/standards-sdk.es168.js.map +1 -1
- package/dist/es/standards-sdk.es169.js +70 -161
- package/dist/es/standards-sdk.es169.js.map +1 -1
- package/dist/es/standards-sdk.es170.js +187 -309
- package/dist/es/standards-sdk.es170.js.map +1 -1
- package/dist/es/standards-sdk.es171.js +661 -335
- package/dist/es/standards-sdk.es171.js.map +1 -1
- package/dist/es/standards-sdk.es172.js +64 -444
- package/dist/es/standards-sdk.es172.js.map +1 -1
- package/dist/es/standards-sdk.es173.js +142 -301
- package/dist/es/standards-sdk.es173.js.map +1 -1
- package/dist/es/standards-sdk.es174.js +310 -64
- package/dist/es/standards-sdk.es174.js.map +1 -1
- package/dist/es/standards-sdk.es175.js +337 -64
- package/dist/es/standards-sdk.es175.js.map +1 -1
- package/dist/es/standards-sdk.es176.js +438 -124
- package/dist/es/standards-sdk.es176.js.map +1 -1
- package/dist/es/standards-sdk.es177.js +310 -496
- package/dist/es/standards-sdk.es177.js.map +1 -1
- package/dist/es/standards-sdk.es178.js +60 -243
- package/dist/es/standards-sdk.es178.js.map +1 -1
- package/dist/es/standards-sdk.es179.js +118 -175
- 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 +465 -67
- package/dist/es/standards-sdk.es180.js.map +1 -1
- package/dist/es/standards-sdk.es181.js +250 -143
- package/dist/es/standards-sdk.es181.js.map +1 -1
- package/dist/es/standards-sdk.es182.js +172 -160
- package/dist/es/standards-sdk.es182.js.map +1 -1
- package/dist/es/standards-sdk.es183.js +65 -630
- package/dist/es/standards-sdk.es183.js.map +1 -1
- package/dist/es/standards-sdk.es184.js +128 -161
- package/dist/es/standards-sdk.es184.js.map +1 -1
- package/dist/es/standards-sdk.es185.js +144 -195
- package/dist/es/standards-sdk.es185.js.map +1 -1
- package/dist/es/standards-sdk.es186.js +668 -223
- package/dist/es/standards-sdk.es186.js.map +1 -1
- package/dist/es/standards-sdk.es187.js +188 -0
- package/dist/es/standards-sdk.es187.js.map +1 -0
- package/dist/es/standards-sdk.es188.js +238 -0
- package/dist/es/standards-sdk.es188.js.map +1 -0
- package/dist/es/standards-sdk.es189.js +242 -0
- package/dist/es/standards-sdk.es189.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.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.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/package.json +1 -1
|
@@ -1,108 +1,239 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
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
|
|
15
|
-
const
|
|
16
|
-
|
|
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
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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
|
-
|
|
29
|
-
|
|
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
|
|
33
|
-
const
|
|
34
|
-
|
|
35
|
-
|
|
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
|
|
39
|
-
if (!
|
|
40
|
-
|
|
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
|
-
|
|
43
|
-
|
|
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
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
33
|
+
version: input.version,
|
|
34
|
+
adapters: input.adapters,
|
|
35
|
+
staleMultiplier,
|
|
36
|
+
roundingDecimals,
|
|
37
|
+
computeConfidence: input.computeConfidence ?? false
|
|
50
38
|
};
|
|
51
39
|
}
|
|
52
|
-
function
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
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
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
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
|
-
|
|
63
|
-
|
|
64
|
-
return null;
|
|
90
|
+
if (adapter.excludeRegistries && subject.registry !== void 0 && adapter.excludeRegistries.includes(subject.registry)) {
|
|
91
|
+
return false;
|
|
65
92
|
}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
if (![operation, topicType].every(Number.isFinite)) {
|
|
69
|
-
return null;
|
|
93
|
+
if (adapter.appliesTo && !adapter.appliesTo(subject)) {
|
|
94
|
+
return false;
|
|
70
95
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
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
|
|
76
|
-
|
|
77
|
-
|
|
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
|
-
|
|
81
|
-
|
|
82
|
-
|
|
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
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
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
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
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.
|
|
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}`;
|