@rhinestone/shared-configs 2.15.1 → 2.17.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.
@@ -3202,5 +3202,56 @@
3202
3202
  "decimals": 9,
3203
3203
  "symbol": "WSOL"
3204
3204
  }
3205
+ },
3206
+ "792703810": {
3207
+ "caip2": "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1",
3208
+ "explorer": null,
3209
+ "iconSlug": "solana",
3210
+ "name": "Solana Devnet",
3211
+ "nativeToken": {
3212
+ "address": "11111111111111111111111111111111",
3213
+ "decimals": 9,
3214
+ "symbol": "SOL"
3215
+ },
3216
+ "network": "testnet",
3217
+ "providerIds": {
3218
+ "alchemy": null,
3219
+ "zerion": null
3220
+ },
3221
+ "sessionCapable": false,
3222
+ "settlementLayers": [],
3223
+ "stack": "vanilla",
3224
+ "swapQuoters": [],
3225
+ "tokens": [
3226
+ {
3227
+ "address": "11111111111111111111111111111111",
3228
+ "approvalSlot": null,
3229
+ "balanceSlot": null,
3230
+ "decimals": 9,
3231
+ "symbol": "SOL"
3232
+ },
3233
+ {
3234
+ "address": "So11111111111111111111111111111111111111112",
3235
+ "approvalSlot": null,
3236
+ "balanceSlot": null,
3237
+ "decimals": 9,
3238
+ "priceSymbol": "SOL",
3239
+ "symbol": "WSOL"
3240
+ },
3241
+ {
3242
+ "address": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU",
3243
+ "approvalSlot": null,
3244
+ "balanceSlot": null,
3245
+ "decimals": 6,
3246
+ "pegGroup": "USD",
3247
+ "symbol": "USDC"
3248
+ }
3249
+ ],
3250
+ "vmType": "svm",
3251
+ "wrappedNativeToken": {
3252
+ "address": "So11111111111111111111111111111111111111112",
3253
+ "decimals": 9,
3254
+ "symbol": "WSOL"
3255
+ }
3205
3256
  }
3206
3257
  }
@@ -15,7 +15,9 @@
15
15
  "ecoPortal": "0xEC000064576f9C95a8623Bc0eff3db6d296ea6df",
16
16
  "ecoHyperProver": "0xeC0008acc34d3D0CAa6758Ce788091e473812e28",
17
17
  "ecoVaultAddress": "0x9f70b0c839fe2D7190A09Ae87ED658b6D1CbA4F9",
18
- "oftProxy": "0x5B64E414f4dEA97062D6B552852FFbAcaf6d462b"
18
+ "oftProxy": "0x5B64E414f4dEA97062D6B552852FFbAcaf6d462b",
19
+ "swapAdapter": "0x58BC7d9279A38a1537c2f74426dBDbD804AD3A18",
20
+ "swapAdapterTokenSpender": "0xc5f6641b3ade357c5df77a1859d16528fe8b3e93"
19
21
  },
20
22
  "56": {
21
23
  "ecoArbiter": "0x1BeBAfb3D05d84A5Bfd94800c88d1342f755d8AB",
@@ -79,7 +81,9 @@
79
81
  "spokepool": "0x09aea4b2242abC8bb4BB78D537A67a245A7bEC64",
80
82
  "ecoPortal": "0xEC000064576f9C95a8623Bc0eff3db6d296ea6df",
81
83
  "ecoHyperProver": "0xeC0008acc34d3D0CAa6758Ce788091e473812e28",
82
- "ecoVaultAddress": "0x9f70b0c839fe2D7190A09Ae87ED658b6D1CbA4F9"
84
+ "ecoVaultAddress": "0x9f70b0c839fe2D7190A09Ae87ED658b6D1CbA4F9",
85
+ "swapAdapter": "0x58BC7d9279A38a1537c2f74426dBDbD804AD3A18",
86
+ "swapAdapterTokenSpender": "0xc5f6641b3ade357c5df77a1859d16528fe8b3e93"
83
87
  },
84
88
  "9745": {
85
89
  "ecoArbiter": "0x1BeBAfb3D05d84A5Bfd94800c88d1342f755d8AB",
@@ -29,5 +29,8 @@
29
29
  "DRPC",
30
30
  "Alchemy"
31
31
  ]
