@aztec/wallet-sdk 4.1.2 → 4.2.0-aztecnr-rc.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/dest/base-wallet/base_wallet.d.ts +23 -17
- package/dest/base-wallet/base_wallet.d.ts.map +1 -1
- package/dest/base-wallet/base_wallet.js +70 -45
- package/dest/base-wallet/index.d.ts +2 -2
- package/dest/base-wallet/index.d.ts.map +1 -1
- package/dest/crypto.d.ts +39 -1
- package/dest/crypto.d.ts.map +1 -1
- package/dest/crypto.js +88 -0
- package/dest/extension/provider/extension_wallet.d.ts +2 -5
- package/dest/extension/provider/extension_wallet.d.ts.map +1 -1
- package/dest/extension/provider/index.d.ts +2 -2
- package/dest/extension/provider/index.d.ts.map +1 -1
- package/dest/iframe/handlers/iframe_connection_handler.d.ts +118 -0
- package/dest/iframe/handlers/iframe_connection_handler.d.ts.map +1 -0
- package/dest/iframe/handlers/iframe_connection_handler.js +228 -0
- package/dest/iframe/handlers/index.d.ts +2 -0
- package/dest/iframe/handlers/index.d.ts.map +1 -0
- package/dest/iframe/handlers/index.js +1 -0
- package/dest/iframe/provider/iframe_discovery.d.ts +25 -0
- package/dest/iframe/provider/iframe_discovery.d.ts.map +1 -0
- package/dest/iframe/provider/iframe_discovery.js +167 -0
- package/dest/iframe/provider/iframe_provider.d.ts +65 -0
- package/dest/iframe/provider/iframe_provider.d.ts.map +1 -0
- package/dest/iframe/provider/iframe_provider.js +257 -0
- package/dest/iframe/provider/iframe_wallet.d.ts +68 -0
- package/dest/iframe/provider/iframe_wallet.d.ts.map +1 -0
- package/dest/iframe/provider/iframe_wallet.js +200 -0
- package/dest/iframe/provider/index.d.ts +4 -0
- package/dest/iframe/provider/index.d.ts.map +1 -0
- package/dest/iframe/provider/index.js +3 -0
- package/dest/manager/types.d.ts +3 -2
- package/dest/manager/types.d.ts.map +1 -1
- package/dest/manager/wallet_manager.d.ts +1 -1
- package/dest/manager/wallet_manager.d.ts.map +1 -1
- package/dest/manager/wallet_manager.js +46 -16
- package/dest/types.d.ts +14 -2
- package/dest/types.d.ts.map +1 -1
- package/dest/types.js +4 -0
- package/package.json +12 -8
- package/src/base-wallet/base_wallet.ts +122 -78
- package/src/base-wallet/index.ts +1 -1
- package/src/crypto.ts +104 -0
- package/src/extension/provider/extension_wallet.ts +1 -6
- package/src/extension/provider/index.ts +1 -1
- package/src/iframe/handlers/iframe_connection_handler.ts +328 -0
- package/src/iframe/handlers/index.ts +7 -0
- package/src/iframe/provider/iframe_discovery.ts +185 -0
- package/src/iframe/provider/iframe_provider.ts +331 -0
- package/src/iframe/provider/iframe_wallet.ts +229 -0
- package/src/iframe/provider/index.ts +3 -0
- package/src/manager/types.ts +2 -1
- package/src/manager/wallet_manager.ts +48 -14
- package/src/types.ts +13 -0
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IframeWalletProvider — implements {@link WalletProvider} for web wallets loaded in iframes.
|
|
3
|
+
*
|
|
4
|
+
* Flow (mirrors ExtensionProvider):
|
|
5
|
+
* 1. Creates an `<iframe src="walletUrl">` (in app-provided container or floating panel)
|
|
6
|
+
* 2. Waits for WALLET_READY message from the iframe
|
|
7
|
+
* 3. Sends DISCOVERY → waits for DISCOVERY_RESPONSE
|
|
8
|
+
* 4. Sends KEY_EXCHANGE_REQUEST (ECDH public key) → waits for KEY_EXCHANGE_RESPONSE
|
|
9
|
+
* 5. Derives shared session keys, exposes verificationHash
|
|
10
|
+
* 6. On confirm(): returns IframeWallet backed by the established session
|
|
11
|
+
*/ import { deriveSessionKeys, exportPublicKey, generateKeyPair, importPublicKey } from '../../crypto.js';
|
|
12
|
+
import { WalletMessageType } from '../../types.js';
|
|
13
|
+
import { IframeWallet } from './iframe_wallet.js';
|
|
14
|
+
const READY_TIMEOUT_MS = 15_000;
|
|
15
|
+
const DISCOVERY_TIMEOUT_MS = 15_000;
|
|
16
|
+
const KEY_EXCHANGE_TIMEOUT_MS = 15_000;
|
|
17
|
+
/**
|
|
18
|
+
* A {@link WalletProvider} that connects to a web wallet loaded in a cross-origin iframe.
|
|
19
|
+
*
|
|
20
|
+
* Discovered via {@link discoverWebWallets} and used through the standard
|
|
21
|
+
* `WalletProvider.establishSecureChannel()` flow.
|
|
22
|
+
*/ export class IframeWalletProvider {
|
|
23
|
+
id;
|
|
24
|
+
name;
|
|
25
|
+
icon;
|
|
26
|
+
walletUrl;
|
|
27
|
+
chainInfo;
|
|
28
|
+
type;
|
|
29
|
+
iframe;
|
|
30
|
+
_container;
|
|
31
|
+
_appOwnsContainer;
|
|
32
|
+
_dragCleanup;
|
|
33
|
+
wallet;
|
|
34
|
+
_disconnected;
|
|
35
|
+
disconnectCallbacks;
|
|
36
|
+
constructor(/** Unique wallet identifier. */ id, /** Display name for the wallet. */ name, /** Optional wallet icon URL. */ icon, walletUrl, chainInfo){
|
|
37
|
+
this.id = id;
|
|
38
|
+
this.name = name;
|
|
39
|
+
this.icon = icon;
|
|
40
|
+
this.walletUrl = walletUrl;
|
|
41
|
+
this.chainInfo = chainInfo;
|
|
42
|
+
this.type = 'web';
|
|
43
|
+
this.iframe = null;
|
|
44
|
+
this._container = null;
|
|
45
|
+
this._appOwnsContainer = false;
|
|
46
|
+
this._dragCleanup = null;
|
|
47
|
+
this.wallet = null;
|
|
48
|
+
this._disconnected = false;
|
|
49
|
+
this.disconnectCallbacks = [];
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Establishes a secure encrypted channel with the iframe wallet.
|
|
53
|
+
*
|
|
54
|
+
* @param appId - Application identifier for the requesting dApp
|
|
55
|
+
* @param options - Optional container element for the iframe
|
|
56
|
+
* @returns A {@link PendingConnection} with verification hash and confirm/cancel
|
|
57
|
+
*/ async establishSecureChannel(appId, options) {
|
|
58
|
+
const iframe = document.createElement('iframe');
|
|
59
|
+
iframe.src = this.walletUrl;
|
|
60
|
+
iframe.style.cssText = 'flex:1;border:none;width:100%;height:100%;display:block;';
|
|
61
|
+
iframe.allow = 'storage-access; cross-origin-isolated';
|
|
62
|
+
this.iframe = iframe;
|
|
63
|
+
if (options?.container) {
|
|
64
|
+
this._appOwnsContainer = true;
|
|
65
|
+
options.container.appendChild(iframe);
|
|
66
|
+
} else {
|
|
67
|
+
this.createFloatingPanel(iframe);
|
|
68
|
+
}
|
|
69
|
+
const walletOrigin = new URL(this.walletUrl).origin;
|
|
70
|
+
const post = (msg)=>{
|
|
71
|
+
if (!iframe.contentWindow) {
|
|
72
|
+
throw new Error('Iframe not ready');
|
|
73
|
+
}
|
|
74
|
+
iframe.contentWindow.postMessage(msg, walletOrigin);
|
|
75
|
+
};
|
|
76
|
+
await waitForMessage((msg)=>msg.type === WalletMessageType.WALLET_READY, READY_TIMEOUT_MS, walletOrigin);
|
|
77
|
+
const requestId = globalThis.crypto.randomUUID();
|
|
78
|
+
post({
|
|
79
|
+
type: WalletMessageType.DISCOVERY,
|
|
80
|
+
requestId,
|
|
81
|
+
appId
|
|
82
|
+
});
|
|
83
|
+
const discoveryResp = await waitForMessage((msg)=>msg.type === WalletMessageType.DISCOVERY_RESPONSE && msg.requestId === requestId, DISCOVERY_TIMEOUT_MS, walletOrigin);
|
|
84
|
+
const walletInfo = discoveryResp.walletInfo;
|
|
85
|
+
const keyPair = await generateKeyPair();
|
|
86
|
+
const dAppPublicKey = await exportPublicKey(keyPair.publicKey);
|
|
87
|
+
post({
|
|
88
|
+
type: WalletMessageType.KEY_EXCHANGE_REQUEST,
|
|
89
|
+
requestId,
|
|
90
|
+
publicKey: dAppPublicKey
|
|
91
|
+
});
|
|
92
|
+
const keyExchangeResp = await waitForMessage((msg)=>msg.type === WalletMessageType.KEY_EXCHANGE_RESPONSE && msg.requestId === requestId, KEY_EXCHANGE_TIMEOUT_MS, walletOrigin);
|
|
93
|
+
const walletPublicKey = await importPublicKey(keyExchangeResp.publicKey);
|
|
94
|
+
const sessionKeys = await deriveSessionKeys(keyPair, walletPublicKey, true);
|
|
95
|
+
const { verificationHash, encryptionKey: sharedKey } = sessionKeys;
|
|
96
|
+
const iframeWallet = IframeWallet.create(walletInfo.id, requestId, iframe.contentWindow, walletOrigin, sharedKey, this.chainInfo, appId);
|
|
97
|
+
this.wallet = iframeWallet;
|
|
98
|
+
iframeWallet.onDisconnect(()=>{
|
|
99
|
+
this._disconnected = true;
|
|
100
|
+
for (const cb of this.disconnectCallbacks){
|
|
101
|
+
try {
|
|
102
|
+
cb();
|
|
103
|
+
} catch {
|
|
104
|
+
// ignore
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
let cancelled = false;
|
|
109
|
+
return {
|
|
110
|
+
verificationHash,
|
|
111
|
+
confirm: ()=>{
|
|
112
|
+
if (cancelled) {
|
|
113
|
+
throw new Error('Connection was cancelled');
|
|
114
|
+
}
|
|
115
|
+
return Promise.resolve(iframeWallet.asWallet());
|
|
116
|
+
},
|
|
117
|
+
cancel: ()=>{
|
|
118
|
+
cancelled = true;
|
|
119
|
+
this.cleanup();
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
disconnect() {
|
|
124
|
+
if (this.wallet && !this.wallet.isDisconnected()) {
|
|
125
|
+
this.wallet.disconnect();
|
|
126
|
+
}
|
|
127
|
+
this.cleanup();
|
|
128
|
+
return Promise.resolve();
|
|
129
|
+
}
|
|
130
|
+
onDisconnect(callback) {
|
|
131
|
+
this.disconnectCallbacks.push(callback);
|
|
132
|
+
return ()=>{
|
|
133
|
+
const i = this.disconnectCallbacks.indexOf(callback);
|
|
134
|
+
if (i !== -1) {
|
|
135
|
+
this.disconnectCallbacks.splice(i, 1);
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
isDisconnected() {
|
|
140
|
+
return this._disconnected;
|
|
141
|
+
}
|
|
142
|
+
// ── Floating panel creation ─────────────────────────────────────────────────
|
|
143
|
+
createFloatingPanel(iframe) {
|
|
144
|
+
const W = 420, H = 500;
|
|
145
|
+
const initLeft = window.innerWidth - W - 24;
|
|
146
|
+
const initTop = window.innerHeight - H - 24;
|
|
147
|
+
const container = document.createElement('div');
|
|
148
|
+
container.style.cssText = `
|
|
149
|
+
position:fixed;left:${initLeft}px;top:${initTop}px;width:${W}px;height:${H}px;
|
|
150
|
+
border-radius:12px;box-shadow:0 8px 32px rgba(0,0,0,0.4);z-index:999999;
|
|
151
|
+
overflow:hidden;display:flex;flex-direction:column;user-select:none;
|
|
152
|
+
`;
|
|
153
|
+
const dragHandle = document.createElement('div');
|
|
154
|
+
dragHandle.style.cssText = `
|
|
155
|
+
height:28px;min-height:28px;background:rgba(30,30,30,0.95);cursor:grab;
|
|
156
|
+
display:flex;align-items:center;justify-content:center;
|
|
157
|
+
border-bottom:1px solid rgba(255,255,255,0.08);flex-shrink:0;
|
|
158
|
+
`;
|
|
159
|
+
dragHandle.innerHTML = `<span style="color:rgba(255,255,255,0.3);font-size:14px;letter-spacing:4px">⋮⋮⋮</span>`;
|
|
160
|
+
const resizeHandle = document.createElement('div');
|
|
161
|
+
resizeHandle.style.cssText = 'position:absolute;bottom:0;right:0;width:16px;height:16px;cursor:se-resize;z-index:1;';
|
|
162
|
+
resizeHandle.innerHTML = `<svg width="16" height="16" style="opacity:0.3;display:block"><path d="M2 14 L14 2 M6 14 L14 6 M10 14 L14 10" stroke="white" stroke-width="1.5"/></svg>`;
|
|
163
|
+
container.appendChild(dragHandle);
|
|
164
|
+
container.appendChild(iframe);
|
|
165
|
+
container.appendChild(resizeHandle);
|
|
166
|
+
document.body.appendChild(container);
|
|
167
|
+
this._container = container;
|
|
168
|
+
let dragging = false;
|
|
169
|
+
let dragOffsetX = 0, dragOffsetY = 0;
|
|
170
|
+
dragHandle.addEventListener('mousedown', (e)=>{
|
|
171
|
+
dragging = true;
|
|
172
|
+
dragHandle.style.cursor = 'grabbing';
|
|
173
|
+
const rect = container.getBoundingClientRect();
|
|
174
|
+
dragOffsetX = e.clientX - rect.left;
|
|
175
|
+
dragOffsetY = e.clientY - rect.top;
|
|
176
|
+
iframe.style.pointerEvents = 'none';
|
|
177
|
+
e.preventDefault();
|
|
178
|
+
});
|
|
179
|
+
let resizing = false;
|
|
180
|
+
let resizeStartX = 0, resizeStartY = 0;
|
|
181
|
+
let resizeStartW = 0, resizeStartH = 0;
|
|
182
|
+
const MIN_W = 280, MIN_H = 320;
|
|
183
|
+
resizeHandle.addEventListener('mousedown', (e)=>{
|
|
184
|
+
resizing = true;
|
|
185
|
+
resizeStartX = e.clientX;
|
|
186
|
+
resizeStartY = e.clientY;
|
|
187
|
+
resizeStartW = container.offsetWidth;
|
|
188
|
+
resizeStartH = container.offsetHeight;
|
|
189
|
+
iframe.style.pointerEvents = 'none';
|
|
190
|
+
e.preventDefault();
|
|
191
|
+
e.stopPropagation();
|
|
192
|
+
});
|
|
193
|
+
const onMouseMove = (e)=>{
|
|
194
|
+
if (dragging) {
|
|
195
|
+
const newLeft = Math.max(0, Math.min(window.innerWidth - container.offsetWidth, e.clientX - dragOffsetX));
|
|
196
|
+
const newTop = Math.max(0, Math.min(window.innerHeight - container.offsetHeight, e.clientY - dragOffsetY));
|
|
197
|
+
container.style.left = `${newLeft}px`;
|
|
198
|
+
container.style.top = `${newTop}px`;
|
|
199
|
+
} else if (resizing) {
|
|
200
|
+
const newW = Math.max(MIN_W, resizeStartW + (e.clientX - resizeStartX));
|
|
201
|
+
const newH = Math.max(MIN_H, resizeStartH + (e.clientY - resizeStartY));
|
|
202
|
+
container.style.width = `${newW}px`;
|
|
203
|
+
container.style.height = `${newH}px`;
|
|
204
|
+
}
|
|
205
|
+
};
|
|
206
|
+
const onMouseUp = ()=>{
|
|
207
|
+
if (dragging) {
|
|
208
|
+
dragHandle.style.cursor = 'grab';
|
|
209
|
+
}
|
|
210
|
+
dragging = false;
|
|
211
|
+
resizing = false;
|
|
212
|
+
iframe.style.pointerEvents = '';
|
|
213
|
+
};
|
|
214
|
+
document.addEventListener('mousemove', onMouseMove);
|
|
215
|
+
document.addEventListener('mouseup', onMouseUp);
|
|
216
|
+
this._dragCleanup = ()=>{
|
|
217
|
+
document.removeEventListener('mousemove', onMouseMove);
|
|
218
|
+
document.removeEventListener('mouseup', onMouseUp);
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
cleanup() {
|
|
222
|
+
this._dragCleanup?.();
|
|
223
|
+
this._dragCleanup = null;
|
|
224
|
+
if (this._appOwnsContainer) {
|
|
225
|
+
if (this.iframe && this.iframe.parentNode) {
|
|
226
|
+
this.iframe.parentNode.removeChild(this.iframe);
|
|
227
|
+
}
|
|
228
|
+
} else if (this._container && this._container.parentNode) {
|
|
229
|
+
this._container.parentNode.removeChild(this._container);
|
|
230
|
+
}
|
|
231
|
+
this._container = null;
|
|
232
|
+
this.iframe = null;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
/** @internal */ function waitForMessage(predicate, timeoutMs, expectedOrigin) {
|
|
236
|
+
return new Promise((resolve, reject)=>{
|
|
237
|
+
const timer = setTimeout(()=>{
|
|
238
|
+
window.removeEventListener('message', handler);
|
|
239
|
+
reject(new Error(`Iframe wallet: timed out waiting for message (${timeoutMs}ms)`));
|
|
240
|
+
}, timeoutMs);
|
|
241
|
+
/** Handles incoming postMessage events, filtering by origin and predicate. */ function handler(event) {
|
|
242
|
+
if (event.origin !== expectedOrigin) {
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
const msg = event.data;
|
|
246
|
+
if (!msg || typeof msg !== 'object') {
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
if (predicate(msg)) {
|
|
250
|
+
clearTimeout(timer);
|
|
251
|
+
window.removeEventListener('message', handler);
|
|
252
|
+
resolve(msg);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
window.addEventListener('message', handler);
|
|
256
|
+
});
|
|
257
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IframeWallet — Wallet proxy that communicates with a web wallet loaded in an iframe.
|
|
3
|
+
*
|
|
4
|
+
* This mirrors {@link ExtensionWallet} from `@aztec/wallet-sdk/extension/provider` but uses
|
|
5
|
+
* `window.postMessage` / `window.addEventListener('message')` instead of MessagePort.
|
|
6
|
+
*
|
|
7
|
+
* The wire protocol (encrypted {@link WalletMessage} / {@link WalletResponse}) is identical.
|
|
8
|
+
*/
|
|
9
|
+
import type { ChainInfo } from '@aztec/aztec.js/account';
|
|
10
|
+
import { type Wallet } from '@aztec/aztec.js/wallet';
|
|
11
|
+
import { type DisconnectCallback } from '../../types.js';
|
|
12
|
+
/**
|
|
13
|
+
* A wallet implementation that communicates with a web wallet loaded in an iframe
|
|
14
|
+
* using encrypted postMessage.
|
|
15
|
+
*
|
|
16
|
+
* Uses the same Proxy pattern as {@link ExtensionWallet}: intercepts property access,
|
|
17
|
+
* checks if the property is a Wallet method via {@link WalletSchema}, and routes the
|
|
18
|
+
* call through an encrypted postMessage channel.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```typescript
|
|
22
|
+
* const wallet = IframeWallet.create(walletId, sessionId, iframeWindow, walletOrigin, sharedKey, chainInfo, appId);
|
|
23
|
+
* const accounts = await wallet.asWallet().getAccounts();
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export declare class IframeWallet {
|
|
27
|
+
private chainInfo;
|
|
28
|
+
private appId;
|
|
29
|
+
private walletId;
|
|
30
|
+
private sessionId;
|
|
31
|
+
private iframeWindow;
|
|
32
|
+
private walletOrigin;
|
|
33
|
+
private sharedKey;
|
|
34
|
+
private inFlight;
|
|
35
|
+
private disconnected;
|
|
36
|
+
private disconnectCallbacks;
|
|
37
|
+
private messageListener;
|
|
38
|
+
private constructor();
|
|
39
|
+
/**
|
|
40
|
+
* Creates a proxied IframeWallet that implements the {@link Wallet} interface.
|
|
41
|
+
*
|
|
42
|
+
* All Wallet method calls are intercepted by a Proxy, encrypted with the shared
|
|
43
|
+
* AES-256-GCM key, sent via postMessage, and the response is decrypted and
|
|
44
|
+
* validated against {@link WalletSchema}.
|
|
45
|
+
*
|
|
46
|
+
* @param walletId - Unique identifier of the remote wallet
|
|
47
|
+
* @param sessionId - Session identifier from the key exchange
|
|
48
|
+
* @param iframeWindow - The iframe's contentWindow to post messages to
|
|
49
|
+
* @param walletOrigin - Origin of the wallet iframe (for postMessage targeting)
|
|
50
|
+
* @param sharedKey - AES-256-GCM key derived from ECDH key exchange
|
|
51
|
+
* @param chainInfo - Network information (chainId and version)
|
|
52
|
+
* @param appId - Application identifier for the requesting dApp
|
|
53
|
+
* @returns A proxied IframeWallet — call `.asWallet()` to get the typed `Wallet`
|
|
54
|
+
*/
|
|
55
|
+
static create(walletId: string, sessionId: string, iframeWindow: Window, walletOrigin: string, sharedKey: CryptoKey, chainInfo: ChainInfo, appId: string): IframeWallet;
|
|
56
|
+
/**
|
|
57
|
+
* Returns this wallet as a typed {@link Wallet} interface.
|
|
58
|
+
* When accessed through the Proxy (via `create()`), returns the proxy itself.
|
|
59
|
+
*/
|
|
60
|
+
asWallet(): Wallet;
|
|
61
|
+
private handleEncryptedResponse;
|
|
62
|
+
private postMessage;
|
|
63
|
+
private handleDisconnect;
|
|
64
|
+
onDisconnect(callback: DisconnectCallback): () => void;
|
|
65
|
+
isDisconnected(): boolean;
|
|
66
|
+
disconnect(): void;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWZyYW1lX3dhbGxldC5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2lmcmFtZS9wcm92aWRlci9pZnJhbWVfd2FsbGV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7O0dBT0c7QUFDSCxPQUFPLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsS0FBSyxNQUFNLEVBQWdCLE1BQU0sd0JBQXdCLENBQUM7QUFPbkUsT0FBTyxFQUFFLEtBQUssa0JBQWtCLEVBQThELE1BQU0sZ0JBQWdCLENBQUM7QUFhckg7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILHFCQUFhLFlBQVk7SUFPckIsT0FBTyxDQUFDLFNBQVM7SUFDakIsT0FBTyxDQUFDLEtBQUs7SUFDYixPQUFPLENBQUMsUUFBUTtJQUNoQixPQUFPLENBQUMsU0FBUztJQUNqQixPQUFPLENBQUMsWUFBWTtJQUNwQixPQUFPLENBQUMsWUFBWTtJQUNwQixPQUFPLENBQUMsU0FBUztJQVpuQixPQUFPLENBQUMsUUFBUSxDQUFvRDtJQUNwRSxPQUFPLENBQUMsWUFBWSxDQUFTO0lBQzdCLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBNEI7SUFDdkQsT0FBTyxDQUFDLGVBQWUsQ0FBNEM7SUFFbkUsT0FBTyxlQVFIO0lBRUo7Ozs7Ozs7Ozs7Ozs7OztPQWVHO0lBQ0gsTUFBTSxDQUFDLE1BQU0sQ0FDWCxRQUFRLEVBQUUsTUFBTSxFQUNoQixTQUFTLEVBQUUsTUFBTSxFQUNqQixZQUFZLEVBQUUsTUFBTSxFQUNwQixZQUFZLEVBQUUsTUFBTSxFQUNwQixTQUFTLEVBQUUsU0FBUyxFQUNwQixTQUFTLEVBQUUsU0FBUyxFQUNwQixLQUFLLEVBQUUsTUFBTSxHQUNaLFlBQVksQ0FxQ2Q7SUFFRDs7O09BR0c7SUFDSCxRQUFRLElBQUksTUFBTSxDQUVqQjtZQUVhLHVCQUF1QjtZQXlCdkIsV0FBVztJQTBCekIsT0FBTyxDQUFDLGdCQUFnQjtJQTBCeEIsWUFBWSxDQUFDLFFBQVEsRUFBRSxrQkFBa0IsR0FBRyxNQUFNLElBQUksQ0FRckQ7SUFFRCxjQUFjLElBQUksT0FBTyxDQUV4QjtJQUVELFVBQVUsSUFBSSxJQUFJLENBTWpCO0NBQ0YifQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iframe_wallet.d.ts","sourceRoot":"","sources":["../../../src/iframe/provider/iframe_wallet.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,wBAAwB,CAAC;AAOnE,OAAO,EAAE,KAAK,kBAAkB,EAA8D,MAAM,gBAAgB,CAAC;AAarH;;;;;;;;;;;;;GAaG;AACH,qBAAa,YAAY;IAOrB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,SAAS;IAZnB,OAAO,CAAC,QAAQ,CAAoD;IACpE,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,mBAAmB,CAA4B;IACvD,OAAO,CAAC,eAAe,CAA4C;IAEnE,OAAO,eAQH;IAEJ;;;;;;;;;;;;;;;OAeG;IACH,MAAM,CAAC,MAAM,CACX,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,MAAM,GACZ,YAAY,CAqCd;IAED;;;OAGG;IACH,QAAQ,IAAI,MAAM,CAEjB;YAEa,uBAAuB;YAyBvB,WAAW;IA0BzB,OAAO,CAAC,gBAAgB;IA0BxB,YAAY,CAAC,QAAQ,EAAE,kBAAkB,GAAG,MAAM,IAAI,CAQrD;IAED,cAAc,IAAI,OAAO,CAExB;IAED,UAAU,IAAI,IAAI,CAMjB;CACF"}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IframeWallet — Wallet proxy that communicates with a web wallet loaded in an iframe.
|
|
3
|
+
*
|
|
4
|
+
* This mirrors {@link ExtensionWallet} from `@aztec/wallet-sdk/extension/provider` but uses
|
|
5
|
+
* `window.postMessage` / `window.addEventListener('message')` instead of MessagePort.
|
|
6
|
+
*
|
|
7
|
+
* The wire protocol (encrypted {@link WalletMessage} / {@link WalletResponse}) is identical.
|
|
8
|
+
*/ import { WalletSchema } from '@aztec/aztec.js/wallet';
|
|
9
|
+
import { jsonStringify } from '@aztec/foundation/json-rpc';
|
|
10
|
+
import { promiseWithResolvers } from '@aztec/foundation/promise';
|
|
11
|
+
import { schemaHasMethod } from '@aztec/foundation/schemas';
|
|
12
|
+
import { decrypt, encrypt } from '../../crypto.js';
|
|
13
|
+
import { WalletMessageType } from '../../types.js';
|
|
14
|
+
/**
|
|
15
|
+
* A wallet implementation that communicates with a web wallet loaded in an iframe
|
|
16
|
+
* using encrypted postMessage.
|
|
17
|
+
*
|
|
18
|
+
* Uses the same Proxy pattern as {@link ExtensionWallet}: intercepts property access,
|
|
19
|
+
* checks if the property is a Wallet method via {@link WalletSchema}, and routes the
|
|
20
|
+
* call through an encrypted postMessage channel.
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```typescript
|
|
24
|
+
* const wallet = IframeWallet.create(walletId, sessionId, iframeWindow, walletOrigin, sharedKey, chainInfo, appId);
|
|
25
|
+
* const accounts = await wallet.asWallet().getAccounts();
|
|
26
|
+
* ```
|
|
27
|
+
*/ export class IframeWallet {
|
|
28
|
+
chainInfo;
|
|
29
|
+
appId;
|
|
30
|
+
walletId;
|
|
31
|
+
sessionId;
|
|
32
|
+
iframeWindow;
|
|
33
|
+
walletOrigin;
|
|
34
|
+
sharedKey;
|
|
35
|
+
inFlight;
|
|
36
|
+
disconnected;
|
|
37
|
+
disconnectCallbacks;
|
|
38
|
+
messageListener;
|
|
39
|
+
constructor(chainInfo, appId, walletId, sessionId, iframeWindow, walletOrigin, sharedKey){
|
|
40
|
+
this.chainInfo = chainInfo;
|
|
41
|
+
this.appId = appId;
|
|
42
|
+
this.walletId = walletId;
|
|
43
|
+
this.sessionId = sessionId;
|
|
44
|
+
this.iframeWindow = iframeWindow;
|
|
45
|
+
this.walletOrigin = walletOrigin;
|
|
46
|
+
this.sharedKey = sharedKey;
|
|
47
|
+
this.inFlight = new Map();
|
|
48
|
+
this.disconnected = false;
|
|
49
|
+
this.disconnectCallbacks = [];
|
|
50
|
+
this.messageListener = null;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Creates a proxied IframeWallet that implements the {@link Wallet} interface.
|
|
54
|
+
*
|
|
55
|
+
* All Wallet method calls are intercepted by a Proxy, encrypted with the shared
|
|
56
|
+
* AES-256-GCM key, sent via postMessage, and the response is decrypted and
|
|
57
|
+
* validated against {@link WalletSchema}.
|
|
58
|
+
*
|
|
59
|
+
* @param walletId - Unique identifier of the remote wallet
|
|
60
|
+
* @param sessionId - Session identifier from the key exchange
|
|
61
|
+
* @param iframeWindow - The iframe's contentWindow to post messages to
|
|
62
|
+
* @param walletOrigin - Origin of the wallet iframe (for postMessage targeting)
|
|
63
|
+
* @param sharedKey - AES-256-GCM key derived from ECDH key exchange
|
|
64
|
+
* @param chainInfo - Network information (chainId and version)
|
|
65
|
+
* @param appId - Application identifier for the requesting dApp
|
|
66
|
+
* @returns A proxied IframeWallet — call `.asWallet()` to get the typed `Wallet`
|
|
67
|
+
*/ static create(walletId, sessionId, iframeWindow, walletOrigin, sharedKey, chainInfo, appId) {
|
|
68
|
+
const wallet = new IframeWallet(chainInfo, appId, walletId, sessionId, iframeWindow, walletOrigin, sharedKey);
|
|
69
|
+
wallet.messageListener = (event)=>{
|
|
70
|
+
if (event.origin !== walletOrigin) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const msg = event.data;
|
|
74
|
+
if (!msg || typeof msg !== 'object') {
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
if (msg.type === WalletMessageType.SECURE_RESPONSE && msg.sessionId === sessionId) {
|
|
78
|
+
void wallet.handleEncryptedResponse(msg.encrypted);
|
|
79
|
+
} else if (msg.type === WalletMessageType.SESSION_DISCONNECTED && msg.sessionId === sessionId) {
|
|
80
|
+
wallet.handleDisconnect();
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
window.addEventListener('message', wallet.messageListener);
|
|
84
|
+
return new Proxy(wallet, {
|
|
85
|
+
get: (target, prop, receiver)=>{
|
|
86
|
+
if (prop === 'asWallet') {
|
|
87
|
+
return ()=>receiver;
|
|
88
|
+
} else if (schemaHasMethod(WalletSchema, prop.toString())) {
|
|
89
|
+
return async (...args)=>{
|
|
90
|
+
const result = await target.postMessage({
|
|
91
|
+
type: prop.toString(),
|
|
92
|
+
args
|
|
93
|
+
});
|
|
94
|
+
return WalletSchema[prop.toString()].returnType().parseAsync(result);
|
|
95
|
+
};
|
|
96
|
+
} else {
|
|
97
|
+
return target[prop];
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Returns this wallet as a typed {@link Wallet} interface.
|
|
104
|
+
* When accessed through the Proxy (via `create()`), returns the proxy itself.
|
|
105
|
+
*/ asWallet() {
|
|
106
|
+
return this;
|
|
107
|
+
}
|
|
108
|
+
async handleEncryptedResponse(encrypted) {
|
|
109
|
+
try {
|
|
110
|
+
const response = await decrypt(this.sharedKey, encrypted);
|
|
111
|
+
const { messageId, result, error, walletId: responseWalletId } = response;
|
|
112
|
+
if (!messageId || responseWalletId !== this.walletId) {
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
const pending = this.inFlight.get(messageId);
|
|
116
|
+
if (!pending) {
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
if (error) {
|
|
120
|
+
pending.reject(new Error(jsonStringify(error)));
|
|
121
|
+
} else {
|
|
122
|
+
pending.resolve(result);
|
|
123
|
+
}
|
|
124
|
+
this.inFlight.delete(messageId);
|
|
125
|
+
} catch {
|
|
126
|
+
// Decryption errors are silently ignored (message not for us or corrupted)
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
async postMessage(call) {
|
|
130
|
+
if (this.disconnected) {
|
|
131
|
+
throw new Error('Wallet has been disconnected');
|
|
132
|
+
}
|
|
133
|
+
const messageId = globalThis.crypto.randomUUID();
|
|
134
|
+
const message = {
|
|
135
|
+
type: call.type,
|
|
136
|
+
args: call.args,
|
|
137
|
+
messageId,
|
|
138
|
+
chainInfo: this.chainInfo,
|
|
139
|
+
appId: this.appId,
|
|
140
|
+
walletId: this.walletId
|
|
141
|
+
};
|
|
142
|
+
const encrypted = await encrypt(this.sharedKey, jsonStringify(message));
|
|
143
|
+
this.iframeWindow.postMessage({
|
|
144
|
+
type: WalletMessageType.SECURE_MESSAGE,
|
|
145
|
+
sessionId: this.sessionId,
|
|
146
|
+
encrypted
|
|
147
|
+
}, this.walletOrigin);
|
|
148
|
+
const { promise, resolve, reject } = promiseWithResolvers();
|
|
149
|
+
this.inFlight.set(messageId, {
|
|
150
|
+
promise,
|
|
151
|
+
resolve,
|
|
152
|
+
reject
|
|
153
|
+
});
|
|
154
|
+
return promise;
|
|
155
|
+
}
|
|
156
|
+
handleDisconnect() {
|
|
157
|
+
if (this.disconnected) {
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
this.disconnected = true;
|
|
161
|
+
if (this.messageListener) {
|
|
162
|
+
window.removeEventListener('message', this.messageListener);
|
|
163
|
+
this.messageListener = null;
|
|
164
|
+
}
|
|
165
|
+
const error = new Error('Wallet disconnected');
|
|
166
|
+
for (const { reject } of this.inFlight.values()){
|
|
167
|
+
reject(error);
|
|
168
|
+
}
|
|
169
|
+
this.inFlight.clear();
|
|
170
|
+
for (const cb of this.disconnectCallbacks){
|
|
171
|
+
try {
|
|
172
|
+
cb();
|
|
173
|
+
} catch {
|
|
174
|
+
// Ignore errors in disconnect callbacks
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
onDisconnect(callback) {
|
|
179
|
+
this.disconnectCallbacks.push(callback);
|
|
180
|
+
return ()=>{
|
|
181
|
+
const i = this.disconnectCallbacks.indexOf(callback);
|
|
182
|
+
if (i !== -1) {
|
|
183
|
+
this.disconnectCallbacks.splice(i, 1);
|
|
184
|
+
}
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
isDisconnected() {
|
|
188
|
+
return this.disconnected;
|
|
189
|
+
}
|
|
190
|
+
disconnect() {
|
|
191
|
+
if (this.disconnected) {
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
this.iframeWindow.postMessage({
|
|
195
|
+
type: WalletMessageType.DISCONNECT,
|
|
196
|
+
sessionId: this.sessionId
|
|
197
|
+
}, this.walletOrigin);
|
|
198
|
+
this.handleDisconnect();
|
|
199
|
+
}
|
|
200
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { IframeWallet } from './iframe_wallet.js';
|
|
2
|
+
export { IframeWalletProvider, type IframeConnectionOptions } from './iframe_provider.js';
|
|
3
|
+
export { discoverWebWallets } from './iframe_discovery.js';
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9pZnJhbWUvcHJvdmlkZXIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxLQUFLLHVCQUF1QixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDMUYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sdUJBQXVCLENBQUMifQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/iframe/provider/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,KAAK,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC1F,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC"}
|
package/dest/manager/types.d.ts
CHANGED
|
@@ -87,6 +87,7 @@ export interface WalletProvider {
|
|
|
87
87
|
* matches their wallet before calling `confirm()`.
|
|
88
88
|
*
|
|
89
89
|
* @param appId - Application identifier for the requesting dapp
|
|
90
|
+
* @param options - Optional provider-specific options (e.g. container element for iframe wallets)
|
|
90
91
|
* @returns A pending connection with verification hash and confirm/cancel methods
|
|
91
92
|
*
|
|
92
93
|
* @example
|
|
@@ -101,7 +102,7 @@ export interface WalletProvider {
|
|
|
101
102
|
* const wallet = await pending.confirm();
|
|
102
103
|
* ```
|
|
103
104
|
*/
|
|
104
|
-
establishSecureChannel(appId: string): Promise<PendingConnection>;
|
|
105
|
+
establishSecureChannel(appId: string, options?: Record<string, unknown>): Promise<PendingConnection>;
|
|
105
106
|
/**
|
|
106
107
|
* Disconnects the current wallet and cleans up resources.
|
|
107
108
|
* After calling this, the wallet returned from confirm() should no longer be used.
|
|
@@ -164,4 +165,4 @@ export interface DiscoverySession {
|
|
|
164
165
|
/** Cancel discovery immediately and clean up resources */
|
|
165
166
|
cancel: () => void;
|
|
166
167
|
}
|
|
167
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
168
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tYW5hZ2VyL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRXJEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sV0FBVyxpQkFBaUI7SUFDaEM7Ozs7T0FJRztJQUNILGdCQUFnQixFQUFFLE1BQU0sQ0FBQztJQUV6Qjs7O09BR0c7SUFDSCxPQUFPLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRTNCOzs7T0FHRztJQUNILE1BQU0sSUFBSSxJQUFJLENBQUM7Q0FDaEI7QUFFRDs7R0FFRztBQUNILE1BQU0sV0FBVyxxQkFBcUI7SUFDcEMsNENBQTRDO0lBQzVDLE9BQU8sRUFBRSxPQUFPLENBQUM7SUFDakIseURBQXlEO0lBQ3pELFNBQVMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDO0lBQ3JCLHlEQUF5RDtJQUN6RCxTQUFTLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQztDQUN0QjtBQUVEOztHQUVHO0FBQ0gsTUFBTSxXQUFXLGVBQWU7SUFDOUIsa0NBQWtDO0lBQ2xDLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztDQUNoQjtBQUVEOztHQUVHO0FBQ0gsTUFBTSxXQUFXLG1CQUFtQjtJQUNsQyxxQ0FBcUM7SUFDckMsVUFBVSxDQUFDLEVBQUUscUJBQXFCLENBQUM7SUFDbkMsK0JBQStCO0lBQy9CLFVBQVUsQ0FBQyxFQUFFLGVBQWUsQ0FBQztDQUM5QjtBQUVEOztHQUVHO0FBQ0gsTUFBTSxNQUFNLGtCQUFrQixHQUFHLFdBQVcsR0FBRyxLQUFLLENBQUM7QUFFckQ7O0dBRUc7QUFDSCxNQUFNLE1BQU0sNkJBQTZCLEdBQUcsTUFBTSxJQUFJLENBQUM7QUFFdkQ7OztHQUdHO0FBQ0gsTUFBTSxXQUFXLGNBQWM7SUFDN0IseUNBQXlDO0lBQ3pDLEVBQUUsRUFBRSxNQUFNLENBQUM7SUFDWCw4QkFBOEI7SUFDOUIsSUFBSSxFQUFFLGtCQUFrQixDQUFDO0lBQ3pCLG1CQUFtQjtJQUNuQixJQUFJLEVBQUUsTUFBTSxDQUFDO0lBQ2IsZUFBZTtJQUNmLElBQUksQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUNkLDBCQUEwQjtJQUMxQixRQUFRLENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ25DOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQXVCRztJQUNILHNCQUFzQixDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUNyRzs7OztPQUlHO0lBQ0gsVUFBVSxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1Qjs7OztPQUlHO0lBQ0gsWUFBWSxDQUFDLFFBQVEsRUFBRSw2QkFBNkIsR0FBRyxNQUFNLElBQUksQ0FBQztJQUNsRTs7O09BR0c7SUFDSCxjQUFjLElBQUksT0FBTyxDQUFDO0NBQzNCO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFdBQVcsc0JBQXNCO0lBQ3JDLHFDQUFxQztJQUNyQyxTQUFTLEVBQUUsU0FBUyxDQUFDO0lBQ3JCLHdDQUF3QztJQUN4QyxLQUFLLEVBQUUsTUFBTSxDQUFDO0lBQ2QsOERBQThEO0lBQzlELE9BQU8sQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUNqQjs7OztPQUlHO0lBQ0gsa0JBQWtCLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxjQUFjLEtBQUssSUFBSSxDQUFDO0NBQ3pEO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUNILE1BQU0sV0FBVyxnQkFBZ0I7SUFDL0Isd0VBQXdFO0lBQ3hFLE9BQU8sRUFBRSxhQUFhLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDdkMscUVBQXFFO0lBQ3JFLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEIsMERBQTBEO0lBQzFELE1BQU0sRUFBRSxNQUFNLElBQUksQ0FBQztDQUNwQiJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/manager/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAErD;;;;;;;;;GASG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;;OAIG;IACH,gBAAgB,EAAE,MAAM,CAAC;IAEzB;;;OAGG;IACH,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAE3B;;;OAGG;IACH,MAAM,IAAI,IAAI,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,4CAA4C;IAC5C,OAAO,EAAE,OAAO,CAAC;IACjB,yDAAyD;IACzD,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,yDAAyD;IACzD,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,kCAAkC;IAClC,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,qCAAqC;IACrC,UAAU,CAAC,EAAE,qBAAqB,CAAC;IACnC,+BAA+B;IAC/B,UAAU,CAAC,EAAE,eAAe,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,WAAW,GAAG,KAAK,CAAC;AAErD;;GAEG;AACH,MAAM,MAAM,6BAA6B,GAAG,MAAM,IAAI,CAAC;AAEvD;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,yCAAyC;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,8BAA8B;IAC9B,IAAI,EAAE,kBAAkB,CAAC;IACzB,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,eAAe;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0BAA0B;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/manager/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAErD;;;;;;;;;GASG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;;OAIG;IACH,gBAAgB,EAAE,MAAM,CAAC;IAEzB;;;OAGG;IACH,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAE3B;;;OAGG;IACH,MAAM,IAAI,IAAI,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,4CAA4C;IAC5C,OAAO,EAAE,OAAO,CAAC;IACjB,yDAAyD;IACzD,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,yDAAyD;IACzD,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,kCAAkC;IAClC,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,qCAAqC;IACrC,UAAU,CAAC,EAAE,qBAAqB,CAAC;IACnC,+BAA+B;IAC/B,UAAU,CAAC,EAAE,eAAe,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,WAAW,GAAG,KAAK,CAAC;AAErD;;GAEG;AACH,MAAM,MAAM,6BAA6B,GAAG,MAAM,IAAI,CAAC;AAEvD;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,yCAAyC;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,8BAA8B;IAC9B,IAAI,EAAE,kBAAkB,CAAC;IACzB,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,eAAe;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0BAA0B;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACrG;;;;OAIG;IACH,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B;;;;OAIG;IACH,YAAY,CAAC,QAAQ,EAAE,6BAA6B,GAAG,MAAM,IAAI,CAAC;IAClE;;;OAGG;IACH,cAAc,IAAI,OAAO,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,qCAAqC;IACrC,SAAS,EAAE,SAAS,CAAC;IACrB,wCAAwC;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,8DAA8D;IAC9D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,CAAC,QAAQ,EAAE,cAAc,KAAK,IAAI,CAAC;CACzD;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,WAAW,gBAAgB;IAC/B,wEAAwE;IACxE,OAAO,EAAE,aAAa,CAAC,cAAc,CAAC,CAAC;IACvC,qEAAqE;IACrE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACpB,0DAA0D;IAC1D,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB"}
|
|
@@ -67,4 +67,4 @@ export declare class WalletManager {
|
|
|
67
67
|
*/
|
|
68
68
|
private isExtensionAllowed;
|
|
69
69
|
}
|
|
70
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
70
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0X21hbmFnZXIuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tYW5hZ2VyL3dhbGxldF9tYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU1BLE9BQU8sS0FBSyxFQUNWLHNCQUFzQixFQUN0QixnQkFBZ0IsRUFJaEIsbUJBQW1CLEVBRXBCLE1BQU0sWUFBWSxDQUFDO0FBRXBCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4Qkc7QUFDSCxxQkFBYSxhQUFhO0lBQ3hCLE9BQU8sQ0FBQyxNQUFNLENBR1o7SUFFRixPQUFPLGVBQWlCO0lBRXhCOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLG1CQUFtQixHQUFHLGFBQWEsQ0FPM0Q7SUFFRDs7Ozs7Ozs7Ozs7O09BWUc7SUFDSCxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsc0JBQXNCLEdBQUcsZ0JBQWdCLENBOEdyRTtJQUVEOzs7Ozs7T0FNRztJQUNILE9BQU8sQ0FBQyxrQ0FBa0M7SUEwRTFDOzs7O09BSUc7SUFDSCxPQUFPLENBQUMsa0JBQWtCO0NBVzNCIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wallet_manager.d.ts","sourceRoot":"","sources":["../../src/manager/wallet_manager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"wallet_manager.d.ts","sourceRoot":"","sources":["../../src/manager/wallet_manager.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,sBAAsB,EACtB,gBAAgB,EAIhB,mBAAmB,EAEpB,MAAM,YAAY,CAAC;AAEpB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAGZ;IAEF,OAAO,eAAiB;IAExB;;;OAGG;IACH,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,mBAAmB,GAAG,aAAa,CAO3D;IAED;;;;;;;;;;;;OAYG;IACH,mBAAmB,CAAC,OAAO,EAAE,sBAAsB,GAAG,gBAAgB,CA8GrE;IAED;;;;;;OAMG;IACH,OAAO,CAAC,kCAAkC;IA0E1C;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;CAW3B"}
|