@starknet-io/get-starknet-discovery 5.0.0-beta.0 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1,47 +1,25 @@
1
1
  'use strict';
2
2
 
3
- const features = require('@starknet-io/get-starknet-wallet-standard/features');
4
3
  const metamask = require('@starknet-io/get-starknet-virtual-wallet/metamask');
4
+ const features = require('@starknet-io/get-starknet-wallet-standard/features');
5
5
  const getStarknetWalletStandard = require('@starknet-io/get-starknet-wallet-standard');
6
6
 
7
- function registerStandardWalletDiscovery(register) {
7
+ function registerEIP1193WalletFromEIP6963Discovery(eip1193Adapters, register) {
8
8
  if (typeof window === "undefined")
9
9
  return;
10
- const api = Object.freeze({ register });
11
- const handler = ({ detail: callback }) => {
12
- callback(api);
10
+ const handler = (event) => {
11
+ const { info, provider } = event.detail;
12
+ for (const adapter of eip1193Adapters) {
13
+ const wallet = adapter(info, provider);
14
+ if (wallet) {
15
+ register(wallet);
16
+ return;
17
+ }
18
+ }
13
19
  };
14
- window.addEventListener(
15
- "wallet-standard:register-wallet",
16
- handler
17
- );
18
- window.dispatchEvent(new AppReadyEvent(api));
19
- return () => window.removeEventListener(
20
- "wallet-standard:register-wallet",
21
- handler
22
- );
23
- }
24
- class AppReadyEvent extends Event {
25
- constructor(detail) {
26
- super("wallet-standard:app-ready", {
27
- bubbles: false,
28
- cancelable: false,
29
- composed: false
30
- });
31
- this.detail = detail;
32
- }
33
- get type() {
34
- return "wallet-standard:app-ready";
35
- }
36
- preventDefault() {
37
- throw new Error("preventDefault is deprecated");
38
- }
39
- stopImmediatePropagation() {
40
- throw new Error("stopImmediatePropagation is deprecated");
41
- }
42
- stopPropagation() {
43
- throw new Error("stopPropagation is deprecated");
44
- }
20
+ window.addEventListener("eip6963:announceProvider", handler);
21
+ window.dispatchEvent(new Event("eip6963:requestProvider"));
22
+ return () => window.removeEventListener("eip6963:announceProvider", handler);
45
23
  }
46
24
 
47
25
  function registerInjectedWalletDiscovery(register) {
@@ -91,22 +69,44 @@ function isStarknetWindowObject(wallet) {
91
69
  return STARKNET_WALLET_KEYS.every((key) => key in wallet);
92
70
  }
93
71
 
94
- function registerEIP1193WalletFromEIP6963Discovery(eip1193Adapters, register) {
72
+ function registerStandardWalletDiscovery(register) {
95
73
  if (typeof window === "undefined")
96
74
  return;
97
- const handler = (event) => {
98
- const { info, provider } = event.detail;
99
- for (const adapter of eip1193Adapters) {
100
- const wallet = adapter(info, provider);
101
- if (wallet) {
102
- register(wallet);
103
- return;
104
- }
105
- }
75
+ const api = Object.freeze({ register });
76
+ const handler = ({ detail: callback }) => {
77
+ callback(api);
106
78
  };
107
- window.addEventListener("eip6963:announceProvider", handler);
108
- window.dispatchEvent(new Event("eip6963:requestProvider"));
109
- return () => window.removeEventListener("eip6963:announceProvider", handler);
79
+ window.addEventListener(
80
+ "wallet-standard:register-wallet",
81
+ handler
82
+ );
83
+ window.dispatchEvent(new AppReadyEvent(api));
84
+ return () => window.removeEventListener(
85
+ "wallet-standard:register-wallet",
86
+ handler
87
+ );
88
+ }
89
+ class AppReadyEvent extends Event {
90
+ constructor(detail) {
91
+ super("wallet-standard:app-ready", {
92
+ bubbles: false,
93
+ cancelable: false,
94
+ composed: false
95
+ });
96
+ this.detail = detail;
97
+ }
98
+ get type() {
99
+ return "wallet-standard:app-ready";
100
+ }
101
+ preventDefault() {
102
+ throw new Error("preventDefault is deprecated");
103
+ }
104
+ stopImmediatePropagation() {
105
+ throw new Error("stopImmediatePropagation is deprecated");
106
+ }
107
+ stopPropagation() {
108
+ throw new Error("stopPropagation is deprecated");
109
+ }
110
110
  }
111
111
 
112
112
  const DEFAULT_EIP1193_ADAPTERS = [metamask.metaMaskVirtualWallet];
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/standard-wallet.ts","../src/injected-wallet.ts","../src/eip1193-wallet.ts","../src/store.ts"],"sourcesContent":["import type {\n WalletEventsWindow,\n WindowRegisterWalletEvent,\n WindowAppReadyEvent,\n WindowAppReadyEventAPI,\n Wallet,\n} from \"@wallet-standard/base\";\n\nexport function registerStandardWalletDiscovery(\n register: (wallet: Wallet) => () => void,\n) {\n if (typeof window === \"undefined\") return;\n\n const api = Object.freeze({ register });\n\n const handler = ({ detail: callback }: WindowRegisterWalletEvent) => {\n callback(api);\n };\n\n (window as WalletEventsWindow).addEventListener(\n \"wallet-standard:register-wallet\",\n handler,\n );\n\n (window as WalletEventsWindow).dispatchEvent(new AppReadyEvent(api));\n\n return () =>\n (window as WalletEventsWindow).removeEventListener(\n \"wallet-standard:register-wallet\",\n handler,\n );\n}\n\nclass AppReadyEvent extends Event implements WindowAppReadyEvent {\n constructor(public readonly detail: WindowAppReadyEventAPI) {\n super(\"wallet-standard:app-ready\", {\n bubbles: false,\n cancelable: false,\n composed: false,\n });\n }\n\n get type() {\n return \"wallet-standard:app-ready\" as const;\n }\n\n preventDefault(): never {\n throw new Error(\"preventDefault is deprecated\");\n }\n\n stopImmediatePropagation(): never {\n throw new Error(\"stopImmediatePropagation is deprecated\");\n }\n\n stopPropagation(): never {\n throw new Error(\"stopPropagation is deprecated\");\n }\n}\n","import { StarknetInjectedWallet } from \"@starknet-io/get-starknet-wallet-standard\";\nimport type { StarknetWindowObject } from \"@starknet-io/types-js\";\nimport type { Wallet } from \"@wallet-standard/base\";\n\nexport function registerInjectedWalletDiscovery(\n register: (wallet: Wallet) => () => void,\n): {\n unregister: () => void;\n refresh: () => void;\n} {\n if (typeof window === \"undefined\")\n return {\n unregister: () => {},\n refresh: () => {},\n };\n\n function refresh() {\n const injectedWallets = scanWindowForWallets(window);\n\n for (const wallet of injectedWallets) {\n register(new StarknetInjectedWallet(wallet));\n }\n }\n\n refresh();\n\n return {\n unregister: () => {},\n refresh,\n };\n}\n\nfunction scanWindowForWallets(window: Window): StarknetWindowObject[] {\n return Object.getOwnPropertyNames(window).reduce((wallets, key) => {\n if (key.startsWith(\"starknet\")) {\n const wallet = window[key];\n\n if (isStarknetWindowObject(wallet)) {\n wallets.push(wallet);\n }\n }\n\n return wallets;\n }, []);\n}\n\nconst STARKNET_WALLET_KEYS = [\n \"id\",\n \"name\",\n \"version\",\n \"icon\",\n \"request\",\n \"on\",\n \"off\",\n];\n\nfunction isStarknetWindowObject(\n wallet: unknown,\n): wallet is StarknetWindowObject {\n if (typeof wallet !== \"object\" || wallet === null) return false;\n return STARKNET_WALLET_KEYS.every((key) => key in wallet);\n}\n","import type { EIP1193Adapter } from \"@starknet-io/get-starknet-virtual-wallet\";\nimport type { Wallet } from \"@wallet-standard/base\";\n\nexport function registerEIP1193WalletFromEIP6963Discovery(\n eip1193Adapters: EIP1193Adapter[],\n register: (wallet: Wallet) => () => void,\n) {\n if (typeof window === \"undefined\") return;\n\n const handler = (event: CustomEvent) => {\n const { info, provider } = event.detail;\n for (const adapter of eip1193Adapters) {\n const wallet = adapter(info, provider);\n if (wallet) {\n register(wallet);\n return;\n }\n }\n };\n\n window.addEventListener(\"eip6963:announceProvider\", handler);\n\n window.dispatchEvent(new Event(\"eip6963:requestProvider\"));\n\n return () => window.removeEventListener(\"eip6963:announceProvider\", handler);\n}\n","import {\n type WalletWithStarknetFeatures,\n isStarknetWallet,\n} from \"@starknet-io/get-starknet-wallet-standard/features\";\nimport type { EIP1193Adapter } from \"@starknet-io/get-starknet-virtual-wallet\";\nimport { metaMaskVirtualWallet } from \"@starknet-io/get-starknet-virtual-wallet/metamask\";\n\nimport { registerStandardWalletDiscovery } from \"./standard-wallet\";\nimport { registerInjectedWalletDiscovery } from \"./injected-wallet\";\nimport { registerEIP1193WalletFromEIP6963Discovery } from \"./eip1193-wallet\";\n\nexport type CleanupListener = () => void;\nexport type Listener = (wallets: readonly WalletWithStarknetFeatures[]) => void;\n\nexport type Store = {\n getWallets: () => WalletWithStarknetFeatures[];\n subscribe: (listener: Listener) => CleanupListener;\n _refreshInjectedWallets: () => void;\n};\n\n// Track how a wallet was discovered to prefer standard wallets over (legacy) injected wallets\ntype DiscoveredStarknetWallet = {\n discoverer: \"standard\" | \"injected\" | \"eip6963\";\n wallet: WalletWithStarknetFeatures;\n};\n\nexport type CreateStoreOptions = {\n eip1193Adapters?: EIP1193Adapter[];\n};\n\nconst DEFAULT_EIP1193_ADAPTERS: EIP1193Adapter[] = [metaMaskVirtualWallet];\n\nexport function createStore({\n eip1193Adapters = DEFAULT_EIP1193_ADAPTERS,\n}: CreateStoreOptions = {}): Store {\n const listeners = new Set<Listener>();\n let wallets: DiscoveredStarknetWallet[] = [];\n\n function emitChanges() {\n for (const listener of listeners) {\n listener(wallets.map(({ wallet }) => wallet).slice());\n }\n }\n\n registerStandardWalletDiscovery((wallet) => {\n if (!isStarknetWallet(wallet)) return;\n\n const existing = wallets.find((w) => w.wallet.name === wallet.name);\n\n if (existing) {\n // If the wallet exists but is an injected wallet this library registered,\n // replace it with the standard wallet registered by the wallet itself.\n if (existing.discoverer !== \"standard\") {\n wallets = [\n { discoverer: \"standard\", wallet },\n ...wallets.filter((w) => w.wallet.name !== wallet.name),\n ];\n\n emitChanges();\n }\n } else {\n wallets = [{ discoverer: \"standard\", wallet }, ...wallets];\n\n emitChanges();\n }\n\n return () => {\n wallets = wallets.filter((w) => w.wallet.name !== wallet.name);\n\n emitChanges();\n };\n });\n\n registerEIP1193WalletFromEIP6963Discovery(eip1193Adapters, (wallet) => {\n if (!isStarknetWallet(wallet)) return;\n\n const existing = wallets.find((w) => w.wallet.name === wallet.name);\n\n if (!existing) {\n wallets = [{ discoverer: \"eip6963\", wallet }, ...wallets];\n\n emitChanges();\n }\n\n return () => {\n wallets = wallets.filter((w) => w.wallet.name !== wallet.name);\n\n emitChanges();\n };\n });\n\n const { refresh: refreshInjectedWallets } = registerInjectedWalletDiscovery(\n (wallet) => {\n if (!isStarknetWallet(wallet)) return;\n\n const existing = wallets.find((w) => w.wallet.name === wallet.name);\n\n // Only register injected wallets if they are not already registered.\n // We should not override standard wallets with injected wallets.\n if (!existing) {\n wallets = [{ discoverer: \"injected\", wallet }, ...wallets];\n\n emitChanges();\n }\n\n return () => {\n wallets = wallets.filter((w) => w.wallet.name !== wallet.name);\n\n emitChanges();\n };\n },\n );\n\n return {\n _refreshInjectedWallets: refreshInjectedWallets,\n getWallets() {\n return wallets.map(({ wallet }) => wallet).slice();\n },\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n };\n}\n"],"names":["StarknetInjectedWallet","window","metaMaskVirtualWallet","isStarknetWallet"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../src/eip1193-wallet.ts","../src/injected-wallet.ts","../src/standard-wallet.ts","../src/store.ts"],"sourcesContent":["import type { EIP1193Adapter } from \"@starknet-io/get-starknet-virtual-wallet\";\nimport type { Wallet } from \"@wallet-standard/base\";\n\nexport function registerEIP1193WalletFromEIP6963Discovery(\n eip1193Adapters: EIP1193Adapter[],\n register: (wallet: Wallet) => () => void,\n) {\n if (typeof window === \"undefined\") return;\n\n const handler = (event: CustomEvent) => {\n const { info, provider } = event.detail;\n for (const adapter of eip1193Adapters) {\n const wallet = adapter(info, provider);\n if (wallet) {\n register(wallet);\n return;\n }\n }\n };\n\n window.addEventListener(\"eip6963:announceProvider\", handler);\n\n window.dispatchEvent(new Event(\"eip6963:requestProvider\"));\n\n return () => window.removeEventListener(\"eip6963:announceProvider\", handler);\n}\n","import { StarknetInjectedWallet } from \"@starknet-io/get-starknet-wallet-standard\";\nimport type { StarknetWindowObject } from \"@starknet-io/types-js\";\nimport type { Wallet } from \"@wallet-standard/base\";\n\nexport function registerInjectedWalletDiscovery(\n register: (wallet: Wallet) => () => void,\n): {\n unregister: () => void;\n refresh: () => void;\n} {\n if (typeof window === \"undefined\")\n return {\n unregister: () => {},\n refresh: () => {},\n };\n\n function refresh() {\n const injectedWallets = scanWindowForWallets(window);\n\n for (const wallet of injectedWallets) {\n register(new StarknetInjectedWallet(wallet));\n }\n }\n\n refresh();\n\n return {\n unregister: () => {},\n refresh,\n };\n}\n\nfunction scanWindowForWallets(window: Window): StarknetWindowObject[] {\n return Object.getOwnPropertyNames(window).reduce((wallets, key) => {\n if (key.startsWith(\"starknet\")) {\n const wallet = window[key];\n\n if (isStarknetWindowObject(wallet)) {\n wallets.push(wallet);\n }\n }\n\n return wallets;\n }, []);\n}\n\nconst STARKNET_WALLET_KEYS = [\n \"id\",\n \"name\",\n \"version\",\n \"icon\",\n \"request\",\n \"on\",\n \"off\",\n];\n\nfunction isStarknetWindowObject(\n wallet: unknown,\n): wallet is StarknetWindowObject {\n if (typeof wallet !== \"object\" || wallet === null) return false;\n return STARKNET_WALLET_KEYS.every((key) => key in wallet);\n}\n","import type {\n Wallet,\n WalletEventsWindow,\n WindowAppReadyEvent,\n WindowAppReadyEventAPI,\n WindowRegisterWalletEvent,\n} from \"@wallet-standard/base\";\n\nexport function registerStandardWalletDiscovery(\n register: (wallet: Wallet) => () => void,\n) {\n if (typeof window === \"undefined\") return;\n\n const api = Object.freeze({ register });\n\n const handler = ({ detail: callback }: WindowRegisterWalletEvent) => {\n callback(api);\n };\n\n (window as WalletEventsWindow).addEventListener(\n \"wallet-standard:register-wallet\",\n handler,\n );\n\n (window as WalletEventsWindow).dispatchEvent(new AppReadyEvent(api));\n\n return () =>\n (window as WalletEventsWindow).removeEventListener(\n \"wallet-standard:register-wallet\",\n handler,\n );\n}\n\nclass AppReadyEvent extends Event implements WindowAppReadyEvent {\n constructor(public readonly detail: WindowAppReadyEventAPI) {\n super(\"wallet-standard:app-ready\", {\n bubbles: false,\n cancelable: false,\n composed: false,\n });\n }\n\n get type() {\n return \"wallet-standard:app-ready\" as const;\n }\n\n preventDefault(): never {\n throw new Error(\"preventDefault is deprecated\");\n }\n\n stopImmediatePropagation(): never {\n throw new Error(\"stopImmediatePropagation is deprecated\");\n }\n\n stopPropagation(): never {\n throw new Error(\"stopPropagation is deprecated\");\n }\n}\n","import type { EIP1193Adapter } from \"@starknet-io/get-starknet-virtual-wallet\";\nimport { metaMaskVirtualWallet } from \"@starknet-io/get-starknet-virtual-wallet/metamask\";\nimport {\n isStarknetWallet,\n type WalletWithStarknetFeatures,\n} from \"@starknet-io/get-starknet-wallet-standard/features\";\n\nimport { registerEIP1193WalletFromEIP6963Discovery } from \"./eip1193-wallet\";\nimport { registerInjectedWalletDiscovery } from \"./injected-wallet\";\nimport { registerStandardWalletDiscovery } from \"./standard-wallet\";\n\nexport type CleanupListener = () => void;\nexport type Listener = (wallets: readonly WalletWithStarknetFeatures[]) => void;\n\nexport type Store = {\n getWallets: () => WalletWithStarknetFeatures[];\n subscribe: (listener: Listener) => CleanupListener;\n _refreshInjectedWallets: () => void;\n};\n\n// Track how a wallet was discovered to prefer standard wallets over (legacy) injected wallets\ntype DiscoveredStarknetWallet = {\n discoverer: \"standard\" | \"injected\" | \"eip6963\";\n wallet: WalletWithStarknetFeatures;\n};\n\nexport type CreateStoreOptions = {\n eip1193Adapters?: EIP1193Adapter[];\n};\n\nconst DEFAULT_EIP1193_ADAPTERS: EIP1193Adapter[] = [metaMaskVirtualWallet];\n\nexport function createStore({\n eip1193Adapters = DEFAULT_EIP1193_ADAPTERS,\n}: CreateStoreOptions = {}): Store {\n const listeners = new Set<Listener>();\n let wallets: DiscoveredStarknetWallet[] = [];\n\n function emitChanges() {\n for (const listener of listeners) {\n listener(wallets.map(({ wallet }) => wallet).slice());\n }\n }\n\n registerStandardWalletDiscovery((wallet) => {\n if (!isStarknetWallet(wallet)) return;\n\n const existing = wallets.find((w) => w.wallet.name === wallet.name);\n\n if (existing) {\n // If the wallet exists but is an injected wallet this library registered,\n // replace it with the standard wallet registered by the wallet itself.\n if (existing.discoverer !== \"standard\") {\n wallets = [\n { discoverer: \"standard\", wallet },\n ...wallets.filter((w) => w.wallet.name !== wallet.name),\n ];\n\n emitChanges();\n }\n } else {\n wallets = [{ discoverer: \"standard\", wallet }, ...wallets];\n\n emitChanges();\n }\n\n return () => {\n wallets = wallets.filter((w) => w.wallet.name !== wallet.name);\n\n emitChanges();\n };\n });\n\n registerEIP1193WalletFromEIP6963Discovery(eip1193Adapters, (wallet) => {\n if (!isStarknetWallet(wallet)) return;\n\n const existing = wallets.find((w) => w.wallet.name === wallet.name);\n\n if (!existing) {\n wallets = [{ discoverer: \"eip6963\", wallet }, ...wallets];\n\n emitChanges();\n }\n\n return () => {\n wallets = wallets.filter((w) => w.wallet.name !== wallet.name);\n\n emitChanges();\n };\n });\n\n const { refresh: refreshInjectedWallets } = registerInjectedWalletDiscovery(\n (wallet) => {\n if (!isStarknetWallet(wallet)) return;\n\n const existing = wallets.find((w) => w.wallet.name === wallet.name);\n\n // Only register injected wallets if they are not already registered.\n // We should not override standard wallets with injected wallets.\n if (!existing) {\n wallets = [{ discoverer: \"injected\", wallet }, ...wallets];\n\n emitChanges();\n }\n\n return () => {\n wallets = wallets.filter((w) => w.wallet.name !== wallet.name);\n\n emitChanges();\n };\n },\n );\n\n return {\n _refreshInjectedWallets: refreshInjectedWallets,\n getWallets() {\n return wallets.map(({ wallet }) => wallet).slice();\n },\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n };\n}\n"],"names":["StarknetInjectedWallet","window","metaMaskVirtualWallet","isStarknetWallet"],"mappings":"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"}
package/dist/index.d.cts CHANGED
@@ -1,5 +1,5 @@
1
- import { WalletWithStarknetFeatures } from '@starknet-io/get-starknet-wallet-standard/features';
2
1
  import { EIP1193Adapter } from '@starknet-io/get-starknet-virtual-wallet';
2
+ import { WalletWithStarknetFeatures } from '@starknet-io/get-starknet-wallet-standard/features';
3
3
 
4
4
  type CleanupListener = () => void;
5
5
  type Listener = (wallets: readonly WalletWithStarknetFeatures[]) => void;
package/dist/index.d.mts CHANGED
@@ -1,5 +1,5 @@
1
- import { WalletWithStarknetFeatures } from '@starknet-io/get-starknet-wallet-standard/features';
2
1
  import { EIP1193Adapter } from '@starknet-io/get-starknet-virtual-wallet';
2
+ import { WalletWithStarknetFeatures } from '@starknet-io/get-starknet-wallet-standard/features';
3
3
 
4
4
  type CleanupListener = () => void;
5
5
  type Listener = (wallets: readonly WalletWithStarknetFeatures[]) => void;
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { WalletWithStarknetFeatures } from '@starknet-io/get-starknet-wallet-standard/features';
2
1
  import { EIP1193Adapter } from '@starknet-io/get-starknet-virtual-wallet';
2
+ import { WalletWithStarknetFeatures } from '@starknet-io/get-starknet-wallet-standard/features';
3
3
 
4
4
  type CleanupListener = () => void;
5
5
  type Listener = (wallets: readonly WalletWithStarknetFeatures[]) => void;
package/dist/index.mjs CHANGED
@@ -1,45 +1,23 @@
1
- import { isStarknetWallet } from '@starknet-io/get-starknet-wallet-standard/features';
2
1
  import { metaMaskVirtualWallet } from '@starknet-io/get-starknet-virtual-wallet/metamask';
2
+ import { isStarknetWallet } from '@starknet-io/get-starknet-wallet-standard/features';
3
3
  import { StarknetInjectedWallet } from '@starknet-io/get-starknet-wallet-standard';
4
4
 
5
- function registerStandardWalletDiscovery(register) {
5
+ function registerEIP1193WalletFromEIP6963Discovery(eip1193Adapters, register) {
6
6
  if (typeof window === "undefined")
7
7
  return;
8
- const api = Object.freeze({ register });
9
- const handler = ({ detail: callback }) => {
10
- callback(api);
8
+ const handler = (event) => {
9
+ const { info, provider } = event.detail;
10
+ for (const adapter of eip1193Adapters) {
11
+ const wallet = adapter(info, provider);
12
+ if (wallet) {
13
+ register(wallet);
14
+ return;
15
+ }
16
+ }
11
17
  };
12
- window.addEventListener(
13
- "wallet-standard:register-wallet",
14
- handler
15
- );
16
- window.dispatchEvent(new AppReadyEvent(api));
17
- return () => window.removeEventListener(
18
- "wallet-standard:register-wallet",
19
- handler
20
- );
21
- }
22
- class AppReadyEvent extends Event {
23
- constructor(detail) {
24
- super("wallet-standard:app-ready", {
25
- bubbles: false,
26
- cancelable: false,
27
- composed: false
28
- });
29
- this.detail = detail;
30
- }
31
- get type() {
32
- return "wallet-standard:app-ready";
33
- }
34
- preventDefault() {
35
- throw new Error("preventDefault is deprecated");
36
- }
37
- stopImmediatePropagation() {
38
- throw new Error("stopImmediatePropagation is deprecated");
39
- }
40
- stopPropagation() {
41
- throw new Error("stopPropagation is deprecated");
42
- }
18
+ window.addEventListener("eip6963:announceProvider", handler);
19
+ window.dispatchEvent(new Event("eip6963:requestProvider"));
20
+ return () => window.removeEventListener("eip6963:announceProvider", handler);
43
21
  }
44
22
 
45
23
  function registerInjectedWalletDiscovery(register) {
@@ -89,22 +67,44 @@ function isStarknetWindowObject(wallet) {
89
67
  return STARKNET_WALLET_KEYS.every((key) => key in wallet);
90
68
  }
91
69
 
92
- function registerEIP1193WalletFromEIP6963Discovery(eip1193Adapters, register) {
70
+ function registerStandardWalletDiscovery(register) {
93
71
  if (typeof window === "undefined")
94
72
  return;
95
- const handler = (event) => {
96
- const { info, provider } = event.detail;
97
- for (const adapter of eip1193Adapters) {
98
- const wallet = adapter(info, provider);
99
- if (wallet) {
100
- register(wallet);
101
- return;
102
- }
103
- }
73
+ const api = Object.freeze({ register });
74
+ const handler = ({ detail: callback }) => {
75
+ callback(api);
104
76
  };
105
- window.addEventListener("eip6963:announceProvider", handler);
106
- window.dispatchEvent(new Event("eip6963:requestProvider"));
107
- return () => window.removeEventListener("eip6963:announceProvider", handler);
77
+ window.addEventListener(
78
+ "wallet-standard:register-wallet",
79
+ handler
80
+ );
81
+ window.dispatchEvent(new AppReadyEvent(api));
82
+ return () => window.removeEventListener(
83
+ "wallet-standard:register-wallet",
84
+ handler
85
+ );
86
+ }
87
+ class AppReadyEvent extends Event {
88
+ constructor(detail) {
89
+ super("wallet-standard:app-ready", {
90
+ bubbles: false,
91
+ cancelable: false,
92
+ composed: false
93
+ });
94
+ this.detail = detail;
95
+ }
96
+ get type() {
97
+ return "wallet-standard:app-ready";
98
+ }
99
+ preventDefault() {
100
+ throw new Error("preventDefault is deprecated");
101
+ }
102
+ stopImmediatePropagation() {
103
+ throw new Error("stopImmediatePropagation is deprecated");
104
+ }
105
+ stopPropagation() {
106
+ throw new Error("stopPropagation is deprecated");
107
+ }
108
108
  }
109
109
 
110
110
  const DEFAULT_EIP1193_ADAPTERS = [metaMaskVirtualWallet];
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../src/standard-wallet.ts","../src/injected-wallet.ts","../src/eip1193-wallet.ts","../src/store.ts"],"sourcesContent":["import type {\n WalletEventsWindow,\n WindowRegisterWalletEvent,\n WindowAppReadyEvent,\n WindowAppReadyEventAPI,\n Wallet,\n} from \"@wallet-standard/base\";\n\nexport function registerStandardWalletDiscovery(\n register: (wallet: Wallet) => () => void,\n) {\n if (typeof window === \"undefined\") return;\n\n const api = Object.freeze({ register });\n\n const handler = ({ detail: callback }: WindowRegisterWalletEvent) => {\n callback(api);\n };\n\n (window as WalletEventsWindow).addEventListener(\n \"wallet-standard:register-wallet\",\n handler,\n );\n\n (window as WalletEventsWindow).dispatchEvent(new AppReadyEvent(api));\n\n return () =>\n (window as WalletEventsWindow).removeEventListener(\n \"wallet-standard:register-wallet\",\n handler,\n );\n}\n\nclass AppReadyEvent extends Event implements WindowAppReadyEvent {\n constructor(public readonly detail: WindowAppReadyEventAPI) {\n super(\"wallet-standard:app-ready\", {\n bubbles: false,\n cancelable: false,\n composed: false,\n });\n }\n\n get type() {\n return \"wallet-standard:app-ready\" as const;\n }\n\n preventDefault(): never {\n throw new Error(\"preventDefault is deprecated\");\n }\n\n stopImmediatePropagation(): never {\n throw new Error(\"stopImmediatePropagation is deprecated\");\n }\n\n stopPropagation(): never {\n throw new Error(\"stopPropagation is deprecated\");\n }\n}\n","import { StarknetInjectedWallet } from \"@starknet-io/get-starknet-wallet-standard\";\nimport type { StarknetWindowObject } from \"@starknet-io/types-js\";\nimport type { Wallet } from \"@wallet-standard/base\";\n\nexport function registerInjectedWalletDiscovery(\n register: (wallet: Wallet) => () => void,\n): {\n unregister: () => void;\n refresh: () => void;\n} {\n if (typeof window === \"undefined\")\n return {\n unregister: () => {},\n refresh: () => {},\n };\n\n function refresh() {\n const injectedWallets = scanWindowForWallets(window);\n\n for (const wallet of injectedWallets) {\n register(new StarknetInjectedWallet(wallet));\n }\n }\n\n refresh();\n\n return {\n unregister: () => {},\n refresh,\n };\n}\n\nfunction scanWindowForWallets(window: Window): StarknetWindowObject[] {\n return Object.getOwnPropertyNames(window).reduce((wallets, key) => {\n if (key.startsWith(\"starknet\")) {\n const wallet = window[key];\n\n if (isStarknetWindowObject(wallet)) {\n wallets.push(wallet);\n }\n }\n\n return wallets;\n }, []);\n}\n\nconst STARKNET_WALLET_KEYS = [\n \"id\",\n \"name\",\n \"version\",\n \"icon\",\n \"request\",\n \"on\",\n \"off\",\n];\n\nfunction isStarknetWindowObject(\n wallet: unknown,\n): wallet is StarknetWindowObject {\n if (typeof wallet !== \"object\" || wallet === null) return false;\n return STARKNET_WALLET_KEYS.every((key) => key in wallet);\n}\n","import type { EIP1193Adapter } from \"@starknet-io/get-starknet-virtual-wallet\";\nimport type { Wallet } from \"@wallet-standard/base\";\n\nexport function registerEIP1193WalletFromEIP6963Discovery(\n eip1193Adapters: EIP1193Adapter[],\n register: (wallet: Wallet) => () => void,\n) {\n if (typeof window === \"undefined\") return;\n\n const handler = (event: CustomEvent) => {\n const { info, provider } = event.detail;\n for (const adapter of eip1193Adapters) {\n const wallet = adapter(info, provider);\n if (wallet) {\n register(wallet);\n return;\n }\n }\n };\n\n window.addEventListener(\"eip6963:announceProvider\", handler);\n\n window.dispatchEvent(new Event(\"eip6963:requestProvider\"));\n\n return () => window.removeEventListener(\"eip6963:announceProvider\", handler);\n}\n","import {\n type WalletWithStarknetFeatures,\n isStarknetWallet,\n} from \"@starknet-io/get-starknet-wallet-standard/features\";\nimport type { EIP1193Adapter } from \"@starknet-io/get-starknet-virtual-wallet\";\nimport { metaMaskVirtualWallet } from \"@starknet-io/get-starknet-virtual-wallet/metamask\";\n\nimport { registerStandardWalletDiscovery } from \"./standard-wallet\";\nimport { registerInjectedWalletDiscovery } from \"./injected-wallet\";\nimport { registerEIP1193WalletFromEIP6963Discovery } from \"./eip1193-wallet\";\n\nexport type CleanupListener = () => void;\nexport type Listener = (wallets: readonly WalletWithStarknetFeatures[]) => void;\n\nexport type Store = {\n getWallets: () => WalletWithStarknetFeatures[];\n subscribe: (listener: Listener) => CleanupListener;\n _refreshInjectedWallets: () => void;\n};\n\n// Track how a wallet was discovered to prefer standard wallets over (legacy) injected wallets\ntype DiscoveredStarknetWallet = {\n discoverer: \"standard\" | \"injected\" | \"eip6963\";\n wallet: WalletWithStarknetFeatures;\n};\n\nexport type CreateStoreOptions = {\n eip1193Adapters?: EIP1193Adapter[];\n};\n\nconst DEFAULT_EIP1193_ADAPTERS: EIP1193Adapter[] = [metaMaskVirtualWallet];\n\nexport function createStore({\n eip1193Adapters = DEFAULT_EIP1193_ADAPTERS,\n}: CreateStoreOptions = {}): Store {\n const listeners = new Set<Listener>();\n let wallets: DiscoveredStarknetWallet[] = [];\n\n function emitChanges() {\n for (const listener of listeners) {\n listener(wallets.map(({ wallet }) => wallet).slice());\n }\n }\n\n registerStandardWalletDiscovery((wallet) => {\n if (!isStarknetWallet(wallet)) return;\n\n const existing = wallets.find((w) => w.wallet.name === wallet.name);\n\n if (existing) {\n // If the wallet exists but is an injected wallet this library registered,\n // replace it with the standard wallet registered by the wallet itself.\n if (existing.discoverer !== \"standard\") {\n wallets = [\n { discoverer: \"standard\", wallet },\n ...wallets.filter((w) => w.wallet.name !== wallet.name),\n ];\n\n emitChanges();\n }\n } else {\n wallets = [{ discoverer: \"standard\", wallet }, ...wallets];\n\n emitChanges();\n }\n\n return () => {\n wallets = wallets.filter((w) => w.wallet.name !== wallet.name);\n\n emitChanges();\n };\n });\n\n registerEIP1193WalletFromEIP6963Discovery(eip1193Adapters, (wallet) => {\n if (!isStarknetWallet(wallet)) return;\n\n const existing = wallets.find((w) => w.wallet.name === wallet.name);\n\n if (!existing) {\n wallets = [{ discoverer: \"eip6963\", wallet }, ...wallets];\n\n emitChanges();\n }\n\n return () => {\n wallets = wallets.filter((w) => w.wallet.name !== wallet.name);\n\n emitChanges();\n };\n });\n\n const { refresh: refreshInjectedWallets } = registerInjectedWalletDiscovery(\n (wallet) => {\n if (!isStarknetWallet(wallet)) return;\n\n const existing = wallets.find((w) => w.wallet.name === wallet.name);\n\n // Only register injected wallets if they are not already registered.\n // We should not override standard wallets with injected wallets.\n if (!existing) {\n wallets = [{ discoverer: \"injected\", wallet }, ...wallets];\n\n emitChanges();\n }\n\n return () => {\n wallets = wallets.filter((w) => w.wallet.name !== wallet.name);\n\n emitChanges();\n };\n },\n );\n\n return {\n _refreshInjectedWallets: refreshInjectedWallets,\n getWallets() {\n return wallets.map(({ wallet }) => wallet).slice();\n },\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n };\n}\n"],"names":["window"],"mappings":";;;;AAQO,SAAS,gCACd,QACA,EAAA;AACA,EAAA,IAAI,OAAO,MAAW,KAAA,WAAA;AAAa,IAAA,OAAA;AAEnC,EAAA,MAAM,GAAM,GAAA,MAAA,CAAO,MAAO,CAAA,EAAE,UAAU,CAAA,CAAA;AAEtC,EAAA,MAAM,OAAU,GAAA,CAAC,EAAE,MAAA,EAAQ,UAA0C,KAAA;AACnE,IAAA,QAAA,CAAS,GAAG,CAAA,CAAA;AAAA,GACd,CAAA;AAEA,EAAC,MAA8B,CAAA,gBAAA;AAAA,IAC7B,iCAAA;AAAA,IACA,OAAA;AAAA,GACF,CAAA;AAEA,EAAC,MAA8B,CAAA,aAAA,CAAc,IAAI,aAAA,CAAc,GAAG,CAAC,CAAA,CAAA;AAEnE,EAAA,OAAO,MACJ,MAA8B,CAAA,mBAAA;AAAA,IAC7B,iCAAA;AAAA,IACA,OAAA;AAAA,GACF,CAAA;AACJ,CAAA;AAEA,MAAM,sBAAsB,KAAqC,CAAA;AAAA,EAC/D,YAA4B,MAAgC,EAAA;AAC1D,IAAA,KAAA,CAAM,2BAA6B,EAAA;AAAA,MACjC,OAAS,EAAA,KAAA;AAAA,MACT,UAAY,EAAA,KAAA;AAAA,MACZ,QAAU,EAAA,KAAA;AAAA,KACX,CAAA,CAAA;AALyB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA,CAAA;AAAA,GAM5B;AAAA,EAEA,IAAI,IAAO,GAAA;AACT,IAAO,OAAA,2BAAA,CAAA;AAAA,GACT;AAAA,EAEA,cAAwB,GAAA;AACtB,IAAM,MAAA,IAAI,MAAM,8BAA8B,CAAA,CAAA;AAAA,GAChD;AAAA,EAEA,wBAAkC,GAAA;AAChC,IAAM,MAAA,IAAI,MAAM,wCAAwC,CAAA,CAAA;AAAA,GAC1D;AAAA,EAEA,eAAyB,GAAA;AACvB,IAAM,MAAA,IAAI,MAAM,+BAA+B,CAAA,CAAA;AAAA,GACjD;AACF;;ACrDO,SAAS,gCACd,QAIA,EAAA;AACA,EAAA,IAAI,OAAO,MAAW,KAAA,WAAA;AACpB,IAAO,OAAA;AAAA,MACL,YAAY,MAAM;AAAA,OAAC;AAAA,MACnB,SAAS,MAAM;AAAA,OAAC;AAAA,KAClB,CAAA;AAEF,EAAA,SAAS,OAAU,GAAA;AACjB,IAAM,MAAA,eAAA,GAAkB,qBAAqB,MAAM,CAAA,CAAA;AAEnD,IAAA,KAAA,MAAW,UAAU,eAAiB,EAAA;AACpC,MAAS,QAAA,CAAA,IAAI,sBAAuB,CAAA,MAAM,CAAC,CAAA,CAAA;AAAA,KAC7C;AAAA,GACF;AAEA,EAAQ,OAAA,EAAA,CAAA;AAER,EAAO,OAAA;AAAA,IACL,YAAY,MAAM;AAAA,KAAC;AAAA,IACnB,OAAA;AAAA,GACF,CAAA;AACF,CAAA;AAEA,SAAS,qBAAqBA,OAAwC,EAAA;AACpE,EAAA,OAAO,OAAO,mBAAoBA,CAAAA,OAAM,EAAE,MAAO,CAAA,CAAC,SAAS,GAAQ,KAAA;AACjE,IAAI,IAAA,GAAA,CAAI,UAAW,CAAA,UAAU,CAAG,EAAA;AAC9B,MAAM,MAAA,MAAA,GAASA,QAAO,GAAG,CAAA,CAAA;AAEzB,MAAI,IAAA,sBAAA,CAAuB,MAAM,CAAG,EAAA;AAClC,QAAA,OAAA,CAAQ,KAAK,MAAM,CAAA,CAAA;AAAA,OACrB;AAAA,KACF;AAEA,IAAO,OAAA,OAAA,CAAA;AAAA,GACT,EAAG,EAAE,CAAA,CAAA;AACP,CAAA;AAEA,MAAM,oBAAuB,GAAA;AAAA,EAC3B,IAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AACF,CAAA,CAAA;AAEA,SAAS,uBACP,MACgC,EAAA;AAChC,EAAI,IAAA,OAAO,MAAW,KAAA,QAAA,IAAY,MAAW,KAAA,IAAA;AAAM,IAAO,OAAA,KAAA,CAAA;AAC1D,EAAA,OAAO,oBAAqB,CAAA,KAAA,CAAM,CAAC,GAAA,KAAQ,OAAO,MAAM,CAAA,CAAA;AAC1D;;AC1DgB,SAAA,yCAAA,CACd,iBACA,QACA,EAAA;AACA,EAAA,IAAI,OAAO,MAAW,KAAA,WAAA;AAAa,IAAA,OAAA;AAEnC,EAAM,MAAA,OAAA,GAAU,CAAC,KAAuB,KAAA;AACtC,IAAA,MAAM,EAAE,IAAA,EAAM,QAAS,EAAA,GAAI,KAAM,CAAA,MAAA,CAAA;AACjC,IAAA,KAAA,MAAW,WAAW,eAAiB,EAAA;AACrC,MAAM,MAAA,MAAA,GAAS,OAAQ,CAAA,IAAA,EAAM,QAAQ,CAAA,CAAA;AACrC,MAAA,IAAI,MAAQ,EAAA;AACV,QAAA,QAAA,CAAS,MAAM,CAAA,CAAA;AACf,QAAA,OAAA;AAAA,OACF;AAAA,KACF;AAAA,GACF,CAAA;AAEA,EAAO,MAAA,CAAA,gBAAA,CAAiB,4BAA4B,OAAO,CAAA,CAAA;AAE3D,EAAA,MAAA,CAAO,aAAc,CAAA,IAAI,KAAM,CAAA,yBAAyB,CAAC,CAAA,CAAA;AAEzD,EAAA,OAAO,MAAM,MAAA,CAAO,mBAAoB,CAAA,0BAAA,EAA4B,OAAO,CAAA,CAAA;AAC7E;;ACKA,MAAM,wBAAA,GAA6C,CAAC,qBAAqB,CAAA,CAAA;AAElE,SAAS,WAAY,CAAA;AAAA,EAC1B,eAAkB,GAAA,wBAAA;AACpB,CAAA,GAAwB,EAAW,EAAA;AACjC,EAAM,MAAA,SAAA,uBAAgB,GAAc,EAAA,CAAA;AACpC,EAAA,IAAI,UAAsC,EAAC,CAAA;AAE3C,EAAA,SAAS,WAAc,GAAA;AACrB,IAAA,KAAA,MAAW,YAAY,SAAW,EAAA;AAChC,MAAS,QAAA,CAAA,OAAA,CAAQ,IAAI,CAAC,EAAE,QAAa,KAAA,MAAM,CAAE,CAAA,KAAA,EAAO,CAAA,CAAA;AAAA,KACtD;AAAA,GACF;AAEA,EAAA,+BAAA,CAAgC,CAAC,MAAW,KAAA;AAC1C,IAAI,IAAA,CAAC,iBAAiB,MAAM,CAAA;AAAG,MAAA,OAAA;AAE/B,IAAM,MAAA,QAAA,GAAW,QAAQ,IAAK,CAAA,CAAC,MAAM,CAAE,CAAA,MAAA,CAAO,IAAS,KAAA,MAAA,CAAO,IAAI,CAAA,CAAA;AAElE,IAAA,IAAI,QAAU,EAAA;AAGZ,MAAI,IAAA,QAAA,CAAS,eAAe,UAAY,EAAA;AACtC,QAAU,OAAA,GAAA;AAAA,UACR,EAAE,UAAY,EAAA,UAAA,EAAY,MAAO,EAAA;AAAA,UACjC,GAAG,QAAQ,MAAO,CAAA,CAAC,MAAM,CAAE,CAAA,MAAA,CAAO,IAAS,KAAA,MAAA,CAAO,IAAI,CAAA;AAAA,SACxD,CAAA;AAEA,QAAY,WAAA,EAAA,CAAA;AAAA,OACd;AAAA,KACK,MAAA;AACL,MAAA,OAAA,GAAU,CAAC,EAAE,UAAA,EAAY,YAAY,MAAO,EAAA,EAAG,GAAG,OAAO,CAAA,CAAA;AAEzD,MAAY,WAAA,EAAA,CAAA;AAAA,KACd;AAEA,IAAA,OAAO,MAAM;AACX,MAAU,OAAA,GAAA,OAAA,CAAQ,OAAO,CAAC,CAAA,KAAM,EAAE,MAAO,CAAA,IAAA,KAAS,OAAO,IAAI,CAAA,CAAA;AAE7D,MAAY,WAAA,EAAA,CAAA;AAAA,KACd,CAAA;AAAA,GACD,CAAA,CAAA;AAED,EAA0C,yCAAA,CAAA,eAAA,EAAiB,CAAC,MAAW,KAAA;AACrE,IAAI,IAAA,CAAC,iBAAiB,MAAM,CAAA;AAAG,MAAA,OAAA;AAE/B,IAAM,MAAA,QAAA,GAAW,QAAQ,IAAK,CAAA,CAAC,MAAM,CAAE,CAAA,MAAA,CAAO,IAAS,KAAA,MAAA,CAAO,IAAI,CAAA,CAAA;AAElE,IAAA,IAAI,CAAC,QAAU,EAAA;AACb,MAAA,OAAA,GAAU,CAAC,EAAE,UAAA,EAAY,WAAW,MAAO,EAAA,EAAG,GAAG,OAAO,CAAA,CAAA;AAExD,MAAY,WAAA,EAAA,CAAA;AAAA,KACd;AAEA,IAAA,OAAO,MAAM;AACX,MAAU,OAAA,GAAA,OAAA,CAAQ,OAAO,CAAC,CAAA,KAAM,EAAE,MAAO,CAAA,IAAA,KAAS,OAAO,IAAI,CAAA,CAAA;AAE7D,MAAY,WAAA,EAAA,CAAA;AAAA,KACd,CAAA;AAAA,GACD,CAAA,CAAA;AAED,EAAM,MAAA,EAAE,OAAS,EAAA,sBAAA,EAA2B,GAAA,+BAAA;AAAA,IAC1C,CAAC,MAAW,KAAA;AACV,MAAI,IAAA,CAAC,iBAAiB,MAAM,CAAA;AAAG,QAAA,OAAA;AAE/B,MAAM,MAAA,QAAA,GAAW,QAAQ,IAAK,CAAA,CAAC,MAAM,CAAE,CAAA,MAAA,CAAO,IAAS,KAAA,MAAA,CAAO,IAAI,CAAA,CAAA;AAIlE,MAAA,IAAI,CAAC,QAAU,EAAA;AACb,QAAA,OAAA,GAAU,CAAC,EAAE,UAAA,EAAY,YAAY,MAAO,EAAA,EAAG,GAAG,OAAO,CAAA,CAAA;AAEzD,QAAY,WAAA,EAAA,CAAA;AAAA,OACd;AAEA,MAAA,OAAO,MAAM;AACX,QAAU,OAAA,GAAA,OAAA,CAAQ,OAAO,CAAC,CAAA,KAAM,EAAE,MAAO,CAAA,IAAA,KAAS,OAAO,IAAI,CAAA,CAAA;AAE7D,QAAY,WAAA,EAAA,CAAA;AAAA,OACd,CAAA;AAAA,KACF;AAAA,GACF,CAAA;AAEA,EAAO,OAAA;AAAA,IACL,uBAAyB,EAAA,sBAAA;AAAA,IACzB,UAAa,GAAA;AACX,MAAO,OAAA,OAAA,CAAQ,IAAI,CAAC,EAAE,QAAa,KAAA,MAAM,EAAE,KAAM,EAAA,CAAA;AAAA,KACnD;AAAA,IACA,UAAU,QAAU,EAAA;AAClB,MAAA,SAAA,CAAU,IAAI,QAAQ,CAAA,CAAA;AACtB,MAAA,OAAO,MAAM;AACX,QAAA,SAAA,CAAU,OAAO,QAAQ,CAAA,CAAA;AAAA,OAC3B,CAAA;AAAA,KACF;AAAA,GACF,CAAA;AACF;;;;"}
1
+ {"version":3,"file":"index.mjs","sources":["../src/eip1193-wallet.ts","../src/injected-wallet.ts","../src/standard-wallet.ts","../src/store.ts"],"sourcesContent":["import type { EIP1193Adapter } from \"@starknet-io/get-starknet-virtual-wallet\";\nimport type { Wallet } from \"@wallet-standard/base\";\n\nexport function registerEIP1193WalletFromEIP6963Discovery(\n eip1193Adapters: EIP1193Adapter[],\n register: (wallet: Wallet) => () => void,\n) {\n if (typeof window === \"undefined\") return;\n\n const handler = (event: CustomEvent) => {\n const { info, provider } = event.detail;\n for (const adapter of eip1193Adapters) {\n const wallet = adapter(info, provider);\n if (wallet) {\n register(wallet);\n return;\n }\n }\n };\n\n window.addEventListener(\"eip6963:announceProvider\", handler);\n\n window.dispatchEvent(new Event(\"eip6963:requestProvider\"));\n\n return () => window.removeEventListener(\"eip6963:announceProvider\", handler);\n}\n","import { StarknetInjectedWallet } from \"@starknet-io/get-starknet-wallet-standard\";\nimport type { StarknetWindowObject } from \"@starknet-io/types-js\";\nimport type { Wallet } from \"@wallet-standard/base\";\n\nexport function registerInjectedWalletDiscovery(\n register: (wallet: Wallet) => () => void,\n): {\n unregister: () => void;\n refresh: () => void;\n} {\n if (typeof window === \"undefined\")\n return {\n unregister: () => {},\n refresh: () => {},\n };\n\n function refresh() {\n const injectedWallets = scanWindowForWallets(window);\n\n for (const wallet of injectedWallets) {\n register(new StarknetInjectedWallet(wallet));\n }\n }\n\n refresh();\n\n return {\n unregister: () => {},\n refresh,\n };\n}\n\nfunction scanWindowForWallets(window: Window): StarknetWindowObject[] {\n return Object.getOwnPropertyNames(window).reduce((wallets, key) => {\n if (key.startsWith(\"starknet\")) {\n const wallet = window[key];\n\n if (isStarknetWindowObject(wallet)) {\n wallets.push(wallet);\n }\n }\n\n return wallets;\n }, []);\n}\n\nconst STARKNET_WALLET_KEYS = [\n \"id\",\n \"name\",\n \"version\",\n \"icon\",\n \"request\",\n \"on\",\n \"off\",\n];\n\nfunction isStarknetWindowObject(\n wallet: unknown,\n): wallet is StarknetWindowObject {\n if (typeof wallet !== \"object\" || wallet === null) return false;\n return STARKNET_WALLET_KEYS.every((key) => key in wallet);\n}\n","import type {\n Wallet,\n WalletEventsWindow,\n WindowAppReadyEvent,\n WindowAppReadyEventAPI,\n WindowRegisterWalletEvent,\n} from \"@wallet-standard/base\";\n\nexport function registerStandardWalletDiscovery(\n register: (wallet: Wallet) => () => void,\n) {\n if (typeof window === \"undefined\") return;\n\n const api = Object.freeze({ register });\n\n const handler = ({ detail: callback }: WindowRegisterWalletEvent) => {\n callback(api);\n };\n\n (window as WalletEventsWindow).addEventListener(\n \"wallet-standard:register-wallet\",\n handler,\n );\n\n (window as WalletEventsWindow).dispatchEvent(new AppReadyEvent(api));\n\n return () =>\n (window as WalletEventsWindow).removeEventListener(\n \"wallet-standard:register-wallet\",\n handler,\n );\n}\n\nclass AppReadyEvent extends Event implements WindowAppReadyEvent {\n constructor(public readonly detail: WindowAppReadyEventAPI) {\n super(\"wallet-standard:app-ready\", {\n bubbles: false,\n cancelable: false,\n composed: false,\n });\n }\n\n get type() {\n return \"wallet-standard:app-ready\" as const;\n }\n\n preventDefault(): never {\n throw new Error(\"preventDefault is deprecated\");\n }\n\n stopImmediatePropagation(): never {\n throw new Error(\"stopImmediatePropagation is deprecated\");\n }\n\n stopPropagation(): never {\n throw new Error(\"stopPropagation is deprecated\");\n }\n}\n","import type { EIP1193Adapter } from \"@starknet-io/get-starknet-virtual-wallet\";\nimport { metaMaskVirtualWallet } from \"@starknet-io/get-starknet-virtual-wallet/metamask\";\nimport {\n isStarknetWallet,\n type WalletWithStarknetFeatures,\n} from \"@starknet-io/get-starknet-wallet-standard/features\";\n\nimport { registerEIP1193WalletFromEIP6963Discovery } from \"./eip1193-wallet\";\nimport { registerInjectedWalletDiscovery } from \"./injected-wallet\";\nimport { registerStandardWalletDiscovery } from \"./standard-wallet\";\n\nexport type CleanupListener = () => void;\nexport type Listener = (wallets: readonly WalletWithStarknetFeatures[]) => void;\n\nexport type Store = {\n getWallets: () => WalletWithStarknetFeatures[];\n subscribe: (listener: Listener) => CleanupListener;\n _refreshInjectedWallets: () => void;\n};\n\n// Track how a wallet was discovered to prefer standard wallets over (legacy) injected wallets\ntype DiscoveredStarknetWallet = {\n discoverer: \"standard\" | \"injected\" | \"eip6963\";\n wallet: WalletWithStarknetFeatures;\n};\n\nexport type CreateStoreOptions = {\n eip1193Adapters?: EIP1193Adapter[];\n};\n\nconst DEFAULT_EIP1193_ADAPTERS: EIP1193Adapter[] = [metaMaskVirtualWallet];\n\nexport function createStore({\n eip1193Adapters = DEFAULT_EIP1193_ADAPTERS,\n}: CreateStoreOptions = {}): Store {\n const listeners = new Set<Listener>();\n let wallets: DiscoveredStarknetWallet[] = [];\n\n function emitChanges() {\n for (const listener of listeners) {\n listener(wallets.map(({ wallet }) => wallet).slice());\n }\n }\n\n registerStandardWalletDiscovery((wallet) => {\n if (!isStarknetWallet(wallet)) return;\n\n const existing = wallets.find((w) => w.wallet.name === wallet.name);\n\n if (existing) {\n // If the wallet exists but is an injected wallet this library registered,\n // replace it with the standard wallet registered by the wallet itself.\n if (existing.discoverer !== \"standard\") {\n wallets = [\n { discoverer: \"standard\", wallet },\n ...wallets.filter((w) => w.wallet.name !== wallet.name),\n ];\n\n emitChanges();\n }\n } else {\n wallets = [{ discoverer: \"standard\", wallet }, ...wallets];\n\n emitChanges();\n }\n\n return () => {\n wallets = wallets.filter((w) => w.wallet.name !== wallet.name);\n\n emitChanges();\n };\n });\n\n registerEIP1193WalletFromEIP6963Discovery(eip1193Adapters, (wallet) => {\n if (!isStarknetWallet(wallet)) return;\n\n const existing = wallets.find((w) => w.wallet.name === wallet.name);\n\n if (!existing) {\n wallets = [{ discoverer: \"eip6963\", wallet }, ...wallets];\n\n emitChanges();\n }\n\n return () => {\n wallets = wallets.filter((w) => w.wallet.name !== wallet.name);\n\n emitChanges();\n };\n });\n\n const { refresh: refreshInjectedWallets } = registerInjectedWalletDiscovery(\n (wallet) => {\n if (!isStarknetWallet(wallet)) return;\n\n const existing = wallets.find((w) => w.wallet.name === wallet.name);\n\n // Only register injected wallets if they are not already registered.\n // We should not override standard wallets with injected wallets.\n if (!existing) {\n wallets = [{ discoverer: \"injected\", wallet }, ...wallets];\n\n emitChanges();\n }\n\n return () => {\n wallets = wallets.filter((w) => w.wallet.name !== wallet.name);\n\n emitChanges();\n };\n },\n );\n\n return {\n _refreshInjectedWallets: refreshInjectedWallets,\n getWallets() {\n return wallets.map(({ wallet }) => wallet).slice();\n },\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n };\n}\n"],"names":["window"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@starknet-io/get-starknet-discovery",
3
- "version": "5.0.0-beta.0",
3
+ "version": "5.0.0",
4
4
  "keywords": [
5
5
  "starknet",
6
6
  "starkware",
@@ -36,15 +36,15 @@
36
36
  "dependencies": {
37
37
  "@starknet-io/types-js": "^0.7.10",
38
38
  "@wallet-standard/base": "^1.1.0",
39
- "@starknet-io/get-starknet-virtual-wallet": "^5.0.0-beta.0",
40
- "@starknet-io/get-starknet-wallet-standard": "^5.0.0-beta.0"
39
+ "@starknet-io/get-starknet-virtual-wallet": "^5.0.0",
40
+ "@starknet-io/get-starknet-wallet-standard": "^5.0.0"
41
41
  },
42
42
  "scripts": {
43
43
  "build": "unbuild",
44
- "format:check": "biome format .",
44
+ "lint:check": "biome check .",
45
+ "lint": "biome check --write .",
45
46
  "format": "biome format --write .",
46
- "lint:check": "biome lint .",
47
- "lint": "biome lint --write .",
47
+ "format:check": "biome format .",
48
48
  "test": "vitest"
49
49
  }
50
50
  }
package/src/index.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  export {
2
+ type CleanupListener,
2
3
  createStore,
3
- type Store,
4
4
  type Listener,
5
- type CleanupListener,
5
+ type Store,
6
6
  } from "./store";
@@ -1,9 +1,9 @@
1
1
  import type {
2
+ Wallet,
2
3
  WalletEventsWindow,
3
- WindowRegisterWalletEvent,
4
4
  WindowAppReadyEvent,
5
5
  WindowAppReadyEventAPI,
6
- Wallet,
6
+ WindowRegisterWalletEvent,
7
7
  } from "@wallet-standard/base";
8
8
 
9
9
  export function registerStandardWalletDiscovery(
package/src/store.ts CHANGED
@@ -1,13 +1,13 @@
1
+ import type { EIP1193Adapter } from "@starknet-io/get-starknet-virtual-wallet";
2
+ import { metaMaskVirtualWallet } from "@starknet-io/get-starknet-virtual-wallet/metamask";
1
3
  import {
2
- type WalletWithStarknetFeatures,
3
4
  isStarknetWallet,
5
+ type WalletWithStarknetFeatures,
4
6
  } from "@starknet-io/get-starknet-wallet-standard/features";
5
- import type { EIP1193Adapter } from "@starknet-io/get-starknet-virtual-wallet";
6
- import { metaMaskVirtualWallet } from "@starknet-io/get-starknet-virtual-wallet/metamask";
7
7
 
8
- import { registerStandardWalletDiscovery } from "./standard-wallet";
9
- import { registerInjectedWalletDiscovery } from "./injected-wallet";
10
8
  import { registerEIP1193WalletFromEIP6963Discovery } from "./eip1193-wallet";
9
+ import { registerInjectedWalletDiscovery } from "./injected-wallet";
10
+ import { registerStandardWalletDiscovery } from "./standard-wallet";
11
11
 
12
12
  export type CleanupListener = () => void;
13
13
  export type Listener = (wallets: readonly WalletWithStarknetFeatures[]) => void;