@cartridge/controller 0.10.4 → 0.10.6

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/dist/session.js CHANGED
@@ -1,39 +1,39 @@
1
- import { WalletAccount as h, stark as m, ec as p, encode as S } from "starknet";
2
- import { signerToGuid as g, subscribeCreateSession as f } from "@cartridge/controller-wasm";
1
+ import { WalletAccount as y, stark as h, ec as p, encode as d } from "starknet";
2
+ import { signerToGuid as u, subscribeCreateSession as g } from "@cartridge/controller-wasm";
3
3
  export * from "@cartridge/controller-wasm";
4
- import { n as y, B as _, K as w, b as v } from "./provider-PftcmETC.js";
5
- import { F as J, N as R, R as P, S as G } from "./provider-PftcmETC.js";
4
+ import { n as f, B as _, K as w, A as v, b as K } from "./provider-BgBI_LQl.js";
5
+ import { F as R, N as J, R as P, S as F } from "./provider-BgBI_LQl.js";
6
6
  import { CartridgeSessionAccount as I } from "@cartridge/controller-wasm/session";
7
- class O extends h {
7
+ class b extends y {
8
8
  controller;
9
9
  constructor(t, {
10
- rpcUrl: r,
10
+ rpcUrl: i,
11
11
  privateKey: e,
12
- address: n,
13
- ownerGuid: i,
14
- chainId: a,
15
- expiresAt: s,
16
- policies: o,
17
- guardianKeyGuid: c,
12
+ address: s,
13
+ ownerGuid: o,
14
+ chainId: c,
15
+ expiresAt: n,
16
+ policies: r,
17
+ guardianKeyGuid: a,
18
18
  metadataHash: l,
19
- sessionKeyGuid: u
19
+ sessionKeyGuid: S
20
20
  }) {
21
21
  super({
22
- provider: { nodeUrl: r },
22
+ provider: { nodeUrl: i },
23
23
  walletProvider: t,
24
- address: n
24
+ address: s
25
25
  }), this.controller = I.newAsRegistered(
26
- r,
27
- e,
28
- n,
29
26
  i,
30
- a,
27
+ e,
28
+ s,
29
+ o,
30
+ c,
31
31
  {
32
- expiresAt: s,
33
- policies: o,
34
- guardianKeyGuid: c,
32
+ expiresAt: n,
33
+ policies: r,
34
+ guardianKeyGuid: a,
35
35
  metadataHash: l,
36
- sessionKeyGuid: u
36
+ sessionKeyGuid: S
37
37
  }
38
38
  );
39
39
  }
@@ -50,10 +50,10 @@ class O extends h {
50
50
  * @returns response from addTransaction
51
51
  */
52
52
  async execute(t) {
53
- return this.controller.execute(y(t));
53
+ return this.controller.execute(f(t));
54
54
  }
55
55
  }
56
- class k extends _ {
56
+ class U extends _ {
57
57
  id = "controller_session";
58
58
  name = "Controller Session";
59
59
  _chainId;
@@ -63,55 +63,77 @@ class k extends _ {
63
63
  _policies;
64
64
  _keychainUrl;
65
65
  _apiUrl;
66
+ _publicKey;
67
+ _sessionKeyGuid;
68
+ reopenBrowser = !0;
66
69
  constructor({
67
70
  rpc: t,
68
- chainId: r,
71
+ chainId: i,
69
72
  policies: e,
70
- redirectUrl: n,
71
- keychainUrl: i,
72
- apiUrl: a
73
+ redirectUrl: s,
74
+ keychainUrl: o,
75
+ apiUrl: c
73
76
  }) {
74
- super(), this._policies = {
77
+ if (super(), this._policies = {
75
78
  verified: !1,
76
79
  contracts: e.contracts ? Object.fromEntries(
77
- Object.entries(e.contracts).map(([s, o]) => [
78
- s,
80
+ Object.entries(e.contracts).map(([r, a]) => [
81
+ r,
79
82
  {
80
- ...o,
81
- methods: o.methods.map((c) => ({
82
- ...c,
83
+ ...a,
84
+ methods: a.methods.map((l) => ({
85
+ ...l,
83
86
  authorized: !0
84
87
  }))
85
88
  }
86
89
  ])
87
90
  ) : void 0,
88
- messages: e.messages?.map((s) => ({
89
- ...s,
91
+ messages: e.messages?.map((r) => ({
92
+ ...r,
90
93
  authorized: !0
91
94
  }))
92
- }, this._rpcUrl = t, this._chainId = r, this._redirectUrl = n, this._keychainUrl = i || w, this._apiUrl = a, typeof window < "u" && (window.starknet_controller_session = this);
95
+ }, this._rpcUrl = t, this._chainId = i, this._redirectUrl = s, this._keychainUrl = o || w, this._apiUrl = c ?? v, this.tryRetrieveFromQueryOrStorage()) {
96
+ const r = localStorage.getItem("sessionSigner");
97
+ if (!r) throw new Error("failed to get sessionSigner");
98
+ const a = JSON.parse(r);
99
+ this._publicKey = a.pubKey, this._sessionKeyGuid = u({
100
+ starknet: { privateKey: d.addHexPrefix(a.privKey) }
101
+ });
102
+ } else {
103
+ const r = h.randomAddress();
104
+ this._publicKey = p.starkCurve.getStarkKey(r), localStorage.setItem(
105
+ "sessionSigner",
106
+ JSON.stringify({
107
+ privKey: r,
108
+ pubKey: this._publicKey
109
+ })
110
+ ), this._sessionKeyGuid = u({
111
+ starknet: { privateKey: d.addHexPrefix(r) }
112
+ });
113
+ }
114
+ typeof window < "u" && (window.starknet_controller_session = this);
93
115
  }
94
- validatePoliciesSubset(t, r) {
116
+ validatePoliciesSubset(t, i) {
95
117
  if (t.contracts) {
96
- if (!r.contracts) return !1;
97
- for (const [e, n] of Object.entries(t.contracts)) {
98
- const i = r.contracts[e];
99
- if (!i) return !1;
100
- for (const a of n.methods) {
101
- const s = i.methods.find(
102
- (o) => o.entrypoint === a.entrypoint
118
+ if (!i.contracts) return !1;
119
+ for (const [e, s] of Object.entries(t.contracts)) {
120
+ const o = i.contracts[e];
121
+ if (!o) return !1;
122
+ for (const c of s.methods) {
123
+ const n = o.methods.find(
124
+ (r) => r.entrypoint === c.entrypoint
103
125
  );
104
- if (!s || !s.authorized) return !1;
126
+ if (!n || !n.authorized) return !1;
105
127
  }
106
128
  }
107
129
  }
108
130
  if (t.messages) {
109
- if (!r.messages) return !1;
131
+ if (!i.messages) return !1;
110
132
  for (const e of t.messages) {
111
- const n = r.messages.find(
112
- (i) => JSON.stringify(i.domain) === JSON.stringify(e.domain) && JSON.stringify(i.types) === JSON.stringify(e.types)
133
+ const s = i.messages.find(
134
+ (o) => JSON.stringify(o.domain) === JSON.stringify(e.domain) && JSON.stringify(o.types) === JSON.stringify(e.types)
113
135
  );
114
- if (!n || !n.authorized) return !1;
136
+ if (!s || !s.authorized) return !1;
115
137
  }
116
138
  }
117
139
  return !0;
@@ -120,44 +142,46 @@ class k extends _ {
120
142
  return await this.tryRetrieveFromQueryOrStorage(), this._username;
121
143
  }
122
144
  async probe() {
123
- return this.account ? this.account : (this.account = await this.tryRetrieveFromQueryOrStorage(), this.account);
145
+ return this.account ? this.account : (this.account = this.tryRetrieveFromQueryOrStorage(), this.account);
124
146
  }
125
147
  async connect() {
126
148
  if (this.account)
127
149
  return this.account;
128
- if (this.account = await this.tryRetrieveFromQueryOrStorage(), this.account)
150
+ if (this.account = this.tryRetrieveFromQueryOrStorage(), this.account)
129
151
  return this.account;
130
- const t = m.randomAddress(), r = p.starkCurve.getStarkKey(t);
131
- localStorage.setItem(
132
- "sessionSigner",
133
- JSON.stringify({
134
- privKey: t,
135
- pubKey: r
136
- })
137
- ), localStorage.setItem("sessionPolicies", JSON.stringify(this._policies));
138
- const e = `${this._keychainUrl}/session?public_key=${r}&redirect_uri=${this._redirectUrl}&redirect_query_name=startapp&policies=${JSON.stringify(
139
- this._policies
140
- )}&rpc_url=${this._rpcUrl}`;
141
- localStorage.setItem("lastUsedConnector", this.id);
142
- const n = window.open(e, "_blank");
152
+ localStorage.setItem("sessionPolicies", JSON.stringify(this._policies)), localStorage.setItem("lastUsedConnector", this.id);
143
153
  try {
144
- const i = S.addHexPrefix(t), a = g({
145
- starknet: { privateKey: i }
146
- }), s = this._apiUrl ?? "https://api.cartridge.gg", o = await f(
147
- a,
148
- s
149
- ), c = o.authorization[1], l = {
150
- username: o.controller.accountID,
151
- address: o.controller.address,
152
- ownerGuid: c,
153
- expiresAt: o.expiresAt,
154
+ if (this.reopenBrowser) {
155
+ const s = h.randomAddress();
156
+ this._publicKey = p.starkCurve.getStarkKey(s), localStorage.setItem(
157
+ "sessionSigner",
158
+ JSON.stringify({
159
+ privKey: s,
160
+ pubKey: this._publicKey
161
+ })
162
+ ), this._sessionKeyGuid = u({
163
+ starknet: { privateKey: d.addHexPrefix(s) }
164
+ });
165
+ const o = `${this._keychainUrl}/session?public_key=${this._publicKey}&redirect_uri=${this._redirectUrl}&redirect_query_name=startapp&policies=${JSON.stringify(
166
+ this._policies
167
+ )}&rpc_url=${this._rpcUrl}`;
168
+ window.open(o, "_blank");
169
+ }
170
+ const t = await g(
171
+ this._sessionKeyGuid,
172
+ this._apiUrl
173
+ ), i = t.authorization[1], e = {
174
+ username: t.controller.accountID,
175
+ address: t.controller.address,
176
+ ownerGuid: i,
177
+ expiresAt: t.expiresAt,
154
178
  guardianKeyGuid: "0x0",
155
179
  metadataHash: "0x0",
156
- sessionKeyGuid: a
180
+ sessionKeyGuid: this._sessionKeyGuid
157
181
  };
158
- return localStorage.setItem("session", JSON.stringify(l)), this.tryRetrieveFromQueryOrStorage(), n?.close(), this.account;
159
- } catch (i) {
160
- console.log(i);
182
+ return localStorage.setItem("session", JSON.stringify(e)), this.tryRetrieveFromQueryOrStorage(), this.account;
183
+ } catch (t) {
184
+ throw console.log(t), t;
161
185
  }
162
186
  }
163
187
  switchStarknetChain(t) {
@@ -167,53 +191,61 @@ class k extends _ {
167
191
  throw new Error("addStarknetChain not implemented");
168
192
  }
169
193
  disconnect() {
170
- return localStorage.removeItem("sessionSigner"), localStorage.removeItem("session"), localStorage.removeItem("sessionPolicies"), this.account = void 0, this._username = void 0, Promise.resolve();
194
+ localStorage.removeItem("sessionSigner"), localStorage.removeItem("session"), localStorage.removeItem("sessionPolicies"), this.account = void 0, this._username = void 0;
195
+ const t = window.open(`${this._keychainUrl}/disconnect`);
196
+ if (t === null) return Promise.resolve();
197
+ const { resolve: i, promise: e } = Promise.withResolvers();
198
+ function s() {
199
+ t?.closed && (i(), clearInterval(o));
200
+ }
201
+ const o = setInterval(s, 500);
202
+ return e;
171
203
  }
172
- async tryRetrieveFromQueryOrStorage() {
204
+ tryRetrieveFromQueryOrStorage() {
173
205
  if (this.account)
174
206
  return this.account;
175
- const t = localStorage.getItem("sessionSigner"), r = t ? JSON.parse(t) : null;
207
+ const t = localStorage.getItem("sessionSigner"), i = t ? JSON.parse(t) : null;
176
208
  let e = null;
177
- const n = localStorage.getItem("session");
178
- if (n && (e = JSON.parse(n)), window.location.search.includes("startapp")) {
179
- const s = new URLSearchParams(window.location.search), o = s.get("startapp");
180
- if (o) {
181
- const c = JSON.parse(
182
- atob(o)
209
+ const s = localStorage.getItem("session");
210
+ if (s && (e = JSON.parse(s)), window.location.search.includes("startapp")) {
211
+ const n = new URLSearchParams(window.location.search), r = n.get("startapp");
212
+ if (r) {
213
+ const a = JSON.parse(
214
+ atob(r)
183
215
  );
184
- Number(c.expiresAt) !== Number(e?.expiresAt) && (e = c, localStorage.setItem("session", JSON.stringify(e))), s.delete("startapp");
185
- const l = window.location.pathname + (s.toString() ? `?${s.toString()}` : "") + window.location.hash;
216
+ Number(a.expiresAt) !== Number(e?.expiresAt) && (e = a, localStorage.setItem("session", JSON.stringify(e))), n.delete("startapp");
217
+ const l = window.location.pathname + (n.toString() ? `?${n.toString()}` : "") + window.location.hash;
186
218
  window.history.replaceState({}, document.title, l);
187
219
  }
188
220
  }
189
- if (!e || !r)
221
+ if (!e || !i)
190
222
  return;
191
- const i = parseInt(e.expiresAt) * 1e3;
192
- if (Date.now() >= i) {
223
+ const o = parseInt(e.expiresAt) * 1e3;
224
+ if (Date.now() >= o) {
193
225
  this.clearStoredSession();
194
226
  return;
195
227
  }
196
- const a = localStorage.getItem("sessionPolicies");
197
- if (a) {
198
- const s = JSON.parse(
199
- a
228
+ const c = localStorage.getItem("sessionPolicies");
229
+ if (c) {
230
+ const n = JSON.parse(
231
+ c
200
232
  );
201
233
  if (!this.validatePoliciesSubset(
202
234
  this._policies,
203
- s
235
+ n
204
236
  )) {
205
237
  this.clearStoredSession();
206
238
  return;
207
239
  }
208
240
  }
209
- return this._username = e.username, this.account = new O(this, {
241
+ return this._username = e.username, this.account = new b(this, {
210
242
  rpcUrl: this._rpcUrl,
211
- privateKey: r.privKey,
243
+ privateKey: i.privKey,
212
244
  address: e.address,
213
245
  ownerGuid: e.ownerGuid,
214
246
  chainId: this._chainId,
215
247
  expiresAt: parseInt(e.expiresAt),
216
- policies: v(this._policies),
248
+ policies: K(this._policies),
217
249
  guardianKeyGuid: e.guardianKeyGuid,
218
250
  metadataHash: e.metadataHash,
219
251
  sessionKeyGuid: e.sessionKeyGuid
@@ -224,10 +256,10 @@ class k extends _ {
224
256
  }
225
257
  }
226
258
  export {
227
- J as FeeSource,
228
- R as NotReadyToConnect,
259
+ R as FeeSource,
260
+ J as NotReadyToConnect,
229
261
  P as ResponseCodes,
230
- G as StarterPackItemType,
231
- k as default
262
+ F as StarterPackItemType,
263
+ U as default
232
264
  };
233
265
  //# sourceMappingURL=session.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"session.js","sources":["../src/session/account.ts","../src/session/provider.ts"],"sourcesContent":["import { Policy } from \"@cartridge/controller-wasm\";\nimport { CartridgeSessionAccount } from \"@cartridge/controller-wasm/session\";\nimport { Call, InvokeFunctionResponse, WalletAccount } from \"starknet\";\n\nimport { normalizeCalls } from \"../utils\";\nimport BaseProvider from \"../provider\";\n\nexport * from \"../errors\";\nexport * from \"../types\";\n\nexport default class SessionAccount extends WalletAccount {\n public controller: CartridgeSessionAccount;\n\n constructor(\n provider: BaseProvider,\n {\n rpcUrl,\n privateKey,\n address,\n ownerGuid,\n chainId,\n expiresAt,\n policies,\n guardianKeyGuid,\n metadataHash,\n sessionKeyGuid,\n }: {\n rpcUrl: string;\n privateKey: string;\n address: string;\n ownerGuid: string;\n chainId: string;\n expiresAt: number;\n policies: Policy[];\n guardianKeyGuid: string;\n metadataHash: string;\n sessionKeyGuid: string;\n },\n ) {\n super({\n provider: { nodeUrl: rpcUrl },\n walletProvider: provider,\n address,\n });\n\n this.controller = CartridgeSessionAccount.newAsRegistered(\n rpcUrl,\n privateKey,\n address,\n ownerGuid,\n chainId,\n {\n expiresAt,\n policies,\n guardianKeyGuid,\n metadataHash,\n sessionKeyGuid,\n },\n );\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: Call | Call[]): Promise<InvokeFunctionResponse> {\n return this.controller.execute(normalizeCalls(calls));\n }\n}\n","import { ec, stark, WalletAccount } from \"starknet\";\n\nimport {\n signerToGuid,\n subscribeCreateSession,\n} from \"@cartridge/controller-wasm\";\nimport { SessionPolicies } from \"@cartridge/presets\";\nimport { AddStarknetChainParameters } from \"@starknet-io/types-js\";\nimport { encode } from \"starknet\";\nimport { KEYCHAIN_URL } from \"../constants\";\nimport { ParsedSessionPolicies } from \"../policies\";\nimport BaseProvider from \"../provider\";\nimport { toWasmPolicies } from \"../utils\";\nimport SessionAccount from \"./account\";\n\ninterface SessionRegistration {\n username: string;\n address: string;\n ownerGuid: string;\n transactionHash?: string;\n expiresAt: string;\n guardianKeyGuid: string;\n metadataHash: string;\n sessionKeyGuid: string;\n}\n\nexport type SessionOptions = {\n rpc: string;\n chainId: string;\n policies: SessionPolicies;\n redirectUrl: string;\n keychainUrl?: string;\n apiUrl?: string;\n};\n\nexport default class SessionProvider extends BaseProvider {\n public id = \"controller_session\";\n public name = \"Controller Session\";\n\n protected _chainId: string;\n protected _rpcUrl: string;\n protected _username?: string;\n protected _redirectUrl: string;\n protected _policies: ParsedSessionPolicies;\n protected _keychainUrl: string;\n protected _apiUrl?: string;\n\n constructor({\n rpc,\n chainId,\n policies,\n redirectUrl,\n keychainUrl,\n apiUrl,\n }: SessionOptions) {\n super();\n\n this._policies = {\n verified: false,\n contracts: policies.contracts\n ? Object.fromEntries(\n Object.entries(policies.contracts).map(([address, contract]) => [\n address,\n {\n ...contract,\n methods: contract.methods.map((method) => ({\n ...method,\n authorized: true,\n })),\n },\n ]),\n )\n : undefined,\n messages: policies.messages?.map((message) => ({\n ...message,\n authorized: true,\n })),\n };\n\n this._rpcUrl = rpc;\n this._chainId = chainId;\n this._redirectUrl = redirectUrl;\n this._keychainUrl = keychainUrl || KEYCHAIN_URL;\n this._apiUrl = apiUrl;\n\n if (typeof window !== \"undefined\") {\n (window as any).starknet_controller_session = this;\n }\n }\n\n private validatePoliciesSubset(\n newPolicies: ParsedSessionPolicies,\n existingPolicies: ParsedSessionPolicies,\n ): boolean {\n if (newPolicies.contracts) {\n if (!existingPolicies.contracts) return false;\n\n for (const [address, contract] of Object.entries(newPolicies.contracts)) {\n const existingContract = existingPolicies.contracts[address];\n if (!existingContract) return false;\n\n for (const method of contract.methods) {\n const existingMethod = existingContract.methods.find(\n (m) => m.entrypoint === method.entrypoint,\n );\n if (!existingMethod || !existingMethod.authorized) return false;\n }\n }\n }\n\n if (newPolicies.messages) {\n if (!existingPolicies.messages) return false;\n\n for (const message of newPolicies.messages) {\n const existingMessage = existingPolicies.messages.find(\n (m) =>\n JSON.stringify(m.domain) === JSON.stringify(message.domain) &&\n JSON.stringify(m.types) === JSON.stringify(message.types),\n );\n if (!existingMessage || !existingMessage.authorized) return false;\n }\n }\n\n return true;\n }\n\n async username() {\n await this.tryRetrieveFromQueryOrStorage();\n return this._username;\n }\n\n async probe(): Promise<WalletAccount | undefined> {\n if (this.account) {\n return this.account;\n }\n\n this.account = await this.tryRetrieveFromQueryOrStorage();\n return this.account;\n }\n\n async connect(): Promise<WalletAccount | undefined> {\n if (this.account) {\n return this.account;\n }\n\n this.account = await this.tryRetrieveFromQueryOrStorage();\n if (this.account) {\n return this.account;\n }\n\n const pk = stark.randomAddress();\n const publicKey = ec.starkCurve.getStarkKey(pk);\n\n localStorage.setItem(\n \"sessionSigner\",\n JSON.stringify({\n privKey: pk,\n pubKey: publicKey,\n }),\n );\n\n localStorage.setItem(\"sessionPolicies\", JSON.stringify(this._policies));\n\n const url = `${\n this._keychainUrl\n }/session?public_key=${publicKey}&redirect_uri=${\n this._redirectUrl\n }&redirect_query_name=startapp&policies=${JSON.stringify(\n this._policies,\n )}&rpc_url=${this._rpcUrl}`;\n\n localStorage.setItem(\"lastUsedConnector\", this.id);\n const openedWindow = window.open(url, \"_blank\");\n\n try {\n const formattedPk = encode.addHexPrefix(pk);\n\n const sessionKeyGuid = signerToGuid({\n starknet: { privateKey: formattedPk },\n });\n\n const cartridgeApiUrl = this._apiUrl ?? \"https://api.cartridge.gg\";\n const sessionResult = await subscribeCreateSession(\n sessionKeyGuid,\n cartridgeApiUrl,\n );\n\n // auth is: [shortstring!('authorization-by-registered'), owner_guid]\n const ownerGuid = sessionResult.authorization[1];\n const session: SessionRegistration = {\n username: sessionResult.controller.accountID,\n address: sessionResult.controller.address,\n ownerGuid,\n expiresAt: sessionResult.expiresAt,\n guardianKeyGuid: \"0x0\",\n metadataHash: \"0x0\",\n sessionKeyGuid,\n };\n localStorage.setItem(\"session\", JSON.stringify(session));\n\n this.tryRetrieveFromQueryOrStorage();\n\n openedWindow?.close();\n\n return this.account;\n } catch (e) {\n console.log(e);\n }\n }\n\n switchStarknetChain(_chainId: string): Promise<boolean> {\n throw new Error(\"switchStarknetChain not implemented\");\n }\n\n addStarknetChain(_chain: AddStarknetChainParameters): Promise<boolean> {\n throw new Error(\"addStarknetChain not implemented\");\n }\n\n disconnect(): Promise<void> {\n localStorage.removeItem(\"sessionSigner\");\n localStorage.removeItem(\"session\");\n localStorage.removeItem(\"sessionPolicies\");\n this.account = undefined;\n this._username = undefined;\n return Promise.resolve();\n }\n\n async tryRetrieveFromQueryOrStorage() {\n if (this.account) {\n return this.account;\n }\n\n const signerString = localStorage.getItem(\"sessionSigner\");\n const signer = signerString ? JSON.parse(signerString) : null;\n let sessionRegistration: SessionRegistration | null = null;\n\n const sessionString = localStorage.getItem(\"session\");\n if (sessionString) {\n sessionRegistration = JSON.parse(sessionString);\n }\n\n if (window.location.search.includes(\"startapp\")) {\n const params = new URLSearchParams(window.location.search);\n const session = params.get(\"startapp\");\n if (session) {\n const possibleNewSession: SessionRegistration = JSON.parse(\n atob(session),\n );\n\n if (\n Number(possibleNewSession.expiresAt) !==\n Number(sessionRegistration?.expiresAt)\n ) {\n sessionRegistration = possibleNewSession;\n localStorage.setItem(\"session\", JSON.stringify(sessionRegistration));\n }\n\n // Remove the session query parameter\n params.delete(\"startapp\");\n const newUrl =\n window.location.pathname +\n (params.toString() ? `?${params.toString()}` : \"\") +\n window.location.hash;\n window.history.replaceState({}, document.title, newUrl);\n }\n }\n\n if (!sessionRegistration || !signer) {\n return;\n }\n\n // Check expiration\n const expirationTime = parseInt(sessionRegistration.expiresAt) * 1000;\n if (Date.now() >= expirationTime) {\n this.clearStoredSession();\n return;\n }\n\n // Check stored policies\n const storedPoliciesStr = localStorage.getItem(\"sessionPolicies\");\n if (storedPoliciesStr) {\n const storedPolicies = JSON.parse(\n storedPoliciesStr,\n ) as ParsedSessionPolicies;\n\n const isValid = this.validatePoliciesSubset(\n this._policies,\n storedPolicies,\n );\n\n if (!isValid) {\n this.clearStoredSession();\n return;\n }\n }\n\n this._username = sessionRegistration.username;\n this.account = new SessionAccount(this, {\n rpcUrl: this._rpcUrl,\n privateKey: signer.privKey,\n address: sessionRegistration.address,\n ownerGuid: sessionRegistration.ownerGuid,\n chainId: this._chainId,\n expiresAt: parseInt(sessionRegistration.expiresAt),\n policies: toWasmPolicies(this._policies),\n guardianKeyGuid: sessionRegistration.guardianKeyGuid,\n metadataHash: sessionRegistration.metadataHash,\n sessionKeyGuid: sessionRegistration.sessionKeyGuid,\n });\n\n return this.account;\n }\n\n private clearStoredSession(): void {\n localStorage.removeItem(\"sessionSigner\");\n localStorage.removeItem(\"session\");\n localStorage.removeItem(\"sessionPolicies\");\n }\n}\n"],"names":["SessionAccount","WalletAccount","provider","rpcUrl","privateKey","address","ownerGuid","chainId","expiresAt","policies","guardianKeyGuid","metadataHash","sessionKeyGuid","CartridgeSessionAccount","calls","normalizeCalls","SessionProvider","BaseProvider","rpc","redirectUrl","keychainUrl","apiUrl","contract","method","message","KEYCHAIN_URL","newPolicies","existingPolicies","existingContract","existingMethod","m","existingMessage","pk","stark","publicKey","ec","url","openedWindow","formattedPk","encode","signerToGuid","cartridgeApiUrl","sessionResult","subscribeCreateSession","session","e","_chainId","_chain","signerString","signer","sessionRegistration","sessionString","params","possibleNewSession","newUrl","expirationTime","storedPoliciesStr","storedPolicies","toWasmPolicies"],"mappings":"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"}
1
+ {"version":3,"file":"session.js","sources":["../src/session/account.ts","../src/session/provider.ts"],"sourcesContent":["import { Policy } from \"@cartridge/controller-wasm\";\nimport { CartridgeSessionAccount } from \"@cartridge/controller-wasm/session\";\nimport { Call, InvokeFunctionResponse, WalletAccount } from \"starknet\";\n\nimport { normalizeCalls } from \"../utils\";\nimport BaseProvider from \"../provider\";\n\nexport * from \"../errors\";\nexport * from \"../types\";\n\nexport default class SessionAccount extends WalletAccount {\n public controller: CartridgeSessionAccount;\n\n constructor(\n provider: BaseProvider,\n {\n rpcUrl,\n privateKey,\n address,\n ownerGuid,\n chainId,\n expiresAt,\n policies,\n guardianKeyGuid,\n metadataHash,\n sessionKeyGuid,\n }: {\n rpcUrl: string;\n privateKey: string;\n address: string;\n ownerGuid: string;\n chainId: string;\n expiresAt: number;\n policies: Policy[];\n guardianKeyGuid: string;\n metadataHash: string;\n sessionKeyGuid: string;\n },\n ) {\n super({\n provider: { nodeUrl: rpcUrl },\n walletProvider: provider,\n address,\n });\n\n this.controller = CartridgeSessionAccount.newAsRegistered(\n rpcUrl,\n privateKey,\n address,\n ownerGuid,\n chainId,\n {\n expiresAt,\n policies,\n guardianKeyGuid,\n metadataHash,\n sessionKeyGuid,\n },\n );\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: Call | Call[]): Promise<InvokeFunctionResponse> {\n return this.controller.execute(normalizeCalls(calls));\n }\n}\n","import { ec, stark, WalletAccount } from \"starknet\";\n\nimport {\n signerToGuid,\n subscribeCreateSession,\n} from \"@cartridge/controller-wasm\";\nimport { SessionPolicies } from \"@cartridge/presets\";\nimport { AddStarknetChainParameters } from \"@starknet-io/types-js\";\nimport { encode } from \"starknet\";\nimport { API_URL, KEYCHAIN_URL } from \"../constants\";\nimport { ParsedSessionPolicies } from \"../policies\";\nimport BaseProvider from \"../provider\";\nimport { toWasmPolicies } from \"../utils\";\nimport SessionAccount from \"./account\";\n\ninterface SessionRegistration {\n username: string;\n address: string;\n ownerGuid: string;\n transactionHash?: string;\n expiresAt: string;\n guardianKeyGuid: string;\n metadataHash: string;\n sessionKeyGuid: string;\n}\n\nexport type SessionOptions = {\n rpc: string;\n chainId: string;\n policies: SessionPolicies;\n redirectUrl: string;\n keychainUrl?: string;\n apiUrl?: string;\n};\n\nexport default class SessionProvider extends BaseProvider {\n public id = \"controller_session\";\n public name = \"Controller Session\";\n\n protected _chainId: string;\n protected _rpcUrl: string;\n protected _username?: string;\n protected _redirectUrl: string;\n protected _policies: ParsedSessionPolicies;\n protected _keychainUrl: string;\n protected _apiUrl: string;\n protected _publicKey: string;\n protected _sessionKeyGuid: string;\n public reopenBrowser: boolean = true;\n\n constructor({\n rpc,\n chainId,\n policies,\n redirectUrl,\n keychainUrl,\n apiUrl,\n }: SessionOptions) {\n super();\n\n this._policies = {\n verified: false,\n contracts: policies.contracts\n ? Object.fromEntries(\n Object.entries(policies.contracts).map(([address, contract]) => [\n address,\n {\n ...contract,\n methods: contract.methods.map((method) => ({\n ...method,\n authorized: true,\n })),\n },\n ]),\n )\n : undefined,\n messages: policies.messages?.map((message) => ({\n ...message,\n authorized: true,\n })),\n };\n\n this._rpcUrl = rpc;\n this._chainId = chainId;\n this._redirectUrl = redirectUrl;\n this._keychainUrl = keychainUrl || KEYCHAIN_URL;\n this._apiUrl = apiUrl ?? API_URL;\n\n const account = this.tryRetrieveFromQueryOrStorage();\n if (!account) {\n const pk = stark.randomAddress();\n this._publicKey = ec.starkCurve.getStarkKey(pk);\n\n localStorage.setItem(\n \"sessionSigner\",\n JSON.stringify({\n privKey: pk,\n pubKey: this._publicKey,\n }),\n );\n this._sessionKeyGuid = signerToGuid({\n starknet: { privateKey: encode.addHexPrefix(pk) },\n });\n } else {\n const pk = localStorage.getItem(\"sessionSigner\");\n if (!pk) throw new Error(\"failed to get sessionSigner\");\n\n const jsonPk: {\n privKey: string;\n pubKey: string;\n } = JSON.parse(pk);\n\n this._publicKey = jsonPk.pubKey;\n this._sessionKeyGuid = signerToGuid({\n starknet: { privateKey: encode.addHexPrefix(jsonPk.privKey) },\n });\n }\n\n if (typeof window !== \"undefined\") {\n (window as any).starknet_controller_session = this;\n }\n }\n\n private validatePoliciesSubset(\n newPolicies: ParsedSessionPolicies,\n existingPolicies: ParsedSessionPolicies,\n ): boolean {\n if (newPolicies.contracts) {\n if (!existingPolicies.contracts) return false;\n\n for (const [address, contract] of Object.entries(newPolicies.contracts)) {\n const existingContract = existingPolicies.contracts[address];\n if (!existingContract) return false;\n\n for (const method of contract.methods) {\n const existingMethod = existingContract.methods.find(\n (m) => m.entrypoint === method.entrypoint,\n );\n if (!existingMethod || !existingMethod.authorized) return false;\n }\n }\n }\n\n if (newPolicies.messages) {\n if (!existingPolicies.messages) return false;\n\n for (const message of newPolicies.messages) {\n const existingMessage = existingPolicies.messages.find(\n (m) =>\n JSON.stringify(m.domain) === JSON.stringify(message.domain) &&\n JSON.stringify(m.types) === JSON.stringify(message.types),\n );\n if (!existingMessage || !existingMessage.authorized) return false;\n }\n }\n\n return true;\n }\n\n async username() {\n await this.tryRetrieveFromQueryOrStorage();\n return this._username;\n }\n\n async probe(): Promise<WalletAccount | undefined> {\n if (this.account) {\n return this.account;\n }\n\n this.account = this.tryRetrieveFromQueryOrStorage();\n return this.account;\n }\n\n async connect(): Promise<WalletAccount | undefined> {\n if (this.account) {\n return this.account;\n }\n\n this.account = this.tryRetrieveFromQueryOrStorage();\n if (this.account) {\n return this.account;\n }\n\n localStorage.setItem(\"sessionPolicies\", JSON.stringify(this._policies));\n localStorage.setItem(\"lastUsedConnector\", this.id);\n\n try {\n if (this.reopenBrowser) {\n const pk = stark.randomAddress();\n this._publicKey = ec.starkCurve.getStarkKey(pk);\n\n localStorage.setItem(\n \"sessionSigner\",\n JSON.stringify({\n privKey: pk,\n pubKey: this._publicKey,\n }),\n );\n this._sessionKeyGuid = signerToGuid({\n starknet: { privateKey: encode.addHexPrefix(pk) },\n });\n const url = `${\n this._keychainUrl\n }/session?public_key=${this._publicKey}&redirect_uri=${\n this._redirectUrl\n }&redirect_query_name=startapp&policies=${JSON.stringify(\n this._policies,\n )}&rpc_url=${this._rpcUrl}`;\n\n window.open(url, \"_blank\");\n }\n\n const sessionResult = await subscribeCreateSession(\n this._sessionKeyGuid,\n this._apiUrl,\n );\n\n // auth is: [shortstring!('authorization-by-registered'), owner_guid]\n const ownerGuid = sessionResult.authorization[1];\n const session: SessionRegistration = {\n username: sessionResult.controller.accountID,\n address: sessionResult.controller.address,\n ownerGuid,\n expiresAt: sessionResult.expiresAt,\n guardianKeyGuid: \"0x0\",\n metadataHash: \"0x0\",\n sessionKeyGuid: this._sessionKeyGuid,\n };\n localStorage.setItem(\"session\", JSON.stringify(session));\n\n this.tryRetrieveFromQueryOrStorage();\n\n return this.account;\n } catch (e) {\n console.log(e);\n throw e;\n }\n }\n\n switchStarknetChain(_chainId: string): Promise<boolean> {\n throw new Error(\"switchStarknetChain not implemented\");\n }\n\n addStarknetChain(_chain: AddStarknetChainParameters): Promise<boolean> {\n throw new Error(\"addStarknetChain not implemented\");\n }\n\n disconnect(): Promise<void> {\n localStorage.removeItem(\"sessionSigner\");\n localStorage.removeItem(\"session\");\n localStorage.removeItem(\"sessionPolicies\");\n this.account = undefined;\n this._username = undefined;\n const openedWindow = window.open(`${this._keychainUrl}/disconnect`);\n if (openedWindow === null) return Promise.resolve();\n\n const { resolve, promise } = Promise.withResolvers<void>();\n function onWindowClose() {\n if (openedWindow?.closed) {\n resolve();\n clearInterval(checkInterval);\n }\n }\n const checkInterval = setInterval(onWindowClose, 500);\n return promise;\n }\n\n tryRetrieveFromQueryOrStorage() {\n if (this.account) {\n return this.account;\n }\n\n const signerString = localStorage.getItem(\"sessionSigner\");\n const signer = signerString ? JSON.parse(signerString) : null;\n let sessionRegistration: SessionRegistration | null = null;\n\n const sessionString = localStorage.getItem(\"session\");\n if (sessionString) {\n sessionRegistration = JSON.parse(sessionString);\n }\n\n if (window.location.search.includes(\"startapp\")) {\n const params = new URLSearchParams(window.location.search);\n const session = params.get(\"startapp\");\n if (session) {\n const possibleNewSession: SessionRegistration = JSON.parse(\n atob(session),\n );\n\n if (\n Number(possibleNewSession.expiresAt) !==\n Number(sessionRegistration?.expiresAt)\n ) {\n sessionRegistration = possibleNewSession;\n localStorage.setItem(\"session\", JSON.stringify(sessionRegistration));\n }\n\n // Remove the session query parameter\n params.delete(\"startapp\");\n const newUrl =\n window.location.pathname +\n (params.toString() ? `?${params.toString()}` : \"\") +\n window.location.hash;\n window.history.replaceState({}, document.title, newUrl);\n }\n }\n\n if (!sessionRegistration || !signer) {\n return;\n }\n\n // Check expiration\n const expirationTime = parseInt(sessionRegistration.expiresAt) * 1000;\n if (Date.now() >= expirationTime) {\n this.clearStoredSession();\n return;\n }\n\n // Check stored policies\n const storedPoliciesStr = localStorage.getItem(\"sessionPolicies\");\n if (storedPoliciesStr) {\n const storedPolicies = JSON.parse(\n storedPoliciesStr,\n ) as ParsedSessionPolicies;\n\n const isValid = this.validatePoliciesSubset(\n this._policies,\n storedPolicies,\n );\n\n if (!isValid) {\n this.clearStoredSession();\n return;\n }\n }\n\n this._username = sessionRegistration.username;\n this.account = new SessionAccount(this, {\n rpcUrl: this._rpcUrl,\n privateKey: signer.privKey,\n address: sessionRegistration.address,\n ownerGuid: sessionRegistration.ownerGuid,\n chainId: this._chainId,\n expiresAt: parseInt(sessionRegistration.expiresAt),\n policies: toWasmPolicies(this._policies),\n guardianKeyGuid: sessionRegistration.guardianKeyGuid,\n metadataHash: sessionRegistration.metadataHash,\n sessionKeyGuid: sessionRegistration.sessionKeyGuid,\n });\n\n return this.account;\n }\n\n private clearStoredSession(): void {\n localStorage.removeItem(\"sessionSigner\");\n localStorage.removeItem(\"session\");\n localStorage.removeItem(\"sessionPolicies\");\n }\n}\n"],"names":["SessionAccount","WalletAccount","provider","rpcUrl","privateKey","address","ownerGuid","chainId","expiresAt","policies","guardianKeyGuid","metadataHash","sessionKeyGuid","CartridgeSessionAccount","calls","normalizeCalls","SessionProvider","BaseProvider","rpc","redirectUrl","keychainUrl","apiUrl","contract","method","message","KEYCHAIN_URL","API_URL","pk","jsonPk","signerToGuid","encode","stark","ec","newPolicies","existingPolicies","existingContract","existingMethod","m","existingMessage","url","sessionResult","subscribeCreateSession","session","e","_chainId","_chain","openedWindow","resolve","promise","onWindowClose","checkInterval","signerString","signer","sessionRegistration","sessionString","params","possibleNewSession","newUrl","expirationTime","storedPoliciesStr","storedPolicies","toWasmPolicies"],"mappings":"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"}