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

difftreelog

source

tests/src/governance/util.ts8.0 KiBsourcehistory
1import {IKeyringPair} from '@polkadot/types/types';2import {xxhashAsHex} from '@polkadot/util-crypto';3import {usingPlaygrounds, expect} from '../util';4import {UniqueHelper} from '../util/playgrounds/unique';5import {DevUniqueHelper} from '../util/playgrounds/unique.dev';67export const democracyLaunchPeriod = 35;8export const democracyVotingPeriod = 35;9export const councilMotionDuration = 35;10export const democracyEnactmentPeriod = 40;11export const democracyFastTrackVotingPeriod = 5;1213export const fellowshipRankLimit = 7;14export const fellowshipPropositionOrigin = 'FellowshipProposition';15export const fellowshipPreparePeriod = 3;16export const fellowshipConfirmPeriod = 3;17export const fellowshipMinEnactPeriod = 1;1819export const defaultEnactmentMoment = {After: 0};2021export const democracyTrackId = 10;22export const democracyTrackMinRank = 3;23const twox128 = (data: any) => xxhashAsHex(data, 128);24export interface ICounselors {25  alex: IKeyringPair;26  ildar: IKeyringPair;27  charu: IKeyringPair;28  filip: IKeyringPair;29  irina: IKeyringPair;30}31export interface ITechComms {32    greg: IKeyringPair;33    andy: IKeyringPair;34    constantine: IKeyringPair;35}3637export async function initCouncil(donor: IKeyringPair, superuser: IKeyringPair) {38  let counselors: IKeyringPair[] = [];3940  await usingPlaygrounds(async (helper) => {41    const [alex, ildar, charu, filip, irina] = await helper.arrange.createAccounts([10_000n, 10_000n, 10_000n, 10_000n, 10_000n], donor);42    const sudo = helper.getSudo();43    {44      const members = (await helper.callRpc('api.query.councilMembership.members')).toJSON() as [];45      if(members.length != 0) {46        await clearCouncil(superuser);47      }48    }49    const expectedMembers = [alex, ildar, charu, filip, irina];50    for(const member of expectedMembers) {51      await sudo.executeExtrinsic(superuser, 'api.tx.councilMembership.addMember', [member.address]);52    }53    await sudo.executeExtrinsic(superuser, 'api.tx.councilMembership.setPrime', [alex.address]);54    {55      const members = (await helper.callRpc('api.query.councilMembership.members')).toJSON();56      expect(members).to.containSubset(expectedMembers.map((x: IKeyringPair) => x.address));57      expect(members.length).to.be.equal(expectedMembers.length);58    }5960    counselors = [alex, ildar, charu, filip, irina];61  });62  return {63    alex: counselors[0],64    ildar: counselors[1],65    charu: counselors[2],66    filip: counselors[3],67    irina: counselors[4],68  };69}7071export async function clearCouncil(superuser: IKeyringPair) {72  await usingPlaygrounds(async (helper) => {73    let members = (await helper.callRpc('api.query.councilMembership.members')).toJSON();74    if(members.length) {75      const sudo = helper.getSudo();76      for(const address of members) {77        await sudo.executeExtrinsic(superuser, 'api.tx.councilMembership.removeMember', [address]);78      }79      members = (await helper.callRpc('api.query.councilMembership.members')).toJSON();80    }81    expect(members).to.be.deep.equal([]);82  });83}848586export async function initTechComm(donor: IKeyringPair, superuser: IKeyringPair) {87  let techcomms: IKeyringPair[] = [];8889  await usingPlaygrounds(async (helper) => {90    const [greg, andy, constantine] = await helper.arrange.createAccounts([10_000n, 10_000n, 10_000n], donor);91    const sudo = helper.getSudo();92    {93      const members = (await helper.callRpc('api.query.technicalCommitteeMembership.members')).toJSON() as [];94      if(members.length != 0) {95        await clearTechComm(superuser);96      }97    }98    await sudo.executeExtrinsic(superuser, 'api.tx.technicalCommitteeMembership.addMember', [greg.address]);99    await sudo.executeExtrinsic(superuser, 'api.tx.technicalCommitteeMembership.addMember', [andy.address]);100    await sudo.executeExtrinsic(superuser, 'api.tx.technicalCommitteeMembership.addMember', [constantine.address]);101    await sudo.executeExtrinsic(superuser, 'api.tx.technicalCommitteeMembership.setPrime', [greg.address]);102    {103      const members = (await helper.callRpc('api.query.technicalCommitteeMembership.members')).toJSON();104      expect(members).to.containSubset([greg.address, andy.address, constantine.address]);105      expect(members.length).to.be.equal(3);106    }107108    techcomms = [greg, andy, constantine];109  });110111  return {112    greg: techcomms[0],113    andy: techcomms[1],114    constantine: techcomms[2],115  };116}117118export async function clearTechComm(superuser: IKeyringPair) {119  await usingPlaygrounds(async (helper) => {120    let members = (await helper.callRpc('api.query.technicalCommitteeMembership.members')).toJSON();121    if(members.length) {122      const sudo = helper.getSudo();123      for(const address of members) {124        await sudo.executeExtrinsic(superuser, 'api.tx.technicalCommitteeMembership.removeMember', [address]);125      }126      members = (await helper.callRpc('api.query.technicalCommitteeMembership.members')).toJSON();127    }128    expect(members).to.be.deep.equal([]);129  });130}131132export async function initFellowship(donor: IKeyringPair, sudoer: IKeyringPair) {133  const numMembersInRank = 3;134  const memberBalance = 5000n;135  const members: IKeyringPair[][] = [];136137  await usingPlaygrounds(async (helper) => {138    const currentFellows = await helper.getApi().query.fellowshipCollective.members.keys();139140    if(currentFellows.length != 0) {141      await clearFellowship(sudoer);142    }143    for(let i = 0; i < fellowshipRankLimit; i++) {144      const rankMembers = await helper.arrange.createAccounts(145        Array(numMembersInRank).fill(memberBalance),146        donor,147      );148149      for(const member of rankMembers) {150        await helper.getSudo().fellowship.collective.addMember(sudoer, member.address);151152        for(let rank = 0; rank < i; rank++) {153          await helper.getSudo().fellowship.collective.promote(sudoer, member.address);154        }155      }156157      members.push(rankMembers);158    }159  });160161  return members;162}163164export async function clearFellowship(sudoer: IKeyringPair) {165  await usingPlaygrounds(async (helper) => {166    const fellowship = (await helper.getApi().query.fellowshipCollective.members.keys())167      .map((key) => key.args[0].toString());168    for(const  member of fellowship) {169      await helper.getSudo().fellowship.collective.removeMember(sudoer, member, fellowshipRankLimit);170    }171  });172}173174export async function clearFellowshipReferenda(sudoer: IKeyringPair) {175  await usingPlaygrounds(async (helper) => {176    const proposalsCount = (await helper.getApi().query.fellowshipReferenda.referendumCount());177    for(let i = 0; i < proposalsCount.toNumber(); i++) {178      await helper.getSudo().fellowship.referenda.cancel(sudoer, i);179    }180  });181}182183export async function hardResetFellowshipReferenda(sudoer: IKeyringPair) {184  await usingPlaygrounds(async (helper) => {185    const api = helper.getApi();186    const prefix = twox128('FellowshipReferenda');187    await helper.signTransaction(sudoer, api.tx.sudo.sudo(api.tx.system.killPrefix(prefix, 100)));188  });189}190191export async function hardResetDemocracy(sudoer: IKeyringPair) {192  await usingPlaygrounds(async (helper) => {193    const api = helper.getApi();194    const prefix = twox128('Democracy');195    await helper.signTransaction(sudoer, api.tx.sudo.sudo(api.tx.system.killPrefix(prefix, 100)));196  });197}198199export async function hardResetGovScheduler(sudoer: IKeyringPair) {200  await usingPlaygrounds(async (helper) => {201    const api = helper.getApi();202    const prefix = twox128('GovScheduler');203    await helper.signTransaction(sudoer, api.tx.sudo.sudo(api.tx.system.killPrefix(prefix, 500)));204  });205}206207export async function voteUnanimouslyInFellowship(helper: DevUniqueHelper, fellows: IKeyringPair[][], minRank: number, referendumIndex: number) {208  for(let rank = minRank; rank < fellowshipRankLimit; rank++) {209    for(const member of fellows[rank]) {210      await helper.fellowship.collective.vote(member, referendumIndex, true);211    }212  }213}214215export function dummyProposalCall(helper: UniqueHelper) {216  return helper.constructApiCall('api.tx.system.remark', ['dummy proposal' + (new Date()).getTime()]);217}218219export function dummyProposal(helper: UniqueHelper) {220  return {221    Inline: dummyProposalCall(helper).method.toHex(),222  };223}