@hashgraphonline/standards-sdk 0.1.171 → 0.1.172
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/services/registry-broker/client/base-client.d.ts +3 -2
- package/dist/browser/services/registry-broker/client/base-client.d.ts.map +1 -1
- package/dist/browser/services/registry-broker/client/search.d.ts +2 -1
- package/dist/browser/services/registry-broker/client/search.d.ts.map +1 -1
- package/dist/browser/services/registry-broker/client.d.ts +1 -0
- package/dist/browser/services/registry-broker/client.d.ts.map +1 -1
- package/dist/browser/services/registry-broker/schemas.d.ts +17723 -58
- package/dist/browser/services/registry-broker/schemas.d.ts.map +1 -1
- package/dist/browser/services/registry-broker/types.d.ts +36 -1
- package/dist/browser/services/registry-broker/types.d.ts.map +1 -1
- package/dist/browser/standards-sdk.browser.js +64 -1
- package/dist/browser/standards-sdk.browser.js.map +1 -1
- package/dist/cjs/services/registry-broker/client/base-client.d.ts +3 -2
- package/dist/cjs/services/registry-broker/client/base-client.d.ts.map +1 -1
- package/dist/cjs/services/registry-broker/client/search.d.ts +2 -1
- package/dist/cjs/services/registry-broker/client/search.d.ts.map +1 -1
- package/dist/cjs/services/registry-broker/client.d.ts +1 -0
- package/dist/cjs/services/registry-broker/client.d.ts.map +1 -1
- package/dist/cjs/services/registry-broker/schemas.d.ts +17814 -149
- package/dist/cjs/services/registry-broker/schemas.d.ts.map +1 -1
- package/dist/cjs/services/registry-broker/types.d.ts +36 -1
- package/dist/cjs/services/registry-broker/types.d.ts.map +1 -1
- package/dist/cjs/standards-sdk.cjs +3 -3
- package/dist/cjs/standards-sdk.cjs.map +1 -1
- package/dist/es/services/registry-broker/client/base-client.d.ts +3 -2
- package/dist/es/services/registry-broker/client/base-client.d.ts.map +1 -1
- package/dist/es/services/registry-broker/client/search.d.ts +2 -1
- package/dist/es/services/registry-broker/client/search.d.ts.map +1 -1
- package/dist/es/services/registry-broker/client.d.ts +1 -0
- package/dist/es/services/registry-broker/client.d.ts.map +1 -1
- package/dist/es/services/registry-broker/schemas.d.ts +17814 -149
- package/dist/es/services/registry-broker/schemas.d.ts.map +1 -1
- package/dist/es/services/registry-broker/types.d.ts +36 -1
- package/dist/es/services/registry-broker/types.d.ts.map +1 -1
- package/dist/es/standards-sdk.es.js +20 -9
- package/dist/es/standards-sdk.es.js.map +1 -1
- 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 +1 -1
- package/dist/es/standards-sdk.es11.js +1 -1
- package/dist/es/standards-sdk.es110.js +1 -1
- package/dist/es/standards-sdk.es116.js +2 -2
- package/dist/es/standards-sdk.es12.js +1 -1
- package/dist/es/standards-sdk.es121.js +1 -1
- package/dist/es/standards-sdk.es127.js +1 -1
- package/dist/es/standards-sdk.es128.js +5 -5
- package/dist/es/standards-sdk.es138.js +1 -1
- package/dist/es/standards-sdk.es139.js +1 -1
- package/dist/es/standards-sdk.es140.js +5 -5
- package/dist/es/standards-sdk.es142.js +2 -2
- package/dist/es/standards-sdk.es143.js +1 -1
- package/dist/es/standards-sdk.es145.js +65 -1
- package/dist/es/standards-sdk.es145.js.map +1 -1
- package/dist/es/standards-sdk.es147.js +250 -78
- package/dist/es/standards-sdk.es147.js.map +1 -1
- package/dist/es/standards-sdk.es148.js +77 -71
- package/dist/es/standards-sdk.es148.js.map +1 -1
- package/dist/es/standards-sdk.es149.js +79 -936
- package/dist/es/standards-sdk.es149.js.map +1 -1
- package/dist/es/standards-sdk.es150.js +934 -53
- package/dist/es/standards-sdk.es150.js.map +1 -1
- package/dist/es/standards-sdk.es151.js +53 -152
- package/dist/es/standards-sdk.es151.js.map +1 -1
- package/dist/es/standards-sdk.es152.js +159 -7
- package/dist/es/standards-sdk.es152.js.map +1 -1
- package/dist/es/standards-sdk.es153.js +7 -86
- package/dist/es/standards-sdk.es153.js.map +1 -1
- package/dist/es/standards-sdk.es154.js +64 -43
- package/dist/es/standards-sdk.es154.js.map +1 -1
- package/dist/es/standards-sdk.es155.js +65 -30
- package/dist/es/standards-sdk.es155.js.map +1 -1
- package/dist/es/standards-sdk.es156.js +30 -34
- package/dist/es/standards-sdk.es156.js.map +1 -1
- package/dist/es/standards-sdk.es157.js +34 -48
- package/dist/es/standards-sdk.es157.js.map +1 -1
- package/dist/es/standards-sdk.es158.js +48 -138
- package/dist/es/standards-sdk.es158.js.map +1 -1
- package/dist/es/standards-sdk.es159.js +133 -37
- package/dist/es/standards-sdk.es159.js.map +1 -1
- package/dist/es/standards-sdk.es16.js +1 -1
- package/dist/es/standards-sdk.es160.js +34 -12474
- package/dist/es/standards-sdk.es160.js.map +1 -1
- package/dist/es/standards-sdk.es161.js +12413 -481
- package/dist/es/standards-sdk.es161.js.map +1 -1
- package/dist/es/standards-sdk.es162.js +51 -68
- package/dist/es/standards-sdk.es162.js.map +1 -1
- package/dist/es/standards-sdk.es163.js +76 -48
- package/dist/es/standards-sdk.es163.js.map +1 -1
- package/dist/es/standards-sdk.es164.js +66 -69
- package/dist/es/standards-sdk.es164.js.map +1 -1
- package/dist/es/standards-sdk.es165.js +180 -61
- 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 +71 -15
- package/dist/es/standards-sdk.es167.js.map +1 -1
- package/dist/es/standards-sdk.es168.js +538 -160
- package/dist/es/standards-sdk.es168.js.map +1 -1
- package/dist/es/standards-sdk.es169.js +139 -289
- package/dist/es/standards-sdk.es169.js.map +1 -1
- package/dist/es/standards-sdk.es170.js +274 -298
- package/dist/es/standards-sdk.es170.js.map +1 -1
- package/dist/es/standards-sdk.es171.js +262 -369
- package/dist/es/standards-sdk.es171.js.map +1 -1
- package/dist/es/standards-sdk.es172.js +316 -194
- package/dist/es/standards-sdk.es172.js.map +1 -1
- package/dist/es/standards-sdk.es173.js +319 -64
- package/dist/es/standards-sdk.es173.js.map +1 -1
- package/dist/es/standards-sdk.es174.js +61 -157
- package/dist/es/standards-sdk.es174.js.map +1 -1
- package/dist/es/standards-sdk.es175.js +152 -202
- package/dist/es/standards-sdk.es175.js.map +1 -1
- package/dist/es/standards-sdk.es176.js +219 -223
- package/dist/es/standards-sdk.es176.js.map +1 -1
- package/dist/es/standards-sdk.es177.js +227 -107
- package/dist/es/standards-sdk.es177.js.map +1 -1
- package/dist/es/standards-sdk.es178.js +98 -105
- package/dist/es/standards-sdk.es178.js.map +1 -1
- package/dist/es/standards-sdk.es179.js +105 -140
- package/dist/es/standards-sdk.es179.js.map +1 -1
- package/dist/es/standards-sdk.es18.js +4 -4
- package/dist/es/standards-sdk.es180.js +2 -2
- package/dist/es/standards-sdk.es182.js +1 -1
- package/dist/es/standards-sdk.es19.js +2 -2
- package/dist/es/standards-sdk.es22.js +1 -1
- package/dist/es/standards-sdk.es27.js +4 -4
- package/dist/es/standards-sdk.es30.js +1 -1
- package/dist/es/standards-sdk.es31.js +1 -1
- package/dist/es/standards-sdk.es35.js +2 -2
- package/dist/es/standards-sdk.es36.js +3 -3
- package/dist/es/standards-sdk.es37.js +1 -1
- package/dist/es/standards-sdk.es4.js +1 -1
- package/dist/es/standards-sdk.es53.js +1 -1
- package/dist/es/standards-sdk.es56.js +1 -1
- package/dist/es/standards-sdk.es59.js +1 -1
- 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 +2 -2
- 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 +1 -1
- package/dist/es/standards-sdk.es72.js +2 -2
- package/dist/es/standards-sdk.es75.js +3 -3
- package/dist/es/standards-sdk.es76.js +1 -1
- package/dist/es/standards-sdk.es78.js +1 -1
- package/dist/es/standards-sdk.es83.js +1 -1
- package/dist/es/standards-sdk.es84.js +1 -1
- package/dist/es/standards-sdk.es85.js +1 -1
- package/dist/es/standards-sdk.es88.js +1 -1
- package/dist/es/standards-sdk.es90.js +1 -1
- package/dist/es/standards-sdk.es94.js +3 -3
- package/dist/es/standards-sdk.es98.js +1 -1
- package/dist/es/standards-sdk.es99.js +1 -1
- package/package.json +1 -1
|
@@ -1,90 +1,262 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
sei: 1329,
|
|
21
|
-
"sei-testnet": 1328,
|
|
22
|
-
polygon: 137,
|
|
23
|
-
"polygon-amoy": 80002,
|
|
24
|
-
peaq: 3338
|
|
25
|
-
};
|
|
26
|
-
const CHAIN_ID_TO_ALIAS = new Map(
|
|
27
|
-
Object.entries(EVM_NETWORK_CHAIN_IDS).map(([alias, id]) => [id, alias])
|
|
28
|
-
);
|
|
29
|
-
const parseChainId = (value) => {
|
|
30
|
-
if (/^eip155:\d+$/i.test(value)) {
|
|
31
|
-
return Number.parseInt(value.split(":")[1], 10);
|
|
1
|
+
import { dashboardStatsResponseSchema, registrationProgressResponseSchema, registrationQuoteResponseSchema, uaidConnectionStatusSchema, resolveResponseSchema, registerAgentResponseSchema, uaidValidationResponseSchema } from "./standards-sdk.es145.js";
|
|
2
|
+
import { purchaseCreditsWithHbar } from "./standards-sdk.es179.js";
|
|
3
|
+
import { serialiseAgentRegistrationRequest, DEFAULT_PROGRESS_INTERVAL_MS, DEFAULT_PROGRESS_TIMEOUT_MS, createAbortError, MINIMUM_REGISTRATION_AUTO_TOP_UP_CREDITS } from "./standards-sdk.es177.js";
|
|
4
|
+
import { RegistryBrokerError } from "./standards-sdk.es146.js";
|
|
5
|
+
async function performRegisterAgent(client, payload) {
|
|
6
|
+
const raw = await client.requestJson("/register", {
|
|
7
|
+
method: "POST",
|
|
8
|
+
body: serialiseAgentRegistrationRequest(payload),
|
|
9
|
+
headers: { "content-type": "application/json" }
|
|
10
|
+
});
|
|
11
|
+
return client.parseWithSchema(
|
|
12
|
+
raw,
|
|
13
|
+
registerAgentResponseSchema,
|
|
14
|
+
"register agent response"
|
|
15
|
+
);
|
|
16
|
+
}
|
|
17
|
+
function calculateHbarAmount(creditsToPurchase, creditsPerHbar) {
|
|
18
|
+
if (creditsPerHbar <= 0) {
|
|
19
|
+
throw new Error("creditsPerHbar must be positive");
|
|
32
20
|
}
|
|
33
|
-
if (
|
|
34
|
-
|
|
21
|
+
if (creditsToPurchase <= 0) {
|
|
22
|
+
throw new Error("creditsToPurchase must be positive");
|
|
35
23
|
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
24
|
+
const rawHbar = creditsToPurchase / creditsPerHbar;
|
|
25
|
+
const tinybars = Math.ceil(rawHbar * 1e8);
|
|
26
|
+
return tinybars / 1e8;
|
|
27
|
+
}
|
|
28
|
+
function resolveCreditsToPurchase(shortfallCredits) {
|
|
29
|
+
if (!Number.isFinite(shortfallCredits) || shortfallCredits <= 0) {
|
|
30
|
+
return 0;
|
|
31
|
+
}
|
|
32
|
+
return Math.max(
|
|
33
|
+
Math.ceil(shortfallCredits),
|
|
34
|
+
MINIMUM_REGISTRATION_AUTO_TOP_UP_CREDITS
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
async function ensureCreditsForRegistration(client, payload, autoTopUp) {
|
|
38
|
+
const details = autoTopUp ?? null;
|
|
39
|
+
if (!details) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
if (!details.accountId || !details.accountId.trim()) {
|
|
43
|
+
throw new Error("autoTopUp.accountId is required");
|
|
44
|
+
}
|
|
45
|
+
if (!details.privateKey || !details.privateKey.trim()) {
|
|
46
|
+
throw new Error("autoTopUp.privateKey is required");
|
|
47
|
+
}
|
|
48
|
+
for (let attempt = 0; attempt < 3; attempt += 1) {
|
|
49
|
+
const quote = await getRegistrationQuote(client, payload);
|
|
50
|
+
const shortfall = quote.shortfallCredits ?? 0;
|
|
51
|
+
if (shortfall <= 0) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
const creditsToPurchase = resolveCreditsToPurchase(shortfall);
|
|
55
|
+
if (creditsToPurchase <= 0) {
|
|
56
|
+
return;
|
|
47
57
|
}
|
|
48
|
-
|
|
49
|
-
|
|
58
|
+
const creditsPerHbar = quote.creditsPerHbar ?? null;
|
|
59
|
+
if (!creditsPerHbar || creditsPerHbar <= 0) {
|
|
60
|
+
throw new Error("Unable to determine credits per HBAR for auto top-up");
|
|
61
|
+
}
|
|
62
|
+
const hbarAmount = calculateHbarAmount(creditsToPurchase, creditsPerHbar);
|
|
63
|
+
await purchaseCreditsWithHbar(client, {
|
|
64
|
+
accountId: details.accountId.trim(),
|
|
65
|
+
privateKey: details.privateKey.trim(),
|
|
66
|
+
hbarAmount,
|
|
67
|
+
memo: details.memo ?? "Registry Broker auto top-up",
|
|
68
|
+
metadata: {
|
|
69
|
+
shortfallCredits: shortfall,
|
|
70
|
+
requiredCredits: quote.requiredCredits,
|
|
71
|
+
purchasedCredits: creditsToPurchase
|
|
72
|
+
}
|
|
73
|
+
});
|
|
50
74
|
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
);
|
|
75
|
+
const finalQuote = await getRegistrationQuote(client, payload);
|
|
76
|
+
if ((finalQuote.shortfallCredits ?? 0) > 0) {
|
|
77
|
+
throw new Error("Unable to purchase sufficient credits for registration");
|
|
55
78
|
}
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
79
|
+
}
|
|
80
|
+
async function resolveUaid(client, uaid) {
|
|
81
|
+
const raw = await client.requestJson(
|
|
82
|
+
`/resolve/${encodeURIComponent(uaid)}`,
|
|
83
|
+
{
|
|
84
|
+
method: "GET"
|
|
85
|
+
}
|
|
86
|
+
);
|
|
87
|
+
return client.parseWithSchema(
|
|
88
|
+
raw,
|
|
89
|
+
resolveResponseSchema,
|
|
90
|
+
"resolve UAID response"
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
async function registerAgent(client, payload, options) {
|
|
94
|
+
const autoTopUp = options?.autoTopUp ?? client.registrationAutoTopUp;
|
|
95
|
+
if (!autoTopUp) {
|
|
96
|
+
return performRegisterAgent(client, payload);
|
|
97
|
+
}
|
|
98
|
+
await ensureCreditsForRegistration(client, payload, autoTopUp);
|
|
99
|
+
let retried = false;
|
|
100
|
+
while (true) {
|
|
101
|
+
try {
|
|
102
|
+
return await performRegisterAgent(client, payload);
|
|
103
|
+
} catch (error) {
|
|
104
|
+
const shortfall = client.extractInsufficientCreditsDetails(error);
|
|
105
|
+
if (shortfall && !retried) {
|
|
106
|
+
await ensureCreditsForRegistration(client, payload, autoTopUp);
|
|
107
|
+
retried = true;
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
throw error;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
async function getRegistrationQuote(client, payload) {
|
|
115
|
+
const raw = await client.requestJson("/register/quote", {
|
|
116
|
+
method: "POST",
|
|
117
|
+
body: serialiseAgentRegistrationRequest(payload),
|
|
118
|
+
headers: { "content-type": "application/json" }
|
|
119
|
+
});
|
|
120
|
+
return client.parseWithSchema(
|
|
121
|
+
raw,
|
|
122
|
+
registrationQuoteResponseSchema,
|
|
123
|
+
"registration quote response"
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
async function updateAgent(client, uaid, payload) {
|
|
127
|
+
const raw = await client.requestJson(
|
|
128
|
+
`/register/${encodeURIComponent(uaid)}`,
|
|
129
|
+
{
|
|
130
|
+
method: "PUT",
|
|
131
|
+
body: serialiseAgentRegistrationRequest(payload),
|
|
132
|
+
headers: { "content-type": "application/json" }
|
|
133
|
+
}
|
|
134
|
+
);
|
|
135
|
+
return client.parseWithSchema(
|
|
136
|
+
raw,
|
|
137
|
+
registerAgentResponseSchema,
|
|
138
|
+
"update agent response"
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
async function getRegistrationProgress(client, attemptId) {
|
|
142
|
+
const normalisedAttemptId = attemptId.trim();
|
|
143
|
+
if (!normalisedAttemptId) {
|
|
144
|
+
throw new Error("attemptId is required");
|
|
145
|
+
}
|
|
146
|
+
try {
|
|
147
|
+
const raw = await client.requestJson(
|
|
148
|
+
`/register/progress/${encodeURIComponent(normalisedAttemptId)}`,
|
|
149
|
+
{ method: "GET" }
|
|
69
150
|
);
|
|
151
|
+
const parsed = client.parseWithSchema(
|
|
152
|
+
raw,
|
|
153
|
+
registrationProgressResponseSchema,
|
|
154
|
+
"registration progress response"
|
|
155
|
+
);
|
|
156
|
+
return parsed.progress;
|
|
157
|
+
} catch (error) {
|
|
158
|
+
if (error instanceof RegistryBrokerError && error.status === 404) {
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
throw error;
|
|
70
162
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
};
|
|
77
|
-
const canonicalizeLedgerNetwork = (network) => {
|
|
78
|
-
if (typeof network !== "string" || network.trim().length === 0) {
|
|
79
|
-
throw new Error("Ledger network is required.");
|
|
163
|
+
}
|
|
164
|
+
async function waitForRegistrationCompletion(client, attemptId, options = {}) {
|
|
165
|
+
const normalisedAttemptId = attemptId.trim();
|
|
166
|
+
if (!normalisedAttemptId) {
|
|
167
|
+
throw new Error("attemptId is required");
|
|
80
168
|
}
|
|
81
|
-
const
|
|
82
|
-
|
|
83
|
-
|
|
169
|
+
const interval = Math.max(
|
|
170
|
+
250,
|
|
171
|
+
options.intervalMs ?? DEFAULT_PROGRESS_INTERVAL_MS
|
|
172
|
+
);
|
|
173
|
+
const timeoutMs = options.timeoutMs ?? DEFAULT_PROGRESS_TIMEOUT_MS;
|
|
174
|
+
const throwOnFailure = options.throwOnFailure ?? true;
|
|
175
|
+
const signal = options.signal;
|
|
176
|
+
const startedAt = Date.now();
|
|
177
|
+
while (true) {
|
|
178
|
+
if (signal?.aborted) {
|
|
179
|
+
throw createAbortError();
|
|
180
|
+
}
|
|
181
|
+
const progress = await client.getRegistrationProgress(normalisedAttemptId);
|
|
182
|
+
if (progress) {
|
|
183
|
+
options.onProgress?.(progress);
|
|
184
|
+
if (progress.status === "completed") {
|
|
185
|
+
return progress;
|
|
186
|
+
}
|
|
187
|
+
if (progress.status === "partial" || progress.status === "failed") {
|
|
188
|
+
if (throwOnFailure) {
|
|
189
|
+
throw new RegistryBrokerError(
|
|
190
|
+
"Registration did not complete successfully",
|
|
191
|
+
{
|
|
192
|
+
status: 409,
|
|
193
|
+
statusText: progress.status,
|
|
194
|
+
body: progress
|
|
195
|
+
}
|
|
196
|
+
);
|
|
197
|
+
}
|
|
198
|
+
return progress;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
if (Date.now() - startedAt >= timeoutMs) {
|
|
202
|
+
throw new Error(
|
|
203
|
+
`Registration progress polling timed out after ${timeoutMs}ms`
|
|
204
|
+
);
|
|
205
|
+
}
|
|
206
|
+
await client.delay(interval, signal);
|
|
84
207
|
}
|
|
85
|
-
|
|
86
|
-
|
|
208
|
+
}
|
|
209
|
+
async function validateUaid(client, uaid) {
|
|
210
|
+
const raw = await client.requestJson(
|
|
211
|
+
`/uaids/validate/${encodeURIComponent(uaid)}`,
|
|
212
|
+
{
|
|
213
|
+
method: "GET"
|
|
214
|
+
}
|
|
215
|
+
);
|
|
216
|
+
return client.parseWithSchema(
|
|
217
|
+
raw,
|
|
218
|
+
uaidValidationResponseSchema,
|
|
219
|
+
"UAID validation response"
|
|
220
|
+
);
|
|
221
|
+
}
|
|
222
|
+
async function getUaidConnectionStatus(client, uaid) {
|
|
223
|
+
const raw = await client.requestJson(
|
|
224
|
+
`/uaids/connections/${encodeURIComponent(uaid)}/status`,
|
|
225
|
+
{
|
|
226
|
+
method: "GET"
|
|
227
|
+
}
|
|
228
|
+
);
|
|
229
|
+
return client.parseWithSchema(
|
|
230
|
+
raw,
|
|
231
|
+
uaidConnectionStatusSchema,
|
|
232
|
+
"UAID connection status"
|
|
233
|
+
);
|
|
234
|
+
}
|
|
235
|
+
async function closeUaidConnection(client, uaid) {
|
|
236
|
+
await client.request(`/uaids/connections/${encodeURIComponent(uaid)}`, {
|
|
237
|
+
method: "DELETE"
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
async function dashboardStats(client) {
|
|
241
|
+
const raw = await client.requestJson("/dashboard/stats", {
|
|
242
|
+
method: "GET"
|
|
243
|
+
});
|
|
244
|
+
return client.parseWithSchema(
|
|
245
|
+
raw,
|
|
246
|
+
dashboardStatsResponseSchema,
|
|
247
|
+
"dashboard stats response"
|
|
248
|
+
);
|
|
249
|
+
}
|
|
87
250
|
export {
|
|
88
|
-
|
|
251
|
+
closeUaidConnection,
|
|
252
|
+
dashboardStats,
|
|
253
|
+
getRegistrationProgress,
|
|
254
|
+
getRegistrationQuote,
|
|
255
|
+
getUaidConnectionStatus,
|
|
256
|
+
registerAgent,
|
|
257
|
+
resolveUaid,
|
|
258
|
+
updateAgent,
|
|
259
|
+
validateUaid,
|
|
260
|
+
waitForRegistrationCompletion
|
|
89
261
|
};
|
|
90
262
|
//# sourceMappingURL=standards-sdk.es147.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standards-sdk.es147.js","sources":["../../src/services/registry-broker/ledger-network.ts"],"sourcesContent":["type HederaNetwork = 'mainnet' | 'testnet';\ntype LedgerNetworkKind = 'hedera' | 'evm';\n\nexport interface CanonicalLedgerNetwork {\n canonical: string;\n kind: LedgerNetworkKind;\n hederaNetwork?: HederaNetwork;\n chainId?: number;\n legacyName?: string;\n}\n\nconst normalise = (value: string): string => value.trim().toLowerCase();\n\nconst HEDERA_NETWORK_ALIASES = new Map<\n string,\n { canonical: `hedera:${HederaNetwork}`; hederaNetwork: HederaNetwork }\n>([\n ['hedera:mainnet', { canonical: 'hedera:mainnet', hederaNetwork: 'mainnet' }],\n ['mainnet', { canonical: 'hedera:mainnet', hederaNetwork: 'mainnet' }],\n ['hedera-mainnet', { canonical: 'hedera:mainnet', hederaNetwork: 'mainnet' }],\n ['hedera_mainnet', { canonical: 'hedera:mainnet', hederaNetwork: 'mainnet' }],\n ['hedera:testnet', { canonical: 'hedera:testnet', hederaNetwork: 'testnet' }],\n ['testnet', { canonical: 'hedera:testnet', hederaNetwork: 'testnet' }],\n ['hedera-testnet', { canonical: 'hedera:testnet', hederaNetwork: 'testnet' }],\n ['hedera_testnet', { canonical: 'hedera:testnet', hederaNetwork: 'testnet' }],\n]);\n\nconst EVM_NETWORK_CHAIN_IDS: Record<string, number> = {\n abstract: 2741,\n 'abstract-testnet': 11124,\n base: 8453,\n 'base-sepolia': 84532,\n avalanche: 43114,\n 'avalanche-fuji': 43113,\n iotex: 4689,\n sei: 1329,\n 'sei-testnet': 1328,\n polygon: 137,\n 'polygon-amoy': 80002,\n peaq: 3338,\n};\n\nconst CHAIN_ID_TO_ALIAS = new Map<number, string>(\n Object.entries(EVM_NETWORK_CHAIN_IDS).map(([alias, id]) => [id, alias]),\n);\n\nconst parseChainId = (value: string): number | undefined => {\n if (/^eip155:\\d+$/i.test(value)) {\n return Number.parseInt(value.split(':')[1]!, 10);\n }\n if (/^\\d+$/.test(value)) {\n return Number.parseInt(value, 10);\n }\n return undefined;\n};\n\nconst normaliseEvmNetwork = (value: string): CanonicalLedgerNetwork => {\n const trimmed = normalise(value);\n let chainId = parseChainId(trimmed);\n let alias: string | undefined;\n\n if (chainId === undefined) {\n const mapped = EVM_NETWORK_CHAIN_IDS[trimmed];\n if (mapped !== undefined) {\n chainId = mapped;\n alias = trimmed;\n }\n } else if (CHAIN_ID_TO_ALIAS.has(chainId)) {\n alias = CHAIN_ID_TO_ALIAS.get(chainId);\n }\n\n if (chainId === undefined) {\n throw new Error(\n 'Unsupported EVM ledger network. Provide an alias like \"base-sepolia\" or a canonical eip155:<chainId> string.',\n );\n }\n\n return {\n canonical: `eip155:${chainId}`,\n kind: 'evm',\n chainId,\n legacyName: alias,\n };\n};\n\nconst normaliseHederaNetwork = (value: string): CanonicalLedgerNetwork => {\n const trimmed = normalise(value);\n const mapping = HEDERA_NETWORK_ALIASES.get(trimmed);\n if (!mapping) {\n throw new Error(\n 'Unsupported Hedera network. Use hedera:mainnet or hedera:testnet (legacy \"mainnet\"/\"testnet\" also accepted).',\n );\n }\n return {\n canonical: mapping.canonical,\n kind: 'hedera',\n hederaNetwork: mapping.hederaNetwork,\n };\n};\n\nexport const canonicalizeLedgerNetwork = (\n network: string,\n): CanonicalLedgerNetwork => {\n if (typeof network !== 'string' || network.trim().length === 0) {\n throw new Error('Ledger network is required.');\n }\n const trimmed = normalise(network);\n if (\n trimmed.startsWith('hedera:') ||\n trimmed.includes('hedera-') ||\n trimmed.includes('hedera_') ||\n trimmed === 'mainnet' ||\n trimmed === 'testnet'\n ) {\n return normaliseHederaNetwork(trimmed);\n }\n return normaliseEvmNetwork(trimmed);\n};\n"],"names":[],"mappings":"AAWA,MAAM,YAAY,CAAC,UAA0B,MAAM,KAAA,EAAO,YAAA;AAE1D,MAAM,6CAA6B,IAGjC;AAAA,EACA,CAAC,kBAAkB,EAAE,WAAW,kBAAkB,eAAe,WAAW;AAAA,EAC5E,CAAC,WAAW,EAAE,WAAW,kBAAkB,eAAe,WAAW;AAAA,EACrE,CAAC,kBAAkB,EAAE,WAAW,kBAAkB,eAAe,WAAW;AAAA,EAC5E,CAAC,kBAAkB,EAAE,WAAW,kBAAkB,eAAe,WAAW;AAAA,EAC5E,CAAC,kBAAkB,EAAE,WAAW,kBAAkB,eAAe,WAAW;AAAA,EAC5E,CAAC,WAAW,EAAE,WAAW,kBAAkB,eAAe,WAAW;AAAA,EACrE,CAAC,kBAAkB,EAAE,WAAW,kBAAkB,eAAe,WAAW;AAAA,EAC5E,CAAC,kBAAkB,EAAE,WAAW,kBAAkB,eAAe,WAAW;AAC9E,CAAC;AAED,MAAM,wBAAgD;AAAA,EACpD,UAAU;AAAA,EACV,oBAAoB;AAAA,EACpB,MAAM;AAAA,EACN,gBAAgB;AAAA,EAChB,WAAW;AAAA,EACX,kBAAkB;AAAA,EAClB,OAAO;AAAA,EACP,KAAK;AAAA,EACL,eAAe;AAAA,EACf,SAAS;AAAA,EACT,gBAAgB;AAAA,EAChB,MAAM;AACR;AAEA,MAAM,oBAAoB,IAAI;AAAA,EAC5B,OAAO,QAAQ,qBAAqB,EAAE,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,KAAK,CAAC;AACxE;AAEA,MAAM,eAAe,CAAC,UAAsC;AAC1D,MAAI,gBAAgB,KAAK,KAAK,GAAG;AAC/B,WAAO,OAAO,SAAS,MAAM,MAAM,GAAG,EAAE,CAAC,GAAI,EAAE;AAAA,EACjD;AACA,MAAI,QAAQ,KAAK,KAAK,GAAG;AACvB,WAAO,OAAO,SAAS,OAAO,EAAE;AAAA,EAClC;AACA,SAAO;AACT;AAEA,MAAM,sBAAsB,CAAC,UAA0C;AACrE,QAAM,UAAU,UAAU,KAAK;AAC/B,MAAI,UAAU,aAAa,OAAO;AAClC,MAAI;AAEJ,MAAI,YAAY,QAAW;AACzB,UAAM,SAAS,sBAAsB,OAAO;AAC5C,QAAI,WAAW,QAAW;AACxB,gBAAU;AACV,cAAQ;AAAA,IACV;AAAA,EACF,WAAW,kBAAkB,IAAI,OAAO,GAAG;AACzC,YAAQ,kBAAkB,IAAI,OAAO;AAAA,EACvC;AAEA,MAAI,YAAY,QAAW;AACzB,UAAM,IAAI;AAAA,MACR;AAAA,IAAA;AAAA,EAEJ;AAEA,SAAO;AAAA,IACL,WAAW,UAAU,OAAO;AAAA,IAC5B,MAAM;AAAA,IACN;AAAA,IACA,YAAY;AAAA,EAAA;AAEhB;AAEA,MAAM,yBAAyB,CAAC,UAA0C;AACxE,QAAM,UAAU,UAAU,KAAK;AAC/B,QAAM,UAAU,uBAAuB,IAAI,OAAO;AAClD,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI;AAAA,MACR;AAAA,IAAA;AAAA,EAEJ;AACA,SAAO;AAAA,IACL,WAAW,QAAQ;AAAA,IACnB,MAAM;AAAA,IACN,eAAe,QAAQ;AAAA,EAAA;AAE3B;AAEO,MAAM,4BAA4B,CACvC,YAC2B;AAC3B,MAAI,OAAO,YAAY,YAAY,QAAQ,KAAA,EAAO,WAAW,GAAG;AAC9D,UAAM,IAAI,MAAM,6BAA6B;AAAA,EAC/C;AACA,QAAM,UAAU,UAAU,OAAO;AACjC,MACE,QAAQ,WAAW,SAAS,KAC5B,QAAQ,SAAS,SAAS,KAC1B,QAAQ,SAAS,SAAS,KAC1B,YAAY,aACZ,YAAY,WACZ;AACA,WAAO,uBAAuB,OAAO;AAAA,EACvC;AACA,SAAO,oBAAoB,OAAO;AACpC;"}
|
|
1
|
+
{"version":3,"file":"standards-sdk.es147.js","sources":["../../src/services/registry-broker/client/agents.ts"],"sourcesContent":["import type {\n AgentRegistrationRequest,\n DashboardStatsResponse,\n JsonValue,\n RegisterAgentOptions,\n RegisterAgentQuoteResponse,\n RegisterAgentResponse,\n RegistrationProgressRecord,\n RegistrationProgressWaitOptions,\n ResolvedAgentResponse,\n UaidConnectionStatus,\n UaidValidationResponse,\n} from '../types';\nimport {\n dashboardStatsResponseSchema,\n registerAgentResponseSchema,\n registrationProgressResponseSchema,\n registrationQuoteResponseSchema,\n resolveResponseSchema,\n uaidConnectionStatusSchema,\n uaidValidationResponseSchema,\n} from '../schemas';\nimport type { RegistryBrokerClient } from './base-client';\nimport { purchaseCreditsWithHbar } from './credits';\nimport {\n createAbortError,\n DEFAULT_PROGRESS_INTERVAL_MS,\n DEFAULT_PROGRESS_TIMEOUT_MS,\n MINIMUM_REGISTRATION_AUTO_TOP_UP_CREDITS,\n serialiseAgentRegistrationRequest,\n} from './utils';\nimport { RegistryBrokerError } from './errors';\n\nasync function performRegisterAgent(\n client: RegistryBrokerClient,\n payload: AgentRegistrationRequest,\n): Promise<RegisterAgentResponse> {\n const raw = await client.requestJson<JsonValue>('/register', {\n method: 'POST',\n body: serialiseAgentRegistrationRequest(payload),\n headers: { 'content-type': 'application/json' },\n });\n return client.parseWithSchema(\n raw,\n registerAgentResponseSchema,\n 'register agent response',\n );\n}\n\nfunction calculateHbarAmount(\n creditsToPurchase: number,\n creditsPerHbar: number,\n): number {\n if (creditsPerHbar <= 0) {\n throw new Error('creditsPerHbar must be positive');\n }\n if (creditsToPurchase <= 0) {\n throw new Error('creditsToPurchase must be positive');\n }\n const rawHbar = creditsToPurchase / creditsPerHbar;\n const tinybars = Math.ceil(rawHbar * 1e8);\n return tinybars / 1e8;\n}\n\nfunction resolveCreditsToPurchase(shortfallCredits: number): number {\n if (!Number.isFinite(shortfallCredits) || shortfallCredits <= 0) {\n return 0;\n }\n return Math.max(\n Math.ceil(shortfallCredits),\n MINIMUM_REGISTRATION_AUTO_TOP_UP_CREDITS,\n );\n}\n\nasync function ensureCreditsForRegistration(\n client: RegistryBrokerClient,\n payload: AgentRegistrationRequest,\n autoTopUp: RegisterAgentOptions['autoTopUp'],\n): Promise<void> {\n const details = autoTopUp ?? null;\n if (!details) {\n return;\n }\n\n if (!details.accountId || !details.accountId.trim()) {\n throw new Error('autoTopUp.accountId is required');\n }\n\n if (!details.privateKey || !details.privateKey.trim()) {\n throw new Error('autoTopUp.privateKey is required');\n }\n\n for (let attempt = 0; attempt < 3; attempt += 1) {\n const quote = await getRegistrationQuote(client, payload);\n const shortfall = quote.shortfallCredits ?? 0;\n if (shortfall <= 0) {\n return;\n }\n const creditsToPurchase = resolveCreditsToPurchase(shortfall);\n if (creditsToPurchase <= 0) {\n return;\n }\n\n const creditsPerHbar = quote.creditsPerHbar ?? null;\n if (!creditsPerHbar || creditsPerHbar <= 0) {\n throw new Error('Unable to determine credits per HBAR for auto top-up');\n }\n\n const hbarAmount = calculateHbarAmount(creditsToPurchase, creditsPerHbar);\n\n await purchaseCreditsWithHbar(client, {\n accountId: details.accountId.trim(),\n privateKey: details.privateKey.trim(),\n hbarAmount,\n memo: details.memo ?? 'Registry Broker auto top-up',\n metadata: {\n shortfallCredits: shortfall,\n requiredCredits: quote.requiredCredits,\n purchasedCredits: creditsToPurchase,\n },\n });\n }\n\n const finalQuote = await getRegistrationQuote(client, payload);\n if ((finalQuote.shortfallCredits ?? 0) > 0) {\n throw new Error('Unable to purchase sufficient credits for registration');\n }\n}\n\nexport async function resolveUaid(\n client: RegistryBrokerClient,\n uaid: string,\n): Promise<ResolvedAgentResponse> {\n const raw = await client.requestJson<JsonValue>(\n `/resolve/${encodeURIComponent(uaid)}`,\n {\n method: 'GET',\n },\n );\n return client.parseWithSchema(\n raw,\n resolveResponseSchema,\n 'resolve UAID response',\n );\n}\n\nexport async function registerAgent(\n client: RegistryBrokerClient,\n payload: AgentRegistrationRequest,\n options?: RegisterAgentOptions,\n): Promise<RegisterAgentResponse> {\n const autoTopUp = options?.autoTopUp ?? client.registrationAutoTopUp;\n\n if (!autoTopUp) {\n return performRegisterAgent(client, payload);\n }\n\n await ensureCreditsForRegistration(client, payload, autoTopUp);\n\n let retried = false;\n while (true) {\n try {\n return await performRegisterAgent(client, payload);\n } catch (error) {\n const shortfall = client.extractInsufficientCreditsDetails(error);\n if (shortfall && !retried) {\n await ensureCreditsForRegistration(client, payload, autoTopUp);\n retried = true;\n continue;\n }\n throw error;\n }\n }\n}\n\nexport async function getRegistrationQuote(\n client: RegistryBrokerClient,\n payload: AgentRegistrationRequest,\n): Promise<RegisterAgentQuoteResponse> {\n const raw = await client.requestJson<JsonValue>('/register/quote', {\n method: 'POST',\n body: serialiseAgentRegistrationRequest(payload),\n headers: { 'content-type': 'application/json' },\n });\n\n return client.parseWithSchema(\n raw,\n registrationQuoteResponseSchema,\n 'registration quote response',\n );\n}\n\nexport async function updateAgent(\n client: RegistryBrokerClient,\n uaid: string,\n payload: AgentRegistrationRequest,\n): Promise<RegisterAgentResponse> {\n const raw = await client.requestJson<JsonValue>(\n `/register/${encodeURIComponent(uaid)}`,\n {\n method: 'PUT',\n body: serialiseAgentRegistrationRequest(payload),\n headers: { 'content-type': 'application/json' },\n },\n );\n\n return client.parseWithSchema(\n raw,\n registerAgentResponseSchema,\n 'update agent response',\n );\n}\n\nexport async function getRegistrationProgress(\n client: RegistryBrokerClient,\n attemptId: string,\n): Promise<RegistrationProgressRecord | null> {\n const normalisedAttemptId = attemptId.trim();\n if (!normalisedAttemptId) {\n throw new Error('attemptId is required');\n }\n\n try {\n const raw = await client.requestJson<JsonValue>(\n `/register/progress/${encodeURIComponent(normalisedAttemptId)}`,\n { method: 'GET' },\n );\n\n const parsed = client.parseWithSchema(\n raw,\n registrationProgressResponseSchema,\n 'registration progress response',\n );\n\n return parsed.progress;\n } catch (error) {\n if (error instanceof RegistryBrokerError && error.status === 404) {\n return null;\n }\n throw error;\n }\n}\n\nexport async function waitForRegistrationCompletion(\n client: RegistryBrokerClient,\n attemptId: string,\n options: RegistrationProgressWaitOptions = {},\n): Promise<RegistrationProgressRecord> {\n const normalisedAttemptId = attemptId.trim();\n if (!normalisedAttemptId) {\n throw new Error('attemptId is required');\n }\n\n const interval = Math.max(\n 250,\n options.intervalMs ?? DEFAULT_PROGRESS_INTERVAL_MS,\n );\n const timeoutMs = options.timeoutMs ?? DEFAULT_PROGRESS_TIMEOUT_MS;\n const throwOnFailure = options.throwOnFailure ?? true;\n const signal = options.signal;\n const startedAt = Date.now();\n\n while (true) {\n if (signal?.aborted) {\n throw createAbortError();\n }\n\n const progress = await client.getRegistrationProgress(normalisedAttemptId);\n\n if (progress) {\n options.onProgress?.(progress);\n\n if (progress.status === 'completed') {\n return progress;\n }\n\n if (progress.status === 'partial' || progress.status === 'failed') {\n if (throwOnFailure) {\n throw new RegistryBrokerError(\n 'Registration did not complete successfully',\n {\n status: 409,\n statusText: progress.status,\n body: progress,\n },\n );\n }\n return progress;\n }\n }\n\n if (Date.now() - startedAt >= timeoutMs) {\n throw new Error(\n `Registration progress polling timed out after ${timeoutMs}ms`,\n );\n }\n\n await client.delay(interval, signal);\n }\n}\n\nexport async function validateUaid(\n client: RegistryBrokerClient,\n uaid: string,\n): Promise<UaidValidationResponse> {\n const raw = await client.requestJson<JsonValue>(\n `/uaids/validate/${encodeURIComponent(uaid)}`,\n {\n method: 'GET',\n },\n );\n return client.parseWithSchema(\n raw,\n uaidValidationResponseSchema,\n 'UAID validation response',\n );\n}\n\nexport async function getUaidConnectionStatus(\n client: RegistryBrokerClient,\n uaid: string,\n): Promise<UaidConnectionStatus> {\n const raw = await client.requestJson<JsonValue>(\n `/uaids/connections/${encodeURIComponent(uaid)}/status`,\n {\n method: 'GET',\n },\n );\n return client.parseWithSchema(\n raw,\n uaidConnectionStatusSchema,\n 'UAID connection status',\n );\n}\n\nexport async function closeUaidConnection(\n client: RegistryBrokerClient,\n uaid: string,\n): Promise<void> {\n await client.request(`/uaids/connections/${encodeURIComponent(uaid)}`, {\n method: 'DELETE',\n });\n}\n\nexport async function dashboardStats(\n client: RegistryBrokerClient,\n): Promise<DashboardStatsResponse> {\n const raw = await client.requestJson<JsonValue>('/dashboard/stats', {\n method: 'GET',\n });\n return client.parseWithSchema(\n raw,\n dashboardStatsResponseSchema,\n 'dashboard stats response',\n );\n}\n"],"names":[],"mappings":";;;;AAiCA,eAAe,qBACb,QACA,SACgC;AAChC,QAAM,MAAM,MAAM,OAAO,YAAuB,aAAa;AAAA,IAC3D,QAAQ;AAAA,IACR,MAAM,kCAAkC,OAAO;AAAA,IAC/C,SAAS,EAAE,gBAAgB,mBAAA;AAAA,EAAmB,CAC/C;AACD,SAAO,OAAO;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;AAEA,SAAS,oBACP,mBACA,gBACQ;AACR,MAAI,kBAAkB,GAAG;AACvB,UAAM,IAAI,MAAM,iCAAiC;AAAA,EACnD;AACA,MAAI,qBAAqB,GAAG;AAC1B,UAAM,IAAI,MAAM,oCAAoC;AAAA,EACtD;AACA,QAAM,UAAU,oBAAoB;AACpC,QAAM,WAAW,KAAK,KAAK,UAAU,GAAG;AACxC,SAAO,WAAW;AACpB;AAEA,SAAS,yBAAyB,kBAAkC;AAClE,MAAI,CAAC,OAAO,SAAS,gBAAgB,KAAK,oBAAoB,GAAG;AAC/D,WAAO;AAAA,EACT;AACA,SAAO,KAAK;AAAA,IACV,KAAK,KAAK,gBAAgB;AAAA,IAC1B;AAAA,EAAA;AAEJ;AAEA,eAAe,6BACb,QACA,SACA,WACe;AACf,QAAM,UAAU,aAAa;AAC7B,MAAI,CAAC,SAAS;AACZ;AAAA,EACF;AAEA,MAAI,CAAC,QAAQ,aAAa,CAAC,QAAQ,UAAU,QAAQ;AACnD,UAAM,IAAI,MAAM,iCAAiC;AAAA,EACnD;AAEA,MAAI,CAAC,QAAQ,cAAc,CAAC,QAAQ,WAAW,QAAQ;AACrD,UAAM,IAAI,MAAM,kCAAkC;AAAA,EACpD;AAEA,WAAS,UAAU,GAAG,UAAU,GAAG,WAAW,GAAG;AAC/C,UAAM,QAAQ,MAAM,qBAAqB,QAAQ,OAAO;AACxD,UAAM,YAAY,MAAM,oBAAoB;AAC5C,QAAI,aAAa,GAAG;AAClB;AAAA,IACF;AACA,UAAM,oBAAoB,yBAAyB,SAAS;AAC5D,QAAI,qBAAqB,GAAG;AAC1B;AAAA,IACF;AAEA,UAAM,iBAAiB,MAAM,kBAAkB;AAC/C,QAAI,CAAC,kBAAkB,kBAAkB,GAAG;AAC1C,YAAM,IAAI,MAAM,sDAAsD;AAAA,IACxE;AAEA,UAAM,aAAa,oBAAoB,mBAAmB,cAAc;AAExE,UAAM,wBAAwB,QAAQ;AAAA,MACpC,WAAW,QAAQ,UAAU,KAAA;AAAA,MAC7B,YAAY,QAAQ,WAAW,KAAA;AAAA,MAC/B;AAAA,MACA,MAAM,QAAQ,QAAQ;AAAA,MACtB,UAAU;AAAA,QACR,kBAAkB;AAAA,QAClB,iBAAiB,MAAM;AAAA,QACvB,kBAAkB;AAAA,MAAA;AAAA,IACpB,CACD;AAAA,EACH;AAEA,QAAM,aAAa,MAAM,qBAAqB,QAAQ,OAAO;AAC7D,OAAK,WAAW,oBAAoB,KAAK,GAAG;AAC1C,UAAM,IAAI,MAAM,wDAAwD;AAAA,EAC1E;AACF;AAEA,eAAsB,YACpB,QACA,MACgC;AAChC,QAAM,MAAM,MAAM,OAAO;AAAA,IACvB,YAAY,mBAAmB,IAAI,CAAC;AAAA,IACpC;AAAA,MACE,QAAQ;AAAA,IAAA;AAAA,EACV;AAEF,SAAO,OAAO;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;AAEA,eAAsB,cACpB,QACA,SACA,SACgC;AAChC,QAAM,YAAY,SAAS,aAAa,OAAO;AAE/C,MAAI,CAAC,WAAW;AACd,WAAO,qBAAqB,QAAQ,OAAO;AAAA,EAC7C;AAEA,QAAM,6BAA6B,QAAQ,SAAS,SAAS;AAE7D,MAAI,UAAU;AACd,SAAO,MAAM;AACX,QAAI;AACF,aAAO,MAAM,qBAAqB,QAAQ,OAAO;AAAA,IACnD,SAAS,OAAO;AACd,YAAM,YAAY,OAAO,kCAAkC,KAAK;AAChE,UAAI,aAAa,CAAC,SAAS;AACzB,cAAM,6BAA6B,QAAQ,SAAS,SAAS;AAC7D,kBAAU;AACV;AAAA,MACF;AACA,YAAM;AAAA,IACR;AAAA,EACF;AACF;AAEA,eAAsB,qBACpB,QACA,SACqC;AACrC,QAAM,MAAM,MAAM,OAAO,YAAuB,mBAAmB;AAAA,IACjE,QAAQ;AAAA,IACR,MAAM,kCAAkC,OAAO;AAAA,IAC/C,SAAS,EAAE,gBAAgB,mBAAA;AAAA,EAAmB,CAC/C;AAED,SAAO,OAAO;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;AAEA,eAAsB,YACpB,QACA,MACA,SACgC;AAChC,QAAM,MAAM,MAAM,OAAO;AAAA,IACvB,aAAa,mBAAmB,IAAI,CAAC;AAAA,IACrC;AAAA,MACE,QAAQ;AAAA,MACR,MAAM,kCAAkC,OAAO;AAAA,MAC/C,SAAS,EAAE,gBAAgB,mBAAA;AAAA,IAAmB;AAAA,EAChD;AAGF,SAAO,OAAO;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;AAEA,eAAsB,wBACpB,QACA,WAC4C;AAC5C,QAAM,sBAAsB,UAAU,KAAA;AACtC,MAAI,CAAC,qBAAqB;AACxB,UAAM,IAAI,MAAM,uBAAuB;AAAA,EACzC;AAEA,MAAI;AACF,UAAM,MAAM,MAAM,OAAO;AAAA,MACvB,sBAAsB,mBAAmB,mBAAmB,CAAC;AAAA,MAC7D,EAAE,QAAQ,MAAA;AAAA,IAAM;AAGlB,UAAM,SAAS,OAAO;AAAA,MACpB;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAGF,WAAO,OAAO;AAAA,EAChB,SAAS,OAAO;AACd,QAAI,iBAAiB,uBAAuB,MAAM,WAAW,KAAK;AAChE,aAAO;AAAA,IACT;AACA,UAAM;AAAA,EACR;AACF;AAEA,eAAsB,8BACpB,QACA,WACA,UAA2C,CAAA,GACN;AACrC,QAAM,sBAAsB,UAAU,KAAA;AACtC,MAAI,CAAC,qBAAqB;AACxB,UAAM,IAAI,MAAM,uBAAuB;AAAA,EACzC;AAEA,QAAM,WAAW,KAAK;AAAA,IACpB;AAAA,IACA,QAAQ,cAAc;AAAA,EAAA;AAExB,QAAM,YAAY,QAAQ,aAAa;AACvC,QAAM,iBAAiB,QAAQ,kBAAkB;AACjD,QAAM,SAAS,QAAQ;AACvB,QAAM,YAAY,KAAK,IAAA;AAEvB,SAAO,MAAM;AACX,QAAI,QAAQ,SAAS;AACnB,YAAM,iBAAA;AAAA,IACR;AAEA,UAAM,WAAW,MAAM,OAAO,wBAAwB,mBAAmB;AAEzE,QAAI,UAAU;AACZ,cAAQ,aAAa,QAAQ;AAE7B,UAAI,SAAS,WAAW,aAAa;AACnC,eAAO;AAAA,MACT;AAEA,UAAI,SAAS,WAAW,aAAa,SAAS,WAAW,UAAU;AACjE,YAAI,gBAAgB;AAClB,gBAAM,IAAI;AAAA,YACR;AAAA,YACA;AAAA,cACE,QAAQ;AAAA,cACR,YAAY,SAAS;AAAA,cACrB,MAAM;AAAA,YAAA;AAAA,UACR;AAAA,QAEJ;AACA,eAAO;AAAA,MACT;AAAA,IACF;AAEA,QAAI,KAAK,QAAQ,aAAa,WAAW;AACvC,YAAM,IAAI;AAAA,QACR,iDAAiD,SAAS;AAAA,MAAA;AAAA,IAE9D;AAEA,UAAM,OAAO,MAAM,UAAU,MAAM;AAAA,EACrC;AACF;AAEA,eAAsB,aACpB,QACA,MACiC;AACjC,QAAM,MAAM,MAAM,OAAO;AAAA,IACvB,mBAAmB,mBAAmB,IAAI,CAAC;AAAA,IAC3C;AAAA,MACE,QAAQ;AAAA,IAAA;AAAA,EACV;AAEF,SAAO,OAAO;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;AAEA,eAAsB,wBACpB,QACA,MAC+B;AAC/B,QAAM,MAAM,MAAM,OAAO;AAAA,IACvB,sBAAsB,mBAAmB,IAAI,CAAC;AAAA,IAC9C;AAAA,MACE,QAAQ;AAAA,IAAA;AAAA,EACV;AAEF,SAAO,OAAO;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;AAEA,eAAsB,oBACpB,QACA,MACe;AACf,QAAM,OAAO,QAAQ,sBAAsB,mBAAmB,IAAI,CAAC,IAAI;AAAA,IACrE,QAAQ;AAAA,EAAA,CACT;AACH;AAEA,eAAsB,eACpB,QACiC;AACjC,QAAM,MAAM,MAAM,OAAO,YAAuB,oBAAoB;AAAA,IAClE,QAAQ;AAAA,EAAA,CACT;AACD,SAAO,OAAO;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;"}
|
|
@@ -1,84 +1,90 @@
|
|
|
1
|
-
|
|
2
|
-
const
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
const normalise = (value) => value.trim().toLowerCase();
|
|
2
|
+
const HEDERA_NETWORK_ALIASES = /* @__PURE__ */ new Map([
|
|
3
|
+
["hedera:mainnet", { canonical: "hedera:mainnet", hederaNetwork: "mainnet" }],
|
|
4
|
+
["mainnet", { canonical: "hedera:mainnet", hederaNetwork: "mainnet" }],
|
|
5
|
+
["hedera-mainnet", { canonical: "hedera:mainnet", hederaNetwork: "mainnet" }],
|
|
6
|
+
["hedera_mainnet", { canonical: "hedera:mainnet", hederaNetwork: "mainnet" }],
|
|
7
|
+
["hedera:testnet", { canonical: "hedera:testnet", hederaNetwork: "testnet" }],
|
|
8
|
+
["testnet", { canonical: "hedera:testnet", hederaNetwork: "testnet" }],
|
|
9
|
+
["hedera-testnet", { canonical: "hedera:testnet", hederaNetwork: "testnet" }],
|
|
10
|
+
["hedera_testnet", { canonical: "hedera:testnet", hederaNetwork: "testnet" }]
|
|
11
|
+
]);
|
|
12
|
+
const EVM_NETWORK_CHAIN_IDS = {
|
|
13
|
+
abstract: 2741,
|
|
14
|
+
"abstract-testnet": 11124,
|
|
15
|
+
base: 8453,
|
|
16
|
+
"base-sepolia": 84532,
|
|
17
|
+
avalanche: 43114,
|
|
18
|
+
"avalanche-fuji": 43113,
|
|
19
|
+
iotex: 4689,
|
|
20
|
+
sei: 1329,
|
|
21
|
+
"sei-testnet": 1328,
|
|
22
|
+
polygon: 137,
|
|
23
|
+
"polygon-amoy": 80002,
|
|
24
|
+
peaq: 3338
|
|
25
|
+
};
|
|
26
|
+
const CHAIN_ID_TO_ALIAS = new Map(
|
|
27
|
+
Object.entries(EVM_NETWORK_CHAIN_IDS).map(([alias, id]) => [id, alias])
|
|
28
|
+
);
|
|
29
|
+
const parseChainId = (value) => {
|
|
30
|
+
if (/^eip155:\d+$/i.test(value)) {
|
|
31
|
+
return Number.parseInt(value.split(":")[1], 10);
|
|
7
32
|
}
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
cachedSdk = resolved;
|
|
11
|
-
return resolved;
|
|
33
|
+
if (/^\d+$/.test(value)) {
|
|
34
|
+
return Number.parseInt(value, 10);
|
|
12
35
|
}
|
|
13
|
-
|
|
14
|
-
throw new Error(message);
|
|
36
|
+
return void 0;
|
|
15
37
|
};
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
38
|
+
const normaliseEvmNetwork = (value) => {
|
|
39
|
+
const trimmed = normalise(value);
|
|
40
|
+
let chainId = parseChainId(trimmed);
|
|
41
|
+
let alias;
|
|
42
|
+
if (chainId === void 0) {
|
|
43
|
+
const mapped = EVM_NETWORK_CHAIN_IDS[trimmed];
|
|
44
|
+
if (mapped !== void 0) {
|
|
45
|
+
chainId = mapped;
|
|
46
|
+
alias = trimmed;
|
|
47
|
+
}
|
|
48
|
+
} else if (CHAIN_ID_TO_ALIAS.has(chainId)) {
|
|
49
|
+
alias = CHAIN_ID_TO_ALIAS.get(chainId);
|
|
19
50
|
}
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
51
|
+
if (chainId === void 0) {
|
|
52
|
+
throw new Error(
|
|
53
|
+
'Unsupported EVM ledger network. Provide an alias like "base-sepolia" or a canonical eip155:<chainId> string.'
|
|
54
|
+
);
|
|
24
55
|
}
|
|
25
|
-
|
|
26
|
-
|
|
56
|
+
return {
|
|
57
|
+
canonical: `eip155:${chainId}`,
|
|
58
|
+
kind: "evm",
|
|
59
|
+
chainId,
|
|
60
|
+
legacyName: alias
|
|
61
|
+
};
|
|
27
62
|
};
|
|
28
|
-
const
|
|
29
|
-
const
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
63
|
+
const normaliseHederaNetwork = (value) => {
|
|
64
|
+
const trimmed = normalise(value);
|
|
65
|
+
const mapping = HEDERA_NETWORK_ALIASES.get(trimmed);
|
|
66
|
+
if (!mapping) {
|
|
67
|
+
throw new Error(
|
|
68
|
+
'Unsupported Hedera network. Use hedera:mainnet or hedera:testnet (legacy "mainnet"/"testnet" also accepted).'
|
|
69
|
+
);
|
|
35
70
|
}
|
|
36
|
-
const accountId = AccountId.fromString(options.accountId);
|
|
37
|
-
const privateKey = PrivateKey.fromString(options.privateKey);
|
|
38
|
-
const ledgerId = LedgerId.fromString(options.network);
|
|
39
71
|
return {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
getNetwork: () => ({}),
|
|
44
|
-
getMirrorNetwork: () => [],
|
|
45
|
-
sign: async (messages) => Promise.all(
|
|
46
|
-
messages.map(async (message) => {
|
|
47
|
-
const signature = await privateKey.sign(message);
|
|
48
|
-
return new SignerSignature({
|
|
49
|
-
publicKey: privateKey.publicKey,
|
|
50
|
-
signature,
|
|
51
|
-
accountId
|
|
52
|
-
});
|
|
53
|
-
})
|
|
54
|
-
),
|
|
55
|
-
getAccountBalance: async () => {
|
|
56
|
-
throw unsupported("getAccountBalance");
|
|
57
|
-
},
|
|
58
|
-
getAccountInfo: async () => {
|
|
59
|
-
throw unsupported("getAccountInfo");
|
|
60
|
-
},
|
|
61
|
-
getAccountRecords: async () => {
|
|
62
|
-
throw unsupported("getAccountRecords");
|
|
63
|
-
},
|
|
64
|
-
signTransaction: async (_) => {
|
|
65
|
-
throw unsupported("signTransaction");
|
|
66
|
-
},
|
|
67
|
-
checkTransaction: async (_) => {
|
|
68
|
-
throw unsupported("checkTransaction");
|
|
69
|
-
},
|
|
70
|
-
populateTransaction: async (_) => {
|
|
71
|
-
throw unsupported("populateTransaction");
|
|
72
|
-
},
|
|
73
|
-
call: async (_request) => {
|
|
74
|
-
throw unsupported("call");
|
|
75
|
-
}
|
|
72
|
+
canonical: mapping.canonical,
|
|
73
|
+
kind: "hedera",
|
|
74
|
+
hederaNetwork: mapping.hederaNetwork
|
|
76
75
|
};
|
|
77
76
|
};
|
|
78
|
-
const
|
|
79
|
-
|
|
77
|
+
const canonicalizeLedgerNetwork = (network) => {
|
|
78
|
+
if (typeof network !== "string" || network.trim().length === 0) {
|
|
79
|
+
throw new Error("Ledger network is required.");
|
|
80
|
+
}
|
|
81
|
+
const trimmed = normalise(network);
|
|
82
|
+
if (trimmed.startsWith("hedera:") || trimmed.includes("hedera-") || trimmed.includes("hedera_") || trimmed === "mainnet" || trimmed === "testnet") {
|
|
83
|
+
return normaliseHederaNetwork(trimmed);
|
|
84
|
+
}
|
|
85
|
+
return normaliseEvmNetwork(trimmed);
|
|
86
|
+
};
|
|
80
87
|
export {
|
|
81
|
-
|
|
82
|
-
createPrivateKeySignerAsync
|
|
88
|
+
canonicalizeLedgerNetwork
|
|
83
89
|
};
|
|
84
90
|
//# sourceMappingURL=standards-sdk.es148.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standards-sdk.es148.js","sources":["../../src/services/registry-broker/
|
|
1
|
+
{"version":3,"file":"standards-sdk.es148.js","sources":["../../src/services/registry-broker/ledger-network.ts"],"sourcesContent":["type HederaNetwork = 'mainnet' | 'testnet';\ntype LedgerNetworkKind = 'hedera' | 'evm';\n\nexport interface CanonicalLedgerNetwork {\n canonical: string;\n kind: LedgerNetworkKind;\n hederaNetwork?: HederaNetwork;\n chainId?: number;\n legacyName?: string;\n}\n\nconst normalise = (value: string): string => value.trim().toLowerCase();\n\nconst HEDERA_NETWORK_ALIASES = new Map<\n string,\n { canonical: `hedera:${HederaNetwork}`; hederaNetwork: HederaNetwork }\n>([\n ['hedera:mainnet', { canonical: 'hedera:mainnet', hederaNetwork: 'mainnet' }],\n ['mainnet', { canonical: 'hedera:mainnet', hederaNetwork: 'mainnet' }],\n ['hedera-mainnet', { canonical: 'hedera:mainnet', hederaNetwork: 'mainnet' }],\n ['hedera_mainnet', { canonical: 'hedera:mainnet', hederaNetwork: 'mainnet' }],\n ['hedera:testnet', { canonical: 'hedera:testnet', hederaNetwork: 'testnet' }],\n ['testnet', { canonical: 'hedera:testnet', hederaNetwork: 'testnet' }],\n ['hedera-testnet', { canonical: 'hedera:testnet', hederaNetwork: 'testnet' }],\n ['hedera_testnet', { canonical: 'hedera:testnet', hederaNetwork: 'testnet' }],\n]);\n\nconst EVM_NETWORK_CHAIN_IDS: Record<string, number> = {\n abstract: 2741,\n 'abstract-testnet': 11124,\n base: 8453,\n 'base-sepolia': 84532,\n avalanche: 43114,\n 'avalanche-fuji': 43113,\n iotex: 4689,\n sei: 1329,\n 'sei-testnet': 1328,\n polygon: 137,\n 'polygon-amoy': 80002,\n peaq: 3338,\n};\n\nconst CHAIN_ID_TO_ALIAS = new Map<number, string>(\n Object.entries(EVM_NETWORK_CHAIN_IDS).map(([alias, id]) => [id, alias]),\n);\n\nconst parseChainId = (value: string): number | undefined => {\n if (/^eip155:\\d+$/i.test(value)) {\n return Number.parseInt(value.split(':')[1]!, 10);\n }\n if (/^\\d+$/.test(value)) {\n return Number.parseInt(value, 10);\n }\n return undefined;\n};\n\nconst normaliseEvmNetwork = (value: string): CanonicalLedgerNetwork => {\n const trimmed = normalise(value);\n let chainId = parseChainId(trimmed);\n let alias: string | undefined;\n\n if (chainId === undefined) {\n const mapped = EVM_NETWORK_CHAIN_IDS[trimmed];\n if (mapped !== undefined) {\n chainId = mapped;\n alias = trimmed;\n }\n } else if (CHAIN_ID_TO_ALIAS.has(chainId)) {\n alias = CHAIN_ID_TO_ALIAS.get(chainId);\n }\n\n if (chainId === undefined) {\n throw new Error(\n 'Unsupported EVM ledger network. Provide an alias like \"base-sepolia\" or a canonical eip155:<chainId> string.',\n );\n }\n\n return {\n canonical: `eip155:${chainId}`,\n kind: 'evm',\n chainId,\n legacyName: alias,\n };\n};\n\nconst normaliseHederaNetwork = (value: string): CanonicalLedgerNetwork => {\n const trimmed = normalise(value);\n const mapping = HEDERA_NETWORK_ALIASES.get(trimmed);\n if (!mapping) {\n throw new Error(\n 'Unsupported Hedera network. Use hedera:mainnet or hedera:testnet (legacy \"mainnet\"/\"testnet\" also accepted).',\n );\n }\n return {\n canonical: mapping.canonical,\n kind: 'hedera',\n hederaNetwork: mapping.hederaNetwork,\n };\n};\n\nexport const canonicalizeLedgerNetwork = (\n network: string,\n): CanonicalLedgerNetwork => {\n if (typeof network !== 'string' || network.trim().length === 0) {\n throw new Error('Ledger network is required.');\n }\n const trimmed = normalise(network);\n if (\n trimmed.startsWith('hedera:') ||\n trimmed.includes('hedera-') ||\n trimmed.includes('hedera_') ||\n trimmed === 'mainnet' ||\n trimmed === 'testnet'\n ) {\n return normaliseHederaNetwork(trimmed);\n }\n return normaliseEvmNetwork(trimmed);\n};\n"],"names":[],"mappings":"AAWA,MAAM,YAAY,CAAC,UAA0B,MAAM,KAAA,EAAO,YAAA;AAE1D,MAAM,6CAA6B,IAGjC;AAAA,EACA,CAAC,kBAAkB,EAAE,WAAW,kBAAkB,eAAe,WAAW;AAAA,EAC5E,CAAC,WAAW,EAAE,WAAW,kBAAkB,eAAe,WAAW;AAAA,EACrE,CAAC,kBAAkB,EAAE,WAAW,kBAAkB,eAAe,WAAW;AAAA,EAC5E,CAAC,kBAAkB,EAAE,WAAW,kBAAkB,eAAe,WAAW;AAAA,EAC5E,CAAC,kBAAkB,EAAE,WAAW,kBAAkB,eAAe,WAAW;AAAA,EAC5E,CAAC,WAAW,EAAE,WAAW,kBAAkB,eAAe,WAAW;AAAA,EACrE,CAAC,kBAAkB,EAAE,WAAW,kBAAkB,eAAe,WAAW;AAAA,EAC5E,CAAC,kBAAkB,EAAE,WAAW,kBAAkB,eAAe,WAAW;AAC9E,CAAC;AAED,MAAM,wBAAgD;AAAA,EACpD,UAAU;AAAA,EACV,oBAAoB;AAAA,EACpB,MAAM;AAAA,EACN,gBAAgB;AAAA,EAChB,WAAW;AAAA,EACX,kBAAkB;AAAA,EAClB,OAAO;AAAA,EACP,KAAK;AAAA,EACL,eAAe;AAAA,EACf,SAAS;AAAA,EACT,gBAAgB;AAAA,EAChB,MAAM;AACR;AAEA,MAAM,oBAAoB,IAAI;AAAA,EAC5B,OAAO,QAAQ,qBAAqB,EAAE,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,KAAK,CAAC;AACxE;AAEA,MAAM,eAAe,CAAC,UAAsC;AAC1D,MAAI,gBAAgB,KAAK,KAAK,GAAG;AAC/B,WAAO,OAAO,SAAS,MAAM,MAAM,GAAG,EAAE,CAAC,GAAI,EAAE;AAAA,EACjD;AACA,MAAI,QAAQ,KAAK,KAAK,GAAG;AACvB,WAAO,OAAO,SAAS,OAAO,EAAE;AAAA,EAClC;AACA,SAAO;AACT;AAEA,MAAM,sBAAsB,CAAC,UAA0C;AACrE,QAAM,UAAU,UAAU,KAAK;AAC/B,MAAI,UAAU,aAAa,OAAO;AAClC,MAAI;AAEJ,MAAI,YAAY,QAAW;AACzB,UAAM,SAAS,sBAAsB,OAAO;AAC5C,QAAI,WAAW,QAAW;AACxB,gBAAU;AACV,cAAQ;AAAA,IACV;AAAA,EACF,WAAW,kBAAkB,IAAI,OAAO,GAAG;AACzC,YAAQ,kBAAkB,IAAI,OAAO;AAAA,EACvC;AAEA,MAAI,YAAY,QAAW;AACzB,UAAM,IAAI;AAAA,MACR;AAAA,IAAA;AAAA,EAEJ;AAEA,SAAO;AAAA,IACL,WAAW,UAAU,OAAO;AAAA,IAC5B,MAAM;AAAA,IACN;AAAA,IACA,YAAY;AAAA,EAAA;AAEhB;AAEA,MAAM,yBAAyB,CAAC,UAA0C;AACxE,QAAM,UAAU,UAAU,KAAK;AAC/B,QAAM,UAAU,uBAAuB,IAAI,OAAO;AAClD,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI;AAAA,MACR;AAAA,IAAA;AAAA,EAEJ;AACA,SAAO;AAAA,IACL,WAAW,QAAQ;AAAA,IACnB,MAAM;AAAA,IACN,eAAe,QAAQ;AAAA,EAAA;AAE3B;AAEO,MAAM,4BAA4B,CACvC,YAC2B;AAC3B,MAAI,OAAO,YAAY,YAAY,QAAQ,KAAA,EAAO,WAAW,GAAG;AAC9D,UAAM,IAAI,MAAM,6BAA6B;AAAA,EAC/C;AACA,QAAM,UAAU,UAAU,OAAO;AACjC,MACE,QAAQ,WAAW,SAAS,KAC5B,QAAQ,SAAS,SAAS,KAC1B,QAAQ,SAAS,SAAS,KAC1B,YAAY,aACZ,YAAY,WACZ;AACA,WAAO,uBAAuB,OAAO;AAAA,EACvC;AACA,SAAO,oBAAoB,OAAO;AACpC;"}
|