Skip to content

Commit d2e14fb

Browse files
X layer (#732)
* chore: Add X-Layer addresses. * chore: Add mock test - WIP, these should be updated following deployments. * chore: Add changeset. * fix: Use correct API chain name. * update x layer test pool --------- Co-authored-by: Matt Pereira <[email protected]>
1 parent 6039bd8 commit d2e14fb

File tree

8 files changed

+73
-0
lines changed

8 files changed

+73
-0
lines changed

.changeset/famous-ears-smash.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@balancer/sdk": minor
3+
---
4+
5+
Add X Layer support.

pnpm-workspace.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
packages:
2+
- '.'
3+
14
onlyBuiltDependencies:
25
- '@biomejs/biome'
36
- esbuild

src/utils/balancerV2Contracts.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ export const balancerV2Contracts = {
1616
[ChainId.POLYGON]: '0xA331D84eC860Bf466b4CdCcFb4aC09a1B43F3aE6',
1717
[ChainId.SEPOLIA]: '0xA331D84eC860Bf466b4CdCcFb4aC09a1B43F3aE6',
1818
[ChainId.SONIC]: '0xE39B5e3B6D74016b2F6A9673D7d7493B6DF549d5',
19+
[ChainId.X_LAYER]: '0xE39B5e3B6D74016b2F6A9673D7d7493B6DF549d5',
1920
[ChainId.ZKEVM]: '0xA331D84eC860Bf466b4CdCcFb4aC09a1B43F3aE6',
2021
},
2122
BalancerQueries: {

src/utils/balancerV3Contracts.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ export const balancerV3Contracts = {
1212
[ChainId.PLASMA]: '0x85a80afee867aDf27B50BdB7b76DA70f1E853062',
1313
[ChainId.SEPOLIA]: '0xC85b652685567C1B074e8c0D4389f83a2E458b1C',
1414
[ChainId.SONIC]: '0x7761659F9e9834ad367e4d25E0306ba7A4968DAf',
15+
[ChainId.X_LAYER]: '0x36caC20dd805d128c1a6Dd16eeA845C574b5A17C',
1516
},
1617
BufferRouter: {
1718
[ChainId.ARBITRUM_ONE]: '0x311334883921Fb1b813826E585dF1C2be4358615',
@@ -24,6 +25,7 @@ export const balancerV3Contracts = {
2425
[ChainId.PLASMA]: '0x4132f7AcC9dB7A6cF7BE2Dd3A9DC8b30C7E6E6c8',
2526
[ChainId.SEPOLIA]: '0xb5F3A41515457CC6E2716c62a011D260441CcfC9',
2627
[ChainId.SONIC]: '0x532dA919D3EB5606b5867A6f505969c57F3A721b',
28+
[ChainId.X_LAYER]: '0x85a80afee867aDf27B50BdB7b76DA70f1E853062',
2729
},
2830
CompositeLiquidityRouter: {
2931
[ChainId.ARBITRUM_ONE]: '0xC1A64500E035D9159C8826E982dFb802003227f0',
@@ -36,6 +38,7 @@ export const balancerV3Contracts = {
3638
[ChainId.PLASMA]: '0x5cF4928a3205728bd12830E1840F7DB85c62a4B9',
3739
[ChainId.SEPOLIA]: '0x6A20a4b6DcFF78e6D21BF0dbFfD58C96644DB9cb',
3840
[ChainId.SONIC]: '0xE42FFA682A26EF8F25891db4882932711D42e467',
41+
[ChainId.X_LAYER]: '0x9805dcfD25e6De36bad8fe9D3Fe2c9b44B764102',
3942
},
4043
GyroECLPPoolFactory: {
4144
[ChainId.ARBITRUM_ONE]: '0x88ED12A90142fDBFe2a28f7d5b48927254C7e760',
@@ -48,6 +51,7 @@ export const balancerV3Contracts = {
4851
[ChainId.PLASMA]: '0xE3881627B8DeeBCCF9c23B291430a549Fc0bE5F7',
4952
[ChainId.SEPOLIA]: '0x589cA6855C348d831b394676c25B125BcdC7F8ce',
5053
[ChainId.SONIC]: '0xf023731dD8758D7C869af10005e6380Cb57775a9',
54+
[ChainId.X_LAYER]: '0x5cF4928a3205728bd12830E1840F7DB85c62a4B9',
5155
},
5256
LBPMigrationRouter: {
5357
[ChainId.ARBITRUM_ONE]: '0xFc2986feAB34713E659da84F3B1FA32c1da95832',
@@ -56,6 +60,7 @@ export const balancerV3Contracts = {
5660
[ChainId.HYPEREVM]: '0xb21A277466e7dB6934556a1Ce12eb3F032815c8A',
5761
[ChainId.MAINNET]: '0xCC267D25576b48f08A90C3605624Ab62a73a7A4E',
5862
[ChainId.SEPOLIA]: '0x0AE19A3f8c35e0156E0d39307ad4cce1acD42929',
63+
// TODO: add X_LAYER
5964
},
6065
LBPoolFactory: {
6166
[ChainId.ARBITRUM_ONE]: '0x8D217CB74f675B46cC2767C8cF0aAB53BE1c4818',
@@ -64,6 +69,7 @@ export const balancerV3Contracts = {
6469
[ChainId.HYPEREVM]: '0xa1D0791a41318c775707C56eAe247AF81a05322C',
6570
[ChainId.MAINNET]: '0x02916d8F0891309806FCb347Bf4191692cbDDcAF',
6671
[ChainId.SEPOLIA]: '0xE92cF5185384f53B2af74A2eBA62ba3A9C0ED65B',
72+
// TODO: add X_LAYER
6773
},
6874
ReClammPoolFactory: {
6975
[ChainId.ARBITRUM_ONE]: '0x355bD33F0033066BB3DE396a6d069be57353AD95',
@@ -76,6 +82,7 @@ export const balancerV3Contracts = {
7682
[ChainId.PLASMA]: '0x662112B8CB18889e81459b92CA0f894a2ef2c1B8',
7783
[ChainId.SEPOLIA]: '0xf58A574530Ea5cEB727095e6039170c1e8068fcA',
7884
[ChainId.SONIC]: '0x99c13B259138a8ad8badbBfB87A4074591310De0',
85+
[ChainId.X_LAYER]: '0x013D4382F291be5688AFBcc741Ee8A24C66B2C92',
7986
},
8087
Router: {
8188
[ChainId.ARBITRUM_ONE]: '0xEAedc32a51c510d35ebC11088fD5fF2b47aACF2E',
@@ -88,6 +95,7 @@ export const balancerV3Contracts = {
8895
[ChainId.PLASMA]: '0x9dA18982a33FD0c7051B19F0d7C76F2d5E7e017c',
8996
[ChainId.SEPOLIA]: '0x5e315f96389C1aaF9324D97d3512ae1e0Bf3C21a',
9097
[ChainId.SONIC]: '0x93db4682A40721e7c698ea0a842389D10FA8Dae5',
98+
[ChainId.X_LAYER]: '0xc3ccacE87f6d3A81724075ADcb5ddd85a8A1bB68',
9199
},
92100
StablePoolFactory: {
93101
[ChainId.ARBITRUM_ONE]: '0x44d33798dddCdAbc93Fe6a40C80588033Dc502d3',
@@ -100,6 +108,7 @@ export const balancerV3Contracts = {
100108
[ChainId.PLASMA]: '0x81cFAE226343B24BA12EC6521Db2C79E7aeeb310',
101109
[ChainId.SEPOLIA]: '0xc274A11E09a3c92Ac64eAff5bEC4ee8f5dfEe207',
102110
[ChainId.SONIC]: '0x482eE54595f79B6BA34b75754A4983134148Affb',
111+
[ChainId.X_LAYER]: '0x9dA18982a33FD0c7051B19F0d7C76F2d5E7e017c',
103112
},
104113
StableSurgePoolFactory: {
105114
[ChainId.ARBITRUM_ONE]: '0x201efd508c8DfE9DE1a13c2452863A78CB2a86Cc',
@@ -112,6 +121,7 @@ export const balancerV3Contracts = {
112121
[ChainId.PLASMA]: '0x6B5dA774890Db7B7b96C6f44e6a4b0F657399E2e',
113122
[ChainId.SEPOLIA]: '0x2f1d6F4C40047dC122cA7e46B0D1eC27739BFc66',
114123
[ChainId.SONIC]: '0x3D9319BB29DAF6081D01DC56b6203EfcC90f0bAD',
124+
[ChainId.X_LAYER]: '0x6817149cb753BF529565B4D023d7507eD2ff4Bc0',
115125
},
116126
Vault: {
117127
[ChainId.ARBITRUM_ONE]: '0xbA1333333333a1BA1108E8412f11850A5C319bA9',
@@ -124,6 +134,7 @@ export const balancerV3Contracts = {
124134
[ChainId.PLASMA]: '0xbA1333333333a1BA1108E8412f11850A5C319bA9',
125135
[ChainId.SEPOLIA]: '0xbA1333333333a1BA1108E8412f11850A5C319bA9',
126136
[ChainId.SONIC]: '0xbA1333333333a1BA1108E8412f11850A5C319bA9',
137+
[ChainId.X_LAYER]: '0xbA1333333333a1BA1108E8412f11850A5C319bA9',
127138
},
128139
VaultAdmin: {
129140
[ChainId.ARBITRUM_ONE]: '0x35fFB749B273bEb20F40f35EdeB805012C539864',
@@ -136,6 +147,7 @@ export const balancerV3Contracts = {
136147
[ChainId.PLASMA]: '0x35fFB749B273bEb20F40f35EdeB805012C539864',
137148
[ChainId.SEPOLIA]: '0x35fFB749B273bEb20F40f35EdeB805012C539864',
138149
[ChainId.SONIC]: '0x35fFB749B273bEb20F40f35EdeB805012C539864',
150+
[ChainId.X_LAYER]: '0x35fFB749B273bEb20F40f35EdeB805012C539864',
139151
},
140152
VaultExtension: {
141153
[ChainId.ARBITRUM_ONE]: '0x0E8B07657D719B86e06bF0806D6729e3D528C9A9',
@@ -148,6 +160,7 @@ export const balancerV3Contracts = {
148160
[ChainId.PLASMA]: '0x0E8B07657D719B86e06bF0806D6729e3D528C9A9',
149161
[ChainId.SEPOLIA]: '0x0E8B07657D719B86e06bF0806D6729e3D528C9A9',
150162
[ChainId.SONIC]: '0x0E8B07657D719B86e06bF0806D6729e3D528C9A9',
163+
[ChainId.X_LAYER]: '0x0E8B07657D719B86e06bF0806D6729e3D528C9A9',
151164
},
152165
WeightedPoolFactory: {
153166
[ChainId.ARBITRUM_ONE]: '0xD961E30156C2E0D0d925A0De45f931CB7815e970',
@@ -160,5 +173,6 @@ export const balancerV3Contracts = {
160173
[ChainId.PLASMA]: '0xf23b4DB826DbA14c0e857029dfF076b1c0264843',
161174
[ChainId.SEPOLIA]: '0x7532d5a3bE916e4a4D900240F49F0BABd4FD855C',
162175
[ChainId.SONIC]: '0x4726Eb55c37F0353F6d5011B5652d44A87d60fc3',
176+
[ChainId.X_LAYER]: '0xf23b4DB826DbA14c0e857029dfF076b1c0264843',
163177
},
164178
} as const;

src/utils/constants.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import {
1919
fraxtal,
2020
sonic,
2121
plasma,
22+
xLayer,
2223
} from 'viem/chains';
2324
import { monadTestnet, hyperEVM } from './customChains';
2425
export const ZERO_ADDRESS: Address =
@@ -84,6 +85,7 @@ export enum ChainId {
8485
MONAD_TESTNET = 10143,
8586
HYPEREVM = 999,
8687
PLASMA = 9745,
88+
X_LAYER = 196,
8789
}
8890

8991
// The Balancer API requires the chain to be passed as a specific string
@@ -105,6 +107,7 @@ export const API_CHAIN_NAMES: Record<number, string> = {
105107
[ChainId.MONAD_TESTNET]: 'MONAD_TESTNET',
106108
[ChainId.HYPEREVM]: 'HYPEREVM',
107109
[ChainId.PLASMA]: 'PLASMA',
110+
[ChainId.X_LAYER]: 'XLAYER',
108111
};
109112

110113
export const CHAINS: Record<number, Chain> = {
@@ -128,6 +131,7 @@ export const CHAINS: Record<number, Chain> = {
128131
[ChainId.MONAD_TESTNET]: monadTestnet,
129132
[ChainId.HYPEREVM]: hyperEVM,
130133
[ChainId.PLASMA]: plasma,
134+
[ChainId.X_LAYER]: xLayer,
131135
};
132136

133137
export const PERMIT2: Record<number, Address> = {
@@ -142,6 +146,7 @@ export const PERMIT2: Record<number, Address> = {
142146
[ChainId.PLASMA]: '0x000000000022D473030F116dDEE9F6B43aC78BA3',
143147
[ChainId.SEPOLIA]: '0x000000000022D473030F116dDEE9F6B43aC78BA3',
144148
[ChainId.SONIC]: '0x000000000022D473030F116dDEE9F6B43aC78BA3',
149+
[ChainId.X_LAYER]: '0x000000000022D473030F116dDEE9F6B43aC78BA3',
145150
};
146151

147152
export const NATIVE_ASSETS = {
@@ -273,6 +278,14 @@ export const NATIVE_ASSETS = {
273278
'Xpl',
274279
'0x6100E367285b01F48D07953803A2d8dCA5D19873',
275280
),
281+
[ChainId.X_LAYER]: new Token(
282+
ChainId.X_LAYER,
283+
NATIVE_ADDRESS,
284+
18,
285+
'OKB',
286+
'Okb',
287+
'0xe538905cf8410324e03A5A23C1c177a474D59b2b',
288+
),
276289
};
277290

278291
export const DEFAULT_USERDATA = '0x';

test/anvil/anvil-global-setup.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ type NetworksWithFork = Extract<
2727
| 'SONIC'
2828
| 'HYPEREVM'
2929
| 'PLASMA'
30+
| 'X_LAYER'
3031
>;
3132

3233
const ANVIL_PORTS: Record<NetworksWithFork, number> = {
@@ -44,6 +45,7 @@ const ANVIL_PORTS: Record<NetworksWithFork, number> = {
4445
SONIC: 9645,
4546
HYPEREVM: 9745,
4647
PLASMA: 9845,
48+
X_LAYER: 9945,
4749
};
4850

4951
export const ANVIL_NETWORKS: Record<NetworksWithFork, NetworkSetup> = {
@@ -126,6 +128,12 @@ export const ANVIL_NETWORKS: Record<NetworksWithFork, NetworkSetup> = {
126128
port: ANVIL_PORTS.PLASMA,
127129
forkBlockNumber: 1274881n,
128130
},
131+
X_LAYER: {
132+
rpcEnv: 'X_LAYER_RPC_URL',
133+
fallBackRpc: 'https://rpc.xlayer.tech',
134+
port: ANVIL_PORTS.X_LAYER,
135+
forkBlockNumber: 43138155n,
136+
},
129137
};
130138

131139
function getAnvilOptions(

test/lib/utils/addresses.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,17 @@ export const TOKENS: Record<number, Record<string, TestToken>> = {
231231
decimals: 18,
232232
},
233233
},
234+
[ChainId.X_LAYER]: {
235+
USDT: {
236+
address: '0x779ded0c9e1022225f8e0630b35a9b54be713736',
237+
decimals: 6,
238+
slot: 51,
239+
},
240+
xBTC: {
241+
address: '0xb7c00000bcdeef966b20b3d884b98e64d2b06b4f',
242+
decimals: 18,
243+
},
244+
},
234245
};
235246

236247
export type TestPool = TestToken & { id: Hex; type: PoolType };
@@ -416,4 +427,13 @@ export const POOLS: Record<number, Record<string, TestPool>> = {
416427
slot: 0,
417428
},
418429
},
430+
[ChainId.X_LAYER]: {
431+
MOCK_USDT_xBTC_POOL: {
432+
address: '0x089664b3b67ad603cd45659f21b51d2b3305a502',
433+
id: '0x089664b3b67ad603cd45659f21b51d2b3305a502',
434+
type: PoolType.Weighted,
435+
decimals: 18,
436+
slot: 0,
437+
},
438+
},
419439
};

test/validateAllNetworks.test.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ const CHAIN_ANVIL_MAP: Partial<Record<number, keyof typeof ANVIL_NETWORKS>> = {
5050
[ChainId.SONIC]: 'SONIC',
5151
[ChainId.HYPEREVM]: 'HYPEREVM',
5252
[ChainId.PLASMA]: 'PLASMA',
53+
[ChainId.X_LAYER]: 'X_LAYER',
5354
// Add/remove mappings as needed for your test coverage
5455
};
5556

@@ -83,6 +84,12 @@ const NETWORK_CONFIG: Partial<
8384
poolKey: 'MOCK_USDT_WXPL_POOL',
8485
inputAmountRaw: 10000n,
8586
},
87+
[ChainId.X_LAYER]: {
88+
tokenInKey: 'USDT',
89+
tokenOutKey: 'xBTC',
90+
poolKey: 'MOCK_USDT_xBTC_POOL',
91+
inputAmountRaw: 10000n,
92+
},
8693
};
8794

8895
// Optionally override fork block numbers for specific chains. Useful to select pools deployed on V3 after
@@ -91,13 +98,15 @@ const BLOCK_NUMBER_OVERRIDES: Partial<Record<number, bigint>> = {
9198
[ChainId.HYPEREVM]: 6892528n,
9299
[ChainId.MAINNET]: 22788192n,
93100
[ChainId.PLASMA]: 1274881n,
101+
[ChainId.X_LAYER]: 43173129n,
94102
};
95103

96104
// List of ChainIds to run the test for. Modify this array to select which chains to test.
97105
const CHAINS_TO_TEST: number[] = [
98106
ChainId.SEPOLIA,
99107
ChainId.HYPEREVM,
100108
ChainId.PLASMA,
109+
ChainId.X_LAYER,
101110
];
102111

103112
describe('validateAllNetworks', () => {

0 commit comments

Comments
 (0)