@cartridge/controller 0.5.9 → 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 (51) hide show
  1. package/.turbo/turbo-build$colon$deps.log +44 -82
  2. package/.turbo/turbo-build.log +47 -85
  3. package/dist/__tests__/parseChainId.test.js.map +1 -1
  4. package/dist/account.js +4 -0
  5. package/dist/account.js.map +1 -1
  6. package/dist/controller.js +177 -109
  7. package/dist/controller.js.map +1 -1
  8. package/dist/iframe/base.js +4 -0
  9. package/dist/iframe/base.js.map +1 -1
  10. package/dist/iframe/index.js +4 -0
  11. package/dist/iframe/index.js.map +1 -1
  12. package/dist/iframe/keychain.js +4 -0
  13. package/dist/iframe/keychain.js.map +1 -1
  14. package/dist/iframe/profile.js +4 -0
  15. package/dist/iframe/profile.js.map +1 -1
  16. package/dist/index.d.ts +1 -0
  17. package/dist/index.js +181 -111
  18. package/dist/index.js.map +1 -1
  19. package/dist/mutex.d.ts +14 -0
  20. package/dist/mutex.js +22 -0
  21. package/dist/mutex.js.map +1 -0
  22. package/dist/policies.d.ts +19 -0
  23. package/dist/policies.js +26 -0
  24. package/dist/policies.js.map +1 -0
  25. package/dist/provider.d.ts +2 -0
  26. package/dist/provider.js +163 -109
  27. package/dist/provider.js.map +1 -1
  28. package/dist/session/account.js +2 -0
  29. package/dist/session/account.js.map +1 -1
  30. package/dist/session/index.d.ts +1 -0
  31. package/dist/session/index.js +286 -121
  32. package/dist/session/index.js.map +1 -1
  33. package/dist/session/provider.d.ts +7 -2
  34. package/dist/session/provider.js +286 -121
  35. package/dist/session/provider.js.map +1 -1
  36. package/dist/telegram/provider.d.ts +2 -1
  37. package/dist/telegram/provider.js +198 -112
  38. package/dist/telegram/provider.js.map +1 -1
  39. package/dist/utils.d.ts +2 -1
  40. package/dist/utils.js +4 -2
  41. package/dist/utils.js.map +1 -1
  42. package/package.json +22 -8
  43. package/src/controller.ts +1 -0
  44. package/src/mutex.ts +22 -0
  45. package/src/policies.ts +49 -0
  46. package/src/provider.ts +33 -2
  47. package/src/session/account.ts +1 -0
  48. package/src/session/provider.ts +139 -10
  49. package/src/telegram/provider.ts +3 -2
  50. package/src/utils.ts +4 -1
  51. package/tsconfig.json +1 -2
@@ -30,7 +30,8 @@ function toWasmPolicies(policies) {
30
30
  ...Object.entries(policies.contracts ?? {}).flatMap(
31
31
  ([target, { methods }]) => toArray(methods).map((m) => ({
32
32
  target,
33
- method: m.entrypoint
33
+ method: m.entrypoint,
34
+ authorized: m.authorized
34
35
  }))
35
36
  ),
36
37
  ...(policies.messages ?? []).map((p) => {
@@ -46,7 +47,8 @@ function toWasmPolicies(policies) {
46
47
  TypedDataRevision.ACTIVE
47
48
  );
48
49
  return {
49
- scope_hash: hash.computePoseidonHash(domainHash, typeHash)
50
+ scope_hash: hash.computePoseidonHash(domainHash, typeHash),
51
+ authorized: p.authorized
50
52
  };
51
53
  })
52
54
  ];
