tempo_bench/cmd/max_tps/
erc20.rs

1use super::*;
2use alloy::sol;
3
4sol! {
5    #[sol(rpc)]
6    #[allow(clippy::too_many_arguments)]
7    MockERC20,
8    "artifacts/MockERC20.json"
9}
10
11/// Setup ERC-20 tokens for benchmarking:
12/// - Deploy N ERC-20 tokens
13/// - Mint equal amounts to all signers
14pub(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    // Deploy tokens
28    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    // Mint tokens to all signers
44    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}