@0xkey-io/core 0.1.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 (183) hide show
  1. package/LICENSE +201 -0
  2. package/README.MD +7 -0
  3. package/dist/0xkey-helpers.d.ts +68 -0
  4. package/dist/0xkey-helpers.d.ts.map +1 -0
  5. package/dist/0xkey-helpers.js +466 -0
  6. package/dist/0xkey-helpers.js.map +1 -0
  7. package/dist/0xkey-helpers.mjs +399 -0
  8. package/dist/0xkey-helpers.mjs.map +1 -0
  9. package/dist/__clients__/core.d.ts +1201 -0
  10. package/dist/__clients__/core.d.ts.map +1 -0
  11. package/dist/__clients__/core.js +3489 -0
  12. package/dist/__clients__/core.js.map +1 -0
  13. package/dist/__clients__/core.mjs +3487 -0
  14. package/dist/__clients__/core.mjs.map +1 -0
  15. package/dist/__generated__/sdk-client-base.d.ts +281 -0
  16. package/dist/__generated__/sdk-client-base.d.ts.map +1 -0
  17. package/dist/__generated__/sdk-client-base.js +3906 -0
  18. package/dist/__generated__/sdk-client-base.js.map +1 -0
  19. package/dist/__generated__/sdk-client-base.mjs +3904 -0
  20. package/dist/__generated__/sdk-client-base.mjs.map +1 -0
  21. package/dist/__generated__/version.d.ts +2 -0
  22. package/dist/__generated__/version.d.ts.map +1 -0
  23. package/dist/__generated__/version.js +6 -0
  24. package/dist/__generated__/version.js.map +1 -0
  25. package/dist/__generated__/version.mjs +4 -0
  26. package/dist/__generated__/version.mjs.map +1 -0
  27. package/dist/__inputs__/public_api.types.d.ts +6014 -0
  28. package/dist/__inputs__/public_api.types.d.ts.map +1 -0
  29. package/dist/__polyfills__/jest.setup.webcrypto.d.ts +2 -0
  30. package/dist/__polyfills__/jest.setup.webcrypto.d.ts.map +1 -0
  31. package/dist/__polyfills__/window.d.ts +15 -0
  32. package/dist/__polyfills__/window.d.ts.map +1 -0
  33. package/dist/__polyfills__/window.js +30 -0
  34. package/dist/__polyfills__/window.js.map +1 -0
  35. package/dist/__polyfills__/window.mjs +28 -0
  36. package/dist/__polyfills__/window.mjs.map +1 -0
  37. package/dist/__stampers__/api/base.d.ts +27 -0
  38. package/dist/__stampers__/api/base.d.ts.map +1 -0
  39. package/dist/__stampers__/api/base.js +102 -0
  40. package/dist/__stampers__/api/base.js.map +1 -0
  41. package/dist/__stampers__/api/base.mjs +100 -0
  42. package/dist/__stampers__/api/base.mjs.map +1 -0
  43. package/dist/__stampers__/api/mobile/stamper.d.ts +15 -0
  44. package/dist/__stampers__/api/mobile/stamper.d.ts.map +1 -0
  45. package/dist/__stampers__/api/mobile/stamper.js +119 -0
  46. package/dist/__stampers__/api/mobile/stamper.js.map +1 -0
  47. package/dist/__stampers__/api/mobile/stamper.mjs +117 -0
  48. package/dist/__stampers__/api/mobile/stamper.mjs.map +1 -0
  49. package/dist/__stampers__/api/web/stamper.d.ts +14 -0
  50. package/dist/__stampers__/api/web/stamper.d.ts.map +1 -0
  51. package/dist/__stampers__/api/web/stamper.js +201 -0
  52. package/dist/__stampers__/api/web/stamper.js.map +1 -0
  53. package/dist/__stampers__/api/web/stamper.mjs +199 -0
  54. package/dist/__stampers__/api/web/stamper.mjs.map +1 -0
  55. package/dist/__stampers__/passkey/base.d.ts +16 -0
  56. package/dist/__stampers__/passkey/base.d.ts.map +1 -0
  57. package/dist/__stampers__/passkey/base.js +138 -0
  58. package/dist/__stampers__/passkey/base.js.map +1 -0
  59. package/dist/__stampers__/passkey/base.mjs +134 -0
  60. package/dist/__stampers__/passkey/base.mjs.map +1 -0
  61. package/dist/__storage__/base.d.ts +3 -0
  62. package/dist/__storage__/base.d.ts.map +1 -0
  63. package/dist/__storage__/base.js +27 -0
  64. package/dist/__storage__/base.js.map +1 -0
  65. package/dist/__storage__/base.mjs +25 -0
  66. package/dist/__storage__/base.mjs.map +1 -0
  67. package/dist/__storage__/mobile/storage.d.ts +18 -0
  68. package/dist/__storage__/mobile/storage.d.ts.map +1 -0
  69. package/dist/__storage__/mobile/storage.js +76 -0
  70. package/dist/__storage__/mobile/storage.js.map +1 -0
  71. package/dist/__storage__/mobile/storage.mjs +74 -0
  72. package/dist/__storage__/mobile/storage.mjs.map +1 -0
  73. package/dist/__storage__/web/storage.d.ts +19 -0
  74. package/dist/__storage__/web/storage.d.ts.map +1 -0
  75. package/dist/__storage__/web/storage.js +79 -0
  76. package/dist/__storage__/web/storage.js.map +1 -0
  77. package/dist/__storage__/web/storage.mjs +77 -0
  78. package/dist/__storage__/web/storage.mjs.map +1 -0
  79. package/dist/__typedoc-entry__/index.d.ts +3 -0
  80. package/dist/__typedoc-entry__/index.d.ts.map +1 -0
  81. package/dist/__types__/auth.d.ts +120 -0
  82. package/dist/__types__/auth.d.ts.map +1 -0
  83. package/dist/__types__/auth.js +7 -0
  84. package/dist/__types__/auth.js.map +1 -0
  85. package/dist/__types__/auth.mjs +5 -0
  86. package/dist/__types__/auth.mjs.map +1 -0
  87. package/dist/__types__/config.d.ts +145 -0
  88. package/dist/__types__/config.d.ts.map +1 -0
  89. package/dist/__types__/enums.d.ts +59 -0
  90. package/dist/__types__/enums.d.ts.map +1 -0
  91. package/dist/__types__/enums.js +72 -0
  92. package/dist/__types__/enums.js.map +1 -0
  93. package/dist/__types__/enums.mjs +70 -0
  94. package/dist/__types__/enums.mjs.map +1 -0
  95. package/dist/__types__/error.d.ts +13 -0
  96. package/dist/__types__/error.d.ts.map +1 -0
  97. package/dist/__types__/error.js +18 -0
  98. package/dist/__types__/error.js.map +1 -0
  99. package/dist/__types__/error.mjs +16 -0
  100. package/dist/__types__/error.mjs.map +1 -0
  101. package/dist/__types__/export.d.ts +10 -0
  102. package/dist/__types__/export.d.ts.map +1 -0
  103. package/dist/__types__/external-wallets.d.ts +203 -0
  104. package/dist/__types__/external-wallets.d.ts.map +1 -0
  105. package/dist/__types__/http.d.ts +17 -0
  106. package/dist/__types__/http.d.ts.map +1 -0
  107. package/dist/__types__/http.js +11 -0
  108. package/dist/__types__/http.js.map +1 -0
  109. package/dist/__types__/http.mjs +9 -0
  110. package/dist/__types__/http.mjs.map +1 -0
  111. package/dist/__types__/index.d.ts +10 -0
  112. package/dist/__types__/index.d.ts.map +1 -0
  113. package/dist/__types__/method-types/import-export-params.d.ts +38 -0
  114. package/dist/__types__/method-types/import-export-params.d.ts.map +1 -0
  115. package/dist/__types__/method-types/shared.d.ts +378 -0
  116. package/dist/__types__/method-types/shared.d.ts.map +1 -0
  117. package/dist/__wallet__/base.d.ts +14 -0
  118. package/dist/__wallet__/base.d.ts.map +1 -0
  119. package/dist/__wallet__/base.js +35 -0
  120. package/dist/__wallet__/base.js.map +1 -0
  121. package/dist/__wallet__/base.mjs +33 -0
  122. package/dist/__wallet__/base.mjs.map +1 -0
  123. package/dist/__wallet__/connector.d.ts +60 -0
  124. package/dist/__wallet__/connector.d.ts.map +1 -0
  125. package/dist/__wallet__/connector.js +93 -0
  126. package/dist/__wallet__/connector.js.map +1 -0
  127. package/dist/__wallet__/connector.mjs +91 -0
  128. package/dist/__wallet__/connector.mjs.map +1 -0
  129. package/dist/__wallet__/mobile/manager.d.ts +51 -0
  130. package/dist/__wallet__/mobile/manager.d.ts.map +1 -0
  131. package/dist/__wallet__/mobile/manager.js +115 -0
  132. package/dist/__wallet__/mobile/manager.js.map +1 -0
  133. package/dist/__wallet__/mobile/manager.mjs +113 -0
  134. package/dist/__wallet__/mobile/manager.mjs.map +1 -0
  135. package/dist/__wallet__/stamper.d.ts +90 -0
  136. package/dist/__wallet__/stamper.d.ts.map +1 -0
  137. package/dist/__wallet__/stamper.js +183 -0
  138. package/dist/__wallet__/stamper.js.map +1 -0
  139. package/dist/__wallet__/stamper.mjs +180 -0
  140. package/dist/__wallet__/stamper.mjs.map +1 -0
  141. package/dist/__wallet__/wallet-connect/base.d.ts +182 -0
  142. package/dist/__wallet__/wallet-connect/base.d.ts.map +1 -0
  143. package/dist/__wallet__/wallet-connect/base.js +606 -0
  144. package/dist/__wallet__/wallet-connect/base.js.map +1 -0
  145. package/dist/__wallet__/wallet-connect/base.mjs +604 -0
  146. package/dist/__wallet__/wallet-connect/base.mjs.map +1 -0
  147. package/dist/__wallet__/wallet-connect/client.d.ts +132 -0
  148. package/dist/__wallet__/wallet-connect/client.d.ts.map +1 -0
  149. package/dist/__wallet__/wallet-connect/client.js +262 -0
  150. package/dist/__wallet__/wallet-connect/client.js.map +1 -0
  151. package/dist/__wallet__/wallet-connect/client.mjs +260 -0
  152. package/dist/__wallet__/wallet-connect/client.mjs.map +1 -0
  153. package/dist/__wallet__/web/manager.d.ts +70 -0
  154. package/dist/__wallet__/web/manager.d.ts.map +1 -0
  155. package/dist/__wallet__/web/manager.js +177 -0
  156. package/dist/__wallet__/web/manager.js.map +1 -0
  157. package/dist/__wallet__/web/manager.mjs +175 -0
  158. package/dist/__wallet__/web/manager.mjs.map +1 -0
  159. package/dist/__wallet__/web/native/ethereum.d.ts +101 -0
  160. package/dist/__wallet__/web/native/ethereum.d.ts.map +1 -0
  161. package/dist/__wallet__/web/native/ethereum.js +339 -0
  162. package/dist/__wallet__/web/native/ethereum.js.map +1 -0
  163. package/dist/__wallet__/web/native/ethereum.mjs +336 -0
  164. package/dist/__wallet__/web/native/ethereum.mjs.map +1 -0
  165. package/dist/__wallet__/web/native/solana.d.ts +72 -0
  166. package/dist/__wallet__/web/native/solana.d.ts.map +1 -0
  167. package/dist/__wallet__/web/native/solana.js +215 -0
  168. package/dist/__wallet__/web/native/solana.js.map +1 -0
  169. package/dist/__wallet__/web/native/solana.mjs +212 -0
  170. package/dist/__wallet__/web/native/solana.mjs.map +1 -0
  171. package/dist/index.d.ts +19 -0
  172. package/dist/index.d.ts.map +1 -0
  173. package/dist/index.js +83 -0
  174. package/dist/index.js.map +1 -0
  175. package/dist/index.mjs +10 -0
  176. package/dist/index.mjs.map +1 -0
  177. package/dist/utils.d.ts +160 -0
  178. package/dist/utils.d.ts.map +1 -0
  179. package/dist/utils.js +1047 -0
  180. package/dist/utils.js.map +1 -0
  181. package/dist/utils.mjs +1007 -0
  182. package/dist/utils.mjs.map +1 -0
  183. package/package.json +80 -0
