@@ -68,6 +68,8 @@ pub enum AssetId {
6868 USDC = 20 ,
6969 /// USDC Circle, minted on Ethereum
7070 USDC_E = 21 ,
71+ /// EURC Circle, minted on Ethereum
72+ EURC_E = 23 ,
7173
7274 // protocol-issued tokens, wrapped or not
7375 /// Ethereum ETH,
@@ -81,6 +83,7 @@ pub enum AssetId {
8183}
8284
8385const USDC_E_MAINNET_CONTRACT_ADDRESS : [ u8 ; 20 ] = hex ! ( "a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48" ) ;
86+ const EURC_E_MAINNET_CONTRACT_ADDRESS : [ u8 ; 20 ] = hex ! ( "1abaea1f7c830bd89acc67ec4af516284b1bc33c" ) ;
8487const USDT_E_MAINNET_CONTRACT_ADDRESS : [ u8 ; 20 ] = hex ! ( "dac17f958d2ee523a2206206994597c13d831ec7" ) ;
8588const WETH_SEPOLIA_CONTRACT_ADDRESS : [ u8 ; 20 ] = hex ! ( "fff9976782d46cc05630d1f6ebab18b2324d6b14" ) ;
8689const WBTC_E_MAINNET_CONTRACT_ADDRESS : [ u8 ; 20 ] = hex ! ( "2260fac5e5542a773aa44fbcfedf7c193bc2c599" ) ;
@@ -96,6 +99,7 @@ impl std::fmt::Display for AssetId {
9699 AssetId :: USDT_E => write ! ( f, "USDT.e" ) ,
97100 AssetId :: USDC => write ! ( f, "USDC" ) ,
98101 AssetId :: USDC_E => write ! ( f, "USDC.e" ) ,
102+ AssetId :: EURC_E => write ! ( f, "EURC.e" ) ,
99103 AssetId :: ETH => write ! ( f, "ETH" ) ,
100104 AssetId :: WETH => write ! ( f, "WETH" ) ,
101105 AssetId :: BTC => write ! ( f, "BTC" ) ,
@@ -114,6 +118,7 @@ impl TryFrom<&str> for AssetId {
114118 "USDT.e" => Ok ( AssetId :: USDT_E ) ,
115119 "USDC" => Ok ( AssetId :: USDC ) ,
116120 "USDC.e" => Ok ( AssetId :: USDC_E ) ,
121+ "EURC.e" => Ok ( AssetId :: EURC_E ) ,
117122 "ETH" => Ok ( AssetId :: ETH ) ,
118123 "WETH" => Ok ( AssetId :: WETH ) ,
119124 "WBTC.e" => Ok ( AssetId :: WBTC_E ) ,
@@ -139,6 +144,7 @@ impl AssetId {
139144 AssetId :: USDT_E => Some ( FOREIGN_ASSETS ) ,
140145 AssetId :: USDC => Some ( NATIVE_ASSETS ) ,
141146 AssetId :: USDC_E => Some ( FOREIGN_ASSETS ) ,
147+ AssetId :: EURC_E => Some ( FOREIGN_ASSETS ) ,
142148 AssetId :: ETH => Some ( FOREIGN_ASSETS ) ,
143149 AssetId :: WETH => Some ( FOREIGN_ASSETS ) ,
144150 AssetId :: BTC => None ,
@@ -152,6 +158,7 @@ impl AssetId {
152158 AssetId :: USDT_E => 1_000_000 , // 6 decimals
153159 AssetId :: USDC => 1_000_000 ,
154160 AssetId :: USDC_E => 1_000_000 , // 6 decimals
161+ AssetId :: EURC_E => 1_000_000 , // 6 decimals
155162 AssetId :: ETH => 1_000_000_000_000_000_000 , // 18 decimals
156163 AssetId :: WETH => 1_000_000_000_000_000_000 , // 18 decimals
157164 AssetId :: BTC => 100_000_000 , // 8 decimals
@@ -172,13 +179,19 @@ impl AssetId {
172179 AssetId :: USDT_E ,
173180 AssetId :: USDC ,
174181 AssetId :: USDC_E ,
182+ AssetId :: EURC_E ,
175183 AssetId :: WETH ,
176184 AssetId :: ETH ,
177185 AssetId :: WBTC_E ,
178186 ] ,
179187 ASSET_HUB_PASEO_GENESIS_HASH_HEX => vec ! [ AssetId :: USDT , AssetId :: USDC , AssetId :: WETH ] ,
180- ASSET_HUB_POLKADOT_GENESIS_HASH_HEX =>
181- vec ! [ AssetId :: USDT_E , AssetId :: USDC_E , AssetId :: ETH , AssetId :: WBTC_E ] ,
188+ ASSET_HUB_POLKADOT_GENESIS_HASH_HEX => vec ! [
189+ AssetId :: USDT_E ,
190+ AssetId :: USDC_E ,
191+ AssetId :: EURC_E ,
192+ AssetId :: ETH ,
193+ AssetId :: WBTC_E ,
194+ ] ,
182195 _ => vec ! [ ] ,
183196 }
184197 }
@@ -203,6 +216,21 @@ impl AssetTranslation for AssetId {
203216 } else {
204217 None
205218 } ,
219+ AssetId :: EURC_E =>
220+ if matches ! (
221+ genesis_hash. into( ) ,
222+ ASSET_HUB_POLKADOT_GENESIS_HASH_HEX | ASSET_HUB_LOCAL_TEST_GENESIS_HASH_HEX
223+ ) {
224+ Some ( Location {
225+ parents : 2 ,
226+ interior : X2 ( Arc :: new ( [
227+ GlobalConsensus ( Ethereum { chain_id : ETHEREUM_MAINNET_CHAIN_ID } ) ,
228+ AccountKey20 { key : EURC_E_MAINNET_CONTRACT_ADDRESS , network : None } ,
229+ ] ) ) ,
230+ } )
231+ } else {
232+ None
233+ } ,
206234 AssetId :: USDT_E =>
207235 if matches ! (
208236 genesis_hash. into( ) ,
@@ -317,6 +345,14 @@ impl AssetTranslation for AssetId {
317345 | ASSET_HUB_LOCAL_TEST_GENESIS_HASH_HEX
318346 ) =>
319347 Some ( AssetId :: USDC_E ) ,
348+ [ GlobalConsensus ( Ethereum { chain_id : ETHEREUM_MAINNET_CHAIN_ID } ) , AccountKey20 { key : contract, network : None } ]
349+ if * contract == EURC_E_MAINNET_CONTRACT_ADDRESS
350+ && matches ! (
351+ genesis_hash. into( ) ,
352+ ASSET_HUB_POLKADOT_GENESIS_HASH_HEX
353+ | ASSET_HUB_LOCAL_TEST_GENESIS_HASH_HEX
354+ ) =>
355+ Some ( AssetId :: EURC_E ) ,
320356 [ GlobalConsensus ( Ethereum { chain_id : ETHEREUM_MAINNET_CHAIN_ID } ) , AccountKey20 { key : contract, network : None } ]
321357 if * contract == USDT_E_MAINNET_CONTRACT_ADDRESS
322358 && matches ! (
0 commit comments