@cartridge/controller 0.7.8 → 0.7.9-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/.turbo/turbo-build$colon$deps.log +49 -59
  2. package/.turbo/turbo-build.log +45 -63
  3. package/.turbo/turbo-format.log +39 -0
  4. package/dist/account.d.ts +35 -0
  5. package/dist/constants.d.ts +3 -0
  6. package/dist/controller.d.ts +3 -6
  7. package/dist/errors.d.ts +3 -0
  8. package/dist/icon.d.ts +1 -0
  9. package/dist/iframe/base.d.ts +26 -0
  10. package/dist/iframe/index.d.ts +3 -0
  11. package/dist/iframe/keychain.d.ts +10 -0
  12. package/dist/iframe/profile.d.ts +12 -0
  13. package/dist/index.d.ts +6 -67
  14. package/dist/index.js +1124 -1064
  15. package/dist/index.js.map +1 -1
  16. package/dist/lookup.d.ts +2 -4
  17. package/dist/mutex.d.ts +12 -0
  18. package/dist/node/index.cjs +1 -12
  19. package/dist/node/index.cjs.map +1 -1
  20. package/dist/node/index.d.cts +95 -8
  21. package/dist/node/index.d.ts +95 -8
  22. package/dist/node/index.js +2 -12
  23. package/dist/node/index.js.map +1 -1
  24. package/dist/policies.d.ts +15 -0
  25. package/dist/provider-CGv2ANQX.js +286 -0
  26. package/dist/provider-CGv2ANQX.js.map +1 -0
  27. package/dist/provider.d.ts +21 -0
  28. package/dist/session/account.d.ts +31 -0
  29. package/dist/session/backend.d.ts +58 -0
  30. package/dist/session/index.d.ts +4 -38
  31. package/dist/session/{index.d.cts → provider.d.ts} +4 -10
  32. package/dist/session.d.ts +6 -0
  33. package/dist/session.js +354 -0
  34. package/dist/session.js.map +1 -0
  35. package/dist/stats.html +4949 -0
  36. package/dist/telegram/backend.d.ts +30 -0
  37. package/dist/telegram/provider.d.ts +24 -0
  38. package/dist/types.d.ts +146 -0
  39. package/dist/utils.d.ts +15 -0
  40. package/dist/wallets/argent/index.d.ts +15 -0
  41. package/dist/wallets/bridge.d.ts +31 -0
  42. package/dist/wallets/index.d.ts +5 -0
  43. package/dist/wallets/metamask/index.d.ts +17 -0
  44. package/dist/wallets/phantom/index.d.ts +14 -0
  45. package/dist/wallets/types.d.ts +28 -0
  46. package/package.json +17 -41
  47. package/src/iframe/profile.ts +9 -7
  48. package/src/node/index.ts +1 -1
  49. package/src/wallets/argent/index.ts +8 -2
  50. package/src/wallets/bridge.ts +19 -5
  51. package/src/wallets/metamask/index.ts +8 -0
  52. package/src/wallets/phantom/index.ts +66 -15
  53. package/src/wallets/types.ts +1 -0
  54. package/tsup.node.config.ts +15 -0
  55. package/vite.config.js +82 -0
  56. package/dist/controller.cjs +0 -1272
  57. package/dist/controller.cjs.map +0 -1
  58. package/dist/controller.d.cts +0 -34
  59. package/dist/controller.js +0 -1270
  60. package/dist/controller.js.map +0 -1
  61. package/dist/index.cjs +0 -3389
  62. package/dist/index.cjs.map +0 -1
  63. package/dist/index.d.cts +0 -68
  64. package/dist/lookup.cjs +0 -59
  65. package/dist/lookup.cjs.map +0 -1
  66. package/dist/lookup.d.cts +0 -4
  67. package/dist/lookup.js +0 -56
  68. package/dist/lookup.js.map +0 -1
  69. package/dist/policies-DD1aPjQ4.d.cts +0 -21
  70. package/dist/policies-DD1aPjQ4.d.ts +0 -21
  71. package/dist/provider-BeCgS86X.d.cts +0 -266
  72. package/dist/provider-BeCgS86X.d.ts +0 -266
  73. package/dist/session/index.cjs +0 -484
  74. package/dist/session/index.cjs.map +0 -1
  75. package/dist/session/index.js +0 -478
  76. package/dist/session/index.js.map +0 -1
