@cartridge/controller 0.10.6 → 0.10.7
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/.turbo/turbo-build$colon$deps.log +16 -16
- package/.turbo/turbo-build.log +15 -15
- package/dist/index.js +322 -313
- package/dist/index.js.map +1 -1
- package/dist/node/index.cjs +1 -1
- package/dist/node/index.cjs.map +1 -1
- package/dist/node/index.d.cts +2 -1
- package/dist/node/index.d.ts +2 -1
- package/dist/node/index.js +1 -1
- package/dist/node/index.js.map +1 -1
- package/dist/{provider-BgBI_LQl.js → provider-CN6AecRF.js} +139 -109
- package/dist/provider-CN6AecRF.js.map +1 -0
- package/dist/session/provider.d.ts +3 -1
- package/dist/session.js +101 -91
- package/dist/session.js.map +1 -1
- package/dist/stats.html +1 -1
- package/dist/types.d.ts +6 -2
- package/dist/utils.d.ts +2 -1
- package/dist/wallets/types.d.ts +6 -1
- package/package.json +3 -3
- package/src/session/provider.ts +14 -1
- package/src/types.ts +24 -8
- package/src/utils.ts +11 -3
- package/src/wallets/ethereum-base.ts +6 -1
- package/src/wallets/types.ts +18 -7
- package/dist/provider-BgBI_LQl.js.map +0 -1
package/dist/session.js
CHANGED
|
@@ -1,39 +1,39 @@
|
|
|
1
|
-
import { WalletAccount as y, stark as
|
|
2
|
-
import { signerToGuid as
|
|
1
|
+
import { WalletAccount as y, stark as p, ec as m, encode as u } from "starknet";
|
|
2
|
+
import { signerToGuid as h, subscribeCreateSession as g } from "@cartridge/controller-wasm";
|
|
3
3
|
export * from "@cartridge/controller-wasm";
|
|
4
|
-
import { n as f, B as _, K as w, A as v,
|
|
5
|
-
import { F as
|
|
6
|
-
import { CartridgeSessionAccount as
|
|
7
|
-
class
|
|
4
|
+
import { n as f, B as _, K as w, A as v, c as I } from "./provider-CN6AecRF.js";
|
|
5
|
+
import { a as C, E as G, F as J, I as E, N as T, R as H, S as L } from "./provider-CN6AecRF.js";
|
|
6
|
+
import { CartridgeSessionAccount as K } from "@cartridge/controller-wasm/session";
|
|
7
|
+
class O extends y {
|
|
8
8
|
controller;
|
|
9
9
|
constructor(t, {
|
|
10
|
-
rpcUrl:
|
|
10
|
+
rpcUrl: r,
|
|
11
11
|
privateKey: e,
|
|
12
12
|
address: s,
|
|
13
|
-
ownerGuid:
|
|
14
|
-
chainId:
|
|
13
|
+
ownerGuid: i,
|
|
14
|
+
chainId: a,
|
|
15
15
|
expiresAt: n,
|
|
16
|
-
policies:
|
|
17
|
-
guardianKeyGuid:
|
|
18
|
-
metadataHash:
|
|
19
|
-
sessionKeyGuid:
|
|
16
|
+
policies: l,
|
|
17
|
+
guardianKeyGuid: o,
|
|
18
|
+
metadataHash: c,
|
|
19
|
+
sessionKeyGuid: d
|
|
20
20
|
}) {
|
|
21
21
|
super({
|
|
22
|
-
provider: { nodeUrl:
|
|
22
|
+
provider: { nodeUrl: r },
|
|
23
23
|
walletProvider: t,
|
|
24
24
|
address: s
|
|
25
|
-
}), this.controller =
|
|
26
|
-
|
|
25
|
+
}), this.controller = K.newAsRegistered(
|
|
26
|
+
r,
|
|
27
27
|
e,
|
|
28
28
|
s,
|
|
29
|
-
|
|
30
|
-
|
|
29
|
+
i,
|
|
30
|
+
a,
|
|
31
31
|
{
|
|
32
32
|
expiresAt: n,
|
|
33
|
-
policies:
|
|
34
|
-
guardianKeyGuid:
|
|
35
|
-
metadataHash:
|
|
36
|
-
sessionKeyGuid:
|
|
33
|
+
policies: l,
|
|
34
|
+
guardianKeyGuid: o,
|
|
35
|
+
metadataHash: c,
|
|
36
|
+
sessionKeyGuid: d
|
|
37
37
|
}
|
|
38
38
|
);
|
|
39
39
|
}
|
|
@@ -53,13 +53,14 @@ class b extends y {
|
|
|
53
53
|
return this.controller.execute(f(t));
|
|
54
54
|
}
|
|
55
55
|
}
|
|
56
|
-
class
|
|
56
|
+
class x extends _ {
|
|
57
57
|
id = "controller_session";
|
|
58
58
|
name = "Controller Session";
|
|
59
59
|
_chainId;
|
|
60
60
|
_rpcUrl;
|
|
61
61
|
_username;
|
|
62
62
|
_redirectUrl;
|
|
63
|
+
_disconnectRedirectUrl;
|
|
63
64
|
_policies;
|
|
64
65
|
_keychainUrl;
|
|
65
66
|
_apiUrl;
|
|
@@ -68,70 +69,71 @@ class U extends _ {
|
|
|
68
69
|
reopenBrowser = !0;
|
|
69
70
|
constructor({
|
|
70
71
|
rpc: t,
|
|
71
|
-
chainId:
|
|
72
|
+
chainId: r,
|
|
72
73
|
policies: e,
|
|
73
74
|
redirectUrl: s,
|
|
74
|
-
|
|
75
|
-
|
|
75
|
+
disconnectRedirectUrl: i,
|
|
76
|
+
keychainUrl: a,
|
|
77
|
+
apiUrl: n
|
|
76
78
|
}) {
|
|
77
79
|
if (super(), this._policies = {
|
|
78
80
|
verified: !1,
|
|
79
81
|
contracts: e.contracts ? Object.fromEntries(
|
|
80
|
-
Object.entries(e.contracts).map(([
|
|
81
|
-
|
|
82
|
+
Object.entries(e.contracts).map(([o, c]) => [
|
|
83
|
+
o,
|
|
82
84
|
{
|
|
83
|
-
...
|
|
84
|
-
methods:
|
|
85
|
-
...
|
|
85
|
+
...c,
|
|
86
|
+
methods: c.methods.map((d) => ({
|
|
87
|
+
...d,
|
|
86
88
|
authorized: !0
|
|
87
89
|
}))
|
|
88
90
|
}
|
|
89
91
|
])
|
|
90
92
|
) : void 0,
|
|
91
|
-
messages: e.messages?.map((
|
|
92
|
-
...
|
|
93
|
+
messages: e.messages?.map((o) => ({
|
|
94
|
+
...o,
|
|
93
95
|
authorized: !0
|
|
94
96
|
}))
|
|
95
|
-
}, this._rpcUrl = t, this._chainId =
|
|
96
|
-
const
|
|
97
|
-
if (!
|
|
98
|
-
const
|
|
99
|
-
this._publicKey =
|
|
100
|
-
starknet: { privateKey:
|
|
97
|
+
}, this._rpcUrl = t, this._chainId = r, this._redirectUrl = s, this._disconnectRedirectUrl = i, this._keychainUrl = a || w, this._apiUrl = n ?? v, this.tryRetrieveFromQueryOrStorage()) {
|
|
98
|
+
const o = localStorage.getItem("sessionSigner");
|
|
99
|
+
if (!o) throw new Error("failed to get sessionSigner");
|
|
100
|
+
const c = JSON.parse(o);
|
|
101
|
+
this._publicKey = c.pubKey, this._sessionKeyGuid = h({
|
|
102
|
+
starknet: { privateKey: u.addHexPrefix(c.privKey) }
|
|
101
103
|
});
|
|
102
104
|
} else {
|
|
103
|
-
const
|
|
104
|
-
this._publicKey =
|
|
105
|
+
const o = p.randomAddress();
|
|
106
|
+
this._publicKey = m.starkCurve.getStarkKey(o), localStorage.setItem(
|
|
105
107
|
"sessionSigner",
|
|
106
108
|
JSON.stringify({
|
|
107
|
-
privKey:
|
|
109
|
+
privKey: o,
|
|
108
110
|
pubKey: this._publicKey
|
|
109
111
|
})
|
|
110
|
-
), this._sessionKeyGuid =
|
|
111
|
-
starknet: { privateKey:
|
|
112
|
+
), this._sessionKeyGuid = h({
|
|
113
|
+
starknet: { privateKey: u.addHexPrefix(o) }
|
|
112
114
|
});
|
|
113
115
|
}
|
|
114
116
|
typeof window < "u" && (window.starknet_controller_session = this);
|
|
115
117
|
}
|
|
116
|
-
validatePoliciesSubset(t,
|
|
118
|
+
validatePoliciesSubset(t, r) {
|
|
117
119
|
if (t.contracts) {
|
|
118
|
-
if (!
|
|
120
|
+
if (!r.contracts) return !1;
|
|
119
121
|
for (const [e, s] of Object.entries(t.contracts)) {
|
|
120
|
-
const
|
|
121
|
-
if (!
|
|
122
|
-
for (const
|
|
123
|
-
const n =
|
|
124
|
-
(
|
|
122
|
+
const i = r.contracts[e];
|
|
123
|
+
if (!i) return !1;
|
|
124
|
+
for (const a of s.methods) {
|
|
125
|
+
const n = i.methods.find(
|
|
126
|
+
(l) => l.entrypoint === a.entrypoint
|
|
125
127
|
);
|
|
126
128
|
if (!n || !n.authorized) return !1;
|
|
127
129
|
}
|
|
128
130
|
}
|
|
129
131
|
}
|
|
130
132
|
if (t.messages) {
|
|
131
|
-
if (!
|
|
133
|
+
if (!r.messages) return !1;
|
|
132
134
|
for (const e of t.messages) {
|
|
133
|
-
const s =
|
|
134
|
-
(
|
|
135
|
+
const s = r.messages.find(
|
|
136
|
+
(i) => JSON.stringify(i.domain) === JSON.stringify(e.domain) && JSON.stringify(i.types) === JSON.stringify(e.types)
|
|
135
137
|
);
|
|
136
138
|
if (!s || !s.authorized) return !1;
|
|
137
139
|
}
|
|
@@ -152,28 +154,28 @@ class U extends _ {
|
|
|
152
154
|
localStorage.setItem("sessionPolicies", JSON.stringify(this._policies)), localStorage.setItem("lastUsedConnector", this.id);
|
|
153
155
|
try {
|
|
154
156
|
if (this.reopenBrowser) {
|
|
155
|
-
const s =
|
|
156
|
-
this._publicKey =
|
|
157
|
+
const s = p.randomAddress();
|
|
158
|
+
this._publicKey = m.starkCurve.getStarkKey(s), localStorage.setItem(
|
|
157
159
|
"sessionSigner",
|
|
158
160
|
JSON.stringify({
|
|
159
161
|
privKey: s,
|
|
160
162
|
pubKey: this._publicKey
|
|
161
163
|
})
|
|
162
|
-
), this._sessionKeyGuid =
|
|
163
|
-
starknet: { privateKey:
|
|
164
|
+
), this._sessionKeyGuid = h({
|
|
165
|
+
starknet: { privateKey: u.addHexPrefix(s) }
|
|
164
166
|
});
|
|
165
|
-
const
|
|
167
|
+
const i = `${this._keychainUrl}/session?public_key=${this._publicKey}&redirect_uri=${this._redirectUrl}&redirect_query_name=startapp&policies=${JSON.stringify(
|
|
166
168
|
this._policies
|
|
167
169
|
)}&rpc_url=${this._rpcUrl}`;
|
|
168
|
-
window.open(
|
|
170
|
+
window.open(i, "_blank");
|
|
169
171
|
}
|
|
170
172
|
const t = await g(
|
|
171
173
|
this._sessionKeyGuid,
|
|
172
174
|
this._apiUrl
|
|
173
|
-
),
|
|
175
|
+
), r = t.authorization[1], e = {
|
|
174
176
|
username: t.controller.accountID,
|
|
175
177
|
address: t.controller.address,
|
|
176
|
-
ownerGuid:
|
|
178
|
+
ownerGuid: r,
|
|
177
179
|
expiresAt: t.expiresAt,
|
|
178
180
|
guardianKeyGuid: "0x0",
|
|
179
181
|
metadataHash: "0x0",
|
|
@@ -192,43 +194,48 @@ class U extends _ {
|
|
|
192
194
|
}
|
|
193
195
|
disconnect() {
|
|
194
196
|
localStorage.removeItem("sessionSigner"), localStorage.removeItem("session"), localStorage.removeItem("sessionPolicies"), this.account = void 0, this._username = void 0;
|
|
195
|
-
const t =
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
197
|
+
const t = new URL(`${this._keychainUrl}`);
|
|
198
|
+
t.pathname = "disconnect", this._disconnectRedirectUrl && t.searchParams.append(
|
|
199
|
+
"redirect_url",
|
|
200
|
+
this._disconnectRedirectUrl
|
|
201
|
+
);
|
|
202
|
+
const r = window.open(t);
|
|
203
|
+
if (r === null) return Promise.resolve();
|
|
204
|
+
const { resolve: e, promise: s } = Promise.withResolvers();
|
|
205
|
+
function i() {
|
|
206
|
+
r?.closed && (e(), clearInterval(a));
|
|
200
207
|
}
|
|
201
|
-
const
|
|
202
|
-
return
|
|
208
|
+
const a = setInterval(i, 500);
|
|
209
|
+
return s;
|
|
203
210
|
}
|
|
204
211
|
tryRetrieveFromQueryOrStorage() {
|
|
205
212
|
if (this.account)
|
|
206
213
|
return this.account;
|
|
207
|
-
const t = localStorage.getItem("sessionSigner"),
|
|
214
|
+
const t = localStorage.getItem("sessionSigner"), r = t ? JSON.parse(t) : null;
|
|
208
215
|
let e = null;
|
|
209
216
|
const s = localStorage.getItem("session");
|
|
210
217
|
if (s && (e = JSON.parse(s)), window.location.search.includes("startapp")) {
|
|
211
|
-
const n = new URLSearchParams(window.location.search),
|
|
212
|
-
if (
|
|
213
|
-
const
|
|
214
|
-
atob(
|
|
218
|
+
const n = new URLSearchParams(window.location.search), l = n.get("startapp");
|
|
219
|
+
if (l) {
|
|
220
|
+
const o = JSON.parse(
|
|
221
|
+
atob(l)
|
|
215
222
|
);
|
|
216
|
-
Number(
|
|
217
|
-
const
|
|
218
|
-
window.history.replaceState({}, document.title,
|
|
223
|
+
Number(o.expiresAt) !== Number(e?.expiresAt) && (e = o, localStorage.setItem("session", JSON.stringify(e))), n.delete("startapp");
|
|
224
|
+
const c = window.location.pathname + (n.toString() ? `?${n.toString()}` : "") + window.location.hash;
|
|
225
|
+
window.history.replaceState({}, document.title, c);
|
|
219
226
|
}
|
|
220
227
|
}
|
|
221
|
-
if (!e || !
|
|
228
|
+
if (!e || !r)
|
|
222
229
|
return;
|
|
223
|
-
const
|
|
224
|
-
if (Date.now() >=
|
|
230
|
+
const i = parseInt(e.expiresAt) * 1e3;
|
|
231
|
+
if (Date.now() >= i) {
|
|
225
232
|
this.clearStoredSession();
|
|
226
233
|
return;
|
|
227
234
|
}
|
|
228
|
-
const
|
|
229
|
-
if (
|
|
235
|
+
const a = localStorage.getItem("sessionPolicies");
|
|
236
|
+
if (a) {
|
|
230
237
|
const n = JSON.parse(
|
|
231
|
-
|
|
238
|
+
a
|
|
232
239
|
);
|
|
233
240
|
if (!this.validatePoliciesSubset(
|
|
234
241
|
this._policies,
|
|
@@ -238,14 +245,14 @@ class U extends _ {
|
|
|
238
245
|
return;
|
|
239
246
|
}
|
|
240
247
|
}
|
|
241
|
-
return this._username = e.username, this.account = new
|
|
248
|
+
return this._username = e.username, this.account = new O(this, {
|
|
242
249
|
rpcUrl: this._rpcUrl,
|
|
243
|
-
privateKey:
|
|
250
|
+
privateKey: r.privKey,
|
|
244
251
|
address: e.address,
|
|
245
252
|
ownerGuid: e.ownerGuid,
|
|
246
253
|
chainId: this._chainId,
|
|
247
254
|
expiresAt: parseInt(e.expiresAt),
|
|
248
|
-
policies:
|
|
255
|
+
policies: I(this._policies),
|
|
249
256
|
guardianKeyGuid: e.guardianKeyGuid,
|
|
250
257
|
metadataHash: e.metadataHash,
|
|
251
258
|
sessionKeyGuid: e.sessionKeyGuid
|
|
@@ -256,10 +263,13 @@ class U extends _ {
|
|
|
256
263
|
}
|
|
257
264
|
}
|
|
258
265
|
export {
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
266
|
+
C as ALL_AUTH_OPTIONS,
|
|
267
|
+
G as EMBEDDED_WALLETS,
|
|
268
|
+
J as FeeSource,
|
|
269
|
+
E as IMPLEMENTED_AUTH_OPTIONS,
|
|
270
|
+
T as NotReadyToConnect,
|
|
271
|
+
H as ResponseCodes,
|
|
272
|
+
L as StarterPackItemType,
|
|
273
|
+
x as default
|
|
264
274
|
};
|
|
265
275
|
//# sourceMappingURL=session.js.map
|
package/dist/session.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sources":["../src/session/account.ts","../src/session/provider.ts"],"sourcesContent":["import { Policy } from \"@cartridge/controller-wasm\";\nimport { CartridgeSessionAccount } from \"@cartridge/controller-wasm/session\";\nimport { Call, InvokeFunctionResponse, WalletAccount } from \"starknet\";\n\nimport { normalizeCalls } from \"../utils\";\nimport BaseProvider from \"../provider\";\n\nexport * from \"../errors\";\nexport * from \"../types\";\n\nexport default class SessionAccount extends WalletAccount {\n public controller: CartridgeSessionAccount;\n\n constructor(\n provider: BaseProvider,\n {\n rpcUrl,\n privateKey,\n address,\n ownerGuid,\n chainId,\n expiresAt,\n policies,\n guardianKeyGuid,\n metadataHash,\n sessionKeyGuid,\n }: {\n rpcUrl: string;\n privateKey: string;\n address: string;\n ownerGuid: string;\n chainId: string;\n expiresAt: number;\n policies: Policy[];\n guardianKeyGuid: string;\n metadataHash: string;\n sessionKeyGuid: string;\n },\n ) {\n super({\n provider: { nodeUrl: rpcUrl },\n walletProvider: provider,\n address,\n });\n\n this.controller = CartridgeSessionAccount.newAsRegistered(\n rpcUrl,\n privateKey,\n address,\n ownerGuid,\n chainId,\n {\n expiresAt,\n policies,\n guardianKeyGuid,\n metadataHash,\n sessionKeyGuid,\n },\n );\n }\n\n /**\n * Invoke execute function in account contract\n *\n * @param calls the invocation object or an array of them, containing:\n * - contractAddress - the address of the contract\n * - entrypoint - the entrypoint of the contract\n * - calldata - (defaults to []) the calldata\n * - signature - (defaults to []) the signature\n * @param abis (optional) the abi of the contract for better displaying\n *\n * @returns response from addTransaction\n */\n async execute(calls: Call | Call[]): Promise<InvokeFunctionResponse> {\n return this.controller.execute(normalizeCalls(calls));\n }\n}\n","import { ec, stark, WalletAccount } from \"starknet\";\n\nimport {\n signerToGuid,\n subscribeCreateSession,\n} from \"@cartridge/controller-wasm\";\nimport { SessionPolicies } from \"@cartridge/presets\";\nimport { AddStarknetChainParameters } from \"@starknet-io/types-js\";\nimport { encode } from \"starknet\";\nimport { API_URL, KEYCHAIN_URL } from \"../constants\";\nimport { ParsedSessionPolicies } from \"../policies\";\nimport BaseProvider from \"../provider\";\nimport { toWasmPolicies } from \"../utils\";\nimport SessionAccount from \"./account\";\n\ninterface SessionRegistration {\n username: string;\n address: string;\n ownerGuid: string;\n transactionHash?: string;\n expiresAt: string;\n guardianKeyGuid: string;\n metadataHash: string;\n sessionKeyGuid: string;\n}\n\nexport type SessionOptions = {\n rpc: string;\n chainId: string;\n policies: SessionPolicies;\n redirectUrl: string;\n keychainUrl?: string;\n apiUrl?: string;\n};\n\nexport default class SessionProvider extends BaseProvider {\n public id = \"controller_session\";\n public name = \"Controller Session\";\n\n protected _chainId: string;\n protected _rpcUrl: string;\n protected _username?: string;\n protected _redirectUrl: string;\n protected _policies: ParsedSessionPolicies;\n protected _keychainUrl: string;\n protected _apiUrl: string;\n protected _publicKey: string;\n protected _sessionKeyGuid: string;\n public reopenBrowser: boolean = true;\n\n constructor({\n rpc,\n chainId,\n policies,\n redirectUrl,\n keychainUrl,\n apiUrl,\n }: SessionOptions) {\n super();\n\n this._policies = {\n verified: false,\n contracts: policies.contracts\n ? Object.fromEntries(\n Object.entries(policies.contracts).map(([address, contract]) => [\n address,\n {\n ...contract,\n methods: contract.methods.map((method) => ({\n ...method,\n authorized: true,\n })),\n },\n ]),\n )\n : undefined,\n messages: policies.messages?.map((message) => ({\n ...message,\n authorized: true,\n })),\n };\n\n this._rpcUrl = rpc;\n this._chainId = chainId;\n this._redirectUrl = redirectUrl;\n this._keychainUrl = keychainUrl || KEYCHAIN_URL;\n this._apiUrl = apiUrl ?? API_URL;\n\n const account = this.tryRetrieveFromQueryOrStorage();\n if (!account) {\n const pk = stark.randomAddress();\n this._publicKey = ec.starkCurve.getStarkKey(pk);\n\n localStorage.setItem(\n \"sessionSigner\",\n JSON.stringify({\n privKey: pk,\n pubKey: this._publicKey,\n }),\n );\n this._sessionKeyGuid = signerToGuid({\n starknet: { privateKey: encode.addHexPrefix(pk) },\n });\n } else {\n const pk = localStorage.getItem(\"sessionSigner\");\n if (!pk) throw new Error(\"failed to get sessionSigner\");\n\n const jsonPk: {\n privKey: string;\n pubKey: string;\n } = JSON.parse(pk);\n\n this._publicKey = jsonPk.pubKey;\n this._sessionKeyGuid = signerToGuid({\n starknet: { privateKey: encode.addHexPrefix(jsonPk.privKey) },\n });\n }\n\n if (typeof window !== \"undefined\") {\n (window as any).starknet_controller_session = this;\n }\n }\n\n private validatePoliciesSubset(\n newPolicies: ParsedSessionPolicies,\n existingPolicies: ParsedSessionPolicies,\n ): boolean {\n if (newPolicies.contracts) {\n if (!existingPolicies.contracts) return false;\n\n for (const [address, contract] of Object.entries(newPolicies.contracts)) {\n const existingContract = existingPolicies.contracts[address];\n if (!existingContract) return false;\n\n for (const method of contract.methods) {\n const existingMethod = existingContract.methods.find(\n (m) => m.entrypoint === method.entrypoint,\n );\n if (!existingMethod || !existingMethod.authorized) return false;\n }\n }\n }\n\n if (newPolicies.messages) {\n if (!existingPolicies.messages) return false;\n\n for (const message of newPolicies.messages) {\n const existingMessage = existingPolicies.messages.find(\n (m) =>\n JSON.stringify(m.domain) === JSON.stringify(message.domain) &&\n JSON.stringify(m.types) === JSON.stringify(message.types),\n );\n if (!existingMessage || !existingMessage.authorized) return false;\n }\n }\n\n return true;\n }\n\n async username() {\n await this.tryRetrieveFromQueryOrStorage();\n return this._username;\n }\n\n async probe(): Promise<WalletAccount | undefined> {\n if (this.account) {\n return this.account;\n }\n\n this.account = this.tryRetrieveFromQueryOrStorage();\n return this.account;\n }\n\n async connect(): Promise<WalletAccount | undefined> {\n if (this.account) {\n return this.account;\n }\n\n this.account = this.tryRetrieveFromQueryOrStorage();\n if (this.account) {\n return this.account;\n }\n\n localStorage.setItem(\"sessionPolicies\", JSON.stringify(this._policies));\n localStorage.setItem(\"lastUsedConnector\", this.id);\n\n try {\n if (this.reopenBrowser) {\n const pk = stark.randomAddress();\n this._publicKey = ec.starkCurve.getStarkKey(pk);\n\n localStorage.setItem(\n \"sessionSigner\",\n JSON.stringify({\n privKey: pk,\n pubKey: this._publicKey,\n }),\n );\n this._sessionKeyGuid = signerToGuid({\n starknet: { privateKey: encode.addHexPrefix(pk) },\n });\n const url = `${\n this._keychainUrl\n }/session?public_key=${this._publicKey}&redirect_uri=${\n this._redirectUrl\n }&redirect_query_name=startapp&policies=${JSON.stringify(\n this._policies,\n )}&rpc_url=${this._rpcUrl}`;\n\n window.open(url, \"_blank\");\n }\n\n const sessionResult = await subscribeCreateSession(\n this._sessionKeyGuid,\n this._apiUrl,\n );\n\n // auth is: [shortstring!('authorization-by-registered'), owner_guid]\n const ownerGuid = sessionResult.authorization[1];\n const session: SessionRegistration = {\n username: sessionResult.controller.accountID,\n address: sessionResult.controller.address,\n ownerGuid,\n expiresAt: sessionResult.expiresAt,\n guardianKeyGuid: \"0x0\",\n metadataHash: \"0x0\",\n sessionKeyGuid: this._sessionKeyGuid,\n };\n localStorage.setItem(\"session\", JSON.stringify(session));\n\n this.tryRetrieveFromQueryOrStorage();\n\n return this.account;\n } catch (e) {\n console.log(e);\n throw e;\n }\n }\n\n switchStarknetChain(_chainId: string): Promise<boolean> {\n throw new Error(\"switchStarknetChain not implemented\");\n }\n\n addStarknetChain(_chain: AddStarknetChainParameters): Promise<boolean> {\n throw new Error(\"addStarknetChain not implemented\");\n }\n\n disconnect(): Promise<void> {\n localStorage.removeItem(\"sessionSigner\");\n localStorage.removeItem(\"session\");\n localStorage.removeItem(\"sessionPolicies\");\n this.account = undefined;\n this._username = undefined;\n const openedWindow = window.open(`${this._keychainUrl}/disconnect`);\n if (openedWindow === null) return Promise.resolve();\n\n const { resolve, promise } = Promise.withResolvers<void>();\n function onWindowClose() {\n if (openedWindow?.closed) {\n resolve();\n clearInterval(checkInterval);\n }\n }\n const checkInterval = setInterval(onWindowClose, 500);\n return promise;\n }\n\n tryRetrieveFromQueryOrStorage() {\n if (this.account) {\n return this.account;\n }\n\n const signerString = localStorage.getItem(\"sessionSigner\");\n const signer = signerString ? JSON.parse(signerString) : null;\n let sessionRegistration: SessionRegistration | null = null;\n\n const sessionString = localStorage.getItem(\"session\");\n if (sessionString) {\n sessionRegistration = JSON.parse(sessionString);\n }\n\n if (window.location.search.includes(\"startapp\")) {\n const params = new URLSearchParams(window.location.search);\n const session = params.get(\"startapp\");\n if (session) {\n const possibleNewSession: SessionRegistration = JSON.parse(\n atob(session),\n );\n\n if (\n Number(possibleNewSession.expiresAt) !==\n Number(sessionRegistration?.expiresAt)\n ) {\n sessionRegistration = possibleNewSession;\n localStorage.setItem(\"session\", JSON.stringify(sessionRegistration));\n }\n\n // Remove the session query parameter\n params.delete(\"startapp\");\n const newUrl =\n window.location.pathname +\n (params.toString() ? `?${params.toString()}` : \"\") +\n window.location.hash;\n window.history.replaceState({}, document.title, newUrl);\n }\n }\n\n if (!sessionRegistration || !signer) {\n return;\n }\n\n // Check expiration\n const expirationTime = parseInt(sessionRegistration.expiresAt) * 1000;\n if (Date.now() >= expirationTime) {\n this.clearStoredSession();\n return;\n }\n\n // Check stored policies\n const storedPoliciesStr = localStorage.getItem(\"sessionPolicies\");\n if (storedPoliciesStr) {\n const storedPolicies = JSON.parse(\n storedPoliciesStr,\n ) as ParsedSessionPolicies;\n\n const isValid = this.validatePoliciesSubset(\n this._policies,\n storedPolicies,\n );\n\n if (!isValid) {\n this.clearStoredSession();\n return;\n }\n }\n\n this._username = sessionRegistration.username;\n this.account = new SessionAccount(this, {\n rpcUrl: this._rpcUrl,\n privateKey: signer.privKey,\n address: sessionRegistration.address,\n ownerGuid: sessionRegistration.ownerGuid,\n chainId: this._chainId,\n expiresAt: parseInt(sessionRegistration.expiresAt),\n policies: toWasmPolicies(this._policies),\n guardianKeyGuid: sessionRegistration.guardianKeyGuid,\n metadataHash: sessionRegistration.metadataHash,\n sessionKeyGuid: sessionRegistration.sessionKeyGuid,\n });\n\n return this.account;\n }\n\n private clearStoredSession(): void {\n localStorage.removeItem(\"sessionSigner\");\n localStorage.removeItem(\"session\");\n localStorage.removeItem(\"sessionPolicies\");\n }\n}\n"],"names":["SessionAccount","WalletAccount","provider","rpcUrl","privateKey","address","ownerGuid","chainId","expiresAt","policies","guardianKeyGuid","metadataHash","sessionKeyGuid","CartridgeSessionAccount","calls","normalizeCalls","SessionProvider","BaseProvider","rpc","redirectUrl","keychainUrl","apiUrl","contract","method","message","KEYCHAIN_URL","API_URL","pk","jsonPk","signerToGuid","encode","stark","ec","newPolicies","existingPolicies","existingContract","existingMethod","m","existingMessage","url","sessionResult","subscribeCreateSession","session","e","_chainId","_chain","openedWindow","resolve","promise","onWindowClose","checkInterval","signerString","signer","sessionRegistration","sessionString","params","possibleNewSession","newUrl","expirationTime","storedPoliciesStr","storedPolicies","toWasmPolicies"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"session.js","sources":["../src/session/account.ts","../src/session/provider.ts"],"sourcesContent":["import { Policy } from \"@cartridge/controller-wasm\";\nimport { CartridgeSessionAccount } from \"@cartridge/controller-wasm/session\";\nimport { Call, InvokeFunctionResponse, WalletAccount } from \"starknet\";\n\nimport { normalizeCalls } from \"../utils\";\nimport BaseProvider from \"../provider\";\n\nexport * from \"../errors\";\nexport * from \"../types\";\n\nexport default class SessionAccount extends WalletAccount {\n public controller: CartridgeSessionAccount;\n\n constructor(\n provider: BaseProvider,\n {\n rpcUrl,\n privateKey,\n address,\n ownerGuid,\n chainId,\n expiresAt,\n policies,\n guardianKeyGuid,\n metadataHash,\n sessionKeyGuid,\n }: {\n rpcUrl: string;\n privateKey: string;\n address: string;\n ownerGuid: string;\n chainId: string;\n expiresAt: number;\n policies: Policy[];\n guardianKeyGuid: string;\n metadataHash: string;\n sessionKeyGuid: string;\n },\n ) {\n super({\n provider: { nodeUrl: rpcUrl },\n walletProvider: provider,\n address,\n });\n\n this.controller = CartridgeSessionAccount.newAsRegistered(\n rpcUrl,\n privateKey,\n address,\n ownerGuid,\n chainId,\n {\n expiresAt,\n policies,\n guardianKeyGuid,\n metadataHash,\n sessionKeyGuid,\n },\n );\n }\n\n /**\n * Invoke execute function in account contract\n *\n * @param calls the invocation object or an array of them, containing:\n * - contractAddress - the address of the contract\n * - entrypoint - the entrypoint of the contract\n * - calldata - (defaults to []) the calldata\n * - signature - (defaults to []) the signature\n * @param abis (optional) the abi of the contract for better displaying\n *\n * @returns response from addTransaction\n */\n async execute(calls: Call | Call[]): Promise<InvokeFunctionResponse> {\n return this.controller.execute(normalizeCalls(calls));\n }\n}\n","import { ec, stark, WalletAccount } from \"starknet\";\n\nimport {\n signerToGuid,\n subscribeCreateSession,\n} from \"@cartridge/controller-wasm\";\nimport { SessionPolicies } from \"@cartridge/presets\";\nimport { AddStarknetChainParameters } from \"@starknet-io/types-js\";\nimport { encode } from \"starknet\";\nimport { API_URL, KEYCHAIN_URL } from \"../constants\";\nimport { ParsedSessionPolicies } from \"../policies\";\nimport BaseProvider from \"../provider\";\nimport { toWasmPolicies } from \"../utils\";\nimport SessionAccount from \"./account\";\n\ninterface SessionRegistration {\n username: string;\n address: string;\n ownerGuid: string;\n transactionHash?: string;\n expiresAt: string;\n guardianKeyGuid: string;\n metadataHash: string;\n sessionKeyGuid: string;\n}\n\nexport type SessionOptions = {\n rpc: string;\n chainId: string;\n policies: SessionPolicies;\n redirectUrl: string;\n disconnectRedirectUrl?: string;\n keychainUrl?: string;\n apiUrl?: string;\n};\n\nexport default class SessionProvider extends BaseProvider {\n public id = \"controller_session\";\n public name = \"Controller Session\";\n\n protected _chainId: string;\n protected _rpcUrl: string;\n protected _username?: string;\n protected _redirectUrl: string;\n protected _disconnectRedirectUrl?: string;\n protected _policies: ParsedSessionPolicies;\n protected _keychainUrl: string;\n protected _apiUrl: string;\n protected _publicKey: string;\n protected _sessionKeyGuid: string;\n public reopenBrowser: boolean = true;\n\n constructor({\n rpc,\n chainId,\n policies,\n redirectUrl,\n disconnectRedirectUrl,\n keychainUrl,\n apiUrl,\n }: SessionOptions) {\n super();\n\n this._policies = {\n verified: false,\n contracts: policies.contracts\n ? Object.fromEntries(\n Object.entries(policies.contracts).map(([address, contract]) => [\n address,\n {\n ...contract,\n methods: contract.methods.map((method) => ({\n ...method,\n authorized: true,\n })),\n },\n ]),\n )\n : undefined,\n messages: policies.messages?.map((message) => ({\n ...message,\n authorized: true,\n })),\n };\n\n this._rpcUrl = rpc;\n this._chainId = chainId;\n this._redirectUrl = redirectUrl;\n this._disconnectRedirectUrl = disconnectRedirectUrl;\n this._keychainUrl = keychainUrl || KEYCHAIN_URL;\n this._apiUrl = apiUrl ?? API_URL;\n\n const account = this.tryRetrieveFromQueryOrStorage();\n if (!account) {\n const pk = stark.randomAddress();\n this._publicKey = ec.starkCurve.getStarkKey(pk);\n\n localStorage.setItem(\n \"sessionSigner\",\n JSON.stringify({\n privKey: pk,\n pubKey: this._publicKey,\n }),\n );\n this._sessionKeyGuid = signerToGuid({\n starknet: { privateKey: encode.addHexPrefix(pk) },\n });\n } else {\n const pk = localStorage.getItem(\"sessionSigner\");\n if (!pk) throw new Error(\"failed to get sessionSigner\");\n\n const jsonPk: {\n privKey: string;\n pubKey: string;\n } = JSON.parse(pk);\n\n this._publicKey = jsonPk.pubKey;\n this._sessionKeyGuid = signerToGuid({\n starknet: { privateKey: encode.addHexPrefix(jsonPk.privKey) },\n });\n }\n\n if (typeof window !== \"undefined\") {\n (window as any).starknet_controller_session = this;\n }\n }\n\n private validatePoliciesSubset(\n newPolicies: ParsedSessionPolicies,\n existingPolicies: ParsedSessionPolicies,\n ): boolean {\n if (newPolicies.contracts) {\n if (!existingPolicies.contracts) return false;\n\n for (const [address, contract] of Object.entries(newPolicies.contracts)) {\n const existingContract = existingPolicies.contracts[address];\n if (!existingContract) return false;\n\n for (const method of contract.methods) {\n const existingMethod = existingContract.methods.find(\n (m) => m.entrypoint === method.entrypoint,\n );\n if (!existingMethod || !existingMethod.authorized) return false;\n }\n }\n }\n\n if (newPolicies.messages) {\n if (!existingPolicies.messages) return false;\n\n for (const message of newPolicies.messages) {\n const existingMessage = existingPolicies.messages.find(\n (m) =>\n JSON.stringify(m.domain) === JSON.stringify(message.domain) &&\n JSON.stringify(m.types) === JSON.stringify(message.types),\n );\n if (!existingMessage || !existingMessage.authorized) return false;\n }\n }\n\n return true;\n }\n\n async username() {\n await this.tryRetrieveFromQueryOrStorage();\n return this._username;\n }\n\n async probe(): Promise<WalletAccount | undefined> {\n if (this.account) {\n return this.account;\n }\n\n this.account = this.tryRetrieveFromQueryOrStorage();\n return this.account;\n }\n\n async connect(): Promise<WalletAccount | undefined> {\n if (this.account) {\n return this.account;\n }\n\n this.account = this.tryRetrieveFromQueryOrStorage();\n if (this.account) {\n return this.account;\n }\n\n localStorage.setItem(\"sessionPolicies\", JSON.stringify(this._policies));\n localStorage.setItem(\"lastUsedConnector\", this.id);\n\n try {\n if (this.reopenBrowser) {\n const pk = stark.randomAddress();\n this._publicKey = ec.starkCurve.getStarkKey(pk);\n\n localStorage.setItem(\n \"sessionSigner\",\n JSON.stringify({\n privKey: pk,\n pubKey: this._publicKey,\n }),\n );\n this._sessionKeyGuid = signerToGuid({\n starknet: { privateKey: encode.addHexPrefix(pk) },\n });\n const url = `${\n this._keychainUrl\n }/session?public_key=${this._publicKey}&redirect_uri=${\n this._redirectUrl\n }&redirect_query_name=startapp&policies=${JSON.stringify(\n this._policies,\n )}&rpc_url=${this._rpcUrl}`;\n\n window.open(url, \"_blank\");\n }\n\n const sessionResult = await subscribeCreateSession(\n this._sessionKeyGuid,\n this._apiUrl,\n );\n\n // auth is: [shortstring!('authorization-by-registered'), owner_guid]\n const ownerGuid = sessionResult.authorization[1];\n const session: SessionRegistration = {\n username: sessionResult.controller.accountID,\n address: sessionResult.controller.address,\n ownerGuid,\n expiresAt: sessionResult.expiresAt,\n guardianKeyGuid: \"0x0\",\n metadataHash: \"0x0\",\n sessionKeyGuid: this._sessionKeyGuid,\n };\n localStorage.setItem(\"session\", JSON.stringify(session));\n\n this.tryRetrieveFromQueryOrStorage();\n\n return this.account;\n } catch (e) {\n console.log(e);\n throw e;\n }\n }\n\n switchStarknetChain(_chainId: string): Promise<boolean> {\n throw new Error(\"switchStarknetChain not implemented\");\n }\n\n addStarknetChain(_chain: AddStarknetChainParameters): Promise<boolean> {\n throw new Error(\"addStarknetChain not implemented\");\n }\n\n disconnect(): Promise<void> {\n localStorage.removeItem(\"sessionSigner\");\n localStorage.removeItem(\"session\");\n localStorage.removeItem(\"sessionPolicies\");\n this.account = undefined;\n this._username = undefined;\n const disconnectUrl = new URL(`${this._keychainUrl}`);\n disconnectUrl.pathname = \"disconnect\";\n\n this._disconnectRedirectUrl &&\n disconnectUrl.searchParams.append(\n \"redirect_url\",\n this._disconnectRedirectUrl,\n );\n\n const openedWindow = window.open(disconnectUrl);\n if (openedWindow === null) return Promise.resolve();\n\n const { resolve, promise } = Promise.withResolvers<void>();\n function onWindowClose() {\n if (openedWindow?.closed) {\n resolve();\n clearInterval(checkInterval);\n }\n }\n const checkInterval = setInterval(onWindowClose, 500);\n return promise;\n }\n\n tryRetrieveFromQueryOrStorage() {\n if (this.account) {\n return this.account;\n }\n\n const signerString = localStorage.getItem(\"sessionSigner\");\n const signer = signerString ? JSON.parse(signerString) : null;\n let sessionRegistration: SessionRegistration | null = null;\n\n const sessionString = localStorage.getItem(\"session\");\n if (sessionString) {\n sessionRegistration = JSON.parse(sessionString);\n }\n\n if (window.location.search.includes(\"startapp\")) {\n const params = new URLSearchParams(window.location.search);\n const session = params.get(\"startapp\");\n if (session) {\n const possibleNewSession: SessionRegistration = JSON.parse(\n atob(session),\n );\n\n if (\n Number(possibleNewSession.expiresAt) !==\n Number(sessionRegistration?.expiresAt)\n ) {\n sessionRegistration = possibleNewSession;\n localStorage.setItem(\"session\", JSON.stringify(sessionRegistration));\n }\n\n // Remove the session query parameter\n params.delete(\"startapp\");\n const newUrl =\n window.location.pathname +\n (params.toString() ? `?${params.toString()}` : \"\") +\n window.location.hash;\n window.history.replaceState({}, document.title, newUrl);\n }\n }\n\n if (!sessionRegistration || !signer) {\n return;\n }\n\n // Check expiration\n const expirationTime = parseInt(sessionRegistration.expiresAt) * 1000;\n if (Date.now() >= expirationTime) {\n this.clearStoredSession();\n return;\n }\n\n // Check stored policies\n const storedPoliciesStr = localStorage.getItem(\"sessionPolicies\");\n if (storedPoliciesStr) {\n const storedPolicies = JSON.parse(\n storedPoliciesStr,\n ) as ParsedSessionPolicies;\n\n const isValid = this.validatePoliciesSubset(\n this._policies,\n storedPolicies,\n );\n\n if (!isValid) {\n this.clearStoredSession();\n return;\n }\n }\n\n this._username = sessionRegistration.username;\n this.account = new SessionAccount(this, {\n rpcUrl: this._rpcUrl,\n privateKey: signer.privKey,\n address: sessionRegistration.address,\n ownerGuid: sessionRegistration.ownerGuid,\n chainId: this._chainId,\n expiresAt: parseInt(sessionRegistration.expiresAt),\n policies: toWasmPolicies(this._policies),\n guardianKeyGuid: sessionRegistration.guardianKeyGuid,\n metadataHash: sessionRegistration.metadataHash,\n sessionKeyGuid: sessionRegistration.sessionKeyGuid,\n });\n\n return this.account;\n }\n\n private clearStoredSession(): void {\n localStorage.removeItem(\"sessionSigner\");\n localStorage.removeItem(\"session\");\n localStorage.removeItem(\"sessionPolicies\");\n }\n}\n"],"names":["SessionAccount","WalletAccount","provider","rpcUrl","privateKey","address","ownerGuid","chainId","expiresAt","policies","guardianKeyGuid","metadataHash","sessionKeyGuid","CartridgeSessionAccount","calls","normalizeCalls","SessionProvider","BaseProvider","rpc","redirectUrl","disconnectRedirectUrl","keychainUrl","apiUrl","contract","method","message","KEYCHAIN_URL","API_URL","pk","jsonPk","signerToGuid","encode","stark","ec","newPolicies","existingPolicies","existingContract","existingMethod","m","existingMessage","url","sessionResult","subscribeCreateSession","session","e","_chainId","_chain","disconnectUrl","openedWindow","resolve","promise","onWindowClose","checkInterval","signerString","signer","sessionRegistration","sessionString","params","possibleNewSession","newUrl","expirationTime","storedPoliciesStr","storedPolicies","toWasmPolicies"],"mappings":";;;;;;AAUA,MAAqBA,UAAuBC,EAAc;AAAA,EACjD;AAAA,EAEP,YACEC,GACA;AAAA,IACE,QAAAC;AAAA,IACA,YAAAC;AAAA,IACA,SAAAC;AAAA,IACA,WAAAC;AAAA,IACA,SAAAC;AAAA,IACA,WAAAC;AAAA,IACA,UAAAC;AAAA,IACA,iBAAAC;AAAA,IACA,cAAAC;AAAA,IACA,gBAAAC;AAAA,EAAA,GAaF;AACM,UAAA;AAAA,MACJ,UAAU,EAAE,SAAST,EAAO;AAAA,MAC5B,gBAAgBD;AAAA,MAChB,SAAAG;AAAA,IAAA,CACD,GAED,KAAK,aAAaQ,EAAwB;AAAA,MACxCV;AAAA,MACAC;AAAA,MACAC;AAAA,MACAC;AAAA,MACAC;AAAA,MACA;AAAA,QACE,WAAAC;AAAA,QACA,UAAAC;AAAA,QACA,iBAAAC;AAAA,QACA,cAAAC;AAAA,QACA,gBAAAC;AAAA,MAAA;AAAA,IAEJ;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeF,MAAM,QAAQE,GAAuD;AACnE,WAAO,KAAK,WAAW,QAAQC,EAAeD,CAAK,CAAC;AAAA,EAAA;AAExD;ACxCA,MAAqBE,UAAwBC,EAAa;AAAA,EACjD,KAAK;AAAA,EACL,OAAO;AAAA,EAEJ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACH,gBAAyB;AAAA,EAEhC,YAAY;AAAA,IACV,KAAAC;AAAA,IACA,SAAAX;AAAA,IACA,UAAAE;AAAA,IACA,aAAAU;AAAA,IACA,uBAAAC;AAAA,IACA,aAAAC;AAAA,IACA,QAAAC;AAAA,EAAA,GACiB;AAiCjB,QAhCM,MAAA,GAEN,KAAK,YAAY;AAAA,MACf,UAAU;AAAA,MACV,WAAWb,EAAS,YAChB,OAAO;AAAA,QACL,OAAO,QAAQA,EAAS,SAAS,EAAE,IAAI,CAAC,CAACJ,GAASkB,CAAQ,MAAM;AAAA,UAC9DlB;AAAA,UACA;AAAA,YACE,GAAGkB;AAAA,YACH,SAASA,EAAS,QAAQ,IAAI,CAACC,OAAY;AAAA,cACzC,GAAGA;AAAA,cACH,YAAY;AAAA,YAAA,EACZ;AAAA,UAAA;AAAA,QAEL,CAAA;AAAA,MAAA,IAEH;AAAA,MACJ,UAAUf,EAAS,UAAU,IAAI,CAACgB,OAAa;AAAA,QAC7C,GAAGA;AAAA,QACH,YAAY;AAAA,MAAA,EACZ;AAAA,IACJ,GAEA,KAAK,UAAUP,GACf,KAAK,WAAWX,GAChB,KAAK,eAAeY,GACpB,KAAK,yBAAyBC,GAC9B,KAAK,eAAeC,KAAeK,GACnC,KAAK,UAAUJ,KAAUK,GAET,KAAK,8BAA8B,GAe5C;AACC,YAAAC,IAAK,aAAa,QAAQ,eAAe;AAC/C,UAAI,CAACA,EAAU,OAAA,IAAI,MAAM,6BAA6B;AAEhD,YAAAC,IAGF,KAAK,MAAMD,CAAE;AAEjB,WAAK,aAAaC,EAAO,QACzB,KAAK,kBAAkBC,EAAa;AAAA,QAClC,UAAU,EAAE,YAAYC,EAAO,aAAaF,EAAO,OAAO,EAAE;AAAA,MAAA,CAC7D;AAAA,IAAA,OA1BW;AACN,YAAAD,IAAKI,EAAM,cAAc;AAC/B,WAAK,aAAaC,EAAG,WAAW,YAAYL,CAAE,GAEjC,aAAA;AAAA,QACX;AAAA,QACA,KAAK,UAAU;AAAA,UACb,SAASA;AAAA,UACT,QAAQ,KAAK;AAAA,QACd,CAAA;AAAA,MACH,GACA,KAAK,kBAAkBE,EAAa;AAAA,QAClC,UAAU,EAAE,YAAYC,EAAO,aAAaH,CAAE,EAAE;AAAA,MAAA,CACjD;AAAA,IAAA;AAgBC,IAAA,OAAO,SAAW,QACnB,OAAe,8BAA8B;AAAA,EAChD;AAAA,EAGM,uBACNM,GACAC,GACS;AACT,QAAID,EAAY,WAAW;AACrB,UAAA,CAACC,EAAiB,UAAkB,QAAA;AAE7B,iBAAA,CAAC9B,GAASkB,CAAQ,KAAK,OAAO,QAAQW,EAAY,SAAS,GAAG;AACjE,cAAAE,IAAmBD,EAAiB,UAAU9B,CAAO;AACvD,YAAA,CAAC+B,EAAyB,QAAA;AAEnB,mBAAAZ,KAAUD,EAAS,SAAS;AAC/B,gBAAAc,IAAiBD,EAAiB,QAAQ;AAAA,YAC9C,CAACE,MAAMA,EAAE,eAAed,EAAO;AAAA,UACjC;AACA,cAAI,CAACa,KAAkB,CAACA,EAAe,WAAmB,QAAA;AAAA,QAAA;AAAA,MAC5D;AAAA,IACF;AAGF,QAAIH,EAAY,UAAU;AACpB,UAAA,CAACC,EAAiB,SAAiB,QAAA;AAE5B,iBAAAV,KAAWS,EAAY,UAAU;AACpC,cAAAK,IAAkBJ,EAAiB,SAAS;AAAA,UAChD,CAACG,MACC,KAAK,UAAUA,EAAE,MAAM,MAAM,KAAK,UAAUb,EAAQ,MAAM,KAC1D,KAAK,UAAUa,EAAE,KAAK,MAAM,KAAK,UAAUb,EAAQ,KAAK;AAAA,QAC5D;AACA,YAAI,CAACc,KAAmB,CAACA,EAAgB,WAAmB,QAAA;AAAA,MAAA;AAAA,IAC9D;AAGK,WAAA;AAAA,EAAA;AAAA,EAGT,MAAM,WAAW;AACf,iBAAM,KAAK,8BAA8B,GAClC,KAAK;AAAA,EAAA;AAAA,EAGd,MAAM,QAA4C;AAChD,WAAI,KAAK,UACA,KAAK,WAGT,KAAA,UAAU,KAAK,8BAA8B,GAC3C,KAAK;AAAA,EAAA;AAAA,EAGd,MAAM,UAA8C;AAClD,QAAI,KAAK;AACP,aAAO,KAAK;AAId,QADK,KAAA,UAAU,KAAK,8BAA8B,GAC9C,KAAK;AACP,aAAO,KAAK;AAGd,iBAAa,QAAQ,mBAAmB,KAAK,UAAU,KAAK,SAAS,CAAC,GACzD,aAAA,QAAQ,qBAAqB,KAAK,EAAE;AAE7C,QAAA;AACF,UAAI,KAAK,eAAe;AAChB,cAAAX,IAAKI,EAAM,cAAc;AAC/B,aAAK,aAAaC,EAAG,WAAW,YAAYL,CAAE,GAEjC,aAAA;AAAA,UACX;AAAA,UACA,KAAK,UAAU;AAAA,YACb,SAASA;AAAA,YACT,QAAQ,KAAK;AAAA,UACd,CAAA;AAAA,QACH,GACA,KAAK,kBAAkBE,EAAa;AAAA,UAClC,UAAU,EAAE,YAAYC,EAAO,aAAaH,CAAE,EAAE;AAAA,QAAA,CACjD;AACK,cAAAY,IAAM,GACV,KAAK,YACP,uBAAuB,KAAK,UAAU,iBACpC,KAAK,YACP,0CAA0C,KAAK;AAAA,UAC7C,KAAK;AAAA,QAAA,CACN,YAAY,KAAK,OAAO;AAElB,eAAA,KAAKA,GAAK,QAAQ;AAAA,MAAA;AAG3B,YAAMC,IAAgB,MAAMC;AAAA,QAC1B,KAAK;AAAA,QACL,KAAK;AAAA,MACP,GAGMpC,IAAYmC,EAAc,cAAc,CAAC,GACzCE,IAA+B;AAAA,QACnC,UAAUF,EAAc,WAAW;AAAA,QACnC,SAASA,EAAc,WAAW;AAAA,QAClC,WAAAnC;AAAA,QACA,WAAWmC,EAAc;AAAA,QACzB,iBAAiB;AAAA,QACjB,cAAc;AAAA,QACd,gBAAgB,KAAK;AAAA,MACvB;AACA,0BAAa,QAAQ,WAAW,KAAK,UAAUE,CAAO,CAAC,GAEvD,KAAK,8BAA8B,GAE5B,KAAK;AAAA,aACLC,GAAG;AACV,oBAAQ,IAAIA,CAAC,GACPA;AAAA,IAAA;AAAA,EACR;AAAA,EAGF,oBAAoBC,GAAoC;AAChD,UAAA,IAAI,MAAM,qCAAqC;AAAA,EAAA;AAAA,EAGvD,iBAAiBC,GAAsD;AAC/D,UAAA,IAAI,MAAM,kCAAkC;AAAA,EAAA;AAAA,EAGpD,aAA4B;AAC1B,iBAAa,WAAW,eAAe,GACvC,aAAa,WAAW,SAAS,GACjC,aAAa,WAAW,iBAAiB,GACzC,KAAK,UAAU,QACf,KAAK,YAAY;AACjB,UAAMC,IAAgB,IAAI,IAAI,GAAG,KAAK,YAAY,EAAE;AACpD,IAAAA,EAAc,WAAW,cAEpB,KAAA,0BACHA,EAAc,aAAa;AAAA,MACzB;AAAA,MACA,KAAK;AAAA,IACP;AAEI,UAAAC,IAAe,OAAO,KAAKD,CAAa;AAC9C,QAAIC,MAAiB,KAAa,QAAA,QAAQ,QAAQ;AAElD,UAAM,EAAE,SAAAC,GAAS,SAAAC,MAAY,QAAQ,cAAoB;AACzD,aAASC,IAAgB;AACvB,MAAIH,GAAc,WACRC,EAAA,GACR,cAAcG,CAAa;AAAA,IAC7B;AAEI,UAAAA,IAAgB,YAAYD,GAAe,GAAG;AAC7C,WAAAD;AAAA,EAAA;AAAA,EAGT,gCAAgC;AAC9B,QAAI,KAAK;AACP,aAAO,KAAK;AAGR,UAAAG,IAAe,aAAa,QAAQ,eAAe,GACnDC,IAASD,IAAe,KAAK,MAAMA,CAAY,IAAI;AACzD,QAAIE,IAAkD;AAEhD,UAAAC,IAAgB,aAAa,QAAQ,SAAS;AAKpD,QAJIA,MACoBD,IAAA,KAAK,MAAMC,CAAa,IAG5C,OAAO,SAAS,OAAO,SAAS,UAAU,GAAG;AAC/C,YAAMC,IAAS,IAAI,gBAAgB,OAAO,SAAS,MAAM,GACnDd,IAAUc,EAAO,IAAI,UAAU;AACrC,UAAId,GAAS;AACX,cAAMe,IAA0C,KAAK;AAAA,UACnD,KAAKf,CAAO;AAAA,QACd;AAEA,QACE,OAAOe,EAAmB,SAAS,MACnC,OAAOH,GAAqB,SAAS,MAEfA,IAAAG,GACtB,aAAa,QAAQ,WAAW,KAAK,UAAUH,CAAmB,CAAC,IAIrEE,EAAO,OAAO,UAAU;AACxB,cAAME,IACJ,OAAO,SAAS,YACfF,EAAO,aAAa,IAAIA,EAAO,SAAS,CAAC,KAAK,MAC/C,OAAO,SAAS;AAClB,eAAO,QAAQ,aAAa,CAAI,GAAA,SAAS,OAAOE,CAAM;AAAA,MAAA;AAAA,IACxD;AAGE,QAAA,CAACJ,KAAuB,CAACD;AAC3B;AAIF,UAAMM,IAAiB,SAASL,EAAoB,SAAS,IAAI;AAC7D,QAAA,KAAK,IAAI,KAAKK,GAAgB;AAChC,WAAK,mBAAmB;AACxB;AAAA,IAAA;AAII,UAAAC,IAAoB,aAAa,QAAQ,iBAAiB;AAChE,QAAIA,GAAmB;AACrB,YAAMC,IAAiB,KAAK;AAAA,QAC1BD;AAAA,MACF;AAOA,UAAI,CALY,KAAK;AAAA,QACnB,KAAK;AAAA,QACLC;AAAA,MACF,GAEc;AACZ,aAAK,mBAAmB;AACxB;AAAA,MAAA;AAAA,IACF;AAGF,gBAAK,YAAYP,EAAoB,UAChC,KAAA,UAAU,IAAIvD,EAAe,MAAM;AAAA,MACtC,QAAQ,KAAK;AAAA,MACb,YAAYsD,EAAO;AAAA,MACnB,SAASC,EAAoB;AAAA,MAC7B,WAAWA,EAAoB;AAAA,MAC/B,SAAS,KAAK;AAAA,MACd,WAAW,SAASA,EAAoB,SAAS;AAAA,MACjD,UAAUQ,EAAe,KAAK,SAAS;AAAA,MACvC,iBAAiBR,EAAoB;AAAA,MACrC,cAAcA,EAAoB;AAAA,MAClC,gBAAgBA,EAAoB;AAAA,IAAA,CACrC,GAEM,KAAK;AAAA,EAAA;AAAA,EAGN,qBAA2B;AACjC,iBAAa,WAAW,eAAe,GACvC,aAAa,WAAW,SAAS,GACjC,aAAa,WAAW,iBAAiB;AAAA,EAAA;AAE7C;"}
|