@cartridge/controller 0.5.8 → 0.5.9
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.
- package/.turbo/turbo-build$colon$deps.log +72 -67
- package/.turbo/turbo-build.log +73 -68
- package/dist/__tests__/parseChainId.test.d.ts +2 -0
- package/dist/__tests__/parseChainId.test.js +89 -0
- package/dist/__tests__/parseChainId.test.js.map +1 -0
- package/dist/account.js +2 -0
- package/dist/account.js.map +1 -1
- package/dist/controller.d.ts +1 -1
- package/dist/controller.js +42 -28
- package/dist/controller.js.map +1 -1
- package/dist/index.js +42 -28
- package/dist/index.js.map +1 -1
- package/dist/provider.js +5 -1
- package/dist/provider.js.map +1 -1
- package/dist/session/account.js +2 -0
- package/dist/session/account.js.map +1 -1
- package/dist/session/index.js +7 -1
- package/dist/session/index.js.map +1 -1
- package/dist/session/provider.js +7 -1
- package/dist/session/provider.js.map +1 -1
- package/dist/telegram/provider.js +7 -1
- package/dist/telegram/provider.js.map +1 -1
- package/dist/utils.d.ts +3 -2
- package/dist/utils.js +25 -0
- package/dist/utils.js.map +1 -1
- package/jest.config.ts +13 -0
- package/package.json +7 -3
- package/src/__tests__/parseChainId.test.ts +60 -0
- package/src/controller.ts +24 -29
- package/src/utils.ts +28 -0
|
@@ -1,55 +1,57 @@
|
|
|
1
1
|
|
|
2
|
-
> @cartridge/controller@0.5.
|
|
2
|
+
> @cartridge/controller@0.5.9 build:deps /home/runner/work/controller/controller/packages/controller
|
|
3
3
|
> tsup --dts-resolve
|
|
4
4
|
|
|
5
|
-
[34mCLI[39m 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
|
+
[34mCLI[39m 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/__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
|
[34mCLI[39m Using tsconfig: tsconfig.json
|
|
7
|
-
[34mCLI[39m tsup v8.3.
|
|
7
|
+
[34mCLI[39m tsup v8.3.5
|
|
8
8
|
[34mCLI[39m Using tsup config: /home/runner/work/controller/controller/packages/controller/package.json
|
|
9
9
|
[34mCLI[39m Target: es2020
|
|
10
10
|
[34mCLI[39m Cleaning output folder
|
|
11
11
|
[34mESM[39m Build start
|
|
12
|
-
[32mESM[39m [1mdist/account.js
|
|
13
|
-
[32mESM[39m [1mdist/
|
|
14
|
-
[32mESM[39m [1mdist/
|
|
15
|
-
[32mESM[39m [1mdist/
|
|
16
|
-
[32mESM[39m [1mdist/
|
|
17
|
-
[32mESM[39m [1mdist/
|
|
18
|
-
[32mESM[39m [1mdist/
|
|
19
|
-
[32mESM[39m [1mdist/
|
|
20
|
-
[32mESM[39m [1mdist/
|
|
21
|
-
[32mESM[39m [1mdist/
|
|
22
|
-
[32mESM[39m [1mdist/
|
|
23
|
-
[32mESM[39m [1mdist/
|
|
24
|
-
[32mESM[39m [1mdist/types.js
|
|
25
|
-
[32mESM[39m [1mdist/
|
|
26
|
-
[32mESM[39m [1mdist/iframe/
|
|
27
|
-
[32mESM[39m [1mdist/iframe/
|
|
28
|
-
[32mESM[39m [1mdist/
|
|
29
|
-
[32mESM[39m [1mdist/session/
|
|
30
|
-
[32mESM[39m [1mdist/session/
|
|
31
|
-
[32mESM[39m [1mdist/
|
|
32
|
-
[32mESM[39m [1mdist/
|
|
33
|
-
[32mESM[39m [1mdist/
|
|
34
|
-
[32mESM[39m [1mdist/
|
|
35
|
-
[32mESM[39m [1mdist/
|
|
36
|
-
[32mESM[39m [1mdist/
|
|
37
|
-
[32mESM[39m [1mdist/
|
|
38
|
-
[32mESM[39m [1mdist/
|
|
39
|
-
[32mESM[39m [1mdist/
|
|
40
|
-
[32mESM[39m [1mdist/
|
|
41
|
-
[32mESM[39m [1mdist/
|
|
42
|
-
[32mESM[39m [1mdist/
|
|
43
|
-
[32mESM[39m [1mdist/
|
|
44
|
-
[32mESM[39m [1mdist/
|
|
45
|
-
[32mESM[39m [1mdist/
|
|
46
|
-
[32mESM[39m [1mdist/
|
|
47
|
-
[32mESM[39m [1mdist/iframe/
|
|
48
|
-
[32mESM[39m [1mdist/
|
|
49
|
-
[32mESM[39m [1mdist/
|
|
50
|
-
[32mESM[39m [1mdist/
|
|
51
|
-
[32mESM[39m [1mdist/
|
|
52
|
-
[32mESM[39m
|
|
12
|
+
[32mESM[39m [1mdist/account.js [22m[32m2.83 KB[39m
|
|
13
|
+
[32mESM[39m [1mdist/__tests__/parseChainId.test.js [22m[32m2.92 KB[39m
|
|
14
|
+
[32mESM[39m [1mdist/iframe/base.js [22m[32m3.64 KB[39m
|
|
15
|
+
[32mESM[39m [1mdist/session/account.js [22m[32m2.28 KB[39m
|
|
16
|
+
[32mESM[39m [1mdist/telegram/backend.js [22m[32m1.27 KB[39m
|
|
17
|
+
[32mESM[39m [1mdist/constants.js [22m[32m247.00 B[39m
|
|
18
|
+
[32mESM[39m [1mdist/controller.js [22m[32m36.66 KB[39m
|
|
19
|
+
[32mESM[39m [1mdist/errors.js [22m[32m271.00 B[39m
|
|
20
|
+
[32mESM[39m [1mdist/icon.js [22m[32m15.15 KB[39m
|
|
21
|
+
[32mESM[39m [1mdist/index.js [22m[32m260.76 KB[39m
|
|
22
|
+
[32mESM[39m [1mdist/lookup.js [22m[32m1.59 KB[39m
|
|
23
|
+
[32mESM[39m [1mdist/provider.js [22m[32m20.61 KB[39m
|
|
24
|
+
[32mESM[39m [1mdist/types.js [22m[32m437.00 B[39m
|
|
25
|
+
[32mESM[39m [1mdist/utils.js [22m[32m3.53 KB[39m
|
|
26
|
+
[32mESM[39m [1mdist/iframe/index.js [22m[32m5.16 KB[39m
|
|
27
|
+
[32mESM[39m [1mdist/iframe/keychain.js [22m[32m4.12 KB[39m
|
|
28
|
+
[32mESM[39m [1mdist/iframe/profile.js [22m[32m4.69 KB[39m
|
|
29
|
+
[32mESM[39m [1mdist/session/backend.js [22m[32m1.18 KB[39m
|
|
30
|
+
[32mESM[39m [1mdist/session/index.js [22m[32m26.63 KB[39m
|
|
31
|
+
[32mESM[39m [1mdist/session/provider.js [22m[32m26.03 KB[39m
|
|
32
|
+
[32mESM[39m [1mdist/telegram/provider.js [22m[32m25.58 KB[39m
|
|
33
|
+
[32mESM[39m [1mdist/account.js.map [22m[32m9.72 KB[39m
|
|
34
|
+
[32mESM[39m [1mdist/__tests__/parseChainId.test.js.map [22m[32m8.47 KB[39m
|
|
35
|
+
[32mESM[39m [1mdist/iframe/base.js.map [22m[32m7.08 KB[39m
|
|
36
|
+
[32mESM[39m [1mdist/session/account.js.map [22m[32m12.10 KB[39m
|
|
37
|
+
[32mESM[39m [1mdist/telegram/backend.js.map [22m[32m1.98 KB[39m
|
|
38
|
+
[32mESM[39m [1mdist/constants.js.map [22m[32m315.00 B[39m
|
|
39
|
+
[32mESM[39m [1mdist/controller.js.map [22m[32m61.03 KB[39m
|
|
40
|
+
[32mESM[39m [1mdist/icon.js.map [22m[32m15.20 KB[39m
|
|
41
|
+
[32mESM[39m [1mdist/errors.js.map [22m[32m385.00 B[39m
|
|
42
|
+
[32mESM[39m [1mdist/index.js.map [22m[32m394.34 KB[39m
|
|
43
|
+
[32mESM[39m [1mdist/lookup.js.map [22m[32m3.49 KB[39m
|
|
44
|
+
[32mESM[39m [1mdist/provider.js.map [22m[32m25.59 KB[39m
|
|
45
|
+
[32mESM[39m [1mdist/utils.js.map [22m[32m7.10 KB[39m
|
|
46
|
+
[32mESM[39m [1mdist/types.js.map [22m[32m4.75 KB[39m
|
|
47
|
+
[32mESM[39m [1mdist/iframe/index.js.map [22m[32m10.47 KB[39m
|
|
48
|
+
[32mESM[39m [1mdist/iframe/keychain.js.map [22m[32m8.27 KB[39m
|
|
49
|
+
[32mESM[39m [1mdist/iframe/profile.js.map [22m[32m9.47 KB[39m
|
|
50
|
+
[32mESM[39m [1mdist/session/backend.js.map [22m[32m2.88 KB[39m
|
|
51
|
+
[32mESM[39m [1mdist/session/index.js.map [22m[32m44.69 KB[39m
|
|
52
|
+
[32mESM[39m [1mdist/telegram/provider.js.map [22m[32m38.84 KB[39m
|
|
53
|
+
[32mESM[39m [1mdist/session/provider.js.map [22m[32m39.69 KB[39m
|
|
54
|
+
[32mESM[39m ⚡️ Build success in 118ms
|
|
53
55
|
[34mDTS[39m Build start
|
|
54
56
|
../tsconfig/base.json(6,25): error TS6046: Argument for '--moduleResolution' option must be: 'node', 'classic', 'node16', 'nodenext'.
|
|
55
57
|
|
|
@@ -93,26 +95,29 @@
|
|
|
93
95
|
|
|
94
96
|
../tsconfig/base.json(6,25): error TS6046: Argument for '--moduleResolution' option must be: 'node', 'classic', 'node16', 'nodenext'.
|
|
95
97
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
[32mDTS[39m
|
|
99
|
-
[32mDTS[39m [1mdist/
|
|
100
|
-
[32mDTS[39m [1mdist/
|
|
101
|
-
[32mDTS[39m [1mdist/
|
|
102
|
-
[32mDTS[39m [1mdist/
|
|
103
|
-
[32mDTS[39m [1mdist/
|
|
104
|
-
[32mDTS[39m [1mdist/
|
|
105
|
-
[32mDTS[39m [1mdist/
|
|
106
|
-
[32mDTS[39m [1mdist/
|
|
107
|
-
[32mDTS[39m [1mdist/
|
|
108
|
-
[32mDTS[39m [1mdist/
|
|
109
|
-
[32mDTS[39m [1mdist/
|
|
110
|
-
[32mDTS[39m [1mdist/
|
|
111
|
-
[32mDTS[39m [1mdist/
|
|
112
|
-
[32mDTS[39m [1mdist/
|
|
113
|
-
[32mDTS[39m [1mdist/
|
|
114
|
-
[32mDTS[39m [1mdist/
|
|
115
|
-
[32mDTS[39m [1mdist/iframe/
|
|
116
|
-
[32mDTS[39m [1mdist/
|
|
117
|
-
[32mDTS[39m [1mdist/
|
|
118
|
-
[32mDTS[39m [1mdist/
|
|
98
|
+
../tsconfig/base.json(6,25): error TS6046: Argument for '--moduleResolution' option must be: 'node', 'classic', 'node16', 'nodenext'.
|
|
99
|
+
|
|
100
|
+
[32mDTS[39m ⚡️ Build success in 9903ms
|
|
101
|
+
[32mDTS[39m [1mdist/index.d.ts [22m[32m1.28 KB[39m
|
|
102
|
+
[32mDTS[39m [1mdist/__tests__/parseChainId.test.d.ts [22m[32m13.00 B[39m
|
|
103
|
+
[32mDTS[39m [1mdist/session/index.d.ts [22m[32m737.00 B[39m
|
|
104
|
+
[32mDTS[39m [1mdist/account.d.ts [22m[32m1.64 KB[39m
|
|
105
|
+
[32mDTS[39m [1mdist/constants.d.ts [22m[32m215.00 B[39m
|
|
106
|
+
[32mDTS[39m [1mdist/icon.d.ts [22m[32m15.11 KB[39m
|
|
107
|
+
[32mDTS[39m [1mdist/controller.d.ts [22m[32m1.36 KB[39m
|
|
108
|
+
[32mDTS[39m [1mdist/lookup.d.ts [22m[32m216.00 B[39m
|
|
109
|
+
[32mDTS[39m [1mdist/utils.d.ts [22m[32m806.00 B[39m
|
|
110
|
+
[32mDTS[39m [1mdist/session/account.d.ts [22m[32m1.83 KB[39m
|
|
111
|
+
[32mDTS[39m [1mdist/errors.d.ts [22m[32m100.00 B[39m
|
|
112
|
+
[32mDTS[39m [1mdist/session/provider.d.ts [22m[32m1.10 KB[39m
|
|
113
|
+
[32mDTS[39m [1mdist/telegram/backend.d.ts [22m[32m1.28 KB[39m
|
|
114
|
+
[32mDTS[39m [1mdist/session/backend.d.ts [22m[32m2.29 KB[39m
|
|
115
|
+
[32mDTS[39m [1mdist/telegram/provider.d.ts [22m[32m975.00 B[39m
|
|
116
|
+
[32mDTS[39m [1mdist/provider.d.ts [22m[32m897.00 B[39m
|
|
117
|
+
[32mDTS[39m [1mdist/iframe/base.d.ts [22m[32m184.00 B[39m
|
|
118
|
+
[32mDTS[39m [1mdist/iframe/keychain.d.ts [22m[32m172.00 B[39m
|
|
119
|
+
[32mDTS[39m [1mdist/iframe/profile.d.ts [22m[32m198.00 B[39m
|
|
120
|
+
[32mDTS[39m [1mdist/iframe/index.d.ts [22m[32m252.00 B[39m
|
|
121
|
+
[32mDTS[39m [1mdist/types.d.ts [22m[32m603.00 B[39m
|
|
122
|
+
[32mDTS[39m [1mdist/index.d-BbTUPBeO.d.ts [22m[32m2.15 KB[39m
|
|
123
|
+
[32mDTS[39m [1mdist/types-CVnDQVqD.d.ts [22m[32m6.21 KB[39m
|
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,59 +1,61 @@
|
|
|
1
1
|
|
|
2
|
-
> @cartridge/controller@0.5.
|
|
2
|
+
> @cartridge/controller@0.5.9 build /home/runner/work/controller/controller/packages/controller
|
|
3
3
|
> pnpm build:deps
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
> @cartridge/controller@0.5.
|
|
6
|
+
> @cartridge/controller@0.5.9 build:deps /home/runner/work/controller/controller/packages/controller
|
|
7
7
|
> tsup --dts-resolve
|
|
8
8
|
|
|
9
|
-
[34mCLI[39m 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/
|
|
9
|
+
[34mCLI[39m 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/__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
|
[34mCLI[39m Using tsconfig: tsconfig.json
|
|
11
|
-
[34mCLI[39m tsup v8.3.
|
|
11
|
+
[34mCLI[39m tsup v8.3.5
|
|
12
12
|
[34mCLI[39m Using tsup config: /home/runner/work/controller/controller/packages/controller/package.json
|
|
13
13
|
[34mCLI[39m Target: es2020
|
|
14
14
|
[34mCLI[39m Cleaning output folder
|
|
15
15
|
[34mESM[39m Build start
|
|
16
|
-
[32mESM[39m [1mdist/account.js
|
|
17
|
-
[32mESM[39m [1mdist/constants.js
|
|
18
|
-
[32mESM[39m [1mdist/controller.js
|
|
19
|
-
[32mESM[39m [1mdist/errors.js
|
|
20
|
-
[32mESM[39m [1mdist/icon.js
|
|
21
|
-
[32mESM[39m [1mdist/index.js
|
|
22
|
-
[32mESM[39m [1mdist/lookup.js
|
|
23
|
-
[32mESM[39m [1mdist/provider.js
|
|
24
|
-
[32mESM[39m [1mdist/types.js
|
|
25
|
-
[32mESM[39m [1mdist/utils.js
|
|
26
|
-
[32mESM[39m [1mdist/
|
|
27
|
-
[32mESM[39m [1mdist/iframe/index.js
|
|
28
|
-
[32mESM[39m [1mdist/iframe/
|
|
29
|
-
[32mESM[39m [1mdist/iframe/
|
|
30
|
-
[32mESM[39m [1mdist/
|
|
31
|
-
[32mESM[39m [1mdist/
|
|
32
|
-
[32mESM[39m [1mdist/session/
|
|
33
|
-
[32mESM[39m [1mdist/session/
|
|
34
|
-
[32mESM[39m [1mdist/session/index.js
|
|
35
|
-
[32mESM[39m [1mdist/
|
|
36
|
-
[32mESM[39m [1mdist/
|
|
37
|
-
[32mESM[39m [1mdist/
|
|
38
|
-
[32mESM[39m [1mdist/
|
|
39
|
-
[32mESM[39m [1mdist/
|
|
40
|
-
[32mESM[39m [1mdist/
|
|
41
|
-
[32mESM[39m [1mdist/
|
|
42
|
-
[32mESM[39m [1mdist/
|
|
43
|
-
[32mESM[39m [1mdist/
|
|
44
|
-
[32mESM[39m [1mdist/
|
|
45
|
-
[32mESM[39m [1mdist/
|
|
46
|
-
[32mESM[39m [1mdist/
|
|
47
|
-
[32mESM[39m [1mdist/
|
|
48
|
-
[32mESM[39m [1mdist/iframe/
|
|
49
|
-
[32mESM[39m [1mdist/iframe/
|
|
50
|
-
[32mESM[39m [1mdist/
|
|
51
|
-
[32mESM[39m [1mdist/
|
|
52
|
-
[32mESM[39m [1mdist/
|
|
53
|
-
[32mESM[39m [1mdist/session/
|
|
54
|
-
[32mESM[39m [1mdist/session/provider.js.map
|
|
55
|
-
[32mESM[39m [1mdist/session/
|
|
56
|
-
[32mESM[39m
|
|
16
|
+
[32mESM[39m [1mdist/account.js [22m[32m2.83 KB[39m
|
|
17
|
+
[32mESM[39m [1mdist/constants.js [22m[32m247.00 B[39m
|
|
18
|
+
[32mESM[39m [1mdist/controller.js [22m[32m36.66 KB[39m
|
|
19
|
+
[32mESM[39m [1mdist/errors.js [22m[32m271.00 B[39m
|
|
20
|
+
[32mESM[39m [1mdist/icon.js [22m[32m15.15 KB[39m
|
|
21
|
+
[32mESM[39m [1mdist/index.js [22m[32m260.76 KB[39m
|
|
22
|
+
[32mESM[39m [1mdist/lookup.js [22m[32m1.59 KB[39m
|
|
23
|
+
[32mESM[39m [1mdist/provider.js [22m[32m20.61 KB[39m
|
|
24
|
+
[32mESM[39m [1mdist/types.js [22m[32m437.00 B[39m
|
|
25
|
+
[32mESM[39m [1mdist/utils.js [22m[32m3.53 KB[39m
|
|
26
|
+
[32mESM[39m [1mdist/__tests__/parseChainId.test.js [22m[32m2.92 KB[39m
|
|
27
|
+
[32mESM[39m [1mdist/iframe/index.js [22m[32m5.16 KB[39m
|
|
28
|
+
[32mESM[39m [1mdist/iframe/base.js [22m[32m3.64 KB[39m
|
|
29
|
+
[32mESM[39m [1mdist/iframe/keychain.js [22m[32m4.12 KB[39m
|
|
30
|
+
[32mESM[39m [1mdist/session/account.js [22m[32m2.28 KB[39m
|
|
31
|
+
[32mESM[39m [1mdist/iframe/profile.js [22m[32m4.69 KB[39m
|
|
32
|
+
[32mESM[39m [1mdist/session/backend.js [22m[32m1.18 KB[39m
|
|
33
|
+
[32mESM[39m [1mdist/session/provider.js [22m[32m26.03 KB[39m
|
|
34
|
+
[32mESM[39m [1mdist/session/index.js [22m[32m26.63 KB[39m
|
|
35
|
+
[32mESM[39m [1mdist/telegram/provider.js [22m[32m25.58 KB[39m
|
|
36
|
+
[32mESM[39m [1mdist/telegram/backend.js [22m[32m1.27 KB[39m
|
|
37
|
+
[32mESM[39m [1mdist/account.js.map [22m[32m9.72 KB[39m
|
|
38
|
+
[32mESM[39m [1mdist/constants.js.map [22m[32m315.00 B[39m
|
|
39
|
+
[32mESM[39m [1mdist/controller.js.map [22m[32m61.03 KB[39m
|
|
40
|
+
[32mESM[39m [1mdist/errors.js.map [22m[32m385.00 B[39m
|
|
41
|
+
[32mESM[39m [1mdist/icon.js.map [22m[32m15.20 KB[39m
|
|
42
|
+
[32mESM[39m [1mdist/index.js.map [22m[32m394.34 KB[39m
|
|
43
|
+
[32mESM[39m [1mdist/lookup.js.map [22m[32m3.49 KB[39m
|
|
44
|
+
[32mESM[39m [1mdist/provider.js.map [22m[32m25.59 KB[39m
|
|
45
|
+
[32mESM[39m [1mdist/types.js.map [22m[32m4.75 KB[39m
|
|
46
|
+
[32mESM[39m [1mdist/utils.js.map [22m[32m7.10 KB[39m
|
|
47
|
+
[32mESM[39m [1mdist/__tests__/parseChainId.test.js.map [22m[32m8.47 KB[39m
|
|
48
|
+
[32mESM[39m [1mdist/iframe/index.js.map [22m[32m10.47 KB[39m
|
|
49
|
+
[32mESM[39m [1mdist/iframe/base.js.map [22m[32m7.08 KB[39m
|
|
50
|
+
[32mESM[39m [1mdist/iframe/keychain.js.map [22m[32m8.27 KB[39m
|
|
51
|
+
[32mESM[39m [1mdist/session/account.js.map [22m[32m12.10 KB[39m
|
|
52
|
+
[32mESM[39m [1mdist/iframe/profile.js.map [22m[32m9.47 KB[39m
|
|
53
|
+
[32mESM[39m [1mdist/session/backend.js.map [22m[32m2.88 KB[39m
|
|
54
|
+
[32mESM[39m [1mdist/session/provider.js.map [22m[32m39.69 KB[39m
|
|
55
|
+
[32mESM[39m [1mdist/session/index.js.map [22m[32m44.69 KB[39m
|
|
56
|
+
[32mESM[39m [1mdist/telegram/provider.js.map [22m[32m38.84 KB[39m
|
|
57
|
+
[32mESM[39m [1mdist/telegram/backend.js.map [22m[32m1.98 KB[39m
|
|
58
|
+
[32mESM[39m ⚡️ Build success in 162ms
|
|
57
59
|
[34mDTS[39m Build start
|
|
58
60
|
../tsconfig/base.json(6,25): error TS6046: Argument for '--moduleResolution' option must be: 'node', 'classic', 'node16', 'nodenext'.
|
|
59
61
|
|
|
@@ -97,26 +99,29 @@
|
|
|
97
99
|
|
|
98
100
|
../tsconfig/base.json(6,25): error TS6046: Argument for '--moduleResolution' option must be: 'node', 'classic', 'node16', 'nodenext'.
|
|
99
101
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
[32mDTS[39m
|
|
103
|
-
[32mDTS[39m [1mdist/
|
|
104
|
-
[32mDTS[39m [1mdist/
|
|
105
|
-
[32mDTS[39m [1mdist/
|
|
106
|
-
[32mDTS[39m [1mdist/
|
|
107
|
-
[32mDTS[39m [1mdist/
|
|
108
|
-
[32mDTS[39m [1mdist/
|
|
109
|
-
[32mDTS[39m [1mdist/
|
|
110
|
-
[32mDTS[39m [1mdist/
|
|
111
|
-
[32mDTS[39m [1mdist/
|
|
112
|
-
[32mDTS[39m [1mdist/session/
|
|
113
|
-
[32mDTS[39m [1mdist/errors.d.ts
|
|
114
|
-
[32mDTS[39m [1mdist/session/provider.d.ts
|
|
115
|
-
[32mDTS[39m [1mdist/
|
|
116
|
-
[32mDTS[39m [1mdist/
|
|
117
|
-
[32mDTS[39m [1mdist/
|
|
118
|
-
[32mDTS[39m [1mdist/
|
|
119
|
-
[32mDTS[39m [1mdist/iframe/
|
|
120
|
-
[32mDTS[39m [1mdist/
|
|
121
|
-
[32mDTS[39m [1mdist/
|
|
122
|
-
[32mDTS[39m [1mdist/
|
|
102
|
+
../tsconfig/base.json(6,25): error TS6046: Argument for '--moduleResolution' option must be: 'node', 'classic', 'node16', 'nodenext'.
|
|
103
|
+
|
|
104
|
+
[32mDTS[39m ⚡️ Build success in 9945ms
|
|
105
|
+
[32mDTS[39m [1mdist/index.d.ts [22m[32m1.28 KB[39m
|
|
106
|
+
[32mDTS[39m [1mdist/__tests__/parseChainId.test.d.ts [22m[32m13.00 B[39m
|
|
107
|
+
[32mDTS[39m [1mdist/session/index.d.ts [22m[32m737.00 B[39m
|
|
108
|
+
[32mDTS[39m [1mdist/account.d.ts [22m[32m1.64 KB[39m
|
|
109
|
+
[32mDTS[39m [1mdist/constants.d.ts [22m[32m215.00 B[39m
|
|
110
|
+
[32mDTS[39m [1mdist/icon.d.ts [22m[32m15.11 KB[39m
|
|
111
|
+
[32mDTS[39m [1mdist/controller.d.ts [22m[32m1.36 KB[39m
|
|
112
|
+
[32mDTS[39m [1mdist/lookup.d.ts [22m[32m216.00 B[39m
|
|
113
|
+
[32mDTS[39m [1mdist/utils.d.ts [22m[32m806.00 B[39m
|
|
114
|
+
[32mDTS[39m [1mdist/session/account.d.ts [22m[32m1.83 KB[39m
|
|
115
|
+
[32mDTS[39m [1mdist/errors.d.ts [22m[32m100.00 B[39m
|
|
116
|
+
[32mDTS[39m [1mdist/session/provider.d.ts [22m[32m1.10 KB[39m
|
|
117
|
+
[32mDTS[39m [1mdist/telegram/backend.d.ts [22m[32m1.28 KB[39m
|
|
118
|
+
[32mDTS[39m [1mdist/session/backend.d.ts [22m[32m2.29 KB[39m
|
|
119
|
+
[32mDTS[39m [1mdist/telegram/provider.d.ts [22m[32m975.00 B[39m
|
|
120
|
+
[32mDTS[39m [1mdist/provider.d.ts [22m[32m897.00 B[39m
|
|
121
|
+
[32mDTS[39m [1mdist/iframe/base.d.ts [22m[32m184.00 B[39m
|
|
122
|
+
[32mDTS[39m [1mdist/iframe/keychain.d.ts [22m[32m172.00 B[39m
|
|
123
|
+
[32mDTS[39m [1mdist/iframe/profile.d.ts [22m[32m198.00 B[39m
|
|
124
|
+
[32mDTS[39m [1mdist/iframe/index.d.ts [22m[32m252.00 B[39m
|
|
125
|
+
[32mDTS[39m [1mdist/types.d.ts [22m[32m603.00 B[39m
|
|
126
|
+
[32mDTS[39m [1mdist/index.d-BbTUPBeO.d.ts [22m[32m2.15 KB[39m
|
|
127
|
+
[32mDTS[39m [1mdist/types-CVnDQVqD.d.ts [22m[32m6.21 KB[39m
|
|
@@ -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\";\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\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;AA6HA,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;;;AD3JA,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
package/dist/account.js.map
CHANGED
|
@@ -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;
|
|
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\";\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\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;AA6GA,SAAS,QAAW,KAAmB;AAC5C,SAAO,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,GAAG;AACxC;;;ADpGA,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"]}
|
package/dist/controller.d.ts
CHANGED
|
@@ -25,7 +25,7 @@ declare class ControllerProvider extends BaseProvider {
|
|
|
25
25
|
username(): Promise<string> | undefined;
|
|
26
26
|
fetchControllers(contractAddresses: string[]): Promise<Record<string, string>>;
|
|
27
27
|
openPurchaseCredits(): void;
|
|
28
|
-
openExecute(calls: any): Promise<boolean | undefined>;
|
|
28
|
+
openExecute(calls: any, chainId?: string): Promise<boolean | undefined>;
|
|
29
29
|
delegateAccount(): Promise<string | null>;
|
|
30
30
|
private waitForKeychain;
|
|
31
31
|
}
|