我有一个模块方法,它将固定费用与来自各种托盘的呼叫相关联。所以我试图通过托盘、调用名称和调用参数来匹配作为参数传递给我的方法的调用。
与此类似的东西:
impl<T: Config> Module<T>
{
fn compute_call_fee_(call: &<T as Config>::Call) -> Result<u64, &'static str> {
let fee = match *call {
Call::PalletA(palletA::Call::name_of_palletA_call(x,y)) => 50u64, // here this is not real syntax, this is what I need to figure out
_ => 100u64
};
Ok(fee)
}
}
对于上面的情况, Config trait 将实现来自匹配的不同托盘的 Config 特征:
pub trait Config: system::Config + palletA::Config + palletB::Config {
type Call: Parameter + Dispatchable<Origin = Self::Origin> + GetDispatchInfo;
}
如何按原点call
托盘、函数名称和函数参数进行匹配?
我试过了:
使用与上述类似的语法,但没有成功
制作
Config::Call
工具GetCallMetadata
:这只会让我得到原始托盘和函数名称,而不是参数使调用实现
IsSubType
,并遵循以下答案:How to decode and match a call when passing as a parameter in Substrate。如果我做对了,这与来自其他托盘的呼叫无关。对于 using
IsSubType
,我将其添加为绑定到 impl 块的特征,而不是Config
特征:impl<T: Config> Module<T> where <T as Config>::Call: IsSubType<Call<T>>, { fn compute_call_fee_(call: &<T as Config>::Call) -> Result<u64, &'static str> { if let Some(local_call) = call.is_sub_type() { return match local_call { palletA::Call::name_of_palletA_call(x,y) => Ok(42u64), _ => Ok(0u64), } } Ok(21u64) } }