1

所以我#[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如果这有区别的话。我可以在其他功能上看到外部错误,除了这个。

4

1 回答 1

2

我怀疑这类似于 util.batch - 我怀疑 sudo 是否成功,无论内部外部是否成功,并且我怀疑的 UI 没有显示包装器中所有外部是否成功的聚合。虽然这是一个不令人满意的答案。我会检查这是否已作为 polkadot-js 中的问题提出,如果没有提出。

于 2022-01-21T14:00:32.407 回答