@hashgraphonline/standards-sdk 0.1.183 → 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/services/registry-broker/index.d.ts +1 -0
- package/dist/browser/services/registry-broker/index.d.ts.map +1 -1
- package/dist/browser/services/registry-broker/schemas.d.ts +6 -0
- package/dist/browser/services/registry-broker/schemas.d.ts.map +1 -1
- package/dist/browser/services/registry-broker/types.d.ts +7 -1
- package/dist/browser/services/registry-broker/types.d.ts.map +1 -1
- package/dist/browser/standards-sdk.browser.js.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/browser-root/services/registry-broker/index.d.ts +1 -0
- package/dist/browser-root/services/registry-broker/index.d.ts.map +1 -1
- package/dist/browser-root/services/registry-broker/schemas.d.ts +6 -0
- package/dist/browser-root/services/registry-broker/schemas.d.ts.map +1 -1
- package/dist/browser-root/services/registry-broker/types.d.ts +7 -1
- package/dist/browser-root/services/registry-broker/types.d.ts.map +1 -1
- package/dist/browser-root/standards-sdk.root-browser.js +8 -1
- package/dist/browser-root/standards-sdk.root-browser.js.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/services/registry-broker/index.d.ts +1 -0
- package/dist/cjs/services/registry-broker/index.d.ts.map +1 -1
- package/dist/cjs/services/registry-broker/schemas.d.ts +6 -0
- package/dist/cjs/services/registry-broker/schemas.d.ts.map +1 -1
- package/dist/cjs/services/registry-broker/types.d.ts +7 -1
- package/dist/cjs/services/registry-broker/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-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/services/registry-broker/index.d.ts +1 -0
- package/dist/es/services/registry-broker/index.d.ts.map +1 -1
- package/dist/es/services/registry-broker/schemas.d.ts +6 -0
- package/dist/es/services/registry-broker/schemas.d.ts.map +1 -1
- package/dist/es/services/registry-broker/types.d.ts +7 -1
- package/dist/es/services/registry-broker/types.d.ts.map +1 -1
- package/dist/es/standards-sdk.es.js +69 -39
- 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 +75 -153
- package/dist/es/standards-sdk.es152.js.map +1 -1
- package/dist/es/standards-sdk.es153.js +87 -7
- package/dist/es/standards-sdk.es153.js.map +1 -1
- package/dist/es/standards-sdk.es154.js +54 -80
- package/dist/es/standards-sdk.es154.js.map +1 -1
- package/dist/es/standards-sdk.es155.js +2547 -65
- package/dist/es/standards-sdk.es155.js.map +1 -1
- package/dist/es/standards-sdk.es156.js +159 -30
- package/dist/es/standards-sdk.es156.js.map +1 -1
- package/dist/es/standards-sdk.es157.js +7 -34
- package/dist/es/standards-sdk.es157.js.map +1 -1
- package/dist/es/standards-sdk.es158.js +86 -48
- package/dist/es/standards-sdk.es158.js.map +1 -1
- package/dist/es/standards-sdk.es159.js +52 -125
- 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 -42
- package/dist/es/standards-sdk.es160.js.map +1 -1
- package/dist/es/standards-sdk.es161.js +32 -2538
- 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 +96 -58
- package/dist/es/standards-sdk.es168.js.map +1 -1
- package/dist/es/standards-sdk.es169.js +69 -660
- package/dist/es/standards-sdk.es169.js.map +1 -1
- package/dist/es/standards-sdk.es170.js +188 -160
- package/dist/es/standards-sdk.es170.js.map +1 -1
- package/dist/es/standards-sdk.es171.js +657 -307
- package/dist/es/standards-sdk.es171.js.map +1 -1
- package/dist/es/standards-sdk.es172.js +64 -337
- package/dist/es/standards-sdk.es172.js.map +1 -1
- package/dist/es/standards-sdk.es173.js +129 -410
- package/dist/es/standards-sdk.es173.js.map +1 -1
- package/dist/es/standards-sdk.es174.js +200 -209
- package/dist/es/standards-sdk.es174.js.map +1 -1
- package/dist/es/standards-sdk.es175.js +334 -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,203 +1,20 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
}
|
|
14
|
-
return trimmed;
|
|
15
|
-
}
|
|
16
|
-
function isSemver(value) {
|
|
17
|
-
return /^(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)(?:-[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?(?:\+[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?$/.test(
|
|
18
|
-
value
|
|
19
|
-
);
|
|
20
|
-
}
|
|
21
|
-
function normalizeAnsVersion(value) {
|
|
22
|
-
const trimmed = value.trim();
|
|
23
|
-
if (!trimmed) {
|
|
24
|
-
return null;
|
|
25
|
-
}
|
|
26
|
-
const withoutPrefix = trimmed.startsWith("v") || trimmed.startsWith("V") ? trimmed.slice(1) : trimmed;
|
|
27
|
-
if (!isSemver(withoutPrefix)) {
|
|
28
|
-
return null;
|
|
29
|
-
}
|
|
30
|
-
return withoutPrefix;
|
|
31
|
-
}
|
|
32
|
-
function parseAnsDnsTxtRecord(rawRecord) {
|
|
33
|
-
const fields = parseSemicolonFields(rawRecord);
|
|
34
|
-
const version = fields["v"];
|
|
35
|
-
const urlValue = fields["url"];
|
|
36
|
-
if (!version || !urlValue || version.toLowerCase() !== "ans1") {
|
|
37
|
-
return null;
|
|
38
|
-
}
|
|
39
|
-
let parsedUrl;
|
|
40
|
-
try {
|
|
41
|
-
parsedUrl = new URL(urlValue);
|
|
42
|
-
} catch {
|
|
43
|
-
return null;
|
|
44
|
-
}
|
|
45
|
-
if (parsedUrl.protocol.toLowerCase() !== "https:") {
|
|
46
|
-
return null;
|
|
47
|
-
}
|
|
48
|
-
const rawAnsVersion = fields["version"];
|
|
49
|
-
let normalizedAnsVersion;
|
|
50
|
-
if (rawAnsVersion !== void 0) {
|
|
51
|
-
const parsedVersion = normalizeAnsVersion(rawAnsVersion);
|
|
52
|
-
if (!parsedVersion) {
|
|
53
|
-
return null;
|
|
54
|
-
}
|
|
55
|
-
normalizedAnsVersion = parsedVersion;
|
|
56
|
-
}
|
|
57
|
-
return {
|
|
58
|
-
version: normalizedAnsVersion,
|
|
59
|
-
url: parsedUrl.toString()
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
function isValidAnsProfileVersion(value) {
|
|
63
|
-
return !!value && normalizeAnsVersion(value) !== null;
|
|
64
|
-
}
|
|
65
|
-
function hasProtocolPathSegment(pathname, protocol) {
|
|
66
|
-
const normalizedProtocol = protocol.trim().toLowerCase();
|
|
67
|
-
if (!normalizedProtocol) {
|
|
68
|
-
return false;
|
|
69
|
-
}
|
|
70
|
-
const pathSegments = pathname.split("/").map((segment) => segment.trim()).filter((segment) => segment.length > 0);
|
|
71
|
-
for (const segment of pathSegments) {
|
|
72
|
-
if (segment.toLowerCase() === normalizedProtocol) {
|
|
73
|
-
return true;
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
return false;
|
|
77
|
-
}
|
|
78
|
-
function extractEndpointCandidates(endpoints, supportedSchemes) {
|
|
79
|
-
const candidates = [];
|
|
80
|
-
for (const [key, value] of Object.entries(endpoints)) {
|
|
81
|
-
if (!isObjectRecord(value)) {
|
|
82
|
-
continue;
|
|
83
|
-
}
|
|
84
|
-
const endpoint = asString(value["url"]);
|
|
85
|
-
if (!endpoint) {
|
|
86
|
-
continue;
|
|
87
|
-
}
|
|
88
|
-
let parsedUrl;
|
|
89
|
-
try {
|
|
90
|
-
parsedUrl = new URL(endpoint);
|
|
91
|
-
} catch {
|
|
92
|
-
continue;
|
|
93
|
-
}
|
|
94
|
-
const scheme = parsedUrl.protocol.replace(/:$/, "").toLowerCase();
|
|
95
|
-
if (!supportedSchemes.has(scheme)) {
|
|
96
|
-
continue;
|
|
97
|
-
}
|
|
98
|
-
candidates.push({
|
|
99
|
-
key,
|
|
100
|
-
endpointUrl: parsedUrl.toString(),
|
|
101
|
-
parsedUrl
|
|
1
|
+
import { Logger } from "./standards-sdk.es126.js";
|
|
2
|
+
import { HederaMirrorNode } from "./standards-sdk.es147.js";
|
|
3
|
+
class HCS5BaseClient {
|
|
4
|
+
/**
|
|
5
|
+
* Create a new HCS-5 base client
|
|
6
|
+
*/
|
|
7
|
+
constructor(config) {
|
|
8
|
+
this.network = config.network;
|
|
9
|
+
this.logger = config.logger || Logger.getInstance({
|
|
10
|
+
level: config.logLevel || "info",
|
|
11
|
+
module: "HCS5Client",
|
|
12
|
+
silent: config.silent
|
|
102
13
|
});
|
|
14
|
+
this.mirrorNode = new HederaMirrorNode(this.network, this.logger);
|
|
103
15
|
}
|
|
104
|
-
return candidates;
|
|
105
|
-
}
|
|
106
|
-
function validateAnsHcs27Hints(input) {
|
|
107
|
-
if (!isObjectRecord(input)) {
|
|
108
|
-
return void 0;
|
|
109
|
-
}
|
|
110
|
-
const checkpointTopicId = asString(input["checkpoint_topic_id"]);
|
|
111
|
-
const registry = asString(input["registry"]);
|
|
112
|
-
const logId = asString(input["log_id"]);
|
|
113
|
-
if (!checkpointTopicId || !registry || !logId || registry !== ANS_HCS27_REGISTRY) {
|
|
114
|
-
return void 0;
|
|
115
|
-
}
|
|
116
|
-
const checkpointUri = asString(input["checkpoint_uri"]) ?? void 0;
|
|
117
|
-
const viewerUri = asString(input["viewer_uri"]) ?? void 0;
|
|
118
|
-
return {
|
|
119
|
-
checkpointTopicId,
|
|
120
|
-
registry,
|
|
121
|
-
logId,
|
|
122
|
-
checkpointUri,
|
|
123
|
-
viewerUri
|
|
124
|
-
};
|
|
125
|
-
}
|
|
126
|
-
function validateHcs28Hints(input) {
|
|
127
|
-
if (!isObjectRecord(input)) {
|
|
128
|
-
return void 0;
|
|
129
|
-
}
|
|
130
|
-
const directoryTopicId = asString(input["directory_topic_id"]);
|
|
131
|
-
const tId = asString(input["t_id"]);
|
|
132
|
-
const agentId = asString(input["agent_id"]);
|
|
133
|
-
if (!directoryTopicId || !tId || !agentId) {
|
|
134
|
-
return void 0;
|
|
135
|
-
}
|
|
136
|
-
const proofProfile = asString(input["proof_profile"]) ?? void 0;
|
|
137
|
-
return {
|
|
138
|
-
directoryTopicId,
|
|
139
|
-
tId,
|
|
140
|
-
agentId,
|
|
141
|
-
proofProfile
|
|
142
|
-
};
|
|
143
|
-
}
|
|
144
|
-
function parseTransparencyHints(input) {
|
|
145
|
-
if (!isObjectRecord(input)) {
|
|
146
|
-
return void 0;
|
|
147
|
-
}
|
|
148
|
-
const hcs27 = validateAnsHcs27Hints(input["hcs27"]);
|
|
149
|
-
const hcs28 = validateHcs28Hints(input["hcs28"]);
|
|
150
|
-
if (!hcs27 && !hcs28) {
|
|
151
|
-
return void 0;
|
|
152
|
-
}
|
|
153
|
-
return {
|
|
154
|
-
hcs27,
|
|
155
|
-
hcs28
|
|
156
|
-
};
|
|
157
|
-
}
|
|
158
|
-
function parseAnsAgentCard(input) {
|
|
159
|
-
if (!isObjectRecord(input)) {
|
|
160
|
-
return null;
|
|
161
|
-
}
|
|
162
|
-
const ansName = asString(input["ansName"]);
|
|
163
|
-
const endpoints = input["endpoints"];
|
|
164
|
-
if (!ansName || !isObjectRecord(endpoints)) {
|
|
165
|
-
return null;
|
|
166
|
-
}
|
|
167
|
-
return {
|
|
168
|
-
ansName,
|
|
169
|
-
endpoints,
|
|
170
|
-
transparencyHints: parseTransparencyHints(input["transparency"])
|
|
171
|
-
};
|
|
172
|
-
}
|
|
173
|
-
function selectPreferredEndpoint(candidates, protocol) {
|
|
174
|
-
if (candidates.length === 0) {
|
|
175
|
-
return null;
|
|
176
|
-
}
|
|
177
|
-
const sortedCandidates = [...candidates].sort(
|
|
178
|
-
(a, b) => a.key.localeCompare(b.key)
|
|
179
|
-
);
|
|
180
|
-
const protocolMatches = sortedCandidates.filter(
|
|
181
|
-
(candidate) => hasProtocolPathSegment(candidate.parsedUrl.pathname, protocol)
|
|
182
|
-
);
|
|
183
|
-
if (protocolMatches.length > 0) {
|
|
184
|
-
return protocolMatches[0];
|
|
185
|
-
}
|
|
186
|
-
return sortedCandidates[0];
|
|
187
|
-
}
|
|
188
|
-
function toErrorMessage(error) {
|
|
189
|
-
if (error instanceof Error && error.message) {
|
|
190
|
-
return error.message;
|
|
191
|
-
}
|
|
192
|
-
return null;
|
|
193
16
|
}
|
|
194
17
|
export {
|
|
195
|
-
|
|
196
|
-
isValidAnsProfileVersion,
|
|
197
|
-
normalizeAnsVersion,
|
|
198
|
-
parseAnsAgentCard,
|
|
199
|
-
parseAnsDnsTxtRecord,
|
|
200
|
-
selectPreferredEndpoint,
|
|
201
|
-
toErrorMessage
|
|
18
|
+
HCS5BaseClient
|
|
202
19
|
};
|
|
203
20
|
//# sourceMappingURL=standards-sdk.es166.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standards-sdk.es166.js","sources":["../../src/hcs-14/resolvers/ans-dns-web-profile-utils.ts"],"sourcesContent":["import type {\n ProfileResolutionHcs27TransparencyHints,\n ProfileResolutionHcs28TransparencyHints,\n ProfileResolutionTransparencyHints,\n} from './types';\nimport { parseSemicolonFields } from './profile-utils';\n\nexport interface AnsDnsTxtRecord {\n version?: string;\n url: string;\n}\n\nexport interface AnsEndpointCandidate {\n key: string;\n endpointUrl: string;\n parsedUrl: URL;\n}\n\nexport interface ParsedAnsAgentCard {\n ansName: string;\n endpoints: Record<string, unknown>;\n transparencyHints?: ProfileResolutionTransparencyHints;\n}\n\nconst ANS_HCS27_REGISTRY = 'ans';\n\nfunction isObjectRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction asString(value: unknown): string | null {\n if (typeof value !== 'string') {\n return null;\n }\n const trimmed = value.trim();\n if (!trimmed) {\n return null;\n }\n return trimmed;\n}\n\nfunction isSemver(value: string): boolean {\n return /^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?(?:\\+[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?$/.test(\n value,\n );\n}\n\nexport function normalizeAnsVersion(value: string): string | null {\n const trimmed = value.trim();\n if (!trimmed) {\n return null;\n }\n const withoutPrefix =\n trimmed.startsWith('v') || trimmed.startsWith('V')\n ? trimmed.slice(1)\n : trimmed;\n if (!isSemver(withoutPrefix)) {\n return null;\n }\n return withoutPrefix;\n}\n\nexport function parseAnsDnsTxtRecord(\n rawRecord: string,\n): AnsDnsTxtRecord | null {\n const fields = parseSemicolonFields(rawRecord);\n const version = fields['v'];\n const urlValue = fields['url'];\n if (!version || !urlValue || version.toLowerCase() !== 'ans1') {\n return null;\n }\n\n let parsedUrl: URL;\n try {\n parsedUrl = new URL(urlValue);\n } catch {\n return null;\n }\n\n if (parsedUrl.protocol.toLowerCase() !== 'https:') {\n return null;\n }\n\n const rawAnsVersion = fields['version'];\n let normalizedAnsVersion: string | undefined;\n if (rawAnsVersion !== undefined) {\n const parsedVersion = normalizeAnsVersion(rawAnsVersion);\n if (!parsedVersion) {\n return null;\n }\n normalizedAnsVersion = parsedVersion;\n }\n\n return {\n version: normalizedAnsVersion,\n url: parsedUrl.toString(),\n };\n}\n\nexport function isValidAnsProfileVersion(value: string | undefined): boolean {\n return !!value && normalizeAnsVersion(value) !== null;\n}\n\nfunction hasProtocolPathSegment(pathname: string, protocol: string): boolean {\n const normalizedProtocol = protocol.trim().toLowerCase();\n if (!normalizedProtocol) {\n return false;\n }\n\n const pathSegments = pathname\n .split('/')\n .map(segment => segment.trim())\n .filter(segment => segment.length > 0);\n for (const segment of pathSegments) {\n if (segment.toLowerCase() === normalizedProtocol) {\n return true;\n }\n }\n return false;\n}\n\nexport function extractEndpointCandidates(\n endpoints: Record<string, unknown>,\n supportedSchemes: Set<string>,\n): AnsEndpointCandidate[] {\n const candidates: AnsEndpointCandidate[] = [];\n for (const [key, value] of Object.entries(endpoints)) {\n if (!isObjectRecord(value)) {\n continue;\n }\n const endpoint = asString(value['url']);\n if (!endpoint) {\n continue;\n }\n\n let parsedUrl: URL;\n try {\n parsedUrl = new URL(endpoint);\n } catch {\n continue;\n }\n\n const scheme = parsedUrl.protocol.replace(/:$/, '').toLowerCase();\n if (!supportedSchemes.has(scheme)) {\n continue;\n }\n\n candidates.push({\n key,\n endpointUrl: parsedUrl.toString(),\n parsedUrl,\n });\n }\n\n return candidates;\n}\n\nfunction validateAnsHcs27Hints(\n input: unknown,\n): ProfileResolutionHcs27TransparencyHints | undefined {\n if (!isObjectRecord(input)) {\n return undefined;\n }\n const checkpointTopicId = asString(input['checkpoint_topic_id']);\n const registry = asString(input['registry']);\n const logId = asString(input['log_id']);\n if (\n !checkpointTopicId ||\n !registry ||\n !logId ||\n registry !== ANS_HCS27_REGISTRY\n ) {\n return undefined;\n }\n const checkpointUri = asString(input['checkpoint_uri']) ?? undefined;\n const viewerUri = asString(input['viewer_uri']) ?? undefined;\n return {\n checkpointTopicId,\n registry,\n logId,\n checkpointUri,\n viewerUri,\n };\n}\n\nfunction validateHcs28Hints(\n input: unknown,\n): ProfileResolutionHcs28TransparencyHints | undefined {\n if (!isObjectRecord(input)) {\n return undefined;\n }\n const directoryTopicId = asString(input['directory_topic_id']);\n const tId = asString(input['t_id']);\n const agentId = asString(input['agent_id']);\n if (!directoryTopicId || !tId || !agentId) {\n return undefined;\n }\n const proofProfile = asString(input['proof_profile']) ?? undefined;\n return {\n directoryTopicId,\n tId,\n agentId,\n proofProfile,\n };\n}\n\nfunction parseTransparencyHints(\n input: unknown,\n): ProfileResolutionTransparencyHints | undefined {\n if (!isObjectRecord(input)) {\n return undefined;\n }\n const hcs27 = validateAnsHcs27Hints(input['hcs27']);\n const hcs28 = validateHcs28Hints(input['hcs28']);\n if (!hcs27 && !hcs28) {\n return undefined;\n }\n return {\n hcs27,\n hcs28,\n };\n}\n\nexport function parseAnsAgentCard(input: unknown): ParsedAnsAgentCard | null {\n if (!isObjectRecord(input)) {\n return null;\n }\n const ansName = asString(input['ansName']);\n const endpoints = input['endpoints'];\n if (!ansName || !isObjectRecord(endpoints)) {\n return null;\n }\n return {\n ansName,\n endpoints,\n transparencyHints: parseTransparencyHints(input['transparency']),\n };\n}\n\nexport function selectPreferredEndpoint(\n candidates: AnsEndpointCandidate[],\n protocol: string,\n): AnsEndpointCandidate | null {\n if (candidates.length === 0) {\n return null;\n }\n\n const sortedCandidates = [...candidates].sort((a, b) =>\n a.key.localeCompare(b.key),\n );\n const protocolMatches = sortedCandidates.filter(candidate =>\n hasProtocolPathSegment(candidate.parsedUrl.pathname, protocol),\n );\n if (protocolMatches.length > 0) {\n return protocolMatches[0];\n }\n return sortedCandidates[0];\n}\n\nexport function toErrorMessage(error: unknown): string | null {\n if (error instanceof Error && error.message) {\n return error.message;\n }\n return null;\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"standards-sdk.es166.js","sources":["../../src/hcs-5/base-client.ts"],"sourcesContent":["import { Logger, ILogger } from '../utils/logger';\nimport { HederaMirrorNode } from '../services/mirror-node';\nimport { HCS5ClientConfig } from './types';\nimport { NetworkType } from '../utils/types';\n\n/**\n * Base client for HCS-5 operations\n */\nexport abstract class HCS5BaseClient {\n protected logger: ILogger;\n protected mirrorNode: HederaMirrorNode;\n protected network: NetworkType;\n\n /**\n * Create a new HCS-5 base client\n */\n constructor(config: HCS5ClientConfig) {\n this.network = config.network;\n this.logger =\n config.logger ||\n Logger.getInstance({\n level: config.logLevel || 'info',\n module: 'HCS5Client',\n silent: config.silent,\n });\n\n this.mirrorNode = new HederaMirrorNode(this.network, this.logger);\n }\n}\n"],"names":[],"mappings":";;AAQO,MAAe,eAAe;AAAA;AAAA;AAAA;AAAA,EAQnC,YAAY,QAA0B;AACpC,SAAK,UAAU,OAAO;AACtB,SAAK,SACH,OAAO,UACP,OAAO,YAAY;AAAA,MACjB,OAAO,OAAO,YAAY;AAAA,MAC1B,QAAQ;AAAA,MACR,QAAQ,OAAO;AAAA,IAAA,CAChB;AAEH,SAAK,aAAa,IAAI,iBAAiB,KAAK,SAAS,KAAK,MAAM;AAAA,EAClE;AACF;"}
|
|
@@ -1,20 +1,59 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
1
|
+
const ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
|
|
2
|
+
const BASE = 58;
|
|
3
|
+
function base58Encode(bytes) {
|
|
4
|
+
if (bytes.length === 0) return "";
|
|
5
|
+
let zeros = 0;
|
|
6
|
+
while (zeros < bytes.length && bytes[zeros] === 0) zeros++;
|
|
7
|
+
if (zeros === bytes.length) return "1".repeat(zeros);
|
|
8
|
+
const digits = [0];
|
|
9
|
+
for (let i = zeros; i < bytes.length; i++) {
|
|
10
|
+
let carry = bytes[i];
|
|
11
|
+
for (let j = 0; j < digits.length; j++) {
|
|
12
|
+
const val = (digits[j] << 8) + carry;
|
|
13
|
+
digits[j] = val % BASE;
|
|
14
|
+
carry = val / BASE | 0;
|
|
15
|
+
}
|
|
16
|
+
while (carry > 0) {
|
|
17
|
+
digits.push(carry % BASE);
|
|
18
|
+
carry = carry / BASE | 0;
|
|
19
|
+
}
|
|
15
20
|
}
|
|
21
|
+
let result = "";
|
|
22
|
+
for (let i = 0; i < zeros; i++) result += "1";
|
|
23
|
+
for (let i = digits.length - 1; i >= 0; i--) result += ALPHABET[digits[i]];
|
|
24
|
+
return result;
|
|
25
|
+
}
|
|
26
|
+
function base58Decode(text) {
|
|
27
|
+
if (text.length === 0) return new Uint8Array(0);
|
|
28
|
+
let zeros = 0;
|
|
29
|
+
while (zeros < text.length && text[zeros] === "1") zeros++;
|
|
30
|
+
const b256 = [];
|
|
31
|
+
for (let i = zeros; i < text.length; i++) {
|
|
32
|
+
const ch = text[i];
|
|
33
|
+
const val = ALPHABET.indexOf(ch);
|
|
34
|
+
if (val === -1) throw new Error("Invalid Base58 character");
|
|
35
|
+
let carry = val;
|
|
36
|
+
for (let j = 0; j < b256.length; j++) {
|
|
37
|
+
const x = b256[j] * BASE + carry;
|
|
38
|
+
b256[j] = x & 255;
|
|
39
|
+
carry = x >> 8;
|
|
40
|
+
}
|
|
41
|
+
while (carry > 0) {
|
|
42
|
+
b256.push(carry & 255);
|
|
43
|
+
carry >>= 8;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
for (let i = 0; i < zeros; i++) b256.push(0);
|
|
47
|
+
b256.reverse();
|
|
48
|
+
return Uint8Array.from(b256);
|
|
49
|
+
}
|
|
50
|
+
function multibaseB58btcDecode(zText) {
|
|
51
|
+
if (!zText.startsWith("z")) throw new Error("Invalid multibase base58btc");
|
|
52
|
+
return base58Decode(zText.slice(1));
|
|
16
53
|
}
|
|
17
54
|
export {
|
|
18
|
-
|
|
55
|
+
base58Decode,
|
|
56
|
+
base58Encode,
|
|
57
|
+
multibaseB58btcDecode
|
|
19
58
|
};
|
|
20
59
|
//# sourceMappingURL=standards-sdk.es167.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standards-sdk.es167.js","sources":["../../src/hcs-
|
|
1
|
+
{"version":3,"file":"standards-sdk.es167.js","sources":["../../src/hcs-14/base58.ts"],"sourcesContent":["/**\n * Minimal Base58 encoder/decoder (Bitcoin alphabet) with no external dependencies.\n */\n\nconst ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';\nconst BASE = 58;\n\nfunction countLeadingZeros(bytes: Uint8Array): number {\n let zeros = 0;\n for (let i = 0; i < bytes.length && bytes[i] === 0; i++) {\n zeros++;\n }\n return zeros;\n}\n\nexport function base58Encode(bytes: Uint8Array): string {\n if (bytes.length === 0) return '';\n\n let zeros = 0;\n while (zeros < bytes.length && bytes[zeros] === 0) zeros++;\n\n if (zeros === bytes.length) return '1'.repeat(zeros);\n\n const digits: number[] = [0];\n for (let i = zeros; i < bytes.length; i++) {\n let carry = bytes[i];\n for (let j = 0; j < digits.length; j++) {\n const val = (digits[j] << 8) + carry;\n digits[j] = val % BASE;\n carry = (val / BASE) | 0;\n }\n while (carry > 0) {\n digits.push(carry % BASE);\n carry = (carry / BASE) | 0;\n }\n }\n\n let result = '';\n for (let i = 0; i < zeros; i++) result += '1';\n for (let i = digits.length - 1; i >= 0; i--) result += ALPHABET[digits[i]];\n return result;\n}\n\nexport function base58Decode(text: string): Uint8Array {\n if (text.length === 0) return new Uint8Array(0);\n\n let zeros = 0;\n while (zeros < text.length && text[zeros] === '1') zeros++;\n\n const b256: number[] = [];\n for (let i = zeros; i < text.length; i++) {\n const ch = text[i];\n const val = ALPHABET.indexOf(ch);\n if (val === -1) throw new Error('Invalid Base58 character');\n\n let carry = val;\n for (let j = 0; j < b256.length; j++) {\n const x = b256[j] * BASE + carry;\n b256[j] = x & 0xff;\n carry = x >> 8;\n }\n while (carry > 0) {\n b256.push(carry & 0xff);\n carry >>= 8;\n }\n }\n\n for (let i = 0; i < zeros; i++) b256.push(0);\n b256.reverse();\n return Uint8Array.from(b256);\n}\n\nexport function multibaseB58btcDecode(zText: string): Uint8Array {\n if (!zText.startsWith('z')) throw new Error('Invalid multibase base58btc');\n return base58Decode(zText.slice(1));\n}\n"],"names":[],"mappings":"AAIA,MAAM,WAAW;AACjB,MAAM,OAAO;AAUN,SAAS,aAAa,OAA2B;AACtD,MAAI,MAAM,WAAW,EAAG,QAAO;AAE/B,MAAI,QAAQ;AACZ,SAAO,QAAQ,MAAM,UAAU,MAAM,KAAK,MAAM,EAAG;AAEnD,MAAI,UAAU,MAAM,OAAQ,QAAO,IAAI,OAAO,KAAK;AAEnD,QAAM,SAAmB,CAAC,CAAC;AAC3B,WAAS,IAAI,OAAO,IAAI,MAAM,QAAQ,KAAK;AACzC,QAAI,QAAQ,MAAM,CAAC;AACnB,aAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,YAAM,OAAO,OAAO,CAAC,KAAK,KAAK;AAC/B,aAAO,CAAC,IAAI,MAAM;AAClB,cAAS,MAAM,OAAQ;AAAA,IACzB;AACA,WAAO,QAAQ,GAAG;AAChB,aAAO,KAAK,QAAQ,IAAI;AACxB,cAAS,QAAQ,OAAQ;AAAA,IAC3B;AAAA,EACF;AAEA,MAAI,SAAS;AACb,WAAS,IAAI,GAAG,IAAI,OAAO,IAAK,WAAU;AAC1C,WAAS,IAAI,OAAO,SAAS,GAAG,KAAK,GAAG,IAAK,WAAU,SAAS,OAAO,CAAC,CAAC;AACzE,SAAO;AACT;AAEO,SAAS,aAAa,MAA0B;AACrD,MAAI,KAAK,WAAW,EAAG,QAAO,IAAI,WAAW,CAAC;AAE9C,MAAI,QAAQ;AACZ,SAAO,QAAQ,KAAK,UAAU,KAAK,KAAK,MAAM,IAAK;AAEnD,QAAM,OAAiB,CAAA;AACvB,WAAS,IAAI,OAAO,IAAI,KAAK,QAAQ,KAAK;AACxC,UAAM,KAAK,KAAK,CAAC;AACjB,UAAM,MAAM,SAAS,QAAQ,EAAE;AAC/B,QAAI,QAAQ,GAAI,OAAM,IAAI,MAAM,0BAA0B;AAE1D,QAAI,QAAQ;AACZ,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,YAAM,IAAI,KAAK,CAAC,IAAI,OAAO;AAC3B,WAAK,CAAC,IAAI,IAAI;AACd,cAAQ,KAAK;AAAA,IACf;AACA,WAAO,QAAQ,GAAG;AAChB,WAAK,KAAK,QAAQ,GAAI;AACtB,gBAAU;AAAA,IACZ;AAAA,EACF;AAEA,WAAS,IAAI,GAAG,IAAI,OAAO,IAAK,MAAK,KAAK,CAAC;AAC3C,OAAK,QAAA;AACL,SAAO,WAAW,KAAK,IAAI;AAC7B;AAEO,SAAS,sBAAsB,OAA2B;AAC/D,MAAI,CAAC,MAAM,WAAW,GAAG,EAAG,OAAM,IAAI,MAAM,6BAA6B;AACzE,SAAO,aAAa,MAAM,MAAM,CAAC,CAAC;AACpC;"}
|
|
@@ -1,76 +1,114 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
import { isBrowser } from "./standards-sdk.es139.js";
|
|
2
|
+
let nodeRequire;
|
|
3
|
+
const isNodeRuntime = () => typeof process !== "undefined" && Boolean(process.versions?.node);
|
|
4
|
+
function resolveBuiltinModuleLoader() {
|
|
5
|
+
if (typeof process === "undefined") {
|
|
6
|
+
return void 0;
|
|
6
7
|
}
|
|
7
|
-
return
|
|
8
|
-
(transfer) => typeof transfer.amount === "number" && transfer.amount > 0
|
|
9
|
-
).map((transfer) => ({
|
|
10
|
-
account: transfer.account,
|
|
11
|
-
amountTinybar: transfer.amount
|
|
12
|
-
}));
|
|
8
|
+
return process.getBuiltinModule;
|
|
13
9
|
}
|
|
14
|
-
function
|
|
15
|
-
|
|
10
|
+
function getNodeRequireSync() {
|
|
11
|
+
try {
|
|
12
|
+
const builtinModuleLoader = resolveBuiltinModuleLoader();
|
|
13
|
+
const moduleNamespace = builtinModuleLoader?.("module");
|
|
14
|
+
if (typeof moduleNamespace?.createRequire === "function") {
|
|
15
|
+
const requireFromModule = moduleNamespace.createRequire(import.meta.url);
|
|
16
|
+
if (typeof requireFromModule.resolve === "function") {
|
|
17
|
+
return requireFromModule;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
const globalObject = typeof global !== "undefined" ? global : globalThis;
|
|
21
|
+
const runtimeRequire = globalObject.process?.mainModule?.require ?? globalObject.require ?? Function('return typeof require === "function" ? require : undefined;')();
|
|
22
|
+
if (typeof runtimeRequire === "function" && typeof runtimeRequire.resolve === "function") {
|
|
23
|
+
return runtimeRequire;
|
|
24
|
+
}
|
|
25
|
+
} catch {
|
|
16
26
|
return null;
|
|
17
27
|
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
if (!
|
|
22
|
-
return
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
function isModuleNotFound(specifier, error) {
|
|
31
|
+
if (!error || typeof error !== "object") {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
const code = Reflect.get(error, "code");
|
|
35
|
+
const message = Reflect.get(error, "message");
|
|
36
|
+
const messageText = typeof message === "string" ? message : "";
|
|
37
|
+
if (typeof code === "string" && code.includes("MODULE_NOT_FOUND")) {
|
|
38
|
+
return messageText.includes(specifier);
|
|
39
|
+
}
|
|
40
|
+
if (messageText) {
|
|
41
|
+
const lowered = messageText.toLowerCase();
|
|
42
|
+
if (lowered.includes("cannot find module") || lowered.includes("module not found") || lowered.includes("cannot find package")) {
|
|
43
|
+
return lowered.includes(specifier.toLowerCase());
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
async function resolveNodeRequire() {
|
|
49
|
+
if (nodeRequire !== void 0) {
|
|
50
|
+
return nodeRequire;
|
|
23
51
|
}
|
|
24
|
-
|
|
52
|
+
if (isBrowser && !isNodeRuntime()) {
|
|
53
|
+
nodeRequire = null;
|
|
54
|
+
return nodeRequire;
|
|
55
|
+
}
|
|
56
|
+
try {
|
|
57
|
+
nodeRequire = getNodeRequireSync();
|
|
58
|
+
} catch {
|
|
59
|
+
nodeRequire = null;
|
|
60
|
+
}
|
|
61
|
+
return nodeRequire;
|
|
25
62
|
}
|
|
26
|
-
function
|
|
27
|
-
|
|
63
|
+
async function dynamicImport(specifier) {
|
|
64
|
+
try {
|
|
65
|
+
return await import(
|
|
66
|
+
/* webpackIgnore: true */
|
|
67
|
+
specifier
|
|
68
|
+
);
|
|
69
|
+
} catch (error) {
|
|
70
|
+
if (isModuleNotFound(specifier, error)) {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
throw error;
|
|
74
|
+
}
|
|
28
75
|
}
|
|
29
|
-
function
|
|
30
|
-
if (
|
|
31
|
-
return
|
|
76
|
+
async function optionalImport(specifier, options = {}) {
|
|
77
|
+
if (isBrowser && !isNodeRuntime()) {
|
|
78
|
+
return dynamicImport(specifier);
|
|
32
79
|
}
|
|
33
|
-
if (
|
|
34
|
-
|
|
80
|
+
if (!options.preferImport) {
|
|
81
|
+
const requireFn = await resolveNodeRequire();
|
|
82
|
+
if (requireFn) {
|
|
83
|
+
try {
|
|
84
|
+
return requireFn(specifier);
|
|
85
|
+
} catch (error) {
|
|
86
|
+
if (!isModuleNotFound(specifier, error)) {
|
|
87
|
+
throw error;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
35
91
|
}
|
|
36
|
-
return
|
|
92
|
+
return dynamicImport(specifier);
|
|
37
93
|
}
|
|
38
|
-
function
|
|
39
|
-
|
|
40
|
-
const positiveTransfers = safePositiveTransfers(txn.transfers);
|
|
41
|
-
const payerDebitTinybar = resolvePayerDebitTinybar(
|
|
42
|
-
txn.transfers,
|
|
43
|
-
payerAccountId
|
|
44
|
-
);
|
|
45
|
-
const transferOutflowTinybar = payerDebitTinybar ?? positiveTransfers.reduce((sum, t) => sum + t.amountTinybar, 0);
|
|
46
|
-
const chargedFeeTinybar = fallbackFeeTinybar(txn.charged_tx_fee);
|
|
47
|
-
const resolvedTotalTinybar = transferOutflowTinybar > 0 ? transferOutflowTinybar : chargedFeeTinybar;
|
|
48
|
-
if (!resolvedTotalTinybar || resolvedTotalTinybar <= 0) {
|
|
94
|
+
function optionalImportSync(specifier) {
|
|
95
|
+
if (isBrowser && !isNodeRuntime()) {
|
|
49
96
|
return null;
|
|
50
97
|
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
description: `HBAR transfer from ${payerAccountId}`
|
|
56
|
-
})) : [
|
|
57
|
-
{
|
|
58
|
-
to: "Hedera network",
|
|
59
|
-
amount: totalCostHbar,
|
|
60
|
-
description: `Transaction fee debited from ${payerAccountId}`
|
|
98
|
+
try {
|
|
99
|
+
const requireFn = getNodeRequireSync();
|
|
100
|
+
if (requireFn) {
|
|
101
|
+
return requireFn(specifier);
|
|
61
102
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
summary: {
|
|
66
|
-
totalCostHbar,
|
|
67
|
-
breakdown: {
|
|
68
|
-
transfers: breakdownTransfers
|
|
69
|
-
}
|
|
103
|
+
} catch (error) {
|
|
104
|
+
if (!isModuleNotFound(specifier, error)) {
|
|
105
|
+
throw error;
|
|
70
106
|
}
|
|
71
|
-
}
|
|
107
|
+
}
|
|
108
|
+
return null;
|
|
72
109
|
}
|
|
73
110
|
export {
|
|
74
|
-
|
|
111
|
+
optionalImport,
|
|
112
|
+
optionalImportSync
|
|
75
113
|
};
|
|
76
114
|
//# sourceMappingURL=standards-sdk.es168.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standards-sdk.es168.js","sources":["../../src/
|
|
1
|
+
{"version":3,"file":"standards-sdk.es168.js","sources":["../../src/utils/dynamic-import.ts"],"sourcesContent":["import { isBrowser } from './is-browser';\n\nlet nodeRequire: NodeRequire | null | undefined;\n\nconst isNodeRuntime = (): boolean =>\n typeof process !== 'undefined' && Boolean(process.versions?.node);\n\ntype NodeModuleNamespace = {\n createRequire: (path: string | URL) => NodeRequire;\n};\n\ntype BuiltinModuleLoader = <TModule>(name: string) => TModule | undefined;\n\nfunction resolveBuiltinModuleLoader(): BuiltinModuleLoader | undefined {\n if (typeof process === 'undefined') {\n return undefined;\n }\n\n return (\n process as typeof process & {\n getBuiltinModule?: BuiltinModuleLoader;\n }\n ).getBuiltinModule;\n}\n\nfunction getNodeRequireSync(): NodeRequire | null {\n try {\n const builtinModuleLoader = resolveBuiltinModuleLoader();\n const moduleNamespace = builtinModuleLoader?.('module') as\n | Partial<NodeModuleNamespace>\n | undefined;\n if (typeof moduleNamespace?.createRequire === 'function') {\n const requireFromModule = moduleNamespace.createRequire(import.meta.url);\n if (typeof requireFromModule.resolve === 'function') {\n return requireFromModule;\n }\n }\n\n const globalObject =\n typeof global !== 'undefined'\n ? (global as typeof globalThis)\n : globalThis;\n const runtimeRequire =\n globalObject.process?.mainModule?.require ??\n (globalObject as { require?: NodeRequire }).require ??\n Function('return typeof require === \"function\" ? require : undefined;')();\n\n if (\n typeof runtimeRequire === 'function' &&\n typeof (runtimeRequire as NodeRequire).resolve === 'function'\n ) {\n return runtimeRequire as NodeRequire;\n }\n } catch {\n return null;\n }\n\n return null;\n}\n\nfunction isModuleNotFound(specifier: string, error: unknown): boolean {\n if (!error || typeof error !== 'object') {\n return false;\n }\n const code = Reflect.get(error, 'code');\n const message = Reflect.get(error, 'message');\n const messageText = typeof message === 'string' ? message : '';\n\n if (typeof code === 'string' && code.includes('MODULE_NOT_FOUND')) {\n return messageText.includes(specifier);\n }\n\n if (messageText) {\n const lowered = messageText.toLowerCase();\n if (\n lowered.includes('cannot find module') ||\n lowered.includes('module not found') ||\n lowered.includes('cannot find package')\n ) {\n return lowered.includes(specifier.toLowerCase());\n }\n }\n\n return false;\n}\n\nasync function resolveNodeRequire(): Promise<NodeRequire | null> {\n if (nodeRequire !== undefined) {\n return nodeRequire;\n }\n\n if (isBrowser && !isNodeRuntime()) {\n nodeRequire = null;\n return nodeRequire;\n }\n\n try {\n nodeRequire = getNodeRequireSync();\n } catch {\n nodeRequire = null;\n }\n\n return nodeRequire;\n}\n\nasync function dynamicImport<T>(specifier: string): Promise<T | null> {\n try {\n return (await import(/* webpackIgnore: true */ specifier)) as T;\n } catch (error) {\n if (isModuleNotFound(specifier, error)) {\n return null;\n }\n throw error as Error;\n }\n}\n\ntype OptionalImportOptions = {\n preferImport?: boolean;\n};\n\nexport async function optionalImport<T>(\n specifier: string,\n options: OptionalImportOptions = {},\n): Promise<T | null> {\n if (isBrowser && !isNodeRuntime()) {\n return dynamicImport<T>(specifier);\n }\n\n if (!options.preferImport) {\n const requireFn = await resolveNodeRequire();\n if (requireFn) {\n try {\n return requireFn(specifier) as T;\n } catch (error) {\n if (!isModuleNotFound(specifier, error)) {\n throw error as Error;\n }\n }\n }\n }\n\n return dynamicImport<T>(specifier);\n}\n\nexport function optionalImportSync<T>(specifier: string): T | null {\n if (isBrowser && !isNodeRuntime()) {\n return null;\n }\n\n try {\n const requireFn = getNodeRequireSync();\n if (requireFn) {\n return requireFn(specifier) as T;\n }\n } catch (error) {\n if (!isModuleNotFound(specifier, error)) {\n throw error as Error;\n }\n }\n\n return null;\n}\n"],"names":[],"mappings":"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"}
|