@cartridge/controller 0.10.4 → 0.10.5

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.
@@ -1,13 +1,13 @@
1
1
 
2
- > @cartridge/controller@0.10.4 build:deps /home/runner/work/controller/controller/packages/controller
2
+ > @cartridge/controller@0.10.5 build:deps /home/runner/work/controller/controller/packages/controller
3
3
  > pnpm build
4
4
 
5
5
 
6
- > @cartridge/controller@0.10.4 build /home/runner/work/controller/controller/packages/controller
6
+ > @cartridge/controller@0.10.5 build /home/runner/work/controller/controller/packages/controller
7
7
  > pnpm build:browser && pnpm build:node
8
8
 
9
9
 
10
- > @cartridge/controller@0.10.4 build:browser /home/runner/work/controller/controller/packages/controller
10
+ > @cartridge/controller@0.10.5 build:browser /home/runner/work/controller/controller/packages/controller
11
11
  > vite build
12
12
 
13
13
  vite v6.3.4 building for production...
@@ -18,13 +18,13 @@ rendering chunks...
18
18
  [vite:dts] Start generate declaration files...
19
19
  computing gzip size...
20
20
  dist/session.js  7.19 kB │ gzip: 2.35 kB │ map: 17.48 kB
21
- dist/provider-PftcmETC.js  13.61 kB │ gzip: 5.56 kB │ map: 33.44 kB
21
+ dist/provider-CznCrt4b.js  13.61 kB │ gzip: 5.56 kB │ map: 33.44 kB
22
22
  dist/index.js 135.40 kB │ gzip: 34.36 kB │ map: 437.94 kB
23
- [vite:dts] Declaration files built in 4438ms.
23
+ [vite:dts] Declaration files built in 4515ms.
24
24
 
25
- ✓ built in 6.13s
25
+ ✓ built in 6.36s
26
26
 
27
- > @cartridge/controller@0.10.4 build:node /home/runner/work/controller/controller/packages/controller
27
+ > @cartridge/controller@0.10.5 build:node /home/runner/work/controller/controller/packages/controller
28
28
  > tsup --config tsup.node.config.ts
29
29
 
30
30
  CLI Building entry: src/node/index.ts
@@ -38,13 +38,13 @@ computing gzip size...
38
38
  "constants", "getChecksumAddress" and "shortString" are imported from external module "starknet" but never used in "dist/node/index.js".
39
39
  "constants", "getChecksumAddress" and "shortString" are imported from external module "starknet" but never used in "dist/node/index.cjs".
40
40
  Entry module "dist/node/index.cjs" is using named and default exports together. Consumers of your bundle will have to use `chunk.default` to access the default export, which may not be what you want. Use `output.exports: "named"` to disable this warning.
41
- ESM dist/node/index.js 21.20 KB
42
- ESM dist/node/index.js.map 50.38 KB
43
- ESM ⚡️ Build success in 397ms
44
- CJS dist/node/index.cjs 21.97 KB
45
- CJS dist/node/index.cjs.map 50.59 KB
46
- CJS ⚡️ Build success in 397ms
41
+ CJS dist/node/index.cjs 22.32 KB
42
+ CJS dist/node/index.cjs.map 51.18 KB
43
+ CJS ⚡️ Build success in 394ms
44
+ ESM dist/node/index.js 21.53 KB
45
+ ESM dist/node/index.js.map 50.95 KB
46
+ ESM ⚡️ Build success in 395ms
47
47
  DTS Build start
48
- DTS ⚡️ Build success in 3902ms
48
+ DTS ⚡️ Build success in 4434ms
49
49
  DTS dist/node/index.d.ts 5.87 KB
50
50
  DTS dist/node/index.d.cts 5.87 KB
@@ -1,9 +1,9 @@
1
1
 
2
- > @cartridge/controller@0.10.4 build /home/runner/work/controller/controller/packages/controller
2
+ > @cartridge/controller@0.10.5 build /home/runner/work/controller/controller/packages/controller
3
3
  > pnpm build:browser && pnpm build:node
4
4
 
5
5
 
6
- > @cartridge/controller@0.10.4 build:browser /home/runner/work/controller/controller/packages/controller
6
+ > @cartridge/controller@0.10.5 build:browser /home/runner/work/controller/controller/packages/controller
7
7
  > vite build
8
8
 
9
9
  vite v6.3.4 building for production...
@@ -14,13 +14,13 @@ rendering chunks...
14
14
  [vite:dts] Start generate declaration files...
15
15
  computing gzip size...
16
16
  dist/session.js  7.19 kB │ gzip: 2.35 kB │ map: 17.48 kB
17
- dist/provider-PftcmETC.js  13.61 kB │ gzip: 5.56 kB │ map: 33.44 kB
17
+ dist/provider-CznCrt4b.js  13.61 kB │ gzip: 5.56 kB │ map: 33.44 kB
18
18
  dist/index.js 135.40 kB │ gzip: 34.36 kB │ map: 437.94 kB
19
- [vite:dts] Declaration files built in 4130ms.
19
+ [vite:dts] Declaration files built in 4569ms.
20
20
 
21
- ✓ built in 6.05s
21
+ ✓ built in 6.54s
22
22
 
23
- > @cartridge/controller@0.10.4 build:node /home/runner/work/controller/controller/packages/controller
23
+ > @cartridge/controller@0.10.5 build:node /home/runner/work/controller/controller/packages/controller
24
24
  > tsup --config tsup.node.config.ts
25
25
 
26
26
  CLI Building entry: src/node/index.ts
@@ -31,16 +31,16 @@ computing gzip size...
31
31
  CLI Cleaning output folder
32
32
  ESM Build start
33
33
  CJS Build start
34
+ "constants", "getChecksumAddress" and "shortString" are imported from external module "starknet" but never used in "dist/node/index.js".
34
35
  "constants", "getChecksumAddress" and "shortString" are imported from external module "starknet" but never used in "dist/node/index.cjs".
35
36
  Entry module "dist/node/index.cjs" is using named and default exports together. Consumers of your bundle will have to use `chunk.default` to access the default export, which may not be what you want. Use `output.exports: "named"` to disable this warning.
36
- "constants", "getChecksumAddress" and "shortString" are imported from external module "starknet" but never used in "dist/node/index.js".
37
- CJS dist/node/index.cjs 21.97 KB
38
- CJS dist/node/index.cjs.map 50.59 KB
39
- CJS ⚡️ Build success in 319ms
40
- ESM dist/node/index.js 21.20 KB
41
- ESM dist/node/index.js.map 50.38 KB
42
- ESM ⚡️ Build success in 320ms
37
+ ESM dist/node/index.js 21.53 KB
38
+ ESM dist/node/index.js.map 50.95 KB
39
+ ESM ⚡️ Build success in 291ms
40
+ CJS dist/node/index.cjs 22.32 KB
41
+ CJS dist/node/index.cjs.map 51.18 KB
42
+ CJS ⚡️ Build success in 291ms
43
43
  DTS Build start
44
- DTS ⚡️ Build success in 3991ms
44
+ DTS ⚡️ Build success in 4677ms
45
45
  DTS dist/node/index.d.ts 5.87 KB
46
46
  DTS dist/node/index.d.cts 5.87 KB
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { WalletAccount as Nt, constants as V, num as rt, shortString as Oe } from "starknet";
2
- import { R as Q, t as Rt, K as Tt, B as Ut, N as v, p as zt, v as Dt, A as Ot } from "./provider-PftcmETC.js";
3
- import { F as qn, S as Gn, h as Xn, n as Jn, a as Zn, b as es } from "./provider-PftcmETC.js";
2
+ import { R as Q, t as Rt, K as Tt, B as Ut, N as v, p as zt, v as Dt, A as Ot } from "./provider-CznCrt4b.js";
3
+ import { F as qn, S as Gn, h as Xn, n as Jn, a as Zn, b as es } from "./provider-CznCrt4b.js";
4
4
  class Le extends Nt {
5
5
  keychain;
6
6
  modal;
@@ -3,6 +3,7 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var starknet = require('starknet');
6
+ var controllerWasm = require('@cartridge/controller-wasm');
6
7
  var session = require('@cartridge/controller-wasm/session');
7
8
  var typesJs = require('@starknet-io/types-js');
8
9
  var fs = require('fs/promises');
@@ -145,7 +146,7 @@ var KEYCHAIN_URL = "https://x.cartridge.gg";
145
146
 
146
147
  // package.json
147
148
  var package_default = {
148
- version: "0.10.4"};
149
+ version: "0.10.5"};
149
150
 
150
151
  // src/icon.ts
151
152
  var icon = "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODAwIiBoZWlnaHQ9IjgwMCIgdmlld0JveD0iMCAwIDgwMCA4MDAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGZpbHRlcj0idXJsKCNmaWx0ZXIwX2RfNTExMl83ODIpIj4KPHBhdGggZD0iTTQ2OS4yMzYgNzBDNDgyLjM5IDcwIDQ5My4wNTMgODAuNjYzIDQ5My4wNTMgOTMuODE2NFYxNDcuMTQ3TDUxNS4zMzggMTQ3LjE0N0w1MTUuNDI4IDE0Ny4xNDdMNTE1LjU1NCAxNDcuMTQ3TDUxNS44MjYgMTQ3LjE0OUM1MTYuMDE2IDE0Ny4xNTEgNTE2LjIyNSAxNDcuMTUzIDUxNi40NTEgMTQ3LjE1N0M1MTYuOTA0IDE0Ny4xNjQgNTE3LjQyOCAxNDcuMTc2IDUxOC4wMiAxNDcuMTk1QzUxOS4yMDEgMTQ3LjIzNCA1MjAuNjYgMTQ3LjMwNCA1MjIuMzYxIDE0Ny40MjRDNTI1Ljc0MSAxNDcuNjYzIDUzMC4xODUgMTQ4LjExNCA1MzUuMzYzIDE0OC45NjlDNTQ1LjAwMSAxNTAuNTYyIDU1OC41NTYgMTUzLjc4IDU3Mi45MTggMTYwLjYwM0w3MzAuNDIgMjI2LjY3MUw3MzIuMTAxIDIyNy41MDVDNzcxLjc4NyAyNDcuMTc3IDc4OS45OTMgMjg2LjI5NiA3ODkuOTkzIDMyMi4wMzZWNTg1Ljg2NUM3ODkuOTkzIDU4Ni4wNTQgNzg5Ljk5NCA1ODYuMjU0IDc4OS45OTQgNTg2LjQ2M0w3ODkuOTk2IDU4Ni45MTNDNzkwLjAzOCA1OTcuMDk2IDc5MC4xNjEgNjI2Ljk5NiA3NjQuMjMxIDY1Mi44MjNMNzE0Ljc2IDcwMi4wOTVMNzE0LjY0MSA3MDIuMjE1QzcwNC42MDEgNzEyLjI3NSA2OTIuMTIzIDcyMC42NTIgNjc2LjI4NCA3MjQuODc5QzY2NC4zOSA3MjguMDU0IDY1Mi44MjcgNzI3Ljk2NiA2NDguNjM3IDcyNy45MzRMNjQ4LjYxOSA3MjcuOTMzQzY0OC40MDkgNzI3LjkzMiA2NDguMjE5IDcyNy45MyA2NDguMDQ3IDcyNy45M0w2NDcuNzUyIDcyNy45MjlINDgwLjcyMUM0NzQuMDk0IDcyNy45MjkgNDY4LjcyMSA3MjIuNTU2IDQ2OC43MjEgNzE1LjkyOVY2NjguMzg4SDMyOC41ODZDMzI4LjU4NiA2NzIuNjI5IDMyOC41NzIgNjk4LjA1MiAzMjguNTYxIDcxNS45NDRDMzI4LjU1NyA3MjIuNTY5IDMyMy4xODYgNzI3LjkyOSAzMTYuNTYxIDcyNy45MjlIMTUyLjI0NkMxNTIuMTA0IDcyNy45MjkgMTUxLjk0MiA3MjcuOTI5IDE1MS43NjIgNzI3LjkzMUwxNTEuMzYyIDcyNy45MzRDMTQ3LjE3MiA3MjcuOTY2IDEzNS42MDkgNzI4LjA1NCAxMjMuNzE0IDcyNC44NzlDMTA3Ljg3MyA3MjAuNjUxIDk1LjM5MzggNzEyLjI3MiA4NS4zNTI5IDcwMi4yMUw4NS4yMzg2IDcwMi4wOTVMMzUuNjcgNjUyLjcyNUwzNS41NzIzIDY1Mi42MjdDOS44NjI0MiA2MjYuNzggOS45NjY3IDU5Ny4xODUgMTAuMDAzIDU4Ni44NzRDMTAuMDA0MyA1ODYuNTEzIDEwLjAwNTUgNTg2LjE3NyAxMC4wMDU1IDU4NS44NjVWMzIyLjAzNkMxMC4wMDU1IDI4Ni40MyAyOC4xNjYyIDI0Ny4xOTkgNjcuODk3NyAyMjcuNTA1TDY5LjU3OSAyMjYuNjcxTDIyNy4wODEgMTYwLjYwM0MyNDEuNDQzIDE1My43OCAyNTQuOTk4IDE1MC41NjIgMjY0LjYzNiAxNDguOTY5QzI2OS44MTQgMTQ4LjExNCAyNzQuMjU4IDE0Ny42NjMgMjc3LjYzOCAxNDcuNDI0QzI3OS4zMzggMTQ3LjMwNCAyODAuNzk4IDE0Ny4yMzQgMjgxLjk3OSAxNDcuMTk1QzI4Mi41NzEgMTQ3LjE3NiAyODMuMDk1IDE0Ny4xNjQgMjgzLjU0NyAxNDcuMTU3TDI4My45MTcgMTQ3LjE1MkwyODQuMTczIDE0Ny4xNDlMMjg0LjQ0NSAxNDcuMTQ3TDI4NC41NzEgMTQ3LjE0N0wyODQuNjYgMTQ3LjE0N0wzMDYuOTQyIDE0Ny4xNDdWOTMuODE2NEMzMDYuOTQyIDgwLjY2MyAzMTcuNjA1IDcwIDMzMC43NTggNzBINDY5LjIzNloiIGZpbGw9IiMxOTFBMUEiLz4KPHBhdGggZD0iTTM2Ni40ODMgMTI5LjU0SDQzMy41MTJWMjA2LjY4N0gzNjYuNDgzVjEyOS41NFoiIGZpbGw9IiNGQkNCNEEiLz4KPHBhdGggZD0iTTI2OS4wMSA2MDIuNDI5SDE0NC4wMDhDMTM1Ljc2OCA2MDIuNDI5IDEzNS43NjggNTk0LjE0NiAxMzUuNzY4IDU5NC4xNDZWMjgwLjg1QzEzNS43NjggMjgwLjg1IDEzNS43NjggMjcyLjY0NCAxNDQuMDA4IDI3Mi42NDRIMzY2LjQ4M0wzNjYuNDgzIDIwNi42ODdIMjg0LjY5QzI4NC42OSAyMDYuNjg3IDI2OC4xMzQgMjA2LjY4NyAyNTEuNTc5IDIxNC44OTNMOTQuMzQxNCAyODAuODVDNzcuNzg2MSAyODkuMDU3IDY5LjU0NjkgMzA1LjYyMyA2OS41NDY5IDMyMi4wMzVWNTg1Ljg2M0M2OS41NDY5IDU5NC4xNDcgNjkuNTQ2OSA2MDIuMzUzIDc3Ljc4NjEgNjEwLjYzNkwxMjcuNDUyIDY2MC4xMDRDMTM1LjY5MSA2NjguMzg3IDE0MS45MjggNjY4LjM4NyAxNTIuMjQ3IDY2OC4zODdIMjY5LjAyOUMyNjkuMDM3IDY0OC4zNCAyNjkuMDQ2IDYyNC42NTUgMjY5LjA1NCA2MDIuODg3SDUyOC4wMTNWNjY4LjM4N0g2NDcuNzUzQzY1OC4wNzEgNjY4LjM4NyA2NjQuMzA4IDY2OC4zODcgNjcyLjU0NyA2NjAuMTA0TDcyMi4yMTMgNjEwLjYzNkM3MzAuNDUzIDYwMi40MjkgNzMwLjQ1MyA1OTQuMTQ3IDczMC40NTMgNTg1Ljg2M1YzMjIuMDM1QzczMC40NTMgMzA1LjU0NiA3MjIuMjEzIDI4OS4wNTcgNzA1LjY1OCAyODAuODVMNTQ4LjQyMSAyMTQuODkzQzUzMS44NjUgMjA2LjY4NyA1MTUuMzEgMjA2LjY4NyA1MTUuMzEgMjA2LjY4N0g0MzMuNTEyTDQzMy41MTIgMjcyLjY0NEg2NTYuMDY5QzY2NC4zMDggMjcyLjY0NCA2NjQuMzA4IDI4MC44NSA2NjQuMzA4IDI4MC44NVY1OTQuMTQ2QzY2NC4zMDggNTk0LjE0NiA2NjQuMzA4IDYwMi40MjkgNjU2LjA2OSA2MDIuNDI5SDUyOC4yNjJWNTM3LjM5NkgyNjkuMDc1QzI2OS4wNzUgNTQzLjcwNyAyNjkuMDE3IDU5Ni45MTIgMjY5LjAxIDYwMi40MjlaIiBmaWxsPSIjRkJDQjRBIi8+CjxwYXRoIGQ9Ik0yNjkuMDA5IDQzNi4xNzJINTI4LjI2MlYzNzAuNjgxSDI2OS4wNzVDMjY5LjA3NSAzNzcuMzczIDI2OS4wMDkgNDM2Ljc4OCAyNjkuMDA5IDQzNi4xNzJaIiBmaWxsPSIjRkJDQjRBIi8+CjwvZz4KPGRlZnM+CjxmaWx0ZXIgaWQ9ImZpbHRlcjBfZF81MTEyXzc4MiIgeD0iLTQiIHk9IjAiIHdpZHRoPSI4MDgiIGhlaWdodD0iODA4IiBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CjxmZUZsb29kIGZsb29kLW9wYWNpdHk9IjAiIHJlc3VsdD0iQmFja2dyb3VuZEltYWdlRml4Ii8+CjxmZUNvbG9yTWF0cml4IGluPSJTb3VyY2VBbHBoYSIgdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDEyNyAwIiByZXN1bHQ9ImhhcmRBbHBoYSIvPgo8ZmVPZmZzZXQgZHk9IjQiLz4KPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMiIvPgo8ZmVDb21wb3NpdGUgaW4yPSJoYXJkQWxwaGEiIG9wZXJhdG9yPSJvdXQiLz4KPGZlQ29sb3JNYXRyaXggdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAuMjUgMCIvPgo8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluMj0iQmFja2dyb3VuZEltYWdlRml4IiByZXN1bHQ9ImVmZmVjdDFfZHJvcFNoYWRvd181MTEyXzc4MiIvPgo8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluPSJTb3VyY2VHcmFwaGljIiBpbjI9ImVmZmVjdDFfZHJvcFNoYWRvd181MTEyXzc4MiIgcmVzdWx0PSJzaGFwZSIvPgo8L2ZpbHRlcj4KPC9kZWZzPgo8L3N2Zz4K";
