@dynamic-labs/starknet 3.0.0-alpha.5 → 3.0.0-alpha.6

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/CHANGELOG.md CHANGED
@@ -1,4 +1,21 @@
1
1
 
2
+ ## [3.0.0-alpha.6](https://github.com/dynamic-labs/DynamicAuth/compare/v3.0.0-alpha.5...v3.0.0-alpha.6) (2024-06-18)
3
+
4
+
5
+ ### Features
6
+
7
+ * implement useExternalAuth hook to signin using external jwt auth ([#6039](https://github.com/dynamic-labs/DynamicAuth/issues/6039)) ([ba90908](https://github.com/dynamic-labs/DynamicAuth/commit/ba90908509ec21f708a4a0782a7f94861fc3b484))
8
+
9
+
10
+ ### Bug Fixes
11
+
12
+ * allow sign-in with different ME BTC wallet after initial connection ([a527b46](https://github.com/dynamic-labs/DynamicAuth/commit/a527b464f321b4fc27730f57c3812e996b5ed878))
13
+ * close sign modal when signing in with a wallet when embedded wallet is enabled ([#6013](https://github.com/dynamic-labs/DynamicAuth/issues/6013)) ([0f4f3c8](https://github.com/dynamic-labs/DynamicAuth/commit/0f4f3c83db162f7a1794a3549b60bbad6b03e2c0))
14
+ * custom network without a valid icon should still display its name in network picker ([#6018](https://github.com/dynamic-labs/DynamicAuth/issues/6018)) ([0b10df6](https://github.com/dynamic-labs/DynamicAuth/commit/0b10df68950bfc9b8492443158a6bb030dc1122c))
15
+ * e2e: remove page pause ([#6045](https://github.com/dynamic-labs/DynamicAuth/issues/6045)) ([55bba00](https://github.com/dynamic-labs/DynamicAuth/commit/55bba0034255055d6ae266b1296542f47ed48e2b))
16
+ * more fixes for connect starknet button ([#6046](https://github.com/dynamic-labs/DynamicAuth/issues/6046)) ([0fb570a](https://github.com/dynamic-labs/DynamicAuth/commit/0fb570a44e65f8dd6d4d2bf5edb2ee54985ec9d4))
17
+ * set verified credentials on embedded wallet creation ([#6044](https://github.com/dynamic-labs/DynamicAuth/issues/6044)) ([b52a96d](https://github.com/dynamic-labs/DynamicAuth/commit/b52a96d321e7efdb30dce9cdb3f6f176c24ceb81))
18
+
2
19
  ## [3.0.0-alpha.5](https://github.com/dynamic-labs/DynamicAuth/compare/v3.0.0-alpha.4...v3.0.0-alpha.5) (2024-06-14)
3
20
 
4
21
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dynamic-labs/starknet",
3
- "version": "3.0.0-alpha.5",
3
+ "version": "3.0.0-alpha.6",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/dynamic-labs/dynamic-auth.git",
@@ -30,11 +30,12 @@
30
30
  "get-starknet-core": "3.2.0",
31
31
  "text-encoding": "0.7.0",
32
32
  "starknetkit": "1.1.3",
33
- "@dynamic-labs/sdk-api-core": "0.0.461",
34
- "@dynamic-labs/rpc-provider-starknet": "3.0.0-alpha.5",
35
- "@dynamic-labs/utils": "3.0.0-alpha.5",
36
- "@dynamic-labs/wallet-book": "3.0.0-alpha.5",
37
- "@dynamic-labs/wallet-connector-core": "3.0.0-alpha.5"
33
+ "@dynamic-labs/sdk-api-core": "0.0.470",
34
+ "@module-federation/runtime": "0.1.18",
35
+ "@dynamic-labs/rpc-provider-starknet": "3.0.0-alpha.6",
36
+ "@dynamic-labs/utils": "3.0.0-alpha.6",
37
+ "@dynamic-labs/wallet-book": "3.0.0-alpha.6",
38
+ "@dynamic-labs/wallet-connector-core": "3.0.0-alpha.6"
38
39
  },
39
40
  "peerDependencies": {}
40
41
  }
package/src/index.cjs CHANGED
@@ -9,6 +9,7 @@ var argentxMobile = require('./wallets/argentxMobile.cjs');
9
9
  var argentxWeb = require('./wallets/argentxWeb.cjs');
10
10
  var bitget = require('./wallets/bitget.cjs');
11
11
  var okx = require('./wallets/okx.cjs');
12
+ var metamask = require('./wallets/metamask.cjs');
12
13
  require('@dynamic-labs/rpc-provider-starknet');
13
14
 
14
15
  /* eslint-disable @typescript-eslint/no-unused-vars */
@@ -19,6 +20,7 @@ const StarknetWalletConnectors = (props) => [
19
20
  argentxWeb.ArgentXWeb,
20
21
  okx.Okx,
21
22
  bitget.Bitget,
23
+ metamask.MetaMask,
22
24
  ];
23
25
 
24
26
  exports.StarknetWalletConnectors = StarknetWalletConnectors;
package/src/index.js CHANGED
@@ -5,6 +5,7 @@ import { ArgentXMobile } from './wallets/argentxMobile.js';
5
5
  import { ArgentXWeb } from './wallets/argentxWeb.js';
6
6
  import { Bitget } from './wallets/bitget.js';
7
7
  import { Okx } from './wallets/okx.js';
8
+ import { MetaMask } from './wallets/metamask.js';
8
9
  import '@dynamic-labs/rpc-provider-starknet';
9
10
 
10
11
  /* eslint-disable @typescript-eslint/no-unused-vars */
@@ -15,6 +16,7 @@ const StarknetWalletConnectors = (props) => [
15
16
  ArgentXWeb,
16
17
  Okx,
17
18
  Bitget,
19
+ MetaMask,
18
20
  ];
19
21
 
20
22
  export { StarknetWalletConnectors };
@@ -22,6 +22,8 @@ class StarknetWalletConnector extends walletConnectorCore.WalletConnectorBase {
22
22
  this.connectedChain = 'STARK';
23
23
  this.supportedChains = ['STARK'];
24
24
  this.switchNetworkOnlyFromWallet = true;
25
+ // required for metamask snap integration as MM snaps don't have event listeners
26
+ this.canSetEventListeners = true;
25
27
  this.name = name;
26
28
  this.windowKey = windowKey;
27
29
  this.starknetNetworks = opts.starknetNetworks;
@@ -182,6 +184,24 @@ class StarknetWalletConnector extends walletConnectorCore.WalletConnectorBase {
182
184
  if (!wallet) {
183
185
  return [];
184
186
  }
187
+ try {
188
+ yield this.reconnectIfNeeded(wallet);
189
+ }
190
+ catch (e) {
191
+ return [];
192
+ }
193
+ const getSelectedAddress = () => wallet.selectedAddress
194
+ ? Promise.resolve([wallet.selectedAddress])
195
+ : Promise.reject();
196
+ return utils.retryableFn(getSelectedAddress, {
197
+ fallbackValue: [],
198
+ retryIntervalMs: 100,
199
+ retryStrategy: 'timeout-and-rejection',
200
+ });
201
+ });
202
+ }
203
+ reconnectIfNeeded(wallet) {
204
+ return _tslib.__awaiter(this, void 0, void 0, function* () {
185
205
  const needsReconnection = !this.isProviderConnected() && (yield wallet.isPreauthorized());
186
206
  if (needsReconnection) {
187
207
  /**
@@ -199,24 +219,18 @@ class StarknetWalletConnector extends walletConnectorCore.WalletConnectorBase {
199
219
  }
200
220
  catch (_a) {
201
221
  localStorage.removeItem('dynamic_should_have_wallet');
202
- return [];
222
+ throw new Error('Could not reconnect');
203
223
  }
204
224
  }
205
225
  else {
206
226
  yield this.connect();
207
227
  }
208
228
  }
209
- const getSelectedAddress = () => wallet.selectedAddress
210
- ? Promise.resolve([wallet.selectedAddress])
211
- : Promise.reject();
212
- return utils.retryableFn(getSelectedAddress, {
213
- fallbackValue: [],
214
- retryIntervalMs: 100,
215
- retryStrategy: 'timeout-and-rejection',
216
- });
217
229
  });
218
230
  }
219
231
  setupEventListeners() {
232
+ if (!this.canSetEventListeners)
233
+ return;
220
234
  const wallet = this.getWallet();
221
235
  if (!wallet) {
222
236
  return walletConnectorCore.logger.error('Wallet has not been found');
@@ -245,6 +259,8 @@ class StarknetWalletConnector extends walletConnectorCore.WalletConnectorBase {
245
259
  }
246
260
  teardownEventListeners() {
247
261
  return _tslib.__awaiter(this, void 0, void 0, function* () {
262
+ if (!this.canSetEventListeners)
263
+ return;
248
264
  const wallet = this.getWallet();
249
265
  if (this.handleAccountChange) {
250
266
  wallet === null || wallet === void 0 ? void 0 : wallet.off(ACCOUNT_CHANGED_EVENT_LISTENER, this.handleAccountChange);
@@ -23,6 +23,7 @@ declare abstract class StarknetWalletConnector extends WalletConnectorBase {
23
23
  handleNetworkChange: NetworkChangeEventHandler | undefined;
24
24
  switchNetworkOnlyFromWallet: boolean;
25
25
  starknetNetworks: NetworkConfiguration[];
26
+ canSetEventListeners: boolean;
26
27
  constructor(name: string, windowKey: StarknetWalletKey, opts: {
27
28
  chainRpcProviders: IChainRpcProviders;
28
29
  starknetNetworks: NetworkConfiguration[];
@@ -63,6 +64,10 @@ declare abstract class StarknetWalletConnector extends WalletConnectorBase {
63
64
  features: string[];
64
65
  name: string;
65
66
  } | undefined;
67
+ walletStandardLocators?: {
68
+ name: string;
69
+ locator: string;
70
+ }[] | undefined;
66
71
  windowLocations?: string[] | undefined;
67
72
  }[] | undefined;
68
73
  mobile?: {
@@ -98,6 +103,7 @@ declare abstract class StarknetWalletConnector extends WalletConnectorBase {
98
103
  getWallet(): StarknetWindowObject | undefined;
99
104
  isInstalledOnBrowser(): boolean;
100
105
  getConnectedAccounts(): Promise<string[]>;
106
+ reconnectIfNeeded(wallet: StarknetWindowObject): Promise<Promise<Promise<void>>>;
101
107
  setupEventListeners(): void;
102
108
  teardownEventListeners(): Promise<void>;
103
109
  mapNetworkNameToChainId(networkNameOrChainId: string): constants.StarknetChainId | undefined;
@@ -18,6 +18,8 @@ class StarknetWalletConnector extends WalletConnectorBase {
18
18
  this.connectedChain = 'STARK';
19
19
  this.supportedChains = ['STARK'];
20
20
  this.switchNetworkOnlyFromWallet = true;
21
+ // required for metamask snap integration as MM snaps don't have event listeners
22
+ this.canSetEventListeners = true;
21
23
  this.name = name;
22
24
  this.windowKey = windowKey;
23
25
  this.starknetNetworks = opts.starknetNetworks;
@@ -178,6 +180,24 @@ class StarknetWalletConnector extends WalletConnectorBase {
178
180
  if (!wallet) {
179
181
  return [];
180
182
  }
183
+ try {
184
+ yield this.reconnectIfNeeded(wallet);
185
+ }
186
+ catch (e) {
187
+ return [];
188
+ }
189
+ const getSelectedAddress = () => wallet.selectedAddress
190
+ ? Promise.resolve([wallet.selectedAddress])
191
+ : Promise.reject();
192
+ return retryableFn(getSelectedAddress, {
193
+ fallbackValue: [],
194
+ retryIntervalMs: 100,
195
+ retryStrategy: 'timeout-and-rejection',
196
+ });
197
+ });
198
+ }
199
+ reconnectIfNeeded(wallet) {
200
+ return __awaiter(this, void 0, void 0, function* () {
181
201
  const needsReconnection = !this.isProviderConnected() && (yield wallet.isPreauthorized());
182
202
  if (needsReconnection) {
183
203
  /**
@@ -195,24 +215,18 @@ class StarknetWalletConnector extends WalletConnectorBase {
195
215
  }
196
216
  catch (_a) {
197
217
  localStorage.removeItem('dynamic_should_have_wallet');
198
- return [];
218
+ throw new Error('Could not reconnect');
199
219
  }
200
220
  }
201
221
  else {
202
222
  yield this.connect();
203
223
  }
204
224
  }
205
- const getSelectedAddress = () => wallet.selectedAddress
206
- ? Promise.resolve([wallet.selectedAddress])
207
- : Promise.reject();
208
- return retryableFn(getSelectedAddress, {
209
- fallbackValue: [],
210
- retryIntervalMs: 100,
211
- retryStrategy: 'timeout-and-rejection',
212
- });
213
225
  });
214
226
  }
215
227
  setupEventListeners() {
228
+ if (!this.canSetEventListeners)
229
+ return;
216
230
  const wallet = this.getWallet();
217
231
  if (!wallet) {
218
232
  return logger.error('Wallet has not been found');
@@ -241,6 +255,8 @@ class StarknetWalletConnector extends WalletConnectorBase {
241
255
  }
242
256
  teardownEventListeners() {
243
257
  return __awaiter(this, void 0, void 0, function* () {
258
+ if (!this.canSetEventListeners)
259
+ return;
244
260
  const wallet = this.getWallet();
245
261
  if (this.handleAccountChange) {
246
262
  wallet === null || wallet === void 0 ? void 0 : wallet.off(ACCOUNT_CHANGED_EVENT_LISTENER, this.handleAccountChange);
package/src/types.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import type { StarknetWindowObject } from 'get-starknet-core';
2
- export type StarknetWalletKey = 'braavos' | 'argentX' | 'argentXMobile' | 'argentWebWallet' | 'okxwallet' | 'bitkeep';
2
+ export type StarknetWalletKey = 'braavos' | 'argentX' | 'argentXMobile' | 'argentWebWallet' | 'okxwallet' | 'bitkeep' | 'metamask_snap';
3
3
  export type StarknetWindowKey = `starknet_${StarknetWalletKey}` | 'starknet';
4
4
  type StarknetWindow = {
5
5
  [key in StarknetWindowKey]: StarknetWindowObject;
@@ -0,0 +1,81 @@
1
+ 'use client'
2
+ 'use strict';
3
+
4
+ Object.defineProperty(exports, '__esModule', { value: true });
5
+
6
+ var _tslib = require('../../_virtual/_tslib.cjs');
7
+ var index_cjs_js = require('@module-federation/runtime/dist/index.cjs.js');
8
+
9
+ let metaMaskSnapWallet;
10
+ /**
11
+ *
12
+ * @param {IEthereum} provider the metamask window provider object
13
+ * @returns {StarknetWindowObject} the metamask provider wrapper formed into starknet window object
14
+ */
15
+ const createMetaMaskProviderWrapper = (provider) => {
16
+ const metaMaskProviderWrapper = {
17
+ get account() {
18
+ return metaMaskSnapWallet === null || metaMaskSnapWallet === void 0 ? void 0 : metaMaskSnapWallet.account;
19
+ },
20
+ get chainId() {
21
+ return metaMaskSnapWallet === null || metaMaskSnapWallet === void 0 ? void 0 : metaMaskSnapWallet.chainId;
22
+ },
23
+ enable: () => _tslib.__awaiter(void 0, void 0, void 0, function* () {
24
+ if (!metaMaskSnapWallet) {
25
+ yield index_cjs_js.init({
26
+ name: 'MetaMaskStarknetSnapWallet',
27
+ remotes: [
28
+ {
29
+ alias: 'MetaMaskStarknetSnapWallet',
30
+ entry: 'https://snaps.consensys.io/starknet/get-starknet/v1/remoteEntry.js',
31
+ name: 'MetaMaskStarknetSnapWallet',
32
+ },
33
+ ],
34
+ });
35
+ const result = yield index_cjs_js.loadRemote('MetaMaskStarknetSnapWallet/index');
36
+ const { MetaMaskSnapWallet } = result;
37
+ metaMaskSnapWallet = new MetaMaskSnapWallet(provider, '*');
38
+ }
39
+ if (!metaMaskSnapWallet) {
40
+ return [];
41
+ }
42
+ return metaMaskSnapWallet.enable();
43
+ }),
44
+ icon: '',
45
+ id: 'MetaMaskStarknetSnapWallet',
46
+ get isConnected() {
47
+ return metaMaskSnapWallet === null || metaMaskSnapWallet === void 0 ? void 0 : metaMaskSnapWallet.isConnected;
48
+ },
49
+ isPreauthorized: () => { var _a; return (_a = metaMaskSnapWallet === null || metaMaskSnapWallet === void 0 ? void 0 : metaMaskSnapWallet.isPreauthorized()) !== null && _a !== void 0 ? _a : Promise.resolve(false); },
50
+ name: 'MetaMaskStarknetSnapWallet',
51
+ off: (
52
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
53
+ event,
54
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
55
+ handleEvent) => undefined,
56
+ on: (
57
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
58
+ event,
59
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
60
+ handleEvent) => undefined,
61
+ get provider() {
62
+ return metaMaskSnapWallet === null || metaMaskSnapWallet === void 0 ? void 0 : metaMaskSnapWallet.provider;
63
+ },
64
+ request: (call) => {
65
+ if (!metaMaskSnapWallet) {
66
+ throw new Error('Wallet not enabled');
67
+ }
68
+ return metaMaskSnapWallet.request(call);
69
+ },
70
+ get selectedAddress() {
71
+ return metaMaskSnapWallet === null || metaMaskSnapWallet === void 0 ? void 0 : metaMaskSnapWallet.selectedAddress;
72
+ },
73
+ get version() {
74
+ var _a;
75
+ return (_a = metaMaskSnapWallet === null || metaMaskSnapWallet === void 0 ? void 0 : metaMaskSnapWallet.version) !== null && _a !== void 0 ? _a : '0.0.0';
76
+ },
77
+ };
78
+ return metaMaskProviderWrapper;
79
+ };
80
+
81
+ exports.createMetaMaskProviderWrapper = createMetaMaskProviderWrapper;
@@ -0,0 +1,8 @@
1
+ import { StarknetWindowObject } from 'get-starknet-core';
2
+ import { IEthereum } from '@dynamic-labs/utils';
3
+ /**
4
+ *
5
+ * @param {IEthereum} provider the metamask window provider object
6
+ * @returns {StarknetWindowObject} the metamask provider wrapper formed into starknet window object
7
+ */
8
+ export declare const createMetaMaskProviderWrapper: (provider: IEthereum) => StarknetWindowObject;
@@ -0,0 +1,77 @@
1
+ 'use client'
2
+ import { __awaiter } from '../../_virtual/_tslib.js';
3
+ import { init, loadRemote } from '@module-federation/runtime/dist/index.cjs.js';
4
+
5
+ let metaMaskSnapWallet;
6
+ /**
7
+ *
8
+ * @param {IEthereum} provider the metamask window provider object
9
+ * @returns {StarknetWindowObject} the metamask provider wrapper formed into starknet window object
10
+ */
11
+ const createMetaMaskProviderWrapper = (provider) => {
12
+ const metaMaskProviderWrapper = {
13
+ get account() {
14
+ return metaMaskSnapWallet === null || metaMaskSnapWallet === void 0 ? void 0 : metaMaskSnapWallet.account;
15
+ },
16
+ get chainId() {
17
+ return metaMaskSnapWallet === null || metaMaskSnapWallet === void 0 ? void 0 : metaMaskSnapWallet.chainId;
18
+ },
19
+ enable: () => __awaiter(void 0, void 0, void 0, function* () {
20
+ if (!metaMaskSnapWallet) {
21
+ yield init({
22
+ name: 'MetaMaskStarknetSnapWallet',
23
+ remotes: [
24
+ {
25
+ alias: 'MetaMaskStarknetSnapWallet',
26
+ entry: 'https://snaps.consensys.io/starknet/get-starknet/v1/remoteEntry.js',
27
+ name: 'MetaMaskStarknetSnapWallet',
28
+ },
29
+ ],
30
+ });
31
+ const result = yield loadRemote('MetaMaskStarknetSnapWallet/index');
32
+ const { MetaMaskSnapWallet } = result;
33
+ metaMaskSnapWallet = new MetaMaskSnapWallet(provider, '*');
34
+ }
35
+ if (!metaMaskSnapWallet) {
36
+ return [];
37
+ }
38
+ return metaMaskSnapWallet.enable();
39
+ }),
40
+ icon: '',
41
+ id: 'MetaMaskStarknetSnapWallet',
42
+ get isConnected() {
43
+ return metaMaskSnapWallet === null || metaMaskSnapWallet === void 0 ? void 0 : metaMaskSnapWallet.isConnected;
44
+ },
45
+ isPreauthorized: () => { var _a; return (_a = metaMaskSnapWallet === null || metaMaskSnapWallet === void 0 ? void 0 : metaMaskSnapWallet.isPreauthorized()) !== null && _a !== void 0 ? _a : Promise.resolve(false); },
46
+ name: 'MetaMaskStarknetSnapWallet',
47
+ off: (
48
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
49
+ event,
50
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
51
+ handleEvent) => undefined,
52
+ on: (
53
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
54
+ event,
55
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
56
+ handleEvent) => undefined,
57
+ get provider() {
58
+ return metaMaskSnapWallet === null || metaMaskSnapWallet === void 0 ? void 0 : metaMaskSnapWallet.provider;
59
+ },
60
+ request: (call) => {
61
+ if (!metaMaskSnapWallet) {
62
+ throw new Error('Wallet not enabled');
63
+ }
64
+ return metaMaskSnapWallet.request(call);
65
+ },
66
+ get selectedAddress() {
67
+ return metaMaskSnapWallet === null || metaMaskSnapWallet === void 0 ? void 0 : metaMaskSnapWallet.selectedAddress;
68
+ },
69
+ get version() {
70
+ var _a;
71
+ return (_a = metaMaskSnapWallet === null || metaMaskSnapWallet === void 0 ? void 0 : metaMaskSnapWallet.version) !== null && _a !== void 0 ? _a : '0.0.0';
72
+ },
73
+ };
74
+ return metaMaskProviderWrapper;
75
+ };
76
+
77
+ export { createMetaMaskProviderWrapper };
@@ -0,0 +1,49 @@
1
+ 'use client'
2
+ 'use strict';
3
+
4
+ Object.defineProperty(exports, '__esModule', { value: true });
5
+
6
+ var _tslib = require('../../_virtual/_tslib.cjs');
7
+ var utils = require('@dynamic-labs/utils');
8
+ var starknetWalletConnector = require('../starknetWalletConnector.cjs');
9
+ var starknetSnap = require('../utils/starknetSnap.cjs');
10
+
11
+ class MetaMask extends starknetWalletConnector["default"] {
12
+ constructor(opts) {
13
+ super('MetaMask Starknet', 'metamask_snap', opts);
14
+ this.overrideKey = 'metamaskstarknet';
15
+ this.canSetEventListeners = false;
16
+ if (!window.starknet_metamask_snap) {
17
+ const { providers } = utils.Eip6963ProviderSingleton.get();
18
+ const metamaskProvider = providers.find((p) => ['io.metamask', 'io.metamask.flask'].includes(p.info.rdns));
19
+ if (metamaskProvider) {
20
+ window.starknet_metamask_snap = starknetSnap.createMetaMaskProviderWrapper(metamaskProvider.provider);
21
+ }
22
+ }
23
+ }
24
+ getConnectedAccounts() {
25
+ return _tslib.__awaiter(this, void 0, void 0, function* () {
26
+ const wallet = this.getWallet();
27
+ if (!wallet) {
28
+ return [];
29
+ }
30
+ try {
31
+ yield this.reconnectIfNeeded(wallet);
32
+ }
33
+ catch (e) {
34
+ return [];
35
+ }
36
+ const getSelectedAddress = () => wallet.selectedAddress
37
+ ? Promise.resolve([wallet.selectedAddress])
38
+ : Promise.reject();
39
+ return utils.retryableFn(getSelectedAddress, {
40
+ fallbackValue: [],
41
+ maxRetries: 10,
42
+ retryIntervalMs: 750,
43
+ retryStrategy: 'timeout-and-rejection',
44
+ });
45
+ });
46
+ }
47
+ }
48
+
49
+ exports.MetaMask = MetaMask;
@@ -0,0 +1,8 @@
1
+ import { type WalletConnector } from '@dynamic-labs/wallet-connector-core';
2
+ import StarknetProvider from '../starknetWalletConnector';
3
+ export declare class MetaMask extends StarknetProvider implements WalletConnector {
4
+ overrideKey: string;
5
+ canSetEventListeners: boolean;
6
+ constructor(opts: any);
7
+ getConnectedAccounts(): Promise<string[]>;
8
+ }
@@ -0,0 +1,45 @@
1
+ 'use client'
2
+ import { __awaiter } from '../../_virtual/_tslib.js';
3
+ import { Eip6963ProviderSingleton, retryableFn } from '@dynamic-labs/utils';
4
+ import StarknetWalletConnector from '../starknetWalletConnector.js';
5
+ import { createMetaMaskProviderWrapper } from '../utils/starknetSnap.js';
6
+
7
+ class MetaMask extends StarknetWalletConnector {
8
+ constructor(opts) {
9
+ super('MetaMask Starknet', 'metamask_snap', opts);
10
+ this.overrideKey = 'metamaskstarknet';
11
+ this.canSetEventListeners = false;
12
+ if (!window.starknet_metamask_snap) {
13
+ const { providers } = Eip6963ProviderSingleton.get();
14
+ const metamaskProvider = providers.find((p) => ['io.metamask', 'io.metamask.flask'].includes(p.info.rdns));
15
+ if (metamaskProvider) {
16
+ window.starknet_metamask_snap = createMetaMaskProviderWrapper(metamaskProvider.provider);
17
+ }
18
+ }
19
+ }
20
+ getConnectedAccounts() {
21
+ return __awaiter(this, void 0, void 0, function* () {
22
+ const wallet = this.getWallet();
23
+ if (!wallet) {
24
+ return [];
25
+ }
26
+ try {
27
+ yield this.reconnectIfNeeded(wallet);
28
+ }
29
+ catch (e) {
30
+ return [];
31
+ }
32
+ const getSelectedAddress = () => wallet.selectedAddress
33
+ ? Promise.resolve([wallet.selectedAddress])
34
+ : Promise.reject();
35
+ return retryableFn(getSelectedAddress, {
36
+ fallbackValue: [],
37
+ maxRetries: 10,
38
+ retryIntervalMs: 750,
39
+ retryStrategy: 'timeout-and-rejection',
40
+ });
41
+ });
42
+ }
43
+ }
44
+
45
+ export { MetaMask };