@cartridge/controller 0.5.8 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/.turbo/turbo-build$colon$deps.log +77 -110
  2. package/.turbo/turbo-build.log +78 -111
  3. package/dist/__tests__/parseChainId.test.d.ts +2 -0
  4. package/dist/__tests__/parseChainId.test.js +89 -0
  5. package/dist/__tests__/parseChainId.test.js.map +1 -0
  6. package/dist/account.js +6 -0
  7. package/dist/account.js.map +1 -1
  8. package/dist/controller.d.ts +1 -1
  9. package/dist/controller.js +218 -136
  10. package/dist/controller.js.map +1 -1
  11. package/dist/iframe/base.js +4 -0
  12. package/dist/iframe/base.js.map +1 -1
  13. package/dist/iframe/index.js +4 -0
  14. package/dist/iframe/index.js.map +1 -1
  15. package/dist/iframe/keychain.js +4 -0
  16. package/dist/iframe/keychain.js.map +1 -1
  17. package/dist/iframe/profile.js +4 -0
  18. package/dist/iframe/profile.js.map +1 -1
  19. package/dist/index.d.ts +1 -0
  20. package/dist/index.js +222 -138
  21. package/dist/index.js.map +1 -1
  22. package/dist/mutex.d.ts +14 -0
  23. package/dist/mutex.js +22 -0
  24. package/dist/mutex.js.map +1 -0
  25. package/dist/policies.d.ts +19 -0
  26. package/dist/policies.js +26 -0
  27. package/dist/policies.js.map +1 -0
  28. package/dist/provider.d.ts +2 -0
  29. package/dist/provider.js +167 -109
  30. package/dist/provider.js.map +1 -1
  31. package/dist/session/account.js +4 -0
  32. package/dist/session/account.js.map +1 -1
  33. package/dist/session/index.d.ts +1 -0
  34. package/dist/session/index.js +292 -121
  35. package/dist/session/index.js.map +1 -1
  36. package/dist/session/provider.d.ts +7 -2
  37. package/dist/session/provider.js +292 -121
  38. package/dist/session/provider.js.map +1 -1
  39. package/dist/telegram/provider.d.ts +2 -1
  40. package/dist/telegram/provider.js +204 -112
  41. package/dist/telegram/provider.js.map +1 -1
  42. package/dist/utils.d.ts +5 -3
  43. package/dist/utils.js +29 -2
  44. package/dist/utils.js.map +1 -1
  45. package/jest.config.ts +13 -0
  46. package/package.json +26 -8
  47. package/src/__tests__/parseChainId.test.ts +60 -0
  48. package/src/controller.ts +25 -29
  49. package/src/mutex.ts +22 -0
  50. package/src/policies.ts +49 -0
  51. package/src/provider.ts +33 -2
  52. package/src/session/account.ts +1 -0
  53. package/src/session/provider.ts +139 -10
  54. package/src/telegram/provider.ts +3 -2
  55. package/src/utils.ts +32 -1
  56. package/tsconfig.json +1 -2
@@ -1,118 +1,85 @@
1
1
 
2
- > @cartridge/controller@0.5.8 build:deps /home/runner/work/controller/controller/packages/controller
2
+ > @cartridge/controller@0.6.0 build:deps /home/runner/work/controller/controller/packages/controller
3
3
  > tsup --dts-resolve
4
4
 
5
- CLI Building entry: src/account.ts, src/constants.ts, src/controller.ts, src/errors.ts, src/icon.ts, src/index.ts, src/lookup.ts, src/provider.ts, src/types.ts, src/utils.ts, src/iframe/base.ts, src/iframe/index.ts, src/iframe/keychain.ts, src/iframe/profile.ts, src/session/account.ts, src/session/backend.ts, src/session/index.ts, src/session/provider.ts, src/telegram/backend.ts, src/telegram/provider.ts
5
+ CLI Building entry: src/account.ts, src/constants.ts, src/controller.ts, src/errors.ts, src/icon.ts, src/index.ts, src/lookup.ts, src/mutex.ts, src/policies.ts, src/provider.ts, src/types.ts, src/utils.ts, src/__tests__/parseChainId.test.ts, src/iframe/base.ts, src/iframe/index.ts, src/iframe/keychain.ts, src/iframe/profile.ts, src/session/account.ts, src/session/backend.ts, src/session/index.ts, src/session/provider.ts, src/telegram/backend.ts, src/telegram/provider.ts
6
6
  CLI Using tsconfig: tsconfig.json
7
- CLI tsup v8.3.0
7
+ CLI tsup v8.3.5
8
8
  CLI Using tsup config: /home/runner/work/controller/controller/packages/controller/package.json
9
- CLI Target: es2020
9
+ CLI Target: esnext
10
10
  CLI Cleaning output folder
11
11
  ESM Build start