@@ -0,0 +1,606 @@
1
+ 'use strict';
2
+
3
+ var encoding = require('@0xkey-io/encoding');
4
+ var viem = require('viem');
5
+ var crypto = require('@0xkey-io/crypto');
6
+ var enums = require('../../__types__/enums.js');
7
+ var ethers = require('ethers');
8
+
9
+ class WalletConnectWallet {
10
+ addChangeListener(listener) {
11
+ this.changeListeners.add(listener);
12
+ return () => this.changeListeners.delete(listener);
13
+ }
14
+ notifyChange(event) {
15
+ this.changeListeners.forEach((listener) => listener(event));
16
+ }
17
+ /**
18
+ * Constructs a WalletConnectWallet bound to a WalletConnect client.
19
+ *
20
+ * - Subscribes to session deletions and automatically re-initiates pairing,
21
+ * updating `this.uri` so the UI can present a fresh QR/deeplink.
22
+ *
23
+ * @param client - The low-level WalletConnect client used for session/RPC.
24
+ * @param ensureReady - Optional callback to ensure WalletConnect is initialized before operations.
25
+ * @param namespaces - Optional namespace configuration to set up configured chains.
26
+ */
27
+ constructor(client, ensureReady, namespaces) {
28
+ this.client = client;
29
+ this.ensureReady = ensureReady;
30
+ this.interfaceType = enums.WalletInterfaceType.WalletConnect;
31
+ this.ethereumNamespaces = [];
32
+ this.solanaNamespaces = [];
33
+ this.isRegeneratingUri = false;
34
+ this.isInitialized = false;
35
+ this.changeListeners = new Set();
36
+ if (namespaces) {
37
+ this.ethereumNamespaces = namespaces.ethereumNamespaces;
38
+ if (this.ethereumNamespaces.length > 0) {
39
+ this.ethChain = this.ethereumNamespaces[0];
40
+ }
41
+ this.solanaNamespaces = namespaces.solanaNamespaces;
42
+ if (this.solanaNamespaces.length > 0) {
43
+ this.solChain = this.solanaNamespaces[0];
44
+ }
45
+ }
46
+ // session updated (actual update to the session for example adding a chain to namespaces)
47
+ this.client.onSessionUpdate(() => {
48
+ this.notifyChange({ type: "update" });
49
+ });
50
+ // chain switched
51
+ this.client.onSessionEvent(({ event }) => {
52
+ if (event?.name === "chainChanged" || event?.name === "accountsChanged") {
53
+ const chainId = typeof event.data?.chainId === "string"
54
+ ? event.data.chainId
55
+ : undefined;
56
+ this.notifyChange({ type: "chainChanged", chainId });
57
+ }
58
+ });
59
+ // session disconnected
60
+ this.client.onSessionDelete(() => {
61
+ this.notifyChange({ type: "disconnect" });
62
+ });
63
+ // pairing expired without a session being established
64
+ this.client.onPairingExpire(async () => {
65
+ // prevent multiple simultaneous regenerations
66
+ if (this.isRegeneratingUri)
67
+ return;
68
+ this.isRegeneratingUri = true;
69
+ try {
70
+ // we cancel the previous pairing, if any
71
+ // this is to avoid multiple pairings
72
+ // we also error if there is an active pairing
73
+ // and we try to create a new one
74
+ await this.client.cancelPairing();
75
+ const namespaces = this.buildNamespaces();
76
+ const newUri = await this.client.pair(namespaces);
77
+ this.uri = newUri;
78
+ this.notifyChange({ type: "proposalExpired" });
79
+ }
80
+ catch (error) {
81
+ console.error("failed to regenerate URI:", error);
82
+ }
83
+ finally {
84
+ this.isRegeneratingUri = false;
85
+ }
86
+ });
87
+ }
88
+ /**
89
+ * Initializes WalletConnect pairing flow.
90
+ *
91
+ * - If an active session already has connected accounts, pairing is skipped.
92
+ * - Otherwise initiates a pairing and stores the resulting URI.
93
+ * - Namespaces should be set via constructor for this to work.
94
+ *
95
+ * @throws {Error} If no namespaces were configured in constructor.
96
+ */
97
+ async init() {
98
+ // we create a new abort controller for this initialization
99
+ // that way if the WalletManager wants to abort it (if this takes too long)
100
+ // then it can do so without leaving this init promise in the background
101
+ this.initAbortController = new AbortController();
102
+ try {
103
+ if (this.ethereumNamespaces.length === 0 &&
104
+ this.solanaNamespaces.length === 0) {
105
+ throw new Error("At least one namespace must be enabled for WalletConnect");
106
+ }
107
+ // we don't want to create more than one active session
108
+ // so we don't make a pair request if one is already active
109
+ // since pairing would mean initializing a new session
110
+ const session = this.client.getSession();
111
+ if (hasConnectedAccounts(session)) {
112
+ this.isInitialized = true;
113
+ // we notify that initialization is complete
114
+ this.notifyChange({ type: "initialized" });
115
+ return;
116
+ }
117
+ const namespaces = this.buildNamespaces();
118
+ await this.client.pair(namespaces).then((newUri) => {
119
+ this.uri = newUri;
120
+ this.isInitialized = true;
121
+ // we notify that initialization is complete
122
+ this.notifyChange({ type: "initialized" });
123
+ });
124
+ }
125
+ catch (error) {
126
+ // we emit a failed event
127
+ this.notifyChange({ type: "failed", error });
128
+ throw error;
129
+ }
130
+ finally {
131
+ this.initAbortController = undefined;
132
+ }
133
+ }
134
+ /**
135
+ * Aborts the ongoing initialization if one is in progress.
136
+ * Emits a failed event with the abort error.
137
+ *
138
+ * @param error - Optional error to include in the failed event. Defaults to abort message.
139
+ */
140
+ abortInit(error) {
141
+ if (this.initAbortController) {
142
+ this.initAbortController.abort();
143
+ // we emit failed event so listeners are notified
144
+ this.notifyChange({
145
+ type: "failed",
146
+ error: error || new Error("WalletConnect initialization was aborted"),
147
+ });
148
+ }
149
+ }
150
+ /**
151
+ * Returns WalletConnect providers with associated chain/account metadata.
152
+ *
153
+ * - Builds an EVM provider (if Ethereum namespaces are enabled).
154
+ * - Builds a Solana provider (if Solana namespaces are enabled).
155
+ * - Before initialization, returns placeholder providers with isLoading: true.
156
+ *
157
+ * @returns A promise resolving to an array of WalletProvider objects.
158
+ */
159
+ async getProviders() {
160
+ const session = this.client.getSession();
161
+ const info = {
162
+ name: "WalletConnect",
163
+ icon: "https://raw.githubusercontent.com/WalletConnect/walletconnect-assets/refs/heads/master/Icon/Blue%20(Default)/Icon.svg",
164
+ };
165
+ const providers = [];
166
+ if (this.ethereumNamespaces.length > 0) {
167
+ providers.push(await this.buildEthProvider(session, info));
168
+ }
169
+ if (this.solanaNamespaces.length > 0) {
170
+ providers.push(this.buildSolProvider(session, info));
171
+ }
172
+ return providers;
173
+ }
174
+ /**
175
+ * Approves the session if needed and ensures at least one account is available.
176
+ *
177
+ * - Calls `approve()` on the underlying client when pairing is pending.
178
+ * - Throws if the approved session contains no connected accounts.
179
+ * - Waits for WalletConnect initialization if still in progress.
180
+ *
181
+ * @param _provider - Unused (present for interface compatibility).
182
+ * @returns A promise that resolves with the connected wallet's address.
183
+ * @throws {Error} If the session contains no accounts.
184
+ */
185
+ async connectWalletAccount(provider) {
186
+ // we ensure WalletConnect is fully initialized before connecting
187
+ if (this.ensureReady) {
188
+ await this.ensureReady();
189
+ }
190
+ const session = await this.client.approve();
191
+ let address;
192
+ switch (provider.chainInfo.namespace) {
193
+ case enums.Chain.Ethereum:
194
+ address = getConnectedEthereum(session);
195
+ break;
196
+ case enums.Chain.Solana:
197
+ address = getConnectedSolana(session);
198
+ break;
199
+ default:
200
+ throw new Error(`Unsupported namespace: ${provider.chainInfo}`);
201
+ }
202
+ if (!address) {
203
+ throw new Error("No connected account found");
204
+ }
205
+ return address;
206
+ }
207
+ /**
208
+ * Switches the user's WalletConnect session to a new EVM chain.
209
+ *
210
+ * - Ethereum-only: only supported for providers on the Ethereum namespace.
211
+ * - No add-then-switch: WalletConnect cannot add chains mid-session. The target chain
212
+ * must be present in `ethereumNamespaces` negotiated at pairing time. To support a new chain,
213
+ * you must include it in the walletConfig.
214
+ * - Accepts a hex chain ID (e.g., "0x1"). If a `SwitchableChain` is passed, only its `id`
215
+ * (hex chain ID) is used; metadata is ignored for WalletConnect.
216
+ * - Waits for WalletConnect initialization if still in progress.
217
+ *
218
+ * @param provider - The WalletProvider returned by `getProviders()`.
219
+ * @param chainOrId - Hex chain ID (e.g., "0x1") or a `SwitchableChain` (its `id` is used).
220
+ * @returns A promise that resolves when the switch completes.
221
+ * @throws {Error} If no active session, provider is non-EVM, the chain is not in `ethereumNamespaces`,
222
+ * or the switch RPC fails.
223
+ */
224
+ async switchChain(provider, chainOrId) {
225
+ // we ensure WalletConnect is fully initialized
226
+ if (this.ensureReady) {
227
+ await this.ensureReady();
228
+ }
229
+ if (provider.chainInfo.namespace !== enums.Chain.Ethereum) {
230
+ throw new Error("Only EVM wallets support chain switching");
231
+ }
232
+ const session = this.client.getSession();
233
+ if (!session) {
234
+ throw new Error("No active WalletConnect session");
235
+ }
236
+ const hexChainId = typeof chainOrId === "string" ? chainOrId : chainOrId.id;
237
+ const caip = `eip155:${Number.parseInt(hexChainId, 16)}`;
238
+ if (!this.ethereumNamespaces.includes(caip)) {
239
+ throw new Error(`Unsupported chain ${caip}. Supported chains: ${this.ethereumNamespaces.join(", ")}. If you’d like to support ${caip}, add it to the \`ethereumNamespaces\` in your WalletConnect config.`);
240
+ }
241
+ try {
242
+ // first we just try switching
243
+ await this.client.request(this.ethChain, "wallet_switchEthereumChain", [
244
+ { chainId: hexChainId },
245
+ ]);
246
+ this.ethChain = caip;
247
+ }
248
+ catch (err) {
249
+ throw new Error(`Failed to switch chain: ${err.message || err.toString()}`);
250
+ }
251
+ }
252
+ /**
253
+ * Signs a message or transaction using the specified wallet provider and intent.
254
+ *
255
+ * - Ensures an active WalletConnect session:
256
+ * - If a pairing is in progress (URI shown but not yet approved), this call will
257
+ * wait for the user to approve the session and may appear stuck until they do.
258
+ * - If no pairing is in progress, this will throw (e.g., "call pair() before approve()").
259
+ * - Ethereum:
260
+ * - `SignMessage` → `personal_sign` (returns hex signature).
261
+ * - `SignAndSendTransaction` → `eth_sendTransaction` (returns tx hash).
262
+ * - Solana:
263
+ * - `SignMessage` → `solana_signMessage` (returns hex signature).
264
+ * - `SignTransaction` → `solana_signTransaction` (returns hex signature).
265
+ * - `SignAndSendTransaction` → `solana_sendTransaction` (returns hex signature of the submitted tx).
266
+ *
267
+ * @param payload - Payload or serialized transaction to sign.
268
+ * @param provider - The WalletProvider to use.
269
+ * @param intent - The signing intent.
270
+ * @returns A hex string (signature or transaction hash, depending on intent).
271
+ * @throws {Error} If no account is available, no pairing is in progress, or the intent is unsupported.
272
+ */
273
+ async sign(payload, provider, intent) {
274
+ const session = await this.ensureSession();
275
+ if (!hasConnectedAccounts(session)) {
276
+ await this.connectWalletAccount(provider);
277
+ }
278
+ if (provider.chainInfo.namespace === enums.Chain.Ethereum) {
279
+ const address = getConnectedEthereum(session);
280
+ if (!address) {
281
+ throw new Error("no Ethereum account to sign with");
282
+ }
283
+ switch (intent) {
284
+ case enums.SignIntent.SignMessage:
285
+ return (await this.client.request(this.ethChain, "personal_sign", [
286
+ payload,
287
+ address,
288
+ ]));
289
+ case enums.SignIntent.SignAndSendTransaction:
290
+ const account = provider.connectedAddresses[0];
291
+ if (!account)
292
+ throw new Error("no connected address");
293
+ const tx = ethers.Transaction.from(payload);
294
+ const base = {
295
+ from: account,
296
+ to: tx.to?.toString(),
297
+ value: viem.toHex(tx.value),
298
+ gas: viem.toHex(tx.gasLimit),
299
+ nonce: viem.toHex(tx.nonce),
300
+ chainId: viem.toHex(tx.chainId),
301
+ data: tx.data?.toString() ?? "0x",
302
+ };
303
+ // Some libs use undefined for legacy, so normalize
304
+ const txType = tx.type ?? 0;
305
+ let txParams;
306
+ if (txType === undefined || txType === 0 || txType === 1) {
307
+ // legacy or EIP-2930 (gasPrice-based)
308
+ if (tx.gasPrice == null) {
309
+ throw new Error("Legacy or EIP-2930 transaction missing gasPrice");
310
+ }
311
+ txParams = {
312
+ ...base,
313
+ gasPrice: viem.toHex(tx.gasPrice),
314
+ };
315
+ }
316
+ else {
317
+ // EIP-1559 or future fee-market types
318
+ if (tx.maxFeePerGas == null || tx.maxPriorityFeePerGas == null) {
319
+ throw new Error("EIP-1559-style transaction missing maxFeePerGas or maxPriorityFeePerGas");
320
+ }
321
+ txParams = {
322
+ ...base,
323
+ maxFeePerGas: viem.toHex(tx.maxFeePerGas),
324
+ maxPriorityFeePerGas: viem.toHex(tx.maxPriorityFeePerGas),
325
+ };
326
+ }
327
+ return (await this.client.request(this.ethChain, "eth_sendTransaction", [txParams]));
328
+ default:
329
+ throw new Error(`Unsupported Ethereum intent: ${intent}`);
330
+ }
331
+ }
332
+ if (provider.chainInfo.namespace === enums.Chain.Solana) {
333
+ const address = getConnectedSolana(session);
334
+ if (!address) {
335
+ throw new Error("no Solana account to sign with");
336
+ }
337
+ switch (intent) {
338
+ case enums.SignIntent.SignMessage: {
339
+ const msgBytes = new TextEncoder().encode(payload);
340
+ const msgB58 = encoding.bs58.encode(msgBytes);
341
+ const { signature: sigB58 } = await this.client.request(this.solChain, "solana_signMessage", {
342
+ pubkey: address,
343
+ message: msgB58,
344
+ });
345
+ return encoding.uint8ArrayToHexString(encoding.bs58.decode(sigB58));
346
+ }
347
+ case enums.SignIntent.SignTransaction: {
348
+ const txBytes = encoding.uint8ArrayFromHexString(payload);
349
+ const txBase64 = encoding.stringToBase64urlString(String.fromCharCode(...txBytes));
350
+ const { signature: sigB58 } = await this.client.request(this.solChain, "solana_signTransaction", {
351
+ feePayer: address,
352
+ transaction: txBase64,
353
+ });
354
+ return encoding.uint8ArrayToHexString(encoding.bs58.decode(sigB58));
355
+ }
356
+ case enums.SignIntent.SignAndSendTransaction: {
357
+ const txBytes = encoding.uint8ArrayFromHexString(payload);
358
+ const txBase64 = encoding.stringToBase64urlString(String.fromCharCode(...txBytes));
359
+ const sigB58 = await this.client.request(this.solChain, "solana_sendTransaction", {
360
+ feePayer: address,
361
+ transaction: txBase64,
362
+ options: { skipPreflight: false },
363
+ });
364
+ return encoding.uint8ArrayToHexString(encoding.bs58.decode(sigB58));
365
+ }
366
+ default:
367
+ throw new Error(`Unsupported Solana intent: ${intent}`);
368
+ }
369
+ }
370
+ throw new Error("No supported namespace available for signing");
371
+ }
372
+ /**
373
+ * Retrieves the public key of the connected wallet.
374
+ *
375
+ * - Ethereum: signs a fixed challenge and recovers the compressed secp256k1 public key.
376
+ * - Solana: decodes the base58-encoded address to raw bytes.
377
+ * - Waits for WalletConnect initialization if still in progress.
378
+ *
379
+ * @param provider - The WalletProvider to fetch the key from.
380
+ * @returns A compressed public key as a hex string.
381
+ * @throws {Error} If no account is available or the namespace is unsupported.
382
+ */
383
+ async getPublicKey(provider) {
384
+ // we ensure WalletConnect is fully initialized
385
+ if (this.ensureReady) {
386
+ await this.ensureReady();
387
+ }
388
+ const session = this.client.getSession();
389
+ if (provider.chainInfo.namespace === enums.Chain.Ethereum) {
390
+ const address = getConnectedEthereum(session);
391
+ if (!address) {
392
+ throw new Error("No Ethereum account to retrieve public key");
393
+ }
394
+ const sig = await this.client.request(this.ethChain, "personal_sign", [
395
+ "GET_PUBLIC_KEY",
396
+ address,
397
+ ]);
398
+ const rawPublicKey = await viem.recoverPublicKey({
399
+ hash: viem.hashMessage("GET_PUBLIC_KEY"),
400
+ signature: sig,
401
+ });
402
+ const publicKeyHex = rawPublicKey.startsWith("0x")
403
+ ? rawPublicKey.slice(2)
404
+ : rawPublicKey;
405
+ const publicKeyBytes = encoding.uint8ArrayFromHexString(publicKeyHex);
406
+ const publicKeyBytesCompressed = crypto.compressRawPublicKey(publicKeyBytes);
407
+ return encoding.uint8ArrayToHexString(publicKeyBytesCompressed);
408
+ }
409
+ if (provider.chainInfo.namespace === enums.Chain.Solana) {
410
+ const address = getConnectedSolana(session);
411
+ if (!address) {
412
+ throw new Error("No Solana account to retrieve public key");
413
+ }
414
+ const publicKeyBytes = encoding.bs58.decode(address);
415
+ return encoding.uint8ArrayToHexString(publicKeyBytes);
416
+ }
417
+ throw new Error("No supported namespace for public key retrieval");
418
+ }
419
+ /**
420
+ * Disconnects the current session and re-initiates a fresh pairing URI.
421
+ *
422
+ * - Calls `disconnect()` on the client, then `pair()` with current namespaces.
423
+ * - Updates `this.uri` so the UI can present a new QR/deeplink.
424
+ */
425
+ async disconnectWalletAccount(_provider) {
426
+ await this.client.disconnect();
427
+ const namespaces = this.buildNamespaces();
428
+ await this.client.pair(namespaces).then((newUri) => {
429
+ this.uri = newUri;
430
+ });
431
+ // we emit a disconnect event because WalletConnect doesn't
432
+ this.notifyChange({ type: "disconnect" });
433
+ }
434
+ /**
435
+ * Builds a lightweight provider interface for the given chain.
436
+ *
437
+ * @param chainId - Namespace chain ID (e.g., "eip155:1" or "solana:101").
438
+ * @returns A WalletConnect-compatible provider that proxies JSON-RPC via WC.
439
+ */
440
+ makeProvider(chainId) {
441
+ return {
442
+ request: ({ method, params }) => this.client.request(chainId, method, params),
443
+ features: {
444
+ "standard:events": {
445
+ on: (event, callback) => {
446
+ if (event !== "change")
447
+ return () => { };
448
+ return this.addChangeListener(callback);
449
+ },
450
+ },
451
+ },
452
+ };
453
+ }
454
+ /**
455
+ * Ensures there is an active WalletConnect session, initiating approval if necessary.
456
+ *
457
+ * - If a session exists, returns it immediately.
458
+ * - If no session exists but a pairing is in progress, awaits `approve()` —
459
+ * this will block until the user approves (or rejects) in their wallet.
460
+ * - If no session exists and no pairing is in progress, throws; the caller
461
+ * must have initiated pairing via `pair()` elsewhere.
462
+ *
463
+ * @returns The active WalletConnect session.
464
+ * @throws {Error} If approval is rejected, completes without establishing a session,
465
+ * or no pairing is in progress.
466
+ */
467
+ async ensureSession() {
468
+ let session = this.client.getSession();
469
+ if (!session) {
470
+ await this.client.approve();
471
+ session = this.client.getSession();
472
+ if (!session)
473
+ throw new Error("WalletConnect: approval failed");
474
+ }
475
+ return session;
476
+ }
477
+ /**
478
+ * Builds a WalletProvider descriptor for an EVM chain.
479
+ *
480
+ * - Extracts the connected address (if any) and current chain ID.
481
+ * - Includes the pairing `uri` if available.
482
+ *
483
+ * @param session - Current WalletConnect session (or null).
484
+ * @param info - Provider branding info (name, icon).
485
+ * @returns A WalletProvider object for Ethereum.
486
+ */
487
+ async buildEthProvider(session, info) {
488
+ const address = getConnectedEthereum(session);
489
+ const chainIdString = this.ethChain.split(":")[1] ?? "1";
490
+ const chainIdDecimal = Number(chainIdString);
491
+ const chainidHex = `0x${chainIdDecimal.toString(16)}`;
492
+ return {
493
+ interfaceType: enums.WalletInterfaceType.WalletConnect,
494
+ chainInfo: {
495
+ namespace: enums.Chain.Ethereum,
496
+ chainId: chainidHex,
497
+ },
498
+ info,
499
+ provider: this.makeProvider(this.ethChain),
500
+ connectedAddresses: address ? [address] : [],
501
+ ...(this.uri && { uri: this.uri }),
502
+ isLoading: !this.isInitialized,
503
+ };
504
+ }
505
+ /**
506
+ * Builds a WalletProvider descriptor for Solana.
507
+ *
508
+ * - Extracts the connected address (if any).
509
+ * - Includes the fresh pairing `uri` if available.
510
+ *
511
+ * @param session - Current WalletConnect session (or null).
512
+ * @param info - Provider branding info (name, icon).
513
+ * @returns A WalletProvider object for Solana.
514
+ */
515
+ buildSolProvider(session, info) {
516
+ const raw = session?.namespaces.solana?.accounts?.[0] ?? "";
517
+ const address = raw.split(":")[2];
518
+ return {
519
+ interfaceType: enums.WalletInterfaceType.WalletConnect,
520
+ chainInfo: { namespace: enums.Chain.Solana },
521
+ info,
522
+ provider: this.makeProvider(this.solChain),
523
+ connectedAddresses: address ? [address] : [],
524
+ ...(this.uri && { uri: this.uri }),
525
+ isLoading: !this.isInitialized,
526
+ };
527
+ }
528
+ /**
529
+ * Builds the requested WalletConnect namespaces from the current config.
530
+ *
531
+ * - Includes methods and events for Ethereum and/or Solana based on enabled namespaces.
532
+ *
533
+ * @returns A namespaces object suitable for `WalletConnectClient.pair()`.
534
+ */
535
+ buildNamespaces() {
536
+ const namespaces = {};
537
+ if (this.ethereumNamespaces.length > 0) {
538
+ namespaces.eip155 = {
539
+ methods: [
540
+ "personal_sign",
541
+ "eth_sendTransaction",
542
+ "eth_chainId",
543
+ "wallet_switchEthereumChain",
544
+ "wallet_addEthereumChain",
545
+ ],
546
+ chains: this.ethereumNamespaces,
547
+ events: ["accountsChanged", "chainChanged"],
548
+ };
549
+ }
550
+ if (this.solanaNamespaces.length > 0) {
551
+ namespaces.solana = {
552
+ methods: [
553
+ "solana_signMessage",
554
+ "solana_signTransaction",
555
+ "solana_sendTransaction",
556
+ ],
557
+ chains: this.solanaNamespaces,
558
+ events: ["accountsChanged", "chainChanged"],
559
+ };
560
+ }
561
+ return namespaces;
562
+ }
563
+ }
564
+ /**
565
+ * Determines whether the session has at least one connected account
566
+ * across any namespace.
567
+ *
568
+ * - Safe to call with `null` (returns `false`).
569
+ * - Checks all namespaces for a non-empty `accounts` array.
570
+ *
571
+ * @param session - The current WalletConnect session, or `null`.
572
+ * @returns `true` if any namespace has ≥1 account; otherwise `false`.
573
+ */
574
+ function hasConnectedAccounts(session) {
575
+ return (!!session &&
576
+ Object.values(session.namespaces).some((ns) => ns.accounts?.length > 0));
577
+ }
578
+ /**
579
+ * Retrieves the first connected Ethereum account.
580
+ *
581
+ * - Safe to call with `null` (returns `undefined`).
582
+ * - Returns only the address portion (e.g., `0xabc...`), not the full CAIP string.
583
+ *
584
+ * @param session - The current WalletConnect session, or `null`.
585
+ * @returns The connected EVM address, or `undefined` if none.
586
+ */
587
+ function getConnectedEthereum(session) {
588
+ const acc = session?.namespaces.eip155?.accounts?.[0];
589
+ return acc ? acc.split(":")[2] : undefined;
590
+ }
591
+ /**
592
+ * Retrieves the first connected Solana account.
593
+ *
594
+ * - Safe to call with `null` (returns `undefined`).
595
+ * - Returns only the base58 address portion, not the full CAIP string.
596
+ *
597
+ * @param session - The current WalletConnect session, or `null`.
598
+ * @returns The connected Solana address (base58), or `undefined` if none.
599
+ */
600
+ function getConnectedSolana(session) {
601
+ const acc = session?.namespaces.solana?.accounts?.[0];
602
+ return acc ? acc.split(":")[2] : undefined;
603
+ }
604
+
605
+ exports.WalletConnectWallet = WalletConnectWallet;
606
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sources":["../../../src/__wallet__/wallet-connect/base.ts"],"sourcesContent":[null],"names":["WalletInterfaceType","Chain","SignIntent","Transaction","toHex","bs58","uint8ArrayToHexString","uint8ArrayFromHexString","stringToBase64urlString","recoverPublicKey","hashMessage","compressRawPublicKey"],"mappings":"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"}