@cartridge/controller 0.13.6 → 0.13.9
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 +25 -19
- package/HEADLESS_MODE.md +28 -7
- package/dist/constants.d.ts +1 -0
- package/dist/controller.d.ts +2 -1
- package/dist/{index-BdTFKueB.js → index-CJNujYxo.js} +40 -30
- package/dist/index-CJNujYxo.js.map +1 -0
- package/dist/index.js +619 -507
- package/dist/index.js.map +1 -1
- package/dist/lookup.d.ts +2 -0
- package/dist/node/index.cjs +3 -2
- package/dist/node/index.cjs.map +1 -1
- package/dist/node/index.js +3 -2
- package/dist/node/index.js.map +1 -1
- package/dist/session/provider.d.ts +4 -3
- package/dist/session.js +110 -107
- package/dist/session.js.map +1 -1
- package/dist/stats.html +1 -1
- package/dist/types.d.ts +5 -0
- package/package.json +4 -5
- package/src/__tests__/disconnect.test.ts +112 -0
- package/src/__tests__/lookupUsername.test.ts +166 -0
- package/src/constants.ts +4 -0
- package/src/controller.ts +20 -0
- package/src/iframe/keychain.ts +10 -3
- package/src/lookup.ts +170 -2
- package/src/node/server.ts +2 -1
- package/src/session/provider.ts +58 -46
- package/src/types.ts +6 -0
- package/.turbo/turbo-build.log +0 -69
- package/dist/index-BdTFKueB.js.map +0 -1
|
@@ -1,16 +1,22 @@
|
|
|
1
1
|
|
|
2
|
-
> @cartridge/controller@0.13.
|
|
3
|
-
> pnpm build
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
> @cartridge/controller@0.13.6 build /home/runner/work/controller/controller/packages/controller
|
|
2
|
+
> @cartridge/controller@0.13.9 build:deps /home/runner/work/controller/controller/packages/controller
|
|
7
3
|
> pnpm build:browser && pnpm build:node
|
|
8
4
|
|
|
9
5
|
|
|
10
|
-
> @cartridge/controller@0.13.
|
|
6
|
+
> @cartridge/controller@0.13.9 build:browser /home/runner/work/controller/controller/packages/controller
|
|
11
7
|
> vite build
|
|
12
8
|
|
|
13
9
|
[36mvite v6.3.4 [32mbuilding for production...[36m[39m
|
|
10
|
+
[96msrc/lookup.ts[0m:[93m116[0m:[93m7[0m - [91merror[0m[90m TS2322: [0mType 'string[]' is not assignable to type '("base" | "metamask" | "rabby" | "phantom-evm" | "argent" | "braavos" | "phantom" | "google" | "webauthn" | "discord" | "walletconnect" | "password")[]'.
|
|
11
|
+
Type 'string' is not assignable to type '"base" | "metamask" | "rabby" | "phantom-evm" | "argent" | "braavos" | "phantom" | "google" | "webauthn" | "discord" | "walletconnect" | "password"'.
|
|
12
|
+
|
|
13
|
+
[7m116[0m const HEADLESS_AUTH_OPTIONS: AuthOption[] = [
|
|
14
|
+
[7m [0m [91m ~~~~~~~~~~~~~~~~~~~~~[0m
|
|
15
|
+
[96msrc/lookup.ts[0m:[93m125[0m:[93m56[0m - [91merror[0m[90m TS2345: [0mArgument of type 'string' is not assignable to parameter of type '"metamask" | "rabby" | "phantom-evm" | "google" | "webauthn" | "discord" | "walletconnect" | "password"'.
|
|
16
|
+
|
|
17
|
+
[7m125[0m ].filter((option) => IMPLEMENTED_AUTH_OPTIONS.includes(option));
|
|
18
|
+
[7m [0m [91m ~~~~~~[0m
|
|
19
|
+
|
|
14
20
|
transforming...
|
|
15
21
|
[33m../../node_modules/.pnpm/ox@0.4.4_typescript@5.8.3_zod@3.24.4/node_modules/ox/_esm/core/Address.js (6:21): A comment
|
|
16
22
|
|
|
@@ -40,14 +46,14 @@ rendering chunks...
|
|
|
40
46
|
|
|
41
47
|
[vite:dts] Start generate declaration files...
|
|
42
48
|
computing gzip size...
|
|
43
|
-
[2mdist/[22m[36msession.js [39m[1m[2m 10.
|
|
44
|
-
[2mdist/[22m[36mindex-
|
|
45
|
-
[2mdist/[22m[36mindex.js [39m[1m[
|
|
46
|
-
[vite:dts] Declaration files built in
|
|
49
|
+
[2mdist/[22m[36msession.js [39m[1m[2m 10.82 kB[22m[1m[22m[2m │ gzip: 3.31 kB[22m[2m │ map: 25.84 kB[22m
|
|
50
|
+
[2mdist/[22m[36mindex-CJNujYxo.js [39m[1m[2m 38.69 kB[22m[1m[22m[2m │ gzip: 12.87 kB[22m[2m │ map: 81.82 kB[22m
|
|
51
|
+
[2mdist/[22m[36mindex.js [39m[1m[2m189.23 kB[22m[1m[22m[2m │ gzip: 49.86 kB[22m[2m │ map: 576.60 kB[22m
|
|
52
|
+
[vite:dts] Declaration files built in 2730ms.
|
|
47
53
|
|
|
48
|
-
[32m✓ built in
|
|
54
|
+
[32m✓ built in 4.25s[39m
|
|
49
55
|
|
|
50
|
-
> @cartridge/controller@0.13.
|
|
56
|
+
> @cartridge/controller@0.13.9 build:node /home/runner/work/controller/controller/packages/controller
|
|
51
57
|
> tsup --config tsup.node.config.ts
|
|
52
58
|
|
|
53
59
|
[34mCLI[39m Building entry: src/node/index.ts
|
|
@@ -61,13 +67,13 @@ computing gzip size...
|
|
|
61
67
|
"constants" and "shortString" are imported from external module "starknet" but never used in "dist/node/index.js".
|
|
62
68
|
"constants" and "shortString" are imported from external module "starknet" but never used in "dist/node/index.cjs".
|
|
63
69
|
Entry module "dist/node/index.cjs" is using named and default exports together. Consumers of your bundle will have to use `chunk.default` to access the default export, which may not be what you want. Use `output.exports: "named"` to disable this warning.
|
|
64
|
-
[32mESM[39m [1mdist/node/index.js [22m[32m23.
|
|
65
|
-
[32mESM[39m [1mdist/node/index.js.map [22m[32m56.
|
|
66
|
-
[32mESM[39m ⚡️ Build success in
|
|
67
|
-
[32mCJS[39m [1mdist/node/index.cjs [22m[32m24.
|
|
68
|
-
[32mCJS[39m [1mdist/node/index.cjs.map [22m[
|
|
69
|
-
[32mCJS[39m ⚡️ Build success in
|
|
70
|
+
[32mESM[39m [1mdist/node/index.js [22m[32m23.55 KB[39m
|
|
71
|
+
[32mESM[39m [1mdist/node/index.js.map [22m[32m56.82 KB[39m
|
|
72
|
+
[32mESM[39m ⚡️ Build success in 213ms
|
|
73
|
+
[32mCJS[39m [1mdist/node/index.cjs [22m[32m24.44 KB[39m
|
|
74
|
+
[32mCJS[39m [1mdist/node/index.cjs.map [22m[32m57.08 KB[39m
|
|
75
|
+
[32mCJS[39m ⚡️ Build success in 214ms
|
|
70
76
|
[34mDTS[39m Build start
|
|
71
|
-
[32mDTS[39m ⚡️ Build success in
|
|
77
|
+
[32mDTS[39m ⚡️ Build success in 2292ms
|
|
72
78
|
[32mDTS[39m [1mdist/node/index.d.ts [22m[32m6.42 KB[39m
|
|
73
79
|
[32mDTS[39m [1mdist/node/index.d.cts [22m[32m6.42 KB[39m
|
package/HEADLESS_MODE.md
CHANGED
|
@@ -2,13 +2,16 @@
|
|
|
2
2
|
|
|
3
3
|
## Overview
|
|
4
4
|
|
|
5
|
-
Headless mode enables programmatic authentication with the Cartridge Controller
|
|
5
|
+
Headless mode enables programmatic authentication with the Cartridge Controller
|
|
6
|
+
SDK without displaying any UI. You trigger headless mode by passing a `username`
|
|
7
|
+
and `signer` to `connect(...)`.
|
|
6
8
|
|
|
7
9
|
```
|
|
8
10
|
Controller SDK → Keychain iframe (hidden) → Backend API
|
|
9
11
|
```
|
|
10
12
|
|
|
11
13
|
**Key Points**
|
|
14
|
+
|
|
12
15
|
- The keychain iframe still exists, but the modal is not opened.
|
|
13
16
|
- The SDK passes the connect request to keychain over Penpal.
|
|
14
17
|
- Keychain executes the same authentication logic as the UI flow.
|
|
@@ -16,6 +19,20 @@ Controller SDK → Keychain iframe (hidden) → Backend API
|
|
|
16
19
|
|
|
17
20
|
## Usage
|
|
18
21
|
|
|
22
|
+
### Username Lookup (Recommended)
|
|
23
|
+
|
|
24
|
+
Use lookup first so your app can decide whether to login or signup and show the
|
|
25
|
+
available signer methods for existing accounts.
|
|
26
|
+
|
|
27
|
+
```ts
|
|
28
|
+
const lookup = await controller.lookupUsername("alice");
|
|
29
|
+
|
|
30
|
+
if (lookup.exists) {
|
|
31
|
+
// e.g. ["webauthn", "google", "password"]
|
|
32
|
+
console.log(lookup.signers);
|
|
33
|
+
}
|
|
34
|
+
```
|
|
35
|
+
|
|
19
36
|
### Basic (Passkey / WebAuthn)
|
|
20
37
|
|
|
21
38
|
```ts
|
|
@@ -31,6 +48,9 @@ await controller.connect({
|
|
|
31
48
|
});
|
|
32
49
|
```
|
|
33
50
|
|
|
51
|
+
If `alice` does not exist yet, headless connect will create a new account and
|
|
52
|
+
continue.
|
|
53
|
+
|
|
34
54
|
### Password
|
|
35
55
|
|
|
36
56
|
```ts
|
|
@@ -60,6 +80,7 @@ await controller.connect({ username: "alice", signer: "walletconnect" });
|
|
|
60
80
|
## Supported Auth Options
|
|
61
81
|
|
|
62
82
|
Headless mode supports all **implemented** auth options:
|
|
83
|
+
|
|
63
84
|
- `webauthn`
|
|
64
85
|
- `password`
|
|
65
86
|
- `google`
|
|
@@ -72,8 +93,8 @@ Headless mode supports all **implemented** auth options:
|
|
|
72
93
|
## Handling Session Approval
|
|
73
94
|
|
|
74
95
|
If policies are unverified or include approvals, Keychain will prompt for
|
|
75
|
-
session approval **after** authentication. In that case, `connect` will open
|
|
76
|
-
|
|
96
|
+
session approval **after** authentication. In that case, `connect` will open the
|
|
97
|
+
approval UI and resolve once the session is approved.
|
|
77
98
|
|
|
78
99
|
```ts
|
|
79
100
|
const account = await controller.connect({
|
|
@@ -83,6 +104,7 @@ const account = await controller.connect({
|
|
|
83
104
|
|
|
84
105
|
console.log("Session approved:", account.address);
|
|
85
106
|
```
|
|
107
|
+
|
|
86
108
|
If you want to react to connection state changes, subscribe to the standard
|
|
87
109
|
wallet events (for example `accountsChanged`) or just await `connect(...)` and
|
|
88
110
|
update your app state afterwards.
|
|
@@ -92,9 +114,7 @@ update your app state afterwards.
|
|
|
92
114
|
The SDK provides specific error classes for headless mode:
|
|
93
115
|
|
|
94
116
|
```ts
|
|
95
|
-
import {
|
|
96
|
-
HeadlessAuthenticationError,
|
|
97
|
-
} from "@cartridge/controller";
|
|
117
|
+
import { HeadlessAuthenticationError } from "@cartridge/controller";
|
|
98
118
|
|
|
99
119
|
try {
|
|
100
120
|
await controller.connect({ username: "alice", signer: "webauthn" });
|
|
@@ -107,7 +127,8 @@ try {
|
|
|
107
127
|
|
|
108
128
|
## Notes
|
|
109
129
|
|
|
110
|
-
- Headless mode
|
|
130
|
+
- Headless mode can create new accounts when the username does not exist.
|
|
131
|
+
- For existing accounts, the requested signer must already be registered.
|
|
111
132
|
- For passkeys, the account must already have a WebAuthn signer registered.
|
|
112
133
|
- If policies are unverified or include approvals, Keychain will request
|
|
113
134
|
explicit approval after authentication.
|
package/dist/constants.d.ts
CHANGED
package/dist/controller.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ import { WalletWithStarknetFeatures } from '@starknet-io/get-starknet-wallet-sta
|
|
|
3
3
|
import { AddStarknetChainParameters } from '@starknet-io/types-js';
|
|
4
4
|
import { WalletAccount } from 'starknet';
|
|
5
5
|
import { default as BaseProvider } from './provider';
|
|
6
|
-
import { AuthOptions, ConnectOptions, ControllerOptions, ProfileContextTypeVariant, OpenOptions, StarterpackOptions } from './types';
|
|
6
|
+
import { AuthOptions, ConnectOptions, ControllerOptions, ProfileContextTypeVariant, OpenOptions, HeadlessUsernameLookupResult, StarterpackOptions } from './types';
|
|
7
7
|
export default class ControllerProvider extends BaseProvider {
|
|
8
8
|
private keychain?;
|
|
9
9
|
private options;
|
|
@@ -28,6 +28,7 @@ export default class ControllerProvider extends BaseProvider {
|
|
|
28
28
|
revoke(origin: string, _policy: Policy[]): Promise<void> | null;
|
|
29
29
|
rpcUrl(): string;
|
|
30
30
|
username(): Promise<string> | undefined;
|
|
31
|
+
lookupUsername(username: string): Promise<HeadlessUsernameLookupResult>;
|
|
31
32
|
openPurchaseCredits(): void;
|
|
32
33
|
openStarterPack(id: string | number, options?: StarterpackOptions): Promise<void>;
|
|
33
34
|
openExecute(calls: any, chainId?: string): Promise<{
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { shortString as u, constants as I, CallData as x, addAddressPadding as T, getChecksumAddress as f, hash as y, typedData as p, TypedDataRevision as h } from "starknet";
|
|
2
|
-
const E = "0.13.
|
|
2
|
+
const E = "0.13.9", Q = {
|
|
3
3
|
version: E
|
|
4
4
|
}, M = [
|
|
5
5
|
"metamask",
|
|
@@ -26,8 +26,8 @@ const E = "0.13.6", Q = {
|
|
|
26
26
|
...D,
|
|
27
27
|
...M
|
|
28
28
|
];
|
|
29
|
-
var Y = /* @__PURE__ */ ((t) => (t.SUCCESS = "SUCCESS", t.NOT_CONNECTED = "NOT_CONNECTED", t.ERROR = "ERROR", t.CANCELED = "CANCELED", t.USER_INTERACTION_REQUIRED = "USER_INTERACTION_REQUIRED", t))(Y || {}),
|
|
30
|
-
const
|
|
29
|
+
var Y = /* @__PURE__ */ ((t) => (t.SUCCESS = "SUCCESS", t.NOT_CONNECTED = "NOT_CONNECTED", t.ERROR = "ERROR", t.CANCELED = "CANCELED", t.USER_INTERACTION_REQUIRED = "USER_INTERACTION_REQUIRED", t))(Y || {}), S = /* @__PURE__ */ ((t) => (t.PAYMASTER = "PAYMASTER", t.CREDITS = "CREDITS", t))(S || {});
|
|
30
|
+
const O = /* @__PURE__ */ new Set([
|
|
31
31
|
"contracts",
|
|
32
32
|
"messages",
|
|
33
33
|
"target",
|
|
@@ -39,7 +39,7 @@ const S = /* @__PURE__ */ new Set([
|
|
|
39
39
|
"primaryType"
|
|
40
40
|
]);
|
|
41
41
|
function k(t) {
|
|
42
|
-
if (!
|
|
42
|
+
if (!O.has(t))
|
|
43
43
|
throw new Error(`Invalid property name: ${t}`);
|
|
44
44
|
}
|
|
45
45
|
function c(t, e) {
|
|
@@ -67,7 +67,7 @@ function L(t) {
|
|
|
67
67
|
e,
|
|
68
68
|
"contracts"
|
|
69
69
|
), l = {
|
|
70
|
-
name:
|
|
70
|
+
name: R(r),
|
|
71
71
|
entrypoint: r,
|
|
72
72
|
description: c(s, "description")
|
|
73
73
|
};
|
|
@@ -132,7 +132,7 @@ function X(t) {
|
|
|
132
132
|
function b(t) {
|
|
133
133
|
return Array.isArray(t) ? t : [t];
|
|
134
134
|
}
|
|
135
|
-
function
|
|
135
|
+
function R(t) {
|
|
136
136
|
return t.replace(/([a-z])([A-Z])/g, "$1 $2").replace(/_/g, " ").toLowerCase().replace(/^\w/, (e) => e.toUpperCase());
|
|
137
137
|
}
|
|
138
138
|
function J(t) {
|
|
@@ -193,7 +193,7 @@ function q(t) {
|
|
|
193
193
|
}
|
|
194
194
|
return "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==";
|
|
195
195
|
}
|
|
196
|
-
const ee = "https://x.cartridge.gg", te = "https://api.cartridge.gg";
|
|
196
|
+
const ee = "https://x.cartridge.gg", te = "https://api.cartridge.gg", ae = "startapp";
|
|
197
197
|
class _ extends Error {
|
|
198
198
|
constructor() {
|
|
199
199
|
super("Not ready to connect"), Object.setPrototypeOf(this, _.prototype);
|
|
@@ -214,7 +214,7 @@ class j extends Error {
|
|
|
214
214
|
super(`Operation "${e}" is not supported in headless mode`), this.name = "HeadlessModeNotSupportedError", Object.setPrototypeOf(this, j.prototype);
|
|
215
215
|
}
|
|
216
216
|
}
|
|
217
|
-
const
|
|
217
|
+
const P = {
|
|
218
218
|
ACCOUNTS: "accounts"
|
|
219
219
|
}, v = "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODAwIiBoZWlnaHQ9IjgwMCIgdmlld0JveD0iMCAwIDgwMCA4MDAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGZpbHRlcj0idXJsKCNmaWx0ZXIwX2RfNTExMl83ODIpIj4KPHBhdGggZD0iTTQ2OS4yMzYgNzBDNDgyLjM5IDcwIDQ5My4wNTMgODAuNjYzIDQ5My4wNTMgOTMuODE2NFYxNDcuMTQ3TDUxNS4zMzggMTQ3LjE0N0w1MTUuNDI4IDE0Ny4xNDdMNTE1LjU1NCAxNDcuMTQ3TDUxNS44MjYgMTQ3LjE0OUM1MTYuMDE2IDE0Ny4xNTEgNTE2LjIyNSAxNDcuMTUzIDUxNi40NTEgMTQ3LjE1N0M1MTYuOTA0IDE0Ny4xNjQgNTE3LjQyOCAxNDcuMTc2IDUxOC4wMiAxNDcuMTk1QzUxOS4yMDEgMTQ3LjIzNCA1MjAuNjYgMTQ3LjMwNCA1MjIuMzYxIDE0Ny40MjRDNTI1Ljc0MSAxNDcuNjYzIDUzMC4xODUgMTQ4LjExNCA1MzUuMzYzIDE0OC45NjlDNTQ1LjAwMSAxNTAuNTYyIDU1OC41NTYgMTUzLjc4IDU3Mi45MTggMTYwLjYwM0w3MzAuNDIgMjI2LjY3MUw3MzIuMTAxIDIyNy41MDVDNzcxLjc4NyAyNDcuMTc3IDc4OS45OTMgMjg2LjI5NiA3ODkuOTkzIDMyMi4wMzZWNTg1Ljg2NUM3ODkuOTkzIDU4Ni4wNTQgNzg5Ljk5NCA1ODYuMjU0IDc4OS45OTQgNTg2LjQ2M0w3ODkuOTk2IDU4Ni45MTNDNzkwLjAzOCA1OTcuMDk2IDc5MC4xNjEgNjI2Ljk5NiA3NjQuMjMxIDY1Mi44MjNMNzE0Ljc2IDcwMi4wOTVMNzE0LjY0MSA3MDIuMjE1QzcwNC42MDEgNzEyLjI3NSA2OTIuMTIzIDcyMC42NTIgNjc2LjI4NCA3MjQuODc5QzY2NC4zOSA3MjguMDU0IDY1Mi44MjcgNzI3Ljk2NiA2NDguNjM3IDcyNy45MzRMNjQ4LjYxOSA3MjcuOTMzQzY0OC40MDkgNzI3LjkzMiA2NDguMjE5IDcyNy45MyA2NDguMDQ3IDcyNy45M0w2NDcuNzUyIDcyNy45MjlINDgwLjcyMUM0NzQuMDk0IDcyNy45MjkgNDY4LjcyMSA3MjIuNTU2IDQ2OC43MjEgNzE1LjkyOVY2NjguMzg4SDMyOC41ODZDMzI4LjU4NiA2NzIuNjI5IDMyOC41NzIgNjk4LjA1MiAzMjguNTYxIDcxNS45NDRDMzI4LjU1NyA3MjIuNTY5IDMyMy4xODYgNzI3LjkyOSAzMTYuNTYxIDcyNy45MjlIMTUyLjI0NkMxNTIuMTA0IDcyNy45MjkgMTUxLjk0MiA3MjcuOTI5IDE1MS43NjIgNzI3LjkzMUwxNTEuMzYyIDcyNy45MzRDMTQ3LjE3MiA3MjcuOTY2IDEzNS42MDkgNzI4LjA1NCAxMjMuNzE0IDcyNC44NzlDMTA3Ljg3MyA3MjAuNjUxIDk1LjM5MzggNzEyLjI3MiA4NS4zNTI5IDcwMi4yMUw4NS4yMzg2IDcwMi4wOTVMMzUuNjcgNjUyLjcyNUwzNS41NzIzIDY1Mi42MjdDOS44NjI0MiA2MjYuNzggOS45NjY3IDU5Ny4xODUgMTAuMDAzIDU4Ni44NzRDMTAuMDA0MyA1ODYuNTEzIDEwLjAwNTUgNTg2LjE3NyAxMC4wMDU1IDU4NS44NjVWMzIyLjAzNkMxMC4wMDU1IDI4Ni40MyAyOC4xNjYyIDI0Ny4xOTkgNjcuODk3NyAyMjcuNTA1TDY5LjU3OSAyMjYuNjcxTDIyNy4wODEgMTYwLjYwM0MyNDEuNDQzIDE1My43OCAyNTQuOTk4IDE1MC41NjIgMjY0LjYzNiAxNDguOTY5QzI2OS44MTQgMTQ4LjExNCAyNzQuMjU4IDE0Ny42NjMgMjc3LjYzOCAxNDcuNDI0QzI3OS4zMzggMTQ3LjMwNCAyODAuNzk4IDE0Ny4yMzQgMjgxLjk3OSAxNDcuMTk1QzI4Mi41NzEgMTQ3LjE3NiAyODMuMDk1IDE0Ny4xNjQgMjgzLjU0NyAxNDcuMTU3TDI4My45MTcgMTQ3LjE1MkwyODQuMTczIDE0Ny4xNDlMMjg0LjQ0NSAxNDcuMTQ3TDI4NC41NzEgMTQ3LjE0N0wyODQuNjYgMTQ3LjE0N0wzMDYuOTQyIDE0Ny4xNDdWOTMuODE2NEMzMDYuOTQyIDgwLjY2MyAzMTcuNjA1IDcwIDMzMC43NTggNzBINDY5LjIzNloiIGZpbGw9IiMxOTFBMUEiLz4KPHBhdGggZD0iTTM2Ni40ODMgMTI5LjU0SDQzMy41MTJWMjA2LjY4N0gzNjYuNDgzVjEyOS41NFoiIGZpbGw9IiNGQkNCNEEiLz4KPHBhdGggZD0iTTI2OS4wMSA2MDIuNDI5SDE0NC4wMDhDMTM1Ljc2OCA2MDIuNDI5IDEzNS43NjggNTk0LjE0NiAxMzUuNzY4IDU5NC4xNDZWMjgwLjg1QzEzNS43NjggMjgwLjg1IDEzNS43NjggMjcyLjY0NCAxNDQuMDA4IDI3Mi42NDRIMzY2LjQ4M0wzNjYuNDgzIDIwNi42ODdIMjg0LjY5QzI4NC42OSAyMDYuNjg3IDI2OC4xMzQgMjA2LjY4NyAyNTEuNTc5IDIxNC44OTNMOTQuMzQxNCAyODAuODVDNzcuNzg2MSAyODkuMDU3IDY5LjU0NjkgMzA1LjYyMyA2OS41NDY5IDMyMi4wMzVWNTg1Ljg2M0M2OS41NDY5IDU5NC4xNDcgNjkuNTQ2OSA2MDIuMzUzIDc3Ljc4NjEgNjEwLjYzNkwxMjcuNDUyIDY2MC4xMDRDMTM1LjY5MSA2NjguMzg3IDE0MS45MjggNjY4LjM4NyAxNTIuMjQ3IDY2OC4zODdIMjY5LjAyOUMyNjkuMDM3IDY0OC4zNCAyNjkuMDQ2IDYyNC42NTUgMjY5LjA1NCA2MDIuODg3SDUyOC4wMTNWNjY4LjM4N0g2NDcuNzUzQzY1OC4wNzEgNjY4LjM4NyA2NjQuMzA4IDY2OC4zODcgNjcyLjU0NyA2NjAuMTA0TDcyMi4yMTMgNjEwLjYzNkM3MzAuNDUzIDYwMi40MjkgNzMwLjQ1MyA1OTQuMTQ3IDczMC40NTMgNTg1Ljg2M1YzMjIuMDM1QzczMC40NTMgMzA1LjU0NiA3MjIuMjEzIDI4OS4wNTcgNzA1LjY1OCAyODAuODVMNTQ4LjQyMSAyMTQuODkzQzUzMS44NjUgMjA2LjY4NyA1MTUuMzEgMjA2LjY4NyA1MTUuMzEgMjA2LjY4N0g0MzMuNTEyTDQzMy41MTIgMjcyLjY0NEg2NTYuMDY5QzY2NC4zMDggMjcyLjY0NCA2NjQuMzA4IDI4MC44NSA2NjQuMzA4IDI4MC44NVY1OTQuMTQ2QzY2NC4zMDggNTk0LjE0NiA2NjQuMzA4IDYwMi40MjkgNjU2LjA2OSA2MDIuNDI5SDUyOC4yNjJWNTM3LjM5NkgyNjkuMDc1QzI2OS4wNzUgNTQzLjcwNyAyNjkuMDE3IDU5Ni45MTIgMjY5LjAxIDYwMi40MjlaIiBmaWxsPSIjRkJDQjRBIi8+CjxwYXRoIGQ9Ik0yNjkuMDA5IDQzNi4xNzJINTI4LjI2MlYzNzAuNjgxSDI2OS4wNzVDMjY5LjA3NSAzNzcuMzczIDI2OS4wMDkgNDM2Ljc4OCAyNjkuMDA5IDQzNi4xNzJaIiBmaWxsPSIjRkJDQjRBIi8+CjwvZz4KPGRlZnM+CjxmaWx0ZXIgaWQ9ImZpbHRlcjBfZF81MTEyXzc4MiIgeD0iLTQiIHk9IjAiIHdpZHRoPSI4MDgiIGhlaWdodD0iODA4IiBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CjxmZUZsb29kIGZsb29kLW9wYWNpdHk9IjAiIHJlc3VsdD0iQmFja2dyb3VuZEltYWdlRml4Ii8+CjxmZUNvbG9yTWF0cml4IGluPSJTb3VyY2VBbHBoYSIgdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDEyNyAwIiByZXN1bHQ9ImhhcmRBbHBoYSIvPgo8ZmVPZmZzZXQgZHk9IjQiLz4KPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMiIvPgo8ZmVDb21wb3NpdGUgaW4yPSJoYXJkQWxwaGEiIG9wZXJhdG9yPSJvdXQiLz4KPGZlQ29sb3JNYXRyaXggdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAuMjUgMCIvPgo8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluMj0iQmFja2dyb3VuZEltYWdlRml4IiByZXN1bHQ9ImVmZmVjdDFfZHJvcFNoYWRvd181MTEyXzc4MiIvPgo8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluPSJTb3VyY2VHcmFwaGljIiBpbjI9ImVmZmVjdDFfZHJvcFNoYWRvd181MTEyXzc4MiIgcmVzdWx0PSJzaGFwZSIvPgo8L2ZpbHRlcj4KPC9kZWZzPgo8L3N2Zz4K";
|
|
220
220
|
function U() {
|
|
@@ -233,7 +233,7 @@ class B {
|
|
|
233
233
|
}
|
|
234
234
|
}
|
|
235
235
|
const H = new B();
|
|
236
|
-
class
|
|
236
|
+
class oe {
|
|
237
237
|
id = "controller";
|
|
238
238
|
name = "Controller";
|
|
239
239
|
version = Q.version;
|
|
@@ -262,7 +262,7 @@ class ae {
|
|
|
262
262
|
request = async (e) => {
|
|
263
263
|
switch (e.type) {
|
|
264
264
|
case "wallet_getPermissions":
|
|
265
|
-
return await this.safeProbe(), this.account ? [
|
|
265
|
+
return await this.safeProbe(), this.account ? [P.ACCOUNTS] : [];
|
|
266
266
|
case "wallet_requestAccounts": {
|
|
267
267
|
if (this.account)
|
|
268
268
|
return [this.account.address];
|
|
@@ -363,7 +363,7 @@ class ae {
|
|
|
363
363
|
});
|
|
364
364
|
}
|
|
365
365
|
}
|
|
366
|
-
function
|
|
366
|
+
function se(t) {
|
|
367
367
|
return {
|
|
368
368
|
verified: !1,
|
|
369
369
|
contracts: t.contracts ? Object.fromEntries(
|
|
@@ -394,11 +394,20 @@ var W = [
|
|
|
394
394
|
total_supply: null,
|
|
395
395
|
logo_url: "https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/7dcb2db2-a7a7-44af-660b-8262e057a100/logo"
|
|
396
396
|
},
|
|
397
|
+
{
|
|
398
|
+
name: "USD Coin (Ethereum)",
|
|
399
|
+
symbol: "USDC.e",
|
|
400
|
+
decimals: 6,
|
|
401
|
+
l2_token_address: "0x053c91253bc9682c04929ca02ed00b3e423f6710d2ee7e0d5ebb06f3ecf368a8",
|
|
402
|
+
sort_order: 5,
|
|
403
|
+
total_supply: null,
|
|
404
|
+
logo_url: "https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/e5aaa970-a998-47e8-bd43-4a3b56b87200/logo"
|
|
405
|
+
},
|
|
397
406
|
{
|
|
398
407
|
name: "USD Coin",
|
|
399
408
|
symbol: "USDC",
|
|
400
409
|
decimals: 6,
|
|
401
|
-
l2_token_address: "
|
|
410
|
+
l2_token_address: "0x033068f6539f8e6e6b131e6b2b814e6c34a5224bc66947c47dab9dfee93b35fb",
|
|
402
411
|
sort_order: 5,
|
|
403
412
|
total_supply: null,
|
|
404
413
|
logo_url: "https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/e5aaa970-a998-47e8-bd43-4a3b56b87200/logo"
|
|
@@ -982,10 +991,10 @@ async function N() {
|
|
|
982
991
|
return console.error("Error loading configs index:", t), { configs: [], baseUrl: g };
|
|
983
992
|
}
|
|
984
993
|
}
|
|
985
|
-
async function
|
|
994
|
+
async function re() {
|
|
986
995
|
return (await N()).configs;
|
|
987
996
|
}
|
|
988
|
-
async function
|
|
997
|
+
async function de(t) {
|
|
989
998
|
try {
|
|
990
999
|
const a = `${(await N()).baseUrl || g}/${t}`, r = await fetch(`${a}/config.json`);
|
|
991
1000
|
if (!r.ok)
|
|
@@ -1017,7 +1026,7 @@ async function re(t) {
|
|
|
1017
1026
|
return console.error(`Error loading config ${t}:`, e), null;
|
|
1018
1027
|
}
|
|
1019
1028
|
}
|
|
1020
|
-
async function
|
|
1029
|
+
async function le() {
|
|
1021
1030
|
const t = await N(), e = t.configs, s = t.baseUrl || g, a = {};
|
|
1022
1031
|
return await Promise.all(
|
|
1023
1032
|
e.map(async (r) => {
|
|
@@ -1034,39 +1043,40 @@ async function de() {
|
|
|
1034
1043
|
), a;
|
|
1035
1044
|
}
|
|
1036
1045
|
z.theme.icon = "https://static.cartridge.gg/presets/cartridge/icon.svg";
|
|
1037
|
-
var
|
|
1046
|
+
var ne = W, ce = z.theme;
|
|
1038
1047
|
export {
|
|
1039
1048
|
te as A,
|
|
1040
|
-
|
|
1049
|
+
oe as B,
|
|
1041
1050
|
D as E,
|
|
1042
|
-
|
|
1051
|
+
S as F,
|
|
1043
1052
|
m as H,
|
|
1044
|
-
|
|
1053
|
+
V as I,
|
|
1045
1054
|
ee as K,
|
|
1046
1055
|
_ as N,
|
|
1047
1056
|
Y as R,
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1057
|
+
A as a,
|
|
1058
|
+
j as b,
|
|
1059
|
+
G as c,
|
|
1051
1060
|
L as d,
|
|
1052
1061
|
X as e,
|
|
1053
|
-
|
|
1062
|
+
se as f,
|
|
1054
1063
|
F as g,
|
|
1055
|
-
|
|
1064
|
+
R as h,
|
|
1056
1065
|
K as i,
|
|
1057
1066
|
M as j,
|
|
1058
1067
|
w as k,
|
|
1059
1068
|
C as l,
|
|
1060
|
-
|
|
1069
|
+
ce as m,
|
|
1061
1070
|
$ as n,
|
|
1062
|
-
|
|
1071
|
+
ne as o,
|
|
1063
1072
|
J as p,
|
|
1064
|
-
|
|
1073
|
+
re as q,
|
|
1065
1074
|
N as r,
|
|
1066
1075
|
q as s,
|
|
1067
1076
|
b as t,
|
|
1068
|
-
|
|
1077
|
+
le as u,
|
|
1069
1078
|
E as v,
|
|
1070
|
-
|
|
1079
|
+
de as w,
|
|
1080
|
+
ae as x
|
|
1071
1081
|
};
|
|
1072
|
-
//# sourceMappingURL=index-
|
|
1082
|
+
//# sourceMappingURL=index-CJNujYxo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-CJNujYxo.js","sources":["../src/wallets/types.ts","../src/types.ts","../src/utils.ts","../src/constants.ts","../src/errors.ts","../../../node_modules/.pnpm/@starknet-io+types-js@0.8.4/node_modules/@starknet-io/types-js/dist/esm/wallet-api/constants.js","../src/icon.ts","../src/mutex.ts","../src/provider.ts","../src/policies.ts","../../../node_modules/.pnpm/@cartridge+presets@https+++codeload.github.com+cartridge-gg+presets+tar.gz+c064e82/node_modules/@cartridge/presets/dist/index.js"],"sourcesContent":["export const AUTH_EXTERNAL_WALLETS = [\n \"metamask\",\n \"rabby\",\n \"phantom-evm\",\n] as const;\nexport type AuthExternalWallet = (typeof AUTH_EXTERNAL_WALLETS)[number];\n\nexport const EXTRA_EXTERNAL_WALLETS = [\n \"argent\",\n \"braavos\",\n \"phantom\",\n \"base\",\n] as const;\nexport type ExtraExternalWallet = (typeof EXTRA_EXTERNAL_WALLETS)[number];\n\nexport const EXTERNAL_WALLETS = [\n ...AUTH_EXTERNAL_WALLETS,\n ...EXTRA_EXTERNAL_WALLETS,\n] as const;\n\nexport type ExternalWalletType = (typeof EXTERNAL_WALLETS)[number];\n\nexport type ExternalPlatform =\n | \"starknet\"\n | \"ethereum\"\n | \"solana\"\n | \"base\"\n | \"arbitrum\"\n | \"optimism\";\n\nexport interface ExternalWallet {\n type: ExternalWalletType;\n available: boolean;\n version?: string;\n chainId?: string;\n name?: string;\n platform?: ExternalPlatform;\n connectedAccounts?: string[];\n}\n\nexport interface ExternalWalletResponse<T = unknown> {\n success: boolean;\n wallet: ExternalWalletType;\n result?: T;\n error?: string;\n account?: string;\n}\n\nexport interface WalletAdapter {\n type: ExternalWalletType;\n platform: ExternalPlatform | undefined;\n\n // Methods\n isAvailable(): boolean;\n getInfo(): ExternalWallet;\n getConnectedAccounts(): string[];\n connect(): Promise<ExternalWalletResponse<any>>;\n signMessage?(\n message: string,\n address?: string,\n ): Promise<ExternalWalletResponse<any>>;\n signTypedData?(data: any): Promise<ExternalWalletResponse<any>>;\n sendTransaction(tx: any): Promise<ExternalWalletResponse<any>>;\n getBalance(tokenAddress?: string): Promise<ExternalWalletResponse<any>>;\n switchChain(chainId: string): Promise<boolean>;\n waitForTransaction(\n txHash: string,\n timeoutMs?: number,\n ): Promise<ExternalWalletResponse<any>>;\n disconnect?(): void;\n}\n","import { Policy, SessionPolicies } from \"@cartridge/presets\";\nimport {\n AddInvokeTransactionResult,\n ChainId,\n Signature,\n TypedData,\n} from \"@starknet-io/types-js\";\nimport {\n Abi,\n BigNumberish,\n Call,\n constants,\n InvocationsDetails,\n} from \"starknet\";\nimport { KeychainIFrame } from \"./iframe\";\nimport {\n AUTH_EXTERNAL_WALLETS,\n EXTERNAL_WALLETS,\n ExternalWallet,\n ExternalWalletResponse,\n ExternalWalletType,\n} from \"./wallets/types\";\n\nexport type KeychainSession = {\n chainId: constants.StarknetChainId;\n policies: Policy[];\n maxFee: BigNumberish;\n expiresAt: bigint;\n credentials: {\n authorization: string[];\n privateKey: string;\n };\n};\n\nexport const EMBEDDED_WALLETS = [\n \"google\",\n \"webauthn\",\n \"discord\",\n \"walletconnect\",\n \"password\",\n] as const;\n\nexport type EmbeddedWallet = (typeof EMBEDDED_WALLETS)[number];\n\nexport const ALL_AUTH_OPTIONS = [\n ...EMBEDDED_WALLETS,\n ...EXTERNAL_WALLETS,\n] as const;\n\nexport type AuthOption = (typeof ALL_AUTH_OPTIONS)[number];\n\nexport const IMPLEMENTED_AUTH_OPTIONS = [\n ...EMBEDDED_WALLETS,\n ...AUTH_EXTERNAL_WALLETS,\n];\n\nexport type AuthOptions = (typeof IMPLEMENTED_AUTH_OPTIONS)[number][];\n\nexport enum ResponseCodes {\n SUCCESS = \"SUCCESS\",\n NOT_CONNECTED = \"NOT_CONNECTED\",\n ERROR = \"ERROR\",\n CANCELED = \"CANCELED\",\n USER_INTERACTION_REQUIRED = \"USER_INTERACTION_REQUIRED\",\n}\n\nexport type ConnectError = {\n code: ResponseCodes;\n message: string;\n error?: ControllerError;\n};\n\nexport type ControllerError = {\n code: Number;\n message: string;\n data?: any;\n};\n\nexport type ConnectReply = {\n code: ResponseCodes.SUCCESS;\n address: string;\n policies?: SessionPolicies;\n};\n\nexport type ExecuteReply =\n | (AddInvokeTransactionResult & {\n code: ResponseCodes.SUCCESS;\n })\n | {\n code: ResponseCodes.USER_INTERACTION_REQUIRED;\n };\n\nexport type ProbeReply = {\n code: ResponseCodes.SUCCESS;\n address: string;\n rpcUrl?: string;\n};\n\nexport type DeployReply = {\n code: ResponseCodes.SUCCESS;\n transaction_hash: string;\n};\n\nexport type IFrames = {\n keychain?: KeychainIFrame;\n version?: number;\n};\n\nexport interface LookupRequest {\n usernames?: string[];\n addresses?: string[];\n}\n\nexport interface LookupResult {\n username: string;\n addresses: string[];\n}\n\nexport interface LookupResponse {\n results: LookupResult[];\n}\n\nexport interface HeadlessUsernameLookupResult {\n username: string;\n exists: boolean;\n signers: AuthOption[];\n}\n\nexport enum FeeSource {\n PAYMASTER = \"PAYMASTER\",\n CREDITS = \"CREDITS\",\n}\n\ntype ContractAddress = string;\ntype CartridgeID = string;\nexport type ControllerAccounts = Record<ContractAddress, CartridgeID>;\n\nexport interface Keychain {\n probe(rpcUrl: string): Promise<ProbeReply | ConnectError>;\n connect(options?: ConnectOptions): Promise<ConnectReply | ConnectError>;\n disconnect(): void;\n\n reset(): void;\n revoke(origin: string): void;\n\n deploy(): Promise<DeployReply | ConnectError>;\n execute(\n calls: Call | Call[],\n abis?: Abi[],\n transactionsDetail?: InvocationsDetails,\n sync?: boolean,\n feeSource?: any,\n error?: ControllerError,\n ): Promise<ExecuteReply | ConnectError>;\n signMessage(\n typedData: TypedData,\n account: string,\n async?: boolean,\n ): Promise<Signature | ConnectError>;\n openSettings(): Promise<void | ConnectError>;\n session(): Promise<KeychainSession>;\n sessions(): Promise<{\n [key: string]: KeychainSession;\n }>;\n delegateAccount(): string;\n username(): string;\n openPurchaseCredits(): void;\n openExecute(calls: Call[]): Promise<void>;\n switchChain(rpcUrl: string): Promise<void>;\n openStarterPack(\n id: string | number,\n options?: StarterpackOptions,\n ): Promise<void>;\n navigate(path: string): Promise<void>;\n\n // External wallet methods\n externalDetectWallets(): Promise<ExternalWallet[]>;\n externalConnectWallet(\n type: ExternalWalletType,\n address?: string,\n ): Promise<ExternalWalletResponse>;\n externalSignMessage(\n type: ExternalWalletType,\n message: string,\n ): Promise<ExternalWalletResponse>;\n externalSignTypedData(\n type: ExternalWalletType,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n data: any,\n ): Promise<ExternalWalletResponse>;\n externalGetBalance(\n type: ExternalWalletType,\n tokenAddress?: string,\n ): Promise<ExternalWalletResponse>;\n externalSwitchChain(\n type: ExternalWalletType,\n chainId: string,\n ): Promise<boolean>;\n}\n\nexport interface Profile {\n navigate(path: string): void;\n switchChain(rpcUrl: string): Promise<void>;\n}\n\nexport interface Modal {\n open: () => void;\n close: () => void;\n}\n\n/**\n * Options for configuring the controller\n */\nexport type ControllerOptions = ProviderOptions & KeychainOptions;\n\nexport type IFrameOptions = {\n /** The ID of the starter pack to use */\n starterPackId?: string;\n /** The preset to use */\n preset?: string;\n};\n\nexport type Chain = {\n rpcUrl: string;\n};\n\nexport type ProviderOptions = {\n defaultChainId?: ChainId;\n chains?: Chain[];\n};\n\nexport type KeychainOptions = IFrameOptions & {\n policies?: SessionPolicies;\n /** The URL of keychain */\n url?: string;\n /** The origin of keychain */\n origin?: string;\n /** The RPC URL to use (derived from defaultChainId) */\n rpcUrl?: string;\n /** Propagate transaction errors back to caller instead of showing modal */\n propagateSessionErrors?: boolean;\n /** How to display transaction/execution errors to the user ('modal' | 'notification' | 'silent'). Defaults to 'modal'. */\n errorDisplayMode?: \"modal\" | \"notification\" | \"silent\";\n /** The fee source to use for execute from outside */\n feeSource?: FeeSource;\n /** Signup options (the order of the options is reflected in the UI. It's recommended to group socials and wallets together ) */\n signupOptions?: AuthOptions;\n /** When true, manually provided policies will override preset policies. Default is false. */\n shouldOverridePresetPolicies?: boolean;\n /** The project name of Slot instance. */\n slot?: string;\n /** The namespace to use to fetch trophies data from indexer. Will be mandatory once profile page is in production */\n namespace?: string;\n /** The tokens to be listed on Inventory modal */\n tokens?: Tokens;\n /** When true, defer iframe mounting until connect() is called. Reduces initial load and resource fetching. */\n lazyload?: boolean;\n};\n\nexport type ProfileContextTypeVariant =\n | \"inventory\"\n | \"trophies\"\n | \"achievements\"\n | \"quests\"\n | \"leaderboard\"\n | \"activity\";\n\nexport type Token = \"eth\" | \"strk\" | \"lords\" | \"usdc\" | \"usdt\";\n\nexport type Tokens = {\n erc20?: Token[];\n};\n\nexport type OpenOptions = {\n /** The URL to redirect to after authentication (defaults to current page) */\n redirectUrl?: string;\n};\n\nexport type StarterpackOptions = {\n /** The preimage to use */\n preimage?: string;\n /** Callback fired after the Play button closes the starterpack modal */\n onPurchaseComplete?: () => void;\n};\n\n// Connect options (used by controller.connect)\nexport interface ConnectOptions {\n /** Signup options (shown in UI when not headless) */\n signupOptions?: AuthOptions;\n /** Headless mode username (when combined with signer) */\n username?: string;\n /** Headless mode signer option (auth method) */\n signer?: AuthOption;\n /** Required when signer is \"password\" */\n password?: string;\n}\n\nexport type HeadlessConnectOptions = Required<\n Pick<ConnectOptions, \"username\" | \"signer\">\n> &\n Pick<ConnectOptions, \"password\">;\n\nexport type HeadlessConnectReply =\n | {\n code: ResponseCodes.SUCCESS;\n address: string;\n }\n | {\n code: ResponseCodes.USER_INTERACTION_REQUIRED;\n requestId: string;\n message?: string;\n }\n | ConnectError;\n","import { Policy, ApprovalPolicy } from \"@cartridge/controller-wasm/controller\";\nimport { Policies, SessionPolicies } from \"@cartridge/presets\";\nimport { ChainId } from \"@starknet-io/types-js\";\nimport {\n addAddressPadding,\n Call,\n CallData,\n constants,\n getChecksumAddress,\n hash,\n shortString,\n typedData,\n TypedDataRevision,\n} from \"starknet\";\nimport { ParsedSessionPolicies } from \"./policies\";\n\n// Whitelist of allowed property names to prevent prototype pollution\nconst ALLOWED_PROPERTIES = new Set([\n \"contracts\",\n \"messages\",\n \"target\",\n \"method\",\n \"name\",\n \"description\",\n \"types\",\n \"domain\",\n \"primaryType\",\n]);\n\nfunction validatePropertyName(prop: string): void {\n if (!ALLOWED_PROPERTIES.has(prop)) {\n throw new Error(`Invalid property name: ${prop}`);\n }\n}\n\nfunction safeObjectAccess<T>(obj: any, prop: string): T {\n validatePropertyName(prop);\n return obj[prop];\n}\n\nexport function normalizeCalls(calls: Call | Call[]) {\n return toArray(calls).map((call) => {\n return {\n entrypoint: call.entrypoint,\n contractAddress: addAddressPadding(call.contractAddress),\n calldata: CallData.toHex(call.calldata),\n };\n });\n}\n\nexport function getPresetSessionPolicies(\n config: Record<string, unknown>,\n chainId: string,\n): SessionPolicies | undefined {\n const decodedChainId = shortString.decodeShortString(chainId);\n const chains = config.chains as\n | Record<string, Record<string, unknown>>\n | undefined;\n const chainConfig = chains?.[decodedChainId];\n if (!chainConfig?.policies) return undefined;\n return toSessionPolicies(chainConfig.policies as Policies);\n}\n\nexport function toSessionPolicies(policies: Policies): SessionPolicies {\n return Array.isArray(policies)\n ? policies.reduce<SessionPolicies>(\n (prev, p) => {\n if (safeObjectAccess<string>(p, \"target\")) {\n const target = getChecksumAddress(\n safeObjectAccess<string>(p, \"target\"),\n );\n const entrypoint = safeObjectAccess<string>(p, \"method\");\n const contracts = safeObjectAccess<Record<string, any>>(\n prev,\n \"contracts\",\n );\n const item = {\n name: humanizeString(entrypoint),\n entrypoint: entrypoint,\n description: safeObjectAccess<string>(p, \"description\"),\n };\n\n if (target in contracts) {\n const methods = toArray(contracts[target].methods);\n contracts[target] = {\n methods: [...methods, item],\n };\n } else {\n contracts[target] = {\n methods: [item],\n };\n }\n } else {\n const messages = safeObjectAccess<any[]>(prev, \"messages\");\n messages.push(p);\n }\n\n return prev;\n },\n { contracts: {}, messages: [] },\n )\n : policies;\n}\n\n/**\n * Converts parsed session policies to WASM-compatible Policy objects.\n *\n * IMPORTANT: Policies are sorted canonically and addresses are normalized\n * via getChecksumAddress before hashing. Without this, Object.keys/entries\n * reordering or inconsistent address casing can cause identical policies to\n * produce different merkle roots, leading to \"session/not-registered\" errors.\n * See: https://github.com/cartridge-gg/controller/issues/2357\n */\nexport function toWasmPolicies(policies: ParsedSessionPolicies): Policy[] {\n return [\n ...Object.entries(policies.contracts ?? {})\n .sort(([a], [b]) => a.toLowerCase().localeCompare(b.toLowerCase()))\n .flatMap(([target, { methods }]) =>\n toArray(methods)\n .slice()\n .sort((a, b) => a.entrypoint.localeCompare(b.entrypoint))\n .map((m): Policy => {\n // Check if this is an approve entrypoint with spender and amount\n if (m.entrypoint === \"approve\") {\n if (\"spender\" in m && \"amount\" in m && m.spender && m.amount) {\n const approvalPolicy: ApprovalPolicy = {\n target: getChecksumAddress(target),\n spender: m.spender,\n amount: String(m.amount),\n };\n return approvalPolicy;\n }\n\n // Fall back to CallPolicy with deprecation warning\n console.warn(\n `[DEPRECATED] Approve method without spender and amount fields will be rejected in future versions. ` +\n `Please update your preset or policies to include both 'spender' and 'amount' fields for approve calls on contract ${target}. ` +\n `Example: { entrypoint: \"approve\", spender: \"0x...\", amount: \"0x...\" }`,\n );\n }\n\n // For non-approve methods and legacy approve, create a regular CallPolicy\n return {\n target: getChecksumAddress(target),\n method: hash.getSelectorFromName(m.entrypoint),\n authorized: !!m.authorized,\n };\n }),\n ),\n ...(policies.messages ?? [])\n .map((p) => {\n const domainHash = typedData.getStructHash(\n p.types,\n \"StarknetDomain\",\n p.domain,\n TypedDataRevision.ACTIVE,\n );\n const typeHash = typedData.getTypeHash(\n p.types,\n p.primaryType,\n TypedDataRevision.ACTIVE,\n );\n\n return {\n scope_hash: hash.computePoseidonHash(domainHash, typeHash),\n authorized: !!p.authorized,\n };\n })\n .sort((a, b) =>\n a.scope_hash.toString().localeCompare(b.scope_hash.toString()),\n ),\n ];\n}\n\nexport function toArray<T>(val: T | T[]): T[] {\n return Array.isArray(val) ? val : [val];\n}\n\nexport function humanizeString(str: string): string {\n return (\n str\n // Convert from camelCase or snake_case\n .replace(/([a-z])([A-Z])/g, \"$1 $2\") // camelCase to spaces\n .replace(/_/g, \" \") // snake_case to spaces\n .toLowerCase()\n // Capitalize first letter\n .replace(/^\\w/, (c) => c.toUpperCase())\n );\n}\n\nexport function parseChainId(url: URL): ChainId {\n const parts = url.pathname.split(\"/\");\n const isCartridgeHost = url.hostname === \"api.cartridge.gg\";\n\n // Handle non-Cartridge hosts by making a synchronous call to getChainId\n if (!isCartridgeHost) {\n // Check if we're in a browser environment\n if (typeof XMLHttpRequest === \"undefined\") {\n // In Node.js environment (like tests), we can't make synchronous HTTP calls\n // For now, we'll use a placeholder chainId for non-Cartridge hosts in tests\n console.warn(\n `Cannot make synchronous HTTP call in Node.js environment for ${url.toString()}`,\n );\n return shortString.encodeShortString(\"LOCALHOST\") as ChainId;\n }\n\n // Use a synchronous XMLHttpRequest to get the chain ID\n const xhr = new XMLHttpRequest();\n xhr.open(\"POST\", url.toString(), false); // false makes it synchronous\n xhr.setRequestHeader(\"Content-Type\", \"application/json\");\n\n const requestBody = JSON.stringify({\n jsonrpc: \"2.0\",\n method: \"starknet_chainId\",\n params: [],\n id: 1,\n });\n\n try {\n xhr.send(requestBody);\n\n if (xhr.status === 200) {\n const response = JSON.parse(xhr.responseText);\n if (response.result) {\n return response.result as ChainId;\n }\n }\n\n throw new Error(\n `Failed to get chain ID from ${url.toString()}: ${xhr.status} ${xhr.statusText}`,\n );\n } catch (error) {\n throw new Error(`Failed to connect to ${url.toString()}: ${error}`);\n }\n }\n\n if (parts.includes(\"starknet\")) {\n if (parts.includes(\"mainnet\")) {\n return constants.StarknetChainId.SN_MAIN;\n } else if (parts.includes(\"sepolia\")) {\n return constants.StarknetChainId.SN_SEPOLIA;\n }\n } else if (parts.length >= 3) {\n const projectName = parts[2];\n if (parts.includes(\"katana\")) {\n return shortString.encodeShortString(\n `WP_${projectName.toUpperCase().replace(/-/g, \"_\")}`,\n ) as ChainId;\n } else if (parts.includes(\"mainnet\")) {\n return shortString.encodeShortString(\n `GG_${projectName.toUpperCase().replace(/-/g, \"_\")}`,\n ) as ChainId;\n }\n }\n\n throw new Error(`Chain ${url.toString()} not supported`);\n}\n\nexport function isMobile() {\n return (\n window.matchMedia(\"(max-width: 768px)\").matches ||\n \"ontouchstart\" in window ||\n navigator.maxTouchPoints > 0\n );\n}\n\n// Sanitize image src to prevent XSS\nexport function sanitizeImageSrc(src: string): string {\n // Allow only http/https URLs (absolute)\n try {\n const url = new URL(src, window.location.origin);\n if (url.protocol === \"http:\" || url.protocol === \"https:\") {\n return url.href;\n }\n } catch (_) {\n // If invalid, fall through to fallback src below\n }\n // Fallback image (transparent pixel or default)\n return \"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\";\n}\n","export const KEYCHAIN_URL = \"https://x.cartridge.gg\";\nexport const PROFILE_URL = \"https://profile.cartridge.gg\";\nexport const API_URL = \"https://api.cartridge.gg\";\n\n// Query parameter name used to pass session data via URL redirects.\n// Borrowed from Telegram mini app convention, but the choice is arbitrary.\nexport const REDIRECT_QUERY_NAME = \"startapp\";\n","export class NotReadyToConnect extends Error {\n constructor() {\n super(\"Not ready to connect\");\n\n Object.setPrototypeOf(this, NotReadyToConnect.prototype);\n }\n}\n\nexport class HeadlessAuthenticationError extends Error {\n constructor(\n message: string,\n public cause?: Error,\n ) {\n super(message);\n this.name = \"HeadlessAuthenticationError\";\n\n Object.setPrototypeOf(this, HeadlessAuthenticationError.prototype);\n }\n}\n\nexport class InvalidCredentialsError extends HeadlessAuthenticationError {\n constructor(credentialType: string) {\n super(`Invalid credentials provided for type: ${credentialType}`);\n this.name = \"InvalidCredentialsError\";\n\n Object.setPrototypeOf(this, InvalidCredentialsError.prototype);\n }\n}\n\nexport class HeadlessModeNotSupportedError extends Error {\n constructor(operation: string) {\n super(`Operation \"${operation}\" is not supported in headless mode`);\n this.name = \"HeadlessModeNotSupportedError\";\n\n Object.setPrototypeOf(this, HeadlessModeNotSupportedError.prototype);\n }\n}\n","export const Permission = {\n ACCOUNTS: 'accounts',\n};\n//# sourceMappingURL=constants.js.map","export const icon =\n \"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODAwIiBoZWlnaHQ9IjgwMCIgdmlld0JveD0iMCAwIDgwMCA4MDAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGZpbHRlcj0idXJsKCNmaWx0ZXIwX2RfNTExMl83ODIpIj4KPHBhdGggZD0iTTQ2OS4yMzYgNzBDNDgyLjM5IDcwIDQ5My4wNTMgODAuNjYzIDQ5My4wNTMgOTMuODE2NFYxNDcuMTQ3TDUxNS4zMzggMTQ3LjE0N0w1MTUuNDI4IDE0Ny4xNDdMNTE1LjU1NCAxNDcuMTQ3TDUxNS44MjYgMTQ3LjE0OUM1MTYuMDE2IDE0Ny4xNTEgNTE2LjIyNSAxNDcuMTUzIDUxNi40NTEgMTQ3LjE1N0M1MTYuOTA0IDE0Ny4xNjQgNTE3LjQyOCAxNDcuMTc2IDUxOC4wMiAxNDcuMTk1QzUxOS4yMDEgMTQ3LjIzNCA1MjAuNjYgMTQ3LjMwNCA1MjIuMzYxIDE0Ny40MjRDNTI1Ljc0MSAxNDcuNjYzIDUzMC4xODUgMTQ4LjExNCA1MzUuMzYzIDE0OC45NjlDNTQ1LjAwMSAxNTAuNTYyIDU1OC41NTYgMTUzLjc4IDU3Mi45MTggMTYwLjYwM0w3MzAuNDIgMjI2LjY3MUw3MzIuMTAxIDIyNy41MDVDNzcxLjc4NyAyNDcuMTc3IDc4OS45OTMgMjg2LjI5NiA3ODkuOTkzIDMyMi4wMzZWNTg1Ljg2NUM3ODkuOTkzIDU4Ni4wNTQgNzg5Ljk5NCA1ODYuMjU0IDc4OS45OTQgNTg2LjQ2M0w3ODkuOTk2IDU4Ni45MTNDNzkwLjAzOCA1OTcuMDk2IDc5MC4xNjEgNjI2Ljk5NiA3NjQuMjMxIDY1Mi44MjNMNzE0Ljc2IDcwMi4wOTVMNzE0LjY0MSA3MDIuMjE1QzcwNC42MDEgNzEyLjI3NSA2OTIuMTIzIDcyMC42NTIgNjc2LjI4NCA3MjQuODc5QzY2NC4zOSA3MjguMDU0IDY1Mi44MjcgNzI3Ljk2NiA2NDguNjM3IDcyNy45MzRMNjQ4LjYxOSA3MjcuOTMzQzY0OC40MDkgNzI3LjkzMiA2NDguMjE5IDcyNy45MyA2NDguMDQ3IDcyNy45M0w2NDcuNzUyIDcyNy45MjlINDgwLjcyMUM0NzQuMDk0IDcyNy45MjkgNDY4LjcyMSA3MjIuNTU2IDQ2OC43MjEgNzE1LjkyOVY2NjguMzg4SDMyOC41ODZDMzI4LjU4NiA2NzIuNjI5IDMyOC41NzIgNjk4LjA1MiAzMjguNTYxIDcxNS45NDRDMzI4LjU1NyA3MjIuNTY5IDMyMy4xODYgNzI3LjkyOSAzMTYuNTYxIDcyNy45MjlIMTUyLjI0NkMxNTIuMTA0IDcyNy45MjkgMTUxLjk0MiA3MjcuOTI5IDE1MS43NjIgNzI3LjkzMUwxNTEuMzYyIDcyNy45MzRDMTQ3LjE3MiA3MjcuOTY2IDEzNS42MDkgNzI4LjA1NCAxMjMuNzE0IDcyNC44NzlDMTA3Ljg3MyA3MjAuNjUxIDk1LjM5MzggNzEyLjI3MiA4NS4zNTI5IDcwMi4yMUw4NS4yMzg2IDcwMi4wOTVMMzUuNjcgNjUyLjcyNUwzNS41NzIzIDY1Mi42MjdDOS44NjI0MiA2MjYuNzggOS45NjY3IDU5Ny4xODUgMTAuMDAzIDU4Ni44NzRDMTAuMDA0MyA1ODYuNTEzIDEwLjAwNTUgNTg2LjE3NyAxMC4wMDU1IDU4NS44NjVWMzIyLjAzNkMxMC4wMDU1IDI4Ni40MyAyOC4xNjYyIDI0Ny4xOTkgNjcuODk3NyAyMjcuNTA1TDY5LjU3OSAyMjYuNjcxTDIyNy4wODEgMTYwLjYwM0MyNDEuNDQzIDE1My43OCAyNTQuOTk4IDE1MC41NjIgMjY0LjYzNiAxNDguOTY5QzI2OS44MTQgMTQ4LjExNCAyNzQuMjU4IDE0Ny42NjMgMjc3LjYzOCAxNDcuNDI0QzI3OS4zMzggMTQ3LjMwNCAyODAuNzk4IDE0Ny4yMzQgMjgxLjk3OSAxNDcuMTk1QzI4Mi41NzEgMTQ3LjE3NiAyODMuMDk1IDE0Ny4xNjQgMjgzLjU0NyAxNDcuMTU3TDI4My45MTcgMTQ3LjE1MkwyODQuMTczIDE0Ny4xNDlMMjg0LjQ0NSAxNDcuMTQ3TDI4NC41NzEgMTQ3LjE0N0wyODQuNjYgMTQ3LjE0N0wzMDYuOTQyIDE0Ny4xNDdWOTMuODE2NEMzMDYuOTQyIDgwLjY2MyAzMTcuNjA1IDcwIDMzMC43NTggNzBINDY5LjIzNloiIGZpbGw9IiMxOTFBMUEiLz4KPHBhdGggZD0iTTM2Ni40ODMgMTI5LjU0SDQzMy41MTJWMjA2LjY4N0gzNjYuNDgzVjEyOS41NFoiIGZpbGw9IiNGQkNCNEEiLz4KPHBhdGggZD0iTTI2OS4wMSA2MDIuNDI5SDE0NC4wMDhDMTM1Ljc2OCA2MDIuNDI5IDEzNS43NjggNTk0LjE0NiAxMzUuNzY4IDU5NC4xNDZWMjgwLjg1QzEzNS43NjggMjgwLjg1IDEzNS43NjggMjcyLjY0NCAxNDQuMDA4IDI3Mi42NDRIMzY2LjQ4M0wzNjYuNDgzIDIwNi42ODdIMjg0LjY5QzI4NC42OSAyMDYuNjg3IDI2OC4xMzQgMjA2LjY4NyAyNTEuNTc5IDIxNC44OTNMOTQuMzQxNCAyODAuODVDNzcuNzg2MSAyODkuMDU3IDY5LjU0NjkgMzA1LjYyMyA2OS41NDY5IDMyMi4wMzVWNTg1Ljg2M0M2OS41NDY5IDU5NC4xNDcgNjkuNTQ2OSA2MDIuMzUzIDc3Ljc4NjEgNjEwLjYzNkwxMjcuNDUyIDY2MC4xMDRDMTM1LjY5MSA2NjguMzg3IDE0MS45MjggNjY4LjM4NyAxNTIuMjQ3IDY2OC4zODdIMjY5LjAyOUMyNjkuMDM3IDY0OC4zNCAyNjkuMDQ2IDYyNC42NTUgMjY5LjA1NCA2MDIuODg3SDUyOC4wMTNWNjY4LjM4N0g2NDcuNzUzQzY1OC4wNzEgNjY4LjM4NyA2NjQuMzA4IDY2OC4zODcgNjcyLjU0NyA2NjAuMTA0TDcyMi4yMTMgNjEwLjYzNkM3MzAuNDUzIDYwMi40MjkgNzMwLjQ1MyA1OTQuMTQ3IDczMC40NTMgNTg1Ljg2M1YzMjIuMDM1QzczMC40NTMgMzA1LjU0NiA3MjIuMjEzIDI4OS4wNTcgNzA1LjY1OCAyODAuODVMNTQ4LjQyMSAyMTQuODkzQzUzMS44NjUgMjA2LjY4NyA1MTUuMzEgMjA2LjY4NyA1MTUuMzEgMjA2LjY4N0g0MzMuNTEyTDQzMy41MTIgMjcyLjY0NEg2NTYuMDY5QzY2NC4zMDggMjcyLjY0NCA2NjQuMzA4IDI4MC44NSA2NjQuMzA4IDI4MC44NVY1OTQuMTQ2QzY2NC4zMDggNTk0LjE0NiA2NjQuMzA4IDYwMi40MjkgNjU2LjA2OSA2MDIuNDI5SDUyOC4yNjJWNTM3LjM5NkgyNjkuMDc1QzI2OS4wNzUgNTQzLjcwNyAyNjkuMDE3IDU5Ni45MTIgMjY5LjAxIDYwMi40MjlaIiBmaWxsPSIjRkJDQjRBIi8+CjxwYXRoIGQ9Ik0yNjkuMDA5IDQzNi4xNzJINTI4LjI2MlYzNzAuNjgxSDI2OS4wNzVDMjY5LjA3NSAzNzcuMzczIDI2OS4wMDkgNDM2Ljc4OCAyNjkuMDA5IDQzNi4xNzJaIiBmaWxsPSIjRkJDQjRBIi8+CjwvZz4KPGRlZnM+CjxmaWx0ZXIgaWQ9ImZpbHRlcjBfZF81MTEyXzc4MiIgeD0iLTQiIHk9IjAiIHdpZHRoPSI4MDgiIGhlaWdodD0iODA4IiBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CjxmZUZsb29kIGZsb29kLW9wYWNpdHk9IjAiIHJlc3VsdD0iQmFja2dyb3VuZEltYWdlRml4Ii8+CjxmZUNvbG9yTWF0cml4IGluPSJTb3VyY2VBbHBoYSIgdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDEyNyAwIiByZXN1bHQ9ImhhcmRBbHBoYSIvPgo8ZmVPZmZzZXQgZHk9IjQiLz4KPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMiIvPgo8ZmVDb21wb3NpdGUgaW4yPSJoYXJkQWxwaGEiIG9wZXJhdG9yPSJvdXQiLz4KPGZlQ29sb3JNYXRyaXggdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAuMjUgMCIvPgo8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluMj0iQmFja2dyb3VuZEltYWdlRml4IiByZXN1bHQ9ImVmZmVjdDFfZHJvcFNoYWRvd181MTEyXzc4MiIvPgo8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluPSJTb3VyY2VHcmFwaGljIiBpbjI9ImVmZmVjdDFfZHJvcFNoYWRvd181MTEyXzc4MiIgcmVzdWx0PSJzaGFwZSIvPgo8L2ZpbHRlcj4KPC9kZWZzPgo8L3N2Zz4K\";\n","function releaseStub() {}\n\n/**\n * A simple mutual exclusion lock. It allows you to obtain and release a lock,\n * ensuring that only one task can access a critical section at a time.\n */\nexport class Mutex {\n private m_lastPromise: Promise<void> = Promise.resolve();\n\n /**\n * Acquire lock\n * @param [bypass=false] option to skip lock acquisition\n */\n public async obtain(bypass = false): Promise<() => void> {\n let release = releaseStub;\n if (bypass) return release;\n const lastPromise = this.m_lastPromise;\n this.m_lastPromise = new Promise<void>((resolve) => (release = resolve));\n await lastPromise;\n return release;\n }\n}\n","import {\n AddInvokeTransactionParameters,\n AddStarknetChainParameters,\n Permission,\n RequestAccountsParameters,\n RequestFn,\n StarknetWindowObject,\n SwitchStarknetChainParameters,\n TypedData,\n UNEXPECTED_ERROR,\n WalletEventHandlers,\n WalletEventListener,\n WalletEvents,\n} from \"@starknet-io/types-js\";\nimport { WalletAccount } from \"starknet\";\nimport manifest from \"../package.json\";\n\nimport { icon } from \"./icon\";\nimport { Mutex } from \"./mutex\";\n\nconst mutex = new Mutex();\n\nexport default abstract class BaseProvider implements StarknetWindowObject {\n public id = \"controller\";\n public name = \"Controller\";\n public version = manifest.version;\n public icon = icon;\n\n public account?: WalletAccount;\n public subscriptions: WalletEvents[] = [];\n\n private _probePromise: Promise<WalletAccount | undefined> | null = null;\n\n protected async safeProbe(): Promise<WalletAccount | undefined> {\n // If we already have an account, return it\n if (this.account) {\n return this.account;\n }\n\n // If we're already probing, wait for the existing probe\n if (this._probePromise) {\n return this._probePromise;\n }\n\n const release = await mutex.obtain();\n return await new Promise<WalletAccount | undefined>(async (resolve) => {\n try {\n this._probePromise = this.probe();\n const result = await this._probePromise;\n resolve(result);\n } finally {\n this._probePromise = null;\n }\n }).finally(() => {\n release();\n });\n }\n\n request: RequestFn = async (call) => {\n switch (call.type) {\n case \"wallet_getPermissions\":\n await this.safeProbe();\n\n if (this.account) {\n return [Permission.ACCOUNTS];\n }\n\n return [];\n\n case \"wallet_requestAccounts\": {\n if (this.account) {\n return [this.account.address];\n }\n\n const silentMode =\n call.params && (call.params as RequestAccountsParameters).silent_mode;\n\n this.account = await this.safeProbe();\n\n if (!this.account && !silentMode) {\n this.account = await this.connect();\n }\n\n if (this.account) {\n return [this.account.address];\n }\n\n return [];\n }\n\n case \"wallet_watchAsset\":\n throw {\n code: 63,\n message: \"An unexpected error occurred\",\n data: \"wallet_watchAsset not implemented\",\n } as UNEXPECTED_ERROR;\n\n case \"wallet_addStarknetChain\": {\n let params = call.params as AddStarknetChainParameters;\n return this.addStarknetChain(params);\n }\n\n case \"wallet_switchStarknetChain\": {\n let params = call.params as SwitchStarknetChainParameters;\n return this.switchStarknetChain(params.chainId);\n }\n\n case \"wallet_requestChainId\":\n if (!this.account) {\n throw {\n code: 63,\n message: \"An unexpected error occurred\",\n data: \"Account not initialized\",\n } as UNEXPECTED_ERROR;\n }\n\n return await this.account.getChainId();\n\n case \"wallet_deploymentData\":\n throw {\n code: 63,\n message: \"An unexpected error occurred\",\n data: \"wallet_deploymentData not implemented\",\n } as UNEXPECTED_ERROR;\n\n case \"wallet_addInvokeTransaction\":\n if (!this.account) {\n throw {\n code: 63,\n message: \"An unexpected error occurred\",\n data: \"Account not initialized\",\n } as UNEXPECTED_ERROR;\n }\n\n let params = call.params as AddInvokeTransactionParameters;\n return await this.account.execute(\n params.calls.map((call) => ({\n contractAddress: call.contract_address,\n entrypoint: call.entry_point,\n calldata: call.calldata,\n })),\n );\n\n case \"wallet_addDeclareTransaction\":\n throw {\n code: 63,\n message: \"An unexpected error occurred\",\n data: \"wallet_addDeclareTransaction not implemented\",\n } as UNEXPECTED_ERROR;\n\n case \"wallet_signTypedData\": {\n if (!this.account) {\n throw {\n code: 63,\n message: \"An unexpected error occurred\",\n data: \"Account not initialized\",\n } as UNEXPECTED_ERROR;\n }\n\n return await this.account.signMessage(call.params as TypedData);\n }\n\n case \"wallet_supportedSpecs\":\n return [];\n case \"wallet_supportedWalletApi\":\n return [];\n default:\n throw {\n code: 63,\n message: \"An unexpected error occurred\",\n data: `Unknown RPC call type: ${call.type}`,\n } as UNEXPECTED_ERROR;\n }\n };\n\n on: WalletEventListener = <E extends keyof WalletEventHandlers>(\n event: E,\n handler: WalletEventHandlers[E],\n ): void => {\n if (event !== \"accountsChanged\" && event !== \"networkChanged\") {\n throw new Error(`Unknown event: ${event}`);\n }\n this.subscriptions.push({ type: event, handler } as WalletEvents);\n };\n\n off: WalletEventListener = <E extends keyof WalletEventHandlers>(\n event: E,\n handler: WalletEventHandlers[E],\n ): void => {\n if (event !== \"accountsChanged\" && event !== \"networkChanged\") {\n throw new Error(`Unknown event: ${event}`);\n }\n const idx = this.subscriptions.findIndex(\n (sub) => sub.type === event && sub.handler === handler,\n );\n if (idx >= 0) {\n this.subscriptions.splice(idx, 1);\n }\n };\n\n protected emitNetworkChanged(chainId: string) {\n this.subscriptions\n .filter((sub) => sub.type === \"networkChanged\")\n .forEach((sub) => {\n (sub.handler as WalletEventHandlers[\"networkChanged\"])(chainId);\n });\n }\n\n protected emitAccountsChanged(accounts: string[]) {\n this.subscriptions\n .filter((sub) => sub.type === \"accountsChanged\")\n .forEach((sub) => {\n (sub.handler as WalletEventHandlers[\"accountsChanged\"])(accounts);\n });\n }\n\n abstract probe(): Promise<WalletAccount | undefined>;\n abstract connect(): Promise<WalletAccount | undefined>;\n abstract switchStarknetChain(chainId: string): Promise<boolean>;\n abstract addStarknetChain(\n chain: AddStarknetChainParameters,\n ): Promise<boolean>;\n}\n","import {\n Approval,\n ContractPolicy,\n Method,\n SessionPolicies,\n SignMessagePolicy,\n} from \"@cartridge/presets\";\n\nexport type ParsedSessionPolicies = {\n verified: boolean;\n contracts?: SessionContracts;\n messages?: SessionMessages;\n};\n\nexport type SessionContracts = Record<\n string,\n Omit<ContractPolicy, \"methods\"> & {\n methods: ((Method | Approval) & { authorized?: boolean })[];\n }\n>;\n\nexport type SessionMessages = (SignMessagePolicy & {\n authorized?: boolean;\n})[];\n\nexport function parsePolicies(\n policies: SessionPolicies,\n): ParsedSessionPolicies {\n return {\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","// src/generated/erc20-metadata.ts\nvar metadata = [\n {\n name: \"Wrapped BTC\",\n symbol: \"WBTC\",\n decimals: 8,\n l2_token_address: \"0x03fe2b97c1fd336e750087d68b9b867997fd64a2661ff3ca5a7c771641e8e7ac\",\n sort_order: 0,\n total_supply: null,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/7dcb2db2-a7a7-44af-660b-8262e057a100/logo\"\n },\n {\n name: \"USD Coin (Ethereum)\",\n symbol: \"USDC.e\",\n decimals: 6,\n l2_token_address: \"0x053c91253bc9682c04929ca02ed00b3e423f6710d2ee7e0d5ebb06f3ecf368a8\",\n sort_order: 5,\n total_supply: null,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/e5aaa970-a998-47e8-bd43-4a3b56b87200/logo\"\n },\n {\n name: \"USD Coin\",\n symbol: \"USDC\",\n decimals: 6,\n l2_token_address: \"0x033068f6539f8e6e6b131e6b2b814e6c34a5224bc66947c47dab9dfee93b35fb\",\n sort_order: 5,\n total_supply: null,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/e5aaa970-a998-47e8-bd43-4a3b56b87200/logo\"\n },\n {\n name: \"LUSD Stablecoin\",\n symbol: \"LUSD\",\n decimals: 18,\n l2_token_address: \"0x070a76fd48ca0ef910631754d77dd822147fe98a569b826ec85e3c33fde586ac\",\n sort_order: 3,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/dc0ae733-5498-4afa-f475-48dba677aa00/logo\"\n },\n {\n name: \"Tether USD\",\n symbol: \"USDT\",\n decimals: 6,\n l2_token_address: \"0x068f5c6a61780768455de69077e07e89787839bf8166decfbf92b645209c0fb8\",\n sort_order: 4,\n total_supply: null,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/c8a721d1-07c3-46e4-ab4e-523977c30b00/logo\"\n },\n {\n name: \"Ether\",\n symbol: \"ETH\",\n decimals: 18,\n l2_token_address: \"0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7\",\n sort_order: 3,\n total_supply: null,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/e07829b7-0382-4e03-7ecd-a478c5aa9f00/logo\"\n },\n {\n name: \"Dai Stablecoin\",\n symbol: \"DAIv0\",\n decimals: 18,\n l2_token_address: \"0x00da114221cb83fa859dbdb4c44beeaa0bb37c7537ad5ae66fe5e0efd20e6eb3\",\n sort_order: 4,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/919e761b-56f7-4f53-32aa-5e066f7f6200/logo\"\n },\n {\n name: \"Dai Stablecoin\",\n symbol: \"DAI\",\n decimals: 18,\n l2_token_address: \"0x05574eb6b8789a91466f902c380d978e472db68170ff82a5b650b95a58ddf4ad\",\n sort_order: 4,\n total_supply: null,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/919e761b-56f7-4f53-32aa-5e066f7f6200/logo\"\n },\n {\n name: \"Legacy Starknet Wrapped Staked Ether\",\n symbol: \"wstETH-legacy\",\n decimals: 18,\n l2_token_address: \"0x042b8f0484674ca266ac5d08e4ac6a3fe65bd3129795def2dca5c34ecc5f96d2\",\n sort_order: 1,\n total_supply: null,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/26162dcc-29c2-4f5e-3acd-5e6be1f07a00/logo\"\n },\n {\n name: \"Wrapped Staked Ether\",\n symbol: \"wstETH\",\n decimals: 18,\n l2_token_address: \"0x0057912720381af14b0e5c87aa4718ed5e527eab60b3801ebf702ab09139e38b\",\n sort_order: 1,\n total_supply: null,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/dbbcbdea-1a92-437d-3701-4a5ee129d000/logo\"\n },\n {\n name: \"Rocket Pool ETH\",\n symbol: \"rETH\",\n decimals: 18,\n l2_token_address: \"0x0319111a5037cbec2b3e638cc34a3474e2d2608299f3e62866e9cc683208c610\",\n sort_order: 1,\n total_supply: null,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/c9f2d6fe-fbc6-4384-0990-923dfcb7a200/logo\"\n },\n {\n name: \"LORDS\",\n symbol: \"LORDS\",\n decimals: 18,\n l2_token_address: \"0x0124aeb495b947201f5fac96fd1138e326ad86195b98df6dec9009158a533b49\",\n sort_order: 1,\n total_supply: 509e5,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/a3bfe959-50c4-4f89-0aef-b19207d82a00/logo\"\n },\n {\n name: \"R Stablecoin\",\n symbol: \"R\",\n decimals: 18,\n l2_token_address: \"0x01fa2fb85f624600112040e1f3a848f53a37ed5a7385810063d5fe6887280333\",\n sort_order: 3,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/77612e4e-f7ee-4dba-2066-af321843ef00/logo\"\n },\n {\n name: \"Frax\",\n symbol: \"FRAX\",\n decimals: 18,\n l2_token_address: \"0x009c6b4fb13dfaa025c1383ed6190af8ed8cbb09d9588a3bb020feb152442406\",\n sort_order: 1,\n total_supply: 649462235,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/eeaf0779-e492-474c-ef19-b27843525600/logo\"\n },\n {\n name: \"Frax Share\",\n symbol: \"FXS\",\n decimals: 18,\n l2_token_address: \"0x0058efd0e73c33a848ffaa88738d128ebf0af98ea78cf3c14dc757bb02d39ffb\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/98bea621-1e4f-4d63-9689-bdaef0d56500/logo\"\n },\n {\n name: \"Staked Frax Ether\",\n symbol: \"sfrxETH\",\n decimals: 18,\n l2_token_address: \"0x04578fffc279e61b5cb0267a5f8e24b6089d40f93158fbbad2cb23b8622c9233\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/cd6fe18a-25db-4de9-758a-daf3b364ea00/logo\"\n },\n {\n name: \"Uniswap\",\n symbol: \"UNI\",\n decimals: 18,\n l2_token_address: \"0x049210ffc442172463f3177147c1aeaa36c51d152c1b0630f2364c300d4f48ee\",\n sort_order: 1,\n total_supply: 1e9,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/361b018e-bd53-4019-27c8-7cf8d9031b00/logo\"\n },\n {\n name: \"Paper\",\n symbol: \"PAPER\",\n decimals: 18,\n l2_token_address: \"0x0410466536b5ae074f7fea81e5533b8134a9fa08b3dd077dd9db08f64997d113\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/811f019a-0461-4cff-6c1e-442102863f00/logo\"\n },\n {\n name: \"StarkPepe\",\n symbol: \"xSPEPE\",\n decimals: 18,\n l2_token_address: \"0x06f15ec4b6ff0b7f7a216c4b2ccdefc96cbf114d6242292ca82971592f62273b\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n disabled: true\n },\n {\n name: \"StarkNet Token\",\n symbol: \"STRK\",\n decimals: 18,\n l2_token_address: \"0x04718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d\",\n sort_order: 2,\n total_supply: 1e10,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/1b126320-367c-48ed-cf5a-ba7580e49600/logo\"\n },\n {\n name: \"zkLend Token\",\n symbol: \"ZEND\",\n decimals: 18,\n l2_token_address: \"0x00585c32b625999e6e5e78645ff8df7a9001cf5cf3eb6b80ccdd16cb64bd3a34\",\n sort_order: 1,\n total_supply: null,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/95515b0e-1230-4158-10f1-56888f613c00/logo\"\n },\n {\n name: \"Ekubo Protocol\",\n symbol: \"EKUBO\",\n decimals: 18,\n l2_token_address: \"0x075afe6402ad5a5c20dd25e10ec3b3986acaa647b77e4ae24b0cbc9a54a27a87\",\n sort_order: 1,\n total_supply: 1e7,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/634d9c36-2f0b-4781-93e6-72d701b5af00/logo\"\n },\n {\n name: \"SOCKS\",\n symbol: \"SOCKS\",\n decimals: 18,\n l2_token_address: \"0x023ed2ba4fb5709302c5dfd739fa7613359042f143286c115b6c7f7dc2601015\",\n sort_order: 1,\n total_supply: 1e11,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/2db5a2a6-c98e-4b80-35e0-31b489132100/logo\"\n },\n {\n name: \"Nostra\",\n symbol: \"NSTR\",\n decimals: 18,\n l2_token_address: \"0x00c530f2c0aa4c16a0806365b0898499fba372e5df7a7172dc6fe9ba777e8007\",\n sort_order: 1,\n total_supply: 1e8,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/a45c2224-17a7-4269-ea7e-3924e9755800/logo\"\n },\n {\n name: \"Carmine\",\n symbol: \"CRM\",\n decimals: 18,\n l2_token_address: \"0x51c4b1fe3bf6774b87ad0b15ef5d1472759076e42944fff9b9f641ff13e5bbe\",\n sort_order: 1,\n total_supply: 1e8,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/6ab817f1-8075-4a94-6e14-f112f1f89d00/logo\"\n },\n {\n name: \"Cash\",\n symbol: \"CASH\",\n decimals: 18,\n l2_token_address: \"0x498edfaf50ca5855666a700c25dd629d577eb9afccdf3b5977aec79aee55ada\",\n sort_order: 3,\n total_supply: null,\n hidden: false,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/6bd6d156-f509-4b51-5dfc-3ee566143600/logo\"\n },\n {\n name: \"Nums\",\n symbol: \"NUMS\",\n decimals: 18,\n l2_token_address: \"0xe5f10eddc01699dc899a30dbc3c9858148fa4aa0a47c0ffd85f887ffc4653e\",\n sort_order: 1,\n total_supply: 1,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/90868d05-cb75-4c42-278c-5a540db2cf00/logo\"\n },\n {\n name: \"Flip\",\n symbol: \"FLIP\",\n decimals: 18,\n l2_token_address: \"0x01bfe97d729138fc7c2d93c77d6d1d8a24708d5060608017d9b384adf38f04c7\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/275f0fa8-a691-471c-ace6-0eb0315dde00/logo\"\n },\n {\n name: \"Eternum Stone\",\n symbol: \"STONE\",\n decimals: 18,\n l2_token_address: \"0x439a1c010e3e1bb2d43d43411000893c0042bd88f6c701611a0ea914d426da4\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/932e7f83-a4c2-40f0-3048-35af3b194100/logo\"\n },\n {\n name: \"Eternum Coal\",\n symbol: \"COAL\",\n decimals: 18,\n l2_token_address: \"0xce635e3f241b0ae78c46a929d84a9101910188f9c4024eaa7559556503c31a\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/cf2ee180-06bf-4443-e3aa-724d7c28e800/logo\"\n },\n {\n name: \"Eternum Wood\",\n symbol: \"WOOD\",\n decimals: 18,\n l2_token_address: \"0x40d8907cec0f7ae9c364dfb12485a1314d84c129bf1898d2f3d4b7fcc7d44f4\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/1db5f954-c1ef-447e-9f8f-05bd9f3b2b00/logo\"\n },\n {\n name: \"Eternum Copper\",\n symbol: \"COPPER\",\n decimals: 18,\n l2_token_address: \"0x66ed5c928ee027a9419ace1cbea8389885161db5572a7c5c4fef2310e9bf494\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/6bbcdcc9-6146-404d-9501-92a664cf3100/logo\"\n },\n {\n name: \"Eternum Ironwood\",\n symbol: \"IRONWOOD\",\n decimals: 18,\n l2_token_address: \"0x1720cf6318bff45e62acc588680ae3cd4d5f8465b1d52cb710533c9299b031a\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/5af7c03b-e4ae-4aee-eba4-a4e2160a1d00/logo\"\n },\n {\n name: \"Eternum Obsidian\",\n symbol: \"OBSIDIAN\",\n decimals: 18,\n l2_token_address: \"0x3b6448d09dcd023507376402686261f5d6739455fa02f804907b066e488da66\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/8be9bc66-486b-4181-6804-725a1db8ad00/logo\"\n },\n {\n name: \"Eternum Gold\",\n symbol: \"GOLD\",\n decimals: 18,\n l2_token_address: \"0xdff9dca192609c4e86ab3be22c7ec1e968876c992d21986f3c542be97fa2f\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/fb9e90f7-3c2f-4c64-7e43-c3f694f35e00/logo\"\n },\n {\n name: \"Eternum Silver\",\n symbol: \"SILVER\",\n decimals: 18,\n l2_token_address: \"0x6fe21d2d4a8a05bdb70f09c9250af9870020d5dcc35f410b4a39d6605c3e353\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/e443afeb-850b-46a0-a7ba-a473306d6b00/logo\"\n },\n {\n name: \"Eternum Mithral\",\n symbol: \"MITHRAL\",\n decimals: 18,\n l2_token_address: \"0x67ba235c569c23877064b2ac6ebd4d79f32d3c00f5fab8e28a3b5700b957f6\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/33dc517f-8a66-45eb-f2c5-de5388e47500/logo\"\n },\n {\n name: \"Eternum Alchemical Silver\",\n symbol: \"ALCHEMICALSILVER\",\n decimals: 18,\n l2_token_address: \"0x3956a5301e99522038a2e7dcb9c2a89bf087ffa79310ee0a508b5538efd8ddd\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/3d2e0fd8-4af8-49a0-4bdb-691a4d6ef800/logo\"\n },\n {\n name: \"Eternum Cold Iron\",\n symbol: \"COLDIRON\",\n decimals: 18,\n l2_token_address: \"0x555d713e59d4ff96b7960447e9bc9e79bfdeab5b0eea74e3df81bce61cfbc77\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/878c0d8a-8e2c-4281-0896-9cbbb2ef9400/logo\"\n },\n {\n name: \"Eternum Deep Crystal\",\n symbol: \"DEEPCRYSTAL\",\n decimals: 18,\n l2_token_address: \"0x1d655ac834d38df7921074fc1588411e202b1af83307cbd996983aff52db3a8\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/1c2c954f-448c-476b-a4a6-19b52efe3e00/logo\"\n },\n {\n name: \"Eternum Ruby\",\n symbol: \"RUBY\",\n decimals: 18,\n l2_token_address: \"0x3d9b66720959d0e7687b898292c10e62e78626f2dba5e1909961a2ce3f86612\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/6a45b34d-3bfe-4994-45b0-f2bee8abac00/logo\"\n },\n {\n name: \"Eternum Diamonds\",\n symbol: \"DIAMONDS\",\n decimals: 18,\n l2_token_address: \"0xe03ea8ae385f64754820af5c01c36abf1b8130dd6797d3fd9d430e4114e876\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/b1fa609d-8799-4754-cdea-ab69514ca700/logo\"\n },\n {\n name: \"Eternum Hartwood\",\n symbol: \"HARTWOOD\",\n decimals: 18,\n l2_token_address: \"0x5620aa7170cd66dbcbc37d03087bfe4633ffef91d3e4d97b501de906004f79b\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/27e37e85-91bd-4ee1-0552-1e0795077400/logo\"\n },\n {\n name: \"Eternum Ignium\",\n symbol: \"IGNIUM\",\n decimals: 18,\n l2_token_address: \"0x625c1f789b03ebebc7a9322366f38ebad1f693b84b2abd8cb8f5b2748b0cdd5\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/58591e20-24fb-4353-417a-81d877a5a200/logo\"\n },\n {\n name: \"Eternum Twilight Quartz\",\n symbol: \"TWILIGHTQUARTZ\",\n decimals: 18,\n l2_token_address: \"0x35e24c02409c3cfe8d5646399a62c4d102bb782938d5f5180e92c9c62d3faf7\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/2f8cb892-e82a-4af3-bd09-316061faec00/logo\"\n },\n {\n name: \"Eternum True Ice\",\n symbol: \"TRUEICE\",\n decimals: 18,\n l2_token_address: \"0x4485f5a6e16562e1c761cd348e63256d00389e3ddf4f5d98afe7ab44c57c481\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/fe4bfc17-6553-4dc5-58d2-f452b4aa8a00/logo\"\n },\n {\n name: \"Eternum Adamantine\",\n symbol: \"ADAMANTINE\",\n decimals: 18,\n l2_token_address: \"0x367f838f85a2f5e1580d6f011e4476f581083314cff8721ba3dda9706076eed\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/13bd026b-3612-480e-0119-04cf4c505a00/logo\"\n },\n {\n name: \"Eternum Sapphire\",\n symbol: \"SAPPHIRE\",\n decimals: 18,\n l2_token_address: \"0x2f8dd022568af8f9f718aa37707a9b858529db56910633a160456838b6cbcbc\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/0ebf555f-e732-4054-f8e5-55b2ed49ba00/logo\"\n },\n {\n name: \"Eternum Ethereal Silica\",\n symbol: \"ETHEREALSILICA\",\n decimals: 18,\n l2_token_address: \"0x68b6e23cbbd58a644700f55e96c83580921e9f521b6e5175396b53ba7910e7d\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/f02a5b43-bfcf-408c-7d1b-fcfe68b02d00/logo\"\n },\n {\n name: \"Eternum Dragon Hide\",\n symbol: \"DRAGONHIDE\",\n decimals: 18,\n l2_token_address: \"0x3bf856515bece3c93f5061b7941b8645f817a0acab93c758b8c7b4bc0afa3c6\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/e74955fc-5c8a-4dff-4882-a49a46a5a800/logo\"\n },\n {\n name: \"Eternum Ancient Fragment\",\n symbol: \"ANCIENTFRAGMENT\",\n decimals: 18,\n l2_token_address: \"0x0695b08ecdfdd828c2e6267da62f59e6d7543e690ef56a484df25c8566b332a5\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/9af855b7-4790-4390-9466-6bed4481ab00/logo\"\n },\n {\n name: \"Eternum Donkey\",\n symbol: \"DONKEY\",\n decimals: 18,\n l2_token_address: \"0x264be95a4a2ace20add68cb321acdccd2f9f8440ee1c7abd85da44ddab01085\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/20817378-a45e-4521-f464-10f6dd13c500/logo\"\n },\n {\n name: \"Eternum Knight\",\n symbol: \"KNIGHT\",\n decimals: 18,\n l2_token_address: \"0xac965f9e67164723c16735a9da8dbc9eb8e43b1bd0323591e87c056badf606\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/8787ed1f-af5c-4873-c01a-55f05e999a00/logo\"\n },\n {\n name: \"Eternum Crossbowman\",\n symbol: \"CROSSBOWMAN\",\n decimals: 18,\n l2_token_address: \"0x67e4ac00a241be06ba6afc11fa2715ec7da0c42c05a67ef6ecfcfeda725aaa8\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/dec7f31b-4b1d-46bb-4fca-c0253cf55a00/logo\"\n },\n {\n name: \"Eternum Paladin\",\n symbol: \"PALADIN\",\n decimals: 18,\n l2_token_address: \"0x3bc86299bee061c7c8d7546ccb62b9daf9bffc653b1508facb722c6593874bc\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/7d2cd5a5-f38a-49f6-11f8-ba3b59a59e00/logo\"\n },\n {\n name: \"Eternum Wheat\",\n symbol: \"WHEAT\",\n decimals: 18,\n l2_token_address: \"0x57a3f1ee475e072ce3be41785c0e889b7295d7a0dcc22b992c5b9408dbeb280\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/c338b6a8-77c4-4dd6-34f5-1af0d3fb1e00/logo\"\n },\n {\n name: \"Eternum Fish\",\n symbol: \"FISH\",\n decimals: 18,\n l2_token_address: \"0x27719173cfe10f1aa38d2aaed0a075b6077290f1e817aa3485d2b828394f4d9\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/6deef27f-df40-4248-4e1b-ed1d79a3f000/logo\"\n },\n {\n name: \"Fools\",\n symbol: \"FOOLS\",\n decimals: 18,\n l2_token_address: \"0x068a7a07e08fc3e723a878223d00f669106780d5ea6665eb15d893476d47bf3b\",\n sort_order: 1,\n total_supply: null,\n logo_url: \"https://assets.underware.gg/pistols/fools.svg\"\n },\n {\n name: \"Fame\",\n symbol: \"FAME\",\n decimals: 18,\n l2_token_address: \"0x02549653a4ae1ff8d04a20b8820a49cbe97486c536ec0e4c8f68aa33d80067cf\",\n sort_order: 1,\n total_supply: null,\n logo_url: \"https://assets.underware.gg/pistols/fame.svg\"\n },\n {\n name: \"Survivor\",\n symbol: \"SURVIVOR\",\n decimals: 18,\n l2_token_address: \"0x42dd777885ad2c116be96d4d634abc90a26a790ffb5871e037dd5ae7d2ec86b\",\n sort_order: 1,\n total_supply: null,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/399cb277-f675-4efe-97fb-fac94a236a00/logo\"\n },\n {\n name: \"Dungeon Ticket\",\n symbol: \"TICKET\",\n decimals: 18,\n l2_token_address: \"0x035f581b050a39958b7188ab5c75daaa1f9d3571a0c032203038c898663f31f8\",\n sort_order: 1,\n total_supply: null,\n logo_url: \"\thttps://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/f96b51e2-e978-42e2-c67a-e84159015000/logo\"\n }\n];\n\n// configs/cartridge/config.json\nvar config_default = {\n origin: \"*\",\n theme: {\n name: \"Cartridge\",\n icon: \"icon.svg\"\n },\n \"apple-app-site-association\": {\n webcredentials: {\n apps: [\n \"FAKETEAMID.com.cartridge.marketplace\",\n \"F9U4Y5YSTN.com.cartridge.marketplace\"\n ]\n }\n }\n};\n\n// src/config-loader.ts\nvar CONFIG_BASE_URL = \"https://static.cartridge.gg/presets\";\nasync function getConfigsIndex() {\n try {\n const response = await fetch(`${CONFIG_BASE_URL}/index.json`);\n if (!response.ok) {\n throw new Error(`Failed to load configs index: ${response.statusText}`);\n }\n return await response.json();\n } catch (error) {\n console.error(\"Error loading configs index:\", error);\n return { configs: [], baseUrl: CONFIG_BASE_URL };\n }\n}\nasync function getAvailableConfigs() {\n const indexData = await getConfigsIndex();\n return indexData.configs;\n}\nasync function loadConfig(configName) {\n try {\n const indexData = await getConfigsIndex();\n const baseUrl = indexData.baseUrl || CONFIG_BASE_URL;\n const prefix = `${baseUrl}/${configName}`;\n const response = await fetch(`${prefix}/config.json`);\n if (!response.ok) {\n throw new Error(\n `Failed to load config ${configName}: ${response.statusText}`\n );\n }\n const config = await response.json();\n if (config && config.theme) {\n if (config.theme.icon && !config.theme.icon.startsWith(\"http\")) {\n config.theme.icon = `${prefix}/${config.theme.icon}`;\n }\n if (config.theme.cover) {\n if (typeof config.theme.cover === \"string\") {\n if (!config.theme.cover.startsWith(\"http\")) {\n config.theme.cover = `${prefix}/${config.theme.cover}`;\n }\n } else {\n if (config.theme.cover.light && !config.theme.cover.light.startsWith(\"http\")) {\n config.theme.cover.light = `${prefix}/${config.theme.cover.light}`;\n }\n if (config.theme.cover.dark && !config.theme.cover.dark.startsWith(\"http\")) {\n config.theme.cover.dark = `${prefix}/${config.theme.cover.dark}`;\n }\n }\n }\n const prefixOptimizedImageSet = (imageSet) => {\n if (!imageSet) return;\n for (const format in imageSet) {\n if (imageSet[format]) {\n for (const size in imageSet[format]) {\n if (imageSet[format][size] && !imageSet[format][size].startsWith(\"http\")) {\n imageSet[format][size] = `${prefix}/${imageSet[format][size]}`;\n }\n }\n }\n }\n };\n if (config.theme.optimizedIcon) {\n prefixOptimizedImageSet(config.theme.optimizedIcon);\n }\n if (config.theme.optimizedCover) {\n if (typeof config.theme.optimizedCover === \"string\") {\n if (!config.theme.optimizedCover.startsWith(\"http\")) {\n config.theme.optimizedCover = `${prefix}/${config.theme.optimizedCover}`;\n }\n } else if (config.theme.optimizedCover.light || config.theme.optimizedCover.dark) {\n const themeVal = config.theme.optimizedCover;\n if (themeVal.light) {\n prefixOptimizedImageSet(themeVal.light);\n }\n if (themeVal.dark) {\n prefixOptimizedImageSet(themeVal.dark);\n }\n } else {\n prefixOptimizedImageSet(config.theme.optimizedCover);\n }\n }\n }\n return config;\n } catch (error) {\n console.error(`Error loading config ${configName}:`, error);\n return null;\n }\n}\nasync function loadAllConfigs() {\n const indexData = await getConfigsIndex();\n const availableConfigs = indexData.configs;\n const baseUrl = indexData.baseUrl || CONFIG_BASE_URL;\n const configsMap = {};\n await Promise.all(\n availableConfigs.map(async (configName) => {\n try {\n const response = await fetch(`${baseUrl}/${configName}/config.json`);\n if (response.ok) {\n const config = await response.json();\n configsMap[configName] = config;\n }\n } catch (error) {\n console.error(`Error loading config ${configName}:`, error);\n }\n })\n );\n return configsMap;\n}\n\n// src/index.ts\nconfig_default.theme.icon = \"https://static.cartridge.gg/presets/cartridge/icon.svg\";\nvar erc20Metadata = metadata;\nvar defaultTheme = config_default.theme;\nexport {\n defaultTheme,\n erc20Metadata,\n getAvailableConfigs,\n getConfigsIndex,\n loadAllConfigs,\n loadConfig\n};\n//# sourceMappingURL=index.js.map"],"names":["AUTH_EXTERNAL_WALLETS","EXTRA_EXTERNAL_WALLETS","EXTERNAL_WALLETS","EMBEDDED_WALLETS","ALL_AUTH_OPTIONS","IMPLEMENTED_AUTH_OPTIONS","ResponseCodes","FeeSource","ALLOWED_PROPERTIES","validatePropertyName","prop","safeObjectAccess","obj","normalizeCalls","calls","toArray","call","addAddressPadding","CallData","getPresetSessionPolicies","config","chainId","decodedChainId","shortString","chainConfig","toSessionPolicies","policies","prev","p","target","getChecksumAddress","entrypoint","contracts","item","humanizeString","methods","toWasmPolicies","a","b","m","hash","domainHash","typedData","TypedDataRevision","typeHash","val","str","c","parseChainId","url","parts","xhr","requestBody","response","error","constants","projectName","isMobile","sanitizeImageSrc","src","KEYCHAIN_URL","API_URL","REDIRECT_QUERY_NAME","NotReadyToConnect","HeadlessAuthenticationError","message","cause","InvalidCredentialsError","credentialType","HeadlessModeNotSupportedError","operation","Permission","icon","releaseStub","Mutex","bypass","release","lastPromise","resolve","mutex","BaseProvider","manifest","result","silentMode","params","event","handler","idx","sub","accounts","parsePolicies","address","contract","method","metadata","config_default","CONFIG_BASE_URL","getConfigsIndex","getAvailableConfigs","loadConfig","configName","prefix","prefixOptimizedImageSet","imageSet","format","size","themeVal","loadAllConfigs","indexData","availableConfigs","baseUrl","configsMap","erc20Metadata","defaultTheme"],"mappings":"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","x_google_ignoreList":[5,10]}
|