Skip to content

Commit 8e4f438

Browse files
authored
add EURC.e support (#1712)
1 parent 60b67ee commit 8e4f438

2 files changed

Lines changed: 39 additions & 3 deletions

File tree

app-libs/assets-map/src/lib.rs

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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

8385
const USDC_E_MAINNET_CONTRACT_ADDRESS: [u8; 20] = hex!("a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48");
86+
const EURC_E_MAINNET_CONTRACT_ADDRESS: [u8; 20] = hex!("1abaea1f7c830bd89acc67ec4af516284b1bc33c");
8487
const USDT_E_MAINNET_CONTRACT_ADDRESS: [u8; 20] = hex!("dac17f958d2ee523a2206206994597c13d831ec7");
8588
const WETH_SEPOLIA_CONTRACT_ADDRESS: [u8; 20] = hex!("fff9976782d46cc05630d1f6ebab18b2324d6b14");
8689
const 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!(

app-libs/stf/src/trusted_call.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1005,7 +1005,7 @@ fn get_fee_for(tc: &TrustedCallSigned, fee_asset: Option<AssetId>) -> Fee {
10051005
match fee_asset {
10061006
None => Fee::Native(fee_amount),
10071007
Some(asset_id) => match asset_id {
1008-
AssetId::USDC | AssetId::USDT | AssetId::USDC_E | AssetId::USDT_E =>
1008+
AssetId::USDC | AssetId::USDT | AssetId::USDC_E | AssetId::EURC_E | AssetId::USDT_E =>
10091009
Fee::Asset(fee_amount, asset_id),
10101010
// TODO: use TEEracle info from L1 for exchange rates. the hardcoded exchange rates are
10111011
// just to get started in the right order of magnitude

0 commit comments

Comments
 (0)