@rhinestone/shared-configs 1.11.1 → 1.12.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.
@@ -36,6 +36,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.classifyChainNetworks = classifyChainNetworks;
37
37
  exports.classifyChainCaip2 = classifyChainCaip2;
38
38
  exports.classifyChainExplorers = classifyChainExplorers;
39
+ exports.validateChainIconSlugs = validateChainIconSlugs;
40
+ exports.classifyChainPublicRpcUrls = classifyChainPublicRpcUrls;
39
41
  exports.classifyChainStacks = classifyChainStacks;
40
42
  exports.validateChainConfig = validateChainConfig;
41
43
  exports.formatValidationIssues = formatValidationIssues;
@@ -141,6 +143,18 @@ function structuralProblems(chain) {
141
143
  else if (chain.explorer !== null && !isChainExplorer(chain.explorer)) {
142
144
  problems.push(`explorer ${JSON.stringify(chain.explorer)} is not null or { url (no trailing slash), addressPath, txPath (both slash-wrapped) }`);
143
145
  }
146
+ // Optional, like publicRpcUrl below: a chain with no mark renders as a
147
+ // coloured initial chip. Only the shape is checked here — whether a chain is
148
+ // ALLOWED to have none is validateChainIconSlugs' job.
149
+ if (!isAbsentOr(chain.iconSlug, isIconSlug)) {
150
+ problems.push(`iconSlug ${JSON.stringify(chain.iconSlug)} is not a bare filename stem (lowercase letters, digits and hyphens)`);
151
+ }
152
+ // Optional, unlike the four above: a chain with no known public endpoint is
153
+ // display-only, which is a real answer. Only its shape is checked, and only
154
+ // when present — see classifyChainPublicRpcUrls for why it must be https.
155
+ if (!isAbsentOr(chain.publicRpcUrl, isPublicRpcUrl)) {
156
+ problems.push(`publicRpcUrl ${JSON.stringify(chain.publicRpcUrl)} is not an https:// URL`);
157
+ }
144
158
  if (!isAbsentOr(chain.virtual, (v) => typeof v === 'boolean')) {
145
159
  problems.push('virtual is not a boolean');
146
160
  }
@@ -499,6 +513,186 @@ function classifyChainExplorers(chains, networks) {
499
513
  }
500
514
  return { chains: stamped, issues };
501
515
  }
