@dynamic-labs/starknet 1.4.13 → 1.4.15

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,6 +1,18 @@
1
1
 
2
+ ### [1.4.15](https://github.com/dynamic-labs/DynamicAuth/compare/v1.4.14...v1.4.15) (2024-07-17)
3
+
4
+
5
+ ### Bug Fixes
6
+
7
+ * re-establish connection to metamask starknet snap on page reload ([#6362](https://github.com/dynamic-labs/DynamicAuth/issues/6362)) ([176bd0e](https://github.com/dynamic-labs/DynamicAuth/commit/176bd0e096a523731e815b1e32961509db1e05d2))
8
+
9
+ ### [1.4.14](https://github.com/dynamic-labs/DynamicAuth/compare/v1.4.13...v1.4.14) (2024-07-11)
10
+
2
11
  ### [1.4.13](https://github.com/dynamic-labs/DynamicAuth/compare/v1.4.12...v1.4.13) (2024-06-05)
3
12
 
13
+ ### Features
14
+
15
+ * add the Starknet MetaMask snap to the available wallets
4
16
 
5
17
  ### Bug Fixes
6
18
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dynamic-labs/starknet",
3
- "version": "1.4.13",
3
+ "version": "1.4.15",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/dynamic-labs/DynamicAuth.git",
@@ -31,11 +31,12 @@
31
31
  "text-encoding": "0.7.0",
32
32
  "starknetkit": "1.1.3",
33
33
  "@dynamic-labs/sdk-api": "0.0.387",
34
- "@dynamic-labs/rpc-providers": "1.4.13",
35
- "@dynamic-labs/types": "1.4.13",
36
- "@dynamic-labs/utils": "1.4.13",
37
- "@dynamic-labs/wallet-book": "1.4.13",
38
- "@dynamic-labs/wallet-connector-core": "1.4.13"
34
+ "@module-federation/runtime": "0.1.19",
35
+ "@dynamic-labs/rpc-providers": "1.4.15",
36
+ "@dynamic-labs/types": "1.4.15",
37
+ "@dynamic-labs/utils": "1.4.15",
38
+ "@dynamic-labs/wallet-book": "1.4.15",
39
+ "@dynamic-labs/wallet-connector-core": "1.4.15"
39
40
  },
40
41
  "peerDependencies": {}
41
42
  }
package/src/index.cjs CHANGED
@@ -8,6 +8,7 @@ var argentxMobile = require('./wallets/argentxMobile.cjs');
8
8
  var argentxWeb = require('./wallets/argentxWeb.cjs');
9
9
  var bitget = require('./wallets/bitget.cjs');
10
10
  var okx = require('./wallets/okx.cjs');
11
+ var metamask = require('./wallets/metamask.cjs');
11
12
 
12
13
  /* eslint-disable @typescript-eslint/no-unused-vars */
