Skip to content

Commit

Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
refactor: simply pallet/function relationship
Browse files Browse the repository at this point in the history
evilrobot-01 committed Dec 9, 2024

Verified

This commit was signed with the committer’s verified signature.
evilrobot-01 Frank Bell
1 parent f86a1d9 commit 2743a5e
Showing 3 changed files with 35 additions and 37 deletions.
47 changes: 23 additions & 24 deletions crates/pop-cli/src/commands/call/parachain.rs
Original file line number Diff line number Diff line change
@@ -200,7 +200,6 @@ impl CallParachainCommand {
};

return Ok(CallParachain {
pallet: pallet.clone(),
function: function.clone(),
args,
suri,
@@ -320,8 +319,6 @@ struct Chain {
/// and signing options.
#[derive(Clone)]
struct CallParachain {
/// The pallet containing the dispatchable function to execute.
pallet: Pallet,
/// The dispatchable function to execute.
function: Function,
/// The dispatchable function arguments, encoded as strings.
@@ -345,14 +342,12 @@ impl CallParachain {
client: &OnlineClient<SubstrateConfig>,
cli: &mut impl Cli,
) -> Result<DynamicPayload> {
let xt =
match construct_extrinsic(self.pallet.name.as_str(), &self.function, self.args.clone())
{
Ok(tx) => tx,
Err(e) => {
return Err(anyhow!("Error: {}", e));
},
};
let xt = match construct_extrinsic(&self.function, self.args.clone()) {
Ok(tx) => tx,
Err(e) => {
return Err(anyhow!("Error: {}", e));
},
};
// If sudo is required, wrap the call in a sudo call.
let xt = if self.sudo { construct_sudo_extrinsic(xt)? } else { xt };
let encoded_data = encode_call_data(client, &xt)?;
@@ -393,7 +388,7 @@ impl CallParachain {
}
fn display(&self, chain: &Chain) -> String {
let mut full_message = "pop call parachain".to_string();
full_message.push_str(&format!(" --pallet {}", self.pallet));
full_message.push_str(&format!(" --pallet {}", self.function.pallet));
full_message.push_str(&format!(" --function {}", self.function));
if !self.args.is_empty() {
let args: Vec<_> = self
@@ -647,7 +642,7 @@ mod tests {
assert_eq!(chain.url, Url::parse(POP_NETWORK_TESTNET_URL)?);

let call_parachain = call_config.configure_call(&chain, &mut cli)?;
assert_eq!(call_parachain.pallet.name, "System");
assert_eq!(call_parachain.function.pallet, "System");
assert_eq!(call_parachain.function.name, "remark");
assert_eq!(call_parachain.args, ["0x11".to_string()].to_vec());
assert_eq!(call_parachain.suri, "//Bob");
@@ -693,7 +688,7 @@ mod tests {

let call_parachain = call_config.configure_call(&chain, &mut cli)?;

assert_eq!(call_parachain.pallet.name, "OnDemand");
assert_eq!(call_parachain.function.pallet, "OnDemand");
assert_eq!(call_parachain.function.name, "place_order_allow_death");
assert_eq!(call_parachain.args, ["10000".to_string(), "2000".to_string()].to_vec());
assert_eq!(call_parachain.suri, "//Bob");
@@ -706,24 +701,29 @@ mod tests {
async fn prepare_extrinsic_works() -> Result<()> {
let client = set_up_client(POP_NETWORK_TESTNET_URL).await?;
let mut call_config = CallParachain {
pallet: Pallet { name: "WrongName".to_string(), ..Default::default() },
function: Function { name: "WrongName".to_string(), ..Default::default() },
function: Function {
pallet: "WrongName".to_string(),
name: "WrongName".to_string(),
..Default::default()
},
args: vec!["0x11".to_string()].to_vec(),
suri: DEFAULT_URI.to_string(),
skip_confirm: false,
sudo: false,
};
let mut cli = MockCli::new();
// Error, wrong name of the pallet.
assert!(
matches!(call_config.prepare_extrinsic(&client, &mut cli), Err(message) if message.to_string().contains("Failed to encode call data. Metadata Error: Pallet with name WrongName not found"))
);
assert!(matches!(
call_config.prepare_extrinsic(&client, &mut cli),
Err(message)
if message.to_string().contains("Failed to encode call data. Metadata Error: Pallet with name WrongName not found")));
let pallets = parse_chain_metadata(&client)?;
call_config.pallet = find_pallet_by_name(&pallets, "System")?.clone();
call_config.function.pallet = "System".to_string();
// Error, wrong name of the function.
assert!(
matches!(call_config.prepare_extrinsic(&client, &mut cli), Err(message) if message.to_string().contains("Failed to encode call data. Metadata Error: Call with name WrongName not found"))
);
assert!(matches!(
call_config.prepare_extrinsic(&client, &mut cli),
Err(message)
if message.to_string().contains("Failed to encode call data. Metadata Error: Call with name WrongName not found")));
// Success, pallet and dispatchable function specified.
cli = MockCli::new().expect_info("Encoded call data: 0x00000411");
call_config.function = find_dispatchable_by_name(&pallets, "System", "remark")?.clone();
@@ -744,7 +744,6 @@ mod tests {
let client = set_up_client(POP_NETWORK_TESTNET_URL).await?;
let pallets = parse_chain_metadata(&client)?;
let mut call_config = CallParachain {
pallet: find_pallet_by_name(&pallets, "System")?.clone(),
function: find_dispatchable_by_name(&pallets, "System", "remark")?.clone(),
args: vec!["0x11".to_string()].to_vec(),
suri: DEFAULT_URI.to_string(),
3 changes: 3 additions & 0 deletions crates/pop-parachains/src/call/metadata/mod.rs
Original file line number Diff line number Diff line change
@@ -31,6 +31,8 @@ impl Display for Pallet {
/// Represents a dispatchable function.
#[derive(Clone, Debug, Default, Eq, PartialEq)]
pub struct Function {
/// The pallet containing the dispatchable function.
pub pallet: String,
/// The name of the function.
pub name: String,
/// The index of the function within the pallet.
@@ -89,6 +91,7 @@ pub fn parse_chain_metadata(client: &OnlineClient<SubstrateConfig>) -> Result<Ve
};

Ok(Function {
pallet: pallet.name().to_string(),
name: variant.name.clone(),
index: variant.index,
docs: if is_supported {
22 changes: 9 additions & 13 deletions crates/pop-parachains/src/call/mod.rs
Original file line number Diff line number Diff line change
@@ -20,19 +20,17 @@ pub async fn set_up_client(url: &str) -> Result<OnlineClient<SubstrateConfig>, E
.map_err(|e| Error::ConnectionFailure(e.to_string()))
}

/// Constructs a dynamic extrinsic payload for a specified pallet and dispatchable function.
/// Constructs a dynamic extrinsic payload for a specified dispatchable function.
///
/// # Arguments
/// * `pallet_name` - The name of the pallet containing the dispatchable function.
/// * `function` - The specific dispatchable function within the pallet.
/// * `function` - A dispatchable function.
/// * `args` - A vector of string arguments to be passed to construct the extrinsic.
pub fn construct_extrinsic(
pallet_name: &str,
function: &Function,
args: Vec<String>,
) -> Result<DynamicPayload, Error> {
let parsed_args: Vec<Value> = metadata::parse_dispatchable_arguments(&function.params, args)?;
Ok(subxt::dynamic::tx(pallet_name, function.name.clone(), parsed_args))
Ok(subxt::dynamic::tx(function.pallet.clone(), function.name.clone(), parsed_args))
}

/// Constructs a Sudo extrinsic.
@@ -159,15 +157,13 @@ mod tests {
// Wrong parameters
assert!(matches!(
construct_extrinsic(
"Balances",
&transfer_allow_death,
vec![ALICE_SURI.to_string(), "100".to_string()],
),
Err(Error::ParamProcessingError)
));
// Valid parameters
let xt = construct_extrinsic(
"Balances",
&transfer_allow_death,
vec![
"Id(5FHneW46xGXgs5mUiveU4sbTyGBzmstUspZC92UhjJM694ty)".to_string(),
@@ -184,11 +180,11 @@ mod tests {
let client = set_up_client(POP_NETWORK_TESTNET_URL).await?;
let pallets = parse_chain_metadata(&client)?;
let remark = find_dispatchable_by_name(&pallets, "System", "remark")?;
let xt = construct_extrinsic("System", &remark, vec!["0x11".to_string()])?;
let xt = construct_extrinsic(&remark, vec!["0x11".to_string()])?;
assert_eq!(encode_call_data(&client, &xt)?, "0x00000411");
let xt = construct_extrinsic("System", &remark, vec!["123".to_string()])?;
let xt = construct_extrinsic(&remark, vec!["123".to_string()])?;
assert_eq!(encode_call_data(&client, &xt)?, "0x00000c313233");
let xt = construct_extrinsic("System", &remark, vec!["test".to_string()])?;
let xt = construct_extrinsic(&remark, vec!["test".to_string()])?;
assert_eq!(encode_call_data(&client, &xt)?, "0x00001074657374");
Ok(())
}
@@ -199,7 +195,7 @@ mod tests {
let client = set_up_client(POP_NETWORK_TESTNET_URL).await?;
let pallets = parse_chain_metadata(&client)?;
let remark = find_dispatchable_by_name(&pallets, "System", "remark")?;
let xt = construct_extrinsic("System", &remark, vec!["0x11".to_string()])?;
let xt = construct_extrinsic(&remark, vec!["0x11".to_string()])?;
let expected_call_data = xt.encode_call_data(&client.metadata())?;
assert_eq!(decode_call_data("0x00000411")?, expected_call_data);
Ok(())
@@ -209,13 +205,14 @@ mod tests {
async fn sign_and_submit_wrong_extrinsic_fails() -> Result<()> {
let client = set_up_client(POP_NETWORK_TESTNET_URL).await?;
let function = Function {
pallet: "WrongPallet".to_string(),
name: "wrong_extrinsic".to_string(),
index: 0,
docs: "documentation".to_string(),
is_supported: true,
..Default::default()
};
let xt = construct_extrinsic("WrongPallet", &function, vec!["0x11".to_string()])?;
let xt = construct_extrinsic(&function, vec!["0x11".to_string()])?;
assert!(matches!(
sign_and_submit_extrinsic(client, xt, ALICE_SURI).await,
Err(Error::ExtrinsicSubmissionError(message)) if message.contains("PalletNameNotFound(\"WrongPallet\"))")
@@ -229,7 +226,6 @@ mod tests {
let pallets = parse_chain_metadata(&client)?;
let force_transfer = find_dispatchable_by_name(&pallets, "Balances", "force_transfer")?;
let xt = construct_extrinsic(
"Balances",
&force_transfer,
vec![
"Id(5FHneW46xGXgs5mUiveU4sbTyGBzmstUspZC92UhjJM694ty)".to_string(),

0 comments on commit 2743a5e

Please sign in to comment.