@@ -618,8 +619,14 @@ var SessionProvider = class extends BaseProvider {
618
619
  const sessionData = await this._backend.waitForCallback();
619
620
  if (sessionData) {
620
621
  const sessionRegistration = JSON.parse(atob(sessionData));
622
+ const formattedPk = starknet.encode.addHexPrefix(publicKey);
621
623
  sessionRegistration.address = sessionRegistration.address.toLowerCase();
622
624
  sessionRegistration.ownerGuid = sessionRegistration.ownerGuid.toLowerCase();
625
+ sessionRegistration.guardianKeyGuid = "0x0";
626
+ sessionRegistration.metadataHash = "0x0";
627
+ sessionRegistration.sessionKeyGuid = controllerWasm.signerToGuid({
628
+ starknet: { privateKey: formattedPk }
629
+ });
623
630
  await this._backend.set("session", JSON.stringify(sessionRegistration));
624
631
  return this.probe();
625
632
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils.ts","../../src/errors.ts","../../src/node/account.ts","../../src/constants.ts","../../package.json","../../src/icon.ts","../../src/mutex.ts","../../src/provider.ts","../../src/node/server.ts","../../src/node/backend.ts","../../src/node/provider.ts"],"names":["addAddressPadding","CallData","hash","typedData","TypedDataRevision","WalletAccount","CartridgeSessionAccount","Permission","params","call","http","path","fs","stark","ec"],"mappings":"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","file":"index.cjs","sourcesContent":["import {\n addAddressPadding,\n Call,\n CallData,\n constants,\n getChecksumAddress,\n hash,\n shortString,\n typedData,\n TypedDataRevision,\n} from \"starknet\";\nimport { Policy } from \"@cartridge/controller-wasm/controller\";\nimport { Policies, SessionPolicies } from \"@cartridge/presets\";\nimport { ChainId } from \"@starknet-io/types-js\";\nimport { ParsedSessionPolicies } from \"./policies\";\n\n// Whitelist of allowed property names to prevent prototype pollution\nconst ALLOWED_PROPERTIES = new Set([\n \"contracts\",\n \"messages\",\n \"target\",\n \"method\",\n \"name\",\n \"description\",\n \"types\",\n \"domain\",\n \"primaryType\",\n]);\n\nfunction validatePropertyName(prop: string): void {\n if (!ALLOWED_PROPERTIES.has(prop)) {\n throw new Error(`Invalid property name: ${prop}`);\n }\n}\n\nfunction safeObjectAccess<T>(obj: any, prop: string): T {\n validatePropertyName(prop);\n return obj[prop];\n}\n\nexport function normalizeCalls(calls: Call | Call[]) {\n return toArray(calls).map((call) => {\n return {\n entrypoint: call.entrypoint,\n contractAddress: addAddressPadding(call.contractAddress),\n calldata: CallData.toHex(call.calldata),\n };\n });\n}\n\nexport function toSessionPolicies(policies: Policies): SessionPolicies {\n return Array.isArray(policies)\n ? policies.reduce<SessionPolicies>(\n (prev, p) => {\n if (safeObjectAccess<string>(p, \"target\")) {\n const target = getChecksumAddress(\n safeObjectAccess<string>(p, \"target\"),\n );\n const entrypoint = safeObjectAccess<string>(p, \"method\");\n const contracts = safeObjectAccess<Record<string, any>>(\n prev,\n \"contracts\",\n );\n const item = {\n name: humanizeString(entrypoint),\n entrypoint: entrypoint,\n description: safeObjectAccess<string>(p, \"description\"),\n };\n\n if (target in contracts) {\n const methods = toArray(contracts[target].methods);\n contracts[target] = {\n methods: [...methods, item],\n };\n } else {\n contracts[target] = {\n methods: [item],\n };\n }\n } else {\n const messages = safeObjectAccess<any[]>(prev, \"messages\");\n messages.push(p);\n }\n\n return prev;\n },\n { contracts: {}, messages: [] },\n )\n : policies;\n}\n\nexport function toWasmPolicies(policies: ParsedSessionPolicies): Policy[] {\n return [\n ...Object.entries(policies.contracts ?? {}).flatMap(\n ([target, { methods }]) =>\n toArray(methods).map((m) => ({\n target,\n method: hash.getSelectorFromName(m.entrypoint),\n authorized: m.authorized,\n })),\n ),\n ...(policies.messages ?? []).map((p) => {\n const domainHash = typedData.getStructHash(\n p.types,\n \"StarknetDomain\",\n p.domain,\n TypedDataRevision.ACTIVE,\n );\n const typeHash = typedData.getTypeHash(\n p.types,\n p.primaryType,\n TypedDataRevision.ACTIVE,\n );\n\n return {\n scope_hash: hash.computePoseidonHash(domainHash, typeHash),\n authorized: p.authorized,\n };\n }),\n ];\n}\n\nexport function toArray<T>(val: T | T[]): T[] {\n return Array.isArray(val) ? val : [val];\n}\n\nexport function humanizeString(str: string): string {\n return (\n str\n // Convert from camelCase or snake_case\n .replace(/([a-z])([A-Z])/g, \"$1 $2\") // camelCase to spaces\n .replace(/_/g, \" \") // snake_case to spaces\n .toLowerCase()\n // Capitalize first letter\n .replace(/^\\w/, (c) => c.toUpperCase())\n );\n}\n\nexport function parseChainId(url: URL): ChainId {\n const parts = url.pathname.split(\"/\");\n\n // Handle localhost URLs by making a synchronous call to getChainId\n if (\n url.hostname === \"localhost\" ||\n url.hostname === \"127.0.0.1\" ||\n url.hostname === \"0.0.0.0\"\n ) {\n // Check if we're in a browser environment\n if (typeof XMLHttpRequest === \"undefined\") {\n // In Node.js environment (like tests), we can't make synchronous HTTP calls\n // For now, we'll use a placeholder chainId for localhost in tests\n console.warn(\n `Cannot make synchronous HTTP call in Node.js environment for ${url.toString()}`,\n );\n return shortString.encodeShortString(\"LOCALHOST\") as ChainId;\n }\n\n // Use a synchronous XMLHttpRequest to get the chain ID\n const xhr = new XMLHttpRequest();\n xhr.open(\"POST\", url.toString(), false); // false makes it synchronous\n xhr.setRequestHeader(\"Content-Type\", \"application/json\");\n\n const requestBody = JSON.stringify({\n jsonrpc: \"2.0\",\n method: \"starknet_chainId\",\n params: [],\n id: 1,\n });\n\n try {\n xhr.send(requestBody);\n\n if (xhr.status === 200) {\n const response = JSON.parse(xhr.responseText);\n if (response.result) {\n return response.result as ChainId;\n }\n }\n\n throw new Error(\n `Failed to get chain ID from ${url.toString()}: ${xhr.status} ${xhr.statusText}`,\n );\n } catch (error) {\n throw new Error(`Failed to connect to ${url.toString()}: ${error}`);\n }\n }\n\n if (parts.includes(\"starknet\")) {\n if (parts.includes(\"mainnet\")) {\n return constants.StarknetChainId.SN_MAIN;\n } else if (parts.includes(\"sepolia\")) {\n return constants.StarknetChainId.SN_SEPOLIA;\n }\n } else if (parts.length >= 3) {\n const projectName = parts[2];\n if (parts.includes(\"katana\")) {\n return shortString.encodeShortString(\n `WP_${projectName.toUpperCase().replace(/-/g, \"_\")}`,\n ) as ChainId;\n } else if (parts.includes(\"mainnet\")) {\n return shortString.encodeShortString(\n `GG_${projectName.toUpperCase().replace(/-/g, \"_\")}`,\n ) as ChainId;\n }\n }\n\n throw new Error(`Chain ${url.toString()} not supported`);\n}\n","export class NotReadyToConnect extends Error {\n constructor() {\n super(\"Not ready to connect\");\n\n Object.setPrototypeOf(this, NotReadyToConnect.prototype);\n }\n}\n","import { Policy } from \"@cartridge/controller-wasm\";\nimport { CartridgeSessionAccount } from \"@cartridge/controller-wasm/session\";\nimport { Call, InvokeFunctionResponse, WalletAccount } from \"starknet\";\n\nimport { normalizeCalls } from \"../utils\";\nimport BaseProvider from \"../provider\";\n\nexport * from \"../errors\";\nexport * from \"../types\";\n\nexport default class SessionAccount extends WalletAccount {\n public controller: CartridgeSessionAccount;\n\n constructor(\n provider: BaseProvider,\n {\n rpcUrl,\n privateKey,\n address,\n ownerGuid,\n chainId,\n expiresAt,\n policies,\n guardianKeyGuid,\n metadataHash,\n sessionKeyGuid,\n }: {\n rpcUrl: string;\n privateKey: string;\n address: string;\n ownerGuid: string;\n chainId: string;\n expiresAt: number;\n policies: Policy[];\n guardianKeyGuid: string;\n metadataHash: string;\n sessionKeyGuid: string;\n },\n ) {\n super({\n provider: { nodeUrl: rpcUrl },\n walletProvider: provider,\n address,\n });\n\n this.address = address;\n this.controller = CartridgeSessionAccount.newAsRegistered(\n rpcUrl,\n privateKey,\n address,\n ownerGuid,\n chainId,\n {\n expiresAt,\n policies,\n guardianKeyGuid,\n metadataHash,\n sessionKeyGuid,\n },\n );\n }\n\n /**\n * Invoke execute function in account contract\n *\n * @param calls the invocation object or an array of them, containing:\n * - contractAddress - the address of the contract\n * - entrypoint - the entrypoint of the contract\n * - calldata - (defaults to []) the calldata\n * - signature - (defaults to []) the signature\n *\n * @returns response from addTransaction\n */\n async execute(calls: Call | Call[]): Promise<InvokeFunctionResponse> {\n try {\n const res = await this.controller.executeFromOutside(\n normalizeCalls(calls),\n );\n\n return res;\n } catch (e) {\n return this.controller.execute(normalizeCalls(calls));\n }\n }\n}\n","export const KEYCHAIN_URL = \"https://x.cartridge.gg\";\nexport const PROFILE_URL = \"https://profile.cartridge.gg\";\nexport const API_URL = \"https://api.cartridge.gg\";\n","{\n \"name\": \"@cartridge/controller\",\n \"version\": \"0.10.4\",\n \"description\": \"Cartridge Controller\",\n \"module\": \"dist/index.js\",\n \"types\": \"dist/index.d.ts\",\n \"type\": \"module\",\n \"scripts\": {\n \"build:deps\": \"pnpm build\",\n \"dev\": \"vite build --watch\",\n \"build:browser\": \"vite build\",\n \"build:node\": \"tsup --config tsup.node.config.ts\",\n \"build\": \"pnpm build:browser && pnpm build:node\",\n \"build:compat\": \"pnpm build:browser && pnpm build:node\",\n \"format\": \"prettier --write \\\"src/**/*.ts\\\"\",\n \"format:check\": \"prettier --check \\\"src/**/*.ts\\\"\",\n \"test\": \"jest\",\n \"version\": \"pnpm pkg get version\"\n },\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\"\n },\n \"./session\": {\n \"types\": \"./dist/session.d.ts\",\n \"import\": \"./dist/session.js\"\n },\n \"./session/node\": {\n \"types\": \"./dist/node/index.d.ts\",\n \"import\": \"./dist/node/index.js\",\n \"require\": \"./dist/node/index.cjs\"\n }\n },\n \"dependencies\": {\n \"@cartridge/controller-wasm\": \"catalog:\",\n \"@cartridge/penpal\": \"catalog:\",\n \"micro-sol-signer\": \"^0.5.0\",\n \"bs58\": \"^6.0.0\",\n \"ethers\": \"^6.13.5\",\n \"@starknet-io/types-js\": \"0.9.1\",\n \"@telegram-apps/sdk\": \"^2.4.0\",\n \"@turnkey/sdk-browser\": \"^4.0.0\",\n \"cbor-x\": \"^1.5.0\",\n \"starknet\": \"^8.5.2\",\n \"mipd\": \"^0.0.7\",\n \"open\": \"^10.1.0\",\n \"@walletconnect/ethereum-provider\": \"^2.20.0\"\n },\n \"devDependencies\": {\n \"@cartridge/tsconfig\": \"workspace:*\",\n \"@types/jest\": \"catalog:\",\n \"@types/mocha\": \"catalog:\",\n \"@types/node\": \"catalog:\",\n \"jest\": \"^29.7.0\",\n \"prettier\": \"catalog:\",\n \"rollup-plugin-visualizer\": \"^5.12.0\",\n \"ts-jest\": \"^29.2.5\",\n \"tsup\": \"catalog:\",\n \"typescript\": \"catalog:\",\n \"vite\": \"catalog:\",\n \"vite-plugin-dts\": \"^4.5.3\",\n \"vite-plugin-node-polyfills\": \"^0.23.0\",\n \"vite-plugin-top-level-await\": \"catalog:\",\n \"vite-plugin-wasm\": \"catalog:\"\n }\n}\n","export const icon =\n \"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODAwIiBoZWlnaHQ9IjgwMCIgdmlld0JveD0iMCAwIDgwMCA4MDAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGZpbHRlcj0idXJsKCNmaWx0ZXIwX2RfNTExMl83ODIpIj4KPHBhdGggZD0iTTQ2OS4yMzYgNzBDNDgyLjM5IDcwIDQ5My4wNTMgODAuNjYzIDQ5My4wNTMgOTMuODE2NFYxNDcuMTQ3TDUxNS4zMzggMTQ3LjE0N0w1MTUuNDI4IDE0Ny4xNDdMNTE1LjU1NCAxNDcuMTQ3TDUxNS44MjYgMTQ3LjE0OUM1MTYuMDE2IDE0Ny4xNTEgNTE2LjIyNSAxNDcuMTUzIDUxNi40NTEgMTQ3LjE1N0M1MTYuOTA0IDE0Ny4xNjQgNTE3LjQyOCAxNDcuMTc2IDUxOC4wMiAxNDcuMTk1QzUxOS4yMDEgMTQ3LjIzNCA1MjAuNjYgMTQ3LjMwNCA1MjIuMzYxIDE0Ny40MjRDNTI1Ljc0MSAxNDcuNjYzIDUzMC4xODUgMTQ4LjExNCA1MzUuMzYzIDE0OC45NjlDNTQ1LjAwMSAxNTAuNTYyIDU1OC41NTYgMTUzLjc4IDU3Mi45MTggMTYwLjYwM0w3MzAuNDIgMjI2LjY3MUw3MzIuMTAxIDIyNy41MDVDNzcxLjc4NyAyNDcuMTc3IDc4OS45OTMgMjg2LjI5NiA3ODkuOTkzIDMyMi4wMzZWNTg1Ljg2NUM3ODkuOTkzIDU4Ni4wNTQgNzg5Ljk5NCA1ODYuMjU0IDc4OS45OTQgNTg2LjQ2M0w3ODkuOTk2IDU4Ni45MTNDNzkwLjAzOCA1OTcuMDk2IDc5MC4xNjEgNjI2Ljk5NiA3NjQuMjMxIDY1Mi44MjNMNzE0Ljc2IDcwMi4wOTVMNzE0LjY0MSA3MDIuMjE1QzcwNC42MDEgNzEyLjI3NSA2OTIuMTIzIDcyMC42NTIgNjc2LjI4NCA3MjQuODc5QzY2NC4zOSA3MjguMDU0IDY1Mi44MjcgNzI3Ljk2NiA2NDguNjM3IDcyNy45MzRMNjQ4LjYxOSA3MjcuOTMzQzY0OC40MDkgNzI3LjkzMiA2NDguMjE5IDcyNy45MyA2NDguMDQ3IDcyNy45M0w2NDcuNzUyIDcyNy45MjlINDgwLjcyMUM0NzQuMDk0IDcyNy45MjkgNDY4LjcyMSA3MjIuNTU2IDQ2OC43MjEgNzE1LjkyOVY2NjguMzg4SDMyOC41ODZDMzI4LjU4NiA2NzIuNjI5IDMyOC41NzIgNjk4LjA1MiAzMjguNTYxIDcxNS45NDRDMzI4LjU1NyA3MjIuNTY5IDMyMy4xODYgNzI3LjkyOSAzMTYuNTYxIDcyNy45MjlIMTUyLjI0NkMxNTIuMTA0IDcyNy45MjkgMTUxLjk0MiA3MjcuOTI5IDE1MS43NjIgNzI3LjkzMUwxNTEuMzYyIDcyNy45MzRDMTQ3LjE3MiA3MjcuOTY2IDEzNS42MDkgNzI4LjA1NCAxMjMuNzE0IDcyNC44NzlDMTA3Ljg3MyA3MjAuNjUxIDk1LjM5MzggNzEyLjI3MiA4NS4zNTI5IDcwMi4yMUw4NS4yMzg2IDcwMi4wOTVMMzUuNjcgNjUyLjcyNUwzNS41NzIzIDY1Mi42MjdDOS44NjI0MiA2MjYuNzggOS45NjY3IDU5Ny4xODUgMTAuMDAzIDU4Ni44NzRDMTAuMDA0MyA1ODYuNTEzIDEwLjAwNTUgNTg2LjE3NyAxMC4wMDU1IDU4NS44NjVWMzIyLjAzNkMxMC4wMDU1IDI4Ni40MyAyOC4xNjYyIDI0Ny4xOTkgNjcuODk3NyAyMjcuNTA1TDY5LjU3OSAyMjYuNjcxTDIyNy4wODEgMTYwLjYwM0MyNDEuNDQzIDE1My43OCAyNTQuOTk4IDE1MC41NjIgMjY0LjYzNiAxNDguOTY5QzI2OS44MTQgMTQ4LjExNCAyNzQuMjU4IDE0Ny42NjMgMjc3LjYzOCAxNDcuNDI0QzI3OS4zMzggMTQ3LjMwNCAyODAuNzk4IDE0Ny4yMzQgMjgxLjk3OSAxNDcuMTk1QzI4Mi41NzEgMTQ3LjE3NiAyODMuMDk1IDE0Ny4xNjQgMjgzLjU0NyAxNDcuMTU3TDI4My45MTcgMTQ3LjE1MkwyODQuMTczIDE0Ny4xNDlMMjg0LjQ0NSAxNDcuMTQ3TDI4NC41NzEgMTQ3LjE0N0wyODQuNjYgMTQ3LjE0N0wzMDYuOTQyIDE0Ny4xNDdWOTMuODE2NEMzMDYuOTQyIDgwLjY2MyAzMTcuNjA1IDcwIDMzMC43NTggNzBINDY5LjIzNloiIGZpbGw9IiMxOTFBMUEiLz4KPHBhdGggZD0iTTM2Ni40ODMgMTI5LjU0SDQzMy41MTJWMjA2LjY4N0gzNjYuNDgzVjEyOS41NFoiIGZpbGw9IiNGQkNCNEEiLz4KPHBhdGggZD0iTTI2OS4wMSA2MDIuNDI5SDE0NC4wMDhDMTM1Ljc2OCA2MDIuNDI5IDEzNS43NjggNTk0LjE0NiAxMzUuNzY4IDU5NC4xNDZWMjgwLjg1QzEzNS43NjggMjgwLjg1IDEzNS43NjggMjcyLjY0NCAxNDQuMDA4IDI3Mi42NDRIMzY2LjQ4M0wzNjYuNDgzIDIwNi42ODdIMjg0LjY5QzI4NC42OSAyMDYuNjg3IDI2OC4xMzQgMjA2LjY4NyAyNTEuNTc5IDIxNC44OTNMOTQuMzQxNCAyODAuODVDNzcuNzg2MSAyODkuMDU3IDY5LjU0NjkgMzA1LjYyMyA2OS41NDY5IDMyMi4wMzVWNTg1Ljg2M0M2OS41NDY5IDU5NC4xNDcgNjkuNTQ2OSA2MDIuMzUzIDc3Ljc4NjEgNjEwLjYzNkwxMjcuNDUyIDY2MC4xMDRDMTM1LjY5MSA2NjguMzg3IDE0MS45MjggNjY4LjM4NyAxNTIuMjQ3IDY2OC4zODdIMjY5LjAyOUMyNjkuMDM3IDY0OC4zNCAyNjkuMDQ2IDYyNC42NTUgMjY5LjA1NCA2MDIuODg3SDUyOC4wMTNWNjY4LjM4N0g2NDcuNzUzQzY1OC4wNzEgNjY4LjM4NyA2NjQuMzA4IDY2OC4zODcgNjcyLjU0NyA2NjAuMTA0TDcyMi4yMTMgNjEwLjYzNkM3MzAuNDUzIDYwMi40MjkgNzMwLjQ1MyA1OTQuMTQ3IDczMC40NTMgNTg1Ljg2M1YzMjIuMDM1QzczMC40NTMgMzA1LjU0NiA3MjIuMjEzIDI4OS4wNTcgNzA1LjY1OCAyODAuODVMNTQ4LjQyMSAyMTQuODkzQzUzMS44NjUgMjA2LjY4NyA1MTUuMzEgMjA2LjY4NyA1MTUuMzEgMjA2LjY4N0g0MzMuNTEyTDQzMy41MTIgMjcyLjY0NEg2NTYuMDY5QzY2NC4zMDggMjcyLjY0NCA2NjQuMzA4IDI4MC44NSA2NjQuMzA4IDI4MC44NVY1OTQuMTQ2QzY2NC4zMDggNTk0LjE0NiA2NjQuMzA4IDYwMi40MjkgNjU2LjA2OSA2MDIuNDI5SDUyOC4yNjJWNTM3LjM5NkgyNjkuMDc1QzI2OS4wNzUgNTQzLjcwNyAyNjkuMDE3IDU5Ni45MTIgMjY5LjAxIDYwMi40MjlaIiBmaWxsPSIjRkJDQjRBIi8+CjxwYXRoIGQ9Ik0yNjkuMDA5IDQzNi4xNzJINTI4LjI2MlYzNzAuNjgxSDI2OS4wNzVDMjY5LjA3NSAzNzcuMzczIDI2OS4wMDkgNDM2Ljc4OCAyNjkuMDA5IDQzNi4xNzJaIiBmaWxsPSIjRkJDQjRBIi8+CjwvZz4KPGRlZnM+CjxmaWx0ZXIgaWQ9ImZpbHRlcjBfZF81MTEyXzc4MiIgeD0iLTQiIHk9IjAiIHdpZHRoPSI4MDgiIGhlaWdodD0iODA4IiBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CjxmZUZsb29kIGZsb29kLW9wYWNpdHk9IjAiIHJlc3VsdD0iQmFja2dyb3VuZEltYWdlRml4Ii8+CjxmZUNvbG9yTWF0cml4IGluPSJTb3VyY2VBbHBoYSIgdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDEyNyAwIiByZXN1bHQ9ImhhcmRBbHBoYSIvPgo8ZmVPZmZzZXQgZHk9IjQiLz4KPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMiIvPgo8ZmVDb21wb3NpdGUgaW4yPSJoYXJkQWxwaGEiIG9wZXJhdG9yPSJvdXQiLz4KPGZlQ29sb3JNYXRyaXggdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAuMjUgMCIvPgo8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluMj0iQmFja2dyb3VuZEltYWdlRml4IiByZXN1bHQ9ImVmZmVjdDFfZHJvcFNoYWRvd181MTEyXzc4MiIvPgo8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluPSJTb3VyY2VHcmFwaGljIiBpbjI9ImVmZmVjdDFfZHJvcFNoYWRvd181MTEyXzc4MiIgcmVzdWx0PSJzaGFwZSIvPgo8L2ZpbHRlcj4KPC9kZWZzPgo8L3N2Zz4K\";\n","function releaseStub() {}\n\n/**\n * A simple mutual exclusion lock. It allows you to obtain and release a lock,\n * ensuring that only one task can access a critical section at a time.\n */\nexport class Mutex {\n private m_lastPromise: Promise<void> = Promise.resolve();\n\n /**\n * Acquire lock\n * @param [bypass=false] option to skip lock acquisition\n */\n public async obtain(bypass = false): Promise<() => void> {\n let release = releaseStub;\n if (bypass) return release;\n const lastPromise = this.m_lastPromise;\n this.m_lastPromise = new Promise<void>((resolve) => (release = resolve));\n await lastPromise;\n return release;\n }\n}\n","import {\n AddInvokeTransactionParameters,\n AddStarknetChainParameters,\n Permission,\n RequestAccountsParameters,\n RequestFn,\n StarknetWindowObject,\n SwitchStarknetChainParameters,\n TypedData,\n UNEXPECTED_ERROR,\n WalletEventHandlers,\n WalletEventListener,\n WalletEvents,\n} from \"@starknet-io/types-js\";\nimport { WalletAccount } from \"starknet\";\nimport manifest from \"../package.json\";\n\nimport { icon } from \"./icon\";\nimport { Mutex } from \"./mutex\";\n\nconst mutex = new Mutex();\n\nexport default abstract class BaseProvider implements StarknetWindowObject {\n public id = \"controller\";\n public name = \"Controller\";\n public version = manifest.version;\n public icon = icon;\n\n public account?: WalletAccount;\n public subscriptions: WalletEvents[] = [];\n\n private _probePromise: Promise<WalletAccount | undefined> | null = null;\n\n protected async safeProbe(): Promise<WalletAccount | undefined> {\n // If we already have an account, return it\n if (this.account) {\n return this.account;\n }\n\n // If we're already probing, wait for the existing probe\n if (this._probePromise) {\n return this._probePromise;\n }\n\n const release = await mutex.obtain();\n return await new Promise<WalletAccount | undefined>(async (resolve) => {\n try {\n this._probePromise = this.probe();\n const result = await this._probePromise;\n resolve(result);\n } finally {\n this._probePromise = null;\n }\n }).finally(() => {\n release();\n });\n }\n\n request: RequestFn = async (call) => {\n switch (call.type) {\n case \"wallet_getPermissions\":\n await this.safeProbe();\n\n if (this.account) {\n return [Permission.ACCOUNTS];\n }\n\n return [];\n\n case \"wallet_requestAccounts\": {\n if (this.account) {\n return [this.account.address];\n }\n\n const silentMode =\n call.params && (call.params as RequestAccountsParameters).silent_mode;\n\n this.account = await this.safeProbe();\n\n if (!this.account && !silentMode) {\n this.account = await this.connect();\n }\n\n if (this.account) {\n return [this.account.address];\n }\n\n return [];\n }\n\n case \"wallet_watchAsset\":\n throw {\n code: 63,\n message: \"An unexpected error occurred\",\n data: \"wallet_watchAsset not implemented\",\n } as UNEXPECTED_ERROR;\n\n case \"wallet_addStarknetChain\": {\n let params = call.params as AddStarknetChainParameters;\n return this.addStarknetChain(params);\n }\n\n case \"wallet_switchStarknetChain\": {\n let params = call.params as SwitchStarknetChainParameters;\n return this.switchStarknetChain(params.chainId);\n }\n\n case \"wallet_requestChainId\":\n if (!this.account) {\n throw {\n code: 63,\n message: \"An unexpected error occurred\",\n data: \"Account not initialized\",\n } as UNEXPECTED_ERROR;\n }\n\n return await this.account.getChainId();\n\n case \"wallet_deploymentData\":\n throw {\n code: 63,\n message: \"An unexpected error occurred\",\n data: \"wallet_deploymentData not implemented\",\n } as UNEXPECTED_ERROR;\n\n case \"wallet_addInvokeTransaction\":\n if (!this.account) {\n throw {\n code: 63,\n message: \"An unexpected error occurred\",\n data: \"Account not initialized\",\n } as UNEXPECTED_ERROR;\n }\n\n let params = call.params as AddInvokeTransactionParameters;\n return await this.account.execute(\n params.calls.map((call) => ({\n contractAddress: call.contract_address,\n entrypoint: call.entry_point,\n calldata: call.calldata,\n })),\n );\n\n case \"wallet_addDeclareTransaction\":\n throw {\n code: 63,\n message: \"An unexpected error occurred\",\n data: \"wallet_addDeclareTransaction not implemented\",\n } as UNEXPECTED_ERROR;\n\n case \"wallet_signTypedData\": {\n if (!this.account) {\n throw {\n code: 63,\n message: \"An unexpected error occurred\",\n data: \"Account not initialized\",\n } as UNEXPECTED_ERROR;\n }\n\n return await this.account.signMessage(call.params as TypedData);\n }\n\n case \"wallet_supportedSpecs\":\n return [];\n case \"wallet_supportedWalletApi\":\n return [];\n default:\n throw {\n code: 63,\n message: \"An unexpected error occurred\",\n data: `Unknown RPC call type: ${call.type}`,\n } as UNEXPECTED_ERROR;\n }\n };\n\n on: WalletEventListener = <E extends keyof WalletEventHandlers>(\n event: E,\n handler: WalletEventHandlers[E],\n ): void => {\n if (event !== \"accountsChanged\" && event !== \"networkChanged\") {\n throw new Error(`Unknown event: ${event}`);\n }\n this.subscriptions.push({ type: event, handler } as WalletEvents);\n };\n\n off: WalletEventListener = <E extends keyof WalletEventHandlers>(\n event: E,\n handler: WalletEventHandlers[E],\n ): void => {\n if (event !== \"accountsChanged\" && event !== \"networkChanged\") {\n throw new Error(`Unknown event: ${event}`);\n }\n const idx = this.subscriptions.findIndex(\n (sub) => sub.type === event && sub.handler === handler,\n );\n if (idx >= 0) {\n this.subscriptions.splice(idx, 1);\n }\n };\n\n protected emitNetworkChanged(chainId: string) {\n this.subscriptions\n .filter((sub) => sub.type === \"networkChanged\")\n .forEach((sub) => {\n (sub.handler as WalletEventHandlers[\"networkChanged\"])(chainId);\n });\n }\n\n protected emitAccountsChanged(accounts: string[]) {\n this.subscriptions\n .filter((sub) => sub.type === \"accountsChanged\")\n .forEach((sub) => {\n (sub.handler as WalletEventHandlers[\"accountsChanged\"])(accounts);\n });\n }\n\n abstract probe(): Promise<WalletAccount | undefined>;\n abstract connect(): Promise<WalletAccount | undefined>;\n abstract switchStarknetChain(chainId: string): Promise<boolean>;\n abstract addStarknetChain(\n chain: AddStarknetChainParameters,\n ): Promise<boolean>;\n}\n","import * as http from \"http\";\nimport { AddressInfo } from \"net\";\n\ntype ServerResponse = http.ServerResponse<http.IncomingMessage> & {\n req: http.IncomingMessage;\n};\n\nexport class CallbackServer {\n private server: http.Server;\n private resolveCallback?: (data: string) => void;\n private rejectCallback?: (error: Error) => void;\n private timeoutId?: NodeJS.Timeout;\n\n constructor() {\n this.server = http.createServer(this.handleRequest.bind(this));\n\n // Handle server errors\n this.server.on(\"error\", (error) => {\n console.error(\"Server error:\", error);\n if (this.rejectCallback) {\n this.rejectCallback(error);\n }\n });\n }\n\n private cleanup() {\n if (this.timeoutId) {\n clearTimeout(this.timeoutId);\n }\n this.server.close();\n }\n\n private handleRequest(req: http.IncomingMessage, res: ServerResponse) {\n if (!req.url?.startsWith(\"/callback\")) {\n res.writeHead(404);\n res.end();\n return;\n }\n\n const params = new URLSearchParams(req.url.split(\"?\")[1]);\n const session = params.get(\"startapp\");\n\n if (!session) {\n console.warn(\"Received callback without session data\");\n res.writeHead(400);\n res.end(\"Missing session data\");\n return;\n }\n\n if (this.resolveCallback) {\n this.resolveCallback(session);\n }\n\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n res.end(\n \"<html><body><script>window.close();</script>Session registered successfully. You can close this window.</body></html>\",\n );\n\n this.cleanup();\n }\n\n async listen(): Promise<string> {\n return new Promise((resolve, reject) => {\n this.server.listen(0, \"localhost\", () => {\n const address = this.server.address() as AddressInfo;\n const url = `http://localhost:${address.port}/callback`;\n resolve(url);\n });\n\n this.server.on(\"error\", reject);\n });\n }\n\n async waitForCallback(): Promise<string> {\n return new Promise((resolve, reject) => {\n this.resolveCallback = resolve;\n this.rejectCallback = reject;\n\n this.timeoutId = setTimeout(\n () => {\n console.warn(\"Callback timeout reached\");\n reject(new Error(\"Callback timeout after 5 minutes\"));\n this.cleanup();\n },\n 5 * 60 * 1000,\n );\n });\n }\n}\n","import * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport { CallbackServer } from \"./server\";\n\ninterface SessionSigner {\n privKey: string;\n pubKey: string;\n}\n\ninterface SessionInfo {\n username: string;\n address: string;\n ownerGuid: string;\n transactionHash?: string;\n expiresAt: string;\n}\n\ninterface SessionData {\n signer?: SessionSigner;\n session?: SessionInfo;\n policies?: any;\n lastUsedConnector?: string;\n [key: string]: any;\n}\n\n/**\n * Implements a file system backend.\n * This is designed for Node.js environments to store session data on the filesystem.\n */\nexport class NodeBackend {\n private basePath: string;\n private sessionFile: string;\n private data: SessionData = {};\n private callbackServer?: CallbackServer;\n\n constructor(basePath: string) {\n if (!basePath) {\n throw new Error(\"basePath is required for NodeBackend\");\n }\n this.basePath = basePath;\n this.sessionFile = path.join(this.basePath, \"session.json\");\n }\n\n private async ensureDirectoryExists(): Promise<void> {\n try {\n await fs.access(this.basePath);\n } catch {\n try {\n await fs.mkdir(this.basePath, { recursive: true });\n } catch (error: any) {\n throw new Error(\n `Failed to create directory ${this.basePath}: ${error.message}`,\n );\n }\n }\n }\n\n private async loadData(): Promise<void> {\n try {\n const content = await fs.readFile(this.sessionFile, \"utf-8\");\n const parsed = JSON.parse(content);\n\n if (typeof parsed !== \"object\" || parsed === null) {\n throw new Error(\"Invalid session data format\");\n }\n\n this.data = parsed;\n } catch (error: unknown) {\n if (error instanceof Error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw new Error(`Failed to load session data: ${error.message}`);\n }\n }\n this.data = {};\n }\n }\n\n private async saveData(): Promise<void> {\n try {\n await this.ensureDirectoryExists();\n await fs.writeFile(\n this.sessionFile,\n JSON.stringify(this.data, null, 2),\n \"utf-8\",\n );\n } catch (error: unknown) {\n if (error instanceof Error) {\n throw new Error(`Failed to save session data: ${error.message}`);\n }\n throw error;\n }\n }\n\n async get(key: string): Promise<string | null> {\n if (!key) {\n throw new Error(\"Key is required\");\n }\n\n await this.loadData();\n return this.data[key] ? JSON.stringify(this.data[key]) : null;\n }\n\n async set(key: string, value: string): Promise<void> {\n if (!key) {\n throw new Error(\"Key is required\");\n }\n if (!value) {\n throw new Error(\"Value is required\");\n }\n\n await this.loadData();\n try {\n this.data[key] = JSON.parse(value);\n await this.saveData();\n } catch (error: unknown) {\n if (error instanceof Error) {\n throw new Error(`Failed to set ${key}: ${error.message}`);\n }\n throw error;\n }\n }\n\n async delete(key: string): Promise<void> {\n if (!key) {\n throw new Error(\"Key is required\");\n }\n\n await this.loadData();\n delete this.data[key];\n await this.saveData();\n }\n\n async getRedirectUri(): Promise<string> {\n try {\n this.callbackServer = new CallbackServer();\n return await this.callbackServer.listen();\n } catch (error: unknown) {\n if (error instanceof Error) {\n throw new Error(`Failed to start callback server: ${error.message}`);\n }\n throw error;\n }\n }\n\n async waitForCallback(): Promise<string | null> {\n if (!this.callbackServer) {\n throw new Error(\"Callback server not initialized\");\n }\n return await this.callbackServer.waitForCallback();\n }\n\n openLink(url: string): void {\n if (!url) {\n throw new Error(\"URL is required\");\n }\n\n console.log(`\\n\\t Open url to authorize session: ${url}`);\n }\n}\n","import { ec, stark, WalletAccount } from \"starknet\";\nimport { SessionPolicies } from \"@cartridge/presets\";\nimport { AddStarknetChainParameters } from \"@starknet-io/types-js\";\n\nimport SessionAccount from \"./account\";\nimport { KEYCHAIN_URL } from \"../constants\";\nimport BaseProvider from \"../provider\";\nimport { toWasmPolicies } from \"../utils\";\nimport { ParsedSessionPolicies } from \"../policies\";\nimport { NodeBackend } from \"./backend\";\n\nexport type SessionOptions = {\n rpc: string;\n chainId: string;\n policies: SessionPolicies;\n basePath: string;\n keychainUrl?: string;\n};\n\nexport default class SessionProvider extends BaseProvider {\n public id = \"controller_session\";\n public name = \"Controller Session\";\n\n protected _chainId: string;\n protected _rpcUrl: string;\n protected _username?: string;\n protected _policies: ParsedSessionPolicies;\n protected _keychainUrl: string;\n protected _backend: NodeBackend;\n\n constructor({\n rpc,\n chainId,\n policies,\n basePath,\n keychainUrl,\n }: SessionOptions) {\n super();\n\n this._policies = {\n verified: false,\n contracts: policies.contracts\n ? Object.fromEntries(\n Object.entries(policies.contracts).map(([address, contract]) => [\n address,\n {\n ...contract,\n methods: contract.methods.map((method) => ({\n ...method,\n authorized: true,\n })),\n },\n ]),\n )\n : undefined,\n messages: policies.messages?.map((message) => ({\n ...message,\n authorized: true,\n })),\n };\n\n this._rpcUrl = rpc;\n this._chainId = chainId;\n this._keychainUrl = keychainUrl || KEYCHAIN_URL;\n this._backend = new NodeBackend(basePath);\n }\n\n async username() {\n const sessionStr = await this._backend.get(\"session\");\n if (sessionStr) {\n const session = JSON.parse(sessionStr);\n return session.username;\n }\n return undefined;\n }\n\n async probe(): Promise<WalletAccount | undefined> {\n if (this.account) {\n return this.account;\n }\n\n const [sessionStr, signerStr] = await Promise.all([\n this._backend.get(\"session\"),\n this._backend.get(\"signer\"),\n ]);\n\n if (!sessionStr || !signerStr) {\n return undefined;\n }\n\n const session = JSON.parse(sessionStr);\n const signer = JSON.parse(signerStr);\n\n // Check expiration\n const expirationTime = parseInt(session.expiresAt) * 1000;\n if (Date.now() >= expirationTime) {\n await this.disconnect();\n return undefined;\n }\n\n this._username = session.username;\n this.account = new SessionAccount(this, {\n rpcUrl: this._rpcUrl,\n privateKey: signer.privKey,\n address: session.address,\n ownerGuid: session.ownerGuid,\n chainId: this._chainId,\n expiresAt: parseInt(session.expiresAt),\n policies: toWasmPolicies(this._policies),\n guardianKeyGuid: session.guardianKeyGuid,\n metadataHash: session.metadataHash,\n sessionKeyGuid: session.sessionKeyGuid,\n });\n\n return this.account;\n }\n\n async connect(): Promise<WalletAccount | undefined> {\n if (this.account) {\n return this.account;\n }\n\n const account = await this.probe();\n if (account) {\n return account;\n }\n\n const pk = stark.randomAddress();\n const publicKey = ec.starkCurve.getStarkKey(pk);\n\n await this._backend.set(\n \"signer\",\n JSON.stringify({\n privKey: pk,\n pubKey: publicKey,\n }),\n );\n\n // Get redirect URI from local server\n const redirectUri = await this._backend.getRedirectUri();\n\n const url = `${\n this._keychainUrl\n }/session?public_key=${encodeURIComponent(publicKey)}&redirect_uri=${encodeURIComponent(\n redirectUri,\n )}&redirect_query_name=startapp&policies=${encodeURIComponent(\n JSON.stringify(this._policies),\n )}&rpc_url=${encodeURIComponent(this._rpcUrl)}`;\n\n this._backend.openLink(url);\n\n // Wait for callback with session data\n const sessionData = await this._backend.waitForCallback();\n if (sessionData) {\n const sessionRegistration = JSON.parse(atob(sessionData));\n // Ensure addresses are properly formatted\n sessionRegistration.address = sessionRegistration.address.toLowerCase();\n sessionRegistration.ownerGuid =\n sessionRegistration.ownerGuid.toLowerCase();\n await this._backend.set(\"session\", JSON.stringify(sessionRegistration));\n return this.probe();\n }\n\n return undefined;\n }\n\n async disconnect(): Promise<void> {\n await this._backend.delete(\"signer\");\n await this._backend.delete(\"session\");\n this.account = undefined;\n this._username = undefined;\n }\n\n switchStarknetChain(_chainId: string): Promise<boolean> {\n throw new Error(\"switchStarknetChain not implemented\");\n }\n\n addStarknetChain(_chain: AddStarknetChainParameters): Promise<boolean> {\n throw new Error(\"addStarknetChain not implemented\");\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/utils.ts","../../src/errors.ts","../../src/node/account.ts","../../src/constants.ts","../../package.json","../../src/icon.ts","../../src/mutex.ts","../../src/provider.ts","../../src/node/server.ts","../../src/node/backend.ts","../../src/node/provider.ts"],"names":["addAddressPadding","CallData","hash","typedData","TypedDataRevision","WalletAccount","CartridgeSessionAccount","Permission","params","call","http","path","fs","stark","ec","encode","signerToGuid"],"mappings":"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","file":"index.cjs","sourcesContent":["import {\n addAddressPadding,\n Call,\n CallData,\n constants,\n getChecksumAddress,\n hash,\n shortString,\n typedData,\n TypedDataRevision,\n} from \"starknet\";\nimport { Policy } from \"@cartridge/controller-wasm/controller\";\nimport { Policies, SessionPolicies } from \"@cartridge/presets\";\nimport { ChainId } from \"@starknet-io/types-js\";\nimport { ParsedSessionPolicies } from \"./policies\";\n\n// Whitelist of allowed property names to prevent prototype pollution\nconst ALLOWED_PROPERTIES = new Set([\n \"contracts\",\n \"messages\",\n \"target\",\n \"method\",\n \"name\",\n \"description\",\n \"types\",\n \"domain\",\n \"primaryType\",\n]);\n\nfunction validatePropertyName(prop: string): void {\n if (!ALLOWED_PROPERTIES.has(prop)) {\n throw new Error(`Invalid property name: ${prop}`);\n }\n}\n\nfunction safeObjectAccess<T>(obj: any, prop: string): T {\n validatePropertyName(prop);\n return obj[prop];\n}\n\nexport function normalizeCalls(calls: Call | Call[]) {\n return toArray(calls).map((call) => {\n return {\n entrypoint: call.entrypoint,\n contractAddress: addAddressPadding(call.contractAddress),\n calldata: CallData.toHex(call.calldata),\n };\n });\n}\n\nexport function toSessionPolicies(policies: Policies): SessionPolicies {\n return Array.isArray(policies)\n ? policies.reduce<SessionPolicies>(\n (prev, p) => {\n if (safeObjectAccess<string>(p, \"target\")) {\n const target = getChecksumAddress(\n safeObjectAccess<string>(p, \"target\"),\n );\n const entrypoint = safeObjectAccess<string>(p, \"method\");\n const contracts = safeObjectAccess<Record<string, any>>(\n prev,\n \"contracts\",\n );\n const item = {\n name: humanizeString(entrypoint),\n entrypoint: entrypoint,\n description: safeObjectAccess<string>(p, \"description\"),\n };\n\n if (target in contracts) {\n const methods = toArray(contracts[target].methods);\n contracts[target] = {\n methods: [...methods, item],\n };\n } else {\n contracts[target] = {\n methods: [item],\n };\n }\n } else {\n const messages = safeObjectAccess<any[]>(prev, \"messages\");\n messages.push(p);\n }\n\n return prev;\n },\n { contracts: {}, messages: [] },\n )\n : policies;\n}\n\nexport function toWasmPolicies(policies: ParsedSessionPolicies): Policy[] {\n return [\n ...Object.entries(policies.contracts ?? {}).flatMap(\n ([target, { methods }]) =>\n toArray(methods).map((m) => ({\n target,\n method: hash.getSelectorFromName(m.entrypoint),\n authorized: m.authorized,\n })),\n ),\n ...(policies.messages ?? []).map((p) => {\n const domainHash = typedData.getStructHash(\n p.types,\n \"StarknetDomain\",\n p.domain,\n TypedDataRevision.ACTIVE,\n );\n const typeHash = typedData.getTypeHash(\n p.types,\n p.primaryType,\n TypedDataRevision.ACTIVE,\n );\n\n return {\n scope_hash: hash.computePoseidonHash(domainHash, typeHash),\n authorized: p.authorized,\n };\n }),\n ];\n}\n\nexport function toArray<T>(val: T | T[]): T[] {\n return Array.isArray(val) ? val : [val];\n}\n\nexport function humanizeString(str: string): string {\n return (\n str\n // Convert from camelCase or snake_case\n .replace(/([a-z])([A-Z])/g, \"$1 $2\") // camelCase to spaces\n .replace(/_/g, \" \") // snake_case to spaces\n .toLowerCase()\n // Capitalize first letter\n .replace(/^\\w/, (c) => c.toUpperCase())\n );\n}\n\nexport function parseChainId(url: URL): ChainId {\n const parts = url.pathname.split(\"/\");\n\n // Handle localhost URLs by making a synchronous call to getChainId\n if (\n url.hostname === \"localhost\" ||\n url.hostname === \"127.0.0.1\" ||\n url.hostname === \"0.0.0.0\"\n ) {\n // Check if we're in a browser environment\n if (typeof XMLHttpRequest === \"undefined\") {\n // In Node.js environment (like tests), we can't make synchronous HTTP calls\n // For now, we'll use a placeholder chainId for localhost in tests\n console.warn(\n `Cannot make synchronous HTTP call in Node.js environment for ${url.toString()}`,\n );\n return shortString.encodeShortString(\"LOCALHOST\") as ChainId;\n }\n\n // Use a synchronous XMLHttpRequest to get the chain ID\n const xhr = new XMLHttpRequest();\n xhr.open(\"POST\", url.toString(), false); // false makes it synchronous\n xhr.setRequestHeader(\"Content-Type\", \"application/json\");\n\n const requestBody = JSON.stringify({\n jsonrpc: \"2.0\",\n method: \"starknet_chainId\",\n params: [],\n id: 1,\n });\n\n try {\n xhr.send(requestBody);\n\n if (xhr.status === 200) {\n const response = JSON.parse(xhr.responseText);\n if (response.result) {\n return response.result as ChainId;\n }\n }\n\n throw new Error(\n `Failed to get chain ID from ${url.toString()}: ${xhr.status} ${xhr.statusText}`,\n );\n } catch (error) {\n throw new Error(`Failed to connect to ${url.toString()}: ${error}`);\n }\n }\n\n if (parts.includes(\"starknet\")) {\n if (parts.includes(\"mainnet\")) {\n return constants.StarknetChainId.SN_MAIN;\n } else if (parts.includes(\"sepolia\")) {\n return constants.StarknetChainId.SN_SEPOLIA;\n }\n } else if (parts.length >= 3) {\n const projectName = parts[2];\n if (parts.includes(\"katana\")) {\n return shortString.encodeShortString(\n `WP_${projectName.toUpperCase().replace(/-/g, \"_\")}`,\n ) as ChainId;\n } else if (parts.includes(\"mainnet\")) {\n return shortString.encodeShortString(\n `GG_${projectName.toUpperCase().replace(/-/g, \"_\")}`,\n ) as ChainId;\n }\n }\n\n throw new Error(`Chain ${url.toString()} not supported`);\n}\n","export class NotReadyToConnect extends Error {\n constructor() {\n super(\"Not ready to connect\");\n\n Object.setPrototypeOf(this, NotReadyToConnect.prototype);\n }\n}\n","import { Policy } from \"@cartridge/controller-wasm\";\nimport { CartridgeSessionAccount } from \"@cartridge/controller-wasm/session\";\nimport { Call, InvokeFunctionResponse, WalletAccount } from \"starknet\";\n\nimport { normalizeCalls } from \"../utils\";\nimport BaseProvider from \"../provider\";\n\nexport * from \"../errors\";\nexport * from \"../types\";\n\nexport default class SessionAccount extends WalletAccount {\n public controller: CartridgeSessionAccount;\n\n constructor(\n provider: BaseProvider,\n {\n rpcUrl,\n privateKey,\n address,\n ownerGuid,\n chainId,\n expiresAt,\n policies,\n guardianKeyGuid,\n metadataHash,\n sessionKeyGuid,\n }: {\n rpcUrl: string;\n privateKey: string;\n address: string;\n ownerGuid: string;\n chainId: string;\n expiresAt: number;\n policies: Policy[];\n guardianKeyGuid: string;\n metadataHash: string;\n sessionKeyGuid: string;\n },\n ) {\n super({\n provider: { nodeUrl: rpcUrl },\n walletProvider: provider,\n address,\n });\n\n this.address = address;\n this.controller = CartridgeSessionAccount.newAsRegistered(\n rpcUrl,\n privateKey,\n address,\n ownerGuid,\n chainId,\n {\n expiresAt,\n policies,\n guardianKeyGuid,\n metadataHash,\n sessionKeyGuid,\n },\n );\n }\n\n /**\n * Invoke execute function in account contract\n *\n * @param calls the invocation object or an array of them, containing:\n * - contractAddress - the address of the contract\n * - entrypoint - the entrypoint of the contract\n * - calldata - (defaults to []) the calldata\n * - signature - (defaults to []) the signature\n *\n * @returns response from addTransaction\n */\n async execute(calls: Call | Call[]): Promise<InvokeFunctionResponse> {\n try {\n const res = await this.controller.executeFromOutside(\n normalizeCalls(calls),\n );\n\n return res;\n } catch (e) {\n return this.controller.execute(normalizeCalls(calls));\n }\n }\n}\n","export const KEYCHAIN_URL = \"https://x.cartridge.gg\";\nexport const PROFILE_URL = \"https://profile.cartridge.gg\";\nexport const API_URL = \"https://api.cartridge.gg\";\n","{\n \"name\": \"@cartridge/controller\",\n \"version\": \"0.10.5\",\n \"description\": \"Cartridge Controller\",\n \"module\": \"dist/index.js\",\n \"types\": \"dist/index.d.ts\",\n \"type\": \"module\",\n \"scripts\": {\n \"build:deps\": \"pnpm build\",\n \"dev\": \"vite build --watch\",\n \"build:browser\": \"vite build\",\n \"build:node\": \"tsup --config tsup.node.config.ts\",\n \"build\": \"pnpm build:browser && pnpm build:node\",\n \"build:compat\": \"pnpm build:browser && pnpm build:node\",\n \"format\": \"prettier --write \\\"src/**/*.ts\\\"\",\n \"format:check\": \"prettier --check \\\"src/**/*.ts\\\"\",\n \"test\": \"jest\",\n \"version\": \"pnpm pkg get version\"\n },\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\"\n },\n \"./session\": {\n \"types\": \"./dist/session.d.ts\",\n \"import\": \"./dist/session.js\"\n },\n \"./session/node\": {\n \"types\": \"./dist/node/index.d.ts\",\n \"import\": \"./dist/node/index.js\",\n \"require\": \"./dist/node/index.cjs\"\n }\n },\n \"dependencies\": {\n \"@cartridge/controller-wasm\": \"catalog:\",\n \"@cartridge/penpal\": \"catalog:\",\n \"micro-sol-signer\": \"^0.5.0\",\n \"bs58\": \"^6.0.0\",\n \"ethers\": \"^6.13.5\",\n \"@starknet-io/types-js\": \"0.9.1\",\n \"@telegram-apps/sdk\": \"^2.4.0\",\n \"@turnkey/sdk-browser\": \"^4.0.0\",\n \"cbor-x\": \"^1.5.0\",\n \"starknet\": \"^8.5.2\",\n \"mipd\": \"^0.0.7\",\n \"open\": \"^10.1.0\",\n \"@walletconnect/ethereum-provider\": \"^2.20.0\"\n },\n \"devDependencies\": {\n \"@cartridge/tsconfig\": \"workspace:*\",\n \"@types/jest\": \"catalog:\",\n \"@types/mocha\": \"catalog:\",\n \"@types/node\": \"catalog:\",\n \"jest\": \"^29.7.0\",\n \"prettier\": \"catalog:\",\n \"rollup-plugin-visualizer\": \"^5.12.0\",\n \"ts-jest\": \"^29.2.5\",\n \"tsup\": \"catalog:\",\n \"typescript\": \"catalog:\",\n \"vite\": \"catalog:\",\n \"vite-plugin-dts\": \"^4.5.3\",\n \"vite-plugin-node-polyfills\": \"^0.23.0\",\n \"vite-plugin-top-level-await\": \"catalog:\",\n \"vite-plugin-wasm\": \"catalog:\"\n }\n}\n","export const icon =\n \"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODAwIiBoZWlnaHQ9IjgwMCIgdmlld0JveD0iMCAwIDgwMCA4MDAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGZpbHRlcj0idXJsKCNmaWx0ZXIwX2RfNTExMl83ODIpIj4KPHBhdGggZD0iTTQ2OS4yMzYgNzBDNDgyLjM5IDcwIDQ5My4wNTMgODAuNjYzIDQ5My4wNTMgOTMuODE2NFYxNDcuMTQ3TDUxNS4zMzggMTQ3LjE0N0w1MTUuNDI4IDE0Ny4xNDdMNTE1LjU1NCAxNDcuMTQ3TDUxNS44MjYgMTQ3LjE0OUM1MTYuMDE2IDE0Ny4xNTEgNTE2LjIyNSAxNDcuMTUzIDUxNi40NTEgMTQ3LjE1N0M1MTYuOTA0IDE0Ny4xNjQgNTE3LjQyOCAxNDcuMTc2IDUxOC4wMiAxNDcuMTk1QzUxOS4yMDEgMTQ3LjIzNCA1MjAuNjYgMTQ3LjMwNCA1MjIuMzYxIDE0Ny40MjRDNTI1Ljc0MSAxNDcuNjYzIDUzMC4xODUgMTQ4LjExNCA1MzUuMzYzIDE0OC45NjlDNTQ1LjAwMSAxNTAuNTYyIDU1OC41NTYgMTUzLjc4IDU3Mi45MTggMTYwLjYwM0w3MzAuNDIgMjI2LjY3MUw3MzIuMTAxIDIyNy41MDVDNzcxLjc4NyAyNDcuMTc3IDc4OS45OTMgMjg2LjI5NiA3ODkuOTkzIDMyMi4wMzZWNTg1Ljg2NUM3ODkuOTkzIDU4Ni4wNTQgNzg5Ljk5NCA1ODYuMjU0IDc4OS45OTQgNTg2LjQ2M0w3ODkuOTk2IDU4Ni45MTNDNzkwLjAzOCA1OTcuMDk2IDc5MC4xNjEgNjI2Ljk5NiA3NjQuMjMxIDY1Mi44MjNMNzE0Ljc2IDcwMi4wOTVMNzE0LjY0MSA3MDIuMjE1QzcwNC42MDEgNzEyLjI3NSA2OTIuMTIzIDcyMC42NTIgNjc2LjI4NCA3MjQuODc5QzY2NC4zOSA3MjguMDU0IDY1Mi44MjcgNzI3Ljk2NiA2NDguNjM3IDcyNy45MzRMNjQ4LjYxOSA3MjcuOTMzQzY0OC40MDkgNzI3LjkzMiA2NDguMjE5IDcyNy45MyA2NDguMDQ3IDcyNy45M0w2NDcuNzUyIDcyNy45MjlINDgwLjcyMUM0NzQuMDk0IDcyNy45MjkgNDY4LjcyMSA3MjIuNTU2IDQ2OC43MjEgNzE1LjkyOVY2NjguMzg4SDMyOC41ODZDMzI4LjU4NiA2NzIuNjI5IDMyOC41NzIgNjk4LjA1MiAzMjguNTYxIDcxNS45NDRDMzI4LjU1NyA3MjIuNTY5IDMyMy4xODYgNzI3LjkyOSAzMTYuNTYxIDcyNy45MjlIMTUyLjI0NkMxNTIuMTA0IDcyNy45MjkgMTUxLjk0MiA3MjcuOTI5IDE1MS43NjIgNzI3LjkzMUwxNTEuMzYyIDcyNy45MzRDMTQ3LjE3MiA3MjcuOTY2IDEzNS42MDkgNzI4LjA1NCAxMjMuNzE0IDcyNC44NzlDMTA3Ljg3MyA3MjAuNjUxIDk1LjM5MzggNzEyLjI3MiA4NS4zNTI5IDcwMi4yMUw4NS4yMzg2IDcwMi4wOTVMMzUuNjcgNjUyLjcyNUwzNS41NzIzIDY1Mi42MjdDOS44NjI0MiA2MjYuNzggOS45NjY3IDU5Ny4xODUgMTAuMDAzIDU4Ni44NzRDMTAuMDA0MyA1ODYuNTEzIDEwLjAwNTUgNTg2LjE3NyAxMC4wMDU1IDU4NS44NjVWMzIyLjAzNkMxMC4wMDU1IDI4Ni40MyAyOC4xNjYyIDI0Ny4xOTkgNjcuODk3NyAyMjcuNTA1TDY5LjU3OSAyMjYuNjcxTDIyNy4wODEgMTYwLjYwM0MyNDEuNDQzIDE1My43OCAyNTQuOTk4IDE1MC41NjIgMjY0LjYzNiAxNDguOTY5QzI2OS44MTQgMTQ4LjExNCAyNzQuMjU4IDE0Ny42NjMgMjc3LjYzOCAxNDcuNDI0QzI3OS4zMzggMTQ3LjMwNCAyODAuNzk4IDE0Ny4yMzQgMjgxLjk3OSAxNDcuMTk1QzI4Mi41NzEgMTQ3LjE3NiAyODMuMDk1IDE0Ny4xNjQgMjgzLjU0NyAxNDcuMTU3TDI4My45MTcgMTQ3LjE1MkwyODQuMTczIDE0Ny4xNDlMMjg0LjQ0NSAxNDcuMTQ3TDI4NC41NzEgMTQ3LjE0N0wyODQuNjYgMTQ3LjE0N0wzMDYuOTQyIDE0Ny4xNDdWOTMuODE2NEMzMDYuOTQyIDgwLjY2MyAzMTcuNjA1IDcwIDMzMC43NTggNzBINDY5LjIzNloiIGZpbGw9IiMxOTFBMUEiLz4KPHBhdGggZD0iTTM2Ni40ODMgMTI5LjU0SDQzMy41MTJWMjA2LjY4N0gzNjYuNDgzVjEyOS41NFoiIGZpbGw9IiNGQkNCNEEiLz4KPHBhdGggZD0iTTI2OS4wMSA2MDIuNDI5SDE0NC4wMDhDMTM1Ljc2OCA2MDIuNDI5IDEzNS43NjggNTk0LjE0NiAxMzUuNzY4IDU5NC4xNDZWMjgwLjg1QzEzNS43NjggMjgwLjg1IDEzNS43NjggMjcyLjY0NCAxNDQuMDA4IDI3Mi42NDRIMzY2LjQ4M0wzNjYuNDgzIDIwNi42ODdIMjg0LjY5QzI4NC42OSAyMDYuNjg3IDI2OC4xMzQgMjA2LjY4NyAyNTEuNTc5IDIxNC44OTNMOTQuMzQxNCAyODAuODVDNzcuNzg2MSAyODkuMDU3IDY5LjU0NjkgMzA1LjYyMyA2OS41NDY5IDMyMi4wMzVWNTg1Ljg2M0M2OS41NDY5IDU5NC4xNDcgNjkuNTQ2OSA2MDIuMzUzIDc3Ljc4NjEgNjEwLjYzNkwxMjcuNDUyIDY2MC4xMDRDMTM1LjY5MSA2NjguMzg3IDE0MS45MjggNjY4LjM4NyAxNTIuMjQ3IDY2OC4zODdIMjY5LjAyOUMyNjkuMDM3IDY0OC4zNCAyNjkuMDQ2IDYyNC42NTUgMjY5LjA1NCA2MDIuODg3SDUyOC4wMTNWNjY4LjM4N0g2NDcuNzUzQzY1OC4wNzEgNjY4LjM4NyA2NjQuMzA4IDY2OC4zODcgNjcyLjU0NyA2NjAuMTA0TDcyMi4yMTMgNjEwLjYzNkM3MzAuNDUzIDYwMi40MjkgNzMwLjQ1MyA1OTQuMTQ3IDczMC40NTMgNTg1Ljg2M1YzMjIuMDM1QzczMC40NTMgMzA1LjU0NiA3MjIuMjEzIDI4OS4wNTcgNzA1LjY1OCAyODAuODVMNTQ4LjQyMSAyMTQuODkzQzUzMS44NjUgMjA2LjY4NyA1MTUuMzEgMjA2LjY4NyA1MTUuMzEgMjA2LjY4N0g0MzMuNTEyTDQzMy41MTIgMjcyLjY0NEg2NTYuMDY5QzY2NC4zMDggMjcyLjY0NCA2NjQuMzA4IDI4MC44NSA2NjQuMzA4IDI4MC44NVY1OTQuMTQ2QzY2NC4zMDggNTk0LjE0NiA2NjQuMzA4IDYwMi40MjkgNjU2LjA2OSA2MDIuNDI5SDUyOC4yNjJWNTM3LjM5NkgyNjkuMDc1QzI2OS4wNzUgNTQzLjcwNyAyNjkuMDE3IDU5Ni45MTIgMjY5LjAxIDYwMi40MjlaIiBmaWxsPSIjRkJDQjRBIi8+CjxwYXRoIGQ9Ik0yNjkuMDA5IDQzNi4xNzJINTI4LjI2MlYzNzAuNjgxSDI2OS4wNzVDMjY5LjA3NSAzNzcuMzczIDI2OS4wMDkgNDM2Ljc4OCAyNjkuMDA5IDQzNi4xNzJaIiBmaWxsPSIjRkJDQjRBIi8+CjwvZz4KPGRlZnM+CjxmaWx0ZXIgaWQ9ImZpbHRlcjBfZF81MTEyXzc4MiIgeD0iLTQiIHk9IjAiIHdpZHRoPSI4MDgiIGhlaWdodD0iODA4IiBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CjxmZUZsb29kIGZsb29kLW9wYWNpdHk9IjAiIHJlc3VsdD0iQmFja2dyb3VuZEltYWdlRml4Ii8+CjxmZUNvbG9yTWF0cml4IGluPSJTb3VyY2VBbHBoYSIgdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDEyNyAwIiByZXN1bHQ9ImhhcmRBbHBoYSIvPgo8ZmVPZmZzZXQgZHk9IjQiLz4KPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMiIvPgo8ZmVDb21wb3NpdGUgaW4yPSJoYXJkQWxwaGEiIG9wZXJhdG9yPSJvdXQiLz4KPGZlQ29sb3JNYXRyaXggdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAuMjUgMCIvPgo8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluMj0iQmFja2dyb3VuZEltYWdlRml4IiByZXN1bHQ9ImVmZmVjdDFfZHJvcFNoYWRvd181MTEyXzc4MiIvPgo8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluPSJTb3VyY2VHcmFwaGljIiBpbjI9ImVmZmVjdDFfZHJvcFNoYWRvd181MTEyXzc4MiIgcmVzdWx0PSJzaGFwZSIvPgo8L2ZpbHRlcj4KPC9kZWZzPgo8L3N2Zz4K\";\n","function releaseStub() {}\n\n/**\n * A simple mutual exclusion lock. It allows you to obtain and release a lock,\n * ensuring that only one task can access a critical section at a time.\n */\nexport class Mutex {\n private m_lastPromise: Promise<void> = Promise.resolve();\n\n /**\n * Acquire lock\n * @param [bypass=false] option to skip lock acquisition\n */\n public async obtain(bypass = false): Promise<() => void> {\n let release = releaseStub;\n if (bypass) return release;\n const lastPromise = this.m_lastPromise;\n this.m_lastPromise = new Promise<void>((resolve) => (release = resolve));\n await lastPromise;\n return release;\n }\n}\n","import {\n AddInvokeTransactionParameters,\n AddStarknetChainParameters,\n Permission,\n RequestAccountsParameters,\n RequestFn,\n StarknetWindowObject,\n SwitchStarknetChainParameters,\n TypedData,\n UNEXPECTED_ERROR,\n WalletEventHandlers,\n WalletEventListener,\n WalletEvents,\n} from \"@starknet-io/types-js\";\nimport { WalletAccount } from \"starknet\";\nimport manifest from \"../package.json\";\n\nimport { icon } from \"./icon\";\nimport { Mutex } from \"./mutex\";\n\nconst mutex = new Mutex();\n\nexport default abstract class BaseProvider implements StarknetWindowObject {\n public id = \"controller\";\n public name = \"Controller\";\n public version = manifest.version;\n public icon = icon;\n\n public account?: WalletAccount;\n public subscriptions: WalletEvents[] = [];\n\n private _probePromise: Promise<WalletAccount | undefined> | null = null;\n\n protected async safeProbe(): Promise<WalletAccount | undefined> {\n // If we already have an account, return it\n if (this.account) {\n return this.account;\n }\n\n // If we're already probing, wait for the existing probe\n if (this._probePromise) {\n return this._probePromise;\n }\n\n const release = await mutex.obtain();\n return await new Promise<WalletAccount | undefined>(async (resolve) => {\n try {\n this._probePromise = this.probe();\n const result = await this._probePromise;\n resolve(result);\n } finally {\n this._probePromise = null;\n }\n }).finally(() => {\n release();\n });\n }\n\n request: RequestFn = async (call) => {\n switch (call.type) {\n case \"wallet_getPermissions\":\n await this.safeProbe();\n\n if (this.account) {\n return [Permission.ACCOUNTS];\n }\n\n return [];\n\n case \"wallet_requestAccounts\": {\n if (this.account) {\n return [this.account.address];\n }\n\n const silentMode =\n call.params && (call.params as RequestAccountsParameters).silent_mode;\n\n this.account = await this.safeProbe();\n\n if (!this.account && !silentMode) {\n this.account = await this.connect();\n }\n\n if (this.account) {\n return [this.account.address];\n }\n\n return [];\n }\n\n case \"wallet_watchAsset\":\n throw {\n code: 63,\n message: \"An unexpected error occurred\",\n data: \"wallet_watchAsset not implemented\",\n } as UNEXPECTED_ERROR;\n\n case \"wallet_addStarknetChain\": {\n let params = call.params as AddStarknetChainParameters;\n return this.addStarknetChain(params);\n }\n\n case \"wallet_switchStarknetChain\": {\n let params = call.params as SwitchStarknetChainParameters;\n return this.switchStarknetChain(params.chainId);\n }\n\n case \"wallet_requestChainId\":\n if (!this.account) {\n throw {\n code: 63,\n message: \"An unexpected error occurred\",\n data: \"Account not initialized\",\n } as UNEXPECTED_ERROR;\n }\n\n return await this.account.getChainId();\n\n case \"wallet_deploymentData\":\n throw {\n code: 63,\n message: \"An unexpected error occurred\",\n data: \"wallet_deploymentData not implemented\",\n } as UNEXPECTED_ERROR;\n\n case \"wallet_addInvokeTransaction\":\n if (!this.account) {\n throw {\n code: 63,\n message: \"An unexpected error occurred\",\n data: \"Account not initialized\",\n } as UNEXPECTED_ERROR;\n }\n\n let params = call.params as AddInvokeTransactionParameters;\n return await this.account.execute(\n params.calls.map((call) => ({\n contractAddress: call.contract_address,\n entrypoint: call.entry_point,\n calldata: call.calldata,\n })),\n );\n\n case \"wallet_addDeclareTransaction\":\n throw {\n code: 63,\n message: \"An unexpected error occurred\",\n data: \"wallet_addDeclareTransaction not implemented\",\n } as UNEXPECTED_ERROR;\n\n case \"wallet_signTypedData\": {\n if (!this.account) {\n throw {\n code: 63,\n message: \"An unexpected error occurred\",\n data: \"Account not initialized\",\n } as UNEXPECTED_ERROR;\n }\n\n return await this.account.signMessage(call.params as TypedData);\n }\n\n case \"wallet_supportedSpecs\":\n return [];\n case \"wallet_supportedWalletApi\":\n return [];\n default:\n throw {\n code: 63,\n message: \"An unexpected error occurred\",\n data: `Unknown RPC call type: ${call.type}`,\n } as UNEXPECTED_ERROR;\n }\n };\n\n on: WalletEventListener = <E extends keyof WalletEventHandlers>(\n event: E,\n handler: WalletEventHandlers[E],\n ): void => {\n if (event !== \"accountsChanged\" && event !== \"networkChanged\") {\n throw new Error(`Unknown event: ${event}`);\n }\n this.subscriptions.push({ type: event, handler } as WalletEvents);\n };\n\n off: WalletEventListener = <E extends keyof WalletEventHandlers>(\n event: E,\n handler: WalletEventHandlers[E],\n ): void => {\n if (event !== \"accountsChanged\" && event !== \"networkChanged\") {\n throw new Error(`Unknown event: ${event}`);\n }\n const idx = this.subscriptions.findIndex(\n (sub) => sub.type === event && sub.handler === handler,\n );\n if (idx >= 0) {\n this.subscriptions.splice(idx, 1);\n }\n };\n\n protected emitNetworkChanged(chainId: string) {\n this.subscriptions\n .filter((sub) => sub.type === \"networkChanged\")\n .forEach((sub) => {\n (sub.handler as WalletEventHandlers[\"networkChanged\"])(chainId);\n });\n }\n\n protected emitAccountsChanged(accounts: string[]) {\n this.subscriptions\n .filter((sub) => sub.type === \"accountsChanged\")\n .forEach((sub) => {\n (sub.handler as WalletEventHandlers[\"accountsChanged\"])(accounts);\n });\n }\n\n abstract probe(): Promise<WalletAccount | undefined>;\n abstract connect(): Promise<WalletAccount | undefined>;\n abstract switchStarknetChain(chainId: string): Promise<boolean>;\n abstract addStarknetChain(\n chain: AddStarknetChainParameters,\n ): Promise<boolean>;\n}\n","import * as http from \"http\";\nimport { AddressInfo } from \"net\";\n\ntype ServerResponse = http.ServerResponse<http.IncomingMessage> & {\n req: http.IncomingMessage;\n};\n\nexport class CallbackServer {\n private server: http.Server;\n private resolveCallback?: (data: string) => void;\n private rejectCallback?: (error: Error) => void;\n private timeoutId?: NodeJS.Timeout;\n\n constructor() {\n this.server = http.createServer(this.handleRequest.bind(this));\n\n // Handle server errors\n this.server.on(\"error\", (error) => {\n console.error(\"Server error:\", error);\n if (this.rejectCallback) {\n this.rejectCallback(error);\n }\n });\n }\n\n private cleanup() {\n if (this.timeoutId) {\n clearTimeout(this.timeoutId);\n }\n this.server.close();\n }\n\n private handleRequest(req: http.IncomingMessage, res: ServerResponse) {\n if (!req.url?.startsWith(\"/callback\")) {\n res.writeHead(404);\n res.end();\n return;\n }\n\n const params = new URLSearchParams(req.url.split(\"?\")[1]);\n const session = params.get(\"startapp\");\n\n if (!session) {\n console.warn(\"Received callback without session data\");\n res.writeHead(400);\n res.end(\"Missing session data\");\n return;\n }\n\n if (this.resolveCallback) {\n this.resolveCallback(session);\n }\n\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n res.end(\n \"<html><body><script>window.close();</script>Session registered successfully. You can close this window.</body></html>\",\n );\n\n this.cleanup();\n }\n\n async listen(): Promise<string> {\n return new Promise((resolve, reject) => {\n this.server.listen(0, \"localhost\", () => {\n const address = this.server.address() as AddressInfo;\n const url = `http://localhost:${address.port}/callback`;\n resolve(url);\n });\n\n this.server.on(\"error\", reject);\n });\n }\n\n async waitForCallback(): Promise<string> {\n return new Promise((resolve, reject) => {\n this.resolveCallback = resolve;\n this.rejectCallback = reject;\n\n this.timeoutId = setTimeout(\n () => {\n console.warn(\"Callback timeout reached\");\n reject(new Error(\"Callback timeout after 5 minutes\"));\n this.cleanup();\n },\n 5 * 60 * 1000,\n );\n });\n }\n}\n","import * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport { CallbackServer } from \"./server\";\n\ninterface SessionSigner {\n privKey: string;\n pubKey: string;\n}\n\ninterface SessionInfo {\n username: string;\n address: string;\n ownerGuid: string;\n transactionHash?: string;\n expiresAt: string;\n}\n\ninterface SessionData {\n signer?: SessionSigner;\n session?: SessionInfo;\n policies?: any;\n lastUsedConnector?: string;\n [key: string]: any;\n}\n\n/**\n * Implements a file system backend.\n * This is designed for Node.js environments to store session data on the filesystem.\n */\nexport class NodeBackend {\n private basePath: string;\n private sessionFile: string;\n private data: SessionData = {};\n private callbackServer?: CallbackServer;\n\n constructor(basePath: string) {\n if (!basePath) {\n throw new Error(\"basePath is required for NodeBackend\");\n }\n this.basePath = basePath;\n this.sessionFile = path.join(this.basePath, \"session.json\");\n }\n\n private async ensureDirectoryExists(): Promise<void> {\n try {\n await fs.access(this.basePath);\n } catch {\n try {\n await fs.mkdir(this.basePath, { recursive: true });\n } catch (error: any) {\n throw new Error(\n `Failed to create directory ${this.basePath}: ${error.message}`,\n );\n }\n }\n }\n\n private async loadData(): Promise<void> {\n try {\n const content = await fs.readFile(this.sessionFile, \"utf-8\");\n const parsed = JSON.parse(content);\n\n if (typeof parsed !== \"object\" || parsed === null) {\n throw new Error(\"Invalid session data format\");\n }\n\n this.data = parsed;\n } catch (error: unknown) {\n if (error instanceof Error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw new Error(`Failed to load session data: ${error.message}`);\n }\n }\n this.data = {};\n }\n }\n\n private async saveData(): Promise<void> {\n try {\n await this.ensureDirectoryExists();\n await fs.writeFile(\n this.sessionFile,\n JSON.stringify(this.data, null, 2),\n \"utf-8\",\n );\n } catch (error: unknown) {\n if (error instanceof Error) {\n throw new Error(`Failed to save session data: ${error.message}`);\n }\n throw error;\n }\n }\n\n async get(key: string): Promise<string | null> {\n if (!key) {\n throw new Error(\"Key is required\");\n }\n\n await this.loadData();\n return this.data[key] ? JSON.stringify(this.data[key]) : null;\n }\n\n async set(key: string, value: string): Promise<void> {\n if (!key) {\n throw new Error(\"Key is required\");\n }\n if (!value) {\n throw new Error(\"Value is required\");\n }\n\n await this.loadData();\n try {\n this.data[key] = JSON.parse(value);\n await this.saveData();\n } catch (error: unknown) {\n if (error instanceof Error) {\n throw new Error(`Failed to set ${key}: ${error.message}`);\n }\n throw error;\n }\n }\n\n async delete(key: string): Promise<void> {\n if (!key) {\n throw new Error(\"Key is required\");\n }\n\n await this.loadData();\n delete this.data[key];\n await this.saveData();\n }\n\n async getRedirectUri(): Promise<string> {\n try {\n this.callbackServer = new CallbackServer();\n return await this.callbackServer.listen();\n } catch (error: unknown) {\n if (error instanceof Error) {\n throw new Error(`Failed to start callback server: ${error.message}`);\n }\n throw error;\n }\n }\n\n async waitForCallback(): Promise<string | null> {\n if (!this.callbackServer) {\n throw new Error(\"Callback server not initialized\");\n }\n return await this.callbackServer.waitForCallback();\n }\n\n openLink(url: string): void {\n if (!url) {\n throw new Error(\"URL is required\");\n }\n\n console.log(`\\n\\t Open url to authorize session: ${url}`);\n }\n}\n","import { ec, encode, stark, WalletAccount } from \"starknet\";\nimport { SessionPolicies } from \"@cartridge/presets\";\nimport { AddStarknetChainParameters } from \"@starknet-io/types-js\";\nimport { signerToGuid } from \"@cartridge/controller-wasm\";\n\nimport SessionAccount from \"./account\";\nimport { KEYCHAIN_URL } from \"../constants\";\nimport BaseProvider from \"../provider\";\nimport { toWasmPolicies } from \"../utils\";\nimport { ParsedSessionPolicies } from \"../policies\";\nimport { NodeBackend } from \"./backend\";\n\nexport type SessionOptions = {\n rpc: string;\n chainId: string;\n policies: SessionPolicies;\n basePath: string;\n keychainUrl?: string;\n};\n\nexport default class SessionProvider extends BaseProvider {\n public id = \"controller_session\";\n public name = \"Controller Session\";\n\n protected _chainId: string;\n protected _rpcUrl: string;\n protected _username?: string;\n protected _policies: ParsedSessionPolicies;\n protected _keychainUrl: string;\n protected _backend: NodeBackend;\n\n constructor({\n rpc,\n chainId,\n policies,\n basePath,\n keychainUrl,\n }: SessionOptions) {\n super();\n\n this._policies = {\n verified: false,\n contracts: policies.contracts\n ? Object.fromEntries(\n Object.entries(policies.contracts).map(([address, contract]) => [\n address,\n {\n ...contract,\n methods: contract.methods.map((method) => ({\n ...method,\n authorized: true,\n })),\n },\n ]),\n )\n : undefined,\n messages: policies.messages?.map((message) => ({\n ...message,\n authorized: true,\n })),\n };\n\n this._rpcUrl = rpc;\n this._chainId = chainId;\n this._keychainUrl = keychainUrl || KEYCHAIN_URL;\n this._backend = new NodeBackend(basePath);\n }\n\n async username() {\n const sessionStr = await this._backend.get(\"session\");\n if (sessionStr) {\n const session = JSON.parse(sessionStr);\n return session.username;\n }\n return undefined;\n }\n\n async probe(): Promise<WalletAccount | undefined> {\n if (this.account) {\n return this.account;\n }\n\n const [sessionStr, signerStr] = await Promise.all([\n this._backend.get(\"session\"),\n this._backend.get(\"signer\"),\n ]);\n\n if (!sessionStr || !signerStr) {\n return undefined;\n }\n\n const session = JSON.parse(sessionStr);\n const signer = JSON.parse(signerStr);\n\n // Check expiration\n const expirationTime = parseInt(session.expiresAt) * 1000;\n if (Date.now() >= expirationTime) {\n await this.disconnect();\n return undefined;\n }\n\n this._username = session.username;\n this.account = new SessionAccount(this, {\n rpcUrl: this._rpcUrl,\n privateKey: signer.privKey,\n address: session.address,\n ownerGuid: session.ownerGuid,\n chainId: this._chainId,\n expiresAt: parseInt(session.expiresAt),\n policies: toWasmPolicies(this._policies),\n guardianKeyGuid: session.guardianKeyGuid,\n metadataHash: session.metadataHash,\n sessionKeyGuid: session.sessionKeyGuid,\n });\n\n return this.account;\n }\n\n async connect(): Promise<WalletAccount | undefined> {\n if (this.account) {\n return this.account;\n }\n\n const account = await this.probe();\n if (account) {\n return account;\n }\n\n const pk = stark.randomAddress();\n const publicKey = ec.starkCurve.getStarkKey(pk);\n\n await this._backend.set(\n \"signer\",\n JSON.stringify({\n privKey: pk,\n pubKey: publicKey,\n }),\n );\n\n // Get redirect URI from local server\n const redirectUri = await this._backend.getRedirectUri();\n\n const url = `${\n this._keychainUrl\n }/session?public_key=${encodeURIComponent(publicKey)}&redirect_uri=${encodeURIComponent(\n redirectUri,\n )}&redirect_query_name=startapp&policies=${encodeURIComponent(\n JSON.stringify(this._policies),\n )}&rpc_url=${encodeURIComponent(this._rpcUrl)}`;\n\n this._backend.openLink(url);\n\n // Wait for callback with session data\n const sessionData = await this._backend.waitForCallback();\n if (sessionData) {\n const sessionRegistration = JSON.parse(atob(sessionData));\n const formattedPk = encode.addHexPrefix(publicKey);\n // Ensure addresses are properly formatted\n sessionRegistration.address = sessionRegistration.address.toLowerCase();\n sessionRegistration.ownerGuid =\n sessionRegistration.ownerGuid.toLowerCase();\n sessionRegistration.guardianKeyGuid = \"0x0\";\n sessionRegistration.metadataHash = \"0x0\";\n sessionRegistration.sessionKeyGuid = signerToGuid({\n starknet: { privateKey: formattedPk },\n });\n await this._backend.set(\"session\", JSON.stringify(sessionRegistration));\n return this.probe();\n }\n\n return undefined;\n }\n\n async disconnect(): Promise<void> {\n await this._backend.delete(\"signer\");\n await this._backend.delete(\"session\");\n this.account = undefined;\n this._username = undefined;\n }\n\n switchStarknetChain(_chainId: string): Promise<boolean> {\n throw new Error(\"switchStarknetChain not implemented\");\n }\n\n addStarknetChain(_chain: AddStarknetChainParameters): Promise<boolean> {\n throw new Error(\"addStarknetChain not implemented\");\n }\n}\n"]}
@@ -1,4 +1,5 @@
1
- import { stark, ec, WalletAccount, hash, typedData, TypedDataRevision, CallData, addAddressPadding } from 'starknet';
1
+ import { stark, ec, encode, WalletAccount, hash, typedData, TypedDataRevision, CallData, addAddressPadding } from 'starknet';
2
+ import { signerToGuid } from '@cartridge/controller-wasm';
2
3
  import { CartridgeSessionAccount } from '@cartridge/controller-wasm/session';