13
14
  const StarknetWalletConnectors = (props) => [
@@ -17,6 +18,7 @@ const StarknetWalletConnectors = (props) => [
17
18
  argentxWeb.ArgentXWeb,
18
19
  okx.Okx,
19
20
  bitget.Bitget,
21
+ metamask.MetaMask,
20
22
  ];
21
23
 
22
24
  exports.StarknetWalletConnectors = StarknetWalletConnectors;
package/src/index.js CHANGED
@@ -4,6 +4,7 @@ import { ArgentXMobile } from './wallets/argentxMobile.js';
4
4
  import { ArgentXWeb } from './wallets/argentxWeb.js';
5
5
  import { Bitget } from './wallets/bitget.js';
6
6
  import { Okx } from './wallets/okx.js';
7
+ import { MetaMask } from './wallets/metamask.js';
7
8
 
8
9
  /* eslint-disable @typescript-eslint/no-unused-vars */
9
10
  const StarknetWalletConnectors = (props) => [
@@ -13,6 +14,7 @@ const StarknetWalletConnectors = (props) => [
13
14
  ArgentXWeb,
14
15
  Okx,
15
16
  Bitget,
17
+ MetaMask,
16
18
  ];
17
19
 
18
20
  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;
@@ -201,6 +203,24 @@ class StarknetWalletConnector extends walletConnectorCore.WalletConnectorBase {
201
203
  if (!wallet) {
202
204
  return [];
203
205
  }
206
+ try {
207
+ yield this.reconnectIfNeeded(wallet);
208
+ }
209
+ catch (e) {
210
+ return [];
211
+ }
212
+ const getSelectedAddress = () => wallet.selectedAddress
213
+ ? Promise.resolve([wallet.selectedAddress])
214
+ : Promise.reject();
215
+ return utils.retryableFn(getSelectedAddress, {
216
+ fallbackValue: [],
217
+ retryIntervalMs: 100,
218
+ retryStrategy: 'timeout-and-rejection',
219
+ });
220
+ });
221
+ }
222
+ reconnectIfNeeded(wallet) {
223
+ return _tslib.__awaiter(this, void 0, void 0, function* () {
204
224
  const needsReconnection = !this.isProviderConnected() && (yield wallet.isPreauthorized());
205
225
  if (needsReconnection) {
206
226
  /**
@@ -218,24 +238,18 @@ class StarknetWalletConnector extends walletConnectorCore.WalletConnectorBase {
218
238
  }
219
239
  catch (_a) {
220
240
  localStorage.removeItem('dynamic_should_have_wallet');
221
- return [];
241
+ throw new Error('Could not reconnect');
222
242
  }
223
243
  }
224
244
  else {
225
245
  yield this.connect();
226
246
  }
227
247
  }
228
- const getSelectedAddress = () => wallet.selectedAddress
229
- ? Promise.resolve([wallet.selectedAddress])
230
- : Promise.reject();
231
- return utils.retryableFn(getSelectedAddress, {
232
- fallbackValue: [],
233
- retryIntervalMs: 100,
234
- retryStrategy: 'timeout-and-rejection',
235
- });
236
248
  });
237
249
  }
238
250
  setupEventListeners() {
251
+ if (!this.canSetEventListeners)
252
+ return;
239
253
  const wallet = this.getWallet();
240
254
  if (!wallet) {
241
255
  return walletConnectorCore.logger.error('Wallet has not been found');
@@ -264,6 +278,8 @@ class StarknetWalletConnector extends walletConnectorCore.WalletConnectorBase {
264
278
  }
265
279
  teardownEventListeners() {
266
280
  return _tslib.__awaiter(this, void 0, void 0, function* () {
281
+ if (!this.canSetEventListeners)
282
+ return;
267
283
  const wallet = this.getWallet();
268
284
  if (this.handleAccountChange) {
269
285
  wallet === null || wallet === void 0 ? void 0 : wallet.off(ACCOUNT_CHANGED_EVENT_LISTENER, this.handleAccountChange);
@@ -24,6 +24,7 @@ declare abstract class StarknetWalletConnector extends WalletConnectorBase {
24
24
  handleNetworkChange: NetworkChangeEventHandler | undefined;
25
25
  switchNetworkOnlyFromWallet: boolean;
26
26
  starknetNetworks: NetworkConfiguration[];
27
+ canSetEventListeners: boolean;
27
28
  constructor(name: string, windowKey: StarknetWalletKey, opts: {
28
29
  chainRpcProviders: typeof ChainRpcProviders;
29
30
  starknetNetworks: NetworkConfiguration[];
@@ -100,6 +101,7 @@ declare abstract class StarknetWalletConnector extends WalletConnectorBase {
100
101
  getWallet(): StarknetWindowObject | undefined;
101
102
  isInstalledOnBrowser(): boolean;
102
103
  getConnectedAccounts(): Promise<string[]>;
104
+ reconnectIfNeeded(wallet: StarknetWindowObject): Promise<Promise<Promise<void>>>;
103
105
  setupEventListeners(): void;
104
106
  teardownEventListeners(): Promise<void>;
105
107
  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;
@@ -197,6 +199,24 @@ class StarknetWalletConnector extends WalletConnectorBase {
197
199
  if (!wallet) {
198
200
  return [];
199
201
  }
202
+ try {
203
+ yield this.reconnectIfNeeded(wallet);
204
+ }
205
+ catch (e) {
206
+ return [];
207
+ }
208
+ const getSelectedAddress = () => wallet.selectedAddress
209
+ ? Promise.resolve([wallet.selectedAddress])
210
+ : Promise.reject();
211
+ return retryableFn(getSelectedAddress, {
212
+ fallbackValue: [],
213
+ retryIntervalMs: 100,
214
+ retryStrategy: 'timeout-and-rejection',
215
+ });
216
+ });
217
+ }
218
+ reconnectIfNeeded(wallet) {
219
+ return __awaiter(this, void 0, void 0, function* () {
200
220
  const needsReconnection = !this.isProviderConnected() && (yield wallet.isPreauthorized());
201
221
  if (needsReconnection) {
202
222
  /**
@@ -214,24 +234,18 @@ class StarknetWalletConnector extends WalletConnectorBase {
214
234
  }
215
235
  catch (_a) {
216
236
  localStorage.removeItem('dynamic_should_have_wallet');
217
- return [];
237
+ throw new Error('Could not reconnect');
218
238
  }
219
239
  }
220
240
  else {
221
241
  yield this.connect();
222
242
  }
223
243
  }
224
- const getSelectedAddress = () => wallet.selectedAddress
225
- ? Promise.resolve([wallet.selectedAddress])
226
- : Promise.reject();
227
- return retryableFn(getSelectedAddress, {
228
- fallbackValue: [],
229
- retryIntervalMs: 100,
230
- retryStrategy: 'timeout-and-rejection',
231
- });
232
244
  });
233
245
  }
234
246
  setupEventListeners() {
247
+ if (!this.canSetEventListeners)
248
+ return;
235
249
  const wallet = this.getWallet();
236
250
  if (!wallet) {
237
251
  return logger.error('Wallet has not been found');
@@ -260,6 +274,8 @@ class StarknetWalletConnector extends WalletConnectorBase {
260
274
  }
261
275
  teardownEventListeners() {
262
276
  return __awaiter(this, void 0, void 0, function* () {
277
+ if (!this.canSetEventListeners)
278
+ return;
263
279
  const wallet = this.getWallet();
264
280
  if (this.handleAccountChange) {
265
281
  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,111 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var _tslib = require('../../_virtual/_tslib.cjs');
6
+ var moduleFederation = require('@module-federation/runtime/dist/index.cjs.js');
7
+
8
+ function _interopNamespace(e) {
9
+ if (e && e.__esModule) return e;
10
+ var n = Object.create(null);
11
+ if (e) {
12
+ Object.keys(e).forEach(function (k) {
13
+ if (k !== 'default') {
14
+ var d = Object.getOwnPropertyDescriptor(e, k);
15
+ Object.defineProperty(n, k, d.get ? d : {
16
+ enumerable: true,
17
+ get: function () { return e[k]; }
18
+ });
19
+ }
20
+ });
21
+ }
22
+ n["default"] = e;
23
+ return Object.freeze(n);
24
+ }
25
+
26
+ var moduleFederation__namespace = /*#__PURE__*/_interopNamespace(moduleFederation);
27
+
28
+ /**
29
+ *
30
+ * @param {IEthereum} provider the metamask window provider object
31
+ * @returns {StarknetWindowObject} the metamask provider wrapper formed into starknet window object
32
+ */
33
+ const createMetaMaskProviderWrapper = (provider) => {
34
+ let metaMaskSnapWallet;
35
+ // using @module-federation to load the get-starknet remoteEntry, as recommended
36
+ // by the starknet team. this file is a small wrapper around the metamask snap api
37
+ // to communicate with starknet, which we then wrap into a starknet window object
38
+ // and use in our starknet connector, just like braavos and argent
39
+ const initMetaMaskSnapWallet = () => _tslib.__awaiter(void 0, void 0, void 0, function* () {
40
+ if (!metaMaskSnapWallet) {
41
+ moduleFederation__namespace.init({
42
+ name: 'MetaMaskStarknetSnapWallet',
43
+ remotes: [
44
+ {
45
+ alias: 'MetaMaskStarknetSnapWallet',
46
+ entry: 'https://snaps.consensys.io/starknet/get-starknet/v1/remoteEntry.js',
47
+ name: 'MetaMaskStarknetSnapWallet',
48
+ },
49
+ ],
50
+ });
51
+ const result = yield moduleFederation__namespace.loadRemote('MetaMaskStarknetSnapWallet/index');
52
+ const { MetaMaskSnapWallet } = result;
53
+ metaMaskSnapWallet = new MetaMaskSnapWallet(provider, '*');
54
+ }
55
+ });
56
+ const metaMaskProviderWrapper = {
57
+ get account() {
58
+ return metaMaskSnapWallet === null || metaMaskSnapWallet === void 0 ? void 0 : metaMaskSnapWallet.account;
59
+ },
60
+ get chainId() {
61
+ return metaMaskSnapWallet === null || metaMaskSnapWallet === void 0 ? void 0 : metaMaskSnapWallet.chainId;
62
+ },
63
+ enable: () => _tslib.__awaiter(void 0, void 0, void 0, function* () {
64
+ yield initMetaMaskSnapWallet();
65
+ if (!metaMaskSnapWallet) {
66
+ return [];
67
+ }
68
+ return metaMaskSnapWallet.enable();
69
+ }),
70
+ icon: '',
71
+ id: 'MetaMaskStarknetSnapWallet',
72
+ get isConnected() {
73
+ return metaMaskSnapWallet === null || metaMaskSnapWallet === void 0 ? void 0 : metaMaskSnapWallet.isConnected;
74
+ },
75
+ isPreauthorized: () => _tslib.__awaiter(void 0, void 0, void 0, function* () {
76
+ var _a;
77
+ yield initMetaMaskSnapWallet();
78
+ return (_a = (yield (metaMaskSnapWallet === null || metaMaskSnapWallet === void 0 ? void 0 : metaMaskSnapWallet.isPreauthorized()))) !== null && _a !== void 0 ? _a : false;
79
+ }),
80
+ name: 'MetaMaskStarknetSnapWallet',
81
+ off: (
82
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
83
+ event,
84
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
85
+ handleEvent) => undefined,
86
+ on: (
87
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
88
+ event,
89
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
90
+ handleEvent) => undefined,
91
+ get provider() {
92
+ return metaMaskSnapWallet === null || metaMaskSnapWallet === void 0 ? void 0 : metaMaskSnapWallet.provider;
93
+ },
94
+ request: (call) => {
95
+ if (!metaMaskSnapWallet) {
96
+ throw new Error('Wallet not enabled');
97
+ }
98
+ return metaMaskSnapWallet.request(call);
99
+ },
100
+ get selectedAddress() {
101
+ return metaMaskSnapWallet === null || metaMaskSnapWallet === void 0 ? void 0 : metaMaskSnapWallet.selectedAddress;
102
+ },
103
+ get version() {
104
+ var _a;
105
+ return (_a = metaMaskSnapWallet === null || metaMaskSnapWallet === void 0 ? void 0 : metaMaskSnapWallet.version) !== null && _a !== void 0 ? _a : '0.0.0';
106
+ },
107
+ };
108
+ return metaMaskProviderWrapper;
109
+ };
110
+
111
+ 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,87 @@
1
+ import { __awaiter } from '../../_virtual/_tslib.js';
2
+ import * as moduleFederation from '@module-federation/runtime/dist/index.cjs.js';
3
+
4
+ /**
5
+ *
6
+ * @param {IEthereum} provider the metamask window provider object
7
+ * @returns {StarknetWindowObject} the metamask provider wrapper formed into starknet window object
8
+ */
9
+ const createMetaMaskProviderWrapper = (provider) => {
10
+ let metaMaskSnapWallet;
11
+ // using @module-federation to load the get-starknet remoteEntry, as recommended
12
+ // by the starknet team. this file is a small wrapper around the metamask snap api
13
+ // to communicate with starknet, which we then wrap into a starknet window object
14
+ // and use in our starknet connector, just like braavos and argent
15
+ const initMetaMaskSnapWallet = () => __awaiter(void 0, void 0, void 0, function* () {
16
+ if (!metaMaskSnapWallet) {
17
+ moduleFederation.init({
18
+ name: 'MetaMaskStarknetSnapWallet',
19
+ remotes: [
20
+ {
21
+ alias: 'MetaMaskStarknetSnapWallet',
22
+ entry: 'https://snaps.consensys.io/starknet/get-starknet/v1/remoteEntry.js',
23
+ name: 'MetaMaskStarknetSnapWallet',
24
+ },
25
+ ],
26
+ });
27
+ const result = yield moduleFederation.loadRemote('MetaMaskStarknetSnapWallet/index');
28
+ const { MetaMaskSnapWallet } = result;
29
+ metaMaskSnapWallet = new MetaMaskSnapWallet(provider, '*');
30
+ }
31
+ });
32
+ const metaMaskProviderWrapper = {
33
+ get account() {
34
+ return metaMaskSnapWallet === null || metaMaskSnapWallet === void 0 ? void 0 : metaMaskSnapWallet.account;
35
+ },
36
+ get chainId() {
37
+ return metaMaskSnapWallet === null || metaMaskSnapWallet === void 0 ? void 0 : metaMaskSnapWallet.chainId;
38
+ },
39
+ enable: () => __awaiter(void 0, void 0, void 0, function* () {
40
+ yield initMetaMaskSnapWallet();
41
+ if (!metaMaskSnapWallet) {
42
+ return [];
43
+ }
44
+ return metaMaskSnapWallet.enable();
45
+ }),
46
+ icon: '',
47
+ id: 'MetaMaskStarknetSnapWallet',
48
+ get isConnected() {
49
+ return metaMaskSnapWallet === null || metaMaskSnapWallet === void 0 ? void 0 : metaMaskSnapWallet.isConnected;
50
+ },
51
+ isPreauthorized: () => __awaiter(void 0, void 0, void 0, function* () {
52
+ var _a;
53
+ yield initMetaMaskSnapWallet();
54
+ return (_a = (yield (metaMaskSnapWallet === null || metaMaskSnapWallet === void 0 ? void 0 : metaMaskSnapWallet.isPreauthorized()))) !== null && _a !== void 0 ? _a : false;
55
+ }),
56
+ name: 'MetaMaskStarknetSnapWallet',
57
+ off: (
58
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
59
+ event,
60
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
61
+ handleEvent) => undefined,
62
+ on: (
63
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
64
+ event,
65
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
66
+ handleEvent) => undefined,
67
+ get provider() {
68
+ return metaMaskSnapWallet === null || metaMaskSnapWallet === void 0 ? void 0 : metaMaskSnapWallet.provider;
69
+ },
70
+ request: (call) => {
71
+ if (!metaMaskSnapWallet) {
72
+ throw new Error('Wallet not enabled');
73
+ }
74
+ return metaMaskSnapWallet.request(call);
75
+ },
76
+ get selectedAddress() {
77
+ return metaMaskSnapWallet === null || metaMaskSnapWallet === void 0 ? void 0 : metaMaskSnapWallet.selectedAddress;
78
+ },
79
+ get version() {
80
+ var _a;
81
+ return (_a = metaMaskSnapWallet === null || metaMaskSnapWallet === void 0 ? void 0 : metaMaskSnapWallet.version) !== null && _a !== void 0 ? _a : '0.0.0';
82
+ },
83
+ };
84
+ return metaMaskProviderWrapper;
85
+ };
86
+
87
+ export { createMetaMaskProviderWrapper };
@@ -0,0 +1,40 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var _tslib = require('../../_virtual/_tslib.cjs');
6
+ var utils = require('@dynamic-labs/utils');
7
+ var starknetWalletConnector = require('../starknetWalletConnector.cjs');
8
+ var starknetSnap = require('../utils/starknetSnap.cjs');
9
+
10
+ class MetaMask extends starknetWalletConnector["default"] {
11
+ constructor(opts) {
12
+ super('MetaMask Starknet', 'metamask_snap', opts);
13
+ this.overrideKey = 'metamaskstarknet';
14
+ this.canSetEventListeners = false;
15
+ if (!window.starknet_metamask_snap) {
16
+ const { providers } = utils.Eip6963ProviderSingleton.get();
17
+ const metamaskProvider = providers.find((p) => ['io.metamask', 'io.metamask.flask'].includes(p.info.rdns));
18
+ if (metamaskProvider) {
19
+ window.starknet_metamask_snap = starknetSnap.createMetaMaskProviderWrapper(metamaskProvider.provider);
20
+ }
21
+ }
22
+ }
23
+ getConnectedAccounts() {
24
+ return _tslib.__awaiter(this, void 0, void 0, function* () {
25
+ const wallet = this.getWallet();
26
+ if (!wallet) {
27
+ return [];
28
+ }
29
+ const isProviderConnected = this.isProviderConnected();
30
+ const isPreauthorized = yield wallet.isPreauthorized();
31
+ const shouldReconnect = !isProviderConnected && isPreauthorized;
32
+ if (shouldReconnect) {
33
+ yield this.connect();
34
+ }
35
+ return wallet.selectedAddress ? [wallet.selectedAddress] : [];
36
+ });
37
+ }
38
+ }
39
+
40
+ 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,36 @@
1
+ import { __awaiter } from '../../_virtual/_tslib.js';
2
+ import { Eip6963ProviderSingleton } from '@dynamic-labs/utils';
3
+ import StarknetWalletConnector from '../starknetWalletConnector.js';
4
+ import { createMetaMaskProviderWrapper } from '../utils/starknetSnap.js';
5
+
6
+ class MetaMask extends StarknetWalletConnector {
7
+ constructor(opts) {
8
+ super('MetaMask Starknet', 'metamask_snap', opts);
9
+ this.overrideKey = 'metamaskstarknet';
10
+ this.canSetEventListeners = false;
11
+ if (!window.starknet_metamask_snap) {
12
+ const { providers } = Eip6963ProviderSingleton.get();
13
+ const metamaskProvider = providers.find((p) => ['io.metamask', 'io.metamask.flask'].includes(p.info.rdns));
14
+ if (metamaskProvider) {
15
+ window.starknet_metamask_snap = createMetaMaskProviderWrapper(metamaskProvider.provider);
16
+ }
17
+ }
18
+ }
19
+ getConnectedAccounts() {
20
+ return __awaiter(this, void 0, void 0, function* () {
21
+ const wallet = this.getWallet();
22
+ if (!wallet) {
23
+ return [];
24
+ }
25
+ const isProviderConnected = this.isProviderConnected();
26
+ const isPreauthorized = yield wallet.isPreauthorized();
27
+ const shouldReconnect = !isProviderConnected && isPreauthorized;
28
+ if (shouldReconnect) {
29
+ yield this.connect();
30
+ }
31
+ return wallet.selectedAddress ? [wallet.selectedAddress] : [];
32
+ });
33
+ }
34
+ }
35
+
36
+ export { MetaMask };