@cartridge/controller 0.5.9 → 0.7.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 (102) hide show
  1. package/.turbo/turbo-build$colon$deps.log +53 -115
  2. package/.turbo/turbo-build.log +54 -116
  3. package/dist/controller.cjs +860 -0
  4. package/dist/controller.cjs.map +1 -0
  5. package/dist/controller.d.cts +33 -0
  6. package/dist/controller.d.ts +4 -4
  7. package/dist/controller.js +254 -170
  8. package/dist/controller.js.map +1 -1
  9. package/dist/index.cjs +2200 -0
  10. package/dist/index.cjs.map +1 -0
  11. package/dist/index.d.cts +17 -0
  12. package/dist/index.d.ts +12 -6
  13. package/dist/index.js +296 -7666
  14. package/dist/index.js.map +1 -1
  15. package/dist/lookup.cjs +59 -0
  16. package/dist/lookup.cjs.map +1 -0
  17. package/dist/lookup.d.cts +4 -0
  18. package/dist/lookup.js +7 -7
  19. package/dist/lookup.js.map +1 -1
  20. package/dist/node/index.cjs +726 -0
  21. package/dist/node/index.cjs.map +1 -0
  22. package/dist/node/index.d.cts +56 -0
  23. package/dist/node/index.d.ts +56 -0
  24. package/dist/{telegram/provider.js → node/index.js} +521 -216
  25. package/dist/node/index.js.map +1 -0
  26. package/dist/policies-DD1aPjQ4.d.cts +21 -0
  27. package/dist/policies-DD1aPjQ4.d.ts +21 -0
  28. package/dist/{types-CVnDQVqD.d.ts → provider-ap1C1ypF.d.cts} +27 -10
  29. package/dist/provider-ap1C1ypF.d.ts +201 -0
  30. package/dist/session/{provider.js → index.cjs} +342 -168
  31. package/dist/session/index.cjs.map +1 -0
  32. package/dist/session/index.d.cts +38 -0
  33. package/dist/session/index.d.ts +37 -7
  34. package/dist/session/index.js +309 -161
  35. package/dist/session/index.js.map +1 -1
  36. package/package.json +49 -16
  37. package/src/controller.ts +44 -15
  38. package/src/iframe/base.ts +1 -11
  39. package/src/mutex.ts +22 -0
  40. package/src/node/account.ts +72 -0
  41. package/src/node/backend.ts +159 -0
  42. package/src/node/index.ts +4 -0
  43. package/src/node/provider.ts +178 -0
  44. package/src/node/server.ts +89 -0
  45. package/src/policies.ts +49 -0
  46. package/src/provider.ts +33 -2
  47. package/src/session/account.ts +2 -1
  48. package/src/session/provider.ts +123 -10
  49. package/src/telegram/provider.ts +3 -2
  50. package/src/types.ts +3 -6
  51. package/src/utils.ts +4 -1
  52. package/tsconfig.json +3 -3
  53. package/dist/__tests__/parseChainId.test.d.ts +0 -2
  54. package/dist/__tests__/parseChainId.test.js +0 -89
  55. package/dist/__tests__/parseChainId.test.js.map +0 -1
  56. package/dist/account.d.ts +0 -38
  57. package/dist/account.js +0 -106
  58. package/dist/account.js.map +0 -1
  59. package/dist/constants.d.ts +0 -5
  60. package/dist/constants.js +0 -10
  61. package/dist/constants.js.map +0 -1
  62. package/dist/errors.d.ts +0 -5
  63. package/dist/errors.js +0 -11
  64. package/dist/errors.js.map +0 -1
  65. package/dist/icon.d.ts +0 -3
  66. package/dist/icon.js +0 -6
  67. package/dist/icon.js.map +0 -1
  68. package/dist/iframe/base.d.ts +0 -5
  69. package/dist/iframe/base.js +0 -122
  70. package/dist/iframe/base.js.map +0 -1
  71. package/dist/iframe/index.d.ts +0 -5
  72. package/dist/iframe/index.js +0 -184
  73. package/dist/iframe/index.js.map +0 -1
  74. package/dist/iframe/keychain.d.ts +0 -5
  75. package/dist/iframe/keychain.js +0 -143
  76. package/dist/iframe/keychain.js.map +0 -1
  77. package/dist/iframe/profile.d.ts +0 -5
  78. package/dist/iframe/profile.js +0 -163
  79. package/dist/iframe/profile.js.map +0 -1
  80. package/dist/index.d-BbTUPBeO.d.ts +0 -68
  81. package/dist/provider.d.ts +0 -22
  82. package/dist/provider.js +0 -198
  83. package/dist/provider.js.map +0 -1
  84. package/dist/session/account.d.ts +0 -37
  85. package/dist/session/account.js +0 -92
  86. package/dist/session/account.js.map +0 -1
  87. package/dist/session/backend.d.ts +0 -60
  88. package/dist/session/backend.js +0 -39
  89. package/dist/session/backend.js.map +0 -1
  90. package/dist/session/provider.d.ts +0 -30
  91. package/dist/session/provider.js.map +0 -1
  92. package/dist/telegram/backend.d.ts +0 -33
  93. package/dist/telegram/backend.js +0 -40
  94. package/dist/telegram/backend.js.map +0 -1
  95. package/dist/telegram/provider.d.ts +0 -26
  96. package/dist/telegram/provider.js.map +0 -1
  97. package/dist/types.d.ts +0 -5
  98. package/dist/types.js +0 -13
  99. package/dist/types.js.map +0 -1
  100. package/dist/utils.d.ts +0 -18
  101. package/dist/utils.js +0 -139
  102. package/dist/utils.js.map +0 -1