3
4
  import { Permission } from '@starknet-io/types-js';
4
5
  import * as fs from 'fs/promises';
@@ -119,7 +120,7 @@ var KEYCHAIN_URL = "https://x.cartridge.gg";
119
120
 
120
121
  // package.json
121
122
  var package_default = {
122
- version: "0.10.4"};
123
+ version: "0.10.5"};
123
124
 
124
125
  // src/icon.ts
125
126
  var icon = "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODAwIiBoZWlnaHQ9IjgwMCIgdmlld0JveD0iMCAwIDgwMCA4MDAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGZpbHRlcj0idXJsKCNmaWx0ZXIwX2RfNTExMl83ODIpIj4KPHBhdGggZD0iTTQ2OS4yMzYgNzBDNDgyLjM5IDcwIDQ5My4wNTMgODAuNjYzIDQ5My4wNTMgOTMuODE2NFYxNDcuMTQ3TDUxNS4zMzggMTQ3LjE0N0w1MTUuNDI4IDE0Ny4xNDdMNTE1LjU1NCAxNDcuMTQ3TDUxNS44MjYgMTQ3LjE0OUM1MTYuMDE2IDE0Ny4xNTEgNTE2LjIyNSAxNDcuMTUzIDUxNi40NTEgMTQ3LjE1N0M1MTYuOTA0IDE0Ny4xNjQgNTE3LjQyOCAxNDcuMTc2IDUxOC4wMiAxNDcuMTk1QzUxOS4yMDEgMTQ3LjIzNCA1MjAuNjYgMTQ3LjMwNCA1MjIuMzYxIDE0Ny40MjRDNTI1Ljc0MSAxNDcuNjYzIDUzMC4xODUgMTQ4LjExNCA1MzUuMzYzIDE0OC45NjlDNTQ1LjAwMSAxNTAuNTYyIDU1OC41NTYgMTUzLjc4IDU3Mi45MTggMTYwLjYwM0w3MzAuNDIgMjI2LjY3MUw3MzIuMTAxIDIyNy41MDVDNzcxLjc4NyAyNDcuMTc3IDc4OS45OTMgMjg2LjI5NiA3ODkuOTkzIDMyMi4wMzZWNTg1Ljg2NUM3ODkuOTkzIDU4Ni4wNTQgNzg5Ljk5NCA1ODYuMjU0IDc4OS45OTQgNTg2LjQ2M0w3ODkuOTk2IDU4Ni45MTNDNzkwLjAzOCA1OTcuMDk2IDc5MC4xNjEgNjI2Ljk5NiA3NjQuMjMxIDY1Mi44MjNMNzE0Ljc2IDcwMi4wOTVMNzE0LjY0MSA3MDIuMjE1QzcwNC42MDEgNzEyLjI3NSA2OTIuMTIzIDcyMC42NTIgNjc2LjI4NCA3MjQuODc5QzY2NC4zOSA3MjguMDU0IDY1Mi44MjcgNzI3Ljk2NiA2NDguNjM3IDcyNy45MzRMNjQ4LjYxOSA3MjcuOTMzQzY0OC40MDkgNzI3LjkzMiA2NDguMjE5IDcyNy45MyA2NDguMDQ3IDcyNy45M0w2NDcuNzUyIDcyNy45MjlINDgwLjcyMUM0NzQuMDk0IDcyNy45MjkgNDY4LjcyMSA3MjIuNTU2IDQ2OC43MjEgNzE1LjkyOVY2NjguMzg4SDMyOC41ODZDMzI4LjU4NiA2NzIuNjI5IDMyOC41NzIgNjk4LjA1MiAzMjguNTYxIDcxNS45NDRDMzI4LjU1NyA3MjIuNTY5IDMyMy4xODYgNzI3LjkyOSAzMTYuNTYxIDcyNy45MjlIMTUyLjI0NkMxNTIuMTA0IDcyNy45MjkgMTUxLjk0MiA3MjcuOTI5IDE1MS43NjIgNzI3LjkzMUwxNTEuMzYyIDcyNy45MzRDMTQ3LjE3MiA3MjcuOTY2IDEzNS42MDkgNzI4LjA1NCAxMjMuNzE0IDcyNC44NzlDMTA3Ljg3MyA3MjAuNjUxIDk1LjM5MzggNzEyLjI3MiA4NS4zNTI5IDcwMi4yMUw4NS4yMzg2IDcwMi4wOTVMMzUuNjcgNjUyLjcyNUwzNS41NzIzIDY1Mi42MjdDOS44NjI0MiA2MjYuNzggOS45NjY3IDU5Ny4xODUgMTAuMDAzIDU4Ni44NzRDMTAuMDA0MyA1ODYuNTEzIDEwLjAwNTUgNTg2LjE3NyAxMC4wMDU1IDU4NS44NjVWMzIyLjAzNkMxMC4wMDU1IDI4Ni40MyAyOC4xNjYyIDI0Ny4xOTkgNjcuODk3NyAyMjcuNTA1TDY5LjU3OSAyMjYuNjcxTDIyNy4wODEgMTYwLjYwM0MyNDEuNDQzIDE1My43OCAyNTQuOTk4IDE1MC41NjIgMjY0LjYzNiAxNDguOTY5QzI2OS44MTQgMTQ4LjExNCAyNzQuMjU4IDE0Ny42NjMgMjc3LjYzOCAxNDcuNDI0QzI3OS4zMzggMTQ3LjMwNCAyODAuNzk4IDE0Ny4yMzQgMjgxLjk3OSAxNDcuMTk1QzI4Mi41NzEgMTQ3LjE3NiAyODMuMDk1IDE0Ny4xNjQgMjgzLjU0NyAxNDcuMTU3TDI4My45MTcgMTQ3LjE1MkwyODQuMTczIDE0Ny4xNDlMMjg0LjQ0NSAxNDcuMTQ3TDI4NC41NzEgMTQ3LjE0N0wyODQuNjYgMTQ3LjE0N0wzMDYuOTQyIDE0Ny4xNDdWOTMuODE2NEMzMDYuOTQyIDgwLjY2MyAzMTcuNjA1IDcwIDMzMC43NTggNzBINDY5LjIzNloiIGZpbGw9IiMxOTFBMUEiLz4KPHBhdGggZD0iTTM2Ni40ODMgMTI5LjU0SDQzMy41MTJWMjA2LjY4N0gzNjYuNDgzVjEyOS41NFoiIGZpbGw9IiNGQkNCNEEiLz4KPHBhdGggZD0iTTI2OS4wMSA2MDIuNDI5SDE0NC4wMDhDMTM1Ljc2OCA2MDIuNDI5IDEzNS43NjggNTk0LjE0NiAxMzUuNzY4IDU5NC4xNDZWMjgwLjg1QzEzNS43NjggMjgwLjg1IDEzNS43NjggMjcyLjY0NCAxNDQuMDA4IDI3Mi42NDRIMzY2LjQ4M0wzNjYuNDgzIDIwNi42ODdIMjg0LjY5QzI4NC42OSAyMDYuNjg3IDI2OC4xMzQgMjA2LjY4NyAyNTEuNTc5IDIxNC44OTNMOTQuMzQxNCAyODAuODVDNzcuNzg2MSAyODkuMDU3IDY5LjU0NjkgMzA1LjYyMyA2OS41NDY5IDMyMi4wMzVWNTg1Ljg2M0M2OS41NDY5IDU5NC4xNDcgNjkuNTQ2OSA2MDIuMzUzIDc3Ljc4NjEgNjEwLjYzNkwxMjcuNDUyIDY2MC4xMDRDMTM1LjY5MSA2NjguMzg3IDE0MS45MjggNjY4LjM4NyAxNTIuMjQ3IDY2OC4zODdIMjY5LjAyOUMyNjkuMDM3IDY0OC4zNCAyNjkuMDQ2IDYyNC42NTUgMjY5LjA1NCA2MDIuODg3SDUyOC4wMTNWNjY4LjM4N0g2NDcuNzUzQzY1OC4wNzEgNjY4LjM4NyA2NjQuMzA4IDY2OC4zODcgNjcyLjU0NyA2NjAuMTA0TDcyMi4yMTMgNjEwLjYzNkM3MzAuNDUzIDYwMi40MjkgNzMwLjQ1MyA1OTQuMTQ3IDczMC40NTMgNTg1Ljg2M1YzMjIuMDM1QzczMC40NTMgMzA1LjU0NiA3MjIuMjEzIDI4OS4wNTcgNzA1LjY1OCAyODAuODVMNTQ4LjQyMSAyMTQuODkzQzUzMS44NjUgMjA2LjY4NyA1MTUuMzEgMjA2LjY4NyA1MTUuMzEgMjA2LjY4N0g0MzMuNTEyTDQzMy41MTIgMjcyLjY0NEg2NTYuMDY5QzY2NC4zMDggMjcyLjY0NCA2NjQuMzA4IDI4MC44NSA2NjQuMzA4IDI4MC44NVY1OTQuMTQ2QzY2NC4zMDggNTk0LjE0NiA2NjQuMzA4IDYwMi40MjkgNjU2LjA2OSA2MDIuNDI5SDUyOC4yNjJWNTM3LjM5NkgyNjkuMDc1QzI2OS4wNzUgNTQzLjcwNyAyNjkuMDE3IDU5Ni45MTIgMjY5LjAxIDYwMi40MjlaIiBmaWxsPSIjRkJDQjRBIi8+CjxwYXRoIGQ9Ik0yNjkuMDA5IDQzNi4xNzJINTI4LjI2MlYzNzAuNjgxSDI2OS4wNzVDMjY5LjA3NSAzNzcuMzczIDI2OS4wMDkgNDM2Ljc4OCAyNjkuMDA5IDQzNi4xNzJaIiBmaWxsPSIjRkJDQjRBIi8+CjwvZz4KPGRlZnM+CjxmaWx0ZXIgaWQ9ImZpbHRlcjBfZF81MTEyXzc4MiIgeD0iLTQiIHk9IjAiIHdpZHRoPSI4MDgiIGhlaWdodD0iODA4IiBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CjxmZUZsb29kIGZsb29kLW9wYWNpdHk9IjAiIHJlc3VsdD0iQmFja2dyb3VuZEltYWdlRml4Ii8+CjxmZUNvbG9yTWF0cml4IGluPSJTb3VyY2VBbHBoYSIgdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDEyNyAwIiByZXN1bHQ9ImhhcmRBbHBoYSIvPgo8ZmVPZmZzZXQgZHk9IjQiLz4KPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMiIvPgo8ZmVDb21wb3NpdGUgaW4yPSJoYXJkQWxwaGEiIG9wZXJhdG9yPSJvdXQiLz4KPGZlQ29sb3JNYXRyaXggdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAuMjUgMCIvPgo8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluMj0iQmFja2dyb3VuZEltYWdlRml4IiByZXN1bHQ9ImVmZmVjdDFfZHJvcFNoYWRvd181MTEyXzc4MiIvPgo8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluPSJTb3VyY2VHcmFwaGljIiBpbjI9ImVmZmVjdDFfZHJvcFNoYWRvd181MTEyXzc4MiIgcmVzdWx0PSJzaGFwZSIvPgo8L2ZpbHRlcj4KPC9kZWZzPgo8L3N2Zz4K";
@@ -592,8 +593,14 @@ var SessionProvider = class extends BaseProvider {
592
593
  const sessionData = await this._backend.waitForCallback();
593
594
  if (sessionData) {
594
595
  const sessionRegistration = JSON.parse(atob(sessionData));
596
+ const formattedPk = encode.addHexPrefix(publicKey);
595
597
  sessionRegistration.address = sessionRegistration.address.toLowerCase();
596
598
  sessionRegistration.ownerGuid = sessionRegistration.ownerGuid.toLowerCase();
599
+ sessionRegistration.guardianKeyGuid = "0x0";
600
+ sessionRegistration.metadataHash = "0x0";
601
+ sessionRegistration.sessionKeyGuid = signerToGuid({
602
+ starknet: { privateKey: formattedPk }
603
+ });
597
604
  await this._backend.set("session", JSON.stringify(sessionRegistration));
598
605
  return this.probe();
599
606
  }