32
+ },
33
+ "792703810": {
34
+ "providers": []
32
35
  }
33
36
  }
@@ -38,6 +38,22 @@ const resolve = (contracts, chainId) => ({
38
38
  (0, bun_test_1.expect)(out["1"].oftProxy).toBe("0x11");
39
39
  (0, bun_test_1.expect)(out["*"].permit2).toBe("0xAA");
40
40
  });
41
+ (0, bun_test_1.test)("keeps staged deployment addresses chain-scoped", () => {
42
+ const out = (0, hoistUniform_1.hoistUniformAddresses)({
43
+ "10": {
44
+ swapAdapter: "0xAA",
45
+ swapAdapterTokenSpender: "0xBB",
46
+ },
47
+ "8453": {
48
+ swapAdapter: "0xAA",
49
+ swapAdapterTokenSpender: "0xBB",
50
+ },
51
+ });
52
+ (0, bun_test_1.expect)(out["*"]?.swapAdapter).toBeUndefined();
53
+ (0, bun_test_1.expect)(out["*"]?.swapAdapterTokenSpender).toBeUndefined();
54
+ (0, bun_test_1.expect)(out["10"].swapAdapter).toBe("0xAA");
55
+ (0, bun_test_1.expect)(out["8453"].swapAdapterTokenSpender).toBe("0xBB");
56
+ });
41
57
  (0, bun_test_1.test)("resolution is unchanged for every chain that already had the key", () => {
42
58
  const before = {
43
59
  "*": { router: "0xRR" },
@@ -5,10 +5,10 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const bun_test_1 = require("bun:test");
7
7
  const viem_1 = require("viem");
8
- const validation_1 = require("../validation");
9
- const index_1 = require("../../src/index");
10
- const oft_json_1 = __importDefault(require("../../configs/oft.json"));
11
8
  const chain_indexer_json_1 = __importDefault(require("../../configs/chain-indexer.json"));
9
+ const oft_json_1 = __importDefault(require("../../configs/oft.json"));
10
+ const index_1 = require("../../src/index");
11
+ const validation_1 = require("../validation");
12
12
  const nativeToken = { address: "0x0", symbol: "ETH", decimals: 18 };
13
13
  const usdcAddress = "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48";
14
14
  const validAuthorization = {
@@ -344,6 +344,43 @@ function errorsFor(chain) {
344
344
  (0, bun_test_1.expect)(result.issues[0].message).toContain("no settlement layers");
345
345
  (0, bun_test_1.expect)(result.hasErrors).toBe(true);
346
346
  });
347
+ (0, bun_test_1.it)("allows only the exact same-chain Solana Devnet identity without settlement layers", () => {
348
+ const devnet = validChain({
349
+ name: "Solana Devnet",
350
+ vmType: "svm",
351
+ network: "testnet",
352
+ caip2: "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1",
353
+ settlementLayers: [],
354
+ providerIds: { alchemy: null, zerion: null },
355
+ sessionCapable: false,
356
+ });
357
+ (0, bun_test_1.expect)((0, validation_1.validateChainConfig)({ "792703810": devnet }).issues).toEqual([]);
358
+ for (const [chainId, overrides] of [
359
+ ["792703811", {}],
360
+ ["792703810", { caip2: "solana:wrong" }],
361
+ ["792703810", { network: "mainnet" }],
362
+ ["792703810", { vmType: "evm" }],
363
+ ]) {
364
+ const result = (0, validation_1.validateChainConfig)({
365
+ [chainId]: { ...devnet, ...overrides },
366
+ });
367
+ (0, bun_test_1.expect)(result.issues.some((issue) => issue.message.includes("no settlement layers"))).toBe(true);
368
+ }
369
+ });
370
+ (0, bun_test_1.it)("still reports structural errors on the exempt Devnet entry", () => {
371
+ const result = (0, validation_1.validateChainConfig)({
372
+ "792703810": validChain({
373
+ name: "Solana Devnet",
374
+ vmType: "svm",
375
+ network: "testnet",
376
+ caip2: "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1",
377
+ settlementLayers: [],
378
+ tokens: {},
379
+ }),
380
+ });
381
+ (0, bun_test_1.expect)(result.issues.some((issue) => issue.message === "tokens is not an array")).toBe(true);
382
+ (0, bun_test_1.expect)(result.hasErrors).toBe(true);
383
+ });
347
384
  (0, bun_test_1.it)("returns warning for chain with single settlement layer", () => {
348
385
  const chains = {
349
386
  "100": validChain({ name: "Gnosis", settlementLayers: ["RELAY"] }),
@@ -857,7 +894,9 @@ function validIndexerEntry(overrides = {}) {
857
894
  const withoutExplorer = Object.entries(index_1.chainRegistry)
858
895
  .filter(([, e]) => e.explorer == null)
859
896
  .map(([id]) => id);
860
- (0, bun_test_1.expect)(withoutExplorer).toEqual([]);
897
+ // Solana Devnet deliberately omits an explorer: Solscan's Devnet cluster
898
+ // selector is an appended query that the origin-plus-path schema cannot express.
899
+ (0, bun_test_1.expect)(withoutExplorer).toEqual(["792703810"]);
861
900
  for (const venueId of ["1337001", "1337002"]) {
862
901
  (0, bun_test_1.expect)(index_1.chainRegistry[venueId].explorer.url, venueId).toBe("https://app.hyperliquid.xyz");
863
902
  }
@@ -325,6 +325,8 @@ const mapChainDeployments = (deployments, external) => {
325
325
  // external/derived address, so it's mapped here (RHI-4896).
326
326
  swapper: deployments.swapper,
327
327
  tokenTransferProxy: external?.tokenTransferProxy?.address,
328
+ swapAdapter: external?.swapAdapter?.address,
329
+ swapAdapterTokenSpender: external?.swapAdapterTokenSpender?.address,
328
330
  });
329
331
  };
330
332
  function collectContracts(addrConfig) {
@@ -1,30 +1,2 @@
1
1
  export type RawContracts = Record<string, Record<string, string>>;
2
- /**
3
- * Hoist every address that is identical on all chains carrying it into the `*`
4
- * wildcard, leaving each chain with only what genuinely differs there.
5
- *
6
- * Consumers resolve a chain as `{ ...wildcard, ...chainSpecific }`, so this
7
- * changes nothing for a chain that already had the key. What it changes is the
8
- * chain the map has never heard of: chains now arrive at runtime in the facts
9
- * artifact while this map is baked into the consumer's image, so a new chain
10
- * falls back to the bare wildcard and every address missing from it resolves to
11
- * `undefined`. That is not theoretical — it is why the first quote to Ink 500'd
12
- * (RHI-5703): `permit2` was absent from the wildcard, so a `spender: undefined`
13
- * reached viem, which threw inside a `catch` that then discarded the chain.
14
- *
15
- * Hoisted only with evidence: at least two chains carrying the key, and exactly
16
- * one distinct address between them. One chain proves nothing about uniformity,
17
- * and a key whose value varies is genuinely per-chain (`spokepool` has 16
18
- * distinct addresses across 18 chains, `oftProxy` 7 across 7).
19
- *
20
- * Keys that split by *network* rather than by chain are deliberately left
21
- * per-chain — the eco family is one mainnet address and one testnet address.
22
- * A single wildcard value would hand a new testnet the mainnet portal, and a
23
- * confidently wrong address is worse than a missing one.
24
- *
25
- * Note this widens resolution: a chain that never had `acrossHandler` now
26
- * resolves one. Capability is gated by `settlementLayers` in the registry, not
27
- * by the presence of a key here, so that is safe — but it does mean this file
28
- * stops being a record of what is deployed where.
29
- */
30
2
  export declare const hoistUniformAddresses: (contracts: RawContracts) => RawContracts;
@@ -29,6 +29,12 @@ exports.hoistUniformAddresses = void 0;
29
29
  * by the presence of a key here, so that is safe — but it does mean this file
30
30
  * stops being a record of what is deployed where.
31
31
  */
32
+ const CHAIN_SCOPED_KEYS = {
33
+ // Staged rollout: identical CREATE2 address does not prove deployment on an
34
+ // unknown chain. Keep these absent until that chain is explicitly enabled.
35
+ swapAdapter: true,
36
+ swapAdapterTokenSpender: true,
37
+ };
32
38
  const hoistUniformAddresses = (contracts) => {
33
39
  const perChain = Object.entries(contracts).filter(([id]) => id !== "*");
34
40
  const addressesByKey = new Map();
@@ -41,7 +47,9 @@ const hoistUniformAddresses = (contracts) => {
41
47
  }
42
48
  const chainsCarrying = (key) => perChain.filter(([, entries]) => key in entries).length;
43
49
  const uniform = [...addressesByKey.entries()]
44
- .filter(([key, addresses]) => addresses.size === 1 && chainsCarrying(key) > 1)
50
+ .filter(([key, addresses]) => !(key in CHAIN_SCOPED_KEYS) &&
51
+ addresses.size === 1 &&
52
+ chainsCarrying(key) > 1)
45
53
  .map(([key]) => key);
46
54
  if (uniform.length === 0) {
47
55
  return contracts;
@@ -1119,7 +1119,13 @@ function validateChainConfig(chains) {
1119
1119
  // Already reported structurally; skip the reachability checks below.
1120
1120
  continue;
1121
1121
  }
1122
- if (layers.length === 0) {
1122
+ const isSameChainOnlySolanaDevnet = chainId === '792703810' &&
1123
+ chain.caip2 === 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1' &&
1124
+ chain.vmType === 'svm' &&
1125
+ chain.network === 'testnet' &&
1126
+ !chain.virtual;
1127
+ // Devnet exists for same-chain execution only; it has no bridge route by design.
1128
+ if (layers.length === 0 && !isSameChainOnlySolanaDevnet) {
1123
1129
  issues.push({
1124
1130
  severity: 'error',
1125
1131
  chainId,
@@ -3,11 +3,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const bun_test_1 = require("bun:test");
4
4
  const node_crypto_1 = require("node:crypto");
5
5
  const chainFactsClient_1 = require("../chainFactsClient");
6
- const index_1 = require("../index");
7
6
  const packageVersion_1 = require("../generated/packageVersion");
7
+ const index_1 = require("../index");
8
8
  const REMOTE_URL = "https://example.invalid/chain-facts.json";
9
9
  const SIGNATURE_URL = `${REMOTE_URL}.sig`;
10
10
  const ETHEREUM = String(index_1.MainnetNetwork.ETHEREUM);
11
+ const SOLANA_DEVNET = "792703810";
11
12
  // A real P-256 keypair, signing in DER exactly as KMS ECDSA_SHA_256 does, so
12
13
  // these tests exercise the same bytes production will see rather than a
13
14
  // convenient stand-in.
@@ -69,12 +70,6 @@ function withEthereum(overrides) {
69
70
  [ETHEREUM]: { ...index_1.chainRegistry[ETHEREUM], ...overrides },
70
71
  };
71
72
  }
72
- /** The bundled registry minus one chain — the shape a stale artifact has. */
73
- function registryMissingOneChain() {
74
- const partial = { ...index_1.chainRegistry };
75
- delete partial[ETHEREUM];
76
- return partial;
77
- }
78
73
  function clientWith(extra = {}) {
79
74
  return (0, chainFactsClient_1.createChainFactsClient)({
80
75
  remoteUrl: REMOTE_URL,
@@ -123,6 +118,19 @@ function clientWith(extra = {}) {
123
118
  (0, bun_test_1.expect)(snapshot.version).toBe(packageVersion_1.PACKAGE_VERSION);
124
119
  (0, bun_test_1.expect)(Object.keys(client.getChainRegistry())).toEqual(Object.keys(index_1.chainRegistry));
125
120
  });
121
+ (0, bun_test_1.it)("accepts a signed full registry carrying Solana Devnet", async () => {
122
+ serveSigned(payload());
123
+ const client = clientWith();
124
+ (0, bun_test_1.expect)(await client.refresh()).toBe(true);
125
+ const snapshot = client.getSnapshot();
126
+ (0, bun_test_1.expect)(snapshot.source).toBe("remote");
127
+ (0, bun_test_1.expect)(snapshot.chains[ETHEREUM]).toBeDefined();
128
+ (0, bun_test_1.expect)(snapshot.chains[SOLANA_DEVNET]).toMatchObject({
129
+ caip2: "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1",
130
+ network: "testnet",
131
+ vmType: "svm",
132
+ });
133
+ });
126
134
  (0, bun_test_1.it)("accepts a remote payload that adds chains beyond the bundled set", async () => {
127
135
  serveSigned(payload({ ...index_1.chainRegistry, "424242": index_1.chainRegistry[ETHEREUM] }));
128
136
  const client = clientWith();
@@ -5,6 +5,7 @@ const index_1 = require("../index");
5
5
  const HYPERCORE_SPOT_CAIP2 = "hypercore:spot";
6
6
  const HYPERCORE_PERP_CAIP2 = "hypercore:perp";
7
7
  const SOLANA_CAIP2 = "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp";
8
+ const SOLANA_DEVNET_CAIP2 = "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1";
8
9
  const TRON_CAIP2 = "tron:mainnet";
9
10
  (0, bun_test_1.describe)("chainVirtualization", () => {
10
11
  (0, bun_test_1.describe)("getCaip2", () => {
@@ -19,6 +20,7 @@ const TRON_CAIP2 = "tron:mainnet";
19
20
  (0, bun_test_1.it)("emits the registry caip2 for non-EVM chains", () => {
20
21
  (0, bun_test_1.expect)((0, index_1.getCaip2)(index_1.MainnetNetwork.SOLANA)).toBe(SOLANA_CAIP2);
21
22
  (0, bun_test_1.expect)((0, index_1.getCaip2)(index_1.MainnetNetwork.TRON)).toBe(TRON_CAIP2);
23
+ (0, bun_test_1.expect)((0, index_1.getCaip2)(index_1.TestnetNetwork.SOLANA_DEVNET)).toBe(SOLANA_DEVNET_CAIP2);
22
24
  });
23
25
  (0, bun_test_1.it)("falls back to eip155:<id> for EVM and unknown chains", () => {
24
26
  (0, bun_test_1.expect)((0, index_1.getCaip2)(index_1.MainnetNetwork.ETHEREUM)).toBe(`eip155:${index_1.MainnetNetwork.ETHEREUM}`);
@@ -40,6 +42,7 @@ const TRON_CAIP2 = "tron:mainnet";
40
42
  (0, bun_test_1.it)("resolves registry non-EVM caip2 strings", () => {
41
43
  (0, bun_test_1.expect)((0, index_1.chainIdFromCaip2)(SOLANA_CAIP2)).toBe(index_1.MainnetNetwork.SOLANA);
42
44
  (0, bun_test_1.expect)((0, index_1.chainIdFromCaip2)(TRON_CAIP2)).toBe(index_1.MainnetNetwork.TRON);
45
+ (0, bun_test_1.expect)((0, index_1.chainIdFromCaip2)(SOLANA_DEVNET_CAIP2)).toBe(index_1.TestnetNetwork.SOLANA_DEVNET);
43
46
  });
44
47
  (0, bun_test_1.it)("resolves eip155 caip2 strings, now that every entry carries one", () => {
45
48
  (0, bun_test_1.expect)((0, index_1.chainIdFromCaip2)("eip155:1")).toBe(index_1.MainnetNetwork.ETHEREUM);
@@ -58,6 +61,7 @@ const TRON_CAIP2 = "tron:mainnet";
58
61
  for (const id of [
59
62
  index_1.MainnetNetwork.SOLANA,
60
63
  index_1.MainnetNetwork.TRON,
64
+ index_1.TestnetNetwork.SOLANA_DEVNET,
61
65
  index_1.HYPERCORE_SPOT_CHAIN_ID,
62
66
  index_1.HYPERCORE_PERP_CHAIN_ID,
63
67
  ]) {
@@ -106,6 +110,7 @@ const TRON_CAIP2 = "tron:mainnet";
106
110
  index_1.MainnetNetwork.ETHEREUM,
107
111
  index_1.MainnetNetwork.BASE,
108
112
  index_1.MainnetNetwork.SOLANA,
113
+ index_1.TestnetNetwork.SOLANA_DEVNET,
109
114
  index_1.MainnetNetwork.TRON,
110
115
  ]) {
111
116
  (0, bun_test_1.expect)((0, index_1.canBeOrigin)(id)).toBe(true);
@@ -139,8 +144,13 @@ const TRON_CAIP2 = "tron:mainnet";
139
144
  (0, bun_test_1.it)("still classifies genuine non-EVM chains", () => {
140
145
  (0, bun_test_1.expect)((0, index_1.isNonEvmChainId)(index_1.MainnetNetwork.SOLANA)).toBe(true);
141
146
  (0, bun_test_1.expect)((0, index_1.isNonEvmChainId)(index_1.MainnetNetwork.TRON)).toBe(true);
147
+ (0, bun_test_1.expect)((0, index_1.isNonEvmChainId)(index_1.TestnetNetwork.SOLANA_DEVNET)).toBe(true);
142
148
  (0, bun_test_1.expect)((0, index_1.isNonEvmChainId)(index_1.MainnetNetwork.ETHEREUM)).toBe(false);
143
- (0, bun_test_1.expect)((0, index_1.getNonEvmChainIds)()).toEqual(bun_test_1.expect.arrayContaining([index_1.MainnetNetwork.SOLANA, index_1.MainnetNetwork.TRON]));
149
+ (0, bun_test_1.expect)((0, index_1.getNonEvmChainIds)()).toEqual(bun_test_1.expect.arrayContaining([
150
+ index_1.MainnetNetwork.SOLANA,
151
+ index_1.TestnetNetwork.SOLANA_DEVNET,
152
+ index_1.MainnetNetwork.TRON,
153
+ ]));
144
154
  });
145
155
  });
146
156
  });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const bun_test_1 = require("bun:test");
4
+ const index_1 = require("../index");
5
+ const oft_1 = require("../oft");
6
+ const DEVNET_ID = 792_703_810;
7
+ const NATIVE_SOL = '11111111111111111111111111111111';
8
+ const WRAPPED_SOL = 'So11111111111111111111111111111111111111112';
9
+ const DEVNET_USDC = '4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU';
10
+ (0, bun_test_1.describe)('Solana Devnet registry', () => {
11
+ (0, bun_test_1.it)('publishes the exact testnet identity without a viem chain', () => {
12
+ (0, bun_test_1.expect)(index_1.TestnetNetwork.SOLANA_DEVNET).toBe(DEVNET_ID);
13
+ const entry = index_1.chainRegistry[String(DEVNET_ID)];
14
+ (0, bun_test_1.expect)(entry).toMatchObject({
15
+ name: 'Solana Devnet',
16
+ caip2: 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1',
17
+ vmType: 'svm',
18
+ network: 'testnet',
19
+ stack: 'vanilla',
20
+ explorer: null,
21
+ iconSlug: 'solana',
22
+ providerIds: { alchemy: null, zerion: null },
23
+ sessionCapable: false,
24
+ });
25
+ (0, bun_test_1.expect)(index_1.testnetChainList[String(DEVNET_ID)]).toEqual({ providers: [] });
26
+ (0, bun_test_1.expect)(index_1.mainnetChainList[String(DEVNET_ID)]).toBeUndefined();
27
+ for (const viemChains of [index_1.mainnetChains, index_1.testnetChains, index_1.chains]) {
28
+ (0, bun_test_1.expect)(viemChains.some((chain) => Number(chain.id) === DEVNET_ID)).toBe(false);
29
+ }
30
+ });
31
+ (0, bun_test_1.it)('publishes only native SOL, WSOL, and Devnet USDC', () => {
32
+ const entry = index_1.chainRegistry[String(DEVNET_ID)];
33
+ (0, bun_test_1.expect)(entry.nativeToken).toEqual({
34
+ address: NATIVE_SOL,
35
+ decimals: 9,
36
+ symbol: 'SOL',
37
+ });
38
+ (0, bun_test_1.expect)(entry.wrappedNativeToken).toEqual({
39
+ address: WRAPPED_SOL,
40
+ decimals: 9,
41
+ symbol: 'WSOL',
42
+ });
43
+ (0, bun_test_1.expect)(entry.nativeToken.address).not.toBe(entry.wrappedNativeToken.address);
44
+ (0, bun_test_1.expect)(entry.tokens).toEqual([
45
+ {
46
+ address: NATIVE_SOL,
47
+ approvalSlot: null,
48
+ balanceSlot: null,
49
+ decimals: 9,
50
+ symbol: 'SOL',
51
+ },
52
+ {
53
+ address: WRAPPED_SOL,
54
+ approvalSlot: null,
55
+ balanceSlot: null,
56
+ decimals: 9,
57
+ priceSymbol: 'SOL',
58
+ symbol: 'WSOL',
59
+ },
60
+ {
61
+ address: DEVNET_USDC,
62
+ approvalSlot: null,
63
+ balanceSlot: null,
64
+ decimals: 6,
65
+ pegGroup: 'USD',
66
+ symbol: 'USDC',
67
+ },
68
+ ]);
69
+ });
70
+ (0, bun_test_1.it)('keeps normal same-chain roles without advertising bridge coverage', () => {
71
+ const entry = index_1.chainRegistry[String(DEVNET_ID)];
72
+ (0, bun_test_1.expect)(entry.settlementLayers).toEqual([]);
73
+ (0, bun_test_1.expect)(entry.swapQuoters).toEqual([]);
74
+ (0, bun_test_1.expect)(entry.settlementConfig).toBeUndefined();
75
+ (0, bun_test_1.expect)(entry.paymentTokens).toBeUndefined();
76
+ (0, bun_test_1.expect)(entry.tokens.every((token) => token.settlementLayers === undefined)).toBe(true);
77
+ (0, bun_test_1.expect)(oft_1.OFT_PROGRAM_IDS[DEVNET_ID]).toBeUndefined();
78
+ for (const config of Object.values(oft_1.OFT_REGISTRY)) {
79
+ (0, bun_test_1.expect)(config.adapters[DEVNET_ID]).toBeUndefined();
80
+ (0, bun_test_1.expect)(config.tokens[DEVNET_ID]).toBeUndefined();
81
+ (0, bun_test_1.expect)(config.layerZeroEids[DEVNET_ID]).toBeUndefined();
82
+ }
83
+ (0, bun_test_1.expect)((0, index_1.canBeOrigin)(DEVNET_ID)).toBe(true);
84
+ (0, bun_test_1.expect)((0, index_1.canBeDestination)(DEVNET_ID)).toBe(true);
85
+ });
86
+ });
@@ -3306,6 +3306,58 @@ const chains = {
3306
3306
  "symbol": "WSOL"
3307
3307
  },
3308
3308
  "providers": []
3309
+ },
3310
+ "792703810": {
3311
+ "caip2": "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1",
3312
+ "explorer": null,
3313
+ "iconSlug": "solana",
3314
+ "name": "Solana Devnet",
3315
+ "nativeToken": {
3316
+ "address": "11111111111111111111111111111111",
3317
+ "decimals": 9,
3318
+ "symbol": "SOL"
3319
+ },
3320
+ "network": "testnet",
3321
+ "providerIds": {
3322
+ "alchemy": null,
3323
+ "zerion": null
3324
+ },
3325
+ "sessionCapable": false,
3326
+ "settlementLayers": [],
3327
+ "stack": "vanilla",
3328
+ "swapQuoters": [],
3329
+ "tokens": [
3330
+ {
3331
+ "address": "11111111111111111111111111111111",
3332
+ "approvalSlot": null,
3333
+ "balanceSlot": null,
3334
+ "decimals": 9,
3335
+ "symbol": "SOL"
3336
+ },
3337
+ {
3338
+ "address": "So11111111111111111111111111111111111111112",
3339
+ "approvalSlot": null,
3340
+ "balanceSlot": null,
3341
+ "decimals": 9,
3342
+ "priceSymbol": "SOL",
3343
+ "symbol": "WSOL"
3344
+ },
3345
+ {
3346
+ "address": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU",
3347
+ "approvalSlot": null,
3348
+ "balanceSlot": null,
3349
+ "decimals": 6,
3350
+ "pegGroup": "USD",
3351
+ "symbol": "USDC"
3352
+ }
3353
+ ],
3354
+ "vmType": "svm",
3355
+ "wrappedNativeToken": {
3356
+ "address": "So11111111111111111111111111111111111111112",
3357
+ "decimals": 9,
3358
+ "symbol": "WSOL"
3359
+ },
3360
+ "providers": []
3309
3361
  }
3310
3362
  };
3311
3363
  exports.chains = chains;
@@ -18,7 +18,9 @@ const contractAddresses = {
18
18
  "ecoPortal": "0xEC000064576f9C95a8623Bc0eff3db6d296ea6df",
19
19
  "ecoHyperProver": "0xeC0008acc34d3D0CAa6758Ce788091e473812e28",
20
20
  "ecoVaultAddress": "0x9f70b0c839fe2D7190A09Ae87ED658b6D1CbA4F9",
21
- "oftProxy": "0x5B64E414f4dEA97062D6B552852FFbAcaf6d462b"
21
+ "oftProxy": "0x5B64E414f4dEA97062D6B552852FFbAcaf6d462b",
22
+ "swapAdapter": "0x58BC7d9279A38a1537c2f74426dBDbD804AD3A18",
23
+ "swapAdapterTokenSpender": "0xc5f6641b3ade357c5df77a1859d16528fe8b3e93"
22
24
  },
23
25
  "56": {
24
26
  "ecoArbiter": "0x1BeBAfb3D05d84A5Bfd94800c88d1342f755d8AB",
@@ -82,7 +84,9 @@ const contractAddresses = {
82
84
  "spokepool": "0x09aea4b2242abC8bb4BB78D537A67a245A7bEC64",
83
85
  "ecoPortal": "0xEC000064576f9C95a8623Bc0eff3db6d296ea6df",
84
86
  "ecoHyperProver": "0xeC0008acc34d3D0CAa6758Ce788091e473812e28",
85
- "ecoVaultAddress": "0x9f70b0c839fe2D7190A09Ae87ED658b6D1CbA4F9"
87
+ "ecoVaultAddress": "0x9f70b0c839fe2D7190A09Ae87ED658b6D1CbA4F9",
88
+ "swapAdapter": "0x58BC7d9279A38a1537c2f74426dBDbD804AD3A18",
89
+ "swapAdapterTokenSpender": "0xc5f6641b3ade357c5df77a1859d16528fe8b3e93"
86
90
  },
87
91
  "9745": {
88
92
  "ecoArbiter": "0x1BeBAfb3D05d84A5Bfd94800c88d1342f755d8AB",
@@ -6067,7 +6067,8 @@ declare enum TestnetNetwork {
6067
6067
  OPTIMISM_SEPOLIA,
6068
6068
  BASE_SEPOLIA,
6069
6069
  ARBITRUM_SEPOLIA,
6070
- PLASMA_TESTNET
6070
+ PLASMA_TESTNET,
6071
+ SOLANA_DEVNET = 792703810
6071
6072
  }
6072
6073
  declare enum OPStackChains {
6073
6074
  MAINNET_OPTIMISM,
@@ -42,6 +42,7 @@ var TestnetNetwork;
42
42
  TestnetNetwork[TestnetNetwork["BASE_SEPOLIA"] = chains_1.baseSepolia.id] = "BASE_SEPOLIA";
43
43
  TestnetNetwork[TestnetNetwork["ARBITRUM_SEPOLIA"] = chains_1.arbitrumSepolia.id] = "ARBITRUM_SEPOLIA";
44
44
  TestnetNetwork[TestnetNetwork["PLASMA_TESTNET"] = chains_1.plasmaTestnet.id] = "PLASMA_TESTNET";
45
+ TestnetNetwork[TestnetNetwork["SOLANA_DEVNET"] = 792703810] = "SOLANA_DEVNET";
45
46
  })(TestnetNetwork || (exports.TestnetNetwork = TestnetNetwork = {}));
46
47
  var OPStackChains;
47
48
  (function (OPStackChains) {
@@ -1,2 +1,2 @@
1
- declare const PACKAGE_VERSION = "2.15.1";
1
+ declare const PACKAGE_VERSION = "2.17.0";
2
2
  export { PACKAGE_VERSION };
@@ -2,5 +2,5 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.PACKAGE_VERSION = void 0;
4
4
  // Auto-generated by scripts/generate.ts. Do not edit manually.
5
- const PACKAGE_VERSION = "2.15.1";
5
+ const PACKAGE_VERSION = "2.17.0";
6
6
  exports.PACKAGE_VERSION = PACKAGE_VERSION;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rhinestone/shared-configs",
3
- "version": "2.15.1",
3
+ "version": "2.17.0",
4
4
  "description": "Reusable configuration files for Rhinestone services",
5
5
  "author": {
6
6
  "name": "Rhinestone",