@cartridge/controller 0.6.0 → 0.7.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 (100) hide show
  1. package/.turbo/turbo-build$colon$deps.log +52 -76
  2. package/.turbo/turbo-build.log +53 -77
  3. package/dist/controller.cjs +860 -0
  4. package/dist/controller.cjs.map +1 -0
  5. package/dist/controller.d.cts +33 -0
  6. package/dist/controller.d.ts +4 -4
  7. package/dist/controller.js +84 -68
  8. package/dist/controller.js.map +1 -1
  9. package/dist/index.cjs +2200 -0
  10. package/dist/index.cjs.map +1 -0
  11. package/dist/index.d.cts +17 -0
  12. package/dist/index.d.ts +12 -7
  13. package/dist/index.js +161 -7601
  14. package/dist/index.js.map +1 -1
  15. package/dist/lookup.cjs +59 -0
  16. package/dist/lookup.cjs.map +1 -0
  17. package/dist/lookup.d.cts +4 -0
  18. package/dist/lookup.js +7 -7
  19. package/dist/lookup.js.map +1 -1
  20. package/dist/{provider.js → node/index.cjs} +499 -25
  21. package/dist/node/index.cjs.map +1 -0
  22. package/dist/node/index.d.cts +56 -0
  23. package/dist/node/index.d.ts +56 -0
  24. package/dist/{telegram/provider.js → node/index.js} +354 -135
  25. package/dist/node/index.js.map +1 -0
  26. package/dist/{policies.d.ts → policies-DD1aPjQ4.d.cts} +6 -4
  27. package/dist/policies-DD1aPjQ4.d.ts +21 -0
  28. package/dist/{types-CVnDQVqD.d.ts → provider-ap1C1ypF.d.cts} +27 -10
  29. package/dist/provider-ap1C1ypF.d.ts +201 -0
  30. package/dist/session/{provider.js → index.cjs} +82 -73
  31. package/dist/session/index.cjs.map +1 -0
  32. package/dist/session/{provider.d.ts → index.d.cts} +6 -3
  33. package/dist/session/index.d.ts +37 -8
  34. package/dist/session/index.js +47 -64
  35. package/dist/session/index.js.map +1 -1
  36. package/package.json +35 -16
  37. package/src/controller.ts +43 -15
  38. package/src/iframe/base.ts +1 -11
  39. package/src/node/account.ts +72 -0
  40. package/src/node/backend.ts +159 -0
  41. package/src/node/index.ts +4 -0
  42. package/src/node/provider.ts +178 -0
  43. package/src/node/server.ts +89 -0
  44. package/src/session/account.ts +1 -1
  45. package/src/session/provider.ts +0 -16
  46. package/src/types.ts +3 -6
  47. package/tsconfig.json +2 -1
  48. package/dist/__tests__/parseChainId.test.d.ts +0 -2
  49. package/dist/__tests__/parseChainId.test.js +0 -89
  50. package/dist/__tests__/parseChainId.test.js.map +0 -1
  51. package/dist/account.d.ts +0 -38
  52. package/dist/account.js +0 -110
  53. package/dist/account.js.map +0 -1
  54. package/dist/constants.d.ts +0 -5
  55. package/dist/constants.js +0 -10
  56. package/dist/constants.js.map +0 -1
  57. package/dist/errors.d.ts +0 -5
  58. package/dist/errors.js +0 -11
  59. package/dist/errors.js.map +0 -1
  60. package/dist/icon.d.ts +0 -3
  61. package/dist/icon.js +0 -6
  62. package/dist/icon.js.map +0 -1
  63. package/dist/iframe/base.d.ts +0 -5
  64. package/dist/iframe/base.js +0 -126
  65. package/dist/iframe/base.js.map +0 -1
  66. package/dist/iframe/index.d.ts +0 -5
  67. package/dist/iframe/index.js +0 -188
  68. package/dist/iframe/index.js.map +0 -1
  69. package/dist/iframe/keychain.d.ts +0 -5
  70. package/dist/iframe/keychain.js +0 -147
  71. package/dist/iframe/keychain.js.map +0 -1
  72. package/dist/iframe/profile.d.ts +0 -5
  73. package/dist/iframe/profile.js +0 -167
  74. package/dist/iframe/profile.js.map +0 -1
  75. package/dist/index.d-BbTUPBeO.d.ts +0 -68
  76. package/dist/mutex.d.ts +0 -14
  77. package/dist/mutex.js +0 -22
  78. package/dist/mutex.js.map +0 -1
  79. package/dist/policies.js +0 -26
  80. package/dist/policies.js.map +0 -1
  81. package/dist/provider.d.ts +0 -24
  82. package/dist/provider.js.map +0 -1
  83. package/dist/session/account.d.ts +0 -37
  84. package/dist/session/account.js +0 -94
  85. package/dist/session/account.js.map +0 -1
  86. package/dist/session/backend.d.ts +0 -60
  87. package/dist/session/backend.js +0 -39
  88. package/dist/session/backend.js.map +0 -1
  89. package/dist/session/provider.js.map +0 -1
  90. package/dist/telegram/backend.d.ts +0 -33
  91. package/dist/telegram/backend.js +0 -40
  92. package/dist/telegram/backend.js.map +0 -1
  93. package/dist/telegram/provider.d.ts +0 -27
  94. package/dist/telegram/provider.js.map +0 -1
  95. package/dist/types.d.ts +0 -5
  96. package/dist/types.js +0 -13
  97. package/dist/types.js.map +0 -1
  98. package/dist/utils.d.ts +0 -19
  99. package/dist/utils.js +0 -141
  100. package/dist/utils.js.map +0 -1