516
+ /**
517
+ * A bare filename stem: no directory, no extension, no scheme.
518
+ *
519
+ * The shape is what keeps the field a chain fact rather than a URL. A value
520
+ * carrying `https://`, a `chains/` prefix or a `.svg` suffix would have baked
521
+ * this CDN's layout into a signed artifact every service reads — the exact
522
+ * coupling the field is a slug to avoid.
523
+ */
524
+ const ICON_SLUG = /^[a-z0-9][a-z0-9-]*$/;
525
+ const isIconSlug = (value) => typeof value === 'string' && ICON_SLUG.test(value);
526
+ /**
527
+ * Chain ids that are allowed to ship with no `iconSlug`.
528
+ *
529
+ * An entry here is a decision that this chain renders as a coloured initial
530
+ * chip. Every id needs a reason next to it, and the reason should stop being
531
+ * true eventually — when a mark is published, the entry goes.
532
+ */
533
+ // Empty, and worth keeping that way: every chain in the registry has a mark.
534
+ // An entry here permanently excuses a chain from the check below, so it is for
535
+ // a chain whose mark genuinely cannot be obtained — not for one nobody has got
536
+ // round to yet.
537
+ const CHAINS_WITHOUT_ICON = new Map();
538
+ /**
539
+ * Fails the build for a chain that has neither a mark nor an explicit exemption.
540
+ *
541
+ * Why an error and not a warning: `iconSlug` is authored by hand, so the failure
542
+ * mode of a new chain is silence — nobody forgets a field they were never
543
+ * prompted for, and the result is a blank tile in production that no test, type
544
+ * or log names. The gate turns that into a build failure at the moment someone
545
+ * is already editing the registry, which is the only point where the decision is
546
+ * cheap. CHAINS_WITHOUT_ICON is how "this chain genuinely has no mark" is said
547
+ * out loud, in code review, rather than being indistinguishable from an oversight.
548
+ *
549
+ * Deliberately offline. Whether `chains/<slug>.svg` actually exists on the CDN is
550
+ * not checked and must not be: the build would then fail on a CDN blip or in a
551
+ * sandboxed CI runner, which is a far more frequent failure than a typo'd slug
552
+ * and produces a red build with nothing wrong in the diff. The cost of a bad slug
553
+ * is one missing image; the cost of a network-dependent build gate is every build.
554
+ */
555
+ function validateChainIconSlugs(chains,
556
+ // Injectable so the exemption paths stay covered while the real map is empty.
557
+ // Testing them against a live entry would mean keeping a chain un-iconed just
558
+ // to have something to assert on.
559
+ exemptions = CHAINS_WITHOUT_ICON) {
560
+ const issues = [];
561
+ for (const [chainId, chain] of Object.entries(chains)) {
562
+ const chainName = isNonEmptyString(chain?.name)
563
+ ? chain.name
564
+ : '<unnamed>';
565
+ const slug = chain?.iconSlug;
566
+ const exemption = exemptions.get(chainId);
567
+ if (slug === undefined) {
568
+ if (exemption === undefined) {
569
+ issues.push({
570
+ severity: 'error',
571
+ chainId,
572
+ chainName,
573
+ message: 'has no iconSlug — add the filename stem of its mark in rhinestonewtf/s3-public ' +
574
+ "(`chains/<slug>.svg`) to this chain's chainMeta entry in " +
575
+ 'config/shared-configs.jsonnet, or, if it genuinely has none, add its id to ' +
576
+ 'CHAINS_WITHOUT_ICON in scripts/validation.ts with the reason. It is not ' +
577
+ 'defaulted: a chain with no mark renders as a blank tile with nothing logged',
578
+ });
579
+ }
580
+ continue;
581
+ }
582
+ // A stale exemption is worse than no exemption: it permanently excuses the
583
+ // one chain it names, so the next person to drop the slug gets no warning.
584
+ if (exemption !== undefined) {
585
+ issues.push({
586
+ severity: 'error',
587
+ chainId,
588
+ chainName,
589
+ message: `has an iconSlug ${JSON.stringify(slug)} but is still listed in CHAINS_WITHOUT_ICON (${exemption}) — remove the exemption`,
590
+ });
591
+ }
592
+ // Shape is also checked structurally; repeated here so this function is a
593
+ // complete gate on its own and a malformed slug cannot pass as "present".
594
+ if (!isIconSlug(slug)) {
595
+ issues.push({
596
+ severity: 'error',
597
+ chainId,
598
+ chainName,
599
+ message: `declares a malformed iconSlug ${JSON.stringify(slug)} — expected a bare filename stem, with no directory, extension or scheme`,
600
+ });
601
+ }
602
+ }
603
+ return issues;
604
+ }
605
+ /**
606
+ * `https://` only, and deliberately so. The field exists for a browser, which
607
+ * cannot hold an API key and — on an https page — cannot call an `http://`
608
+ * endpoint at all: the request is blocked as mixed content. Publishing one
609
+ * would hand consumers a URL that never connects, which is strictly worse than
610
+ * publishing nothing and letting the chain fall back to display-only.
611
+ */
612
+ const isPublicRpcUrl = (value) => typeof value === 'string' && /^https:\/\/\S+$/.test(value);
613
+ /**
614
+ * Stamps every chain with a public JSON-RPC endpoint, derived from the chain's
615
+ * viem definition where it has one and authored in the jsonnet where it does
616
+ * not.
617
+ *
618
+ * Why this exists: a browser consumer building a viem `Chain` with
619
+ * `defineChain` — for a chain newer than its pinned viem — already gets id,
620
+ * name, native currency, `explorer` and `stack` from this registry. The RPC
621
+ * endpoint was the only missing piece, and it is the piece that decides whether
622
+ * a newly added chain is a first-class wallet-connect target or display-only.
623
+ * It is the PUBLIC endpoint on purpose: the rpc-proxy path needs an API key,
624
+ * which is the one thing a browser cannot have.
625
+ *
626
+ * Resolved by the entry's declared `viemChain` **name**, never by chain id, for
627
+ * the same reason as `classifyChainExplorers` — only worse here, because the
628
+ * consequence is a live endpoint for the wrong chain rather than a dead link.
629
+ * viem 2.55 has 23 chain ids claimed by more than one export: id 999 is
630
+ * `hyperEvm`, `hyperliquid`, `wanchainTestnet` and `zoraTestnet`, so an id
631
+ * lookup for HyperEVM can hand out a Zora testnet RPC.
632
+ *
633
+ * A missing endpoint is not an error — it resolves to the field being absent,
634
+ * and a consumer treats that chain as display-only. It is worth a warning for a
635
+ * real EVM chain, where the usual cause is a chain viem does not ship yet; for
636
+ * a non-EVM or virtual chain there is nothing to warn about, since none of them
637
+ * is ever built as a viem chain.
638
+ */
639
+ function classifyChainPublicRpcUrls(chains, networks) {
640
+ const issues = [];
641
+ const stamped = {};
642
+ const entriesById = new Map();
643
+ for (const entry of [...networks.mainnets, ...networks.testnets]) {
644
+ entriesById.set(String(entry.id), entry);
645
+ }
646
+ for (const [chainId, chain] of Object.entries(chains)) {
647
+ const chainName = isNonEmptyString(chain?.name)
648
+ ? chain.name
649
+ : '<unnamed>';
650
+ const authored = chain?.publicRpcUrl;
651
+ // Authoring wins outright, as with `explorer`: the jsonnet is the only place
652
+ // an endpoint can be given for a chain viem does not ship, or a better one
653
+ // preferred over viem's default.
654
+ if (authored !== undefined) {
655
+ if (!isPublicRpcUrl(authored)) {
656
+ issues.push({
657
+ severity: 'error',
658
+ chainId,
659
+ chainName,
660
+ message: `declares a malformed publicRpcUrl ${JSON.stringify(authored)} — expected an https:// URL`,
661
+ });
662
+ stamped[chainId] = withSortedKeys({ ...chain });
663
+ continue;
664
+ }
665
+ stamped[chainId] = withSortedKeys({ ...chain, publicRpcUrl: authored });
666
+ continue;
667
+ }
668
+ const viemChainName = entriesById.get(chainId)?.viemChain;
669
+ const url = viemChainName
670
+ ? viemChains[viemChainName]?.rpcUrls?.default?.http?.[0]
671
+ : undefined;
672
+ // viem's own value carries a trailing slash on some chains (`unichain`) and
673
+ // not others. Both address the same endpoint, so it is normalised here
674
+ // rather than published as an inconsistency every consumer has to absorb.
675
+ const normalised = typeof url === 'string' ? url.replace(/\/+$/, '') : undefined;
676
+ if (!isPublicRpcUrl(normalised)) {
677
+ // A chain that is never synthesised as a viem chain has nothing to be
678
+ // missing — only a real EVM chain is worth reporting.
679
+ if (chain.vmType === 'evm' && chain.virtual !== true) {
680
+ issues.push({
681
+ severity: 'warning',
682
+ chainId,
683
+ chainName,
684
+ message: viemChainName
685
+ ? `viem chain "${viemChainName}" ships no usable https rpc url — the chain stays display-only for consumers that synthesise it until one is authored`
686
+ : 'has no viemChain to derive a public rpc url from and authors none — the chain stays display-only for consumers that synthesise it',
687
+ });
688
+ }
689
+ stamped[chainId] = withSortedKeys({ ...chain });
690
+ continue;
691
+ }
692
+ stamped[chainId] = withSortedKeys({ ...chain, publicRpcUrl: normalised });
693
+ }
694
+ return { chains: stamped, issues };
695
+ }
502
696
  const isChainStack = (v) => typeof v === 'string' && STACKS.has(v);