12
- ESM dist/account.js 2.81 KB
13
- ESM dist/iframe/base.js 3.64 KB
14
- ESM dist/session/account.js 2.25 KB
15
- ESM dist/telegram/backend.js 1.27 KB
16
- ESM dist/constants.js 247.00 B
17
- ESM dist/controller.js 36.30 KB
18
- ESM dist/errors.js 271.00 B
19
- ESM dist/icon.js 15.15 KB
20
- ESM dist/index.js 260.41 KB
21
- ESM dist/lookup.js 1.59 KB
22
- ESM dist/provider.js 20.52 KB
23
- ESM dist/utils.js 2.77 KB
24
- ESM dist/types.js 437.00 B
25
- ESM dist/iframe/index.js 5.16 KB
26
- ESM dist/iframe/keychain.js 4.12 KB
27
- ESM dist/iframe/profile.js 4.69 KB
28
- ESM dist/session/backend.js 1.18 KB
29
- ESM dist/session/index.js 26.51 KB
30
- ESM dist/session/provider.js 25.91 KB
31
- ESM dist/telegram/provider.js 25.46 KB
32
- ESM dist/account.js.map 8.81 KB
33
- ESM dist/iframe/base.js.map 7.08 KB
34
- ESM dist/session/account.js.map 11.19 KB
35
- ESM dist/telegram/backend.js.map 1.98 KB
36
- ESM dist/constants.js.map 315.00 B
37
- ESM dist/controller.js.map 60.04 KB
38
- ESM dist/errors.js.map 385.00 B
39
- ESM dist/index.js.map 393.35 KB
40
- ESM dist/lookup.js.map 3.49 KB
41
- ESM dist/utils.js.map 5.65 KB
42
- ESM dist/types.js.map 4.75 KB
43
- ESM dist/provider.js.map 25.41 KB
44
- ESM dist/iframe/index.js.map 10.47 KB
45
- ESM dist/iframe/keychain.js.map 8.27 KB
46
- ESM dist/session/backend.js.map 2.88 KB
47
- ESM dist/iframe/profile.js.map 9.47 KB
48
- ESM dist/session/index.js.map 43.61 KB
49
- ESM dist/session/provider.js.map 38.61 KB
50
- ESM dist/icon.js.map 15.20 KB
51
- ESM dist/telegram/provider.js.map 37.76 KB
52
- ESM ⚡️ Build success in 123ms
12
+ ESM dist/__tests__/parseChainId.test.js 2.92 KB
13
+ ESM dist/account.js 2.88 KB
14
+ ESM dist/iframe/base.js 3.68 KB
15
+ ESM dist/session/account.js 2.32 KB
16
+ ESM dist/telegram/backend.js 1.27 KB
17
+ ESM dist/constants.js 247.00 B
18
+ ESM dist/controller.js 37.77 KB
19
+ ESM dist/errors.js 271.00 B
20
+ ESM dist/icon.js 15.15 KB
21
+ ESM dist/index.js 261.94 KB
22
+ ESM dist/lookup.js 1.59 KB
23
+ ESM dist/mutex.js 502.00 B
24
+ ESM dist/policies.js 593.00 B
25
+ ESM dist/types.js 437.00 B
26
+ ESM dist/provider.js 21.57 KB
27
+ ESM dist/utils.js 3.60 KB
28
+ ESM dist/iframe/index.js 5.20 KB
29
+ ESM dist/iframe/keychain.js 4.16 KB
30
+ ESM dist/iframe/profile.js 4.73 KB
31
+ ESM dist/session/backend.js 1.18 KB
32
+ ESM dist/session/index.js 30.96 KB
33
+ ESM dist/session/provider.js 30.36 KB
34
+ ESM dist/telegram/provider.js 27.24 KB
35
+ ESM dist/__tests__/parseChainId.test.js.map 8.60 KB
36
+ ESM dist/account.js.map 9.89 KB
37
+ ESM dist/iframe/base.js.map 7.12 KB
38
+ ESM dist/session/account.js.map 12.28 KB
39
+ ESM dist/telegram/backend.js.map 1.98 KB
40
+ ESM dist/constants.js.map 315.00 B
41
+ ESM dist/controller.js.map 63.97 KB
42
+ ESM dist/errors.js.map 385.00 B
43
+ ESM dist/icon.js.map 15.20 KB
44
+ ESM dist/lookup.js.map 3.49 KB
45
+ ESM dist/mutex.js.map 1.00 KB
46
+ ESM dist/policies.js.map 1.61 KB
47
+ ESM dist/types.js.map 4.75 KB
48
+ ESM dist/provider.js.map 28.26 KB
49
+ ESM dist/utils.js.map 7.28 KB
50
+ ESM dist/iframe/index.js.map 10.50 KB
51
+ ESM dist/index.js.map 397.32 KB
52
+ ESM dist/iframe/keychain.js.map 8.31 KB
53
+ ESM dist/iframe/profile.js.map 9.51 KB
54
+ ESM dist/session/backend.js.map 2.88 KB
55
+ ESM dist/session/provider.js.map 48.42 KB
56
+ ESM dist/session/index.js.map 53.42 KB
57
+ ESM dist/telegram/provider.js.map 43.43 KB
58
+ ESM ⚡️ Build success in 118ms
53
59
  DTS Build start
54
- ../tsconfig/base.json(6,25): error TS6046: Argument for '--moduleResolution' option must be: 'node', 'classic', 'node16', 'nodenext'.
55
-
56
- ../tsconfig/base.json(6,25): error TS6046: Argument for '--moduleResolution' option must be: 'node', 'classic', 'node16', 'nodenext'.
57
-
58
- ../tsconfig/base.json(6,25): error TS6046: Argument for '--moduleResolution' option must be: 'node', 'classic', 'node16', 'nodenext'.
59
-
60
- ../tsconfig/base.json(6,25): error TS6046: Argument for '--moduleResolution' option must be: 'node', 'classic', 'node16', 'nodenext'.
61
-
62
- ../tsconfig/base.json(6,25): error TS6046: Argument for '--moduleResolution' option must be: 'node', 'classic', 'node16', 'nodenext'.
63
-
64
- ../tsconfig/base.json(6,25): error TS6046: Argument for '--moduleResolution' option must be: 'node', 'classic', 'node16', 'nodenext'.
65
-
66
- ../tsconfig/base.json(6,25): error TS6046: Argument for '--moduleResolution' option must be: 'node', 'classic', 'node16', 'nodenext'.
67
-
68
- ../tsconfig/base.json(6,25): error TS6046: Argument for '--moduleResolution' option must be: 'node', 'classic', 'node16', 'nodenext'.
69
-
70
- ../tsconfig/base.json(6,25): error TS6046: Argument for '--moduleResolution' option must be: 'node', 'classic', 'node16', 'nodenext'.
71
-
72
- ../tsconfig/base.json(6,25): error TS6046: Argument for '--moduleResolution' option must be: 'node', 'classic', 'node16', 'nodenext'.
73
-
74
- ../tsconfig/base.json(6,25): error TS6046: Argument for '--moduleResolution' option must be: 'node', 'classic', 'node16', 'nodenext'.
75
-
76
- ../tsconfig/base.json(6,25): error TS6046: Argument for '--moduleResolution' option must be: 'node', 'classic', 'node16', 'nodenext'.
77
-
78
- ../tsconfig/base.json(6,25): error TS6046: Argument for '--moduleResolution' option must be: 'node', 'classic', 'node16', 'nodenext'.
79
-
80
- ../tsconfig/base.json(6,25): error TS6046: Argument for '--moduleResolution' option must be: 'node', 'classic', 'node16', 'nodenext'.
81
-
82
- ../tsconfig/base.json(6,25): error TS6046: Argument for '--moduleResolution' option must be: 'node', 'classic', 'node16', 'nodenext'.
83
-
84
- ../tsconfig/base.json(6,25): error TS6046: Argument for '--moduleResolution' option must be: 'node', 'classic', 'node16', 'nodenext'.
85
-
86
- ../tsconfig/base.json(6,25): error TS6046: Argument for '--moduleResolution' option must be: 'node', 'classic', 'node16', 'nodenext'.
87
-
88
- ../tsconfig/base.json(6,25): error TS6046: Argument for '--moduleResolution' option must be: 'node', 'classic', 'node16', 'nodenext'.
89
-
90
- ../tsconfig/base.json(6,25): error TS6046: Argument for '--moduleResolution' option must be: 'node', 'classic', 'node16', 'nodenext'.
91
-
92
- ../tsconfig/base.json(6,25): error TS6046: Argument for '--moduleResolution' option must be: 'node', 'classic', 'node16', 'nodenext'.
93
-
94
- ../tsconfig/base.json(6,25): error TS6046: Argument for '--moduleResolution' option must be: 'node', 'classic', 'node16', 'nodenext'.
95
-
96
- DTS ⚡️ Build success in 8227ms
97
- DTS dist/index.d.ts 1.28 KB
98
- DTS dist/session/index.d.ts 737.00 B
99
- DTS dist/account.d.ts 1.64 KB
100
- DTS dist/constants.d.ts 215.00 B
101
- DTS dist/icon.d.ts 15.11 KB
102
- DTS dist/controller.d.ts 1.34 KB
103
- DTS dist/lookup.d.ts 216.00 B
104
- DTS dist/utils.d.ts 725.00 B
105
- DTS dist/session/account.d.ts 1.83 KB
106
- DTS dist/errors.d.ts 100.00 B
107
- DTS dist/session/provider.d.ts 1.10 KB
108
- DTS dist/telegram/backend.d.ts 1.28 KB
109
- DTS dist/session/backend.d.ts 2.29 KB
110
- DTS dist/telegram/provider.d.ts 975.00 B
111
- DTS dist/provider.d.ts 897.00 B
112
- DTS dist/iframe/base.d.ts 184.00 B
113
- DTS dist/iframe/keychain.d.ts 172.00 B
114
- DTS dist/iframe/profile.d.ts 198.00 B
115
- DTS dist/iframe/index.d.ts 252.00 B
116
- DTS dist/types.d.ts 603.00 B
117
- DTS dist/index.d-BbTUPBeO.d.ts 2.15 KB
118
- DTS dist/types-CVnDQVqD.d.ts 6.21 KB
60
+ DTS ⚡️ Build success in 9873ms
61
+ DTS dist/index.d.ts 1.31 KB
62
+ DTS dist/__tests__/parseChainId.test.d.ts 13.00 B
63
+ DTS dist/session/index.d.ts 762.00 B
64
+ DTS dist/account.d.ts 1.64 KB
65
+ DTS dist/constants.d.ts 215.00 B
66
+ DTS dist/icon.d.ts 15.11 KB
67
+ DTS dist/controller.d.ts 1.36 KB
68
+ DTS dist/lookup.d.ts 216.00 B
69
+ DTS dist/mutex.d.ts 378.00 B
70
+ DTS dist/utils.d.ts 867.00 B
71
+ DTS dist/session/account.d.ts 1.83 KB
72
+ DTS dist/errors.d.ts 100.00 B
73
+ DTS dist/session/provider.d.ts 1.30 KB
74
+ DTS dist/telegram/backend.d.ts 1.28 KB
75
+ DTS dist/session/backend.d.ts 2.29 KB
76
+ DTS dist/telegram/provider.d.ts 1.01 KB
77
+ DTS dist/policies.d.ts 680.00 B
78
+ DTS dist/provider.d.ts 987.00 B
79
+ DTS dist/iframe/base.d.ts 184.00 B
80
+ DTS dist/iframe/keychain.d.ts 172.00 B
81
+ DTS dist/iframe/profile.d.ts 198.00 B
82
+ DTS dist/iframe/index.d.ts 252.00 B
83
+ DTS dist/types.d.ts 603.00 B
84
+ DTS dist/index.d-BbTUPBeO.d.ts 2.15 KB
85
+ DTS dist/types-CVnDQVqD.d.ts 6.21 KB
@@ -1,122 +1,89 @@
1
1
 
