Skip to content

Commit b7a710a

Browse files
authored
feat: mock cctp relayer (#299)
1 parent 31c84da commit b7a710a

File tree

14 files changed

+492
-77
lines changed

14 files changed

+492
-77
lines changed

e2e/examples/eth_vault/neutron.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ use valence_chain_client_utils::neutron::NeutronClient;
2121
use valence_e2e::{
2222
async_run,
2323
utils::{
24-
parse::get_grpc_address_and_port_from_logs, ADMIN_MNEMONIC, ASTROPORT_PATH, GAS_FLAGS,
25-
LOCAL_CODE_ID_CACHE_PATH_NEUTRON,
24+
parse::{get_chain_field_from_local_ic_log, get_grpc_address_and_port_from_url},
25+
ADMIN_MNEMONIC, ASTROPORT_PATH, GAS_FLAGS, LOCAL_CODE_ID_CACHE_PATH_NEUTRON,
2626
},
2727
};
2828

@@ -276,7 +276,9 @@ pub fn setup_astroport_cl_pool(
276276
}
277277

278278
pub fn get_neutron_client(rt: &Runtime) -> Result<NeutronClient, Box<dyn Error>> {
279-
let (grpc_url, grpc_port) = get_grpc_address_and_port_from_logs(NEUTRON_CHAIN_ID)?;
279+
let grpc_addr = get_chain_field_from_local_ic_log(NEUTRON_CHAIN_ID, "grpc_address")?;
280+
let (grpc_url, grpc_port) = get_grpc_address_and_port_from_url(&grpc_addr)?;
281+
280282
let neutron_client = async_run!(
281283
rt,
282284
NeutronClient::new(

e2e/examples/eth_vault/noble.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,14 @@ use valence_chain_client_utils::{cosmos::base_client::BaseClient, noble::NobleCl
66
use valence_e2e::{
77
async_run,
88
utils::{
9-
parse::get_grpc_address_and_port_from_logs, ADMIN_MNEMONIC, NOBLE_CHAIN_ADMIN_ADDR,
10-
NOBLE_CHAIN_DENOM, NOBLE_CHAIN_ID, UUSDC_DENOM,
9+
parse::{get_chain_field_from_local_ic_log, get_grpc_address_and_port_from_url},
10+
ADMIN_MNEMONIC, NOBLE_CHAIN_ADMIN_ADDR, NOBLE_CHAIN_DENOM, NOBLE_CHAIN_ID, UUSDC_DENOM,
1111
},
1212
};
1313

1414
pub fn get_client(rt: &Runtime) -> Result<NobleClient, Box<dyn Error>> {
15-
let (grpc_url, grpc_port) = get_grpc_address_and_port_from_logs(NOBLE_CHAIN_ID)?;
15+
let grpc_addr = get_chain_field_from_local_ic_log(NOBLE_CHAIN_ID, "grpc_address")?;
16+
let (grpc_url, grpc_port) = get_grpc_address_and_port_from_url(&grpc_addr)?;
1617

1718
let noble_client = async_run!(
1819
rt,

e2e/examples/eth_vault/program.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ pub fn setup_neutron_libraries(
123123
processor: &str,
124124
amount: u128,
125125
usdc_on_neutron: &str,
126-
eth_admin_addr: String,
126+
eth_withdraw_acc: String,
127127
) -> Result<NeutronProgramLibraries, Box<dyn Error>> {
128128
let astro_cl_pool_asset_data = AssetData {
129129
asset1: NEUTRON_CHAIN_DENOM.to_string(),
@@ -172,7 +172,7 @@ pub fn setup_neutron_libraries(
172172
.noble_outbound_ica
173173
.library_account
174174
.clone(),
175-
eth_admin_addr,
175+
eth_withdraw_acc,
176176
processor.to_string(),
177177
amount,
178178
)?;

e2e/examples/eth_vault/vault.rs

Lines changed: 62 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ use valence_e2e::{
2929
ICA_CCTP_TRANSFER_NAME, ICA_IBC_TRANSFER_NAME, INTERCHAIN_ACCOUNT_NAME,
3030
NEUTRON_IBC_TRANSFER_NAME,
3131
},
32+
mock_cctp_relayer,
3233
solidity_contracts::ValenceVault,
3334
vault::{self, setup_cctp_transfer, setup_valence_vault},
3435
DEFAULT_ANVIL_RPC_ENDPOINT, LOCAL_CODE_ID_CACHE_PATH_NEUTRON, LOGS_FILE_PATH,
@@ -59,6 +60,7 @@ fn main() -> Result<(), Box<dyn Error>> {
5960
async_run!(rt, ethereum_utils::set_up_anvil_container().await)?;
6061

6162
let eth = EthClient::new(DEFAULT_ANVIL_RPC_ENDPOINT)?;
63+
6264
let eth_client = valence_chain_client_utils::ethereum::EthereumClient::new(
6365
DEFAULT_ANVIL_RPC_ENDPOINT,
6466
"test test test test test test test test test test test junk",
@@ -70,6 +72,15 @@ fn main() -> Result<(), Box<dyn Error>> {
7072
let eth_admin_acc = eth_accounts[0];
7173
let _eth_user_acc = eth_accounts[2];
7274

75+
// create two Valence Base Accounts on Ethereum to test the processor with libraries (in this case the forwarder)
76+
let deposit_acc_addr =
77+
ethereum_utils::valence_account::setup_valence_account(&rt, &eth_client, eth_admin_acc)?;
78+
let withdraw_acc_addr =
79+
ethereum_utils::valence_account::setup_valence_account(&rt, &eth_client, eth_admin_acc)?;
80+
// set up the cctp messenger
81+
let mock_cctp_messenger_address =
82+
valence_e2e::utils::vault::setup_mock_token_messenger(&rt, &eth_client)?;
83+
7384
info!("Setting up Neutron side flow...");
7485

7586
let mut test_ctx = TestContextBuilder::default()
@@ -178,7 +189,7 @@ fn main() -> Result<(), Box<dyn Error>> {
178189
&neutron_processor_address,
179190
amount_to_transfer,
180191
&uusdc_on_neutron_denom,
181-
eth_admin_acc.to_string(),
192+
withdraw_acc_addr.to_string(),
182193
)?;
183194

184195
noble::mint_usdc_to_addr(
@@ -225,6 +236,21 @@ fn main() -> Result<(), Box<dyn Error>> {
225236
&pool_addr,
226237
)?;
227238

239+
let usdc_token_address =
240+
ethereum_utils::mock_erc20::setup_deposit_erc20(&rt, &eth_client, "MockUSDC", "USDC")?;
241+
242+
info!("Starting CCTP mock relayer between Noble and Ethereum...");
243+
let mock_cctp_relayer = mock_cctp_relayer::MockCctpRelayer::new(
244+
&rt,
245+
mock_cctp_messenger_address,
246+
usdc_token_address,
247+
)?;
248+
let rly_rt = tokio::runtime::Runtime::new().unwrap();
249+
250+
let _join_handle = rly_rt.spawn(mock_cctp_relayer.start());
251+
info!("main sleep for 3...");
252+
sleep(Duration::from_secs(3));
253+
228254
strategist::route_usdc_to_noble(
229255
&rt,
230256
&neutron_client,
@@ -233,8 +259,6 @@ fn main() -> Result<(), Box<dyn Error>> {
233259
&uusdc_on_neutron_denom,
234260
)?;
235261

236-
sleep(Duration::from_secs(5));
237-
238262
let noble_outbound_ica_usdc_bal = async_run!(
239263
&rt,
240264
noble_client
@@ -255,15 +279,6 @@ fn main() -> Result<(), Box<dyn Error>> {
255279
&neutron_program_libraries,
256280
)?;
257281

258-
// create two Valence Base Accounts on Ethereum to test the processor with libraries (in this case the forwarder)
259-
let deposit_acc_addr =
260-
ethereum_utils::valence_account::setup_valence_account(&rt, &eth_client, eth_admin_acc)?;
261-
let withdraw_acc_addr =
262-
ethereum_utils::valence_account::setup_valence_account(&rt, &eth_client, eth_admin_acc)?;
263-
264-
let usdc_token_address =
265-
ethereum_utils::mock_erc20::setup_deposit_erc20(&rt, &eth_client, "MockUSDC", "USDC")?;
266-
267282
info!("Setting up Lite Processor on Ethereum");
268283
let _lite_processor_address = ethereum_utils::lite_processor::setup_lite_processor(
269284
&rt,
@@ -276,9 +291,6 @@ fn main() -> Result<(), Box<dyn Error>> {
276291
authorization_contract_address.as_str(),
277292
)?;
278293

279-
let mock_cctp_messenger_address =
280-
valence_e2e::utils::vault::setup_mock_token_messenger(&rt, &eth_client)?;
281-
282294
info!("Setting up Valence Vault...");
283295
let vault_address = setup_valence_vault(
284296
&rt,
@@ -293,7 +305,10 @@ fn main() -> Result<(), Box<dyn Error>> {
293305
let cctp_forwarder = setup_cctp_transfer(
294306
&rt,
295307
&eth_client,
296-
neutron_program_accounts.noble_inbound_ica.remote_addr,
308+
neutron_program_accounts
309+
.noble_inbound_ica
310+
.remote_addr
311+
.to_string(),
297312
deposit_acc_addr,
298313
eth_admin_acc,
299314
eth_admin_acc,
@@ -497,52 +512,60 @@ fn main() -> Result<(), Box<dyn Error>> {
497512

498513
info!("user1 completing withdraw request...");
499514
vault::complete_withdraw_request(*valence_vault.address(), &rt, &eth_client, eth_user_acc)?;
500-
let withdraw_acc_usdc_bal = ethereum_utils::mock_erc20::query_balance(
501-
&rt,
502-
&eth_client,
503-
usdc_token_address,
504-
withdraw_acc_addr,
505-
);
515+
506516
let user1_usdc_bal = ethereum_utils::mock_erc20::query_balance(
507517
&rt,
508518
&eth_client,
509519
usdc_token_address,
510520
eth_user_acc,
511521
);
512-
assert_eq!(withdraw_acc_usdc_bal, U256::from(50)); // fees leftover
513522
assert_eq!(user1_usdc_bal, user_1_deposit_amount - U256::from(50));
514523

515-
let deposit_acc_usdc_bal = ethereum_utils::mock_erc20::query_balance(
524+
let pre_cctp_deposit_acc_usdc_bal = ethereum_utils::mock_erc20::query_balance(
516525
&rt,
517526
&eth_client,
518527
usdc_token_address,
519528
deposit_acc_addr,
520529
);
521-
info!("deposit account usdc balance: {deposit_acc_usdc_bal}");
522-
assert_ne!(deposit_acc_usdc_bal, U256::ZERO);
530+
let pre_cctp_neutron_ica_bal = async_run!(
531+
&rt,
532+
noble_client
533+
.query_balance(
534+
&neutron_program_accounts.noble_inbound_ica.remote_addr,
535+
UUSDC_DENOM
536+
)
537+
.await
538+
.unwrap()
539+
);
540+
541+
assert_eq!(pre_cctp_neutron_ica_bal, 0);
542+
assert_eq!(pre_cctp_deposit_acc_usdc_bal, U256::from(1000000));
523543

524544
info!("strategist cctp routing eth->ntrn...");
525545
strategist::cctp_route_usdc_from_eth(&rt, &eth_client, cctp_forwarder, eth_admin_acc)?;
526546

527-
let deposit_acc_usdc_bal = ethereum_utils::mock_erc20::query_balance(
547+
info!("[MAIN] sleeping for 5 to give cctp time to relay");
548+
sleep(Duration::from_secs(5));
549+
550+
let post_cctp_deposit_acc_usdc_bal = ethereum_utils::mock_erc20::query_balance(
528551
&rt,
529552
&eth_client,
530553
usdc_token_address,
531554
deposit_acc_addr,
532555
);
533-
assert_eq!(deposit_acc_usdc_bal, U256::ZERO);
534-
535-
log_eth_balances(
536-
&eth_client,
556+
let post_cctp_neutron_ica_bal = async_run!(
537557
&rt,
538-
valence_vault.address(),
539-
&usdc_token_address,
540-
&deposit_acc_addr,
541-
&withdraw_acc_addr,
542-
&eth_user_acc,
543-
&eth_user2_acc,
544-
)
545-
.unwrap();
558+
noble_client
559+
.query_balance(
560+
&neutron_program_accounts.noble_inbound_ica.remote_addr,
561+
UUSDC_DENOM
562+
)
563+
.await
564+
.unwrap()
565+
);
566+
567+
assert_eq!(post_cctp_neutron_ica_bal, 1000000);
568+
assert_eq!(post_cctp_deposit_acc_usdc_bal, U256::ZERO);
546569

547570
Ok(())
548571
}

e2e/examples/ica_libraries.rs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@ use valence_chain_client_utils::{
1313
cosmos::base_client::BaseClient, neutron::NeutronClient, noble::NobleClient,
1414
};
1515
use valence_e2e::utils::{
16-
ibc::poll_for_ica_state, parse::get_grpc_address_and_port_from_logs, relayer::restart_relayer,
16+
ibc::poll_for_ica_state,
17+
parse::{get_chain_field_from_local_ic_log, get_grpc_address_and_port_from_url},
18+
relayer::restart_relayer,
1719
ADMIN_MNEMONIC, GAS_FLAGS, LOGS_FILE_PATH, NOBLE_CHAIN_ADMIN_ADDR, NOBLE_CHAIN_DENOM,
1820
NOBLE_CHAIN_ID, NOBLE_CHAIN_NAME, NOBLE_CHAIN_PREFIX, UUSDC_DENOM, VALENCE_ARTIFACTS_PATH,
1921
};
@@ -42,7 +44,8 @@ fn main() -> Result<(), Box<dyn Error>> {
4244

4345
let rt = tokio::runtime::Runtime::new()?;
4446
// Get the grpc url and the port for the noble chain
45-
let (grpc_url, grpc_port) = get_grpc_address_and_port_from_logs(NOBLE_CHAIN_ID)?;
47+
let grpc_addr = get_chain_field_from_local_ic_log(NOBLE_CHAIN_ID, "grpc_address")?;
48+
let (grpc_url, grpc_port) = get_grpc_address_and_port_from_url(&grpc_addr)?;
4649

4750
let noble_client = rt.block_on(async {
4851
NobleClient::new(
@@ -399,7 +402,9 @@ fn main() -> Result<(), Box<dyn Error>> {
399402
.dest(NEUTRON_CHAIN_NAME)
400403
.get();
401404

402-
let (grpc_url, grpc_port) = get_grpc_address_and_port_from_logs(NEUTRON_CHAIN_ID)?;
405+
let grpc_addr = get_chain_field_from_local_ic_log(NEUTRON_CHAIN_ID, "grpc_address")?;
406+
let (grpc_url, grpc_port) = get_grpc_address_and_port_from_url(&grpc_addr)?;
407+
403408
let neutron_client = rt.block_on(async {
404409
NeutronClient::new(
405410
&grpc_url,

e2e/hyperlane/config/config.json

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@
1414
"displayName": "Ethereum",
1515
"domainId": 1,
1616
"gasCurrencyCoinGeckoId": "ethereum",
17-
"interchainGasPaymaster": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0",
18-
"mailbox": "0x5FbDB2315678afecb367f032d93F642f64180aa3",
19-
"merkleTreeHook": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512",
17+
"interchainGasPaymaster": "0x5FC8d32690cc91D4c39d9d3abcBD16989F875707",
18+
"mailbox": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9",
19+
"merkleTreeHook": "0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9",
2020
"name": "ethereum",
2121
"nativeToken": {
2222
"decimals": 18,
@@ -30,7 +30,7 @@
3030
}
3131
],
3232
"technicalStack": "other",
33-
"validatorAnnounce": "0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9"
33+
"validatorAnnounce": "0xa513E6E4b8f2a923D98304ec87F64353C4D5C853"
3434
},
3535
"neutron": {
3636
"bech32Prefix": "neutron",
@@ -58,10 +58,10 @@
5858
"http": "http://localneutron-1-val-0-neutronic:9090"
5959
}
6060
],
61-
"interchainGasPaymaster": "0x2943ecc95e93154658ca301d3babfd18b076cc9e64a80ac79f3dfb352871aaf4",
61+
"interchainGasPaymaster": "0x829596c5dd7adcddc4b76cff4b072f8d969c43bca643a09bb8afaa401abb38fa",
6262
"isTestnet": false,
63-
"mailbox": "0x9ab0f7fe807c59289077acdb20d10f5cfe54d53200242eb9a83250cd6659b0cd",
64-
"merkleTreeHook": "0xbb0739110d17f8230076322931c82be430a126d8513f56c75fda077e99459d24",
63+
"mailbox": "0xc7ae3be80aa45fbaeebfff94c6c2b2f6b49e06ed0394fe90350aa3308ebabe05",
64+
"merkleTreeHook": "0xccd2cf66c5e2ca7ad0ecadfce1e8a8ec2e3f657d3c308bf6b5e4adba9b99a4b3",
6565
"name": "neutron",
6666
"nativeToken": {
6767
"decimals": 6,
@@ -87,7 +87,7 @@
8787
},
8888
"slip44": 118,
8989
"technicalStack": "other",
90-
"validatorAnnounce": "0xb4703662fbe03bd9e67d65a31c8e20ebc11bd310621279863f0712ba77d98c78"
90+
"validatorAnnounce": "0xb65fc5ac8f7a8f77acda3f7fc1a524bf48ed72966e1222ca48852de4c160ae7e"
9191
}
9292
},
9393
"defaultRpcConsensusType": "fallback"

0 commit comments

Comments
 (0)