@ultraos/wallet-sdk 0.3.0 → 0.3.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/dist/index.mjs ADDED
@@ -0,0 +1,589 @@
1
+ // src/lib/interfaces/error-enum.js
2
+ var SdkErrorCode;
3
+ (function(SdkErrorCode2) {
4
+ SdkErrorCode2[SdkErrorCode2["USER_REJECTED_REQUEST"] = 4001] = "USER_REJECTED_REQUEST";
5
+ SdkErrorCode2[SdkErrorCode2["WALLET_HANDSHAKE_TIMEOUT"] = 4300] = "WALLET_HANDSHAKE_TIMEOUT";
6
+ SdkErrorCode2[SdkErrorCode2["WALLET_WINDOW_UNAVAILABLE"] = 4301] = "WALLET_WINDOW_UNAVAILABLE";
7
+ SdkErrorCode2[SdkErrorCode2["REQUESTED_RESOURCE_NOT_AVAILABLE"] = 32002] = "REQUESTED_RESOURCE_NOT_AVAILABLE";
8
+ SdkErrorCode2[SdkErrorCode2["UNKNOWN_ERROR"] = -32604] = "UNKNOWN_ERROR";
9
+ })(SdkErrorCode || (SdkErrorCode = {}));
10
+ var SDK_ERROR_MESSAGE = {
11
+ [SdkErrorCode.USER_REJECTED_REQUEST]: "The user rejected the request.",
12
+ [SdkErrorCode.WALLET_HANDSHAKE_TIMEOUT]: "Timeout to connect with the web wallet.",
13
+ [SdkErrorCode.WALLET_WINDOW_UNAVAILABLE]: "Wallet window blocked by browser or failed to open.",
14
+ [SdkErrorCode.REQUESTED_RESOURCE_NOT_AVAILABLE]: "Requested resource not available.",
15
+ [SdkErrorCode.UNKNOWN_ERROR]: "Unknown error occurred."
16
+ };
17
+
18
+ // src/lib/interfaces/purchase-item.interface.js
19
+ var PurchaseItemType;
20
+ (function(PurchaseItemType2) {
21
+ PurchaseItemType2["UNIQ_FACTORY"] = "UniqFactory";
22
+ PurchaseItemType2["GAME_FACTORY"] = "GameFactory";
23
+ })(PurchaseItemType || (PurchaseItemType = {}));
24
+
25
+ // src/lib/interfaces/wallet-provider-response.interface.js
26
+ var ResponseStatus;
27
+ (function(ResponseStatus2) {
28
+ ResponseStatus2["SUCCESS"] = "success";
29
+ ResponseStatus2["FAIL"] = "fail";
30
+ ResponseStatus2["ERROR"] = "error";
31
+ })(ResponseStatus || (ResponseStatus = {}));
32
+
33
+ // src/lib/config/ultra-wallet-sdk.config.js
34
+ var UltraWalletSdkConfig = Object.freeze({
35
+ width: 420,
36
+ height: 815,
37
+ walletUrls: {
38
+ mainnet: "https://web-wallet.ultra.io",
39
+ testnet: "https://web-wallet.staging.ultra.io"
40
+ },
41
+ networkInfo: {
42
+ mainnet: {
43
+ chainId: "a9c481dfbc7d9506dc7e87e9a137c931b0a9303f64fd7a1d08b8230133920097"
44
+ },
45
+ testnet: {
46
+ chainId: "7fc56be645bb76ab9d747b53089f132dcb7681db06f0852cfa03eaf6f7ac80e9"
47
+ }
48
+ },
49
+ checkWindowInterval: 500,
50
+ handshakeTimeout: 1e4
51
+ });
52
+ var ultra_wallet_sdk_config_default = UltraWalletSdkConfig;
53
+
54
+ // src/lib/utils/chain-validator.js
55
+ function isValidChain(targetNetwork, walletChainId) {
56
+ const { chainId } = ultra_wallet_sdk_config_default.networkInfo[targetNetwork] || {};
57
+ return !chainId || chainId === walletChainId;
58
+ }
59
+
60
+ // src/lib/providers/extension-provider/extension.provider.js
61
+ var HEARTBEAT_INTERVAL_MS = 2e3;
62
+ var ExtensionProvider = class {
63
+ /**
64
+ * Access window.ultra typed as UltraWalletProvider.
65
+ * At runtime, window.ultra is a Proxy that handles all SDK method calls.
66
+ * We cast here rather than declaring a global Window augmentation to avoid
67
+ * conflicting with the app-level window.d.ts which types window.ultra as IUltraInternalAPI.
68
+ */
69
+ get walletProvider() {
70
+ return window.ultra;
71
+ }
72
+ constructor(options) {
73
+ this.options = options;
74
+ this.eventListeners = /* @__PURE__ */ new Map();
75
+ this.listenerIds = /* @__PURE__ */ new Map();
76
+ this.heartbeatTimer = null;
77
+ this.messageHandler = null;
78
+ this.initWindowEventListener();
79
+ }
80
+ /**
81
+ * Wire-format match: the BG's MessageType.EVENT serialises as the uppercase
82
+ * string 'EVENT'. We uppercase the incoming type so a future SDK build that
83
+ * emits lowercase (or any case variant) still dispatches. Payload shape:
84
+ * `{ event, origin, data }`.
85
+ */
86
+ initWindowEventListener() {
87
+ if (typeof window === "undefined")
88
+ return;
89
+ if (this.messageHandler)
90
+ return;
91
+ this.messageHandler = (event) => {
92
+ if (event.source !== window || !event.data)
93
+ return;
94
+ const msg = event.data;
95
+ const msgType = typeof msg.type === "string" ? msg.type.toUpperCase() : "";
96
+ if (msgType !== "EVENT" || !msg.payload)
97
+ return;
98
+ const eventName = msg.payload.event;
99
+ if (!eventName)
100
+ return;
101
+ const cbs = this.eventListeners.get(eventName);
102
+ if (cbs)
103
+ cbs.forEach((cb) => cb(msg.payload.data));
104
+ };
105
+ window.addEventListener("message", this.messageHandler);
106
+ }
107
+ async connect(params) {
108
+ const { data: chainId } = await this.walletProvider.getChainId();
109
+ if (!isValidChain(this.options?.environment, chainId)) {
110
+ throw new Error(`Wallet environment mismatch: expected "${this.options?.environment}" chain, but received "${chainId}". Please verify the SDK configuration and the connected network.`);
111
+ }
112
+ const result = await this.walletProvider.connect(params);
113
+ if (result?.status === "success") {
114
+ this.listenerIds.clear();
115
+ for (const event of this.eventListeners.keys()) {
116
+ void this.registerListenerWithExtension(event);
117
+ }
118
+ }
119
+ return result;
120
+ }
121
+ disconnect() {
122
+ return this.walletProvider.disconnect();
123
+ }
124
+ signMessage(message) {
125
+ return this.walletProvider.signMessage(message);
126
+ }
127
+ signTransaction(transaction, options) {
128
+ return this.walletProvider.signTransaction(transaction, options);
129
+ }
130
+ getChainId() {
131
+ return this.walletProvider.getChainId();
132
+ }
133
+ purchaseItem(itemType, itemId) {
134
+ return this.walletProvider.purchaseItem(itemType, itemId);
135
+ }
136
+ getAccounts() {
137
+ return this.walletProvider.getAccounts();
138
+ }
139
+ getSelectedAccount() {
140
+ return this.walletProvider.getSelectedAccount();
141
+ }
142
+ getAvailableAuthorizations() {
143
+ return this.walletProvider.getAvailableAuthorizations();
144
+ }
145
+ on(event, callback) {
146
+ this.initWindowEventListener();
147
+ const cbs = this.eventListeners.get(event) ?? [];
148
+ cbs.push(callback);
149
+ this.eventListeners.set(event, cbs);
150
+ void this.registerListenerWithExtension(event);
151
+ this.ensureHeartbeat();
152
+ }
153
+ off(event, callback) {
154
+ const cbs = this.eventListeners.get(event);
155
+ if (!cbs)
156
+ return;
157
+ const idx = cbs.indexOf(callback);
158
+ if (idx >= 0)
159
+ cbs.splice(idx, 1);
160
+ if (cbs.length === 0) {
161
+ this.eventListeners.delete(event);
162
+ void this.deregisterListenerWithExtension(event);
163
+ }
164
+ }
165
+ switchNetwork(chainId) {
166
+ return this.walletProvider.switchNetwork(chainId);
167
+ }
168
+ getNetwork() {
169
+ return this.walletProvider.getNetwork();
170
+ }
171
+ getNetworks() {
172
+ return this.walletProvider.getNetworks();
173
+ }
174
+ addNetwork(params) {
175
+ return this.walletProvider.addNetwork(params);
176
+ }
177
+ /**
178
+ * Detach the window message listener and clear timers + maps. Safe to call
179
+ * multiple times. Does NOT deregister each listener on the BG — the BG
180
+ * GCs on tab close (verified via the S5(b) dedup work + tab-close cleanup
181
+ * in `EventsService.removeTabListeners`). Calling N RPCs at dispose-time
182
+ * would slow the page-unload path for no benefit.
183
+ */
184
+ dispose() {
185
+ if (this.heartbeatTimer != null) {
186
+ clearInterval(this.heartbeatTimer);
187
+ this.heartbeatTimer = null;
188
+ }
189
+ if (this.messageHandler && typeof window !== "undefined") {
190
+ window.removeEventListener("message", this.messageHandler);
191
+ this.messageHandler = null;
192
+ }
193
+ this.eventListeners.clear();
194
+ this.listenerIds.clear();
195
+ }
196
+ async registerListenerWithExtension(event) {
197
+ if (!this.isExtensionAvailable())
198
+ return;
199
+ const id = this.listenerIds.get(event) ?? this.generateListenerId();
200
+ this.listenerIds.set(event, id);
201
+ try {
202
+ const result = this.walletProvider.addExtensionListener?.(event, id);
203
+ if (result && typeof result.catch === "function") {
204
+ result.catch(() => void 0);
205
+ }
206
+ } catch {
207
+ }
208
+ }
209
+ async deregisterListenerWithExtension(event) {
210
+ if (!this.isExtensionAvailable())
211
+ return;
212
+ const id = this.listenerIds.get(event);
213
+ if (!id)
214
+ return;
215
+ this.listenerIds.delete(event);
216
+ try {
217
+ const result = this.walletProvider.removeExtensionListener?.(event, id);
218
+ if (result && typeof result.catch === "function") {
219
+ result.catch(() => void 0);
220
+ }
221
+ } catch {
222
+ }
223
+ }
224
+ ensureHeartbeat() {
225
+ if (this.heartbeatTimer != null || typeof window === "undefined")
226
+ return;
227
+ this.heartbeatTimer = setInterval(() => this.heartbeatTick(), HEARTBEAT_INTERVAL_MS);
228
+ }
229
+ heartbeatTick() {
230
+ if (!this.isExtensionAvailable())
231
+ return;
232
+ let hasAny = false;
233
+ for (const cbs of this.eventListeners.values()) {
234
+ if (cbs.length > 0) {
235
+ hasAny = true;
236
+ break;
237
+ }
238
+ }
239
+ if (!hasAny)
240
+ return;
241
+ for (const event of this.eventListeners.keys()) {
242
+ void this.registerListenerWithExtension(event);
243
+ }
244
+ }
245
+ isExtensionAvailable() {
246
+ return typeof window !== "undefined" && !!window.ultra;
247
+ }
248
+ generateListenerId() {
249
+ if (typeof crypto !== "undefined" && typeof crypto.randomUUID === "function") {
250
+ return crypto.randomUUID();
251
+ }
252
+ return Math.random().toString(36).slice(2) + Date.now().toString(36);
253
+ }
254
+ };
255
+
256
+ // src/lib/common/client-messenger.js
257
+ import { JSONRPCClient } from "json-rpc-2.0";
258
+
259
+ // src/lib/common/client-error.js
260
+ var ClientError = class extends Error {
261
+ constructor(code, data) {
262
+ super();
263
+ this.code = code;
264
+ this.data = data;
265
+ this.message = SDK_ERROR_MESSAGE[code];
266
+ this.name = this.constructor.name;
267
+ }
268
+ };
269
+
270
+ // src/lib/common/client-messenger.js
271
+ var ClientMessenger = class {
272
+ constructor(windowManager) {
273
+ this.pendingRequest = false;
274
+ this.windowManager = windowManager;
275
+ this.initializeRpcClient();
276
+ this.setupMessageListener();
277
+ }
278
+ initializeRpcClient() {
279
+ this.rpcClient = new JSONRPCClient((request) => {
280
+ const walletWindow = this.windowManager.getWalletWindow();
281
+ if (!walletWindow) {
282
+ return Promise.reject(new ClientError(SdkErrorCode.WALLET_WINDOW_UNAVAILABLE));
283
+ }
284
+ walletWindow.postMessage(request, this.windowManager.walletUrl);
285
+ return Promise.resolve();
286
+ });
287
+ }
288
+ setupMessageListener() {
289
+ window.addEventListener("message", (event) => {
290
+ if (event.origin === this.windowManager.walletUrl && event.data?.jsonrpc === "2.0") {
291
+ this.rpcClient.receive(event.data);
292
+ }
293
+ });
294
+ }
295
+ async sendRequest(requestMethod, requestParams) {
296
+ if (this.pendingRequest && !this.isWalletWindowClosed()) {
297
+ throw this.createErrorResponse(SdkErrorCode.REQUESTED_RESOURCE_NOT_AVAILABLE);
298
+ }
299
+ this.pendingRequest = true;
300
+ try {
301
+ this.windowManager.openOrReuseWallet();
302
+ const walletWindow = this.ensureWalletWindow();
303
+ return await this.executeRequest(walletWindow, requestMethod, requestParams);
304
+ } finally {
305
+ this.pendingRequest = false;
306
+ }
307
+ }
308
+ isWalletWindowClosed() {
309
+ return this.windowManager.getWalletWindow()?.closed === true;
310
+ }
311
+ ensureWalletWindow() {
312
+ const walletWindow = this.windowManager.getWalletWindow();
313
+ if (!walletWindow) {
314
+ throw this.createErrorResponse(SdkErrorCode.WALLET_WINDOW_UNAVAILABLE);
315
+ }
316
+ return walletWindow;
317
+ }
318
+ async executeRequest(walletWindow, requestMethod, requestParams) {
319
+ await this.waitForWalletReady(walletWindow);
320
+ return this.processRpcRequest(walletWindow, requestMethod, requestParams);
321
+ }
322
+ async waitForWalletReady(walletWindow) {
323
+ return this.withWindowMonitoring(walletWindow, () => {
324
+ return new Promise((resolve, reject) => {
325
+ let isResolved = false;
326
+ let timeoutId;
327
+ const cleanup = () => {
328
+ if (isResolved)
329
+ return;
330
+ isResolved = true;
331
+ clearTimeout(timeoutId);
332
+ window.removeEventListener("message", handleWalletHandshake);
333
+ };
334
+ const handleWalletHandshake = (event) => {
335
+ if (!this.isValidReadyMessage(event))
336
+ return;
337
+ cleanup();
338
+ resolve();
339
+ };
340
+ const handleTimeout = () => {
341
+ cleanup();
342
+ walletWindow.close();
343
+ reject(this.createErrorResponse(SdkErrorCode.WALLET_HANDSHAKE_TIMEOUT));
344
+ };
345
+ window.addEventListener("message", handleWalletHandshake);
346
+ timeoutId = setTimeout(handleTimeout, ultra_wallet_sdk_config_default.handshakeTimeout);
347
+ });
348
+ });
349
+ }
350
+ async processRpcRequest(walletWindow, requestMethod, requestParams) {
351
+ return this.withWindowMonitoring(walletWindow, async () => {
352
+ let result;
353
+ try {
354
+ result = await this.rpcClient.request(requestMethod, requestParams);
355
+ } catch (error) {
356
+ const clientError = new ClientError(SdkErrorCode.UNKNOWN_ERROR, error);
357
+ throw {
358
+ status: ResponseStatus.ERROR,
359
+ ...clientError
360
+ };
361
+ } finally {
362
+ if (result?.status === ResponseStatus.SUCCESS) {
363
+ return result;
364
+ } else {
365
+ throw result;
366
+ }
367
+ }
368
+ });
369
+ }
370
+ async withWindowMonitoring(walletWindow, operation) {
371
+ return new Promise((resolve, reject) => {
372
+ const intervalId = setInterval(() => {
373
+ if (walletWindow.closed) {
374
+ clearInterval(intervalId);
375
+ reject(this.createErrorResponse(SdkErrorCode.USER_REJECTED_REQUEST));
376
+ }
377
+ }, ultra_wallet_sdk_config_default.checkWindowInterval);
378
+ operation().then((result) => {
379
+ clearInterval(intervalId);
380
+ resolve(result);
381
+ }).catch((error) => {
382
+ clearInterval(intervalId);
383
+ reject(error);
384
+ });
385
+ });
386
+ }
387
+ isValidReadyMessage(event) {
388
+ if (event.origin !== this.windowManager.walletUrl)
389
+ return false;
390
+ const msg = event.data;
391
+ return msg?.jsonrpc === "2.0" && msg.method === "ready";
392
+ }
393
+ createErrorResponse(errorCode) {
394
+ const { code, message } = new ClientError(errorCode);
395
+ return { status: ResponseStatus.ERROR, code, message, data: null };
396
+ }
397
+ };
398
+
399
+ // src/lib/common/window-manager.js
400
+ var WindowManager = class {
401
+ constructor(walletUrl) {
402
+ this.walletWindow = null;
403
+ this.currentWindow = window;
404
+ this.walletUrl = walletUrl;
405
+ }
406
+ openOrReuseWallet() {
407
+ if (this.walletWindow == null || this.walletWindow.closed) {
408
+ const height = ultra_wallet_sdk_config_default.height;
409
+ const width = ultra_wallet_sdk_config_default.width;
410
+ const top = this.currentWindow.top;
411
+ const left = this.currentWindow.screenLeft + this.currentWindow.innerWidth - width;
412
+ this.walletWindow = window.open(this.walletUrl, "_blank", `width=${width},height=${height},top=${top},left=${left},resizable=0`);
413
+ } else {
414
+ this.walletWindow.focus();
415
+ }
416
+ }
417
+ // Provides a reference to the wallet window
418
+ getWalletWindow() {
419
+ return this.walletWindow;
420
+ }
421
+ };
422
+
423
+ // src/lib/providers/web-provider/web.provider.js
424
+ var WebProvider = class {
425
+ constructor(options) {
426
+ this.options = options;
427
+ this.windowManager = new WindowManager(this.resolveWalletUrl());
428
+ this.clientMessenger = new ClientMessenger(this.windowManager);
429
+ }
430
+ connect(options) {
431
+ return this.clientMessenger.sendRequest("connect", { options });
432
+ }
433
+ disconnect() {
434
+ return this.clientMessenger.sendRequest("disconnect", {});
435
+ }
436
+ signMessage(message) {
437
+ return this.clientMessenger.sendRequest("signMessage", { message });
438
+ }
439
+ signTransaction(transaction, options) {
440
+ return this.clientMessenger.sendRequest("signTransaction", { transaction, options });
441
+ }
442
+ async getChainId() {
443
+ const environment = this.options?.environment || "mainnet";
444
+ switch (environment) {
445
+ case "mainnet":
446
+ const mainnetChainId = ultra_wallet_sdk_config_default.networkInfo.mainnet.chainId;
447
+ return {
448
+ status: ResponseStatus.SUCCESS,
449
+ data: mainnetChainId
450
+ };
451
+ case "testnet":
452
+ const testnetChainId = ultra_wallet_sdk_config_default.networkInfo.testnet.chainId;
453
+ return {
454
+ status: ResponseStatus.SUCCESS,
455
+ data: testnetChainId
456
+ };
457
+ default:
458
+ return this.clientMessenger.sendRequest("getChainId", {});
459
+ }
460
+ }
461
+ purchaseItem(itemType, itemId) {
462
+ return this.clientMessenger.sendRequest("purchaseItem", {
463
+ itemType,
464
+ itemId
465
+ });
466
+ }
467
+ getAccounts() {
468
+ return this.clientMessenger.sendRequest("getAccounts", {});
469
+ }
470
+ getSelectedAccount() {
471
+ return this.clientMessenger.sendRequest("getSelectedAccount", {});
472
+ }
473
+ getAvailableAuthorizations() {
474
+ return this.clientMessenger.sendRequest("getAvailableAuthorizations", {});
475
+ }
476
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
477
+ on(_event, _callback) {
478
+ }
479
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
480
+ off(_event, _callback) {
481
+ }
482
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
483
+ switchNetwork(_chainId) {
484
+ throw new Error("Not supported in web provider");
485
+ }
486
+ getNetwork() {
487
+ throw new Error("Not supported in web provider");
488
+ }
489
+ getNetworks() {
490
+ throw new Error("Not supported in web provider");
491
+ }
492
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
493
+ addNetwork(_params) {
494
+ throw new Error("Not supported in web provider");
495
+ }
496
+ dispose() {
497
+ }
498
+ resolveWalletUrl() {
499
+ const env = ultra_wallet_sdk_config_default.walletUrls[this.options?.environment || "mainnet"];
500
+ return env || this.options.environment;
501
+ }
502
+ };
503
+
504
+ // src/lib/utils/detection.js
505
+ function isExtensionAvailable() {
506
+ return typeof window !== "undefined" && "ultra" in window;
507
+ }
508
+
509
+ // src/lib/ultra-wallet-sdk.js
510
+ var UltraWalletSDK = class {
511
+ /**
512
+ * Constructs an UltraWalletClient instance.
513
+ * If the Ultra Wallet Extension is available (window.ultra), it will be used automatically.
514
+ * If the Extension is not available, the Web Wallet provider will be initialized using the given network options.
515
+ *
516
+ * @param {UltraWalletSdkOptions} [options] - Configuration options for the Web Wallet fallback (environment or custom URL).
517
+ */
518
+ constructor(options) {
519
+ this.options = options;
520
+ this.provider = this.resolveWalletProvider();
521
+ }
522
+ connect(params) {
523
+ return this.provider.connect(params);
524
+ }
525
+ disconnect() {
526
+ return this.provider.disconnect();
527
+ }
528
+ signMessage(message) {
529
+ return this.provider.signMessage(message);
530
+ }
531
+ signTransaction(transaction, options) {
532
+ return this.provider.signTransaction(transaction, options);
533
+ }
534
+ getChainId() {
535
+ return this.provider.getChainId();
536
+ }
537
+ purchaseItem(itemType, itemId) {
538
+ return this.provider.purchaseItem(itemType, itemId);
539
+ }
540
+ getAccounts() {
541
+ return this.provider.getAccounts();
542
+ }
543
+ getSelectedAccount() {
544
+ return this.provider.getSelectedAccount();
545
+ }
546
+ getAvailableAuthorizations() {
547
+ return this.provider.getAvailableAuthorizations();
548
+ }
549
+ on(event, callback) {
550
+ this.provider.on(event, callback);
551
+ }
552
+ off(event, callback) {
553
+ this.provider.off(event, callback);
554
+ }
555
+ switchNetwork(chainId) {
556
+ return this.provider.switchNetwork(chainId);
557
+ }
558
+ getNetwork() {
559
+ return this.provider.getNetwork();
560
+ }
561
+ getNetworks() {
562
+ return this.provider.getNetworks();
563
+ }
564
+ addNetwork(params) {
565
+ return this.provider.addNetwork(params);
566
+ }
567
+ dispose() {
568
+ this.provider.dispose();
569
+ }
570
+ resolveWalletProvider() {
571
+ const requestedProvider = this.options?.provider;
572
+ if (requestedProvider === "extension") {
573
+ return new ExtensionProvider(this.options);
574
+ }
575
+ if (requestedProvider === "web") {
576
+ return new WebProvider(this.options);
577
+ }
578
+ const extensionAvailable = isExtensionAvailable();
579
+ return extensionAvailable ? new ExtensionProvider(this.options) : new WebProvider(this.options);
580
+ }
581
+ };
582
+ export {
583
+ PurchaseItemType,
584
+ ResponseStatus,
585
+ SDK_ERROR_MESSAGE,
586
+ SdkErrorCode,
587
+ UltraWalletSDK
588
+ };
589
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../libs/wallet-sdk/src/lib/interfaces/error-enum.ts", "../../../../libs/wallet-sdk/src/lib/interfaces/purchase-item.interface.ts", "../../../../libs/wallet-sdk/src/lib/interfaces/wallet-provider-response.interface.ts", "../../../../libs/wallet-sdk/src/lib/config/ultra-wallet-sdk.config.ts", "../../../../libs/wallet-sdk/src/lib/utils/chain-validator.ts", "../../../../libs/wallet-sdk/src/lib/providers/extension-provider/extension.provider.ts", "../../../../libs/wallet-sdk/src/lib/common/client-messenger.ts", "../../../../libs/wallet-sdk/src/lib/common/client-error.ts", "../../../../libs/wallet-sdk/src/lib/common/window-manager.ts", "../../../../libs/wallet-sdk/src/lib/providers/web-provider/web.provider.ts", "../../../../libs/wallet-sdk/src/lib/utils/detection.ts", "../../../../libs/wallet-sdk/src/lib/ultra-wallet-sdk.ts"],
4
+ "sourcesContent": ["export enum SdkErrorCode {\n USER_REJECTED_REQUEST = 4001,\n WALLET_HANDSHAKE_TIMEOUT = 4300,\n WALLET_WINDOW_UNAVAILABLE = 4301,\n REQUESTED_RESOURCE_NOT_AVAILABLE = 32002,\n UNKNOWN_ERROR = -32604,\n}\n\nexport const SDK_ERROR_MESSAGE: { [key in SdkErrorCode]: string } = {\n [SdkErrorCode.USER_REJECTED_REQUEST]: 'The user rejected the request.',\n [SdkErrorCode.WALLET_HANDSHAKE_TIMEOUT]: 'Timeout to connect with the web wallet.',\n [SdkErrorCode.WALLET_WINDOW_UNAVAILABLE]: 'Wallet window blocked by browser or failed to open.',\n [SdkErrorCode.REQUESTED_RESOURCE_NOT_AVAILABLE]: 'Requested resource not available.',\n [SdkErrorCode.UNKNOWN_ERROR]: 'Unknown error occurred.',\n};\n", "/**\n * Enumeration of supported item types that can be purchased via the Ultra Wallet.\n */\nexport enum PurchaseItemType {\n UNIQ_FACTORY = 'UniqFactory',\n GAME_FACTORY = 'GameFactory',\n}\n", "/**\n * A generic wrapper for all Ultra Wallet SDK responses.\n * Encapsulates the status, data payload, and optional error messaging or codes.\n *\n * @template T The type of the data payload contained in the response.\n */\nexport interface UltraResponse<T = any> {\n /**\n * The status of the response, e.g., success, fail, or error.\n */\n status: ResponseStatus;\n /**\n * The actual response data payload.\n */\n data: T;\n /**\n * Optional end-user-readable message, explaining what went wrong (if applicable).\n */\n message?: string;\n /**\n * Optional error or status code.\n */\n code?: number;\n}\n\n/**\n * Enumeration of possible response statuses returned by the Ultra Wallet SDK.\n */\nexport enum ResponseStatus {\n SUCCESS = 'success',\n FAIL = 'fail',\n ERROR = 'error',\n}\n\n/**\n * Represents the result of a disconnect request.\n * A boolean indicating whether the disconnection was successful.\n */\nexport type DisconnectResponse = boolean;\n\n/**\n * Represents a single permission entry associated with a blockchain account.\n */\nexport interface PermissionInfo {\n /**\n * The permission level name (e.g., \"active\", \"owner\").\n */\n name: string;\n /**\n * The public keys associated with this permission.\n */\n publicKeys: string[];\n}\n\n/**\n * Represents a blockchain account with its associated permissions.\n */\nexport interface AccountInfo {\n /**\n * The blockchain account name.\n */\n accountName: string;\n /**\n * The list of permissions associated with this account.\n */\n permissions: PermissionInfo[];\n}\n\n/**\n * Represents information about the connected blockchain network.\n */\nexport interface NetworkInfo {\n /**\n * The human-readable name of the network (e.g., \"mainnet\", \"testnet\").\n */\n name: string;\n /**\n * The unique chain identifier.\n */\n chainId: string;\n}\n\n/**\n * Extended network information including connection details.\n * Returned by getNetwork, getNetworks, and accepted by addNetwork.\n */\nexport interface NetworkDetails {\n /**\n * The human-readable name of the network (e.g., \"mainnet\", \"testnet\").\n */\n name: string;\n /**\n * The unique chain identifier.\n */\n chainId: string;\n /**\n * The RPC node URL for the network.\n */\n nodeUrl: string;\n /**\n * Whether this is a user-defined custom network.\n */\n isCustom?: boolean;\n}\n\n/**\n * Represents the result of a successful connection request, containing the user's account details.\n * Backward-compatible: legacy fields `blockchainid` and `publicKey` are preserved alongside\n * the new multi-account fields.\n */\nexport type ConnectResult = {\n /**\n * The blockchain network identifier.\n * @deprecated Use `network.chainId` instead.\n */\n blockchainid: string;\n /**\n * The public key associated with the user's account.\n * @deprecated Use `selectedAccount.permissions[n].publicKeys` instead.\n */\n publicKey: string;\n /**\n * All accounts available in the connected wallet.\n */\n accounts?: AccountInfo[];\n /**\n * The currently selected account.\n */\n selectedAccount?: AccountInfo;\n /**\n * Information about the connected blockchain network.\n */\n network?: NetworkInfo;\n};\n\n/**\n * The result structure returned after a successful item purchase using the Ultra Wallet.\n * Contains metadata about the purchased items and the associated blockchain transaction.\n */\nexport interface PurchaseItemResult {\n /**\n * An ID associated with the purchase order, used for support requests if required.\n */\n orderHash: string;\n\n items: {\n /**\n * The ID of the minted Uniq.\n */\n artifactId: string;\n /**\n * The purchased item ID.\n */\n productId: string;\n /**\n * The ID of the transaction in the blockchain, useful for tracking the status and details of the transaction.\n */\n blockchainTransactionId: string;\n }[];\n}\n\n/**\n * Represents the result returned after signing a message with the Ultra Wallet.\n */\nexport interface SignMessageResult {\n signature: string;\n}\n\n/**\n * Represents the result returned after signing a blockchain transaction with the Ultra Wallet.\n */\nexport interface SignTransactionResult {\n /**\n * The hash of the signed blockchain transaction.\n */\n transactionHash?: string;\n /**\n * Authorizations that couldn't be signed because the wallet lacks the keys.\n * Format: [\"account@permission\", ...]\n * Absent or empty means all authorizations were signed.\n */\n unsignedAuth?: string[];\n processed?: {\n id: string;\n block_num: number;\n block_time: string; // ISO timestamp\n producer_block_id: string | null;\n receipt: {\n status: string;\n cpu_usage_us: number;\n net_usage_words: number;\n };\n elapsed: number;\n net_usage: number;\n scheduled: boolean;\n action_traces: ActionTrace[];\n account_ram_delta: any | null;\n except: any | null;\n error_code: number | null;\n };\n}\n\nexport interface ActionTrace {\n action_ordinal: number;\n creator_action_ordinal: number;\n closest_unnotified_ancestor_action_ordinal: number;\n receipt: {\n receiver: string;\n act_digest: string;\n global_sequence: number;\n recv_sequence: number;\n auth_sequence: [string, number][];\n code_sequence: number;\n abi_sequence: number;\n };\n receiver: string;\n act: {\n account: string;\n name: string;\n authorization: {\n actor: string;\n permission: string;\n }[];\n data: {\n from: string;\n to: string;\n quantity: string;\n memo: string;\n };\n hex_data: string;\n };\n context_free: boolean;\n elapsed: number;\n console: string;\n trx_id: string;\n block_num: number;\n block_time: string;\n producer_block_id: string | null;\n account_ram_deltas: any[];\n except: any | null;\n error_code: number | null;\n return_value_hex_data: string;\n inline_traces: ActionTrace[];\n}\n", "interface UltraWalletSdkConfig {\n width: number;\n height: number;\n walletUrls: {\n mainnet: string;\n testnet: string;\n };\n checkWindowInterval: number;\n handshakeTimeout: number;\n networkInfo: Record<\n 'mainnet' | 'testnet',\n {\n chainId: string;\n }\n >;\n}\n\nconst UltraWalletSdkConfig: UltraWalletSdkConfig = Object.freeze({\n width: 420,\n height: 815,\n walletUrls: {\n mainnet: 'https://web-wallet.ultra.io',\n testnet: 'https://web-wallet.staging.ultra.io',\n },\n networkInfo: {\n mainnet: {\n chainId: 'a9c481dfbc7d9506dc7e87e9a137c931b0a9303f64fd7a1d08b8230133920097',\n },\n testnet: {\n chainId: '7fc56be645bb76ab9d747b53089f132dcb7681db06f0852cfa03eaf6f7ac80e9',\n },\n },\n checkWindowInterval: 500,\n handshakeTimeout: 10_000,\n});\n\nexport default UltraWalletSdkConfig;\n", "import UltraWalletSdkConfig from '../config/ultra-wallet-sdk.config';\n\nexport function isValidChain(targetNetwork: string, walletChainId: string): boolean {\n const { chainId } = UltraWalletSdkConfig.networkInfo[targetNetwork] || {};\n return !chainId || chainId === walletChainId;\n}\n", "import {\n AccountInfo,\n AvailableAuth,\n BlockchainTransaction,\n ConnectParams,\n ConnectResult,\n NetworkDetails,\n PurchaseItemResult,\n PurchaseItemType,\n SignMessageResult,\n SignTransactionOptions,\n SignTransactionResult,\n UltraResponse,\n UltraWalletProvider,\n UltraWalletSdkOptions,\n WalletEventType,\n} from '../../interfaces';\nimport { isValidChain } from '../../utils/chain-validator';\n\n/**\n * Internal extension-only API exposed by the wallet's content-script-injected\n * `window.ultra` proxy. Not part of the public `UltraWalletProvider`\n * interface — the SDK calls these to manage listener registration with the\n * extension's background service worker.\n */\ninterface ExtensionListenerAPI {\n addExtensionListener?(event: WalletEventType, listenerId: string): Promise<unknown> | unknown;\n removeExtensionListener?(event: WalletEventType, listenerId: string): Promise<unknown> | unknown;\n}\n\nconst HEARTBEAT_INTERVAL_MS = 2_000;\n\nexport class ExtensionProvider implements UltraWalletProvider {\n private readonly eventListeners = new Map<WalletEventType, Array<(data: any) => void>>();\n private readonly listenerIds = new Map<WalletEventType, string>();\n private heartbeatTimer: ReturnType<typeof setInterval> | null = null;\n private messageHandler: ((event: MessageEvent) => void) | null = null;\n\n /**\n * Access window.ultra typed as UltraWalletProvider.\n * At runtime, window.ultra is a Proxy that handles all SDK method calls.\n * We cast here rather than declaring a global Window augmentation to avoid\n * conflicting with the app-level window.d.ts which types window.ultra as IUltraInternalAPI.\n */\n private get walletProvider(): UltraWalletProvider & ExtensionListenerAPI {\n return (window as any).ultra as UltraWalletProvider & ExtensionListenerAPI;\n }\n\n constructor(private readonly options?: UltraWalletSdkOptions) {\n this.initWindowEventListener();\n }\n\n /**\n * Wire-format match: the BG's MessageType.EVENT serialises as the uppercase\n * string 'EVENT'. We uppercase the incoming type so a future SDK build that\n * emits lowercase (or any case variant) still dispatches. Payload shape:\n * `{ event, origin, data }`.\n */\n private initWindowEventListener(): void {\n if (typeof window === 'undefined') return;\n if (this.messageHandler) return;\n this.messageHandler = (event: MessageEvent) => {\n if (event.source !== window || !event.data) return;\n const msg = event.data;\n const msgType = typeof msg.type === 'string' ? msg.type.toUpperCase() : '';\n if (msgType !== 'EVENT' || !msg.payload) return;\n const eventName = msg.payload.event as WalletEventType;\n if (!eventName) return;\n const cbs = this.eventListeners.get(eventName);\n if (cbs) cbs.forEach((cb) => cb(msg.payload.data));\n };\n window.addEventListener('message', this.messageHandler);\n }\n\n async connect(params?: ConnectParams): Promise<UltraResponse<ConnectResult>> {\n const { data: chainId } = await this.walletProvider.getChainId();\n if (!isValidChain(this.options?.environment, chainId)) {\n throw new Error(\n `Wallet environment mismatch: expected \"${this.options?.environment}\" chain, but received \"${chainId}\". Please verify the SDK configuration and the connected network.`,\n );\n }\n const result = await this.walletProvider.connect(params);\n // After connect() succeeds, the origin is now trusted in the BG. Any\n // pre-connect on() calls registered listener-ids that the BG silently\n // dropped (untrusted-origin no-op). Clear and re-register so the heartbeat\n // observes the fresh state.\n if (result?.status === 'success') {\n this.listenerIds.clear();\n for (const event of this.eventListeners.keys()) {\n void this.registerListenerWithExtension(event);\n }\n }\n return result;\n }\n\n disconnect(): Promise<UltraResponse<boolean>> {\n return this.walletProvider.disconnect();\n }\n\n signMessage(message: string): Promise<UltraResponse<SignMessageResult>> {\n return this.walletProvider.signMessage(message);\n }\n\n signTransaction(\n transaction: BlockchainTransaction | BlockchainTransaction[],\n options?: SignTransactionOptions,\n ): Promise<UltraResponse<SignTransactionResult>> {\n return this.walletProvider.signTransaction(transaction, options);\n }\n\n getChainId(): Promise<UltraResponse<string>> {\n return this.walletProvider.getChainId();\n }\n\n purchaseItem(itemType: PurchaseItemType, itemId: string): Promise<UltraResponse<PurchaseItemResult>> {\n return this.walletProvider.purchaseItem(itemType, itemId);\n }\n\n getAccounts(): Promise<UltraResponse<AccountInfo[]>> {\n return this.walletProvider.getAccounts();\n }\n\n getSelectedAccount(): Promise<UltraResponse<AccountInfo>> {\n return this.walletProvider.getSelectedAccount();\n }\n\n getAvailableAuthorizations(): Promise<UltraResponse<AvailableAuth[]>> {\n return this.walletProvider.getAvailableAuthorizations();\n }\n\n on(event: WalletEventType, callback: (data: any) => void): void {\n this.initWindowEventListener();\n const cbs = this.eventListeners.get(event) ?? [];\n cbs.push(callback);\n this.eventListeners.set(event, cbs);\n // Idempotent re-register: every on() call refreshes the BG's record of\n // this listener-id. Defends against extension-reload wipe and the\n // pre-connect untrusted-origin no-op race.\n void this.registerListenerWithExtension(event);\n this.ensureHeartbeat();\n }\n\n off(event: WalletEventType, callback: (data: any) => void): void {\n const cbs = this.eventListeners.get(event);\n if (!cbs) return;\n const idx = cbs.indexOf(callback);\n if (idx >= 0) cbs.splice(idx, 1);\n if (cbs.length === 0) {\n this.eventListeners.delete(event);\n void this.deregisterListenerWithExtension(event);\n }\n }\n\n switchNetwork(chainId: string): Promise<UltraResponse<void>> {\n return this.walletProvider.switchNetwork(chainId);\n }\n\n getNetwork(): Promise<UltraResponse<NetworkDetails>> {\n return this.walletProvider.getNetwork();\n }\n\n getNetworks(): Promise<UltraResponse<NetworkDetails[]>> {\n return this.walletProvider.getNetworks();\n }\n\n addNetwork(params: { name: string; chainId: string; nodeUrl: string }): Promise<UltraResponse<void>> {\n return this.walletProvider.addNetwork(params);\n }\n\n /**\n * Detach the window message listener and clear timers + maps. Safe to call\n * multiple times. Does NOT deregister each listener on the BG — the BG\n * GCs on tab close (verified via the S5(b) dedup work + tab-close cleanup\n * in `EventsService.removeTabListeners`). Calling N RPCs at dispose-time\n * would slow the page-unload path for no benefit.\n */\n dispose(): void {\n if (this.heartbeatTimer != null) {\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = null;\n }\n if (this.messageHandler && typeof window !== 'undefined') {\n window.removeEventListener('message', this.messageHandler);\n this.messageHandler = null;\n }\n this.eventListeners.clear();\n this.listenerIds.clear();\n }\n\n private async registerListenerWithExtension(event: WalletEventType): Promise<void> {\n if (!this.isExtensionAvailable()) return;\n const id = this.listenerIds.get(event) ?? this.generateListenerId();\n this.listenerIds.set(event, id);\n try {\n const result = this.walletProvider.addExtensionListener?.(event, id);\n if (result && typeof (result as Promise<unknown>).catch === 'function') {\n // Don't drop the id on rejection — heartbeat will retry.\n (result as Promise<unknown>).catch(() => undefined);\n }\n } catch {\n // Swallow: heartbeat retry will pick this up.\n }\n }\n\n private async deregisterListenerWithExtension(event: WalletEventType): Promise<void> {\n if (!this.isExtensionAvailable()) return;\n const id = this.listenerIds.get(event);\n if (!id) return;\n this.listenerIds.delete(event);\n try {\n const result = this.walletProvider.removeExtensionListener?.(event, id);\n if (result && typeof (result as Promise<unknown>).catch === 'function') {\n (result as Promise<unknown>).catch(() => undefined);\n }\n } catch {\n // Ignore — extension may have been removed.\n }\n }\n\n private ensureHeartbeat(): void {\n if (this.heartbeatTimer != null || typeof window === 'undefined') return;\n // Cadence matches the toolkit's prior workaround. Lower = BG storage-write\n // overhead; higher = wider post-reload event-drop window.\n this.heartbeatTimer = setInterval(() => this.heartbeatTick(), HEARTBEAT_INTERVAL_MS);\n }\n\n private heartbeatTick(): void {\n if (!this.isExtensionAvailable()) return;\n let hasAny = false;\n for (const cbs of this.eventListeners.values()) {\n if (cbs.length > 0) {\n hasAny = true;\n break;\n }\n }\n if (!hasAny) return;\n for (const event of this.eventListeners.keys()) {\n void this.registerListenerWithExtension(event);\n }\n }\n\n private isExtensionAvailable(): boolean {\n return typeof window !== 'undefined' && !!(window as any).ultra;\n }\n\n private generateListenerId(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID();\n }\n return Math.random().toString(36).slice(2) + Date.now().toString(36);\n }\n}\n", "import { JSONRPCClient } from 'json-rpc-2.0';\n\nimport UltraWalletSdkConfig from '../config/ultra-wallet-sdk.config';\nimport { JsonRpcMessage, ResponseStatus, SdkErrorCode, UltraResponse } from '../interfaces';\n\nimport { ClientError } from './client-error';\nimport { WindowManager } from './window-manager';\n\nexport class ClientMessenger {\n private windowManager: WindowManager;\n private rpcClient: JSONRPCClient;\n private pendingRequest = false;\n\n constructor(windowManager: WindowManager) {\n this.windowManager = windowManager;\n this.initializeRpcClient();\n this.setupMessageListener();\n }\n\n private initializeRpcClient(): void {\n this.rpcClient = new JSONRPCClient((request) => {\n const walletWindow = this.windowManager.getWalletWindow();\n if (!walletWindow) {\n return Promise.reject(new ClientError(SdkErrorCode.WALLET_WINDOW_UNAVAILABLE));\n }\n walletWindow.postMessage(request, this.windowManager.walletUrl);\n return Promise.resolve();\n });\n }\n\n private setupMessageListener(): void {\n window.addEventListener('message', (event) => {\n if (event.origin === this.windowManager.walletUrl && event.data?.jsonrpc === '2.0') {\n this.rpcClient.receive(event.data);\n }\n });\n }\n\n async sendRequest<T>(requestMethod: string, requestParams: Record<string, unknown>): Promise<UltraResponse<T>> {\n if (this.pendingRequest && !this.isWalletWindowClosed()) {\n throw this.createErrorResponse(SdkErrorCode.REQUESTED_RESOURCE_NOT_AVAILABLE);\n }\n\n this.pendingRequest = true;\n\n try {\n this.windowManager.openOrReuseWallet();\n const walletWindow = this.ensureWalletWindow();\n\n return await this.executeRequest<T>(walletWindow, requestMethod, requestParams);\n } finally {\n this.pendingRequest = false;\n }\n }\n\n private isWalletWindowClosed(): boolean {\n return this.windowManager.getWalletWindow()?.closed === true;\n }\n\n private ensureWalletWindow(): Window {\n const walletWindow = this.windowManager.getWalletWindow();\n if (!walletWindow) {\n throw this.createErrorResponse(SdkErrorCode.WALLET_WINDOW_UNAVAILABLE);\n }\n return walletWindow;\n }\n\n private async executeRequest<T>(\n walletWindow: Window,\n requestMethod: string,\n requestParams: Record<string, unknown>,\n ): Promise<UltraResponse<T>> {\n // Wait for wallet handshake first\n await this.waitForWalletReady(walletWindow);\n\n // Then execute the RPC request with window monitoring\n return this.processRpcRequest<T>(walletWindow, requestMethod, requestParams);\n }\n\n private async waitForWalletReady(walletWindow: Window): Promise<void> {\n return this.withWindowMonitoring(walletWindow, () => {\n return new Promise<void>((resolve, reject) => {\n let isResolved = false;\n let timeoutId: any;\n\n const cleanup = () => {\n if (isResolved) return;\n isResolved = true;\n clearTimeout(timeoutId);\n window.removeEventListener('message', handleWalletHandshake);\n };\n\n const handleWalletHandshake = (event: MessageEvent) => {\n if (!this.isValidReadyMessage(event)) return;\n cleanup();\n resolve();\n };\n\n const handleTimeout = () => {\n cleanup();\n walletWindow.close();\n reject(this.createErrorResponse(SdkErrorCode.WALLET_HANDSHAKE_TIMEOUT));\n };\n\n window.addEventListener('message', handleWalletHandshake);\n timeoutId = setTimeout(handleTimeout, UltraWalletSdkConfig.handshakeTimeout);\n });\n });\n }\n\n private async processRpcRequest<T>(\n walletWindow: Window,\n requestMethod: string,\n requestParams: Record<string, unknown>,\n ): Promise<UltraResponse<T>> {\n return this.withWindowMonitoring(walletWindow, async () => {\n let result: UltraResponse<T>;\n\n try {\n result = await this.rpcClient.request(requestMethod, requestParams);\n } catch (error) {\n const clientError = new ClientError(SdkErrorCode.UNKNOWN_ERROR, error);\n throw {\n status: ResponseStatus.ERROR,\n ...clientError,\n };\n } finally {\n if (result?.status === ResponseStatus.SUCCESS) {\n return result;\n } else {\n throw result;\n }\n }\n });\n }\n\n private async withWindowMonitoring<T>(walletWindow: Window, operation: () => Promise<T>): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const intervalId = setInterval(() => {\n if (walletWindow.closed) {\n clearInterval(intervalId);\n reject(this.createErrorResponse(SdkErrorCode.USER_REJECTED_REQUEST));\n }\n }, UltraWalletSdkConfig.checkWindowInterval);\n\n operation()\n .then((result) => {\n clearInterval(intervalId);\n resolve(result);\n })\n .catch((error) => {\n clearInterval(intervalId);\n reject(error);\n });\n });\n }\n\n private isValidReadyMessage(event: MessageEvent): boolean {\n if (event.origin !== this.windowManager.walletUrl) return false;\n\n const msg: JsonRpcMessage = event.data;\n return msg?.jsonrpc === '2.0' && msg.method === 'ready';\n }\n\n private createErrorResponse(errorCode: SdkErrorCode): UltraResponse<never> {\n const { code, message } = new ClientError(errorCode);\n return { status: ResponseStatus.ERROR, code, message, data: null as never };\n }\n}\n", "import { SDK_ERROR_MESSAGE, SdkErrorCode } from '../interfaces';\n\nexport class ClientError extends Error {\n override message: string;\n\n constructor(\n public code: SdkErrorCode,\n public data?,\n ) {\n super();\n this.message = SDK_ERROR_MESSAGE[code];\n this.name = this.constructor.name;\n }\n}\n", "import UltraWalletSdkConfig from '../config/ultra-wallet-sdk.config';\n\nexport class WindowManager {\n private currentWindow: Window;\n private walletWindow: Window | null = null;\n public readonly walletUrl: string;\n\n constructor(walletUrl: string) {\n this.currentWindow = window;\n this.walletUrl = walletUrl;\n }\n\n openOrReuseWallet() {\n if (this.walletWindow == null || this.walletWindow.closed) {\n const height = UltraWalletSdkConfig.height;\n const width = UltraWalletSdkConfig.width;\n const top = this.currentWindow.top;\n const left = this.currentWindow.screenLeft + this.currentWindow.innerWidth - width;\n\n this.walletWindow = window.open(\n this.walletUrl,\n '_blank',\n `width=${width},height=${height},top=${top},left=${left},resizable=0`,\n );\n } else {\n this.walletWindow.focus();\n }\n }\n\n // Provides a reference to the wallet window\n getWalletWindow(): Window | null {\n return this.walletWindow;\n }\n}\n", "import { ClientMessenger } from '../../common/client-messenger';\nimport { WindowManager } from '../../common/window-manager';\nimport UltraWalletSdkConfig from '../../config/ultra-wallet-sdk.config';\nimport {\n AccountInfo,\n AvailableAuth,\n BlockchainTransaction,\n ConnectParams,\n ConnectResult,\n NetworkDetails,\n PurchaseItemResult,\n PurchaseItemType,\n ResponseStatus,\n SignMessageResult,\n SignTransactionOptions,\n SignTransactionResult,\n UltraResponse,\n UltraWalletProvider,\n UltraWalletSdkOptions,\n WalletEventType,\n} from '../../interfaces';\n\nexport class WebProvider implements UltraWalletProvider {\n private readonly windowManager: WindowManager;\n private readonly clientMessenger: ClientMessenger;\n\n constructor(private readonly options?: UltraWalletSdkOptions) {\n this.windowManager = new WindowManager(this.resolveWalletUrl());\n this.clientMessenger = new ClientMessenger(this.windowManager);\n }\n\n connect(options?: ConnectParams): Promise<UltraResponse<ConnectResult>> {\n return this.clientMessenger.sendRequest<ConnectResult>('connect', { options });\n }\n\n disconnect(): Promise<UltraResponse<boolean>> {\n return this.clientMessenger.sendRequest<boolean>('disconnect', {});\n }\n\n signMessage(message: string): Promise<UltraResponse<SignMessageResult>> {\n return this.clientMessenger.sendRequest<SignMessageResult>('signMessage', { message });\n }\n\n signTransaction(\n transaction: BlockchainTransaction | BlockchainTransaction[],\n options?: SignTransactionOptions,\n ): Promise<UltraResponse<SignTransactionResult>> {\n return this.clientMessenger.sendRequest<SignTransactionResult>('signTransaction', { transaction, options });\n }\n\n async getChainId(): Promise<UltraResponse<string>> {\n const environment = this.options?.environment || 'mainnet';\n\n switch (environment) {\n case 'mainnet':\n const mainnetChainId = UltraWalletSdkConfig.networkInfo.mainnet.chainId;\n return {\n status: ResponseStatus.SUCCESS,\n data: mainnetChainId,\n };\n\n case 'testnet':\n const testnetChainId = UltraWalletSdkConfig.networkInfo.testnet.chainId;\n return {\n status: ResponseStatus.SUCCESS,\n data: testnetChainId,\n };\n\n default:\n return this.clientMessenger.sendRequest<string>('getChainId', {});\n }\n }\n\n purchaseItem(itemType: PurchaseItemType, itemId: string): Promise<UltraResponse<PurchaseItemResult>> {\n return this.clientMessenger.sendRequest<PurchaseItemResult>('purchaseItem', {\n itemType,\n itemId,\n });\n }\n\n getAccounts(): Promise<UltraResponse<AccountInfo[]>> {\n return this.clientMessenger.sendRequest<AccountInfo[]>('getAccounts', {});\n }\n\n getSelectedAccount(): Promise<UltraResponse<AccountInfo>> {\n return this.clientMessenger.sendRequest<AccountInfo>('getSelectedAccount', {});\n }\n\n getAvailableAuthorizations(): Promise<UltraResponse<AvailableAuth[]>> {\n return this.clientMessenger.sendRequest<AvailableAuth[]>('getAvailableAuthorizations', {});\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n on(_event: WalletEventType, _callback: (data: any) => void): void {\n // The Web Wallet provider communicates via postMessage through a popup window.\n // Long-lived event subscriptions are not supported in this transport model.\n // Consumers requiring real-time events should use the Extension provider.\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n off(_event: WalletEventType, _callback: (data: any) => void): void {\n // Not supported in web provider — see on() above.\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n switchNetwork(_chainId: string): Promise<UltraResponse<void>> {\n throw new Error('Not supported in web provider');\n }\n\n getNetwork(): Promise<UltraResponse<NetworkDetails>> {\n throw new Error('Not supported in web provider');\n }\n\n getNetworks(): Promise<UltraResponse<NetworkDetails[]>> {\n throw new Error('Not supported in web provider');\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n addNetwork(_params: { name: string; chainId: string; nodeUrl: string }): Promise<UltraResponse<void>> {\n throw new Error('Not supported in web provider');\n }\n\n dispose(): void {\n // Web provider holds no long-lived timers/listeners — the popup-based\n // postMessage transport is request/response only.\n }\n\n private resolveWalletUrl(): string {\n const env = UltraWalletSdkConfig.walletUrls[this.options?.environment || 'mainnet'];\n return env || this.options.environment;\n }\n}\n", "export function isExtensionAvailable(): boolean {\n return typeof window !== 'undefined' && 'ultra' in window;\n}\n", "import {\n AccountInfo,\n AvailableAuth,\n BlockchainTransaction,\n ConnectParams,\n ConnectResult,\n NetworkDetails,\n PurchaseItemResult,\n PurchaseItemType,\n SignMessageResult,\n SignTransactionOptions,\n SignTransactionResult,\n UltraResponse,\n UltraWalletProvider,\n UltraWalletSdkOptions,\n UltraWalletSdkProvider,\n WalletEventType,\n} from './interfaces';\nimport { ExtensionProvider, WebProvider } from './providers';\nimport { isExtensionAvailable } from './utils/detection';\n\n/**\n * UltraWalletClient acts as a Facade for interacting with the Ultra Wallet.\n * It provides a unified API regardless of the underlying provider implementation (Extension or Web).\n */\nexport class UltraWalletSDK {\n private provider: UltraWalletProvider;\n\n /**\n * Constructs an UltraWalletClient instance.\n * If the Ultra Wallet Extension is available (window.ultra), it will be used automatically.\n * If the Extension is not available, the Web Wallet provider will be initialized using the given network options.\n *\n * @param {UltraWalletSdkOptions} [options] - Configuration options for the Web Wallet fallback (environment or custom URL).\n */\n constructor(private readonly options?: UltraWalletSdkOptions) {\n this.provider = this.resolveWalletProvider();\n }\n\n connect(params?: ConnectParams): Promise<UltraResponse<ConnectResult>> {\n return this.provider.connect(params);\n }\n\n disconnect(): Promise<UltraResponse<boolean>> {\n return this.provider.disconnect();\n }\n\n signMessage(message: string): Promise<UltraResponse<SignMessageResult>> {\n return this.provider.signMessage(message);\n }\n\n signTransaction(\n transaction: BlockchainTransaction | BlockchainTransaction[],\n options?: SignTransactionOptions,\n ): Promise<UltraResponse<SignTransactionResult>> {\n return this.provider.signTransaction(transaction, options);\n }\n\n getChainId(): Promise<UltraResponse<string>> {\n return this.provider.getChainId();\n }\n\n purchaseItem(itemType: PurchaseItemType, itemId: string): Promise<UltraResponse<PurchaseItemResult>> {\n return this.provider.purchaseItem(itemType, itemId);\n }\n\n getAccounts(): Promise<UltraResponse<AccountInfo[]>> {\n return this.provider.getAccounts();\n }\n\n getSelectedAccount(): Promise<UltraResponse<AccountInfo>> {\n return this.provider.getSelectedAccount();\n }\n\n getAvailableAuthorizations(): Promise<UltraResponse<AvailableAuth[]>> {\n return this.provider.getAvailableAuthorizations();\n }\n\n on(event: WalletEventType, callback: (data: any) => void): void {\n this.provider.on(event, callback);\n }\n\n off(event: WalletEventType, callback: (data: any) => void): void {\n this.provider.off(event, callback);\n }\n\n switchNetwork(chainId: string): Promise<UltraResponse<void>> {\n return this.provider.switchNetwork(chainId);\n }\n\n getNetwork(): Promise<UltraResponse<NetworkDetails>> {\n return this.provider.getNetwork();\n }\n\n getNetworks(): Promise<UltraResponse<NetworkDetails[]>> {\n return this.provider.getNetworks();\n }\n\n addNetwork(params: { name: string; chainId: string; nodeUrl: string }): Promise<UltraResponse<void>> {\n return this.provider.addNetwork(params);\n }\n\n dispose(): void {\n this.provider.dispose();\n }\n\n private resolveWalletProvider(): UltraWalletProvider {\n const requestedProvider: UltraWalletSdkProvider | undefined = this.options?.provider;\n if (requestedProvider === 'extension') {\n return new ExtensionProvider(this.options);\n }\n if (requestedProvider === 'web') {\n return new WebProvider(this.options);\n }\n\n const extensionAvailable = isExtensionAvailable();\n return extensionAvailable ? new ExtensionProvider(this.options) : new WebProvider(this.options);\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["SdkErrorCode", "PurchaseItemType", "ResponseStatus"]
7
+ }
package/package.json CHANGED
@@ -1,16 +1,30 @@
1
1
  {
2
2
  "name": "@ultraos/wallet-sdk",
3
- "version": "0.3.0",
3
+ "version": "0.3.2",
4
4
  "homepage": "https://developers.ultra.io",
5
5
  "dependencies": {
6
6
  "json-rpc-2.0": "^1.7.0",
7
7
  "tslib": "^2.3.0"
8
8
  },
9
9
  "type": "module",
10
- "main": "./src/index.js",
10
+ "main": "./dist/index.mjs",
11
11
  "typings": "./src/index.d.ts",
12
12
  "publishConfig": {
13
13
  "access": "public"
14
14
  },
15
- "module": "./src/index.js"
16
- }
15
+ "module": "./dist/index.mjs",
16
+ "types": "./src/index.d.ts",
17
+ "exports": {
18
+ ".": {
19
+ "types": "./src/index.d.ts",
20
+ "import": "./dist/index.mjs",
21
+ "default": "./dist/index.mjs"
22
+ },
23
+ "./package.json": "./package.json"
24
+ },
25
+ "files": [
26
+ "dist",
27
+ "src",
28
+ "README.md"
29
+ ]
30
+ }