2
- > @cartridge/controller@0.5.8 build /home/runner/work/controller/controller/packages/controller
2
+ > @cartridge/controller@0.6.0 build /home/runner/work/controller/controller/packages/controller
3
3
  > pnpm build:deps
4
4
 
5
5
 
6
- > @cartridge/controller@0.5.8 build:deps /home/runner/work/controller/controller/packages/controller
6
+ > @cartridge/controller@0.6.0 build:deps /home/runner/work/controller/controller/packages/controller
7
7
  > tsup --dts-resolve
8
8
 
9
- CLI Building entry: src/account.ts, src/constants.ts, src/controller.ts, src/errors.ts, src/icon.ts, src/index.ts, src/lookup.ts, src/provider.ts, src/types.ts, src/utils.ts, src/iframe/base.ts, src/iframe/index.ts, src/iframe/keychain.ts, src/iframe/profile.ts, src/telegram/backend.ts, src/telegram/provider.ts, src/session/account.ts, src/session/backend.ts, src/session/index.ts, src/session/provider.ts
9
+ CLI Building entry: src/account.ts, src/constants.ts, src/controller.ts, src/errors.ts, src/icon.ts, src/index.ts, src/lookup.ts, src/mutex.ts, src/policies.ts, src/provider.ts, src/types.ts, src/utils.ts, src/__tests__/parseChainId.test.ts, src/iframe/base.ts, src/iframe/index.ts, src/iframe/keychain.ts, src/iframe/profile.ts, src/session/account.ts, src/session/backend.ts, src/session/index.ts, src/session/provider.ts, src/telegram/backend.ts, src/telegram/provider.ts
10
10
  CLI Using tsconfig: tsconfig.json
11
- CLI tsup v8.3.0
11
+ CLI tsup v8.3.5
12
12
  CLI Using tsup config: /home/runner/work/controller/controller/packages/controller/package.json
13
- CLI Target: es2020
13
+ CLI Target: esnext
14
14
  CLI Cleaning output folder
15
15
  ESM Build start
