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';1920chai.use(chaiAsPromised);21const expect = chai.expect;2223const Treasury = "5EYCAe5ijiYfyeZ2JJCGq56LmPyNRAKzpG4QkoQkkQNB5e6Z";24const saneMinimumFee = 0.05;25const saneMaximumFee = 0.5;2627let alice: IKeyringPair;28let bob: IKeyringPair;2930describe('integration test: Fees must be credited to Treasury:', () => {31 before(async () => {32 await usingApi(async (api) => {33 alice = privateKey('//Alice');34 bob = privateKey('//Bob');35 });36 });3738 it('Total issuance does not change', async () => {39 await usingApi(async (api) => {40 const totalBefore = new BigNumber((await api.query.balances.totalIssuance()).toString());4142 const alicePrivateKey = privateKey('//Alice');43 const amount = new BigNumber(1);44 const transfer = api.tx.balances.transfer(bobsPublicKey, amount.toFixed());4546 const result = getGenericResult(await submitTransactionAsync(alicePrivateKey, transfer));4748 const totalAfter = new BigNumber((await api.query.balances.totalIssuance()).toString());4950 expect(result.success).to.be.true;51 expect(totalAfter.toFixed()).to.be.equal(totalBefore.toFixed());52 });53 });5455 it('Sender balance decreased by fee+sent amount, Treasury balance increased by fee', async () => {56 await usingApi(async (api) => {57 const alicePrivateKey = privateKey('//Alice');58 const treasuryBalanceBefore = new BigNumber((await api.query.system.account(Treasury)).data.free.toString());59 const aliceBalanceBefore = new BigNumber((await api.query.system.account(alicesPublicKey)).data.free.toString());6061 const amount = new BigNumber(1);62 const transfer = api.tx.balances.transfer(bobsPublicKey, amount.toFixed());63 const result = getGenericResult(await submitTransactionAsync(alicePrivateKey, transfer));6465 const treasuryBalanceAfter = new BigNumber((await api.query.system.account(Treasury)).data.free.toString());66 const aliceBalanceAfter = new BigNumber((await api.query.system.account(alicesPublicKey)).data.free.toString());67 const fee = aliceBalanceBefore.minus(aliceBalanceAfter).minus(amount);68 const treasuryIncrease = treasuryBalanceAfter.minus(treasuryBalanceBefore);6970 expect(result.success).to.be.true;71 expect(treasuryIncrease.toFixed()).to.be.equal(fee.toFixed());72 });73 });7475 it('Treasury balance increased by failed tx fee', async () => {76 await usingApi(async (api) => {77 const bobPrivateKey = privateKey('//Bob');78 const treasuryBalanceBefore = new BigNumber((await api.query.system.account(Treasury)).data.free.toString());79 const bobBalanceBefore = new BigNumber((await api.query.system.account(bobsPublicKey)).data.free.toString());8081 const badTx = api.tx.balances.setBalance(alicesPublicKey, 0, 0);82 await expect(submitTransactionExpectFailAsync(bobPrivateKey, badTx)).to.be.rejected;8384 const treasuryBalanceAfter = new BigNumber((await api.query.system.account(Treasury)).data.free.toString());85 const bobBalanceAfter = new BigNumber((await api.query.system.account(bobsPublicKey)).data.free.toString());86 const fee = bobBalanceBefore.minus(bobBalanceAfter);87 const treasuryIncrease = treasuryBalanceAfter.minus(treasuryBalanceBefore);8889 expect(treasuryIncrease.toFixed()).to.be.equal(fee.toFixed());90 });91 });9293 it('NFT Transactions also send fees to Treasury', async () => {94 await usingApi(async (api) => {95 const treasuryBalanceBefore = new BigNumber((await api.query.system.account(Treasury)).data.free.toString());96 const aliceBalanceBefore = new BigNumber((await api.query.system.account(alicesPublicKey)).data.free.toString());9798 await createCollectionExpectSuccess();99100 const treasuryBalanceAfter = new BigNumber((await api.query.system.account(Treasury)).data.free.toString());101 const aliceBalanceAfter = new BigNumber((await api.query.system.account(alicesPublicKey)).data.free.toString());102 const fee = aliceBalanceBefore.minus(aliceBalanceAfter);103 const treasuryIncrease = treasuryBalanceAfter.minus(treasuryBalanceBefore);104105 expect(treasuryIncrease.toFixed()).to.be.equal(fee.toFixed());106 });107 });108109 it('Fees are sane', async () => {110 await usingApi(async (api) => {111 const treasuryBalanceBefore = new BigNumber((await api.query.system.account(Treasury)).data.free.toString());112 const aliceBalanceBefore = new BigNumber((await api.query.system.account(alicesPublicKey)).data.free.toString());113114 await createCollectionExpectSuccess();115116 const treasuryBalanceAfter = new BigNumber((await api.query.system.account(Treasury)).data.free.toString());117 const aliceBalanceAfter = new BigNumber((await api.query.system.account(alicesPublicKey)).data.free.toString());118 const fee = aliceBalanceBefore.minus(aliceBalanceAfter);119 const treasuryIncrease = treasuryBalanceAfter.minus(treasuryBalanceBefore);120121 expect(fee.dividedBy(1e15).toNumber()).to.be.lessThan(saneMaximumFee);122 expect(fee.dividedBy(1e15).toNumber()).to.be.greaterThan(saneMinimumFee);123 });124 });125126 it('NFT Transfer fee is close to 0.1 Unique', async () => {127 await usingApi(async (api) => {128 const collectionId = await createCollectionExpectSuccess();129 const tokenId = await createItemExpectSuccess(alice, collectionId, 'NFT');130131 const aliceBalanceBefore = new BigNumber((await api.query.system.account(alicesPublicKey)).data.free.toString());132 await transferExpectSuccess(collectionId, tokenId, alice, bob, 1, 'NFT');133 const aliceBalanceAfter = new BigNumber((await api.query.system.account(alicesPublicKey)).data.free.toString());134 const fee = aliceBalanceBefore.minus(aliceBalanceAfter);135136 137 const expectedTransferFee = 0.1;138 const tolerance = 0.00001;139 expect(fee.dividedBy(1e15).minus(expectedTransferFee).abs().toNumber()).to.be.lessThan(tolerance);140 });141 });142143});144