package/dist/index.cjs ADDED
@@ -0,0 +1,2200 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var starknet = require('starknet');
6
+ var penpal = require('@cartridge/penpal');
7
+ var typesJs = require('@starknet-io/types-js');
8
+
9
+ // src/account.ts
10
+
11
+ // src/types.ts
12
+ var ResponseCodes = /* @__PURE__ */ ((ResponseCodes2) => {
13
+ ResponseCodes2["SUCCESS"] = "SUCCESS";
14
+ ResponseCodes2["NOT_CONNECTED"] = "NOT_CONNECTED";
15
+ ResponseCodes2["ERROR"] = "ERROR";
16
+ ResponseCodes2["CANCELED"] = "CANCELED";
17
+ ResponseCodes2["USER_INTERACTION_REQUIRED"] = "USER_INTERACTION_REQUIRED";
18
+ return ResponseCodes2;
19
+ })(ResponseCodes || {});
20
+ var ALLOWED_PROPERTIES = /* @__PURE__ */ new Set([
21
+ "contracts",
22
+ "messages",
23
+ "target",
24
+ "method",
25
+ "name",
26
+ "description",
27
+ "types",
28
+ "domain",
29
+ "primaryType"
30
+ ]);
31
+ function validatePropertyName(prop) {
32
+ if (!ALLOWED_PROPERTIES.has(prop)) {
33
+ throw new Error(`Invalid property name: ${prop}`);
34
+ }
35
+ }
36
+ function safeObjectAccess(obj, prop) {
37
+ validatePropertyName(prop);
38
+ return obj[prop];
39
+ }
40
+ function toSessionPolicies(policies) {
41
+ return Array.isArray(policies) ? policies.reduce(
42
+ (prev, p) => {
43
+ if (safeObjectAccess(p, "target")) {
44
+ const target = starknet.getChecksumAddress(
45
+ safeObjectAccess(p, "target")
46
+ );
47
+ const entrypoint = safeObjectAccess(p, "method");
48
+ const contracts = safeObjectAccess(
49
+ prev,
50
+ "contracts"
51
+ );
52
+ const item = {
53
+ name: humanizeString(entrypoint),
54
+ entrypoint,
55
+ description: safeObjectAccess(p, "description")
56
+ };
57
+ if (target in contracts) {
58
+ const methods = toArray(contracts[target].methods);
59
+ contracts[target] = {
60
+ methods: [...methods, item]
61
+ };
62
+ } else {
63
+ contracts[target] = {
64
+ methods: [item]
65
+ };
66
+ }
67
+ } else {
68
+ const messages = safeObjectAccess(prev, "messages");
69
+ messages.push(p);
70
+ }
71
+ return prev;
72
+ },
73
+ { contracts: {}, messages: [] }
74
+ ) : policies;
75
+ }
76
+ function toWasmPolicies(policies) {
77
+ return [
78
+ ...Object.entries(policies.contracts ?? {}).flatMap(
79
+ ([target, { methods }]) => toArray(methods).map((m) => ({
80
+ target,
81
+ method: m.entrypoint,
82
+ authorized: m.authorized
83
+ }))
84
+ ),
85
+ ...(policies.messages ?? []).map((p) => {
86
+ const domainHash = starknet.typedData.getStructHash(
87
+ p.types,
88
+ "StarknetDomain",
89
+ p.domain,
90
+ starknet.TypedDataRevision.ACTIVE
91
+ );
92
+ const typeHash = starknet.typedData.getTypeHash(
93
+ p.types,
94
+ p.primaryType,
95
+ starknet.TypedDataRevision.ACTIVE
96
+ );
97
+ return {
98
+ scope_hash: starknet.hash.computePoseidonHash(domainHash, typeHash),
99
+ authorized: p.authorized
100
+ };
101
+ })
102
+ ];
103
+ }
104
+ function toArray(val) {
105
+ return Array.isArray(val) ? val : [val];
106
+ }
107
+ function humanizeString(str) {
108
+ return str.replace(/([a-z])([A-Z])/g, "$1 $2").replace(/_/g, " ").toLowerCase().replace(/^\w/, (c) => c.toUpperCase());
109
+ }
110
+ function parseChainId(url) {
111
+ const parts = url.pathname.split("/");
112
+ if (parts.includes("starknet")) {
113
+ if (parts.includes("mainnet")) {
114
+ return starknet.constants.StarknetChainId.SN_MAIN;
115
+ } else if (parts.includes("sepolia")) {
116
+ return starknet.constants.StarknetChainId.SN_SEPOLIA;
117
+ }
118
+ } else if (parts.length >= 3) {
119
+ const projectName = parts[2];
120
+ if (parts.includes("katana")) {
121
+ return starknet.shortString.encodeShortString(
122
+ `WP_${projectName.toUpperCase().replace(/-/g, "_")}`
123
+ );
124
+ } else if (parts.includes("mainnet")) {
125
+ return starknet.shortString.encodeShortString(
126
+ `GG_${projectName.toUpperCase().replace(/-/g, "_")}`
127
+ );
128
+ }
129
+ }
130
+ throw new Error(`Chain ${url.toString()} not supported`);
131
+ }
132
+
133
+ // src/account.ts
134
+ var ControllerAccount = class extends starknet.WalletAccount {
135
+ address;
136
+ keychain;
137
+ modal;
138
+ options;
139
+ constructor(provider, rpcUrl, address, keychain, options, modal) {
140
+ super({ nodeUrl: rpcUrl }, provider);
141
+ this.address = address;
142
+ this.keychain = keychain;
143
+ this.options = options;
144
+ this.modal = modal;
145
+ }
146
+ /**
147
+ * Invoke execute function in account contract
148
+ *
149
+ * @param calls the invocation object or an array of them, containing:
150
+ * - contractAddress - the address of the contract
151
+ * - entrypoint - the entrypoint of the contract
152
+ * - calldata - (defaults to []) the calldata
153
+ * - signature - (defaults to []) the signature
154
+ * @param abis (optional) the abi of the contract for better displaying
155
+ *
156
+ * @returns response from addTransaction
157
+ */
158
+ async execute(calls) {
159
+ calls = toArray(calls);
160
+ return new Promise(async (resolve, reject) => {
161
+ const sessionExecute = await this.keychain.execute(
162
+ calls,
163
+ undefined,
164
+ undefined,
165
+ false
166
+ );
167
+ if (sessionExecute.code === "SUCCESS" /* SUCCESS */) {
168
+ resolve(sessionExecute);
169
+ return;
170
+ }
171
+ if (this.options?.propagateSessionErrors) {
172
+ reject(sessionExecute.error);
173
+ return;
174
+ }
175
+ this.modal.open();
176
+ const manualExecute = await this.keychain.execute(
177
+ calls,
178
+ undefined,
179
+ undefined,
180
+ true,
181
+ sessionExecute.error
182
+ );
183
+ if (manualExecute.code === "SUCCESS" /* SUCCESS */) {
184
+ resolve(manualExecute);
185
+ this.modal.close();
186
+ return;
187
+ }
188
+ reject(manualExecute.error);
189
+ return;
190
+ });
191
+ }
192
+ /**
193
+ * Sign an JSON object for off-chain usage with the starknet private key and return the signature
194
+ * This adds a message prefix so it cant be interchanged with transactions
195
+ *
196
+ * @param json - JSON object to be signed
197
+ * @returns the signature of the JSON object
198
+ * @throws {Error} if the JSON object is not a valid JSON
199
+ */
200
+ async signMessage(typedData2) {
201
+ return new Promise(async (resolve, reject) => {
202
+ const sessionSign = await this.keychain.signMessage(typedData2, "", true);
203
+ if (!("code" in sessionSign)) {
204
+ resolve(sessionSign);
205
+ return;
206
+ }
207
+ this.modal.open();
208
+ const manualSign = await this.keychain.signMessage(typedData2, "", false);
209
+ if (!("code" in manualSign)) {
210
+ resolve(manualSign);
211
+ } else {
212
+ reject(manualSign.error);
213
+ }
214
+ this.modal.close();
215
+ });
216
+ }
217
+ };
218
+ var account_default = ControllerAccount;
219
+ var IFrame = class {
220
+ url;
221
+ iframe;
222
+ container;
223
+ onClose;
224
+ constructor({
225
+ id,
226
+ url,
227
+ preset,
228
+ onClose,
229
+ onConnect,
230
+ methods = {}
231
+ }) {
232
+ if (typeof document === "undefined") {
233
+ return;
234
+ }
235
+ if (preset) {
236
+ url.searchParams.set("preset", preset);
237
+ }
238
+ this.url = url;
239
+ const iframe = document.createElement("iframe");
240
+ iframe.src = url.toString();
241
+ iframe.id = id;
242
+ iframe.style.border = "none";
243
+ iframe.sandbox.add("allow-forms");
244
+ iframe.sandbox.add("allow-popups");
245
+ iframe.sandbox.add("allow-scripts");
246
+ iframe.sandbox.add("allow-same-origin");
247
+ iframe.allow = "publickey-credentials-create *; publickey-credentials-get *; clipboard-write";
248
+ if (!!document.hasStorageAccess) {
249
+ iframe.sandbox.add("allow-storage-access-by-user-activation");
250
+ }
251
+ const container = document.createElement("div");
252
+ container.id = "controller";
253
+ container.style.position = "fixed";
254
+ container.style.height = "100%";
255
+ container.style.width = "100%";
256
+ container.style.top = "0";
257
+ container.style.left = "0";
258
+ container.style.zIndex = "10000";
259
+ container.style.backgroundColor = "rgba(0,0,0,0.6)";
260
+ container.style.display = "flex";
261
+ container.style.alignItems = "center";
262
+ container.style.justifyContent = "center";
263
+ container.style.visibility = "hidden";
264
+ container.style.opacity = "0";
265
+ container.style.transition = "opacity 0.2s ease";
266
+ container.appendChild(iframe);
267
+ this.iframe = iframe;
268
+ this.container = container;
269
+ penpal.connectToChild({
270
+ iframe: this.iframe,
271
+ methods: { close: () => this.close(), ...methods }
272
+ }).promise.then(onConnect);
273
+ this.resize();
274
+ window.addEventListener("resize", () => this.resize());
275
+ const observer = new MutationObserver(() => {
276
+ const existingController2 = document.getElementById("controller");
277
+ if (document.body) {
278
+ if (id === "controller-keychain" && !existingController2 || id === "controller-profile") {
279
+ document.body.appendChild(container);
280
+ observer.disconnect();
281
+ }
282
+ }
283
+ });
284
+ observer.observe(document.documentElement, {
285
+ childList: true,
286
+ subtree: true
287
+ });
288
+ const existingController = document.getElementById("controller");
289
+ if (document.body) {
290
+ if (id === "controller-keychain" && !existingController || id === "controller-profile") {
291
+ document.body.appendChild(container);
292
+ }
293
+ }
294
+ this.onClose = onClose;
295
+ }
296
+ open() {
297
+ if (!this.container) return;
298
+ document.body.style.overflow = "hidden";
299
+ this.container.style.visibility = "visible";
300
+ this.container.style.opacity = "1";
301
+ }
302
+ close() {
303
+ if (!this.container) return;
304
+ this.onClose?.();
305
+ document.body.style.overflow = "auto";
306
+ this.container.style.visibility = "hidden";
307
+ this.container.style.opacity = "0";
308
+ }
309
+ sendBackward() {
310
+ if (!this.container) return;
311
+ this.container.style.zIndex = "9999";
312
+ }
313
+ sendForward() {
314
+ if (!this.container) return;
315
+ this.container.style.zIndex = "10000";
316
+ }
317
+ resize() {
318
+ if (!this.iframe) return;
319
+ this.iframe.style.userSelect = "none";
320
+ if (window.innerWidth < 768) {
321
+ this.iframe.style.height = "100%";
322
+ this.iframe.style.width = "100%";
323
+ this.iframe.style.borderRadius = "0";
324
+ return;
325
+ }
326
+ this.iframe.style.height = "600px";
327
+ this.iframe.style.width = "432px";
328
+ this.iframe.style.borderRadius = "8px";
329
+ }
330
+ };
331
+
332
+ // src/constants.ts
333
+ var KEYCHAIN_URL = "https://x.cartridge.gg";
334
+ var PROFILE_URL = "https://profile.cartridge.gg";
335
+ var API_URL = "https://api.cartridge.gg";
336
+
337
+ // src/iframe/keychain.ts
338
+ var KeychainIFrame = class extends IFrame {
339
+ constructor({ url, policies, ...iframeOptions }) {
340
+ const _url = new URL(url ?? KEYCHAIN_URL);
341
+ if (policies) {
342
+ _url.searchParams.set(
343
+ "policies",
344
+ encodeURIComponent(JSON.stringify(policies))
345
+ );
346
+ }
347
+ super({
348
+ ...iframeOptions,
349
+ id: "controller-keychain",
350
+ url: _url
351
+ });
352
+ }
353
+ };
354
+
355
+ // src/iframe/profile.ts
356
+ var ProfileIFrame = class extends IFrame {
357
+ constructor({
358
+ profileUrl,
359
+ rpcUrl,
360
+ version,
361
+ username,
362
+ slot,
363
+ namespace,
364
+ tokens,
365
+ ...iframeOptions
366
+ }) {
367
+ const _profileUrl = (profileUrl || PROFILE_URL).replace(/\/$/, "");
368
+ let _url = new URL(
369
+ slot ? namespace ? `${_profileUrl}/account/${username}/slot/${slot}?ps=${encodeURIComponent(
370
+ slot
371
+ )}&ns=${encodeURIComponent(namespace)}` : `${_profileUrl}/account/${username}/slot/${slot}?ps=${encodeURIComponent(
372
+ slot
373
+ )}` : `${_profileUrl}/account/${username}`
374
+ );
375
+ if (version) {
376
+ _url.searchParams.set("v", encodeURIComponent(version));
377
+ }
378
+ _url.searchParams.set("rpcUrl", encodeURIComponent(rpcUrl));
379
+ if (tokens?.erc20) {
380
+ _url.searchParams.set(
381
+ "erc20",
382
+ encodeURIComponent(tokens.erc20.toString())
383
+ );
384
+ }
385
+ super({
386
+ ...iframeOptions,
387
+ id: "controller-profile",
388
+ url: _url
389
+ });
390
+ }
391
+ };
392
+
393
+ // src/errors.ts
394
+ var NotReadyToConnect = class _NotReadyToConnect extends Error {
395
+ constructor() {
396
+ super("Not ready to connect");
397
+ Object.setPrototypeOf(this, _NotReadyToConnect.prototype);
398
+ }
399
+ };
400
+
401
+ // package.json
402
+ var package_default = {
403
+ name: "@cartridge/controller",
404
+ version: "0.7.0",
405
+ description: "Cartridge Controller",
406
+ module: "dist/index.js",
407
+ types: "dist/index.d.ts",
408
+ type: "module",
409
+ scripts: {
410
+ "build:deps": "tsup",
411
+ build: "pnpm build:deps",
412
+ format: 'prettier --write "src/**/*.ts"',
413
+ "format:check": 'prettier --check "src/**/*.ts"',
414
+ test: "jest",
415
+ version: "pnpm pkg get version"
416
+ },
417
+ exports: {
418
+ ".": {
419
+ types: "./dist/index.d.ts",
420
+ import: "./dist/index.js",
421
+ require: "./dist/index.cjs"
422
+ },
423
+ "./session": {
424
+ types: "./dist/session/index.d.ts",
425
+ import: "./dist/session/index.js",
426
+ require: "./dist/session/index.cjs"
427
+ },
428
+ "./session/node": {
429
+ types: "./dist/node/index.d.ts",
430
+ import: "./dist/node/index.js",
431
+ require: "./dist/node/index.cjs"
432
+ },
433
+ "./provider": {
434
+ types: "./dist/provider/index.d.ts",
435
+ import: "./dist/provider/index.js"
436
+ },
437
+ "./types": {
438
+ types: "./dist/types/index.d.ts",
439
+ import: "./dist/types/index.js"
440
+ }
441
+ },
442
+ tsup: {
443
+ entry: [
444
+ "src/index.ts",
445
+ "src/controller.ts",
446
+ "src/lookup.ts",
447
+ "src/session/index.ts",
448
+ "src/node/index.ts"
449
+ ],
450
+ format: [
451
+ "esm",
452
+ "cjs"
453
+ ],
454
+ splitting: false,
455
+ sourcemap: true,
456
+ clean: true,
457
+ dts: true,
458
+ treeshake: {
459
+ preset: "recommended"
460
+ },
461
+ exports: "named"
462
+ },
463
+ peerDependencies: {
464
+ starknet: "catalog:",
465
+ open: "^10.1.0"
466
+ },
467
+ dependencies: {
468
+ "@cartridge/account-wasm": "workspace:*",
469
+ "@cartridge/penpal": "catalog:",
470
+ "@starknet-io/types-js": "catalog:",
471
+ "@telegram-apps/sdk": "^2.4.0",
472
+ base64url: "catalog:",
473
+ "cbor-x": "^1.5.0",
474
+ "fast-deep-equal": "catalog:"
475
+ },
476
+ devDependencies: {
477
+ "@cartridge/tsconfig": "workspace:*",
478
+ "@types/jest": "^29.5.14",
479
+ "@types/node": "catalog:",
480
+ jest: "^29.7.0",
481
+ prettier: "catalog:",
482
+ "ts-jest": "^29.2.5",
483
+ tsup: "catalog:",
484
+ typescript: "catalog:"
485
+ }
486
+ };
487
+
488
+ // src/icon.ts
489
+ var icon = "data:image/png;base64,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";
490
+
491
+ // src/mutex.ts
492
+ function releaseStub() {
493
+ }
494
+ var Mutex = class {
495
+ m_lastPromise = Promise.resolve();
496
+ /**
497
+ * Acquire lock
498
+ * @param [bypass=false] option to skip lock acquisition
499
+ */
500
+ async obtain(bypass = false) {
501
+ let release = releaseStub;
502
+ if (bypass) return release;
503
+ const lastPromise = this.m_lastPromise;
504
+ this.m_lastPromise = new Promise((resolve) => release = resolve);
505
+ await lastPromise;
506
+ return release;
507
+ }
508
+ };
509
+
510
+ // src/provider.ts
511
+ var mutex = new Mutex();
512
+ var BaseProvider = class {
513
+ id = "controller";
514
+ name = "Controller";
515
+ version = package_default.version;
516
+ icon = icon;
517
+ account;
518
+ subscriptions = [];
519
+ _probePromise = null;
520
+ async safeProbe() {
521
+ if (this.account) {
522
+ return this.account;
523
+ }
524
+ if (this._probePromise) {
525
+ return this._probePromise;
526
+ }
527
+ const release = await mutex.obtain();
528
+ return await new Promise(async (resolve) => {
529
+ try {
530
+ this._probePromise = this.probe();
531
+ const result = await this._probePromise;
532
+ resolve(result);
533
+ } finally {
534
+ this._probePromise = null;
535
+ }
536
+ }).finally(() => {
537
+ release();
538
+ });
539
+ }
540
+ request = async (call) => {
541
+ switch (call.type) {
542
+ case "wallet_getPermissions":
543
+ await this.safeProbe();
544
+ if (this.account) {
545
+ return [typesJs.Permission.ACCOUNTS];
546
+ }
547
+ return [];
548
+ case "wallet_requestAccounts": {
549
+ if (this.account) {
550
+ return [this.account.address];
551
+ }
552
+ const silentMode = call.params && call.params.silent_mode;
553
+ this.account = await this.safeProbe();
554
+ if (!this.account && !silentMode) {
555
+ this.account = await this.connect();
556
+ }
557
+ if (this.account) {
558
+ return [this.account.address];
559
+ }
560
+ return [];
561
+ }
562
+ case "wallet_watchAsset":
563
+ throw {
564
+ code: 63,
565
+ message: "An unexpected error occurred",
566
+ data: "wallet_watchAsset not implemented"
567
+ };
568
+ case "wallet_addStarknetChain": {
569
+ let params2 = call.params;
570
+ return this.addStarknetChain(params2);
571
+ }
572
+ case "wallet_switchStarknetChain": {
573
+ let params2 = call.params;
574
+ return this.switchStarknetChain(params2.chainId);
575
+ }
576
+ case "wallet_requestChainId":
577
+ if (!this.account) {
578
+ throw {
579
+ code: 63,
580
+ message: "An unexpected error occurred",
581
+ data: "Account not initialized"
582
+ };
583
+ }
584
+ return await this.account.getChainId();
585
+ case "wallet_deploymentData":
586
+ throw {
587
+ code: 63,
588
+ message: "An unexpected error occurred",
589
+ data: "wallet_deploymentData not implemented"
590
+ };
591
+ case "wallet_addInvokeTransaction":
592
+ if (!this.account) {
593
+ throw {
594
+ code: 63,
595
+ message: "An unexpected error occurred",
596
+ data: "Account not initialized"
597
+ };
598
+ }
599
+ let params = call.params;
600
+ return await this.account.execute(
601
+ params.calls.map((call2) => ({
602
+ contractAddress: call2.contract_address,
603
+ entrypoint: call2.entry_point,
604
+ calldata: call2.calldata
605
+ }))
606
+ );
607
+ case "wallet_addDeclareTransaction":
608
+ throw {
609
+ code: 63,
610
+ message: "An unexpected error occurred",
611
+ data: "wallet_addDeclareTransaction not implemented"
612
+ };
613
+ case "wallet_signTypedData": {
614
+ if (!this.account) {
615
+ throw {
616
+ code: 63,
617
+ message: "An unexpected error occurred",
618
+ data: "Account not initialized"
619
+ };
620
+ }
621
+ return await this.account.signMessage(call.params);
622
+ }
623
+ case "wallet_supportedSpecs":
624
+ return [];
625
+ case "wallet_supportedWalletApi":
626
+ return [];
627
+ default:
628
+ throw {
629
+ code: 63,
630
+ message: "An unexpected error occurred",
631
+ data: `Unknown RPC call type: ${call.type}`
632
+ };
633
+ }
634
+ };
635
+ on = (event, handler) => {
636
+ if (event !== "accountsChanged" && event !== "networkChanged") {
637
+ throw new Error(`Unknown event: ${event}`);
638
+ }
639
+ this.subscriptions.push({ type: event, handler });
640
+ };
641
+ off = (event, handler) => {
642
+ if (event !== "accountsChanged" && event !== "networkChanged") {
643
+ throw new Error(`Unknown event: ${event}`);
644
+ }
645
+ const idx = this.subscriptions.findIndex(
646
+ (sub) => sub.type === event && sub.handler === handler
647
+ );
648
+ if (idx >= 0) {
649
+ this.subscriptions.splice(idx, 1);
650
+ }
651
+ };
652
+ emitNetworkChanged(chainId) {
653
+ this.subscriptions.filter((sub) => sub.type === "networkChanged").forEach((sub) => {
654
+ sub.handler(chainId);
655
+ });
656
+ }
657
+ emitAccountsChanged(accounts) {
658
+ this.subscriptions.filter((sub) => sub.type === "accountsChanged").forEach((sub) => {
659
+ sub.handler(accounts);
660
+ });
661
+ }
662
+ };
663
+
664
+ // src/controller.ts
665
+ var ControllerProvider = class extends BaseProvider {
666
+ keychain;
667
+ profile;
668
+ options;
669
+ iframes;
670
+ selectedChain;
671
+ chains;
672
+ constructor(options) {
673
+ super();
674
+ const chains = /* @__PURE__ */ new Map();
675
+ for (const chain of options.chains) {
676
+ const url = new URL(chain.rpcUrl);
677
+ const chainId = parseChainId(url);
678
+ chains.set(chainId, chain);
679
+ }
680
+ if (options.policies?.messages?.length && options.policies.messages.length !== chains.size) {
681
+ console.warn(
682
+ "Each message policy is associated with a specific chain. The number of message policies does not match the number of chains specified - session message signing may not work on some chains."
683
+ );
684
+ }
685
+ this.chains = chains;
686
+ this.selectedChain = options.defaultChainId;
687
+ if (!this.chains.has(this.selectedChain)) {
688
+ throw new Error(
689
+ `Chain ${this.selectedChain} not found in configured chains`
690
+ );
691
+ }
692
+ this.iframes = {
693
+ keychain: new KeychainIFrame({
694
+ ...options,
695
+ onClose: this.keychain?.reset,
696
+ onConnect: (keychain) => {
697
+ this.keychain = keychain;
698
+ }
699
+ })
700
+ };
701
+ this.options = options;
702
+ if (typeof window !== "undefined") {
703
+ window.starknet_controller = this;
704
+ }
705
+ }
706
+ async probe() {
707
+ try {
708
+ await this.waitForKeychain();
709
+ if (!this.keychain) {
710
+ console.error(new NotReadyToConnect().message);
711
+ return;
712
+ }
713
+ const response = await this.keychain.probe(this.rpcUrl());
714
+ let rpcUrl = response?.rpcUrl || this.rpcUrl();
715
+ this.account = new account_default(
716
+ this,
717
+ rpcUrl,
718
+ response.address,
719
+ this.keychain,
720
+ this.options,
721
+ this.iframes.keychain
722
+ );
723
+ } catch (e) {
724
+ console.error(e);
725
+ return;
726
+ }
727
+ if (!this.iframes.profile) {
728
+ const username = await this.keychain.username();
729
+ this.iframes.profile = new ProfileIFrame({
730
+ ...this.options,
731
+ onConnect: (profile) => {
732
+ this.profile = profile;
733
+ },
734
+ methods: {
735
+ openSettings: () => this.openSettings.bind(this),
736
+ openPurchaseCredits: () => this.openPurchaseCredits.bind(this),
737
+ openExecute: () => this.openExecute.bind(this)
738
+ },
739
+ rpcUrl: this.rpcUrl(),
740
+ username,
741
+ version: this.version
742
+ });
743
+ }
744
+ return this.account;
745
+ }
746
+ async connect() {
747
+ if (this.account) {
748
+ return this.account;
749
+ }
750
+ if (!this.keychain || !this.iframes.keychain) {
751
+ console.error(new NotReadyToConnect().message);
752
+ return;
753
+ }
754
+ if (!!document.hasStorageAccess) {
755
+ const ok = await document.hasStorageAccess();
756
+ if (!ok) {
757
+ await document.requestStorageAccess();
758
+ }
759
+ }
760
+ this.iframes.keychain.open();
761
+ try {
762
+ let response = await this.keychain.connect(
763
+ this.options.policies || {},
764
+ this.rpcUrl()
765
+ );
766
+ if (response.code !== "SUCCESS" /* SUCCESS */) {
767
+ throw new Error(response.message);
768
+ }
769
+ response = response;
770
+ this.account = new account_default(
771
+ this,
772
+ this.rpcUrl(),
773
+ response.address,
774
+ this.keychain,
775
+ this.options,
776
+ this.iframes.keychain
777
+ );
778
+ return this.account;
779
+ } catch (e) {
780
+ console.log(e);
781
+ } finally {
782
+ this.iframes.keychain.close();
783
+ }
784
+ }
785
+ async switchStarknetChain(chainId) {
786
+ if (!this.keychain || !this.iframes.keychain) {
787
+ console.error(new NotReadyToConnect().message);
788
+ return false;
789
+ }
790
+ try {
791
+ this.selectedChain = chainId;
792
+ const response = await this.keychain.probe(this.rpcUrl());
793
+ if (response.rpcUrl === this.rpcUrl()) {
794
+ return true;
795
+ }
796
+ await this.keychain.switchChain(this.rpcUrl());
797
+ } catch (e) {
798
+ console.error(e);
799
+ return false;
800
+ }
801
+ this.emitNetworkChanged(chainId);
802
+ return true;
803
+ }
804
+ addStarknetChain(_chain) {
805
+ return Promise.resolve(true);
806
+ }
807
+ async disconnect() {
808
+ if (!this.keychain) {
809
+ console.error(new NotReadyToConnect().message);
810
+ return;
811
+ }
812
+ if (!!document.hasStorageAccess) {
813
+ const ok = await document.hasStorageAccess();
814
+ if (!ok) {
815
+ await document.requestStorageAccess();
816
+ }
817
+ }
818
+ this.account = undefined;
819
+ return this.keychain.disconnect();
820
+ }
821
+ async openProfile(tab = "inventory") {
822
+ if (!this.profile || !this.iframes.profile?.url) {
823
+ console.error("Profile is not ready");
824
+ return;
825
+ }
826
+ if (!this.account) {
827
+ console.error("Account is not ready");
828
+ return;
829
+ }
830
+ this.profile.navigate(`${this.iframes.profile.url?.pathname}/${tab}`);
831
+ this.iframes.profile.open();
832
+ }
833
+ async openProfileTo(to) {
834
+ if (!this.profile || !this.iframes.profile?.url) {
835
+ console.error("Profile is not ready");
836
+ return;
837
+ }
838
+ if (!this.account) {
839
+ console.error("Account is not ready");
840
+ return;
841
+ }
842
+ this.profile.navigate(`${this.iframes.profile.url?.pathname}/${to}`);
843
+ this.iframes.profile.open();
844
+ }
845
+ async openProfileAt(at) {
846
+ if (!this.profile || !this.iframes.profile?.url) {
847
+ console.error("Profile is not ready");
848
+ return;
849
+ }
850
+ if (!this.account) {
851
+ console.error("Account is not ready");
852
+ return;
853
+ }
854
+ this.profile.navigate(at);
855
+ this.iframes.profile.open();
856
+ }
857
+ async openSettings() {
858
+ if (!this.keychain || !this.iframes.keychain) {
859
+ console.error(new NotReadyToConnect().message);
860
+ return null;
861
+ }
862
+ if (this.iframes.profile?.sendBackward) {
863
+ this.iframes.profile?.sendBackward();
864
+ } else {
865
+ this.iframes.profile?.close();
866
+ }
867
+ this.iframes.keychain.open();
868
+ const res = await this.keychain.openSettings();
869
+ this.iframes.keychain.close();
870
+ this.iframes.profile?.sendForward?.();
871
+ if (res && res.code === "NOT_CONNECTED" /* NOT_CONNECTED */) {
872
+ return false;
873
+ }
874
+ return true;
875
+ }
876
+ revoke(origin, _policy) {
877
+ if (!this.keychain) {
878
+ console.error(new NotReadyToConnect().message);
879
+ return null;
880
+ }
881
+ return this.keychain.revoke(origin);
882
+ }
883
+ rpcUrl() {
884
+ return this.chains.get(this.selectedChain).rpcUrl;
885
+ }
886
+ username() {
887
+ if (!this.keychain) {
888
+ console.error(new NotReadyToConnect().message);
889
+ return;
890
+ }
891
+ return this.keychain.username();
892
+ }
893
+ openPurchaseCredits() {
894
+ if (!this.keychain || !this.iframes.keychain) {
895
+ console.error(new NotReadyToConnect().message);
896
+ return;
897
+ }
898
+ if (!this.iframes.profile) {
899
+ console.error("Profile is not ready");
900
+ return;
901
+ }
902
+ this.iframes.profile.close();
903
+ this.iframes.keychain.open();
904
+ this.keychain.openPurchaseCredits();
905
+ }
906
+ async openExecute(calls, chainId) {
907
+ if (!this.keychain || !this.iframes.keychain) {
908
+ console.error(new NotReadyToConnect().message);
909
+ return;
910
+ }
911
+ if (!this.iframes.profile) {
912
+ console.error("Profile is not ready");
913
+ return;
914
+ }
915
+ let currentChainId = this.selectedChain;
916
+ if (chainId) {
917
+ this.switchStarknetChain(chainId);
918
+ }
919
+ this.iframes.profile?.sendBackward();
920
+ this.iframes.keychain.open();
921
+ this.iframes.profile?.close();
922
+ const res = await this.keychain.execute(calls, undefined, undefined, true);
923
+ this.iframes.profile?.open();
924
+ this.iframes.keychain.close();
925
+ this.iframes.profile?.sendForward();
926
+ if (chainId) {
927
+ this.switchStarknetChain(currentChainId);
928
+ }
929
+ return !(res && (res.code === "NOT_CONNECTED" /* NOT_CONNECTED */ || res.code === "CANCELED" /* CANCELED */));
930
+ }
931
+ async delegateAccount() {
932
+ if (!this.keychain) {
933
+ console.error(new NotReadyToConnect().message);
934
+ return null;
935
+ }
936
+ return await this.keychain.delegateAccount();
937
+ }
938
+ waitForKeychain({
939
+ timeout = 5e4,
940
+ interval = 100
941
+ } = {}) {
942
+ return new Promise((resolve, reject) => {
943
+ const startTime = Date.now();
944
+ const id = setInterval(() => {
945
+ if (Date.now() - startTime > timeout) {
946
+ clearInterval(id);
947
+ reject(new Error("Timeout waiting for keychain"));
948
+ return;
949
+ }
950
+ if (!this.keychain) return;
951
+ clearInterval(id);
952
+ resolve();
953
+ }, interval);
954
+ });
955
+ }
956
+ };
957
+ var cache = /* @__PURE__ */ new Map();
958
+ async function lookup(request) {
959
+ if (!request.addresses?.length && !request.usernames?.length) {
960
+ return { results: [] };
961
+ }
962
+ const response = await fetch(`${API_URL}/lookup`, {
963
+ method: "POST",
964
+ headers: {
965
+ "Content-Type": "application/json"
966
+ },
967
+ body: JSON.stringify(request)
968
+ });
969
+ if (!response.ok) {
970
+ throw new Error(`HTTP error! status: ${response.status}`);
971
+ }
972
+ return response.json();
973
+ }
974
+ async function lookupUsernames(usernames) {
975
+ const uncachedUsernames = usernames.filter((name) => !cache.has(name));
976
+ if (uncachedUsernames.length > 0) {
977
+ const response = await lookup({ usernames: uncachedUsernames });
978
+ response.results.forEach((result) => {
979
+ cache.set(result.username, result.addresses[0]);
980
+ });
981
+ }
982
+ return new Map(
983
+ usernames.map((name) => [name, cache.get(name)]).filter((entry) => entry[1] !== undefined)
984
+ );
985
+ }
986
+ async function lookupAddresses(addresses) {
987
+ addresses = addresses.map(starknet.num.toHex);
988
+ const uncachedAddresses = addresses.filter((addr) => !cache.has(addr));
989
+ if (uncachedAddresses.length > 0) {
990
+ const response = await lookup({
991
+ addresses: uncachedAddresses
992
+ });
993
+ response.results.forEach((result) => {
994
+ cache.set(result.addresses[0], result.username);
995
+ });
996
+ }
997
+ return new Map(
998
+ addresses.map((addr) => [addr, cache.get(addr)]).filter((entry) => entry[1] !== undefined)
999
+ );
1000
+ }
1001
+
1002
+ // ../../node_modules/.pnpm/@cartridge+presets@https+++codeload.github.com+cartridge-gg+presets+tar.gz+aa3a218/node_modules/@cartridge/presets/dist/index.js
1003
+ var configs = {
1004
+ "blob-arena": {
1005
+ origin: "blobarena.xyz",
1006
+ theme: {
1007
+ colors: {
1008
+ primary: "#980f06"
1009
+ },
1010
+ cover: "https://static.cartridge.gg/presets/blob-arena/cover.png",
1011
+ icon: "https://static.cartridge.gg/presets/blob-arena/icon.png",
1012
+ name: "Blob Arena"
1013
+ }
1014
+ },
1015
+ cartridge: {
1016
+ origin: "*",
1017
+ theme: {
1018
+ name: "Cartridge",
1019
+ icon: "https://static.cartridge.gg/presets/cartridge/icon.svg",
1020
+ cover: {
1021
+ light: "https://static.cartridge.gg/presets/cartridge/cover-light.png",
1022
+ dark: "https://static.cartridge.gg/presets/cartridge/cover-dark.png"
1023
+ }
1024
+ }
1025
+ },
1026
+ "dark-shuffle": {
1027
+ origin: "darkshuffle.io",
1028
+ theme: {
1029
+ colors: {
1030
+ primary: "#F59100"
1031
+ },
1032
+ cover: "https://static.cartridge.gg/presets/dark-shuffle/cover.png",
1033
+ icon: "https://static.cartridge.gg/presets/dark-shuffle/icon.svg",
1034
+ name: "Dark Shuffle"
1035
+ }
1036
+ },
1037
+ "dope-wars": {
1038
+ origin: "dopewars.game",
1039
+ policies: {
1040
+ contracts: {
1041
+ "0x051Fea4450Da9D6aeE758BDEbA88B2f665bCbf549D2C61421AA724E9AC0Ced8F": {
1042
+ name: "VRF Provider",
1043
+ description: "Provides verifiable random functions",
1044
+ methods: [
1045
+ {
1046
+ name: "Request Random",
1047
+ description: "Request a random number",
1048
+ entrypoint: "request_random"
1049
+ }
1050
+ ]
1051
+ },
1052
+ "0x0410466536b5ae074f7fea81e5533b8134a9fa08b3dd077dd9db08f64997d113": {
1053
+ name: "Paper Token",
1054
+ description: "Manages paper approvals",
1055
+ methods: [
1056
+ {
1057
+ name: "Approve",
1058
+ description: "Approve paper usage",
1059
+ entrypoint: "approve"
1060
+ }
1061
+ ]
1062
+ },
1063
+ "0x044a23BbfE03FFe90D3C23Fb6e5A8AD0341036C039363DfA6F3513278Aa51fCA": {
1064
+ name: "Game Contract",
1065
+ description: "Core game mechanics",
1066
+ methods: [
1067
+ {
1068
+ name: "Create Game",
1069
+ description: "Start a new game",
1070
+ entrypoint: "create_game"
1071
+ },
1072
+ {
1073
+ name: "Travel",
1074
+ description: "Travel to a new location",
1075
+ entrypoint: "travel"
1076
+ },
1077
+ {
1078
+ name: "Decide",
1079
+ description: "Make a game decision",
1080
+ entrypoint: "decide"
1081
+ },
1082
+ {
1083
+ name: "End Game",
1084
+ description: "End the current game",
1085
+ entrypoint: "end_game"
1086
+ }
1087
+ ]
1088
+ },
1089
+ "0x0412445e644070C69fEa16b964cC81Cd6dEBF6A4DBf683E2E9686a45ad088de8": {
1090
+ name: "Laundromat Contract",
1091
+ description: "Manages game scoring and laundering",
1092
+ methods: [
1093
+ {
1094
+ name: "Register Score",
1095
+ description: "Register a game score",
1096
+ entrypoint: "register_score"
1097
+ },
1098
+ {
1099
+ name: "Claim",
1100
+ description: "Claim rewards",
1101
+ entrypoint: "claim"
1102
+ },
1103
+ {
1104
+ name: "Launder",
1105
+ description: "Launder resources",
1106
+ entrypoint: "launder"
1107
+ }
1108
+ ]
1109
+ }
1110
+ }
1111
+ },
1112
+ theme: {
1113
+ colors: {
1114
+ primary: "#11ED83"
1115
+ },
1116
+ cover: "https://static.cartridge.gg/presets/dope-wars/cover.png",
1117
+ icon: "https://static.cartridge.gg/presets/dope-wars/icon.png",
1118
+ name: "Dope Wars"
1119
+ }
1120
+ },
1121
+ dragark: {
1122
+ origin: "dragark.net",
1123
+ theme: {
1124
+ colors: {
1125
+ primary: "#71EB34"
1126
+ },
1127
+ cover: "https://static.cartridge.gg/presets/dragark/cover.png",
1128
+ icon: "https://static.cartridge.gg/presets/dragark/icon.png",
1129
+ name: "Dragark"
1130
+ }
1131
+ },
1132
+ eternum: {
1133
+ origin: ["eternum.realms.world", "empire.realms.world"],
1134
+ policies: {
1135
+ contracts: {
1136
+ "0x4ed3a7c5f53c6e96186eaf1b670bd2e2a3699c08e070aedf4e5fc6ac246ddc1": {
1137
+ name: "Pillage",
1138
+ description: "Allows you to raid a structure and pillage resources",
1139
+ methods: [
1140
+ {
1141
+ name: "Battle Pillage",
1142
+ description: "Pillage a structure",
1143
+ entrypoint: "battle_pillage"
1144
+ }
1145
+ ]
1146
+ },
1147
+ "0x2620f65aa2fd72d705306ada1ee7410023a3df03da9291f1ccb744fabfebc0": {
1148
+ name: "Battle contract",
1149
+ description: "Required to engage in battles",
1150
+ methods: [
1151
+ {
1152
+ name: "Battle Start",
1153
+ description: "Start a battle",
1154
+ entrypoint: "battle_start"
1155
+ },
1156
+ {
1157
+ name: "Battle Force Start",
1158
+ description: "Force start a battle",
1159
+ entrypoint: "battle_force_start"
1160
+ },
1161
+ {
1162
+ name: "Battle Join",
1163
+ description: "Join a battle",
1164
+ entrypoint: "battle_join"
1165
+ },
1166
+ {
1167
+ name: "Battle Leave",
1168
+ description: "Leave a battle",
1169
+ entrypoint: "battle_leave"
1170
+ },
1171
+ {
1172
+ name: "Battle Claim",
1173
+ description: "Claim a structure after a battle",
1174
+ entrypoint: "battle_claim"
1175
+ },
1176
+ {
1177
+ name: "Battle Resolve",
1178
+ description: "Reopens the bank after battle",
1179
+ entrypoint: "battle_resolve"
1180
+ }
1181
+ ]
1182
+ },
1183
+ "0x6bf57710571fd159e71b1ed155bb0759027e416c88a06556f321c94c214e768": {
1184
+ name: "Leave battle contract",
1185
+ description: "Allows armies to leave a battle",
1186
+ methods: [
1187
+ {
1188
+ name: "Leave Battle",
1189
+ description: "Leave a battle",
1190
+ entrypoint: "leave_battle"
1191
+ },
1192
+ {
1193
+ name: "Leave Battle If Ended",
1194
+ description: "Leave a battle if its ended",
1195
+ entrypoint: "leave_battle_if_ended"
1196
+ }
1197
+ ]
1198
+ },
1199
+ "0x4b6a35c0c541467674ebb9640113a6d79c6f5a468796e9299b8e484a770032a": {
1200
+ name: "Building contract",
1201
+ description: "Allows to manage buildings",
1202
+ methods: [
1203
+ {
1204
+ name: "Create",
1205
+ description: "Create a building",
1206
+ entrypoint: "create"
1207
+ },
1208
+ {
1209
+ name: "Pause Production",
1210
+ description: "Pause the production of a building",
1211
+ entrypoint: "pause_production"
1212
+ },
1213
+ {
1214
+ name: "Resume Production",
1215
+ description: "Resume production of a building",
1216
+ entrypoint: "resume_production"
1217
+ },
1218
+ {
1219
+ name: "Destroy a building",
1220
+ description: "Destroy a building",
1221
+ entrypoint: "destroy"
1222
+ }
1223
+ ]
1224
+ },
1225
+ "0x57d514154bb4dc319539d4e338312a41c248fb6a5122f82b2f2e11ddd3e67e4": {
1226
+ name: "Guild contract",
1227
+ description: "Allows guild utilities",
1228
+ methods: [
1229
+ {
1230
+ name: "Create Guild",
1231
+ description: "Creates a new guild",
1232
+ entrypoint: "create_guild"
1233
+ },
1234
+ {
1235
+ name: "Join Guild",
1236
+ description: "Join an existing guild",
1237
+ entrypoint: "join_guild"
1238
+ },
1239
+ {
1240
+ name: "Whitelist Player",
1241
+ description: "Add a player to the guild's whitelist",
1242
+ entrypoint: "whitelist_player"
1243
+ },
1244
+ {
1245
+ name: "Transfer Guild Ownership",
1246
+ description: "Transfer ownership of the guild to another player",
1247
+ entrypoint: "transfer_guild_ownership"
1248
+ },
1249
+ {
1250
+ name: "Remove Guild Member",
1251
+ description: "Remove a member from the guild",
1252
+ entrypoint: "remove_guild_member"
1253
+ },
1254
+ {
1255
+ name: "Remove Player From Whitelist",
1256
+ description: "Remove a player from the guild's whitelist",
1257
+ entrypoint: "remove_player_from_whitelist"
1258
+ }
1259
+ ]
1260
+ },
1261
+ "0x2fcc3c1691387321c2f4d6310eda7a14365bd274c1a37ed3948d2e93a56f821": {
1262
+ name: "Hyperstructure contract",
1263
+ description: "Handles the creation and management of hyperstructures",
1264
+ methods: [
1265
+ {
1266
+ name: "Get Points",
1267
+ description: "Gets your total number of points",
1268
+ entrypoint: "get_points"
1269
+ },
1270
+ {
1271
+ name: "Create",
1272
+ description: "Create a new hyperstructure",
1273
+ entrypoint: "create"
1274
+ },
1275
+ {
1276
+ name: "Contribute To Construction",
1277
+ description: "Contribute resources to hyperstructure construction",
1278
+ entrypoint: "contribute_to_construction"
1279
+ },
1280
+ {
1281
+ name: "Set Co Owners",
1282
+ description: "Set additional owners for the hyperstructure",
1283
+ entrypoint: "set_co_owners"
1284
+ },
1285
+ {
1286
+ name: "End Game",
1287
+ description: "Terminates the current game season once you've reached enough points",
1288
+ entrypoint: "end_game"
1289
+ },
1290
+ {
1291
+ name: "Set Access",
1292
+ description: "Configure access permissions for contributions to the hyperstructure",
1293
+ entrypoint: "set_access"
1294
+ }
1295
+ ]
1296
+ },
1297
+ "0xa052c5ca082356bcc8457f0f805eaf18f97d0fdddde3f90f5b238923859ed4": {
1298
+ name: "AMM liquidity contract",
1299
+ description: "Manages liquidity for the Automated Market Maker",
1300
+ methods: [
1301
+ {
1302
+ name: "Add",
1303
+ description: "Add liquidity to the pool",
1304
+ entrypoint: "add"
1305
+ },
1306
+ {
1307
+ name: "Remove",
1308
+ description: "Remove liquidity from the pool",
1309
+ entrypoint: "remove"
1310
+ }
1311
+ ]
1312
+ },
1313
+ "0x4a212c52c4035bc9bd170125216604f406dcd75b41be11d3b4d89047366d84d": {
1314
+ name: "Exploration contract",
1315
+ description: "Allows you to move to unexplored hexes on the map",
1316
+ methods: [
1317
+ {
1318
+ name: "Explore",
1319
+ description: "Explore an uncharted hex on the game map",
1320
+ entrypoint: "explore"
1321
+ }
1322
+ ]
1323
+ },
1324
+ "0x7e3bae0e253a0131063b63ee4d7b27b50329c617ae88b82d529a70f1a11c63": {
1325
+ name: "Naming contract",
1326
+ description: "Manages entity naming in the game",
1327
+ methods: [
1328
+ {
1329
+ name: "Set Entity Name",
1330
+ description: "Assign a custom name to a game entity",
1331
+ entrypoint: "set_entity_name"
1332
+ },
1333
+ {
1334
+ name: "Set Address Name",
1335
+ description: "Assign a custom name to a user's address",
1336
+ entrypoint: "set_address_name"
1337
+ }
1338
+ ]
1339
+ },
1340
+ "0x1b480f620ea35431ab43dba634795b14f547ef3e77370db6f0a31f2fdc21d86": {
1341
+ name: "Realms contract",
1342
+ description: "Manages realm-related actions",
1343
+ methods: [
1344
+ {
1345
+ name: "Create a realm",
1346
+ description: "Create a new realm",
1347
+ entrypoint: "create"
1348
+ },
1349
+ {
1350
+ name: "Upgrade Level",
1351
+ description: "Upgrade the level of a realm",
1352
+ entrypoint: "upgrade_level"
1353
+ },
1354
+ {
1355
+ name: "Quest Claim",
1356
+ description: "Claim rewards from completed quests",
1357
+ entrypoint: "quest_claim"
1358
+ }
1359
+ ]
1360
+ },
1361
+ "0x691a60b709ca5c1c5ff86824831f84deb26f0f5d07d70c0f807eab48110d2f6": {
1362
+ name: "Resource bridge contract",
1363
+ description: "Manages bridge transfers between L2 and Eternum",
1364
+ methods: [
1365
+ {
1366
+ name: "Deposit Initial",
1367
+ description: "Initial deposit of resources for bridge transfer",
1368
+ entrypoint: "deposit_initial"
1369
+ },
1370
+ {
1371
+ name: "Deposit",
1372
+ description: "Deposit additional resources for bridge transfer",
1373
+ entrypoint: "deposit"
1374
+ },
1375
+ {
1376
+ name: "Start Withdraw",
1377
+ description: "Initiate a withdrawal process",
1378
+ entrypoint: "start_withdraw"
1379
+ },
1380
+ {
1381
+ name: "Finish Withdraw",
1382
+ description: "Finalize a withdrawal process",
1383
+ entrypoint: "finish_withdraw"
1384
+ }
1385
+ ]
1386
+ },
1387
+ "0x42c0303a2119a9e20daa60e83c48221cdf1bb2a4c009bab031d1cd3555a127e": {
1388
+ name: "Resource contract",
1389
+ description: "In-game resource management",
1390
+ methods: [
1391
+ {
1392
+ name: "Approve",
1393
+ description: "Approve resource transfer",
1394
+ entrypoint: "approve"
1395
+ },
1396
+ {
1397
+ name: "Send",
1398
+ description: "Send resources to another entity",
1399
+ entrypoint: "send"
1400
+ },
1401
+ {
1402
+ name: "Pickup",
1403
+ description: "Collect available resources after approval",
1404
+ entrypoint: "pickup"
1405
+ }
1406
+ ]
1407
+ },
1408
+ "0x4f92a1d00d3aec8cece60fc2d0fc236fe1d95c54ff0ceb2f393fbc7e0863d8e": {
1409
+ name: "AMM swap contract",
1410
+ description: "Handles token swaps in the Automated Market Maker",
1411
+ methods: [
1412
+ {
1413
+ name: "Buy",
1414
+ description: "Purchase tokens from the liquidity pool",
1415
+ entrypoint: "buy"
1416
+ },
1417
+ {
1418
+ name: "Sell",
1419
+ description: "Sell tokens to the liquidity pool",
1420
+ entrypoint: "sell"
1421
+ }
1422
+ ]
1423
+ },
1424
+ "0x7e2b1334398fafbe640f34bacae99b649d633417960ee397b6a8fb117fec819": {
1425
+ name: "Market contract",
1426
+ description: "Manages trading orders in the in-game market",
1427
+ methods: [
1428
+ {
1429
+ name: "Create Order",
1430
+ description: "Create a new trading order",
1431
+ entrypoint: "create_order"
1432
+ },
1433
+ {
1434
+ name: "Accept Order",
1435
+ description: "Accept a trading order",
1436
+ entrypoint: "accept_order"
1437
+ },
1438
+ {
1439
+ name: "Accept Partial Order",
1440
+ description: "Accept a partial trading order",
1441
+ entrypoint: "accept_partial_order"
1442
+ },
1443
+ {
1444
+ name: "Cancel Order",
1445
+ description: "Cancel a trading order",
1446
+ entrypoint: "cancel_order"
1447
+ }
1448
+ ]
1449
+ },
1450
+ "0x4069c2be57f08fef9f31afc85a5b4c03c208ebdb278b9d853606caa7a9cbee6": {
1451
+ name: "Map travel contract",
1452
+ description: "Manages player movement across the game map",
1453
+ methods: [
1454
+ {
1455
+ name: "Travel Hex",
1456
+ description: "Move to a specific hex on the map",
1457
+ entrypoint: "travel_hex"
1458
+ }
1459
+ ]
1460
+ },
1461
+ "0x26be0ed574aa9ee6f73b53b12f0a199ddbf4ac697470316cdb3d9d1f5680cab": {
1462
+ name: "Army contract",
1463
+ description: "Manages army-related actions",
1464
+ methods: [
1465
+ {
1466
+ name: "Army Create",
1467
+ description: "Create a new army",
1468
+ entrypoint: "army_create"
1469
+ },
1470
+ {
1471
+ name: "Army Delete",
1472
+ description: "Delete an existing army",
1473
+ entrypoint: "army_delete"
1474
+ },
1475
+ {
1476
+ name: "Army Buy Troops",
1477
+ description: "Buy troops for an army",
1478
+ entrypoint: "army_buy_troops"
1479
+ },
1480
+ {
1481
+ name: "Army Merge Troops",
1482
+ description: "Merge troops from multiple armies",
1483
+ entrypoint: "army_merge_troops"
1484
+ }
1485
+ ]
1486
+ },
1487
+ "0x051fea4450da9d6aee758bdeba88b2f665bcbf549d2c61421aa724e9ac0ced8f": {
1488
+ name: "VRF Provider",
1489
+ description: "Verifiable Random Function contract, allows randomness in the game",
1490
+ methods: [
1491
+ {
1492
+ name: "Request Random",
1493
+ description: "Allows requesting random numbers from the VRF provider",
1494
+ entrypoint: "request_random"
1495
+ }
1496
+ ]
1497
+ },
1498
+ "0x057675b9c0bd62b096a2e15502a37b290fa766ead21c33eda42993e48a714b80": {
1499
+ name: "Season pass ERC20 contract",
1500
+ description: "Manages the season passes",
1501
+ methods: [
1502
+ {
1503
+ name: "Approve for all",
1504
+ description: "Approves transfer of season pass",
1505
+ entrypoint: "set_approval_for_all"
1506
+ }
1507
+ ]
1508
+ },
1509
+ "0x4b5e65a9617c7ba3c7ea64324ff4338a400adb1a3cfe903b3f8b647cbb59fb7": {
1510
+ name: "Season Systems",
1511
+ description: "Register and claim",
1512
+ methods: [
1513
+ {
1514
+ name: "Register",
1515
+ description: "Registers to leaderboard",
1516
+ entrypoint: "register_to_leaderboard"
1517
+ },
1518
+ {
1519
+ name: "Claim",
1520
+ description: "Claim",
1521
+ entrypoint: "claim_leaderboard_rewards"
1522
+ }
1523
+ ]
1524
+ }
1525
+ },
1526
+ messages: [
1527
+ {
1528
+ types: {
1529
+ StarknetDomain: [
1530
+ {
1531
+ name: "name",
1532
+ type: "shortstring"
1533
+ },
1534
+ {
1535
+ name: "version",
1536
+ type: "shortstring"
1537
+ },
1538
+ {
1539
+ name: "chainId",
1540
+ type: "shortstring"
1541
+ },
1542
+ {
1543
+ name: "revision",
1544
+ type: "shortstring"
1545
+ }
1546
+ ],
1547
+ "s0_eternum-Message": [
1548
+ {
1549
+ name: "identity",
1550
+ type: "ContractAddress"
1551
+ },
1552
+ {
1553
+ name: "channel",
1554
+ type: "shortstring"
1555
+ },
1556
+ {
1557
+ name: "content",
1558
+ type: "string"
1559
+ },
1560
+ {
1561
+ name: "timestamp",
1562
+ type: "felt"
1563
+ },
1564
+ {
1565
+ name: "salt",
1566
+ type: "felt"
1567
+ }
1568
+ ]
1569
+ },
1570
+ primaryType: "s0_eternum-Message",
1571
+ domain: {
1572
+ name: "Eternum",
1573
+ version: "1",
1574
+ chainId: "SN_MAIN",
1575
+ revision: "1"
1576
+ }
1577
+ }
1578
+ ]
1579
+ },
1580
+ theme: {
1581
+ name: "Eternum",
1582
+ icon: "https://static.cartridge.gg/presets/eternum/icon.svg",
1583
+ cover: "https://static.cartridge.gg/presets/eternum/cover.png",
1584
+ colors: {
1585
+ primary: "#dc8b07"
1586
+ }
1587
+ }
1588
+ },
1589
+ flippyflop: {
1590
+ origin: "flippyflop.gg",
1591
+ theme: {
1592
+ colors: {
1593
+ primary: "#F38332"
1594
+ },
1595
+ cover: "https://static.cartridge.gg/presets/flippyflop/cover.png",
1596
+ icon: "https://static.cartridge.gg/presets/flippyflop/icon.png",
1597
+ name: "FlippyFlop"
1598
+ }
1599
+ },
1600
+ "force-prime": {
1601
+ origin: "forceprime.io",
1602
+ theme: {
1603
+ colors: {
1604
+ primary: "#E1CC89"
1605
+ },
1606
+ cover: "https://static.cartridge.gg/presets/force-prime/cover.png",
1607
+ icon: "https://static.cartridge.gg/presets/force-prime/icon.png",
1608
+ name: "Force Prime"
1609
+ }
1610
+ },
1611
+ "jokers-of-neon": {
1612
+ origin: "jokersofneon.com",
1613
+ theme: {
1614
+ colors: {
1615
+ primary: "#A144B2"
1616
+ },
1617
+ cover: "https://static.cartridge.gg/presets/jokers-of-neon/cover.png",
1618
+ icon: "https://static.cartridge.gg/presets/jokers-of-neon/icon.png",
1619
+ name: "Jokers of Neon"
1620
+ }
1621
+ },
1622
+ "loot-survivor": {
1623
+ origin: "lootsurvivor.io",
1624
+ policies: {
1625
+ contracts: {
1626
+ "0x0305f26ad19e0a10715d9f3137573d3a543de7b707967cd85d11234d6ec0fb7e": {
1627
+ methods: [
1628
+ {
1629
+ entrypoint: "attack"
1630
+ },
1631
+ {
1632
+ entrypoint: "drop"
1633
+ },
1634
+ {
1635
+ entrypoint: "equip"
1636
+ },
1637
+ {
1638
+ entrypoint: "explore"
1639
+ },
1640
+ {
1641
+ entrypoint: "flee"
1642
+ },
1643
+ {
1644
+ entrypoint: "new_game"
1645
+ },
1646
+ {
1647
+ entrypoint: "transfer_from"
1648
+ },
1649
+ {
1650
+ entrypoint: "upgrade"
1651
+ }
1652
+ ]
1653
+ },
1654
+ "0x3347382d530ff6acb9283ac1d78471187aae8a4690e9316bb4e3c3365ff7a86": {
1655
+ methods: [
1656
+ {
1657
+ entrypoint: "enter_tournament"
1658
+ },
1659
+ {
1660
+ entrypoint: "start_tournament"
1661
+ }
1662
+ ]
1663
+ }
1664
+ }
1665
+ },
1666
+ theme: {
1667
+ colors: {
1668
+ primary: "#33FF33"
1669
+ },
1670
+ cover: "https://static.cartridge.gg/presets/loot-survivor/cover.png",
1671
+ icon: "https://static.cartridge.gg/presets/loot-survivor/icon.png",
1672
+ name: "Loot Survivor"
1673
+ }
1674
+ },
1675
+ paved: {
1676
+ origin: "paved.gg",
1677
+ theme: {
1678
+ colors: {
1679
+ primary: "#B0CAF8"
1680
+ },
1681
+ cover: "https://static.cartridge.gg/presets/paved/cover.png",
1682
+ icon: "https://static.cartridge.gg/presets/paved/icon.svg",
1683
+ name: "Paved"
1684
+ }
1685
+ },
1686
+ pistols: {
1687
+ origin: "pistols.underware.gg",
1688
+ theme: {
1689
+ colors: {
1690
+ primary: "#EF9758"
1691
+ },
1692
+ cover: "https://static.cartridge.gg/presets/pistols/cover.png",
1693
+ icon: "https://static.cartridge.gg/presets/pistols/icon.png",
1694
+ name: "Pistols at Ten Blocks"
1695
+ }
1696
+ },
1697
+ pixelaw: {
1698
+ origin: "dojo.pixelaw.xyz",
1699
+ theme: {
1700
+ colors: {
1701
+ primary: "#7C00B1",
1702
+ primaryForeground: "white"
1703
+ },
1704
+ cover: "https://static.cartridge.gg/presets/pixelaw/cover.png",
1705
+ icon: "https://static.cartridge.gg/presets/pixelaw/icon.svg",
1706
+ name: "Pixelaw"
1707
+ }
1708
+ },
1709
+ "realm-of-ra": {
1710
+ origin: "mancala.realmofra.com",
1711
+ theme: {
1712
+ colors: {
1713
+ primary: "#de9534"
1714
+ },
1715
+ cover: "https://static.cartridge.gg/presets/realm-of-ra/cover.png",
1716
+ icon: "https://static.cartridge.gg/presets/realm-of-ra/icon.png",
1717
+ name: "Realm of Ra"
1718
+ }
1719
+ },
1720
+ "savage-summit": {
1721
+ origin: "savagesummit.io",
1722
+ theme: {
1723
+ colors: {
1724
+ primary: "#fbf7da"
1725
+ },
1726
+ cover: "https://static.cartridge.gg/presets/savage-summit/cover.png",
1727
+ icon: "https://static.cartridge.gg/presets/savage-summit/icon.png",
1728
+ name: "Savage Summit"
1729
+ }
1730
+ },
1731
+ "tale-weaver": {
1732
+ origin: "",
1733
+ theme: {
1734
+ colors: {
1735
+ primary: "#fce377"
1736
+ },
1737
+ cover: "https://static.cartridge.gg/presets/tale-weaver/cover.png",
1738
+ icon: "https://static.cartridge.gg/presets/tale-weaver/icon.png",
1739
+ name: "Tale Weaver"
1740
+ }
1741
+ },
1742
+ zkastle: {
1743
+ origin: "zkastle.vercel.app",
1744
+ theme: {
1745
+ colors: {
1746
+ primary: "#E50D2C"
1747
+ },
1748
+ cover: "https://static.cartridge.gg/presets/zkastle/cover.png",
1749
+ icon: "https://static.cartridge.gg/presets/zkastle/icon.svg",
1750
+ name: "zKastle"
1751
+ }
1752
+ },
1753
+ zktt: {
1754
+ origin: "zktable.top",
1755
+ theme: {
1756
+ colors: {
1757
+ primary: "#FFFFFF"
1758
+ },
1759
+ cover: "https://static.cartridge.gg/presets/zktt/cover.png",
1760
+ icon: "https://static.cartridge.gg/presets/zktt/icon.png",
1761
+ name: "zKTT"
1762
+ }
1763
+ },
1764
+ zkube: {
1765
+ origin: "app.zkube.xyz",
1766
+ theme: {
1767
+ colors: {
1768
+ primary: "#5bc3e6"
1769
+ },
1770
+ cover: "https://static.cartridge.gg/presets/zkube/cover.png",
1771
+ icon: "https://static.cartridge.gg/presets/zkube/icon.png",
1772
+ name: "zKube"
1773
+ }
1774
+ }
1775
+ };
1776
+ var metadata = [
1777
+ {
1778
+ name: "Wrapped BTC",
1779
+ symbol: "WBTC",
1780
+ decimals: 8,
1781
+ l2_token_address: "0x03fe2b97c1fd336e750087d68b9b867997fd64a2661ff3ca5a7c771641e8e7ac",
1782
+ sort_order: 0,
1783
+ total_supply: null,
1784
+ logo_url: "https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/7dcb2db2-a7a7-44af-660b-8262e057a100/logo"
1785
+ },
1786
+ {
1787
+ name: "USD Coin",
1788
+ symbol: "USDC",
1789
+ decimals: 6,
1790
+ l2_token_address: "0x053c91253bc9682c04929ca02ed00b3e423f6710d2ee7e0d5ebb06f3ecf368a8",
1791
+ sort_order: 5,
1792
+ total_supply: null,
1793
+ logo_url: "https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/e5aaa970-a998-47e8-bd43-4a3b56b87200/logo"
1794
+ },
1795
+ {
1796
+ name: "Tether USD",
1797
+ symbol: "USDT",
1798
+ decimals: 6,
1799
+ l2_token_address: "0x068f5c6a61780768455de69077e07e89787839bf8166decfbf92b645209c0fb8",
1800
+ sort_order: 4,
1801
+ total_supply: null,
1802
+ logo_url: "https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/c8a721d1-07c3-46e4-ab4e-523977c30b00/logo"
1803
+ },
1804
+ {
1805
+ name: "Ether",
1806
+ symbol: "ETH",
1807
+ decimals: 18,
1808
+ l2_token_address: "0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7",
1809
+ sort_order: 3,
1810
+ total_supply: null,
1811
+ logo_url: "https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/e07829b7-0382-4e03-7ecd-a478c5aa9f00/logo"
1812
+ },
1813
+ {
1814
+ name: "Dai Stablecoin",
1815
+ symbol: "DAI",
1816
+ decimals: 18,
1817
+ l2_token_address: "0x05574eb6b8789a91466f902c380d978e472db68170ff82a5b650b95a58ddf4ad",
1818
+ sort_order: 4,
1819
+ total_supply: null,
1820
+ logo_url: "https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/919e761b-56f7-4f53-32aa-5e066f7f6200/logo"
1821
+ },
1822
+ {
1823
+ name: "Wrapped liquid staked Ether 2.0",
1824
+ symbol: "wstETH",
1825
+ decimals: 18,
1826
+ l2_token_address: "0x042b8f0484674ca266ac5d08e4ac6a3fe65bd3129795def2dca5c34ecc5f96d2",
1827
+ sort_order: 1,
1828
+ total_supply: null,
1829
+ logo_url: "https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/dbbcbdea-1a92-437d-3701-4a5ee129d000/logo"
1830
+ },
1831
+ {
1832
+ name: "Rocket Pool ETH",
1833
+ symbol: "rETH",
1834
+ decimals: 18,
1835
+ l2_token_address: "0x0319111a5037cbec2b3e638cc34a3474e2d2608299f3e62866e9cc683208c610",
1836
+ sort_order: 1,
1837
+ total_supply: null,
1838
+ logo_url: "https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/c9f2d6fe-fbc6-4384-0990-923dfcb7a200/logo"
1839
+ },
1840
+ {
1841
+ name: "Paper",
1842
+ symbol: "PAPER",
1843
+ decimals: 18,
1844
+ l2_token_address: "0x0410466536b5ae074f7fea81e5533b8134a9fa08b3dd077dd9db08f64997d113",
1845
+ sort_order: 1,
1846
+ total_supply: null,
1847
+ hidden: true,
1848
+ logo_url: "https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/811f019a-0461-4cff-6c1e-442102863f00/logo"
1849
+ },
1850
+ {
1851
+ name: "Uniswap",
1852
+ symbol: "UNI",
1853
+ decimals: 18,
1854
+ l2_token_address: "0x049210ffc442172463f3177147c1aeaa36c51d152c1b0630f2364c300d4f48ee",
1855
+ sort_order: 1,
1856
+ total_supply: 1e9,
1857
+ logo_url: "https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/361b018e-bd53-4019-27c8-7cf8d9031b00/logo"
1858
+ },
1859
+ {
1860
+ name: "Starknet",
1861
+ symbol: "STRK",
1862
+ decimals: 18,
1863
+ l2_token_address: "0x04718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d",
1864
+ sort_order: 2,
1865
+ total_supply: 1e10,
1866
+ logo_url: "https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/1b126320-367c-48ed-cf5a-ba7580e49600/logo"
1867
+ },
1868
+ {
1869
+ name: "Ekubo Protocol",
1870
+ symbol: "EKUBO",
1871
+ decimals: 18,
1872
+ l2_token_address: "0x075afe6402ad5a5c20dd25e10ec3b3986acaa647b77e4ae24b0cbc9a54a27a87",
1873
+ sort_order: 1,
1874
+ total_supply: 1e7,
1875
+ logo_url: "https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/634d9c36-2f0b-4781-93e6-72d701b5af00/logo"
1876
+ },
1877
+ {
1878
+ name: "Nostra",
1879
+ symbol: "NSTR",
1880
+ decimals: 18,
1881
+ l2_token_address: "0x00c530f2c0aa4c16a0806365b0898499fba372e5df7a7172dc6fe9ba777e8007",
1882
+ sort_order: 1,
1883
+ total_supply: 1e8,
1884
+ logo_url: "https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/a45c2224-17a7-4269-ea7e-3924e9755800/logo"
1885
+ },
1886
+ {
1887
+ name: "Carmine",
1888
+ symbol: "CRM",
1889
+ decimals: 18,
1890
+ l2_token_address: "0x51c4b1fe3bf6774b87ad0b15ef5d1472759076e42944fff9b9f641ff13e5bbe",
1891
+ sort_order: 1,
1892
+ total_supply: 1e8,
1893
+ logo_url: "https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/6ab817f1-8075-4a94-6e14-f112f1f89d00/logo"
1894
+ },
1895
+ {
1896
+ name: "Cash",
1897
+ symbol: "CASH",
1898
+ decimals: 18,
1899
+ l2_token_address: "0x498edfaf50ca5855666a700c25dd629d577eb9afccdf3b5977aec79aee55ada",
1900
+ sort_order: 3,
1901
+ total_supply: null,
1902
+ logo_url: "https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/6bd6d156-f509-4b51-5dfc-3ee566143600/logo"
1903
+ },
1904
+ {
1905
+ name: "Lords",
1906
+ symbol: "LORDS",
1907
+ decimals: 18,
1908
+ l2_token_address: "0x0124aeb495b947201f5fac96fd1138e326ad86195b98df6dec9009158a533b49",
1909
+ sort_order: 1,
1910
+ total_supply: null,
1911
+ logo_url: "https://empire.realms.world/images/resources/coin.png"
1912
+ },
1913
+ {
1914
+ name: "Ancien Fragments",
1915
+ symbol: "ANCIENT_FRAGMENT",
1916
+ decimals: 18,
1917
+ l2_token_address: "0x0695b08ecdfdd828c2e6267da62f59e6d7543e690ef56a484df25c8566b332a5",
1918
+ sort_order: 2,
1919
+ total_supply: null,
1920
+ logo_url: "https://empire.realms.world/images/resources/29.png"
1921
+ },
1922
+ {
1923
+ name: "Knight",
1924
+ symbol: "KNIGHT",
1925
+ decimals: 18,
1926
+ l2_token_address: "0x00ac965f9e67164723c16735a9da8dbc9eb8e43b1bd0323591e87c056badf606",
1927
+ sort_order: 3,
1928
+ total_supply: null,
1929
+ logo_url: "https://empire.realms.world/images/icons/250.png"
1930
+ },
1931
+ {
1932
+ name: "Crossbowman",
1933
+ symbol: "CROSSBOWMAN",
1934
+ decimals: 18,
1935
+ l2_token_address: "0x067e4ac00a241be06ba6afc11fa2715ec7da0c42c05a67ef6ecfcfeda725aaa8",
1936
+ sort_order: 4,
1937
+ total_supply: null,
1938
+ logo_url: "https://empire.realms.world/images/icons/251.png"
1939
+ },
1940
+ {
1941
+ name: "Paladin",
1942
+ symbol: "PALADIN",
1943
+ decimals: 18,
1944
+ l2_token_address: "0x03bc86299bee061c7c8d7546ccb62b9daf9bffc653b1508facb722c6593874bc",
1945
+ sort_order: 5,
1946
+ total_supply: null,
1947
+ logo_url: "https://empire.realms.world/images/icons/252.png"
1948
+ },
1949
+ {
1950
+ name: "Donkey",
1951
+ symbol: "DONKEY",
1952
+ decimals: 18,
1953
+ l2_token_address: "0x0264be95a4a2ace20add68cb321acdccd2f9f8440ee1c7abd85da44ddab01085",
1954
+ sort_order: 6,
1955
+ total_supply: null,
1956
+ logo_url: "https://empire.realms.world/images/buildings/thumb/trade.png"
1957
+ },
1958
+ {
1959
+ name: "Wheat",
1960
+ symbol: "WHEAT",
1961
+ decimals: 18,
1962
+ l2_token_address: "0x057a3f1ee475e072ce3be41785c0e889b7295d7a0dcc22b992c5b9408dbeb280",
1963
+ sort_order: 7,
1964
+ total_supply: null,
1965
+ logo_url: "https://empire.realms.world/images/resources/254.png"
1966
+ },
1967
+ {
1968
+ name: "Fish",
1969
+ symbol: "FISH",
1970
+ decimals: 18,
1971
+ l2_token_address: "0x027719173cfe10f1aa38d2aaed0a075b6077290f1e817aa3485d2b828394f4d9",
1972
+ sort_order: 8,
1973
+ total_supply: null,
1974
+ logo_url: "https://empire.realms.world/images/resources/255.png"
1975
+ },
1976
+ {
1977
+ name: "Wood",
1978
+ symbol: "WOOD",
1979
+ decimals: 18,
1980
+ l2_token_address: "0x040d8907cec0f7ae9c364dfb12485a1314d84c129bf1898d2f3d4b7fcc7d44f4",
1981
+ sort_order: 9,
1982
+ total_supply: null,
1983
+ logo_url: "https://empire.realms.world/images/resources/1.png"
1984
+ },
1985
+ {
1986
+ name: "Stone",
1987
+ symbol: "STONE",
1988
+ decimals: 18,
1989
+ l2_token_address: "0x0439a1c010e3e1bb2d43d43411000893c0042bd88f6c701611a0ea914d426da4",
1990
+ sort_order: 10,
1991
+ total_supply: null,
1992
+ logo_url: "https://empire.realms.world/images/resources/2.png"
1993
+ },
1994
+ {
1995
+ name: "Coal",
1996
+ symbol: "COAL",
1997
+ decimals: 18,
1998
+ l2_token_address: "0x00ce635e3f241b0ae78c46a929d84a9101910188f9c4024eaa7559556503c31a",
1999
+ sort_order: 11,
2000
+ total_supply: null,
2001
+ logo_url: "https://empire.realms.world/images/resources/3.png"
2002
+ },
2003
+ {
2004
+ name: "Copper",
2005
+ symbol: "COPPER",
2006
+ decimals: 18,
2007
+ l2_token_address: "0x066ed5c928ee027a9419ace1cbea8389885161db5572a7c5c4fef2310e9bf494",
2008
+ sort_order: 12,
2009
+ total_supply: null,
2010
+ logo_url: "https://empire.realms.world/images/resources/4.png"
2011
+ },
2012
+ {
2013
+ name: "Obsidian",
2014
+ symbol: "OBSIDIAN",
2015
+ decimals: 18,
2016
+ l2_token_address: "0x03b6448d09dcd023507376402686261f5d6739455fa02f804907b066e488da66",
2017
+ sort_order: 13,
2018
+ total_supply: null,
2019
+ logo_url: "https://empire.realms.world/images/resources/5.png"
2020
+ },
2021
+ {
2022
+ name: "Silver",
2023
+ symbol: "SILVER",
2024
+ decimals: 18,
2025
+ l2_token_address: "0x06fe21d2d4a8a05bdb70f09c9250af9870020d5dcc35f410b4a39d6605c3e353",
2026
+ sort_order: 14,
2027
+ total_supply: null,
2028
+ logo_url: "https://empire.realms.world/images/resources/6.png"
2029
+ },
2030
+ {
2031
+ name: "Ironwood",
2032
+ symbol: "IRONWOOD",
2033
+ decimals: 18,
2034
+ l2_token_address: "0x01720cf6318bff45e62acc588680ae3cd4d5f8465b1d52cb710533c9299b031a",
2035
+ sort_order: 15,
2036
+ total_supply: null,
2037
+ logo_url: "https://empire.realms.world/images/resources/7.png"
2038
+ },
2039
+ {
2040
+ name: "Cold Iron",
2041
+ symbol: "COLDIRON",
2042
+ decimals: 18,
2043
+ l2_token_address: "0x0555d713e59d4ff96b7960447e9bc9e79bfdeab5b0eea74e3df81bce61cfbc77",
2044
+ sort_order: 16,
2045
+ total_supply: null,
2046
+ logo_url: "https://empire.realms.world/images/resources/8.png"
2047
+ },
2048
+ {
2049
+ name: "Gold",
2050
+ symbol: "GOLD",
2051
+ decimals: 18,
2052
+ l2_token_address: "0x000dff9dca192609c4e86ab3be22c7ec1e968876c992d21986f3c542be97fa2f",
2053
+ sort_order: 17,
2054
+ total_supply: null,
2055
+ logo_url: "https://empire.realms.world/images/resources/9.png"
2056
+ },
2057
+ {
2058
+ name: "Hartwood",
2059
+ symbol: "HARTWOOD",
2060
+ decimals: 18,
2061
+ l2_token_address: "0x05620aa7170cd66dbcbc37d03087bfe4633ffef91d3e4d97b501de906004f79b",
2062
+ sort_order: 18,
2063
+ total_supply: null,
2064
+ logo_url: "https://empire.realms.world/images/resources/10.png"
2065
+ },
2066
+ {
2067
+ name: "Diamonds",
2068
+ symbol: "DIAMONDS",
2069
+ decimals: 18,
2070
+ l2_token_address: "0x00e03ea8ae385f64754820af5c01c36abf1b8130dd6797d3fd9d430e4114e876",
2071
+ sort_order: 19,
2072
+ total_supply: null,
2073
+ logo_url: "https://empire.realms.world/images/resources/11.png"
2074
+ },
2075
+ {
2076
+ name: "Sapphire",
2077
+ symbol: "SAPPHIRE",
2078
+ decimals: 18,
2079
+ l2_token_address: "0x02f8dd022568af8f9f718aa37707a9b858529db56910633a160456838b6cbcbc",
2080
+ sort_order: 20,
2081
+ total_supply: null,
2082
+ logo_url: "https://empire.realms.world/images/resources/12.png"
2083
+ },
2084
+ {
2085
+ name: "Ruby",
2086
+ symbol: "RUBY",
2087
+ decimals: 18,
2088
+ l2_token_address: "0x03d9b66720959d0e7687b898292c10e62e78626f2dba5e1909961a2ce3f86612",
2089
+ sort_order: 21,
2090
+ total_supply: null,
2091
+ logo_url: "https://empire.realms.world/images/resources/13.png"
2092
+ },
2093
+ {
2094
+ name: "Deep Crystal",
2095
+ symbol: "DEEPCRYSTAL",
2096
+ decimals: 18,
2097
+ l2_token_address: "0x01d655ac834d38df7921074fc1588411e202b1af83307cbd996983aff52db3a8",
2098
+ sort_order: 22,
2099
+ total_supply: null,
2100
+ logo_url: "https://empire.realms.world/images/resources/14.png"
2101
+ },
2102
+ {
2103
+ name: "Ignium",
2104
+ symbol: "IGNIUM",
2105
+ decimals: 18,
2106
+ l2_token_address: "0x0625c1f789b03ebebc7a9322366f38ebad1f693b84b2abd8cb8f5b2748b0cdd5",
2107
+ sort_order: 23,
2108
+ total_supply: null,
2109
+ logo_url: "https://empire.realms.world/images/resources/15.png"
2110
+ },
2111
+ {
2112
+ name: "Ethereal Silica",
2113
+ symbol: "ETHEREALSILICA",
2114
+ decimals: 18,
2115
+ l2_token_address: "0x068b6e23cbbd58a644700f55e96c83580921e9f521b6e5175396b53ba7910e7d",
2116
+ sort_order: 24,
2117
+ total_supply: null,
2118
+ logo_url: "https://empire.realms.world/images/resources/16.png"
2119
+ },
2120
+ {
2121
+ name: "True Ice",
2122
+ symbol: "TRUEICE",
2123
+ decimals: 18,
2124
+ l2_token_address: "0x04485f5a6e16562e1c761cd348e63256d00389e3ddf4f5d98afe7ab44c57c481",
2125
+ sort_order: 25,
2126
+ total_supply: null,
2127
+ logo_url: "https://empire.realms.world/images/resources/17.png"
2128
+ },
2129
+ {
2130
+ name: "Twilight Quartz",
2131
+ symbol: "TWILIGHTQUARTZ",
2132
+ decimals: 18,
2133
+ l2_token_address: "0x035e24c02409c3cfe8d5646399a62c4d102bb782938d5f5180e92c9c62d3faf7",
2134
+ sort_order: 26,
2135
+ total_supply: null,
2136
+ logo_url: "https://empire.realms.world/images/resources/18.png"
2137
+ },
2138
+ {
2139
+ name: "Alchemical Silver",
2140
+ symbol: "ALCHEMICALSILVER",
2141
+ decimals: 18,
2142
+ l2_token_address: "0x03956a5301e99522038a2e7dcb9c2a89bf087ffa79310ee0a508b5538efd8ddd",
2143
+ sort_order: 27,
2144
+ total_supply: null,
2145
+ logo_url: "https://empire.realms.world/images/resources/19.png"
2146
+ },
2147
+ {
2148
+ name: "Adamantine",
2149
+ symbol: "ADAMANTINE",
2150
+ decimals: 18,
2151
+ l2_token_address: "0x0367f838f85a2f5e1580d6f011e4476f581083314cff8721ba3dda9706076eed",
2152
+ sort_order: 28,
2153
+ total_supply: null,
2154
+ logo_url: "https://empire.realms.world/images/resources/20.png"
2155
+ },
2156
+ {
2157
+ name: "Mithral",
2158
+ symbol: "MITHRAL",
2159
+ decimals: 18,
2160
+ l2_token_address: "0x0067ba235c569c23877064b2ac6ebd4d79f32d3c00f5fab8e28a3b5700b957f6",
2161
+ sort_order: 29,
2162
+ total_supply: null,
2163
+ logo_url: "https://empire.realms.world/images/resources/21.png"
2164
+ },
2165
+ {
2166
+ name: "Dragon Hide",
2167
+ symbol: "DRAGONHIDE",
2168
+ decimals: 18,
2169
+ l2_token_address: "0x03bf856515bece3c93f5061b7941b8645f817a0acab93c758b8c7b4bc0afa3c6",
2170
+ sort_order: 30,
2171
+ total_supply: null,
2172
+ logo_url: "https://empire.realms.world/images/resources/22.png"
2173
+ },
2174
+ {
2175
+ name: "Demon Hide",
2176
+ symbol: "DEMONHIDE",
2177
+ decimals: 18,
2178
+ l2_token_address: "0x03b847fbef9d344ba968edc945100e6ab0258a4b1b91f8665f85a3d814c3e4d4",
2179
+ sort_order: 31,
2180
+ total_supply: null,
2181
+ logo_url: "https://empire.realms.world/images/resources/22.png"
2182
+ }
2183
+ ];
2184
+ var controllerConfigs = configs;
2185
+ var erc20Metadata = metadata;
2186
+ var defaultTheme = configs["cartridge"].theme;
2187
+
2188
+ exports.NotReadyToConnect = NotReadyToConnect;
2189
+ exports.ResponseCodes = ResponseCodes;
2190
+ exports.controllerConfigs = controllerConfigs;
2191
+ exports.default = ControllerProvider;
2192
+ exports.defaultTheme = defaultTheme;
2193
+ exports.erc20Metadata = erc20Metadata;
2194
+ exports.lookupAddresses = lookupAddresses;
2195
+ exports.lookupUsernames = lookupUsernames;
2196
+ exports.toArray = toArray;
2197
+ exports.toSessionPolicies = toSessionPolicies;
2198
+ exports.toWasmPolicies = toWasmPolicies;
2199
+ //# sourceMappingURL=index.cjs.map
2200
+ //# sourceMappingURL=index.cjs.map