@asseteragmbh/wallet-connector 0.2.0 → 0.2.2
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/README.md +104 -6
- package/dist/{chunk-ILCYZXH2.js → chunk-3JLQDY5Z.js} +5 -4
- package/dist/chunk-3JLQDY5Z.js.map +1 -0
- package/dist/{chunk-PD2FAZ7O.js → chunk-PXHO7TLT.js} +36 -5
- package/dist/chunk-PXHO7TLT.js.map +1 -0
- package/dist/{chunk-SU2ZKBZD.js → chunk-ZEOGKINA.js} +55 -4
- package/dist/chunk-ZEOGKINA.js.map +1 -0
- package/dist/index.cjs +213 -16
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +87 -5
- package/dist/index.d.ts +87 -5
- package/dist/index.js +124 -17
- package/dist/index.js.map +1 -1
- package/dist/protocol.cjs +58 -1
- package/dist/protocol.cjs.map +1 -1
- package/dist/protocol.d.cts +101 -7
- package/dist/protocol.d.ts +101 -7
- package/dist/protocol.js +1 -1
- package/dist/{provider-BEIsX3q_.d.ts → provider-BroYZ3LY.d.cts} +25 -3
- package/dist/{provider-BEIsX3q_.d.cts → provider-LBsymT4P.d.ts} +25 -3
- package/dist/rainbowkit.cjs +78 -5
- package/dist/rainbowkit.cjs.map +1 -1
- package/dist/rainbowkit.d.cts +4 -1
- package/dist/rainbowkit.d.ts +4 -1
- package/dist/rainbowkit.js +7 -4
- package/dist/rainbowkit.js.map +1 -1
- package/dist/wagmi.cjs +74 -4
- package/dist/wagmi.cjs.map +1 -1
- package/dist/wagmi.d.cts +5 -2
- package/dist/wagmi.d.ts +5 -2
- package/dist/wagmi.js +3 -3
- package/package.json +8 -8
- package/dist/chunk-ILCYZXH2.js.map +0 -1
- package/dist/chunk-PD2FAZ7O.js.map +0 -1
- package/dist/chunk-SU2ZKBZD.js.map +0 -1
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
|
-
|
|
2
|
-
export {
|
|
1
|
+
import { SignInHint, WalletAccountName, WalletSecurityStatus } from './protocol.js';
|
|
2
|
+
export { AccountsMessage, CONNECT_PATH, DisconnectMessage, EventMessage, MANAGE_PATH, MESSAGE_PREFIX, ONBOARD_PATH, OnboardCancelledMessage, OnboardedMessage, PROTOCOL_VERSION, PartnerToWalletMessage, ReadyMessage, RequestMessage, ResponseMessage, RpcError, RpcErrorCode, SIGN_IN_HINTS, SUPPORTED_METHODS, SecurityMessage, SupportedMethod, WalletProtection, WalletToPartnerMessage, connectUrl, isAccountsMessage, isCaip2EvmChain, isDisconnectMessage, isEventMessage, isOnboardCancelledMessage, isOnboardedMessage, isReadyMessage, isRequestMessage, isResponseMessage, isSecurityMessage, isSignInHint, isSupportedMethod, manageUrl, onboardUrl } from './protocol.js';
|
|
3
|
+
export { A as AsseteraWalletProvider, a as AsseteraWalletProviderOptions, P as ProviderEvent, b as ProviderListener, c as ProviderRpcError, R as RequestArguments, d as createAsseteraWalletProvider } from './provider-LBsymT4P.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Onboarding opener for the Assetera Wallet: the partner side of the `/onboard` wizard (AO-1274).
|
|
7
|
+
*
|
|
8
|
+
* A tied-agent bank site shows a "Create an Assetera wallet" button. On the click, this module opens the wallet
|
|
9
|
+
* pop-up in onboarding mode synchronously (so the browser treats it as part of the click) and waits for the
|
|
10
|
+
* wizard to post the new wallet address back. While the pop-up is open the partner page shows a dimming
|
|
11
|
+
* overlay; the overlay is plain DOM (no React, no CSS files) so any partner can drop this in.
|
|
12
|
+
*
|
|
13
|
+
* The wallet's `/onboard` page is the pop-up side and speaks the same protocol in `./protocol`, but it uses the
|
|
14
|
+
* message types and the `ONBOARD_PATH` from there, so the two sides cannot drift apart.
|
|
15
|
+
*/
|
|
3
16
|
|
|
4
17
|
/** Why {@link openAsseteraOnboarding} rejected. */
|
|
5
18
|
type OnboardingErrorCode = "popup_blocked" | "closed" | "cancelled" | "refused" | "failed" | "invalid_options";
|
|
@@ -27,6 +40,11 @@ interface OnboardingResult {
|
|
|
27
40
|
signMessage: (message: string) => Promise<`0x${string}`>;
|
|
28
41
|
/** Close the pop-up and remove the overlay. Safe to call more than once. */
|
|
29
42
|
close: () => void;
|
|
43
|
+
/**
|
|
44
|
+
* The last account names the pop-up sent after it reported the address, or `undefined` when none arrived yet.
|
|
45
|
+
* The returned list is a copy.
|
|
46
|
+
*/
|
|
47
|
+
lastAccounts: () => WalletAccountName[] | undefined;
|
|
30
48
|
}
|
|
31
49
|
/** Text of the dimming overlay, all optional. Any key left out keeps its English default. */
|
|
32
50
|
interface OverlayLabels {
|
|
@@ -38,7 +56,7 @@ interface OverlayLabels {
|
|
|
38
56
|
}
|
|
39
57
|
/** Options for {@link openAsseteraOnboarding}. */
|
|
40
58
|
interface OnboardingOptions {
|
|
41
|
-
/** Base URL of the wallet origin, e.g. `https://wallet.
|
|
59
|
+
/** Base URL of the wallet origin, e.g. `https://wallet.wallet-staging.assetera.com`. */
|
|
42
60
|
walletUrl: string;
|
|
43
61
|
/** CAIP-2 chain id the new wallet should be created on, e.g. `eip155:80002`. An invalid value rejects with `invalid_options`. */
|
|
44
62
|
chain: string;
|
|
@@ -52,6 +70,10 @@ interface OnboardingOptions {
|
|
|
52
70
|
partnerName?: string;
|
|
53
71
|
/** Ask for one more wallet even when the client already has one ("Create another Assetera Wallet"). */
|
|
54
72
|
addWallet?: boolean;
|
|
73
|
+
/** Sign-in hint passed as `signIn`, e.g. `"assetera-marketplace"`. Only a hint; the wallet may ignore it. */
|
|
74
|
+
signIn?: SignInHint;
|
|
75
|
+
/** Called for every `accounts` message the pop-up sends after it reported the address. */
|
|
76
|
+
onAccounts?: (accounts: WalletAccountName[]) => void;
|
|
55
77
|
/** Injectable `window` for tests; defaults to `globalThis.window`. */
|
|
56
78
|
window?: Window;
|
|
57
79
|
}
|
|
@@ -66,8 +88,68 @@ interface OnboardingOptions {
|
|
|
66
88
|
* The promise rejects with `OnboardingError` and one of these codes: `invalid_options` (bad chain or wallet
|
|
67
89
|
* URL), `popup_blocked`, `closed` (the pop-up was closed first), `cancelled` (the user cancelled in the wizard
|
|
68
90
|
* or in the overlay), `refused` (the wallet refused the onboarding) or `failed` (anything else in the wallet).
|
|
69
|
-
* After it resolved, the overlay stays until `close()`; closing the pop-up by hand also removes it.
|
|
91
|
+
* After it resolved, the overlay stays until `close()`; closing the pop-up by hand also removes it. After it
|
|
92
|
+
* reported the address the pop-up may send `accounts` messages; `onAccounts` receives each list and
|
|
93
|
+
* `lastAccounts()` returns the last one.
|
|
70
94
|
*/
|
|
71
95
|
declare function openAsseteraOnboarding(options: OnboardingOptions): Promise<OnboardingResult>;
|
|
72
96
|
|
|
73
|
-
|
|
97
|
+
/**
|
|
98
|
+
* Manage-wallet opener for the Assetera Wallet: the partner side of the `/manage` pop-up (AO-1436).
|
|
99
|
+
*
|
|
100
|
+
* A partner page shows a "Manage wallet" button. On the click this module opens the wallet pop-up on the manage
|
|
101
|
+
* route synchronously (so the browser treats it as part of the click). The client sees the wallet accounts and
|
|
102
|
+
* the wallet security (passkeys, authenticator app, recovery codes) and can change them. The pop-up never
|
|
103
|
+
* answers `request` messages; it posts `security` and `accounts` messages while it is open.
|
|
104
|
+
*/
|
|
105
|
+
|
|
106
|
+
/** Why {@link openAsseteraWalletManager} threw. */
|
|
107
|
+
type ManagerErrorCode = "popup_blocked" | "invalid_options";
|
|
108
|
+
/** Error thrown by {@link openAsseteraWalletManager}. `code` is stable and safe to branch on. */
|
|
109
|
+
declare class ManagerError extends Error {
|
|
110
|
+
readonly code: ManagerErrorCode;
|
|
111
|
+
constructor(code: ManagerErrorCode, message: string);
|
|
112
|
+
}
|
|
113
|
+
/** Options for {@link openAsseteraWalletManager}. */
|
|
114
|
+
interface WalletManagerOptions {
|
|
115
|
+
/** Base URL of the wallet origin, e.g. `https://wallet.wallet-staging.assetera.com`. */
|
|
116
|
+
walletUrl: string;
|
|
117
|
+
/** Sign-in hint passed as `signIn`, e.g. `"assetera-marketplace"`. Only a hint; the wallet may ignore it. */
|
|
118
|
+
signIn?: SignInHint;
|
|
119
|
+
/** Language passed as `lang`, e.g. `"en"` or `"de"`. */
|
|
120
|
+
locale?: string;
|
|
121
|
+
/** `window.open` feature string. Defaults to a centred `"popup,width=440,height=760,left=…,top=…"`. */
|
|
122
|
+
popupFeatures?: string;
|
|
123
|
+
/** Called for every `security` message from the pop-up. */
|
|
124
|
+
onSecurity?: (status: WalletSecurityStatus) => void;
|
|
125
|
+
/** Called for every `accounts` message from the pop-up. */
|
|
126
|
+
onAccounts?: (accounts: WalletAccountName[]) => void;
|
|
127
|
+
/** Injectable `window` for tests; defaults to `globalThis.window`. */
|
|
128
|
+
window?: Window;
|
|
129
|
+
}
|
|
130
|
+
/** The open manage pop-up, controlled by the partner. */
|
|
131
|
+
interface WalletManager {
|
|
132
|
+
/** Close the pop-up and remove the listener and the close timer. Safe to call more than once. */
|
|
133
|
+
close: () => void;
|
|
134
|
+
/** Resolves when the pop-up is closed, by the partner or by the client. */
|
|
135
|
+
closed: Promise<void>;
|
|
136
|
+
/** The last security status the pop-up sent, or `undefined` when none arrived yet. */
|
|
137
|
+
lastSecurity: () => WalletSecurityStatus | undefined;
|
|
138
|
+
/** The last account names the pop-up sent, or `undefined` when none arrived yet. */
|
|
139
|
+
lastAccounts: () => WalletAccountName[] | undefined;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Open the manage-wallet pop-up for the Assetera Wallet and return a handle to it.
|
|
143
|
+
*
|
|
144
|
+
* Call this from a user click (a button handler). `window.open` runs synchronously inside the call, before any
|
|
145
|
+
* `await`, so the browser allows it; when the browser blocks the pop-up this throws `ManagerError` with code
|
|
146
|
+
* `popup_blocked`.
|
|
147
|
+
*
|
|
148
|
+
* The pop-up checks the `origin` query parameter against the wallet's partner list, posts `ready` to
|
|
149
|
+
* `window.opener` and then posts `security` and `accounts` messages. Messages are accepted only when they come
|
|
150
|
+
* from the wallet origin AND from the pop-up that was opened here. The pop-up does not answer `request`
|
|
151
|
+
* messages.
|
|
152
|
+
*/
|
|
153
|
+
declare function openAsseteraWalletManager(options: WalletManagerOptions): WalletManager;
|
|
154
|
+
|
|
155
|
+
export { ManagerError, type ManagerErrorCode, OnboardingError, type OnboardingErrorCode, type OnboardingOptions, type OnboardingResult, type OverlayLabels, SignInHint, WalletAccountName, type WalletManager, type WalletManagerOptions, WalletSecurityStatus, openAsseteraOnboarding, openAsseteraWalletManager };
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,19 @@
|
|
|
1
|
-
export { ProviderRpcError, createAsseteraWalletProvider } from './chunk-
|
|
2
|
-
import { isCaip2EvmChain, onboardUrl, isOnboardedMessage, isOnboardCancelledMessage, isResponseMessage, RpcErrorCode, PROTOCOL_VERSION, MESSAGE_PREFIX } from './chunk-
|
|
3
|
-
export { CONNECT_PATH, MESSAGE_PREFIX, ONBOARD_PATH, PROTOCOL_VERSION, RpcErrorCode, SUPPORTED_METHODS, connectUrl, isCaip2EvmChain, isDisconnectMessage, isEventMessage, isOnboardCancelledMessage, isOnboardedMessage, isReadyMessage, isRequestMessage, isResponseMessage, isSupportedMethod, onboardUrl } from './chunk-
|
|
1
|
+
export { ProviderRpcError, createAsseteraWalletProvider } from './chunk-PXHO7TLT.js';
|
|
2
|
+
import { isCaip2EvmChain, onboardUrl, manageUrl, isOnboardedMessage, isOnboardCancelledMessage, isSecurityMessage, isAccountsMessage, isResponseMessage, RpcErrorCode, PROTOCOL_VERSION, MESSAGE_PREFIX } from './chunk-ZEOGKINA.js';
|
|
3
|
+
export { CONNECT_PATH, MANAGE_PATH, MESSAGE_PREFIX, ONBOARD_PATH, PROTOCOL_VERSION, RpcErrorCode, SIGN_IN_HINTS, SUPPORTED_METHODS, connectUrl, isAccountsMessage, isCaip2EvmChain, isDisconnectMessage, isEventMessage, isOnboardCancelledMessage, isOnboardedMessage, isReadyMessage, isRequestMessage, isResponseMessage, isSecurityMessage, isSignInHint, isSupportedMethod, manageUrl, onboardUrl } from './chunk-ZEOGKINA.js';
|
|
4
|
+
|
|
5
|
+
// src/popup.ts
|
|
6
|
+
var POPUP_WIDTH = 440;
|
|
7
|
+
var POPUP_HEIGHT = 760;
|
|
8
|
+
function defaultPopupFeatures(win) {
|
|
9
|
+
const screenX = Number.isFinite(win.screenX) ? win.screenX : 0;
|
|
10
|
+
const screenY = Number.isFinite(win.screenY) ? win.screenY : 0;
|
|
11
|
+
const outerWidth = Number.isFinite(win.outerWidth) ? win.outerWidth : POPUP_WIDTH;
|
|
12
|
+
const outerHeight = Number.isFinite(win.outerHeight) ? win.outerHeight : POPUP_HEIGHT;
|
|
13
|
+
const left = Math.max(0, Math.round(screenX + (outerWidth - POPUP_WIDTH) / 2));
|
|
14
|
+
const top = Math.max(0, Math.round(screenY + (outerHeight - POPUP_HEIGHT) / 2));
|
|
15
|
+
return `popup,width=${POPUP_WIDTH},height=${POPUP_HEIGHT},left=${left},top=${top}`;
|
|
16
|
+
}
|
|
4
17
|
|
|
5
18
|
// src/onboarding.ts
|
|
6
19
|
var OnboardingError = class extends Error {
|
|
@@ -12,8 +25,6 @@ var OnboardingError = class extends Error {
|
|
|
12
25
|
}
|
|
13
26
|
};
|
|
14
27
|
var POPUP_NAME = "assetera-wallet-onboarding";
|
|
15
|
-
var POPUP_WIDTH = 440;
|
|
16
|
-
var POPUP_HEIGHT = 760;
|
|
17
28
|
var CLOSE_POLL_MS = 500;
|
|
18
29
|
var OVERLAY_Z_INDEX = 2147483e3;
|
|
19
30
|
var DEFAULT_LABELS = {
|
|
@@ -23,15 +34,6 @@ var DEFAULT_LABELS = {
|
|
|
23
34
|
cancel: "Cancel",
|
|
24
35
|
blocked: "Your browser blocked the Assetera Wallet window. Allow pop-ups for this site and try again."
|
|
25
36
|
};
|
|
26
|
-
function defaultPopupFeatures(win) {
|
|
27
|
-
const screenX = Number.isFinite(win.screenX) ? win.screenX : 0;
|
|
28
|
-
const screenY = Number.isFinite(win.screenY) ? win.screenY : 0;
|
|
29
|
-
const outerWidth = Number.isFinite(win.outerWidth) ? win.outerWidth : POPUP_WIDTH;
|
|
30
|
-
const outerHeight = Number.isFinite(win.outerHeight) ? win.outerHeight : POPUP_HEIGHT;
|
|
31
|
-
const left = Math.max(0, Math.round(screenX + (outerWidth - POPUP_WIDTH) / 2));
|
|
32
|
-
const top = Math.max(0, Math.round(screenY + (outerHeight - POPUP_HEIGHT) / 2));
|
|
33
|
-
return `popup,width=${POPUP_WIDTH},height=${POPUP_HEIGHT},left=${left},top=${top}`;
|
|
34
|
-
}
|
|
35
37
|
function resolveLabels(options) {
|
|
36
38
|
const overrides = typeof options.overlay === "object" && options.overlay !== null ? options.overlay : {};
|
|
37
39
|
const partnerName = options.partnerName;
|
|
@@ -54,6 +56,9 @@ function cancelMessage(reason) {
|
|
|
54
56
|
if (reason === "refused") return "The Assetera Wallet refused the onboarding.";
|
|
55
57
|
return "The Assetera Wallet onboarding failed.";
|
|
56
58
|
}
|
|
59
|
+
function copyAccountNames(accounts) {
|
|
60
|
+
return accounts.map((account) => ({ address: account.address, name: account.name }));
|
|
61
|
+
}
|
|
57
62
|
function showOverlay(win, labels, handlers) {
|
|
58
63
|
const doc = win.document;
|
|
59
64
|
const root = doc.createElement("div");
|
|
@@ -154,7 +159,8 @@ function openAsseteraOnboarding(options) {
|
|
|
154
159
|
onboardUrl(options.walletUrl, targetWindow.location.origin, {
|
|
155
160
|
chain: options.chain,
|
|
156
161
|
...options.locale === void 0 ? {} : { locale: options.locale },
|
|
157
|
-
...options.addWallet ? { add: true } : {}
|
|
162
|
+
...options.addWallet ? { add: true } : {},
|
|
163
|
+
...options.signIn === void 0 ? {} : { signIn: options.signIn }
|
|
158
164
|
}),
|
|
159
165
|
POPUP_NAME,
|
|
160
166
|
options.popupFeatures ?? defaultPopupFeatures(targetWindow)
|
|
@@ -221,6 +227,7 @@ function openAsseteraOnboarding(options) {
|
|
|
221
227
|
});
|
|
222
228
|
}
|
|
223
229
|
let address;
|
|
230
|
+
let lastAccountNameList;
|
|
224
231
|
function onMessage(event) {
|
|
225
232
|
if (event.origin !== walletOrigin) return;
|
|
226
233
|
if (event.source !== activePopup) return;
|
|
@@ -234,7 +241,8 @@ function openAsseteraOnboarding(options) {
|
|
|
234
241
|
chain: data.chain,
|
|
235
242
|
created: data.created ?? true,
|
|
236
243
|
signMessage,
|
|
237
|
-
close
|
|
244
|
+
close,
|
|
245
|
+
lastAccounts: () => lastAccountNameList === void 0 ? void 0 : copyAccountNames(lastAccountNameList)
|
|
238
246
|
});
|
|
239
247
|
return;
|
|
240
248
|
}
|
|
@@ -243,6 +251,11 @@ function openAsseteraOnboarding(options) {
|
|
|
243
251
|
}
|
|
244
252
|
return;
|
|
245
253
|
}
|
|
254
|
+
if (isAccountsMessage(data)) {
|
|
255
|
+
lastAccountNameList = copyAccountNames(data.data);
|
|
256
|
+
options.onAccounts?.(copyAccountNames(lastAccountNameList));
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
246
259
|
if (isResponseMessage(data)) {
|
|
247
260
|
const entry = pending.get(data.id);
|
|
248
261
|
if (!entry) return;
|
|
@@ -281,6 +294,100 @@ function openAsseteraOnboarding(options) {
|
|
|
281
294
|
});
|
|
282
295
|
}
|
|
283
296
|
|
|
284
|
-
|
|
297
|
+
// src/manage.ts
|
|
298
|
+
var ManagerError = class extends Error {
|
|
299
|
+
code;
|
|
300
|
+
constructor(code, message) {
|
|
301
|
+
super(message);
|
|
302
|
+
this.name = "ManagerError";
|
|
303
|
+
this.code = code;
|
|
304
|
+
}
|
|
305
|
+
};
|
|
306
|
+
var POPUP_NAME2 = "assetera-wallet-manage";
|
|
307
|
+
var CLOSE_POLL_MS2 = 500;
|
|
308
|
+
function openAsseteraWalletManager(options) {
|
|
309
|
+
const requestedWindow = options.window ?? (typeof window === "undefined" ? void 0 : window);
|
|
310
|
+
if (!requestedWindow) {
|
|
311
|
+
throw new ManagerError("invalid_options", "The Assetera Wallet manager can only run in a browser.");
|
|
312
|
+
}
|
|
313
|
+
const targetWindow = requestedWindow;
|
|
314
|
+
let walletOrigin;
|
|
315
|
+
try {
|
|
316
|
+
walletOrigin = new URL(options.walletUrl).origin;
|
|
317
|
+
} catch {
|
|
318
|
+
throw new ManagerError("invalid_options", `"${options.walletUrl}" is not a valid wallet URL.`);
|
|
319
|
+
}
|
|
320
|
+
const popup = targetWindow.open(
|
|
321
|
+
manageUrl(options.walletUrl, targetWindow.location.origin, {
|
|
322
|
+
...options.locale === void 0 ? {} : { locale: options.locale },
|
|
323
|
+
...options.signIn === void 0 ? {} : { signIn: options.signIn }
|
|
324
|
+
}),
|
|
325
|
+
POPUP_NAME2,
|
|
326
|
+
options.popupFeatures ?? defaultPopupFeatures(targetWindow)
|
|
327
|
+
);
|
|
328
|
+
if (!popup) {
|
|
329
|
+
throw new ManagerError(
|
|
330
|
+
"popup_blocked",
|
|
331
|
+
"Your browser blocked the Assetera Wallet window. Allow pop-ups for this site and try again."
|
|
332
|
+
);
|
|
333
|
+
}
|
|
334
|
+
const activePopup = popup;
|
|
335
|
+
let finished = false;
|
|
336
|
+
let lastSecurity;
|
|
337
|
+
let lastAccounts;
|
|
338
|
+
let closeTimer = null;
|
|
339
|
+
let resolveClosed;
|
|
340
|
+
const closed = new Promise((resolve) => {
|
|
341
|
+
resolveClosed = resolve;
|
|
342
|
+
});
|
|
343
|
+
function cleanup() {
|
|
344
|
+
if (finished) return;
|
|
345
|
+
finished = true;
|
|
346
|
+
targetWindow.removeEventListener("message", onMessage);
|
|
347
|
+
if (closeTimer !== null) {
|
|
348
|
+
clearInterval(closeTimer);
|
|
349
|
+
closeTimer = null;
|
|
350
|
+
}
|
|
351
|
+
resolveClosed();
|
|
352
|
+
}
|
|
353
|
+
function close() {
|
|
354
|
+
cleanup();
|
|
355
|
+
if (!activePopup.closed) activePopup.close();
|
|
356
|
+
}
|
|
357
|
+
function copyAccountNames2(accounts) {
|
|
358
|
+
return accounts.map((account) => ({ address: account.address, name: account.name }));
|
|
359
|
+
}
|
|
360
|
+
function onMessage(event) {
|
|
361
|
+
if (event.origin !== walletOrigin) return;
|
|
362
|
+
if (event.source !== activePopup) return;
|
|
363
|
+
const data = event.data;
|
|
364
|
+
if (isSecurityMessage(data)) {
|
|
365
|
+
const status = {
|
|
366
|
+
protection: data.data.protection,
|
|
367
|
+
passkeys: data.data.passkeys,
|
|
368
|
+
authenticatorApps: data.data.authenticatorApps
|
|
369
|
+
};
|
|
370
|
+
lastSecurity = status;
|
|
371
|
+
options.onSecurity?.(status);
|
|
372
|
+
return;
|
|
373
|
+
}
|
|
374
|
+
if (isAccountsMessage(data)) {
|
|
375
|
+
lastAccounts = copyAccountNames2(data.data);
|
|
376
|
+
options.onAccounts?.(copyAccountNames2(lastAccounts));
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
targetWindow.addEventListener("message", onMessage);
|
|
380
|
+
closeTimer = setInterval(() => {
|
|
381
|
+
if (activePopup.closed) cleanup();
|
|
382
|
+
}, CLOSE_POLL_MS2);
|
|
383
|
+
return {
|
|
384
|
+
close,
|
|
385
|
+
closed,
|
|
386
|
+
lastSecurity: () => lastSecurity,
|
|
387
|
+
lastAccounts: () => lastAccounts === void 0 ? void 0 : copyAccountNames2(lastAccounts)
|
|
388
|
+
};
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
export { ManagerError, OnboardingError, openAsseteraOnboarding, openAsseteraWalletManager };
|
|
285
392
|
//# sourceMappingURL=index.js.map
|
|
286
393
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/onboarding.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Onboarding opener for the Assetera Wallet: the partner side of the `/onboard` wizard (AO-1274).\n *\n * A tied-agent bank site shows a \"Create an Assetera wallet\" button. On the click, this module opens the wallet\n * pop-up in onboarding mode synchronously (so the browser treats it as part of the click) and waits for the\n * wizard to post the new wallet address back. While the pop-up is open the partner page shows a dimming\n * overlay; the overlay is plain DOM (no React, no CSS files) so any partner can drop this in.\n *\n * The wallet's `/onboard` page is the pop-up side and speaks the same protocol in `./protocol`, but it uses the\n * message types and the `ONBOARD_PATH` from there, so the two sides cannot drift apart.\n */\nimport {\n MESSAGE_PREFIX,\n PROTOCOL_VERSION,\n RpcErrorCode,\n isCaip2EvmChain,\n isOnboardCancelledMessage,\n isOnboardedMessage,\n isResponseMessage,\n onboardUrl,\n type OnboardCancelledMessage,\n type RequestMessage,\n} from \"./protocol\";\n\n/** Why {@link openAsseteraOnboarding} rejected. */\nexport type OnboardingErrorCode =\n \"popup_blocked\" | \"closed\" | \"cancelled\" | \"refused\" | \"failed\" | \"invalid_options\";\n\n/** Error thrown (well, rejected) by {@link openAsseteraOnboarding}. `code` is stable and safe to branch on. */\nexport class OnboardingError extends Error {\n readonly code: OnboardingErrorCode;\n\n constructor(code: OnboardingErrorCode, message: string) {\n super(message);\n this.name = \"OnboardingError\";\n this.code = code;\n }\n}\n\n/**\n * The client's Assetera Wallet, with the pop-up still open.\n *\n * The wallet is NOT registered with any compliance service. A regulated partner registers it itself, like any\n * other wallet: fetch a challenge for `address`, pass it to `signMessage`, send the signature to its compliance\n * service, then call `close()`. Always call `close()`: it closes the pop-up and removes the overlay.\n */\nexport interface OnboardingResult {\n address: `0x${string}`;\n chain: string;\n /** `true` when the wallet was created in this run, `false` when the client's existing wallet was returned. */\n created: boolean;\n /**\n * Ask the client to sign `message` (EIP-191 `personal_sign`) with this wallet in the open pop-up. Rejects with\n * `OnboardingError(\"cancelled\")` when the client declines, `\"closed\"` when the pop-up is gone, else `\"failed\"`.\n */\n signMessage: (message: string) => Promise<`0x${string}`>;\n /** Close the pop-up and remove the overlay. Safe to call more than once. */\n close: () => void;\n}\n\n/** Text of the dimming overlay, all optional. Any key left out keeps its English default. */\nexport interface OverlayLabels {\n title?: string;\n body?: string;\n focus?: string;\n cancel?: string;\n blocked?: string;\n}\n\n/** Options for {@link openAsseteraOnboarding}. */\nexport interface OnboardingOptions {\n /** Base URL of the wallet origin, e.g. `https://wallet.playground.assetera.com`. */\n walletUrl: string;\n /** CAIP-2 chain id the new wallet should be created on, e.g. `eip155:80002`. An invalid value rejects with `invalid_options`. */\n chain: string;\n /** Wizard language passed as `lang`, e.g. `\"en\"` or `\"de\"`. */\n locale?: string;\n /** `window.open` feature string. Defaults to a centred `\"popup,width=440,height=760,left=…,top=…\"`. */\n popupFeatures?: string;\n /** `true` (default) shows the dimming overlay, `false` hides it, an object overrides its text. */\n overlay?: boolean | OverlayLabels;\n /** Only used in the overlay text, e.g. `\"Musterbank\"`. */\n partnerName?: string;\n /** Ask for one more wallet even when the client already has one (\"Create another Assetera Wallet\"). */\n addWallet?: boolean;\n /** Injectable `window` for tests; defaults to `globalThis.window`. */\n window?: Window;\n}\n\nconst POPUP_NAME = \"assetera-wallet-onboarding\";\nconst POPUP_WIDTH = 440;\nconst POPUP_HEIGHT = 760;\nconst CLOSE_POLL_MS = 500;\nconst OVERLAY_Z_INDEX = 2147483000;\n\nconst DEFAULT_LABELS: Required<OverlayLabels> = {\n title: \"Continue in the Assetera Wallet window\",\n body: \"A secure Assetera Wallet window is open. Follow the steps there. This page continues by itself when you are done.\",\n focus: \"Show the wallet window\",\n cancel: \"Cancel\",\n blocked: \"Your browser blocked the Assetera Wallet window. Allow pop-ups for this site and try again.\",\n};\n\ninterface OverlayHandlers {\n onFocus: () => void;\n onCancel: () => void;\n}\n\nfunction defaultPopupFeatures(win: Window): string {\n const screenX = Number.isFinite(win.screenX) ? win.screenX : 0;\n const screenY = Number.isFinite(win.screenY) ? win.screenY : 0;\n const outerWidth = Number.isFinite(win.outerWidth) ? win.outerWidth : POPUP_WIDTH;\n const outerHeight = Number.isFinite(win.outerHeight) ? win.outerHeight : POPUP_HEIGHT;\n const left = Math.max(0, Math.round(screenX + (outerWidth - POPUP_WIDTH) / 2));\n const top = Math.max(0, Math.round(screenY + (outerHeight - POPUP_HEIGHT) / 2));\n return `popup,width=${POPUP_WIDTH},height=${POPUP_HEIGHT},left=${left},top=${top}`;\n}\n\nfunction resolveLabels(options: OnboardingOptions): Required<OverlayLabels> {\n const overrides: OverlayLabels =\n typeof options.overlay === \"object\" && options.overlay !== null ? options.overlay : {};\n const partnerName = options.partnerName;\n const defaultBody = partnerName\n ? `A secure Assetera Wallet window is open for ${partnerName}. Follow the steps there. This page continues by itself when you are done.`\n : DEFAULT_LABELS.body;\n return {\n title: overrides.title ?? DEFAULT_LABELS.title,\n body: overrides.body ?? defaultBody,\n focus: overrides.focus ?? DEFAULT_LABELS.focus,\n cancel: overrides.cancel ?? DEFAULT_LABELS.cancel,\n blocked: overrides.blocked ?? DEFAULT_LABELS.blocked,\n };\n}\n\nfunction cancelCode(reason: OnboardCancelledMessage[\"reason\"]): OnboardingErrorCode {\n if (reason === \"user\") return \"cancelled\";\n if (reason === \"refused\") return \"refused\";\n return \"failed\";\n}\n\nfunction cancelMessage(reason: OnboardCancelledMessage[\"reason\"]): string {\n if (reason === \"user\") return \"The user cancelled the Assetera Wallet onboarding.\";\n if (reason === \"refused\") return \"The Assetera Wallet refused the onboarding.\";\n return \"The Assetera Wallet onboarding failed.\";\n}\n\n/**\n * Build the dimming overlay. Text is inserted with `textContent` only and every style is inline, so the\n * overlay cannot pick up partner CSS and cannot be scripted through an injected string.\n */\nfunction showOverlay(win: Window, labels: Required<OverlayLabels>, handlers: OverlayHandlers): HTMLElement {\n const doc = win.document;\n const root = doc.createElement(\"div\");\n root.setAttribute(\"role\", \"dialog\");\n root.setAttribute(\"aria-modal\", \"true\");\n root.setAttribute(\"data-assetera-onboarding-overlay\", \"\");\n root.style.cssText = [\n \"position: fixed\",\n \"inset: 0\",\n \"display: flex\",\n \"align-items: center\",\n \"justify-content: center\",\n \"padding: 24px\",\n \"box-sizing: border-box\",\n \"background: rgba(15,20,30,0.6)\",\n `z-index: ${OVERLAY_Z_INDEX}`,\n \"font-family: system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif\",\n ].join(\"; \");\n\n const card = doc.createElement(\"div\");\n card.style.cssText = [\n \"box-sizing: border-box\",\n \"width: 100%\",\n \"max-width: 420px\",\n \"border-radius: 16px\",\n \"padding: 24px\",\n \"background: #ffffff\",\n \"color: #101828\",\n \"box-shadow: 0 20px 50px rgba(0, 0, 0, 0.35)\",\n ].join(\"; \");\n\n const title = doc.createElement(\"h2\");\n title.textContent = labels.title;\n title.style.cssText = \"margin: 0 0 10px; font-size: 18px; line-height: 1.3; font-weight: 600;\";\n\n const body = doc.createElement(\"p\");\n body.textContent = labels.body;\n body.style.cssText = \"margin: 0 0 20px; font-size: 14px; line-height: 1.5; color: #475467;\";\n\n const focus = doc.createElement(\"button\");\n focus.type = \"button\";\n focus.textContent = labels.focus;\n focus.style.cssText = [\n \"padding: 10px 16px\",\n \"border: 0\",\n \"border-radius: 10px\",\n \"background: #101828\",\n \"color: #ffffff\",\n \"font: inherit\",\n \"font-weight: 600\",\n \"cursor: pointer\",\n ].join(\"; \");\n focus.addEventListener(\"click\", handlers.onFocus);\n\n const cancel = doc.createElement(\"button\");\n cancel.type = \"button\";\n cancel.textContent = labels.cancel;\n cancel.style.cssText = [\n \"padding: 10px 16px\",\n \"border: 0\",\n \"border-radius: 10px\",\n \"background: transparent\",\n \"color: #475467\",\n \"font: inherit\",\n \"cursor: pointer\",\n ].join(\"; \");\n cancel.addEventListener(\"click\", handlers.onCancel);\n\n const actions = doc.createElement(\"div\");\n actions.style.cssText = \"display: flex; gap: 8px; align-items: center;\";\n actions.append(focus, cancel);\n\n card.append(title, body, actions);\n root.append(card);\n doc.body.append(root);\n return root;\n}\n\n/**\n * Open the Assetera Wallet onboarding wizard in a pop-up and resolve with the client's wallet, the pop-up still\n * open so the partner can ask for the ownership signature (see {@link OnboardingResult}).\n *\n * Call this from a user click (a button handler). `window.open` runs synchronously inside the call, before any\n * `await`, so the browser allows it; if the browser blocks the pop-up the promise rejects with\n * `OnboardingError(\"popup_blocked\")` and no overlay is shown.\n *\n * The promise rejects with `OnboardingError` and one of these codes: `invalid_options` (bad chain or wallet\n * URL), `popup_blocked`, `closed` (the pop-up was closed first), `cancelled` (the user cancelled in the wizard\n * or in the overlay), `refused` (the wallet refused the onboarding) or `failed` (anything else in the wallet).\n * After it resolved, the overlay stays until `close()`; closing the pop-up by hand also removes it.\n */\nexport function openAsseteraOnboarding(options: OnboardingOptions): Promise<OnboardingResult> {\n const requestedWindow = options.window ?? (typeof window === \"undefined\" ? undefined : window);\n if (!requestedWindow) {\n return Promise.reject(\n new OnboardingError(\"invalid_options\", \"The Assetera Wallet onboarding can only run in a browser.\"),\n );\n }\n // A non-optional alias so TypeScript keeps the narrowed type inside the callbacks below.\n const targetWindow: Window = requestedWindow;\n if (!isCaip2EvmChain(options.chain)) {\n return Promise.reject(\n new OnboardingError(\n \"invalid_options\",\n `\"${options.chain}\" is not a CAIP-2 EVM chain id (for example \"eip155:80002\").`,\n ),\n );\n }\n let walletOrigin: string;\n try {\n walletOrigin = new URL(options.walletUrl).origin;\n } catch {\n return Promise.reject(\n new OnboardingError(\"invalid_options\", `\"${options.walletUrl}\" is not a valid wallet URL.`),\n );\n }\n\n const labels = resolveLabels(options);\n const overlayEnabled = options.overlay !== false;\n\n // MUST stay synchronous, before the first await, so the pop-up runs inside the caller's user activation.\n const popup = targetWindow.open(\n onboardUrl(options.walletUrl, targetWindow.location.origin, {\n chain: options.chain,\n ...(options.locale === undefined ? {} : { locale: options.locale }),\n ...(options.addWallet ? { add: true } : {}),\n }),\n POPUP_NAME,\n options.popupFeatures ?? defaultPopupFeatures(targetWindow),\n );\n\n if (!popup) {\n // Nothing was opened, so there is nothing to wait for and no overlay: the partner page stays usable.\n return Promise.reject(new OnboardingError(\"popup_blocked\", labels.blocked));\n }\n // A non-optional alias so TypeScript keeps the narrowed type inside the callbacks below.\n const activePopup: Window = popup;\n\n return new Promise<OnboardingResult>((resolve, reject) => {\n // Phase 1 waits for `onboarded`; phase 2 (after it) keeps the pop-up for signature requests until `close()`.\n let onboarded = false;\n let finished = false;\n let closeTimer: ReturnType<typeof setInterval> | null = null;\n let overlay: HTMLElement | null = null;\n const pending = new Map<\n string,\n { resolve: (signature: `0x${string}`) => void; reject: (error: OnboardingError) => void }\n >();\n\n function cleanup(): void {\n finished = true;\n targetWindow.removeEventListener(\"message\", onMessage);\n if (closeTimer !== null) {\n clearInterval(closeTimer);\n closeTimer = null;\n }\n overlay?.remove();\n overlay = null;\n }\n\n function failPending(error: OnboardingError): void {\n for (const entry of pending.values()) entry.reject(error);\n pending.clear();\n }\n\n function close(): void {\n if (finished) return;\n failPending(new OnboardingError(\"closed\", \"The Assetera Wallet window was closed.\"));\n cleanup();\n if (!activePopup.closed) activePopup.close();\n }\n\n function fail(error: OnboardingError): void {\n if (onboarded || finished) return;\n cleanup();\n reject(error);\n }\n\n function cancel(): void {\n if (onboarded) {\n close();\n return;\n }\n activePopup.close();\n fail(new OnboardingError(\"cancelled\", \"The user cancelled the Assetera Wallet onboarding.\"));\n }\n\n function signMessage(message: string): Promise<`0x${string}`> {\n if (finished || activePopup.closed) {\n return Promise.reject(new OnboardingError(\"closed\", \"The Assetera Wallet window was closed.\"));\n }\n const id = globalThis.crypto.randomUUID();\n const request: RequestMessage = {\n type: `${MESSAGE_PREFIX}request`,\n v: PROTOCOL_VERSION,\n id,\n method: \"personal_sign\",\n params: [message, address as `0x${string}`],\n };\n return new Promise((resolveSign, rejectSign) => {\n pending.set(id, { resolve: resolveSign, reject: rejectSign });\n activePopup.focus();\n activePopup.postMessage(request, walletOrigin);\n });\n }\n\n // Set with `onboarded`; `signMessage` is only handed out after that.\n let address: `0x${string}` | undefined;\n\n function onMessage(event: MessageEvent): void {\n // Trust rule: accept only the wallet origin AND the exact pop-up we opened. Ignore everything else.\n if (event.origin !== walletOrigin) return;\n if ((event.source as unknown) !== activePopup) return;\n const data: unknown = event.data;\n if (!onboarded) {\n if (isOnboardedMessage(data)) {\n onboarded = true;\n address = data.address;\n resolve({\n address: data.address,\n chain: data.chain,\n created: data.created ?? true,\n signMessage,\n close,\n });\n return;\n }\n if (isOnboardCancelledMessage(data)) {\n fail(new OnboardingError(cancelCode(data.reason), data.message ?? cancelMessage(data.reason)));\n }\n return;\n }\n if (isResponseMessage(data)) {\n const entry = pending.get(data.id);\n if (!entry) return;\n pending.delete(data.id);\n if (\"error\" in data) {\n entry.reject(\n new OnboardingError(\n data.error.code === RpcErrorCode.UserRejected ? \"cancelled\" : \"failed\",\n data.error.message,\n ),\n );\n } else if (typeof data.result === \"string\" && /^0x[0-9a-fA-F]+$/.test(data.result)) {\n entry.resolve(data.result as `0x${string}`);\n } else {\n entry.reject(new OnboardingError(\"failed\", \"The Assetera Wallet returned no signature.\"));\n }\n }\n }\n\n targetWindow.addEventListener(\"message\", onMessage);\n closeTimer = setInterval(() => {\n if (!activePopup.closed) return;\n if (onboarded) {\n close();\n return;\n }\n fail(\n new OnboardingError(\"closed\", \"The Assetera Wallet window was closed before onboarding finished.\"),\n );\n }, CLOSE_POLL_MS);\n\n if (overlayEnabled) {\n overlay = showOverlay(targetWindow, labels, {\n onFocus: () => activePopup.focus(),\n onCancel: cancel,\n });\n }\n });\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/popup.ts","../src/onboarding.ts","../src/manage.ts"],"names":["POPUP_NAME","CLOSE_POLL_MS","copyAccountNames"],"mappings":";;;;;AAMO,IAAM,WAAA,GAAc,GAAA;AAGpB,IAAM,YAAA,GAAe,GAAA;AAMrB,SAAS,qBAAqB,GAAA,EAAqB;AACxD,EAAA,MAAM,UAAU,MAAA,CAAO,QAAA,CAAS,IAAI,OAAO,CAAA,GAAI,IAAI,OAAA,GAAU,CAAA;AAC7D,EAAA,MAAM,UAAU,MAAA,CAAO,QAAA,CAAS,IAAI,OAAO,CAAA,GAAI,IAAI,OAAA,GAAU,CAAA;AAC7D,EAAA,MAAM,aAAa,MAAA,CAAO,QAAA,CAAS,IAAI,UAAU,CAAA,GAAI,IAAI,UAAA,GAAa,WAAA;AACtE,EAAA,MAAM,cAAc,MAAA,CAAO,QAAA,CAAS,IAAI,WAAW,CAAA,GAAI,IAAI,WAAA,GAAc,YAAA;AACzE,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,MAAM,OAAA,GAAA,CAAW,UAAA,GAAa,WAAA,IAAe,CAAC,CAAC,CAAA;AAC7E,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,MAAM,OAAA,GAAA,CAAW,WAAA,GAAc,YAAA,IAAgB,CAAC,CAAC,CAAA;AAC9E,EAAA,OAAO,eAAe,WAAW,CAAA,QAAA,EAAW,YAAY,CAAA,MAAA,EAAS,IAAI,QAAQ,GAAG,CAAA,CAAA;AAClF;;;ACUO,IAAM,eAAA,GAAN,cAA8B,KAAA,CAAM;AAAA,EAChC,IAAA;AAAA,EAET,WAAA,CAAY,MAA2B,OAAA,EAAiB;AACtD,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EACd;AACF;AA6DA,IAAM,UAAA,GAAa,4BAAA;AACnB,IAAM,aAAA,GAAgB,GAAA;AACtB,IAAM,eAAA,GAAkB,SAAA;AAExB,IAAM,cAAA,GAA0C;AAAA,EAC9C,KAAA,EAAO,wCAAA;AAAA,EACP,IAAA,EAAM,mHAAA;AAAA,EACN,KAAA,EAAO,wBAAA;AAAA,EACP,MAAA,EAAQ,QAAA;AAAA,EACR,OAAA,EAAS;AACX,CAAA;AAOA,SAAS,cAAc,OAAA,EAAqD;AAC1E,EAAA,MAAM,SAAA,GACJ,OAAO,OAAA,CAAQ,OAAA,KAAY,QAAA,IAAY,QAAQ,OAAA,KAAY,IAAA,GAAO,OAAA,CAAQ,OAAA,GAAU,EAAC;AACvF,EAAA,MAAM,cAAc,OAAA,CAAQ,WAAA;AAC5B,EAAA,MAAM,WAAA,GAAc,WAAA,GAChB,CAAA,4CAAA,EAA+C,WAAW,+EAC1D,cAAA,CAAe,IAAA;AACnB,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,SAAA,CAAU,KAAA,IAAS,cAAA,CAAe,KAAA;AAAA,IACzC,IAAA,EAAM,UAAU,IAAA,IAAQ,WAAA;AAAA,IACxB,KAAA,EAAO,SAAA,CAAU,KAAA,IAAS,cAAA,CAAe,KAAA;AAAA,IACzC,MAAA,EAAQ,SAAA,CAAU,MAAA,IAAU,cAAA,CAAe,MAAA;AAAA,IAC3C,OAAA,EAAS,SAAA,CAAU,OAAA,IAAW,cAAA,CAAe;AAAA,GAC/C;AACF;AAEA,SAAS,WAAW,MAAA,EAAgE;AAClF,EAAA,IAAI,MAAA,KAAW,QAAQ,OAAO,WAAA;AAC9B,EAAA,IAAI,MAAA,KAAW,WAAW,OAAO,SAAA;AACjC,EAAA,OAAO,QAAA;AACT;AAEA,SAAS,cAAc,MAAA,EAAmD;AACxE,EAAA,IAAI,MAAA,KAAW,QAAQ,OAAO,oDAAA;AAC9B,EAAA,IAAI,MAAA,KAAW,WAAW,OAAO,6CAAA;AACjC,EAAA,OAAO,wCAAA;AACT;AAGA,SAAS,iBAAiB,QAAA,EAA6D;AACrF,EAAA,OAAO,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,MAAa,EAAE,OAAA,EAAS,OAAA,CAAQ,OAAA,EAAS,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAK,CAAE,CAAA;AACrF;AAMA,SAAS,WAAA,CAAY,GAAA,EAAa,MAAA,EAAiC,QAAA,EAAwC;AACzG,EAAA,MAAM,MAAM,GAAA,CAAI,QAAA;AAChB,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,aAAA,CAAc,KAAK,CAAA;AACpC,EAAA,IAAA,CAAK,YAAA,CAAa,QAAQ,QAAQ,CAAA;AAClC,EAAA,IAAA,CAAK,YAAA,CAAa,cAAc,MAAM,CAAA;AACtC,EAAA,IAAA,CAAK,YAAA,CAAa,oCAAoC,EAAE,CAAA;AACxD,EAAA,IAAA,CAAK,MAAM,OAAA,GAAU;AAAA,IACnB,iBAAA;AAAA,IACA,UAAA;AAAA,IACA,eAAA;AAAA,IACA,qBAAA;AAAA,IACA,yBAAA;AAAA,IACA,eAAA;AAAA,IACA,wBAAA;AAAA,IACA,gCAAA;AAAA,IACA,YAAY,eAAe,CAAA,CAAA;AAAA,IAC3B;AAAA,GACF,CAAE,KAAK,IAAI,CAAA;AAEX,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,aAAA,CAAc,KAAK,CAAA;AACpC,EAAA,IAAA,CAAK,MAAM,OAAA,GAAU;AAAA,IACnB,wBAAA;AAAA,IACA,aAAA;AAAA,IACA,kBAAA;AAAA,IACA,qBAAA;AAAA,IACA,eAAA;AAAA,IACA,qBAAA;AAAA,IACA,gBAAA;AAAA,IACA;AAAA,GACF,CAAE,KAAK,IAAI,CAAA;AAEX,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,aAAA,CAAc,IAAI,CAAA;AACpC,EAAA,KAAA,CAAM,cAAc,MAAA,CAAO,KAAA;AAC3B,EAAA,KAAA,CAAM,MAAM,OAAA,GAAU,wEAAA;AAEtB,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,aAAA,CAAc,GAAG,CAAA;AAClC,EAAA,IAAA,CAAK,cAAc,MAAA,CAAO,IAAA;AAC1B,EAAA,IAAA,CAAK,MAAM,OAAA,GAAU,sEAAA;AAErB,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,aAAA,CAAc,QAAQ,CAAA;AACxC,EAAA,KAAA,CAAM,IAAA,GAAO,QAAA;AACb,EAAA,KAAA,CAAM,cAAc,MAAA,CAAO,KAAA;AAC3B,EAAA,KAAA,CAAM,MAAM,OAAA,GAAU;AAAA,IACpB,oBAAA;AAAA,IACA,WAAA;AAAA,IACA,qBAAA;AAAA,IACA,qBAAA;AAAA,IACA,gBAAA;AAAA,IACA,eAAA;AAAA,IACA,kBAAA;AAAA,IACA;AAAA,GACF,CAAE,KAAK,IAAI,CAAA;AACX,EAAA,KAAA,CAAM,gBAAA,CAAiB,OAAA,EAAS,QAAA,CAAS,OAAO,CAAA;AAEhD,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,aAAA,CAAc,QAAQ,CAAA;AACzC,EAAA,MAAA,CAAO,IAAA,GAAO,QAAA;AACd,EAAA,MAAA,CAAO,cAAc,MAAA,CAAO,MAAA;AAC5B,EAAA,MAAA,CAAO,MAAM,OAAA,GAAU;AAAA,IACrB,oBAAA;AAAA,IACA,WAAA;AAAA,IACA,qBAAA;AAAA,IACA,yBAAA;AAAA,IACA,gBAAA;AAAA,IACA,eAAA;AAAA,IACA;AAAA,GACF,CAAE,KAAK,IAAI,CAAA;AACX,EAAA,MAAA,CAAO,gBAAA,CAAiB,OAAA,EAAS,QAAA,CAAS,QAAQ,CAAA;AAElD,EAAA,MAAM,OAAA,GAAU,GAAA,CAAI,aAAA,CAAc,KAAK,CAAA;AACvC,EAAA,OAAA,CAAQ,MAAM,OAAA,GAAU,+CAAA;AACxB,EAAA,OAAA,CAAQ,MAAA,CAAO,OAAO,MAAM,CAAA;AAE5B,EAAA,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO,IAAA,EAAM,OAAO,CAAA;AAChC,EAAA,IAAA,CAAK,OAAO,IAAI,CAAA;AAChB,EAAA,GAAA,CAAI,IAAA,CAAK,OAAO,IAAI,CAAA;AACpB,EAAA,OAAO,IAAA;AACT;AAiBO,SAAS,uBAAuB,OAAA,EAAuD;AAC5F,EAAA,MAAM,kBAAkB,OAAA,CAAQ,MAAA,KAAW,OAAO,MAAA,KAAW,cAAc,MAAA,GAAY,MAAA,CAAA;AACvF,EAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,IAAA,OAAO,OAAA,CAAQ,MAAA;AAAA,MACb,IAAI,eAAA,CAAgB,iBAAA,EAAmB,2DAA2D;AAAA,KACpG;AAAA,EACF;AAEA,EAAA,MAAM,YAAA,GAAuB,eAAA;AAC7B,EAAA,IAAI,CAAC,eAAA,CAAgB,OAAA,CAAQ,KAAK,CAAA,EAAG;AACnC,IAAA,OAAO,OAAA,CAAQ,MAAA;AAAA,MACb,IAAI,eAAA;AAAA,QACF,iBAAA;AAAA,QACA,CAAA,CAAA,EAAI,QAAQ,KAAK,CAAA,4DAAA;AAAA;AACnB,KACF;AAAA,EACF;AACA,EAAA,IAAI,YAAA;AACJ,EAAA,IAAI;AACF,IAAA,YAAA,GAAe,IAAI,GAAA,CAAI,OAAA,CAAQ,SAAS,CAAA,CAAE,MAAA;AAAA,EAC5C,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,OAAA,CAAQ,MAAA;AAAA,MACb,IAAI,eAAA,CAAgB,iBAAA,EAAmB,CAAA,CAAA,EAAI,OAAA,CAAQ,SAAS,CAAA,4BAAA,CAA8B;AAAA,KAC5F;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAAS,cAAc,OAAO,CAAA;AACpC,EAAA,MAAM,cAAA,GAAiB,QAAQ,OAAA,KAAY,KAAA;AAG3C,EAAA,MAAM,QAAQ,YAAA,CAAa,IAAA;AAAA,IACzB,UAAA,CAAW,OAAA,CAAQ,SAAA,EAAW,YAAA,CAAa,SAAS,MAAA,EAAQ;AAAA,MAC1D,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,GAAI,QAAQ,MAAA,KAAW,MAAA,GAAY,EAAC,GAAI,EAAE,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAO;AAAA,MACjE,GAAI,OAAA,CAAQ,SAAA,GAAY,EAAE,GAAA,EAAK,IAAA,KAAS,EAAC;AAAA,MACzC,GAAI,QAAQ,MAAA,KAAW,MAAA,GAAY,EAAC,GAAI,EAAE,MAAA,EAAQ,OAAA,CAAQ,MAAA;AAAO,KAClE,CAAA;AAAA,IACD,UAAA;AAAA,IACA,OAAA,CAAQ,aAAA,IAAiB,oBAAA,CAAqB,YAAY;AAAA,GAC5D;AAEA,EAAA,IAAI,CAAC,KAAA,EAAO;AAEV,IAAA,OAAO,QAAQ,MAAA,CAAO,IAAI,gBAAgB,eAAA,EAAiB,MAAA,CAAO,OAAO,CAAC,CAAA;AAAA,EAC5E;AAEA,EAAA,MAAM,WAAA,GAAsB,KAAA;AAE5B,EAAA,OAAO,IAAI,OAAA,CAA0B,CAAC,OAAA,EAAS,MAAA,KAAW;AAExD,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,IAAI,QAAA,GAAW,KAAA;AACf,IAAA,IAAI,UAAA,GAAoD,IAAA;AACxD,IAAA,IAAI,OAAA,GAA8B,IAAA;AAClC,IAAA,MAAM,OAAA,uBAAc,GAAA,EAGlB;AAEF,IAAA,SAAS,OAAA,GAAgB;AACvB,MAAA,QAAA,GAAW,IAAA;AACX,MAAA,YAAA,CAAa,mBAAA,CAAoB,WAAW,SAAS,CAAA;AACrD,MAAA,IAAI,eAAe,IAAA,EAAM;AACvB,QAAA,aAAA,CAAc,UAAU,CAAA;AACxB,QAAA,UAAA,GAAa,IAAA;AAAA,MACf;AACA,MAAA,OAAA,EAAS,MAAA,EAAO;AAChB,MAAA,OAAA,GAAU,IAAA;AAAA,IACZ;AAEA,IAAA,SAAS,YAAY,KAAA,EAA8B;AACjD,MAAA,KAAA,MAAW,SAAS,OAAA,CAAQ,MAAA,EAAO,EAAG,KAAA,CAAM,OAAO,KAAK,CAAA;AACxD,MAAA,OAAA,CAAQ,KAAA,EAAM;AAAA,IAChB;AAEA,IAAA,SAAS,KAAA,GAAc;AACrB,MAAA,IAAI,QAAA,EAAU;AACd,MAAA,WAAA,CAAY,IAAI,eAAA,CAAgB,QAAA,EAAU,wCAAwC,CAAC,CAAA;AACnF,MAAA,OAAA,EAAQ;AACR,MAAA,IAAI,CAAC,WAAA,CAAY,MAAA,EAAQ,WAAA,CAAY,KAAA,EAAM;AAAA,IAC7C;AAEA,IAAA,SAAS,KAAK,KAAA,EAA8B;AAC1C,MAAA,IAAI,aAAa,QAAA,EAAU;AAC3B,MAAA,OAAA,EAAQ;AACR,MAAA,MAAA,CAAO,KAAK,CAAA;AAAA,IACd;AAEA,IAAA,SAAS,MAAA,GAAe;AACtB,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,KAAA,EAAM;AACN,QAAA;AAAA,MACF;AACA,MAAA,WAAA,CAAY,KAAA,EAAM;AAClB,MAAA,IAAA,CAAK,IAAI,eAAA,CAAgB,WAAA,EAAa,oDAAoD,CAAC,CAAA;AAAA,IAC7F;AAEA,IAAA,SAAS,YAAY,OAAA,EAAyC;AAC5D,MAAA,IAAI,QAAA,IAAY,YAAY,MAAA,EAAQ;AAClC,QAAA,OAAO,QAAQ,MAAA,CAAO,IAAI,eAAA,CAAgB,QAAA,EAAU,wCAAwC,CAAC,CAAA;AAAA,MAC/F;AACA,MAAA,MAAM,EAAA,GAAK,UAAA,CAAW,MAAA,CAAO,UAAA,EAAW;AACxC,MAAA,MAAM,OAAA,GAA0B;AAAA,QAC9B,IAAA,EAAM,GAAG,cAAc,CAAA,OAAA,CAAA;AAAA,QACvB,CAAA,EAAG,gBAAA;AAAA,QACH,EAAA;AAAA,QACA,MAAA,EAAQ,eAAA;AAAA,QACR,MAAA,EAAQ,CAAC,OAAA,EAAS,OAAwB;AAAA,OAC5C;AACA,MAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,WAAA,EAAa,UAAA,KAAe;AAC9C,QAAA,OAAA,CAAQ,IAAI,EAAA,EAAI,EAAE,SAAS,WAAA,EAAa,MAAA,EAAQ,YAAY,CAAA;AAC5D,QAAA,WAAA,CAAY,KAAA,EAAM;AAClB,QAAA,WAAA,CAAY,WAAA,CAAY,SAAS,YAAY,CAAA;AAAA,MAC/C,CAAC,CAAA;AAAA,IACH;AAGA,IAAA,IAAI,OAAA;AAEJ,IAAA,IAAI,mBAAA;AAEJ,IAAA,SAAS,UAAU,KAAA,EAA2B;AAE5C,MAAA,IAAI,KAAA,CAAM,WAAW,YAAA,EAAc;AACnC,MAAA,IAAK,KAAA,CAAM,WAAuB,WAAA,EAAa;AAC/C,MAAA,MAAM,OAAgB,KAAA,CAAM,IAAA;AAC5B,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,IAAI,kBAAA,CAAmB,IAAI,CAAA,EAAG;AAC5B,UAAA,SAAA,GAAY,IAAA;AACZ,UAAA,OAAA,GAAU,IAAA,CAAK,OAAA;AACf,UAAA,OAAA,CAAQ;AAAA,YACN,SAAS,IAAA,CAAK,OAAA;AAAA,YACd,OAAO,IAAA,CAAK,KAAA;AAAA,YACZ,OAAA,EAAS,KAAK,OAAA,IAAW,IAAA;AAAA,YACzB,WAAA;AAAA,YACA,KAAA;AAAA,YACA,cAAc,MACZ,mBAAA,KAAwB,MAAA,GAAY,MAAA,GAAY,iBAAiB,mBAAmB;AAAA,WACvF,CAAA;AACD,UAAA;AAAA,QACF;AACA,QAAA,IAAI,yBAAA,CAA0B,IAAI,CAAA,EAAG;AACnC,UAAA,IAAA,CAAK,IAAI,eAAA,CAAgB,UAAA,CAAW,IAAA,CAAK,MAAM,CAAA,EAAG,IAAA,CAAK,OAAA,IAAW,aAAA,CAAc,IAAA,CAAK,MAAM,CAAC,CAAC,CAAA;AAAA,QAC/F;AACA,QAAA;AAAA,MACF;AACA,MAAA,IAAI,iBAAA,CAAkB,IAAI,CAAA,EAAG;AAC3B,QAAA,mBAAA,GAAsB,gBAAA,CAAiB,KAAK,IAAI,CAAA;AAChD,QAAA,OAAA,CAAQ,UAAA,GAAa,gBAAA,CAAiB,mBAAmB,CAAC,CAAA;AAC1D,QAAA;AAAA,MACF;AACA,MAAA,IAAI,iBAAA,CAAkB,IAAI,CAAA,EAAG;AAC3B,QAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA;AACjC,QAAA,IAAI,CAAC,KAAA,EAAO;AACZ,QAAA,OAAA,CAAQ,MAAA,CAAO,KAAK,EAAE,CAAA;AACtB,QAAA,IAAI,WAAW,IAAA,EAAM;AACnB,UAAA,KAAA,CAAM,MAAA;AAAA,YACJ,IAAI,eAAA;AAAA,cACF,IAAA,CAAK,KAAA,CAAM,IAAA,KAAS,YAAA,CAAa,eAAe,WAAA,GAAc,QAAA;AAAA,cAC9D,KAAK,KAAA,CAAM;AAAA;AACb,WACF;AAAA,QACF,CAAA,MAAA,IAAW,OAAO,IAAA,CAAK,MAAA,KAAW,YAAY,kBAAA,CAAmB,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA,EAAG;AAClF,UAAA,KAAA,CAAM,OAAA,CAAQ,KAAK,MAAuB,CAAA;AAAA,QAC5C,CAAA,MAAO;AACL,UAAA,KAAA,CAAM,MAAA,CAAO,IAAI,eAAA,CAAgB,QAAA,EAAU,4CAA4C,CAAC,CAAA;AAAA,QAC1F;AAAA,MACF;AAAA,IACF;AAEA,IAAA,YAAA,CAAa,gBAAA,CAAiB,WAAW,SAAS,CAAA;AAClD,IAAA,UAAA,GAAa,YAAY,MAAM;AAC7B,MAAA,IAAI,CAAC,YAAY,MAAA,EAAQ;AACzB,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,KAAA,EAAM;AACN,QAAA;AAAA,MACF;AACA,MAAA,IAAA;AAAA,QACE,IAAI,eAAA,CAAgB,QAAA,EAAU,mEAAmE;AAAA,OACnG;AAAA,IACF,GAAG,aAAa,CAAA;AAEhB,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,OAAA,GAAU,WAAA,CAAY,cAAc,MAAA,EAAQ;AAAA,QAC1C,OAAA,EAAS,MAAM,WAAA,CAAY,KAAA,EAAM;AAAA,QACjC,QAAA,EAAU;AAAA,OACX,CAAA;AAAA,IACH;AAAA,EACF,CAAC,CAAA;AACH;;;AChaO,IAAM,YAAA,GAAN,cAA2B,KAAA,CAAM;AAAA,EAC7B,IAAA;AAAA,EAET,WAAA,CAAY,MAAwB,OAAA,EAAiB;AACnD,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,cAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EACd;AACF;AAgCA,IAAMA,WAAAA,GAAa,wBAAA;AACnB,IAAMC,cAAAA,GAAgB,GAAA;AAcf,SAAS,0BAA0B,OAAA,EAA8C;AACtF,EAAA,MAAM,kBAAkB,OAAA,CAAQ,MAAA,KAAW,OAAO,MAAA,KAAW,cAAc,MAAA,GAAY,MAAA,CAAA;AACvF,EAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,IAAA,MAAM,IAAI,YAAA,CAAa,iBAAA,EAAmB,wDAAwD,CAAA;AAAA,EACpG;AAEA,EAAA,MAAM,YAAA,GAAuB,eAAA;AAC7B,EAAA,IAAI,YAAA;AACJ,EAAA,IAAI;AACF,IAAA,YAAA,GAAe,IAAI,GAAA,CAAI,OAAA,CAAQ,SAAS,CAAA,CAAE,MAAA;AAAA,EAC5C,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAI,YAAA,CAAa,iBAAA,EAAmB,CAAA,CAAA,EAAI,OAAA,CAAQ,SAAS,CAAA,4BAAA,CAA8B,CAAA;AAAA,EAC/F;AAGA,EAAA,MAAM,QAAQ,YAAA,CAAa,IAAA;AAAA,IACzB,SAAA,CAAU,OAAA,CAAQ,SAAA,EAAW,YAAA,CAAa,SAAS,MAAA,EAAQ;AAAA,MACzD,GAAI,QAAQ,MAAA,KAAW,MAAA,GAAY,EAAC,GAAI,EAAE,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAO;AAAA,MACjE,GAAI,QAAQ,MAAA,KAAW,MAAA,GAAY,EAAC,GAAI,EAAE,MAAA,EAAQ,OAAA,CAAQ,MAAA;AAAO,KAClE,CAAA;AAAA,IACDD,WAAAA;AAAA,IACA,OAAA,CAAQ,aAAA,IAAiB,oBAAA,CAAqB,YAAY;AAAA,GAC5D;AAEA,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,MAAM,IAAI,YAAA;AAAA,MACR,eAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,WAAA,GAAsB,KAAA;AAE5B,EAAA,IAAI,QAAA,GAAW,KAAA;AACf,EAAA,IAAI,YAAA;AACJ,EAAA,IAAI,YAAA;AACJ,EAAA,IAAI,UAAA,GAAoD,IAAA;AACxD,EAAA,IAAI,aAAA;AACJ,EAAA,MAAM,MAAA,GAAS,IAAI,OAAA,CAAc,CAAC,OAAA,KAAY;AAC5C,IAAA,aAAA,GAAgB,OAAA;AAAA,EAClB,CAAC,CAAA;AAED,EAAA,SAAS,OAAA,GAAgB;AACvB,IAAA,IAAI,QAAA,EAAU;AACd,IAAA,QAAA,GAAW,IAAA;AACX,IAAA,YAAA,CAAa,mBAAA,CAAoB,WAAW,SAAS,CAAA;AACrD,IAAA,IAAI,eAAe,IAAA,EAAM;AACvB,MAAA,aAAA,CAAc,UAAU,CAAA;AACxB,MAAA,UAAA,GAAa,IAAA;AAAA,IACf;AACA,IAAA,aAAA,EAAc;AAAA,EAChB;AAEA,EAAA,SAAS,KAAA,GAAc;AACrB,IAAA,OAAA,EAAQ;AACR,IAAA,IAAI,CAAC,WAAA,CAAY,MAAA,EAAQ,WAAA,CAAY,KAAA,EAAM;AAAA,EAC7C;AAGA,EAAA,SAASE,kBAAiB,QAAA,EAA6D;AACrF,IAAA,OAAO,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,MAAa,EAAE,OAAA,EAAS,OAAA,CAAQ,OAAA,EAAS,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAK,CAAE,CAAA;AAAA,EACrF;AAEA,EAAA,SAAS,UAAU,KAAA,EAA2B;AAE5C,IAAA,IAAI,KAAA,CAAM,WAAW,YAAA,EAAc;AACnC,IAAA,IAAK,KAAA,CAAM,WAAuB,WAAA,EAAa;AAC/C,IAAA,MAAM,OAAgB,KAAA,CAAM,IAAA;AAC5B,IAAA,IAAI,iBAAA,CAAkB,IAAI,CAAA,EAAG;AAC3B,MAAA,MAAM,MAAA,GAA+B;AAAA,QACnC,UAAA,EAAY,KAAK,IAAA,CAAK,UAAA;AAAA,QACtB,QAAA,EAAU,KAAK,IAAA,CAAK,QAAA;AAAA,QACpB,iBAAA,EAAmB,KAAK,IAAA,CAAK;AAAA,OAC/B;AACA,MAAA,YAAA,GAAe,MAAA;AACf,MAAA,OAAA,CAAQ,aAAa,MAAM,CAAA;AAC3B,MAAA;AAAA,IACF;AACA,IAAA,IAAI,iBAAA,CAAkB,IAAI,CAAA,EAAG;AAC3B,MAAA,YAAA,GAAeA,iBAAAA,CAAiB,KAAK,IAAI,CAAA;AACzC,MAAA,OAAA,CAAQ,UAAA,GAAaA,iBAAAA,CAAiB,YAAY,CAAC,CAAA;AAAA,IACrD;AAAA,EACF;AAEA,EAAA,YAAA,CAAa,gBAAA,CAAiB,WAAW,SAAS,CAAA;AAClD,EAAA,UAAA,GAAa,YAAY,MAAM;AAC7B,IAAA,IAAI,WAAA,CAAY,QAAQ,OAAA,EAAQ;AAAA,EAClC,GAAGD,cAAa,CAAA;AAEhB,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,MAAA;AAAA,IACA,cAAc,MAAM,YAAA;AAAA,IACpB,cAAc,MAAO,YAAA,KAAiB,MAAA,GAAY,MAAA,GAAYC,kBAAiB,YAAY;AAAA,GAC7F;AACF","file":"index.js","sourcesContent":["/**\n * Small helpers shared by the pop-up openers in this package. They are internal and are not part of the public\n * API through `index.ts`.\n */\n\n/** Default width, in pixels, of the onboarding and manage pop-ups. */\nexport const POPUP_WIDTH = 440;\n\n/** Default height, in pixels, of the onboarding and manage pop-ups. */\nexport const POPUP_HEIGHT = 760;\n\n/**\n * Build the centred `window.open` feature string for a pop-up of the default size. `win` is the opener window:\n * the pop-up is centred over it, and safe defaults are used when the browser does not expose the geometry.\n */\nexport function defaultPopupFeatures(win: Window): string {\n const screenX = Number.isFinite(win.screenX) ? win.screenX : 0;\n const screenY = Number.isFinite(win.screenY) ? win.screenY : 0;\n const outerWidth = Number.isFinite(win.outerWidth) ? win.outerWidth : POPUP_WIDTH;\n const outerHeight = Number.isFinite(win.outerHeight) ? win.outerHeight : POPUP_HEIGHT;\n const left = Math.max(0, Math.round(screenX + (outerWidth - POPUP_WIDTH) / 2));\n const top = Math.max(0, Math.round(screenY + (outerHeight - POPUP_HEIGHT) / 2));\n return `popup,width=${POPUP_WIDTH},height=${POPUP_HEIGHT},left=${left},top=${top}`;\n}\n","/**\n * Onboarding opener for the Assetera Wallet: the partner side of the `/onboard` wizard (AO-1274).\n *\n * A tied-agent bank site shows a \"Create an Assetera wallet\" button. On the click, this module opens the wallet\n * pop-up in onboarding mode synchronously (so the browser treats it as part of the click) and waits for the\n * wizard to post the new wallet address back. While the pop-up is open the partner page shows a dimming\n * overlay; the overlay is plain DOM (no React, no CSS files) so any partner can drop this in.\n *\n * The wallet's `/onboard` page is the pop-up side and speaks the same protocol in `./protocol`, but it uses the\n * message types and the `ONBOARD_PATH` from there, so the two sides cannot drift apart.\n */\nimport {\n MESSAGE_PREFIX,\n PROTOCOL_VERSION,\n RpcErrorCode,\n isAccountsMessage,\n isCaip2EvmChain,\n isOnboardCancelledMessage,\n isOnboardedMessage,\n isResponseMessage,\n onboardUrl,\n type OnboardCancelledMessage,\n type RequestMessage,\n type SignInHint,\n type WalletAccountName,\n} from \"./protocol\";\nimport { defaultPopupFeatures } from \"./popup\";\n\n/** Why {@link openAsseteraOnboarding} rejected. */\nexport type OnboardingErrorCode =\n \"popup_blocked\" | \"closed\" | \"cancelled\" | \"refused\" | \"failed\" | \"invalid_options\";\n\n/** Error thrown (well, rejected) by {@link openAsseteraOnboarding}. `code` is stable and safe to branch on. */\nexport class OnboardingError extends Error {\n readonly code: OnboardingErrorCode;\n\n constructor(code: OnboardingErrorCode, message: string) {\n super(message);\n this.name = \"OnboardingError\";\n this.code = code;\n }\n}\n\n/**\n * The client's Assetera Wallet, with the pop-up still open.\n *\n * The wallet is NOT registered with any compliance service. A regulated partner registers it itself, like any\n * other wallet: fetch a challenge for `address`, pass it to `signMessage`, send the signature to its compliance\n * service, then call `close()`. Always call `close()`: it closes the pop-up and removes the overlay.\n */\nexport interface OnboardingResult {\n address: `0x${string}`;\n chain: string;\n /** `true` when the wallet was created in this run, `false` when the client's existing wallet was returned. */\n created: boolean;\n /**\n * Ask the client to sign `message` (EIP-191 `personal_sign`) with this wallet in the open pop-up. Rejects with\n * `OnboardingError(\"cancelled\")` when the client declines, `\"closed\"` when the pop-up is gone, else `\"failed\"`.\n */\n signMessage: (message: string) => Promise<`0x${string}`>;\n /** Close the pop-up and remove the overlay. Safe to call more than once. */\n close: () => void;\n /**\n * The last account names the pop-up sent after it reported the address, or `undefined` when none arrived yet.\n * The returned list is a copy.\n */\n lastAccounts: () => WalletAccountName[] | undefined;\n}\n\n/** Text of the dimming overlay, all optional. Any key left out keeps its English default. */\nexport interface OverlayLabels {\n title?: string;\n body?: string;\n focus?: string;\n cancel?: string;\n blocked?: string;\n}\n\n/** Options for {@link openAsseteraOnboarding}. */\nexport interface OnboardingOptions {\n /** Base URL of the wallet origin, e.g. `https://wallet.wallet-staging.assetera.com`. */\n walletUrl: string;\n /** CAIP-2 chain id the new wallet should be created on, e.g. `eip155:80002`. An invalid value rejects with `invalid_options`. */\n chain: string;\n /** Wizard language passed as `lang`, e.g. `\"en\"` or `\"de\"`. */\n locale?: string;\n /** `window.open` feature string. Defaults to a centred `\"popup,width=440,height=760,left=…,top=…\"`. */\n popupFeatures?: string;\n /** `true` (default) shows the dimming overlay, `false` hides it, an object overrides its text. */\n overlay?: boolean | OverlayLabels;\n /** Only used in the overlay text, e.g. `\"Musterbank\"`. */\n partnerName?: string;\n /** Ask for one more wallet even when the client already has one (\"Create another Assetera Wallet\"). */\n addWallet?: boolean;\n /** Sign-in hint passed as `signIn`, e.g. `\"assetera-marketplace\"`. Only a hint; the wallet may ignore it. */\n signIn?: SignInHint;\n /** Called for every `accounts` message the pop-up sends after it reported the address. */\n onAccounts?: (accounts: WalletAccountName[]) => void;\n /** Injectable `window` for tests; defaults to `globalThis.window`. */\n window?: Window;\n}\n\nconst POPUP_NAME = \"assetera-wallet-onboarding\";\nconst CLOSE_POLL_MS = 500;\nconst OVERLAY_Z_INDEX = 2147483000;\n\nconst DEFAULT_LABELS: Required<OverlayLabels> = {\n title: \"Continue in the Assetera Wallet window\",\n body: \"A secure Assetera Wallet window is open. Follow the steps there. This page continues by itself when you are done.\",\n focus: \"Show the wallet window\",\n cancel: \"Cancel\",\n blocked: \"Your browser blocked the Assetera Wallet window. Allow pop-ups for this site and try again.\",\n};\n\ninterface OverlayHandlers {\n onFocus: () => void;\n onCancel: () => void;\n}\n\nfunction resolveLabels(options: OnboardingOptions): Required<OverlayLabels> {\n const overrides: OverlayLabels =\n typeof options.overlay === \"object\" && options.overlay !== null ? options.overlay : {};\n const partnerName = options.partnerName;\n const defaultBody = partnerName\n ? `A secure Assetera Wallet window is open for ${partnerName}. Follow the steps there. This page continues by itself when you are done.`\n : DEFAULT_LABELS.body;\n return {\n title: overrides.title ?? DEFAULT_LABELS.title,\n body: overrides.body ?? defaultBody,\n focus: overrides.focus ?? DEFAULT_LABELS.focus,\n cancel: overrides.cancel ?? DEFAULT_LABELS.cancel,\n blocked: overrides.blocked ?? DEFAULT_LABELS.blocked,\n };\n}\n\nfunction cancelCode(reason: OnboardCancelledMessage[\"reason\"]): OnboardingErrorCode {\n if (reason === \"user\") return \"cancelled\";\n if (reason === \"refused\") return \"refused\";\n return \"failed\";\n}\n\nfunction cancelMessage(reason: OnboardCancelledMessage[\"reason\"]): string {\n if (reason === \"user\") return \"The user cancelled the Assetera Wallet onboarding.\";\n if (reason === \"refused\") return \"The Assetera Wallet refused the onboarding.\";\n return \"The Assetera Wallet onboarding failed.\";\n}\n\n/** A copy of a list of named accounts, so callers never get the opener's own list. */\nfunction copyAccountNames(accounts: readonly WalletAccountName[]): WalletAccountName[] {\n return accounts.map((account) => ({ address: account.address, name: account.name }));\n}\n\n/**\n * Build the dimming overlay. Text is inserted with `textContent` only and every style is inline, so the\n * overlay cannot pick up partner CSS and cannot be scripted through an injected string.\n */\nfunction showOverlay(win: Window, labels: Required<OverlayLabels>, handlers: OverlayHandlers): HTMLElement {\n const doc = win.document;\n const root = doc.createElement(\"div\");\n root.setAttribute(\"role\", \"dialog\");\n root.setAttribute(\"aria-modal\", \"true\");\n root.setAttribute(\"data-assetera-onboarding-overlay\", \"\");\n root.style.cssText = [\n \"position: fixed\",\n \"inset: 0\",\n \"display: flex\",\n \"align-items: center\",\n \"justify-content: center\",\n \"padding: 24px\",\n \"box-sizing: border-box\",\n \"background: rgba(15,20,30,0.6)\",\n `z-index: ${OVERLAY_Z_INDEX}`,\n \"font-family: system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif\",\n ].join(\"; \");\n\n const card = doc.createElement(\"div\");\n card.style.cssText = [\n \"box-sizing: border-box\",\n \"width: 100%\",\n \"max-width: 420px\",\n \"border-radius: 16px\",\n \"padding: 24px\",\n \"background: #ffffff\",\n \"color: #101828\",\n \"box-shadow: 0 20px 50px rgba(0, 0, 0, 0.35)\",\n ].join(\"; \");\n\n const title = doc.createElement(\"h2\");\n title.textContent = labels.title;\n title.style.cssText = \"margin: 0 0 10px; font-size: 18px; line-height: 1.3; font-weight: 600;\";\n\n const body = doc.createElement(\"p\");\n body.textContent = labels.body;\n body.style.cssText = \"margin: 0 0 20px; font-size: 14px; line-height: 1.5; color: #475467;\";\n\n const focus = doc.createElement(\"button\");\n focus.type = \"button\";\n focus.textContent = labels.focus;\n focus.style.cssText = [\n \"padding: 10px 16px\",\n \"border: 0\",\n \"border-radius: 10px\",\n \"background: #101828\",\n \"color: #ffffff\",\n \"font: inherit\",\n \"font-weight: 600\",\n \"cursor: pointer\",\n ].join(\"; \");\n focus.addEventListener(\"click\", handlers.onFocus);\n\n const cancel = doc.createElement(\"button\");\n cancel.type = \"button\";\n cancel.textContent = labels.cancel;\n cancel.style.cssText = [\n \"padding: 10px 16px\",\n \"border: 0\",\n \"border-radius: 10px\",\n \"background: transparent\",\n \"color: #475467\",\n \"font: inherit\",\n \"cursor: pointer\",\n ].join(\"; \");\n cancel.addEventListener(\"click\", handlers.onCancel);\n\n const actions = doc.createElement(\"div\");\n actions.style.cssText = \"display: flex; gap: 8px; align-items: center;\";\n actions.append(focus, cancel);\n\n card.append(title, body, actions);\n root.append(card);\n doc.body.append(root);\n return root;\n}\n\n/**\n * Open the Assetera Wallet onboarding wizard in a pop-up and resolve with the client's wallet, the pop-up still\n * open so the partner can ask for the ownership signature (see {@link OnboardingResult}).\n *\n * Call this from a user click (a button handler). `window.open` runs synchronously inside the call, before any\n * `await`, so the browser allows it; if the browser blocks the pop-up the promise rejects with\n * `OnboardingError(\"popup_blocked\")` and no overlay is shown.\n *\n * The promise rejects with `OnboardingError` and one of these codes: `invalid_options` (bad chain or wallet\n * URL), `popup_blocked`, `closed` (the pop-up was closed first), `cancelled` (the user cancelled in the wizard\n * or in the overlay), `refused` (the wallet refused the onboarding) or `failed` (anything else in the wallet).\n * After it resolved, the overlay stays until `close()`; closing the pop-up by hand also removes it. After it\n * reported the address the pop-up may send `accounts` messages; `onAccounts` receives each list and\n * `lastAccounts()` returns the last one.\n */\nexport function openAsseteraOnboarding(options: OnboardingOptions): Promise<OnboardingResult> {\n const requestedWindow = options.window ?? (typeof window === \"undefined\" ? undefined : window);\n if (!requestedWindow) {\n return Promise.reject(\n new OnboardingError(\"invalid_options\", \"The Assetera Wallet onboarding can only run in a browser.\"),\n );\n }\n // A non-optional alias so TypeScript keeps the narrowed type inside the callbacks below.\n const targetWindow: Window = requestedWindow;\n if (!isCaip2EvmChain(options.chain)) {\n return Promise.reject(\n new OnboardingError(\n \"invalid_options\",\n `\"${options.chain}\" is not a CAIP-2 EVM chain id (for example \"eip155:80002\").`,\n ),\n );\n }\n let walletOrigin: string;\n try {\n walletOrigin = new URL(options.walletUrl).origin;\n } catch {\n return Promise.reject(\n new OnboardingError(\"invalid_options\", `\"${options.walletUrl}\" is not a valid wallet URL.`),\n );\n }\n\n const labels = resolveLabels(options);\n const overlayEnabled = options.overlay !== false;\n\n // MUST stay synchronous, before the first await, so the pop-up runs inside the caller's user activation.\n const popup = targetWindow.open(\n onboardUrl(options.walletUrl, targetWindow.location.origin, {\n chain: options.chain,\n ...(options.locale === undefined ? {} : { locale: options.locale }),\n ...(options.addWallet ? { add: true } : {}),\n ...(options.signIn === undefined ? {} : { signIn: options.signIn }),\n }),\n POPUP_NAME,\n options.popupFeatures ?? defaultPopupFeatures(targetWindow),\n );\n\n if (!popup) {\n // Nothing was opened, so there is nothing to wait for and no overlay: the partner page stays usable.\n return Promise.reject(new OnboardingError(\"popup_blocked\", labels.blocked));\n }\n // A non-optional alias so TypeScript keeps the narrowed type inside the callbacks below.\n const activePopup: Window = popup;\n\n return new Promise<OnboardingResult>((resolve, reject) => {\n // Phase 1 waits for `onboarded`; phase 2 (after it) keeps the pop-up for signature requests until `close()`.\n let onboarded = false;\n let finished = false;\n let closeTimer: ReturnType<typeof setInterval> | null = null;\n let overlay: HTMLElement | null = null;\n const pending = new Map<\n string,\n { resolve: (signature: `0x${string}`) => void; reject: (error: OnboardingError) => void }\n >();\n\n function cleanup(): void {\n finished = true;\n targetWindow.removeEventListener(\"message\", onMessage);\n if (closeTimer !== null) {\n clearInterval(closeTimer);\n closeTimer = null;\n }\n overlay?.remove();\n overlay = null;\n }\n\n function failPending(error: OnboardingError): void {\n for (const entry of pending.values()) entry.reject(error);\n pending.clear();\n }\n\n function close(): void {\n if (finished) return;\n failPending(new OnboardingError(\"closed\", \"The Assetera Wallet window was closed.\"));\n cleanup();\n if (!activePopup.closed) activePopup.close();\n }\n\n function fail(error: OnboardingError): void {\n if (onboarded || finished) return;\n cleanup();\n reject(error);\n }\n\n function cancel(): void {\n if (onboarded) {\n close();\n return;\n }\n activePopup.close();\n fail(new OnboardingError(\"cancelled\", \"The user cancelled the Assetera Wallet onboarding.\"));\n }\n\n function signMessage(message: string): Promise<`0x${string}`> {\n if (finished || activePopup.closed) {\n return Promise.reject(new OnboardingError(\"closed\", \"The Assetera Wallet window was closed.\"));\n }\n const id = globalThis.crypto.randomUUID();\n const request: RequestMessage = {\n type: `${MESSAGE_PREFIX}request`,\n v: PROTOCOL_VERSION,\n id,\n method: \"personal_sign\",\n params: [message, address as `0x${string}`],\n };\n return new Promise((resolveSign, rejectSign) => {\n pending.set(id, { resolve: resolveSign, reject: rejectSign });\n activePopup.focus();\n activePopup.postMessage(request, walletOrigin);\n });\n }\n\n // Set with `onboarded`; `signMessage` is only handed out after that.\n let address: `0x${string}` | undefined;\n /** The last account names the pop-up sent after `onboarded`; kept until `close()`. */\n let lastAccountNameList: WalletAccountName[] | undefined;\n\n function onMessage(event: MessageEvent): void {\n // Trust rule: accept only the wallet origin AND the exact pop-up we opened. Ignore everything else.\n if (event.origin !== walletOrigin) return;\n if ((event.source as unknown) !== activePopup) return;\n const data: unknown = event.data;\n if (!onboarded) {\n if (isOnboardedMessage(data)) {\n onboarded = true;\n address = data.address;\n resolve({\n address: data.address,\n chain: data.chain,\n created: data.created ?? true,\n signMessage,\n close,\n lastAccounts: () =>\n lastAccountNameList === undefined ? undefined : copyAccountNames(lastAccountNameList),\n });\n return;\n }\n if (isOnboardCancelledMessage(data)) {\n fail(new OnboardingError(cancelCode(data.reason), data.message ?? cancelMessage(data.reason)));\n }\n return;\n }\n if (isAccountsMessage(data)) {\n lastAccountNameList = copyAccountNames(data.data);\n options.onAccounts?.(copyAccountNames(lastAccountNameList));\n return;\n }\n if (isResponseMessage(data)) {\n const entry = pending.get(data.id);\n if (!entry) return;\n pending.delete(data.id);\n if (\"error\" in data) {\n entry.reject(\n new OnboardingError(\n data.error.code === RpcErrorCode.UserRejected ? \"cancelled\" : \"failed\",\n data.error.message,\n ),\n );\n } else if (typeof data.result === \"string\" && /^0x[0-9a-fA-F]+$/.test(data.result)) {\n entry.resolve(data.result as `0x${string}`);\n } else {\n entry.reject(new OnboardingError(\"failed\", \"The Assetera Wallet returned no signature.\"));\n }\n }\n }\n\n targetWindow.addEventListener(\"message\", onMessage);\n closeTimer = setInterval(() => {\n if (!activePopup.closed) return;\n if (onboarded) {\n close();\n return;\n }\n fail(\n new OnboardingError(\"closed\", \"The Assetera Wallet window was closed before onboarding finished.\"),\n );\n }, CLOSE_POLL_MS);\n\n if (overlayEnabled) {\n overlay = showOverlay(targetWindow, labels, {\n onFocus: () => activePopup.focus(),\n onCancel: cancel,\n });\n }\n });\n}\n","/**\n * Manage-wallet opener for the Assetera Wallet: the partner side of the `/manage` pop-up (AO-1436).\n *\n * A partner page shows a \"Manage wallet\" button. On the click this module opens the wallet pop-up on the manage\n * route synchronously (so the browser treats it as part of the click). The client sees the wallet accounts and\n * the wallet security (passkeys, authenticator app, recovery codes) and can change them. The pop-up never\n * answers `request` messages; it posts `security` and `accounts` messages while it is open.\n */\nimport {\n isAccountsMessage,\n isSecurityMessage,\n manageUrl,\n type SignInHint,\n type WalletAccountName,\n type WalletSecurityStatus,\n} from \"./protocol\";\nimport { defaultPopupFeatures } from \"./popup\";\n\n/** Why {@link openAsseteraWalletManager} threw. */\nexport type ManagerErrorCode = \"popup_blocked\" | \"invalid_options\";\n\n/** Error thrown by {@link openAsseteraWalletManager}. `code` is stable and safe to branch on. */\nexport class ManagerError extends Error {\n readonly code: ManagerErrorCode;\n\n constructor(code: ManagerErrorCode, message: string) {\n super(message);\n this.name = \"ManagerError\";\n this.code = code;\n }\n}\n\n/** Options for {@link openAsseteraWalletManager}. */\nexport interface WalletManagerOptions {\n /** Base URL of the wallet origin, e.g. `https://wallet.wallet-staging.assetera.com`. */\n walletUrl: string;\n /** Sign-in hint passed as `signIn`, e.g. `\"assetera-marketplace\"`. Only a hint; the wallet may ignore it. */\n signIn?: SignInHint;\n /** Language passed as `lang`, e.g. `\"en\"` or `\"de\"`. */\n locale?: string;\n /** `window.open` feature string. Defaults to a centred `\"popup,width=440,height=760,left=…,top=…\"`. */\n popupFeatures?: string;\n /** Called for every `security` message from the pop-up. */\n onSecurity?: (status: WalletSecurityStatus) => void;\n /** Called for every `accounts` message from the pop-up. */\n onAccounts?: (accounts: WalletAccountName[]) => void;\n /** Injectable `window` for tests; defaults to `globalThis.window`. */\n window?: Window;\n}\n\n/** The open manage pop-up, controlled by the partner. */\nexport interface WalletManager {\n /** Close the pop-up and remove the listener and the close timer. Safe to call more than once. */\n close: () => void;\n /** Resolves when the pop-up is closed, by the partner or by the client. */\n closed: Promise<void>;\n /** The last security status the pop-up sent, or `undefined` when none arrived yet. */\n lastSecurity: () => WalletSecurityStatus | undefined;\n /** The last account names the pop-up sent, or `undefined` when none arrived yet. */\n lastAccounts: () => WalletAccountName[] | undefined;\n}\n\nconst POPUP_NAME = \"assetera-wallet-manage\";\nconst CLOSE_POLL_MS = 500;\n\n/**\n * Open the manage-wallet pop-up for the Assetera Wallet and return a handle to it.\n *\n * Call this from a user click (a button handler). `window.open` runs synchronously inside the call, before any\n * `await`, so the browser allows it; when the browser blocks the pop-up this throws `ManagerError` with code\n * `popup_blocked`.\n *\n * The pop-up checks the `origin` query parameter against the wallet's partner list, posts `ready` to\n * `window.opener` and then posts `security` and `accounts` messages. Messages are accepted only when they come\n * from the wallet origin AND from the pop-up that was opened here. The pop-up does not answer `request`\n * messages.\n */\nexport function openAsseteraWalletManager(options: WalletManagerOptions): WalletManager {\n const requestedWindow = options.window ?? (typeof window === \"undefined\" ? undefined : window);\n if (!requestedWindow) {\n throw new ManagerError(\"invalid_options\", \"The Assetera Wallet manager can only run in a browser.\");\n }\n // A non-optional alias so TypeScript keeps the narrowed type inside the callbacks below.\n const targetWindow: Window = requestedWindow;\n let walletOrigin: string;\n try {\n walletOrigin = new URL(options.walletUrl).origin;\n } catch {\n throw new ManagerError(\"invalid_options\", `\"${options.walletUrl}\" is not a valid wallet URL.`);\n }\n\n // MUST stay synchronous, before any await, so the pop-up runs inside the caller's user activation.\n const popup = targetWindow.open(\n manageUrl(options.walletUrl, targetWindow.location.origin, {\n ...(options.locale === undefined ? {} : { locale: options.locale }),\n ...(options.signIn === undefined ? {} : { signIn: options.signIn }),\n }),\n POPUP_NAME,\n options.popupFeatures ?? defaultPopupFeatures(targetWindow),\n );\n\n if (!popup) {\n throw new ManagerError(\n \"popup_blocked\",\n \"Your browser blocked the Assetera Wallet window. Allow pop-ups for this site and try again.\",\n );\n }\n // A non-optional alias so TypeScript keeps the narrowed type inside the callbacks below.\n const activePopup: Window = popup;\n\n let finished = false;\n let lastSecurity: WalletSecurityStatus | undefined;\n let lastAccounts: WalletAccountName[] | undefined;\n let closeTimer: ReturnType<typeof setInterval> | null = null;\n let resolveClosed!: () => void;\n const closed = new Promise<void>((resolve) => {\n resolveClosed = resolve;\n });\n\n function cleanup(): void {\n if (finished) return;\n finished = true;\n targetWindow.removeEventListener(\"message\", onMessage);\n if (closeTimer !== null) {\n clearInterval(closeTimer);\n closeTimer = null;\n }\n resolveClosed();\n }\n\n function close(): void {\n cleanup();\n if (!activePopup.closed) activePopup.close();\n }\n\n /** A copy of a list of named accounts, so callers never get the manager's own list. */\n function copyAccountNames(accounts: readonly WalletAccountName[]): WalletAccountName[] {\n return accounts.map((account) => ({ address: account.address, name: account.name }));\n }\n\n function onMessage(event: MessageEvent): void {\n // Trust rule: accept only the wallet origin AND the exact pop-up we opened. Ignore everything else.\n if (event.origin !== walletOrigin) return;\n if ((event.source as unknown) !== activePopup) return;\n const data: unknown = event.data;\n if (isSecurityMessage(data)) {\n const status: WalletSecurityStatus = {\n protection: data.data.protection,\n passkeys: data.data.passkeys,\n authenticatorApps: data.data.authenticatorApps,\n };\n lastSecurity = status;\n options.onSecurity?.(status);\n return;\n }\n if (isAccountsMessage(data)) {\n lastAccounts = copyAccountNames(data.data);\n options.onAccounts?.(copyAccountNames(lastAccounts));\n }\n }\n\n targetWindow.addEventListener(\"message\", onMessage);\n closeTimer = setInterval(() => {\n if (activePopup.closed) cleanup();\n }, CLOSE_POLL_MS);\n\n return {\n close,\n closed,\n lastSecurity: () => lastSecurity,\n lastAccounts: () => (lastAccounts === undefined ? undefined : copyAccountNames(lastAccounts)),\n };\n}\n"]}
|
package/dist/protocol.cjs
CHANGED
|
@@ -4,6 +4,11 @@
|
|
|
4
4
|
var PROTOCOL_VERSION = 1;
|
|
5
5
|
var CONNECT_PATH = "/connect";
|
|
6
6
|
var ONBOARD_PATH = "/onboard";
|
|
7
|
+
var MANAGE_PATH = "/manage";
|
|
8
|
+
var SIGN_IN_HINTS = ["assetera-marketplace"];
|
|
9
|
+
function isSignInHint(value) {
|
|
10
|
+
return SIGN_IN_HINTS.includes(value);
|
|
11
|
+
}
|
|
7
12
|
var MESSAGE_PREFIX = "assetera-wallet:";
|
|
8
13
|
var SUPPORTED_METHODS = [
|
|
9
14
|
"eth_requestAccounts",
|
|
@@ -48,6 +53,42 @@ function isResponseMessage(value) {
|
|
|
48
53
|
function isEventMessage(value) {
|
|
49
54
|
return hasType(value, "event") && (value.event === "accountsChanged" || value.event === "chainChanged" || value.event === "disconnect");
|
|
50
55
|
}
|
|
56
|
+
var WALLET_PROTECTIONS = [
|
|
57
|
+
"unknown",
|
|
58
|
+
"add-factor",
|
|
59
|
+
"save-codes",
|
|
60
|
+
"create-codes",
|
|
61
|
+
"protected"
|
|
62
|
+
];
|
|
63
|
+
function isCount(value) {
|
|
64
|
+
return typeof value === "number" && Number.isInteger(value) && value >= 0;
|
|
65
|
+
}
|
|
66
|
+
function isSecurityMessage(value) {
|
|
67
|
+
if (!hasType(value, "security")) return false;
|
|
68
|
+
const data = value.data;
|
|
69
|
+
return isRecord(data) && typeof data.protection === "string" && WALLET_PROTECTIONS.includes(data.protection) && isCount(data.passkeys) && isCount(data.authenticatorApps);
|
|
70
|
+
}
|
|
71
|
+
var MAX_ACCOUNT_NAMES = 50;
|
|
72
|
+
function hasControlCharacter(value) {
|
|
73
|
+
for (const character of value) {
|
|
74
|
+
const code = character.codePointAt(0) ?? 0;
|
|
75
|
+
if (code <= 31 || code >= 127 && code <= 159) return true;
|
|
76
|
+
}
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
function isAccountName(value) {
|
|
80
|
+
if (typeof value !== "string") return false;
|
|
81
|
+
if (hasControlCharacter(value)) return false;
|
|
82
|
+
const trimmed = value.trim();
|
|
83
|
+
return trimmed.length >= 1 && trimmed.length <= 64;
|
|
84
|
+
}
|
|
85
|
+
function isAccountsMessage(value) {
|
|
86
|
+
if (!hasType(value, "accounts")) return false;
|
|
87
|
+
const data = value.data;
|
|
88
|
+
return Array.isArray(data) && data.length <= MAX_ACCOUNT_NAMES && data.every(
|
|
89
|
+
(entry) => isRecord(entry) && typeof entry.address === "string" && EVM_ADDRESS_RE.test(entry.address) && isAccountName(entry.name)
|
|
90
|
+
);
|
|
91
|
+
}
|
|
51
92
|
function isRequestMessage(value) {
|
|
52
93
|
return hasType(value, "request") && typeof value.id === "string" && typeof value.method === "string";
|
|
53
94
|
}
|
|
@@ -65,10 +106,11 @@ function isOnboardCancelledMessage(value) {
|
|
|
65
106
|
function isCaip2EvmChain(value) {
|
|
66
107
|
return /^eip155:\d{1,32}$/.test(value);
|
|
67
108
|
}
|
|
68
|
-
function connectUrl(walletUrl, partnerOrigin) {
|
|
109
|
+
function connectUrl(walletUrl, partnerOrigin, signIn) {
|
|
69
110
|
const url = new URL(CONNECT_PATH, walletUrl);
|
|
70
111
|
url.searchParams.set("origin", partnerOrigin);
|
|
71
112
|
url.searchParams.set("v", String(PROTOCOL_VERSION));
|
|
113
|
+
if (signIn !== void 0) url.searchParams.set("signIn", signIn);
|
|
72
114
|
return url.toString();
|
|
73
115
|
}
|
|
74
116
|
function onboardUrl(walletUrl, partnerOrigin, options) {
|
|
@@ -78,16 +120,28 @@ function onboardUrl(walletUrl, partnerOrigin, options) {
|
|
|
78
120
|
url.searchParams.set("chain", options.chain);
|
|
79
121
|
if (options.locale !== void 0) url.searchParams.set("lang", options.locale);
|
|
80
122
|
if (options.add) url.searchParams.set("add", "1");
|
|
123
|
+
if (options.signIn !== void 0) url.searchParams.set("signIn", options.signIn);
|
|
124
|
+
return url.toString();
|
|
125
|
+
}
|
|
126
|
+
function manageUrl(walletUrl, partnerOrigin, options = {}) {
|
|
127
|
+
const url = new URL(MANAGE_PATH, walletUrl);
|
|
128
|
+
url.searchParams.set("origin", partnerOrigin);
|
|
129
|
+
url.searchParams.set("v", String(PROTOCOL_VERSION));
|
|
130
|
+
if (options.locale !== void 0) url.searchParams.set("lang", options.locale);
|
|
131
|
+
if (options.signIn !== void 0) url.searchParams.set("signIn", options.signIn);
|
|
81
132
|
return url.toString();
|
|
82
133
|
}
|
|
83
134
|
|
|
84
135
|
exports.CONNECT_PATH = CONNECT_PATH;
|
|
136
|
+
exports.MANAGE_PATH = MANAGE_PATH;
|
|
85
137
|
exports.MESSAGE_PREFIX = MESSAGE_PREFIX;
|
|
86
138
|
exports.ONBOARD_PATH = ONBOARD_PATH;
|
|
87
139
|
exports.PROTOCOL_VERSION = PROTOCOL_VERSION;
|
|
88
140
|
exports.RpcErrorCode = RpcErrorCode;
|
|
141
|
+
exports.SIGN_IN_HINTS = SIGN_IN_HINTS;
|
|
89
142
|
exports.SUPPORTED_METHODS = SUPPORTED_METHODS;
|
|
90
143
|
exports.connectUrl = connectUrl;
|
|
144
|
+
exports.isAccountsMessage = isAccountsMessage;
|
|
91
145
|
exports.isCaip2EvmChain = isCaip2EvmChain;
|
|
92
146
|
exports.isDisconnectMessage = isDisconnectMessage;
|
|
93
147
|
exports.isEventMessage = isEventMessage;
|
|
@@ -96,7 +150,10 @@ exports.isOnboardedMessage = isOnboardedMessage;
|
|
|
96
150
|
exports.isReadyMessage = isReadyMessage;
|
|
97
151
|
exports.isRequestMessage = isRequestMessage;
|
|
98
152
|
exports.isResponseMessage = isResponseMessage;
|
|
153
|
+
exports.isSecurityMessage = isSecurityMessage;
|
|
154
|
+
exports.isSignInHint = isSignInHint;
|
|
99
155
|
exports.isSupportedMethod = isSupportedMethod;
|
|
156
|
+
exports.manageUrl = manageUrl;
|
|
100
157
|
exports.onboardUrl = onboardUrl;
|
|
101
158
|
//# sourceMappingURL=protocol.cjs.map
|
|
102
159
|
//# sourceMappingURL=protocol.cjs.map
|