@cartridge/connector 0.13.11 → 0.13.13

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,5 +1,5 @@
1
1
 
2
- > @cartridge/connector@0.13.11 build:deps /home/runner/work/controller/controller/packages/connector
2
+ > @cartridge/connector@0.13.13 build:deps /home/runner/work/controller/controller/packages/connector
3
3
  > tsup --dts-resolve
4
4
 
5
5
  CLI Building entry: src/controller.ts, src/index.ts, src/session.ts
@@ -9,15 +9,15 @@
9
9
  CLI Target: esnext
10
10
  CLI Cleaning output folder
11
11
  ESM Build start
12
- ESM dist/controller.js 2.06 KB
13
- ESM dist/index.js 2.91 KB
12
+ ESM dist/controller.js 2.12 KB
13
+ ESM dist/index.js 2.96 KB
14
14
  ESM dist/session.js 916.00 B
15
- ESM dist/controller.js.map 4.31 KB
16
- ESM dist/index.js.map 5.99 KB
15
+ ESM dist/controller.js.map 4.42 KB
16
+ ESM dist/index.js.map 6.10 KB
17
17
  ESM dist/session.js.map 1.73 KB
18
- ESM ⚡️ Build success in 61ms
18
+ ESM ⚡️ Build success in 70ms
19
19
  DTS Build start
20
- DTS ⚡️ Build success in 5112ms
21
- DTS dist/index.d.ts 290.00 B
22
- DTS dist/controller.d.ts 1.10 KB
20
+ DTS ⚡️ Build success in 6111ms
21
+ DTS dist/index.d.ts 270.00 B
22
+ DTS dist/controller.d.ts 1.08 KB
23
23
  DTS dist/session.d.ts 476.00 B
package/README.md ADDED
@@ -0,0 +1,49 @@
1
+ # @cartridge/connector
2
+
3
+ Cartridge Controller connector for `starknet-react` and other StarkNet wallet libraries.
4
+
5
+ ## Why this package needs to be instantiated
6
+
7
+ The Cartridge Controller is iframe-based and requires per-app configuration (chains, paymaster, preset, etc.).
8
+ Unlike browser-extension wallets, it cannot auto-inject itself at page load — the dapp must construct it once at app startup.
9
+
10
+ When `ControllerConnector` is instantiated, it:
11
+
12
+ - Sets `window.starknet_controller` so legacy `window.starknet_*` discovery finds it.
13
+ - Calls `@wallet-standard/wallet`'s `registerWallet(...)` so any wallet-standard consumer (e.g. `starknet-start` via `@starknet-io/get-starknet-core`) discovers it through the standard event channel.
14
+
15
+ After that, discovery and disconnect work without further setup.
16
+
17
+ ## Integration paths
18
+
19
+ ### `starknet-react` v5
20
+
21
+ ```ts
22
+ import ControllerConnector from "@cartridge/connector";
23
+ import { StarknetConfig, publicProvider } from "@starknet-react/core";
24
+
25
+ const connectors = [new ControllerConnector(options)];
26
+
27
+ <StarknetConfig connectors={connectors} provider={publicProvider()}>
28
+ <App />
29
+ </StarknetConfig>;
30
+ ```
31
+
32
+ ### `starknet-start` (`@starknet-react/start`)
33
+
34
+ Instantiate `ControllerConnector` once at app startup with your config.
35
+ You don't need to pass it anywhere — the constructor side effect registers Cartridge with starknet-start's discovery.
36
+
37
+ ```ts
38
+ import ControllerConnector from "@cartridge/connector";
39
+
40
+ new ControllerConnector(options);
41
+ ```
42
+
43
+ For `recommendedWallets` lists, use `id: "controller"`.
44
+
45
+ ### Vanilla `get-starknet` / wallet-standard
46
+
47
+ Same pattern — instantiating `ControllerConnector` registers the wallet via `@wallet-standard/wallet`.
48
+
49
+ `controller.asWalletStandard()` is also exposed on the underlying `ControllerProvider` for callers that want the `WalletWithStarknetFeatures` wrapper directly without going through discovery.
@@ -1,4 +1,4 @@
1
- import * as _starknet_io_get_starknet_wallet_standard_features from '@starknet-io/get-starknet-wallet-standard/features';
1
+ import * as _starknet_io_get_starknet_core from '@starknet-io/get-starknet-core';
2
2
  import * as ControllerProvider from '@cartridge/controller';
3
3
  import ControllerProvider__default, { ControllerOptions, ConnectOptions } from '@cartridge/controller';
4
4
  import { InjectedConnector, Connector } from '@starknet-react/core';
