difftreelog
Fix fee sanity test
in: master
2 files changed
pallets/nft/src/lib.rsdiffbeforeafterboth--- a/pallets/nft/src/lib.rs
+++ b/pallets/nft/src/lib.rs
@@ -665,6 +665,7 @@
// Anyone can create a collection
let who = ensure_signed(origin)?;
+ // Take a (non-refundable) deposit of collection creation
let mut imbalance = <<<T as Config>::Currency as Currency<T::AccountId>>::PositiveImbalance>::zero();
imbalance.subsume(<<T as Config>::Currency as Currency<T::AccountId>>::deposit_creating(
&T::TreasuryAccountId::get(),
tests/src/creditFeesToTreasury.test.tsdiffbeforeafterboth1//2// This file is subject to the terms and conditions defined in3// file 'LICENSE', which is part of this source code package.4//56import chai from 'chai';7import chaiAsPromised from 'chai-as-promised';8import { default as usingApi, submitTransactionAsync, submitTransactionExpectFailAsync } from "./substrate/substrate-api";9import { alicesPublicKey, bobsPublicKey } from "./accounts";10import privateKey from "./substrate/privateKey";11import { BigNumber } from 'bignumber.js';12import { IKeyringPair } from '@polkadot/types/types';13import { 14 createCollectionExpectSuccess, 15 createItemExpectSuccess,16 getGenericResult,17 transferExpectSuccess18} from './util/helpers';1920import { default as waitNewBlocks } from './substrate/wait-new-blocks';2122chai.use(chaiAsPromised);23const expect = chai.expect;2425const Treasury = "5EYCAe5ijiYfyeZ2JJCGq56LmPyNRAKzpG4QkoQkkQNB5e6Z";26const saneMinimumFee = 0.05;27const saneMaximumFee = 0.5;2829let alice: IKeyringPair;30let bob: IKeyringPair;3132describe('integration test: Fees must be credited to Treasury:', () => {33 before(async () => {34 await usingApi(async (api) => {35 alice = privateKey('//Alice');36 bob = privateKey('//Bob');37 });38 });3940 it('Total issuance does not change', async () => {41 await usingApi(async (api) => {42 await waitNewBlocks(api, 1);4344 const totalBefore = new BigNumber((await api.query.balances.totalIssuance()).toString());4546 const alicePrivateKey = privateKey('//Alice');47 const amount = new BigNumber(1);48 const transfer = api.tx.balances.transfer(bobsPublicKey, amount.toFixed());4950 const result = getGenericResult(await submitTransactionAsync(alicePrivateKey, transfer));5152 const totalAfter = new BigNumber((await api.query.balances.totalIssuance()).toString());5354 expect(result.success).to.be.true;55 expect(totalAfter.toFixed()).to.be.equal(totalBefore.toFixed());56 });57 });5859 it('Sender balance decreased by fee+sent amount, Treasury balance increased by fee', async () => {60 await usingApi(async (api) => {61 await waitNewBlocks(api, 1);6263 const alicePrivateKey = privateKey('//Alice');64 const treasuryBalanceBefore = new BigNumber((await api.query.system.account(Treasury)).data.free.toString());65 const aliceBalanceBefore = new BigNumber((await api.query.system.account(alicesPublicKey)).data.free.toString());6667 const amount = new BigNumber(1);68 const transfer = api.tx.balances.transfer(bobsPublicKey, amount.toFixed());69 const result = getGenericResult(await submitTransactionAsync(alicePrivateKey, transfer));7071 const treasuryBalanceAfter = new BigNumber((await api.query.system.account(Treasury)).data.free.toString());72 const aliceBalanceAfter = new BigNumber((await api.query.system.account(alicesPublicKey)).data.free.toString());73 const fee = aliceBalanceBefore.minus(aliceBalanceAfter).minus(amount);74 const treasuryIncrease = treasuryBalanceAfter.minus(treasuryBalanceBefore);7576 expect(result.success).to.be.true;77 expect(treasuryIncrease.toFixed()).to.be.equal(fee.toFixed());78 });79 });8081 it('Treasury balance increased by failed tx fee', async () => {82 await usingApi(async (api) => {83 await waitNewBlocks(api, 1);8485 const bobPrivateKey = privateKey('//Bob');86 const treasuryBalanceBefore = new BigNumber((await api.query.system.account(Treasury)).data.free.toString());87 const bobBalanceBefore = new BigNumber((await api.query.system.account(bobsPublicKey)).data.free.toString());8889 const badTx = api.tx.balances.setBalance(alicesPublicKey, 0, 0);90 await expect(submitTransactionExpectFailAsync(bobPrivateKey, badTx)).to.be.rejected;9192 const treasuryBalanceAfter = new BigNumber((await api.query.system.account(Treasury)).data.free.toString());93 const bobBalanceAfter = new BigNumber((await api.query.system.account(bobsPublicKey)).data.free.toString());94 const fee = bobBalanceBefore.minus(bobBalanceAfter);95 const treasuryIncrease = treasuryBalanceAfter.minus(treasuryBalanceBefore);9697 expect(treasuryIncrease.toFixed()).to.be.equal(fee.toFixed());98 });99 });100101 it('NFT Transactions also send fees to Treasury', async () => {102 await usingApi(async (api) => {103 await waitNewBlocks(api, 1);104105 const treasuryBalanceBefore = new BigNumber((await api.query.system.account(Treasury)).data.free.toString());106 const aliceBalanceBefore = new BigNumber((await api.query.system.account(alicesPublicKey)).data.free.toString());107108 await createCollectionExpectSuccess();109110 const treasuryBalanceAfter = new BigNumber((await api.query.system.account(Treasury)).data.free.toString());111 const aliceBalanceAfter = new BigNumber((await api.query.system.account(alicesPublicKey)).data.free.toString());112 const fee = aliceBalanceBefore.minus(aliceBalanceAfter);113 const treasuryIncrease = treasuryBalanceAfter.minus(treasuryBalanceBefore);114115 expect(treasuryIncrease.toFixed()).to.be.equal(fee.toFixed());116 });117 });118119 it('Fees are sane', async () => {120 await usingApi(async (api) => {121 await waitNewBlocks(api, 1);122123 const aliceBalanceBefore = new BigNumber((await api.query.system.account(alicesPublicKey)).data.free.toString());124125 await createCollectionExpectSuccess();126127 const aliceBalanceAfter = new BigNumber((await api.query.system.account(alicesPublicKey)).data.free.toString());128 const fee = aliceBalanceBefore.minus(aliceBalanceAfter);129130 expect(fee.dividedBy(1e15).toNumber()).to.be.lessThan(saneMaximumFee);131 expect(fee.dividedBy(1e15).toNumber()).to.be.greaterThan(saneMinimumFee);132 });133 });134135 it('NFT Transfer fee is close to 0.1 Unique', async () => {136 await usingApi(async (api) => {137 await waitNewBlocks(api, 1);138139 const collectionId = await createCollectionExpectSuccess();140 const tokenId = await createItemExpectSuccess(alice, collectionId, 'NFT');141142 const aliceBalanceBefore = new BigNumber((await api.query.system.account(alicesPublicKey)).data.free.toString());143 await transferExpectSuccess(collectionId, tokenId, alice, bob, 1, 'NFT');144 const aliceBalanceAfter = new BigNumber((await api.query.system.account(alicesPublicKey)).data.free.toString());145 const fee = aliceBalanceBefore.minus(aliceBalanceAfter);146147 // console.log(fee.toString());148 const expectedTransferFee = 0.1;149 const tolerance = 0.00001;150 expect(fee.dividedBy(1e15).minus(expectedTransferFee).abs().toNumber()).to.be.lessThan(tolerance);151 });152 });153154});1551//2// This file is subject to the terms and conditions defined in3// file 'LICENSE', which is part of this source code package.4//56import chai from 'chai';7import chaiAsPromised from 'chai-as-promised';8import { default as usingApi, submitTransactionAsync, submitTransactionExpectFailAsync } from "./substrate/substrate-api";9import { alicesPublicKey, bobsPublicKey } from "./accounts";10import privateKey from "./substrate/privateKey";11import { BigNumber } from 'bignumber.js';12import { IKeyringPair } from '@polkadot/types/types';13import { 14 createCollectionExpectSuccess, 15 createItemExpectSuccess,16 getGenericResult,17 transferExpectSuccess18} from './util/helpers';1920import { default as waitNewBlocks } from './substrate/wait-new-blocks';2122chai.use(chaiAsPromised);23const expect = chai.expect;2425const Treasury = "5EYCAe5ijiYfyeZ2JJCGq56LmPyNRAKzpG4QkoQkkQNB5e6Z";26const saneMinimumFee = 0.05;27const saneMaximumFee = 0.5;28const createCollectionDeposit = 100;2930let alice: IKeyringPair;31let bob: IKeyringPair;3233describe('integration test: Fees must be credited to Treasury:', () => {34 before(async () => {35 await usingApi(async (api) => {36 alice = privateKey('//Alice');37 bob = privateKey('//Bob');38 });39 });4041 it('Total issuance does not change', async () => {42 await usingApi(async (api) => {43 await waitNewBlocks(api, 1);4445 const totalBefore = new BigNumber((await api.query.balances.totalIssuance()).toString());4647 const alicePrivateKey = privateKey('//Alice');48 const amount = new BigNumber(1);49 const transfer = api.tx.balances.transfer(bobsPublicKey, amount.toFixed());5051 const result = getGenericResult(await submitTransactionAsync(alicePrivateKey, transfer));5253 const totalAfter = new BigNumber((await api.query.balances.totalIssuance()).toString());5455 expect(result.success).to.be.true;56 expect(totalAfter.toFixed()).to.be.equal(totalBefore.toFixed());57 });58 });5960 it('Sender balance decreased by fee+sent amount, Treasury balance increased by fee', async () => {61 await usingApi(async (api) => {62 await waitNewBlocks(api, 1);6364 const alicePrivateKey = privateKey('//Alice');65 const treasuryBalanceBefore = new BigNumber((await api.query.system.account(Treasury)).data.free.toString());66 const aliceBalanceBefore = new BigNumber((await api.query.system.account(alicesPublicKey)).data.free.toString());6768 const amount = new BigNumber(1);69 const transfer = api.tx.balances.transfer(bobsPublicKey, amount.toFixed());70 const result = getGenericResult(await submitTransactionAsync(alicePrivateKey, transfer));7172 const treasuryBalanceAfter = new BigNumber((await api.query.system.account(Treasury)).data.free.toString());73 const aliceBalanceAfter = new BigNumber((await api.query.system.account(alicesPublicKey)).data.free.toString());74 const fee = aliceBalanceBefore.minus(aliceBalanceAfter).minus(amount);75 const treasuryIncrease = treasuryBalanceAfter.minus(treasuryBalanceBefore);7677 expect(result.success).to.be.true;78 expect(treasuryIncrease.toFixed()).to.be.equal(fee.toFixed());79 });80 });8182 it('Treasury balance increased by failed tx fee', async () => {83 await usingApi(async (api) => {84 await waitNewBlocks(api, 1);8586 const bobPrivateKey = privateKey('//Bob');87 const treasuryBalanceBefore = new BigNumber((await api.query.system.account(Treasury)).data.free.toString());88 const bobBalanceBefore = new BigNumber((await api.query.system.account(bobsPublicKey)).data.free.toString());8990 const badTx = api.tx.balances.setBalance(alicesPublicKey, 0, 0);91 await expect(submitTransactionExpectFailAsync(bobPrivateKey, badTx)).to.be.rejected;9293 const treasuryBalanceAfter = new BigNumber((await api.query.system.account(Treasury)).data.free.toString());94 const bobBalanceAfter = new BigNumber((await api.query.system.account(bobsPublicKey)).data.free.toString());95 const fee = bobBalanceBefore.minus(bobBalanceAfter);96 const treasuryIncrease = treasuryBalanceAfter.minus(treasuryBalanceBefore);9798 expect(treasuryIncrease.toFixed()).to.be.equal(fee.toFixed());99 });100 });101102 it('NFT Transactions also send fees to Treasury', async () => {103 await usingApi(async (api) => {104 await waitNewBlocks(api, 1);105106 const treasuryBalanceBefore = new BigNumber((await api.query.system.account(Treasury)).data.free.toString());107 const aliceBalanceBefore = new BigNumber((await api.query.system.account(alicesPublicKey)).data.free.toString());108109 await createCollectionExpectSuccess();110111 const treasuryBalanceAfter = new BigNumber((await api.query.system.account(Treasury)).data.free.toString());112 const aliceBalanceAfter = new BigNumber((await api.query.system.account(alicesPublicKey)).data.free.toString());113 const fee = aliceBalanceBefore.minus(aliceBalanceAfter);114 const treasuryIncrease = treasuryBalanceAfter.minus(treasuryBalanceBefore);115116 expect(treasuryIncrease.toFixed()).to.be.equal(fee.toFixed());117 });118 });119120 it('Fees are sane', async () => {121 await usingApi(async (api) => {122 await waitNewBlocks(api, 1);123124 const aliceBalanceBefore = new BigNumber((await api.query.system.account(alicesPublicKey)).data.free.toString());125126 await createCollectionExpectSuccess();127128 const aliceBalanceAfter = new BigNumber((await api.query.system.account(alicesPublicKey)).data.free.toString());129 const fee = aliceBalanceBefore.minus(aliceBalanceAfter);130131 expect(fee.dividedBy(1e15).toNumber()).to.be.lessThan(saneMaximumFee + createCollectionDeposit);132 expect(fee.dividedBy(1e15).toNumber()).to.be.greaterThan(saneMinimumFee + createCollectionDeposit);133 });134 });135136 it('NFT Transfer fee is close to 0.1 Unique', async () => {137 await usingApi(async (api) => {138 await waitNewBlocks(api, 1);139140 const collectionId = await createCollectionExpectSuccess();141 const tokenId = await createItemExpectSuccess(alice, collectionId, 'NFT');142143 const aliceBalanceBefore = new BigNumber((await api.query.system.account(alicesPublicKey)).data.free.toString());144 await transferExpectSuccess(collectionId, tokenId, alice, bob, 1, 'NFT');145 const aliceBalanceAfter = new BigNumber((await api.query.system.account(alicesPublicKey)).data.free.toString());146 const fee = aliceBalanceBefore.minus(aliceBalanceAfter);147148 // console.log(fee.toString());149 const expectedTransferFee = 0.1;150 const tolerance = 0.00001;151 expect(fee.dividedBy(1e15).minus(expectedTransferFee).abs().toNumber()).to.be.lessThan(tolerance);152 });153 });154155});156