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;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 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