@@ -8,6 +8,7 @@ declare class ControllerConnector extends InjectedConnector {
8
8
  constructor(options?: ControllerOptions);
9
9
  disconnect(): Promise<void>;
10
10
  username(): Promise<string> | undefined;
11
+ credits(): Promise<number> | undefined;
11
12
  lookupUsername(username: string): Promise<ControllerProvider.HeadlessUsernameLookupResult>;
12
13
  isReady(): boolean;
13
14
  delegateAccount(): Promise<string | null>;
@@ -18,7 +19,7 @@ declare class ControllerConnector extends InjectedConnector {
18
19
  chainId?: bigint;
19
20
  }>;
20
21
  static fromConnectors(connectors: Connector[]): ControllerConnector;
21
- asWalletStandard(): _starknet_io_get_starknet_wallet_standard_features.WalletWithStarknetFeatures;
22
+ asWalletStandard(): _starknet_io_get_starknet_core.WalletWithStarknetFeatures;
22
23
  }
23
24
 
24
25
  export { ControllerConnector as default };
@@ -26,6 +26,9 @@ var ControllerConnector = class extends InjectedConnector {
26
26
  username() {
27
27
  return this.controller.username();
28
28
  }
29
+ credits() {
30
+ return this.controller.credits();
31
+ }
29
32
  lookupUsername(username) {
30
33
  return this.controller.lookupUsername(username);
31
34
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/controller.ts"],"sourcesContent":["import ControllerProvider, {\n ConnectOptions,\n ControllerOptions,\n} from \"@cartridge/controller\";\nimport { Connector, InjectedConnector } from \"@starknet-react/core\";\n\nexport default class ControllerConnector extends InjectedConnector {\n public controller: ControllerProvider;\n\n constructor(options: ControllerOptions = {}) {\n let controller: ControllerProvider;\n\n if (typeof window !== \"undefined\" && (window as any).starknet_controller) {\n console.warn(\n \"ControllerConnector was instantiated multiple times. \" +\n \"Reusing existing controller to prevent errors. \" +\n \"To fix, create the connector at the module level instead of inside a React component.\",\n );\n controller = (window as any).starknet_controller;\n } else {\n controller = new ControllerProvider(options);\n }\n\n super({ options: { id: controller.id, name: controller.name } });\n this.controller = controller;\n }\n\n async disconnect() {\n await this.controller.disconnect();\n try {\n await super.disconnect();\n } catch {\n // Best-effort: starknet-react may call disconnect even when the injected wallet isn't present.\n }\n }\n\n username() {\n return this.controller.username();\n }\n\n lookupUsername(username: string) {\n return this.controller.lookupUsername(username);\n }\n\n isReady(): boolean {\n return this.controller.isReady();\n }\n\n async delegateAccount() {\n return await this.controller.delegateAccount();\n }\n\n async connect(args?: { chainIdHint?: bigint } & ConnectOptions) {\n const { chainIdHint, ...connectOptions } = args ?? {};\n const controllerArgs =\n args && Object.keys(connectOptions).length > 0\n ? (connectOptions as ConnectOptions)\n : undefined;\n\n const account = await this.controller.connect(controllerArgs);\n if (!account) {\n throw new Error(\"Failed to connect controller\");\n }\n\n // Ensure the injected wallet instance used by starknet-react (window.starknet_controller)\n // always points at the same ControllerProvider instance this connector wraps.\n if (typeof window !== \"undefined\") {\n (window as any).starknet_controller = this.controller;\n }\n\n const data = await super.connect({ chainIdHint });\n\n // `@starknet-react/core` updates its state from the `account` returned here.\n // Use the authoritative address from `controller.connect()` to avoid edge cases\n // where the injected wallet request returns an empty/undefined account.\n return { ...data, account: account.address };\n }\n\n static fromConnectors(connectors: Connector[]): ControllerConnector {\n const connector = connectors.find((c) => c.id === \"controller\");\n if (!connector) {\n throw new Error(\"Controller connector not found\");\n }\n return connector as ControllerConnector;\n }\n\n asWalletStandard() {\n return this.controller.asWalletStandard();\n }\n}\n"],"mappings":";AAAA,OAAO,wBAGA;AACP,SAAoB,yBAAyB;AAE7C,IAAqB,sBAArB,cAAiD,kBAAkB;AAAA,EAC1D;AAAA,EAEP,YAAY,UAA6B,CAAC,GAAG;AAC3C,QAAI;AAEJ,QAAI,OAAO,WAAW,eAAgB,OAAe,qBAAqB;AACxE,cAAQ;AAAA,QACN;AAAA,MAGF;AACA,mBAAc,OAAe;AAAA,IAC/B,OAAO;AACL,mBAAa,IAAI,mBAAmB,OAAO;AAAA,IAC7C;AAEA,UAAM,EAAE,SAAS,EAAE,IAAI,WAAW,IAAI,MAAM,WAAW,KAAK,EAAE,CAAC;AAC/D,SAAK,aAAa;AAAA,EACpB;AAAA,EAEA,MAAM,aAAa;AACjB,UAAM,KAAK,WAAW,WAAW;AACjC,QAAI;AACF,YAAM,MAAM,WAAW;AAAA,IACzB,QAAQ;AAAA,IAER;AAAA,EACF;AAAA,EAEA,WAAW;AACT,WAAO,KAAK,WAAW,SAAS;AAAA,EAClC;AAAA,EAEA,eAAe,UAAkB;AAC/B,WAAO,KAAK,WAAW,eAAe,QAAQ;AAAA,EAChD;AAAA,EAEA,UAAmB;AACjB,WAAO,KAAK,WAAW,QAAQ;AAAA,EACjC;AAAA,EAEA,MAAM,kBAAkB;AACtB,WAAO,MAAM,KAAK,WAAW,gBAAgB;AAAA,EAC/C;AAAA,EAEA,MAAM,QAAQ,MAAkD;AAC9D,UAAM,EAAE,aAAa,GAAG,eAAe,IAAI,QAAQ,CAAC;AACpD,UAAM,iBACJ,QAAQ,OAAO,KAAK,cAAc,EAAE,SAAS,IACxC,iBACD;AAEN,UAAM,UAAU,MAAM,KAAK,WAAW,QAAQ,cAAc;AAC5D,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,MAAM,8BAA8B;AAAA,IAChD;AAIA,QAAI,OAAO,WAAW,aAAa;AACjC,MAAC,OAAe,sBAAsB,KAAK;AAAA,IAC7C;AAEA,UAAM,OAAO,MAAM,MAAM,QAAQ,EAAE,YAAY,CAAC;AAKhD,WAAO,EAAE,GAAG,MAAM,SAAS,QAAQ,QAAQ;AAAA,EAC7C;AAAA,EAEA,OAAO,eAAe,YAA8C;AAClE,UAAM,YAAY,WAAW,KAAK,CAAC,MAAM,EAAE,OAAO,YAAY;AAC9D,QAAI,CAAC,WAAW;AACd,YAAM,IAAI,MAAM,gCAAgC;AAAA,IAClD;AACA,WAAO;AAAA,EACT;AAAA,EAEA,mBAAmB;AACjB,WAAO,KAAK,WAAW,iBAAiB;AAAA,EAC1C;AACF;","names":[]}
1
+ {"version":3,"sources":["../src/controller.ts"],"sourcesContent":["import ControllerProvider, {\n ConnectOptions,\n ControllerOptions,\n} from \"@cartridge/controller\";\nimport { Connector, InjectedConnector } from \"@starknet-react/core\";\n\nexport default class ControllerConnector extends InjectedConnector {\n public controller: ControllerProvider;\n\n constructor(options: ControllerOptions = {}) {\n let controller: ControllerProvider;\n\n if (typeof window !== \"undefined\" && (window as any).starknet_controller) {\n console.warn(\n \"ControllerConnector was instantiated multiple times. \" +\n \"Reusing existing controller to prevent errors. \" +\n \"To fix, create the connector at the module level instead of inside a React component.\",\n );\n controller = (window as any).starknet_controller;\n } else {\n controller = new ControllerProvider(options);\n }\n\n super({ options: { id: controller.id, name: controller.name } });\n this.controller = controller;\n }\n\n async disconnect() {\n await this.controller.disconnect();\n try {\n await super.disconnect();\n } catch {\n // Best-effort: starknet-react may call disconnect even when the injected wallet isn't present.\n }\n }\n\n username() {\n return this.controller.username();\n }\n\n credits() {\n return this.controller.credits();\n }\n\n lookupUsername(username: string) {\n return this.controller.lookupUsername(username);\n }\n\n isReady(): boolean {\n return this.controller.isReady();\n }\n\n async delegateAccount() {\n return await this.controller.delegateAccount();\n }\n\n async connect(args?: { chainIdHint?: bigint } & ConnectOptions) {\n const { chainIdHint, ...connectOptions } = args ?? {};\n const controllerArgs =\n args && Object.keys(connectOptions).length > 0\n ? (connectOptions as ConnectOptions)\n : undefined;\n\n const account = await this.controller.connect(controllerArgs);\n if (!account) {\n throw new Error(\"Failed to connect controller\");\n }\n\n // Ensure the injected wallet instance used by starknet-react (window.starknet_controller)\n // always points at the same ControllerProvider instance this connector wraps.\n if (typeof window !== \"undefined\") {\n (window as any).starknet_controller = this.controller;\n }\n\n const data = await super.connect({ chainIdHint });\n\n // `@starknet-react/core` updates its state from the `account` returned here.\n // Use the authoritative address from `controller.connect()` to avoid edge cases\n // where the injected wallet request returns an empty/undefined account.\n return { ...data, account: account.address };\n }\n\n static fromConnectors(connectors: Connector[]): ControllerConnector {\n const connector = connectors.find((c) => c.id === \"controller\");\n if (!connector) {\n throw new Error(\"Controller connector not found\");\n }\n return connector as ControllerConnector;\n }\n\n asWalletStandard() {\n return this.controller.asWalletStandard();\n }\n}\n"],"mappings":";AAAA,OAAO,wBAGA;AACP,SAAoB,yBAAyB;AAE7C,IAAqB,sBAArB,cAAiD,kBAAkB;AAAA,EAC1D;AAAA,EAEP,YAAY,UAA6B,CAAC,GAAG;AAC3C,QAAI;AAEJ,QAAI,OAAO,WAAW,eAAgB,OAAe,qBAAqB;AACxE,cAAQ;AAAA,QACN;AAAA,MAGF;AACA,mBAAc,OAAe;AAAA,IAC/B,OAAO;AACL,mBAAa,IAAI,mBAAmB,OAAO;AAAA,IAC7C;AAEA,UAAM,EAAE,SAAS,EAAE,IAAI,WAAW,IAAI,MAAM,WAAW,KAAK,EAAE,CAAC;AAC/D,SAAK,aAAa;AAAA,EACpB;AAAA,EAEA,MAAM,aAAa;AACjB,UAAM,KAAK,WAAW,WAAW;AACjC,QAAI;AACF,YAAM,MAAM,WAAW;AAAA,IACzB,QAAQ;AAAA,IAER;AAAA,EACF;AAAA,EAEA,WAAW;AACT,WAAO,KAAK,WAAW,SAAS;AAAA,EAClC;AAAA,EAEA,UAAU;AACR,WAAO,KAAK,WAAW,QAAQ;AAAA,EACjC;AAAA,EAEA,eAAe,UAAkB;AAC/B,WAAO,KAAK,WAAW,eAAe,QAAQ;AAAA,EAChD;AAAA,EAEA,UAAmB;AACjB,WAAO,KAAK,WAAW,QAAQ;AAAA,EACjC;AAAA,EAEA,MAAM,kBAAkB;AACtB,WAAO,MAAM,KAAK,WAAW,gBAAgB;AAAA,EAC/C;AAAA,EAEA,MAAM,QAAQ,MAAkD;AAC9D,UAAM,EAAE,aAAa,GAAG,eAAe,IAAI,QAAQ,CAAC;AACpD,UAAM,iBACJ,QAAQ,OAAO,KAAK,cAAc,EAAE,SAAS,IACxC,iBACD;AAEN,UAAM,UAAU,MAAM,KAAK,WAAW,QAAQ,cAAc;AAC5D,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,MAAM,8BAA8B;AAAA,IAChD;AAIA,QAAI,OAAO,WAAW,aAAa;AACjC,MAAC,OAAe,sBAAsB,KAAK;AAAA,IAC7C;AAEA,UAAM,OAAO,MAAM,MAAM,QAAQ,EAAE,YAAY,CAAC;AAKhD,WAAO,EAAE,GAAG,MAAM,SAAS,QAAQ,QAAQ;AAAA,EAC7C;AAAA,EAEA,OAAO,eAAe,YAA8C;AAClE,UAAM,YAAY,WAAW,KAAK,CAAC,MAAM,EAAE,OAAO,YAAY;AAC9D,QAAI,CAAC,WAAW;AACd,YAAM,IAAI,MAAM,gCAAgC;AAAA,IAClD;AACA,WAAO;AAAA,EACT;AAAA,EAEA,mBAAmB;AACjB,WAAO,KAAK,WAAW,iBAAiB;AAAA,EAC1C;AACF;","names":[]}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  export { default as ControllerConnector } from './controller.js';
2
2
  export { default as SessionConnector } from './session.js';
