所以我#[pallet::error]
在 Polkadot JS 应用程序界面上出现的问题已经有很长一段时间了。因此,当我开始了解我们需要DispatchResult
从可调度调用中返回 a 的基板小猫教程之后,在这样做之后,我有一个案例,我的应用程序界面上没有看到任何错误,尽管操作确实失败了因为我在 balancesToAccount 哈希图中没有看到任何错误。
这段代码编译得很好。
#[pallet::call]
impl<T: Config> Pallet<T> {
#[pallet::weight(10_000 + T::DbWeight::get().writes(1))]
/// Allow only Root to mint new tokens & transfer it to some benefactor account
/// Set a hard uppper limit on the total number of tokens in supply
pub fn mint(
origin: OriginFor<T>,
#[pallet::compact] amount: <T as Config>::Balance,
benefactor: T::AccountId,
) -> DispatchResult {
// Check if sudo call
ensure_root(origin.clone())?;
// Check if existing amount doesn't overflow MaxTokenSupply
Error |----> Self::does_adding_overflow_maxtokensupply(amount)?;
// Check if Benefactor already has funds
let previous_balance = <BalanceToAccount<T>>::try_get(&benefactor).unwrap_or_default();
let final_balance = previous_balance.saturating_add(amount);
<BalanceToAccount<T>>::insert(&benefactor, final_balance);
Self::deposit_event(Event::MintedNewSupply(amount));
Ok(().into())
}
}
如您所见,我有一个辅助函数,它将检查铸币是否amount
导致总代币供应溢出。该函数在这里定义:
impl<T: Config> Pallet<T> {
fn does_adding_overflow_maxtokensupply(amount: T::Balance) -> Result<(), Error<T>> {
let total_already_minted: T::Balance = BalanceToAccount::<T>::iter_values().sum();
let new_supply =
total_already_minted.checked_add(&amount).ok_or(Error::<T>::MintTypeOverflow)?;
if new_supply <= T::MaxTokenSupply::get() {
Ok(())
} else {
Err(Error::<T>::MintCausingTotalSupplyOverflow)
}
}
}
我被期望?
自动将错误转换为DispatchResult
可以使用的东西,但我不确定这是否发生在这一行:
Self::does_adding_overflow_maxtokensupply(amount)?;
当我给它一个大于最大供应的数字时,这是 Polkadot JS 应用程序显示的内容: 接下来我检查该余额是否通过(它不应该),并且确实它没有通过。
我希望应用程序界面显示拒绝此类请求的错误,就像在BadOrigin
. 我怎样才能做到这一点?
编辑#1:我应该提到这个函数只能由 调用sudo
,如果这有区别的话。我可以在其他功能上看到外部错误,除了这个。