Skip to content

Commit cd69856

Browse files
authored
feat: add Igra warp routes (IKAS, WSTETH, CBBTC, USDC) (#8546)
1 parent df33d41 commit cd69856

8 files changed

Lines changed: 477 additions & 127 deletions

File tree

.registryrc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
c1310f09d41bf0ed4a856e1899e89232f898349b
1+
15d4255e8e31bce4292b057377dd9f95ae51104e

rust/main/app-contexts/mainnet_config.json

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41880,6 +41880,81 @@
4188041880
}
4188141881
]
4188241882
},
41883+
{
41884+
"name": "IKAS/igra",
41885+
"matchingList": [
41886+
{
41887+
"originDomain": 38833,
41888+
"senderAddress": [
41889+
"0x000000000000000000000000eac17188d29665f57e31a0d9808a9173b9d9d632"
41890+
],
41891+
"destinationDomain": 1,
41892+
"recipientAddress": [
41893+
"0x000000000000000000000000b76eaa8b8779f377248d1e9ca78550b156f5f7fb"
41894+
]
41895+
},
41896+
{
41897+
"originDomain": 1,
41898+
"senderAddress": [
41899+
"0x000000000000000000000000b76eaa8b8779f377248d1e9ca78550b156f5f7fb"
41900+
],
41901+
"destinationDomain": 38833,
41902+
"recipientAddress": [
41903+
"0x000000000000000000000000eac17188d29665f57e31a0d9808a9173b9d9d632"
41904+
]
41905+
}
41906+
]
41907+
},
41908+
{
41909+
"name": "WSTETH/igra",
41910+
"matchingList": [
41911+
{
41912+
"originDomain": 38833,
41913+
"senderAddress": [
41914+
"0x000000000000000000000000c3f8b34587eb403fc30a161d6a35cb724a3b273e"
41915+
],
41916+
"destinationDomain": 1,
41917+
"recipientAddress": [
41918+
"0x0000000000000000000000000e47f12002cbdc72e3d1080d10f44a5a94279a29"
41919+
]
41920+
},
41921+
{
41922+
"originDomain": 1,
41923+
"senderAddress": [
41924+
"0x0000000000000000000000000e47f12002cbdc72e3d1080d10f44a5a94279a29"
41925+
],
41926+
"destinationDomain": 38833,
41927+
"recipientAddress": [
41928+
"0x000000000000000000000000c3f8b34587eb403fc30a161d6a35cb724a3b273e"
41929+
]
41930+
}
41931+
]
41932+
},
41933+
{
41934+
"name": "CBBTC/igra",
41935+
"matchingList": [
41936+
{
41937+
"originDomain": 38833,
41938+
"senderAddress": [
41939+
"0x000000000000000000000000f2b48b6e560af8834622203a8eeff6960d6172de"
41940+
],
41941+
"destinationDomain": 8453,
41942+
"recipientAddress": [
41943+
"0x0000000000000000000000008de75a8a9ee436390429eefd343926b28768eab7"
41944+
]
41945+
},
41946+
{
41947+
"originDomain": 8453,
41948+
"senderAddress": [
41949+
"0x0000000000000000000000008de75a8a9ee436390429eefd343926b28768eab7"
41950+
],
41951+
"destinationDomain": 38833,
41952+
"recipientAddress": [
41953+
"0x000000000000000000000000f2b48b6e560af8834622203a8eeff6960d6172de"
41954+
]
41955+
}
41956+
]
41957+
},
4188341958
{
4188441959
"name": "merkly_erc20",
4188541960
"matchingList": [

rust/main/config/mainnet_config.json

Lines changed: 221 additions & 125 deletions
Large diffs are not rendered by default.

typescript/infra/config/environments/mainnet3/governance/ica/warpFees.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ export const warpFeesIcas: ChainMap<Address> = {
130130

131131
// Mar 16, 2026
132132
// ----------------------------------------------------------
133-
// igra: '0x42cb788529463B1F41de9E3cd3d2906930aCd32F',
133+
igra: '0x42cb788529463B1F41de9E3cd3d2906930aCd32F',
134134
// tron: '0xa5A136994e739E9042820C88F24041165767cBF9',
135135

136136
// Apr 2, 2026
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
warpRouteId: USDC/igra
2+
3+
strategy:
4+
rebalanceStrategy: weighted
5+
chains:
6+
ethereum:
7+
weighted:
8+
weight: 35
9+
tolerance: 5
10+
bridgeLockTime: 1800 # 30 mins in seconds (required for CCTP latency)
11+
bridgeMinAcceptedAmount: 1000
12+
bridge: '0x8c8D831E1e879604b4B304a2c951B8AEe3aB3a23'
13+
14+
arbitrum:
15+
weighted:
16+
weight: 20
17+
tolerance: 5
18+
bridgeLockTime: 1800
19+
bridgeMinAcceptedAmount: 1000
20+
bridge: '0x4c19c653a8419A475d9B6735511cB81C15b8d9b2'
21+
22+
base:
23+
weighted:
24+
weight: 20
25+
tolerance: 5
26+
bridgeLockTime: 1800
27+
bridgeMinAcceptedAmount: 1000
28+
bridge: '0x33e94B6D2ae697c16a750dB7c3d9443622C4405a'
29+
30+
polygon:
31+
weighted:
32+
weight: 10
33+
tolerance: 5
34+
bridgeLockTime: 1800
35+
bridgeMinAcceptedAmount: 1000
36+
bridge: '0x33e94B6D2ae697c16a750dB7c3d9443622C4405a'
37+
38+
optimism:
39+
weighted:
40+
weight: 10
41+
tolerance: 5
42+
bridgeLockTime: 1800
43+
bridgeMinAcceptedAmount: 1000
44+
bridge: '0x33e94B6D2ae697c16a750dB7c3d9443622C4405a'
45+
46+
avalanche:
47+
weighted:
48+
weight: 5
49+
tolerance: 5
50+
bridgeLockTime: 1800
51+
bridgeMinAcceptedAmount: 1000
52+
bridge: '0x33e94B6D2ae697c16a750dB7c3d9443622C4405a'
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
import {
2+
ChainMap,
3+
ChainSubmissionStrategy,
4+
HypTokenRouterConfig,
5+
SubmissionStrategy,
6+
TxSubmitterType,
7+
} from '@hyperlane-xyz/sdk';
8+
import { assert } from '@hyperlane-xyz/utils';
9+
10+
import { RouterConfigWithoutOwner } from '../../../../../src/config/warp.js';
11+
import { getChainAddresses } from '../../../../registry.js';
12+
import { getWarpFeeOwner } from '../../governance/utils.js';
13+
import { WarpRouteIds } from '../warpIds.js';
14+
15+
import {
16+
getFixedRoutingFeeConfig,
17+
getRebalancingUSDCConfigForChain,
18+
getSyntheticTokenConfigForChain,
19+
getUSDCRebalancingBridgesConfigFor,
20+
} from './utils.js';
21+
22+
// Owner addresses for this deployment (ICA-based, origin chain is ethereum)
23+
// ethereum: Igra Safe on ethereum (controls all ICAs below)
24+
// others: ICA deployed on each chain, owned by the ethereum Safe
25+
const ownersByChain = {
26+
ethereum: '0x442f580802aDa1B1E83DCaf103682C59dAEe904E',
27+
arbitrum: '0x01ac140de46b26B698b575a1faF7BDD610676B68',
28+
avalanche: '0x3dA09321C8eA6936abFA8CeE528341368D6bc374',
29+
base: '0xba1E27ECE55Ff3B2aCbDB1DD06924C65078D220c',
30+
optimism: '0x6e0e5642A1359158F9B1B435D84d2C023961b22F',
31+
polygon: '0x9E0e72A2dCE951c8Dd12aB433EB7a346ce85994d',
32+
igra: '0xe1C9B631fD776442b7E2c91a58C6d713Bb13FF03',
33+
} as const;
34+
35+
const collateralChains = [
36+
'ethereum',
37+
'arbitrum',
38+
'avalanche',
39+
'base',
40+
'optimism',
41+
'polygon',
42+
] as const;
43+
44+
const ORIGIN_CHAIN = 'ethereum' as const;
45+
46+
const rebalancingConfigByChain = getUSDCRebalancingBridgesConfigFor(
47+
collateralChains,
48+
[WarpRouteIds.MainnetCCTPV2Standard, WarpRouteIds.MainnetCCTPV2Fast],
49+
);
50+
51+
export const getIgraUSDCWarpConfig = async (
52+
routerConfig: ChainMap<RouterConfigWithoutOwner>,
53+
): Promise<ChainMap<HypTokenRouterConfig>> => {
54+
const feeOwner = getWarpFeeOwner('igra');
55+
56+
return {
57+
...Object.fromEntries(
58+
collateralChains.map((chain) => [
59+
chain,
60+
getRebalancingUSDCConfigForChain(
61+
chain,
62+
routerConfig,
63+
ownersByChain,
64+
rebalancingConfigByChain,
65+
),
66+
]),
67+
),
68+
igra: {
69+
...getSyntheticTokenConfigForChain('igra', routerConfig, ownersByChain),
70+
tokenFee: getFixedRoutingFeeConfig(feeOwner, collateralChains, 10),
71+
},
72+
};
73+
};
74+
75+
export const getIgraUSDCStrategyConfig = (): ChainSubmissionStrategy => {
76+
const safeAddress = ownersByChain[ORIGIN_CHAIN];
77+
const originSafeSubmitter = {
78+
type: TxSubmitterType.GNOSIS_SAFE as const,
79+
chain: ORIGIN_CHAIN,
80+
safeAddress,
81+
};
82+
83+
const chainAddress = getChainAddresses();
84+
const originInterchainAccountRouter =
85+
chainAddress[ORIGIN_CHAIN].interchainAccountRouter;
86+
assert(
87+
originInterchainAccountRouter,
88+
`Could not fetch originInterchainAccountRouter for ${ORIGIN_CHAIN}`,
89+
);
90+
91+
const icaChains = [...collateralChains, 'igra'].filter(
92+
(c) => c !== ORIGIN_CHAIN,
93+
);
94+
95+
const icaStrategies: [string, SubmissionStrategy][] = icaChains.map(
96+
(chain) => [
97+
chain,
98+
{
99+
submitter: {
100+
type: TxSubmitterType.INTERCHAIN_ACCOUNT as const,
101+
chain: ORIGIN_CHAIN,
102+
destinationChain: chain,
103+
owner: safeAddress,
104+
originInterchainAccountRouter,
105+
internalSubmitter: originSafeSubmitter,
106+
},
107+
},
108+
],
109+
);
110+
111+
return Object.fromEntries([
112+
[ORIGIN_CHAIN, { submitter: originSafeSubmitter }],
113+
...icaStrategies,
114+
]);
115+
};

typescript/infra/config/environments/mainnet3/warp/warpIds.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,4 +151,10 @@ export enum WarpRouteIds {
151151

152152
// RISE routes
153153
BscEthereumRISE = 'RISE/bsc-ethereum',
154+
155+
// Igra routes
156+
IgraUSDC = 'USDC/igra',
157+
IgraIKAS = 'IKAS/igra',
158+
IgraWSTETH = 'WSTETH/igra',
159+
IgraCBBTC = 'CBBTC/igra',
154160
}

typescript/infra/config/warp.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,10 @@ import {
6767
getEclipseUSDCWarpConfig,
6868
} from './environments/mainnet3/warp/configGetters/getEclipseUSDCWarpConfig.js';
6969
import { getElectroneumUSDCWarpConfig } from './environments/mainnet3/warp/configGetters/getElectroneumUSDCWarpConfig.js';
70+
import {
71+
getIgraUSDCStrategyConfig,
72+
getIgraUSDCWarpConfig,
73+
} from './environments/mainnet3/warp/configGetters/getIgraUSDCWarpConfig.js';
7074
import {
7175
getEni1PieceWarpConfig,
7276
getEniEthWarpConfig,
@@ -205,6 +209,7 @@ export const warpConfigGetterMap: Record<string, WarpConfigGetter> = {
205209
[WarpRouteIds.RadixUSDC]: getRadixUSDCWarpConfig,
206210
[WarpRouteIds.PulsechainUSDC]: getPulsechainUSDCWarpConfig,
207211
[WarpRouteIds.ElectroneumUSDC]: getElectroneumUSDCWarpConfig,
212+
[WarpRouteIds.IgraUSDC]: getIgraUSDCWarpConfig,
208213
[WarpRouteIds.MantraUSDC]: getMantraUSDCWarpConfig,
209214
[WarpRouteIds.IncentivUSDC]: getIncentivUSDCWarpConfig,
210215
[WarpRouteIds.LitchainLITKEY]: getLitchainLITKEYWarpConfig,
@@ -237,6 +242,7 @@ export const strategyConfigGetterMap: Record<string, StrategyConfigGetter> = {
237242
getRezStagingGnosisSafeBuilderStrategyConfig,
238243
[WarpRouteIds.BsquaredUBTC]: getUbtcGnosisSafeBuilderStrategyConfigGenerator,
239244
[WarpRouteIds.EclipseUSDC]: getEclipseUSDCStrategyConfig,
245+
[WarpRouteIds.IgraUSDC]: getIgraUSDCStrategyConfig,
240246
[WarpRouteIds.EclipseUSDCSTAGE]:
241247
getUSDCSTAGEEclipseFileSubmitterStrategyConfig,
242248
[WarpRouteIds.MainnetCCTPV1]: getCCTPV1StrategyConfig,

0 commit comments

Comments
 (0)