@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 +17 -0
- package/package.json +7 -6
- package/src/index.cjs +2 -0
- package/src/index.js +2 -0
- package/src/starknetWalletConnector.cjs +25 -9
- package/src/starknetWalletConnector.d.ts +6 -0
- package/src/starknetWalletConnector.js +25 -9
- package/src/types.d.ts +1 -1
- package/src/utils/starknetSnap.cjs +81 -0
- package/src/utils/starknetSnap.d.ts +8 -0
- package/src/utils/starknetSnap.js +77 -0
- package/src/wallets/metamask.cjs +49 -0
- package/src/wallets/metamask.d.ts +8 -0
- package/src/wallets/metamask.js +45 -0
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.
|
|
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.
|
|
34
|
-
"@
|
|
35
|
-
"@dynamic-labs/
|
|
36
|
-
"@dynamic-labs/
|
|
37
|
-
"@dynamic-labs/wallet-
|
|
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
|
-
|
|
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
|
-
|
|
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 };
|