@cartridge/controller 0.5.8 → 0.6.0

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