@cartridge/controller 0.13.6 → 0.13.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.
@@ -1,16 +1,26 @@
1
1
 
2
- > @cartridge/controller@0.13.6 build:deps /home/runner/work/controller/controller/packages/controller
2
+ > @cartridge/controller@0.13.7 build:deps /home/runner/work/controller/controller/packages/controller
3
3
  > pnpm build
4
4
 
5
5
 
6
- > @cartridge/controller@0.13.6 build /home/runner/work/controller/controller/packages/controller
6
+ > @cartridge/controller@0.13.7 build /home/runner/work/controller/controller/packages/controller
7
7
  > pnpm build:browser && pnpm build:node
8
8
 
9
9
 
10
- > @cartridge/controller@0.13.6 build:browser /home/runner/work/controller/controller/packages/controller
10
+ > @cartridge/controller@0.13.7 build:browser /home/runner/work/controller/controller/packages/controller
11
11
  > vite build
12
12
 
13
13
  vite v6.3.4 building for production...
14
+ src/lookup.ts:116:7 - error TS2322: Type 'string[]' is not assignable to type '("base" | "metamask" | "rabby" | "phantom-evm" | "argent" | "braavos" | "phantom" | "google" | "webauthn" | "discord" | "walletconnect" | "password")[]'.
15
+ Type 'string' is not assignable to type '"base" | "metamask" | "rabby" | "phantom-evm" | "argent" | "braavos" | "phantom" | "google" | "webauthn" | "discord" | "walletconnect" | "password"'.
16
+
17
+ 116 const HEADLESS_AUTH_OPTIONS: AuthOption[] = [
18
+    ~~~~~~~~~~~~~~~~~~~~~
19
+ src/lookup.ts:125:56 - error TS2345: Argument of type 'string' is not assignable to parameter of type '"metamask" | "rabby" | "phantom-evm" | "google" | "webauthn" | "discord" | "walletconnect" | "password"'.
20
+
21
+ 125 ].filter((option) => IMPLEMENTED_AUTH_OPTIONS.includes(option));
22
+    ~~~~~~
23
+
14
24
  transforming...
15
25
  ../../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
26
 
@@ -41,13 +51,13 @@ rendering chunks...
41
51
  [vite:dts] Start generate declaration files...
42
52
  computing gzip size...
43
53
  dist/session.js  10.53 kB │ gzip: 3.24 kB │ map: 25.46 kB
44
- dist/index-BdTFKueB.js  38.34 kB │ gzip: 12.80 kB │ map: 81.00 kB
45
- dist/index.js 186.49 kB │ gzip: 49.14 kB │ map: 569.43 kB
46
- [vite:dts] Declaration files built in 3707ms.
54
+ dist/index-CYAUAqql.js  38.34 kB │ gzip: 12.80 kB │ map: 81.12 kB
55
+ dist/index.js 188.96 kB │ gzip: 49.77 kB │ map: 576.04 kB
56
+ [vite:dts] Declaration files built in 3626ms.
47
57
 
48
- ✓ built in 5.77s
58
+ ✓ built in 5.76s
49
59
 
50
- > @cartridge/controller@0.13.6 build:node /home/runner/work/controller/controller/packages/controller
60
+ > @cartridge/controller@0.13.7 build:node /home/runner/work/controller/controller/packages/controller
51
61
  > tsup --config tsup.node.config.ts
52
62
 
53
63
  CLI Building entry: src/node/index.ts
@@ -58,16 +68,16 @@ computing gzip size...
58
68
  CLI Cleaning output folder
59
69
  ESM Build start
60
70
  CJS Build start
61
- "constants" and "shortString" are imported from external module "starknet" but never used in "dist/node/index.js".
62
71
  "constants" and "shortString" are imported from external module "starknet" but never used in "dist/node/index.cjs".
63
72
  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
- ESM dist/node/index.js 23.50 KB
65
- ESM dist/node/index.js.map 56.57 KB
66
- ESM ⚡️ Build success in 359ms
73
+ "constants" and "shortString" are imported from external module "starknet" but never used in "dist/node/index.js".
67
74
  CJS dist/node/index.cjs 24.40 KB
68
75
  CJS dist/node/index.cjs.map 56.82 KB
69
- CJS ⚡️ Build success in 357ms
76
+ CJS ⚡️ Build success in 326ms
77
+ ESM dist/node/index.js 23.50 KB
78
+ ESM dist/node/index.js.map 56.57 KB
79
+ ESM ⚡️ Build success in 326ms
70
80
  DTS Build start
71
- DTS ⚡️ Build success in 3125ms
81
+ DTS ⚡️ Build success in 3096ms
72
82
  DTS dist/node/index.d.ts 6.42 KB
73
83
  DTS dist/node/index.d.cts 6.42 KB
