123456import 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 const aliceBalanceBefore = new BigNumber((await api.query.system.account(alicesPublicKey)).data.free.toString());122123 await createCollectionExpectSuccess();124125 const aliceBalanceAfter = new BigNumber((await api.query.system.account(alicesPublicKey)).data.free.toString());126 const fee = aliceBalanceBefore.minus(aliceBalanceAfter);127128 expect(fee.dividedBy(1e15).toNumber()).to.be.lessThan(saneMaximumFee);129 expect(fee.dividedBy(1e15).toNumber()).to.be.greaterThan(saneMinimumFee);130 });131 });132133 it('NFT Transfer fee is close to 0.1 Unique', async () => {134 await usingApi(async (api) => {135 const collectionId = await createCollectionExpectSuccess();136 const tokenId = await createItemExpectSuccess(alice, collectionId, 'NFT');137138 const aliceBalanceBefore = new BigNumber((await api.query.system.account(alicesPublicKey)).data.free.toString());139 await transferExpectSuccess(collectionId, tokenId, alice, bob, 1, 'NFT');140 const aliceBalanceAfter = new BigNumber((await api.query.system.account(alicesPublicKey)).data.free.toString());141 const fee = aliceBalanceBefore.minus(aliceBalanceAfter);142143 144 const expectedTransferFee = 0.1;145 const tolerance = 0.00001;146 expect(fee.dividedBy(1e15).minus(expectedTransferFee).abs().toNumber()).to.be.lessThan(tolerance);147 });148 });149150});151