@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/.turbo/turbo-build$colon$deps.log +15 -15
- package/.turbo/turbo-build.log +14 -14
- package/dist/index.js +2 -2
- package/dist/node/index.cjs +8 -1
- package/dist/node/index.cjs.map +1 -1
- package/dist/node/index.js +9 -2
- package/dist/node/index.js.map +1 -1
- package/dist/{provider-PftcmETC.js → provider-BgBI_LQl.js} +2 -2
- package/dist/{provider-PftcmETC.js.map → provider-BgBI_LQl.js.map} +1 -1
- package/dist/session/provider.d.ts +5 -2
- package/dist/session.js +138 -106
- package/dist/session.js.map +1 -1
- package/dist/stats.html +1 -1
- package/package.json +2 -2
- package/src/node/provider.ts +8 -1
- package/src/session/provider.ts +79 -39
package/dist/session.js
CHANGED
|
@@ -1,39 +1,39 @@
|
|
|
1
|
-
import { WalletAccount as
|
|
2
|
-
import { signerToGuid as
|
|
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
|
|
5
|
-
import { F as
|
|
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
|
|
7
|
+
class b extends y {
|
|
8
8
|
controller;
|
|
9
9
|
constructor(t, {
|
|
10
|
-
rpcUrl:
|
|
10
|
+
rpcUrl: i,
|
|
11
11
|
privateKey: e,
|
|
12
|
-
address:
|
|
13
|
-
ownerGuid:
|
|
14
|
-
chainId:
|
|
15
|
-
expiresAt:
|
|
16
|
-
policies:
|
|
17
|
-
guardianKeyGuid:
|
|
12
|
+
address: s,
|
|
13
|
+
ownerGuid: o,
|
|
14
|
+
chainId: c,
|
|
15
|
+
expiresAt: n,
|
|
16
|
+
policies: r,
|
|
17
|
+
guardianKeyGuid: a,
|
|
18
18
|
metadataHash: l,
|
|
19
|
-
sessionKeyGuid:
|
|
19
|
+
sessionKeyGuid: S
|
|
20
20
|
}) {
|
|
21
21
|
super({
|
|
22
|
-
provider: { nodeUrl:
|
|
22
|
+
provider: { nodeUrl: i },
|
|
23
23
|
walletProvider: t,
|
|
24
|
-
address:
|
|
24
|
+
address: s
|
|
25
25
|
}), this.controller = I.newAsRegistered(
|
|
26
|
-
r,
|
|
27
|
-
e,
|
|
28
|
-
n,
|
|
29
26
|
i,
|
|
30
|
-
|
|
27
|
+
e,
|
|
28
|
+
s,
|
|
29
|
+
o,
|
|
30
|
+
c,
|
|
31
31
|
{
|
|
32
|
-
expiresAt:
|
|
33
|
-
policies:
|
|
34
|
-
guardianKeyGuid:
|
|
32
|
+
expiresAt: n,
|
|
33
|
+
policies: r,
|
|
34
|
+
guardianKeyGuid: a,
|
|
35
35
|
metadataHash: l,
|
|
36
|
-
sessionKeyGuid:
|
|
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(
|
|
53
|
+
return this.controller.execute(f(t));
|
|
54
54
|
}
|
|
55
55
|
}
|
|
56
|
-
class
|
|
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:
|
|
71
|
+
chainId: i,
|
|
69
72
|
policies: e,
|
|
70
|
-
redirectUrl:
|
|
71
|
-
keychainUrl:
|
|
72
|
-
apiUrl:
|
|
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(([
|
|
78
|
-
|
|
80
|
+
Object.entries(e.contracts).map(([r, a]) => [
|
|
81
|
+
r,
|
|
79
82
|
{
|
|
80
|
-
...
|
|
81
|
-
methods:
|
|
82
|
-
...
|
|
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((
|
|
89
|
-
...
|
|
91
|
+
messages: e.messages?.map((r) => ({
|
|
92
|
+
...r,
|
|
90
93
|
authorized: !0
|
|
91
94
|
}))
|
|
92
|
-
}, this._rpcUrl = t, this._chainId =
|
|
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,
|
|
116
|
+
validatePoliciesSubset(t, i) {
|
|
95
117
|
if (t.contracts) {
|
|
96
|
-
if (!
|
|
97
|
-
for (const [e,
|
|
98
|
-
const
|
|
99
|
-
if (!
|
|
100
|
-
for (const
|
|
101
|
-
const
|
|
102
|
-
(
|
|
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 (!
|
|
126
|
+
if (!n || !n.authorized) return !1;
|
|
105
127
|
}
|
|
106
128
|
}
|
|
107
129
|
}
|
|
108
130
|
if (t.messages) {
|
|
109
|
-
if (!
|
|
131
|
+
if (!i.messages) return !1;
|
|
110
132
|
for (const e of t.messages) {
|
|
111
|
-
const
|
|
112
|
-
(
|
|
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 (!
|
|
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 =
|
|
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 =
|
|
150
|
+
if (this.account = this.tryRetrieveFromQueryOrStorage(), this.account)
|
|
129
151
|
return this.account;
|
|
130
|
-
|
|
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
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
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:
|
|
180
|
+
sessionKeyGuid: this._sessionKeyGuid
|
|
157
181
|
};
|
|
158
|
-
return localStorage.setItem("session", JSON.stringify(
|
|
159
|
-
} catch (
|
|
160
|
-
console.log(
|
|
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
|
-
|
|
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
|
-
|
|
204
|
+
tryRetrieveFromQueryOrStorage() {
|
|
173
205
|
if (this.account)
|
|
174
206
|
return this.account;
|
|
175
|
-
const t = localStorage.getItem("sessionSigner"),
|
|
207
|
+
const t = localStorage.getItem("sessionSigner"), i = t ? JSON.parse(t) : null;
|
|
176
208
|
let e = null;
|
|
177
|
-
const
|
|
178
|
-
if (
|
|
179
|
-
const
|
|
180
|
-
if (
|
|
181
|
-
const
|
|
182
|
-
atob(
|
|
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(
|
|
185
|
-
const l = window.location.pathname + (
|
|
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 || !
|
|
221
|
+
if (!e || !i)
|
|
190
222
|
return;
|
|
191
|
-
const
|
|
192
|
-
if (Date.now() >=
|
|
223
|
+
const o = parseInt(e.expiresAt) * 1e3;
|
|
224
|
+
if (Date.now() >= o) {
|
|
193
225
|
this.clearStoredSession();
|
|
194
226
|
return;
|
|
195
227
|
}
|
|
196
|
-
const
|
|
197
|
-
if (
|
|
198
|
-
const
|
|
199
|
-
|
|
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
|
-
|
|
235
|
+
n
|
|
204
236
|
)) {
|
|
205
237
|
this.clearStoredSession();
|
|
206
238
|
return;
|
|
207
239
|
}
|
|
208
240
|
}
|
|
209
|
-
return this._username = e.username, this.account = new
|
|
241
|
+
return this._username = e.username, this.account = new b(this, {
|
|
210
242
|
rpcUrl: this._rpcUrl,
|
|
211
|
-
privateKey:
|
|
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:
|
|
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
|
-
|
|
228
|
-
|
|
259
|
+
R as FeeSource,
|
|
260
|
+
J as NotReadyToConnect,
|
|
229
261
|
P as ResponseCodes,
|
|
230
|
-
|
|
231
|
-
|
|
262
|
+
F as StarterPackItemType,
|
|
263
|
+
U as default
|
|
232
264
|
};
|
|
233
265
|
//# sourceMappingURL=session.js.map
|
package/dist/session.js.map
CHANGED
|
@@ -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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"}
|