@metamask/connect-evm 1.3.1 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,297 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
11
+ if (kind === "m") throw new TypeError("Private method is not writable");
12
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
13
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
14
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
15
+ };
16
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
17
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
18
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
19
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
20
+ };
21
+ var _EIP6963ProviderAnnouncer_instances, _EIP6963ProviderAnnouncer_provider, _EIP6963ProviderAnnouncer_detail, _EIP6963ProviderAnnouncer_suppressed, _EIP6963ProviderAnnouncer_requestHandler, _EIP6963ProviderAnnouncer_announcementPromise, _EIP6963ProviderAnnouncer_announceOnce, _EIP6963ProviderAnnouncer_installRequestProviderListener, _EIP6963ProviderAnnouncer_dispatchAnnouncement;
22
+ import metamaskFoxIcon from './assets/metamask-fox.svg';
23
+ import { logger } from './logger';
24
+ /**
25
+ * EIP-6963 event name wallets use to announce providers to dapps.
26
+ */
27
+ export const EIP6963_ANNOUNCE_PROVIDER_EVENT = 'eip6963:announceProvider';
28
+ /**
29
+ * EIP-6963 event name dapps dispatch to request wallet re-announcements.
30
+ */
31
+ export const EIP6963_REQUEST_PROVIDER_EVENT = 'eip6963:requestProvider';
32
+ /**
33
+ * Time to wait after requesting EIP-6963 providers before deciding whether a
34
+ * native MetaMask provider is present.
35
+ */
36
+ export const EIP6963_DETECTION_TIMEOUT_MS = 300;
37
+ /**
38
+ * Display name used for the MMConnect-managed MetaMask EIP-6963 provider.
39
+ */
40
+ export const CONNECT_EVM_EIP6963_NAME = 'MetaMask';
41
+ /**
42
+ * Reverse-DNS identifier used for the MMConnect-managed MetaMask EIP-6963 provider.
43
+ */
44
+ export const CONNECT_EVM_EIP6963_RDNS = 'io.metamask.mmc';
45
+ /**
46
+ * Native MetaMask EIP-6963 identifiers that should suppress SDK announcement.
47
+ */
48
+ export const METAMASK_EIP6963_RDNS = [
49
+ 'io.metamask',
50
+ 'io.metamask.mobile',
51
+ ];
52
+ /**
53
+ * Icon URI used for the MMConnect-managed MetaMask EIP-6963 provider.
54
+ */
55
+ export const CONNECT_EVM_EIP6963_ICON = metamaskFoxIcon;
56
+ /**
57
+ * Gets the current browser window when EIP-6963 events can be used.
58
+ *
59
+ * This intentionally uses the current `window`; it does not attempt to bridge
60
+ * to `window.top`. EIP-6963 discovery is scoped to the frame where the SDK is
61
+ * running.
62
+ *
63
+ * @returns The current browser window, or undefined outside a browser context.
64
+ */
65
+ const getBrowserWindow = () => {
66
+ const { window: browserWindow } = globalThis;
67
+ return typeof (browserWindow === null || browserWindow === void 0 ? void 0 : browserWindow.dispatchEvent) === 'function'
68
+ ? browserWindow
69
+ : undefined;
70
+ };
71
+ const delay = (ms) => __awaiter(void 0, void 0, void 0, function* () { return yield new Promise((resolve) => setTimeout(resolve, ms)); });
72
+ const isNativeMetaMaskRdns = (rdns) => METAMASK_EIP6963_RDNS.some((nativeRdns) => nativeRdns === rdns);
73
+ const getAnnouncementRdns = (event) => {
74
+ var _a;
75
+ const { detail } = event;
76
+ const rdns = (_a = detail === null || detail === void 0 ? void 0 : detail.info) === null || _a === void 0 ? void 0 : _a.rdns;
77
+ return typeof rdns === 'string' ? rdns : undefined;
78
+ };
79
+ const UUID_BYTE_TO_HEX = Array.from({ length: 256 }, (_, byte) => byte.toString(16).padStart(2, '0'));
80
+ /**
81
+ * Formats random bytes as an RFC 4122 version 4 UUID.
82
+ *
83
+ * @param bytes - Random bytes from a cryptographically secure source.
84
+ * @returns A UUID string.
85
+ */
86
+ const formatUuidV4 = (bytes) => {
87
+ bytes[6] = (bytes[6] % 16) + 64;
88
+ bytes[8] = (bytes[8] % 64) + 128;
89
+ return [
90
+ UUID_BYTE_TO_HEX[bytes[0]],
91
+ UUID_BYTE_TO_HEX[bytes[1]],
92
+ UUID_BYTE_TO_HEX[bytes[2]],
93
+ UUID_BYTE_TO_HEX[bytes[3]],
94
+ '-',
95
+ UUID_BYTE_TO_HEX[bytes[4]],
96
+ UUID_BYTE_TO_HEX[bytes[5]],
97
+ '-',
98
+ UUID_BYTE_TO_HEX[bytes[6]],
99
+ UUID_BYTE_TO_HEX[bytes[7]],
100
+ '-',
101
+ UUID_BYTE_TO_HEX[bytes[8]],
102
+ UUID_BYTE_TO_HEX[bytes[9]],
103
+ '-',
104
+ UUID_BYTE_TO_HEX[bytes[10]],
105
+ UUID_BYTE_TO_HEX[bytes[11]],
106
+ UUID_BYTE_TO_HEX[bytes[12]],
107
+ UUID_BYTE_TO_HEX[bytes[13]],
108
+ UUID_BYTE_TO_HEX[bytes[14]],
109
+ UUID_BYTE_TO_HEX[bytes[15]],
110
+ ].join('');
111
+ };
112
+ /**
113
+ * Creates a UUID for the EIP-6963 provider identity.
114
+ *
115
+ * Requires Web Crypto. EIP-6963 discovery is browser-only, and unsupported
116
+ * browsers should fail this best-effort announcement path rather than receive a
117
+ * weak UUID.
118
+ *
119
+ * @returns A UUID string.
120
+ */
121
+ const createUuid = () => {
122
+ const { crypto: cryptoProvider } = globalThis;
123
+ if (cryptoProvider === null || cryptoProvider === void 0 ? void 0 : cryptoProvider.randomUUID) {
124
+ return cryptoProvider.randomUUID();
125
+ }
126
+ if (cryptoProvider === null || cryptoProvider === void 0 ? void 0 : cryptoProvider.getRandomValues) {
127
+ const bytes = new Uint8Array(16);
128
+ cryptoProvider.getRandomValues(bytes);
129
+ return formatUuidV4(bytes);
130
+ }
131
+ throw new Error('Web Crypto API is required for EIP-6963 announcement');
132
+ };
133
+ /**
134
+ * Creates a DOM custom event with an EIP-6963 announcement payload.
135
+ *
136
+ * @param detail - The provider announcement detail.
137
+ * @returns A custom event containing the announcement detail.
138
+ */
139
+ const createAnnouncementEvent = (detail) => {
140
+ const { CustomEvent: CustomEventConstructor } = globalThis;
141
+ return new CustomEventConstructor(EIP6963_ANNOUNCE_PROVIDER_EVENT, {
142
+ detail,
143
+ });
144
+ };
145
+ /**
146
+ * Creates a DOM event requesting EIP-6963 providers to re-announce.
147
+ *
148
+ * @returns A request-provider event.
149
+ */
150
+ const createRequestProviderEvent = () => {
151
+ const { Event: EventConstructor } = globalThis;
152
+ return new EventConstructor(EIP6963_REQUEST_PROVIDER_EVENT);
153
+ };
154
+ /**
155
+ * Creates immutable metadata for one SDK provider identity.
156
+ *
157
+ * @returns Provider metadata for EIP-6963 announcement.
158
+ */
159
+ const createProviderInfo = () => Object.freeze({
160
+ uuid: createUuid(),
161
+ name: CONNECT_EVM_EIP6963_NAME,
162
+ icon: CONNECT_EVM_EIP6963_ICON,
163
+ rdns: CONNECT_EVM_EIP6963_RDNS,
164
+ });
165
+ /**
166
+ * Checks whether native MetaMask has already announced through EIP-6963.
167
+ *
168
+ * The listener is installed before dispatching `requestProvider` so wallets
169
+ * that announce synchronously in response to the request are observed.
170
+ *
171
+ * @returns True when a native MetaMask provider rdns was observed.
172
+ */
173
+ const hasNativeMetaMaskProvider = () => __awaiter(void 0, void 0, void 0, function* () {
174
+ const browserWindow = getBrowserWindow();
175
+ if (!browserWindow) {
176
+ return false;
177
+ }
178
+ const announcedRdns = new Set();
179
+ const handler = (event) => {
180
+ const rdns = getAnnouncementRdns(event);
181
+ if (rdns) {
182
+ announcedRdns.add(rdns);
183
+ }
184
+ };
185
+ browserWindow.addEventListener(EIP6963_ANNOUNCE_PROVIDER_EVENT, handler);
186
+ try {
187
+ browserWindow.dispatchEvent(createRequestProviderEvent());
188
+ yield delay(EIP6963_DETECTION_TIMEOUT_MS);
189
+ }
190
+ finally {
191
+ browserWindow.removeEventListener(EIP6963_ANNOUNCE_PROVIDER_EVENT, handler);
192
+ }
193
+ return [...announcedRdns].some(isNativeMetaMaskRdns);
194
+ });
195
+ /**
196
+ * Announces an MMConnect-managed EIP-1193 provider through EIP-6963.
197
+ *
198
+ * Announcement is best-effort and browser-only. Native MetaMask providers with
199
+ * `io.metamask` or `io.metamask.mobile` suppress this SDK provider to avoid
200
+ * duplicate MetaMask entries in wallet pickers.
201
+ */
202
+ export class EIP6963ProviderAnnouncer {
203
+ /**
204
+ * Creates an EIP-6963 announcer for one SDK provider instance.
205
+ *
206
+ * @param provider - EIP-1193 provider to announce.
207
+ */
208
+ constructor(provider) {
209
+ _EIP6963ProviderAnnouncer_instances.add(this);
210
+ /** EIP-1193 provider exposed in EIP-6963 announcements. */
211
+ _EIP6963ProviderAnnouncer_provider.set(this, void 0);
212
+ /** Stable announcement payload for this SDK provider instance. */
213
+ _EIP6963ProviderAnnouncer_detail.set(this, void 0);
214
+ /** Whether native MetaMask detection already suppressed this provider. */
215
+ _EIP6963ProviderAnnouncer_suppressed.set(this, false);
216
+ /** Listener used to re-announce the SDK provider on future requests. */
217
+ _EIP6963ProviderAnnouncer_requestHandler.set(this, void 0);
218
+ /** In-flight announcement detection promise, shared by concurrent calls. */
219
+ _EIP6963ProviderAnnouncer_announcementPromise.set(this, void 0);
220
+ __classPrivateFieldSet(this, _EIP6963ProviderAnnouncer_provider, provider, "f");
221
+ }
222
+ /**
223
+ * Announces the SDK provider unless native MetaMask has already announced.
224
+ *
225
+ * Repeated calls are idempotent: once announced, this re-dispatches the same
226
+ * provider detail and does not install duplicate request listeners. The first
227
+ * call may take up to `EIP6963_DETECTION_TIMEOUT_MS` while native providers
228
+ * are requested.
229
+ *
230
+ * @returns A promise that resolves once detection and any announcement finish.
231
+ */
232
+ announce() {
233
+ return __awaiter(this, void 0, void 0, function* () {
234
+ try {
235
+ if (__classPrivateFieldGet(this, _EIP6963ProviderAnnouncer_suppressed, "f")) {
236
+ return;
237
+ }
238
+ if (__classPrivateFieldGet(this, _EIP6963ProviderAnnouncer_detail, "f")) {
239
+ __classPrivateFieldGet(this, _EIP6963ProviderAnnouncer_instances, "m", _EIP6963ProviderAnnouncer_dispatchAnnouncement).call(this);
240
+ return;
241
+ }
242
+ if (!__classPrivateFieldGet(this, _EIP6963ProviderAnnouncer_announcementPromise, "f")) {
243
+ __classPrivateFieldSet(this, _EIP6963ProviderAnnouncer_announcementPromise, __classPrivateFieldGet(this, _EIP6963ProviderAnnouncer_instances, "m", _EIP6963ProviderAnnouncer_announceOnce).call(this)
244
+ .catch((error) => {
245
+ logger('EIP-6963 provider announcement failed', error);
246
+ })
247
+ .finally(() => {
248
+ __classPrivateFieldSet(this, _EIP6963ProviderAnnouncer_announcementPromise, undefined, "f");
249
+ }), "f");
250
+ }
251
+ yield __classPrivateFieldGet(this, _EIP6963ProviderAnnouncer_announcementPromise, "f");
252
+ }
253
+ catch (error) {
254
+ logger('EIP-6963 provider announcement failed', error);
255
+ }
256
+ });
257
+ }
258
+ }
259
+ _EIP6963ProviderAnnouncer_provider = new WeakMap(), _EIP6963ProviderAnnouncer_detail = new WeakMap(), _EIP6963ProviderAnnouncer_suppressed = new WeakMap(), _EIP6963ProviderAnnouncer_requestHandler = new WeakMap(), _EIP6963ProviderAnnouncer_announcementPromise = new WeakMap(), _EIP6963ProviderAnnouncer_instances = new WeakSet(), _EIP6963ProviderAnnouncer_announceOnce = function _EIP6963ProviderAnnouncer_announceOnce() {
260
+ return __awaiter(this, void 0, void 0, function* () {
261
+ if (!getBrowserWindow()) {
262
+ return;
263
+ }
264
+ if (yield hasNativeMetaMaskProvider()) {
265
+ logger('MetaMask EIP-6963 provider is already announced. Skipping...');
266
+ __classPrivateFieldSet(this, _EIP6963ProviderAnnouncer_suppressed, true, "f");
267
+ return;
268
+ }
269
+ __classPrivateFieldSet(this, _EIP6963ProviderAnnouncer_detail, Object.freeze({
270
+ info: createProviderInfo(),
271
+ provider: __classPrivateFieldGet(this, _EIP6963ProviderAnnouncer_provider, "f"),
272
+ }), "f");
273
+ __classPrivateFieldGet(this, _EIP6963ProviderAnnouncer_instances, "m", _EIP6963ProviderAnnouncer_installRequestProviderListener).call(this);
274
+ __classPrivateFieldGet(this, _EIP6963ProviderAnnouncer_instances, "m", _EIP6963ProviderAnnouncer_dispatchAnnouncement).call(this);
275
+ });
276
+ }, _EIP6963ProviderAnnouncer_installRequestProviderListener = function _EIP6963ProviderAnnouncer_installRequestProviderListener() {
277
+ const browserWindow = getBrowserWindow();
278
+ if (!browserWindow || __classPrivateFieldGet(this, _EIP6963ProviderAnnouncer_requestHandler, "f")) {
279
+ return;
280
+ }
281
+ __classPrivateFieldSet(this, _EIP6963ProviderAnnouncer_requestHandler, () => {
282
+ try {
283
+ __classPrivateFieldGet(this, _EIP6963ProviderAnnouncer_instances, "m", _EIP6963ProviderAnnouncer_dispatchAnnouncement).call(this);
284
+ }
285
+ catch (error) {
286
+ logger('EIP-6963 provider announcement failed', error);
287
+ }
288
+ }, "f");
289
+ browserWindow.addEventListener(EIP6963_REQUEST_PROVIDER_EVENT, __classPrivateFieldGet(this, _EIP6963ProviderAnnouncer_requestHandler, "f"));
290
+ }, _EIP6963ProviderAnnouncer_dispatchAnnouncement = function _EIP6963ProviderAnnouncer_dispatchAnnouncement() {
291
+ const browserWindow = getBrowserWindow();
292
+ if (!browserWindow || !__classPrivateFieldGet(this, _EIP6963ProviderAnnouncer_detail, "f")) {
293
+ return;
294
+ }
295
+ browserWindow.dispatchEvent(createAnnouncementEvent(__classPrivateFieldGet(this, _EIP6963ProviderAnnouncer_detail, "f")));
296
+ };
297
+ //# sourceMappingURL=eip6963.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eip6963.js","sourceRoot":"","sources":["../../src/eip6963.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  export { getInfuraRpcUrls } from './utils/infura';
2
2
  export { createEVMClient, type MetamaskConnectEVM } from './connect';
