Skip to content

Commit

Permalink
Implement functionality
Browse files Browse the repository at this point in the history
  • Loading branch information
Niederb committed Jun 12, 2024
1 parent 7b47c8f commit 006582f
Show file tree
Hide file tree
Showing 3 changed files with 67 additions and 5 deletions.
21 changes: 21 additions & 0 deletions src/extrinsic/balances.rs
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,15 @@ use codec::{Compact, Encode};

pub const BALANCES_MODULE: &str = "Balances";
pub const TRANSFER_ALLOW_DEATH: &str = "transfer_allow_death";
pub const TRANSFER_KEEP_ALIVE: &str = "transfer_keep_alive";
pub const FORCE_SET_BALANCE: &str = "force_set_balance";

/// Call for a balance transfer.
pub type TransferAllowDeathCall<Address, Balance> = (CallIndex, Address, Compact<Balance>);

/// Call for a balance transfer.
pub type TransferKeepAliveCall<Address, Balance> = (CallIndex, Address, Compact<Balance>);

/// Call to the balance of an account.
pub type ForceSetBalanceCall<Address, Balance> = (CallIndex, Address, Compact<Balance>);

Expand All @@ -52,6 +56,14 @@ pub trait BalancesExtrinsics {
amount: Self::Balance,
) -> Option<Self::Extrinsic<TransferAllowDeathCall<Self::Address, Self::Balance>>>;

/// Transfer some liquid free balance to another account.
#[allow(clippy::type_complexity)]
async fn balance_transfer_keep_alive(
&self,
to: Self::Address,
amount: Self::Balance,
) -> Option<Self::Extrinsic<TransferKeepAliveCall<Self::Address, Self::Balance>>>;

/// Set the balances of a given account.
#[allow(clippy::type_complexity)]
async fn balance_force_set_balance(
Expand Down Expand Up @@ -85,6 +97,15 @@ where
compose_extrinsic!(self, BALANCES_MODULE, TRANSFER_ALLOW_DEATH, to, Compact(amount))
}

#[allow(clippy::type_complexity)]
async fn balance_transfer_keep_alive(
&self,
to: Self::Address,
amount: Self::Balance,
) -> Option<Self::Extrinsic<TransferKeepAliveCall<Self::Address, Self::Balance>>> {
compose_extrinsic!(self, BALANCES_MODULE, TRANSFER_KEEP_ALIVE, to, Compact(amount))
}

async fn balance_force_set_balance(
&self,
who: Self::Address,
Expand Down
10 changes: 7 additions & 3 deletions testing/async/examples/dispatch_errors_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ use sp_keyring::AccountKeyring;
use sp_runtime::MultiAddress;
use substrate_api_client::{
ac_primitives::AssetRuntimeConfig, extrinsic::BalancesExtrinsics, rpc::JsonrpseeClient, Api,
Error, GetAccountInformation, SubmitAndWatch, XtStatus,
Error, GetAccountInformation, GetBalance, SubmitAndWatch, XtStatus,
};

#[tokio::main]
Expand Down Expand Up @@ -59,10 +59,10 @@ async fn main() {
assert!(report.block_hash.is_some());
assert!(report.events.is_some());
assert!(format!("{dispatch_error:?}").contains("BadOrigin"));
println!("[+] BadOrigin error: Bob can't force set balance");
},
_ => panic!("Expected Failed Extrinisc Error"),
}
println!("[+] BadOrigin error: Bob can't force set balance");

//BelowMinimum
api.set_signer(alice_signer.into());
Expand All @@ -80,5 +80,9 @@ async fn main() {
},
_ => panic!("Expected Failed Extrinisc Error"),
}
println!("[+] BelowMinimum error: balance (999999) is below the existential deposit");
let existential_deposit = api.get_existential_deposit().await.unwrap();
println!(
"[+] BelowMinimum error: balance (999999) is below the existential deposit ({})",
&existential_deposit
);
}
41 changes: 39 additions & 2 deletions testing/async/examples/pallet_balances_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,52 @@

//! Tests for the pallet balances interface functions.
use sp_core::H256;
use sp_keyring::AccountKeyring;
use sp_runtime::MultiAddress;
use substrate_api_client::{
ac_primitives::AssetRuntimeConfig, rpc::JsonrpseeClient, Api, GetBalance,
ac_primitives::AssetRuntimeConfig, extrinsic::BalancesExtrinsics, rpc::JsonrpseeClient, Api,
Error, GetAccountInformation, GetBalance, SubmitAndWatch, XtStatus,
};

#[tokio::main]
async fn main() {
// Setup
let client = JsonrpseeClient::with_default_url().await.unwrap();
let api = Api::<AssetRuntimeConfig, _>::new(client).await.unwrap();
let mut api = Api::<AssetRuntimeConfig, _>::new(client).await.unwrap();

let _ed = api.get_existential_deposit().await.unwrap();

let alice_signer = AccountKeyring::Alice.pair();

let alice = AccountKeyring::Alice.to_account_id();
let balance_of_alice = api.get_account_data(&alice).await.unwrap().unwrap().free;
println!("[+] Alice's Free Balance is is {}\n", balance_of_alice);

let one = AccountKeyring::One.to_account_id();

//BadOrigin
api.set_signer(alice_signer.into());
//Can only be called by root
let xt = api
.balance_force_set_balance(MultiAddress::Id(alice.clone()), 100000000000000000)
.await
.unwrap();

let result = api.submit_and_watch_extrinsic_until(xt, XtStatus::InBlock).await;
match result {
Err(Error::FailedExtrinsic(extrinsic_error)) => {
let dispatch_error = extrinsic_error.dispatch_error();
let report = extrinsic_error.get_report::<H256>().unwrap();
assert!(report.block_hash.is_some());
assert!(report.events.is_some());
assert!(format!("{dispatch_error:?}").contains("BadOrigin"));
println!("{dispatch_error:?}");
println!("[+] BadOrigin error: Bob can't force set balance");
},
_ => panic!("Expected Failed Extrinisc Error"),
}

let balance_of_one = api.get_account_data(&one).await.unwrap().unwrap_or_default().free;
println!("[+] One's Free Balance is {}\n", balance_of_one);
}

0 comments on commit 006582f

Please sign in to comment.