@metamask/connect-multichain 0.4.0 → 0.5.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/CHANGELOG.md +26 -1
- package/dist/browser/es/connect-multichain.d.mts +26 -9
- package/dist/browser/es/connect-multichain.mjs +341 -78
- package/dist/browser/es/connect-multichain.mjs.map +1 -1
- package/dist/browser/es/metafile-esm.json +1 -1
- package/dist/browser/iife/connect-multichain.d.ts +26 -9
- package/dist/browser/iife/connect-multichain.js +961 -151
- package/dist/browser/iife/connect-multichain.js.map +1 -1
- package/dist/browser/iife/metafile-iife.json +1 -1
- package/dist/browser/umd/connect-multichain.d.ts +26 -9
- package/dist/browser/umd/connect-multichain.js +341 -78
- package/dist/browser/umd/connect-multichain.js.map +1 -1
- package/dist/browser/umd/metafile-cjs.json +1 -1
- package/dist/node/cjs/connect-multichain.d.ts +26 -9
- package/dist/node/cjs/connect-multichain.js +342 -79
- package/dist/node/cjs/connect-multichain.js.map +1 -1
- package/dist/node/cjs/metafile-cjs.json +1 -1
- package/dist/node/es/connect-multichain.d.mts +26 -9
- package/dist/node/es/connect-multichain.mjs +341 -78
- package/dist/node/es/connect-multichain.mjs.map +1 -1
- package/dist/node/es/metafile-esm.json +1 -1
- package/dist/react-native/es/connect-multichain.d.mts +26 -9
- package/dist/react-native/es/connect-multichain.mjs +328 -69
- package/dist/react-native/es/connect-multichain.mjs.map +1 -1
- package/dist/react-native/es/metafile-esm.json +1 -1
- package/dist/src/domain/multichain/index.d.ts +4 -4
- package/dist/src/domain/multichain/index.d.ts.map +1 -1
- package/dist/src/domain/multichain/index.js.map +1 -1
- package/dist/src/domain/multichain/types.d.ts +4 -3
- package/dist/src/domain/multichain/types.d.ts.map +1 -1
- package/dist/src/domain/ui/types.d.ts +7 -0
- package/dist/src/domain/ui/types.d.ts.map +1 -1
- package/dist/src/domain/ui/types.js.map +1 -1
- package/dist/src/index.browser.d.ts +1 -1
- package/dist/src/index.browser.d.ts.map +1 -1
- package/dist/src/index.browser.js +1 -1
- package/dist/src/index.browser.js.map +1 -1
- package/dist/src/index.native.d.ts +1 -1
- package/dist/src/index.native.d.ts.map +1 -1
- package/dist/src/index.native.js +2 -2
- package/dist/src/index.native.js.map +1 -1
- package/dist/src/index.node.d.ts +1 -1
- package/dist/src/index.node.d.ts.map +1 -1
- package/dist/src/index.node.js +1 -1
- package/dist/src/index.node.js.map +1 -1
- package/dist/src/multichain/index.d.ts +6 -6
- package/dist/src/multichain/index.d.ts.map +1 -1
- package/dist/src/multichain/index.js +103 -43
- package/dist/src/multichain/index.js.map +1 -1
- package/dist/src/multichain/transports/default/index.d.ts +2 -1
- package/dist/src/multichain/transports/default/index.d.ts.map +1 -1
- package/dist/src/multichain/transports/default/index.js +1 -0
- package/dist/src/multichain/transports/default/index.js.map +1 -1
- package/dist/src/multichain/transports/multichainApiClientWrapper/index.d.ts +21 -0
- package/dist/src/multichain/transports/multichainApiClientWrapper/index.d.ts.map +1 -0
- package/dist/src/multichain/transports/multichainApiClientWrapper/index.js +159 -0
- package/dist/src/multichain/transports/multichainApiClientWrapper/index.js.map +1 -0
- package/dist/src/multichain/transports/mwp/index.d.ts +4 -1
- package/dist/src/multichain/transports/mwp/index.d.ts.map +1 -1
- package/dist/src/multichain/transports/mwp/index.js +54 -2
- package/dist/src/multichain/transports/mwp/index.js.map +1 -1
- package/dist/src/ui/ModalFactory.d.ts +54 -0
- package/dist/src/ui/ModalFactory.d.ts.map +1 -0
- package/dist/src/ui/ModalFactory.js +171 -0
- package/dist/src/ui/ModalFactory.js.map +1 -0
- package/dist/src/ui/index.d.ts +14 -38
- package/dist/src/ui/index.d.ts.map +1 -1
- package/dist/src/ui/index.js +24 -142
- package/dist/src/ui/index.js.map +1 -1
- package/dist/src/ui/index.native.d.ts +13 -0
- package/dist/src/ui/index.native.d.ts.map +1 -0
- package/dist/src/ui/{preload.native.js → index.native.js} +12 -6
- package/dist/src/ui/index.native.js.map +1 -0
- package/dist/src/ui/modals/base/AbstractInstallModal.d.ts.map +1 -1
- package/dist/src/ui/modals/base/AbstractInstallModal.js +0 -4
- package/dist/src/ui/modals/base/AbstractInstallModal.js.map +1 -1
- package/dist/types/connect-multichain.d.ts +26 -9
- package/package.json +4 -2
- package/dist/src/ui/preload.native.d.ts +0 -5
- package/dist/src/ui/preload.native.d.ts.map +0 -1
- package/dist/src/ui/preload.native.js.map +0 -1
- package/dist/src/ui/preload.web.d.ts +0 -5
- package/dist/src/ui/preload.web.d.ts.map +0 -1
- package/dist/src/ui/preload.web.js +0 -27
- package/dist/src/ui/preload.web.js.map +0 -1
package/dist/src/ui/index.d.ts
CHANGED
|
@@ -1,41 +1,17 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Browser/Web UI module entry point
|
|
3
|
+
*/
|
|
4
|
+
import { BaseModalFactory } from './ModalFactory';
|
|
3
5
|
import type { FactoryModals } from './modals/types';
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
constructor(options: T);
|
|
15
|
-
private validateModals;
|
|
16
|
-
unload(error?: Error): Promise<void>;
|
|
17
|
-
/**
|
|
18
|
-
* Determines if the current platform is a mobile native environment.
|
|
19
|
-
* Currently only includes React Native.
|
|
20
|
-
*/
|
|
21
|
-
get isMobile(): boolean;
|
|
22
|
-
/**
|
|
23
|
-
* Determines if the current platform is a Node.js environment.
|
|
24
|
-
* Used for server-side or non-browser environments.
|
|
25
|
-
*/
|
|
26
|
-
get isNode(): boolean;
|
|
27
|
-
/**
|
|
28
|
-
* Determines if the current platform is a web environment.
|
|
29
|
-
* Includes desktop web, MetaMask mobile webview, and mobile web.
|
|
30
|
-
*/
|
|
31
|
-
get isWeb(): boolean;
|
|
32
|
-
private getContainer;
|
|
33
|
-
private getMountedContainer;
|
|
34
|
-
createConnectionDeeplink(connectionRequest?: ConnectionRequest): string;
|
|
35
|
-
createConnectionUniversalLink(connectionRequest?: ConnectionRequest): string;
|
|
36
|
-
private onCloseModal;
|
|
37
|
-
private onStartDesktopOnboarding;
|
|
38
|
-
renderInstallModal(showInstallModal: boolean, createConnectionRequest: () => Promise<ConnectionRequest>, successCallback: (error?: Error) => Promise<void>): Promise<void>;
|
|
39
|
-
renderOTPCodeModal(createOTPCode: () => Promise<OTPCode>, successCallback: (error?: Error) => Promise<void>, updateOTPCode: (otpCode: OTPCode, modal: AbstractOTPCodeModal) => void): Promise<void>;
|
|
6
|
+
/**
|
|
7
|
+
* Web-specific preload that loads Stencil custom elements
|
|
8
|
+
*/
|
|
9
|
+
export declare function preload(): Promise<void>;
|
|
10
|
+
/**
|
|
11
|
+
* ModalFactory for browser/web environments.
|
|
12
|
+
* Loads Stencil web components via dynamic import.
|
|
13
|
+
*/
|
|
14
|
+
export declare class ModalFactory<T extends FactoryModals = FactoryModals> extends BaseModalFactory<T> {
|
|
15
|
+
protected preload(): Promise<void>;
|
|
40
16
|
}
|
|
41
17
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ui/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ui/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD;;GAEG;AACH,wBAAsB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAY7C;AAED;;;GAGG;AACH,qBAAa,YAAY,CACvB,CAAC,SAAS,aAAa,GAAG,aAAa,CACvC,SAAQ,gBAAgB,CAAC,CAAC,CAAC;cACX,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAGzC"}
|
package/dist/src/ui/index.js
CHANGED
|
@@ -7,153 +7,35 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
7
7
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
8
|
});
|
|
9
9
|
};
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
/* eslint-disable @typescript-eslint/naming-convention */
|
|
20
|
-
import MetaMaskOnboarding from '@metamask/onboarding';
|
|
21
|
-
import { METAMASK_CONNECT_BASE_URL, METAMASK_DEEPLINK_BASE } from '../config';
|
|
22
|
-
import { getPlatformType, getVersion, PlatformType, } from '../domain';
|
|
23
|
-
import { compressString } from '../multichain/utils';
|
|
24
|
-
import { preload } from './preload.web';
|
|
25
|
-
export class ModalFactory {
|
|
26
|
-
/**
|
|
27
|
-
* Creates a new modal factory instance.
|
|
28
|
-
*
|
|
29
|
-
* @param options - The modals configuration object
|
|
30
|
-
*/
|
|
31
|
-
constructor(options) {
|
|
32
|
-
this.options = options;
|
|
33
|
-
this.platform = getPlatformType();
|
|
34
|
-
this.validateModals();
|
|
35
|
-
}
|
|
36
|
-
validateModals() {
|
|
37
|
-
const requiredModals = ['InstallModal', 'OTPCodeModal'];
|
|
38
|
-
const missingModals = requiredModals.filter((modal) => !this.options[modal]);
|
|
39
|
-
if (missingModals.length > 0) {
|
|
40
|
-
throw new Error(`Missing required modals: ${missingModals.join(', ')}`);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
unload(error) {
|
|
44
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
45
|
-
var _a, _b;
|
|
46
|
-
(_a = this.modal) === null || _a === void 0 ? void 0 : _a.unmount();
|
|
47
|
-
yield ((_b = this.successCallback) === null || _b === void 0 ? void 0 : _b.call(this, error));
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Determines if the current platform is a mobile native environment.
|
|
52
|
-
* Currently only includes React Native.
|
|
53
|
-
*/
|
|
54
|
-
get isMobile() {
|
|
55
|
-
return this.platform === PlatformType.ReactNative;
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Determines if the current platform is a Node.js environment.
|
|
59
|
-
* Used for server-side or non-browser environments.
|
|
60
|
-
*/
|
|
61
|
-
get isNode() {
|
|
62
|
-
return this.platform === PlatformType.NonBrowser;
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* Determines if the current platform is a web environment.
|
|
66
|
-
* Includes desktop web, MetaMask mobile webview, and mobile web.
|
|
67
|
-
*/
|
|
68
|
-
get isWeb() {
|
|
69
|
-
return (this.platform === PlatformType.DesktopWeb ||
|
|
70
|
-
this.platform === PlatformType.MetaMaskMobileWebview ||
|
|
71
|
-
this.platform === PlatformType.MobileWeb);
|
|
72
|
-
}
|
|
73
|
-
getContainer() {
|
|
74
|
-
return typeof document === 'undefined'
|
|
75
|
-
? undefined
|
|
76
|
-
: document.createElement('div');
|
|
77
|
-
}
|
|
78
|
-
getMountedContainer() {
|
|
10
|
+
/**
|
|
11
|
+
* Browser/Web UI module entry point
|
|
12
|
+
*/
|
|
13
|
+
import { BaseModalFactory } from './ModalFactory';
|
|
14
|
+
/**
|
|
15
|
+
* Web-specific preload that loads Stencil custom elements
|
|
16
|
+
*/
|
|
17
|
+
export function preload() {
|
|
18
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
79
19
|
if (typeof document === 'undefined') {
|
|
80
|
-
return
|
|
81
|
-
}
|
|
82
|
-
const container = this.getContainer();
|
|
83
|
-
if (container) {
|
|
84
|
-
document.body.appendChild(container);
|
|
20
|
+
return;
|
|
85
21
|
}
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
if (!connectionRequest) {
|
|
90
|
-
throw new Error('createConnectionDeeplink can only be called with a connection request');
|
|
22
|
+
try {
|
|
23
|
+
const { defineCustomElements } = yield import('@metamask/multichain-ui/loader');
|
|
24
|
+
yield defineCustomElements();
|
|
91
25
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
const urlEncoded = encodeURIComponent(compressed);
|
|
95
|
-
return `${METAMASK_DEEPLINK_BASE}/mwp?p=${urlEncoded}&c=1`;
|
|
96
|
-
}
|
|
97
|
-
createConnectionUniversalLink(connectionRequest) {
|
|
98
|
-
if (!connectionRequest) {
|
|
99
|
-
return `${METAMASK_CONNECT_BASE_URL}`;
|
|
26
|
+
catch (error) {
|
|
27
|
+
console.error('Failed to load customElements:', error);
|
|
100
28
|
}
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
onStartDesktopOnboarding() {
|
|
112
|
-
new MetaMaskOnboarding().startOnboarding();
|
|
113
|
-
}
|
|
114
|
-
renderInstallModal(showInstallModal, createConnectionRequest, successCallback) {
|
|
115
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
116
|
-
var _a;
|
|
117
|
-
(_a = this.modal) === null || _a === void 0 ? void 0 : _a.unmount();
|
|
118
|
-
yield preload();
|
|
119
|
-
this.successCallback = successCallback;
|
|
120
|
-
const parentElement = this.getMountedContainer();
|
|
121
|
-
const connectionRequest = yield createConnectionRequest();
|
|
122
|
-
const qrCodeLink = this.createConnectionDeeplink(connectionRequest);
|
|
123
|
-
const modal = new this.options.InstallModal({
|
|
124
|
-
expiresIn: (connectionRequest.sessionRequest.expiresAt - Date.now()) / 1000,
|
|
125
|
-
connectionRequest,
|
|
126
|
-
parentElement,
|
|
127
|
-
showInstallModal,
|
|
128
|
-
link: qrCodeLink,
|
|
129
|
-
sdkVersion: getVersion(),
|
|
130
|
-
generateQRCode: (request) => __awaiter(this, void 0, void 0, function* () { return this.createConnectionDeeplink(request); }),
|
|
131
|
-
onClose: this.onCloseModal.bind(this),
|
|
132
|
-
startDesktopOnboarding: this.onStartDesktopOnboarding.bind(this),
|
|
133
|
-
createConnectionRequest,
|
|
134
|
-
});
|
|
135
|
-
this.modal = modal;
|
|
136
|
-
modal.mount();
|
|
137
|
-
});
|
|
138
|
-
}
|
|
139
|
-
renderOTPCodeModal(createOTPCode, successCallback, updateOTPCode) {
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* ModalFactory for browser/web environments.
|
|
33
|
+
* Loads Stencil web components via dynamic import.
|
|
34
|
+
*/
|
|
35
|
+
export class ModalFactory extends BaseModalFactory {
|
|
36
|
+
preload() {
|
|
140
37
|
return __awaiter(this, void 0, void 0, function* () {
|
|
141
|
-
|
|
142
|
-
(_a = this.modal) === null || _a === void 0 ? void 0 : _a.unmount();
|
|
143
|
-
yield preload();
|
|
144
|
-
this.successCallback = successCallback;
|
|
145
|
-
const container = this.getMountedContainer();
|
|
146
|
-
const otpCode = yield createOTPCode();
|
|
147
|
-
const modal = new this.options.OTPCodeModal({
|
|
148
|
-
parentElement: container,
|
|
149
|
-
sdkVersion: getVersion(),
|
|
150
|
-
otpCode,
|
|
151
|
-
onClose: this.onCloseModal.bind(this),
|
|
152
|
-
createOTPCode,
|
|
153
|
-
updateOTPCode: (otpCode) => updateOTPCode(otpCode, modal),
|
|
154
|
-
});
|
|
155
|
-
this.modal = modal;
|
|
156
|
-
modal.mount();
|
|
38
|
+
return preload();
|
|
157
39
|
});
|
|
158
40
|
}
|
|
159
41
|
}
|
package/dist/src/ui/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ui/index.ts"],"names":[],"mappings":";;;;;;;;;AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ui/index.ts"],"names":[],"mappings":";;;;;;;;;AAAA;;GAEG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAGlD;;GAEG;AACH,MAAM,UAAgB,OAAO;;QAC3B,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE,CAAC;YACpC,OAAO;QACT,CAAC;QACD,IAAI,CAAC;YACH,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,MAAM,CAC3C,gCAAgC,CACjC,CAAC;YACF,MAAM,oBAAoB,EAAE,CAAC;QAC/B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;CAAA;AAED;;;GAGG;AACH,MAAM,OAAO,YAEX,SAAQ,gBAAmB;IACX,OAAO;;YACrB,OAAO,OAAO,EAAE,CAAC;QACnB,CAAC;KAAA;CACF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* React Native UI module entry point
|
|
3
|
+
*/
|
|
4
|
+
import { BaseModalFactory } from './ModalFactory';
|
|
5
|
+
import type { FactoryModals } from './modals/types';
|
|
6
|
+
/**
|
|
7
|
+
* ModalFactory for React Native environments.
|
|
8
|
+
* No-op preload since Stencil web components are not used.
|
|
9
|
+
*/
|
|
10
|
+
export declare class ModalFactory<T extends FactoryModals = FactoryModals> extends BaseModalFactory<T> {
|
|
11
|
+
protected preload(): Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=index.native.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.native.d.ts","sourceRoot":"","sources":["../../../src/ui/index.native.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD;;;GAGG;AACH,qBAAa,YAAY,CACvB,CAAC,SAAS,aAAa,GAAG,aAAa,CACvC,SAAQ,gBAAgB,CAAC,CAAC,CAAC;cAEX,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CACzC"}
|
|
@@ -8,11 +8,17 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
8
8
|
});
|
|
9
9
|
};
|
|
10
10
|
/**
|
|
11
|
-
* React Native
|
|
11
|
+
* React Native UI module entry point
|
|
12
12
|
*/
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
13
|
+
import { BaseModalFactory } from './ModalFactory';
|
|
14
|
+
/**
|
|
15
|
+
* ModalFactory for React Native environments.
|
|
16
|
+
* No-op preload since Stencil web components are not used.
|
|
17
|
+
*/
|
|
18
|
+
export class ModalFactory extends BaseModalFactory {
|
|
19
|
+
// No-op for React Native - web components are not applicable
|
|
20
|
+
preload() {
|
|
21
|
+
return __awaiter(this, void 0, void 0, function* () { });
|
|
22
|
+
}
|
|
17
23
|
}
|
|
18
|
-
//# sourceMappingURL=
|
|
24
|
+
//# sourceMappingURL=index.native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.native.js","sourceRoot":"","sources":["../../../src/ui/index.native.ts"],"names":[],"mappings":";;;;;;;;;AAAA;;GAEG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAGlD;;;GAGG;AACH,MAAM,OAAO,YAEX,SAAQ,gBAAmB;IAC3B,6DAA6D;IAC7C,OAAO;8DAAmB,CAAC;KAAA;CAC5C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AbstractInstallModal.d.ts","sourceRoot":"","sources":["../../../../../src/ui/modals/base/AbstractInstallModal.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,iBAAiB,EAEtB,KAAK,kBAAkB,EACvB,KAAK,EACL,KAAK,MAAM,EACZ,MAAM,iBAAiB,CAAC;AAKzB,8BAAsB,oBAAqB,SAAQ,KAAK,CACtD,kBAAkB,EAClB,MAAM,CACP;IACC,SAAS,CAAC,QAAQ,CAAC,EAAE,yBAAyB,GAAG,SAAS,CAAC;IAC3D,OAAO,CAAC,kBAAkB,CAA+B;IACzD,OAAO,CAAC,mBAAmB,CAAc;IAEzC,QAAQ,CAAC,YAAY,CACnB,IAAI,EAAE,MAAM,EACZ,iBAAiB,EAAE,iBAAiB,GACnC,IAAI;IAEP,IAAI,IAAI,IAIO,MAAM,CAFpB;IAED,IAAI,IAAI,CAAC,IAAI,EAAE,MAAM,EAEpB;IAED,IAAI,iBAAiB,IAIoB,iBAAiB,CAFzD;IAED,IAAI,iBAAiB,CAAC,iBAAiB,EAAE,iBAAiB,EAEzD;IAED,SAAS,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM;IAOjC,SAAS,CAAC,eAAe,CAAC,SAAS,EAAE,MAAM;IAM3C,SAAS,CAAC,oBAAoB,CAAC,iBAAiB,EAAE,iBAAiB;
|
|
1
|
+
{"version":3,"file":"AbstractInstallModal.d.ts","sourceRoot":"","sources":["../../../../../src/ui/modals/base/AbstractInstallModal.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,iBAAiB,EAEtB,KAAK,kBAAkB,EACvB,KAAK,EACL,KAAK,MAAM,EACZ,MAAM,iBAAiB,CAAC;AAKzB,8BAAsB,oBAAqB,SAAQ,KAAK,CACtD,kBAAkB,EAClB,MAAM,CACP;IACC,SAAS,CAAC,QAAQ,CAAC,EAAE,yBAAyB,GAAG,SAAS,CAAC;IAC3D,OAAO,CAAC,kBAAkB,CAA+B;IACzD,OAAO,CAAC,mBAAmB,CAAc;IAEzC,QAAQ,CAAC,YAAY,CACnB,IAAI,EAAE,MAAM,EACZ,iBAAiB,EAAE,iBAAiB,GACnC,IAAI;IAEP,IAAI,IAAI,IAIO,MAAM,CAFpB;IAED,IAAI,IAAI,CAAC,IAAI,EAAE,MAAM,EAEpB;IAED,IAAI,iBAAiB,IAIoB,iBAAiB,CAFzD;IAED,IAAI,iBAAiB,CAAC,iBAAiB,EAAE,iBAAiB,EAEzD;IAED,SAAS,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM;IAOjC,SAAS,CAAC,eAAe,CAAC,SAAS,EAAE,MAAM;IAM3C,SAAS,CAAC,oBAAoB,CAAC,iBAAiB,EAAE,iBAAiB;IAqDnE,SAAS,CAAC,mBAAmB;CAS9B"}
|
|
@@ -73,10 +73,6 @@ export class AbstractInstallModal extends Modal {
|
|
|
73
73
|
logger(`[UI: InstallModal-nodejs()] ❌ Error generating new QR code: ${error}`);
|
|
74
74
|
}
|
|
75
75
|
}
|
|
76
|
-
else {
|
|
77
|
-
const generateQRCode = yield this.options.generateQRCode(currentConnectionRequest);
|
|
78
|
-
this.renderQRCode(generateQRCode, currentConnectionRequest);
|
|
79
|
-
}
|
|
80
76
|
}), 1000);
|
|
81
77
|
}
|
|
82
78
|
stopExpirationCheck() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AbstractInstallModal.js","sourceRoot":"","sources":["../../../../../src/ui/modals/base/AbstractInstallModal.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAEL,YAAY,EAEZ,KAAK,GAEN,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAElE,MAAM,MAAM,GAAG,YAAY,CAAC,iBAAiB,CAAC,CAAC;AAE/C,MAAM,OAAgB,oBAAqB,SAAQ,KAGlD;IAHD;;QAKU,uBAAkB,GAA0B,IAAI,CAAC;QACjD,wBAAmB,GAAW,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"AbstractInstallModal.js","sourceRoot":"","sources":["../../../../../src/ui/modals/base/AbstractInstallModal.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import debug from 'debug';
|
|
2
|
-
import { SessionData, Transport, TransportRequest, TransportResponse, MultichainApiClient } from '@metamask/multichain-api-client';
|
|
2
|
+
import { SessionData, Transport, SessionProperties, TransportRequest, TransportResponse, MultichainApiClient } from '@metamask/multichain-api-client';
|
|
3
3
|
export { SessionData } from '@metamask/multichain-api-client';
|
|
4
4
|
import { CaipAccountId, Json } from '@metamask/utils';
|
|
5
5
|
import { SessionRequest, Session } from '@metamask/mobile-wallet-protocol-core';
|
|
@@ -296,17 +296,26 @@ type FactoryModals = {
|
|
|
296
296
|
OTPCodeModal: new (options: OTPCodeWidgetProps) => AbstractOTPCodeModal;
|
|
297
297
|
};
|
|
298
298
|
|
|
299
|
-
|
|
299
|
+
/**
|
|
300
|
+
* Base ModalFactory class that accepts a preload function.
|
|
301
|
+
* Platform-specific implementations should extend this class.
|
|
302
|
+
*/
|
|
303
|
+
declare abstract class BaseModalFactory<T extends FactoryModals = FactoryModals> {
|
|
300
304
|
protected readonly options: T;
|
|
301
305
|
modal: Modal<any>;
|
|
302
306
|
private readonly platform;
|
|
303
307
|
private successCallback;
|
|
308
|
+
private displayUriCallback?;
|
|
304
309
|
/**
|
|
305
310
|
* Creates a new modal factory instance.
|
|
306
311
|
*
|
|
307
312
|
* @param options - The modals configuration object
|
|
308
313
|
*/
|
|
309
314
|
constructor(options: T);
|
|
315
|
+
/**
|
|
316
|
+
* Platform-specific preload function to be implemented by subclasses.
|
|
317
|
+
*/
|
|
318
|
+
protected abstract preload(): Promise<void>;
|
|
310
319
|
private validateModals;
|
|
311
320
|
unload(error?: Error): Promise<void>;
|
|
312
321
|
/**
|
|
@@ -330,7 +339,7 @@ declare class ModalFactory<T extends FactoryModals = FactoryModals> {
|
|
|
330
339
|
createConnectionUniversalLink(connectionRequest?: ConnectionRequest): string;
|
|
331
340
|
private onCloseModal;
|
|
332
341
|
private onStartDesktopOnboarding;
|
|
333
|
-
renderInstallModal(showInstallModal: boolean, createConnectionRequest: () => Promise<ConnectionRequest>, successCallback: (error?: Error) => Promise<void
|
|
342
|
+
renderInstallModal(showInstallModal: boolean, createConnectionRequest: () => Promise<ConnectionRequest>, successCallback: (error?: Error) => Promise<void>, onDisplayUri?: (uri: string) => void): Promise<void>;
|
|
334
343
|
renderOTPCodeModal(createOTPCode: () => Promise<OTPCode>, successCallback: (error?: Error) => Promise<void>, updateOTPCode: (otpCode: OTPCode, modal: AbstractOTPCodeModal) => void): Promise<void>;
|
|
335
344
|
}
|
|
336
345
|
|
|
@@ -399,7 +408,7 @@ type MultichainOptions = {
|
|
|
399
408
|
storage: StoreClient;
|
|
400
409
|
/** UI configuration options */
|
|
401
410
|
ui: {
|
|
402
|
-
factory:
|
|
411
|
+
factory: BaseModalFactory;
|
|
403
412
|
headless?: boolean;
|
|
404
413
|
preferExtension?: boolean;
|
|
405
414
|
showInstallModal?: boolean;
|
|
@@ -436,6 +445,7 @@ type ExtendedTransport = Omit<Transport, 'connect'> & {
|
|
|
436
445
|
connect: (props?: {
|
|
437
446
|
scopes: Scope[];
|
|
438
447
|
caipAccountIds: CaipAccountId[];
|
|
448
|
+
sessionProperties?: SessionProperties;
|
|
439
449
|
forceRequest?: boolean;
|
|
440
450
|
}) => Promise<void>;
|
|
441
451
|
sendEip1193Message: <TRequest extends TransportRequest, TResponse extends TransportResponse>(request: TRequest, options?: {
|
|
@@ -450,7 +460,7 @@ declare const SDK_HANDLED_METHODS: Set<string>;
|
|
|
450
460
|
|
|
451
461
|
declare function getInfuraRpcUrls(infuraAPIKey: string): RpcUrlsMap;
|
|
452
462
|
|
|
453
|
-
type
|
|
463
|
+
type ConnectionStatus = 'pending' | 'loaded' | 'disconnected' | 'connected' | 'connecting';
|
|
454
464
|
declare enum TransportType {
|
|
455
465
|
Browser = "browser",
|
|
456
466
|
MWP = "mwp",
|
|
@@ -465,7 +475,7 @@ declare enum TransportType {
|
|
|
465
475
|
declare abstract class MultichainCore extends EventEmitter<SDKEvents> {
|
|
466
476
|
protected readonly options: MultichainOptions;
|
|
467
477
|
abstract storage: StoreClient;
|
|
468
|
-
abstract
|
|
478
|
+
abstract status: ConnectionStatus;
|
|
469
479
|
abstract provider: MultichainApiClient<RPCAPI>;
|
|
470
480
|
abstract transport: ExtendedTransport;
|
|
471
481
|
abstract transportType: TransportType;
|
|
@@ -474,7 +484,7 @@ declare abstract class MultichainCore extends EventEmitter<SDKEvents> {
|
|
|
474
484
|
*
|
|
475
485
|
* @returns Promise that resolves to the session data
|
|
476
486
|
*/
|
|
477
|
-
abstract connect(scopes: Scope[], caipAccountIds: CaipAccountId[], forceRequest?: boolean): Promise<void>;
|
|
487
|
+
abstract connect(scopes: Scope[], caipAccountIds: CaipAccountId[], sessionProperties?: SessionProperties, forceRequest?: boolean): Promise<void>;
|
|
478
488
|
/**
|
|
479
489
|
* Disconnects from the multichain provider.
|
|
480
490
|
*
|
|
@@ -578,6 +588,13 @@ type InstallWidgetProps = Components.MmInstallModal & {
|
|
|
578
588
|
startDesktopOnboarding: () => void;
|
|
579
589
|
createConnectionRequest: () => Promise<ConnectionRequest>;
|
|
580
590
|
generateQRCode: (connectionRequest: ConnectionRequest) => Promise<QRLink>;
|
|
591
|
+
/**
|
|
592
|
+
* Callback invoked when a QR code link is generated or regenerated.
|
|
593
|
+
* This allows consumers to display their own custom QR code UI.
|
|
594
|
+
*
|
|
595
|
+
* @param uri - The deeplink URI to be displayed as a QR code
|
|
596
|
+
*/
|
|
597
|
+
onDisplayUri?: (uri: QRLink) => void;
|
|
581
598
|
};
|
|
582
599
|
type OTPCodeWidgetProps = Components.MmOtpModal & {
|
|
583
600
|
parentElement?: Element;
|
|
@@ -632,6 +649,6 @@ declare function getWalletActionAnalyticsProperties(options: MultichainOptions,
|
|
|
632
649
|
*/
|
|
633
650
|
declare function getVersion(): string;
|
|
634
651
|
|
|
635
|
-
declare const
|
|
652
|
+
declare const createMultichainClient: CreateMultichainFN;
|
|
636
653
|
|
|
637
|
-
export { type ConnectionRequest, type CreateMultichainFN, type DappSettings, type DataType, type DomainErrorCodes, type Enumerate, type ErrorCodeRange, type ErrorCodes, EventEmitter, type EventTypes, type ExtendedTransport, type InstallWidgetProps, type InvokeMethodOptions, type LoggerNameSpaces, Modal, type ModalFactoryConnectOptions, type ModalFactoryOptions, MultichainCore, type MultichainOptions, type NotificationCallback, type OTPCode, type OTPCodeWidgetProps, PlatformType, type QRLink, type RPCAPI, type RPCErrorCodes, RPCHttpErr, RPCInvokeMethodErr, RPCReadonlyRequestErr, RPCReadonlyResponseErr, type RPCResponse, RPC_HANDLED_METHODS, type RpcMethod, type RpcUrlsMap, type SDKEvents,
|
|
654
|
+
export { type ConnectionRequest, type ConnectionStatus, type CreateMultichainFN, type DappSettings, type DataType, type DomainErrorCodes, type Enumerate, type ErrorCodeRange, type ErrorCodes, EventEmitter, type EventTypes, type ExtendedTransport, type InstallWidgetProps, type InvokeMethodOptions, type LoggerNameSpaces, Modal, type ModalFactoryConnectOptions, type ModalFactoryOptions, MultichainCore, type MultichainOptions, type NotificationCallback, type OTPCode, type OTPCodeWidgetProps, PlatformType, type QRLink, type RPCAPI, type RPCErrorCodes, RPCHttpErr, RPCInvokeMethodErr, RPCReadonlyRequestErr, RPCReadonlyResponseErr, type RPCResponse, RPC_HANDLED_METHODS, type RpcMethod, type RpcUrlsMap, type SDKEvents, SDK_HANDLED_METHODS, type Scope, type StorageErrorCodes, StoreAdapter, StoreClient, type StoreOptions, TransportType, createLogger, createMultichainClient, enableDebug, getInfuraRpcUrls, getPlatformType, getTransportType, getVersion, getWalletActionAnalyticsProperties, hasExtension, infuraRpcUrls, isEnabled, isMetamaskExtensionInstalled, isRejectionError, isSecure };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@metamask/connect-multichain",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "Multichain package for MetaMask Connect",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"MetaMask",
|
|
@@ -63,7 +63,8 @@
|
|
|
63
63
|
"test:ci": "yarn pretest:ci && vitest run --coverage --coverage.reporter=text --silent",
|
|
64
64
|
"test:unit": "vitest run",
|
|
65
65
|
"test:verbose": "vitest run --reporter=verbose",
|
|
66
|
-
"test:watch": "vitest watch"
|
|
66
|
+
"test:watch": "vitest watch",
|
|
67
|
+
"allow-scripts": ""
|
|
67
68
|
},
|
|
68
69
|
"dependencies": {
|
|
69
70
|
"@metamask/analytics": "^0.2.0",
|
|
@@ -72,6 +73,7 @@
|
|
|
72
73
|
"@metamask/multichain-api-client": "^0.10.1",
|
|
73
74
|
"@metamask/multichain-ui": "^0.3.0",
|
|
74
75
|
"@metamask/onboarding": "^1.0.1",
|
|
76
|
+
"@metamask/rpc-errors": "^7.0.3",
|
|
75
77
|
"@metamask/utils": "^11.8.1",
|
|
76
78
|
"@paulmillr/qr": "^0.2.1",
|
|
77
79
|
"bowser": "^2.11.0",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"preload.native.d.ts","sourceRoot":"","sources":["../../../src/ui/preload.native.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAsB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAE7C"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"preload.native.js","sourceRoot":"","sources":["../../../src/ui/preload.native.ts"],"names":[],"mappings":";;;;;;;;;AAAA;;GAEG;AACH,MAAM,UAAgB,OAAO;;QAC3B,6DAA6D;IAC/D,CAAC;CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"preload.web.d.ts","sourceRoot":"","sources":["../../../src/ui/preload.web.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAsB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAY7C"}
|
|
@@ -1,27 +0,0 @@
|
|
|
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
|
-
/**
|
|
11
|
-
* Web-specific preload that loads Stencil custom elements
|
|
12
|
-
*/
|
|
13
|
-
export function preload() {
|
|
14
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
15
|
-
if (typeof document === 'undefined') {
|
|
16
|
-
return;
|
|
17
|
-
}
|
|
18
|
-
try {
|
|
19
|
-
const { defineCustomElements } = yield import('@metamask/multichain-ui/loader');
|
|
20
|
-
yield defineCustomElements();
|
|
21
|
-
}
|
|
22
|
-
catch (error) {
|
|
23
|
-
console.error('Failed to load customElements:', error);
|
|
24
|
-
}
|
|
25
|
-
});
|
|
26
|
-
}
|
|
27
|
-
//# sourceMappingURL=preload.web.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"preload.web.js","sourceRoot":"","sources":["../../../src/ui/preload.web.ts"],"names":[],"mappings":";;;;;;;;;AAAA;;GAEG;AACH,MAAM,UAAgB,OAAO;;QAC3B,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE,CAAC;YACpC,OAAO;QACT,CAAC;QACD,IAAI,CAAC;YACH,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,MAAM,CAC3C,gCAAgC,CACjC,CAAC;YACF,MAAM,oBAAoB,EAAE,CAAC;QAC/B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;CAAA"}
|