3
- import '@starknet-io/get-starknet-wallet-standard/features';
3
+ import '@starknet-io/get-starknet-core';
4
4
  import '@cartridge/controller';
5
5
  import '@starknet-react/core';
6
6
  import '@cartridge/controller/session';
package/dist/index.js CHANGED
@@ -26,6 +26,9 @@ var ControllerConnector = class extends InjectedConnector {
26
26
  username() {
27
27
  return this.controller.username();
28
28
  }
29
+ credits() {
30
+ return this.controller.credits();
31
+ }
29
32
  lookupUsername(username) {
30
33
  return this.controller.lookupUsername(username);
31
34
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/controller.ts","../src/session.ts"],"sourcesContent":["import ControllerProvider, {\n ConnectOptions,\n ControllerOptions,\n} from \"@cartridge/controller\";\nimport { Connector, InjectedConnector } from \"@starknet-react/core\";\n\nexport default class ControllerConnector extends InjectedConnector {\n public controller: ControllerProvider;\n\n constructor(options: ControllerOptions = {}) {\n let controller: ControllerProvider;\n\n if (typeof window !== \"undefined\" && (window as any).starknet_controller) {\n console.warn(\n \"ControllerConnector was instantiated multiple times. \" +\n \"Reusing existing controller to prevent errors. \" +\n \"To fix, create the connector at the module level instead of inside a React component.\",\n );\n controller = (window as any).starknet_controller;\n } else {\n controller = new ControllerProvider(options);\n }\n\n super({ options: { id: controller.id, name: controller.name } });\n this.controller = controller;\n }\n\n async disconnect() {\n await this.controller.disconnect();\n try {\n await super.disconnect();\n } catch {\n // Best-effort: starknet-react may call disconnect even when the injected wallet isn't present.\n }\n }\n\n username() {\n return this.controller.username();\n }\n\n lookupUsername(username: string) {\n return this.controller.lookupUsername(username);\n }\n\n isReady(): boolean {\n return this.controller.isReady();\n }\n\n async delegateAccount() {\n return await this.controller.delegateAccount();\n }\n\n async connect(args?: { chainIdHint?: bigint } & ConnectOptions) {\n const { chainIdHint, ...connectOptions } = args ?? {};\n const controllerArgs =\n args && Object.keys(connectOptions).length > 0\n ? (connectOptions as ConnectOptions)\n : undefined;\n\n const account = await this.controller.connect(controllerArgs);\n if (!account) {\n throw new Error(\"Failed to connect controller\");\n }\n\n // Ensure the injected wallet instance used by starknet-react (window.starknet_controller)\n // always points at the same ControllerProvider instance this connector wraps.\n if (typeof window !== \"undefined\") {\n (window as any).starknet_controller = this.controller;\n }\n\n const data = await super.connect({ chainIdHint });\n\n // `@starknet-react/core` updates its state from the `account` returned here.\n // Use the authoritative address from `controller.connect()` to avoid edge cases\n // where the injected wallet request returns an empty/undefined account.\n return { ...data, account: account.address };\n }\n\n static fromConnectors(connectors: Connector[]): ControllerConnector {\n const connector = connectors.find((c) => c.id === \"controller\");\n if (!connector) {\n throw new Error(\"Controller connector not found\");\n }\n return connector as ControllerConnector;\n }\n\n asWalletStandard() {\n return this.controller.asWalletStandard();\n }\n}\n","import SessionProvider, { SessionOptions } from \"@cartridge/controller/session\";\nimport { Connector, InjectedConnector } from \"@starknet-react/core\";\n\nexport default class SessionConnector extends InjectedConnector {\n public controller: SessionProvider;\n\n constructor(options: SessionOptions) {\n const controller = new SessionProvider(options);\n\n super({\n options: {\n id: controller.id,\n name: controller.name,\n },\n });\n\n this.controller = controller;\n }\n\n async disconnect() {\n await this.controller.disconnect();\n try {\n await super.disconnect();\n } catch {\n // Best-effort: disconnect should not throw if the injected wallet isn't available.\n }\n }\n\n static fromConnectors(connectors: Connector[]): SessionConnector {\n const connector = connectors.find((c) => c.id === \"controller_session\");\n if (!connector) {\n throw new Error(\"Session connector not found\");\n }\n return connector as SessionConnector;\n }\n\n username() {\n return this.controller.username();\n }\n}\n"],"mappings":";AAAA,OAAO,wBAGA;AACP,SAAoB,yBAAyB;AAE7C,IAAqB,sBAArB,cAAiD,kBAAkB;AAAA,EAC1D;AAAA,EAEP,YAAY,UAA6B,CAAC,GAAG;AAC3C,QAAI;AAEJ,QAAI,OAAO,WAAW,eAAgB,OAAe,qBAAqB;AACxE,cAAQ;AAAA,QACN;AAAA,MAGF;AACA,mBAAc,OAAe;AAAA,IAC/B,OAAO;AACL,mBAAa,IAAI,mBAAmB,OAAO;AAAA,IAC7C;AAEA,UAAM,EAAE,SAAS,EAAE,IAAI,WAAW,IAAI,MAAM,WAAW,KAAK,EAAE,CAAC;AAC/D,SAAK,aAAa;AAAA,EACpB;AAAA,EAEA,MAAM,aAAa;AACjB,UAAM,KAAK,WAAW,WAAW;AACjC,QAAI;AACF,YAAM,MAAM,WAAW;AAAA,IACzB,QAAQ;AAAA,IAER;AAAA,EACF;AAAA,EAEA,WAAW;AACT,WAAO,KAAK,WAAW,SAAS;AAAA,EAClC;AAAA,EAEA,eAAe,UAAkB;AAC/B,WAAO,KAAK,WAAW,eAAe,QAAQ;AAAA,EAChD;AAAA,EAEA,UAAmB;AACjB,WAAO,KAAK,WAAW,QAAQ;AAAA,EACjC;AAAA,EAEA,MAAM,kBAAkB;AACtB,WAAO,MAAM,KAAK,WAAW,gBAAgB;AAAA,EAC/C;AAAA,EAEA,MAAM,QAAQ,MAAkD;AAC9D,UAAM,EAAE,aAAa,GAAG,eAAe,IAAI,QAAQ,CAAC;AACpD,UAAM,iBACJ,QAAQ,OAAO,KAAK,cAAc,EAAE,SAAS,IACxC,iBACD;AAEN,UAAM,UAAU,MAAM,KAAK,WAAW,QAAQ,cAAc;AAC5D,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,MAAM,8BAA8B;AAAA,IAChD;AAIA,QAAI,OAAO,WAAW,aAAa;AACjC,MAAC,OAAe,sBAAsB,KAAK;AAAA,IAC7C;AAEA,UAAM,OAAO,MAAM,MAAM,QAAQ,EAAE,YAAY,CAAC;AAKhD,WAAO,EAAE,GAAG,MAAM,SAAS,QAAQ,QAAQ;AAAA,EAC7C;AAAA,EAEA,OAAO,eAAe,YAA8C;AAClE,UAAM,YAAY,WAAW,KAAK,CAAC,MAAM,EAAE,OAAO,YAAY;AAC9D,QAAI,CAAC,WAAW;AACd,YAAM,IAAI,MAAM,gCAAgC;AAAA,IAClD;AACA,WAAO;AAAA,EACT;AAAA,EAEA,mBAAmB;AACjB,WAAO,KAAK,WAAW,iBAAiB;AAAA,EAC1C;AACF;;;ACzFA,OAAO,qBAAyC;AAChD,SAAoB,qBAAAA,0BAAyB;AAE7C,IAAqB,mBAArB,cAA8CA,mBAAkB;AAAA,EACvD;AAAA,EAEP,YAAY,SAAyB;AACnC,UAAM,aAAa,IAAI,gBAAgB,OAAO;AAE9C,UAAM;AAAA,MACJ,SAAS;AAAA,QACP,IAAI,WAAW;AAAA,QACf,MAAM,WAAW;AAAA,MACnB;AAAA,IACF,CAAC;AAED,SAAK,aAAa;AAAA,EACpB;AAAA,EAEA,MAAM,aAAa;AACjB,UAAM,KAAK,WAAW,WAAW;AACjC,QAAI;AACF,YAAM,MAAM,WAAW;AAAA,IACzB,QAAQ;AAAA,IAER;AAAA,EACF;AAAA,EAEA,OAAO,eAAe,YAA2C;AAC/D,UAAM,YAAY,WAAW,KAAK,CAAC,MAAM,EAAE,OAAO,oBAAoB;AACtE,QAAI,CAAC,WAAW;AACd,YAAM,IAAI,MAAM,6BAA6B;AAAA,IAC/C;AACA,WAAO;AAAA,EACT;AAAA,EAEA,WAAW;AACT,WAAO,KAAK,WAAW,SAAS;AAAA,EAClC;AACF;","names":["InjectedConnector"]}
1
+ {"version":3,"sources":["../src/controller.ts","../src/session.ts"],"sourcesContent":["import ControllerProvider, {\n ConnectOptions,\n ControllerOptions,\n} from \"@cartridge/controller\";\nimport { Connector, InjectedConnector } from \"@starknet-react/core\";\n\nexport default class ControllerConnector extends InjectedConnector {\n public controller: ControllerProvider;\n\n constructor(options: ControllerOptions = {}) {\n let controller: ControllerProvider;\n\n if (typeof window !== \"undefined\" && (window as any).starknet_controller) {\n console.warn(\n \"ControllerConnector was instantiated multiple times. \" +\n \"Reusing existing controller to prevent errors. \" +\n \"To fix, create the connector at the module level instead of inside a React component.\",\n );\n controller = (window as any).starknet_controller;\n } else {\n controller = new ControllerProvider(options);\n }\n\n super({ options: { id: controller.id, name: controller.name } });\n this.controller = controller;\n }\n\n async disconnect() {\n await this.controller.disconnect();\n try {\n await super.disconnect();\n } catch {\n // Best-effort: starknet-react may call disconnect even when the injected wallet isn't present.\n }\n }\n\n username() {\n return this.controller.username();\n }\n\n credits() {\n return this.controller.credits();\n }\n\n lookupUsername(username: string) {\n return this.controller.lookupUsername(username);\n }\n\n isReady(): boolean {\n return this.controller.isReady();\n }\n\n async delegateAccount() {\n return await this.controller.delegateAccount();\n }\n\n async connect(args?: { chainIdHint?: bigint } & ConnectOptions) {\n const { chainIdHint, ...connectOptions } = args ?? {};\n const controllerArgs =\n args && Object.keys(connectOptions).length > 0\n ? (connectOptions as ConnectOptions)\n : undefined;\n\n const account = await this.controller.connect(controllerArgs);\n if (!account) {\n throw new Error(\"Failed to connect controller\");\n }\n\n // Ensure the injected wallet instance used by starknet-react (window.starknet_controller)\n // always points at the same ControllerProvider instance this connector wraps.\n if (typeof window !== \"undefined\") {\n (window as any).starknet_controller = this.controller;\n }\n\n const data = await super.connect({ chainIdHint });\n\n // `@starknet-react/core` updates its state from the `account` returned here.\n // Use the authoritative address from `controller.connect()` to avoid edge cases\n // where the injected wallet request returns an empty/undefined account.\n return { ...data, account: account.address };\n }\n\n static fromConnectors(connectors: Connector[]): ControllerConnector {\n const connector = connectors.find((c) => c.id === \"controller\");\n if (!connector) {\n throw new Error(\"Controller connector not found\");\n }\n return connector as ControllerConnector;\n }\n\n asWalletStandard() {\n return this.controller.asWalletStandard();\n }\n}\n","import SessionProvider, { SessionOptions } from \"@cartridge/controller/session\";\nimport { Connector, InjectedConnector } from \"@starknet-react/core\";\n\nexport default class SessionConnector extends InjectedConnector {\n public controller: SessionProvider;\n\n constructor(options: SessionOptions) {\n const controller = new SessionProvider(options);\n\n super({\n options: {\n id: controller.id,\n name: controller.name,\n },\n });\n\n this.controller = controller;\n }\n\n async disconnect() {\n await this.controller.disconnect();\n try {\n await super.disconnect();\n } catch {\n // Best-effort: disconnect should not throw if the injected wallet isn't available.\n }\n }\n\n static fromConnectors(connectors: Connector[]): SessionConnector {\n const connector = connectors.find((c) => c.id === \"controller_session\");\n if (!connector) {\n throw new Error(\"Session connector not found\");\n }\n return connector as SessionConnector;\n }\n\n username() {\n return this.controller.username();\n }\n}\n"],"mappings":";AAAA,OAAO,wBAGA;AACP,SAAoB,yBAAyB;AAE7C,IAAqB,sBAArB,cAAiD,kBAAkB;AAAA,EAC1D;AAAA,EAEP,YAAY,UAA6B,CAAC,GAAG;AAC3C,QAAI;AAEJ,QAAI,OAAO,WAAW,eAAgB,OAAe,qBAAqB;AACxE,cAAQ;AAAA,QACN;AAAA,MAGF;AACA,mBAAc,OAAe;AAAA,IAC/B,OAAO;AACL,mBAAa,IAAI,mBAAmB,OAAO;AAAA,IAC7C;AAEA,UAAM,EAAE,SAAS,EAAE,IAAI,WAAW,IAAI,MAAM,WAAW,KAAK,EAAE,CAAC;AAC/D,SAAK,aAAa;AAAA,EACpB;AAAA,EAEA,MAAM,aAAa;AACjB,UAAM,KAAK,WAAW,WAAW;AACjC,QAAI;AACF,YAAM,MAAM,WAAW;AAAA,IACzB,QAAQ;AAAA,IAER;AAAA,EACF;AAAA,EAEA,WAAW;AACT,WAAO,KAAK,WAAW,SAAS;AAAA,EAClC;AAAA,EAEA,UAAU;AACR,WAAO,KAAK,WAAW,QAAQ;AAAA,EACjC;AAAA,EAEA,eAAe,UAAkB;AAC/B,WAAO,KAAK,WAAW,eAAe,QAAQ;AAAA,EAChD;AAAA,EAEA,UAAmB;AACjB,WAAO,KAAK,WAAW,QAAQ;AAAA,EACjC;AAAA,EAEA,MAAM,kBAAkB;AACtB,WAAO,MAAM,KAAK,WAAW,gBAAgB;AAAA,EAC/C;AAAA,EAEA,MAAM,QAAQ,MAAkD;AAC9D,UAAM,EAAE,aAAa,GAAG,eAAe,IAAI,QAAQ,CAAC;AACpD,UAAM,iBACJ,QAAQ,OAAO,KAAK,cAAc,EAAE,SAAS,IACxC,iBACD;AAEN,UAAM,UAAU,MAAM,KAAK,WAAW,QAAQ,cAAc;AAC5D,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,MAAM,8BAA8B;AAAA,IAChD;AAIA,QAAI,OAAO,WAAW,aAAa;AACjC,MAAC,OAAe,sBAAsB,KAAK;AAAA,IAC7C;AAEA,UAAM,OAAO,MAAM,MAAM,QAAQ,EAAE,YAAY,CAAC;AAKhD,WAAO,EAAE,GAAG,MAAM,SAAS,QAAQ,QAAQ;AAAA,EAC7C;AAAA,EAEA,OAAO,eAAe,YAA8C;AAClE,UAAM,YAAY,WAAW,KAAK,CAAC,MAAM,EAAE,OAAO,YAAY;AAC9D,QAAI,CAAC,WAAW;AACd,YAAM,IAAI,MAAM,gCAAgC;AAAA,IAClD;AACA,WAAO;AAAA,EACT;AAAA,EAEA,mBAAmB;AACjB,WAAO,KAAK,WAAW,iBAAiB;AAAA,EAC1C;AACF;;;AC7FA,OAAO,qBAAyC;AAChD,SAAoB,qBAAAA,0BAAyB;AAE7C,IAAqB,mBAArB,cAA8CA,mBAAkB;AAAA,EACvD;AAAA,EAEP,YAAY,SAAyB;AACnC,UAAM,aAAa,IAAI,gBAAgB,OAAO;AAE9C,UAAM;AAAA,MACJ,SAAS;AAAA,QACP,IAAI,WAAW;AAAA,QACf,MAAM,WAAW;AAAA,MACnB;AAAA,IACF,CAAC;AAED,SAAK,aAAa;AAAA,EACpB;AAAA,EAEA,MAAM,aAAa;AACjB,UAAM,KAAK,WAAW,WAAW;AACjC,QAAI;AACF,YAAM,MAAM,WAAW;AAAA,IACzB,QAAQ;AAAA,IAER;AAAA,EACF;AAAA,EAEA,OAAO,eAAe,YAA2C;AAC/D,UAAM,YAAY,WAAW,KAAK,CAAC,MAAM,EAAE,OAAO,oBAAoB;AACtE,QAAI,CAAC,WAAW;AACd,YAAM,IAAI,MAAM,6BAA6B;AAAA,IAC/C;AACA,WAAO;AAAA,EACT;AAAA,EAEA,WAAW;AACT,WAAO,KAAK,WAAW,SAAS;AAAA,EAClC;AACF;","names":["InjectedConnector"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cartridge/connector",
3
- "version": "0.13.11",
3
+ "version": "0.13.13",
4
4
  "description": "Cartridge Controller Connector",
5
5
  "repository": {
6
6
  "type": "git",
@@ -44,15 +44,15 @@
44
44
  "@starknet-react/core": "^5.0.1"
45
45
  },
46
46
  "dependencies": {
47
- "@cartridge/controller": "0.13.11"
47
+ "@cartridge/controller": "0.13.13"
48
48
  },
49
49
  "devDependencies": {
50
- "@vitest/coverage-v8": "2.1.8",
50
+ "@vitest/coverage-v8": "^3.1.3",
51
51
  "prettier": "^3.4.2",
52
52
  "tsup": "^8.0.1",
53
53
  "typescript": "^5.7.3",
54
- "vitest": "2.1.8",
55
- "@cartridge/tsconfig": "0.13.11"
54
+ "vitest": "^3.1.3",
55
+ "@cartridge/tsconfig": "0.13.13"
56
56
  },
57
57
  "scripts": {
58
58
  "build:deps": "tsup --dts-resolve",
package/src/controller.ts CHANGED
@@ -38,6 +38,10 @@ export default class ControllerConnector extends InjectedConnector {
38
38
  return this.controller.username();
39
39
  }
40
40
 
41
+ credits() {
42
+ return this.controller.credits();
43
+ }
44
+
41
45
  lookupUsername(username: string) {
42
46
  return this.controller.lookupUsername(username);
43
47
  }