Skip to content
Snippets Groups Projects
transfer.rs 1.87 KiB
Newer Older
Hugo Trentesaux's avatar
Hugo Trentesaux committed
use crate::*;

use sp_core::{crypto::AccountId32, sr25519::Pair};
use subxt::tx::{BaseExtrinsicParamsBuilder, PairSigner};

Hugo Trentesaux's avatar
Hugo Trentesaux committed
#[cfg(any(feature = "dev", feature = "gdev"))] // find how to get runtime calls
type Call = runtime::runtime_types::gdev_runtime::RuntimeCall;
type BalancesCall = runtime::runtime_types::pallet_balances::pallet::Call;
pub async fn transfer(
	pair: Pair,
	client: &Client,
	balance: u64,
	dest: AccountId32,
	keep_alive: bool,
) -> Result<(), subxt::Error> {
	let progress = if keep_alive {
		client
			.tx()
			.sign_and_submit_then_watch(
Hugo Trentesaux's avatar
Hugo Trentesaux committed
				&runtime::tx().balances().transfer(dest.into(), balance),
				&PairSigner::new(pair),
				BaseExtrinsicParamsBuilder::new(),
			)
			.await?
	} else {
		client
			.tx()
			.sign_and_submit_then_watch(
Hugo Trentesaux's avatar
Hugo Trentesaux committed
				&runtime::tx()
					.balances()
					.transfer_keep_alive(dest.into(), balance),
				&PairSigner::new(pair),
				BaseExtrinsicParamsBuilder::new(),
			)
			.await?
	};

	let events = track_progress(progress).await?;

	if let Some(e) = events.find_first::<runtime::balances::events::Transfer>()? {
		println!("{e:?}");
Hugo Trentesaux's avatar
Hugo Trentesaux committed

pub async fn transfer_multiple(
	pair: Pair,
	client: &Client,
	amount: u64,
	dests: Vec<AccountId32>,
) -> Result<(), subxt::Error> {
	// build the list of transactions from the destination accounts
	let transactions: Vec<Call> = dests
		.into_iter()
		.map(|dest| {
			Call::Balances(BalancesCall::transfer_keep_alive {
				dest: dest.into(),
				value: amount,
			})
		})
		.collect();
	// wrap these calls in a batch call
	let progress = client
		.tx()
		.sign_and_submit_then_watch(
Hugo Trentesaux's avatar
Hugo Trentesaux committed
			&runtime::tx().utility().batch(transactions),
			&PairSigner::new(pair.clone()),
			BaseExtrinsicParamsBuilder::new(),
		)
		.await?;

	let events = track_progress(progress).await?;
	// TODO all transfer
	if let Some(e) = events.find_first::<runtime::balances::events::Transfer>()? {
		println!("{e:?}");
	}
	Ok(())