3
+ export { EIP6963_ANNOUNCE_PROVIDER_EVENT, EIP6963_REQUEST_PROVIDER_EVENT, } from './eip6963';
3
4
  export type { EIP1193Provider } from './provider';
4
5
  export type * from './types';
5
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,KAAK,kBAAkB,EAAE,MAAM,WAAW,CAAC;AACrE,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,mBAAmB,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,KAAK,kBAAkB,EAAE,MAAM,WAAW,CAAC;AACrE,OAAO,EACL,+BAA+B,EAC/B,8BAA8B,GAC/B,MAAM,WAAW,CAAC;AACnB,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,mBAAmB,SAAS,CAAC"}
package/dist/src/index.js CHANGED
@@ -1,3 +1,4 @@
1
1
  export { getInfuraRpcUrls } from './utils/infura';
2
2
  export { createEVMClient } from './connect';
3
+ export { EIP6963_ANNOUNCE_PROVIDER_EVENT, EIP6963_REQUEST_PROVIDER_EVENT, } from './eip6963';
3
4
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,eAAe,EAA2B,MAAM,WAAW,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,eAAe,EAA2B,MAAM,WAAW,CAAC;AACrE,OAAO,EACL,+BAA+B,EAC/B,8BAA8B,GAC/B,MAAM,WAAW,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"infura.js","sourceRoot":"","sources":["../../../src/utils/infura.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,IAAI,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAE9F,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,WAAW,EACX,gBAAgB,GACjB,MAAM,iBAAiB,CAAC;AAEzB;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,EAC/B,YAAY,EACZ,QAAQ,GAIT,EAAuB,EAAE;IACxB,MAAM,YAAY,GAAG,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,GAAG,CAChC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,WAAW,CAAC,OAAO,CAAC,EAAiB,CAC7D,CAAC;IAEF,MAAM,OAAO,GAAG,0BAA0B,CAAC;QACzC,YAAY;QACZ,YAAY;KACb,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,CACnC,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE;QAClB,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,gBAAgB,CAAC,GAAkB,CAAC,CAAC;QACtE,IAAI,SAAS,KAAK,kBAAkB,CAAC,MAAM,EAAE,CAAC;YAC5C,OAAO,GAAG,CAAC;QACb,CAAC;QACD,MAAM,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC;QACrD,GAAG,CAAC,OAAO,CAAC,GAAG,GAAa,CAAC;QAC7B,OAAO,GAAG,CAAC;IACb,CAAC,EACD,EAAE,CACH,CAAC;AACJ,CAAC,CAAC"}
1
+ {"version":3,"file":"infura.js","sourceRoot":"","sources":["../../../src/utils/infura.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,IAAI,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAE9F,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,WAAW,EACX,gBAAgB,GACjB,MAAM,iBAAiB,CAAC;AAEzB;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,EAC/B,YAAY,EACZ,QAAQ,GAIT,EAAuB,EAAE;IACxB,MAAM,YAAY,GAAG,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,GAAG,CAChC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,WAAW,CAAC,OAAO,CAAC,EAAiB,CAC7D,CAAC;IAEF,MAAM,OAAO,GAAG,0BAA0B,CAAC;QACzC,YAAY;QACZ,YAAY;KACb,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,CACnC,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE;QAClB,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,gBAAgB,CAAC,GAAkB,CAAC,CAAC;QACtE,IAAI,SAAS,KAAK,kBAAkB,CAAC,MAAM,EAAE,CAAC;YAC5C,OAAO,GAAG,CAAC;QACb,CAAC;QACD,MAAM,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC;QACrD,GAAG,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC;QACnB,OAAO,GAAG,CAAC;IACb,CAAC,EACD,EAAE,CACH,CAAC;AACJ,CAAC,CAAC"}
@@ -314,6 +314,14 @@ declare class MetamaskConnectEVM {
314
314
  * @returns The EIP-1193 provider instance
315
315
  */
316
316
  getProvider(): EIP1193Provider;
317
+ /**
318
+ * Announces the EIP-1193 provider through EIP-6963 wallet discovery.
319
+ *
320
+ * This is a no-op when a native MetaMask EIP-6963 provider has already
321
+ * announced, or when running outside a browser environment. The first call
322
+ * may take up to 300 ms while native providers are requested.
323
+ */
324
+ announceProvider(): Promise<void>;
317
325
  /**
318
326
  * Gets the currently selected chain ID on the wallet
319
327
  *
@@ -358,6 +366,7 @@ declare class MetamaskConnectEVM {
358
366
  * @param options.dapp - Dapp identification and branding settings
359
367
  * @param options.api - API configuration including read-only RPC map
360
368
  * @param options.api.supportedNetworks - A map of hex chain IDs to RPC URLs for read-only requests
369
+ * @param [options.analytics.enabled] - Whether to enable dapp-side analytics (defaults to true)
361
370
  * @param [options.analytics.integrationType] - Integration type for analytics
362
371
  * @param [options.ui] - UI configuration options
363
372
  * @param [options.ui.headless] - Whether to run without UI
@@ -366,11 +375,11 @@ declare class MetamaskConnectEVM {
366
375
  * @param [options.mobile] - Mobile configuration options
367
376
  * @param [options.mobile.preferredOpenLink] - Custom handler for opening deeplinks (useful for React Native, etc.)
368
377
  * @param [options.mobile.useDeeplink] - Whether to use native deeplinks instead of universal links
369
- * @param [options.transport] - Transport configuration (e.g., extensionId, notification handler)
378
+ * @param [options.transport] - Transport configuration (e.g., extensionId)
370
379
  * @param [options.transport.extensionId] - Extension ID for browser extension transport
371
- * @param [options.transport.onNotification] - Callback for receiving transport notifications
372
380
  * @param [options.eventHandlers] - Event handlers for the Metamask Connect/EVM layer
373
381
  * @param [options.debug] - Enable debug logging
382
+ * @param [options.skipAutoAnnounce] - Skip automatic EIP-6963 provider announcement
374
383
  * @returns The Metamask-Connect EVM client instance
375
384
  */
376
385
  declare function createEVMClient(options: Pick<MultichainOptions, 'dapp' | 'mobile' | 'transport' | 'analytics'> & {
@@ -378,9 +387,19 @@ declare function createEVMClient(options: Pick<MultichainOptions, 'dapp' | 'mobi
378
387
  } & {
379
388
  eventHandlers?: Partial<EventHandlers>;
380
389
  debug?: boolean;
390
+ skipAutoAnnounce?: boolean;
381
391
  api: {
382
392
  supportedNetworks: Record<Hex, string>;
383
393
  };
384
394
  }): Promise<MetamaskConnectEVM>;
385
395
 
386
- export { type AddEthereumChainParameter, type Address, type CaipAccountId, type CaipChainId, EIP1193Provider, type EIP1193ProviderEvents, type EventHandlers, type Hex, type JsonRpcCallback, type JsonRpcRequest, type JsonRpcResponse, MetamaskConnectEVM, type MetamaskConnectEVMOptions, type ProviderRequest, type ProviderRequestInterceptor, createEVMClient, getInfuraRpcUrls };
396
+ /**
397
+ * EIP-6963 event name wallets use to announce providers to dapps.
398
+ */
399
+ declare const EIP6963_ANNOUNCE_PROVIDER_EVENT = "eip6963:announceProvider";
400
+ /**
401
+ * EIP-6963 event name dapps dispatch to request wallet re-announcements.
402
+ */
403
+ declare const EIP6963_REQUEST_PROVIDER_EVENT = "eip6963:requestProvider";
404
+
405
+ export { type AddEthereumChainParameter, type Address, type CaipAccountId, type CaipChainId, EIP1193Provider, type EIP1193ProviderEvents, EIP6963_ANNOUNCE_PROVIDER_EVENT, EIP6963_REQUEST_PROVIDER_EVENT, type EventHandlers, type Hex, type JsonRpcCallback, type JsonRpcRequest, type JsonRpcResponse, MetamaskConnectEVM, type MetamaskConnectEVMOptions, type ProviderRequest, type ProviderRequestInterceptor, createEVMClient, getInfuraRpcUrls };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@metamask/connect-evm",
3
- "version": "1.3.1",
4
- "description": "EVM Layer for MetaMask Connect",
3
+ "version": "2.0.0",
4
+ "description": "MetaMask Connect EVM adapter EIP-1193 provider over the multichain client",
5
5
  "keywords": [
6
6
  "MetaMask",
7
7
  "Ethereum"
@@ -54,13 +54,15 @@
54
54
  "test:watch": "vitest watch"
55
55
  },
56
56
  "dependencies": {
57
- "@metamask/analytics": "^0.5.0",
58
- "@metamask/connect-multichain": "^0.14.0",
59
- "@metamask/utils": "^11.8.1"
57
+ "@metamask/analytics": "^0.6.0",
58
+ "@metamask/utils": "^11.8.1",
59
+ "semver": "^7.7.4"
60
60
  },
61
61
  "devDependencies": {
62
62
  "@metamask/auto-changelog": "^3.4.4",
63
+ "@metamask/connect-multichain": "^1.0.0",
63
64
  "@types/jsdom": "^21.1.7",
65
+ "@types/semver": "^7.7.1",
64
66
  "@vitest/coverage-v8": "^3.2.4",
65
67
  "jsdom": "^26.1.0",
66
68
  "prettier": "^3.3.3",
@@ -70,6 +72,9 @@
70
72
  "typescript": "^5.9.3",
71
73
  "vitest": "^3.1.2"
72
74
  },
75
+ "peerDependencies": {
76
+ "@metamask/connect-multichain": "^1.0.0"
77
+ },
73
78
  "engines": {
74
79
  "node": ">=20.19.0"
75
80
  },