difftreelog
Merge pull request #42 from usetech-llc/feature/NFTPAR-197_errors_in_ui
in: master
Fix tx validity check in signed extension (NFTPAR-197)
3 files changed
pallets/nft/src/lib.rsdiffbeforeafterboth--- a/pallets/nft/src/lib.rs
+++ b/pallets/nft/src/lib.rs
@@ -29,10 +29,10 @@
use sp_runtime::sp_std::prelude::Vec;
use sp_runtime::{
traits::{
- DispatchInfoOf, Dispatchable, PostDispatchInfoOf, Saturating, SignedExtension, Zero,
+ DispatchInfoOf, Dispatchable, PostDispatchInfoOf, Saturating, SaturatedConversion, SignedExtension, Zero,
},
transaction_validity::{
- InvalidTransaction, TransactionValidity, TransactionValidityError, ValidTransaction,
+ TransactionPriority, InvalidTransaction, TransactionValidity, TransactionValidityError, ValidTransaction,
},
FixedPointOperand, FixedU128,
};
@@ -2302,6 +2302,13 @@
<transaction_payment::Module<T>>::compute_fee(len as u32, info, tip)
}
+ fn get_priority(len: usize, info: &DispatchInfoOf<T::Call>, final_fee: BalanceOf<T>) -> TransactionPriority {
+ let weight_saturation = T::MaximumBlockWeight::get() / info.weight.max(1);
+ let len_saturation = T::MaximumBlockLength::get() as u64 / (len as u64).max(1);
+ let coefficient: BalanceOf<T> = weight_saturation.min(len_saturation).saturated_into::<BalanceOf<T>>();
+ final_fee.saturating_mul(coefficient).saturated_into::<TransactionPriority>()
+ }
+
fn withdraw_fee(
&self,
who: &T::AccountId,
@@ -2525,12 +2532,16 @@
fn validate(
&self,
- _who: &Self::AccountId,
- _call: &Self::Call,
- _info: &DispatchInfoOf<Self::Call>,
- _len: usize,
+ who: &Self::AccountId,
+ call: &Self::Call,
+ info: &DispatchInfoOf<Self::Call>,
+ len: usize,
) -> TransactionValidity {
- Ok(ValidTransaction::default())
+ let (fee, _) = self.withdraw_fee(who, call, info, len)?;
+ Ok(ValidTransaction {
+ priority: Self::get_priority(len, info, fee),
+ ..Default::default()
+ })
}
fn pre_dispatch(
tests/src/accounts.tsdiffbeforeafterboth--- a/tests/src/accounts.ts
+++ b/tests/src/accounts.ts
@@ -1,2 +1,3 @@
export const bobsPublicKey = '5FHneW46xGXgs5mUiveU4sbTyGBzmstUspZC92UhjJM694ty';
export const alicesPublicKey = '5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY';
+export const ferdiesPublicKey = '5CiPPseXPECbkjWCa6MnjNokrgYjMqmKndv2rSnekmSK2DjL';
tests/src/transfer.test.tsdiffbeforeafterboth1import { expect } from "chai";1import { expect, assert } from "chai";2import { default as usingApi, submitTransactionAsync } from "./substrate/substrate-api";2import { default as usingApi, submitTransactionAsync } from "./substrate/substrate-api";3import { alicesPublicKey, bobsPublicKey } from "./accounts";3import { alicesPublicKey, bobsPublicKey, ferdiesPublicKey } from "./accounts";4import privateKey from "./substrate/privateKey";4import privateKey from "./substrate/privateKey";5import getBalance from "./substrate/get-balance";5import getBalance from "./substrate/get-balance";6621 });21 });22 });22 });2324 it('Inability to pay fees error message is correct', async () => {25 await usingApi(async api => {26 const pk = privateKey('//Ferdie');2728 console.log = function () {};29 console.error = function () {};30 31 const badTransfer = api.tx.balances.transfer(bobsPublicKey, 1n);32 const badTransaction = async function () { 33 const result = await submitTransactionAsync(pk, badTransfer);34 };35 await expect(badTransaction()).to.be.rejectedWith("Inability to pay some fees");3637 delete console.log;38 delete console.error;39 });40 });23});41});2442