Skip to content
Snippets Groups Projects
Forked from clients / Rust / Ğcli-v2s
134 commits behind the upstream repository.
net_test.rs 3.12 KiB
use crate::{gdev, Client, GdevConfig};

use anyhow::{anyhow, Result};
use sp_core::{crypto::AccountId32, sr25519::Pair, DeriveJunction, Pair as _};
use subxt::ext::sp_runtime::MultiAddress;
use subxt::tx::{BaseExtrinsicParamsBuilder, PairSigner};

pub async fn repart(
    pair: Pair,
    client: Client,
    target: u32,
    actual_repart: Option<u32>,
) -> Result<()> {
    let mut pairs = Vec::new();
    for i in actual_repart.unwrap_or_default()..target {
        let pair_i = pair
            .derive(std::iter::once(DeriveJunction::hard::<u32>(i)), None)
            .map_err(|_| anyhow!("Fail to derive //{}", i))?
            .0;
        pairs.push((i, pair_i));
    }

    for (i, pair_i) in &pairs {
        /*let _ = api
            .tx()
            .balances()
            .transfer(MultiAddress::Id(pair_i.public().into()), 501)?
            .sign_and_submit_then_watch(&signer, BaseExtrinsicParamsBuilder::new())
            .await?
            .wait_for_in_block()
            .await?;
        signer.increment_nonce();*/

        if let Some(pair_i_account) = client
            .storage()
            .fetch(
                &gdev::storage().system().account(&pair_i.public().into()),
                None,
            )
            .await?
        {
            logs::info!("account //{} balance: {}", i, pair_i_account.data.free);
        }
    }

    Ok(())
}

pub async fn spam_roll(pair: Pair, client: Client, actual_repart: usize) -> Result<()> {
    let mut pairs =
        Vec::<(PairSigner<GdevConfig, Pair>, AccountId32)>::with_capacity(actual_repart);
    for i in 0..actual_repart {
        let pair_i = pair
            .derive(std::iter::once(DeriveJunction::hard::<u32>(i as u32)), None)
            .map_err(|_| anyhow!("Fail to derive //{}", i))?
            .0;
        let account_id_i = pair_i.public().into();
        pairs.push((PairSigner::new(pair_i), account_id_i));
    }

    loop {
        let mut watchers = Vec::with_capacity(actual_repart);
        for i in 0..(actual_repart - 1) {
            let dest: AccountId32 = pairs[i + 1].1.clone();
            let watcher = client
                .tx()
                .sign_and_submit_then_watch(
                    &gdev::tx().balances().transfer(MultiAddress::Id(dest), 1),
                    &pairs[i].0,
                    BaseExtrinsicParamsBuilder::new(),
                )
                .await?;
            pairs[i].0.increment_nonce();
            logs::info!("send 1 cent from //{} to //{}", i, i + 1);
            watchers.push(watcher);
        }
        let dest: AccountId32 = pairs[0].1.clone();
        let watcher = client
            .tx()
            .sign_and_submit_then_watch(
                &gdev::tx().balances().transfer(MultiAddress::Id(dest), 1),
                &pairs[actual_repart - 1].0,
                BaseExtrinsicParamsBuilder::new(),
            )
            .await?;
        pairs[actual_repart - 1].0.increment_nonce();
        logs::info!("send 1 cent from //{} to //0", actual_repart - 1);
        watchers.push(watcher);

        // Wait all transactions
        for watcher in watchers {
            watcher.wait_for_in_block().await?;
        }
    }
}