@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
  ];
@@ -55,6 +59,7 @@ function toArray(val) {
55
59
 
56
60
  // src/session/account.ts
57
61
  var SessionAccount = class extends WalletAccount {
62
+ controller;
58
63
  constructor(provider, {
59
64
  rpcUrl,
60
65
  privateKey,
@@ -65,6 +70,7 @@ var SessionAccount = class extends WalletAccount {
65
70
  policies
66
71
  }) {
67
72
  super({ nodeUrl: rpcUrl }, provider);
73
+ this.address = address;
68
74
  this.controller = CartridgeSessionAccount.new_as_registered(
69
75
  rpcUrl,
70
76
  privateKey,
@@ -105,7 +111,7 @@ import {
105
111
  // package.json
106
112
  var package_default = {
107
113
  name: "@cartridge/controller",
108
- version: "0.5.8",
114
+ version: "0.6.0",
109
115
  description: "Cartridge Controller",
110
116
  module: "dist/index.js",
111
117
  types: "dist/index.d.ts",
@@ -115,13 +121,26 @@ var package_default = {
115
121
  build: "pnpm build:deps",
116
122
  format: 'prettier --write "src/**/*.ts"',
117
123
  "format:check": 'prettier --check "src/**/*.ts"',
124
+ test: "jest",
118
125
  version: "pnpm pkg get version"
119
126
  },
120
127
  exports: {
121
- ".": "./dist/index.js",
122
- "./session": "./dist/session/index.js",
123
- "./provider": "./dist/provider/index.js",
124
- "./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
+ }
125
144
  },
126
145
  tsup: {
127
146
  entry: [
@@ -134,6 +153,9 @@ var package_default = {
134
153
  sourcemap: true,
135
154
  clean: true
136
155
  },
156
+ peerDependencies: {
157
+ starknet: "^6.21.0"
158
+ },
137
159
  dependencies: {
138
160
  "@cartridge/account-wasm": "workspace:*",
139
161
  "@cartridge/penpal": "^6.2.3",
@@ -142,12 +164,14 @@ var package_default = {
142
164
  base64url: "^3.0.1",
143
165
  "cbor-x": "^1.5.0",
144
166
  "fast-deep-equal": "^3.1.3",
145
- "query-string": "^7.1.1",
146
- starknet: "^6.11.0"
167
+ "query-string": "^7.1.1"
147
168
  },
148
169
  devDependencies: {
149
170
  "@cartridge/tsconfig": "workspace:*",
171
+ "@types/jest": "^29.5.14",
150
172
  "@types/node": "^20.6.0",
173
+ jest: "^29.7.0",
174
+ "ts-jest": "^29.2.5",
151
175
  typescript: "^5.4.5"
152
176
  }
153
177
  };
@@ -155,127 +179,167 @@ var package_default = {
155
179
  // src/icon.ts
156
180
  var icon = "data:image/png;base64,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";
157
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
+
158
201
  // src/provider.ts
202
+ var mutex = new Mutex();
159
203
  var BaseProvider = class {
160
- constructor() {
161
- this.id = "controller";
162
- this.name = "Controller";
163
- this.version = package_default.version;
164
- this.icon = icon;
165
- this.subscriptions = [];
166
- this.request = async (call) => {
167
- switch (call.type) {
168
- case "wallet_getPermissions":
169
- await this.probe();
170
- if (this.account) {
171
- return [Permission.ACCOUNTS];
172
- }
173
- return [];
174
- case "wallet_requestAccounts": {
175
- if (this.account) {
176
- return [this.account.address];
177
- }
178
- const silentMode = call.params && call.params.silent_mode;
179
- this.account = await this.probe();
180
- if (!this.account && !silentMode) {
181
- this.account = await this.connect();
182
- }
183
- if (this.account) {
184
- return [this.account.address];
185
- }
186
- 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];
187
237
  }
188
- case "wallet_watchAsset":
189
- throw {
190
- code: 63,
191
- message: "An unexpected error occurred",
192
- data: "wallet_watchAsset not implemented"
193
- };
194
- case "wallet_addStarknetChain": {
195
- let params2 = call.params;
196
- return this.addStarknetChain(params2);
238
+ return [];
239
+ case "wallet_requestAccounts": {
240
+ if (this.account) {
241
+ return [this.account.address];
197
242
  }
198
- case "wallet_switchStarknetChain": {
199
- let params2 = call.params;
200
- 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();
201
247
  }
202
- case "wallet_requestChainId":
203
- if (!this.account) {
204
- throw {
205
- code: 63,
206
- message: "An unexpected error occurred",
207
- data: "Account not initialized"
208
- };
209
- }
210
- return await this.account.getChainId();
211
- 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) {
212
269
  throw {
213
270
  code: 63,
214
271
  message: "An unexpected error occurred",
215
- data: "wallet_deploymentData not implemented"
272
+ data: "Account not initialized"
216
273
  };
217
- case "wallet_addInvokeTransaction":
218
- if (!this.account) {
219
- throw {
220
- code: 63,
221
- message: "An unexpected error occurred",
222
- data: "Account not initialized"
223
- };
224
- }
225
- let params = call.params;
226
- return await this.account.execute(
227
- params.calls.map((call2) => ({
228
- contractAddress: call2.contract_address,
229
- entrypoint: call2.entry_point,
230
- calldata: call2.calldata
231
- }))
232
- );
233
- 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) {
234
284
  throw {
235
285
  code: 63,
236
286
  message: "An unexpected error occurred",
237
- data: "wallet_addDeclareTransaction not implemented"
287
+ data: "Account not initialized"
238
288
  };
239
- case "wallet_signTypedData": {
240
- if (!this.account) {
241
- throw {
242
- code: 63,
243
- message: "An unexpected error occurred",
244
- data: "Account not initialized"
245
- };
246
- }
247
- return await this.account.signMessage(call.params);
248
289
  }
249
- case "wallet_supportedSpecs":
250
- return [];
251
- case "wallet_supportedWalletApi":
252
- return [];
253
- 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) {
254
306
  throw {
255
307
  code: 63,
256
308
  message: "An unexpected error occurred",
257
- data: `Unknown RPC call type: ${call.type}`
309
+ data: "Account not initialized"
258
310
  };
311
+ }
312
+ return await this.account.signMessage(call.params);
259
313
  }
260
- };
261
- this.on = (event, handler) => {
262
- if (event !== "accountsChanged" && event !== "networkChanged") {
263
- throw new Error(`Unknown event: ${event}`);
264
- }
265
- this.subscriptions.push({ type: event, handler });
266
- };
267
- this.off = (event, handler) => {
268
- if (event !== "accountsChanged" && event !== "networkChanged") {
269
- throw new Error(`Unknown event: ${event}`);
270
- }
271
- const idx = this.subscriptions.findIndex(
272
- (sub) => sub.type === event && sub.handler === handler
273
- );
274
- if (idx >= 0) {
275
- this.subscriptions.splice(idx, 1);
276
- }
277
- };
278
- }
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
+ };
279
343
  emitNetworkChanged(chainId) {
280
344
  this.subscriptions.filter((sub) => sub.type === "networkChanged").forEach((sub) => {
281
345
  sub.handler(chainId);
@@ -290,30 +354,92 @@ var BaseProvider = class {
290
354
 
291
355
  // src/session/provider.ts
292
356
  var SessionProvider = class extends BaseProvider {
293
- 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
+ }) {
294
372
  super();
295
- this.id = "controller_session";
296
- 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
+ };
297
392
  this._rpcUrl = rpc;
298
393
  this._chainId = chainId;
299
394
  this._redirectUrl = redirectUrl;
300
- this._policies = policies;
395
+ this._keychainUrl = keychainUrl || KEYCHAIN_URL;
301
396
  if (typeof window !== "undefined") {
302
397
  window.starknet_controller_session = this;
303
398
  }
304
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
+ }
305
425
  async username() {
306
426
  await this.tryRetrieveFromQueryOrStorage();
307
427
  return this._username;
308
428
  }
309
429
  async probe() {
310
- await this.tryRetrieveFromQueryOrStorage();
311
- return;
430
+ if (this.account) {
431
+ return this.account;
432
+ }
433
+ this.account = await this.tryRetrieveFromQueryOrStorage();
434
+ return this.account;
312
435
  }
313
436
  async connect() {
314
- await this.tryRetrieveFromQueryOrStorage();
315
437
  if (this.account) {
316
- return;
438
+ return this.account;
439
+ }
440
+ this.account = await this.tryRetrieveFromQueryOrStorage();
441
+ if (this.account) {
442
+ return this.account;
317
443
  }
318
444
  const pk = stark.randomAddress();
319
445
  const publicKey = ec.starkCurve.getStarkKey(pk);
@@ -324,12 +450,13 @@ var SessionProvider = class extends BaseProvider {
324
450
  pubKey: publicKey
325
451
  })
326
452
  );
327
- 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(
328
455
  this._policies
329
456
  )}&rpc_url=${this._rpcUrl}`;
330
457
  localStorage.setItem("lastUsedConnector", this.id);
331
458
  window.open(url, "_blank");
332
- return;
459
+ return this.account;
333
460
  }
334
461
  switchStarknetChain(_chainId) {
335
462
  throw new Error("switchStarknetChain not implemented");
@@ -340,11 +467,15 @@ var SessionProvider = class extends BaseProvider {
340
467
  disconnect() {
341
468
  localStorage.removeItem("sessionSigner");
342
469
  localStorage.removeItem("session");
470
+ localStorage.removeItem("sessionPolicies");
343
471
  this.account = void 0;
344
472
  this._username = void 0;
345
473
  return Promise.resolve();
346
474
  }
347
475
  async tryRetrieveFromQueryOrStorage() {
476
+ if (this.account) {
477
+ return this.account;
478
+ }
348
479
  const signerString = localStorage.getItem("sessionSigner");
349
480
  const signer = signerString ? JSON.parse(signerString) : null;
350
481
  let sessionRegistration = null;
@@ -368,6 +499,41 @@ var SessionProvider = class extends BaseProvider {
368
499
  if (!sessionRegistration || !signer) {
369
500
  return;
370
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
+ }
371
537
  this._username = sessionRegistration.username;
372
538
  this.account = new SessionAccount(this, {
373
539
  rpcUrl: this._rpcUrl,
@@ -380,6 +546,11 @@ var SessionProvider = class extends BaseProvider {
380
546
  });
381
547
  return this.account;
382
548
  }
549
+ clearStoredSession() {
550
+ localStorage.removeItem("sessionSigner");
551
+ localStorage.removeItem("session");
552
+ localStorage.removeItem("sessionPolicies");
553
+ }
383
554
  };
384
555
  export {
385
556
  SessionProvider as default