@@ -57,6 +59,7 @@ function toArray(val) {
57
59
 
58
60
  // src/session/account.ts
59
61
  var SessionAccount = class extends WalletAccount {
62
+ controller;
60
63
  constructor(provider, {
61
64
  rpcUrl,
62
65
  privateKey,
@@ -67,6 +70,7 @@ var SessionAccount = class extends WalletAccount {
67
70
  policies
68
71
  }) {
69
72
  super({ nodeUrl: rpcUrl }, provider);
73
+ this.address = address;
70
74
  this.controller = CartridgeSessionAccount.new_as_registered(
71
75
  rpcUrl,
72
76
  privateKey,
@@ -107,7 +111,7 @@ import {
107
111
  // package.json
108
112
  var package_default = {
109
113
  name: "@cartridge/controller",
110
- version: "0.5.9",
114
+ version: "0.6.0",
111
115
  description: "Cartridge Controller",
112
116
  module: "dist/index.js",
113
117
  types: "dist/index.d.ts",
@@ -121,10 +125,22 @@ var package_default = {
121
125
  version: "pnpm pkg get version"
122
126
  },
123
127
  exports: {
124
- ".": "./dist/index.js",
125
- "./session": "./dist/session/index.js",
126
- "./provider": "./dist/provider/index.js",
127
- "./types": "./dist/types/index.js"
128
+ ".": {
129
+ types: "./dist/index.d.ts",
130
+ default: "./dist/index.js"
131
+ },
132
+ "./session": {
133
+ types: "./dist/session/index.d.ts",
134
+ default: "./dist/session/index.js"
135
+ },
136
+ "./provider": {
137
+ types: "./dist/provider/index.d.ts",
138
+ default: "./dist/provider/index.js"
139
+ },
140
+ "./types": {
141
+ types: "./dist/types/index.d.ts",
142
+ default: "./dist/types/index.js"
143
+ }
128
144
  },
129
145
  tsup: {
130
146
  entry: [
@@ -137,6 +153,9 @@ var package_default = {
137
153
  sourcemap: true,
138
154
  clean: true
139
155
  },
156
+ peerDependencies: {
157
+ starknet: "^6.21.0"
158
+ },
140
159
  dependencies: {
141
160
  "@cartridge/account-wasm": "workspace:*",
142
161
  "@cartridge/penpal": "^6.2.3",
@@ -145,8 +164,7 @@ var package_default = {
145
164
  base64url: "^3.0.1",
146
165
  "cbor-x": "^1.5.0",
147
166
  "fast-deep-equal": "^3.1.3",
148
- "query-string": "^7.1.1",
149
- starknet: "^6.11.0"
167
+ "query-string": "^7.1.1"
150
168
  },
151
169
  devDependencies: {
152
170
  "@cartridge/tsconfig": "workspace:*",
@@ -161,127 +179,167 @@ var package_default = {
161
179
  // src/icon.ts
162
180
  var icon = "data:image/png;base64,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";
163
181
 
182
+ // src/mutex.ts
183
+ function releaseStub() {
184
+ }
185
+ var Mutex = class {
186
+ m_lastPromise = Promise.resolve();
187
+ /**
188
+ * Acquire lock
189
+ * @param [bypass=false] option to skip lock acquisition
190
+ */
191
+ async obtain(bypass = false) {
192
+ let release = releaseStub;
193
+ if (bypass) return release;
194
+ const lastPromise = this.m_lastPromise;
195
+ this.m_lastPromise = new Promise((resolve) => release = resolve);
196
+ await lastPromise;
197
+ return release;
198
+ }
199
+ };
200
+
164
201
  // src/provider.ts
202
+ var mutex = new Mutex();
165
203
  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 [];
204
+ id = "controller";
205
+ name = "Controller";
206
+ version = package_default.version;
207
+ icon = icon;
208
+ account;
209
+ subscriptions = [];
210
+ _probePromise = null;
211
+ async safeProbe() {
212
+ if (this.account) {
213
+ return this.account;
214
+ }
215
+ if (this._probePromise) {
216
+ return this._probePromise;
217
+ }
218
+ const release = await mutex.obtain();
219
+ return await new Promise(async (resolve) => {
220
+ try {
221
+ this._probePromise = this.probe();
222
+ const result = await this._probePromise;
223
+ resolve(result);
224
+ } finally {
225
+ this._probePromise = null;
226
+ }
227
+ }).finally(() => {
228
+ release();
229
+ });
230
+ }
231
+ request = async (call) => {
232
+ switch (call.type) {
233
+ case "wallet_getPermissions":
234
+ await this.safeProbe();
235
+ if (this.account) {
236
+ return [Permission.ACCOUNTS];
193
237
  }
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);
238
+ return [];
239
+ case "wallet_requestAccounts": {
240
+ if (this.account) {
241
+ return [this.account.address];
203
242
  }
204
- case "wallet_switchStarknetChain": {
205
- let params2 = call.params;
206
- return this.switchStarknetChain(params2.chainId);
243
+ const silentMode = call.params && call.params.silent_mode;
244
+ this.account = await this.safeProbe();
245
+ if (!this.account && !silentMode) {
246
+ this.account = await this.connect();
207
247
  }
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":
248
+ if (this.account) {
249
+ return [this.account.address];
250
+ }
251
+ return [];
252
+ }
253
+ case "wallet_watchAsset":
254
+ throw {
255
+ code: 63,
256
+ message: "An unexpected error occurred",
257
+ data: "wallet_watchAsset not implemented"
258
+ };
259
+ case "wallet_addStarknetChain": {
260
+ let params2 = call.params;
261
+ return this.addStarknetChain(params2);
262
+ }
263
+ case "wallet_switchStarknetChain": {
264
+ let params2 = call.params;
265
+ return this.switchStarknetChain(params2.chainId);
266
+ }
267
+ case "wallet_requestChainId":
268
+ if (!this.account) {
218
269
  throw {
219
270
  code: 63,
220
271
  message: "An unexpected error occurred",
221
- data: "wallet_deploymentData not implemented"
272
+ data: "Account not initialized"
222
273
  };
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":
274
+ }
275
+ return await this.account.getChainId();
276
+ case "wallet_deploymentData":
277
+ throw {
278
+ code: 63,
279
+ message: "An unexpected error occurred",
280
+ data: "wallet_deploymentData not implemented"
281
+ };
282
+ case "wallet_addInvokeTransaction":
283
+ if (!this.account) {
240
284
  throw {
241
285
  code: 63,
242
286
  message: "An unexpected error occurred",
243
- data: "wallet_addDeclareTransaction not implemented"
287
+ data: "Account not initialized"
244
288
  };
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
289
  }
255
- case "wallet_supportedSpecs":
256
- return [];
257
- case "wallet_supportedWalletApi":
258
- return [];
259
- default:
290
+ let params = call.params;
291
+ return await this.account.execute(
292
+ params.calls.map((call2) => ({
293
+ contractAddress: call2.contract_address,
294
+ entrypoint: call2.entry_point,
295
+ calldata: call2.calldata
296
+ }))
297
+ );
298
+ case "wallet_addDeclareTransaction":
299
+ throw {
300
+ code: 63,
301
+ message: "An unexpected error occurred",
302
+ data: "wallet_addDeclareTransaction not implemented"
303
+ };
304
+ case "wallet_signTypedData": {
305
+ if (!this.account) {
260
306
  throw {
261
307
  code: 63,
262
308
  message: "An unexpected error occurred",
263
- data: `Unknown RPC call type: ${call.type}`
309
+ data: "Account not initialized"
264
310
  };
311
+ }
312
+ return await this.account.signMessage(call.params);
265
313
  }
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
- }
314
+ case "wallet_supportedSpecs":
315
+ return [];
316
+ case "wallet_supportedWalletApi":
317
+ return [];
318
+ default:
319
+ throw {
320
+ code: 63,
321
+ message: "An unexpected error occurred",
322
+ data: `Unknown RPC call type: ${call.type}`
323
+ };
324
+ }
325
+ };
326
+ on = (event, handler) => {
327
+ if (event !== "accountsChanged" && event !== "networkChanged") {
328
+ throw new Error(`Unknown event: ${event}`);
329
+ }
330
+ this.subscriptions.push({ type: event, handler });
331
+ };
332
+ off = (event, handler) => {
333
+ if (event !== "accountsChanged" && event !== "networkChanged") {
334
+ throw new Error(`Unknown event: ${event}`);
335
+ }
336
+ const idx = this.subscriptions.findIndex(
337
+ (sub) => sub.type === event && sub.handler === handler
338
+ );
339
+ if (idx >= 0) {
340
+ this.subscriptions.splice(idx, 1);
341
+ }
342
+ };
285
343
  emitNetworkChanged(chainId) {
286
344
  this.subscriptions.filter((sub) => sub.type === "networkChanged").forEach((sub) => {
287
345
  sub.handler(chainId);
@@ -296,30 +354,92 @@ var BaseProvider = class {
296
354
 
297
355
  // src/session/provider.ts
298
356
  var SessionProvider = class extends BaseProvider {
299
- constructor({ rpc, chainId, policies, redirectUrl }) {
357
+ id = "controller_session";
358
+ name = "Controller Session";
359
+ _chainId;
360
+ _rpcUrl;
361
+ _username;
362
+ _redirectUrl;
363
+ _policies;
364
+ _keychainUrl;
365
+ constructor({
366
+ rpc,
367
+ chainId,
368
+ policies,
369
+ redirectUrl,
370
+ keychainUrl
371
+ }) {
300
372
  super();
301
- this.id = "controller_session";
302
- this.name = "Controller Session";
373
+ this._policies = {
374
+ verified: false,
375
+ contracts: policies.contracts ? Object.fromEntries(
376
+ Object.entries(policies.contracts).map(([address, contract]) => [
377
+ address,
378
+ {
379
+ ...contract,
380
+ methods: contract.methods.map((method) => ({
381
+ ...method,
382
+ authorized: true
383
+ }))
384
+ }
385
+ ])
386
+ ) : void 0,
387
+ messages: policies.messages?.map((message) => ({
388
+ ...message,
389
+ authorized: true
390
+ }))
391
+ };
303
392
  this._rpcUrl = rpc;
304
393
  this._chainId = chainId;
305
394
  this._redirectUrl = redirectUrl;
306
- this._policies = policies;
395
+ this._keychainUrl = keychainUrl || KEYCHAIN_URL;
307
396
  if (typeof window !== "undefined") {
308
397
  window.starknet_controller_session = this;
309
398
  }
310
399
  }
400
+ validatePoliciesSubset(newPolicies, existingPolicies) {
401
+ if (newPolicies.contracts) {
402
+ if (!existingPolicies.contracts) return false;
403
+ for (const [address, contract] of Object.entries(newPolicies.contracts)) {
404
+ const existingContract = existingPolicies.contracts[address];
405
+ if (!existingContract) return false;
406
+ for (const method of contract.methods) {
407
+ const existingMethod = existingContract.methods.find(
408
+ (m) => m.entrypoint === method.entrypoint
409
+ );
410
+ if (!existingMethod || !existingMethod.authorized) return false;
411
+ }
412
+ }
413
+ }
414
+ if (newPolicies.messages) {
415
+ if (!existingPolicies.messages) return false;
416
+ for (const message of newPolicies.messages) {
417
+ const existingMessage = existingPolicies.messages.find(
418
+ (m) => JSON.stringify(m.domain) === JSON.stringify(message.domain) && JSON.stringify(m.types) === JSON.stringify(message.types)
419
+ );
420
+ if (!existingMessage || !existingMessage.authorized) return false;
421
+ }
422
+ }
423
+ return true;
424
+ }
311
425
  async username() {
312
426
  await this.tryRetrieveFromQueryOrStorage();
313
427
  return this._username;
314
428
  }
315
429
  async probe() {
316
- await this.tryRetrieveFromQueryOrStorage();
317
- return;
430
+ if (this.account) {
431
+ return this.account;
432
+ }
433
+ this.account = await this.tryRetrieveFromQueryOrStorage();
434
+ return this.account;
318
435
  }
319
436
  async connect() {
320
- await this.tryRetrieveFromQueryOrStorage();
321
437
  if (this.account) {
322
- return;
438
+ return this.account;
439
+ }
440
+ this.account = await this.tryRetrieveFromQueryOrStorage();
441
+ if (this.account) {
442
+ return this.account;
323
443
  }
324
444
  const pk = stark.randomAddress();
325
445
  const publicKey = ec.starkCurve.getStarkKey(pk);
@@ -330,12 +450,13 @@ var SessionProvider = class extends BaseProvider {
330
450
  pubKey: publicKey
331
451
  })
332
452
  );
333
- const url = `${KEYCHAIN_URL}/session?public_key=${publicKey}&redirect_uri=${this._redirectUrl}&redirect_query_name=startapp&policies=${JSON.stringify(
453
+ localStorage.setItem("sessionPolicies", JSON.stringify(this._policies));
454
+ const url = `${this._keychainUrl}/session?public_key=${publicKey}&redirect_uri=${this._redirectUrl}&redirect_query_name=startapp&policies=${JSON.stringify(
334
455
  this._policies
335
456
  )}&rpc_url=${this._rpcUrl}`;
336
457
  localStorage.setItem("lastUsedConnector", this.id);
337
458
  window.open(url, "_blank");
338
- return;
459
+ return this.account;
339
460
  }
340
461
  switchStarknetChain(_chainId) {
341
462
  throw new Error("switchStarknetChain not implemented");
@@ -346,11 +467,15 @@ var SessionProvider = class extends BaseProvider {
346
467
  disconnect() {
347
468
  localStorage.removeItem("sessionSigner");
348
469
  localStorage.removeItem("session");
470
+ localStorage.removeItem("sessionPolicies");
349
471
  this.account = void 0;
350
472
  this._username = void 0;
351
473
  return Promise.resolve();
352
474
  }
353
475
  async tryRetrieveFromQueryOrStorage() {
476
+ if (this.account) {
477
+ return this.account;
478
+ }
354
479
  const signerString = localStorage.getItem("sessionSigner");
355
480
  const signer = signerString ? JSON.parse(signerString) : null;
356
481
  let sessionRegistration = null;
@@ -374,6 +499,41 @@ var SessionProvider = class extends BaseProvider {
374
499
  if (!sessionRegistration || !signer) {
375
500
  return;
376
501
  }
502
+ const expirationTime = parseInt(sessionRegistration.expiresAt) * 1e3;
503
+ console.log("Session expiration check:", {
504
+ expirationTime,
505
+ currentTime: Date.now(),
506
+ expired: Date.now() >= expirationTime
507
+ });
508
+ if (Date.now() >= expirationTime) {
509
+ console.log("Session expired, clearing stored session");
510
+ this.clearStoredSession();
511
+ return;
512
+ }
513
+ const storedPoliciesStr = localStorage.getItem("sessionPolicies");
514
+ console.log("Checking stored policies:", {
515
+ storedPoliciesStr,
516
+ currentPolicies: this._policies
517
+ });
518
+ if (storedPoliciesStr) {
519
+ const storedPolicies = JSON.parse(
520
+ storedPoliciesStr
521
+ );
522
+ const isValid = this.validatePoliciesSubset(
523
+ this._policies,
524
+ storedPolicies
525
+ );
526
+ console.log("Policy validation result:", {
527
+ isValid,
528
+ storedPolicies,
529
+ requestedPolicies: this._policies
530
+ });
531
+ if (!isValid) {
532
+ console.log("Policy validation failed, clearing stored session");
533
+ this.clearStoredSession();
534
+ return;
535
+ }
536
+ }
377
537
  this._username = sessionRegistration.username;
378
538
  this.account = new SessionAccount(this, {
379
539
  rpcUrl: this._rpcUrl,
@@ -386,6 +546,11 @@ var SessionProvider = class extends BaseProvider {
386
546
  });
387
547
  return this.account;
388
548
  }
549
+ clearStoredSession() {
550
+ localStorage.removeItem("sessionSigner");
551
+ localStorage.removeItem("session");
552
+ localStorage.removeItem("sessionPolicies");
553
+ }
389
554
  };
390
555
  export {
391
556
  SessionProvider as default