git.delta.rocks / unique-network / refs/commits / 3050b513cda0

difftreelog

test add event asserts (#982)

Max Andreev2023-09-06parent: #ec8104e.patch.diff
in: master
* add events asserts

* fix eslint

* eslint fix - unused vars

7 files changed

modifiedtests/src/benchmarks/nesting/index.tsdiffbeforeafterboth
before · tests/src/benchmarks/nesting/index.ts
1import {EthUniqueHelper, usingEthPlaygrounds} from '../../eth/util';2import {readFile} from 'fs/promises';3import {4  ICrossAccountId,5} from '../../util/playgrounds/types';6import {IKeyringPair} from '@polkadot/types/types';7import {UniqueNFTCollection} from '../../util/playgrounds/unique';8import {Contract} from 'web3-eth-contract';9import {createObjectCsvWriter} from 'csv-writer';10import {convertToTokens, createCollectionForBenchmarks, PERMISSIONS, PROPERTIES} from '../utils/common';11import {makeNames} from '../../util';12import {ContractImports} from '../../eth/util/playgrounds/types';13import {RMRKNestableMintable} from './ABIGEN';14import {rm} from 'fs';1516const {dirname} = makeNames(import.meta.url);1718export const CONTRACT_IMPORT: ContractImports[] = [19  {20    fsPath: `${dirname}/../../../node_modules/@rmrk-team/evm-contracts/contracts/RMRK/nestable/RMRKNestable.sol`,21    solPath: '@rmrk-team/evm-contracts/contracts/RMRK/nestable/RMRKNestable.sol',22  },23  {24    fsPath: `${dirname}/../../../node_modules/@rmrk-team/evm-contracts/contracts/RMRK/nestable/IERC6059.sol`,25    solPath: '@rmrk-team/evm-contracts/contracts/RMRK/nestable/IERC6059.sol',26  },27  {28    fsPath: `${dirname}/../../../node_modules/@rmrk-team/evm-contracts/contracts/RMRK/core/RMRKCore.sol`,29    solPath: '@rmrk-team/evm-contracts/contracts/RMRK/core/RMRKCore.sol',30  },31  {32    fsPath: `${dirname}/../../../node_modules/@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol`,33    solPath: '@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol',34  },35  {36    fsPath: `${dirname}/../../../node_modules/@openzeppelin/contracts/token/ERC721/IERC721.sol`,37    solPath: '@openzeppelin/contracts/token/ERC721/IERC721.sol',38  },39  {40    fsPath: `${dirname}/../../../node_modules/@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol`,41    solPath: '@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol',42  },43  {44    fsPath: `${dirname}/../../../node_modules/@openzeppelin/contracts/utils/Address.sol`,45    solPath: '@openzeppelin/contracts/utils/Address.sol',46  },47  {48    fsPath: `${dirname}/../../../node_modules/@openzeppelin/contracts/utils/Context.sol`,49    solPath: '@openzeppelin/contracts/utils/Context.sol',50  },51  {52    fsPath: `${dirname}/../../../node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol`,53    solPath: '@openzeppelin/contracts/utils/introspection/IERC165.sol',54  },55  {56    fsPath: `${dirname}/../../../node_modules/@rmrk-team/evm-contracts/contracts/RMRK/library/RMRKErrors.sol`,57    solPath: '@rmrk-team/evm-contracts/contracts/RMRK/library/RMRKErrors.sol',58  },59  {60    fsPath: `${dirname}/../../../node_modules/@rmrk-team/evm-contracts/contracts/RMRK/core/IRMRKCore.sol`,61    solPath: '@rmrk-team/evm-contracts/contracts/RMRK/core/IRMRKCore.sol',62  },63  {64    fsPath: `${dirname}/RMRKNestableMintable.sol`,65    solPath: 'RMRKNestableMintable.sol',66  },67];686970const main = async () => {7172  await usingEthPlaygrounds(async (helper, privateKey) => {7374    const donor = await privateKey('//Alice'); // Seed from account with balance on this network7576    const eth = await measureEth(helper, donor);77    const sub = await measureSub(helper, donor);78    const rmrk = await measureRMRK(helper, donor);79    console.table({susbtrate: sub, eth: eth, rmrk: rmrk});80  });81};8283async function measureRMRK(helper: EthUniqueHelper, donor: IKeyringPair) {84  const CONTRACT_SOURCE = (85    await readFile(`${dirname}/RMRKNestableMintable.sol`)86  ).toString();87  const RELAYER_SOURCE = (await readFile(`${dirname}/relayer.sol`)).toString();8889  const ethSigner = await helper.eth.createAccountWithBalance(donor);9091  const contract = await helper.ethContract.deployByCode(92    ethSigner,93    'RMRKNestableMintable',94    CONTRACT_SOURCE,95    CONTRACT_IMPORT,96    5000000,97  );9899  const relayer = await helper.ethContract.deployByCode(100    ethSigner,101    'Relayer',102    RELAYER_SOURCE,103    CONTRACT_IMPORT,104    5000000,105    [contract.options.address],106  );107108  const relayerAddress = relayer.options.address;109110  const rmrk = contract as any as RMRKNestableMintable;111  const createTokenFor = async (receiver: string) => {112    const tokenReceipt = await rmrk.methods.safeMint(receiver).send({from: ethSigner});113    return tokenReceipt.events!['Transfer'].returnValues.tokenId as number;114  };115116117  const nestId = await createTokenFor(ethSigner);118  const outerCollectionNestedId = 10;119  const contractOwnedNestId = await createTokenFor(relayerAddress);120  const nextTokenId = contractOwnedNestId + 1;121122  const nestTransfer = await helper.arrange.calculcateFee({Ethereum: ethSigner}, async () => {123    const addChildData = rmrk.methods.addChild(nestId, outerCollectionNestedId, []).encodeABI();124    await relayer.methods.relay(addChildData).send({from: ethSigner});125    await rmrk.methods.acceptChild(nestId, 0, relayerAddress, outerCollectionNestedId).send({from: ethSigner});126  });127128129  const nestMint = await helper.arrange.calculcateFee({Ethereum: ethSigner}, async () => {130    const nestMintData = rmrk.methods.nestMint(rmrk.options.address, nextTokenId, contractOwnedNestId).encodeABI();131    await relayer.methods.relay(nestMintData).send({from: ethSigner});132    const acceptNestedToken = rmrk.methods.acceptChild(contractOwnedNestId, 0, rmrk.options.address, nextTokenId).encodeABI();133    await relayer.methods.relay(acceptNestedToken).send({from: ethSigner});134  });135136137  const unnestToken = await helper.arrange.calculcateFee({Ethereum: ethSigner}, async () => {138    const unnestData = rmrk.methods.transferChild(contractOwnedNestId, ethSigner, 0, 0, rmrk.options.address, nextTokenId, false, []).encodeABI();139    await relayer.methods.relay(unnestData).send({from: ethSigner});140  });141142  return {mint: convertToTokens(nestMint), transfer: convertToTokens(nestTransfer), unnest: convertToTokens(unnestToken)};143}144145async function measureEth(helper: EthUniqueHelper, donor: IKeyringPair) {146  const owner = await helper.eth.createAccountWithBalance(donor);147  const {collectionId, contract} = await createNestingCollection(helper, owner);148149  // Create a token to be nested to150  const mintingTargetNFTTokenIdResult = await contract.methods.mint(owner).send({from: owner});151  const targetNFTTokenId = mintingTargetNFTTokenIdResult.events.Transfer.returnValues.tokenId;152  const targetNftTokenAddress = helper.ethAddress.fromTokenId(collectionId, targetNFTTokenId);153154  // Create a nested token155  const nestMint = await helper.arrange.calculcateFee({Ethereum: owner}, async () => {156    await contract.methods.mint(targetNftTokenAddress).send({from: owner});157  });158159  // Create a token to be nested and nest160  const mintingSecondTokenIdResult = await contract.methods.mint(owner).send({from: owner});161  const nestedTokenId = mintingSecondTokenIdResult.events.Transfer.returnValues.tokenId;162163  const nestTransfer = await helper.arrange.calculcateFee({Ethereum: owner}, async () => {164    await contract.methods.transfer(targetNftTokenAddress, nestedTokenId).send({from: owner});165  });166167  const unnestToken = await helper.arrange.calculcateFee({Ethereum: owner}, async () => {168    await contract.methods.transferFrom(targetNftTokenAddress, owner, nestedTokenId).send({from: owner});169  });170  return {mint: convertToTokens(nestMint), transfer: convertToTokens(nestTransfer), unnest: convertToTokens(unnestToken)};171}172173async function measureSub(helper: EthUniqueHelper, donor: IKeyringPair) {174175  const [alice, bob] = await helper.arrange.createAccounts([100n, 100n], donor);176177  const targetNFTCollection = await helper.nft.mintCollection(alice);178  const targetTokenBob = await targetNFTCollection.mintToken(alice, {Substrate: bob.address});179180181  const collectionForNesting = await helper.nft.mintCollection(bob);182  // permissions should be set:183  await targetNFTCollection.setPermissions(alice, {184    nesting: {tokenOwner: true},185  });186187  const nestMint = await helper.arrange.calculcateFee({Substrate: bob.address}, async () => {188    await (collectionForNesting.mintToken(bob, targetTokenBob.nestingAccount()));189  });190191  const nestedToken2 = await collectionForNesting.mintToken(bob);192  const nestTransfer = await helper.arrange.calculcateFee({Substrate: bob.address}, async () => {193    await nestedToken2.nest(bob, targetTokenBob);194  });195196  const unnestToken = await helper.arrange.calculcateFee({Substrate: bob.address}, async () => {197    await nestedToken2.transferFrom(bob, targetTokenBob.nestingAccount(), {Substrate: bob.address});198  });199200  return {mint: convertToTokens(nestMint), transfer: convertToTokens(nestTransfer), unnest: convertToTokens(unnestToken)};201}202203204const createNestingCollection = async (205  helper: EthUniqueHelper,206  owner: string,207): Promise<{ collectionId: number, collectionAddress: string, contract: Contract }> => {208  const {collectionAddress, collectionId} = await helper.eth.createNFTCollection(owner, 'A', 'B', 'C');209210  const contract =  helper.ethNativeContract.collection(collectionAddress, 'nft', owner);211  await contract.methods.setCollectionNesting(true).send({from: owner});212213  return {collectionId, collectionAddress, contract};214};215216main()217  .then(() => process.exit(0))218  .catch((e) => {219    console.log(e);220    process.exit(1);221  });222223224225226227
modifiedtests/src/eth/nesting/nest.test.tsdiffbeforeafterboth
--- a/tests/src/eth/nesting/nest.test.ts
+++ b/tests/src/eth/nesting/nest.test.ts
@@ -162,7 +162,7 @@
       const malignant = await helper.eth.createAccountWithBalance(donor);
 
       const {collectionId: collectionIdA, contract: contractA} = await createNestingCollection(helper, owner);
-      const {collectionId: collectionIdB, contract: contractB} = await createNestingCollection(helper, owner);
+      const {contract: contractB} = await createNestingCollection(helper, owner);
 
       await contractA.methods.setCollectionNesting([true, false, [contractA.options.address, contractB.options.address]]).send({from: owner});
 
modifiedtests/src/fetchMetadata.tsdiffbeforeafterboth
--- a/tests/src/fetchMetadata.ts
+++ b/tests/src/fetchMetadata.ts
@@ -1,16 +1,16 @@
-import { writeFile } from "fs/promises";
-import { join } from "path";
-import { exit } from "process";
-import { fileURLToPath } from "url";
+import {writeFile} from 'fs/promises';
+import {join} from 'path';
+import {exit} from 'process';
+import {fileURLToPath} from 'url';
 
 const url = process.env.RPC_URL;
-if (!url) throw new Error('RPC_URL is not set');
+if(!url) throw new Error('RPC_URL is not set');
 
 const srcDir = fileURLToPath(new URL('.', import.meta.url));
 
-for (let i = 0; i < 10; i++) {
+for(let i = 0; i < 10; i++) {
   try {
-    console.log(`Trying to fetch metadata, retry ${i + 1}/${10}`)
+    console.log(`Trying to fetch metadata, retry ${i + 1}/${10}`);
     const response = await fetch(url, {
       method: 'POST',
       headers: {
modifiedtests/src/governance/technicalCommittee.test.tsdiffbeforeafterboth
--- a/tests/src/governance/technicalCommittee.test.ts
+++ b/tests/src/governance/technicalCommittee.test.ts
@@ -36,8 +36,8 @@
     });
   });
 
-  async function proposalFromAllCommittee(proposal: any) {
-    return await usingPlaygrounds(async (helper) => {
+  function proposalFromAllCommittee(proposal: any) {
+    return usingPlaygrounds(async (helper) => {
       expect((await helper.callRpc('api.query.technicalCommitteeMembership.members')).toJSON().length).to.be.equal(allTechCommitteeThreshold);
       const proposeResult = await helper.technicalCommittee.collective.propose(
         techcomms.andy,
@@ -54,7 +54,13 @@
       await helper.technicalCommittee.collective.vote(techcomms.constantine, proposalHash, proposalIndex, true);
       await helper.technicalCommittee.collective.vote(techcomms.greg, proposalHash, proposalIndex, true);
 
-      return await helper.technicalCommittee.collective.close(techcomms.andy, proposalHash, proposalIndex);
+      const closeResult = await helper.technicalCommittee.collective.close(techcomms.andy, proposalHash, proposalIndex);
+      Event.TechnicalCommittee.Closed.expect(closeResult);
+      Event.TechnicalCommittee.Approved.expect(closeResult);
+      const {result} = Event.TechnicalCommittee.Executed.expect(closeResult);
+      expect(result).to.eq('Ok');
+
+      return closeResult;
     });
   }
 
@@ -64,16 +70,16 @@
 
     await helper.getSudo().democracy.externalProposeDefaultWithPreimage(sudoer, preimageHash);
 
-    await expect(proposalFromAllCommittee(helper.democracy.fastTrackCall(preimageHash, democracyFastTrackVotingPeriod, 0)))
-      .to.be.fulfilled;
+    const fastTrackProposal = await proposalFromAllCommittee(helper.democracy.fastTrackCall(preimageHash, democracyFastTrackVotingPeriod, 0));
+    Event.Democracy.Started.expect(fastTrackProposal);
   });
 
   itSub('TechComm can cancel Democracy proposals', async ({helper}) => {
     const proposeResult = await helper.getSudo().democracy.propose(sudoer, dummyProposalCall(helper), 0n);
     const proposalIndex = Event.Democracy.Proposed.expect(proposeResult).proposalIndex;
 
-    await expect(proposalFromAllCommittee(helper.democracy.cancelProposalCall(proposalIndex)))
-      .to.be.fulfilled;
+    const cancelProposal = await proposalFromAllCommittee(helper.democracy.cancelProposalCall(proposalIndex));
+    Event.Democracy.ProposalCanceled.expect(cancelProposal);
   });
 
   itSub('TechComm can cancel ongoing Democracy referendums', async ({helper}) => {
@@ -81,19 +87,19 @@
     const startedEvent = await helper.wait.expectEvent(democracyLaunchPeriod, Event.Democracy.Started);
     const referendumIndex = startedEvent.referendumIndex;
 
-    await expect(proposalFromAllCommittee(helper.democracy.emergencyCancelCall(referendumIndex)))
-      .to.be.fulfilled;
+    const emergencyCancelProposal = await proposalFromAllCommittee(helper.democracy.emergencyCancelCall(referendumIndex));
+    Event.Democracy.Cancelled.expect(emergencyCancelProposal);
   });
-
 
   itSub('TechComm member can veto Democracy proposals', async ({helper}) => {
     const preimageHash = await helper.preimage.notePreimageFromCall(sudoer, dummyProposalCall(helper), true);
     await helper.getSudo().democracy.externalProposeDefaultWithPreimage(sudoer, preimageHash);
 
-    await expect(helper.technicalCommittee.collective.execute(
+    const vetoExternalCall = await helper.technicalCommittee.collective.execute(
       techcomms.andy,
       helper.democracy.vetoExternalCall(preimageHash),
-    )).to.be.fulfilled;
+    );
+    Event.Democracy.Vetoed.expect(vetoExternalCall);
   });
 
   itSub('TechComm can cancel Fellowship referendums', async ({helper}) => {
@@ -108,7 +114,8 @@
       defaultEnactmentMoment,
     );
     const referendumIndex = Event.FellowshipReferenda.Submitted.expect(submitResult).referendumIndex;
-    await expect(proposalFromAllCommittee(helper.fellowship.referenda.cancelCall(referendumIndex))).to.be.fulfilled;
+    const cancelProposal = await proposalFromAllCommittee(helper.fellowship.referenda.cancelCall(referendumIndex));
+    Event.FellowshipReferenda.Cancelled.expect(cancelProposal);
   });
 
   itSub.skip('TechComm member can add a Fellowship member', async ({helper}) => {
modifiedtests/src/maintenance.seqtest.tsdiffbeforeafterboth
--- a/tests/src/maintenance.seqtest.ts
+++ b/tests/src/maintenance.seqtest.ts
@@ -18,7 +18,6 @@
 import {ApiPromise} from '@polkadot/api';
 import {expect, itSched, itSub, Pallets, requirePalletsOrSkip, usingPlaygrounds} from './util';
 import {itEth} from './eth/util';
-import {UniqueHelper} from './util/playgrounds/unique';
 import {main as correctState} from './migrations/correctStateAfterMaintenance';
 
 async function maintenanceEnabled(api: ApiPromise): Promise<boolean> {
modifiedtests/src/util/playgrounds/unique.dev.tsdiffbeforeafterboth
--- a/tests/src/util/playgrounds/unique.dev.ts
+++ b/tests/src/util/playgrounds/unique.dev.ts
@@ -174,6 +174,20 @@
     static Passed = this.Method('Passed', data => ({
       referendumIndex: eventJsonData<number>(data, 0),
     }));
+
+    static ProposalCanceled = this.Method('ProposalCanceled', data => ({
+      propIndex: eventJsonData<number>(data, 0),
+    }));
+
+    static Cancelled = this.Method('Cancelled', data => ({
+      propIndex: eventJsonData<number>(data, 0),
+    }));
+
+    static Vetoed = this.Method('Vetoed', data => ({
+      who: eventHumanData(data, 0),
+      proposalHash: eventHumanData(data, 1),
+      until: eventJsonData<number>(data, 1),
+    }));
   };
 
   static Council = class extends EventSection('council') {
@@ -188,6 +202,9 @@
       yes: eventJsonData<number>(data, 1),
       no: eventJsonData<number>(data, 2),
     }));
+    static Executed = this.Method('Executed', data => ({
+      proposalHash: eventHumanData(data, 0),
+    }));
   };
 
   static TechnicalCommittee = class extends EventSection('technicalCommittee') {
@@ -202,6 +219,13 @@
       yes: eventJsonData<number>(data, 1),
       no: eventJsonData<number>(data, 2),
     }));
+    static Approved = this.Method('Approved', data => ({
+      proposalHash: eventHumanData(data, 0),
+    }));
+    static Executed = this.Method('Executed', data => ({
+      proposalHash: eventHumanData(data, 0),
+      result: eventHumanData(data, 1),
+    }));
   };
 
   static FellowshipReferenda = class extends EventSection('fellowshipReferenda') {
@@ -210,6 +234,11 @@
       trackId: eventJsonData<number>(data, 1),
       proposal: eventJsonData(data, 2),
     }));
+
+    static Cancelled = this.Method('Cancelled', data => ({
+      index: eventJsonData<number>(data, 0),
+      tally: eventJsonData(data, 1),
+    }));
   };
 
   static UniqueScheduler = schedulerSection('uniqueScheduler');
modifiedtests/src/util/playgrounds/unique.tsdiffbeforeafterboth
--- a/tests/src/util/playgrounds/unique.ts
+++ b/tests/src/util/playgrounds/unique.ts
@@ -44,15 +44,11 @@
   MoonbeamAssetInfo,
   DemocracyStandardAccountVote,
   IEthCrossAccountId,
-  CollectionFlag,
   IPhasicEvent,
-  DemocracySplitAccount,
 } from './types';
 import {RuntimeDispatchInfo} from '@polkadot/types/interfaces';
 import type {Vec} from '@polkadot/types-codec';
-import {FrameSupportPreimagesBounded, FrameSupportScheduleDispatchTime, FrameSystemEventRecord, PalletBalancesIdAmount, PalletDemocracyConviction, PalletDemocracyVoteAccountVote} from '@polkadot/types/lookup';
-import {arrayUnzip} from '@polkadot/util';
-import {Event} from './unique.dev';
+import {FrameSystemEventRecord, PalletDemocracyConviction} from '@polkadot/types/lookup';
 
 export class CrossAccountId {
   Substrate!: TSubstrateAccount;