@@ -1,27 +1,18 @@
1
- // src/session/provider.ts
2
- import { ec, stark } from "starknet";
1
+ 'use strict';
3
2
 
4
- // src/session/account.ts
5
- import { CartridgeSessionAccount } from "@cartridge/account-wasm/session";
6
- import { WalletAccount } from "starknet";
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var starknet = require('starknet');
6
+ var session = require('@cartridge/account-wasm/session');
7
+ var typesJs = require('@starknet-io/types-js');
7
8
 
8
- // src/utils.ts
9
- import {
10
- addAddressPadding,
11
- CallData,
12
- constants,
13
- getChecksumAddress,
14
- hash,
15
- shortString,
16
- typedData,
17
- TypedDataRevision
18
- } from "starknet";
9
+ // src/session/provider.ts
19
10
  function normalizeCalls(calls) {
20
11
  return toArray(calls).map((call) => {
21
12
  return {
22
13
  entrypoint: call.entrypoint,
23
- contractAddress: addAddressPadding(call.contractAddress),
24
- calldata: CallData.toHex(call.calldata)
14
+ contractAddress: starknet.addAddressPadding(call.contractAddress),
15
+ calldata: starknet.CallData.toHex(call.calldata)
25
16
  };
26
17
  });
27
18
  }
@@ -30,23 +21,25 @@ function toWasmPolicies(policies) {
30
21
  ...Object.entries(policies.contracts ?? {}).flatMap(
31
22
  ([target, { methods }]) => toArray(methods).map((m) => ({
32
23
  target,
33
- method: m.entrypoint
24
+ method: m.entrypoint,
25
+ authorized: m.authorized
34
26
  }))
35
27
  ),
36
28
  ...(policies.messages ?? []).map((p) => {
37
- const domainHash = typedData.getStructHash(
29
+ const domainHash = starknet.typedData.getStructHash(
38
30
  p.types,
39
31
  "StarknetDomain",
40
32
  p.domain,
41
- TypedDataRevision.ACTIVE
33
+ starknet.TypedDataRevision.ACTIVE
42
34
  );
43
- const typeHash = typedData.getTypeHash(
35
+ const typeHash = starknet.typedData.getTypeHash(
44
36
  p.types,
45
37
  p.primaryType,
46
- TypedDataRevision.ACTIVE
38
+ starknet.TypedDataRevision.ACTIVE
47
39
  );
48
40
  return {
49
- scope_hash: hash.computePoseidonHash(domainHash, typeHash)
41
+ scope_hash: starknet.hash.computePoseidonHash(domainHash, typeHash),
42
+ authorized: p.authorized
50
43
  };
51
44
  })
52
45
  ];
@@ -55,8 +48,27 @@ function toArray(val) {
55
48
  return Array.isArray(val) ? val : [val];
56
49
  }
57
50
 
51
+ // src/errors.ts
52
+ var NotReadyToConnect = class _NotReadyToConnect extends Error {
53
+ constructor() {
54
+ super("Not ready to connect");
55
+ Object.setPrototypeOf(this, _NotReadyToConnect.prototype);
56
+ }
57
+ };
58
+
59
+ // src/types.ts
60
+ var ResponseCodes = /* @__PURE__ */ ((ResponseCodes2) => {
61
+ ResponseCodes2["SUCCESS"] = "SUCCESS";
62
+ ResponseCodes2["NOT_CONNECTED"] = "NOT_CONNECTED";
63
+ ResponseCodes2["ERROR"] = "ERROR";
64
+ ResponseCodes2["CANCELED"] = "CANCELED";
65
+ ResponseCodes2["USER_INTERACTION_REQUIRED"] = "USER_INTERACTION_REQUIRED";
66
+ return ResponseCodes2;
67
+ })(ResponseCodes || {});
68
+
58
69
  // src/session/account.ts
59
- var SessionAccount = class extends WalletAccount {
70
+ var SessionAccount = class extends starknet.WalletAccount {
71
+ controller;
60
72
  constructor(provider, {
61
73
  rpcUrl,
62
74
  privateKey,
@@ -67,7 +79,8 @@ var SessionAccount = class extends WalletAccount {
67
79
  policies
68
80
  }) {
69
81
  super({ nodeUrl: rpcUrl }, provider);
70
- this.controller = CartridgeSessionAccount.new_as_registered(
82
+ this.address = address;
83
+ this.controller = session.CartridgeSessionAccount.newAsRegistered(
71
84
  rpcUrl,
72
85
  privateKey,
73
86
  address,
@@ -99,21 +112,16 @@ var SessionAccount = class extends WalletAccount {
99
112
  // src/constants.ts
100
113
  var KEYCHAIN_URL = "https://x.cartridge.gg";
101
114
 
102
- // src/provider.ts
103
- import {
104
- Permission
105
- } from "@starknet-io/types-js";
106
-
107
115
  // package.json
108
116
  var package_default = {
109
117
  name: "@cartridge/controller",
110
- version: "0.5.9",
118
+ version: "0.7.0",
111
119
  description: "Cartridge Controller",
112
120
  module: "dist/index.js",
113
121
  types: "dist/index.d.ts",
114
122
  type: "module",
115
123
  scripts: {
116
- "build:deps": "tsup --dts-resolve",
124
+ "build:deps": "tsup",
117
125
  build: "pnpm build:deps",
118
126
  format: 'prettier --write "src/**/*.ts"',
119
127
  "format:check": 'prettier --check "src/**/*.ts"',
@@ -121,167 +129,240 @@ var package_default = {
121
129
  version: "pnpm pkg get version"
122
130
  },
123
131
  exports: {
124
- ".": "./dist/index.js",
125
- "./session": "./dist/session/index.js",
126
- "./provider": "./dist/provider/index.js",
127
- "./types": "./dist/types/index.js"
132
+ ".": {
133
+ types: "./dist/index.d.ts",
134
+ import: "./dist/index.js",
135
+ require: "./dist/index.cjs"
136
+ },
137
+ "./session": {
138
+ types: "./dist/session/index.d.ts",
139
+ import: "./dist/session/index.js",
140
+ require: "./dist/session/index.cjs"
141
+ },
142
+ "./session/node": {
143
+ types: "./dist/node/index.d.ts",
144
+ import: "./dist/node/index.js",
145
+ require: "./dist/node/index.cjs"
146
+ },
147
+ "./provider": {
148
+ types: "./dist/provider/index.d.ts",
149
+ import: "./dist/provider/index.js"
150
+ },
151
+ "./types": {
152
+ types: "./dist/types/index.d.ts",
153
+ import: "./dist/types/index.js"
154
+ }
128
155
  },
129
156
  tsup: {
130
157
  entry: [
131
- "src/**"
158
+ "src/index.ts",
159
+ "src/controller.ts",
160
+ "src/lookup.ts",
161
+ "src/session/index.ts",
162
+ "src/node/index.ts"
132
163
  ],
133
164
  format: [
134
- "esm"
165
+ "esm",
166
+ "cjs"
135
167
  ],
136
168
  splitting: false,
137
169
  sourcemap: true,
138
- clean: true
170
+ clean: true,
171
+ dts: true,
172
+ treeshake: {
173
+ preset: "recommended"
174
+ },
175
+ exports: "named"
176
+ },
177
+ peerDependencies: {
178
+ starknet: "catalog:",
179
+ open: "^10.1.0"
139
180
  },
140
181
  dependencies: {
141
182
  "@cartridge/account-wasm": "workspace:*",
142
- "@cartridge/penpal": "^6.2.3",
143
- "@starknet-io/types-js": "^0.7.7",
183
+ "@cartridge/penpal": "catalog:",
184
+ "@starknet-io/types-js": "catalog:",
144
185
  "@telegram-apps/sdk": "^2.4.0",
145
- base64url: "^3.0.1",
186
+ base64url: "catalog:",
146
187
  "cbor-x": "^1.5.0",
147
- "fast-deep-equal": "^3.1.3",
148
- "query-string": "^7.1.1",
149
- starknet: "^6.11.0"
188
+ "fast-deep-equal": "catalog:"
150
189
  },
151
190
  devDependencies: {
152
191
  "@cartridge/tsconfig": "workspace:*",
153
192
  "@types/jest": "^29.5.14",
154
- "@types/node": "^20.6.0",
193
+ "@types/node": "catalog:",
155
194
  jest: "^29.7.0",
195
+ prettier: "catalog:",
156
196
  "ts-jest": "^29.2.5",
157
- typescript: "^5.4.5"
197
+ tsup: "catalog:",
198
+ typescript: "catalog:"
158
199
  }
159
200
  };
160
201
 
161
202
  // src/icon.ts
162
203
  var icon = "data:image/png;base64,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";
163
204
 
205
+ // src/mutex.ts
206
+ function releaseStub() {
207
+ }
208
+ var Mutex = class {
209
+ m_lastPromise = Promise.resolve();
210
+ /**
211
+ * Acquire lock
212
+ * @param [bypass=false] option to skip lock acquisition
213
+ */
214
+ async obtain(bypass = false) {
215
+ let release = releaseStub;
216
+ if (bypass) return release;
217
+ const lastPromise = this.m_lastPromise;
218
+ this.m_lastPromise = new Promise((resolve) => release = resolve);
219
+ await lastPromise;
220
+ return release;
221
+ }
222
+ };
223
+
164
224
  // src/provider.ts
225
+ var mutex = new Mutex();
165
226
  var BaseProvider = class {
166
- constructor() {
167
- this.id = "controller";
168
- this.name = "Controller";
169
- this.version = package_default.version;
170
- this.icon = icon;
171
- this.subscriptions = [];
172
- this.request = async (call) => {
173
- switch (call.type) {
174
- case "wallet_getPermissions":
175
- await this.probe();
176
- if (this.account) {
177
- return [Permission.ACCOUNTS];
178
- }
179
- return [];
180
- case "wallet_requestAccounts": {
181
- if (this.account) {
182
- return [this.account.address];
183
- }
184
- const silentMode = call.params && call.params.silent_mode;
185
- this.account = await this.probe();
186
- if (!this.account && !silentMode) {
187
- this.account = await this.connect();
188
- }
189
- if (this.account) {
190
- return [this.account.address];
191
- }
192
- return [];
227
+ id = "controller";
228
+ name = "Controller";
229
+ version = package_default.version;
230
+ icon = icon;
231
+ account;
232
+ subscriptions = [];
233
+ _probePromise = null;
234
+ async safeProbe() {
235
+ if (this.account) {
236
+ return this.account;
237
+ }
238
+ if (this._probePromise) {
239
+ return this._probePromise;
240
+ }
241
+ const release = await mutex.obtain();
242
+ return await new Promise(async (resolve) => {
243
+ try {
244
+ this._probePromise = this.probe();
245
+ const result = await this._probePromise;
246
+ resolve(result);
247
+ } finally {
248
+ this._probePromise = null;
249
+ }
250
+ }).finally(() => {
251
+ release();
252
+ });
253
+ }
254
+ request = async (call) => {
255
+ switch (call.type) {
256
+ case "wallet_getPermissions":
257
+ await this.safeProbe();
258
+ if (this.account) {
259
+ return [typesJs.Permission.ACCOUNTS];
193
260
  }
194
- case "wallet_watchAsset":
195
- throw {
196
- code: 63,
197
- message: "An unexpected error occurred",
198
- data: "wallet_watchAsset not implemented"
199
- };
200
- case "wallet_addStarknetChain": {
201
- let params2 = call.params;
202
- return this.addStarknetChain(params2);
261
+ return [];
262
+ case "wallet_requestAccounts": {
263
+ if (this.account) {
264
+ return [this.account.address];
203
265
  }
204
- case "wallet_switchStarknetChain": {
205
- let params2 = call.params;
206
- return this.switchStarknetChain(params2.chainId);
266
+ const silentMode = call.params && call.params.silent_mode;
267
+ this.account = await this.safeProbe();
268
+ if (!this.account && !silentMode) {
269
+ this.account = await this.connect();
207
270
  }
208
- case "wallet_requestChainId":
209
- if (!this.account) {
210
- throw {
211
- code: 63,
212
- message: "An unexpected error occurred",
213
- data: "Account not initialized"
214
- };
215
- }
216
- return await this.account.getChainId();
217
- case "wallet_deploymentData":
271
+ if (this.account) {
272
+ return [this.account.address];
273
+ }
274
+ return [];
275
+ }
276
+ case "wallet_watchAsset":
277
+ throw {
278
+ code: 63,
279
+ message: "An unexpected error occurred",
280
+ data: "wallet_watchAsset not implemented"
281
+ };
282
+ case "wallet_addStarknetChain": {
283
+ let params2 = call.params;
284
+ return this.addStarknetChain(params2);
285
+ }
286
+ case "wallet_switchStarknetChain": {
287
+ let params2 = call.params;
288
+ return this.switchStarknetChain(params2.chainId);
289
+ }
290
+ case "wallet_requestChainId":
291
+ if (!this.account) {
218
292
  throw {
219
293
  code: 63,
220
294
  message: "An unexpected error occurred",
221
- data: "wallet_deploymentData not implemented"
295
+ data: "Account not initialized"
222
296
  };
223
- case "wallet_addInvokeTransaction":
224
- if (!this.account) {
225
- throw {
226
- code: 63,
227
- message: "An unexpected error occurred",
228
- data: "Account not initialized"
229
- };
230
- }
231
- let params = call.params;
232
- return await this.account.execute(
233
- params.calls.map((call2) => ({
234
- contractAddress: call2.contract_address,
235
- entrypoint: call2.entry_point,
236
- calldata: call2.calldata
237
- }))
238
- );
239
- case "wallet_addDeclareTransaction":
297
+ }
298
+ return await this.account.getChainId();
299
+ case "wallet_deploymentData":
300
+ throw {
301
+ code: 63,
302
+ message: "An unexpected error occurred",
303
+ data: "wallet_deploymentData not implemented"
304
+ };
305
+ case "wallet_addInvokeTransaction":
306
+ if (!this.account) {
240
307
  throw {
241
308
  code: 63,
242
309
  message: "An unexpected error occurred",
243
- data: "wallet_addDeclareTransaction not implemented"
310
+ data: "Account not initialized"
244
311
  };
245
- case "wallet_signTypedData": {
246
- if (!this.account) {
247
- throw {
248
- code: 63,
249
- message: "An unexpected error occurred",
250
- data: "Account not initialized"
251
- };
252
- }
253
- return await this.account.signMessage(call.params);
254
312
  }
255
- case "wallet_supportedSpecs":
256
- return [];
257
- case "wallet_supportedWalletApi":
258
- return [];
259
- default:
313
+ let params = call.params;
314
+ return await this.account.execute(
315
+ params.calls.map((call2) => ({
316
+ contractAddress: call2.contract_address,
317
+ entrypoint: call2.entry_point,
318
+ calldata: call2.calldata
319
+ }))
320
+ );
321
+ case "wallet_addDeclareTransaction":
322
+ throw {
323
+ code: 63,
324
+ message: "An unexpected error occurred",
325
+ data: "wallet_addDeclareTransaction not implemented"
326
+ };
327
+ case "wallet_signTypedData": {
328
+ if (!this.account) {
260
329
  throw {
261
330
  code: 63,
262
331
  message: "An unexpected error occurred",
263
- data: `Unknown RPC call type: ${call.type}`
332
+ data: "Account not initialized"
264
333
  };
334
+ }
335
+ return await this.account.signMessage(call.params);
265
336
  }
266
- };
267
- this.on = (event, handler) => {
268
- if (event !== "accountsChanged" && event !== "networkChanged") {
269
- throw new Error(`Unknown event: ${event}`);
270
- }
271
- this.subscriptions.push({ type: event, handler });
272
- };
273
- this.off = (event, handler) => {
274
- if (event !== "accountsChanged" && event !== "networkChanged") {
275
- throw new Error(`Unknown event: ${event}`);
276
- }
277
- const idx = this.subscriptions.findIndex(
278
- (sub) => sub.type === event && sub.handler === handler
279
- );
280
- if (idx >= 0) {
281
- this.subscriptions.splice(idx, 1);
282
- }
283
- };
284
- }
337
+ case "wallet_supportedSpecs":
338
+ return [];
339
+ case "wallet_supportedWalletApi":
340
+ return [];
341
+ default:
342
+ throw {
343
+ code: 63,
344
+ message: "An unexpected error occurred",
345
+ data: `Unknown RPC call type: ${call.type}`
346
+ };
347
+ }
348
+ };
349
+ on = (event, handler) => {
350
+ if (event !== "accountsChanged" && event !== "networkChanged") {
351
+ throw new Error(`Unknown event: ${event}`);
352
+ }
353
+ this.subscriptions.push({ type: event, handler });
354
+ };
355
+ off = (event, handler) => {
356
+ if (event !== "accountsChanged" && event !== "networkChanged") {
357
+ throw new Error(`Unknown event: ${event}`);
358
+ }
359
+ const idx = this.subscriptions.findIndex(
360
+ (sub) => sub.type === event && sub.handler === handler
361
+ );
362
+ if (idx >= 0) {
363
+ this.subscriptions.splice(idx, 1);
364
+ }
365
+ };
285
366
  emitNetworkChanged(chainId) {
286
367
  this.subscriptions.filter((sub) => sub.type === "networkChanged").forEach((sub) => {
287
368
  sub.handler(chainId);
@@ -296,33 +377,95 @@ var BaseProvider = class {
296
377
 
297
378
  // src/session/provider.ts
298
379
  var SessionProvider = class extends BaseProvider {
299
- constructor({ rpc, chainId, policies, redirectUrl }) {
380
+ id = "controller_session";
381
+ name = "Controller Session";
382
+ _chainId;
383
+ _rpcUrl;
384
+ _username;
385
+ _redirectUrl;
386
+ _policies;
387
+ _keychainUrl;
388
+ constructor({
389
+ rpc,
390
+ chainId,
391
+ policies,
392
+ redirectUrl,
393
+ keychainUrl
394
+ }) {
300
395
  super();
301
- this.id = "controller_session";
302
- this.name = "Controller Session";
396
+ this._policies = {
397
+ verified: false,
398
+ contracts: policies.contracts ? Object.fromEntries(
399
+ Object.entries(policies.contracts).map(([address, contract]) => [
400
+ address,
401
+ {
402
+ ...contract,
403
+ methods: contract.methods.map((method) => ({
404
+ ...method,
405
+ authorized: true
406
+ }))
407
+ }
408
+ ])
409
+ ) : undefined,
410
+ messages: policies.messages?.map((message) => ({
411
+ ...message,
412
+ authorized: true
413
+ }))
414
+ };
303
415
  this._rpcUrl = rpc;
304
416
  this._chainId = chainId;
305
417
  this._redirectUrl = redirectUrl;
306
- this._policies = policies;
418
+ this._keychainUrl = keychainUrl || KEYCHAIN_URL;
307
419
  if (typeof window !== "undefined") {
308
420
  window.starknet_controller_session = this;
309
421
  }
310
422
  }
423
+ validatePoliciesSubset(newPolicies, existingPolicies) {
424
+ if (newPolicies.contracts) {
425
+ if (!existingPolicies.contracts) return false;
426
+ for (const [address, contract] of Object.entries(newPolicies.contracts)) {
427
+ const existingContract = existingPolicies.contracts[address];
428
+ if (!existingContract) return false;
429
+ for (const method of contract.methods) {
430
+ const existingMethod = existingContract.methods.find(
431
+ (m) => m.entrypoint === method.entrypoint
432
+ );
433
+ if (!existingMethod || !existingMethod.authorized) return false;
434
+ }
435
+ }
436
+ }
437
+ if (newPolicies.messages) {
438
+ if (!existingPolicies.messages) return false;
439
+ for (const message of newPolicies.messages) {
440
+ const existingMessage = existingPolicies.messages.find(
441
+ (m) => JSON.stringify(m.domain) === JSON.stringify(message.domain) && JSON.stringify(m.types) === JSON.stringify(message.types)
442
+ );
443
+ if (!existingMessage || !existingMessage.authorized) return false;
444
+ }
445
+ }
446
+ return true;
447
+ }
311
448
  async username() {
312
449
  await this.tryRetrieveFromQueryOrStorage();
313
450
  return this._username;
314
451
  }
315
452
  async probe() {
316
- await this.tryRetrieveFromQueryOrStorage();
317
- return;
453
+ if (this.account) {
454
+ return this.account;
455
+ }
456
+ this.account = await this.tryRetrieveFromQueryOrStorage();
457
+ return this.account;
318
458
  }
319
459
  async connect() {
320
- await this.tryRetrieveFromQueryOrStorage();
321
460
  if (this.account) {
322
- return;
461
+ return this.account;
462
+ }
463
+ this.account = await this.tryRetrieveFromQueryOrStorage();
464
+ if (this.account) {
465
+ return this.account;
323
466
  }
324
- const pk = stark.randomAddress();
325
- const publicKey = ec.starkCurve.getStarkKey(pk);
467
+ const pk = starknet.stark.randomAddress();
468
+ const publicKey = starknet.ec.starkCurve.getStarkKey(pk);
326
469
  localStorage.setItem(
327
470
  "sessionSigner",
328
471
  JSON.stringify({
@@ -330,12 +473,13 @@ var SessionProvider = class extends BaseProvider {
330
473
  pubKey: publicKey
331
474
  })
332
475
  );
333
- const url = `${KEYCHAIN_URL}/session?public_key=${publicKey}&redirect_uri=${this._redirectUrl}&redirect_query_name=startapp&policies=${JSON.stringify(
476
+ localStorage.setItem("sessionPolicies", JSON.stringify(this._policies));
477
+ const url = `${this._keychainUrl}/session?public_key=${publicKey}&redirect_uri=${this._redirectUrl}&redirect_query_name=startapp&policies=${JSON.stringify(
334
478
  this._policies
335
479
  )}&rpc_url=${this._rpcUrl}`;
336
480
  localStorage.setItem("lastUsedConnector", this.id);
337
481
  window.open(url, "_blank");
338
- return;
482
+ return this.account;
339
483
  }
340
484
  switchStarknetChain(_chainId) {
341
485
  throw new Error("switchStarknetChain not implemented");
@@ -346,11 +490,15 @@ var SessionProvider = class extends BaseProvider {
346
490
  disconnect() {
347
491
  localStorage.removeItem("sessionSigner");
348
492
  localStorage.removeItem("session");
349
- this.account = void 0;
350
- this._username = void 0;
493
+ localStorage.removeItem("sessionPolicies");
494
+ this.account = undefined;
495
+ this._username = undefined;
351
496
  return Promise.resolve();
352
497
  }
353
498
  async tryRetrieveFromQueryOrStorage() {
499
+ if (this.account) {
500
+ return this.account;
501
+ }
354
502
  const signerString = localStorage.getItem("sessionSigner");
355
503
  const signer = signerString ? JSON.parse(signerString) : null;
356
504
  let sessionRegistration = null;
@@ -374,6 +522,25 @@ var SessionProvider = class extends BaseProvider {
374
522
  if (!sessionRegistration || !signer) {
375
523
  return;
376
524
  }
525
+ const expirationTime = parseInt(sessionRegistration.expiresAt) * 1e3;
526
+ if (Date.now() >= expirationTime) {
527
+ this.clearStoredSession();
528
+ return;
529
+ }
530
+ const storedPoliciesStr = localStorage.getItem("sessionPolicies");
531
+ if (storedPoliciesStr) {
532
+ const storedPolicies = JSON.parse(
533
+ storedPoliciesStr
534
+ );
535
+ const isValid = this.validatePoliciesSubset(
536
+ this._policies,
537
+ storedPolicies
538
+ );
539
+ if (!isValid) {
540
+ this.clearStoredSession();
541
+ return;
542
+ }
543
+ }
377
544
  this._username = sessionRegistration.username;
378
545
  this.account = new SessionAccount(this, {
379
546
  rpcUrl: this._rpcUrl,
@@ -386,8 +553,15 @@ var SessionProvider = class extends BaseProvider {
386
553
  });
387
554
  return this.account;
388
555
  }
556
+ clearStoredSession() {
557
+ localStorage.removeItem("sessionSigner");
558
+ localStorage.removeItem("session");
559
+ localStorage.removeItem("sessionPolicies");
560
+ }
389
561
  };
390
- export {
391
- SessionProvider as default
392
- };
393
- //# sourceMappingURL=provider.js.map
562
+
563
+ exports.NotReadyToConnect = NotReadyToConnect;
564
+ exports.ResponseCodes = ResponseCodes;
565
+ exports.default = SessionProvider;
566
+ //# sourceMappingURL=index.cjs.map
567
+ //# sourceMappingURL=index.cjs.map