@ultraos/wallet-sdk 0.3.2 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/CHANGELOG.md +47 -0
  2. package/README.md +19 -8
  3. package/dist/index.mjs +12 -42
  4. package/dist/index.mjs.map +4 -4
  5. package/package.json +3 -2
  6. package/src/lib/interfaces/connect-params.interface.d.ts +12 -0
  7. package/src/lib/interfaces/connect-params.interface.d.ts.map +1 -1
  8. package/src/lib/interfaces/connect-params.interface.js.map +1 -1
  9. package/src/lib/interfaces/index.d.ts +0 -1
  10. package/src/lib/interfaces/index.d.ts.map +1 -1
  11. package/src/lib/interfaces/index.js +0 -1
  12. package/src/lib/interfaces/index.js.map +1 -1
  13. package/src/lib/interfaces/wallet-provider-response.interface.d.ts +84 -27
  14. package/src/lib/interfaces/wallet-provider-response.interface.d.ts.map +1 -1
  15. package/src/lib/interfaces/wallet-provider-response.interface.js.map +1 -1
  16. package/src/lib/interfaces/wallet-provider.interface.d.ts +1 -17
  17. package/src/lib/interfaces/wallet-provider.interface.d.ts.map +1 -1
  18. package/src/lib/interfaces/wallet-provider.interface.js.map +1 -1
  19. package/src/lib/providers/extension-provider/extension.provider.d.ts +1 -7
  20. package/src/lib/providers/extension-provider/extension.provider.d.ts.map +1 -1
  21. package/src/lib/providers/extension-provider/extension.provider.js +0 -6
  22. package/src/lib/providers/extension-provider/extension.provider.js.map +1 -1
  23. package/src/lib/providers/web-provider/web.provider.d.ts +1 -7
  24. package/src/lib/providers/web-provider/web.provider.d.ts.map +1 -1
  25. package/src/lib/providers/web-provider/web.provider.js +0 -10
  26. package/src/lib/providers/web-provider/web.provider.js.map +1 -1
  27. package/src/lib/ultra-wallet-sdk.d.ts +1 -7
  28. package/src/lib/ultra-wallet-sdk.d.ts.map +1 -1
  29. package/src/lib/ultra-wallet-sdk.js +0 -6
  30. package/src/lib/ultra-wallet-sdk.js.map +1 -1
  31. package/src/lib/interfaces/purchase-item.interface.d.ts +0 -8
  32. package/src/lib/interfaces/purchase-item.interface.d.ts.map +0 -1
  33. package/src/lib/interfaces/purchase-item.interface.js +0 -9
  34. package/src/lib/interfaces/purchase-item.interface.js.map +0 -1
package/CHANGELOG.md ADDED
@@ -0,0 +1,47 @@
1
+ # Changelog
2
+
3
+ All notable changes to `@ultraos/wallet-sdk` are documented in this file.
4
+
5
+ ## 0.6.0
6
+
7
+ ### Removed
8
+
9
+ - `purchaseItem()` and the `PurchaseItemType` / `PurchaseItemResult` types. Neither wallet serves it any more: the
10
+ extension redesign deliberately removed Ultra-platform checkout dependencies and the Web Wallet never shipped the
11
+ route, so calls could only hang until the user closed the popup.
12
+ - `addNetwork()`. The extension removed its dApp-callable route in the v4 security audit (N-N1): adding a network
13
+ without an explicit approval screen is a silent RPC-takeover vector. Users add custom networks in the wallet's
14
+ Settings → Networks; dApps can then call `switchNetwork()`.
15
+
16
+ ### Changed
17
+
18
+ - Corrected the `ConnectResult.blockchainid` documentation: it is the connected account **name** (equal to
19
+ `selectedAccount.accountName`), not a network identifier.
20
+ - Declared the `nonce` / `signedNonce` fields every wallet already returns from `connect({ nonce })`.
21
+ - Marked the connect-time attestation surface (`ConnectAttestation`, `ConnectResult.attestation`,
22
+ `ConnectParams.requireAttestation`) `@experimental`: only the browser extension issues it and no Ultra service
23
+ consumes it yet.
24
+ - Published as a bundled ES module (`dist/index.mjs` + `exports` map), as in 0.3.2, now produced reproducibly by
25
+ `npm run build:wallet-sdk`.
26
+
27
+ ## 0.5.0
28
+
29
+ ### Added
30
+
31
+ - `requireAttestation?: boolean` on `ConnectParams`. When set, a dApp signals that it needs a connect-time identity
32
+ attestation; if the wallet supports attestation but the origin hasn't yet consented, the wallet prompts for consent
33
+ via the existing connect prompt (no separate signature dialog) and resolves `connect()` with a populated
34
+ `ConnectResult.attestation`. Strictly additive and pass-through — the SDK forwards the flag to the wallet verbatim and
35
+ performs no logic on it; wallets without attestation support ignore it. Omitting it preserves existing behavior. See
36
+ the RFC:
37
+ <https://github.com/ultraio/ultra-tool-kit/blob/feature/ai-enhancement/docs/proposals/wallet-native-attestation.md>
38
+
39
+ ## 0.4.0
40
+
41
+ ### Added
42
+
43
+ - `ConnectAttestation` type and an optional `attestation` field on `ConnectResult`. When the connected wallet supports
44
+ silent connect-time identity attestation, `connect()` now surfaces it; otherwise `attestation` is `undefined`. This is
45
+ a strictly additive, type-only change — the SDK passes the value through verbatim and performs no verification. See
46
+ the RFC:
47
+ <https://github.com/ultraio/ultra-tool-kit/blob/feature/ai-enhancement/docs/proposals/wallet-native-attestation.md>
package/README.md CHANGED
@@ -44,7 +44,7 @@ await ultra.signTransaction({
44
44
  contract: 'eosio.token',
45
45
  action: 'transfer',
46
46
  data: { from: 'user', to: 'receiver', quantity: '1.00000000 UOS', memo: '' },
47
- authorizations: ['user@active'],
47
+ // authorization defaults to the connected account's `active` permission
48
48
  });
