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";2import { default as usingApi, submitTransactionAsync } from "./substrate/substrate-api";3import { alicesPublicKey, bobsPublicKey } from "./accounts";4import privateKey from "./substrate/privateKey";5import getBalance from "./substrate/get-balance";67describe('Transfer', () => {8 it('Balance transfers', async () => {9 await usingApi(async api => {10 const [alicesBalanceBefore, bobsBalanceBefore] = await getBalance(api, [alicesPublicKey, bobsPublicKey]);1112 const alicePrivateKey = privateKey('//Alice');13 14 const transfer = api.tx.balances.transfer(bobsPublicKey, 1n);15 const result = await submitTransactionAsync(alicePrivateKey, transfer);1617 const [alicesBalanceAfter, bobsBalanceAfter] = await getBalance(api, [alicesPublicKey, bobsPublicKey]);1819 expect(alicesBalanceAfter < alicesBalanceBefore).to.be.true;20 expect(bobsBalanceAfter > bobsBalanceBefore).to.be.true;21 });22 });23});1import { expect, assert } from "chai";2import { default as usingApi, submitTransactionAsync } from "./substrate/substrate-api";3import { alicesPublicKey, bobsPublicKey, ferdiesPublicKey } from "./accounts";4import privateKey from "./substrate/privateKey";5import getBalance from "./substrate/get-balance";67describe('Transfer', () => {8 it('Balance transfers', async () => {9 await usingApi(async api => {10 const [alicesBalanceBefore, bobsBalanceBefore] = await getBalance(api, [alicesPublicKey, bobsPublicKey]);1112 const alicePrivateKey = privateKey('//Alice');13 14 const transfer = api.tx.balances.transfer(bobsPublicKey, 1n);15 const result = await submitTransactionAsync(alicePrivateKey, transfer);1617 const [alicesBalanceAfter, bobsBalanceAfter] = await getBalance(api, [alicesPublicKey, bobsPublicKey]);1819 expect(alicesBalanceAfter < alicesBalanceBefore).to.be.true;20 expect(bobsBalanceAfter > bobsBalanceBefore).to.be.true;21 });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 });41});