tempo_bench/cmd/max_tps/
erc20.rs1use super::*;
2use alloy::sol;
3
4sol! {
5 #[sol(rpc)]
6 #[allow(clippy::too_many_arguments)]
7 MockERC20,
8 "artifacts/MockERC20.json"
9}
10
11pub(super) async fn setup(
15 signer_providers: &[(PrivateKeySigner, DynProvider<TempoNetwork>)],
16 num_tokens: usize,
17 max_concurrent_requests: usize,
18 max_concurrent_transactions: usize,
19) -> eyre::Result<Vec<Address>> {
20 let (_signer, provider) = signer_providers
21 .first()
22 .ok_or_eyre("No signer providers found")?;
23
24 info!(num_tokens, "Deploying ERC-20 tokens");
25 let progress = ProgressBar::new(num_tokens as u64);
26
27 let tokens = stream::iter((0..num_tokens).progress_with(progress))
29 .map(|i| {
30 MockERC20::deploy(
31 provider.clone(),
32 format!("BenchToken{}", i),
33 format!("BENCH{}", i),
34 18,
35 )
36 })
37 .buffered(max_concurrent_requests)
38 .try_collect::<Vec<_>>()
39 .await?;
40
41 let token_addresses: Vec<Address> = tokens.iter().map(|token| *token.address()).collect();
42
43 let mint_amount = U256::MAX / U256::from(signer_providers.len());
45 info!(%mint_amount, "Minting ERC-20 tokens");
46
47 join_all(
48 signer_providers
49 .iter()
50 .flat_map(|(signer, _)| {
51 tokens.iter().map(move |token| {
52 let to = signer.address();
53 let token = token.clone();
54 Box::pin(async move {
55 let tx = token.mint(to, mint_amount);
56 tx.send().await
57 }) as BoxFuture<'static, _>
58 })
59 })
60 .progress_count((signer_providers.len() * tokens.len()) as u64),
61 max_concurrent_requests,
62 max_concurrent_transactions,
63 )
64 .await
65 .context("Failed to mint ERC-20 tokens")?;
66
67 Ok(token_addresses)
68}