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

difftreelog

Merge pull request #1078 from UniqueNetwork/fix/gov-tests-1.9

Yaroslav Bolyukin2024-07-16parents: #f48afb4 #05c81ca.patch.diff
in: master

2 files changed

modifiedjs-packages/tests/sub/governance/council.test.tsdiffbeforeafterboth
--- a/js-packages/tests/sub/governance/council.test.ts
+++ b/js-packages/tests/sub/governance/council.test.ts
@@ -211,14 +211,14 @@
     expect(finCouncilMembers).to.contains(newFinCouncilMember.address);
   });
 
-  itSub.skip('Council member can add Fellowship member', async ({helper}) => {
+  itSub('Council member can add Fellowship member', async ({helper}) => {
     const newFellowshipMember = helper.arrange.createEmptyAccount();
     await expect(helper.council.collective.execute(
       counselors.alex,
       helper.fellowship.collective.addMemberCall(newFellowshipMember.address),
     )).to.be.fulfilled;
-    const fellowshipMembers = (await helper.callRpc('api.query.fellowshipCollective.members')).toJSON();
-    expect(fellowshipMembers).to.contains(newFellowshipMember.address);
+    expect(await helper.fellowship.collective.getMembers()).to.be.deep.contain(newFellowshipMember.address);
+    await clearFellowship(sudoer);
   });
 
   itSub('>50% Council can promote Fellowship member', async ({helper}) => {
@@ -246,16 +246,14 @@
     await clearFellowship(sudoer);
   });
 
-  itSub('>50% Council can add\remove Fellowship member', async ({helper}) => {
+  itSub('>50% Council can remove Fellowship member', async ({helper}) => {
     try {
-      const newMember = helper.arrange.createEmptyAccount();
+      const fellowship = await initFellowship(donor, sudoer);
+      const memberRank6 = fellowship[6][0];
 
-      const proposalAdd = helper.fellowship.collective.addMemberCall(newMember.address);
-      const proposalRemove = helper.fellowship.collective.removeMemberCall(newMember.address, fellowshipRankLimit);
-      await expect(proposalFromMoreThanHalfCouncil(proposalAdd)).to.be.fulfilled;
-      expect(await helper.fellowship.collective.getMembers()).to.be.deep.contain(newMember.address);
+      const proposalRemove = helper.fellowship.collective.removeMemberCall(memberRank6.address, fellowshipRankLimit);
       await expect(proposalFromMoreThanHalfCouncil(proposalRemove)).to.be.fulfilled;
-      expect(await helper.fellowship.collective.getMembers()).to.be.not.deep.contain(newMember.address);
+      expect(await helper.fellowship.collective.getMembers()).to.be.not.deep.contain(memberRank6.address);
     }
     finally {
       await clearFellowship(sudoer);
modifiedjs-packages/tests/sub/governance/technicalCommittee.test.tsdiffbeforeafterboth
after · js-packages/tests/sub/governance/technicalCommittee.test.ts
1import type {IKeyringPair} from '@polkadot/types/types';2import {usingPlaygrounds, itSub, expect, Pallets, requirePalletsOrSkip, describeGov} from '@unique/test-utils/util.js';3import {Event} from '@unique/test-utils';4import {initCouncil, democracyLaunchPeriod, democracyFastTrackVotingPeriod, clearCouncil, clearTechComm, clearFellowship, defaultEnactmentMoment, dummyProposal, dummyProposalCall, fellowshipPropositionOrigin, initFellowship, initTechComm, hardResetFellowshipReferenda, hardResetDemocracy, hardResetGovScheduler} from './util.js';5import type {ITechComms} from './util.js';67describeGov('Governance: Technical Committee tests', () => {8  let sudoer: IKeyringPair;9  let techcomms: ITechComms;10  let donor: IKeyringPair;11  let preImageHash: string;121314  const allTechCommitteeThreshold = 3;1516  before(async function() {17    await usingPlaygrounds(async (helper, privateKey) => {18      requirePalletsOrSkip(this, helper, [Pallets.TechnicalCommittee]);19      sudoer = await privateKey('//Alice');20      donor = await privateKey({url: import.meta.url});2122      techcomms = await initTechComm(donor, sudoer);2324      const proposalCall = await helper.constructApiCall('api.tx.balances.forceSetBalance', [donor.address, 20n * 10n ** 25n]);25      preImageHash = await helper.preimage.notePreimageFromCall(sudoer, proposalCall, true);26    });27  });2829  after(async () => {30    await usingPlaygrounds(async (helper) => {31      await clearTechComm(sudoer);3233      await helper.preimage.unnotePreimage(sudoer, preImageHash);34      await hardResetFellowshipReferenda(sudoer);35      await hardResetDemocracy(sudoer);36      await hardResetGovScheduler(sudoer);37    });38  });3940  function proposalFromAllCommittee(proposal: any) {41    return usingPlaygrounds(async (helper) => {42      expect((await helper.callRpc('api.query.technicalCommitteeMembership.members')).toJSON().length).to.be.equal(allTechCommitteeThreshold);43      const proposeResult = await helper.technicalCommittee.collective.propose(44        techcomms.andy,45        proposal,46        allTechCommitteeThreshold,47      );4849      const commiteeProposedEvent = Event.TechnicalCommittee.Proposed.expect(proposeResult);50      const proposalIndex = commiteeProposedEvent.proposalIndex;51      const proposalHash = commiteeProposedEvent.proposalHash;525354      await helper.technicalCommittee.collective.vote(techcomms.andy, proposalHash, proposalIndex, true);55      await helper.technicalCommittee.collective.vote(techcomms.constantine, proposalHash, proposalIndex, true);56      await helper.technicalCommittee.collective.vote(techcomms.greg, proposalHash, proposalIndex, true);5758      const closeResult = await helper.technicalCommittee.collective.close(techcomms.andy, proposalHash, proposalIndex);59      Event.TechnicalCommittee.Closed.expect(closeResult);60      Event.TechnicalCommittee.Approved.expect(closeResult);61      const {result} = Event.TechnicalCommittee.Executed.expect(closeResult);62      expect(result).to.eq('Ok');6364      return closeResult;65    });66  }6768  itSub('TechComm can fast-track Democracy proposals', async ({helper}) => {69    const preimageHash = await helper.preimage.notePreimageFromCall(sudoer, dummyProposalCall(helper), true);70    await helper.wait.parachainBlockMultiplesOf(35n);7172    await helper.getSudo().democracy.externalProposeDefaultWithPreimage(sudoer, preimageHash);7374    const fastTrackProposal = await proposalFromAllCommittee(helper.democracy.fastTrackCall(preimageHash, democracyFastTrackVotingPeriod, 0));75    Event.Democracy.Started.expect(fastTrackProposal);76  });7778  itSub('TechComm can cancel Democracy proposals', async ({helper}) => {79    const proposeResult = await helper.getSudo().democracy.propose(sudoer, dummyProposalCall(helper), 0n);80    const proposalIndex = Event.Democracy.Proposed.expect(proposeResult).proposalIndex;8182    const cancelProposal = await proposalFromAllCommittee(helper.democracy.cancelProposalCall(proposalIndex));83    Event.Democracy.ProposalCanceled.expect(cancelProposal);84  });8586  itSub('TechComm can cancel ongoing Democracy referendums', async ({helper}) => {87    await helper.getSudo().democracy.externalProposeDefault(sudoer, dummyProposalCall(helper));88    const startedEvent = await helper.wait.expectEvent(democracyLaunchPeriod, Event.Democracy.Started);89    const referendumIndex = startedEvent.referendumIndex;9091    const emergencyCancelProposal = await proposalFromAllCommittee(helper.democracy.emergencyCancelCall(referendumIndex));92    Event.Democracy.Cancelled.expect(emergencyCancelProposal);93  });9495  itSub('TechComm member can veto Democracy proposals', async ({helper}) => {96    const preimageHash = await helper.preimage.notePreimageFromCall(sudoer, dummyProposalCall(helper), true);97    await helper.getSudo().democracy.externalProposeDefaultWithPreimage(sudoer, preimageHash);9899    const vetoExternalCall = await helper.technicalCommittee.collective.execute(100      techcomms.andy,101      helper.democracy.vetoExternalCall(preimageHash),102    );103    Event.Democracy.Vetoed.expect(vetoExternalCall);104  });105106  itSub('TechComm can cancel Fellowship referendums', async ({helper}) => {107    const fellowship = await initFellowship(donor, sudoer);108    const fellowshipProposer = fellowship[5][0];109    const proposal = dummyProposal(helper);110111    const submitResult = await helper.fellowship.referenda.submit(112      fellowshipProposer,113      fellowshipPropositionOrigin,114      proposal,115      defaultEnactmentMoment,116    );117    const referendumIndex = Event.FellowshipReferenda.Submitted.expect(submitResult).referendumIndex;118    const cancelProposal = await proposalFromAllCommittee(helper.fellowship.referenda.cancelCall(referendumIndex));119    Event.FellowshipReferenda.Cancelled.expect(cancelProposal);120  });121122  itSub('TechComm member can add a Fellowship member', async ({helper}) => {123    const newFellowshipMember = helper.arrange.createEmptyAccount();124    await expect(helper.technicalCommittee.collective.execute(125      techcomms.andy,126      helper.fellowship.collective.addMemberCall(newFellowshipMember.address),127    )).to.be.fulfilled;128    expect(await helper.fellowship.collective.getMembers()).to.be.deep.contain(newFellowshipMember.address);129    await clearFellowship(sudoer);130  });131132  itSub('[Negative] TechComm can\'t add FinCouncil member', async ({helper}) => {133    const newFinCouncilMember = helper.arrange.createEmptyAccount();134    const addMemberProposal = helper.finCouncil.membership.addMemberCall(newFinCouncilMember.address);135    await expect(proposalFromAllCommittee(addMemberProposal)).rejectedWith('BadOrigin');136137    const finCouncilMembers = await helper.finCouncil.membership.getMembers();138    expect(finCouncilMembers).to.not.contains(newFinCouncilMember.address);139  });140141142  itSub('[Negative] TechComm member can\'t add FinCouncil member', async ({helper}) => {143    const newFinCouncilMember = helper.arrange.createEmptyAccount();144    await expect(helper.technicalCommittee.collective.execute(145      techcomms.greg,146      helper.finCouncil.membership.addMemberCall(newFinCouncilMember.address),147    )).rejectedWith('BadOrigin');148  });149150  itSub('[Negative] TechComm member cannot register foreign asset', async ({helper}) => {151    const location = {152      parents: 1,153      interior: {X3: [154        {155          Parachain: 1000,156        },157        {158          PalletInstance: 50,159        },160        {161          GeneralIndex: 1985,162        },163      ]},164    };165    const assetId = {Concrete: location};166167    const foreignAssetProposal = helper.constructApiCall(168      'api.tx.foreignAssets.forceRegisterForeignAsset',169      [{V3: assetId}, helper.util.str2vec('New Asset2'), 'NEW', {Fungible: 10}],170    );171172    await expect(helper.technicalCommittee.collective.execute(techcomms.andy, foreignAssetProposal))173      .to.be.rejectedWith('BadOrigin');174  });175176  itSub('[Negative] TechComm cannot submit regular democracy proposal', async ({helper}) => {177    const councilProposal = await helper.democracy.proposeCall(dummyProposalCall(helper), 0n);178179    await expect(proposalFromAllCommittee(councilProposal)).to.be.rejectedWith('BadOrigin');180  });181182  itSub('[Negative] TechComm cannot externally propose SuperMajorityAgainst', async ({helper}) => {183    const commiteeProposal = await helper.democracy.externalProposeDefaultCall(dummyProposalCall(helper));184185    await expect(proposalFromAllCommittee(commiteeProposal)).to.be.rejectedWith('BadOrigin');186  });187188  itSub('[Negative] TechComm cannot externally propose SimpleMajority', async ({helper}) => {189    const commiteeProposal = await helper.democracy.externalProposeMajorityCall(dummyProposalCall(helper));190191    await expect(proposalFromAllCommittee(commiteeProposal)).to.be.rejectedWith('BadOrigin');192  });193194  itSub('[Negative] TechComm cannot externally propose SuperMajorityApprove', async ({helper}) => {195    const commiteeProposal = await helper.democracy.externalProposeCall(dummyProposalCall(helper));196197    await expect(proposalFromAllCommittee(commiteeProposal)).to.be.rejectedWith('BadOrigin');198  });199200  itSub('[Negative] TechComm member cannot submit regular democracy proposal', async ({helper}) => {201    const memberProposal = await helper.democracy.proposeCall(dummyProposalCall(helper), 0n);202203    await expect(helper.technicalCommittee.collective.execute(204      techcomms.andy,205      memberProposal,206    )).to.be.rejectedWith('BadOrigin');207  });208209  itSub('[Negative] TechComm member cannot externally propose SuperMajorityAgainst', async ({helper}) => {210    const memberProposal = await helper.democracy.externalProposeDefaultCall(dummyProposalCall(helper));211212    await expect(helper.technicalCommittee.collective.execute(213      techcomms.andy,214      memberProposal,215    )).to.be.rejectedWith('BadOrigin');216  });217218  itSub('[Negative] TechComm member cannot externally propose SimpleMajority', async ({helper}) => {219    const memberProposal = await helper.democracy.externalProposeMajorityCall(dummyProposalCall(helper));220221    await expect(helper.technicalCommittee.collective.execute(222      techcomms.andy,223      memberProposal,224    )).to.be.rejectedWith('BadOrigin');225  });226227  itSub('[Negative] TechComm member cannot externally propose SuperMajorityApprove', async ({helper}) => {228    const memberProposal = await helper.democracy.externalProposeCall(dummyProposalCall(helper));229230    await expect(helper.technicalCommittee.collective.execute(231      techcomms.andy,232      memberProposal,233    )).to.be.rejectedWith('BadOrigin');234  });235236237  itSub('[Negative] TechComm cannot promote/demote Fellowship member', async ({helper}) => {238    const fellowship = await initFellowship(donor, sudoer);239    const memberWithRankOne = fellowship[1][0];240241    const promoteProposal = helper.fellowship.collective.promoteCall(memberWithRankOne.address);242    await expect(proposalFromAllCommittee(promoteProposal)).rejectedWith('BadOrigin');243244    const demoteProposal = helper.fellowship.collective.demoteCall(memberWithRankOne.address);245    await expect(proposalFromAllCommittee(demoteProposal)).rejectedWith('BadOrigin');246247    await clearFellowship(sudoer);248  });249250  itSub('[Negative] TechComm member cannot promote/demote Fellowship member', async ({helper}) => {251    const fellowship = await initFellowship(donor, sudoer);252    const memberWithRankOne = fellowship[1][0];253254    const promoteProposal = helper.fellowship.collective.promoteCall(memberWithRankOne.address);255    await expect(helper.technicalCommittee.collective.execute(256      techcomms.andy,257      promoteProposal,258    )).to.be.rejectedWith('BadOrigin');259260    const demoteProposal = helper.fellowship.collective.demoteCall(memberWithRankOne.address);261    await expect(helper.technicalCommittee.collective.execute(262      techcomms.andy,263      demoteProposal,264    )).to.be.rejectedWith('BadOrigin');265266    await clearFellowship(sudoer);267  });268269  itSub('[Negative] TechComm cannot add/remove a Council member', async ({helper}) => {270    const newCouncilMember = helper.arrange.createEmptyAccount();271    const addMemberProposal = helper.council.membership.addMemberCall(newCouncilMember.address);272    const removeMemberProposal = helper.council.membership.removeMemberCall(newCouncilMember.address);273274    await expect(proposalFromAllCommittee(addMemberProposal)).to.be.rejectedWith('BadOrigin');275    await expect(proposalFromAllCommittee(removeMemberProposal)).to.be.rejectedWith('BadOrigin');276  });277278  itSub('[Negative] TechComm member cannot add/remove a Council member', async ({helper}) => {279    const newCouncilMember = helper.arrange.createEmptyAccount();280    const addMemberProposal = helper.council.membership.addMemberCall(newCouncilMember.address);281    const removeMemberProposal = helper.council.membership.removeMemberCall(newCouncilMember.address);282283    await expect(helper.technicalCommittee.collective.execute(284      techcomms.andy,285      addMemberProposal,286    )).to.be.rejectedWith('BadOrigin');287    await expect(helper.technicalCommittee.collective.execute(288      techcomms.andy,289      removeMemberProposal,290    )).to.be.rejectedWith('BadOrigin');291  });292293  itSub('[Negative] TechComm cannot set/clear Council prime member', async ({helper}) => {294    const counselors = await initCouncil(donor, sudoer);295    const proposalForSet = await helper.council.membership.setPrimeCall(counselors.charu.address);296    const proposalForClear = await helper.council.membership.clearPrimeCall();297298    await expect(proposalFromAllCommittee(proposalForSet)).to.be.rejectedWith('BadOrigin');299    await expect(proposalFromAllCommittee(proposalForClear)).to.be.rejectedWith('BadOrigin');300    await clearCouncil(sudoer);301  });302303  itSub('[Negative] TechComm member cannot set/clear Council prime member', async ({helper}) => {304    const counselors = await initCouncil(donor, sudoer);305    const proposalForSet = await helper.council.membership.setPrimeCall(counselors.charu.address);306    const proposalForClear = await helper.council.membership.clearPrimeCall();307308    await expect(helper.technicalCommittee.collective.execute(309      techcomms.andy,310      proposalForSet,311    )).to.be.rejectedWith('BadOrigin');312    await expect(helper.technicalCommittee.collective.execute(313      techcomms.andy,314      proposalForClear,315    )).to.be.rejectedWith('BadOrigin');316    await clearCouncil(sudoer);317  });318319  itSub('[Negative] TechComm cannot add/remove a TechComm member', async ({helper}) => {320    const newCommMember = helper.arrange.createEmptyAccount();321    const addMemberProposal = helper.council.membership.addMemberCall(newCommMember.address);322    const removeMemberProposal = helper.council.membership.removeMemberCall(newCommMember.address);323324    await expect(proposalFromAllCommittee(addMemberProposal)).to.be.rejectedWith('BadOrigin');325    await expect(proposalFromAllCommittee(removeMemberProposal)).to.be.rejectedWith('BadOrigin');326  });327328  itSub('[Negative] TechComm member cannot add/remove a TechComm member', async ({helper}) => {329    const newCommMember = helper.arrange.createEmptyAccount();330    const addMemberProposal = helper.council.membership.addMemberCall(newCommMember.address);331    const removeMemberProposal = helper.council.membership.removeMemberCall(newCommMember.address);332333    await expect(helper.technicalCommittee.collective.execute(334      techcomms.andy,335      addMemberProposal,336    )).to.be.rejectedWith('BadOrigin');337    await expect(helper.technicalCommittee.collective.execute(338      techcomms.andy,339      removeMemberProposal,340    )).to.be.rejectedWith('BadOrigin');341  });342343  itSub('[Negative] TechComm cannot remove a Fellowship member', async ({helper}) => {344    const fellowship = await initFellowship(donor, sudoer);345346    await expect(proposalFromAllCommittee(helper.fellowship.collective.removeMemberCall(fellowship[5][0].address, 5))).to.be.rejectedWith('BadOrigin');347    await clearFellowship(sudoer);348  });349350  itSub('[Negative] TechComm member cannot remove a Fellowship member', async ({helper}) => {351    const fellowship = await initFellowship(donor, sudoer);352353    await expect(helper.technicalCommittee.collective.execute(354      techcomms.andy,355      helper.fellowship.collective.removeMemberCall(fellowship[5][0].address, 5),356    )).to.be.rejectedWith('BadOrigin');357    await clearFellowship(sudoer);358  });359360  itSub('[Negative] TechComm member cannot fast-track Democracy proposals', async ({helper}) => {361    const preimageHash = await helper.preimage.notePreimageFromCall(sudoer, dummyProposalCall(helper), true);362    await helper.getSudo().democracy.externalProposeDefaultWithPreimage(sudoer, preimageHash);363364    await expect(helper.technicalCommittee.collective.execute(365      techcomms.andy,366      helper.democracy.fastTrackCall(preimageHash, democracyFastTrackVotingPeriod, 0),367    )).to.be.rejectedWith('BadOrigin');368  });369370  itSub('[Negative] TechComm member cannot cancel Democracy proposals', async ({helper}) => {371    const proposeResult = await helper.getSudo().democracy.propose(sudoer, dummyProposalCall(helper), 0n);372    const proposalIndex = Event.Democracy.Proposed.expect(proposeResult).proposalIndex;373374    await expect(helper.technicalCommittee.collective.execute(375      techcomms.andy,376      helper.democracy.cancelProposalCall(proposalIndex),377    ))378      .to.be.rejectedWith('BadOrigin');379  });380381  itSub('[Negative] TechComm member cannot cancel ongoing Democracy referendums', async ({helper}) => {382    await helper.getSudo().democracy.externalProposeDefault(sudoer, dummyProposalCall(helper));383    const startedEvent = await helper.wait.expectEvent(democracyLaunchPeriod, Event.Democracy.Started);384    const referendumIndex = startedEvent.referendumIndex;385386    await expect(helper.technicalCommittee.collective.execute(387      techcomms.andy,388      helper.democracy.emergencyCancelCall(referendumIndex),389    )).to.be.rejectedWith('BadOrigin');390  });391392  itSub('[Negative] TechComm cannot blacklist Democracy proposals', async ({helper}) => {393    const preimageHash = await helper.preimage.notePreimageFromCall(sudoer, dummyProposalCall(helper), true);394    await helper.getSudo().democracy.externalProposeDefaultWithPreimage(sudoer, preimageHash);395396    await expect(proposalFromAllCommittee(helper.democracy.blacklistCall(preimageHash))).to.be.rejectedWith('BadOrigin');397  });398399  itSub('[Negative] TechComm member cannot blacklist Democracy proposals', async ({helper}) => {400    const preimageHash = await helper.preimage.notePreimageFromCall(sudoer, dummyProposalCall(helper), true);401    await helper.getSudo().democracy.externalProposeDefaultWithPreimage(sudoer, preimageHash);402403    await expect(helper.technicalCommittee.collective.execute(404      techcomms.andy,405      helper.democracy.blacklistCall(preimageHash),406    )).to.be.rejectedWith('BadOrigin');407  });408409  itSub.skip('[Negative] TechComm member cannot veto external Democracy proposals until the cool-off period pass', async () => {410411  });412413  itSub('[Negative] TechComm member cannot cancel Fellowship referendums', async ({helper}) => {414    const fellowship = await initFellowship(donor, sudoer);415    const fellowshipProposer = fellowship[5][0];416    const proposal = dummyProposal(helper);417418    const submitResult = await helper.fellowship.referenda.submit(419      fellowshipProposer,420      fellowshipPropositionOrigin,421      proposal,422      defaultEnactmentMoment,423    );424425    const referendumIndex = Event.FellowshipReferenda.Submitted.expect(submitResult).referendumIndex;426427    await expect(helper.technicalCommittee.collective.execute(428      techcomms.andy,429      helper.fellowship.referenda.cancelCall(referendumIndex),430    )).to.be.rejectedWith('BadOrigin');431  });432433  itSub('[Negative] TechComm referendum cannot be closed until the voting threshold is met', async ({helper}) => {434    const committeeSize = (await helper.callRpc('api.query.technicalCommitteeMembership.members')).toJSON().length as any as number;435    expect(committeeSize).is.greaterThan(1);436    const proposeResult = await helper.technicalCommittee.collective.propose(437      techcomms.andy,438      dummyProposalCall(helper),439      committeeSize,440    );441442    const committeeProposedEvent = Event.TechnicalCommittee.Proposed.expect(proposeResult);443    const proposalIndex = committeeProposedEvent.proposalIndex;444    const proposalHash = committeeProposedEvent.proposalHash;445446    await helper.technicalCommittee.collective.vote(techcomms.constantine, proposalHash, proposalIndex, true);447448    await expect(helper.technicalCommittee.collective.close(techcomms.andy, proposalHash, proposalIndex)).to.be.rejectedWith('TooEarly');449  });450});