Skip to content
Snippets Groups Projects
oneshot.rs 3.37 KiB
Newer Older
use crate::{gdev, Client};

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

pub async fn create_oneshot_account(
    pair: Pair,
    client: Client,
    balance: u64,
    dest: AccountId32,
) -> Result<()> {
    client
        .tx()
        .sign_and_submit_then_watch(
            &gdev::tx()
                .oneshot_account()
                .create_oneshot_account(dest.into(), balance),
            &PairSigner::new(pair),
            BaseExtrinsicParamsBuilder::new(),
        )
        .await?;

    Ok(())
}

pub async fn consume_oneshot_account(
    pair: Pair,
    client: Client,
    dest: AccountId32,
    dest_oneshot: bool,
) -> Result<()> {
    let number = client
        .storage()
        .fetch(&gdev::storage().system().number(), None)
        .await?
        .unwrap();
    client
        .tx()
        .sign_and_submit_then_watch(
            &gdev::tx().oneshot_account().consume_oneshot_account(
                number,
                if dest_oneshot {
                    gdev::runtime_types::pallet_oneshot_account::types::Account::Oneshot(
                        dest.into(),
                    )
                } else {
                    gdev::runtime_types::pallet_oneshot_account::types::Account::Normal(dest.into())
                },
            ),
            &PairSigner::new(pair),
            BaseExtrinsicParamsBuilder::new(),
        )
        .await?;

    Ok(())
}

pub async fn consume_oneshot_account_with_remaining(
    pair: Pair,
    client: Client,
    balance: u64,
    dest: AccountId32,
    dest_oneshot: bool,
    remaining_to: AccountId32,
    remaining_to_oneshot: bool,
) -> Result<()> {
    let number = client
        .storage()
        .fetch(&gdev::storage().system().number(), None)
        .await?
        .unwrap();
    client
        .tx()
        .sign_and_submit_then_watch(
            &gdev::tx()
                .oneshot_account()
                .consume_oneshot_account_with_remaining(
                    number,
                    if dest_oneshot {
                        gdev::runtime_types::pallet_oneshot_account::types::Account::Oneshot(
                            dest.into(),
                        )
                    } else {
                        gdev::runtime_types::pallet_oneshot_account::types::Account::Normal(
                            dest.into(),
                        )
                    },
                    if remaining_to_oneshot {
                        gdev::runtime_types::pallet_oneshot_account::types::Account::Oneshot(
                            remaining_to.into(),
                        )
                    } else {
                        gdev::runtime_types::pallet_oneshot_account::types::Account::Normal(
                            remaining_to.into(),
                        )
                    },
                    balance,
                ),
            &PairSigner::new(pair),
            BaseExtrinsicParamsBuilder::new(),
        )
        .await?;

    Ok(())
}

pub async fn oneshot_account_balance(client: Client, account: AccountId32) -> Result<()> {
    logs::info!(
        "{}",
        client
            .storage()
            .fetch(
                &gdev::storage().oneshot_account().oneshot_accounts(&account),
                None
            )
            .await?
            .unwrap_or(0)
    );

    Ok(())
}