49
49
  ```
50
50
 
@@ -55,7 +55,7 @@ You can pass options during initialization:
55
55
  ```ts
56
56
  new UltraWalletSDK({
57
57
  environment: 'testnet', // or 'mainnet', or provide custom URL
58
- provider: 'web', // or 'extension', use a specific provider independetly of auto-detection
58
+ provider: 'web', // or 'extension', use a specific provider independently of auto-detection
59
59
  });
60
60
  ```
61
61
 
@@ -63,12 +63,23 @@ new UltraWalletSDK({
63
63
 
64
64
  ### Methods
65
65
 
66
- - `connect(): Promise<ConnectResult>`
67
- - `disconnect(): Promise<void>`
68
- - `signMessage(message: string): Promise<string>`
69
- - `signTransaction(transaction: BlockchainTransaction | BlockchainTransaction[]): Promise<SignTransactionResult>`
70
- - `getChainId(): Promise<string>`
71
- - `purchaseItem(itemType: PurchaseItemType, itemId: string): Promise<PurchaseItemResult>`
66
+ All methods resolve to `UltraResponse<T>` (`{ status: 'success', data: T }`) and reject with
67
+ `{ status, code, message }`.
68
+
69
+ | Method | Extension | Web Wallet |
70
+ | ------------------------------------------------------------------------------------- | --------- | ---------- |
71
+ | `connect(params?: ConnectParams)` / `disconnect()` | ✅ | ✅ |
72
+ | `signMessage(message: string)` | ✅ | ✅ |
73
+ | `signTransaction(transaction, options?: { signOnly?: boolean })` | ✅ | ✅ |
74
+ | `getChainId()` | ✅ | ✅ |
75
+ | `getAccounts()` / `getSelectedAccount()` / `getAvailableAuthorizations()` | ✅ | — |
76
+ | `getNetwork()` / `getNetworks()` / `switchNetwork(chainId)` | ✅ | — |
77
+ | `on(event, cb)` / `off(event, cb)` — `accountChanged`, `networkChanged`, `disconnect` | ✅ | — |
78
+ | `dispose()` | ✅ | ✅ |
79
+
80
+ The Web Wallet is currently deployed for **mainnet** only.
81
+
82
+ Full documentation: <https://developers.ultra.io/products/ultra-wallet-sdk/>
72
83
 
73
84
  ---
74
85
 
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- // src/lib/interfaces/error-enum.js
1
+ // dist/libs/wallet-sdk/src/lib/interfaces/error-enum.js
2
2
  var SdkErrorCode;
3
3
  (function(SdkErrorCode2) {
4
4
  SdkErrorCode2[SdkErrorCode2["USER_REJECTED_REQUEST"] = 4001] = "USER_REJECTED_REQUEST";
@@ -15,14 +15,7 @@ var SDK_ERROR_MESSAGE = {
15
15
  [SdkErrorCode.UNKNOWN_ERROR]: "Unknown error occurred."
16
16
  };
17
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
18
+ // dist/libs/wallet-sdk/src/lib/interfaces/wallet-provider-response.interface.js
26
19
  var ResponseStatus;
27
20
  (function(ResponseStatus2) {
28
21
  ResponseStatus2["SUCCESS"] = "success";
@@ -30,7 +23,7 @@ var ResponseStatus;
30
23
  ResponseStatus2["ERROR"] = "error";
31
24
  })(ResponseStatus || (ResponseStatus = {}));
32
25
 
33
- // src/lib/config/ultra-wallet-sdk.config.js
26
+ // dist/libs/wallet-sdk/src/lib/config/ultra-wallet-sdk.config.js
34
27
  var UltraWalletSdkConfig = Object.freeze({
35
28
  width: 420,
36
29
  height: 815,
@@ -51,13 +44,13 @@ var UltraWalletSdkConfig = Object.freeze({
51
44
  });
52
45
  var ultra_wallet_sdk_config_default = UltraWalletSdkConfig;
53
46
 
54
- // src/lib/utils/chain-validator.js
47
+ // dist/libs/wallet-sdk/src/lib/utils/chain-validator.js
55
48
  function isValidChain(targetNetwork, walletChainId) {
56
49
  const { chainId } = ultra_wallet_sdk_config_default.networkInfo[targetNetwork] || {};
57
50
  return !chainId || chainId === walletChainId;
58
51
  }
59
52
 
60
- // src/lib/providers/extension-provider/extension.provider.js
53
+ // dist/libs/wallet-sdk/src/lib/providers/extension-provider/extension.provider.js
61
54
  var HEARTBEAT_INTERVAL_MS = 2e3;
62
55
  var ExtensionProvider = class {
63
56
  /**
@@ -130,9 +123,6 @@ var ExtensionProvider = class {
130
123
  getChainId() {
131
124
  return this.walletProvider.getChainId();
132
125
  }
133
- purchaseItem(itemType, itemId) {
134
- return this.walletProvider.purchaseItem(itemType, itemId);
135
- }
136
126
  getAccounts() {
137
127
  return this.walletProvider.getAccounts();
138
128
  }
@@ -171,9 +161,6 @@ var ExtensionProvider = class {
171
161
  getNetworks() {
172
162
  return this.walletProvider.getNetworks();
173
163
  }
174
- addNetwork(params) {
175
- return this.walletProvider.addNetwork(params);
176
- }
177
164
  /**
178
165
  * Detach the window message listener and clear timers + maps. Safe to call
179
166
  * multiple times. Does NOT deregister each listener on the BG — the BG
@@ -253,10 +240,10 @@ var ExtensionProvider = class {
253
240
  }
254
241
  };
255
242
 
256
- // src/lib/common/client-messenger.js
243
+ // dist/libs/wallet-sdk/src/lib/common/client-messenger.js
257
244
  import { JSONRPCClient } from "json-rpc-2.0";
258
245
 
259
- // src/lib/common/client-error.js
246
+ // dist/libs/wallet-sdk/src/lib/common/client-error.js
260
247
  var ClientError = class extends Error {
261
248
  constructor(code, data) {
262
249
  super();
@@ -267,7 +254,7 @@ var ClientError = class extends Error {
267
254
  }
268
255
  };
269
256
 
270
- // src/lib/common/client-messenger.js
257
+ // dist/libs/wallet-sdk/src/lib/common/client-messenger.js
271
258
  var ClientMessenger = class {
272
259
  constructor(windowManager) {
273
260
  this.pendingRequest = false;
@@ -396,7 +383,7 @@ var ClientMessenger = class {
396
383
  }
397
384
  };
398
385
 
399
- // src/lib/common/window-manager.js
386
+ // dist/libs/wallet-sdk/src/lib/common/window-manager.js
400
387
  var WindowManager = class {
401
388
  constructor(walletUrl) {
402
389
  this.walletWindow = null;
@@ -420,7 +407,7 @@ var WindowManager = class {
420
407
  }
421
408
  };
422
409
 
423
- // src/lib/providers/web-provider/web.provider.js
410
+ // dist/libs/wallet-sdk/src/lib/providers/web-provider/web.provider.js
424
411
  var WebProvider = class {
425
412
  constructor(options) {
426
413
  this.options = options;
@@ -458,12 +445,6 @@ var WebProvider = class {
458
445
  return this.clientMessenger.sendRequest("getChainId", {});
459
446
  }
460
447
  }
461
- purchaseItem(itemType, itemId) {
462
- return this.clientMessenger.sendRequest("purchaseItem", {
463
- itemType,
464
- itemId
465
- });
466
- }
467
448
  getAccounts() {
468
449
  return this.clientMessenger.sendRequest("getAccounts", {});
469
450
  }
@@ -489,10 +470,6 @@ var WebProvider = class {
489
470
  getNetworks() {
490
471
  throw new Error("Not supported in web provider");
491
472
  }
492
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
493
- addNetwork(_params) {
494
- throw new Error("Not supported in web provider");
495
- }
496
473
  dispose() {
497
474
  }
498
475
  resolveWalletUrl() {
@@ -501,12 +478,12 @@ var WebProvider = class {
501
478
  }
502
479
  };
503
480
 
504
- // src/lib/utils/detection.js
481
+ // dist/libs/wallet-sdk/src/lib/utils/detection.js
505
482
  function isExtensionAvailable() {
506
483
  return typeof window !== "undefined" && "ultra" in window;
507
484
  }
508
485
 
509
- // src/lib/ultra-wallet-sdk.js
486
+ // dist/libs/wallet-sdk/src/lib/ultra-wallet-sdk.js
510
487
  var UltraWalletSDK = class {
511
488
  /**
512
489
  * Constructs an UltraWalletClient instance.
@@ -534,9 +511,6 @@ var UltraWalletSDK = class {
534
511
  getChainId() {
535
512
  return this.provider.getChainId();
536
513
  }
537
- purchaseItem(itemType, itemId) {
538
- return this.provider.purchaseItem(itemType, itemId);
539
- }
540
514
  getAccounts() {
541
515
  return this.provider.getAccounts();
542
516
  }
@@ -561,9 +535,6 @@ var UltraWalletSDK = class {
561
535
  getNetworks() {
562
536
  return this.provider.getNetworks();
563
537
  }
564
- addNetwork(params) {
565
- return this.provider.addNetwork(params);
566
- }
567
538
  dispose() {
568
539
  this.provider.dispose();
569
540
  }
@@ -580,7 +551,6 @@ var UltraWalletSDK = class {
580
551
  }
581
552
  };
582
553
  export {
583
- PurchaseItemType,
584
554
  ResponseStatus,
585
555
  SDK_ERROR_MESSAGE,
586
556
  SdkErrorCode,
@@ -1,7 +1,7 @@
1
1
  {
2
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"]
3
+ "sources": ["../../../../libs/wallet-sdk/src/lib/interfaces/error-enum.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 * 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 and getNetworks.\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 * One account the wallet currently holds signing keys for, plus the permission\n * names whose keys it controls. Sourced from the same set the wallet exposes via\n * `ConnectResult.accounts` — never an FE-supplied (spoofable) list (RFC §2.1 / §5.6).\n */\nexport interface SignableAccount {\n /** The blockchain account name. */\n account: string;\n /** The permission names the wallet holds the signing key for (e.g. `active`). */\n permissions: string[];\n}\n\n/**\n * The signed payload of a connect-time identity attestation (RFC §2.1). The canonical\n * form — JSON with sorted keys, UTF-8 encoded, SHA-256 hashed — is what the wallet signs.\n */\nexport interface AttestationPayload {\n /** Attestation format version. */\n v: 1;\n /** The signing public key (e.g. `EOS...` / `UTR...`). */\n pubkey: string;\n /** The primary account name (the one signing). */\n account: string;\n /** The permission used to sign (e.g. `active`, `owner`). */\n permission: string;\n /** The dApp origin the attestation is bound to (e.g. `http://localhost:5172`). */\n origin: string;\n /** The chain identifier the attestation is scoped to. */\n chainId: string;\n /** Issued-at, unix seconds. */\n iat: number;\n /** Expiry, unix seconds. */\n exp: number;\n /** 32-byte random value, hex-encoded. */\n nonce: string;\n /**\n * The full set of accounts the wallet currently holds signing keys for, each with\n * the permission names it controls. Lets a backend reason about the user's real\n * account set without trusting an FE-supplied (spoofable) list. Omitted when the\n * wallet doesn't enumerate additional accounts — backends MUST fall back to the\n * primary `account` field on absence.\n */\n signableAccounts?: SignableAccount[];\n}\n\n/**\n * A connect-time identity attestation, optionally produced by the wallet when the\n * user approves a `connect()`. Rides the existing connect consent — no extra popup.\n *\n * Present only if the connected wallet vendor supports silent attestation; absent\n * otherwise. dApps treat absence as \"fall back to whatever auth this dApp uses\n * without attestation\". The SDK does not verify or transform this value — it is\n * passed through verbatim from the wallet. Verification is the consumer backend's\n * responsibility (see RFC §2.4 / §5).\n *\n * @see https://github.com/ultraio/ultra-tool-kit/blob/feature/ai-enhancement/docs/proposals/wallet-native-attestation.md\n *\n * @experimental Issued only by the browser-extension wallet and not yet consumed by any\n * Ultra service; the shape may change before it is stabilised.\n */\nexport interface ConnectAttestation {\n /** The signed identity payload. */\n payload: AttestationPayload;\n /** Signature over the canonical hash of `payload` (e.g. `SIG_K1_...`). */\n signature: string;\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 connected (selected) account name, e.g. `aa1aa2aa3aa4` — not a chain id.\n * Equals `selectedAccount.accountName` when the wallet returns `selectedAccount`;\n * the Web Wallet returns only this legacy field.\n * @deprecated Use `selectedAccount.accountName` when present.\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 * The nonce passed to `connect({ nonce })`, echoed back. Present only when a nonce was sent.\n */\n nonce?: string;\n /**\n * The wallet's signature over `nonce` (same scheme as `signMessage`). Present only when a nonce was sent.\n */\n signedNonce?: string;\n /**\n * An optional connect-time identity attestation. Present only when the connected\n * wallet vendor supports silent attestation; `undefined` otherwise. Passed through\n * verbatim from the wallet — the SDK does not verify or transform it.\n * @experimental See {@link ConnectAttestation}.\n */\n attestation?: ConnectAttestation;\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 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 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 /**\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 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 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 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 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 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 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", "ResponseStatus"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ultraos/wallet-sdk",
3
- "version": "0.3.2",
3
+ "version": "0.6.0",
4
4
  "homepage": "https://developers.ultra.io",
