@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.
- package/dist/configs/chains.json +51 -0
- package/dist/configs/contracts.dev.json +6 -2
- package/dist/configs/testnets.json +3 -0
- package/dist/scripts/__tests__/hoistUniform.test.js +16 -0
- package/dist/scripts/__tests__/validation.test.js +43 -4
- package/dist/scripts/generate.js +2 -0
- package/dist/scripts/hoistUniform.d.ts +0 -28
- package/dist/scripts/hoistUniform.js +9 -1
- package/dist/scripts/validation.js +7 -1
- package/dist/src/__tests__/chainFactsClient.test.js +15 -7
- package/dist/src/__tests__/chainVirtualization.test.js +11 -1
- package/dist/src/__tests__/solanaDevnet.test.d.ts +1 -0
- package/dist/src/__tests__/solanaDevnet.test.js +86 -0
- package/dist/src/chains.js +52 -0
- package/dist/src/generated/contracts.dev.js +6 -2
- package/dist/src/generated/networks.d.ts +2 -1
- package/dist/src/generated/networks.js +1 -0
- package/dist/src/generated/packageVersion.d.ts +1 -1
- package/dist/src/generated/packageVersion.js +1 -1
- package/package.json +1 -1
package/dist/configs/chains.json
CHANGED
|
@@ -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",
|
|
@@ -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
|
-
|
|
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
|
}
|
package/dist/scripts/generate.js
CHANGED
|
@@ -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]) =>
|
|
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
|
-
|
|
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([
|
|
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
|
+
});
|
package/dist/src/chains.js
CHANGED
|
@@ -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",
|
|
@@ -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.
|
|
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.
|
|
5
|
+
const PACKAGE_VERSION = "2.17.0";
|
|
6
6
|
exports.PACKAGE_VERSION = PACKAGE_VERSION;
|