5

Repost from stackoverflow:

So I've been at my wits' end for quite some time regarding #[pallet::error] showing up on Polkadot JS apps interface when calling a fallible function from sudo. So as I've come to understand following substrate kitties tutorial that we require to return a DispatchResult out of our dispatchable calls and after doing so, I have a case where I am not seeing any errors on my apps interface, although the operation does fail successfully as I don't see any mistakes on the balancesToAccount hashmap.

This code compiles fine.

    #[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())
        }
    }

As you can see I have a helper function that will check if minting amount causes a overflow to the total token supply. And that function is defined here:

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)
            }
        }
    }

I was expected ? to automagically cast the Error into something DispatchResult can work with, but I'm not sure if that's happening on this line:

Self::does_adding_overflow_maxtokensupply(amount)?;

Here's what Polkadot JS apps shows when I give it a number greater than max supply : enter image description here Next I check whether that balance went through (It shouldn't), and indeed it didn't go through. Alice's Balance not updated

What I would like the apps interface is to show an error rejecting such requests as it does in case of BadOrigin. How can I achieve this?

Edit #1: I should mention that this function is only callable by sudo, if that makes a difference. I can see extrinsic Errors on other functions, except this one.

1
  • @NukeManDan there done. have fun. Feb 9, 2022 at 17:12

1 Answer 1

4

I'm afraid at the moment the UI does not show these errors. This seems to be a UX fail but I am hopeful that we can fix it. This is the issue to watch:

https://github.com/polkadot-js/apps/issues/3072

(The sudo call is successfully invoking the parameter so it is a successful extrinsic even if there are inner errors - same woes with utils.batch, incomplete xcm messages etc.)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.