5
5
  "dependencies": {
6
6
  "json-rpc-2.0": "^1.7.0",
@@ -25,6 +25,7 @@
25
25
  "files": [
26
26
  "dist",
27
27
  "src",
28
- "README.md"
28
+ "README.md",
29
+ "CHANGELOG.md"
29
30
  ]
30
31
  }
@@ -16,5 +16,17 @@ export interface ConnectParams {
16
16
  * The nonce must be prefixed with 'message:', '0x' or 'UOSx'
17
17
  */
18
18
  nonce?: string;
19
+ /**
20
+ * If true, the dApp explicitly requires a connect-time identity attestation.
21
+ * When the connected wallet supports attestation but the origin has not yet
22
+ * consented to attestation issuance, the wallet prompts for consent (reusing
23
+ * the connect prompt — no separate signature dialog) instead of returning a
24
+ * silent, attestation-less result; on approval, `connect()` resolves with a
25
+ * `ConnectResult` whose `attestation` field is populated. Wallets that do not
26
+ * support attestation ignore this flag (the result simply has no `attestation`).
27
+ * Omitting it preserves existing behavior.
28
+ * @experimental See `ConnectAttestation`.
29
+ */
30
+ requireAttestation?: boolean;
19
31
  }
20
32
  //# sourceMappingURL=connect-params.interface.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"connect-params.interface.d.ts","sourceRoot":"","sources":["../../../../../../libs/wallet-sdk/src/lib/interfaces/connect-params.interface.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