@@ -1,12 +1,22 @@
1
1
 
2
- > @cartridge/controller@0.13.6 build /home/runner/work/controller/controller/packages/controller
2
+ > @cartridge/controller@0.13.7 build /home/runner/work/controller/controller/packages/controller
3
3
  > pnpm build:browser && pnpm build:node
4
4
 
5
5
 
6
- > @cartridge/controller@0.13.6 build:browser /home/runner/work/controller/controller/packages/controller
6
+ > @cartridge/controller@0.13.7 build:browser /home/runner/work/controller/controller/packages/controller
7
7
  > vite build
8
8
 
9
9
  vite v6.3.4 building for production...
10
+ src/lookup.ts:116:7 - error TS2322: Type '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
+ 116 const HEADLESS_AUTH_OPTIONS: AuthOption[] = [
14
+    ~~~~~~~~~~~~~~~~~~~~~
15
+ src/lookup.ts:125:56 - error TS2345: Argument of type 'string' is not assignable to parameter of type '"metamask" | "rabby" | "phantom-evm" | "google" | "webauthn" | "discord" | "walletconnect" | "password"'.
16
+
17
+ 125 ].filter((option) => IMPLEMENTED_AUTH_OPTIONS.includes(option));
18
+    ~~~~~~
19
+
10
20
  transforming...
11
21
  ../../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
12
22
 
@@ -37,13 +47,13 @@ rendering chunks...
37
47
  [vite:dts] Start generate declaration files...
38
48
  computing gzip size...
39
49
  dist/session.js  10.53 kB │ gzip: 3.24 kB │ map: 25.46 kB
40
- dist/index-BdTFKueB.js  38.34 kB │ gzip: 12.80 kB │ map: 81.00 kB
41
- dist/index.js 186.49 kB │ gzip: 49.14 kB │ map: 569.43 kB
42
- [vite:dts] Declaration files built in 3504ms.
50
+ dist/index-CYAUAqql.js  38.34 kB │ gzip: 12.80 kB │ map: 81.12 kB
51
+ dist/index.js 188.96 kB │ gzip: 49.77 kB │ map: 576.04 kB
52
+ [vite:dts] Declaration files built in 3619ms.
43
53
 
44
- ✓ built in 5.59s
54
+ ✓ built in 5.80s
45
55
 
46
- > @cartridge/controller@0.13.6 build:node /home/runner/work/controller/controller/packages/controller
56
+ > @cartridge/controller@0.13.7 build:node /home/runner/work/controller/controller/packages/controller
47
57
  > tsup --config tsup.node.config.ts
48
58
 
49
59
  CLI Building entry: src/node/index.ts
@@ -59,11 +69,11 @@ computing gzip size...
59
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.
60
70
  ESM dist/node/index.js 23.50 KB
61
71
  ESM dist/node/index.js.map 56.57 KB
62
- ESM ⚡️ Build success in 323ms
72
+ ESM ⚡️ Build success in 289ms
63
73
  CJS dist/node/index.cjs 24.40 KB
64
74
  CJS dist/node/index.cjs.map 56.82 KB
65
- CJS ⚡️ Build success in 324ms
75
+ CJS ⚡️ Build success in 289ms
66
76
  DTS Build start
67
- DTS ⚡️ Build success in 3326ms
77
+ DTS ⚡️ Build success in 3087ms
68
78
  DTS dist/node/index.d.ts 6.42 KB
69
79
  DTS dist/node/index.d.cts 6.42 KB
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 SDK without displaying any UI. You trigger headless mode by passing a `username` and `signer` to `connect(...)`.
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
- the approval UI and resolve once the session is approved.
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 uses the **existing signers** on the controller for the given username.
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.
@@ -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.6", Q = {
2
+ const E = "0.13.7", Q = {
3
3
  version: E
4
4
  }, M = [
5
5
  "metamask",
@@ -1041,13 +1041,13 @@ export {
1041
1041
  D as E,
1042
1042
  O as F,
1043
1043
  m as H,
1044
- A as I,
1044
+ V as I,
1045
1045
  ee as K,
1046
1046
  _ as N,
1047
1047
  Y as R,
1048
- j as a,
1049
- G as b,
1050
- V as c,
1048
+ A as a,
1049
+ j as b,
1050
+ G as c,
1051
1051
  L as d,
1052
1052
  X as e,
1053
1053
  oe as f,
@@ -1069,4 +1069,4 @@ export {
1069
1069
  E as v,
1070
1070
  re as w
1071
1071
  };
1072
- //# sourceMappingURL=index-BdTFKueB.js.map
1072
+ //# sourceMappingURL=index-CYAUAqql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-CYAUAqql.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+bac9813/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","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\",\n symbol: \"USDC\",\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: \"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","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]}