16
- ESM dist/account.js 2.81 KB
17
- ESM dist/constants.js 247.00 B
18
- ESM dist/controller.js 36.30 KB
19
- ESM dist/errors.js 271.00 B
20
- ESM dist/icon.js 15.15 KB
21
- ESM dist/index.js 260.41 KB
22
- ESM dist/lookup.js 1.59 KB
23
- ESM dist/provider.js 20.52 KB
24
- ESM dist/types.js 437.00 B
25
- ESM dist/utils.js 2.77 KB
26
- ESM dist/iframe/base.js 3.64 KB
27
- ESM dist/iframe/index.js 5.16 KB
28
- ESM dist/iframe/keychain.js 4.12 KB
29
- ESM dist/iframe/profile.js 4.69 KB
30
- ESM dist/telegram/backend.js 1.27 KB
31
- ESM dist/telegram/provider.js 25.46 KB
32
- ESM dist/session/account.js 2.25 KB
33
- ESM dist/session/backend.js 1.18 KB
34
- ESM dist/session/index.js 26.51 KB
35
- ESM dist/session/provider.js 25.91 KB
36
- ESM dist/account.js.map 8.81 KB
37
- ESM dist/constants.js.map 315.00 B
38
- ESM dist/controller.js.map 60.04 KB
39
- ESM dist/errors.js.map 385.00 B
40
- ESM dist/icon.js.map 15.20 KB
41
- ESM dist/index.js.map 393.35 KB
42
- ESM dist/lookup.js.map 3.49 KB
43
- ESM dist/provider.js.map 25.41 KB
44
- ESM dist/types.js.map 4.75 KB
45
- ESM dist/utils.js.map 5.65 KB
46
- ESM dist/iframe/base.js.map 7.08 KB
47
- ESM dist/iframe/index.js.map 10.47 KB
48
- ESM dist/iframe/keychain.js.map 8.27 KB
49
- ESM dist/iframe/profile.js.map 9.47 KB
50
- ESM dist/telegram/backend.js.map 1.98 KB
51
- ESM dist/telegram/provider.js.map 37.76 KB
52
- ESM dist/session/backend.js.map 2.88 KB
53
- ESM dist/session/index.js.map 43.61 KB
54
- ESM dist/session/provider.js.map 38.61 KB
55
- ESM dist/session/account.js.map 11.19 KB
56
- ESM ⚡️ Build success in 172ms
16
+ ESM dist/account.js 2.88 KB
17
+ ESM dist/controller.js 37.77 KB
18
+ ESM dist/errors.js 271.00 B
19
+ ESM dist/constants.js 247.00 B
20
+ ESM dist/icon.js 15.15 KB
21
+ ESM dist/lookup.js 1.59 KB
22
+ ESM dist/mutex.js 502.00 B
23
+ ESM dist/policies.js 593.00 B
24
+ ESM dist/provider.js 21.57 KB
25
+ ESM dist/types.js 437.00 B
26
+ ESM dist/utils.js 3.60 KB
27
+ ESM dist/__tests__/parseChainId.test.js 2.92 KB
28
+ ESM dist/iframe/base.js 3.68 KB
29
+ ESM dist/iframe/index.js 5.20 KB
30
+ ESM dist/iframe/keychain.js 4.16 KB
31
+ ESM dist/iframe/profile.js 4.73 KB
32
+ ESM dist/session/account.js 2.32 KB
33
+ ESM dist/session/backend.js 1.18 KB
34
+ ESM dist/session/index.js 30.96 KB
35
+ ESM dist/session/provider.js 30.36 KB
36
+ ESM dist/telegram/backend.js 1.27 KB
37
+ ESM dist/telegram/provider.js 27.24 KB
38
+ ESM dist/index.js 261.94 KB
39
+ ESM dist/account.js.map 9.89 KB
40
+ ESM dist/controller.js.map 63.97 KB
41
+ ESM dist/errors.js.map 385.00 B
42
+ ESM dist/constants.js.map 315.00 B
43
+ ESM dist/icon.js.map 15.20 KB
44
+ ESM dist/lookup.js.map 3.49 KB
45
+ ESM dist/mutex.js.map 1.00 KB
46
+ ESM dist/policies.js.map 1.61 KB
47
+ ESM dist/provider.js.map 28.26 KB
48
+ ESM dist/types.js.map 4.75 KB
49
+ ESM dist/__tests__/parseChainId.test.js.map 8.60 KB
50
+ ESM dist/utils.js.map 7.28 KB
51
+ ESM dist/iframe/base.js.map 7.12 KB
52
+ ESM dist/iframe/index.js.map 10.50 KB
53
+ ESM dist/iframe/keychain.js.map 8.31 KB
54
+ ESM dist/iframe/profile.js.map 9.51 KB
55
+ ESM dist/session/account.js.map 12.28 KB
56
+ ESM dist/session/backend.js.map 2.88 KB
57
+ ESM dist/session/index.js.map 53.42 KB
58
+ ESM dist/session/provider.js.map 48.42 KB
59
+ ESM dist/telegram/backend.js.map 1.98 KB
60
+ ESM dist/telegram/provider.js.map 43.43 KB
61
+ ESM dist/index.js.map 397.32 KB
62
+ ESM ⚡️ Build success in 179ms
57
63
  DTS Build start
