git.delta.rocks / unique-network / refs/commits / 6bfc1ca502da

difftreelog

source

tests/src/creditFeesToTreasury.test.ts7.5 KiBsourcehistory
1//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  transferExpectSuccess,18} from './util/helpers';1920import { default as waitNewBlocks } from './substrate/wait-new-blocks';21import { ApiPromise } from '@polkadot/api';2223chai.use(chaiAsPromised);24const expect = chai.expect;2526const Treasury = '5EYCAe5ijiYfyeZ2JJCGq56LmPyNRAKzpG4QkoQkkQNB5e6Z';27const saneMinimumFee = 0.05;28const saneMaximumFee = 0.5;29const createCollectionDeposit = 100;3031let alice: IKeyringPair;32let bob: IKeyringPair;3334// Skip the inflation block pauses if the block is close to inflation block 35// until the inflation happens36/*eslint no-async-promise-executor: "off"*/37function skipInflationBlock(api: ApiPromise): Promise<void> {38  const promise = new Promise<void>(async (resolve) => {39    const blockInterval = parseInt((await api.consts.inflation.inflationBlockInterval).toString());40    const unsubscribe = await api.rpc.chain.subscribeNewHeads(head => {41      const currentBlock = parseInt(head.number.toString());42      if (currentBlock % blockInterval < blockInterval - 10) {43        unsubscribe();44        resolve();45      } else {46        console.log(`Skipping inflation block, current block: ${currentBlock}`);47      }48    });49  });5051  return promise;52}5354describe('integration test: Fees must be credited to Treasury:', () => {55  before(async () => {56    await usingApi(async () => {57      alice = privateKey('//Alice');58      bob = privateKey('//Bob');59    });60  });6162  it('Total issuance does not change', async () => {63    await usingApi(async (api) => {64      await skipInflationBlock(api);65      await waitNewBlocks(api, 1);6667      const totalBefore = new BigNumber((await api.query.balances.totalIssuance()).toString());6869      const alicePrivateKey = privateKey('//Alice');70      const amount = new BigNumber(1);71      const transfer = api.tx.balances.transfer(bobsPublicKey, amount.toFixed());7273      const result = getGenericResult(await submitTransactionAsync(alicePrivateKey, transfer));7475      const totalAfter = new BigNumber((await api.query.balances.totalIssuance()).toString());7677      expect(result.success).to.be.true;78      expect(totalAfter.toFixed()).to.be.equal(totalBefore.toFixed());79    });80  });8182  it('Sender balance decreased by fee+sent amount, Treasury balance increased by fee', async () => {83    await usingApi(async (api) => {84      await skipInflationBlock(api);85      await waitNewBlocks(api, 1);8687      const alicePrivateKey = privateKey('//Alice');88      const treasuryBalanceBefore = new BigNumber((await api.query.system.account(Treasury)).data.free.toString());89      const aliceBalanceBefore = new BigNumber((await api.query.system.account(alicesPublicKey)).data.free.toString());9091      const amount = new BigNumber(1);92      const transfer = api.tx.balances.transfer(bobsPublicKey, amount.toFixed());93      const result = getGenericResult(await submitTransactionAsync(alicePrivateKey, transfer));9495      const treasuryBalanceAfter = new BigNumber((await api.query.system.account(Treasury)).data.free.toString());96      const aliceBalanceAfter = new BigNumber((await api.query.system.account(alicesPublicKey)).data.free.toString());97      const fee = aliceBalanceBefore.minus(aliceBalanceAfter).minus(amount);98      const treasuryIncrease = treasuryBalanceAfter.minus(treasuryBalanceBefore);99100      expect(result.success).to.be.true;101      expect(treasuryIncrease.toFixed()).to.be.equal(fee.toFixed());102    });103  });104105  it('Treasury balance increased by failed tx fee', async () => {106    await usingApi(async (api) => {107      await skipInflationBlock(api);108      await waitNewBlocks(api, 1);109110      const bobPrivateKey = privateKey('//Bob');111      const treasuryBalanceBefore = new BigNumber((await api.query.system.account(Treasury)).data.free.toString());112      const bobBalanceBefore = new BigNumber((await api.query.system.account(bobsPublicKey)).data.free.toString());113114      const badTx = api.tx.balances.setBalance(alicesPublicKey, 0, 0);115      await expect(submitTransactionExpectFailAsync(bobPrivateKey, badTx)).to.be.rejected;116117      const treasuryBalanceAfter = new BigNumber((await api.query.system.account(Treasury)).data.free.toString());118      const bobBalanceAfter = new BigNumber((await api.query.system.account(bobsPublicKey)).data.free.toString());119      const fee = bobBalanceBefore.minus(bobBalanceAfter);120      const treasuryIncrease = treasuryBalanceAfter.minus(treasuryBalanceBefore);121122      expect(treasuryIncrease.toFixed()).to.be.equal(fee.toFixed());123    });124  });125126  it('NFT Transactions also send fees to Treasury', async () => {127    await usingApi(async (api) => {128      await skipInflationBlock(api);129      await waitNewBlocks(api, 1);130131      const treasuryBalanceBefore = new BigNumber((await api.query.system.account(Treasury)).data.free.toString());132      const aliceBalanceBefore = new BigNumber((await api.query.system.account(alicesPublicKey)).data.free.toString());133134      await createCollectionExpectSuccess();135136      const treasuryBalanceAfter = new BigNumber((await api.query.system.account(Treasury)).data.free.toString());137      const aliceBalanceAfter = new BigNumber((await api.query.system.account(alicesPublicKey)).data.free.toString());138      const fee = aliceBalanceBefore.minus(aliceBalanceAfter);139      const treasuryIncrease = treasuryBalanceAfter.minus(treasuryBalanceBefore);140141      expect(treasuryIncrease.toFixed()).to.be.equal(fee.toFixed());142    });143  });144145  it('Fees are sane', async () => {146    await usingApi(async (api) => {147      await skipInflationBlock(api);148      await waitNewBlocks(api, 1);149150      const aliceBalanceBefore = new BigNumber((await api.query.system.account(alicesPublicKey)).data.free.toString());151152      await createCollectionExpectSuccess();153154      const aliceBalanceAfter = new BigNumber((await api.query.system.account(alicesPublicKey)).data.free.toString());155      const fee = aliceBalanceBefore.minus(aliceBalanceAfter);156157      expect(fee.dividedBy(1e15).toNumber()).to.be.lessThan(saneMaximumFee + createCollectionDeposit);158      expect(fee.dividedBy(1e15).toNumber()).to.be.greaterThan(saneMinimumFee  + createCollectionDeposit);159    });160  });161162  it('NFT Transfer fee is close to 0.1 Unique', async () => {163    await usingApi(async (api) => {164      await skipInflationBlock(api);165      await waitNewBlocks(api, 1);166167      const collectionId = await createCollectionExpectSuccess();168      const tokenId = await createItemExpectSuccess(alice, collectionId, 'NFT');169170      const aliceBalanceBefore = new BigNumber((await api.query.system.account(alicesPublicKey)).data.free.toString());171      await transferExpectSuccess(collectionId, tokenId, alice, bob, 1, 'NFT');172      const aliceBalanceAfter = new BigNumber((await api.query.system.account(alicesPublicKey)).data.free.toString());173      const fee = aliceBalanceBefore.minus(aliceBalanceAfter);174175      // console.log(fee.toString());176      const expectedTransferFee = 0.1;177      const tolerance = 0.001;178      expect(fee.dividedBy(1e15).minus(expectedTransferFee).abs().toNumber()).to.be.lessThan(tolerance);179    });180  });181182});183