@starknet-io/get-starknet-virtual-wallet 5.0.0-beta.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/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2022 avimak
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
6
+ this software and associated documentation files (the "Software"), to deal in
7
+ the Software without restriction, including without limitation the rights to
8
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
9
+ the Software, and to permit persons to whom the Software is furnished to do so,
10
+ subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
17
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
18
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
19
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
package/dist/index.cjs ADDED
@@ -0,0 +1,3 @@
1
+ 'use strict';
2
+
3
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
@@ -0,0 +1,9 @@
1
+ import { WalletWithStarknetFeatures } from '@starknet-io/get-starknet-wallet-standard/features';
2
+ import { EIP1193Provider } from 'viem';
3
+
4
+ type EIP6963ProviderInfo = {
5
+ rdns: string;
6
+ };
7
+ type EIP1193Adapter = (info: EIP6963ProviderInfo, provider: EIP1193Provider) => WalletWithStarknetFeatures | null;
8
+
9
+ export type { EIP1193Adapter, EIP6963ProviderInfo };
@@ -0,0 +1,9 @@
1
+ import { WalletWithStarknetFeatures } from '@starknet-io/get-starknet-wallet-standard/features';
2
+ import { EIP1193Provider } from 'viem';
3
+
4
+ type EIP6963ProviderInfo = {
5
+ rdns: string;
6
+ };
7
+ type EIP1193Adapter = (info: EIP6963ProviderInfo, provider: EIP1193Provider) => WalletWithStarknetFeatures | null;
8
+
9
+ export type { EIP1193Adapter, EIP6963ProviderInfo };
@@ -0,0 +1,9 @@
1
+ import { WalletWithStarknetFeatures } from '@starknet-io/get-starknet-wallet-standard/features';
2
+ import { EIP1193Provider } from 'viem';
3
+
4
+ type EIP6963ProviderInfo = {
5
+ rdns: string;
6
+ };
7
+ type EIP1193Adapter = (info: EIP6963ProviderInfo, provider: EIP1193Provider) => WalletWithStarknetFeatures | null;
8
+
9
+ export type { EIP1193Adapter, EIP6963ProviderInfo };
package/dist/index.mjs ADDED
@@ -0,0 +1,2 @@
1
+
2
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,251 @@
1
+ 'use strict';
2
+
3
+ const features = require('@wallet-standard/features');
4
+ const features$1 = require('@starknet-io/get-starknet-wallet-standard/features');
5
+ const chains = require('@starknet-io/get-starknet-wallet-standard/chains');
6
+ const asyncMutex = require('async-mutex');
7
+ const runtime = require('@module-federation/runtime');
8
+
9
+ var __accessCheck = (obj, member, msg) => {
10
+ if (!member.has(obj))
11
+ throw TypeError("Cannot " + msg);
12
+ };
13
+ var __privateGet = (obj, member, getter) => {
14
+ __accessCheck(obj, member, "read from private field");
15
+ return getter ? getter.call(obj) : member.get(obj);
16
+ };
17
+ var __privateAdd = (obj, member, value) => {
18
+ if (member.has(obj))
19
+ throw TypeError("Cannot add the same private member more than once");
20
+ member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
21
+ };
22
+ var __privateSet = (obj, member, value, setter) => {
23
+ __accessCheck(obj, member, "write to private field");
24
+ setter ? setter.call(obj, value) : member.set(obj, value);
25
+ return value;
26
+ };
27
+ var __privateMethod = (obj, member, method) => {
28
+ __accessCheck(obj, member, "access private method");
29
+ return method;
30
+ };
31
+ var _listeners, _account, _swo, _lock, _name, _icon, _connect, _disconnect, _emit, emit_fn, _on, _off, off_fn, _disconnected, disconnected_fn, _request, request_fn, _loadWallet, loadWallet_fn, _getStarknetChain, getStarknetChain_fn, _onAccountsChanged, onAccountsChanged_fn, _onNetworkChanged, onNetworkChanged_fn;
32
+ function metaMaskVirtualWallet(info, provider) {
33
+ const rdnsCheck = info.rdns === "io.metamask" || info.rdns === "io.metamask.flask";
34
+ if (rdnsCheck && isMetaMaskProvider(provider)) {
35
+ return new MetaMaskVirtualWallet(provider);
36
+ }
37
+ return null;
38
+ }
39
+ class MetaMaskVirtualWallet {
40
+ constructor(provider) {
41
+ this.provider = provider;
42
+ __privateAdd(this, _emit);
43
+ __privateAdd(this, _off);
44
+ __privateAdd(this, _disconnected);
45
+ __privateAdd(this, _request);
46
+ __privateAdd(this, _loadWallet);
47
+ __privateAdd(this, _getStarknetChain);
48
+ __privateAdd(this, _onAccountsChanged);
49
+ __privateAdd(this, _onNetworkChanged);
50
+ __privateAdd(this, _listeners, {});
51
+ __privateAdd(this, _account, null);
52
+ __privateAdd(this, _swo, null);
53
+ __privateAdd(this, _lock, new asyncMutex.Mutex());
54
+ __privateAdd(this, _name, "MetaMask");
55
+ __privateAdd(this, _icon, "data:image/svg+xml;utf8;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMTIiIGhlaWdodD0iMTg5IiB2aWV3Qm94PSIwIDAgMjEyIDE4OSI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj48cG9seWdvbiBmaWxsPSIjQ0RCREIyIiBwb2ludHM9IjYwLjc1IDE3My4yNSA4OC4zMTMgMTgwLjU2MyA4OC4zMTMgMTcxIDkwLjU2MyAxNjguNzUgMTA2LjMxMyAxNjguNzUgMTA2LjMxMyAxODAgMTA2LjMxMyAxODcuODc1IDg5LjQzOCAxODcuODc1IDY4LjYyNSAxNzguODc1Ii8+PHBvbHlnb24gZmlsbD0iI0NEQkRCMiIgcG9pbnRzPSIxMDUuNzUgMTczLjI1IDEzMi43NSAxODAuNTYzIDEzMi43NSAxNzEgMTM1IDE2OC43NSAxNTAuNzUgMTY4Ljc1IDE1MC43NSAxODAgMTUwLjc1IDE4Ny44NzUgMTMzLjg3NSAxODcuODc1IDExMy4wNjMgMTc4Ljg3NSIgdHJhbnNmb3JtPSJtYXRyaXgoLTEgMCAwIDEgMjU2LjUgMCkiLz48cG9seWdvbiBmaWxsPSIjMzkzOTM5IiBwb2ludHM9IjkwLjU2MyAxNTIuNDM4IDg4LjMxMyAxNzEgOTEuMTI1IDE2OC43NSAxMjAuMzc1IDE2OC43NSAxMjMuNzUgMTcxIDEyMS41IDE1Mi40MzggMTE3IDE0OS42MjUgOTQuNSAxNTAuMTg4Ii8+PHBvbHlnb24gZmlsbD0iI0Y4OUMzNSIgcG9pbnRzPSI3NS4zNzUgMjcgODguODc1IDU4LjUgOTUuMDYzIDE1MC4xODggMTE3IDE1MC4xODggMTIzLjc1IDU4LjUgMTM2LjEyNSAyNyIvPjxwb2x5Z29uIGZpbGw9IiNGODlEMzUiIHBvaW50cz0iMTYuMzEzIDk2LjE4OCAuNTYzIDE0MS43NSAzOS45MzggMTM5LjUgNjUuMjUgMTM5LjUgNjUuMjUgMTE5LjgxMyA2NC4xMjUgNzkuMzEzIDU4LjUgODMuODEzIi8+PHBvbHlnb24gZmlsbD0iI0Q4N0MzMCIgcG9pbnRzPSI0Ni4xMjUgMTAxLjI1IDkyLjI1IDEwMi4zNzUgODcuMTg4IDEyNiA2NS4yNSAxMjAuMzc1Ii8+PHBvbHlnb24gZmlsbD0iI0VBOEQzQSIgcG9pbnRzPSI0Ni4xMjUgMTAxLjgxMyA2NS4yNSAxMTkuODEzIDY1LjI1IDEzNy44MTMiLz48cG9seWdvbiBmaWxsPSIjRjg5RDM1IiBwb2ludHM9IjY1LjI1IDEyMC4zNzUgODcuNzUgMTI2IDk1LjA2MyAxNTAuMTg4IDkwIDE1MyA2NS4yNSAxMzguMzc1Ii8+PHBvbHlnb24gZmlsbD0iI0VCOEYzNSIgcG9pbnRzPSI2NS4yNSAxMzguMzc1IDYwLjc1IDE3My4yNSA5MC41NjMgMTUyLjQzOCIvPjxwb2x5Z29uIGZpbGw9IiNFQThFM0EiIHBvaW50cz0iOTIuMjUgMTAyLjM3NSA5NS4wNjMgMTUwLjE4OCA4Ni42MjUgMTI1LjcxOSIvPjxwb2x5Z29uIGZpbGw9IiNEODdDMzAiIHBvaW50cz0iMzkuMzc1IDEzOC45MzggNjUuMjUgMTM4LjM3NSA2MC43NSAxNzMuMjUiLz48cG9seWdvbiBmaWxsPSIjRUI4RjM1IiBwb2ludHM9IjEyLjkzOCAxODguNDM4IDYwLjc1IDE3My4yNSAzOS4zNzUgMTM4LjkzOCAuNTYzIDE0MS43NSIvPjxwb2x5Z29uIGZpbGw9IiNFODgyMUUiIHBvaW50cz0iODguODc1IDU4LjUgNjQuNjg4IDc4Ljc1IDQ2LjEyNSAxMDEuMjUgOTIuMjUgMTAyLjkzOCIvPjxwb2x5Z29uIGZpbGw9IiNERkNFQzMiIHBvaW50cz0iNjAuNzUgMTczLjI1IDkwLjU2MyAxNTIuNDM4IDg4LjMxMyAxNzAuNDM4IDg4LjMxMyAxODAuNTYzIDY4LjA2MyAxNzYuNjI1Ii8+PHBvbHlnb24gZmlsbD0iI0RGQ0VDMyIgcG9pbnRzPSIxMjEuNSAxNzMuMjUgMTUwLjc1IDE1Mi40MzggMTQ4LjUgMTcwLjQzOCAxNDguNSAxODAuNTYzIDEyOC4yNSAxNzYuNjI1IiB0cmFuc2Zvcm09Im1hdHJpeCgtMSAwIDAgMSAyNzIuMjUgMCkiLz48cG9seWdvbiBmaWxsPSIjMzkzOTM5IiBwb2ludHM9IjcwLjMxMyAxMTIuNSA2NC4xMjUgMTI1LjQzOCA4Ni4wNjMgMTE5LjgxMyIgdHJhbnNmb3JtPSJtYXRyaXgoLTEgMCAwIDEgMTUwLjE4OCAwKSIvPjxwb2x5Z29uIGZpbGw9IiNFODhGMzUiIHBvaW50cz0iMTIuMzc1IC41NjMgODguODc1IDU4LjUgNzUuOTM4IDI3Ii8+PHBhdGggZmlsbD0iIzhFNUEzMCIgZD0iTTEyLjM3NTAwMDIsMC41NjI1MDAwMDggTDIuMjUwMDAwMDMsMzEuNTAwMDAwNSBMNy44NzUwMDAxMiw2NS4yNTAwMDEgTDMuOTM3NTAwMDYsNjcuNTAwMDAxIEw5LjU2MjUwMDE0LDcyLjU2MjUgTDUuMDYyNTAwMDgsNzYuNTAwMDAxMSBMMTEuMjUsODIuMTI1MDAxMiBMNy4zMTI1MDAxMSw4NS41MDAwMDEzIEwxNi4zMTI1MDAyLDk2Ljc1MDAwMTQgTDU4LjUwMDAwMDksODMuODEyNTAxMiBDNzkuMTI1MDAxMiw2Ny4zMTI1MDA0IDg5LjI1MDAwMTMsNTguODc1MDAwMyA4OC44NzUwMDEzLDU4LjUwMDAwMDkgQzg4LjUwMDAwMTMsNTguMTI1MDAwOSA2My4wMDAwMDA5LDM4LjgxMjUwMDYgMTIuMzc1MDAwMiwwLjU2MjUwMDAwOCBaIi8+PGcgdHJhbnNmb3JtPSJtYXRyaXgoLTEgMCAwIDEgMjExLjUgMCkiPjxwb2x5Z29uIGZpbGw9IiNGODlEMzUiIHBvaW50cz0iMTYuMzEzIDk2LjE4OCAuNTYzIDE0MS43NSAzOS45MzggMTM5LjUgNjUuMjUgMTM5LjUgNjUuMjUgMTE5LjgxMyA2NC4xMjUgNzkuMzEzIDU4LjUgODMuODEzIi8+PHBvbHlnb24gZmlsbD0iI0Q4N0MzMCIgcG9pbnRzPSI0Ni4xMjUgMTAxLjI1IDkyLjI1IDEwMi4zNzUgODcuMTg4IDEyNiA2NS4yNSAxMjAuMzc1Ii8+PHBvbHlnb24gZmlsbD0iI0VBOEQzQSIgcG9pbnRzPSI0Ni4xMjUgMTAxLjgxMyA2NS4yNSAxMTkuODEzIDY1LjI1IDEzNy44MTMiLz48cG9seWdvbiBmaWxsPSIjRjg5RDM1IiBwb2ludHM9IjY1LjI1IDEyMC4zNzUgODcuNzUgMTI2IDk1LjA2MyAxNTAuMTg4IDkwIDE1MyA2NS4yNSAxMzguMzc1Ii8+PHBvbHlnb24gZmlsbD0iI0VCOEYzNSIgcG9pbnRzPSI2NS4yNSAxMzguMzc1IDYwLjc1IDE3My4yNSA5MCAxNTMiLz48cG9seWdvbiBmaWxsPSIjRUE4RTNBIiBwb2ludHM9IjkyLjI1IDEwMi4zNzUgOTUuMDYzIDE1MC4xODggODYuNjI1IDEyNS43MTkiLz48cG9seWdvbiBmaWxsPSIjRDg3QzMwIiBwb2ludHM9IjM5LjM3NSAxMzguOTM4IDY1LjI1IDEzOC4zNzUgNjAuNzUgMTczLjI1Ii8+PHBvbHlnb24gZmlsbD0iI0VCOEYzNSIgcG9pbnRzPSIxMi45MzggMTg4LjQzOCA2MC43NSAxNzMuMjUgMzkuMzc1IDEzOC45MzggLjU2MyAxNDEuNzUiLz48cG9seWdvbiBmaWxsPSIjRTg4MjFFIiBwb2ludHM9Ijg4Ljg3NSA1OC41IDY0LjY4OCA3OC43NSA0Ni4xMjUgMTAxLjI1IDkyLjI1IDEwMi45MzgiLz48cG9seWdvbiBmaWxsPSIjMzkzOTM5IiBwb2ludHM9IjcwLjMxMyAxMTIuNSA2NC4xMjUgMTI1LjQzOCA4Ni4wNjMgMTE5LjgxMyIgdHJhbnNmb3JtPSJtYXRyaXgoLTEgMCAwIDEgMTUwLjE4OCAwKSIvPjxwb2x5Z29uIGZpbGw9IiNFODhGMzUiIHBvaW50cz0iMTIuMzc1IC41NjMgODguODc1IDU4LjUgNzUuOTM4IDI3Ii8+PHBhdGggZmlsbD0iIzhFNUEzMCIgZD0iTTEyLjM3NTAwMDIsMC41NjI1MDAwMDggTDIuMjUwMDAwMDMsMzEuNTAwMDAwNSBMNy44NzUwMDAxMiw2NS4yNTAwMDEgTDMuOTM3NTAwMDYsNjcuNTAwMDAxIEw5LjU2MjUwMDE0LDcyLjU2MjUgTDUuMDYyNTAwMDgsNzYuNTAwMDAxMSBMMTEuMjUsODIuMTI1MDAxMiBMNy4zMTI1MDAxMSw4NS41MDAwMDEzIEwxNi4zMTI1MDAyLDk2Ljc1MDAwMTQgTDU4LjUwMDAwMDksODMuODEyNTAxMiBDNzkuMTI1MDAxMiw2Ny4zMTI1MDA0IDg5LjI1MDAwMTMsNTguODc1MDAwMyA4OC44NzUwMDEzLDU4LjUwMDAwMDkgQzg4LjUwMDAwMTMsNTguMTI1MDAwOSA2My4wMDAwMDA5LDM4LjgxMjUwMDYgMTIuMzc1MDAwMiwwLjU2MjUwMDAwOCBaIi8+PC9nPjwvZz48L3N2Zz4=");
56
+ __privateAdd(this, _connect, async ({ silent }) => {
57
+ if (!__privateGet(this, _account)) {
58
+ const accounts = await __privateMethod(this, _request, request_fn).call(this, {
59
+ type: "wallet_requestAccounts",
60
+ params: {
61
+ silent_mode: silent
62
+ }
63
+ });
64
+ if (accounts.length === 0) {
65
+ return { accounts: [] };
66
+ }
67
+ await __privateMethod(this, _onAccountsChanged, onAccountsChanged_fn).call(this, accounts);
68
+ }
69
+ return { accounts: this.accounts };
70
+ });
71
+ __privateAdd(this, _disconnect, async () => {
72
+ __privateMethod(this, _disconnected, disconnected_fn).call(this);
73
+ });
74
+ __privateAdd(this, _on, (event, listener) => {
75
+ if (!__privateGet(this, _listeners)[event]) {
76
+ __privateGet(this, _listeners)[event] = [];
77
+ }
78
+ __privateGet(this, _listeners)[event].push(listener);
79
+ return () => __privateMethod(this, _off, off_fn).call(this, event, listener);
80
+ });
81
+ }
82
+ get version() {
83
+ return "1.0.0";
84
+ }
85
+ get name() {
86
+ return __privateGet(this, _name);
87
+ }
88
+ get icon() {
89
+ return __privateGet(this, _icon);
90
+ }
91
+ get features() {
92
+ return {
93
+ [features.StandardConnect]: {
94
+ version: "1.0.0",
95
+ connect: __privateGet(this, _connect).bind(this)
96
+ },
97
+ [features.StandardDisconnect]: {
98
+ version: "1.0.0",
99
+ disconnect: __privateGet(this, _disconnect).bind(this)
100
+ },
101
+ [features.StandardEvents]: {
102
+ version: "1.0.0",
103
+ on: __privateGet(this, _on).bind(this)
104
+ },
105
+ [features$1.StarknetWalletApi]: {
106
+ version: "1.0.0",
107
+ request: __privateMethod(this, _request, request_fn).bind(this),
108
+ walletVersion: "2.0.0"
109
+ }
110
+ };
111
+ }
112
+ get chains() {
113
+ return chains.WELL_KNOWN_STARKNET_CHAINS.slice();
114
+ }
115
+ get accounts() {
116
+ if (__privateGet(this, _account)) {
117
+ return [
118
+ {
119
+ address: __privateGet(this, _account).address,
120
+ publicKey: new Uint8Array(),
121
+ chains: [__privateGet(this, _account).chain],
122
+ features: []
123
+ }
124
+ ];
125
+ }
126
+ return [];
127
+ }
128
+ }
129
+ _listeners = new WeakMap();
130
+ _account = new WeakMap();
131
+ _swo = new WeakMap();
132
+ _lock = new WeakMap();
133
+ _name = new WeakMap();
134
+ _icon = new WeakMap();
135
+ _connect = new WeakMap();
136
+ _disconnect = new WeakMap();
137
+ _emit = new WeakSet();
138
+ emit_fn = function(event, ...args) {
139
+ if (!__privateGet(this, _listeners)[event])
140
+ return;
141
+ for (const listener of __privateGet(this, _listeners)[event]) {
142
+ listener.apply(null, args);
143
+ }
144
+ };
145
+ _on = new WeakMap();
146
+ _off = new WeakSet();
147
+ off_fn = function(event, listener) {
148
+ __privateGet(this, _listeners)[event] = __privateGet(this, _listeners)[event]?.filter(
149
+ (existingListener) => listener !== existingListener
150
+ );
151
+ };
152
+ _disconnected = new WeakSet();
153
+ disconnected_fn = function() {
154
+ if (__privateGet(this, _account)) {
155
+ __privateSet(this, _account, null);
156
+ __privateMethod(this, _emit, emit_fn).call(this, "change", { accounts: this.accounts });
157
+ }
158
+ };
159
+ _request = new WeakSet();
160
+ request_fn = function(args) {
161
+ return __privateGet(this, _lock).runExclusive(async () => {
162
+ if (!__privateGet(this, _swo) && args.type === "wallet_getPermissions") {
163
+ return [];
164
+ }
165
+ if (!__privateGet(this, _swo)) {
166
+ __privateSet(this, _swo, await __privateMethod(this, _loadWallet, loadWallet_fn).call(this, this.provider));
167
+ __privateSet(this, _name, __privateGet(this, _swo).name);
168
+ if (typeof __privateGet(this, _swo).icon === "string") {
169
+ __privateSet(this, _icon, __privateGet(this, _swo).icon);
170
+ } else {
171
+ __privateSet(this, _icon, __privateGet(this, _swo).icon.light);
172
+ }
173
+ }
174
+ return __privateGet(this, _swo).request(args);
175
+ });
176
+ };
177
+ _loadWallet = new WeakSet();
178
+ loadWallet_fn = async function(provider) {
179
+ await runtime.init({
180
+ name: "MetaMaskStarknetSnapWallet",
181
+ remotes: [
182
+ {
183
+ name: "MetaMaskStarknetSnapWallet",
184
+ alias: "MetaMaskStarknetSnapWallet",
185
+ entry: `https://snaps.consensys.io/starknet/get-starknet/v1/remoteEntry.js?ts=${Date.now()}`
186
+ }
187
+ ]
188
+ });
189
+ const result = await runtime.loadRemote("MetaMaskStarknetSnapWallet/index");
190
+ if (!result) {
191
+ throw new Error("Failed to load MetaMask Wallet");
192
+ }
193
+ const swo = new result.MetaMaskSnapWallet(provider, "*");
194
+ swo.on("accountsChanged", __privateMethod(this, _onAccountsChanged, onAccountsChanged_fn).bind(this));
195
+ swo.on("networkChanged", __privateMethod(this, _onNetworkChanged, onNetworkChanged_fn).bind(this));
196
+ return swo;
197
+ };
198
+ _getStarknetChain = new WeakSet();
199
+ getStarknetChain_fn = async function() {
200
+ const chainId = await __privateMethod(this, _request, request_fn).call(this, {
201
+ type: "wallet_requestChainId"
202
+ });
203
+ const chain = `${chains.STARKNET_CHAIN_PREFIX}${chainId}`;
204
+ if (!chains.isStarknetChain(chain)) {
205
+ throw new Error("Invalid Starknet chain");
206
+ }
207
+ return chain;
208
+ };
209
+ _onAccountsChanged = new WeakSet();
210
+ onAccountsChanged_fn = async function(accounts) {
211
+ if (!accounts || accounts.length === 0) {
212
+ __privateMethod(this, _disconnected, disconnected_fn).call(this);
213
+ return;
214
+ }
215
+ const [account] = accounts;
216
+ if (__privateGet(this, _account)?.chain) {
217
+ __privateGet(this, _account).address = account;
218
+ __privateMethod(this, _emit, emit_fn).call(this, "change", { accounts: this.accounts });
219
+ } else {
220
+ const chain = await __privateMethod(this, _getStarknetChain, getStarknetChain_fn).call(this);
221
+ __privateSet(this, _account, { address: account, chain });
222
+ __privateMethod(this, _emit, emit_fn).call(this, "change", { accounts: this.accounts });
223
+ }
224
+ };
225
+ _onNetworkChanged = new WeakSet();
226
+ onNetworkChanged_fn = function(chainId, accounts) {
227
+ if (!chainId) {
228
+ __privateMethod(this, _disconnected, disconnected_fn).call(this);
229
+ return;
230
+ }
231
+ const chain = chains.formatStarknetChainId(chainId);
232
+ if (!chains.isStarknetChain(chain)) {
233
+ throw new Error(`Invalid Starknet chain: ${chain}`);
234
+ }
235
+ if (accounts?.length > 0) {
236
+ const [account] = accounts;
237
+ __privateSet(this, _account, { address: account, chain });
238
+ __privateMethod(this, _emit, emit_fn).call(this, "change", { accounts: this.accounts });
239
+ } else {
240
+ __privateGet(this, _account).chain = chain;
241
+ __privateMethod(this, _emit, emit_fn).call(this, "change", { accounts: this.accounts });
242
+ }
243
+ };
244
+ function isMetaMaskProvider(obj) {
245
+ return obj !== null && typeof obj === "object" && Object.hasOwn(obj, "isMetaMask") && Object.hasOwn(obj, "request");
246
+ }
247
+
248
+ exports.MetaMaskVirtualWallet = MetaMaskVirtualWallet;
249
+ exports.isMetaMaskProvider = isMetaMaskProvider;
250
+ exports.metaMaskVirtualWallet = metaMaskVirtualWallet;
251
+ //# sourceMappingURL=metamask.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metamask.cjs","sources":["../src/metamask.ts"],"sourcesContent":["import {\n StandardConnect,\n type StandardConnectMethod,\n StandardDisconnect,\n type StandardDisconnectMethod,\n StandardEvents,\n type StandardEventsListeners,\n type StandardEventsNames,\n type StandardEventsOnMethod,\n} from \"@wallet-standard/features\";\nimport type { EIP1193Provider } from \"viem\";\nimport type {\n RequestFnCall,\n RpcMessage,\n RpcTypeToMessageMap,\n StarknetWindowObject,\n} from \"@starknet-io/types-js\";\nimport {\n StarknetWalletApi,\n type StarknetFeatures,\n type WalletWithStarknetFeatures,\n} from \"@starknet-io/get-starknet-wallet-standard/features\";\nimport {\n formatStarknetChainId,\n isStarknetChain,\n STARKNET_CHAIN_PREFIX,\n WELL_KNOWN_STARKNET_CHAINS,\n} from \"@starknet-io/get-starknet-wallet-standard/chains\";\nimport type { StarknetWalletAccount } from \"@starknet-io/get-starknet-wallet-standard\";\nimport type { StarknetChain } from \"@starknet-io/get-starknet-wallet-standard/chains\";\nimport { Mutex } from \"async-mutex\";\nimport { init, loadRemote } from \"@module-federation/runtime\";\n\nimport type { EIP6963ProviderInfo } from \"./types\";\n\nexport function metaMaskVirtualWallet(\n info: EIP6963ProviderInfo,\n provider: EIP1193Provider,\n): WalletWithStarknetFeatures | null {\n const rdnsCheck =\n info.rdns === \"io.metamask\" || info.rdns === \"io.metamask.flask\";\n if (rdnsCheck && isMetaMaskProvider(provider)) {\n return new MetaMaskVirtualWallet(provider);\n }\n\n return null;\n}\n\nexport class MetaMaskVirtualWallet implements WalletWithStarknetFeatures {\n #listeners: { [E in StandardEventsNames]?: StandardEventsListeners[E][] } =\n {};\n #account: { address: string; chain: StarknetChain } | null = null;\n #swo: StarknetWindowObject | null = null;\n #lock: Mutex = new Mutex();\n #name = \"MetaMask\";\n #icon =\n \"data:image/svg+xml;utf8;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMTIiIGhlaWdodD0iMTg5IiB2aWV3Qm94PSIwIDAgMjEyIDE4OSI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj48cG9seWdvbiBmaWxsPSIjQ0RCREIyIiBwb2ludHM9IjYwLjc1IDE3My4yNSA4OC4zMTMgMTgwLjU2MyA4OC4zMTMgMTcxIDkwLjU2MyAxNjguNzUgMTA2LjMxMyAxNjguNzUgMTA2LjMxMyAxODAgMTA2LjMxMyAxODcuODc1IDg5LjQzOCAxODcuODc1IDY4LjYyNSAxNzguODc1Ii8+PHBvbHlnb24gZmlsbD0iI0NEQkRCMiIgcG9pbnRzPSIxMDUuNzUgMTczLjI1IDEzMi43NSAxODAuNTYzIDEzMi43NSAxNzEgMTM1IDE2OC43NSAxNTAuNzUgMTY4Ljc1IDE1MC43NSAxODAgMTUwLjc1IDE4Ny44NzUgMTMzLjg3NSAxODcuODc1IDExMy4wNjMgMTc4Ljg3NSIgdHJhbnNmb3JtPSJtYXRyaXgoLTEgMCAwIDEgMjU2LjUgMCkiLz48cG9seWdvbiBmaWxsPSIjMzkzOTM5IiBwb2ludHM9IjkwLjU2MyAxNTIuNDM4IDg4LjMxMyAxNzEgOTEuMTI1IDE2OC43NSAxMjAuMzc1IDE2OC43NSAxMjMuNzUgMTcxIDEyMS41IDE1Mi40MzggMTE3IDE0OS42MjUgOTQuNSAxNTAuMTg4Ii8+PHBvbHlnb24gZmlsbD0iI0Y4OUMzNSIgcG9pbnRzPSI3NS4zNzUgMjcgODguODc1IDU4LjUgOTUuMDYzIDE1MC4xODggMTE3IDE1MC4xODggMTIzLjc1IDU4LjUgMTM2LjEyNSAyNyIvPjxwb2x5Z29uIGZpbGw9IiNGODlEMzUiIHBvaW50cz0iMTYuMzEzIDk2LjE4OCAuNTYzIDE0MS43NSAzOS45MzggMTM5LjUgNjUuMjUgMTM5LjUgNjUuMjUgMTE5LjgxMyA2NC4xMjUgNzkuMzEzIDU4LjUgODMuODEzIi8+PHBvbHlnb24gZmlsbD0iI0Q4N0MzMCIgcG9pbnRzPSI0Ni4xMjUgMTAxLjI1IDkyLjI1IDEwMi4zNzUgODcuMTg4IDEyNiA2NS4yNSAxMjAuMzc1Ii8+PHBvbHlnb24gZmlsbD0iI0VBOEQzQSIgcG9pbnRzPSI0Ni4xMjUgMTAxLjgxMyA2NS4yNSAxMTkuODEzIDY1LjI1IDEzNy44MTMiLz48cG9seWdvbiBmaWxsPSIjRjg5RDM1IiBwb2ludHM9IjY1LjI1IDEyMC4zNzUgODcuNzUgMTI2IDk1LjA2MyAxNTAuMTg4IDkwIDE1MyA2NS4yNSAxMzguMzc1Ii8+PHBvbHlnb24gZmlsbD0iI0VCOEYzNSIgcG9pbnRzPSI2NS4yNSAxMzguMzc1IDYwLjc1IDE3My4yNSA5MC41NjMgMTUyLjQzOCIvPjxwb2x5Z29uIGZpbGw9IiNFQThFM0EiIHBvaW50cz0iOTIuMjUgMTAyLjM3NSA5NS4wNjMgMTUwLjE4OCA4Ni42MjUgMTI1LjcxOSIvPjxwb2x5Z29uIGZpbGw9IiNEODdDMzAiIHBvaW50cz0iMzkuMzc1IDEzOC45MzggNjUuMjUgMTM4LjM3NSA2MC43NSAxNzMuMjUiLz48cG9seWdvbiBmaWxsPSIjRUI4RjM1IiBwb2ludHM9IjEyLjkzOCAxODguNDM4IDYwLjc1IDE3My4yNSAzOS4zNzUgMTM4LjkzOCAuNTYzIDE0MS43NSIvPjxwb2x5Z29uIGZpbGw9IiNFODgyMUUiIHBvaW50cz0iODguODc1IDU4LjUgNjQuNjg4IDc4Ljc1IDQ2LjEyNSAxMDEuMjUgOTIuMjUgMTAyLjkzOCIvPjxwb2x5Z29uIGZpbGw9IiNERkNFQzMiIHBvaW50cz0iNjAuNzUgMTczLjI1IDkwLjU2MyAxNTIuNDM4IDg4LjMxMyAxNzAuNDM4IDg4LjMxMyAxODAuNTYzIDY4LjA2MyAxNzYuNjI1Ii8+PHBvbHlnb24gZmlsbD0iI0RGQ0VDMyIgcG9pbnRzPSIxMjEuNSAxNzMuMjUgMTUwLjc1IDE1Mi40MzggMTQ4LjUgMTcwLjQzOCAxNDguNSAxODAuNTYzIDEyOC4yNSAxNzYuNjI1IiB0cmFuc2Zvcm09Im1hdHJpeCgtMSAwIDAgMSAyNzIuMjUgMCkiLz48cG9seWdvbiBmaWxsPSIjMzkzOTM5IiBwb2ludHM9IjcwLjMxMyAxMTIuNSA2NC4xMjUgMTI1LjQzOCA4Ni4wNjMgMTE5LjgxMyIgdHJhbnNmb3JtPSJtYXRyaXgoLTEgMCAwIDEgMTUwLjE4OCAwKSIvPjxwb2x5Z29uIGZpbGw9IiNFODhGMzUiIHBvaW50cz0iMTIuMzc1IC41NjMgODguODc1IDU4LjUgNzUuOTM4IDI3Ii8+PHBhdGggZmlsbD0iIzhFNUEzMCIgZD0iTTEyLjM3NTAwMDIsMC41NjI1MDAwMDggTDIuMjUwMDAwMDMsMzEuNTAwMDAwNSBMNy44NzUwMDAxMiw2NS4yNTAwMDEgTDMuOTM3NTAwMDYsNjcuNTAwMDAxIEw5LjU2MjUwMDE0LDcyLjU2MjUgTDUuMDYyNTAwMDgsNzYuNTAwMDAxMSBMMTEuMjUsODIuMTI1MDAxMiBMNy4zMTI1MDAxMSw4NS41MDAwMDEzIEwxNi4zMTI1MDAyLDk2Ljc1MDAwMTQgTDU4LjUwMDAwMDksODMuODEyNTAxMiBDNzkuMTI1MDAxMiw2Ny4zMTI1MDA0IDg5LjI1MDAwMTMsNTguODc1MDAwMyA4OC44NzUwMDEzLDU4LjUwMDAwMDkgQzg4LjUwMDAwMTMsNTguMTI1MDAwOSA2My4wMDAwMDA5LDM4LjgxMjUwMDYgMTIuMzc1MDAwMiwwLjU2MjUwMDAwOCBaIi8+PGcgdHJhbnNmb3JtPSJtYXRyaXgoLTEgMCAwIDEgMjExLjUgMCkiPjxwb2x5Z29uIGZpbGw9IiNGODlEMzUiIHBvaW50cz0iMTYuMzEzIDk2LjE4OCAuNTYzIDE0MS43NSAzOS45MzggMTM5LjUgNjUuMjUgMTM5LjUgNjUuMjUgMTE5LjgxMyA2NC4xMjUgNzkuMzEzIDU4LjUgODMuODEzIi8+PHBvbHlnb24gZmlsbD0iI0Q4N0MzMCIgcG9pbnRzPSI0Ni4xMjUgMTAxLjI1IDkyLjI1IDEwMi4zNzUgODcuMTg4IDEyNiA2NS4yNSAxMjAuMzc1Ii8+PHBvbHlnb24gZmlsbD0iI0VBOEQzQSIgcG9pbnRzPSI0Ni4xMjUgMTAxLjgxMyA2NS4yNSAxMTkuODEzIDY1LjI1IDEzNy44MTMiLz48cG9seWdvbiBmaWxsPSIjRjg5RDM1IiBwb2ludHM9IjY1LjI1IDEyMC4zNzUgODcuNzUgMTI2IDk1LjA2MyAxNTAuMTg4IDkwIDE1MyA2NS4yNSAxMzguMzc1Ii8+PHBvbHlnb24gZmlsbD0iI0VCOEYzNSIgcG9pbnRzPSI2NS4yNSAxMzguMzc1IDYwLjc1IDE3My4yNSA5MCAxNTMiLz48cG9seWdvbiBmaWxsPSIjRUE4RTNBIiBwb2ludHM9IjkyLjI1IDEwMi4zNzUgOTUuMDYzIDE1MC4xODggODYuNjI1IDEyNS43MTkiLz48cG9seWdvbiBmaWxsPSIjRDg3QzMwIiBwb2ludHM9IjM5LjM3NSAxMzguOTM4IDY1LjI1IDEzOC4zNzUgNjAuNzUgMTczLjI1Ii8+PHBvbHlnb24gZmlsbD0iI0VCOEYzNSIgcG9pbnRzPSIxMi45MzggMTg4LjQzOCA2MC43NSAxNzMuMjUgMzkuMzc1IDEzOC45MzggLjU2MyAxNDEuNzUiLz48cG9seWdvbiBmaWxsPSIjRTg4MjFFIiBwb2ludHM9Ijg4Ljg3NSA1OC41IDY0LjY4OCA3OC43NSA0Ni4xMjUgMTAxLjI1IDkyLjI1IDEwMi45MzgiLz48cG9seWdvbiBmaWxsPSIjMzkzOTM5IiBwb2ludHM9IjcwLjMxMyAxMTIuNSA2NC4xMjUgMTI1LjQzOCA4Ni4wNjMgMTE5LjgxMyIgdHJhbnNmb3JtPSJtYXRyaXgoLTEgMCAwIDEgMTUwLjE4OCAwKSIvPjxwb2x5Z29uIGZpbGw9IiNFODhGMzUiIHBvaW50cz0iMTIuMzc1IC41NjMgODguODc1IDU4LjUgNzUuOTM4IDI3Ii8+PHBhdGggZmlsbD0iIzhFNUEzMCIgZD0iTTEyLjM3NTAwMDIsMC41NjI1MDAwMDggTDIuMjUwMDAwMDMsMzEuNTAwMDAwNSBMNy44NzUwMDAxMiw2NS4yNTAwMDEgTDMuOTM3NTAwMDYsNjcuNTAwMDAxIEw5LjU2MjUwMDE0LDcyLjU2MjUgTDUuMDYyNTAwMDgsNzYuNTAwMDAxMSBMMTEuMjUsODIuMTI1MDAxMiBMNy4zMTI1MDAxMSw4NS41MDAwMDEzIEwxNi4zMTI1MDAyLDk2Ljc1MDAwMTQgTDU4LjUwMDAwMDksODMuODEyNTAxMiBDNzkuMTI1MDAxMiw2Ny4zMTI1MDA0IDg5LjI1MDAwMTMsNTguODc1MDAwMyA4OC44NzUwMDEzLDU4LjUwMDAwMDkgQzg4LjUwMDAwMTMsNTguMTI1MDAwOSA2My4wMDAwMDA5LDM4LjgxMjUwMDYgMTIuMzc1MDAwMiwwLjU2MjUwMDAwOCBaIi8+PC9nPjwvZz48L3N2Zz4=\";\n\n constructor(private provider: MetaMaskProvider) {}\n\n get version() {\n return \"1.0.0\" as const;\n }\n\n get name() {\n return this.#name;\n }\n\n get icon() {\n return this.#icon as WalletWithStarknetFeatures[\"icon\"];\n }\n\n get features(): StarknetFeatures {\n return {\n [StandardConnect]: {\n version: \"1.0.0\" as const,\n connect: this.#connect.bind(this),\n },\n [StandardDisconnect]: {\n version: \"1.0.0\" as const,\n disconnect: this.#disconnect.bind(this),\n },\n [StandardEvents]: {\n version: \"1.0.0\" as const,\n on: this.#on.bind(this),\n },\n [StarknetWalletApi]: {\n version: \"1.0.0\" as const,\n request: this.#request.bind(this),\n walletVersion: \"2.0.0\",\n },\n };\n }\n\n get chains() {\n return WELL_KNOWN_STARKNET_CHAINS.slice();\n }\n\n get accounts(): StarknetWalletAccount[] {\n if (this.#account) {\n return [\n {\n address: this.#account.address,\n publicKey: new Uint8Array(),\n chains: [this.#account.chain],\n features: [],\n },\n ];\n }\n\n return [];\n }\n\n #connect: StandardConnectMethod = async ({ silent }) => {\n if (!this.#account) {\n const accounts = await this.#request({\n type: \"wallet_requestAccounts\",\n params: {\n silent_mode: silent,\n },\n });\n\n // TODO(fra): maybe we should throw an error here?\n // User rejected the request.\n if (accounts.length === 0) {\n return { accounts: [] };\n }\n\n await this.#onAccountsChanged(accounts);\n }\n\n return { accounts: this.accounts };\n };\n\n #disconnect: StandardDisconnectMethod = async () => {\n this.#disconnected();\n };\n\n #emit<E extends StandardEventsNames>(\n event: E,\n ...args: Parameters<StandardEventsListeners[E]>\n ): void {\n if (!this.#listeners[event]) return;\n\n for (const listener of this.#listeners[event]) {\n listener.apply(null, args);\n }\n }\n\n #on: StandardEventsOnMethod = (event, listener) => {\n if (!this.#listeners[event]) {\n this.#listeners[event] = [];\n }\n\n this.#listeners[event].push(listener);\n\n return (): void => this.#off(event, listener);\n };\n\n #off<E extends StandardEventsNames>(\n event: E,\n listener: StandardEventsListeners[E],\n ): void {\n this.#listeners[event] = this.#listeners[event]?.filter(\n (existingListener) => listener !== existingListener,\n );\n }\n\n #disconnected() {\n if (this.#account) {\n this.#account = null;\n this.#emit(\"change\", { accounts: this.accounts });\n }\n }\n\n #request<T extends RpcMessage[\"type\"]>(\n args: RequestFnCall<T>,\n ): Promise<RpcTypeToMessageMap[T][\"result\"]> {\n return this.#lock.runExclusive(async () => {\n // Loading the MetaMask snap requires the user to confirm the installation.\n // If the snap is not installed, return an empty array to avoid the wallet popup.\n if (!this.#swo && args.type === \"wallet_getPermissions\") {\n return [];\n }\n\n if (!this.#swo) {\n this.#swo = await this.#loadWallet(this.provider);\n // Bind properties from the virtual wallet to make sure they're up-to-date.\n this.#name = this.#swo.name;\n if (typeof this.#swo.icon === \"string\") {\n this.#icon = this.#swo.icon;\n } else {\n this.#icon = this.#swo.icon.light;\n }\n }\n\n return this.#swo.request(args);\n });\n }\n\n async #loadWallet(provider: MetaMaskProvider): Promise<StarknetWindowObject> {\n await init({\n name: \"MetaMaskStarknetSnapWallet\",\n remotes: [\n {\n name: \"MetaMaskStarknetSnapWallet\",\n alias: \"MetaMaskStarknetSnapWallet\",\n entry: `https://snaps.consensys.io/starknet/get-starknet/v1/remoteEntry.js?ts=${Date.now()}`,\n },\n ],\n });\n\n const result = await loadRemote<{\n MetaMaskSnapWallet: new (\n provider: MetaMaskProvider,\n version: string,\n ) => StarknetWindowObject;\n }>(\"MetaMaskStarknetSnapWallet/index\");\n\n if (!result) {\n // as `loadWallet` should only trigger when the wallet selected,\n // therefore it is make sense to throw error to indicate the wallet is not loaded\n throw new Error(\"Failed to load MetaMask Wallet\");\n }\n\n const swo = new result.MetaMaskSnapWallet(provider, \"*\");\n swo.on(\"accountsChanged\", this.#onAccountsChanged.bind(this));\n swo.on(\"networkChanged\", this.#onNetworkChanged.bind(this));\n return swo;\n }\n\n async #getStarknetChain(): Promise<StarknetChain> {\n const chainId = await this.#request({\n type: \"wallet_requestChainId\",\n });\n const chain = `${STARKNET_CHAIN_PREFIX}${chainId}` as const;\n\n if (!isStarknetChain(chain)) {\n throw new Error(\"Invalid Starknet chain\");\n }\n\n return chain;\n }\n\n async #onAccountsChanged(accounts: string[]) {\n if (!accounts || accounts.length === 0) {\n this.#disconnected();\n return;\n }\n\n const [account] = accounts;\n\n if (this.#account?.chain) {\n // Only account changed. No need to make a request for the chain id.\n this.#account.address = account;\n this.#emit(\"change\", { accounts: this.accounts });\n } else {\n const chain = await this.#getStarknetChain();\n this.#account = { address: account, chain };\n this.#emit(\"change\", { accounts: this.accounts });\n }\n }\n\n #onNetworkChanged(chainId?: string, accounts?: string[]) {\n if (!chainId) {\n this.#disconnected();\n return;\n }\n\n const chain = formatStarknetChainId(chainId);\n\n if (!isStarknetChain(chain)) {\n throw new Error(`Invalid Starknet chain: ${chain}`);\n }\n\n // Accounts should always be set, but check just in case.\n if (accounts?.length > 0) {\n const [account] = accounts;\n\n this.#account = { address: account, chain };\n this.#emit(\"change\", { accounts: this.accounts });\n } else {\n this.#account.chain = chain;\n this.#emit(\"change\", { accounts: this.accounts });\n }\n }\n}\n\nexport type MetaMaskProvider = {\n isMetaMask: boolean;\n request(options: { method: string }): Promise<void>;\n};\n\nexport function isMetaMaskProvider(obj: unknown): obj is MetaMaskProvider {\n return (\n obj !== null &&\n typeof obj === \"object\" &&\n Object.hasOwn(obj, \"isMetaMask\") &&\n Object.hasOwn(obj, \"request\")\n );\n}\n"],"names":["Mutex","StandardConnect","StandardDisconnect","StandardEvents","StarknetWalletApi","WELL_KNOWN_STARKNET_CHAINS","init","loadRemote","STARKNET_CHAIN_PREFIX","isStarknetChain","formatStarknetChainId"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,KAAA,EAAA,KAAA,EAAA,QAAA,EAAA,WAAA,EAAA,KAAA,EAAA,OAAA,EAAA,GAAA,EAAA,IAAA,EAAA,MAAA,EAAA,aAAA,EAAA,eAAA,EAAA,QAAA,EAAA,UAAA,EAAA,WAAA,EAAA,aAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,iBAAA,EAAA,mBAAA,CAAA;AAmCgB,SAAA,qBAAA,CACd,MACA,QACmC,EAAA;AACnC,EAAA,MAAM,SACJ,GAAA,IAAA,CAAK,IAAS,KAAA,aAAA,IAAiB,KAAK,IAAS,KAAA,mBAAA,CAAA;AAC/C,EAAI,IAAA,SAAA,IAAa,kBAAmB,CAAA,QAAQ,CAAG,EAAA;AAC7C,IAAO,OAAA,IAAI,sBAAsB,QAAQ,CAAA,CAAA;AAAA,GAC3C;AAEA,EAAO,OAAA,IAAA,CAAA;AACT,CAAA;AAEO,MAAM,qBAA4D,CAAA;AAAA,EAUvE,YAAoB,QAA4B,EAAA;AAA5B,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA,CAAA;AAgFpB,IAAA,YAAA,CAAA,IAAA,EAAA,KAAA,CAAA,CAAA;AAqBA,IAAA,YAAA,CAAA,IAAA,EAAA,IAAA,CAAA,CAAA;AASA,IAAA,YAAA,CAAA,IAAA,EAAA,aAAA,CAAA,CAAA;AAOA,IAAA,YAAA,CAAA,IAAA,EAAA,QAAA,CAAA,CAAA;AAyBA,IAAM,YAAA,CAAA,IAAA,EAAA,WAAA,CAAA,CAAA;AA+BN,IAAM,YAAA,CAAA,IAAA,EAAA,iBAAA,CAAA,CAAA;AAaN,IAAM,YAAA,CAAA,IAAA,EAAA,kBAAA,CAAA,CAAA;AAmBN,IAAA,YAAA,CAAA,IAAA,EAAA,iBAAA,CAAA,CAAA;AAtNA,IAAA,YAAA,CAAA,IAAA,EAAA,UAAA,EACE,EAAC,CAAA,CAAA;AACH,IAA6D,YAAA,CAAA,IAAA,EAAA,QAAA,EAAA,IAAA,CAAA,CAAA;AAC7D,IAAoC,YAAA,CAAA,IAAA,EAAA,IAAA,EAAA,IAAA,CAAA,CAAA;AACpC,IAAA,YAAA,CAAA,IAAA,EAAA,KAAA,EAAe,IAAIA,gBAAM,EAAA,CAAA,CAAA;AACzB,IAAQ,YAAA,CAAA,IAAA,EAAA,KAAA,EAAA,UAAA,CAAA,CAAA;AACR,IACE,YAAA,CAAA,IAAA,EAAA,KAAA,EAAA,i5JAAA,CAAA,CAAA;AAyDF,IAAkC,YAAA,CAAA,IAAA,EAAA,QAAA,EAAA,OAAO,EAAE,MAAA,EAAa,KAAA;AACtD,MAAI,IAAA,CAAC,mBAAK,QAAU,CAAA,EAAA;AAClB,QAAA,MAAM,QAAW,GAAA,MAAM,eAAK,CAAA,IAAA,EAAA,QAAA,EAAA,UAAA,CAAA,CAAL,IAAc,CAAA,IAAA,EAAA;AAAA,UACnC,IAAM,EAAA,wBAAA;AAAA,UACN,MAAQ,EAAA;AAAA,YACN,WAAa,EAAA,MAAA;AAAA,WACf;AAAA,SACF,CAAA,CAAA;AAIA,QAAI,IAAA,QAAA,CAAS,WAAW,CAAG,EAAA;AACzB,UAAO,OAAA,EAAE,QAAU,EAAA,EAAG,EAAA,CAAA;AAAA,SACxB;AAEA,QAAM,MAAA,eAAA,CAAA,IAAA,EAAK,0CAAL,IAAwB,CAAA,IAAA,EAAA,QAAA,CAAA,CAAA;AAAA,OAChC;AAEA,MAAO,OAAA,EAAE,QAAU,EAAA,IAAA,CAAK,QAAS,EAAA,CAAA;AAAA,KACnC,CAAA,CAAA;AAEA,IAAA,YAAA,CAAA,IAAA,EAAA,WAAA,EAAwC,YAAY;AAClD,MAAA,eAAA,CAAA,IAAA,EAAK,aAAL,EAAA,eAAA,CAAA,CAAA,IAAA,CAAA,IAAA,CAAA,CAAA;AAAA,KACF,CAAA,CAAA;AAaA,IAA8B,YAAA,CAAA,IAAA,EAAA,GAAA,EAAA,CAAC,OAAO,QAAa,KAAA;AACjD,MAAA,IAAI,CAAC,YAAA,CAAA,IAAA,EAAK,UAAW,CAAA,CAAA,KAAK,CAAG,EAAA;AAC3B,QAAK,YAAA,CAAA,IAAA,EAAA,UAAA,CAAA,CAAW,KAAK,CAAA,GAAI,EAAC,CAAA;AAAA,OAC5B;AAEA,MAAA,YAAA,CAAA,IAAA,EAAK,UAAW,CAAA,CAAA,KAAK,CAAE,CAAA,IAAA,CAAK,QAAQ,CAAA,CAAA;AAEpC,MAAA,OAAO,MAAY,eAAA,CAAA,IAAA,EAAK,IAAL,EAAA,MAAA,CAAA,CAAA,IAAA,CAAA,IAAA,EAAU,KAAO,EAAA,QAAA,CAAA,CAAA;AAAA,KACtC,CAAA,CAAA;AAAA,GAnGiD;AAAA,EAEjD,IAAI,OAAU,GAAA;AACZ,IAAO,OAAA,OAAA,CAAA;AAAA,GACT;AAAA,EAEA,IAAI,IAAO,GAAA;AACT,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,KAAA,CAAA,CAAA;AAAA,GACd;AAAA,EAEA,IAAI,IAAO,GAAA;AACT,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,KAAA,CAAA,CAAA;AAAA,GACd;AAAA,EAEA,IAAI,QAA6B,GAAA;AAC/B,IAAO,OAAA;AAAA,MACL,CAACC,wBAAe,GAAG;AAAA,QACjB,OAAS,EAAA,OAAA;AAAA,QACT,OAAS,EAAA,YAAA,CAAA,IAAA,EAAK,QAAS,CAAA,CAAA,IAAA,CAAK,IAAI,CAAA;AAAA,OAClC;AAAA,MACA,CAACC,2BAAkB,GAAG;AAAA,QACpB,OAAS,EAAA,OAAA;AAAA,QACT,UAAY,EAAA,YAAA,CAAA,IAAA,EAAK,WAAY,CAAA,CAAA,IAAA,CAAK,IAAI,CAAA;AAAA,OACxC;AAAA,MACA,CAACC,uBAAc,GAAG;AAAA,QAChB,OAAS,EAAA,OAAA;AAAA,QACT,EAAI,EAAA,YAAA,CAAA,IAAA,EAAK,GAAI,CAAA,CAAA,IAAA,CAAK,IAAI,CAAA;AAAA,OACxB;AAAA,MACA,CAACC,4BAAiB,GAAG;AAAA,QACnB,OAAS,EAAA,OAAA;AAAA,QACT,OAAS,EAAA,eAAA,CAAA,IAAA,EAAK,QAAS,EAAA,UAAA,CAAA,CAAA,IAAA,CAAK,IAAI,CAAA;AAAA,QAChC,aAAe,EAAA,OAAA;AAAA,OACjB;AAAA,KACF,CAAA;AAAA,GACF;AAAA,EAEA,IAAI,MAAS,GAAA;AACX,IAAA,OAAOC,kCAA2B,KAAM,EAAA,CAAA;AAAA,GAC1C;AAAA,EAEA,IAAI,QAAoC,GAAA;AACtC,IAAA,IAAI,mBAAK,QAAU,CAAA,EAAA;AACjB,MAAO,OAAA;AAAA,QACL;AAAA,UACE,OAAA,EAAS,mBAAK,QAAS,CAAA,CAAA,OAAA;AAAA,UACvB,SAAA,EAAW,IAAI,UAAW,EAAA;AAAA,UAC1B,MAAQ,EAAA,CAAC,YAAK,CAAA,IAAA,EAAA,QAAA,CAAA,CAAS,KAAK,CAAA;AAAA,UAC5B,UAAU,EAAC;AAAA,SACb;AAAA,OACF,CAAA;AAAA,KACF;AAEA,IAAA,OAAO,EAAC,CAAA;AAAA,GACV;AA+KF,CAAA;AA7OE,UAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AAEA,QAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AACA,IAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AACA,KAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AACA,KAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AACA,KAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AA0DA,QAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AAqBA,WAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AAIA,KAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AAAA,OAAoC,GAAA,SAClC,UACG,IACG,EAAA;AACN,EAAI,IAAA,CAAC,YAAK,CAAA,IAAA,EAAA,UAAA,CAAA,CAAW,KAAK,CAAA;AAAG,IAAA,OAAA;AAE7B,EAAA,KAAA,MAAW,QAAY,IAAA,YAAA,CAAA,IAAA,EAAK,UAAW,CAAA,CAAA,KAAK,CAAG,EAAA;AAC7C,IAAS,QAAA,CAAA,KAAA,CAAM,MAAM,IAAI,CAAA,CAAA;AAAA,GAC3B;AACF,CAAA,CAAA;AAEA,GAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AAUA,IAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AAAA,MAAmC,GAAA,SACjC,OACA,QACM,EAAA;AACN,EAAA,YAAA,CAAA,IAAA,EAAK,YAAW,KAAK,CAAA,GAAI,YAAK,CAAA,IAAA,EAAA,UAAA,CAAA,CAAW,KAAK,CAAG,EAAA,MAAA;AAAA,IAC/C,CAAC,qBAAqB,QAAa,KAAA,gBAAA;AAAA,GACrC,CAAA;AACF,CAAA,CAAA;AAEA,aAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AAAA,eAAA,GAAa,WAAG;AACd,EAAA,IAAI,mBAAK,QAAU,CAAA,EAAA;AACjB,IAAA,YAAA,CAAA,IAAA,EAAK,QAAW,EAAA,IAAA,CAAA,CAAA;AAChB,IAAA,eAAA,CAAA,IAAA,EAAK,gBAAL,IAAW,CAAA,IAAA,EAAA,QAAA,EAAU,EAAE,QAAA,EAAU,KAAK,QAAS,EAAA,CAAA,CAAA;AAAA,GACjD;AACF,CAAA,CAAA;AAEA,QAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AAAA,UAAA,GAAsC,SACpC,IAC2C,EAAA;AAC3C,EAAO,OAAA,YAAA,CAAA,IAAA,EAAK,KAAM,CAAA,CAAA,YAAA,CAAa,YAAY;AAGzC,IAAA,IAAI,CAAC,YAAA,CAAA,IAAA,EAAK,IAAQ,CAAA,IAAA,IAAA,CAAK,SAAS,uBAAyB,EAAA;AACvD,MAAA,OAAO,EAAC,CAAA;AAAA,KACV;AAEA,IAAI,IAAA,CAAC,mBAAK,IAAM,CAAA,EAAA;AACd,MAAA,YAAA,CAAA,IAAA,EAAK,IAAO,EAAA,MAAM,eAAK,CAAA,IAAA,EAAA,WAAA,EAAA,aAAA,CAAA,CAAL,WAAiB,IAAK,CAAA,QAAA,CAAA,CAAA,CAAA;AAExC,MAAK,YAAA,CAAA,IAAA,EAAA,KAAA,EAAQ,mBAAK,IAAK,CAAA,CAAA,IAAA,CAAA,CAAA;AACvB,MAAA,IAAI,OAAO,YAAA,CAAA,IAAA,EAAK,IAAK,CAAA,CAAA,IAAA,KAAS,QAAU,EAAA;AACtC,QAAK,YAAA,CAAA,IAAA,EAAA,KAAA,EAAQ,mBAAK,IAAK,CAAA,CAAA,IAAA,CAAA,CAAA;AAAA,OAClB,MAAA;AACL,QAAK,YAAA,CAAA,IAAA,EAAA,KAAA,EAAQ,YAAK,CAAA,IAAA,EAAA,IAAA,CAAA,CAAK,IAAK,CAAA,KAAA,CAAA,CAAA;AAAA,OAC9B;AAAA,KACF;AAEA,IAAO,OAAA,YAAA,CAAA,IAAA,EAAK,IAAK,CAAA,CAAA,OAAA,CAAQ,IAAI,CAAA,CAAA;AAAA,GAC9B,CAAA,CAAA;AACH,CAAA,CAAA;AAEM,WAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AAAA,aAAA,GAAW,eAAC,QAA2D,EAAA;AAC3E,EAAA,MAAMC,YAAK,CAAA;AAAA,IACT,IAAM,EAAA,4BAAA;AAAA,IACN,OAAS,EAAA;AAAA,MACP;AAAA,QACE,IAAM,EAAA,4BAAA;AAAA,QACN,KAAO,EAAA,4BAAA;AAAA,QACP,KAAO,EAAA,CAAA,sEAAA,EAAyE,IAAK,CAAA,GAAA,EAAK,CAAA,CAAA;AAAA,OAC5F;AAAA,KACF;AAAA,GACD,CAAA,CAAA;AAED,EAAM,MAAA,MAAA,GAAS,MAAMC,kBAAA,CAKlB,kCAAkC,CAAA,CAAA;AAErC,EAAA,IAAI,CAAC,MAAQ,EAAA;AAGX,IAAM,MAAA,IAAI,MAAM,gCAAgC,CAAA,CAAA;AAAA,GAClD;AAEA,EAAA,MAAM,GAAM,GAAA,IAAI,MAAO,CAAA,kBAAA,CAAmB,UAAU,GAAG,CAAA,CAAA;AACvD,EAAA,GAAA,CAAI,GAAG,iBAAmB,EAAA,eAAA,CAAA,IAAA,EAAK,kBAAmB,EAAA,oBAAA,CAAA,CAAA,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAC5D,EAAA,GAAA,CAAI,GAAG,gBAAkB,EAAA,eAAA,CAAA,IAAA,EAAK,iBAAkB,EAAA,mBAAA,CAAA,CAAA,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAC1D,EAAO,OAAA,GAAA,CAAA;AACT,CAAA,CAAA;AAEM,iBAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AAAA,mBAAA,GAAiB,iBAA2B;AAChD,EAAA,MAAM,OAAU,GAAA,MAAM,eAAK,CAAA,IAAA,EAAA,QAAA,EAAA,UAAA,CAAA,CAAL,IAAc,CAAA,IAAA,EAAA;AAAA,IAClC,IAAM,EAAA,uBAAA;AAAA,GACR,CAAA,CAAA;AACA,EAAA,MAAM,KAAQ,GAAA,CAAA,EAAGC,4BAAqB,CAAA,EAAG,OAAO,CAAA,CAAA,CAAA;AAEhD,EAAI,IAAA,CAACC,sBAAgB,CAAA,KAAK,CAAG,EAAA;AAC3B,IAAM,MAAA,IAAI,MAAM,wBAAwB,CAAA,CAAA;AAAA,GAC1C;AAEA,EAAO,OAAA,KAAA,CAAA;AACT,CAAA,CAAA;AAEM,kBAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AAAA,oBAAA,GAAkB,eAAC,QAAoB,EAAA;AAC3C,EAAA,IAAI,CAAC,QAAA,IAAY,QAAS,CAAA,MAAA,KAAW,CAAG,EAAA;AACtC,IAAA,eAAA,CAAA,IAAA,EAAK,aAAL,EAAA,eAAA,CAAA,CAAA,IAAA,CAAA,IAAA,CAAA,CAAA;AACA,IAAA,OAAA;AAAA,GACF;AAEA,EAAM,MAAA,CAAC,OAAO,CAAI,GAAA,QAAA,CAAA;AAElB,EAAI,IAAA,YAAA,CAAA,IAAA,EAAK,WAAU,KAAO,EAAA;AAExB,IAAA,YAAA,CAAA,IAAA,EAAK,UAAS,OAAU,GAAA,OAAA,CAAA;AACxB,IAAA,eAAA,CAAA,IAAA,EAAK,gBAAL,IAAW,CAAA,IAAA,EAAA,QAAA,EAAU,EAAE,QAAA,EAAU,KAAK,QAAS,EAAA,CAAA,CAAA;AAAA,GAC1C,MAAA;AACL,IAAM,MAAA,KAAA,GAAQ,MAAM,eAAA,CAAA,IAAA,EAAK,iBAAL,EAAA,mBAAA,CAAA,CAAA,IAAA,CAAA,IAAA,CAAA,CAAA;AACpB,IAAA,YAAA,CAAA,IAAA,EAAK,QAAW,EAAA,EAAE,OAAS,EAAA,OAAA,EAAS,KAAM,EAAA,CAAA,CAAA;AAC1C,IAAA,eAAA,CAAA,IAAA,EAAK,gBAAL,IAAW,CAAA,IAAA,EAAA,QAAA,EAAU,EAAE,QAAA,EAAU,KAAK,QAAS,EAAA,CAAA,CAAA;AAAA,GACjD;AACF,CAAA,CAAA;AAEA,iBAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AAAA,mBAAiB,GAAA,SAAC,SAAkB,QAAqB,EAAA;AACvD,EAAA,IAAI,CAAC,OAAS,EAAA;AACZ,IAAA,eAAA,CAAA,IAAA,EAAK,aAAL,EAAA,eAAA,CAAA,CAAA,IAAA,CAAA,IAAA,CAAA,CAAA;AACA,IAAA,OAAA;AAAA,GACF;AAEA,EAAM,MAAA,KAAA,GAAQC,6BAAsB,OAAO,CAAA,CAAA;AAE3C,EAAI,IAAA,CAACD,sBAAgB,CAAA,KAAK,CAAG,EAAA;AAC3B,IAAA,MAAM,IAAI,KAAA,CAAM,CAA2B,wBAAA,EAAA,KAAK,CAAE,CAAA,CAAA,CAAA;AAAA,GACpD;AAGA,EAAI,IAAA,QAAA,EAAU,SAAS,CAAG,EAAA;AACxB,IAAM,MAAA,CAAC,OAAO,CAAI,GAAA,QAAA,CAAA;AAElB,IAAA,YAAA,CAAA,IAAA,EAAK,QAAW,EAAA,EAAE,OAAS,EAAA,OAAA,EAAS,KAAM,EAAA,CAAA,CAAA;AAC1C,IAAA,eAAA,CAAA,IAAA,EAAK,gBAAL,IAAW,CAAA,IAAA,EAAA,QAAA,EAAU,EAAE,QAAA,EAAU,KAAK,QAAS,EAAA,CAAA,CAAA;AAAA,GAC1C,MAAA;AACL,IAAA,YAAA,CAAA,IAAA,EAAK,UAAS,KAAQ,GAAA,KAAA,CAAA;AACtB,IAAA,eAAA,CAAA,IAAA,EAAK,gBAAL,IAAW,CAAA,IAAA,EAAA,QAAA,EAAU,EAAE,QAAA,EAAU,KAAK,QAAS,EAAA,CAAA,CAAA;AAAA,GACjD;AACF,CAAA,CAAA;AAQK,SAAS,mBAAmB,GAAuC,EAAA;AACxE,EAAA,OACE,GAAQ,KAAA,IAAA,IACR,OAAO,GAAA,KAAQ,QACf,IAAA,MAAA,CAAO,MAAO,CAAA,GAAA,EAAK,YAAY,CAAA,IAC/B,MAAO,CAAA,MAAA,CAAO,KAAK,SAAS,CAAA,CAAA;AAEhC;;;;;;"}
@@ -0,0 +1,26 @@
1
+ import { EIP1193Provider } from 'viem';
2
+ import { WalletWithStarknetFeatures, StarknetFeatures } from '@starknet-io/get-starknet-wallet-standard/features';
3
+ import { StarknetWalletAccount } from '@starknet-io/get-starknet-wallet-standard';
4
+ import { EIP6963ProviderInfo } from './index.cjs';
5
+
6
+ declare function metaMaskVirtualWallet(info: EIP6963ProviderInfo, provider: EIP1193Provider): WalletWithStarknetFeatures | null;
7
+ declare class MetaMaskVirtualWallet implements WalletWithStarknetFeatures {
8
+ #private;
9
+ private provider;
10
+ constructor(provider: MetaMaskProvider);
11
+ get version(): "1.0.0";
12
+ get name(): string;
13
+ get icon(): WalletWithStarknetFeatures["icon"];
14
+ get features(): StarknetFeatures;
15
+ get chains(): ("starknet:0x534e5f4d41494e" | "starknet:0x534e5f5345504f4c4941")[];
16
+ get accounts(): StarknetWalletAccount[];
17
+ }
18
+ type MetaMaskProvider = {
19
+ isMetaMask: boolean;
20
+ request(options: {
21
+ method: string;
22
+ }): Promise<void>;
23
+ };
24
+ declare function isMetaMaskProvider(obj: unknown): obj is MetaMaskProvider;
25
+
26
+ export { type MetaMaskProvider, MetaMaskVirtualWallet, isMetaMaskProvider, metaMaskVirtualWallet };
@@ -0,0 +1,26 @@
1
+ import { EIP1193Provider } from 'viem';
2
+ import { WalletWithStarknetFeatures, StarknetFeatures } from '@starknet-io/get-starknet-wallet-standard/features';
3
+ import { StarknetWalletAccount } from '@starknet-io/get-starknet-wallet-standard';
4
+ import { EIP6963ProviderInfo } from './index.mjs';
5
+
6
+ declare function metaMaskVirtualWallet(info: EIP6963ProviderInfo, provider: EIP1193Provider): WalletWithStarknetFeatures | null;
7
+ declare class MetaMaskVirtualWallet implements WalletWithStarknetFeatures {
8
+ #private;
9
+ private provider;
10
+ constructor(provider: MetaMaskProvider);
11
+ get version(): "1.0.0";
12
+ get name(): string;
13
+ get icon(): WalletWithStarknetFeatures["icon"];
14
+ get features(): StarknetFeatures;
15
+ get chains(): ("starknet:0x534e5f4d41494e" | "starknet:0x534e5f5345504f4c4941")[];
16
+ get accounts(): StarknetWalletAccount[];
17
+ }
18
+ type MetaMaskProvider = {
19
+ isMetaMask: boolean;
20
+ request(options: {
21
+ method: string;
22
+ }): Promise<void>;
23
+ };
24
+ declare function isMetaMaskProvider(obj: unknown): obj is MetaMaskProvider;
25
+
26
+ export { type MetaMaskProvider, MetaMaskVirtualWallet, isMetaMaskProvider, metaMaskVirtualWallet };
@@ -0,0 +1,26 @@
1
+ import { EIP1193Provider } from 'viem';
2
+ import { WalletWithStarknetFeatures, StarknetFeatures } from '@starknet-io/get-starknet-wallet-standard/features';
3
+ import { StarknetWalletAccount } from '@starknet-io/get-starknet-wallet-standard';
4
+ import { EIP6963ProviderInfo } from './index.js';
5
+
6
+ declare function metaMaskVirtualWallet(info: EIP6963ProviderInfo, provider: EIP1193Provider): WalletWithStarknetFeatures | null;
7
+ declare class MetaMaskVirtualWallet implements WalletWithStarknetFeatures {
8
+ #private;
9
+ private provider;
10
+ constructor(provider: MetaMaskProvider);
11
+ get version(): "1.0.0";
12
+ get name(): string;
13
+ get icon(): WalletWithStarknetFeatures["icon"];
14
+ get features(): StarknetFeatures;
15
+ get chains(): ("starknet:0x534e5f4d41494e" | "starknet:0x534e5f5345504f4c4941")[];
16
+ get accounts(): StarknetWalletAccount[];
17
+ }
18
+ type MetaMaskProvider = {
19
+ isMetaMask: boolean;
20
+ request(options: {
21
+ method: string;
22
+ }): Promise<void>;
23
+ };
24
+ declare function isMetaMaskProvider(obj: unknown): obj is MetaMaskProvider;
25
+
26
+ export { type MetaMaskProvider, MetaMaskVirtualWallet, isMetaMaskProvider, metaMaskVirtualWallet };
@@ -0,0 +1,247 @@
1
+ import { StandardConnect, StandardDisconnect, StandardEvents } from '@wallet-standard/features';
2
+ import { StarknetWalletApi } from '@starknet-io/get-starknet-wallet-standard/features';
3
+ import { WELL_KNOWN_STARKNET_CHAINS, formatStarknetChainId, isStarknetChain, STARKNET_CHAIN_PREFIX } from '@starknet-io/get-starknet-wallet-standard/chains';
4
+ import { Mutex } from 'async-mutex';
5
+ import { init, loadRemote } from '@module-federation/runtime';
6
+
7
+ var __accessCheck = (obj, member, msg) => {
8
+ if (!member.has(obj))
9
+ throw TypeError("Cannot " + msg);
10
+ };
11
+ var __privateGet = (obj, member, getter) => {
12
+ __accessCheck(obj, member, "read from private field");
13
+ return getter ? getter.call(obj) : member.get(obj);
14
+ };
15
+ var __privateAdd = (obj, member, value) => {
16
+ if (member.has(obj))
17
+ throw TypeError("Cannot add the same private member more than once");
18
+ member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
19
+ };
20
+ var __privateSet = (obj, member, value, setter) => {
21
+ __accessCheck(obj, member, "write to private field");
22
+ setter ? setter.call(obj, value) : member.set(obj, value);
23
+ return value;
24
+ };
25
+ var __privateMethod = (obj, member, method) => {
26
+ __accessCheck(obj, member, "access private method");
27
+ return method;
28
+ };
29
+ var _listeners, _account, _swo, _lock, _name, _icon, _connect, _disconnect, _emit, emit_fn, _on, _off, off_fn, _disconnected, disconnected_fn, _request, request_fn, _loadWallet, loadWallet_fn, _getStarknetChain, getStarknetChain_fn, _onAccountsChanged, onAccountsChanged_fn, _onNetworkChanged, onNetworkChanged_fn;
30
+ function metaMaskVirtualWallet(info, provider) {
31
+ const rdnsCheck = info.rdns === "io.metamask" || info.rdns === "io.metamask.flask";
32
+ if (rdnsCheck && isMetaMaskProvider(provider)) {
33
+ return new MetaMaskVirtualWallet(provider);
34
+ }
35
+ return null;
36
+ }
37
+ class MetaMaskVirtualWallet {
38
+ constructor(provider) {
39
+ this.provider = provider;
40
+ __privateAdd(this, _emit);
41
+ __privateAdd(this, _off);
42
+ __privateAdd(this, _disconnected);
43
+ __privateAdd(this, _request);
44
+ __privateAdd(this, _loadWallet);
45
+ __privateAdd(this, _getStarknetChain);
46
+ __privateAdd(this, _onAccountsChanged);
47
+ __privateAdd(this, _onNetworkChanged);
48
+ __privateAdd(this, _listeners, {});
49
+ __privateAdd(this, _account, null);
50
+ __privateAdd(this, _swo, null);
51
+ __privateAdd(this, _lock, new Mutex());
52
+ __privateAdd(this, _name, "MetaMask");
53
+ __privateAdd(this, _icon, "data:image/svg+xml;utf8;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMTIiIGhlaWdodD0iMTg5IiB2aWV3Qm94PSIwIDAgMjEyIDE4OSI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj48cG9seWdvbiBmaWxsPSIjQ0RCREIyIiBwb2ludHM9IjYwLjc1IDE3My4yNSA4OC4zMTMgMTgwLjU2MyA4OC4zMTMgMTcxIDkwLjU2MyAxNjguNzUgMTA2LjMxMyAxNjguNzUgMTA2LjMxMyAxODAgMTA2LjMxMyAxODcuODc1IDg5LjQzOCAxODcuODc1IDY4LjYyNSAxNzguODc1Ii8+PHBvbHlnb24gZmlsbD0iI0NEQkRCMiIgcG9pbnRzPSIxMDUuNzUgMTczLjI1IDEzMi43NSAxODAuNTYzIDEzMi43NSAxNzEgMTM1IDE2OC43NSAxNTAuNzUgMTY4Ljc1IDE1MC43NSAxODAgMTUwLjc1IDE4Ny44NzUgMTMzLjg3NSAxODcuODc1IDExMy4wNjMgMTc4Ljg3NSIgdHJhbnNmb3JtPSJtYXRyaXgoLTEgMCAwIDEgMjU2LjUgMCkiLz48cG9seWdvbiBmaWxsPSIjMzkzOTM5IiBwb2ludHM9IjkwLjU2MyAxNTIuNDM4IDg4LjMxMyAxNzEgOTEuMTI1IDE2OC43NSAxMjAuMzc1IDE2OC43NSAxMjMuNzUgMTcxIDEyMS41IDE1Mi40MzggMTE3IDE0OS42MjUgOTQuNSAxNTAuMTg4Ii8+PHBvbHlnb24gZmlsbD0iI0Y4OUMzNSIgcG9pbnRzPSI3NS4zNzUgMjcgODguODc1IDU4LjUgOTUuMDYzIDE1MC4xODggMTE3IDE1MC4xODggMTIzLjc1IDU4LjUgMTM2LjEyNSAyNyIvPjxwb2x5Z29uIGZpbGw9IiNGODlEMzUiIHBvaW50cz0iMTYuMzEzIDk2LjE4OCAuNTYzIDE0MS43NSAzOS45MzggMTM5LjUgNjUuMjUgMTM5LjUgNjUuMjUgMTE5LjgxMyA2NC4xMjUgNzkuMzEzIDU4LjUgODMuODEzIi8+PHBvbHlnb24gZmlsbD0iI0Q4N0MzMCIgcG9pbnRzPSI0Ni4xMjUgMTAxLjI1IDkyLjI1IDEwMi4zNzUgODcuMTg4IDEyNiA2NS4yNSAxMjAuMzc1Ii8+PHBvbHlnb24gZmlsbD0iI0VBOEQzQSIgcG9pbnRzPSI0Ni4xMjUgMTAxLjgxMyA2NS4yNSAxMTkuODEzIDY1LjI1IDEzNy44MTMiLz48cG9seWdvbiBmaWxsPSIjRjg5RDM1IiBwb2ludHM9IjY1LjI1IDEyMC4zNzUgODcuNzUgMTI2IDk1LjA2MyAxNTAuMTg4IDkwIDE1MyA2NS4yNSAxMzguMzc1Ii8+PHBvbHlnb24gZmlsbD0iI0VCOEYzNSIgcG9pbnRzPSI2NS4yNSAxMzguMzc1IDYwLjc1IDE3My4yNSA5MC41NjMgMTUyLjQzOCIvPjxwb2x5Z29uIGZpbGw9IiNFQThFM0EiIHBvaW50cz0iOTIuMjUgMTAyLjM3NSA5NS4wNjMgMTUwLjE4OCA4Ni42MjUgMTI1LjcxOSIvPjxwb2x5Z29uIGZpbGw9IiNEODdDMzAiIHBvaW50cz0iMzkuMzc1IDEzOC45MzggNjUuMjUgMTM4LjM3NSA2MC43NSAxNzMuMjUiLz48cG9seWdvbiBmaWxsPSIjRUI4RjM1IiBwb2ludHM9IjEyLjkzOCAxODguNDM4IDYwLjc1IDE3My4yNSAzOS4zNzUgMTM4LjkzOCAuNTYzIDE0MS43NSIvPjxwb2x5Z29uIGZpbGw9IiNFODgyMUUiIHBvaW50cz0iODguODc1IDU4LjUgNjQuNjg4IDc4Ljc1IDQ2LjEyNSAxMDEuMjUgOTIuMjUgMTAyLjkzOCIvPjxwb2x5Z29uIGZpbGw9IiNERkNFQzMiIHBvaW50cz0iNjAuNzUgMTczLjI1IDkwLjU2MyAxNTIuNDM4IDg4LjMxMyAxNzAuNDM4IDg4LjMxMyAxODAuNTYzIDY4LjA2MyAxNzYuNjI1Ii8+PHBvbHlnb24gZmlsbD0iI0RGQ0VDMyIgcG9pbnRzPSIxMjEuNSAxNzMuMjUgMTUwLjc1IDE1Mi40MzggMTQ4LjUgMTcwLjQzOCAxNDguNSAxODAuNTYzIDEyOC4yNSAxNzYuNjI1IiB0cmFuc2Zvcm09Im1hdHJpeCgtMSAwIDAgMSAyNzIuMjUgMCkiLz48cG9seWdvbiBmaWxsPSIjMzkzOTM5IiBwb2ludHM9IjcwLjMxMyAxMTIuNSA2NC4xMjUgMTI1LjQzOCA4Ni4wNjMgMTE5LjgxMyIgdHJhbnNmb3JtPSJtYXRyaXgoLTEgMCAwIDEgMTUwLjE4OCAwKSIvPjxwb2x5Z29uIGZpbGw9IiNFODhGMzUiIHBvaW50cz0iMTIuMzc1IC41NjMgODguODc1IDU4LjUgNzUuOTM4IDI3Ii8+PHBhdGggZmlsbD0iIzhFNUEzMCIgZD0iTTEyLjM3NTAwMDIsMC41NjI1MDAwMDggTDIuMjUwMDAwMDMsMzEuNTAwMDAwNSBMNy44NzUwMDAxMiw2NS4yNTAwMDEgTDMuOTM3NTAwMDYsNjcuNTAwMDAxIEw5LjU2MjUwMDE0LDcyLjU2MjUgTDUuMDYyNTAwMDgsNzYuNTAwMDAxMSBMMTEuMjUsODIuMTI1MDAxMiBMNy4zMTI1MDAxMSw4NS41MDAwMDEzIEwxNi4zMTI1MDAyLDk2Ljc1MDAwMTQgTDU4LjUwMDAwMDksODMuODEyNTAxMiBDNzkuMTI1MDAxMiw2Ny4zMTI1MDA0IDg5LjI1MDAwMTMsNTguODc1MDAwMyA4OC44NzUwMDEzLDU4LjUwMDAwMDkgQzg4LjUwMDAwMTMsNTguMTI1MDAwOSA2My4wMDAwMDA5LDM4LjgxMjUwMDYgMTIuMzc1MDAwMiwwLjU2MjUwMDAwOCBaIi8+PGcgdHJhbnNmb3JtPSJtYXRyaXgoLTEgMCAwIDEgMjExLjUgMCkiPjxwb2x5Z29uIGZpbGw9IiNGODlEMzUiIHBvaW50cz0iMTYuMzEzIDk2LjE4OCAuNTYzIDE0MS43NSAzOS45MzggMTM5LjUgNjUuMjUgMTM5LjUgNjUuMjUgMTE5LjgxMyA2NC4xMjUgNzkuMzEzIDU4LjUgODMuODEzIi8+PHBvbHlnb24gZmlsbD0iI0Q4N0MzMCIgcG9pbnRzPSI0Ni4xMjUgMTAxLjI1IDkyLjI1IDEwMi4zNzUgODcuMTg4IDEyNiA2NS4yNSAxMjAuMzc1Ii8+PHBvbHlnb24gZmlsbD0iI0VBOEQzQSIgcG9pbnRzPSI0Ni4xMjUgMTAxLjgxMyA2NS4yNSAxMTkuODEzIDY1LjI1IDEzNy44MTMiLz48cG9seWdvbiBmaWxsPSIjRjg5RDM1IiBwb2ludHM9IjY1LjI1IDEyMC4zNzUgODcuNzUgMTI2IDk1LjA2MyAxNTAuMTg4IDkwIDE1MyA2NS4yNSAxMzguMzc1Ii8+PHBvbHlnb24gZmlsbD0iI0VCOEYzNSIgcG9pbnRzPSI2NS4yNSAxMzguMzc1IDYwLjc1IDE3My4yNSA5MCAxNTMiLz48cG9seWdvbiBmaWxsPSIjRUE4RTNBIiBwb2ludHM9IjkyLjI1IDEwMi4zNzUgOTUuMDYzIDE1MC4xODggODYuNjI1IDEyNS43MTkiLz48cG9seWdvbiBmaWxsPSIjRDg3QzMwIiBwb2ludHM9IjM5LjM3NSAxMzguOTM4IDY1LjI1IDEzOC4zNzUgNjAuNzUgMTczLjI1Ii8+PHBvbHlnb24gZmlsbD0iI0VCOEYzNSIgcG9pbnRzPSIxMi45MzggMTg4LjQzOCA2MC43NSAxNzMuMjUgMzkuMzc1IDEzOC45MzggLjU2MyAxNDEuNzUiLz48cG9seWdvbiBmaWxsPSIjRTg4MjFFIiBwb2ludHM9Ijg4Ljg3NSA1OC41IDY0LjY4OCA3OC43NSA0Ni4xMjUgMTAxLjI1IDkyLjI1IDEwMi45MzgiLz48cG9seWdvbiBmaWxsPSIjMzkzOTM5IiBwb2ludHM9IjcwLjMxMyAxMTIuNSA2NC4xMjUgMTI1LjQzOCA4Ni4wNjMgMTE5LjgxMyIgdHJhbnNmb3JtPSJtYXRyaXgoLTEgMCAwIDEgMTUwLjE4OCAwKSIvPjxwb2x5Z29uIGZpbGw9IiNFODhGMzUiIHBvaW50cz0iMTIuMzc1IC41NjMgODguODc1IDU4LjUgNzUuOTM4IDI3Ii8+PHBhdGggZmlsbD0iIzhFNUEzMCIgZD0iTTEyLjM3NTAwMDIsMC41NjI1MDAwMDggTDIuMjUwMDAwMDMsMzEuNTAwMDAwNSBMNy44NzUwMDAxMiw2NS4yNTAwMDEgTDMuOTM3NTAwMDYsNjcuNTAwMDAxIEw5LjU2MjUwMDE0LDcyLjU2MjUgTDUuMDYyNTAwMDgsNzYuNTAwMDAxMSBMMTEuMjUsODIuMTI1MDAxMiBMNy4zMTI1MDAxMSw4NS41MDAwMDEzIEwxNi4zMTI1MDAyLDk2Ljc1MDAwMTQgTDU4LjUwMDAwMDksODMuODEyNTAxMiBDNzkuMTI1MDAxMiw2Ny4zMTI1MDA0IDg5LjI1MDAwMTMsNTguODc1MDAwMyA4OC44NzUwMDEzLDU4LjUwMDAwMDkgQzg4LjUwMDAwMTMsNTguMTI1MDAwOSA2My4wMDAwMDA5LDM4LjgxMjUwMDYgMTIuMzc1MDAwMiwwLjU2MjUwMDAwOCBaIi8+PC9nPjwvZz48L3N2Zz4=");
54
+ __privateAdd(this, _connect, async ({ silent }) => {
55
+ if (!__privateGet(this, _account)) {
56
+ const accounts = await __privateMethod(this, _request, request_fn).call(this, {
57
+ type: "wallet_requestAccounts",
58
+ params: {
59
+ silent_mode: silent
60
+ }
61
+ });
62
+ if (accounts.length === 0) {
63
+ return { accounts: [] };
64
+ }
65
+ await __privateMethod(this, _onAccountsChanged, onAccountsChanged_fn).call(this, accounts);
66
+ }
67
+ return { accounts: this.accounts };
68
+ });
69
+ __privateAdd(this, _disconnect, async () => {
70
+ __privateMethod(this, _disconnected, disconnected_fn).call(this);
71
+ });
72
+ __privateAdd(this, _on, (event, listener) => {
73
+ if (!__privateGet(this, _listeners)[event]) {
74
+ __privateGet(this, _listeners)[event] = [];
75
+ }
76
+ __privateGet(this, _listeners)[event].push(listener);
77
+ return () => __privateMethod(this, _off, off_fn).call(this, event, listener);
78
+ });
79
+ }
80
+ get version() {
81
+ return "1.0.0";
82
+ }
83
+ get name() {
84
+ return __privateGet(this, _name);
85
+ }
86
+ get icon() {
87
+ return __privateGet(this, _icon);
88
+ }
89
+ get features() {
90
+ return {
91
+ [StandardConnect]: {
92
+ version: "1.0.0",
93
+ connect: __privateGet(this, _connect).bind(this)
94
+ },
95
+ [StandardDisconnect]: {
96
+ version: "1.0.0",
97
+ disconnect: __privateGet(this, _disconnect).bind(this)
98
+ },
99
+ [StandardEvents]: {
100
+ version: "1.0.0",
101
+ on: __privateGet(this, _on).bind(this)
102
+ },
103
+ [StarknetWalletApi]: {
104
+ version: "1.0.0",
105
+ request: __privateMethod(this, _request, request_fn).bind(this),
106
+ walletVersion: "2.0.0"
107
+ }
108
+ };
109
+ }
110
+ get chains() {
111
+ return WELL_KNOWN_STARKNET_CHAINS.slice();
112
+ }
113
+ get accounts() {
114
+ if (__privateGet(this, _account)) {
115
+ return [
116
+ {
117
+ address: __privateGet(this, _account).address,
118
+ publicKey: new Uint8Array(),
119
+ chains: [__privateGet(this, _account).chain],
120
+ features: []
121
+ }
122
+ ];
123
+ }
124
+ return [];
125
+ }
126
+ }
127
+ _listeners = new WeakMap();
128
+ _account = new WeakMap();
129
+ _swo = new WeakMap();
130
+ _lock = new WeakMap();
131
+ _name = new WeakMap();
132
+ _icon = new WeakMap();
133
+ _connect = new WeakMap();
134
+ _disconnect = new WeakMap();
135
+ _emit = new WeakSet();
136
+ emit_fn = function(event, ...args) {
137
+ if (!__privateGet(this, _listeners)[event])
138
+ return;
139
+ for (const listener of __privateGet(this, _listeners)[event]) {
140
+ listener.apply(null, args);
141
+ }
142
+ };
143
+ _on = new WeakMap();
144
+ _off = new WeakSet();
145
+ off_fn = function(event, listener) {
146
+ __privateGet(this, _listeners)[event] = __privateGet(this, _listeners)[event]?.filter(
147
+ (existingListener) => listener !== existingListener
148
+ );
149
+ };
150
+ _disconnected = new WeakSet();
151
+ disconnected_fn = function() {
152
+ if (__privateGet(this, _account)) {
153
+ __privateSet(this, _account, null);
154
+ __privateMethod(this, _emit, emit_fn).call(this, "change", { accounts: this.accounts });
155
+ }
156
+ };
157
+ _request = new WeakSet();
158
+ request_fn = function(args) {
159
+ return __privateGet(this, _lock).runExclusive(async () => {
160
+ if (!__privateGet(this, _swo) && args.type === "wallet_getPermissions") {
161
+ return [];
162
+ }
163
+ if (!__privateGet(this, _swo)) {
164
+ __privateSet(this, _swo, await __privateMethod(this, _loadWallet, loadWallet_fn).call(this, this.provider));
165
+ __privateSet(this, _name, __privateGet(this, _swo).name);
166
+ if (typeof __privateGet(this, _swo).icon === "string") {
167
+ __privateSet(this, _icon, __privateGet(this, _swo).icon);
168
+ } else {
169
+ __privateSet(this, _icon, __privateGet(this, _swo).icon.light);
170
+ }
171
+ }
172
+ return __privateGet(this, _swo).request(args);
173
+ });
174
+ };
175
+ _loadWallet = new WeakSet();
176
+ loadWallet_fn = async function(provider) {
177
+ await init({
178
+ name: "MetaMaskStarknetSnapWallet",
179
+ remotes: [
180
+ {
181
+ name: "MetaMaskStarknetSnapWallet",
182
+ alias: "MetaMaskStarknetSnapWallet",
183
+ entry: `https://snaps.consensys.io/starknet/get-starknet/v1/remoteEntry.js?ts=${Date.now()}`
184
+ }
185
+ ]
186
+ });
187
+ const result = await loadRemote("MetaMaskStarknetSnapWallet/index");
188
+ if (!result) {
189
+ throw new Error("Failed to load MetaMask Wallet");
190
+ }
191
+ const swo = new result.MetaMaskSnapWallet(provider, "*");
192
+ swo.on("accountsChanged", __privateMethod(this, _onAccountsChanged, onAccountsChanged_fn).bind(this));
193
+ swo.on("networkChanged", __privateMethod(this, _onNetworkChanged, onNetworkChanged_fn).bind(this));
194
+ return swo;
195
+ };
196
+ _getStarknetChain = new WeakSet();
197
+ getStarknetChain_fn = async function() {
198
+ const chainId = await __privateMethod(this, _request, request_fn).call(this, {
199
+ type: "wallet_requestChainId"
200
+ });
201
+ const chain = `${STARKNET_CHAIN_PREFIX}${chainId}`;
202
+ if (!isStarknetChain(chain)) {
203
+ throw new Error("Invalid Starknet chain");
204
+ }
205
+ return chain;
206
+ };
207
+ _onAccountsChanged = new WeakSet();
208
+ onAccountsChanged_fn = async function(accounts) {
209
+ if (!accounts || accounts.length === 0) {
210
+ __privateMethod(this, _disconnected, disconnected_fn).call(this);
211
+ return;
212
+ }
213
+ const [account] = accounts;
214
+ if (__privateGet(this, _account)?.chain) {
215
+ __privateGet(this, _account).address = account;
216
+ __privateMethod(this, _emit, emit_fn).call(this, "change", { accounts: this.accounts });
217
+ } else {
218
+ const chain = await __privateMethod(this, _getStarknetChain, getStarknetChain_fn).call(this);
219
+ __privateSet(this, _account, { address: account, chain });
220
+ __privateMethod(this, _emit, emit_fn).call(this, "change", { accounts: this.accounts });
221
+ }
222
+ };
223
+ _onNetworkChanged = new WeakSet();
224
+ onNetworkChanged_fn = function(chainId, accounts) {
225
+ if (!chainId) {
226
+ __privateMethod(this, _disconnected, disconnected_fn).call(this);
227
+ return;
228
+ }
229
+ const chain = formatStarknetChainId(chainId);
230
+ if (!isStarknetChain(chain)) {
231
+ throw new Error(`Invalid Starknet chain: ${chain}`);
232
+ }
233
+ if (accounts?.length > 0) {
234
+ const [account] = accounts;
235
+ __privateSet(this, _account, { address: account, chain });
236
+ __privateMethod(this, _emit, emit_fn).call(this, "change", { accounts: this.accounts });
237
+ } else {
238
+ __privateGet(this, _account).chain = chain;
239
+ __privateMethod(this, _emit, emit_fn).call(this, "change", { accounts: this.accounts });
240
+ }
241
+ };
242
+ function isMetaMaskProvider(obj) {
243
+ return obj !== null && typeof obj === "object" && Object.hasOwn(obj, "isMetaMask") && Object.hasOwn(obj, "request");
244
+ }
245
+
246
+ export { MetaMaskVirtualWallet, isMetaMaskProvider, metaMaskVirtualWallet };
247
+ //# sourceMappingURL=metamask.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metamask.mjs","sources":["../src/metamask.ts"],"sourcesContent":["import {\n StandardConnect,\n type StandardConnectMethod,\n StandardDisconnect,\n type StandardDisconnectMethod,\n StandardEvents,\n type StandardEventsListeners,\n type StandardEventsNames,\n type StandardEventsOnMethod,\n} from \"@wallet-standard/features\";\nimport type { EIP1193Provider } from \"viem\";\nimport type {\n RequestFnCall,\n RpcMessage,\n RpcTypeToMessageMap,\n StarknetWindowObject,\n} from \"@starknet-io/types-js\";\nimport {\n StarknetWalletApi,\n type StarknetFeatures,\n type WalletWithStarknetFeatures,\n} from \"@starknet-io/get-starknet-wallet-standard/features\";\nimport {\n formatStarknetChainId,\n isStarknetChain,\n STARKNET_CHAIN_PREFIX,\n WELL_KNOWN_STARKNET_CHAINS,\n} from \"@starknet-io/get-starknet-wallet-standard/chains\";\nimport type { StarknetWalletAccount } from \"@starknet-io/get-starknet-wallet-standard\";\nimport type { StarknetChain } from \"@starknet-io/get-starknet-wallet-standard/chains\";\nimport { Mutex } from \"async-mutex\";\nimport { init, loadRemote } from \"@module-federation/runtime\";\n\nimport type { EIP6963ProviderInfo } from \"./types\";\n\nexport function metaMaskVirtualWallet(\n info: EIP6963ProviderInfo,\n provider: EIP1193Provider,\n): WalletWithStarknetFeatures | null {\n const rdnsCheck =\n info.rdns === \"io.metamask\" || info.rdns === \"io.metamask.flask\";\n if (rdnsCheck && isMetaMaskProvider(provider)) {\n return new MetaMaskVirtualWallet(provider);\n }\n\n return null;\n}\n\nexport class MetaMaskVirtualWallet implements WalletWithStarknetFeatures {\n #listeners: { [E in StandardEventsNames]?: StandardEventsListeners[E][] } =\n {};\n #account: { address: string; chain: StarknetChain } | null = null;\n #swo: StarknetWindowObject | null = null;\n #lock: Mutex = new Mutex();\n #name = \"MetaMask\";\n #icon =\n \"data:image/svg+xml;utf8;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMTIiIGhlaWdodD0iMTg5IiB2aWV3Qm94PSIwIDAgMjEyIDE4OSI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj48cG9seWdvbiBmaWxsPSIjQ0RCREIyIiBwb2ludHM9IjYwLjc1IDE3My4yNSA4OC4zMTMgMTgwLjU2MyA4OC4zMTMgMTcxIDkwLjU2MyAxNjguNzUgMTA2LjMxMyAxNjguNzUgMTA2LjMxMyAxODAgMTA2LjMxMyAxODcuODc1IDg5LjQzOCAxODcuODc1IDY4LjYyNSAxNzguODc1Ii8+PHBvbHlnb24gZmlsbD0iI0NEQkRCMiIgcG9pbnRzPSIxMDUuNzUgMTczLjI1IDEzMi43NSAxODAuNTYzIDEzMi43NSAxNzEgMTM1IDE2OC43NSAxNTAuNzUgMTY4Ljc1IDE1MC43NSAxODAgMTUwLjc1IDE4Ny44NzUgMTMzLjg3NSAxODcuODc1IDExMy4wNjMgMTc4Ljg3NSIgdHJhbnNmb3JtPSJtYXRyaXgoLTEgMCAwIDEgMjU2LjUgMCkiLz48cG9seWdvbiBmaWxsPSIjMzkzOTM5IiBwb2ludHM9IjkwLjU2MyAxNTIuNDM4IDg4LjMxMyAxNzEgOTEuMTI1IDE2OC43NSAxMjAuMzc1IDE2OC43NSAxMjMuNzUgMTcxIDEyMS41IDE1Mi40MzggMTE3IDE0OS42MjUgOTQuNSAxNTAuMTg4Ii8+PHBvbHlnb24gZmlsbD0iI0Y4OUMzNSIgcG9pbnRzPSI3NS4zNzUgMjcgODguODc1IDU4LjUgOTUuMDYzIDE1MC4xODggMTE3IDE1MC4xODggMTIzLjc1IDU4LjUgMTM2LjEyNSAyNyIvPjxwb2x5Z29uIGZpbGw9IiNGODlEMzUiIHBvaW50cz0iMTYuMzEzIDk2LjE4OCAuNTYzIDE0MS43NSAzOS45MzggMTM5LjUgNjUuMjUgMTM5LjUgNjUuMjUgMTE5LjgxMyA2NC4xMjUgNzkuMzEzIDU4LjUgODMuODEzIi8+PHBvbHlnb24gZmlsbD0iI0Q4N0MzMCIgcG9pbnRzPSI0Ni4xMjUgMTAxLjI1IDkyLjI1IDEwMi4zNzUgODcuMTg4IDEyNiA2NS4yNSAxMjAuMzc1Ii8+PHBvbHlnb24gZmlsbD0iI0VBOEQzQSIgcG9pbnRzPSI0Ni4xMjUgMTAxLjgxMyA2NS4yNSAxMTkuODEzIDY1LjI1IDEzNy44MTMiLz48cG9seWdvbiBmaWxsPSIjRjg5RDM1IiBwb2ludHM9IjY1LjI1IDEyMC4zNzUgODcuNzUgMTI2IDk1LjA2MyAxNTAuMTg4IDkwIDE1MyA2NS4yNSAxMzguMzc1Ii8+PHBvbHlnb24gZmlsbD0iI0VCOEYzNSIgcG9pbnRzPSI2NS4yNSAxMzguMzc1IDYwLjc1IDE3My4yNSA5MC41NjMgMTUyLjQzOCIvPjxwb2x5Z29uIGZpbGw9IiNFQThFM0EiIHBvaW50cz0iOTIuMjUgMTAyLjM3NSA5NS4wNjMgMTUwLjE4OCA4Ni42MjUgMTI1LjcxOSIvPjxwb2x5Z29uIGZpbGw9IiNEODdDMzAiIHBvaW50cz0iMzkuMzc1IDEzOC45MzggNjUuMjUgMTM4LjM3NSA2MC43NSAxNzMuMjUiLz48cG9seWdvbiBmaWxsPSIjRUI4RjM1IiBwb2ludHM9IjEyLjkzOCAxODguNDM4IDYwLjc1IDE3My4yNSAzOS4zNzUgMTM4LjkzOCAuNTYzIDE0MS43NSIvPjxwb2x5Z29uIGZpbGw9IiNFODgyMUUiIHBvaW50cz0iODguODc1IDU4LjUgNjQuNjg4IDc4Ljc1IDQ2LjEyNSAxMDEuMjUgOTIuMjUgMTAyLjkzOCIvPjxwb2x5Z29uIGZpbGw9IiNERkNFQzMiIHBvaW50cz0iNjAuNzUgMTczLjI1IDkwLjU2MyAxNTIuNDM4IDg4LjMxMyAxNzAuNDM4IDg4LjMxMyAxODAuNTYzIDY4LjA2MyAxNzYuNjI1Ii8+PHBvbHlnb24gZmlsbD0iI0RGQ0VDMyIgcG9pbnRzPSIxMjEuNSAxNzMuMjUgMTUwLjc1IDE1Mi40MzggMTQ4LjUgMTcwLjQzOCAxNDguNSAxODAuNTYzIDEyOC4yNSAxNzYuNjI1IiB0cmFuc2Zvcm09Im1hdHJpeCgtMSAwIDAgMSAyNzIuMjUgMCkiLz48cG9seWdvbiBmaWxsPSIjMzkzOTM5IiBwb2ludHM9IjcwLjMxMyAxMTIuNSA2NC4xMjUgMTI1LjQzOCA4Ni4wNjMgMTE5LjgxMyIgdHJhbnNmb3JtPSJtYXRyaXgoLTEgMCAwIDEgMTUwLjE4OCAwKSIvPjxwb2x5Z29uIGZpbGw9IiNFODhGMzUiIHBvaW50cz0iMTIuMzc1IC41NjMgODguODc1IDU4LjUgNzUuOTM4IDI3Ii8+PHBhdGggZmlsbD0iIzhFNUEzMCIgZD0iTTEyLjM3NTAwMDIsMC41NjI1MDAwMDggTDIuMjUwMDAwMDMsMzEuNTAwMDAwNSBMNy44NzUwMDAxMiw2NS4yNTAwMDEgTDMuOTM3NTAwMDYsNjcuNTAwMDAxIEw5LjU2MjUwMDE0LDcyLjU2MjUgTDUuMDYyNTAwMDgsNzYuNTAwMDAxMSBMMTEuMjUsODIuMTI1MDAxMiBMNy4zMTI1MDAxMSw4NS41MDAwMDEzIEwxNi4zMTI1MDAyLDk2Ljc1MDAwMTQgTDU4LjUwMDAwMDksODMuODEyNTAxMiBDNzkuMTI1MDAxMiw2Ny4zMTI1MDA0IDg5LjI1MDAwMTMsNTguODc1MDAwMyA4OC44NzUwMDEzLDU4LjUwMDAwMDkgQzg4LjUwMDAwMTMsNTguMTI1MDAwOSA2My4wMDAwMDA5LDM4LjgxMjUwMDYgMTIuMzc1MDAwMiwwLjU2MjUwMDAwOCBaIi8+PGcgdHJhbnNmb3JtPSJtYXRyaXgoLTEgMCAwIDEgMjExLjUgMCkiPjxwb2x5Z29uIGZpbGw9IiNGODlEMzUiIHBvaW50cz0iMTYuMzEzIDk2LjE4OCAuNTYzIDE0MS43NSAzOS45MzggMTM5LjUgNjUuMjUgMTM5LjUgNjUuMjUgMTE5LjgxMyA2NC4xMjUgNzkuMzEzIDU4LjUgODMuODEzIi8+PHBvbHlnb24gZmlsbD0iI0Q4N0MzMCIgcG9pbnRzPSI0Ni4xMjUgMTAxLjI1IDkyLjI1IDEwMi4zNzUgODcuMTg4IDEyNiA2NS4yNSAxMjAuMzc1Ii8+PHBvbHlnb24gZmlsbD0iI0VBOEQzQSIgcG9pbnRzPSI0Ni4xMjUgMTAxLjgxMyA2NS4yNSAxMTkuODEzIDY1LjI1IDEzNy44MTMiLz48cG9seWdvbiBmaWxsPSIjRjg5RDM1IiBwb2ludHM9IjY1LjI1IDEyMC4zNzUgODcuNzUgMTI2IDk1LjA2MyAxNTAuMTg4IDkwIDE1MyA2NS4yNSAxMzguMzc1Ii8+PHBvbHlnb24gZmlsbD0iI0VCOEYzNSIgcG9pbnRzPSI2NS4yNSAxMzguMzc1IDYwLjc1IDE3My4yNSA5MCAxNTMiLz48cG9seWdvbiBmaWxsPSIjRUE4RTNBIiBwb2ludHM9IjkyLjI1IDEwMi4zNzUgOTUuMDYzIDE1MC4xODggODYuNjI1IDEyNS43MTkiLz48cG9seWdvbiBmaWxsPSIjRDg3QzMwIiBwb2ludHM9IjM5LjM3NSAxMzguOTM4IDY1LjI1IDEzOC4zNzUgNjAuNzUgMTczLjI1Ii8+PHBvbHlnb24gZmlsbD0iI0VCOEYzNSIgcG9pbnRzPSIxMi45MzggMTg4LjQzOCA2MC43NSAxNzMuMjUgMzkuMzc1IDEzOC45MzggLjU2MyAxNDEuNzUiLz48cG9seWdvbiBmaWxsPSIjRTg4MjFFIiBwb2ludHM9Ijg4Ljg3NSA1OC41IDY0LjY4OCA3OC43NSA0Ni4xMjUgMTAxLjI1IDkyLjI1IDEwMi45MzgiLz48cG9seWdvbiBmaWxsPSIjMzkzOTM5IiBwb2ludHM9IjcwLjMxMyAxMTIuNSA2NC4xMjUgMTI1LjQzOCA4Ni4wNjMgMTE5LjgxMyIgdHJhbnNmb3JtPSJtYXRyaXgoLTEgMCAwIDEgMTUwLjE4OCAwKSIvPjxwb2x5Z29uIGZpbGw9IiNFODhGMzUiIHBvaW50cz0iMTIuMzc1IC41NjMgODguODc1IDU4LjUgNzUuOTM4IDI3Ii8+PHBhdGggZmlsbD0iIzhFNUEzMCIgZD0iTTEyLjM3NTAwMDIsMC41NjI1MDAwMDggTDIuMjUwMDAwMDMsMzEuNTAwMDAwNSBMNy44NzUwMDAxMiw2NS4yNTAwMDEgTDMuOTM3NTAwMDYsNjcuNTAwMDAxIEw5LjU2MjUwMDE0LDcyLjU2MjUgTDUuMDYyNTAwMDgsNzYuNTAwMDAxMSBMMTEuMjUsODIuMTI1MDAxMiBMNy4zMTI1MDAxMSw4NS41MDAwMDEzIEwxNi4zMTI1MDAyLDk2Ljc1MDAwMTQgTDU4LjUwMDAwMDksODMuODEyNTAxMiBDNzkuMTI1MDAxMiw2Ny4zMTI1MDA0IDg5LjI1MDAwMTMsNTguODc1MDAwMyA4OC44NzUwMDEzLDU4LjUwMDAwMDkgQzg4LjUwMDAwMTMsNTguMTI1MDAwOSA2My4wMDAwMDA5LDM4LjgxMjUwMDYgMTIuMzc1MDAwMiwwLjU2MjUwMDAwOCBaIi8+PC9nPjwvZz48L3N2Zz4=\";\n\n constructor(private provider: MetaMaskProvider) {}\n\n get version() {\n return \"1.0.0\" as const;\n }\n\n get name() {\n return this.#name;\n }\n\n get icon() {\n return this.#icon as WalletWithStarknetFeatures[\"icon\"];\n }\n\n get features(): StarknetFeatures {\n return {\n [StandardConnect]: {\n version: \"1.0.0\" as const,\n connect: this.#connect.bind(this),\n },\n [StandardDisconnect]: {\n version: \"1.0.0\" as const,\n disconnect: this.#disconnect.bind(this),\n },\n [StandardEvents]: {\n version: \"1.0.0\" as const,\n on: this.#on.bind(this),\n },\n [StarknetWalletApi]: {\n version: \"1.0.0\" as const,\n request: this.#request.bind(this),\n walletVersion: \"2.0.0\",\n },\n };\n }\n\n get chains() {\n return WELL_KNOWN_STARKNET_CHAINS.slice();\n }\n\n get accounts(): StarknetWalletAccount[] {\n if (this.#account) {\n return [\n {\n address: this.#account.address,\n publicKey: new Uint8Array(),\n chains: [this.#account.chain],\n features: [],\n },\n ];\n }\n\n return [];\n }\n\n #connect: StandardConnectMethod = async ({ silent }) => {\n if (!this.#account) {\n const accounts = await this.#request({\n type: \"wallet_requestAccounts\",\n params: {\n silent_mode: silent,\n },\n });\n\n // TODO(fra): maybe we should throw an error here?\n // User rejected the request.\n if (accounts.length === 0) {\n return { accounts: [] };\n }\n\n await this.#onAccountsChanged(accounts);\n }\n\n return { accounts: this.accounts };\n };\n\n #disconnect: StandardDisconnectMethod = async () => {\n this.#disconnected();\n };\n\n #emit<E extends StandardEventsNames>(\n event: E,\n ...args: Parameters<StandardEventsListeners[E]>\n ): void {\n if (!this.#listeners[event]) return;\n\n for (const listener of this.#listeners[event]) {\n listener.apply(null, args);\n }\n }\n\n #on: StandardEventsOnMethod = (event, listener) => {\n if (!this.#listeners[event]) {\n this.#listeners[event] = [];\n }\n\n this.#listeners[event].push(listener);\n\n return (): void => this.#off(event, listener);\n };\n\n #off<E extends StandardEventsNames>(\n event: E,\n listener: StandardEventsListeners[E],\n ): void {\n this.#listeners[event] = this.#listeners[event]?.filter(\n (existingListener) => listener !== existingListener,\n );\n }\n\n #disconnected() {\n if (this.#account) {\n this.#account = null;\n this.#emit(\"change\", { accounts: this.accounts });\n }\n }\n\n #request<T extends RpcMessage[\"type\"]>(\n args: RequestFnCall<T>,\n ): Promise<RpcTypeToMessageMap[T][\"result\"]> {\n return this.#lock.runExclusive(async () => {\n // Loading the MetaMask snap requires the user to confirm the installation.\n // If the snap is not installed, return an empty array to avoid the wallet popup.\n if (!this.#swo && args.type === \"wallet_getPermissions\") {\n return [];\n }\n\n if (!this.#swo) {\n this.#swo = await this.#loadWallet(this.provider);\n // Bind properties from the virtual wallet to make sure they're up-to-date.\n this.#name = this.#swo.name;\n if (typeof this.#swo.icon === \"string\") {\n this.#icon = this.#swo.icon;\n } else {\n this.#icon = this.#swo.icon.light;\n }\n }\n\n return this.#swo.request(args);\n });\n }\n\n async #loadWallet(provider: MetaMaskProvider): Promise<StarknetWindowObject> {\n await init({\n name: \"MetaMaskStarknetSnapWallet\",\n remotes: [\n {\n name: \"MetaMaskStarknetSnapWallet\",\n alias: \"MetaMaskStarknetSnapWallet\",\n entry: `https://snaps.consensys.io/starknet/get-starknet/v1/remoteEntry.js?ts=${Date.now()}`,\n },\n ],\n });\n\n const result = await loadRemote<{\n MetaMaskSnapWallet: new (\n provider: MetaMaskProvider,\n version: string,\n ) => StarknetWindowObject;\n }>(\"MetaMaskStarknetSnapWallet/index\");\n\n if (!result) {\n // as `loadWallet` should only trigger when the wallet selected,\n // therefore it is make sense to throw error to indicate the wallet is not loaded\n throw new Error(\"Failed to load MetaMask Wallet\");\n }\n\n const swo = new result.MetaMaskSnapWallet(provider, \"*\");\n swo.on(\"accountsChanged\", this.#onAccountsChanged.bind(this));\n swo.on(\"networkChanged\", this.#onNetworkChanged.bind(this));\n return swo;\n }\n\n async #getStarknetChain(): Promise<StarknetChain> {\n const chainId = await this.#request({\n type: \"wallet_requestChainId\",\n });\n const chain = `${STARKNET_CHAIN_PREFIX}${chainId}` as const;\n\n if (!isStarknetChain(chain)) {\n throw new Error(\"Invalid Starknet chain\");\n }\n\n return chain;\n }\n\n async #onAccountsChanged(accounts: string[]) {\n if (!accounts || accounts.length === 0) {\n this.#disconnected();\n return;\n }\n\n const [account] = accounts;\n\n if (this.#account?.chain) {\n // Only account changed. No need to make a request for the chain id.\n this.#account.address = account;\n this.#emit(\"change\", { accounts: this.accounts });\n } else {\n const chain = await this.#getStarknetChain();\n this.#account = { address: account, chain };\n this.#emit(\"change\", { accounts: this.accounts });\n }\n }\n\n #onNetworkChanged(chainId?: string, accounts?: string[]) {\n if (!chainId) {\n this.#disconnected();\n return;\n }\n\n const chain = formatStarknetChainId(chainId);\n\n if (!isStarknetChain(chain)) {\n throw new Error(`Invalid Starknet chain: ${chain}`);\n }\n\n // Accounts should always be set, but check just in case.\n if (accounts?.length > 0) {\n const [account] = accounts;\n\n this.#account = { address: account, chain };\n this.#emit(\"change\", { accounts: this.accounts });\n } else {\n this.#account.chain = chain;\n this.#emit(\"change\", { accounts: this.accounts });\n }\n }\n}\n\nexport type MetaMaskProvider = {\n isMetaMask: boolean;\n request(options: { method: string }): Promise<void>;\n};\n\nexport function isMetaMaskProvider(obj: unknown): obj is MetaMaskProvider {\n return (\n obj !== null &&\n typeof obj === \"object\" &&\n Object.hasOwn(obj, \"isMetaMask\") &&\n Object.hasOwn(obj, \"request\")\n );\n}\n"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,57 @@
1
+ {
2
+ "name": "@starknet-io/get-starknet-virtual-wallet",
3
+ "version": "5.0.0-beta.0",
4
+ "keywords": [
5
+ "starknet",
6
+ "starkware",
7
+ "l2",
8
+ "zk",
9
+ "rollup",
10
+ "wallet",
11
+ "dapp"
12
+ ],
13
+ "license": "MIT",
14
+ "type": "module",
15
+ "main": "./dist/index.mjs",
16
+ "types": "./dist/index.d.ts",
17
+ "exports": {
18
+ ".": {
19
+ "types": "./dist/index.d.ts",
20
+ "import": "./dist/index.mjs",
21
+ "require": "./dist/index.cjs",
22
+ "default": "./dist/index.mjs"
23
+ },
24
+ "./metamask": {
25
+ "types": "./dist/metamask.d.ts",
26
+ "import": "./dist/metamask.mjs",
27
+ "require": "./dist/metamask.cjs",
28
+ "default": "./dist/metamask.mjs"
29
+ }
30
+ },
31
+ "files": [
32
+ "dist",
33
+ "src"
34
+ ],
35
+ "devDependencies": {
36
+ "typescript": "^5.8.3",
37
+ "unbuild": "^2.0.0",
38
+ "vitest": "^3.1.1"
39
+ },
40
+ "dependencies": {
41
+ "@module-federation/runtime": "^0.12.0",
42
+ "@starknet-io/types-js": "^0.7.10",
43
+ "@wallet-standard/base": "^1.1.0",
44
+ "@wallet-standard/features": "^1.1.0",
45
+ "async-mutex": "^0.5.0",
46
+ "viem": "^2.27.2",
47
+ "@starknet-io/get-starknet-wallet-standard": "5.0.0-beta.0"
48
+ },
49
+ "scripts": {
50
+ "build": "unbuild",
51
+ "format:check": "biome format .",
52
+ "format": "biome format --write .",
53
+ "lint:check": "biome lint .",
54
+ "lint": "biome lint --write .",
55
+ "test": "vitest"
56
+ }
57
+ }
package/src/index.ts ADDED
@@ -0,0 +1 @@
1
+ export * from "./types";
@@ -0,0 +1,301 @@
1
+ import {
2
+ StandardConnect,
3
+ type StandardConnectMethod,
4
+ StandardDisconnect,
5
+ type StandardDisconnectMethod,
6
+ StandardEvents,
7
+ type StandardEventsListeners,
8
+ type StandardEventsNames,
9
+ type StandardEventsOnMethod,
10
+ } from "@wallet-standard/features";
11
+ import type { EIP1193Provider } from "viem";
12
+ import type {
13
+ RequestFnCall,
14
+ RpcMessage,
15
+ RpcTypeToMessageMap,
16
+ StarknetWindowObject,
17
+ } from "@starknet-io/types-js";
18
+ import {
19
+ StarknetWalletApi,
20
+ type StarknetFeatures,
21
+ type WalletWithStarknetFeatures,
22
+ } from "@starknet-io/get-starknet-wallet-standard/features";
23
+ import {
24
+ formatStarknetChainId,
25
+ isStarknetChain,
26
+ STARKNET_CHAIN_PREFIX,
27
+ WELL_KNOWN_STARKNET_CHAINS,
28
+ } from "@starknet-io/get-starknet-wallet-standard/chains";
29
+ import type { StarknetWalletAccount } from "@starknet-io/get-starknet-wallet-standard";
30
+ import type { StarknetChain } from "@starknet-io/get-starknet-wallet-standard/chains";
31
+ import { Mutex } from "async-mutex";
32
+ import { init, loadRemote } from "@module-federation/runtime";
33
+
34
+ import type { EIP6963ProviderInfo } from "./types";
35
+
36
+ export function metaMaskVirtualWallet(
37
+ info: EIP6963ProviderInfo,
38
+ provider: EIP1193Provider,
39
+ ): WalletWithStarknetFeatures | null {
40
+ const rdnsCheck =
41
+ info.rdns === "io.metamask" || info.rdns === "io.metamask.flask";
42
+ if (rdnsCheck && isMetaMaskProvider(provider)) {
43
+ return new MetaMaskVirtualWallet(provider);
44
+ }
45
+
46
+ return null;
47
+ }
48
+
49
+ export class MetaMaskVirtualWallet implements WalletWithStarknetFeatures {
50
+ #listeners: { [E in StandardEventsNames]?: StandardEventsListeners[E][] } =
51
+ {};
52
+ #account: { address: string; chain: StarknetChain } | null = null;
53
+ #swo: StarknetWindowObject | null = null;
54
+ #lock: Mutex = new Mutex();
55
+ #name = "MetaMask";
56
+ #icon =
57
+ "data:image/svg+xml;utf8;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMTIiIGhlaWdodD0iMTg5IiB2aWV3Qm94PSIwIDAgMjEyIDE4OSI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj48cG9seWdvbiBmaWxsPSIjQ0RCREIyIiBwb2ludHM9IjYwLjc1IDE3My4yNSA4OC4zMTMgMTgwLjU2MyA4OC4zMTMgMTcxIDkwLjU2MyAxNjguNzUgMTA2LjMxMyAxNjguNzUgMTA2LjMxMyAxODAgMTA2LjMxMyAxODcuODc1IDg5LjQzOCAxODcuODc1IDY4LjYyNSAxNzguODc1Ii8+PHBvbHlnb24gZmlsbD0iI0NEQkRCMiIgcG9pbnRzPSIxMDUuNzUgMTczLjI1IDEzMi43NSAxODAuNTYzIDEzMi43NSAxNzEgMTM1IDE2OC43NSAxNTAuNzUgMTY4Ljc1IDE1MC43NSAxODAgMTUwLjc1IDE4Ny44NzUgMTMzLjg3NSAxODcuODc1IDExMy4wNjMgMTc4Ljg3NSIgdHJhbnNmb3JtPSJtYXRyaXgoLTEgMCAwIDEgMjU2LjUgMCkiLz48cG9seWdvbiBmaWxsPSIjMzkzOTM5IiBwb2ludHM9IjkwLjU2MyAxNTIuNDM4IDg4LjMxMyAxNzEgOTEuMTI1IDE2OC43NSAxMjAuMzc1IDE2OC43NSAxMjMuNzUgMTcxIDEyMS41IDE1Mi40MzggMTE3IDE0OS42MjUgOTQuNSAxNTAuMTg4Ii8+PHBvbHlnb24gZmlsbD0iI0Y4OUMzNSIgcG9pbnRzPSI3NS4zNzUgMjcgODguODc1IDU4LjUgOTUuMDYzIDE1MC4xODggMTE3IDE1MC4xODggMTIzLjc1IDU4LjUgMTM2LjEyNSAyNyIvPjxwb2x5Z29uIGZpbGw9IiNGODlEMzUiIHBvaW50cz0iMTYuMzEzIDk2LjE4OCAuNTYzIDE0MS43NSAzOS45MzggMTM5LjUgNjUuMjUgMTM5LjUgNjUuMjUgMTE5LjgxMyA2NC4xMjUgNzkuMzEzIDU4LjUgODMuODEzIi8+PHBvbHlnb24gZmlsbD0iI0Q4N0MzMCIgcG9pbnRzPSI0Ni4xMjUgMTAxLjI1IDkyLjI1IDEwMi4zNzUgODcuMTg4IDEyNiA2NS4yNSAxMjAuMzc1Ii8+PHBvbHlnb24gZmlsbD0iI0VBOEQzQSIgcG9pbnRzPSI0Ni4xMjUgMTAxLjgxMyA2NS4yNSAxMTkuODEzIDY1LjI1IDEzNy44MTMiLz48cG9seWdvbiBmaWxsPSIjRjg5RDM1IiBwb2ludHM9IjY1LjI1IDEyMC4zNzUgODcuNzUgMTI2IDk1LjA2MyAxNTAuMTg4IDkwIDE1MyA2NS4yNSAxMzguMzc1Ii8+PHBvbHlnb24gZmlsbD0iI0VCOEYzNSIgcG9pbnRzPSI2NS4yNSAxMzguMzc1IDYwLjc1IDE3My4yNSA5MC41NjMgMTUyLjQzOCIvPjxwb2x5Z29uIGZpbGw9IiNFQThFM0EiIHBvaW50cz0iOTIuMjUgMTAyLjM3NSA5NS4wNjMgMTUwLjE4OCA4Ni42MjUgMTI1LjcxOSIvPjxwb2x5Z29uIGZpbGw9IiNEODdDMzAiIHBvaW50cz0iMzkuMzc1IDEzOC45MzggNjUuMjUgMTM4LjM3NSA2MC43NSAxNzMuMjUiLz48cG9seWdvbiBmaWxsPSIjRUI4RjM1IiBwb2ludHM9IjEyLjkzOCAxODguNDM4IDYwLjc1IDE3My4yNSAzOS4zNzUgMTM4LjkzOCAuNTYzIDE0MS43NSIvPjxwb2x5Z29uIGZpbGw9IiNFODgyMUUiIHBvaW50cz0iODguODc1IDU4LjUgNjQuNjg4IDc4Ljc1IDQ2LjEyNSAxMDEuMjUgOTIuMjUgMTAyLjkzOCIvPjxwb2x5Z29uIGZpbGw9IiNERkNFQzMiIHBvaW50cz0iNjAuNzUgMTczLjI1IDkwLjU2MyAxNTIuNDM4IDg4LjMxMyAxNzAuNDM4IDg4LjMxMyAxODAuNTYzIDY4LjA2MyAxNzYuNjI1Ii8+PHBvbHlnb24gZmlsbD0iI0RGQ0VDMyIgcG9pbnRzPSIxMjEuNSAxNzMuMjUgMTUwLjc1IDE1Mi40MzggMTQ4LjUgMTcwLjQzOCAxNDguNSAxODAuNTYzIDEyOC4yNSAxNzYuNjI1IiB0cmFuc2Zvcm09Im1hdHJpeCgtMSAwIDAgMSAyNzIuMjUgMCkiLz48cG9seWdvbiBmaWxsPSIjMzkzOTM5IiBwb2ludHM9IjcwLjMxMyAxMTIuNSA2NC4xMjUgMTI1LjQzOCA4Ni4wNjMgMTE5LjgxMyIgdHJhbnNmb3JtPSJtYXRyaXgoLTEgMCAwIDEgMTUwLjE4OCAwKSIvPjxwb2x5Z29uIGZpbGw9IiNFODhGMzUiIHBvaW50cz0iMTIuMzc1IC41NjMgODguODc1IDU4LjUgNzUuOTM4IDI3Ii8+PHBhdGggZmlsbD0iIzhFNUEzMCIgZD0iTTEyLjM3NTAwMDIsMC41NjI1MDAwMDggTDIuMjUwMDAwMDMsMzEuNTAwMDAwNSBMNy44NzUwMDAxMiw2NS4yNTAwMDEgTDMuOTM3NTAwMDYsNjcuNTAwMDAxIEw5LjU2MjUwMDE0LDcyLjU2MjUgTDUuMDYyNTAwMDgsNzYuNTAwMDAxMSBMMTEuMjUsODIuMTI1MDAxMiBMNy4zMTI1MDAxMSw4NS41MDAwMDEzIEwxNi4zMTI1MDAyLDk2Ljc1MDAwMTQgTDU4LjUwMDAwMDksODMuODEyNTAxMiBDNzkuMTI1MDAxMiw2Ny4zMTI1MDA0IDg5LjI1MDAwMTMsNTguODc1MDAwMyA4OC44NzUwMDEzLDU4LjUwMDAwMDkgQzg4LjUwMDAwMTMsNTguMTI1MDAwOSA2My4wMDAwMDA5LDM4LjgxMjUwMDYgMTIuMzc1MDAwMiwwLjU2MjUwMDAwOCBaIi8+PGcgdHJhbnNmb3JtPSJtYXRyaXgoLTEgMCAwIDEgMjExLjUgMCkiPjxwb2x5Z29uIGZpbGw9IiNGODlEMzUiIHBvaW50cz0iMTYuMzEzIDk2LjE4OCAuNTYzIDE0MS43NSAzOS45MzggMTM5LjUgNjUuMjUgMTM5LjUgNjUuMjUgMTE5LjgxMyA2NC4xMjUgNzkuMzEzIDU4LjUgODMuODEzIi8+PHBvbHlnb24gZmlsbD0iI0Q4N0MzMCIgcG9pbnRzPSI0Ni4xMjUgMTAxLjI1IDkyLjI1IDEwMi4zNzUgODcuMTg4IDEyNiA2NS4yNSAxMjAuMzc1Ii8+PHBvbHlnb24gZmlsbD0iI0VBOEQzQSIgcG9pbnRzPSI0Ni4xMjUgMTAxLjgxMyA2NS4yNSAxMTkuODEzIDY1LjI1IDEzNy44MTMiLz48cG9seWdvbiBmaWxsPSIjRjg5RDM1IiBwb2ludHM9IjY1LjI1IDEyMC4zNzUgODcuNzUgMTI2IDk1LjA2MyAxNTAuMTg4IDkwIDE1MyA2NS4yNSAxMzguMzc1Ii8+PHBvbHlnb24gZmlsbD0iI0VCOEYzNSIgcG9pbnRzPSI2NS4yNSAxMzguMzc1IDYwLjc1IDE3My4yNSA5MCAxNTMiLz48cG9seWdvbiBmaWxsPSIjRUE4RTNBIiBwb2ludHM9IjkyLjI1IDEwMi4zNzUgOTUuMDYzIDE1MC4xODggODYuNjI1IDEyNS43MTkiLz48cG9seWdvbiBmaWxsPSIjRDg3QzMwIiBwb2ludHM9IjM5LjM3NSAxMzguOTM4IDY1LjI1IDEzOC4zNzUgNjAuNzUgMTczLjI1Ii8+PHBvbHlnb24gZmlsbD0iI0VCOEYzNSIgcG9pbnRzPSIxMi45MzggMTg4LjQzOCA2MC43NSAxNzMuMjUgMzkuMzc1IDEzOC45MzggLjU2MyAxNDEuNzUiLz48cG9seWdvbiBmaWxsPSIjRTg4MjFFIiBwb2ludHM9Ijg4Ljg3NSA1OC41IDY0LjY4OCA3OC43NSA0Ni4xMjUgMTAxLjI1IDkyLjI1IDEwMi45MzgiLz48cG9seWdvbiBmaWxsPSIjMzkzOTM5IiBwb2ludHM9IjcwLjMxMyAxMTIuNSA2NC4xMjUgMTI1LjQzOCA4Ni4wNjMgMTE5LjgxMyIgdHJhbnNmb3JtPSJtYXRyaXgoLTEgMCAwIDEgMTUwLjE4OCAwKSIvPjxwb2x5Z29uIGZpbGw9IiNFODhGMzUiIHBvaW50cz0iMTIuMzc1IC41NjMgODguODc1IDU4LjUgNzUuOTM4IDI3Ii8+PHBhdGggZmlsbD0iIzhFNUEzMCIgZD0iTTEyLjM3NTAwMDIsMC41NjI1MDAwMDggTDIuMjUwMDAwMDMsMzEuNTAwMDAwNSBMNy44NzUwMDAxMiw2NS4yNTAwMDEgTDMuOTM3NTAwMDYsNjcuNTAwMDAxIEw5LjU2MjUwMDE0LDcyLjU2MjUgTDUuMDYyNTAwMDgsNzYuNTAwMDAxMSBMMTEuMjUsODIuMTI1MDAxMiBMNy4zMTI1MDAxMSw4NS41MDAwMDEzIEwxNi4zMTI1MDAyLDk2Ljc1MDAwMTQgTDU4LjUwMDAwMDksODMuODEyNTAxMiBDNzkuMTI1MDAxMiw2Ny4zMTI1MDA0IDg5LjI1MDAwMTMsNTguODc1MDAwMyA4OC44NzUwMDEzLDU4LjUwMDAwMDkgQzg4LjUwMDAwMTMsNTguMTI1MDAwOSA2My4wMDAwMDA5LDM4LjgxMjUwMDYgMTIuMzc1MDAwMiwwLjU2MjUwMDAwOCBaIi8+PC9nPjwvZz48L3N2Zz4=";
58
+
59
+ constructor(private provider: MetaMaskProvider) {}
60
+
61
+ get version() {
62
+ return "1.0.0" as const;
63
+ }
64
+
65
+ get name() {
66
+ return this.#name;
67
+ }
68
+
69
+ get icon() {
70
+ return this.#icon as WalletWithStarknetFeatures["icon"];
71
+ }
72
+
73
+ get features(): StarknetFeatures {
74
+ return {
75
+ [StandardConnect]: {
76
+ version: "1.0.0" as const,
77
+ connect: this.#connect.bind(this),
78
+ },
79
+ [StandardDisconnect]: {
80
+ version: "1.0.0" as const,
81
+ disconnect: this.#disconnect.bind(this),
82
+ },
83
+ [StandardEvents]: {
84
+ version: "1.0.0" as const,
85
+ on: this.#on.bind(this),
86
+ },
87
+ [StarknetWalletApi]: {
88
+ version: "1.0.0" as const,
89
+ request: this.#request.bind(this),
90
+ walletVersion: "2.0.0",
91
+ },
92
+ };
93
+ }
94
+
95
+ get chains() {
96
+ return WELL_KNOWN_STARKNET_CHAINS.slice();
97
+ }
98
+
99
+ get accounts(): StarknetWalletAccount[] {
100
+ if (this.#account) {
101
+ return [
102
+ {
103
+ address: this.#account.address,
104
+ publicKey: new Uint8Array(),
105
+ chains: [this.#account.chain],
106
+ features: [],
107
+ },
108
+ ];
109
+ }
110
+
111
+ return [];
112
+ }
113
+
114
+ #connect: StandardConnectMethod = async ({ silent }) => {
115
+ if (!this.#account) {
116
+ const accounts = await this.#request({
117
+ type: "wallet_requestAccounts",
118
+ params: {
119
+ silent_mode: silent,
120
+ },
121
+ });
122
+
123
+ // TODO(fra): maybe we should throw an error here?
124
+ // User rejected the request.
125
+ if (accounts.length === 0) {
126
+ return { accounts: [] };
127
+ }
128
+
129
+ await this.#onAccountsChanged(accounts);
130
+ }
131
+
132
+ return { accounts: this.accounts };
133
+ };
134
+
135
+ #disconnect: StandardDisconnectMethod = async () => {
136
+ this.#disconnected();
137
+ };
138
+
139
+ #emit<E extends StandardEventsNames>(
140
+ event: E,
141
+ ...args: Parameters<StandardEventsListeners[E]>
142
+ ): void {
143
+ if (!this.#listeners[event]) return;
144
+
145
+ for (const listener of this.#listeners[event]) {
146
+ listener.apply(null, args);
147
+ }
148
+ }
149
+
150
+ #on: StandardEventsOnMethod = (event, listener) => {
151
+ if (!this.#listeners[event]) {
152
+ this.#listeners[event] = [];
153
+ }
154
+
155
+ this.#listeners[event].push(listener);
156
+
157
+ return (): void => this.#off(event, listener);
158
+ };
159
+
160
+ #off<E extends StandardEventsNames>(
161
+ event: E,
162
+ listener: StandardEventsListeners[E],
163
+ ): void {
164
+ this.#listeners[event] = this.#listeners[event]?.filter(
165
+ (existingListener) => listener !== existingListener,
166
+ );
167
+ }
168
+
169
+ #disconnected() {
170
+ if (this.#account) {
171
+ this.#account = null;
172
+ this.#emit("change", { accounts: this.accounts });
173
+ }
174
+ }
175
+
176
+ #request<T extends RpcMessage["type"]>(
177
+ args: RequestFnCall<T>,
178
+ ): Promise<RpcTypeToMessageMap[T]["result"]> {
179
+ return this.#lock.runExclusive(async () => {
180
+ // Loading the MetaMask snap requires the user to confirm the installation.
181
+ // If the snap is not installed, return an empty array to avoid the wallet popup.
182
+ if (!this.#swo && args.type === "wallet_getPermissions") {
183
+ return [];
184
+ }
185
+
186
+ if (!this.#swo) {
187
+ this.#swo = await this.#loadWallet(this.provider);
188
+ // Bind properties from the virtual wallet to make sure they're up-to-date.
189
+ this.#name = this.#swo.name;
190
+ if (typeof this.#swo.icon === "string") {
191
+ this.#icon = this.#swo.icon;
192
+ } else {
193
+ this.#icon = this.#swo.icon.light;
194
+ }
195
+ }
196
+
197
+ return this.#swo.request(args);
198
+ });
199
+ }
200
+
201
+ async #loadWallet(provider: MetaMaskProvider): Promise<StarknetWindowObject> {
202
+ await init({
203
+ name: "MetaMaskStarknetSnapWallet",
204
+ remotes: [
205
+ {
206
+ name: "MetaMaskStarknetSnapWallet",
207
+ alias: "MetaMaskStarknetSnapWallet",
208
+ entry: `https://snaps.consensys.io/starknet/get-starknet/v1/remoteEntry.js?ts=${Date.now()}`,
209
+ },
210
+ ],
211
+ });
212
+
213
+ const result = await loadRemote<{
214
+ MetaMaskSnapWallet: new (
215
+ provider: MetaMaskProvider,
216
+ version: string,
217
+ ) => StarknetWindowObject;
218
+ }>("MetaMaskStarknetSnapWallet/index");
219
+
220
+ if (!result) {
221
+ // as `loadWallet` should only trigger when the wallet selected,
222
+ // therefore it is make sense to throw error to indicate the wallet is not loaded
223
+ throw new Error("Failed to load MetaMask Wallet");
224
+ }
225
+
226
+ const swo = new result.MetaMaskSnapWallet(provider, "*");
227
+ swo.on("accountsChanged", this.#onAccountsChanged.bind(this));
228
+ swo.on("networkChanged", this.#onNetworkChanged.bind(this));
229
+ return swo;
230
+ }
231
+
232
+ async #getStarknetChain(): Promise<StarknetChain> {
233
+ const chainId = await this.#request({
234
+ type: "wallet_requestChainId",
235
+ });
236
+ const chain = `${STARKNET_CHAIN_PREFIX}${chainId}` as const;
237
+
238
+ if (!isStarknetChain(chain)) {
239
+ throw new Error("Invalid Starknet chain");
240
+ }
241
+
242
+ return chain;
243
+ }
244
+
245
+ async #onAccountsChanged(accounts: string[]) {
246
+ if (!accounts || accounts.length === 0) {
247
+ this.#disconnected();
248
+ return;
249
+ }
250
+
251
+ const [account] = accounts;
252
+
253
+ if (this.#account?.chain) {
254
+ // Only account changed. No need to make a request for the chain id.
255
+ this.#account.address = account;
256
+ this.#emit("change", { accounts: this.accounts });
257
+ } else {
258
+ const chain = await this.#getStarknetChain();
259
+ this.#account = { address: account, chain };
260
+ this.#emit("change", { accounts: this.accounts });
261
+ }
262
+ }
263
+
264
+ #onNetworkChanged(chainId?: string, accounts?: string[]) {
265
+ if (!chainId) {
266
+ this.#disconnected();
267
+ return;
268
+ }
269
+
270
+ const chain = formatStarknetChainId(chainId);
271
+
272
+ if (!isStarknetChain(chain)) {
273
+ throw new Error(`Invalid Starknet chain: ${chain}`);
274
+ }
275
+
276
+ // Accounts should always be set, but check just in case.
277
+ if (accounts?.length > 0) {
278
+ const [account] = accounts;
279
+
280
+ this.#account = { address: account, chain };
281
+ this.#emit("change", { accounts: this.accounts });
282
+ } else {
283
+ this.#account.chain = chain;
284
+ this.#emit("change", { accounts: this.accounts });
285
+ }
286
+ }
287
+ }
288
+
289
+ export type MetaMaskProvider = {
290
+ isMetaMask: boolean;
291
+ request(options: { method: string }): Promise<void>;
292
+ };
293
+
294
+ export function isMetaMaskProvider(obj: unknown): obj is MetaMaskProvider {
295
+ return (
296
+ obj !== null &&
297
+ typeof obj === "object" &&
298
+ Object.hasOwn(obj, "isMetaMask") &&
299
+ Object.hasOwn(obj, "request")
300
+ );
301
+ }
package/src/types.ts ADDED
@@ -0,0 +1,11 @@
1
+ import type { WalletWithStarknetFeatures } from "@starknet-io/get-starknet-wallet-standard/features";
2
+ import type { EIP1193Provider } from "viem";
3
+
4
+ export type EIP6963ProviderInfo = {
5
+ rdns: string;
6
+ };
7
+
8
+ export type EIP1193Adapter = (
9
+ info: EIP6963ProviderInfo,
10
+ provider: EIP1193Provider,
11
+ ) => WalletWithStarknetFeatures | null;