1
+ {"version":3,"file":"connect-params.interface.d.ts","sourceRoot":"","sources":["../../../../../../libs/wallet-sdk/src/lib/interfaces/connect-params.interface.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;;;;;;;;OAUG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B"}
@@ -1 +1 @@
1
- {"version":3,"file":"connect-params.interface.js","sourceRoot":"","sources":["../../../../../../libs/wallet-sdk/src/lib/interfaces/connect-params.interface.ts"],"names":[],"mappings":"","sourcesContent":["/**\n * Optional parameters for establishing a connection with the Ultra Wallet.\n */\nexport interface ConnectParams {\n /**\n * If true, do not prompt the user for permissions; share account info only if Dapp is already trusted.\n */\n onlyIfTrusted?: boolean;\n /**\n * Optional referral code to associate with the connection request.\n */\n referralCode?: string;\n\n /**\n * A unique string used for identifying or authenticating a specific request or transaction.\n * Typically utilized for security mechanisms, such as preventing replay attacks or ensuring the uniqueness of transactions.\n * The nonce must be prefixed with 'message:', '0x' or 'UOSx'\n */\n nonce?: string;\n}\n"]}
1
+ {"version":3,"file":"connect-params.interface.js","sourceRoot":"","sources":["../../../../../../libs/wallet-sdk/src/lib/interfaces/connect-params.interface.ts"],"names":[],"mappings":"","sourcesContent":["/**\n * Optional parameters for establishing a connection with the Ultra Wallet.\n */\nexport interface ConnectParams {\n /**\n * If true, do not prompt the user for permissions; share account info only if Dapp is already trusted.\n */\n onlyIfTrusted?: boolean;\n /**\n * Optional referral code to associate with the connection request.\n */\n referralCode?: string;\n\n /**\n * A unique string used for identifying or authenticating a specific request or transaction.\n * Typically utilized for security mechanisms, such as preventing replay attacks or ensuring the uniqueness of transactions.\n * The nonce must be prefixed with 'message:', '0x' or 'UOSx'\n */\n nonce?: string;\n\n /**\n * If true, the dApp explicitly requires a connect-time identity attestation.\n * When the connected wallet supports attestation but the origin has not yet\n * consented to attestation issuance, the wallet prompts for consent (reusing\n * the connect prompt — no separate signature dialog) instead of returning a\n * silent, attestation-less result; on approval, `connect()` resolves with a\n * `ConnectResult` whose `attestation` field is populated. Wallets that do not\n * support attestation ignore this flag (the result simply has no `attestation`).\n * Omitting it preserves existing behavior.\n * @experimental See `ConnectAttestation`.\n */\n requireAttestation?: boolean;\n}\n"]}
@@ -2,7 +2,6 @@ export * from './blockchain-transaction.interface';
2
2
  export * from './connect-params.interface';
3
3
  export * from './error-enum';
4
4
  export * from './json-rpc-message.interface';
5
- export * from './purchase-item.interface';
6
5
  export * from './wallet-provider.interface';
7
6
  export * from './wallet-provider-response.interface';
8
7
  export * from './wallet-sdk-options.interface';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../libs/wallet-sdk/src/lib/interfaces/index.ts"],"names":[],"mappings":"AAAA,cAAc,oCAAoC,CAAC;AACnD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,cAAc,CAAC;AAC7B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,sCAAsC,CAAC;AACrD,cAAc,gCAAgC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../libs/wallet-sdk/src/lib/interfaces/index.ts"],"names":[],"mappings":"AAAA,cAAc,oCAAoC,CAAC;AACnD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,cAAc,CAAC;AAC7B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,sCAAsC,CAAC;AACrD,cAAc,gCAAgC,CAAC"}
@@ -2,7 +2,6 @@ export * from './blockchain-transaction.interface';
2
2
  export * from './connect-params.interface';
3
3
  export * from './error-enum';
4
4
  export * from './json-rpc-message.interface';
5
- export * from './purchase-item.interface';
6
5
  export * from './wallet-provider.interface';
7
6
  export * from './wallet-provider-response.interface';
8
7
  export * from './wallet-sdk-options.interface';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../libs/wallet-sdk/src/lib/interfaces/index.ts"],"names":[],"mappings":"AAAA,cAAc,oCAAoC,CAAC;AACnD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,cAAc,CAAC;AAC7B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,sCAAsC,CAAC;AACrD,cAAc,gCAAgC,CAAC","sourcesContent":["export * from './blockchain-transaction.interface';\nexport * from './connect-params.interface';\nexport * from './error-enum';\nexport * from './json-rpc-message.interface';\nexport * from './purchase-item.interface';\nexport * from './wallet-provider.interface';\nexport * from './wallet-provider-response.interface';\nexport * from './wallet-sdk-options.interface';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../libs/wallet-sdk/src/lib/interfaces/index.ts"],"names":[],"mappings":"AAAA,cAAc,oCAAoC,CAAC;AACnD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,cAAc,CAAC;AAC7B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,sCAAsC,CAAC;AACrD,cAAc,gCAAgC,CAAC","sourcesContent":["export * from './blockchain-transaction.interface';\nexport * from './connect-params.interface';\nexport * from './error-enum';\nexport * from './json-rpc-message.interface';\nexport * from './wallet-provider.interface';\nexport * from './wallet-provider-response.interface';\nexport * from './wallet-sdk-options.interface';\n"]}