58
- ../tsconfig/base.json(6,25): error TS6046: Argument for '--moduleResolution' option must be: 'node', 'classic', 'node16', 'nodenext'.
59
-
60
- ../tsconfig/base.json(6,25): error TS6046: Argument for '--moduleResolution' option must be: 'node', 'classic', 'node16', 'nodenext'.
61
-
62
- ../tsconfig/base.json(6,25): error TS6046: Argument for '--moduleResolution' option must be: 'node', 'classic', 'node16', 'nodenext'.
63
-
64
- ../tsconfig/base.json(6,25): error TS6046: Argument for '--moduleResolution' option must be: 'node', 'classic', 'node16', 'nodenext'.
65
-
66
- ../tsconfig/base.json(6,25): error TS6046: Argument for '--moduleResolution' option must be: 'node', 'classic', 'node16', 'nodenext'.
67
-
68
- ../tsconfig/base.json(6,25): error TS6046: Argument for '--moduleResolution' option must be: 'node', 'classic', 'node16', 'nodenext'.
69
-
70
- ../tsconfig/base.json(6,25): error TS6046: Argument for '--moduleResolution' option must be: 'node', 'classic', 'node16', 'nodenext'.
71
-
72
- ../tsconfig/base.json(6,25): error TS6046: Argument for '--moduleResolution' option must be: 'node', 'classic', 'node16', 'nodenext'.
73
-
74
- ../tsconfig/base.json(6,25): error TS6046: Argument for '--moduleResolution' option must be: 'node', 'classic', 'node16', 'nodenext'.
75
-
76
- ../tsconfig/base.json(6,25): error TS6046: Argument for '--moduleResolution' option must be: 'node', 'classic', 'node16', 'nodenext'.
77
-
78
- ../tsconfig/base.json(6,25): error TS6046: Argument for '--moduleResolution' option must be: 'node', 'classic', 'node16', 'nodenext'.
79
-
80
- ../tsconfig/base.json(6,25): error TS6046: Argument for '--moduleResolution' option must be: 'node', 'classic', 'node16', 'nodenext'.
81
-
82
- ../tsconfig/base.json(6,25): error TS6046: Argument for '--moduleResolution' option must be: 'node', 'classic', 'node16', 'nodenext'.
83
-
84
- ../tsconfig/base.json(6,25): error TS6046: Argument for '--moduleResolution' option must be: 'node', 'classic', 'node16', 'nodenext'.
85
-
86
- ../tsconfig/base.json(6,25): error TS6046: Argument for '--moduleResolution' option must be: 'node', 'classic', 'node16', 'nodenext'.
87
-
88
- ../tsconfig/base.json(6,25): error TS6046: Argument for '--moduleResolution' option must be: 'node', 'classic', 'node16', 'nodenext'.
89
-
90
- ../tsconfig/base.json(6,25): error TS6046: Argument for '--moduleResolution' option must be: 'node', 'classic', 'node16', 'nodenext'.
91
-
92
- ../tsconfig/base.json(6,25): error TS6046: Argument for '--moduleResolution' option must be: 'node', 'classic', 'node16', 'nodenext'.
93
-
94
- ../tsconfig/base.json(6,25): error TS6046: Argument for '--moduleResolution' option must be: 'node', 'classic', 'node16', 'nodenext'.
95
-
96
- ../tsconfig/base.json(6,25): error TS6046: Argument for '--moduleResolution' option must be: 'node', 'classic', 'node16', 'nodenext'.
97
-
98
- ../tsconfig/base.json(6,25): error TS6046: Argument for '--moduleResolution' option must be: 'node', 'classic', 'node16', 'nodenext'.
99
-
100
- DTS ⚡️ Build success in 8188ms
101
- DTS dist/index.d.ts 1.28 KB
102
- DTS dist/session/index.d.ts 737.00 B
103
- DTS dist/account.d.ts 1.64 KB
104
- DTS dist/constants.d.ts 215.00 B
105
- DTS dist/icon.d.ts 15.11 KB
106
- DTS dist/controller.d.ts 1.34 KB
107
- DTS dist/lookup.d.ts 216.00 B
108
- DTS dist/utils.d.ts 725.00 B
109
- DTS dist/telegram/backend.d.ts 1.28 KB
110
- DTS dist/telegram/provider.d.ts 975.00 B
111
- DTS dist/session/account.d.ts 1.83 KB
112
- DTS dist/session/backend.d.ts 2.29 KB
113
- DTS dist/errors.d.ts 100.00 B
114
- DTS dist/session/provider.d.ts 1.10 KB
115
- DTS dist/provider.d.ts 897.00 B
116
- DTS dist/iframe/base.d.ts 184.00 B
117
- DTS dist/iframe/keychain.d.ts 172.00 B
118
- DTS dist/iframe/profile.d.ts 198.00 B
119
- DTS dist/iframe/index.d.ts 252.00 B
120
- DTS dist/types.d.ts 603.00 B
121
- DTS dist/index.d-BbTUPBeO.d.ts 2.15 KB
122
- DTS dist/types-CVnDQVqD.d.ts 6.21 KB
64
+ DTS ⚡️ Build success in 9600ms
65
+ DTS dist/index.d.ts 1.31 KB
66
+ DTS dist/__tests__/parseChainId.test.d.ts 13.00 B
67
+ DTS dist/session/index.d.ts 762.00 B
68
+ DTS dist/account.d.ts 1.64 KB
69
+ DTS dist/constants.d.ts 215.00 B
70
+ DTS dist/icon.d.ts 15.11 KB
71
+ DTS dist/controller.d.ts 1.36 KB
72
+ DTS dist/lookup.d.ts 216.00 B
73
+ DTS dist/mutex.d.ts 378.00 B
74
+ DTS dist/utils.d.ts 867.00 B
75
+ DTS dist/session/account.d.ts 1.83 KB
76
+ DTS dist/errors.d.ts 100.00 B
77
+ DTS dist/session/provider.d.ts 1.30 KB
78
+ DTS dist/telegram/backend.d.ts 1.28 KB
79
+ DTS dist/session/backend.d.ts 2.29 KB
80
+ DTS dist/telegram/provider.d.ts 1.01 KB
81
+ DTS dist/policies.d.ts 680.00 B
82
+ DTS dist/provider.d.ts 987.00 B
83
+ DTS dist/iframe/base.d.ts 184.00 B
84
+ DTS dist/iframe/keychain.d.ts 172.00 B
85
+ DTS dist/iframe/profile.d.ts 198.00 B
86
+ DTS dist/iframe/index.d.ts 252.00 B
87
+ DTS dist/types.d.ts 603.00 B
88
+ DTS dist/index.d-BbTUPBeO.d.ts 2.15 KB
89
+ DTS dist/types-CVnDQVqD.d.ts 6.21 KB
@@ -0,0 +1,2 @@
1
+
2
+ export { }
@@ -0,0 +1,89 @@
1
+ // src/__tests__/parseChainId.test.ts
2
+ import { constants as constants2, shortString as shortString2 } from "starknet";
3
+
4
+ // src/utils.ts
5
+ import {
6
+ addAddressPadding,
7
+ CallData,
8
+ constants,
9
+ getChecksumAddress,
10
+ hash,
11
+ shortString,
12
+ typedData,
13
+ TypedDataRevision
14
+ } from "starknet";
15
+ function parseChainId(url) {
16
+ const parts = url.pathname.split("/");
17
+ if (parts.includes("starknet")) {
18
+ if (parts.includes("mainnet")) {
19
+ return constants.StarknetChainId.SN_MAIN;
20
+ } else if (parts.includes("sepolia")) {
21
+ return constants.StarknetChainId.SN_SEPOLIA;
22
+ }
23
+ } else if (parts.length >= 3) {
24
+ const projectName = parts[2];
25
+ if (parts.includes("katana")) {
26
+ return shortString.encodeShortString(
27
+ `WP_${projectName.toUpperCase().replace(/-/g, "_")}`
28
+ );
29
+ } else if (parts.includes("mainnet")) {
30
+ return shortString.encodeShortString(
31
+ `GG_${projectName.toUpperCase().replace(/-/g, "_")}`
32
+ );
33
+ }
34
+ }
35
+ throw new Error(`Chain ${url.toString()} not supported`);
36
+ }
37
+
38
+ // src/__tests__/parseChainId.test.ts
39
+ describe("parseChainId", () => {
40
+ describe("Starknet chains", () => {
41
+ test("identifies mainnet", () => {
42
+ expect(
43
+ parseChainId(new URL("https://api.cartridge.gg/x/starknet/mainnet"))
44
+ ).toBe(constants2.StarknetChainId.SN_MAIN);
45
+ });
46
+ test("identifies sepolia", () => {
47
+ expect(
48
+ parseChainId(new URL("https://api.cartridge.gg/x/starknet/sepolia"))
49
+ ).toBe(constants2.StarknetChainId.SN_SEPOLIA);
50
+ });
51
+ });
52
+ describe("Project-specific chains", () => {
53
+ test("identifies slot chain", () => {
54
+ expect(
55
+ parseChainId(new URL("https://api.cartridge.gg/x/slot/katana"))
56
+ ).toBe(shortString2.encodeShortString("WP_SLOT"));
57
+ });
58
+ test("identifies slot chain on localhost", () => {
59
+ expect(parseChainId(new URL("http://localhost:8001/x/slot/katana"))).toBe(
60
+ shortString2.encodeShortString("WP_SLOT")
61
+ );
62
+ });
63
+ test("identifies slot chain with hyphenated name", () => {
64
+ expect(
65
+ parseChainId(
66
+ new URL("https://api.cartridge.gg/x/my-slot-chain/katana")
67
+ )
68
+ ).toBe(shortString2.encodeShortString("WP_MY_SLOT_CHAIN"));
69
+ });
70
+ test("identifies slot mainnet chain", () => {
71
+ expect(
72
+ parseChainId(new URL("https://api.cartridge.gg/x/slot/mainnet"))
73
+ ).toBe(shortString2.encodeShortString("GG_SLOT"));
74
+ });
75
+ });
76
+ describe("Error cases", () => {
77
+ test("throws error for unsupported URL format", () => {
78
+ expect(
79
+ () => parseChainId(new URL("https://api.example.com/unsupported"))
80
+ ).toThrow("Chain https://api.example.com/unsupported not supported");
81
+ });
82
+ test("throws error for URLs without proper chain identifiers", () => {
83
+ expect(
84
+ () => parseChainId(new URL("https://api.example.com/v1/starknet"))
85
+ ).toThrow("Chain https://api.example.com/v1/starknet not supported");
86
+ });
87
+ });
88
+ });
89
+ //# sourceMappingURL=parseChainId.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/__tests__/parseChainId.test.ts","../../src/utils.ts"],"sourcesContent":["import { constants, shortString } from \"starknet\";\nimport { parseChainId } from \"../utils\";\n\ndescribe(\"parseChainId\", () => {\n describe(\"Starknet chains\", () => {\n test(\"identifies mainnet\", () => {\n expect(\n parseChainId(new URL(\"https://api.cartridge.gg/x/starknet/mainnet\")),\n ).toBe(constants.StarknetChainId.SN_MAIN);\n });\n\n test(\"identifies sepolia\", () => {\n expect(\n parseChainId(new URL(\"https://api.cartridge.gg/x/starknet/sepolia\")),\n ).toBe(constants.StarknetChainId.SN_SEPOLIA);\n });\n });\n\n describe(\"Project-specific chains\", () => {\n test(\"identifies slot chain\", () => {\n expect(\n parseChainId(new URL(\"https://api.cartridge.gg/x/slot/katana\")),\n ).toBe(shortString.encodeShortString(\"WP_SLOT\"));\n });\n\n test(\"identifies slot chain on localhost\", () => {\n expect(parseChainId(new URL(\"http://localhost:8001/x/slot/katana\"))).toBe(\n shortString.encodeShortString(\"WP_SLOT\"),\n );\n });\n\n test(\"identifies slot chain with hyphenated name\", () => {\n expect(\n parseChainId(\n new URL(\"https://api.cartridge.gg/x/my-slot-chain/katana\"),\n ),\n ).toBe(shortString.encodeShortString(\"WP_MY_SLOT_CHAIN\"));\n });\n\n test(\"identifies slot mainnet chain\", () => {\n expect(\n parseChainId(new URL(\"https://api.cartridge.gg/x/slot/mainnet\")),\n ).toBe(shortString.encodeShortString(\"GG_SLOT\"));\n });\n });\n\n describe(\"Error cases\", () => {\n test(\"throws error for unsupported URL format\", () => {\n expect(() =>\n parseChainId(new URL(\"https://api.example.com/unsupported\")),\n ).toThrow(\"Chain https://api.example.com/unsupported not supported\");\n });\n\n test(\"throws error for URLs without proper chain identifiers\", () => {\n expect(() =>\n parseChainId(new URL(\"https://api.example.com/v1/starknet\")),\n ).toThrow(\"Chain https://api.example.com/v1/starknet not supported\");\n });\n });\n});\n","import {\n addAddressPadding,\n Call,\n CallData,\n constants,\n getChecksumAddress,\n hash,\n shortString,\n typedData,\n TypedDataRevision,\n} from \"starknet\";\nimport wasm from \"@cartridge/account-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): wasm.Policy[] {\n return [\n ...Object.entries(policies.contracts ?? {}).flatMap(\n ([target, { methods }]) =>\n toArray(methods).map((m) => ({\n target,\n method: 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 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"],"mappings":";AAAA,SAAS,aAAAA,YAAW,eAAAC,oBAAmB;;;ACAvC;AAAA,EACE;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAgIA,SAAS,aAAa,KAAmB;AAC9C,QAAM,QAAQ,IAAI,SAAS,MAAM,GAAG;AAEpC,MAAI,MAAM,SAAS,UAAU,GAAG;AAC9B,QAAI,MAAM,SAAS,SAAS,GAAG;AAC7B,aAAO,UAAU,gBAAgB;AAAA,IACnC,WAAW,MAAM,SAAS,SAAS,GAAG;AACpC,aAAO,UAAU,gBAAgB;AAAA,IACnC;AAAA,EACF,WAAW,MAAM,UAAU,GAAG;AAC5B,UAAM,cAAc,MAAM,CAAC;AAC3B,QAAI,MAAM,SAAS,QAAQ,GAAG;AAC5B,aAAO,YAAY;AAAA,QACjB,MAAM,YAAY,YAAY,EAAE,QAAQ,MAAM,GAAG,CAAC;AAAA,MACpD;AAAA,IACF,WAAW,MAAM,SAAS,SAAS,GAAG;AACpC,aAAO,YAAY;AAAA,QACjB,MAAM,YAAY,YAAY,EAAE,QAAQ,MAAM,GAAG,CAAC;AAAA,MACpD;AAAA,IACF;AAAA,EACF;AAEA,QAAM,IAAI,MAAM,SAAS,IAAI,SAAS,CAAC,gBAAgB;AACzD;;;AD9JA,SAAS,gBAAgB,MAAM;AAC7B,WAAS,mBAAmB,MAAM;AAChC,SAAK,sBAAsB,MAAM;AAC/B;AAAA,QACE,aAAa,IAAI,IAAI,6CAA6C,CAAC;AAAA,MACrE,EAAE,KAAKC,WAAU,gBAAgB,OAAO;AAAA,IAC1C,CAAC;AAED,SAAK,sBAAsB,MAAM;AAC/B;AAAA,QACE,aAAa,IAAI,IAAI,6CAA6C,CAAC;AAAA,MACrE,EAAE,KAAKA,WAAU,gBAAgB,UAAU;AAAA,IAC7C,CAAC;AAAA,EACH,CAAC;AAED,WAAS,2BAA2B,MAAM;AACxC,SAAK,yBAAyB,MAAM;AAClC;AAAA,QACE,aAAa,IAAI,IAAI,wCAAwC,CAAC;AAAA,MAChE,EAAE,KAAKC,aAAY,kBAAkB,SAAS,CAAC;AAAA,IACjD,CAAC;AAED,SAAK,sCAAsC,MAAM;AAC/C,aAAO,aAAa,IAAI,IAAI,qCAAqC,CAAC,CAAC,EAAE;AAAA,QACnEA,aAAY,kBAAkB,SAAS;AAAA,MACzC;AAAA,IACF,CAAC;AAED,SAAK,8CAA8C,MAAM;AACvD;AAAA,QACE;AAAA,UACE,IAAI,IAAI,iDAAiD;AAAA,QAC3D;AAAA,MACF,EAAE,KAAKA,aAAY,kBAAkB,kBAAkB,CAAC;AAAA,IAC1D,CAAC;AAED,SAAK,iCAAiC,MAAM;AAC1C;AAAA,QACE,aAAa,IAAI,IAAI,yCAAyC,CAAC;AAAA,MACjE,EAAE,KAAKA,aAAY,kBAAkB,SAAS,CAAC;AAAA,IACjD,CAAC;AAAA,EACH,CAAC;AAED,WAAS,eAAe,MAAM;AAC5B,SAAK,2CAA2C,MAAM;AACpD;AAAA,QAAO,MACL,aAAa,IAAI,IAAI,qCAAqC,CAAC;AAAA,MAC7D,EAAE,QAAQ,yDAAyD;AAAA,IACrE,CAAC;AAED,SAAK,0DAA0D,MAAM;AACnE;AAAA,QAAO,MACL,aAAa,IAAI,IAAI,qCAAqC,CAAC;AAAA,MAC7D,EAAE,QAAQ,yDAAyD;AAAA,IACrE,CAAC;AAAA,EACH,CAAC;AACH,CAAC;","names":["constants","shortString","constants","shortString"]}
package/dist/account.js CHANGED
@@ -7,8 +7,10 @@ import {
7
7
  import {
8
8
  addAddressPadding,
9
9
  CallData,
10
+ constants,
10
11
  getChecksumAddress,
11
12
  hash,
13
+ shortString,
12
14
  typedData,
13
15
  TypedDataRevision
14
16
  } from "starknet";
@@ -18,6 +20,10 @@ function toArray(val) {
18
20
 
19
21
  // src/account.ts
20
22
  var ControllerAccount = class extends WalletAccount {
23
+ address;
24
+ keychain;
25
+ modal;
26
+ options;
21
27
  constructor(provider, rpcUrl, address, keychain, options, modal) {
22
28
  super({ nodeUrl: rpcUrl }, provider);
23
29
  this.address = address;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/account.ts","../src/utils.ts"],"sourcesContent":["import {\n InvokeFunctionResponse,\n TypedData,\n WalletAccount,\n Call,\n AllowArray,\n} from \"starknet\";\n\nimport { SPEC } from \"@starknet-io/types-js\";\n\nimport {\n ConnectError,\n Keychain,\n KeychainOptions,\n Modal,\n ResponseCodes,\n} from \"./types\";\nimport { AsyncMethodReturns } from \"@cartridge/penpal\";\nimport BaseProvider from \"./provider\";\nimport { toArray } from \"./utils\";\n\nclass ControllerAccount extends WalletAccount {\n address: string;\n private keychain: AsyncMethodReturns<Keychain>;\n private modal: Modal;\n private options?: KeychainOptions;\n\n constructor(\n provider: BaseProvider,\n rpcUrl: string,\n address: string,\n keychain: AsyncMethodReturns<Keychain>,\n options: KeychainOptions,\n modal: Modal,\n ) {\n super({ nodeUrl: rpcUrl }, provider);\n\n this.address = address;\n this.keychain = keychain;\n this.options = options;\n this.modal = modal;\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 * @param abis (optional) the abi of the contract for better displaying\n *\n * @returns response from addTransaction\n */\n async execute(calls: AllowArray<Call>): Promise<InvokeFunctionResponse> {\n calls = toArray(calls);\n\n return new Promise(async (resolve, reject) => {\n const sessionExecute = await this.keychain.execute(\n calls,\n undefined,\n undefined,\n false,\n );\n\n // Session call succeeded\n if (sessionExecute.code === ResponseCodes.SUCCESS) {\n resolve(sessionExecute as InvokeFunctionResponse);\n return;\n }\n\n // Propagates session txn error back to caller\n if (this.options?.propagateSessionErrors) {\n reject((sessionExecute as ConnectError).error);\n return;\n }\n\n // Session call or Paymaster flow failed.\n // Session not avaialble, manual flow fallback\n this.modal.open();\n const manualExecute = await this.keychain.execute(\n calls,\n undefined,\n undefined,\n true,\n (sessionExecute as ConnectError).error,\n );\n\n // Manual call succeeded\n if (manualExecute.code === ResponseCodes.SUCCESS) {\n resolve(manualExecute as InvokeFunctionResponse);\n this.modal.close();\n return;\n }\n\n reject((manualExecute as ConnectError).error);\n return;\n });\n }\n\n /**\n * Sign an JSON object for off-chain usage with the starknet private key and return the signature\n * This adds a message prefix so it cant be interchanged with transactions\n *\n * @param json - JSON object to be signed\n * @returns the signature of the JSON object\n * @throws {Error} if the JSON object is not a valid JSON\n */\n async signMessage(typedData: TypedData): Promise<SPEC.SIGNATURE> {\n return new Promise(async (resolve, reject) => {\n const sessionSign = await this.keychain.signMessage(typedData, \"\", true);\n\n // Session sign succeeded\n if (!(\"code\" in sessionSign)) {\n resolve(sessionSign as SPEC.SIGNATURE);\n return;\n }\n\n // Session not avaialble, manual flow fallback\n this.modal.open();\n const manualSign = await this.keychain.signMessage(typedData, \"\", false);\n\n if (!(\"code\" in manualSign)) {\n resolve(manualSign as SPEC.SIGNATURE);\n } else {\n reject((manualSign as ConnectError).error);\n }\n this.modal.close();\n });\n }\n}\n\nexport default ControllerAccount;\n","import {\n addAddressPadding,\n Call,\n CallData,\n getChecksumAddress,\n hash,\n typedData,\n TypedDataRevision,\n} from \"starknet\";\nimport wasm from \"@cartridge/account-wasm/controller\";\nimport { Policies, SessionPolicies } from \"@cartridge/presets\";\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: SessionPolicies): wasm.Policy[] {\n return [\n ...Object.entries(policies.contracts ?? {}).flatMap(\n ([target, { methods }]) =>\n toArray(methods).map((m) => ({\n target,\n method: m.entrypoint,\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 };\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"],"mappings":";AAAA;AAAA,EAGE;AAAA,OAGK;;;ACNP;AAAA,EACE;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AA4GA,SAAS,QAAW,KAAmB;AAC5C,SAAO,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,GAAG;AACxC;;;ADjGA,IAAM,oBAAN,cAAgC,cAAc;AAAA,EAM5C,YACE,UACA,QACA,SACA,UACA,SACA,OACA;AACA,UAAM,EAAE,SAAS,OAAO,GAAG,QAAQ;AAEnC,SAAK,UAAU;AACf,SAAK,WAAW;AAChB,SAAK,UAAU;AACf,SAAK,QAAQ;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,QAAQ,OAA0D;AACtE,YAAQ,QAAQ,KAAK;AAErB,WAAO,IAAI,QAAQ,OAAO,SAAS,WAAW;AAC5C,YAAM,iBAAiB,MAAM,KAAK,SAAS;AAAA,QACzC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAGA,UAAI,eAAe,kCAAgC;AACjD,gBAAQ,cAAwC;AAChD;AAAA,MACF;AAGA,UAAI,KAAK,SAAS,wBAAwB;AACxC,eAAQ,eAAgC,KAAK;AAC7C;AAAA,MACF;AAIA,WAAK,MAAM,KAAK;AAChB,YAAM,gBAAgB,MAAM,KAAK,SAAS;AAAA,QACxC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACC,eAAgC;AAAA,MACnC;AAGA,UAAI,cAAc,kCAAgC;AAChD,gBAAQ,aAAuC;AAC/C,aAAK,MAAM,MAAM;AACjB;AAAA,MACF;AAEA,aAAQ,cAA+B,KAAK;AAC5C;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,YAAYA,YAA+C;AAC/D,WAAO,IAAI,QAAQ,OAAO,SAAS,WAAW;AAC5C,YAAM,cAAc,MAAM,KAAK,SAAS,YAAYA,YAAW,IAAI,IAAI;AAGvE,UAAI,EAAE,UAAU,cAAc;AAC5B,gBAAQ,WAA6B;AACrC;AAAA,MACF;AAGA,WAAK,MAAM,KAAK;AAChB,YAAM,aAAa,MAAM,KAAK,SAAS,YAAYA,YAAW,IAAI,KAAK;AAEvE,UAAI,EAAE,UAAU,aAAa;AAC3B,gBAAQ,UAA4B;AAAA,MACtC,OAAO;AACL,eAAQ,WAA4B,KAAK;AAAA,MAC3C;AACA,WAAK,MAAM,MAAM;AAAA,IACnB,CAAC;AAAA,EACH;AACF;AAEA,IAAO,kBAAQ;","names":["typedData"]}
1
+ {"version":3,"sources":["../src/account.ts","../src/utils.ts"],"sourcesContent":["import {\n InvokeFunctionResponse,\n TypedData,\n WalletAccount,\n Call,\n AllowArray,\n} from \"starknet\";\n\nimport { SPEC } from \"@starknet-io/types-js\";\n\nimport {\n ConnectError,\n Keychain,\n KeychainOptions,\n Modal,\n ResponseCodes,\n} from \"./types\";\nimport { AsyncMethodReturns } from \"@cartridge/penpal\";\nimport BaseProvider from \"./provider\";\nimport { toArray } from \"./utils\";\n\nclass ControllerAccount extends WalletAccount {\n address: string;\n private keychain: AsyncMethodReturns<Keychain>;\n private modal: Modal;\n private options?: KeychainOptions;\n\n constructor(\n provider: BaseProvider,\n rpcUrl: string,\n address: string,\n keychain: AsyncMethodReturns<Keychain>,\n options: KeychainOptions,\n modal: Modal,\n ) {\n super({ nodeUrl: rpcUrl }, provider);\n\n this.address = address;\n this.keychain = keychain;\n this.options = options;\n this.modal = modal;\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 * @param abis (optional) the abi of the contract for better displaying\n *\n * @returns response from addTransaction\n */\n async execute(calls: AllowArray<Call>): Promise<InvokeFunctionResponse> {\n calls = toArray(calls);\n\n return new Promise(async (resolve, reject) => {\n const sessionExecute = await this.keychain.execute(\n calls,\n undefined,\n undefined,\n false,\n );\n\n // Session call succeeded\n if (sessionExecute.code === ResponseCodes.SUCCESS) {\n resolve(sessionExecute as InvokeFunctionResponse);\n return;\n }\n\n // Propagates session txn error back to caller\n if (this.options?.propagateSessionErrors) {\n reject((sessionExecute as ConnectError).error);\n return;\n }\n\n // Session call or Paymaster flow failed.\n // Session not avaialble, manual flow fallback\n this.modal.open();\n const manualExecute = await this.keychain.execute(\n calls,\n undefined,\n undefined,\n true,\n (sessionExecute as ConnectError).error,\n );\n\n // Manual call succeeded\n if (manualExecute.code === ResponseCodes.SUCCESS) {\n resolve(manualExecute as InvokeFunctionResponse);\n this.modal.close();\n return;\n }\n\n reject((manualExecute as ConnectError).error);\n return;\n });\n }\n\n /**\n * Sign an JSON object for off-chain usage with the starknet private key and return the signature\n * This adds a message prefix so it cant be interchanged with transactions\n *\n * @param json - JSON object to be signed\n * @returns the signature of the JSON object\n * @throws {Error} if the JSON object is not a valid JSON\n */\n async signMessage(typedData: TypedData): Promise<SPEC.SIGNATURE> {\n return new Promise(async (resolve, reject) => {\n const sessionSign = await this.keychain.signMessage(typedData, \"\", true);\n\n // Session sign succeeded\n if (!(\"code\" in sessionSign)) {\n resolve(sessionSign as SPEC.SIGNATURE);\n return;\n }\n\n // Session not avaialble, manual flow fallback\n this.modal.open();\n const manualSign = await this.keychain.signMessage(typedData, \"\", false);\n\n if (!(\"code\" in manualSign)) {\n resolve(manualSign as SPEC.SIGNATURE);\n } else {\n reject((manualSign as ConnectError).error);\n }\n this.modal.close();\n });\n }\n}\n\nexport default ControllerAccount;\n","import {\n addAddressPadding,\n Call,\n CallData,\n constants,\n getChecksumAddress,\n hash,\n shortString,\n typedData,\n TypedDataRevision,\n} from \"starknet\";\nimport wasm from \"@cartridge/account-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): wasm.Policy[] {\n return [\n ...Object.entries(policies.contracts ?? {}).flatMap(\n ([target, { methods }]) =>\n toArray(methods).map((m) => ({\n target,\n method: 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 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"],"mappings":";AAAA;AAAA,EAGE;AAAA,OAGK;;;ACNP;AAAA,EACE;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAgHA,SAAS,QAAW,KAAmB;AAC5C,SAAO,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,GAAG;AACxC;;;ADvGA,IAAM,oBAAN,cAAgC,cAAc;AAAA,EAC5C;AAAA,EACQ;AAAA,EACA;AAAA,EACA;AAAA,EAER,YACE,UACA,QACA,SACA,UACA,SACA,OACA;AACA,UAAM,EAAE,SAAS,OAAO,GAAG,QAAQ;AAEnC,SAAK,UAAU;AACf,SAAK,WAAW;AAChB,SAAK,UAAU;AACf,SAAK,QAAQ;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,QAAQ,OAA0D;AACtE,YAAQ,QAAQ,KAAK;AAErB,WAAO,IAAI,QAAQ,OAAO,SAAS,WAAW;AAC5C,YAAM,iBAAiB,MAAM,KAAK,SAAS;AAAA,QACzC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAGA,UAAI,eAAe,kCAAgC;AACjD,gBAAQ,cAAwC;AAChD;AAAA,MACF;AAGA,UAAI,KAAK,SAAS,wBAAwB;AACxC,eAAQ,eAAgC,KAAK;AAC7C;AAAA,MACF;AAIA,WAAK,MAAM,KAAK;AAChB,YAAM,gBAAgB,MAAM,KAAK,SAAS;AAAA,QACxC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACC,eAAgC;AAAA,MACnC;AAGA,UAAI,cAAc,kCAAgC;AAChD,gBAAQ,aAAuC;AAC/C,aAAK,MAAM,MAAM;AACjB;AAAA,MACF;AAEA,aAAQ,cAA+B,KAAK;AAC5C;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,YAAYA,YAA+C;AAC/D,WAAO,IAAI,QAAQ,OAAO,SAAS,WAAW;AAC5C,YAAM,cAAc,MAAM,KAAK,SAAS,YAAYA,YAAW,IAAI,IAAI;AAGvE,UAAI,EAAE,UAAU,cAAc;AAC5B,gBAAQ,WAA6B;AACrC;AAAA,MACF;AAGA,WAAK,MAAM,KAAK;AAChB,YAAM,aAAa,MAAM,KAAK,SAAS,YAAYA,YAAW,IAAI,KAAK;AAEvE,UAAI,EAAE,UAAU,aAAa;AAC3B,gBAAQ,UAA4B;AAAA,MACtC,OAAO;AACL,eAAQ,WAA4B,KAAK;AAAA,MAC3C;AACA,WAAK,MAAM,MAAM;AAAA,IACnB,CAAC;AAAA,EACH;AACF;AAEA,IAAO,kBAAQ;","names":["typedData"]}