git.delta.rocks / unique-network / refs/commits / bb7c8cc8d300

difftreelog

Merge pull request #377 from UniqueNetwork/feature/CORE-302-ss58Format

kozyrevdev2022-06-09parents: #0f16e44 #bd269a2.patch.diff
in: master
test(ss58Format): more test fixes

3 files changed

modifiedtests/src/addCollectionAdmin.test.tsdiffbeforeafterboth
--- a/tests/src/addCollectionAdmin.test.ts
+++ b/tests/src/addCollectionAdmin.test.ts
@@ -17,7 +17,6 @@
 import {ApiPromise} from '@polkadot/api';
 import chai from 'chai';
 import chaiAsPromised from 'chai-as-promised';
-import privateKey from './substrate/privateKey';
 import {default as usingApi, submitTransactionAsync, submitTransactionExpectFailAsync} from './substrate/substrate-api';
 import {addCollectionAdminExpectSuccess, createCollectionExpectSuccess, destroyCollectionExpectSuccess, getAdminList, normalizeAccountId, queryCollectionExpectSuccess} from './util/helpers';
 
@@ -45,11 +44,11 @@
 
 describe('Negative Integration Test addCollectionAdmin(collection_id, new_admin_id):', () => {
   it("Not owner can't add collection admin.", async () => {
-    await usingApi(async (api) => {
+    await usingApi(async (api, privateKeyWrapper) => {
       const collectionId = await createCollectionExpectSuccess();
-      const alice = privateKey('//Alice');
-      const bob = privateKey('//Bob');
-      const charlie = privateKey('//CHARLIE');
+      const alice = privateKeyWrapper('//Alice');
+      const bob = privateKeyWrapper('//Bob');
+      const charlie = privateKeyWrapper('//CHARLIE');
 
       const collection = await queryCollectionExpectSuccess(api, collectionId);
       expect(collection.owner.toString()).to.be.equal(alice.address);
@@ -67,11 +66,11 @@
   });
 
   it("Admin can't add collection admin.", async () => {
-    await usingApi(async (api) => {
+    await usingApi(async (api, privateKeyWrapper) => {
       const collectionId = await createCollectionExpectSuccess();
-      const alice = privateKey('//Alice');
-      const bob = privateKey('//Bob');
-      const charlie = privateKey('//CHARLIE');
+      const alice = privateKeyWrapper('//Alice');
+      const bob = privateKeyWrapper('//Bob');
+      const charlie = privateKeyWrapper('//CHARLIE');
 
       const collection = await queryCollectionExpectSuccess(api, collectionId);
       expect(collection.owner.toString()).to.be.equal(alice.address);
modifiedtests/src/removeCollectionAdmin.test.tsdiffbeforeafterboth
--- a/tests/src/removeCollectionAdmin.test.ts
+++ b/tests/src/removeCollectionAdmin.test.ts
@@ -16,7 +16,6 @@
 
 import chai from 'chai';
 import chaiAsPromised from 'chai-as-promised';
-import privateKey from './substrate/privateKey';
 import {default as usingApi, submitTransactionAsync, submitTransactionExpectFailAsync} from './substrate/substrate-api';
 import {createCollectionExpectSuccess, destroyCollectionExpectSuccess, getAdminList, normalizeAccountId, queryCollectionExpectSuccess} from './util/helpers';
 
@@ -95,11 +94,11 @@
   });
 
   it('Regular user can\'t remove collection admin', async () => {
-    await usingApi(async (api) => {
+    await usingApi(async (api, privateKeyWrapper) => {
       const collectionId = await createCollectionExpectSuccess();
-      const alice = privateKey('//Alice');
-      const bob = privateKey('//Bob');
-      const charlie = privateKey('//Charlie');
+      const alice = privateKeyWrapper('//Alice');
+      const bob = privateKeyWrapper('//Bob');
+      const charlie = privateKeyWrapper('//Charlie');
 
       const addAdminTx = api.tx.unique.addCollectionAdmin(collectionId, normalizeAccountId(bob.address));
       await submitTransactionAsync(alice, addAdminTx);
@@ -113,11 +112,11 @@
   });
 
   it('Admin can\'t remove collection admin.', async () => {
-    await usingApi(async (api) => {
+    await usingApi(async (api, privateKeyWrapper) => {
       const collectionId = await createCollectionExpectSuccess();
-      const alice = privateKey('//Alice');
-      const bob = privateKey('//Bob');
-      const charlie = privateKey('//Charlie');
+      const alice = privateKeyWrapper('//Alice');
+      const bob = privateKeyWrapper('//Bob');
+      const charlie = privateKeyWrapper('//Charlie');
 
       const adminListAfterAddAdmin = await getAdminList(api, collectionId);
       expect(adminListAfterAddAdmin).to.be.deep.contains(normalizeAccountId(bob.address));
modifiedtests/src/scheduler.test.tsdiffbeforeafterboth
before · tests/src/scheduler.test.ts
1// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.2// This file is part of Unique Network.34// Unique Network is free software: you can redistribute it and/or modify5// it under the terms of the GNU General Public License as published by6// the Free Software Foundation, either version 3 of the License, or7// (at your option) any later version.89// Unique Network is distributed in the hope that it will be useful,10// but WITHOUT ANY WARRANTY; without even the implied warranty of11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the12// GNU General Public License for more details.1314// You should have received a copy of the GNU General Public License15// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.1617import chai, {expect} from 'chai';18import chaiAsPromised from 'chai-as-promised';19import privateKey from './substrate/privateKey';20import {21  default as usingApi, 22  submitTransactionAsync,23} from './substrate/substrate-api';24import {25  createItemExpectSuccess,26  createCollectionExpectSuccess,27  scheduleTransferExpectSuccess,28  scheduleTransferAndWaitExpectSuccess,29  setCollectionSponsorExpectSuccess,30  confirmSponsorshipExpectSuccess,31  findUnusedAddress,32  UNIQUE,33  enablePublicMintingExpectSuccess,34  addToAllowListExpectSuccess,35  waitNewBlocks,36  normalizeAccountId,37  getTokenOwner,38  getGenericResult,39  scheduleTransferFundsPeriodicExpectSuccess,40  getFreeBalance,41  confirmSponsorshipByKeyExpectSuccess,42  scheduleExpectFailure,43} from './util/helpers';44import {IKeyringPair} from '@polkadot/types/types';4546chai.use(chaiAsPromised);4748describe.skip('Scheduling token and balance transfers', () => {49  let alice: IKeyringPair;50  let bob: IKeyringPair;51  let scheduledIdBase: string;52  let scheduledIdSlider: number;5354  before(async() => {55    await usingApi(async (api, privateKeyWrapper) => {56      alice = privateKeyWrapper('//Alice');57      bob = privateKeyWrapper('//Bob');58    });5960    scheduledIdBase = '0x' + '0'.repeat(31);61    scheduledIdSlider = 0;62  });6364  // Loop scheduledId around 10. Unless there are concurrent tasks with long periods/repetitions, tests' tasks' ids shouldn't ovelap.65  function makeScheduledId(): string {66    return scheduledIdBase + ((scheduledIdSlider++) % 10);67  }6869  it('Can schedule a transfer of an owned token with delay', async () => {70    await usingApi(async () => {71      const nftCollectionId = await createCollectionExpectSuccess();72      const newNftTokenId = await createItemExpectSuccess(alice, nftCollectionId, 'NFT');73      await setCollectionSponsorExpectSuccess(nftCollectionId, alice.address);74      await confirmSponsorshipExpectSuccess(nftCollectionId);7576      await scheduleTransferAndWaitExpectSuccess(nftCollectionId, newNftTokenId, alice, bob, 1, 4, makeScheduledId());77    });78  });7980  it('Can transfer funds periodically', async () => {81    await usingApi(async () => {82      const waitForBlocks = 4;83      const period = 2;84      await scheduleTransferFundsPeriodicExpectSuccess(1n * UNIQUE, alice, bob, waitForBlocks, makeScheduledId(), period, 2);85      const bobsBalanceBefore = await getFreeBalance(bob);8687      // discounting already waited-for operations88      await waitNewBlocks(waitForBlocks - 2);89      const bobsBalanceAfterFirst = await getFreeBalance(bob);90      expect(bobsBalanceAfterFirst > bobsBalanceBefore).to.be.true;9192      await waitNewBlocks(period);93      const bobsBalanceAfterSecond = await getFreeBalance(bob);94      expect(bobsBalanceAfterSecond > bobsBalanceAfterFirst).to.be.true;95    });96  });9798  it('Can sponsor scheduling a transaction', async () => {99    const collectionId = await createCollectionExpectSuccess();100    await setCollectionSponsorExpectSuccess(collectionId, bob.address);101    await confirmSponsorshipExpectSuccess(collectionId, '//Bob');102103    await usingApi(async () => {104      const tokenId = await createItemExpectSuccess(alice, collectionId, 'NFT', alice.address);105106      const bobBalanceBefore = await getFreeBalance(bob);107      const waitForBlocks = 4;108      // no need to wait to check, fees must be deducted on scheduling, immediately109      await scheduleTransferExpectSuccess(collectionId, tokenId, alice, bob, 0, waitForBlocks, makeScheduledId());110      const bobBalanceAfter = await getFreeBalance(bob);111      // expect(aliceBalanceAfter == aliceBalanceBefore).to.be.true;112      expect(bobBalanceAfter < bobBalanceBefore).to.be.true;113      // wait for sequentiality matters114      await waitNewBlocks(waitForBlocks - 1);115    });116  });117118  it('Schedules and dispatches a transaction even if the caller has no funds at the time of the dispatch', async () => {119    await usingApi(async (api, privateKeyWrapper) => {120      // Find an empty, unused account121      const zeroBalance = await findUnusedAddress(api, privateKeyWrapper);122123      const collectionId = await createCollectionExpectSuccess();124125      // Add zeroBalance address to allow list126      await enablePublicMintingExpectSuccess(alice, collectionId);127      await addToAllowListExpectSuccess(alice, collectionId, zeroBalance.address);128129      // Grace zeroBalance with money, enough to cover future transactions130      const balanceTx = api.tx.balances.transfer(zeroBalance.address, 1n * UNIQUE);131      await submitTransactionAsync(alice, balanceTx);132133      // Mint a fresh NFT134      const tokenId = await createItemExpectSuccess(zeroBalance, collectionId, 'NFT');135136      // Schedule transfer of the NFT a few blocks ahead137      const waitForBlocks = 5;138      await scheduleTransferExpectSuccess(collectionId, tokenId, zeroBalance, alice, 1, waitForBlocks, makeScheduledId());139140      // Get rid of the account's funds before the scheduled transaction takes place141      const balanceTx2 = api.tx.balances.transfer(alice.address, UNIQUE * 68n / 100n);142      const events = await submitTransactionAsync(zeroBalance, balanceTx2);143      expect(getGenericResult(events).success).to.be.true;144      /*const emptyBalanceTx = api.tx.balances.setBalance(zeroBalance.address, 0, 0); // do not null reserved?145      const sudoTx = api.tx.sudo.sudo(emptyBalanceTx as any);146      const events = await submitTransactionAsync(alice, sudoTx);147      expect(getGenericResult(events).success).to.be.true;*/148149      // Wait for a certain number of blocks, discarding the ones that already happened while accepting the late transactions150      await waitNewBlocks(waitForBlocks - 3);151152      expect(await getTokenOwner(api, collectionId, tokenId)).to.be.deep.equal(normalizeAccountId(alice.address));153    });154  });155156  it('Sponsor going bankrupt does not impact a scheduled transaction', async () => {157    const collectionId = await createCollectionExpectSuccess();158159    await usingApi(async (api, privateKeyWrapper) => {160      const zeroBalance = await findUnusedAddress(api, privateKeyWrapper);161      const balanceTx = api.tx.balances.transfer(zeroBalance.address, 1n * UNIQUE);162      await submitTransactionAsync(alice, balanceTx);163164      await setCollectionSponsorExpectSuccess(collectionId, zeroBalance.address);165      await confirmSponsorshipByKeyExpectSuccess(collectionId, zeroBalance);166167      const tokenId = await createItemExpectSuccess(alice, collectionId, 'NFT', alice.address);168169      const waitForBlocks = 5;170      await scheduleTransferExpectSuccess(collectionId, tokenId, alice, zeroBalance, 1, waitForBlocks, makeScheduledId());171172      const emptyBalanceSponsorTx = api.tx.balances.setBalance(zeroBalance.address, 0, 0);173      const sudoTx = api.tx.sudo.sudo(emptyBalanceSponsorTx as any);174      const events = await submitTransactionAsync(alice, sudoTx);175      expect(getGenericResult(events).success).to.be.true;176177      // Wait for a certain number of blocks, save for the ones that already happened while accepting the late transactions178      await waitNewBlocks(waitForBlocks - 3);179180      expect(await getTokenOwner(api, collectionId, tokenId)).to.be.deep.equal(normalizeAccountId(zeroBalance.address));181    });182  });183184  it.skip('Exceeding sponsor rate limit without having enough funds prevents scheduling a periodic transaction', async () => {185    const collectionId = await createCollectionExpectSuccess();186    await setCollectionSponsorExpectSuccess(collectionId, bob.address);187    await confirmSponsorshipExpectSuccess(collectionId, '//Bob');188189    await usingApi(async (api, privateKeyWrapper) => {190      const zeroBalance = await findUnusedAddress(api, privateKeyWrapper);191192      await enablePublicMintingExpectSuccess(alice, collectionId);193      await addToAllowListExpectSuccess(alice, collectionId, zeroBalance.address);194195      const bobBalanceBefore = await getFreeBalance(bob);196197      const createData = {nft: {const_data: [], variable_data: []}};198      const creationTx = api.tx.unique.createItem(collectionId, normalizeAccountId(zeroBalance), createData as any);199200      /*const badTransaction = async function () {201        await submitTransactionExpectFailAsync(zeroBalance, zeroToAlice);202      };203      await expect(badTransaction()).to.be.rejectedWith('Inability to pay some fees');*/204205      await scheduleExpectFailure(creationTx, zeroBalance, 3, makeScheduledId(), 1, 3);206207      expect(await getFreeBalance(bob)).to.be.equal(bobBalanceBefore);208    });209  });210});
after · tests/src/scheduler.test.ts
1// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.2// This file is part of Unique Network.34// Unique Network is free software: you can redistribute it and/or modify5// it under the terms of the GNU General Public License as published by6// the Free Software Foundation, either version 3 of the License, or7// (at your option) any later version.89// Unique Network is distributed in the hope that it will be useful,10// but WITHOUT ANY WARRANTY; without even the implied warranty of11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the12// GNU General Public License for more details.1314// You should have received a copy of the GNU General Public License15// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.1617import chai, {expect} from 'chai';18import chaiAsPromised from 'chai-as-promised';19import {20  default as usingApi, 21  submitTransactionAsync,22} from './substrate/substrate-api';23import {24  createItemExpectSuccess,25  createCollectionExpectSuccess,26  scheduleTransferExpectSuccess,27  scheduleTransferAndWaitExpectSuccess,28  setCollectionSponsorExpectSuccess,29  confirmSponsorshipExpectSuccess,30  findUnusedAddress,31  UNIQUE,32  enablePublicMintingExpectSuccess,33  addToAllowListExpectSuccess,34  waitNewBlocks,35  normalizeAccountId,36  getTokenOwner,37  getGenericResult,38  scheduleTransferFundsPeriodicExpectSuccess,39  getFreeBalance,40  confirmSponsorshipByKeyExpectSuccess,41  scheduleExpectFailure,42} from './util/helpers';43import {IKeyringPair} from '@polkadot/types/types';4445chai.use(chaiAsPromised);4647describe.skip('Scheduling token and balance transfers', () => {48  let alice: IKeyringPair;49  let bob: IKeyringPair;50  let scheduledIdBase: string;51  let scheduledIdSlider: number;5253  before(async() => {54    await usingApi(async (api, privateKeyWrapper) => {55      alice = privateKeyWrapper('//Alice');56      bob = privateKeyWrapper('//Bob');57    });5859    scheduledIdBase = '0x' + '0'.repeat(31);60    scheduledIdSlider = 0;61  });6263  // Loop scheduledId around 10. Unless there are concurrent tasks with long periods/repetitions, tests' tasks' ids shouldn't ovelap.64  function makeScheduledId(): string {65    return scheduledIdBase + ((scheduledIdSlider++) % 10);66  }6768  it('Can schedule a transfer of an owned token with delay', async () => {69    await usingApi(async () => {70      const nftCollectionId = await createCollectionExpectSuccess();71      const newNftTokenId = await createItemExpectSuccess(alice, nftCollectionId, 'NFT');72      await setCollectionSponsorExpectSuccess(nftCollectionId, alice.address);73      await confirmSponsorshipExpectSuccess(nftCollectionId);7475      await scheduleTransferAndWaitExpectSuccess(nftCollectionId, newNftTokenId, alice, bob, 1, 4, makeScheduledId());76    });77  });7879  it('Can transfer funds periodically', async () => {80    await usingApi(async () => {81      const waitForBlocks = 4;82      const period = 2;83      await scheduleTransferFundsPeriodicExpectSuccess(1n * UNIQUE, alice, bob, waitForBlocks, makeScheduledId(), period, 2);84      const bobsBalanceBefore = await getFreeBalance(bob);8586      // discounting already waited-for operations87      await waitNewBlocks(waitForBlocks - 2);88      const bobsBalanceAfterFirst = await getFreeBalance(bob);89      expect(bobsBalanceAfterFirst > bobsBalanceBefore).to.be.true;9091      await waitNewBlocks(period);92      const bobsBalanceAfterSecond = await getFreeBalance(bob);93      expect(bobsBalanceAfterSecond > bobsBalanceAfterFirst).to.be.true;94    });95  });9697  it('Can sponsor scheduling a transaction', async () => {98    const collectionId = await createCollectionExpectSuccess();99    await setCollectionSponsorExpectSuccess(collectionId, bob.address);100    await confirmSponsorshipExpectSuccess(collectionId, '//Bob');101102    await usingApi(async () => {103      const tokenId = await createItemExpectSuccess(alice, collectionId, 'NFT', alice.address);104105      const bobBalanceBefore = await getFreeBalance(bob);106      const waitForBlocks = 4;107      // no need to wait to check, fees must be deducted on scheduling, immediately108      await scheduleTransferExpectSuccess(collectionId, tokenId, alice, bob, 0, waitForBlocks, makeScheduledId());109      const bobBalanceAfter = await getFreeBalance(bob);110      // expect(aliceBalanceAfter == aliceBalanceBefore).to.be.true;111      expect(bobBalanceAfter < bobBalanceBefore).to.be.true;112      // wait for sequentiality matters113      await waitNewBlocks(waitForBlocks - 1);114    });115  });116117  it('Schedules and dispatches a transaction even if the caller has no funds at the time of the dispatch', async () => {118    await usingApi(async (api, privateKeyWrapper) => {119      // Find an empty, unused account120      const zeroBalance = await findUnusedAddress(api, privateKeyWrapper);121122      const collectionId = await createCollectionExpectSuccess();123124      // Add zeroBalance address to allow list125      await enablePublicMintingExpectSuccess(alice, collectionId);126      await addToAllowListExpectSuccess(alice, collectionId, zeroBalance.address);127128      // Grace zeroBalance with money, enough to cover future transactions129      const balanceTx = api.tx.balances.transfer(zeroBalance.address, 1n * UNIQUE);130      await submitTransactionAsync(alice, balanceTx);131132      // Mint a fresh NFT133      const tokenId = await createItemExpectSuccess(zeroBalance, collectionId, 'NFT');134135      // Schedule transfer of the NFT a few blocks ahead136      const waitForBlocks = 5;137      await scheduleTransferExpectSuccess(collectionId, tokenId, zeroBalance, alice, 1, waitForBlocks, makeScheduledId());138139      // Get rid of the account's funds before the scheduled transaction takes place140      const balanceTx2 = api.tx.balances.transfer(alice.address, UNIQUE * 68n / 100n);141      const events = await submitTransactionAsync(zeroBalance, balanceTx2);142      expect(getGenericResult(events).success).to.be.true;143      /*const emptyBalanceTx = api.tx.balances.setBalance(zeroBalance.address, 0, 0); // do not null reserved?144      const sudoTx = api.tx.sudo.sudo(emptyBalanceTx as any);145      const events = await submitTransactionAsync(alice, sudoTx);146      expect(getGenericResult(events).success).to.be.true;*/147148      // Wait for a certain number of blocks, discarding the ones that already happened while accepting the late transactions149      await waitNewBlocks(waitForBlocks - 3);150151      expect(await getTokenOwner(api, collectionId, tokenId)).to.be.deep.equal(normalizeAccountId(alice.address));152    });153  });154155  it('Sponsor going bankrupt does not impact a scheduled transaction', async () => {156    const collectionId = await createCollectionExpectSuccess();157158    await usingApi(async (api, privateKeyWrapper) => {159      const zeroBalance = await findUnusedAddress(api, privateKeyWrapper);160      const balanceTx = api.tx.balances.transfer(zeroBalance.address, 1n * UNIQUE);161      await submitTransactionAsync(alice, balanceTx);162163      await setCollectionSponsorExpectSuccess(collectionId, zeroBalance.address);164      await confirmSponsorshipByKeyExpectSuccess(collectionId, zeroBalance);165166      const tokenId = await createItemExpectSuccess(alice, collectionId, 'NFT', alice.address);167168      const waitForBlocks = 5;169      await scheduleTransferExpectSuccess(collectionId, tokenId, alice, zeroBalance, 1, waitForBlocks, makeScheduledId());170171      const emptyBalanceSponsorTx = api.tx.balances.setBalance(zeroBalance.address, 0, 0);172      const sudoTx = api.tx.sudo.sudo(emptyBalanceSponsorTx as any);173      const events = await submitTransactionAsync(alice, sudoTx);174      expect(getGenericResult(events).success).to.be.true;175176      // Wait for a certain number of blocks, save for the ones that already happened while accepting the late transactions177      await waitNewBlocks(waitForBlocks - 3);178179      expect(await getTokenOwner(api, collectionId, tokenId)).to.be.deep.equal(normalizeAccountId(zeroBalance.address));180    });181  });182183  it.skip('Exceeding sponsor rate limit without having enough funds prevents scheduling a periodic transaction', async () => {184    const collectionId = await createCollectionExpectSuccess();185    await setCollectionSponsorExpectSuccess(collectionId, bob.address);186    await confirmSponsorshipExpectSuccess(collectionId, '//Bob');187188    await usingApi(async (api, privateKeyWrapper) => {189      const zeroBalance = await findUnusedAddress(api, privateKeyWrapper);190191      await enablePublicMintingExpectSuccess(alice, collectionId);192      await addToAllowListExpectSuccess(alice, collectionId, zeroBalance.address);193194      const bobBalanceBefore = await getFreeBalance(bob);195196      const createData = {nft: {const_data: [], variable_data: []}};197      const creationTx = api.tx.unique.createItem(collectionId, normalizeAccountId(zeroBalance), createData as any);198199      /*const badTransaction = async function () {200        await submitTransactionExpectFailAsync(zeroBalance, zeroToAlice);201      };202      await expect(badTransaction()).to.be.rejectedWith('Inability to pay some fees');*/203204      await scheduleExpectFailure(creationTx, zeroBalance, 3, makeScheduledId(), 1, 3);205206      expect(await getFreeBalance(bob)).to.be.equal(bobBalanceBefore);207    });208  });209});