@@ -1,1270 +0,0 @@
1
- import { shortString, WalletAccount, constants, Provider } from 'starknet';
2
- import { connectToChild } from '@cartridge/penpal';
3
- import { MetaMaskSDK } from '@metamask/sdk';
4
- import { connect } from 'starknetkit';
5
- import { InjectedConnector } from 'starknetkit/injected';
6
- import { Permission } from '@starknet-io/types-js';
7
-
8
- // src/account.ts
9
- var LOCAL_HOSTNAMES = ["localhost", "127.0.0.1", "0.0.0.0"];
10
- function toArray(val) {
11
- return Array.isArray(val) ? val : [val];
12
- }
13
- async function parseChainId(url) {
14
- const parts = url.pathname.split("/");
15
- if (parts.includes("starknet")) {
16
- if (parts.includes("mainnet")) {
17
- return constants.StarknetChainId.SN_MAIN;
18
- } else if (parts.includes("sepolia")) {
19
- return constants.StarknetChainId.SN_SEPOLIA;
20
- }
21
- } else if (parts.length >= 3) {
22
- const projectName = parts[2];
23
- if (parts.includes("katana")) {
24
- return shortString.encodeShortString(
25
- `WP_${projectName.toUpperCase().replace(/-/g, "_")}`
26
- );
27
- } else if (parts.includes("mainnet")) {
28
- return shortString.encodeShortString(
29
- `GG_${projectName.toUpperCase().replace(/-/g, "_")}`
30
- );
31
- }
32
- }
33
- if (LOCAL_HOSTNAMES.includes(url.hostname)) {
34
- const provider = new Provider({
35
- nodeUrl: url.toString()
36
- });
37
- return await provider.getChainId();
38
- }
39
- throw new Error(`Chain ${url.toString()} not supported`);
40
- }
41
-
42
- // src/account.ts
43
- var ControllerAccount = class extends WalletAccount {
44
- address;
45
- keychain;
46
- modal;
47
- options;
48
- constructor(provider, rpcUrl, address, keychain, options, modal) {
49
- super({ nodeUrl: rpcUrl }, provider);
50
- this.address = address;
51
- this.keychain = keychain;
52
- this.options = options;
53
- this.modal = modal;
54
- }
55
- /**
56
- * Invoke execute function in account contract
57
- *
58
- * @param calls the invocation object or an array of them, containing:
59
- * - contractAddress - the address of the contract
60
- * - entrypoint - the entrypoint of the contract
61
- * - calldata - (defaults to []) the calldata
62
- * - signature - (defaults to []) the signature
63
- * @param abis (optional) the abi of the contract for better displaying
64
- *
65
- * @returns response from addTransaction
66
- */
67
- async execute(calls) {
68
- calls = toArray(calls);
69
- return new Promise(async (resolve, reject) => {
70
- const sessionExecute = await this.keychain.execute(
71
- calls,
72
- void 0,
73
- void 0,
74
- false
75
- );
76
- if (sessionExecute.code === "SUCCESS" /* SUCCESS */) {
77
- resolve(sessionExecute);
78
- return;
79
- }
80
- if (this.options?.propagateSessionErrors && sessionExecute.code !== "USER_INTERACTION_REQUIRED" /* USER_INTERACTION_REQUIRED */) {
81
- reject(sessionExecute.error);
82
- return;
83
- }
84
- this.modal.open();
85
- const manualExecute = await this.keychain.execute(
86
- calls,
87
- void 0,
88
- void 0,
89
- true,
90
- sessionExecute.error
91
- );
92
- if (manualExecute.code === "SUCCESS" /* SUCCESS */) {
93
- resolve(manualExecute);
94
- this.modal.close();
95
- return;
96
- }
97
- reject(manualExecute.error);
98
- return;
99
- });
100
- }
101
- /**
102
- * Sign an JSON object for off-chain usage with the starknet private key and return the signature
103
- * This adds a message prefix so it cant be interchanged with transactions
104
- *
105
- * @param json - JSON object to be signed
106
- * @returns the signature of the JSON object
107
- * @throws {Error} if the JSON object is not a valid JSON
108
- */
109
- async signMessage(typedData2) {
110
- return new Promise(async (resolve, reject) => {
111
- const sessionSign = await this.keychain.signMessage(typedData2, "", true);
112
- if (!("code" in sessionSign)) {
113
- resolve(sessionSign);
114
- return;
115
- }
116
- this.modal.open();
117
- const manualSign = await this.keychain.signMessage(typedData2, "", false);
118
- if (!("code" in manualSign)) {
119
- resolve(manualSign);
120
- } else {
121
- reject(manualSign.error);
122
- }
123
- this.modal.close();
124
- });
125
- }
126
- };
127
- var account_default = ControllerAccount;
128
- var IFrame = class {
129
- url;
130
- iframe;
131
- container;
132
- onClose;
133
- constructor({
134
- id,
135
- url,
136
- preset,
137
- onClose,
138
- onConnect,
139
- methods = {}
140
- }) {
141
- if (typeof document === "undefined") {
142
- return;
143
- }
144
- if (preset) {
145
- url.searchParams.set("preset", preset);
146
- }
147
- this.url = url;
148
- const iframe = document.createElement("iframe");
149
- iframe.src = url.toString();
150
- iframe.id = id;
151
- iframe.style.border = "none";
152
- iframe.sandbox.add("allow-forms");
153
- iframe.sandbox.add("allow-popups");
154
- iframe.sandbox.add("allow-scripts");
155
- iframe.sandbox.add("allow-same-origin");
156
- iframe.allow = "publickey-credentials-create *; publickey-credentials-get *; clipboard-write";
157
- if (!!document.hasStorageAccess) {
158
- iframe.sandbox.add("allow-storage-access-by-user-activation");
159
- }
160
- const container = document.createElement("div");
161
- container.id = "controller";
162
- container.style.position = "fixed";
163
- container.style.height = "100%";
164
- container.style.width = "100%";
165
- container.style.top = "0";
166
- container.style.left = "0";
167
- container.style.zIndex = "10000";
168
- container.style.backgroundColor = "rgba(0,0,0,0.6)";
169
- container.style.display = "flex";
170
- container.style.alignItems = "center";
171
- container.style.justifyContent = "center";
172
- container.style.visibility = "hidden";
173
- container.style.opacity = "0";
174
- container.style.transition = "opacity 0.2s ease";
175
- container.appendChild(iframe);
176
- this.iframe = iframe;
177
- this.container = container;
178
- connectToChild({
179
- iframe: this.iframe,
180
- methods: { close: (_origin) => () => this.close(), ...methods }
181
- }).promise.then(onConnect);
182
- this.resize();
183
- window.addEventListener("resize", () => this.resize());
184
- const observer = new MutationObserver(() => {
185
- const existingController2 = document.getElementById("controller");
186
- if (document.body) {
187
- if (id === "controller-keychain" && !existingController2 || id === "controller-profile") {
188
- document.body.appendChild(container);
189
- observer.disconnect();
190
- }
191
- }
192
- });
193
- observer.observe(document.documentElement, {
194
- childList: true,
195
- subtree: true
196
- });
197
- const existingController = document.getElementById("controller");
198
- if (document.body) {
199
- if (id === "controller-keychain" && !existingController || id === "controller-profile") {
200
- document.body.appendChild(container);
201
- }
202
- }
203
- this.onClose = onClose;
204
- }
205
- open() {
206
- if (!this.container) return;
207
- document.body.style.overflow = "hidden";
208
- this.container.style.visibility = "visible";
209
- this.container.style.opacity = "1";
210
- }
211
- close() {
212
- if (!this.container) return;
213
- this.onClose?.();
214
- document.body.style.overflow = "auto";
215
- this.container.style.visibility = "hidden";
216
- this.container.style.opacity = "0";
217
- }
218
- sendBackward() {
219
- if (!this.container) return;
220
- this.container.style.zIndex = "9999";
221
- }
222
- sendForward() {
223
- if (!this.container) return;
224
- this.container.style.zIndex = "10000";
225
- }
226
- resize() {
227
- if (!this.iframe) return;
228
- this.iframe.style.userSelect = "none";
229
- if (window.innerWidth < 768) {
230
- this.iframe.style.height = "100%";
231
- this.iframe.style.width = "100%";
232
- this.iframe.style.borderRadius = "0";
233
- return;
234
- }
235
- this.iframe.style.height = "600px";
236
- this.iframe.style.width = "432px";
237
- this.iframe.style.borderRadius = "8px";
238
- }
239
- };
240
-
241
- // src/constants.ts
242
- var KEYCHAIN_URL = "https://x.cartridge.gg";
243
- var PROFILE_URL = "https://profile.cartridge.gg";
244
- var MetaMaskWallet = class {
245
- type = "metamask";
246
- platform = "ethereum";
247
- MMSDK;
248
- account = void 0;
249
- constructor() {
250
- this.MMSDK = new MetaMaskSDK({
251
- dappMetadata: {
252
- name: "Cartridge Controller",
253
- url: window.location.href
254
- }
255
- });
256
- }
257
- isAvailable() {
258
- return typeof window !== "undefined" && !!window.ethereum?.isMetaMask;
259
- }
260
- getInfo() {
261
- const available = this.isAvailable();
262
- return {
263
- type: this.type,
264
- available,
265
- version: available ? window.ethereum?.version || "Unknown" : void 0,
266
- chainId: available ? window.ethereum?.chainId : void 0,
267
- name: "MetaMask",
268
- platform: this.platform
269
- };
270
- }
271
- async connect() {
272
- if (this.account) {
273
- return { success: true, wallet: this.type, account: this.account };
274
- }
275
- try {
276
- if (!this.isAvailable()) {
277
- throw new Error("MetaMask is not available");
278
- }
279
- const accounts = await this.MMSDK.connect();
280
- if (accounts && accounts.length > 0) {
281
- this.account = accounts[0];
282
- return { success: true, wallet: this.type, account: this.account };
283
- }
284
- throw new Error("No accounts found");
285
- } catch (error) {
286
- console.error(`Error connecting to MetaMask:`, error);
287
- return {
288
- success: false,
289
- wallet: this.type,
290
- error: error.message || "Unknown error"
291
- };
292
- }
293
- }
294
- async signTransaction(transaction) {
295
- try {
296
- if (!this.isAvailable() || !this.account) {
297
- throw new Error("MetaMask is not connected");
298
- }
299
- const ethereum = this.MMSDK.getProvider();
300
- if (!ethereum) {
301
- throw new Error("MetaMask is not connected");
302
- }
303
- const result = await ethereum.request({
304
- method: "eth_sendTransaction",
305
- params: [transaction]
306
- });
307
- return { success: true, wallet: this.type, result };
308
- } catch (error) {
309
- console.error(`Error signing transaction with MetaMask:`, error);
310
- return {
311
- success: false,
312
- wallet: this.type,
313
- error: error.message || "Unknown error"
314
- };
315
- }
316
- }
317
- async signMessage(message) {
318
- try {
319
- if (!this.isAvailable() || !this.account) {
320
- throw new Error("MetaMask is not connected");
321
- }
322
- const result = await this.MMSDK.connectAndSign({
323
- msg: message
324
- });
325
- return { success: true, wallet: this.type, result };
326
- } catch (error) {
327
- console.error(`Error signing message with MetaMask:`, error);
328
- return {
329
- success: false,
330
- wallet: this.type,
331
- error: error.message || "Unknown error"
332
- };
333
- }
334
- }
335
- async signTypedData(data) {
336
- try {
337
- if (!this.isAvailable() || !this.account) {
338
- throw new Error("MetaMask is not connected");
339
- }
340
- const ethereum = this.MMSDK.getProvider();
341
- if (!ethereum) {
342
- throw new Error("MetaMask is not connected");
343
- }
344
- const result = await ethereum.request({
345
- method: "eth_signTypedData_v4",
346
- params: [this.account, JSON.stringify(data)]
347
- });
348
- return { success: true, wallet: this.type, result };
349
- } catch (error) {
350
- console.error(`Error signing typed data with MetaMask:`, error);
351
- return {
352
- success: false,
353
- wallet: this.type,
354
- error: error.message || "Unknown error"
355
- };
356
- }
357
- }
358
- async switchChain(chainId) {
359
- try {
360
- if (!this.isAvailable()) {
361
- throw new Error("MetaMask is not available");
362
- }
363
- const ethereum = this.MMSDK.getProvider();
364
- if (!ethereum) {
365
- throw new Error("MetaMask is not connected");
366
- }
367
- try {
368
- await ethereum.request({
369
- method: "wallet_switchEthereumChain",
370
- params: [{ chainId }]
371
- });
372
- return true;
373
- } catch (error) {
374
- if (error.code === 4902) {
375
- console.warn("Chain not added to MetaMask");
376
- }
377
- throw error;
378
- }
379
- } catch (error) {
380
- console.error(`Error switching chain for MetaMask:`, error);
381
- return false;
382
- }
383
- }
384
- async getBalance(tokenAddress) {
385
- try {
386
- if (!this.isAvailable() || !this.account) {
387
- throw new Error("MetaMask is not connected");
388
- }
389
- if (tokenAddress) {
390
- return {
391
- success: false,
392
- wallet: this.type,
393
- error: "Not implemented for ERC20"
394
- };
395
- } else {
396
- const ethereum = this.MMSDK.getProvider();
397
- if (!ethereum) {
398
- throw new Error("MetaMask is not connected");
399
- }
400
- const balance = await ethereum.request({
401
- method: "eth_getBalance",
402
- params: [this.account, "latest"]
403
- });
404
- return { success: true, wallet: this.type, result: balance };
405
- }
406
- } catch (error) {
407
- console.error(`Error getting balance from MetaMask:`, error);
408
- return {
409
- success: false,
410
- wallet: this.type,
411
- error: error.message || "Unknown error"
412
- };
413
- }
414
- }
415
- };
416
-
417
- // src/wallets/phantom/index.ts
418
- var PhantomWallet = class {
419
- type = "phantom";
420
- platform = "solana";
421
- account = void 0;
422
- isAvailable() {
423
- return typeof window !== "undefined" && !!window.solana?.isPhantom;
424
- }
425
- getInfo() {
426
- const available = this.isAvailable();
427
- return {
428
- type: this.type,
429
- available,
430
- version: "Unknown",
431
- name: "Phantom",
432
- platform: this.platform
433
- };
434
- }
435
- async connect() {
436
- if (this.account) {
437
- return { success: true, wallet: this.type, account: this.account };
438
- }
439
- try {
440
- if (!this.isAvailable()) {
441
- throw new Error("Phantom is not available");
442
- }
443
- const response = await window.solana.connect();
444
- if (response.publicKey) {
445
- this.account = response.publicKey.toString();
446
- return { success: true, wallet: this.type, account: this.account };
447
- }
448
- throw new Error("No accounts found");
449
- } catch (error) {
450
- console.error(`Error connecting to Phantom:`, error);
451
- return {
452
- success: false,
453
- wallet: this.type,
454
- error: error.message || "Unknown error"
455
- };
456
- }
457
- }
458
- async signTransaction(transaction) {
459
- try {
460
- if (!this.isAvailable() || !this.account) {
461
- throw new Error("Phantom is not connected");
462
- }
463
- const result = await window.solana.signTransaction(transaction);
464
- return { success: true, wallet: this.type, result };
465
- } catch (error) {
466
- console.error(`Error signing transaction with Phantom:`, error);
467
- return {
468
- success: false,
469
- wallet: this.type,
470
- error: error.message || "Unknown error"
471
- };
472
- }
473
- }
474
- async signMessage(message) {
475
- try {
476
- if (!this.isAvailable() || !this.account) {
477
- throw new Error("Phantom is not connected");
478
- }
479
- const encodedMessage = new TextEncoder().encode(message);
480
- const result = await window.solana.signMessage(encodedMessage, "utf8");
481
- return { success: true, wallet: this.type, result };
482
- } catch (error) {
483
- console.error(`Error signing message with Phantom:`, error);
484
- return {
485
- success: false,
486
- wallet: this.type,
487
- error: error.message || "Unknown error"
488
- };
489
- }
490
- }
491
- async switchChain(_chainId) {
492
- console.warn("Chain switching not supported for Phantom");
493
- return false;
494
- }
495
- async getBalance(_tokenAddress) {
496
- try {
497
- if (!this.isAvailable() || !this.account) {
498
- throw new Error("Phantom is not connected");
499
- }
500
- return {
501
- success: true,
502
- wallet: this.type,
503
- result: "Implement based on Phantom API"
504
- };
505
- } catch (error) {
506
- console.error(`Error getting balance from Phantom:`, error);
507
- return {
508
- success: false,
509
- wallet: this.type,
510
- error: error.message || "Unknown error"
511
- };
512
- }
513
- }
514
- };
515
- var ArgentWallet = class {
516
- type = "argent";
517
- platform = "starknet";
518
- wallet = void 0;
519
- account = void 0;
520
- isAvailable() {
521
- return typeof window !== "undefined" && !!window.starknet_argentX;
522
- }
523
- getInfo() {
524
- const available = this.isAvailable();
525
- return {
526
- type: this.type,
527
- available,
528
- version: available ? window.starknet_argentX?.version || "Unknown" : void 0,
529
- chainId: available ? window.starknet_argentX?.chainId : void 0,
530
- name: "Argent",
531
- platform: this.platform
532
- };
533
- }
534
- async connect() {
535
- if (this.account) {
536
- return { success: true, wallet: this.type, account: this.account };
537
- }
538
- try {
539
- if (!this.isAvailable()) {
540
- throw new Error("Argent is not available");
541
- }
542
- const { wallet, connectorData } = await connect({
543
- connectors: [new InjectedConnector({ options: { id: "argentX" } })]
544
- });
545
- if (!wallet) {
546
- throw new Error("No wallet found");
547
- }
548
- this.wallet = wallet;
549
- this.account = connectorData?.account;
550
- return { success: true, wallet: this.type, account: this.account };
551
- } catch (error) {
552
- console.error(`Error connecting to Argent:`, error);
553
- return {
554
- success: false,
555
- wallet: this.type,
556
- error: error.message || "Unknown error"
557
- };
558
- }
559
- }
560
- async signTypedData(data) {
561
- try {
562
- if (!this.isAvailable() || !this.wallet) {
563
- throw new Error("Argent is not connected");
564
- }
565
- console.log("signTypedData", data);
566
- const sig = await this.wallet.request({
567
- type: "wallet_signTypedData",
568
- params: data
569
- });
570
- return { success: true, wallet: this.type, result: sig };
571
- } catch (error) {
572
- console.error(`Error signing typed data with Argent:`, error);
573
- return {
574
- success: false,
575
- wallet: this.type,
576
- error: error.message || "Unknown error"
577
- };
578
- }
579
- }
580
- async switchChain(_chainId) {
581
- console.warn(
582
- "Chain switching for Argent may require custom implementation"
583
- );
584
- return false;
585
- }
586
- async getBalance(_tokenAddress) {
587
- try {
588
- if (!this.isAvailable() || !this.wallet) {
589
- throw new Error("Argent is not connected");
590
- }
591
- return {
592
- success: true,
593
- wallet: this.type,
594
- result: "Implement based on Argent API"
595
- };
596
- } catch (error) {
597
- console.error(`Error getting balance from Argent:`, error);
598
- return {
599
- success: false,
600
- wallet: this.type,
601
- error: error.message || "Unknown error"
602
- };
603
- }
604
- }
605
- };
606
-
607
- // src/wallets/bridge.ts
608
- var WalletBridge = class {
609
- walletAdapters;
610
- connectedWallets = /* @__PURE__ */ new Map();
611
- constructor() {
612
- this.walletAdapters = /* @__PURE__ */ new Map();
613
- this.walletAdapters.set("metamask", new MetaMaskWallet());
614
- this.walletAdapters.set("phantom", new PhantomWallet());
615
- this.walletAdapters.set("argent", new ArgentWallet());
616
- if (typeof window !== "undefined") {
617
- window.wallet_bridge = this;
618
- }
619
- }
620
- getIFrameMethods() {
621
- return {
622
- externalDetectWallets: (_origin) => () => this.detectWallets(),
623
- externalConnectWallet: (_origin) => (type) => this.connectWallet(type),
624
- externalSignMessage: (_origin) => (type, message) => this.signMessage(type, message),
625
- externalSignTypedData: (_origin) => (type, data) => this.signTypedData(type, data),
626
- externalGetBalance: (_origin) => (type, tokenAddress) => this.getBalance(type, tokenAddress)
627
- };
628
- }
629
- async detectWallets() {
630
- const wallets = Array.from(this.walletAdapters.values()).map(
631
- (adapter) => adapter.getInfo()
632
- );
633
- return wallets;
634
- }
635
- getWalletAdapter(type) {
636
- const adapter = this.walletAdapters.get(type);
637
- if (!adapter) {
638
- throw new Error(`Unsupported wallet type: ${type}`);
639
- }
640
- return adapter;
641
- }
642
- handleError(type, error, operation) {
643
- const errorMessage = error instanceof Error ? error.message : "Unknown error";
644
- console.error(`Error ${operation} with ${type} wallet:`, error);
645
- return { success: false, wallet: type, error: errorMessage };
646
- }
647
- async connectWallet(type) {
648
- try {
649
- if (this.connectedWallets.has(type)) {
650
- const wallet2 = this.connectedWallets.get(type);
651
- return { success: true, wallet: type, account: wallet2.type };
652
- }
653
- const wallet = this.getWalletAdapter(type);
654
- const response = await wallet.connect();
655
- if (response.success) {
656
- this.connectedWallets.set(type, wallet);
657
- }
658
- return response;
659
- } catch (error) {
660
- return this.handleError(type, error, "connecting to");
661
- }
662
- }
663
- async signMessage(type, message) {
664
- try {
665
- if (!this.connectedWallets.has(type)) {
666
- throw new Error(`Wallet ${type} is not connected`);
667
- }
668
- const wallet = this.connectedWallets.get(type);
669
- if (!wallet.signMessage) {
670
- throw new Error(`Wallet ${type} does not support signing messages`);
671
- }
672
- return await wallet.signMessage(message);
673
- } catch (error) {
674
- return this.handleError(type, error, "signing message with");
675
- }
676
- }
677
- async signTypedData(type, data) {
678
- try {
679
- if (!this.connectedWallets.has(type)) {
680
- throw new Error(`Wallet ${type} is not connected`);
681
- }
682
- const wallet = this.connectedWallets.get(type);
683
- if (!wallet.signTypedData) {
684
- throw new Error(`Wallet ${type} does not support signing typed data`);
685
- }
686
- return await wallet.signTypedData(data);
687
- } catch (error) {
688
- return this.handleError(type, error, "signing typed data with");
689
- }
690
- }
691
- async getBalance(type, tokenAddress) {
692
- try {
693
- if (!this.connectedWallets.has(type)) {
694
- throw new Error(`Wallet ${type} is not connected`);
695
- }
696
- const wallet = this.connectedWallets.get(type);
697
- return await wallet.getBalance(tokenAddress);
698
- } catch (error) {
699
- return this.handleError(type, error, "getting balance from");
700
- }
701
- }
702
- };
703
-
704
- // src/iframe/keychain.ts
705
- var KeychainIFrame = class extends IFrame {
706
- walletBridge;
707
- constructor({ url, policies, ...iframeOptions }) {
708
- const _url = new URL(url ?? KEYCHAIN_URL);
709
- const walletBridge = new WalletBridge();
710
- if (policies) {
711
- _url.searchParams.set(
712
- "policies",
713
- encodeURIComponent(JSON.stringify(policies))
714
- );
715
- }
716
- super({
717
- ...iframeOptions,
718
- id: "controller-keychain",
719
- url: _url,
720
- methods: walletBridge.getIFrameMethods()
721
- });
722
- this.walletBridge = walletBridge;
723
- }
724
- getWalletBridge() {
725
- return this.walletBridge;
726
- }
727
- };
728
-
729
- // src/iframe/profile.ts
730
- var ProfileIFrame = class extends IFrame {
731
- constructor({
732
- profileUrl,
733
- rpcUrl,
734
- version,
735
- username,
736
- slot,
737
- namespace,
738
- tokens,
739
- policies,
740
- ...iframeOptions
741
- }) {
742
- const _profileUrl = (profileUrl || PROFILE_URL).replace(/\/$/, "");
743
- let _url = new URL(
744
- slot ? namespace ? `${_profileUrl}/account/${username}/slot/${slot}?ps=${encodeURIComponent(
745
- slot
746
- )}&ns=${encodeURIComponent(namespace)}` : `${_profileUrl}/account/${username}/slot/${slot}?ps=${encodeURIComponent(
747
- slot
748
- )}` : `${_profileUrl}/account/${username}`
749
- );
750
- if (version) {
751
- _url.searchParams.set("v", encodeURIComponent(version));
752
- }
753
- _url.searchParams.set("rpcUrl", encodeURIComponent(rpcUrl));
754
- if (tokens?.erc20) {
755
- _url.searchParams.set(
756
- "erc20",
757
- encodeURIComponent(tokens.erc20.toString())
758
- );
759
- }
760
- if (policies?.contracts) {
761
- const methods = Object.values(policies.contracts).flatMap(
762
- (contract) => contract.methods
763
- );
764
- _url.searchParams.set(
765
- "methods",
766
- encodeURIComponent(JSON.stringify(methods))
767
- );
768
- }
769
- super({
770
- ...iframeOptions,
771
- id: "controller-profile",
772
- url: _url
773
- });
774
- }
775
- };
776
-
777
- // src/errors.ts
778
- var NotReadyToConnect = class _NotReadyToConnect extends Error {
779
- constructor() {
780
- super("Not ready to connect");
781
- Object.setPrototypeOf(this, _NotReadyToConnect.prototype);
782
- }
783
- };
784
-
785
- // package.json
786
- var package_default = {
787
- version: "0.7.8"};
788
-
789
- // src/icon.ts
790
- var icon = "data:image/png;base64,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";
791
-
792
- // src/mutex.ts
793
- function releaseStub() {
794
- }
795
- var Mutex = class {
796
- m_lastPromise = Promise.resolve();
797
- /**
798
- * Acquire lock
799
- * @param [bypass=false] option to skip lock acquisition
800
- */
801
- async obtain(bypass = false) {
802
- let release = releaseStub;
803
- if (bypass) return release;
804
- const lastPromise = this.m_lastPromise;
805
- this.m_lastPromise = new Promise((resolve) => release = resolve);
806
- await lastPromise;
807
- return release;
808
- }
809
- };
810
-
811
- // src/provider.ts
812
- var mutex = new Mutex();
813
- var BaseProvider = class {
814
- id = "controller";
815
- name = "Controller";
816
- version = package_default.version;
817
- icon = icon;
818
- account;
819
- subscriptions = [];
820
- _probePromise = null;
821
- async safeProbe() {
822
- if (this.account) {
823
- return this.account;
824
- }
825
- if (this._probePromise) {
826
- return this._probePromise;
827
- }
828
- const release = await mutex.obtain();
829
- return await new Promise(async (resolve) => {
830
- try {
831
- this._probePromise = this.probe();
832
- const result = await this._probePromise;
833
- resolve(result);
834
- } finally {
835
- this._probePromise = null;
836
- }
837
- }).finally(() => {
838
- release();
839
- });
840
- }
841
- request = async (call) => {
842
- switch (call.type) {
843
- case "wallet_getPermissions":
844
- await this.safeProbe();
845
- if (this.account) {
846
- return [Permission.ACCOUNTS];
847
- }
848
- return [];
849
- case "wallet_requestAccounts": {
850
- if (this.account) {
851
- return [this.account.address];
852
- }
853
- const silentMode = call.params && call.params.silent_mode;
854
- this.account = await this.safeProbe();
855
- if (!this.account && !silentMode) {
856
- this.account = await this.connect();
857
- }
858
- if (this.account) {
859
- return [this.account.address];
860
- }
861
- return [];
862
- }
863
- case "wallet_watchAsset":
864
- throw {
865
- code: 63,
866
- message: "An unexpected error occurred",
867
- data: "wallet_watchAsset not implemented"
868
- };
869
- case "wallet_addStarknetChain": {
870
- let params2 = call.params;
871
- return this.addStarknetChain(params2);
872
- }
873
- case "wallet_switchStarknetChain": {
874
- let params2 = call.params;
875
- return this.switchStarknetChain(params2.chainId);
876
- }
877
- case "wallet_requestChainId":
878
- if (!this.account) {
879
- throw {
880
- code: 63,
881
- message: "An unexpected error occurred",
882
- data: "Account not initialized"
883
- };
884
- }
885
- return await this.account.getChainId();
886
- case "wallet_deploymentData":
887
- throw {
888
- code: 63,
889
- message: "An unexpected error occurred",
890
- data: "wallet_deploymentData not implemented"
891
- };
892
- case "wallet_addInvokeTransaction":
893
- if (!this.account) {
894
- throw {
895
- code: 63,
896
- message: "An unexpected error occurred",
897
- data: "Account not initialized"
898
- };
899
- }
900
- let params = call.params;
901
- return await this.account.execute(
902
- params.calls.map((call2) => ({
903
- contractAddress: call2.contract_address,
904
- entrypoint: call2.entry_point,
905
- calldata: call2.calldata
906
- }))
907
- );
908
- case "wallet_addDeclareTransaction":
909
- throw {
910
- code: 63,
911
- message: "An unexpected error occurred",
912
- data: "wallet_addDeclareTransaction not implemented"
913
- };
914
- case "wallet_signTypedData": {
915
- if (!this.account) {
916
- throw {
917
- code: 63,
918
- message: "An unexpected error occurred",
919
- data: "Account not initialized"
920
- };
921
- }
922
- return await this.account.signMessage(call.params);
923
- }
924
- case "wallet_supportedSpecs":
925
- return [];
926
- case "wallet_supportedWalletApi":
927
- return [];
928
- default:
929
- throw {
930
- code: 63,
931
- message: "An unexpected error occurred",
932
- data: `Unknown RPC call type: ${call.type}`
933
- };
934
- }
935
- };
936
- on = (event, handler) => {
937
- if (event !== "accountsChanged" && event !== "networkChanged") {
938
- throw new Error(`Unknown event: ${event}`);
939
- }
940
- this.subscriptions.push({ type: event, handler });
941
- };
942
- off = (event, handler) => {
943
- if (event !== "accountsChanged" && event !== "networkChanged") {
944
- throw new Error(`Unknown event: ${event}`);
945
- }
946
- const idx = this.subscriptions.findIndex(
947
- (sub) => sub.type === event && sub.handler === handler
948
- );
949
- if (idx >= 0) {
950
- this.subscriptions.splice(idx, 1);
951
- }
952
- };
953
- emitNetworkChanged(chainId) {
954
- this.subscriptions.filter((sub) => sub.type === "networkChanged").forEach((sub) => {
955
- sub.handler(chainId);
956
- });
957
- }
958
- emitAccountsChanged(accounts) {
959
- this.subscriptions.filter((sub) => sub.type === "accountsChanged").forEach((sub) => {
960
- sub.handler(accounts);
961
- });
962
- }
963
- };
964
- var ControllerProvider = class extends BaseProvider {
965
- keychain;
966
- profile;
967
- options;
968
- iframes;
969
- selectedChain;
970
- chains;
971
- constructor(options) {
972
- super();
973
- this.selectedChain = options.defaultChainId;
974
- this.chains = /* @__PURE__ */ new Map();
975
- this.iframes = {
976
- keychain: new KeychainIFrame({
977
- ...options,
978
- onClose: this.keychain?.reset,
979
- onConnect: (keychain) => {
980
- this.keychain = keychain;
981
- }
982
- })
983
- };
984
- this.options = options;
985
- this.validateChains(options.chains);
986
- if (typeof window !== "undefined") {
987
- window.starknet_controller = this;
988
- }
989
- }
990
- async probe() {
991
- try {
992
- await this.waitForKeychain();
993
- if (!this.keychain) {
994
- console.error(new NotReadyToConnect().message);
995
- return;
996
- }
997
- const response = await this.keychain.probe(this.rpcUrl());
998
- let rpcUrl = response?.rpcUrl || this.rpcUrl();
999
- this.account = new account_default(
1000
- this,
1001
- rpcUrl,
1002
- response.address,
1003
- this.keychain,
1004
- this.options,
1005
- this.iframes.keychain
1006
- );
1007
- } catch (e) {
1008
- console.error(e);
1009
- return;
1010
- }
1011
- if (!this.iframes.profile) {
1012
- const username = await this.keychain.username();
1013
- this.iframes.profile = new ProfileIFrame({
1014
- ...this.options,
1015
- onConnect: (profile) => {
1016
- this.profile = profile;
1017
- },
1018
- methods: {
1019
- openSettings: () => this.openSettings.bind(this),
1020
- openPurchaseCredits: () => this.openPurchaseCredits.bind(this),
1021
- openExecute: () => this.openExecute.bind(this)
1022
- },
1023
- rpcUrl: this.rpcUrl(),
1024
- username,
1025
- version: this.version
1026
- });
1027
- }
1028
- return this.account;
1029
- }
1030
- async connect() {
1031
- if (this.account) {
1032
- return this.account;
1033
- }
1034
- if (!this.keychain || !this.iframes.keychain) {
1035
- console.error(new NotReadyToConnect().message);
1036
- return;
1037
- }
1038
- if (!!document.hasStorageAccess) {
1039
- const ok = await document.hasStorageAccess();
1040
- if (!ok) {
1041
- await document.requestStorageAccess();
1042
- }
1043
- }
1044
- this.iframes.keychain.open();
1045
- try {
1046
- let response = await this.keychain.connect(
1047
- this.options.policies || {},
1048
- this.rpcUrl()
1049
- );
1050
- if (response.code !== "SUCCESS" /* SUCCESS */) {
1051
- throw new Error(response.message);
1052
- }
1053
- response = response;
1054
- this.account = new account_default(
1055
- this,
1056
- this.rpcUrl(),
1057
- response.address,
1058
- this.keychain,
1059
- this.options,
1060
- this.iframes.keychain
1061
- );
1062
- return this.account;
1063
- } catch (e) {
1064
- console.log(e);
1065
- } finally {
1066
- this.iframes.keychain.close();
1067
- }
1068
- }
1069
- async switchStarknetChain(chainId) {
1070
- if (!this.keychain || !this.iframes.keychain) {
1071
- console.error(new NotReadyToConnect().message);
1072
- return false;
1073
- }
1074
- try {
1075
- this.selectedChain = chainId;
1076
- const response = await this.keychain.probe(this.rpcUrl());
1077
- if (response.rpcUrl === this.rpcUrl()) {
1078
- return true;
1079
- }
1080
- await this.keychain.switchChain(this.rpcUrl());
1081
- await this.profile?.switchChain(this.rpcUrl());
1082
- } catch (e) {
1083
- console.error(e);
1084
- return false;
1085
- }
1086
- this.emitNetworkChanged(chainId);
1087
- return true;
1088
- }
1089
- addStarknetChain(_chain) {
1090
- return Promise.resolve(true);
1091
- }
1092
- async disconnect() {
1093
- if (!this.keychain) {
1094
- console.error(new NotReadyToConnect().message);
1095
- return;
1096
- }
1097
- if (!!document.hasStorageAccess) {
1098
- const ok = await document.hasStorageAccess();
1099
- if (!ok) {
1100
- await document.requestStorageAccess();
1101
- }
1102
- }
1103
- this.account = void 0;
1104
- return this.keychain.disconnect();
1105
- }
1106
- async openProfile(tab = "inventory") {
1107
- if (!this.profile || !this.iframes.profile?.url) {
1108
- console.error("Profile is not ready");
1109
- return;
1110
- }
1111
- if (!this.account) {
1112
- console.error("Account is not ready");
1113
- return;
1114
- }
1115
- this.profile.navigate(`${this.iframes.profile.url?.pathname}/${tab}`);
1116
- this.iframes.profile.open();
1117
- }
1118
- async openProfileTo(to) {
1119
- if (!this.profile || !this.iframes.profile?.url) {
1120
- console.error("Profile is not ready");
1121
- return;
1122
- }
1123
- if (!this.account) {
1124
- console.error("Account is not ready");
1125
- return;
1126
- }
1127
- this.profile.navigate(`${this.iframes.profile.url?.pathname}/${to}`);
1128
- this.iframes.profile.open();
1129
- }
1130
- async openProfileAt(at) {
1131
- if (!this.profile || !this.iframes.profile?.url) {
1132
- console.error("Profile is not ready");
1133
- return;
1134
- }
1135
- if (!this.account) {
1136
- console.error("Account is not ready");
1137
- return;
1138
- }
1139
- this.profile.navigate(at);
1140
- this.iframes.profile.open();
1141
- }
1142
- async openSettings() {
1143
- if (!this.keychain || !this.iframes.keychain) {
1144
- console.error(new NotReadyToConnect().message);
1145
- return null;
1146
- }
1147
- if (this.iframes.profile?.sendBackward) {
1148
- this.iframes.profile?.sendBackward();
1149
- } else {
1150
- this.iframes.profile?.close();
1151
- }
1152
- this.iframes.keychain.open();
1153
- const res = await this.keychain.openSettings();
1154
- this.iframes.keychain.close();
1155
- this.iframes.profile?.sendForward?.();
1156
- if (res && res.code === "NOT_CONNECTED" /* NOT_CONNECTED */) {
1157
- return false;
1158
- }
1159
- return true;
1160
- }
1161
- revoke(origin, _policy) {
1162
- if (!this.keychain) {
1163
- console.error(new NotReadyToConnect().message);
1164
- return null;
1165
- }
1166
- return this.keychain.revoke(origin);
1167
- }
1168
- rpcUrl() {
1169
- const chain = this.chains.get(this.selectedChain);
1170
- if (!chain) {
1171
- const availableChains = Array.from(this.chains.keys()).map(
1172
- (chain2) => shortString.decodeShortString(chain2)
1173
- );
1174
- throw new Error(
1175
- `Chain not found: ${shortString.decodeShortString(this.selectedChain)}. Available chains: ${availableChains.join(", ")}`
1176
- );
1177
- }
1178
- return chain.rpcUrl;
1179
- }
1180
- username() {
1181
- if (!this.keychain) {
1182
- console.error(new NotReadyToConnect().message);
1183
- return;
1184
- }
1185
- return this.keychain.username();
1186
- }
1187
- openPurchaseCredits() {
1188
- if (!this.keychain || !this.iframes.keychain) {
1189
- console.error(new NotReadyToConnect().message);
1190
- return;
1191
- }
1192
- if (!this.iframes.profile) {
1193
- console.error("Profile is not ready");
1194
- return;
1195
- }
1196
- this.iframes.profile.close();
1197
- this.iframes.keychain.open();
1198
- this.keychain.openPurchaseCredits();
1199
- }
1200
- async openExecute(calls, chainId) {
1201
- if (!this.keychain || !this.iframes.keychain) {
1202
- console.error(new NotReadyToConnect().message);
1203
- return;
1204
- }
1205
- if (!this.iframes.profile) {
1206
- console.error("Profile is not ready");
1207
- return;
1208
- }
1209
- let currentChainId = this.selectedChain;
1210
- if (chainId) {
1211
- this.switchStarknetChain(chainId);
1212
- }
1213
- this.iframes.profile?.sendBackward();
1214
- this.iframes.keychain.open();
1215
- this.iframes.profile?.close();
1216
- const res = await this.keychain.execute(calls, void 0, void 0, true);
1217
- this.iframes.profile?.open();
1218
- this.iframes.keychain.close();
1219
- this.iframes.profile?.sendForward();
1220
- if (chainId) {
1221
- this.switchStarknetChain(currentChainId);
1222
- }
1223
- return !(res && (res.code === "NOT_CONNECTED" /* NOT_CONNECTED */ || res.code === "CANCELED" /* CANCELED */));
1224
- }
1225
- async delegateAccount() {
1226
- if (!this.keychain) {
1227
- console.error(new NotReadyToConnect().message);
1228
- return null;
1229
- }
1230
- return await this.keychain.delegateAccount();
1231
- }
1232
- async validateChains(chains) {
1233
- for (const chain of chains) {
1234
- try {
1235
- const url = new URL(chain.rpcUrl);
1236
- const chainId = await parseChainId(url);
1237
- this.chains.set(chainId, chain);
1238
- } catch (error) {
1239
- console.error(`Failed to parse chainId for ${chain.rpcUrl}:`, error);
1240
- }
1241
- }
1242
- if (!this.chains.has(this.selectedChain)) {
1243
- console.warn(
1244
- `Selected chain ${this.selectedChain} not found in configured chains. Available chains: ${Array.from(this.chains.keys()).join(", ")}`
1245
- );
1246
- }
1247
- }
1248
- waitForKeychain({
1249
- timeout = 5e4,
1250
- interval = 100
1251
- } = {}) {
1252
- return new Promise((resolve, reject) => {
1253
- const startTime = Date.now();
1254
- const id = setInterval(() => {
1255
- if (Date.now() - startTime > timeout) {
1256
- clearInterval(id);
1257
- reject(new Error("Timeout waiting for keychain"));
1258
- return;
1259
- }
1260
- if (!this.keychain) return;
1261
- clearInterval(id);
1262
- resolve();
1263
- }, interval);
1264
- });
1265
- }
1266
- };
1267
-
1268
- export { ControllerProvider as default };
1269
- //# sourceMappingURL=controller.js.map
1270
- //# sourceMappingURL=controller.js.map