503
697
  const STACK_FORMATTERS = [
504
698
  ['op-stack', op_stack_1.chainConfig.formatters],
@@ -38,6 +38,14 @@ interface Chain {
38
38
  caip2: string;
39
39
  /** Block explorer, or null for a chain that has none (render plain text). */
40
40
  explorer: Explorer | null;
41
+ /** Filename stem of this chain's mark in s3-public's `chains/` directory,
42
+ * served today at `https://s3.rhinestone.dev/chains/<slug>.svg`. A slug and
43
+ * not a URL so the CDN stays a consumer's concern. Absent means no mark —
44
+ * render a coloured initial chip, never an error. */
45
+ iconSlug?: string;
46
+ /** Public, unauthenticated https JSON-RPC endpoint — what a browser needs to
47
+ * build this chain with `defineChain`. Absent means display-only. */
48
+ publicRpcUrl?: string;
41
49
  /** True for virtual chains (e.g. HyperCore) that settle on another chain. */
42
50
  virtual?: boolean;
43
51
  /** Which directions of transfer the chain supports; absent means both.
@@ -9,6 +9,7 @@ const chains = {
9
9
  "addressPath": "/address/",
10
10
  "txPath": "/tx/"
11
11
  },
12
+ "iconSlug": "mainnet",
12
13
  "name": "Ethereum",
13
14
  "nativeToken": {
14
15
  "address": "0x0000000000000000000000000000000000000000",
@@ -16,6 +17,7 @@ const chains = {
16
17
  "symbol": "ETH"
17
18
  },
18
19
  "network": "mainnet",
20
+ "publicRpcUrl": "https://eth.merkle.io",
19
21
  "settlementLayers": [
20
22
  "ACROSS",
21
23
  "ECO",
@@ -103,6 +105,7 @@ const chains = {
103
105
  "addressPath": "/address/",
104
106
  "txPath": "/tx/"
105
107
  },
108
+ "iconSlug": "optimism",
106
109
  "name": "OP Mainnet",
107
110
  "nativeToken": {
108
111
  "address": "0x0000000000000000000000000000000000000000",
@@ -110,6 +113,7 @@ const chains = {
110
113
  "symbol": "ETH"
111
114
  },
112
115
  "network": "mainnet",
116
+ "publicRpcUrl": "https://mainnet.optimism.io",
113
117
  "settlementLayers": [
114
118
  "ACROSS",
115
119
  "ECO",
@@ -208,6 +212,7 @@ const chains = {
208
212
  "addressPath": "/address/",
209
213
  "txPath": "/tx/"
210
214
  },
215
+ "iconSlug": "bsc",
211
216
  "name": "BNB Smart Chain",
212
217
  "nativeToken": {
213
218
  "address": "0x0000000000000000000000000000000000000000",
@@ -215,6 +220,7 @@ const chains = {
215
220
  "symbol": "BNB"
216
221
  },
217
222
  "network": "mainnet",
223
+ "publicRpcUrl": "https://56.rpc.thirdweb.com",
218
224
  "settlementLayers": [
219
225
  "ACROSS",
220
226
  "ECO",
@@ -286,6 +292,7 @@ const chains = {
286
292
  "addressPath": "/address/",
287
293
  "txPath": "/tx/"
288
294
  },
295
+ "iconSlug": "gnosis",
289
296
  "name": "Gnosis",
290
297
  "nativeToken": {
291
298
  "address": "0x0000000000000000000000000000000000000000",
@@ -293,6 +300,7 @@ const chains = {
293
300
  "symbol": "XDAI"
294
301
  },
295
302
  "network": "mainnet",
303
+ "publicRpcUrl": "https://rpc.gnosischain.com",
296
304
  "settlementLayers": [
297
305
  "RELAY",
298
306
  "NEAR",
@@ -332,6 +340,7 @@ const chains = {
332
340
  "addressPath": "/address/",
333
341
  "txPath": "/tx/"
334
342
  },
343
+ "iconSlug": "unichain",
335
344
  "name": "Unichain",
336
345
  "nativeToken": {
337
346
  "address": "0x0000000000000000000000000000000000000000",
@@ -339,6 +348,7 @@ const chains = {
339
348
  "symbol": "ETH"
340
349
  },
341
350
  "network": "mainnet",
351
+ "publicRpcUrl": "https://mainnet.unichain.org",
342
352
  "settlementLayers": [
343
353
  "ACROSS",
344
354
  "ECO",
@@ -425,6 +435,7 @@ const chains = {
425
435
  "addressPath": "/address/",
426
436
  "txPath": "/tx/"
427
437
  },
438
+ "iconSlug": "polygon",
428
439
  "name": "Polygon",
429
440
  "nativeToken": {
430
441
  "address": "0x0000000000000000000000000000000000000000",
@@ -432,6 +443,7 @@ const chains = {
432
443
  "symbol": "POL"
433
444
  },
434
445
  "network": "mainnet",
446
+ "publicRpcUrl": "https://polygon.drpc.org",
435
447
  "settlementLayers": [
436
448
  "ACROSS",
437
449
  "ECO",
@@ -506,6 +518,7 @@ const chains = {
506
518
  "addressPath": "/address/",
507
519
  "txPath": "/tx/"
508
520
  },
521
+ "iconSlug": "monad",
509
522
  "name": "Monad",
510
523
  "nativeToken": {
511
524
  "address": "0x0000000000000000000000000000000000000000",
@@ -513,6 +526,7 @@ const chains = {
513
526
  "symbol": "MON"
514
527
  },
515
528
  "network": "mainnet",
529
+ "publicRpcUrl": "https://rpc.monad.xyz",
516
530
  "settlementLayers": [
517
531
  "ACROSS",
518
532
  "RELAY",
@@ -585,6 +599,7 @@ const chains = {
585
599
  "addressPath": "/address/",
586
600
  "txPath": "/tx/"
587
601
  },
602
+ "iconSlug": "sonic",
588
603
  "name": "Sonic",
589
604
  "nativeToken": {
590
605
  "address": "0x0000000000000000000000000000000000000000",
@@ -592,6 +607,7 @@ const chains = {
592
607
  "symbol": "S"
593
608
  },
594
609
  "network": "mainnet",
610
+ "publicRpcUrl": "https://rpc.soniclabs.com",
595
611
  "settlementLayers": [
596
612
  "ECO",
597
613
  "RELAY",
@@ -636,6 +652,7 @@ const chains = {
636
652
  "addressPath": "/address/",
637
653
  "txPath": "/tx/"
638
654
  },
655
+ "iconSlug": "hyperevm",
639
656
  "name": "HyperEVM",
640
657
  "nativeToken": {
641
658
  "address": "0x0000000000000000000000000000000000000000",
@@ -643,6 +660,7 @@ const chains = {
643
660
  "symbol": "HYPE"
644
661
  },
645
662
  "network": "mainnet",
663
+ "publicRpcUrl": "https://rpc.hyperliquid.xyz/evm",
646
664
  "settlementLayers": [
647
665
  "ACROSS",
648
666
  "ECO",
@@ -699,6 +717,7 @@ const chains = {
699
717
  "txPath": "/explorer/tx/",
700
718
  "url": "https://app.hyperliquid.xyz"
701
719
  },
720
+ "iconSlug": "hyperevm",
702
721
  "name": "HyperCore",
703
722
  "nativeToken": {
704
723
  "address": "0x0000000000000000000000000000000000000000",
@@ -739,6 +758,7 @@ const chains = {
739
758
  "addressPath": "/address/",
740
759
  "txPath": "/tx/"
741
760
  },
761
+ "iconSlug": "soneium",
742
762
  "name": "Soneium Mainnet",
743
763
  "nativeToken": {
744
764
  "address": "0x0000000000000000000000000000000000000000",
@@ -746,6 +766,7 @@ const chains = {
746
766
  "symbol": "ETH"
747
767
  },
748
768
  "network": "mainnet",
769
+ "publicRpcUrl": "https://rpc.soneium.org",
749
770
  "settlementLayers": [
750
771
  "ACROSS",
751
772
  "RELAY"
@@ -817,6 +838,7 @@ const chains = {
817
838
  "addressPath": "/address/",
818
839
  "txPath": "/tx/"
819
840
  },
841
+ "iconSlug": "robinhood",
820
842
  "name": "Robinhood Chain",
821
843
  "nativeToken": {
822
844
  "address": "0x0000000000000000000000000000000000000000",
@@ -824,6 +846,7 @@ const chains = {
824
846
  "symbol": "ETH"
825
847
  },
826
848
  "network": "mainnet",
849
+ "publicRpcUrl": "https://rpc.mainnet.chain.robinhood.com",
827
850
  "settlementLayers": [
828
851
  "ACROSS",
829
852
  "RELAY"
@@ -884,6 +907,7 @@ const chains = {
884
907
  "addressPath": "/address/",
885
908
  "txPath": "/tx/"
886
909
  },
910
+ "iconSlug": "base",
887
911
  "name": "Base",
888
912
  "nativeToken": {
889
913
  "address": "0x0000000000000000000000000000000000000000",
@@ -891,6 +915,7 @@ const chains = {
891
915
  "symbol": "ETH"
892
916
  },
893
917
  "network": "mainnet",
918
+ "publicRpcUrl": "https://mainnet.base.org",
894
919
  "settlementLayers": [
895
920
  "ACROSS",
896
921
  "ECO",
@@ -963,6 +988,7 @@ const chains = {
963
988
  "addressPath": "/address/",
964
989
  "txPath": "/tx/"
965
990
  },
991
+ "iconSlug": "plasma",
966
992
  "name": "Plasma",
967
993
  "nativeToken": {
968
994
  "address": "0x0000000000000000000000000000000000000000",
@@ -970,6 +996,7 @@ const chains = {
970
996
  "symbol": "XPL"
971
997
  },
972
998
  "network": "mainnet",
999
+ "publicRpcUrl": "https://rpc.plasma.to",
973
1000
  "settlementLayers": [
974
1001
  "ACROSS",
975
1002
  "ECO",
@@ -1017,6 +1044,7 @@ const chains = {
1017
1044
  "addressPath": "/address/",
1018
1045
  "txPath": "/tx/"
1019
1046
  },
1047
+ "iconSlug": "plasma",
1020
1048
  "name": "Plasma Testnet",
1021
1049
  "nativeToken": {
1022
1050
  "address": "0x0000000000000000000000000000000000000000",
@@ -1024,6 +1052,7 @@ const chains = {
1024
1052
  "symbol": "XPL"
1025
1053
  },
1026
1054
  "network": "testnet",
1055
+ "publicRpcUrl": "https://testnet-rpc.plasma.to",
1027
1056
  "settlementLayers": [
1028
1057
  "ECO"
1029
1058
  ],
@@ -1073,6 +1102,7 @@ const chains = {
1073
1102
  "addressPath": "/address/",
1074
1103
  "txPath": "/tx/"
1075
1104
  },
1105
+ "iconSlug": "arbitrum",
1076
1106
  "name": "Arbitrum One",
1077
1107
  "nativeToken": {
1078
1108
  "address": "0x0000000000000000000000000000000000000000",
@@ -1080,6 +1110,7 @@ const chains = {
1080
1110
  "symbol": "ETH"
1081
1111
  },
1082
1112
  "network": "mainnet",
1113
+ "publicRpcUrl": "https://arb1.arbitrum.io/rpc",
1083
1114
  "settlementLayers": [
1084
1115
  "ACROSS",
1085
1116
  "ECO",
@@ -1167,6 +1198,7 @@ const chains = {
1167
1198
  "addressPath": "/address/",
1168
1199
  "txPath": "/tx/"
1169
1200
  },
1201
+ "iconSlug": "avalanche",
1170
1202
  "name": "Avalanche",
1171
1203
  "nativeToken": {
1172
1204
  "address": "0x0000000000000000000000000000000000000000",
@@ -1174,6 +1206,7 @@ const chains = {
1174
1206
  "symbol": "AVAX"
1175
1207
  },
1176
1208
  "network": "mainnet",
1209
+ "publicRpcUrl": "https://api.avax.network/ext/bc/C/rpc",
1177
1210
  "settlementLayers": [
1178
1211
  "ACROSS",
1179
1212
  "RELAY",
@@ -1254,6 +1287,7 @@ const chains = {
1254
1287
  "addressPath": "/address/",
1255
1288
  "txPath": "/tx/"
1256
1289
  },
1290
+ "iconSlug": "base",
1257
1291
  "name": "Base Sepolia",
1258
1292
  "nativeToken": {
1259
1293
  "address": "0x0000000000000000000000000000000000000000",
@@ -1261,6 +1295,7 @@ const chains = {
1261
1295
  "symbol": "ETH"
1262
1296
  },
1263
1297
  "network": "testnet",
1298
+ "publicRpcUrl": "https://sepolia.base.org",
1264
1299
  "settlementLayers": [
1265
1300
  "ACROSS",
1266
1301
  "ECO",
@@ -1339,6 +1374,7 @@ const chains = {
1339
1374
  "addressPath": "/address/",
1340
1375
  "txPath": "/tx/"
1341
1376
  },
1377
+ "iconSlug": "arbitrum",
1342
1378
  "name": "Arbitrum Sepolia",
1343
1379
  "nativeToken": {
1344
1380
  "address": "0x0000000000000000000000000000000000000000",
@@ -1346,6 +1382,7 @@ const chains = {
1346
1382
  "symbol": "ETH"
1347
1383
  },
1348
1384
  "network": "testnet",
1385
+ "publicRpcUrl": "https://sepolia-rollup.arbitrum.io/rpc",
1349
1386
  "settlementLayers": [
1350
1387
  "ACROSS",
1351
1388
  "ECO",
@@ -1410,6 +1447,7 @@ const chains = {
1410
1447
  "addressPath": "/address/",
1411
1448
  "txPath": "/tx/"
1412
1449
  },
1450
+ "iconSlug": "katana",
1413
1451
  "name": "Katana",
1414
1452
  "nativeToken": {
1415
1453
  "address": "0x0000000000000000000000000000000000000000",
@@ -1417,6 +1455,7 @@ const chains = {
1417
1455
  "symbol": "ETH"
1418
1456
  },
1419
1457
  "network": "mainnet",
1458
+ "publicRpcUrl": "https://rpc.katana.network",
1420
1459
  "settlementLayers": [
1421
1460
  "RELAY",
1422
1461
  "RHINO"
@@ -1478,6 +1517,7 @@ const chains = {
1478
1517
  "txPath": "/explorer/tx/",
1479
1518
  "url": "https://app.hyperliquid.xyz"
1480
1519
  },
1520
+ "iconSlug": "hyperevm",
1481
1521
  "name": "HyperCore Spot",
1482
1522
  "nativeToken": {
1483
1523
  "address": "0x0000000000000000000000000000000000000000",
@@ -1518,6 +1558,7 @@ const chains = {
1518
1558
  "txPath": "/explorer/tx/",
1519
1559
  "url": "https://app.hyperliquid.xyz"
1520
1560
  },
1561
+ "iconSlug": "hyperevm",
1521
1562
  "name": "HyperCore Perp",
1522
1563
  "nativeToken": {
1523
1564
  "address": "0x0000000000000000000000000000000000000000",
@@ -1558,6 +1599,7 @@ const chains = {
1558
1599
  "addressPath": "/address/",
1559
1600
  "txPath": "/tx/"
1560
1601
  },
1602
+ "iconSlug": "mainnet",
1561
1603
  "name": "Sepolia",
1562
1604
  "nativeToken": {
1563
1605
  "address": "0x0000000000000000000000000000000000000000",
@@ -1565,6 +1607,7 @@ const chains = {
1565
1607
  "symbol": "ETH"
1566
1608
  },
1567
1609
  "network": "testnet",
1610
+ "publicRpcUrl": "https://11155111.rpc.thirdweb.com",
1568
1611
  "settlementLayers": [
1569
1612
  "ACROSS",
1570
1613
  "ECO",
@@ -1639,6 +1682,7 @@ const chains = {
1639
1682
  "addressPath": "/address/",
1640
1683
  "txPath": "/tx/"
1641
1684
  },
1685
+ "iconSlug": "optimism",
1642
1686
  "name": "OP Sepolia",
1643
1687
  "nativeToken": {
1644
1688
  "address": "0x0000000000000000000000000000000000000000",
@@ -1646,6 +1690,7 @@ const chains = {
1646
1690
  "symbol": "ETH"
1647
1691
  },
1648
1692
  "network": "testnet",
1693
+ "publicRpcUrl": "https://sepolia.optimism.io",
1649
1694
  "settlementLayers": [
1650
1695
  "ACROSS",
1651
1696
  "ECO",
@@ -1710,6 +1755,7 @@ const chains = {
1710
1755
  "txPath": "/#/transaction/",
1711
1756
  "url": "https://tronscan.org"
1712
1757
  },
1758
+ "iconSlug": "tron",
1713
1759
  "name": "Tron",
1714
1760
  "nativeToken": {
1715
1761
  "address": "0x0000000000000000000000000000000000000000",
@@ -1757,6 +1803,7 @@ const chains = {
1757
1803
  "txPath": "/tx/",
1758
1804
  "url": "https://solscan.io"
1759
1805
  },
1806
+ "iconSlug": "solana",
1760
1807
  "name": "Solana",
1761
1808
  "nativeToken": {
1762
1809
  "address": "11111111111111111111111111111111",
@@ -30,6 +30,7 @@ declare const abiSignatures: {
30
30
  readonly singleCallAdapter: readonly ["function ADAPTER_TAG() pure returns (bytes12)", "function ARBITER() view returns (address)", "function _ROUTER() view returns (address)", "function isContractDeployed(address) view returns (bool)", "function multiCall((address, uint256, bytes)[]) payable", "function multiCallWithDrainToken((address, uint256, bytes)[], uint256[2][], address) payable", "function semVer() view returns (bytes6)", "function semVerUnpacked() view returns (uint256, uint256, uint256)", "function settlementLayerSpender() view returns (address)", "function singleCall_handleFill(uint256, address, bytes) returns (bytes4)", "function supportsInterface(bytes4) pure returns (bool)", "function version() view returns (bytes)"];
31
31
  readonly smartSessionEmissary: readonly ["function DOMAIN_SEPARATOR() view returns (bytes32)", "function INTENT_EXECUTOR() view returns (address)", "function LENS() view returns (address)", "function eip712Domain() view returns (bytes1, string, string, uint256, address, bytes32, uint256[])", "function getConfig(address, uint8, address, bytes12) view returns (bytes)", "function isValidSignatureWithSender(address, bytes32, bytes) view returns (bytes4)", "function setConfig(address, (uint8, address, uint8, uint8, address, bytes), (bytes, bytes, uint256, uint256, uint256[], uint256))", "function verifyClaim(address, bytes32, bytes32, bytes, bytes12) view returns (bytes4)", "function verifyExecution(address, bytes32, bytes, (bytes)) returns (bytes4)"];
32
32
  readonly smartSessionLens: readonly ["function getActionPolicies(address, bytes32, bytes32) view returns (address[])", "function getClaimPolicies(address, bytes32, bytes12) view returns (address[])", "function getERC1271Policies(address, bytes32) view returns (address[])", "function getEnabledActions(address, bytes32) view returns (bytes32[])", "function getEnabledERC7739Content(address, bytes32) view returns ((bytes32, bytes32[])[])", "function getNonce(address, bytes12) view returns (uint256)", "function getPermissionId((address, bytes, bytes32, (bytes4, address, (address, bytes)[])[], (address, bytes)[], ((bytes32, string[])[], (address, bytes)[]))) pure returns (bytes32)", "function getPermissionIds(address) view returns (bytes32[])", "function getSessionDigest(address, (address, bytes, bytes32, (bytes4, address, (address, bytes)[])[], (address, bytes)[], ((bytes32, string[])[], (address, bytes)[])), bytes12, uint256) view returns (bytes32)", "function getSessionValidatorAndConfig(address, bytes32) view returns (address, bytes)", "function isActionIdEnabled(address, bytes32, bytes32) view returns (bool)", "function isActionPolicyEnabled(address, bytes32, bytes32, address) view returns (bool)", "function isClaimPolicyEnabled(address, bytes32, bytes12, address) view returns (bool)", "function isERC1271PolicyEnabled(address, bytes32, address) view returns (bool)", "function isERC7739ContentEnabled(address, bytes32, bytes32, string) view returns (bool)", "function isInitialized(address) view returns (bool)", "function isLockTagEnabled(address, bytes32, bytes12) view returns (bool)", "function isModuleType(uint256) pure returns (bool)", "function isPermissionEnabled(address, bytes32) view returns (bool)", "function isSessionValidatorSet(address, bytes32) view returns (bool)", "function onInstall(bytes)", "function onUninstall(bytes)", "function removeConfig(address, (uint8, uint8, address, bytes32), (bytes, bytes, uint256, (uint8, (uint64, bytes32)[])))", "function revokeNonce(bytes12)", "function setConfig(address, (uint8, uint8, address, bytes32), (bytes, bytes, uint256, (uint8, (uint64, bytes32)[], (address, bytes, bytes32, (bytes4, address, (address, bytes)[])[], (address, bytes)[], ((bytes32, string[])[], (address, bytes)[])))))"];
33
+ readonly swapper: readonly ["function MINIMUM_SURPLUS_EPSILON() view returns (uint256)", "function PROXY() view returns (address)", "function cancelOwnershipHandover() payable", "function completeOwnershipHandover(address) payable", "function owner() view returns (address)", "function ownershipHandoverExpiresAt(address) view returns (uint256)", "function renounceOwnership() payable", "function requestOwnershipHandover() payable", "function setSurplusPolicy((uint16, uint16, uint16))", "function setTreasury(address)", "function surplusPolicy() view returns (uint16, uint16, uint16)", "function swapExactIn(address, uint256, address, uint256, uint256, address, uint256, (address, uint256, bytes)[]) payable returns (uint256)", "function swapExactOut(address, uint256, address, uint256, uint256, address, uint256, (address, uint256, bytes)[]) payable returns (uint256)", "function transferOwnership(address) payable", "function treasury() view returns (address)"];
33
34
  };
34
35
  export { abiSignatures };
35
36
  export type AbiSignatureMap = typeof abiSignatures;
@@ -479,6 +479,23 @@ const abiSignatures = {
479
479
  "function removeConfig(address, (uint8, uint8, address, bytes32), (bytes, bytes, uint256, (uint8, (uint64, bytes32)[])))",
480
480
  "function revokeNonce(bytes12)",
481
481
  "function setConfig(address, (uint8, uint8, address, bytes32), (bytes, bytes, uint256, (uint8, (uint64, bytes32)[], (address, bytes, bytes32, (bytes4, address, (address, bytes)[])[], (address, bytes)[], ((bytes32, string[])[], (address, bytes)[])))))"
482
+ ],
483
+ "swapper": [
484
+ "function MINIMUM_SURPLUS_EPSILON() view returns (uint256)",
485
+ "function PROXY() view returns (address)",
486
+ "function cancelOwnershipHandover() payable",
487
+ "function completeOwnershipHandover(address) payable",
488
+ "function owner() view returns (address)",
489
+ "function ownershipHandoverExpiresAt(address) view returns (uint256)",
490
+ "function renounceOwnership() payable",
491
+ "function requestOwnershipHandover() payable",
492
+ "function setSurplusPolicy((uint16, uint16, uint16))",
493
+ "function setTreasury(address)",
494
+ "function surplusPolicy() view returns (uint16, uint16, uint16)",
495
+ "function swapExactIn(address, uint256, address, uint256, uint256, address, uint256, (address, uint256, bytes)[]) payable returns (uint256)",
496
+ "function swapExactOut(address, uint256, address, uint256, uint256, address, uint256, (address, uint256, bytes)[]) payable returns (uint256)",
497
+ "function transferOwnership(address) payable",
498
+ "function treasury() view returns (address)"
482
499
  ]
483
500
  };
484
501
  exports.abiSignatures = abiSignatures;