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
--- a/tests/src/benchmarks/nesting/index.ts
+++ b/tests/src/benchmarks/nesting/index.ts
@@ -1,17 +1,11 @@
 import {EthUniqueHelper, usingEthPlaygrounds} from '../../eth/util';
 import {readFile} from 'fs/promises';
-import {
-  ICrossAccountId,
-} from '../../util/playgrounds/types';
 import {IKeyringPair} from '@polkadot/types/types';
-import {UniqueNFTCollection} from '../../util/playgrounds/unique';
 import {Contract} from 'web3-eth-contract';
-import {createObjectCsvWriter} from 'csv-writer';
-import {convertToTokens, createCollectionForBenchmarks, PERMISSIONS, PROPERTIES} from '../utils/common';
+import {convertToTokens} from '../utils/common';
 import {makeNames} from '../../util';
 import {ContractImports} from '../../eth/util/playgrounds/types';
 import {RMRKNestableMintable} from './ABIGEN';
-import {rm} from 'fs';
 
 const {dirname} = makeNames(import.meta.url);
 
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
before · tests/src/governance/technicalCommittee.test.ts
1import {IKeyringPair} from '@polkadot/types/types';2import {usingPlaygrounds, itSub, expect, Pallets, requirePalletsOrSkip, describeGov} from '../util';3import {Event} from '../util/playgrounds/unique.dev';4import {initCouncil, democracyLaunchPeriod, democracyFastTrackVotingPeriod, clearCouncil, clearTechComm, ITechComms, clearFellowship, defaultEnactmentMoment, dummyProposal, dummyProposalCall, fellowshipPropositionOrigin, initFellowship, initTechComm, hardResetFellowshipReferenda, hardResetDemocracy, hardResetGovScheduler} from './util';56describeGov('Governance: Technical Committee tests', () => {7  let sudoer: IKeyringPair;8  let techcomms: ITechComms;9  let donor: IKeyringPair;10  let preImageHash: string;111213  const allTechCommitteeThreshold = 3;1415  before(async function() {16    await usingPlaygrounds(async (helper, privateKey) => {17      requirePalletsOrSkip(this, helper, [Pallets.TechnicalCommittee]);18      sudoer = await privateKey('//Alice');19      donor = await privateKey({url: import.meta.url});2021      techcomms = await initTechComm(donor, sudoer);2223      const proposalCall = await helper.constructApiCall('api.tx.balances.forceSetBalance', [donor.address, 20n * 10n ** 25n]);24      preImageHash = await helper.preimage.notePreimageFromCall(sudoer, proposalCall, true);25    });26  });2728  after(async () => {29    await usingPlaygrounds(async (helper) => {30      await clearTechComm(sudoer);3132      await helper.preimage.unnotePreimage(sudoer, preImageHash);33      await hardResetFellowshipReferenda(sudoer);34      await hardResetDemocracy(sudoer);35      await hardResetGovScheduler(sudoer);36    });37  });3839  async function proposalFromAllCommittee(proposal: any) {40    return await usingPlaygrounds(async (helper) => {41      expect((await helper.callRpc('api.query.technicalCommitteeMembership.members')).toJSON().length).to.be.equal(allTechCommitteeThreshold);42      const proposeResult = await helper.technicalCommittee.collective.propose(43        techcomms.andy,44        proposal,45        allTechCommitteeThreshold,46      );4748      const commiteeProposedEvent = Event.TechnicalCommittee.Proposed.expect(proposeResult);49      const proposalIndex = commiteeProposedEvent.proposalIndex;50      const proposalHash = commiteeProposedEvent.proposalHash;515253      await helper.technicalCommittee.collective.vote(techcomms.andy, proposalHash, proposalIndex, true);54      await helper.technicalCommittee.collective.vote(techcomms.constantine, proposalHash, proposalIndex, true);55      await helper.technicalCommittee.collective.vote(techcomms.greg, proposalHash, proposalIndex, true);5657      return await helper.technicalCommittee.collective.close(techcomms.andy, proposalHash, proposalIndex);58    });59  }6061  itSub('TechComm can fast-track Democracy proposals', async ({helper}) => {62    const preimageHash = await helper.preimage.notePreimageFromCall(sudoer, dummyProposalCall(helper), true);63    await helper.wait.parachainBlockMultiplesOf(35n);6465    await helper.getSudo().democracy.externalProposeDefaultWithPreimage(sudoer, preimageHash);6667    await expect(proposalFromAllCommittee(helper.democracy.fastTrackCall(preimageHash, democracyFastTrackVotingPeriod, 0)))68      .to.be.fulfilled;69  });7071  itSub('TechComm can cancel Democracy proposals', async ({helper}) => {72    const proposeResult = await helper.getSudo().democracy.propose(sudoer, dummyProposalCall(helper), 0n);73    const proposalIndex = Event.Democracy.Proposed.expect(proposeResult).proposalIndex;7475    await expect(proposalFromAllCommittee(helper.democracy.cancelProposalCall(proposalIndex)))76      .to.be.fulfilled;77  });7879  itSub('TechComm can cancel ongoing Democracy referendums', async ({helper}) => {80    await helper.getSudo().democracy.externalProposeDefault(sudoer, dummyProposalCall(helper));81    const startedEvent = await helper.wait.expectEvent(democracyLaunchPeriod, Event.Democracy.Started);82    const referendumIndex = startedEvent.referendumIndex;8384    await expect(proposalFromAllCommittee(helper.democracy.emergencyCancelCall(referendumIndex)))85      .to.be.fulfilled;86  });878889  itSub('TechComm member can veto Democracy proposals', async ({helper}) => {90    const preimageHash = await helper.preimage.notePreimageFromCall(sudoer, dummyProposalCall(helper), true);91    await helper.getSudo().democracy.externalProposeDefaultWithPreimage(sudoer, preimageHash);9293    await expect(helper.technicalCommittee.collective.execute(94      techcomms.andy,95      helper.democracy.vetoExternalCall(preimageHash),96    )).to.be.fulfilled;97  });9899  itSub('TechComm can cancel Fellowship referendums', async ({helper}) => {100    const fellowship = await initFellowship(donor, sudoer);101    const fellowshipProposer = fellowship[5][0];102    const proposal = dummyProposal(helper);103104    const submitResult = await helper.fellowship.referenda.submit(105      fellowshipProposer,106      fellowshipPropositionOrigin,107      proposal,108      defaultEnactmentMoment,109    );110    const referendumIndex = Event.FellowshipReferenda.Submitted.expect(submitResult).referendumIndex;111    await expect(proposalFromAllCommittee(helper.fellowship.referenda.cancelCall(referendumIndex))).to.be.fulfilled;112  });113114  itSub.skip('TechComm member can add a Fellowship member', async ({helper}) => {115    const newFellowshipMember = helper.arrange.createEmptyAccount();116    await expect(helper.technicalCommittee.collective.execute(117      techcomms.andy,118      helper.fellowship.collective.addMemberCall(newFellowshipMember.address),119    )).to.be.fulfilled;120    const fellowshipMembers = (await helper.callRpc('api.query.fellowshipCollective.members')).toJSON();121    expect(fellowshipMembers).to.contains(newFellowshipMember.address);122    await clearFellowship(sudoer);123  });124125  itSub('[Negative] TechComm cannot submit regular democracy proposal', async ({helper}) => {126    const councilProposal = await helper.democracy.proposeCall(dummyProposalCall(helper), 0n);127128    await expect(proposalFromAllCommittee(councilProposal)).to.be.rejectedWith('BadOrigin');129  });130131  itSub('[Negative] TechComm cannot externally propose SuperMajorityAgainst', async ({helper}) => {132    const commiteeProposal = await helper.democracy.externalProposeDefaultCall(dummyProposalCall(helper));133134    await expect(proposalFromAllCommittee(commiteeProposal)).to.be.rejectedWith('BadOrigin');135  });136137  itSub('[Negative] TechComm cannot externally propose SimpleMajority', async ({helper}) => {138    const commiteeProposal = await helper.democracy.externalProposeMajorityCall(dummyProposalCall(helper));139140    await expect(proposalFromAllCommittee(commiteeProposal)).to.be.rejectedWith('BadOrigin');141  });142143  itSub('[Negative] TechComm cannot externally propose SuperMajorityApprove', async ({helper}) => {144    const commiteeProposal = await helper.democracy.externalProposeCall(dummyProposalCall(helper));145146    await expect(proposalFromAllCommittee(commiteeProposal)).to.be.rejectedWith('BadOrigin');147  });148149  itSub('[Negative] TechComm member cannot submit regular democracy proposal', async ({helper}) => {150    const memberProposal = await helper.democracy.proposeCall(dummyProposalCall(helper), 0n);151152    await expect(helper.technicalCommittee.collective.execute(153      techcomms.andy,154      memberProposal,155    )).to.be.rejectedWith('BadOrigin');156  });157158  itSub('[Negative] TechComm member cannot externally propose SuperMajorityAgainst', async ({helper}) => {159    const memberProposal = await helper.democracy.externalProposeDefaultCall(dummyProposalCall(helper));160161    await expect(helper.technicalCommittee.collective.execute(162      techcomms.andy,163      memberProposal,164    )).to.be.rejectedWith('BadOrigin');165  });166167  itSub('[Negative] TechComm member cannot externally propose SimpleMajority', async ({helper}) => {168    const memberProposal = await helper.democracy.externalProposeMajorityCall(dummyProposalCall(helper));169170    await expect(helper.technicalCommittee.collective.execute(171      techcomms.andy,172      memberProposal,173    )).to.be.rejectedWith('BadOrigin');174  });175176  itSub('[Negative] TechComm member cannot externally propose SuperMajorityApprove', async ({helper}) => {177    const memberProposal = await helper.democracy.externalProposeCall(dummyProposalCall(helper));178179    await expect(helper.technicalCommittee.collective.execute(180      techcomms.andy,181      memberProposal,182    )).to.be.rejectedWith('BadOrigin');183  });184185186  itSub.skip('[Negative] TechComm cannot promote/demote Fellowship member', async ({helper}) => {187188  });189190  itSub.skip('[Negative] TechComm member cannot promote/demote Fellowship member', async ({helper}) => {191192  });193194  itSub('[Negative] TechComm cannot add/remove a Council member', async ({helper}) => {195    const newCouncilMember = helper.arrange.createEmptyAccount();196    const addMemberProposal = helper.council.membership.addMemberCall(newCouncilMember.address);197    const removeMemberProposal = helper.council.membership.removeMemberCall(newCouncilMember.address);198199    await expect(proposalFromAllCommittee(addMemberProposal)).to.be.rejectedWith('BadOrigin');200    await expect(proposalFromAllCommittee(removeMemberProposal)).to.be.rejectedWith('BadOrigin');201  });202203  itSub('[Negative] TechComm member cannot add/remove a Council member', async ({helper}) => {204    const newCouncilMember = helper.arrange.createEmptyAccount();205    const addMemberProposal = helper.council.membership.addMemberCall(newCouncilMember.address);206    const removeMemberProposal = helper.council.membership.removeMemberCall(newCouncilMember.address);207208    await expect(helper.technicalCommittee.collective.execute(209      techcomms.andy,210      addMemberProposal,211    )).to.be.rejectedWith('BadOrigin');212    await expect(helper.technicalCommittee.collective.execute(213      techcomms.andy,214      removeMemberProposal,215    )).to.be.rejectedWith('BadOrigin');216  });217218  itSub('[Negative] TechComm cannot set/clear Council prime member', async ({helper}) => {219    const counselors = await initCouncil(donor, sudoer);220    const proposalForSet = await helper.council.membership.setPrimeCall(counselors.charu.address);221    const proposalForClear = await helper.council.membership.clearPrimeCall();222223    await expect(proposalFromAllCommittee(proposalForSet)).to.be.rejectedWith('BadOrigin');224    await expect(proposalFromAllCommittee(proposalForClear)).to.be.rejectedWith('BadOrigin');225    await clearCouncil(sudoer);226  });227228  itSub('[Negative] TechComm member cannot set/clear Council prime member', async ({helper}) => {229    const counselors = await initCouncil(donor, sudoer);230    const proposalForSet = await helper.council.membership.setPrimeCall(counselors.charu.address);231    const proposalForClear = await helper.council.membership.clearPrimeCall();232233    await expect(helper.technicalCommittee.collective.execute(234      techcomms.andy,235      proposalForSet,236    )).to.be.rejectedWith('BadOrigin');237    await expect(helper.technicalCommittee.collective.execute(238      techcomms.andy,239      proposalForClear,240    )).to.be.rejectedWith('BadOrigin');241    await clearCouncil(sudoer);242  });243244  itSub('[Negative] TechComm cannot add/remove a TechComm member', async ({helper}) => {245    const newCommMember = helper.arrange.createEmptyAccount();246    const addMemberProposal = helper.council.membership.addMemberCall(newCommMember.address);247    const removeMemberProposal = helper.council.membership.removeMemberCall(newCommMember.address);248249    await expect(proposalFromAllCommittee(addMemberProposal)).to.be.rejectedWith('BadOrigin');250    await expect(proposalFromAllCommittee(removeMemberProposal)).to.be.rejectedWith('BadOrigin');251  });252253  itSub('[Negative] TechComm member cannot add/remove a TechComm member', async ({helper}) => {254    const newCommMember = helper.arrange.createEmptyAccount();255    const addMemberProposal = helper.council.membership.addMemberCall(newCommMember.address);256    const removeMemberProposal = helper.council.membership.removeMemberCall(newCommMember.address);257258    await expect(helper.technicalCommittee.collective.execute(259      techcomms.andy,260      addMemberProposal,261    )).to.be.rejectedWith('BadOrigin');262    await expect(helper.technicalCommittee.collective.execute(263      techcomms.andy,264      removeMemberProposal,265    )).to.be.rejectedWith('BadOrigin');266  });267268  itSub('[Negative] TechComm cannot remove a Fellowship member', async ({helper}) => {269    const fellowship = await initFellowship(donor, sudoer);270271    await expect(proposalFromAllCommittee(helper.fellowship.collective.removeMemberCall(fellowship[5][0].address, 5))).to.be.rejectedWith('BadOrigin');272    await clearFellowship(sudoer);273  });274275  itSub('[Negative] TechComm member cannot remove a Fellowship member', async ({helper}) => {276    const fellowship = await initFellowship(donor, sudoer);277278    await expect(helper.technicalCommittee.collective.execute(279      techcomms.andy,280      helper.fellowship.collective.removeMemberCall(fellowship[5][0].address, 5),281    )).to.be.rejectedWith('BadOrigin');282    await clearFellowship(sudoer);283  });284285  itSub('[Negative] TechComm member cannot fast-track Democracy proposals', async ({helper}) => {286    const preimageHash = await helper.preimage.notePreimageFromCall(sudoer, dummyProposalCall(helper), true);287    await helper.getSudo().democracy.externalProposeDefaultWithPreimage(sudoer, preimageHash);288289    await expect(helper.technicalCommittee.collective.execute(290      techcomms.andy,291      helper.democracy.fastTrackCall(preimageHash, democracyFastTrackVotingPeriod, 0),292    )).to.be.rejectedWith('BadOrigin');293  });294295  itSub('[Negative] TechComm member cannot cancel Democracy proposals', async ({helper}) => {296    const proposeResult = await helper.getSudo().democracy.propose(sudoer, dummyProposalCall(helper), 0n);297    const proposalIndex = Event.Democracy.Proposed.expect(proposeResult).proposalIndex;298299    await expect(helper.technicalCommittee.collective.execute(300      techcomms.andy,301      helper.democracy.cancelProposalCall(proposalIndex),302    ))303      .to.be.rejectedWith('BadOrigin');304  });305306  itSub('[Negative] TechComm member cannot cancel ongoing Democracy referendums', async ({helper}) => {307    await helper.getSudo().democracy.externalProposeDefault(sudoer, dummyProposalCall(helper));308    const startedEvent = await helper.wait.expectEvent(democracyLaunchPeriod, Event.Democracy.Started);309    const referendumIndex = startedEvent.referendumIndex;310311    await expect(helper.technicalCommittee.collective.execute(312      techcomms.andy,313      helper.democracy.emergencyCancelCall(referendumIndex),314    )).to.be.rejectedWith('BadOrigin');315  });316317  itSub('[Negative] TechComm cannot blacklist Democracy proposals', async ({helper}) => {318    const preimageHash = await helper.preimage.notePreimageFromCall(sudoer, dummyProposalCall(helper), true);319    await helper.getSudo().democracy.externalProposeDefaultWithPreimage(sudoer, preimageHash);320321    await expect(proposalFromAllCommittee(helper.democracy.blacklistCall(preimageHash))).to.be.rejectedWith('BadOrigin');322  });323324  itSub('[Negative] TechComm member cannot blacklist Democracy proposals', async ({helper}) => {325    const preimageHash = await helper.preimage.notePreimageFromCall(sudoer, dummyProposalCall(helper), true);326    await helper.getSudo().democracy.externalProposeDefaultWithPreimage(sudoer, preimageHash);327328    await expect(helper.technicalCommittee.collective.execute(329      techcomms.andy,330      helper.democracy.blacklistCall(preimageHash),331    )).to.be.rejectedWith('BadOrigin');332  });333334  itSub.skip('[Negative] TechComm member cannot veto external Democracy proposals until the cool-off period pass', async ({helper}) => {335336  });337338  itSub('[Negative] TechComm member cannot cancel Fellowship referendums', async ({helper}) => {339    const fellowship = await initFellowship(donor, sudoer);340    const fellowshipProposer = fellowship[5][0];341    const proposal = dummyProposal(helper);342343    const submitResult = await helper.fellowship.referenda.submit(344      fellowshipProposer,345      fellowshipPropositionOrigin,346      proposal,347      defaultEnactmentMoment,348    );349350    const referendumIndex = Event.FellowshipReferenda.Submitted.expect(submitResult).referendumIndex;351352    await expect(helper.technicalCommittee.collective.execute(353      techcomms.andy,354      helper.fellowship.referenda.cancelCall(referendumIndex),355    )).to.be.rejectedWith('BadOrigin');356  });357358  itSub('[Negative] TechComm referendum cannot be closed until the voting threshold is met', async ({helper}) => {359    const committeeSize = (await helper.callRpc('api.query.technicalCommitteeMembership.members')).toJSON().length as any as number;360    expect(committeeSize).is.greaterThan(1);361    const proposeResult = await helper.technicalCommittee.collective.propose(362      techcomms.andy,363      dummyProposalCall(helper),364      committeeSize,365    );366367    const committeeProposedEvent = Event.TechnicalCommittee.Proposed.expect(proposeResult);368    const proposalIndex = committeeProposedEvent.proposalIndex;369    const proposalHash = committeeProposedEvent.proposalHash;370371    await helper.technicalCommittee.collective.vote(techcomms.constantine, proposalHash, proposalIndex, true);372373    await expect(helper.technicalCommittee.collective.close(techcomms.andy, proposalHash, proposalIndex)).to.be.rejectedWith('TooEarly');374  });375});
after · tests/src/governance/technicalCommittee.test.ts
1import {IKeyringPair} from '@polkadot/types/types';2import {usingPlaygrounds, itSub, expect, Pallets, requirePalletsOrSkip, describeGov} from '../util';3import {Event} from '../util/playgrounds/unique.dev';4import {initCouncil, democracyLaunchPeriod, democracyFastTrackVotingPeriod, clearCouncil, clearTechComm, ITechComms, clearFellowship, defaultEnactmentMoment, dummyProposal, dummyProposalCall, fellowshipPropositionOrigin, initFellowship, initTechComm, hardResetFellowshipReferenda, hardResetDemocracy, hardResetGovScheduler} from './util';56describeGov('Governance: Technical Committee tests', () => {7  let sudoer: IKeyringPair;8  let techcomms: ITechComms;9  let donor: IKeyringPair;10  let preImageHash: string;111213  const allTechCommitteeThreshold = 3;1415  before(async function() {16    await usingPlaygrounds(async (helper, privateKey) => {17      requirePalletsOrSkip(this, helper, [Pallets.TechnicalCommittee]);18      sudoer = await privateKey('//Alice');19      donor = await privateKey({url: import.meta.url});2021      techcomms = await initTechComm(donor, sudoer);2223      const proposalCall = await helper.constructApiCall('api.tx.balances.forceSetBalance', [donor.address, 20n * 10n ** 25n]);24      preImageHash = await helper.preimage.notePreimageFromCall(sudoer, proposalCall, true);25    });26  });2728  after(async () => {29    await usingPlaygrounds(async (helper) => {30      await clearTechComm(sudoer);3132      await helper.preimage.unnotePreimage(sudoer, preImageHash);33      await hardResetFellowshipReferenda(sudoer);34      await hardResetDemocracy(sudoer);35      await hardResetGovScheduler(sudoer);36    });37  });3839  function proposalFromAllCommittee(proposal: any) {40    return usingPlaygrounds(async (helper) => {41      expect((await helper.callRpc('api.query.technicalCommitteeMembership.members')).toJSON().length).to.be.equal(allTechCommitteeThreshold);42      const proposeResult = await helper.technicalCommittee.collective.propose(43        techcomms.andy,44        proposal,45        allTechCommitteeThreshold,46      );4748      const commiteeProposedEvent = Event.TechnicalCommittee.Proposed.expect(proposeResult);49      const proposalIndex = commiteeProposedEvent.proposalIndex;50      const proposalHash = commiteeProposedEvent.proposalHash;515253      await helper.technicalCommittee.collective.vote(techcomms.andy, proposalHash, proposalIndex, true);54      await helper.technicalCommittee.collective.vote(techcomms.constantine, proposalHash, proposalIndex, true);55      await helper.technicalCommittee.collective.vote(techcomms.greg, proposalHash, proposalIndex, true);5657      const closeResult = await helper.technicalCommittee.collective.close(techcomms.andy, proposalHash, proposalIndex);58      Event.TechnicalCommittee.Closed.expect(closeResult);59      Event.TechnicalCommittee.Approved.expect(closeResult);60      const {result} = Event.TechnicalCommittee.Executed.expect(closeResult);61      expect(result).to.eq('Ok');6263      return closeResult;64    });65  }6667  itSub('TechComm can fast-track Democracy proposals', async ({helper}) => {68    const preimageHash = await helper.preimage.notePreimageFromCall(sudoer, dummyProposalCall(helper), true);69    await helper.wait.parachainBlockMultiplesOf(35n);7071    await helper.getSudo().democracy.externalProposeDefaultWithPreimage(sudoer, preimageHash);7273    const fastTrackProposal = await proposalFromAllCommittee(helper.democracy.fastTrackCall(preimageHash, democracyFastTrackVotingPeriod, 0));74    Event.Democracy.Started.expect(fastTrackProposal);75  });7677  itSub('TechComm can cancel Democracy proposals', async ({helper}) => {78    const proposeResult = await helper.getSudo().democracy.propose(sudoer, dummyProposalCall(helper), 0n);79    const proposalIndex = Event.Democracy.Proposed.expect(proposeResult).proposalIndex;8081    const cancelProposal = await proposalFromAllCommittee(helper.democracy.cancelProposalCall(proposalIndex));82    Event.Democracy.ProposalCanceled.expect(cancelProposal);83  });8485  itSub('TechComm can cancel ongoing Democracy referendums', async ({helper}) => {86    await helper.getSudo().democracy.externalProposeDefault(sudoer, dummyProposalCall(helper));87    const startedEvent = await helper.wait.expectEvent(democracyLaunchPeriod, Event.Democracy.Started);88    const referendumIndex = startedEvent.referendumIndex;8990    const emergencyCancelProposal = await proposalFromAllCommittee(helper.democracy.emergencyCancelCall(referendumIndex));91    Event.Democracy.Cancelled.expect(emergencyCancelProposal);92  });9394  itSub('TechComm member can veto Democracy proposals', async ({helper}) => {95    const preimageHash = await helper.preimage.notePreimageFromCall(sudoer, dummyProposalCall(helper), true);96    await helper.getSudo().democracy.externalProposeDefaultWithPreimage(sudoer, preimageHash);9798    const vetoExternalCall = await helper.technicalCommittee.collective.execute(99      techcomms.andy,100      helper.democracy.vetoExternalCall(preimageHash),101    );102    Event.Democracy.Vetoed.expect(vetoExternalCall);103  });104105  itSub('TechComm can cancel Fellowship referendums', async ({helper}) => {106    const fellowship = await initFellowship(donor, sudoer);107    const fellowshipProposer = fellowship[5][0];108    const proposal = dummyProposal(helper);109110    const submitResult = await helper.fellowship.referenda.submit(111      fellowshipProposer,112      fellowshipPropositionOrigin,113      proposal,114      defaultEnactmentMoment,115    );116    const referendumIndex = Event.FellowshipReferenda.Submitted.expect(submitResult).referendumIndex;117    const cancelProposal = await proposalFromAllCommittee(helper.fellowship.referenda.cancelCall(referendumIndex));118    Event.FellowshipReferenda.Cancelled.expect(cancelProposal);119  });120121  itSub.skip('TechComm member can add a Fellowship member', async ({helper}) => {122    const newFellowshipMember = helper.arrange.createEmptyAccount();123    await expect(helper.technicalCommittee.collective.execute(124      techcomms.andy,125      helper.fellowship.collective.addMemberCall(newFellowshipMember.address),126    )).to.be.fulfilled;127    const fellowshipMembers = (await helper.callRpc('api.query.fellowshipCollective.members')).toJSON();128    expect(fellowshipMembers).to.contains(newFellowshipMember.address);129    await clearFellowship(sudoer);130  });131132  itSub('[Negative] TechComm cannot submit regular democracy proposal', async ({helper}) => {133    const councilProposal = await helper.democracy.proposeCall(dummyProposalCall(helper), 0n);134135    await expect(proposalFromAllCommittee(councilProposal)).to.be.rejectedWith('BadOrigin');136  });137138  itSub('[Negative] TechComm cannot externally propose SuperMajorityAgainst', async ({helper}) => {139    const commiteeProposal = await helper.democracy.externalProposeDefaultCall(dummyProposalCall(helper));140141    await expect(proposalFromAllCommittee(commiteeProposal)).to.be.rejectedWith('BadOrigin');142  });143144  itSub('[Negative] TechComm cannot externally propose SimpleMajority', async ({helper}) => {145    const commiteeProposal = await helper.democracy.externalProposeMajorityCall(dummyProposalCall(helper));146147    await expect(proposalFromAllCommittee(commiteeProposal)).to.be.rejectedWith('BadOrigin');148  });149150  itSub('[Negative] TechComm cannot externally propose SuperMajorityApprove', async ({helper}) => {151    const commiteeProposal = await helper.democracy.externalProposeCall(dummyProposalCall(helper));152153    await expect(proposalFromAllCommittee(commiteeProposal)).to.be.rejectedWith('BadOrigin');154  });155156  itSub('[Negative] TechComm member cannot submit regular democracy proposal', async ({helper}) => {157    const memberProposal = await helper.democracy.proposeCall(dummyProposalCall(helper), 0n);158159    await expect(helper.technicalCommittee.collective.execute(160      techcomms.andy,161      memberProposal,162    )).to.be.rejectedWith('BadOrigin');163  });164165  itSub('[Negative] TechComm member cannot externally propose SuperMajorityAgainst', async ({helper}) => {166    const memberProposal = await helper.democracy.externalProposeDefaultCall(dummyProposalCall(helper));167168    await expect(helper.technicalCommittee.collective.execute(169      techcomms.andy,170      memberProposal,171    )).to.be.rejectedWith('BadOrigin');172  });173174  itSub('[Negative] TechComm member cannot externally propose SimpleMajority', async ({helper}) => {175    const memberProposal = await helper.democracy.externalProposeMajorityCall(dummyProposalCall(helper));176177    await expect(helper.technicalCommittee.collective.execute(178      techcomms.andy,179      memberProposal,180    )).to.be.rejectedWith('BadOrigin');181  });182183  itSub('[Negative] TechComm member cannot externally propose SuperMajorityApprove', async ({helper}) => {184    const memberProposal = await helper.democracy.externalProposeCall(dummyProposalCall(helper));185186    await expect(helper.technicalCommittee.collective.execute(187      techcomms.andy,188      memberProposal,189    )).to.be.rejectedWith('BadOrigin');190  });191192193  itSub.skip('[Negative] TechComm cannot promote/demote Fellowship member', async ({helper}) => {194195  });196197  itSub.skip('[Negative] TechComm member cannot promote/demote Fellowship member', async ({helper}) => {198199  });200201  itSub('[Negative] TechComm cannot add/remove a Council member', async ({helper}) => {202    const newCouncilMember = helper.arrange.createEmptyAccount();203    const addMemberProposal = helper.council.membership.addMemberCall(newCouncilMember.address);204    const removeMemberProposal = helper.council.membership.removeMemberCall(newCouncilMember.address);205206    await expect(proposalFromAllCommittee(addMemberProposal)).to.be.rejectedWith('BadOrigin');207    await expect(proposalFromAllCommittee(removeMemberProposal)).to.be.rejectedWith('BadOrigin');208  });209210  itSub('[Negative] TechComm member cannot add/remove a Council member', async ({helper}) => {211    const newCouncilMember = helper.arrange.createEmptyAccount();212    const addMemberProposal = helper.council.membership.addMemberCall(newCouncilMember.address);213    const removeMemberProposal = helper.council.membership.removeMemberCall(newCouncilMember.address);214215    await expect(helper.technicalCommittee.collective.execute(216      techcomms.andy,217      addMemberProposal,218    )).to.be.rejectedWith('BadOrigin');219    await expect(helper.technicalCommittee.collective.execute(220      techcomms.andy,221      removeMemberProposal,222    )).to.be.rejectedWith('BadOrigin');223  });224225  itSub('[Negative] TechComm cannot set/clear Council prime member', async ({helper}) => {226    const counselors = await initCouncil(donor, sudoer);227    const proposalForSet = await helper.council.membership.setPrimeCall(counselors.charu.address);228    const proposalForClear = await helper.council.membership.clearPrimeCall();229230    await expect(proposalFromAllCommittee(proposalForSet)).to.be.rejectedWith('BadOrigin');231    await expect(proposalFromAllCommittee(proposalForClear)).to.be.rejectedWith('BadOrigin');232    await clearCouncil(sudoer);233  });234235  itSub('[Negative] TechComm member cannot set/clear Council prime member', async ({helper}) => {236    const counselors = await initCouncil(donor, sudoer);237    const proposalForSet = await helper.council.membership.setPrimeCall(counselors.charu.address);238    const proposalForClear = await helper.council.membership.clearPrimeCall();239240    await expect(helper.technicalCommittee.collective.execute(241      techcomms.andy,242      proposalForSet,243    )).to.be.rejectedWith('BadOrigin');244    await expect(helper.technicalCommittee.collective.execute(245      techcomms.andy,246      proposalForClear,247    )).to.be.rejectedWith('BadOrigin');248    await clearCouncil(sudoer);249  });250251  itSub('[Negative] TechComm cannot add/remove a TechComm member', async ({helper}) => {252    const newCommMember = helper.arrange.createEmptyAccount();253    const addMemberProposal = helper.council.membership.addMemberCall(newCommMember.address);254    const removeMemberProposal = helper.council.membership.removeMemberCall(newCommMember.address);255256    await expect(proposalFromAllCommittee(addMemberProposal)).to.be.rejectedWith('BadOrigin');257    await expect(proposalFromAllCommittee(removeMemberProposal)).to.be.rejectedWith('BadOrigin');258  });259260  itSub('[Negative] TechComm member cannot add/remove a TechComm member', async ({helper}) => {261    const newCommMember = helper.arrange.createEmptyAccount();262    const addMemberProposal = helper.council.membership.addMemberCall(newCommMember.address);263    const removeMemberProposal = helper.council.membership.removeMemberCall(newCommMember.address);264265    await expect(helper.technicalCommittee.collective.execute(266      techcomms.andy,267      addMemberProposal,268    )).to.be.rejectedWith('BadOrigin');269    await expect(helper.technicalCommittee.collective.execute(270      techcomms.andy,271      removeMemberProposal,272    )).to.be.rejectedWith('BadOrigin');273  });274275  itSub('[Negative] TechComm cannot remove a Fellowship member', async ({helper}) => {276    const fellowship = await initFellowship(donor, sudoer);277278    await expect(proposalFromAllCommittee(helper.fellowship.collective.removeMemberCall(fellowship[5][0].address, 5))).to.be.rejectedWith('BadOrigin');279    await clearFellowship(sudoer);280  });281282  itSub('[Negative] TechComm member cannot remove a Fellowship member', async ({helper}) => {283    const fellowship = await initFellowship(donor, sudoer);284285    await expect(helper.technicalCommittee.collective.execute(286      techcomms.andy,287      helper.fellowship.collective.removeMemberCall(fellowship[5][0].address, 5),288    )).to.be.rejectedWith('BadOrigin');289    await clearFellowship(sudoer);290  });291292  itSub('[Negative] TechComm member cannot fast-track Democracy proposals', async ({helper}) => {293    const preimageHash = await helper.preimage.notePreimageFromCall(sudoer, dummyProposalCall(helper), true);294    await helper.getSudo().democracy.externalProposeDefaultWithPreimage(sudoer, preimageHash);295296    await expect(helper.technicalCommittee.collective.execute(297      techcomms.andy,298      helper.democracy.fastTrackCall(preimageHash, democracyFastTrackVotingPeriod, 0),299    )).to.be.rejectedWith('BadOrigin');300  });301302  itSub('[Negative] TechComm member cannot cancel Democracy proposals', async ({helper}) => {303    const proposeResult = await helper.getSudo().democracy.propose(sudoer, dummyProposalCall(helper), 0n);304    const proposalIndex = Event.Democracy.Proposed.expect(proposeResult).proposalIndex;305306    await expect(helper.technicalCommittee.collective.execute(307      techcomms.andy,308      helper.democracy.cancelProposalCall(proposalIndex),309    ))310      .to.be.rejectedWith('BadOrigin');311  });312313  itSub('[Negative] TechComm member cannot cancel ongoing Democracy referendums', async ({helper}) => {314    await helper.getSudo().democracy.externalProposeDefault(sudoer, dummyProposalCall(helper));315    const startedEvent = await helper.wait.expectEvent(democracyLaunchPeriod, Event.Democracy.Started);316    const referendumIndex = startedEvent.referendumIndex;317318    await expect(helper.technicalCommittee.collective.execute(319      techcomms.andy,320      helper.democracy.emergencyCancelCall(referendumIndex),321    )).to.be.rejectedWith('BadOrigin');322  });323324  itSub('[Negative] TechComm cannot blacklist Democracy proposals', async ({helper}) => {325    const preimageHash = await helper.preimage.notePreimageFromCall(sudoer, dummyProposalCall(helper), true);326    await helper.getSudo().democracy.externalProposeDefaultWithPreimage(sudoer, preimageHash);327328    await expect(proposalFromAllCommittee(helper.democracy.blacklistCall(preimageHash))).to.be.rejectedWith('BadOrigin');329  });330331  itSub('[Negative] TechComm member cannot blacklist Democracy proposals', async ({helper}) => {332    const preimageHash = await helper.preimage.notePreimageFromCall(sudoer, dummyProposalCall(helper), true);333    await helper.getSudo().democracy.externalProposeDefaultWithPreimage(sudoer, preimageHash);334335    await expect(helper.technicalCommittee.collective.execute(336      techcomms.andy,337      helper.democracy.blacklistCall(preimageHash),338    )).to.be.rejectedWith('BadOrigin');339  });340341  itSub.skip('[Negative] TechComm member cannot veto external Democracy proposals until the cool-off period pass', async ({helper}) => {342343  });344345  itSub('[Negative] TechComm member cannot cancel Fellowship referendums', async ({helper}) => {346    const fellowship = await initFellowship(donor, sudoer);347    const fellowshipProposer = fellowship[5][0];348    const proposal = dummyProposal(helper);349350    const submitResult = await helper.fellowship.referenda.submit(351      fellowshipProposer,352      fellowshipPropositionOrigin,353      proposal,354      defaultEnactmentMoment,355    );356357    const referendumIndex = Event.FellowshipReferenda.Submitted.expect(submitResult).referendumIndex;358359    await expect(helper.technicalCommittee.collective.execute(360      techcomms.andy,361      helper.fellowship.referenda.cancelCall(referendumIndex),362    )).to.be.rejectedWith('BadOrigin');363  });364365  itSub('[Negative] TechComm referendum cannot be closed until the voting threshold is met', async ({helper}) => {366    const committeeSize = (await helper.callRpc('api.query.technicalCommitteeMembership.members')).toJSON().length as any as number;367    expect(committeeSize).is.greaterThan(1);368    const proposeResult = await helper.technicalCommittee.collective.propose(369      techcomms.andy,370      dummyProposalCall(helper),371      committeeSize,372    );373374    const committeeProposedEvent = Event.TechnicalCommittee.Proposed.expect(proposeResult);375    const proposalIndex = committeeProposedEvent.proposalIndex;376    const proposalHash = committeeProposedEvent.proposalHash;377378    await helper.technicalCommittee.collective.vote(techcomms.constantine, proposalHash, proposalIndex, true);379380    await expect(helper.technicalCommittee.collective.close(techcomms.andy, proposalHash, proposalIndex)).to.be.rejectedWith('TooEarly');381  });382});
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;