@artblocks/abx-cli 0.1.0-alpha.9 → 0.2.0
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/CHANGELOG.md +429 -0
- package/assets/renderer-scaffold/README.md +44 -13
- package/assets/renderer-scaffold/foundry.toml +5 -0
- package/assets/renderer-scaffold/remappings.txt +1 -1
- package/assets/renderer-scaffold/script/DeployHooks.s.sol +24 -0
- package/assets/renderer-scaffold/script/Preview.s.sol +99 -0
- package/assets/renderer-scaffold/src/MyHooks.sol +20 -0
- package/assets/renderer-scaffold/src/MyRenderer.sol +4 -4
- package/assets/renderer-scaffold/src/MyTraits.sol +2 -2
- package/assets/renderer-scaffold/test/MyRenderer.t.sol +60 -3
- package/dist/bin.d.ts +26 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +63 -0
- package/dist/bin.js.map +1 -0
- package/dist/capabilities.d.ts +132 -0
- package/dist/capabilities.d.ts.map +1 -0
- package/dist/capabilities.js +175 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/commands/auth.d.ts +54 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +483 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/contract.d.ts +19 -0
- package/dist/commands/contract.d.ts.map +1 -0
- package/dist/commands/contract.js +171 -0
- package/dist/commands/contract.js.map +1 -0
- package/dist/commands/deploy.d.ts +296 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +5756 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/feedback.d.ts +7 -0
- package/dist/commands/feedback.d.ts.map +1 -0
- package/dist/commands/feedback.js +154 -0
- package/dist/commands/feedback.js.map +1 -0
- package/dist/commands/maintenance.d.ts +4 -0
- package/dist/commands/maintenance.d.ts.map +1 -0
- package/dist/commands/maintenance.js +114 -0
- package/dist/commands/maintenance.js.map +1 -0
- package/dist/commands/project.d.ts +458 -0
- package/dist/commands/project.d.ts.map +1 -0
- package/dist/commands/project.js +1837 -0
- package/dist/commands/project.js.map +1 -0
- package/dist/commands/reads.d.ts +85 -0
- package/dist/commands/reads.d.ts.map +1 -0
- package/dist/commands/reads.js +881 -0
- package/dist/commands/reads.js.map +1 -0
- package/dist/commands/scaffold.d.ts +89 -0
- package/dist/commands/scaffold.d.ts.map +1 -0
- package/dist/commands/scaffold.js +741 -0
- package/dist/commands/scaffold.js.map +1 -0
- package/dist/commands/service.d.ts +67 -0
- package/dist/commands/service.d.ts.map +1 -0
- package/dist/commands/service.js +761 -0
- package/dist/commands/service.js.map +1 -0
- package/dist/commands/storage.d.ts +51 -0
- package/dist/commands/storage.d.ts.map +1 -0
- package/dist/commands/storage.js +399 -0
- package/dist/commands/storage.js.map +1 -0
- package/dist/commands/submit-app.d.ts +102 -0
- package/dist/commands/submit-app.d.ts.map +1 -0
- package/dist/commands/submit-app.js +638 -0
- package/dist/commands/submit-app.js.map +1 -0
- package/dist/config.d.ts +94 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +332 -12
- package/dist/config.js.map +1 -1
- package/dist/conformance.d.ts +31 -0
- package/dist/conformance.d.ts.map +1 -0
- package/dist/conformance.js +400 -0
- package/dist/conformance.js.map +1 -0
- package/dist/contract-read-error.d.ts +5 -0
- package/dist/contract-read-error.d.ts.map +1 -0
- package/dist/contract-read-error.js +37 -0
- package/dist/contract-read-error.js.map +1 -0
- package/dist/creator-agent.d.ts +49 -0
- package/dist/creator-agent.d.ts.map +1 -0
- package/dist/creator-agent.js +363 -0
- package/dist/creator-agent.js.map +1 -0
- package/dist/creator-keyring.d.ts +26 -0
- package/dist/creator-keyring.d.ts.map +1 -0
- package/dist/creator-keyring.js +57 -0
- package/dist/creator-keyring.js.map +1 -0
- package/dist/creator-signer.d.ts +52 -0
- package/dist/creator-signer.d.ts.map +1 -0
- package/dist/creator-signer.js +267 -0
- package/dist/creator-signer.js.map +1 -0
- package/dist/deploy-plan.d.ts +218 -0
- package/dist/deploy-plan.d.ts.map +1 -0
- package/dist/deploy-plan.js +20 -0
- package/dist/deploy-plan.js.map +1 -0
- package/dist/deps.d.ts +6 -39
- package/dist/deps.d.ts.map +1 -1
- package/dist/deps.js +4 -68
- package/dist/deps.js.map +1 -1
- package/dist/errors.d.ts +22 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +32 -0
- package/dist/errors.js.map +1 -0
- package/dist/flag-allowlists.d.ts +53 -0
- package/dist/flag-allowlists.d.ts.map +1 -0
- package/dist/flag-allowlists.js +188 -0
- package/dist/flag-allowlists.js.map +1 -0
- package/dist/flags.d.ts +53 -0
- package/dist/flags.d.ts.map +1 -1
- package/dist/flags.js +151 -1
- package/dist/flags.js.map +1 -1
- package/dist/jsonout.d.ts +37 -0
- package/dist/jsonout.d.ts.map +1 -0
- package/dist/jsonout.js +79 -0
- package/dist/jsonout.js.map +1 -0
- package/dist/kind.d.ts +57 -0
- package/dist/kind.d.ts.map +1 -0
- package/dist/kind.js +122 -0
- package/dist/kind.js.map +1 -0
- package/dist/main.js +859 -5374
- package/dist/main.js.map +1 -1
- package/dist/mintpage.d.ts +17 -2
- package/dist/mintpage.d.ts.map +1 -1
- package/dist/mintpage.js +241 -54
- package/dist/mintpage.js.map +1 -1
- package/dist/output.d.ts +184 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +774 -0
- package/dist/output.js.map +1 -0
- package/dist/ownerops.d.ts +463 -59
- package/dist/ownerops.d.ts.map +1 -1
- package/dist/ownerops.js +2329 -366
- package/dist/ownerops.js.map +1 -1
- package/dist/preview.d.ts +23 -5
- package/dist/preview.d.ts.map +1 -1
- package/dist/preview.js +95 -43
- package/dist/preview.js.map +1 -1
- package/dist/provision.d.ts +3 -13
- package/dist/provision.d.ts.map +1 -1
- package/dist/provision.js +19 -21
- package/dist/provision.js.map +1 -1
- package/dist/remote.d.ts +116 -9
- package/dist/remote.d.ts.map +1 -1
- package/dist/remote.js +371 -14
- package/dist/remote.js.map +1 -1
- package/dist/riskgate.d.ts +101 -0
- package/dist/riskgate.d.ts.map +1 -0
- package/dist/riskgate.js +343 -0
- package/dist/riskgate.js.map +1 -0
- package/dist/scaffold.d.ts +12 -0
- package/dist/scaffold.d.ts.map +1 -0
- package/dist/scaffold.js +56 -0
- package/dist/scaffold.js.map +1 -0
- package/dist/schema.d.ts +36 -1
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +121 -26
- package/dist/schema.js.map +1 -1
- package/dist/script-chunks.d.ts +8 -0
- package/dist/script-chunks.d.ts.map +1 -0
- package/dist/script-chunks.js +35 -0
- package/dist/script-chunks.js.map +1 -0
- package/dist/served.d.ts +30 -0
- package/dist/served.d.ts.map +1 -0
- package/dist/served.js +112 -0
- package/dist/served.js.map +1 -0
- package/dist/signer.d.ts +20 -1
- package/dist/signer.d.ts.map +1 -1
- package/dist/signer.js +110 -18
- package/dist/signer.js.map +1 -1
- package/dist/update-check.d.ts +60 -9
- package/dist/update-check.d.ts.map +1 -1
- package/dist/update-check.js +105 -18
- package/dist/update-check.js.map +1 -1
- package/package.json +17 -12
- package/skill/SKILL.md +213 -354
- package/skill/agents/openai.yaml +4 -0
- package/skill/reference/capabilities.md +195 -0
- package/skill/reference/code.md +236 -0
- package/skill/reference/creator-token.md +94 -0
- package/skill/reference/deploy.md +191 -0
- package/skill/reference/diagnose.md +178 -0
- package/skill/reference/hosting.md +191 -102
- package/skill/reference/operate.md +237 -0
- package/skill/reference/services.md +173 -0
- package/skill/reference/setup.md +221 -42
- package/assets/renderer-scaffold/src/interfaces/IAbxFieldRenderer.sol +0 -32
- package/assets/renderer-scaffold/src/interfaces/IAbxParams.sol +0 -26
- package/dist/inspect.d.ts +0 -48
- package/dist/inspect.d.ts.map +0 -1
- package/dist/inspect.js +0 -184
- package/dist/inspect.js.map +0 -1
- package/dist/migrate.d.ts +0 -65
- package/dist/migrate.d.ts.map +0 -1
- package/dist/migrate.js +0 -180
- package/dist/migrate.js.map +0 -1
- package/dist/onchain-uri.d.ts +0 -97
- package/dist/onchain-uri.d.ts.map +0 -1
- package/dist/onchain-uri.js +0 -243
- package/dist/onchain-uri.js.map +0 -1
- package/dist/upload.d.ts +0 -28
- package/dist/upload.d.ts.map +0 -1
- package/dist/upload.js +0 -41
- package/dist/upload.js.map +0 -1
- package/skill/reference/code-projects.md +0 -246
- package/skill/reference/operating.md +0 -118
- package/skill/reference/troubleshooting.md +0 -28
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
import { Chacha20Poly1305 } from '@hpke/chacha20poly1305';
|
|
2
|
+
import { CipherSuite, DhkemP256HkdfSha256, HkdfSha256 } from '@hpke/core';
|
|
3
|
+
import { generateAuthorizationSignature } from '@privy-io/node';
|
|
4
|
+
const OAUTH = 'https://auth.privy.io/api/oauth/v2';
|
|
5
|
+
const WALLET_API = 'https://api.privy.io/v1/wallets';
|
|
6
|
+
const DEVICE_GRANT = 'urn:ietf:params:oauth:grant-type:device_code';
|
|
7
|
+
const PROVIDER_ERRORS = new Set([
|
|
8
|
+
'access_denied',
|
|
9
|
+
'authorization_pending',
|
|
10
|
+
'device_auth_not_enabled',
|
|
11
|
+
'expired_token',
|
|
12
|
+
'invalid_grant',
|
|
13
|
+
'slow_down',
|
|
14
|
+
]);
|
|
15
|
+
export class CreatorAuthorizationError extends Error {
|
|
16
|
+
code;
|
|
17
|
+
constructor(code) {
|
|
18
|
+
super(`Creator wallet authorization: ${code}`);
|
|
19
|
+
this.code = code;
|
|
20
|
+
this.name = 'CreatorAuthorizationError';
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function object(value) {
|
|
24
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
25
|
+
throw new CreatorAuthorizationError('invalid_response');
|
|
26
|
+
return value;
|
|
27
|
+
}
|
|
28
|
+
function string(value) {
|
|
29
|
+
if (typeof value !== 'string' || !value || value.length > 16_384)
|
|
30
|
+
throw new CreatorAuthorizationError('invalid_response');
|
|
31
|
+
return value;
|
|
32
|
+
}
|
|
33
|
+
function verificationUrl(value) {
|
|
34
|
+
const raw = string(value);
|
|
35
|
+
let parsed;
|
|
36
|
+
try {
|
|
37
|
+
parsed = new URL(raw);
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
throw new CreatorAuthorizationError('invalid_verification_url');
|
|
41
|
+
}
|
|
42
|
+
const local = parsed.hostname === 'localhost' || parsed.hostname === '127.0.0.1' || parsed.hostname === '[::1]';
|
|
43
|
+
if (parsed.username || parsed.password || (parsed.protocol !== 'https:' && !(local && parsed.protocol === 'http:'))) {
|
|
44
|
+
throw new CreatorAuthorizationError('invalid_verification_url');
|
|
45
|
+
}
|
|
46
|
+
return parsed.toString();
|
|
47
|
+
}
|
|
48
|
+
function seconds(value) {
|
|
49
|
+
if (typeof value !== 'number' || !Number.isFinite(value) || value <= 0 || value > 86_400) {
|
|
50
|
+
throw new CreatorAuthorizationError('invalid_response');
|
|
51
|
+
}
|
|
52
|
+
return value * 1_000;
|
|
53
|
+
}
|
|
54
|
+
function base64(value) {
|
|
55
|
+
const encoded = string(value);
|
|
56
|
+
if (!/^[A-Za-z0-9+/]+={0,2}$/.test(encoded))
|
|
57
|
+
throw new CreatorAuthorizationError('invalid_response');
|
|
58
|
+
return new Uint8Array(Buffer.from(encoded, 'base64'));
|
|
59
|
+
}
|
|
60
|
+
/** Privy device grant client. Refresh credentials may be retained in a native OS credential store;
|
|
61
|
+
* decrypted request-signing keys remain memory-only and die with this instance. */
|
|
62
|
+
export class CreatorAgentAuthorization {
|
|
63
|
+
#appId;
|
|
64
|
+
#fetch;
|
|
65
|
+
#now;
|
|
66
|
+
#store;
|
|
67
|
+
#onPersistenceError;
|
|
68
|
+
#device;
|
|
69
|
+
#tokens;
|
|
70
|
+
#authorizationKey;
|
|
71
|
+
#keyExpiresAt = 0;
|
|
72
|
+
#wallets = [];
|
|
73
|
+
#persist = false;
|
|
74
|
+
#refreshing;
|
|
75
|
+
#authenticating;
|
|
76
|
+
constructor(options) {
|
|
77
|
+
if (!/^[A-Za-z0-9_-]{1,200}$/.test(options.appId))
|
|
78
|
+
throw new CreatorAuthorizationError('invalid_app_id');
|
|
79
|
+
this.#appId = options.appId;
|
|
80
|
+
this.#fetch = options.fetchImpl ?? fetch;
|
|
81
|
+
this.#now = options.now ?? Date.now;
|
|
82
|
+
this.#store = options.store;
|
|
83
|
+
this.#onPersistenceError = options.onPersistenceError;
|
|
84
|
+
}
|
|
85
|
+
async #request(path, body, token) {
|
|
86
|
+
try {
|
|
87
|
+
const response = await this.#fetch(`${OAUTH}/${path}`, {
|
|
88
|
+
method: 'POST',
|
|
89
|
+
redirect: 'error',
|
|
90
|
+
signal: AbortSignal.timeout(15_000),
|
|
91
|
+
headers: {
|
|
92
|
+
'content-type': 'application/json',
|
|
93
|
+
'privy-app-id': this.#appId,
|
|
94
|
+
...(token ? { authorization: `Bearer ${token}`, 'privy-grant-type': 'device_code' } : {}),
|
|
95
|
+
},
|
|
96
|
+
body: JSON.stringify(body),
|
|
97
|
+
});
|
|
98
|
+
const text = await response.text();
|
|
99
|
+
if (text.length > 65_536)
|
|
100
|
+
throw new CreatorAuthorizationError('invalid_response');
|
|
101
|
+
return { response, data: object(JSON.parse(text)) };
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
if (error instanceof CreatorAuthorizationError)
|
|
105
|
+
throw error;
|
|
106
|
+
throw new CreatorAuthorizationError('request_failed');
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
#providerError(response, data) {
|
|
110
|
+
if (data.error === 'Device authorization is not enabled for this app') {
|
|
111
|
+
return new CreatorAuthorizationError('device_auth_not_enabled');
|
|
112
|
+
}
|
|
113
|
+
const code = typeof data.error === 'string' && PROVIDER_ERRORS.has(data.error) ? data.error : 'provider_error';
|
|
114
|
+
return new CreatorAuthorizationError(code);
|
|
115
|
+
}
|
|
116
|
+
#parseTokens(data, startedAt) {
|
|
117
|
+
if (data.token_type !== 'Bearer')
|
|
118
|
+
throw new CreatorAuthorizationError('invalid_response');
|
|
119
|
+
return {
|
|
120
|
+
accessToken: string(data.access_token),
|
|
121
|
+
refreshToken: string(data.refresh_token),
|
|
122
|
+
expiresAt: startedAt + seconds(data.expires_in),
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
async start() {
|
|
126
|
+
if (this.#device)
|
|
127
|
+
throw new CreatorAuthorizationError('already_started');
|
|
128
|
+
const { response, data } = await this.#request('device_authorization', {});
|
|
129
|
+
if (!response.ok)
|
|
130
|
+
throw this.#providerError(response, data);
|
|
131
|
+
const expiresAt = this.#now() + seconds(data.expires_in);
|
|
132
|
+
this.#device = {
|
|
133
|
+
code: string(data.device_code),
|
|
134
|
+
expiresAt,
|
|
135
|
+
interval: data.interval === undefined ? 5_000 : seconds(data.interval),
|
|
136
|
+
};
|
|
137
|
+
return {
|
|
138
|
+
userCode: string(data.user_code),
|
|
139
|
+
verificationUri: verificationUrl(data.verification_uri),
|
|
140
|
+
...(data.verification_uri_complete ? { verificationUriComplete: verificationUrl(data.verification_uri_complete) } : {}),
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
async wait() {
|
|
144
|
+
const device = this.#device;
|
|
145
|
+
if (!device)
|
|
146
|
+
throw new CreatorAuthorizationError('not_started');
|
|
147
|
+
for (;;) {
|
|
148
|
+
const remaining = device.expiresAt - this.#now();
|
|
149
|
+
if (remaining <= 0)
|
|
150
|
+
throw new CreatorAuthorizationError('expired_token');
|
|
151
|
+
await new Promise((resolve) => setTimeout(resolve, Math.min(device.interval, remaining)));
|
|
152
|
+
const startedAt = this.#now();
|
|
153
|
+
const { response, data } = await this.#request('token', { grant_type: DEVICE_GRANT, device_code: device.code });
|
|
154
|
+
if (response.ok) {
|
|
155
|
+
this.#tokens = this.#parseTokens(data, startedAt);
|
|
156
|
+
await this.#authenticate();
|
|
157
|
+
this.#device = undefined;
|
|
158
|
+
return this.#wallets.map((wallet) => ({ ...wallet }));
|
|
159
|
+
}
|
|
160
|
+
const error = this.#providerError(response, data);
|
|
161
|
+
if (response.status === 400 && (error.code === 'authorization_pending' || error.code === 'slow_down')) {
|
|
162
|
+
if (error.code === 'slow_down')
|
|
163
|
+
device.interval += 5_000;
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
throw error;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
/** Resume a prior Privy grant. Returns null when no usable credential remains. */
|
|
170
|
+
async restore() {
|
|
171
|
+
if (!this.#store)
|
|
172
|
+
return null;
|
|
173
|
+
const stored = await this.#store.load();
|
|
174
|
+
if (!stored)
|
|
175
|
+
return null;
|
|
176
|
+
this.#tokens = stored;
|
|
177
|
+
this.#persist = true;
|
|
178
|
+
try {
|
|
179
|
+
await this.#authenticate();
|
|
180
|
+
return this.#wallets.map((wallet) => ({ ...wallet }));
|
|
181
|
+
}
|
|
182
|
+
catch (error) {
|
|
183
|
+
if (error instanceof CreatorAuthorizationError &&
|
|
184
|
+
['access_denied', 'expired_token', 'invalid_grant', 'login_required'].includes(error.code)) {
|
|
185
|
+
await this.#clearStored();
|
|
186
|
+
return null;
|
|
187
|
+
}
|
|
188
|
+
throw error;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
/** Persist a newly approved grant after the caller verifies that Privy returned the expected wallet. */
|
|
192
|
+
async remember() {
|
|
193
|
+
if (!this.#store || !this.#tokens)
|
|
194
|
+
return;
|
|
195
|
+
await this.#store.save(this.#tokens);
|
|
196
|
+
this.#persist = true;
|
|
197
|
+
}
|
|
198
|
+
async #saveRotatedTokens() {
|
|
199
|
+
if (!this.#persist || !this.#store || !this.#tokens)
|
|
200
|
+
return;
|
|
201
|
+
try {
|
|
202
|
+
await this.#store.save(this.#tokens);
|
|
203
|
+
}
|
|
204
|
+
catch {
|
|
205
|
+
this.#persist = false;
|
|
206
|
+
this.#onPersistenceError?.();
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
async #clearStored() {
|
|
210
|
+
this.#tokens = undefined;
|
|
211
|
+
this.#authorizationKey = undefined;
|
|
212
|
+
this.#keyExpiresAt = 0;
|
|
213
|
+
this.#wallets = [];
|
|
214
|
+
this.#persist = false;
|
|
215
|
+
if (!this.#store)
|
|
216
|
+
return;
|
|
217
|
+
try {
|
|
218
|
+
await this.#store.clear();
|
|
219
|
+
}
|
|
220
|
+
catch {
|
|
221
|
+
this.#onPersistenceError?.();
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
async #refresh() {
|
|
225
|
+
if (this.#refreshing)
|
|
226
|
+
return this.#refreshing;
|
|
227
|
+
if (!this.#tokens)
|
|
228
|
+
throw new CreatorAuthorizationError('login_required');
|
|
229
|
+
const previous = this.#tokens;
|
|
230
|
+
const refreshToken = this.#tokens.refreshToken;
|
|
231
|
+
this.#refreshing = (async () => {
|
|
232
|
+
this.#tokens = undefined;
|
|
233
|
+
this.#authorizationKey = undefined;
|
|
234
|
+
this.#keyExpiresAt = 0;
|
|
235
|
+
this.#wallets = [];
|
|
236
|
+
const startedAt = this.#now();
|
|
237
|
+
try {
|
|
238
|
+
const { response, data } = await this.#request('token', { grant_type: 'refresh_token', refresh_token: refreshToken });
|
|
239
|
+
if (!response.ok)
|
|
240
|
+
throw this.#providerError(response, data);
|
|
241
|
+
this.#tokens = this.#parseTokens(data, startedAt);
|
|
242
|
+
await this.#saveRotatedTokens();
|
|
243
|
+
}
|
|
244
|
+
catch (error) {
|
|
245
|
+
if (error instanceof CreatorAuthorizationError &&
|
|
246
|
+
['access_denied', 'expired_token', 'invalid_grant'].includes(error.code)) {
|
|
247
|
+
await this.#clearStored();
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
// Preserve the last durable grant after a transient failure. If Privy accepted an
|
|
251
|
+
// ambiguous refresh, the next attempt will return a definitive invalid-grant response.
|
|
252
|
+
this.#tokens = previous;
|
|
253
|
+
}
|
|
254
|
+
throw error;
|
|
255
|
+
}
|
|
256
|
+
})().finally(() => {
|
|
257
|
+
this.#refreshing = undefined;
|
|
258
|
+
});
|
|
259
|
+
return this.#refreshing;
|
|
260
|
+
}
|
|
261
|
+
async #accessToken() {
|
|
262
|
+
if (this.#refreshing)
|
|
263
|
+
await this.#refreshing;
|
|
264
|
+
if (!this.#tokens)
|
|
265
|
+
throw new CreatorAuthorizationError('login_required');
|
|
266
|
+
if (this.#tokens.expiresAt <= this.#now() + 30_000)
|
|
267
|
+
await this.#refresh();
|
|
268
|
+
if (!this.#tokens || this.#tokens.expiresAt <= this.#now())
|
|
269
|
+
throw new CreatorAuthorizationError('login_required');
|
|
270
|
+
return this.#tokens.accessToken;
|
|
271
|
+
}
|
|
272
|
+
async #authenticate() {
|
|
273
|
+
if (this.#authenticating)
|
|
274
|
+
return this.#authenticating;
|
|
275
|
+
if (this.#authorizationKey && this.#keyExpiresAt > this.#now() + 5_000)
|
|
276
|
+
return;
|
|
277
|
+
this.#authenticating = this.#exchangeKey().finally(() => {
|
|
278
|
+
this.#authenticating = undefined;
|
|
279
|
+
});
|
|
280
|
+
return this.#authenticating;
|
|
281
|
+
}
|
|
282
|
+
async #exchangeKey() {
|
|
283
|
+
try {
|
|
284
|
+
const suite = new CipherSuite({ kem: new DhkemP256HkdfSha256(), kdf: new HkdfSha256(), aead: new Chacha20Poly1305() });
|
|
285
|
+
const pair = await suite.kem.generateKeyPair();
|
|
286
|
+
const publicKey = await globalThis.crypto.subtle.exportKey('spki', pair.publicKey);
|
|
287
|
+
const body = { encryption_type: 'HPKE', recipient_public_key: Buffer.from(publicKey).toString('base64') };
|
|
288
|
+
let result = await this.#request('wallets/authenticate', body, await this.#accessToken());
|
|
289
|
+
if (result.response.status === 401) {
|
|
290
|
+
await this.#refresh();
|
|
291
|
+
result = await this.#request('wallets/authenticate', body, await this.#accessToken());
|
|
292
|
+
}
|
|
293
|
+
if (!result.response.ok)
|
|
294
|
+
throw this.#providerError(result.response, result.data);
|
|
295
|
+
const encrypted = object(result.data.encrypted_authorization_key);
|
|
296
|
+
const expiresAt = typeof result.data.expires_at === 'number' ? result.data.expires_at : Date.parse(string(result.data.expires_at));
|
|
297
|
+
if (!Number.isFinite(expiresAt) || expiresAt <= this.#now() + 5_000) {
|
|
298
|
+
throw new CreatorAuthorizationError('expired_signing_key');
|
|
299
|
+
}
|
|
300
|
+
if (!Array.isArray(result.data.wallets))
|
|
301
|
+
throw new CreatorAuthorizationError('invalid_response');
|
|
302
|
+
const wallets = result.data.wallets.map((value) => {
|
|
303
|
+
const wallet = object(value);
|
|
304
|
+
return { id: string(wallet.id), address: string(wallet.address), chainType: string(wallet.chain_type) };
|
|
305
|
+
});
|
|
306
|
+
const recipient = await suite.createRecipientContext({ recipientKey: pair.privateKey, enc: base64(encrypted.encapsulated_key) });
|
|
307
|
+
const bytes = new Uint8Array(await recipient.open(base64(encrypted.ciphertext)));
|
|
308
|
+
try {
|
|
309
|
+
this.#authorizationKey = new TextDecoder('utf-8', { fatal: true }).decode(bytes);
|
|
310
|
+
this.#keyExpiresAt = expiresAt;
|
|
311
|
+
this.#wallets = wallets;
|
|
312
|
+
}
|
|
313
|
+
finally {
|
|
314
|
+
bytes.fill(0);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
catch (error) {
|
|
318
|
+
this.#authorizationKey = undefined;
|
|
319
|
+
this.#keyExpiresAt = 0;
|
|
320
|
+
this.#wallets = [];
|
|
321
|
+
if (error instanceof CreatorAuthorizationError)
|
|
322
|
+
throw error;
|
|
323
|
+
throw new CreatorAuthorizationError('key_exchange_failed');
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
async sign(input) {
|
|
327
|
+
if (!/^[A-Za-z0-9_-]{1,200}$/.test(input.walletId) || !/^[A-Za-z0-9_-]{1,200}$/.test(input.idempotencyKey)) {
|
|
328
|
+
throw new CreatorAuthorizationError('invalid_request');
|
|
329
|
+
}
|
|
330
|
+
if (input.body.method !== 'eth_sendTransaction')
|
|
331
|
+
throw new CreatorAuthorizationError('unsupported_method');
|
|
332
|
+
await this.#authenticate();
|
|
333
|
+
if (!this.#authorizationKey || this.#keyExpiresAt <= this.#now()) {
|
|
334
|
+
throw new CreatorAuthorizationError('authorization_expired');
|
|
335
|
+
}
|
|
336
|
+
if (!this.#wallets.some((wallet) => wallet.id === input.walletId && wallet.chainType === 'ethereum')) {
|
|
337
|
+
throw new CreatorAuthorizationError('wallet_not_authorized');
|
|
338
|
+
}
|
|
339
|
+
const expiry = Number(input.requestExpiry);
|
|
340
|
+
if (!Number.isSafeInteger(expiry) || expiry <= this.#now() || expiry > this.#now() + 60_000 || expiry > this.#keyExpiresAt) {
|
|
341
|
+
throw new CreatorAuthorizationError('invalid_request_expiry');
|
|
342
|
+
}
|
|
343
|
+
const url = `${WALLET_API}/${encodeURIComponent(input.walletId)}/rpc`;
|
|
344
|
+
const headers = {
|
|
345
|
+
'privy-app-id': this.#appId,
|
|
346
|
+
'privy-idempotency-key': input.idempotencyKey,
|
|
347
|
+
'privy-request-expiry': input.requestExpiry,
|
|
348
|
+
};
|
|
349
|
+
const signature = generateAuthorizationSignature({
|
|
350
|
+
authorizationPrivateKey: this.#authorizationKey,
|
|
351
|
+
input: { version: 1, method: 'POST', url, body: input.body, headers },
|
|
352
|
+
});
|
|
353
|
+
return { url, headers: { ...headers, 'privy-authorization-signature': signature } };
|
|
354
|
+
}
|
|
355
|
+
dispose() {
|
|
356
|
+
this.#device = undefined;
|
|
357
|
+
this.#tokens = undefined;
|
|
358
|
+
this.#authorizationKey = undefined;
|
|
359
|
+
this.#keyExpiresAt = 0;
|
|
360
|
+
this.#wallets = [];
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
//# sourceMappingURL=creator-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"creator-agent.js","sourceRoot":"","sources":["../src/creator-agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export interface StoredCreatorAuthorization {
|
|
2
|
+
accessToken: string;
|
|
3
|
+
refreshToken: string;
|
|
4
|
+
expiresAt: number;
|
|
5
|
+
}
|
|
6
|
+
export interface CreatorAuthorizationStore {
|
|
7
|
+
load(): Promise<StoredCreatorAuthorization | null>;
|
|
8
|
+
save(tokens: StoredCreatorAuthorization): Promise<void>;
|
|
9
|
+
clear(): Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
interface KeyringEntry {
|
|
12
|
+
getPassword(signal?: AbortSignal): Promise<string | undefined>;
|
|
13
|
+
setPassword(value: string, signal?: AbortSignal): Promise<void>;
|
|
14
|
+
deleteCredential(signal?: AbortSignal): Promise<boolean>;
|
|
15
|
+
}
|
|
16
|
+
/** Native per-user credential storage: Keychain on macOS, Credential Manager on Windows, and
|
|
17
|
+
* Secret Service/keyutils on Linux. The refresh credential is never written to project files. */
|
|
18
|
+
export declare class CreatorKeyringStore implements CreatorAuthorizationStore {
|
|
19
|
+
#private;
|
|
20
|
+
constructor(appId: string, walletAddress: string, entry?: KeyringEntry);
|
|
21
|
+
load(): Promise<StoredCreatorAuthorization | null>;
|
|
22
|
+
save(tokens: StoredCreatorAuthorization): Promise<void>;
|
|
23
|
+
clear(): Promise<void>;
|
|
24
|
+
}
|
|
25
|
+
export {};
|
|
26
|
+
//# sourceMappingURL=creator-keyring.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"creator-keyring.d.ts","sourceRoot":"","sources":["../src/creator-keyring.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,0BAA0B;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,yBAAyB;IACxC,IAAI,IAAI,OAAO,CAAC,0BAA0B,GAAG,IAAI,CAAC,CAAC;IACnD,IAAI,CAAC,MAAM,EAAE,0BAA0B,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,UAAU,YAAY;IACpB,WAAW,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAC/D,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,gBAAgB,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1D;AA6BD;iGACiG;AACjG,qBAAa,mBAAoB,YAAW,yBAAyB;;gBAGvD,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,YAAY;IAKhE,IAAI,IAAI,OAAO,CAAC,0BAA0B,GAAG,IAAI,CAAC;IAWlD,IAAI,CAAC,MAAM,EAAE,0BAA0B,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { AsyncEntry } from '@napi-rs/keyring';
|
|
3
|
+
const SERVICE = 'io.abx.cli.creator-wallet';
|
|
4
|
+
const timeout = () => AbortSignal.timeout(15_000);
|
|
5
|
+
function secret(value) {
|
|
6
|
+
if (typeof value !== 'string' || !value || value.length > 16_384)
|
|
7
|
+
throw new Error('invalid_creator_authorization');
|
|
8
|
+
return value;
|
|
9
|
+
}
|
|
10
|
+
function decode(raw) {
|
|
11
|
+
let value;
|
|
12
|
+
try {
|
|
13
|
+
value = JSON.parse(raw);
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
throw new Error('invalid_creator_authorization');
|
|
17
|
+
}
|
|
18
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
19
|
+
throw new Error('invalid_creator_authorization');
|
|
20
|
+
const row = value;
|
|
21
|
+
if (row.version !== 1 || !Number.isSafeInteger(row.expiresAt) || Number(row.expiresAt) <= 0) {
|
|
22
|
+
throw new Error('invalid_creator_authorization');
|
|
23
|
+
}
|
|
24
|
+
return {
|
|
25
|
+
accessToken: secret(row.accessToken),
|
|
26
|
+
refreshToken: secret(row.refreshToken),
|
|
27
|
+
expiresAt: Number(row.expiresAt),
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
/** Native per-user credential storage: Keychain on macOS, Credential Manager on Windows, and
|
|
31
|
+
* Secret Service/keyutils on Linux. The refresh credential is never written to project files. */
|
|
32
|
+
export class CreatorKeyringStore {
|
|
33
|
+
#entry;
|
|
34
|
+
constructor(appId, walletAddress, entry) {
|
|
35
|
+
const identity = createHash('sha256').update(`${appId}:${walletAddress.toLowerCase()}`).digest('hex');
|
|
36
|
+
this.#entry = entry ?? new AsyncEntry(SERVICE, identity);
|
|
37
|
+
}
|
|
38
|
+
async load() {
|
|
39
|
+
const raw = await this.#entry.getPassword(timeout());
|
|
40
|
+
if (raw === undefined)
|
|
41
|
+
return null;
|
|
42
|
+
try {
|
|
43
|
+
return decode(raw);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
await this.#entry.deleteCredential(timeout());
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
async save(tokens) {
|
|
51
|
+
await this.#entry.setPassword(JSON.stringify({ version: 1, ...tokens }), timeout());
|
|
52
|
+
}
|
|
53
|
+
async clear() {
|
|
54
|
+
await this.#entry.deleteCredential(timeout());
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=creator-keyring.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"creator-keyring.js","sourceRoot":"","sources":["../src/creator-keyring.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,aAAa,CAAC;AACvC,OAAO,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAoB5C,MAAM,OAAO,GAAG,2BAA2B,CAAC;AAC5C,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AAElD,SAAS,MAAM,CAAC,KAAc;IAC5B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACnH,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,MAAM,CAAC,GAAW;IACzB,IAAI,KAAc,CAAC;IACnB,IAAI,CAAC;QACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACnD,CAAC;IACD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAClH,MAAM,GAAG,GAAG,KAAgC,CAAC;IAC7C,IAAI,GAAG,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5F,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACnD,CAAC;IACD,OAAO;QACL,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC;QACpC,YAAY,EAAE,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC;QACtC,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC;KACjC,CAAC;AACJ,CAAC;AAED;iGACiG;AACjG,MAAM,OAAO,mBAAmB;IACrB,MAAM,CAAe;IAE9B,YAAY,KAAa,EAAE,aAAqB,EAAE,KAAoB;QACpE,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,KAAK,IAAI,aAAa,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACtG,IAAI,CAAC,MAAM,GAAG,KAAK,IAAI,IAAI,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC;QACrD,IAAI,GAAG,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QACnC,IAAI,CAAC;YACH,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC;YAC9C,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,MAAkC;QAC3C,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,EAAC,OAAO,EAAE,CAAC,EAAE,GAAG,MAAM,EAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;IACpF,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC;IAChD,CAAC;CACF"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { type Address, type Hex, type PreparedTx } from '@artblocks/abx-sdk';
|
|
2
|
+
import type { TransactionReceipt } from 'viem';
|
|
3
|
+
/** Preserve the exact RPC estimate across the JSON service boundary. This is a serialization
|
|
4
|
+
* guard, not a sponsorship-policy ceiling; real EVM transaction limits are many orders of
|
|
5
|
+
* magnitude below Number.MAX_SAFE_INTEGER. */
|
|
6
|
+
export declare function sponsoredGasLimit(gas: bigint): number;
|
|
7
|
+
/** Synchronous preflight for commands that may upload content before opening the signing lane. */
|
|
8
|
+
export declare function assertSponsorConfigured(chainKey: string): void;
|
|
9
|
+
/**
|
|
10
|
+
* Resolve the existing account-bound creator wallet for a sponsored preview without provisioning
|
|
11
|
+
* a wallet or opening an authorization grant. A dry run must use the signer that the real send
|
|
12
|
+
* will use; silently falling back to a local env key changes the CREATE2 salt, owner, royalty
|
|
13
|
+
* receiver, and mint recipient shown in the preview.
|
|
14
|
+
*/
|
|
15
|
+
export declare function sponsoredPreviewAddress(chainKey: string, options?: {
|
|
16
|
+
env?: NodeJS.ProcessEnv;
|
|
17
|
+
fetchImpl?: typeof fetch;
|
|
18
|
+
}): Promise<Address>;
|
|
19
|
+
/** Resolve the account-bound creator wallet for a transaction plan. Real sponsored sends may
|
|
20
|
+
* provision the stable wallet just as `openSponsoredSession` does; dry runs call the wrapper above
|
|
21
|
+
* and remain strictly read-only. */
|
|
22
|
+
export declare function sponsoredWalletAddress(chainKey: string, options?: {
|
|
23
|
+
env?: NodeJS.ProcessEnv;
|
|
24
|
+
fetchImpl?: typeof fetch;
|
|
25
|
+
provision?: boolean;
|
|
26
|
+
}): Promise<Address>;
|
|
27
|
+
export interface SponsoredReceipt {
|
|
28
|
+
txHash: Hex;
|
|
29
|
+
receipt: TransactionReceipt;
|
|
30
|
+
}
|
|
31
|
+
export interface SponsoredSession {
|
|
32
|
+
address: Address;
|
|
33
|
+
send(tx: PreparedTx): Promise<SponsoredReceipt>;
|
|
34
|
+
close(): void;
|
|
35
|
+
}
|
|
36
|
+
/** Pure boundary check shared by every sponsored operation. Privy's sponsored relay requires a
|
|
37
|
+
* call target, so custom-contract deployments must already be expressed as a call to the keyless
|
|
38
|
+
* CREATE2 proxy before they reach this boundary. */
|
|
39
|
+
export declare function assertSponsoredPreparedTx(tx: PreparedTx, chainId: number): asserts tx is PreparedTx & {
|
|
40
|
+
to: Address;
|
|
41
|
+
};
|
|
42
|
+
/** Resolve the first-party wallet API from its public remote catalog. The env override is an
|
|
43
|
+
* explicit local/staging escape hatch; production callers discover the interface from the
|
|
44
|
+
* services catalog and do not need to know a deployment hostname. */
|
|
45
|
+
export declare function creatorApiUrl(chainId: number, env?: NodeJS.ProcessEnv): Promise<string>;
|
|
46
|
+
/**
|
|
47
|
+
* Open a creator authorization session. Privy's rotating grant is retained in the user's native OS
|
|
48
|
+
* credential store and reused across CLI invocations. The decrypted request-signing key remains
|
|
49
|
+
* memory-only and every exact transaction is still prepared, signed, and reconciled independently.
|
|
50
|
+
*/
|
|
51
|
+
export declare function openSponsoredSession(chainKey: string): Promise<SponsoredSession>;
|
|
52
|
+
//# sourceMappingURL=creator-signer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"creator-signer.d.ts","sourceRoot":"","sources":["../src/creator-signer.ts"],"names":[],"mappings":"AAEA,OAAO,EAWL,KAAK,OAAO,EACZ,KAAK,GAAG,EACR,KAAK,UAAU,EAChB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,MAAM,CAAC;AAS7C;;8CAE8C;AAC9C,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAMrD;AAED,kGAAkG;AAClG,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAE9D;AAaD;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAA;CAAM,GAChE,OAAO,CAAC,OAAO,CAAC,CAElB;AAED;;oCAEoC;AACpC,wBAAsB,sBAAsB,CAC1C,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAAM,GACrF,OAAO,CAAC,OAAO,CAAC,CA2BlB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,GAAG,CAAC;IACZ,OAAO,EAAE,kBAAkB,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,EAAE,UAAU,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAChD,KAAK,IAAI,IAAI,CAAC;CACf;AAED;;oDAEoD;AACpD,wBAAgB,yBAAyB,CACvC,EAAE,EAAE,UAAU,EACd,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,EAAE,IAAI,UAAU,GAAG;IAAC,EAAE,EAAE,OAAO,CAAA;CAAC,CAY1C;AAmBD;;qEAEqE;AACrE,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAAC,MAAM,CAAC,CAW1G;AAmBD;;;;GAIG;AACH,wBAAsB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAmItF"}
|