Browse Source

persistence service introduced

Gleb Urvanov 4 years ago
parent
commit
381da7372f
23 changed files with 816 additions and 723 deletions
  1. 3 1
      tests/network-tests/.env
  2. 3 1
      tests/network-tests/package.json
  3. 106 0
      tests/network-tests/src/iznik/services/dbService.ts
  4. 59 0
      tests/network-tests/src/iznik/tests/councilSetup.ts
  5. 68 0
      tests/network-tests/src/iznik/tests/fixtures/councilElectionHappyCase.ts
  6. 126 0
      tests/network-tests/src/iznik/tests/fixtures/leaderHiringHappyCase.ts
  7. 73 0
      tests/network-tests/src/iznik/tests/leaderSetup.ts
  8. 21 30
      tests/network-tests/src/iznik/tests/proposals/contentWorkingGroupMintCapacityProposalTest.ts
  9. 21 30
      tests/network-tests/src/iznik/tests/proposals/electionParametersProposalTest.ts
  10. 24 31
      tests/network-tests/src/iznik/tests/proposals/manageLeaderRoleTest.ts
  11. 21 30
      tests/network-tests/src/iznik/tests/proposals/setLeadProposalTest.ts
  12. 21 30
      tests/network-tests/src/iznik/tests/proposals/spendingProposalTest.ts
  13. 21 30
      tests/network-tests/src/iznik/tests/proposals/textProposalTest.ts
  14. 21 29
      tests/network-tests/src/iznik/tests/proposals/updateRuntime.ts
  15. 21 30
      tests/network-tests/src/iznik/tests/proposals/validatorCountProposalTest.ts
  16. 21 30
      tests/network-tests/src/iznik/tests/proposals/workingGroupMintCapacityProposalTest.ts
  17. 27 76
      tests/network-tests/src/iznik/tests/workingGroup/atLeastValueBugTest.ts
  18. 26 67
      tests/network-tests/src/iznik/tests/workingGroup/manageWorkerAsLeadTest.ts
  19. 26 70
      tests/network-tests/src/iznik/tests/workingGroup/manageWorkerAsWorkerTest.ts
  20. 26 70
      tests/network-tests/src/iznik/tests/workingGroup/workerApplicationHappyCaseTest.ts
  21. 26 70
      tests/network-tests/src/iznik/tests/workingGroup/workerApplicationRejectionCaseTest.ts
  22. 43 89
      tests/network-tests/src/iznik/tests/workingGroup/workerPayoutTest.ts
  23. 12 9
      tests/network-tests/src/iznik/utils/sender.ts

+ 3 - 1
tests/network-tests/.env

@@ -1,5 +1,7 @@
 # Address of the Joystream node.
 NODE_URL = ws://127.0.0.1:9944
+# Path to the database for shared keys and nonce
+DB_PATH = ../../.tmp/db.json
 # Account which is expected to provide sufficient funds to test accounts.
 SUDO_ACCOUNT_URI = //Alice
 # Amount of members able to buy membership in membership creation test.
@@ -49,4 +51,4 @@ SLASH_AMOUNT = 2
 # Stake decrement amount for manage working group lead testing scenario
 STAKE_DECREMENT = 3
 # Mint capacity increment value for working gorup mint capacity test
-MINT_CAPACITY_INCREMENT = 11
+MINT_CAPACITY_INCREMENT = 11

+ 3 - 1
tests/network-tests/package.json

@@ -7,7 +7,7 @@
     "test": "tap --files src/iznik/tests/proposals/*Test.ts --files src/iznik/tests/workingGroup/*Test.ts -T",
     "test-migration-constantinople": "tap --files src/rome/tests/romeRuntimeUpgradeTest.ts --files src/constantinople/tests/electingCouncilTest.ts -T",
     "test-migration-nicaea": "tap --files src/constantinople/tests/proposals/updateRuntimeTest.ts --files src/nicaea/tests/electingCouncilTest.ts -T",
-    "debug": "tap --files src/iznik/tests/proposals/manageLeaderRoleTest.ts -T",
+    "debug": "tap --files src/iznik/tests/unknown.unknown src/iznik/tests/councilSetup.ts src/iznik/tests/proposals/*Test.ts src/iznik/tests/leaderSetup.ts src/iznik/tests/workingGroup/*Test.ts -T",
     "lint": "eslint . --quiet --ext .ts",
     "checks": "yarn lint && tsc --noEmit --pretty && prettier ./ --check",
     "format": "prettier ./ --write "
@@ -19,9 +19,11 @@
     "@polkadot/keyring": "^1.7.0-beta.5",
     "@rome/types@npm:@joystream/types": "^0.7.0",
     "@types/bn.js": "^4.11.5",
+    "@types/lowdb": "^1.0.9",
     "bn.js": "^4.11.8",
     "dotenv": "^8.2.0",
     "fs": "^0.0.1-security",
+    "lowdb": "^1.0.0",
     "uuid": "^7.0.3"
   },
   "devDependencies": {

+ 106 - 0
tests/network-tests/src/iznik/services/dbService.ts

@@ -0,0 +1,106 @@
+import lowdb from 'lowdb/lib/main'
+import FileSync from 'lowdb/adapters/FileSync'
+import { KeyringPair, KeyringPair$Json } from '@polkadot/keyring/types'
+import Keyring from '@polkadot/keyring'
+import BN from 'bn.js'
+
+export class DbService {
+  private static instance: DbService
+
+  private adapter: any
+  private db: any
+  private keyring: Keyring
+  private dbPath: string
+
+  private static MEMBERS_KEY = 'members'
+  private static COUNCIL_KEY = 'council'
+  private static LEADER_KEY = 'leader'
+  private static NONCE_KEY = 'nonce'
+
+  private constructor() {
+    this.keyring = new Keyring({ type: 'sr25519' })
+    this.dbPath = process.env.DB_PATH!
+    this.adapter = new FileSync(this.dbPath)
+    this.db = lowdb(this.adapter)
+  }
+
+  public static getInstance(): DbService {
+    if (!DbService.instance) {
+      DbService.instance = new DbService()
+    }
+    return DbService.instance
+  }
+
+  public setCouncil(council: KeyringPair[]): void {
+    council.forEach((keyPair, index) => {
+      this.db.set(`${DbService.COUNCIL_KEY}.${index}`, keyPair.toJson()).write()
+    })
+  }
+
+  public getCouncil(): KeyringPair[] {
+    const council: KeyringPair[] = []
+    const jsonKeyringPairs: KeyringPair$Json[] = this.db.get(DbService.COUNCIL_KEY).value()
+    jsonKeyringPairs.forEach((jsonKeyringPair) => {
+      const keyPair: KeyringPair = this.keyring.addFromJson(jsonKeyringPair)
+      keyPair.decodePkcs8()
+      council.push(keyPair)
+    })
+    return council
+  }
+
+  public hasCouncil(): boolean {
+    return this.db.has(DbService.COUNCIL_KEY).value()
+  }
+
+  public setMembers(members: KeyringPair[]): void {
+    members.forEach((keyPair, index) => {
+      this.db.set(`${DbService.MEMBERS_KEY}.${index}`, keyPair.toJson()).write()
+    })
+  }
+
+  public getMembers(): KeyringPair[] {
+    const members: KeyringPair[] = []
+    const jsonKeyringPairs: KeyringPair$Json[] = this.db.get(DbService.MEMBERS_KEY).value()
+    jsonKeyringPairs.forEach((jsonKeyringPair) => {
+      const keyPair: KeyringPair = this.keyring.addFromJson(jsonKeyringPair)
+      keyPair.decodePkcs8()
+      members.push(keyPair)
+    })
+    return members
+  }
+
+  public hasMembers(): boolean {
+    return this.db.has(DbService.MEMBERS_KEY).value()
+  }
+
+  public setLeader(leader: KeyringPair, workingGroup: string): void {
+    this.db.set(`${workingGroup}.${DbService.LEADER_KEY}`, leader.toJson()).write()
+  }
+
+  public getLeader(workingGroup: string): KeyringPair {
+    const jsonKeyringPair: KeyringPair$Json = this.db.get(`${workingGroup}.${DbService.LEADER_KEY}`).value()
+    const keyPair: KeyringPair = this.keyring.addFromJson(jsonKeyringPair)
+    keyPair.decodePkcs8()
+    return keyPair
+  }
+
+  public hasLeader(workingGroup: string): boolean {
+    return this.db.has(`${workingGroup}.${DbService.LEADER_KEY}`).value()
+  }
+
+  public setNonce(address: string, nonce: BN): void {
+    this.db.set(`${DbService.NONCE_KEY}.${address}`, nonce.toString()).write()
+  }
+
+  public getNonce(address: string): BN {
+    return new BN(this.db.get(`${DbService.NONCE_KEY}.${address}`).value() as string)
+  }
+
+  public hasNonce(address: string): boolean {
+    return this.db.has(`${DbService.NONCE_KEY}.${address}`).value()
+  }
+
+  public removeNonce(address: string): void {
+    this.db.unset(`${DbService.NONCE_KEY}.${address}`).write()
+  }
+}

+ 59 - 0
tests/network-tests/src/iznik/tests/councilSetup.ts

@@ -0,0 +1,59 @@
+import { KeyringPair } from '@polkadot/keyring/types'
+import { Keyring, WsProvider } from '@polkadot/api'
+import BN from 'bn.js'
+import tap from 'tap'
+import { registerJoystreamTypes } from '@nicaea/types'
+import { PaidTermId } from '@nicaea/types/members'
+import { DbService } from '../services/dbService'
+import { initConfig } from '../utils/config'
+import { ApiWrapper } from '../utils/apiWrapper'
+import { Utils } from '../utils/utils'
+import { setTestTimeout } from '../utils/setTestTimeout'
+import { closeApi } from '../utils/closeApi'
+import { CouncilElectionHappyCaseFixture } from './fixtures/councilElectionHappyCase'
+
+tap.mocha.describe('Electing council scenario', async () => {
+  initConfig()
+  registerJoystreamTypes()
+
+  const nodeUrl: string = process.env.NODE_URL!
+  const sudoUri: string = process.env.SUDO_ACCOUNT_URI!
+  const keyring = new Keyring({ type: 'sr25519' })
+  const db: DbService = DbService.getInstance()
+  if (db.hasCouncil()) {
+    return
+  }
+
+  const provider = new WsProvider(nodeUrl)
+  const apiWrapper: ApiWrapper = await ApiWrapper.create(provider)
+  const sudo: KeyringPair = keyring.addFromUri(sudoUri)
+
+  const N: number = +process.env.MEMBERSHIP_CREATION_N!
+  const m1KeyPairs: KeyringPair[] = Utils.createKeyPairs(keyring, N)
+  const m2KeyPairs: KeyringPair[] = Utils.createKeyPairs(keyring, N)
+  const paidTerms: PaidTermId = new PaidTermId(+process.env.MEMBERSHIP_PAID_TERMS!)
+  const K: number = +process.env.COUNCIL_ELECTION_K!
+  const greaterStake: BN = new BN(+process.env.COUNCIL_STAKE_GREATER_AMOUNT!)
+  const lesserStake: BN = new BN(+process.env.COUNCIL_STAKE_LESSER_AMOUNT!)
+
+  const durationInBlocks = 25
+
+  setTestTimeout(apiWrapper, durationInBlocks)
+
+  const councilElectionHappyCaseFixture = new CouncilElectionHappyCaseFixture(
+    apiWrapper,
+    sudo,
+    m1KeyPairs,
+    m2KeyPairs,
+    paidTerms,
+    K,
+    greaterStake,
+    lesserStake
+  )
+  await councilElectionHappyCaseFixture.runner(false)
+
+  db.setMembers(m1KeyPairs)
+  db.setCouncil(m2KeyPairs)
+
+  closeApi(apiWrapper)
+})

+ 68 - 0
tests/network-tests/src/iznik/tests/fixtures/councilElectionHappyCase.ts

@@ -0,0 +1,68 @@
+import { Fixture } from './interfaces/fixture'
+import { BuyMembershipHappyCaseFixture } from './membershipModule'
+import tap from 'tap'
+import { ElectCouncilFixture } from './councilElectionModule'
+import { ApiWrapper } from '../../utils/apiWrapper'
+import { KeyringPair } from '@polkadot/keyring/types'
+import { PaidTermId } from '@nicaea/types/members'
+import BN from 'bn.js'
+
+export class CouncilElectionHappyCaseFixture implements Fixture {
+  private apiWrapper: ApiWrapper
+  private sudo: KeyringPair
+  private m1KeyPairs: KeyringPair[]
+  private m2KeyPairs: KeyringPair[]
+  private paidTerms: PaidTermId
+  private K: number
+  private greaterStake: BN
+  private lesserStake: BN
+
+  constructor(
+    apiWrapper: ApiWrapper,
+    sudo: KeyringPair,
+    m1KeyPairs: KeyringPair[],
+    m2KeyPairs: KeyringPair[],
+    paidTerms: PaidTermId,
+    K: number,
+    greaterStake: BN,
+    lesserStake: BN
+  ) {
+    this.apiWrapper = apiWrapper
+    this.sudo = sudo
+    this.m1KeyPairs = m1KeyPairs
+    this.m2KeyPairs = m2KeyPairs
+    this.paidTerms = paidTerms
+    this.K = K
+    this.greaterStake = greaterStake
+    this.lesserStake = lesserStake
+  }
+
+  public async runner(expectFailure: boolean): Promise<void> {
+    const firstMemberSetFixture: BuyMembershipHappyCaseFixture = new BuyMembershipHappyCaseFixture(
+      this.apiWrapper,
+      this.sudo,
+      this.m1KeyPairs,
+      this.paidTerms
+    )
+    tap.test('Creating first set of members', async () => firstMemberSetFixture.runner(false))
+
+    const secondMemberSetFixture: BuyMembershipHappyCaseFixture = new BuyMembershipHappyCaseFixture(
+      this.apiWrapper,
+      this.sudo,
+      this.m2KeyPairs,
+      this.paidTerms
+    )
+    tap.test('Creating second set of members', async () => secondMemberSetFixture.runner(false))
+
+    const electCouncilFixture: ElectCouncilFixture = new ElectCouncilFixture(
+      this.apiWrapper,
+      this.m1KeyPairs,
+      this.m2KeyPairs,
+      this.K,
+      this.sudo,
+      this.greaterStake,
+      this.lesserStake
+    )
+    tap.test('Elect council', async () => electCouncilFixture.runner(false))
+  }
+}

+ 126 - 0
tests/network-tests/src/iznik/tests/fixtures/leaderHiringHappyCase.ts

@@ -0,0 +1,126 @@
+import { Fixture } from './interfaces/fixture'
+import tap from 'tap'
+import {
+  AddLeaderOpeningFixture,
+  ApplyForOpeningFixture,
+  BeginLeaderApplicationReviewFixture,
+  FillLeaderOpeningFixture,
+} from './workingGroupModule'
+import { BuyMembershipHappyCaseFixture } from './membershipModule'
+import { ApiWrapper, WorkingGroups } from '../../utils/apiWrapper'
+import { OpeningId } from '@nicaea/types/hiring'
+import { KeyringPair } from '@polkadot/keyring/types'
+import { PaidTermId } from '@nicaea/types/members'
+import BN from 'bn.js'
+
+export class LeaderHiringHappyCaseFixture implements Fixture {
+  private apiWrapper: ApiWrapper
+  private sudo: KeyringPair
+  private nKeyPairs: KeyringPair[]
+  private leadKeyPair: KeyringPair[]
+  private paidTerms: PaidTermId
+  private applicationStake: BN
+  private roleStake: BN
+  private openingActivationDelay: BN
+  private rewardInterval: BN
+  private firstRewardInterval: BN
+  private payoutAmount: BN
+  private workingGroup: WorkingGroups
+
+  constructor(
+    apiWrapper: ApiWrapper,
+    sudo: KeyringPair,
+    nKeyPairs: KeyringPair[],
+    leadKeyPair: KeyringPair[],
+    paidTerms: PaidTermId,
+    applicationStake: BN,
+    roleStake: BN,
+    openingActivationDelay: BN,
+    rewardInterval: BN,
+    firstRewardInterval: BN,
+    payoutAmount: BN,
+    workingGroup: WorkingGroups
+  ) {
+    this.apiWrapper = apiWrapper
+    this.sudo = sudo
+    this.nKeyPairs = nKeyPairs
+    this.leadKeyPair = leadKeyPair
+    this.paidTerms = paidTerms
+    this.applicationStake = applicationStake
+    this.roleStake = roleStake
+    this.openingActivationDelay = openingActivationDelay
+    this.rewardInterval = rewardInterval
+    this.firstRewardInterval = firstRewardInterval
+    this.payoutAmount = payoutAmount
+    this.workingGroup = workingGroup
+  }
+
+  public async runner(expectFailure: boolean): Promise<void> {
+    const happyCaseFixture: BuyMembershipHappyCaseFixture = new BuyMembershipHappyCaseFixture(
+      this.apiWrapper,
+      this.sudo,
+      this.nKeyPairs,
+      this.paidTerms
+    )
+    tap.test('Creating a set of members', async () => happyCaseFixture.runner(false))
+
+    const leaderHappyCaseFixture: BuyMembershipHappyCaseFixture = new BuyMembershipHappyCaseFixture(
+      this.apiWrapper,
+      this.sudo,
+      this.leadKeyPair,
+      this.paidTerms
+    )
+    tap.test('Buying membership for leader account', async () => leaderHappyCaseFixture.runner(false))
+
+    const addLeaderOpeningFixture: AddLeaderOpeningFixture = new AddLeaderOpeningFixture(
+      this.apiWrapper,
+      this.nKeyPairs,
+      this.sudo,
+      this.applicationStake,
+      this.roleStake,
+      this.openingActivationDelay,
+      this.workingGroup
+    )
+    tap.test('Add lead opening', async () => await addLeaderOpeningFixture.runner(false))
+
+    let applyForLeaderOpeningFixture: ApplyForOpeningFixture
+    tap.test('Apply for lead opening', async () => {
+      applyForLeaderOpeningFixture = new ApplyForOpeningFixture(
+        this.apiWrapper,
+        this.leadKeyPair,
+        this.sudo,
+        this.applicationStake,
+        this.roleStake,
+        addLeaderOpeningFixture.getResult() as OpeningId,
+        this.workingGroup
+      )
+      await applyForLeaderOpeningFixture.runner(false)
+    })
+
+    let beginLeaderApplicationReviewFixture: BeginLeaderApplicationReviewFixture
+    tap.test('Begin lead application review', async () => {
+      beginLeaderApplicationReviewFixture = new BeginLeaderApplicationReviewFixture(
+        this.apiWrapper,
+        this.sudo,
+        addLeaderOpeningFixture.getResult() as OpeningId,
+        this.workingGroup
+      )
+      await beginLeaderApplicationReviewFixture.runner(false)
+    })
+
+    let fillLeaderOpeningFixture: FillLeaderOpeningFixture
+    tap.test('Fill lead opening', async () => {
+      fillLeaderOpeningFixture = new FillLeaderOpeningFixture(
+        this.apiWrapper,
+        this.leadKeyPair,
+        this.sudo,
+        addLeaderOpeningFixture.getResult() as OpeningId,
+        this.firstRewardInterval,
+        this.rewardInterval,
+        this.payoutAmount,
+        this.workingGroup
+      )
+      await fillLeaderOpeningFixture.runner(false)
+    })
+  }
+}

+ 73 - 0
tests/network-tests/src/iznik/tests/leaderSetup.ts

@@ -0,0 +1,73 @@
+import { initConfig } from '../utils/config'
+import { registerJoystreamTypes } from '@nicaea/types'
+import { closeApi } from '../utils/closeApi'
+import { ApiWrapper, WorkingGroups } from '../utils/apiWrapper'
+import { WsProvider, Keyring } from '@polkadot/api'
+import { KeyringPair } from '@polkadot/keyring/types'
+import { setTestTimeout } from '../utils/setTestTimeout'
+import BN from 'bn.js'
+import tap from 'tap'
+import { Utils } from '../utils/utils'
+import { PaidTermId } from '@nicaea/types/members'
+import { DbService } from '../services/dbService'
+import { LeaderHiringHappyCaseFixture } from './fixtures/leaderHiringHappyCase'
+
+tap.mocha.describe('Worker application happy case scenario', async () => {
+  initConfig()
+  registerJoystreamTypes()
+
+  const nodeUrl: string = process.env.NODE_URL!
+  const sudoUri: string = process.env.SUDO_ACCOUNT_URI!
+  const keyring = new Keyring({ type: 'sr25519' })
+  const db: DbService = DbService.getInstance()
+  const provider = new WsProvider(nodeUrl)
+  const apiWrapper: ApiWrapper = await ApiWrapper.create(provider)
+  if (db.hasLeader(apiWrapper.getWorkingGroupString(WorkingGroups.StorageWorkingGroup))) {
+    return
+  }
+
+  const sudo: KeyringPair = keyring.addFromUri(sudoUri)
+  const N: number = +process.env.WORKING_GROUP_N!
+  const nKeyPairs: KeyringPair[] = Utils.createKeyPairs(keyring, N)
+  const leadKeyPair: KeyringPair[] = Utils.createKeyPairs(keyring, 1)
+
+  const paidTerms: PaidTermId = new PaidTermId(+process.env.MEMBERSHIP_PAID_TERMS!)
+  const applicationStake: BN = new BN(process.env.WORKING_GROUP_APPLICATION_STAKE!)
+  const roleStake: BN = new BN(process.env.WORKING_GROUP_ROLE_STAKE!)
+  const firstRewardInterval: BN = new BN(process.env.LONG_REWARD_INTERVAL!)
+  const rewardInterval: BN = new BN(process.env.LONG_REWARD_INTERVAL!)
+  const payoutAmount: BN = new BN(process.env.PAYOUT_AMOUNT!)
+  const durationInBlocks = 48
+  const openingActivationDelay: BN = new BN(0)
+
+  setTestTimeout(apiWrapper, durationInBlocks)
+
+  const leaderHiringHappyCaseFixture: LeaderHiringHappyCaseFixture = new LeaderHiringHappyCaseFixture(
+    apiWrapper,
+    sudo,
+    nKeyPairs,
+    leadKeyPair,
+    paidTerms,
+    applicationStake,
+    roleStake,
+    openingActivationDelay,
+    rewardInterval,
+    firstRewardInterval,
+    payoutAmount,
+    WorkingGroups.StorageWorkingGroup
+  )
+  await leaderHiringHappyCaseFixture.runner(false)
+
+  db.setMembers(nKeyPairs)
+  db.setLeader(leadKeyPair[0], apiWrapper.getWorkingGroupString(WorkingGroups.StorageWorkingGroup))
+
+  // const leaveRoleFixture: LeaveRoleFixture = new LeaveRoleFixture(
+  //   apiWrapper,
+  //   leadKeyPair,
+  //   sudo,
+  //   WorkingGroups.StorageWorkingGroup
+  // )
+  // tap.test('Leaving lead role', async () => leaveRoleFixture.runner(false))
+
+  closeApi(apiWrapper)
+})

+ 21 - 30
tests/network-tests/src/iznik/tests/proposals/contentWorkingGroupMintCapacityProposalTest.ts

@@ -8,10 +8,10 @@ import { registerJoystreamTypes } from '@nicaea/types'
 import { closeApi } from '../../utils/closeApi'
 import { ApiWrapper } from '../../utils/apiWrapper'
 import { ContentWorkingGroupMintCapacityProposalFixture } from '../fixtures/proposalsModule'
-import { BuyMembershipHappyCaseFixture } from '../fixtures/membershipModule'
-import { ElectCouncilFixture } from '../fixtures/councilElectionModule'
 import { Utils } from '../../utils/utils'
 import { PaidTermId } from '@nicaea/types/members'
+import { CouncilElectionHappyCaseFixture } from '../fixtures/councilElectionHappyCase'
+import { DbService } from '../../services/dbService'
 
 tap.mocha.describe('Validator count proposal scenario', async () => {
   initConfig()
@@ -23,10 +23,11 @@ tap.mocha.describe('Validator count proposal scenario', async () => {
   const provider = new WsProvider(nodeUrl)
   const apiWrapper: ApiWrapper = await ApiWrapper.create(provider)
   const sudo: KeyringPair = keyring.addFromUri(sudoUri)
+  const db: DbService = DbService.getInstance()
 
   const N: number = +process.env.MEMBERSHIP_CREATION_N!
-  const m1KeyPairs: KeyringPair[] = Utils.createKeyPairs(keyring, N)
-  const m2KeyPairs: KeyringPair[] = Utils.createKeyPairs(keyring, N)
+  let m1KeyPairs: KeyringPair[] = Utils.createKeyPairs(keyring, N)
+  let m2KeyPairs: KeyringPair[] = Utils.createKeyPairs(keyring, N)
 
   const paidTerms: PaidTermId = new PaidTermId(+process.env.MEMBERSHIP_PAID_TERMS!)
   const K: number = +process.env.COUNCIL_ELECTION_K!
@@ -38,32 +39,22 @@ tap.mocha.describe('Validator count proposal scenario', async () => {
 
   setTestTimeout(apiWrapper, durationInBlocks)
 
-  const firstMemberSetFixture: BuyMembershipHappyCaseFixture = new BuyMembershipHappyCaseFixture(
-    apiWrapper,
-    sudo,
-    m1KeyPairs,
-    paidTerms
-  )
-  tap.test('Creating first set of members', async () => firstMemberSetFixture.runner(false))
-
-  const secondMemberSetFixture: BuyMembershipHappyCaseFixture = new BuyMembershipHappyCaseFixture(
-    apiWrapper,
-    sudo,
-    m2KeyPairs,
-    paidTerms
-  )
-  tap.test('Creating second set of members', async () => secondMemberSetFixture.runner(false))
-
-  const electCouncilFixture: ElectCouncilFixture = new ElectCouncilFixture(
-    apiWrapper,
-    m1KeyPairs,
-    m2KeyPairs,
-    K,
-    sudo,
-    greaterStake,
-    lesserStake
-  )
-  tap.test('Elect council', async () => electCouncilFixture.runner(false))
+  if (db.hasCouncil()) {
+    m1KeyPairs = db.getMembers()
+    m2KeyPairs = db.getCouncil()
+  } else {
+    const councilElectionHappyCaseFixture = new CouncilElectionHappyCaseFixture(
+      apiWrapper,
+      sudo,
+      m1KeyPairs,
+      m2KeyPairs,
+      paidTerms,
+      K,
+      greaterStake,
+      lesserStake
+    )
+    councilElectionHappyCaseFixture.runner(false)
+  }
 
   const contentWorkingGroupMintCapacityProposalFixture: ContentWorkingGroupMintCapacityProposalFixture = new ContentWorkingGroupMintCapacityProposalFixture(
     apiWrapper,

+ 21 - 30
tests/network-tests/src/iznik/tests/proposals/electionParametersProposalTest.ts

@@ -7,11 +7,11 @@ import tap from 'tap'
 import { registerJoystreamTypes } from '@nicaea/types'
 import { closeApi } from '../../utils/closeApi'
 import { ApiWrapper } from '../../utils/apiWrapper'
-import { BuyMembershipHappyCaseFixture } from '../fixtures/membershipModule'
-import { ElectCouncilFixture } from '../fixtures/councilElectionModule'
 import { Utils } from '../../utils/utils'
 import { ElectionParametersProposalFixture } from '../fixtures/proposalsModule'
 import { PaidTermId } from '@nicaea/types/members'
+import { CouncilElectionHappyCaseFixture } from '../fixtures/councilElectionHappyCase'
+import { DbService } from '../../services/dbService'
 
 tap.mocha.describe('Election parameters proposal scenario', async () => {
   initConfig()
@@ -23,10 +23,11 @@ tap.mocha.describe('Election parameters proposal scenario', async () => {
   const provider = new WsProvider(nodeUrl)
   const apiWrapper: ApiWrapper = await ApiWrapper.create(provider)
   const sudo: KeyringPair = keyring.addFromUri(sudoUri)
+  const db: DbService = DbService.getInstance()
 
   const N: number = +process.env.MEMBERSHIP_CREATION_N!
-  const m1KeyPairs: KeyringPair[] = Utils.createKeyPairs(keyring, N)
-  const m2KeyPairs: KeyringPair[] = Utils.createKeyPairs(keyring, N)
+  let m1KeyPairs: KeyringPair[] = Utils.createKeyPairs(keyring, N)
+  let m2KeyPairs: KeyringPair[] = Utils.createKeyPairs(keyring, N)
 
   const paidTerms: PaidTermId = new PaidTermId(+process.env.MEMBERSHIP_PAID_TERMS!)
   const K: number = +process.env.COUNCIL_ELECTION_K!
@@ -37,32 +38,22 @@ tap.mocha.describe('Election parameters proposal scenario', async () => {
 
   setTestTimeout(apiWrapper, durationInBlocks)
 
-  const firstMemberSetFixture: BuyMembershipHappyCaseFixture = new BuyMembershipHappyCaseFixture(
-    apiWrapper,
-    sudo,
-    m1KeyPairs,
-    paidTerms
-  )
-  tap.test('Creating first set of members', async () => firstMemberSetFixture.runner(false))
-
-  const secondMemberSetFixture: BuyMembershipHappyCaseFixture = new BuyMembershipHappyCaseFixture(
-    apiWrapper,
-    sudo,
-    m2KeyPairs,
-    paidTerms
-  )
-  tap.test('Creating second set of members', async () => secondMemberSetFixture.runner(false))
-
-  const electCouncilFixture: ElectCouncilFixture = new ElectCouncilFixture(
-    apiWrapper,
-    m1KeyPairs,
-    m2KeyPairs,
-    K,
-    sudo,
-    greaterStake,
-    lesserStake
-  )
-  tap.test('Elect council', async () => electCouncilFixture.runner(false))
+  if (db.hasCouncil()) {
+    m1KeyPairs = db.getMembers()
+    m2KeyPairs = db.getCouncil()
+  } else {
+    const councilElectionHappyCaseFixture = new CouncilElectionHappyCaseFixture(
+      apiWrapper,
+      sudo,
+      m1KeyPairs,
+      m2KeyPairs,
+      paidTerms,
+      K,
+      greaterStake,
+      lesserStake
+    )
+    councilElectionHappyCaseFixture.runner(false)
+  }
 
   const electionParametersProposalFixture: ElectionParametersProposalFixture = new ElectionParametersProposalFixture(
     apiWrapper,

+ 24 - 31
tests/network-tests/src/iznik/tests/proposals/manageLeaderRoleTest.ts

@@ -8,7 +8,6 @@ import { registerJoystreamTypes } from '@nicaea/types'
 import { closeApi } from '../../utils/closeApi'
 import { ApiWrapper, WorkingGroups } from '../../utils/apiWrapper'
 import { BuyMembershipHappyCaseFixture } from '../fixtures/membershipModule'
-import { ElectCouncilFixture } from '../fixtures/councilElectionModule'
 import {
   BeginWorkingGroupLeaderApplicationReviewFixture,
   CreateWorkingGroupLeaderOpeningFixture,
@@ -33,6 +32,8 @@ import { Utils } from '../../utils/utils'
 import { PaidTermId } from '@nicaea/types/members'
 import { OpeningId } from '@nicaea/types/hiring'
 import { ProposalId } from '@nicaea/types/proposals'
+import { DbService } from '../../services/dbService'
+import { CouncilElectionHappyCaseFixture } from '../fixtures/councilElectionHappyCase'
 
 tap.mocha.describe('Set lead proposal scenario', async () => {
   initConfig()
@@ -41,13 +42,15 @@ tap.mocha.describe('Set lead proposal scenario', async () => {
   const nodeUrl: string = process.env.NODE_URL!
   const sudoUri: string = process.env.SUDO_ACCOUNT_URI!
   const keyring = new Keyring({ type: 'sr25519' })
+  const db: DbService = DbService.getInstance()
+
   const provider = new WsProvider(nodeUrl)
   const apiWrapper: ApiWrapper = await ApiWrapper.create(provider)
   const sudo: KeyringPair = keyring.addFromUri(sudoUri)
 
   const N: number = +process.env.MEMBERSHIP_CREATION_N!
-  const m1KeyPairs: KeyringPair[] = Utils.createKeyPairs(keyring, N)
-  const m2KeyPairs: KeyringPair[] = Utils.createKeyPairs(keyring, N)
+  let m1KeyPairs: KeyringPair[] = Utils.createKeyPairs(keyring, N)
+  let m2KeyPairs: KeyringPair[] = Utils.createKeyPairs(keyring, N)
   const leadKeyPair: KeyringPair[] = Utils.createKeyPairs(keyring, 1)
 
   const paidTerms: PaidTermId = new PaidTermId(+process.env.MEMBERSHIP_PAID_TERMS!)
@@ -66,21 +69,22 @@ tap.mocha.describe('Set lead proposal scenario', async () => {
 
   setTestTimeout(apiWrapper, durationInBlocks)
 
-  const firstMemberSetFixture: BuyMembershipHappyCaseFixture = new BuyMembershipHappyCaseFixture(
-    apiWrapper,
-    sudo,
-    m1KeyPairs,
-    paidTerms
-  )
-  tap.test('Creating first set of members', async () => firstMemberSetFixture.runner(false))
-
-  const secondMemberSetFixture: BuyMembershipHappyCaseFixture = new BuyMembershipHappyCaseFixture(
-    apiWrapper,
-    sudo,
-    m2KeyPairs,
-    paidTerms
-  )
-  tap.test('Creating second set of members', async () => secondMemberSetFixture.runner(false))
+  if (db.hasCouncil()) {
+    m1KeyPairs = db.getMembers()
+    m2KeyPairs = db.getCouncil()
+  } else {
+    const councilElectionHappyCaseFixture = new CouncilElectionHappyCaseFixture(
+      apiWrapper,
+      sudo,
+      m1KeyPairs,
+      m2KeyPairs,
+      paidTerms,
+      K,
+      greaterStake,
+      lesserStake
+    )
+    councilElectionHappyCaseFixture.runner(false)
+  }
 
   const leaderMembershipFixture: BuyMembershipHappyCaseFixture = new BuyMembershipHappyCaseFixture(
     apiWrapper,
@@ -90,17 +94,6 @@ tap.mocha.describe('Set lead proposal scenario', async () => {
   )
   tap.test('Buy membership for lead', async () => leaderMembershipFixture.runner(false))
 
-  const electCouncilFixture: ElectCouncilFixture = new ElectCouncilFixture(
-    apiWrapper,
-    m1KeyPairs,
-    m2KeyPairs,
-    K,
-    sudo,
-    greaterStake,
-    lesserStake
-  )
-  tap.test('Elect council', async () => electCouncilFixture.runner(false))
-
   const createWorkingGroupLeaderOpeningFixture: CreateWorkingGroupLeaderOpeningFixture = new CreateWorkingGroupLeaderOpeningFixture(
     apiWrapper,
     m1KeyPairs,
@@ -238,13 +231,13 @@ tap.mocha.describe('Set lead proposal scenario', async () => {
   let expectLeaderStakeDecreasedFixture: ExpectLeaderStakeDecreasedFixture
   tap.test('Approve decreased leader stake', async () => {
     newStake = applicationStake.sub(stakeDecrement)
-    voteForFillLeaderProposalFixture = new VoteForProposalFixture(
+    voteForDecreaseStakeProposal = new VoteForProposalFixture(
       apiWrapper,
       m2KeyPairs,
       sudo,
       decreaseLeaderStakeProposalFixture.getResult() as ProposalId
     )
-    voteForFillLeaderProposalFixture.runner(false)
+    voteForDecreaseStakeProposal.runner(false)
     expectLeaderStakeDecreasedFixture = new ExpectLeaderStakeDecreasedFixture(
       apiWrapper,
       newStake,

+ 21 - 30
tests/network-tests/src/iznik/tests/proposals/setLeadProposalTest.ts

@@ -8,10 +8,10 @@ import { registerJoystreamTypes } from '@nicaea/types'
 import { closeApi } from '../../utils/closeApi'
 import { ApiWrapper } from '../../utils/apiWrapper'
 import { Utils } from '../../utils/utils'
-import { BuyMembershipHappyCaseFixture } from '../fixtures/membershipModule'
-import { ElectCouncilFixture } from '../fixtures/councilElectionModule'
 import { SetLeadProposalFixture } from '../fixtures/proposalsModule'
 import { PaidTermId } from '@nicaea/types/members'
+import { CouncilElectionHappyCaseFixture } from '../fixtures/councilElectionHappyCase'
+import { DbService } from '../../services/dbService'
 
 tap.mocha.describe('Set lead proposal scenario', async () => {
   initConfig()
@@ -23,10 +23,11 @@ tap.mocha.describe('Set lead proposal scenario', async () => {
   const provider = new WsProvider(nodeUrl)
   const apiWrapper: ApiWrapper = await ApiWrapper.create(provider)
   const sudo: KeyringPair = keyring.addFromUri(sudoUri)
+  const db: DbService = DbService.getInstance()
 
   const N: number = +process.env.MEMBERSHIP_CREATION_N!
-  const m1KeyPairs: KeyringPair[] = Utils.createKeyPairs(keyring, N)
-  const m2KeyPairs: KeyringPair[] = Utils.createKeyPairs(keyring, N)
+  let m1KeyPairs: KeyringPair[] = Utils.createKeyPairs(keyring, N)
+  let m2KeyPairs: KeyringPair[] = Utils.createKeyPairs(keyring, N)
 
   const paidTerms: PaidTermId = new PaidTermId(+process.env.MEMBERSHIP_PAID_TERMS!)
   const K: number = +process.env.COUNCIL_ELECTION_K!
@@ -37,32 +38,22 @@ tap.mocha.describe('Set lead proposal scenario', async () => {
 
   setTestTimeout(apiWrapper, durationInBlocks)
 
-  const firstMemberSetFixture: BuyMembershipHappyCaseFixture = new BuyMembershipHappyCaseFixture(
-    apiWrapper,
-    sudo,
-    m1KeyPairs,
-    paidTerms
-  )
-  tap.test('Creating first set of members', async () => firstMemberSetFixture.runner(false))
-
-  const secondMemberSetFixture: BuyMembershipHappyCaseFixture = new BuyMembershipHappyCaseFixture(
-    apiWrapper,
-    sudo,
-    m2KeyPairs,
-    paidTerms
-  )
-  tap.test('Creating second set of members', async () => secondMemberSetFixture.runner(false))
-
-  const electCouncilFixture: ElectCouncilFixture = new ElectCouncilFixture(
-    apiWrapper,
-    m1KeyPairs,
-    m2KeyPairs,
-    K,
-    sudo,
-    greaterStake,
-    lesserStake
-  )
-  tap.test('Elect council', async () => electCouncilFixture.runner(false))
+  if (db.hasCouncil()) {
+    m1KeyPairs = db.getMembers()
+    m2KeyPairs = db.getCouncil()
+  } else {
+    const councilElectionHappyCaseFixture = new CouncilElectionHappyCaseFixture(
+      apiWrapper,
+      sudo,
+      m1KeyPairs,
+      m2KeyPairs,
+      paidTerms,
+      K,
+      greaterStake,
+      lesserStake
+    )
+    councilElectionHappyCaseFixture.runner(false)
+  }
 
   const setLeadProposalFixture: SetLeadProposalFixture = new SetLeadProposalFixture(
     apiWrapper,

+ 21 - 30
tests/network-tests/src/iznik/tests/proposals/spendingProposalTest.ts

@@ -8,10 +8,10 @@ import { registerJoystreamTypes } from '@nicaea/types'
 import { closeApi } from '../../utils/closeApi'
 import { ApiWrapper } from '../../utils/apiWrapper'
 import { Utils } from '../../utils/utils'
-import { BuyMembershipHappyCaseFixture } from '../fixtures/membershipModule'
-import { ElectCouncilFixture } from '../fixtures/councilElectionModule'
 import { SpendingProposalFixture } from '../fixtures/proposalsModule'
 import { PaidTermId } from '@nicaea/types/members'
+import { CouncilElectionHappyCaseFixture } from '../fixtures/councilElectionHappyCase'
+import { DbService } from '../../services/dbService'
 
 tap.mocha.describe('Spending proposal scenario', async () => {
   initConfig()
@@ -23,10 +23,11 @@ tap.mocha.describe('Spending proposal scenario', async () => {
   const provider = new WsProvider(nodeUrl)
   const apiWrapper: ApiWrapper = await ApiWrapper.create(provider)
   const sudo: KeyringPair = keyring.addFromUri(sudoUri)
+  const db: DbService = DbService.getInstance()
 
   const N: number = +process.env.MEMBERSHIP_CREATION_N!
-  const m1KeyPairs: KeyringPair[] = Utils.createKeyPairs(keyring, N)
-  const m2KeyPairs: KeyringPair[] = Utils.createKeyPairs(keyring, N)
+  let m1KeyPairs: KeyringPair[] = Utils.createKeyPairs(keyring, N)
+  let m2KeyPairs: KeyringPair[] = Utils.createKeyPairs(keyring, N)
 
   const paidTerms: PaidTermId = new PaidTermId(+process.env.MEMBERSHIP_PAID_TERMS!)
   const K: number = +process.env.COUNCIL_ELECTION_K!
@@ -38,32 +39,22 @@ tap.mocha.describe('Spending proposal scenario', async () => {
 
   setTestTimeout(apiWrapper, durationInBlocks)
 
-  const firstMemberSetFixture: BuyMembershipHappyCaseFixture = new BuyMembershipHappyCaseFixture(
-    apiWrapper,
-    sudo,
-    m1KeyPairs,
-    paidTerms
-  )
-  tap.test('Creating first set of members', async () => firstMemberSetFixture.runner(false))
-
-  const secondMemberSetFixture: BuyMembershipHappyCaseFixture = new BuyMembershipHappyCaseFixture(
-    apiWrapper,
-    sudo,
-    m2KeyPairs,
-    paidTerms
-  )
-  tap.test('Creating second set of members', async () => secondMemberSetFixture.runner(false))
-
-  const electCouncilFixture: ElectCouncilFixture = new ElectCouncilFixture(
-    apiWrapper,
-    m1KeyPairs,
-    m2KeyPairs,
-    K,
-    sudo,
-    greaterStake,
-    lesserStake
-  )
-  tap.test('Elect council', async () => electCouncilFixture.runner(false))
+  if (db.hasCouncil()) {
+    m1KeyPairs = db.getMembers()
+    m2KeyPairs = db.getCouncil()
+  } else {
+    const councilElectionHappyCaseFixture = new CouncilElectionHappyCaseFixture(
+      apiWrapper,
+      sudo,
+      m1KeyPairs,
+      m2KeyPairs,
+      paidTerms,
+      K,
+      greaterStake,
+      lesserStake
+    )
+    councilElectionHappyCaseFixture.runner(false)
+  }
 
   const spendingProposalFixture: SpendingProposalFixture = new SpendingProposalFixture(
     apiWrapper,

+ 21 - 30
tests/network-tests/src/iznik/tests/proposals/textProposalTest.ts

@@ -8,10 +8,10 @@ import { registerJoystreamTypes } from '@nicaea/types'
 import { closeApi } from '../../utils/closeApi'
 import { ApiWrapper } from '../../utils/apiWrapper'
 import { Utils } from '../../utils/utils'
-import { BuyMembershipHappyCaseFixture } from '../fixtures/membershipModule'
-import { ElectCouncilFixture } from '../fixtures/councilElectionModule'
 import { TextProposalFixture } from '../fixtures/proposalsModule'
 import { PaidTermId } from '@nicaea/types/members'
+import { CouncilElectionHappyCaseFixture } from '../fixtures/councilElectionHappyCase'
+import { DbService } from '../../services/dbService'
 
 tap.mocha.describe('Text proposal scenario', async () => {
   initConfig()
@@ -23,10 +23,11 @@ tap.mocha.describe('Text proposal scenario', async () => {
   const provider = new WsProvider(nodeUrl)
   const apiWrapper: ApiWrapper = await ApiWrapper.create(provider)
   const sudo: KeyringPair = keyring.addFromUri(sudoUri)
+  const db: DbService = DbService.getInstance()
 
   const N: number = +process.env.MEMBERSHIP_CREATION_N!
-  const m1KeyPairs: KeyringPair[] = Utils.createKeyPairs(keyring, N)
-  const m2KeyPairs: KeyringPair[] = Utils.createKeyPairs(keyring, N)
+  let m1KeyPairs: KeyringPair[] = Utils.createKeyPairs(keyring, N)
+  let m2KeyPairs: KeyringPair[] = Utils.createKeyPairs(keyring, N)
 
   const paidTerms: PaidTermId = new PaidTermId(+process.env.MEMBERSHIP_PAID_TERMS!)
   const K: number = +process.env.COUNCIL_ELECTION_K!
@@ -36,32 +37,22 @@ tap.mocha.describe('Text proposal scenario', async () => {
 
   setTestTimeout(apiWrapper, durationInBlocks)
 
-  const firstMemberSetFixture: BuyMembershipHappyCaseFixture = new BuyMembershipHappyCaseFixture(
-    apiWrapper,
-    sudo,
-    m1KeyPairs,
-    paidTerms
-  )
-  tap.test('Creating first set of members', async () => firstMemberSetFixture.runner(false))
-
-  const secondMemberSetFixture: BuyMembershipHappyCaseFixture = new BuyMembershipHappyCaseFixture(
-    apiWrapper,
-    sudo,
-    m2KeyPairs,
-    paidTerms
-  )
-  tap.test('Creating second set of members', async () => secondMemberSetFixture.runner(false))
-
-  const electCouncilFixture: ElectCouncilFixture = new ElectCouncilFixture(
-    apiWrapper,
-    m1KeyPairs,
-    m2KeyPairs,
-    K,
-    sudo,
-    greaterStake,
-    lesserStake
-  )
-  tap.test('Elect council', async () => electCouncilFixture.runner(false))
+  if (db.hasCouncil()) {
+    m1KeyPairs = db.getMembers()
+    m2KeyPairs = db.getCouncil()
+  } else {
+    const councilElectionHappyCaseFixture = new CouncilElectionHappyCaseFixture(
+      apiWrapper,
+      sudo,
+      m1KeyPairs,
+      m2KeyPairs,
+      paidTerms,
+      K,
+      greaterStake,
+      lesserStake
+    )
+    councilElectionHappyCaseFixture.runner(false)
+  }
 
   const textProposalFixture: TextProposalFixture = new TextProposalFixture(apiWrapper, m1KeyPairs, m2KeyPairs, sudo)
   tap.test('Text proposal test', async () => textProposalFixture.runner(false))

+ 21 - 29
tests/network-tests/src/iznik/tests/proposals/updateRuntime.ts

@@ -9,9 +9,10 @@ import { closeApi } from '../../utils/closeApi'
 import { ApiWrapper } from '../../utils/apiWrapper'
 import { Utils } from '../../utils/utils'
 import { BuyMembershipHappyCaseFixture } from '../fixtures/membershipModule'
-import { ElectCouncilFixture } from '../fixtures/councilElectionModule'
 import { UpdateRuntimeFixture } from '../fixtures/proposalsModule'
 import { PaidTermId } from '@nicaea/types/members'
+import { CouncilElectionHappyCaseFixture } from '../fixtures/councilElectionHappyCase'
+import { DbService } from '../../services/dbService'
 
 tap.mocha.describe('Update runtime scenario', async () => {
   initConfig()
@@ -23,10 +24,11 @@ tap.mocha.describe('Update runtime scenario', async () => {
   const provider = new WsProvider(nodeUrl)
   const apiWrapper: ApiWrapper = await ApiWrapper.create(provider)
   const sudo: KeyringPair = keyring.addFromUri(sudoUri)
+  const db: DbService = DbService.getInstance()
 
   const N: number = +process.env.MEMBERSHIP_CREATION_N!
-  const m1KeyPairs: KeyringPair[] = Utils.createKeyPairs(keyring, N)
-  const m2KeyPairs: KeyringPair[] = Utils.createKeyPairs(keyring, N)
+  let m1KeyPairs: KeyringPair[] = Utils.createKeyPairs(keyring, N)
+  let m2KeyPairs: KeyringPair[] = Utils.createKeyPairs(keyring, N)
 
   const paidTerms: PaidTermId = new PaidTermId(+process.env.MEMBERSHIP_PAID_TERMS!)
   const K: number = +process.env.COUNCIL_ELECTION_K!
@@ -36,32 +38,22 @@ tap.mocha.describe('Update runtime scenario', async () => {
 
   setTestTimeout(apiWrapper, durationInBlocks)
 
-  const firstMemberSetFixture: BuyMembershipHappyCaseFixture = new BuyMembershipHappyCaseFixture(
-    apiWrapper,
-    sudo,
-    m1KeyPairs,
-    paidTerms
-  )
-  tap.test('Creating first set of members', async () => firstMemberSetFixture.runner(false))
-
-  const secondMemberSetFixture: BuyMembershipHappyCaseFixture = new BuyMembershipHappyCaseFixture(
-    apiWrapper,
-    sudo,
-    m2KeyPairs,
-    paidTerms
-  )
-  tap.test('Creating second set of members', async () => secondMemberSetFixture.runner(false))
-
-  const electCouncilFixture: ElectCouncilFixture = new ElectCouncilFixture(
-    apiWrapper,
-    m1KeyPairs,
-    m2KeyPairs,
-    K,
-    sudo,
-    greaterStake,
-    lesserStake
-  )
-  tap.test('Elect council', async () => electCouncilFixture.runner(false))
+  if (db.hasCouncil()) {
+    m1KeyPairs = db.getMembers()
+    m2KeyPairs = db.getCouncil()
+  } else {
+    const councilElectionHappyCaseFixture = new CouncilElectionHappyCaseFixture(
+      apiWrapper,
+      sudo,
+      m1KeyPairs,
+      m2KeyPairs,
+      paidTerms,
+      K,
+      greaterStake,
+      lesserStake
+    )
+    councilElectionHappyCaseFixture.runner(false)
+  }
 
   const updateRuntimeFixture: UpdateRuntimeFixture = new UpdateRuntimeFixture(apiWrapper, m1KeyPairs, m2KeyPairs, sudo)
   tap.test('Upgrade runtime', async () => updateRuntimeFixture.runner(false))

+ 21 - 30
tests/network-tests/src/iznik/tests/proposals/validatorCountProposalTest.ts

@@ -8,10 +8,10 @@ import { registerJoystreamTypes } from '@nicaea/types'
 import { closeApi } from '../../utils/closeApi'
 import { ApiWrapper } from '../../utils/apiWrapper'
 import { Utils } from '../../utils/utils'
-import { BuyMembershipHappyCaseFixture } from '../fixtures/membershipModule'
-import { ElectCouncilFixture } from '../fixtures/councilElectionModule'
 import { ValidatorCountProposalFixture } from '../fixtures/proposalsModule'
 import { PaidTermId } from '@nicaea/types/members'
+import { CouncilElectionHappyCaseFixture } from '../fixtures/councilElectionHappyCase'
+import { DbService } from '../../services/dbService'
 
 tap.mocha.describe('Validator count proposal scenario', async () => {
   initConfig()
@@ -23,10 +23,11 @@ tap.mocha.describe('Validator count proposal scenario', async () => {
   const provider = new WsProvider(nodeUrl)
   const apiWrapper: ApiWrapper = await ApiWrapper.create(provider)
   const sudo: KeyringPair = keyring.addFromUri(sudoUri)
+  const db: DbService = DbService.getInstance()
 
   const N: number = +process.env.MEMBERSHIP_CREATION_N!
-  const m1KeyPairs: KeyringPair[] = Utils.createKeyPairs(keyring, N)
-  const m2KeyPairs: KeyringPair[] = Utils.createKeyPairs(keyring, N)
+  let m1KeyPairs: KeyringPair[] = Utils.createKeyPairs(keyring, N)
+  let m2KeyPairs: KeyringPair[] = Utils.createKeyPairs(keyring, N)
 
   const paidTerms: PaidTermId = new PaidTermId(+process.env.MEMBERSHIP_PAID_TERMS!)
   const K: number = +process.env.COUNCIL_ELECTION_K!
@@ -37,32 +38,22 @@ tap.mocha.describe('Validator count proposal scenario', async () => {
 
   setTestTimeout(apiWrapper, durationInBlocks)
 
-  const firstMemberSetFixture: BuyMembershipHappyCaseFixture = new BuyMembershipHappyCaseFixture(
-    apiWrapper,
-    sudo,
-    m1KeyPairs,
-    paidTerms
-  )
-  tap.test('Creating first set of members', async () => firstMemberSetFixture.runner(false))
-
-  const secondMemberSetFixture: BuyMembershipHappyCaseFixture = new BuyMembershipHappyCaseFixture(
-    apiWrapper,
-    sudo,
-    m2KeyPairs,
-    paidTerms
-  )
-  tap.test('Creating second set of members', async () => secondMemberSetFixture.runner(false))
-
-  const electCouncilFixture: ElectCouncilFixture = new ElectCouncilFixture(
-    apiWrapper,
-    m1KeyPairs,
-    m2KeyPairs,
-    K,
-    sudo,
-    greaterStake,
-    lesserStake
-  )
-  tap.test('Elect council', async () => electCouncilFixture.runner(false))
+  if (db.hasCouncil()) {
+    m1KeyPairs = db.getMembers()
+    m2KeyPairs = db.getCouncil()
+  } else {
+    const councilElectionHappyCaseFixture = new CouncilElectionHappyCaseFixture(
+      apiWrapper,
+      sudo,
+      m1KeyPairs,
+      m2KeyPairs,
+      paidTerms,
+      K,
+      greaterStake,
+      lesserStake
+    )
+    councilElectionHappyCaseFixture.runner(false)
+  }
 
   const validatorCountProposalFixture: ValidatorCountProposalFixture = new ValidatorCountProposalFixture(
     apiWrapper,

+ 21 - 30
tests/network-tests/src/iznik/tests/proposals/workingGroupMintCapacityProposalTest.ts

@@ -8,12 +8,12 @@ import { registerJoystreamTypes } from '@nicaea/types'
 import { closeApi } from '../../utils/closeApi'
 import { ApiWrapper, WorkingGroups } from '../../utils/apiWrapper'
 import { Utils } from '../../utils/utils'
-import { BuyMembershipHappyCaseFixture } from '../fixtures/membershipModule'
-import { ElectCouncilFixture } from '../fixtures/councilElectionModule'
 import { VoteForProposalFixture, WorkingGroupMintCapacityProposalFixture } from '../fixtures/proposalsModule'
 import { ExpectMintCapacityChangedFixture } from '../fixtures/workingGroupModule'
 import { PaidTermId } from '@nicaea/types/members'
 import { ProposalId } from '@nicaea/types/proposals'
+import { CouncilElectionHappyCaseFixture } from '../fixtures/councilElectionHappyCase'
+import { DbService } from '../../services/dbService'
 
 tap.mocha.describe('Set storage working group mint capacity scenario', async () => {
   initConfig()
@@ -25,10 +25,11 @@ tap.mocha.describe('Set storage working group mint capacity scenario', async ()
   const provider = new WsProvider(nodeUrl)
   const apiWrapper: ApiWrapper = await ApiWrapper.create(provider)
   const sudo: KeyringPair = keyring.addFromUri(sudoUri)
+  const db: DbService = DbService.getInstance()
 
   const N: number = +process.env.MEMBERSHIP_CREATION_N!
-  const m1KeyPairs: KeyringPair[] = Utils.createKeyPairs(keyring, N)
-  const m2KeyPairs: KeyringPair[] = Utils.createKeyPairs(keyring, N)
+  let m1KeyPairs: KeyringPair[] = Utils.createKeyPairs(keyring, N)
+  let m2KeyPairs: KeyringPair[] = Utils.createKeyPairs(keyring, N)
 
   const paidTerms: PaidTermId = new PaidTermId(+process.env.MEMBERSHIP_PAID_TERMS!)
   const K: number = +process.env.COUNCIL_ELECTION_K!
@@ -39,32 +40,22 @@ tap.mocha.describe('Set storage working group mint capacity scenario', async ()
 
   setTestTimeout(apiWrapper, durationInBlocks)
 
-  const firstMemberSetFixture: BuyMembershipHappyCaseFixture = new BuyMembershipHappyCaseFixture(
-    apiWrapper,
-    sudo,
-    m1KeyPairs,
-    paidTerms
-  )
-  tap.test('Creating first set of members', async () => firstMemberSetFixture.runner(false))
-
-  const secondMemberSetFixture: BuyMembershipHappyCaseFixture = new BuyMembershipHappyCaseFixture(
-    apiWrapper,
-    sudo,
-    m2KeyPairs,
-    paidTerms
-  )
-  tap.test('Creating second set of members', async () => secondMemberSetFixture.runner(false))
-
-  const electCouncilFixture: ElectCouncilFixture = new ElectCouncilFixture(
-    apiWrapper,
-    m1KeyPairs,
-    m2KeyPairs,
-    K,
-    sudo,
-    greaterStake,
-    lesserStake
-  )
-  tap.test('Elect council', async () => electCouncilFixture.runner(false))
+  if (db.hasCouncil()) {
+    m1KeyPairs = db.getMembers()
+    m2KeyPairs = db.getCouncil()
+  } else {
+    const councilElectionHappyCaseFixture = new CouncilElectionHappyCaseFixture(
+      apiWrapper,
+      sudo,
+      m1KeyPairs,
+      m2KeyPairs,
+      paidTerms,
+      K,
+      greaterStake,
+      lesserStake
+    )
+    councilElectionHappyCaseFixture.runner(false)
+  }
 
   const newMintCapacity: BN = (await apiWrapper.getWorkingGroupMintCapacity(WorkingGroups.StorageWorkingGroup)).add(
     mintCapacityIncrement

+ 27 - 76
tests/network-tests/src/iznik/tests/workingGroup/atLeastValueBugTest.ts

@@ -5,20 +5,13 @@ import { ApiWrapper, WorkingGroups } from '../../utils/apiWrapper'
 import { WsProvider, Keyring } from '@polkadot/api'
 import { KeyringPair } from '@polkadot/keyring/types'
 import { setTestTimeout } from '../../utils/setTestTimeout'
-import {
-  AddLeaderOpeningFixture,
-  AddWorkerOpeningFixture,
-  ApplyForOpeningFixture,
-  BeginLeaderApplicationReviewFixture,
-  FillLeaderOpeningFixture,
-  LeaveRoleFixture,
-} from '../fixtures/workingGroupModule'
+import { AddWorkerOpeningFixture, LeaveRoleFixture } from '../fixtures/workingGroupModule'
 import BN from 'bn.js'
 import tap from 'tap'
-import { BuyMembershipHappyCaseFixture } from '../fixtures/membershipModule'
 import { Utils } from '../../utils/utils'
 import { PaidTermId } from '@nicaea/types/members'
-import { OpeningId } from '@nicaea/types/hiring'
+import { DbService } from '../../services/dbService'
+import { LeaderHiringHappyCaseFixture } from '../fixtures/leaderHiringHappyCase'
 
 tap.mocha.describe('Worker application happy case scenario', async () => {
   initConfig()
@@ -27,12 +20,14 @@ tap.mocha.describe('Worker application happy case scenario', async () => {
   const nodeUrl: string = process.env.NODE_URL!
   const sudoUri: string = process.env.SUDO_ACCOUNT_URI!
   const keyring = new Keyring({ type: 'sr25519' })
+  const db: DbService = DbService.getInstance()
+
   const provider = new WsProvider(nodeUrl)
   const apiWrapper: ApiWrapper = await ApiWrapper.create(provider)
   const sudo: KeyringPair = keyring.addFromUri(sudoUri)
 
   const N: number = +process.env.WORKING_GROUP_N!
-  const nKeyPairs: KeyringPair[] = Utils.createKeyPairs(keyring, N)
+  let nKeyPairs: KeyringPair[] = Utils.createKeyPairs(keyring, N)
   const leadKeyPair: KeyringPair[] = Utils.createKeyPairs(keyring, 1)
 
   const paidTerms: PaidTermId = new PaidTermId(+process.env.MEMBERSHIP_PAID_TERMS!)
@@ -47,72 +42,26 @@ tap.mocha.describe('Worker application happy case scenario', async () => {
 
   setTestTimeout(apiWrapper, durationInBlocks)
 
-  const happyCaseFixture: BuyMembershipHappyCaseFixture = new BuyMembershipHappyCaseFixture(
-    apiWrapper,
-    sudo,
-    nKeyPairs,
-    paidTerms
-  )
-  tap.test('Creating a set of members', async () => happyCaseFixture.runner(false))
-
-  const leaderHappyCaseFixture: BuyMembershipHappyCaseFixture = new BuyMembershipHappyCaseFixture(
-    apiWrapper,
-    sudo,
-    leadKeyPair,
-    paidTerms
-  )
-  tap.test('Buying membership for leader account', async () => leaderHappyCaseFixture.runner(false))
-
-  const addLeaderOpeningFixture: AddLeaderOpeningFixture = new AddLeaderOpeningFixture(
-    apiWrapper,
-    nKeyPairs,
-    sudo,
-    applicationStake,
-    roleStake,
-    openingActivationDelay,
-    WorkingGroups.StorageWorkingGroup
-  )
-  tap.test('Add lead opening', async () => await addLeaderOpeningFixture.runner(false))
-
-  let applyForLeaderOpeningFixture: ApplyForOpeningFixture
-  tap.test('Apply for lead opening', async () => {
-    applyForLeaderOpeningFixture = new ApplyForOpeningFixture(
+  if (db.hasLeader(apiWrapper.getWorkingGroupString(WorkingGroups.StorageWorkingGroup))) {
+    nKeyPairs = db.getMembers()
+    leadKeyPair[0] = db.getLeader(apiWrapper.getWorkingGroupString(WorkingGroups.StorageWorkingGroup))
+  } else {
+    const leaderHiringHappyCaseFixture: LeaderHiringHappyCaseFixture = new LeaderHiringHappyCaseFixture(
       apiWrapper,
-      leadKeyPair,
       sudo,
+      nKeyPairs,
+      leadKeyPair,
+      paidTerms,
       applicationStake,
       roleStake,
-      addLeaderOpeningFixture.getResult() as OpeningId,
-      WorkingGroups.StorageWorkingGroup
-    )
-    await applyForLeaderOpeningFixture.runner(false)
-  })
-
-  let beginLeaderApplicationReviewFixture: BeginLeaderApplicationReviewFixture
-  tap.test('Begin lead application review', async () => {
-    beginLeaderApplicationReviewFixture = new BeginLeaderApplicationReviewFixture(
-      apiWrapper,
-      sudo,
-      addLeaderOpeningFixture.getResult() as OpeningId,
-      WorkingGroups.StorageWorkingGroup
-    )
-    await beginLeaderApplicationReviewFixture.runner(false)
-  })
-
-  let fillLeaderOpeningFixture: FillLeaderOpeningFixture
-  tap.test('Fill lead opening', async () => {
-    fillLeaderOpeningFixture = new FillLeaderOpeningFixture(
-      apiWrapper,
-      leadKeyPair,
-      sudo,
-      addLeaderOpeningFixture.getResult() as OpeningId,
-      firstRewardInterval,
+      openingActivationDelay,
       rewardInterval,
+      firstRewardInterval,
       payoutAmount,
       WorkingGroups.StorageWorkingGroup
     )
-    await fillLeaderOpeningFixture.runner(false)
-  })
+    await leaderHiringHappyCaseFixture.runner(false)
+  }
 
   const addWorkerOpeningWithoutStakeFixture: AddWorkerOpeningFixture = new AddWorkerOpeningFixture(
     apiWrapper,
@@ -144,13 +93,15 @@ tap.mocha.describe('Worker application happy case scenario', async () => {
     addWorkerOpeningWithoutUnstakingPeriodFixture.runner(true)
   )
 
-  const leaveRoleFixture: LeaveRoleFixture = new LeaveRoleFixture(
-    apiWrapper,
-    leadKeyPair,
-    sudo,
-    WorkingGroups.StorageWorkingGroup
-  )
-  tap.test('Leaving lead role', async () => leaveRoleFixture.runner(false))
+  if (!db.hasLeader(apiWrapper.getWorkingGroupString(WorkingGroups.StorageWorkingGroup))) {
+    const leaveRoleFixture: LeaveRoleFixture = new LeaveRoleFixture(
+      apiWrapper,
+      leadKeyPair,
+      sudo,
+      WorkingGroups.StorageWorkingGroup
+    )
+    tap.test('Leaving lead role', async () => leaveRoleFixture.runner(false))
+  }
 
   closeApi(apiWrapper)
 })

+ 26 - 67
tests/network-tests/src/iznik/tests/workingGroup/manageWorkerAsLeadTest.ts

@@ -18,12 +18,13 @@ import {
   SlashFixture,
   TerminateRoleFixture,
 } from '../fixtures/workingGroupModule'
-import { BuyMembershipHappyCaseFixture } from '../fixtures/membershipModule'
 import { Utils } from '../../utils/utils'
 import BN from 'bn.js'
 import tap from 'tap'
 import { PaidTermId } from '@nicaea/types/members'
 import { OpeningId } from '@nicaea/types/hiring'
+import { DbService } from '../../services/dbService'
+import { LeaderHiringHappyCaseFixture } from '../fixtures/leaderHiringHappyCase'
 
 tap.mocha.describe('Manage worker as worker scenario', async () => {
   initConfig()
@@ -32,12 +33,14 @@ tap.mocha.describe('Manage worker as worker scenario', async () => {
   const nodeUrl: string = process.env.NODE_URL!
   const sudoUri: string = process.env.SUDO_ACCOUNT_URI!
   const keyring = new Keyring({ type: 'sr25519' })
+  const db: DbService = DbService.getInstance()
+
   const provider = new WsProvider(nodeUrl)
   const apiWrapper: ApiWrapper = await ApiWrapper.create(provider)
   const sudo: KeyringPair = keyring.addFromUri(sudoUri)
 
   const N: number = +process.env.WORKING_GROUP_N!
-  const nKeyPairs: KeyringPair[] = Utils.createKeyPairs(keyring, N)
+  let nKeyPairs: KeyringPair[] = Utils.createKeyPairs(keyring, N)
   const leadKeyPair: KeyringPair[] = Utils.createKeyPairs(keyring, 1)
 
   const paidTerms: PaidTermId = new PaidTermId(+process.env.MEMBERSHIP_PAID_TERMS!)
@@ -52,72 +55,26 @@ tap.mocha.describe('Manage worker as worker scenario', async () => {
 
   setTestTimeout(apiWrapper, durationInBlocks)
 
-  const happyCaseFixture: BuyMembershipHappyCaseFixture = new BuyMembershipHappyCaseFixture(
-    apiWrapper,
-    sudo,
-    nKeyPairs,
-    paidTerms
-  )
-  tap.test('Creating a set of members', async () => happyCaseFixture.runner(false))
-
-  const leaderHappyCaseFixture: BuyMembershipHappyCaseFixture = new BuyMembershipHappyCaseFixture(
-    apiWrapper,
-    sudo,
-    leadKeyPair,
-    paidTerms
-  )
-  tap.test('Buying membership for leader account', async () => leaderHappyCaseFixture.runner(false))
-
-  const addLeaderOpeningFixture: AddLeaderOpeningFixture = new AddLeaderOpeningFixture(
-    apiWrapper,
-    nKeyPairs,
-    sudo,
-    applicationStake,
-    roleStake,
-    openingActivationDelay,
-    WorkingGroups.StorageWorkingGroup
-  )
-  tap.test('Add lead opening', async () => await addLeaderOpeningFixture.runner(false))
-
-  let applyForLeaderOpeningFixture: ApplyForOpeningFixture
-  tap.test('Apply for lead opening', async () => {
-    applyForLeaderOpeningFixture = new ApplyForOpeningFixture(
+  if (db.hasLeader(apiWrapper.getWorkingGroupString(WorkingGroups.StorageWorkingGroup))) {
+    nKeyPairs = db.getMembers()
+    leadKeyPair[0] = db.getLeader(apiWrapper.getWorkingGroupString(WorkingGroups.StorageWorkingGroup))
+  } else {
+    const leaderHiringHappyCaseFixture: LeaderHiringHappyCaseFixture = new LeaderHiringHappyCaseFixture(
       apiWrapper,
-      leadKeyPair,
       sudo,
+      nKeyPairs,
+      leadKeyPair,
+      paidTerms,
       applicationStake,
       roleStake,
-      addLeaderOpeningFixture.getResult() as OpeningId,
-      WorkingGroups.StorageWorkingGroup
-    )
-    await applyForLeaderOpeningFixture.runner(false)
-  })
-
-  let beginLeaderApplicationReviewFixture: BeginLeaderApplicationReviewFixture
-  tap.test('Begin lead application review', async () => {
-    beginLeaderApplicationReviewFixture = new BeginLeaderApplicationReviewFixture(
-      apiWrapper,
-      sudo,
-      addLeaderOpeningFixture.getResult() as OpeningId,
-      WorkingGroups.StorageWorkingGroup
-    )
-    await beginLeaderApplicationReviewFixture.runner(false)
-  })
-
-  let fillLeaderOpeningFixture: FillLeaderOpeningFixture
-  tap.test('Fill lead opening', async () => {
-    fillLeaderOpeningFixture = new FillLeaderOpeningFixture(
-      apiWrapper,
-      leadKeyPair,
-      sudo,
-      addLeaderOpeningFixture.getResult() as OpeningId,
-      firstRewardInterval,
+      openingActivationDelay,
       rewardInterval,
+      firstRewardInterval,
       payoutAmount,
       WorkingGroups.StorageWorkingGroup
     )
-    await fillLeaderOpeningFixture.runner(false)
-  })
+    await leaderHiringHappyCaseFixture.runner(false)
+  }
 
   const addWorkerOpeningFixture: AddWorkerOpeningFixture = new AddWorkerOpeningFixture(
     apiWrapper,
@@ -269,13 +226,15 @@ tap.mocha.describe('Manage worker as worker scenario', async () => {
   )
   tap.test('Terminate worker role', async () => terminateRoleFixture.runner(false))
 
-  const newLeaveRoleFixture: LeaveRoleFixture = new LeaveRoleFixture(
-    apiWrapper,
-    leadKeyPair,
-    sudo,
-    WorkingGroups.StorageWorkingGroup
-  )
-  tap.test('Leaving lead role', async () => newLeaveRoleFixture.runner(false))
+  if (!db.hasLeader(apiWrapper.getWorkingGroupString(WorkingGroups.StorageWorkingGroup))) {
+    const leaveRoleFixture: LeaveRoleFixture = new LeaveRoleFixture(
+      apiWrapper,
+      leadKeyPair,
+      sudo,
+      WorkingGroups.StorageWorkingGroup
+    )
+    tap.test('Leaving lead role', async () => leaveRoleFixture.runner(false))
+  }
 
   closeApi(apiWrapper)
 })

+ 26 - 70
tests/network-tests/src/iznik/tests/workingGroup/manageWorkerAsWorkerTest.ts

@@ -6,23 +6,21 @@ import { WsProvider, Keyring } from '@polkadot/api'
 import { KeyringPair } from '@polkadot/keyring/types'
 import { setTestTimeout } from '../../utils/setTestTimeout'
 import {
-  AddLeaderOpeningFixture,
   AddWorkerOpeningFixture,
   ApplyForOpeningFixture,
   BeginApplicationReviewFixture,
-  BeginLeaderApplicationReviewFixture,
-  FillLeaderOpeningFixture,
   FillOpeningFixture,
   IncreaseStakeFixture,
   LeaveRoleFixture,
   UpdateRewardAccountFixture,
 } from '../fixtures/workingGroupModule'
-import { BuyMembershipHappyCaseFixture } from '../fixtures/membershipModule'
 import { Utils } from '../../utils/utils'
 import BN from 'bn.js'
 import tap from 'tap'
 import { PaidTermId } from '@nicaea/types/members'
 import { OpeningId } from '@nicaea/types/hiring'
+import { DbService } from '../../services/dbService'
+import { LeaderHiringHappyCaseFixture } from '../fixtures/leaderHiringHappyCase'
 
 tap.mocha.describe('Manage worker as worker scenario', async () => {
   initConfig()
@@ -31,12 +29,14 @@ tap.mocha.describe('Manage worker as worker scenario', async () => {
   const nodeUrl: string = process.env.NODE_URL!
   const sudoUri: string = process.env.SUDO_ACCOUNT_URI!
   const keyring = new Keyring({ type: 'sr25519' })
+  const db: DbService = DbService.getInstance()
+
   const provider = new WsProvider(nodeUrl)
   const apiWrapper: ApiWrapper = await ApiWrapper.create(provider)
   const sudo: KeyringPair = keyring.addFromUri(sudoUri)
 
   const N: number = +process.env.WORKING_GROUP_N!
-  const nKeyPairs: KeyringPair[] = Utils.createKeyPairs(keyring, N)
+  let nKeyPairs: KeyringPair[] = Utils.createKeyPairs(keyring, N)
   const leadKeyPair: KeyringPair[] = Utils.createKeyPairs(keyring, 1)
 
   const paidTerms: PaidTermId = new PaidTermId(+process.env.MEMBERSHIP_PAID_TERMS!)
@@ -51,72 +51,26 @@ tap.mocha.describe('Manage worker as worker scenario', async () => {
 
   setTestTimeout(apiWrapper, durationInBlocks)
 
-  const happyCaseFixture: BuyMembershipHappyCaseFixture = new BuyMembershipHappyCaseFixture(
-    apiWrapper,
-    sudo,
-    nKeyPairs,
-    paidTerms
-  )
-  tap.test('Creating a set of members', async () => happyCaseFixture.runner(false))
-
-  const leaderHappyCaseFixture: BuyMembershipHappyCaseFixture = new BuyMembershipHappyCaseFixture(
-    apiWrapper,
-    sudo,
-    leadKeyPair,
-    paidTerms
-  )
-  tap.test('Buying membership for leader account', async () => leaderHappyCaseFixture.runner(false))
-
-  const addLeaderOpeningFixture: AddLeaderOpeningFixture = new AddLeaderOpeningFixture(
-    apiWrapper,
-    nKeyPairs,
-    sudo,
-    applicationStake,
-    roleStake,
-    openingActivationDelay,
-    WorkingGroups.StorageWorkingGroup
-  )
-  tap.test('Add lead opening', async () => await addLeaderOpeningFixture.runner(false))
-
-  let applyForLeaderOpeningFixture: ApplyForOpeningFixture
-  tap.test('Apply for lead opening', async () => {
-    applyForLeaderOpeningFixture = new ApplyForOpeningFixture(
+  if (db.hasLeader(apiWrapper.getWorkingGroupString(WorkingGroups.StorageWorkingGroup))) {
+    nKeyPairs = db.getMembers()
+    leadKeyPair[0] = db.getLeader(apiWrapper.getWorkingGroupString(WorkingGroups.StorageWorkingGroup))
+  } else {
+    const leaderHiringHappyCaseFixture: LeaderHiringHappyCaseFixture = new LeaderHiringHappyCaseFixture(
       apiWrapper,
-      leadKeyPair,
       sudo,
+      nKeyPairs,
+      leadKeyPair,
+      paidTerms,
       applicationStake,
       roleStake,
-      addLeaderOpeningFixture.getResult() as OpeningId,
-      WorkingGroups.StorageWorkingGroup
-    )
-    await applyForLeaderOpeningFixture.runner(false)
-  })
-
-  let beginLeaderApplicationReviewFixture: BeginLeaderApplicationReviewFixture
-  tap.test('Begin lead application review', async () => {
-    beginLeaderApplicationReviewFixture = new BeginLeaderApplicationReviewFixture(
-      apiWrapper,
-      sudo,
-      addLeaderOpeningFixture.getResult() as OpeningId,
-      WorkingGroups.StorageWorkingGroup
-    )
-    await beginLeaderApplicationReviewFixture.runner(false)
-  })
-
-  let fillLeaderOpeningFixture: FillLeaderOpeningFixture
-  tap.test('Fill lead opening', async () => {
-    fillLeaderOpeningFixture = new FillLeaderOpeningFixture(
-      apiWrapper,
-      leadKeyPair,
-      sudo,
-      addLeaderOpeningFixture.getResult() as OpeningId,
-      firstRewardInterval,
+      openingActivationDelay,
       rewardInterval,
+      firstRewardInterval,
       payoutAmount,
       WorkingGroups.StorageWorkingGroup
     )
-    await fillLeaderOpeningFixture.runner(false)
-  })
+    await leaderHiringHappyCaseFixture.runner(false)
+  }
 
   const addWorkerOpeningFixture: AddWorkerOpeningFixture = new AddWorkerOpeningFixture(
     apiWrapper,
@@ -199,13 +153,15 @@ tap.mocha.describe('Manage worker as worker scenario', async () => {
   )
   tap.test('Update role account', async () => updateRoleAccountFixture.runner(false))
 
-  const newLeaveRoleFixture: LeaveRoleFixture = new LeaveRoleFixture(
-    apiWrapper,
-    leadKeyPair,
-    sudo,
-    WorkingGroups.StorageWorkingGroup
-  )
-  tap.test('Leaving lead role', async () => newLeaveRoleFixture.runner(false))
+  if (!db.hasLeader(apiWrapper.getWorkingGroupString(WorkingGroups.StorageWorkingGroup))) {
+    const leaveRoleFixture: LeaveRoleFixture = new LeaveRoleFixture(
+      apiWrapper,
+      leadKeyPair,
+      sudo,
+      WorkingGroups.StorageWorkingGroup
+    )
+    tap.test('Leaving lead role', async () => leaveRoleFixture.runner(false))
+  }
 
   closeApi(apiWrapper)
 })

+ 26 - 70
tests/network-tests/src/iznik/tests/workingGroup/workerApplicationHappyCaseTest.ts

@@ -7,21 +7,19 @@ import { KeyringPair } from '@polkadot/keyring/types'
 import { setTestTimeout } from '../../utils/setTestTimeout'
 import BN from 'bn.js'
 import tap from 'tap'
-import { BuyMembershipHappyCaseFixture } from '../fixtures/membershipModule'
 import { Utils } from '../../utils/utils'
 import {
-  AddLeaderOpeningFixture,
   AddWorkerOpeningFixture,
   ApplyForOpeningFixture,
   BeginApplicationReviewFixture,
-  BeginLeaderApplicationReviewFixture,
-  FillLeaderOpeningFixture,
   FillOpeningFixture,
   LeaveRoleFixture,
   WithdrawApplicationFixture,
 } from '../fixtures/workingGroupModule'
 import { PaidTermId } from '@nicaea/types/members'
 import { OpeningId } from '@nicaea/types/hiring'
+import { DbService } from '../../services/dbService'
+import { LeaderHiringHappyCaseFixture } from '../fixtures/leaderHiringHappyCase'
 
 tap.mocha.describe('Worker application happy case scenario', async () => {
   initConfig()
@@ -30,12 +28,14 @@ tap.mocha.describe('Worker application happy case scenario', async () => {
   const nodeUrl: string = process.env.NODE_URL!
   const sudoUri: string = process.env.SUDO_ACCOUNT_URI!
   const keyring = new Keyring({ type: 'sr25519' })
+  const db: DbService = DbService.getInstance()
+
   const provider = new WsProvider(nodeUrl)
   const apiWrapper: ApiWrapper = await ApiWrapper.create(provider)
   const sudo: KeyringPair = keyring.addFromUri(sudoUri)
 
   const N: number = +process.env.WORKING_GROUP_N!
-  const nKeyPairs: KeyringPair[] = Utils.createKeyPairs(keyring, N)
+  let nKeyPairs: KeyringPair[] = Utils.createKeyPairs(keyring, N)
   const leadKeyPair: KeyringPair[] = Utils.createKeyPairs(keyring, 1)
 
   const paidTerms: PaidTermId = new PaidTermId(+process.env.MEMBERSHIP_PAID_TERMS!)
@@ -50,72 +50,26 @@ tap.mocha.describe('Worker application happy case scenario', async () => {
 
   setTestTimeout(apiWrapper, durationInBlocks)
 
-  const happyCaseFixture: BuyMembershipHappyCaseFixture = new BuyMembershipHappyCaseFixture(
-    apiWrapper,
-    sudo,
-    nKeyPairs,
-    paidTerms
-  )
-  tap.test('Creating a set of members', async () => happyCaseFixture.runner(false))
-
-  const leaderHappyCaseFixture: BuyMembershipHappyCaseFixture = new BuyMembershipHappyCaseFixture(
-    apiWrapper,
-    sudo,
-    leadKeyPair,
-    paidTerms
-  )
-  tap.test('Buying membership for leader account', async () => leaderHappyCaseFixture.runner(false))
-
-  const addLeaderOpeningFixture: AddLeaderOpeningFixture = new AddLeaderOpeningFixture(
-    apiWrapper,
-    nKeyPairs,
-    sudo,
-    applicationStake,
-    roleStake,
-    openingActivationDelay,
-    WorkingGroups.StorageWorkingGroup
-  )
-  tap.test('Add lead opening', async () => await addLeaderOpeningFixture.runner(false))
-
-  let applyForLeaderOpeningFixture: ApplyForOpeningFixture
-  tap.test('Apply for lead opening', async () => {
-    applyForLeaderOpeningFixture = new ApplyForOpeningFixture(
+  if (db.hasLeader(apiWrapper.getWorkingGroupString(WorkingGroups.StorageWorkingGroup))) {
+    nKeyPairs = db.getMembers()
+    leadKeyPair[0] = db.getLeader(apiWrapper.getWorkingGroupString(WorkingGroups.StorageWorkingGroup))
+  } else {
+    const leaderHiringHappyCaseFixture: LeaderHiringHappyCaseFixture = new LeaderHiringHappyCaseFixture(
       apiWrapper,
-      leadKeyPair,
       sudo,
+      nKeyPairs,
+      leadKeyPair,
+      paidTerms,
       applicationStake,
       roleStake,
-      addLeaderOpeningFixture.getResult() as OpeningId,
-      WorkingGroups.StorageWorkingGroup
-    )
-    await applyForLeaderOpeningFixture.runner(false)
-  })
-
-  let beginLeaderApplicationReviewFixture: BeginLeaderApplicationReviewFixture
-  tap.test('Begin lead application review', async () => {
-    beginLeaderApplicationReviewFixture = new BeginLeaderApplicationReviewFixture(
-      apiWrapper,
-      sudo,
-      addLeaderOpeningFixture.getResult() as OpeningId,
-      WorkingGroups.StorageWorkingGroup
-    )
-    await beginLeaderApplicationReviewFixture.runner(false)
-  })
-
-  let fillLeaderOpeningFixture: FillLeaderOpeningFixture
-  tap.test('Fill lead opening', async () => {
-    fillLeaderOpeningFixture = new FillLeaderOpeningFixture(
-      apiWrapper,
-      leadKeyPair,
-      sudo,
-      addLeaderOpeningFixture.getResult() as OpeningId,
-      firstRewardInterval,
+      openingActivationDelay,
       rewardInterval,
+      firstRewardInterval,
       payoutAmount,
       WorkingGroups.StorageWorkingGroup
     )
-    await fillLeaderOpeningFixture.runner(false)
-  })
+    await leaderHiringHappyCaseFixture.runner(false)
+  }
 
   const addWorkerOpeningFixture: AddWorkerOpeningFixture = new AddWorkerOpeningFixture(
     apiWrapper,
@@ -194,13 +148,15 @@ tap.mocha.describe('Worker application happy case scenario', async () => {
     await fillOpeningFixture.runner(false)
   })
 
-  const leaveRoleFixture: LeaveRoleFixture = new LeaveRoleFixture(
-    apiWrapper,
-    leadKeyPair,
-    sudo,
-    WorkingGroups.StorageWorkingGroup
-  )
-  tap.test('Leaving lead role', async () => leaveRoleFixture.runner(false))
+  if (!db.hasLeader(apiWrapper.getWorkingGroupString(WorkingGroups.StorageWorkingGroup))) {
+    const leaveRoleFixture: LeaveRoleFixture = new LeaveRoleFixture(
+      apiWrapper,
+      leadKeyPair,
+      sudo,
+      WorkingGroups.StorageWorkingGroup
+    )
+    tap.test('Leaving lead role', async () => leaveRoleFixture.runner(false))
+  }
 
   closeApi(apiWrapper)
 })

+ 26 - 70
tests/network-tests/src/iznik/tests/workingGroup/workerApplicationRejectionCaseTest.ts

@@ -7,20 +7,18 @@ import { KeyringPair } from '@polkadot/keyring/types'
 import { setTestTimeout } from '../../utils/setTestTimeout'
 import BN from 'bn.js'
 import tap from 'tap'
-import { BuyMembershipHappyCaseFixture } from '../fixtures/membershipModule'
 import { Utils } from '../../utils/utils'
 import {
   AcceptApplicationsFixture,
-  AddLeaderOpeningFixture,
   AddWorkerOpeningFixture,
   ApplyForOpeningFixture,
-  BeginLeaderApplicationReviewFixture,
-  FillLeaderOpeningFixture,
   LeaveRoleFixture,
   TerminateApplicationsFixture,
 } from '../fixtures/workingGroupModule'
 import { PaidTermId } from '@nicaea/types/members'
 import { OpeningId } from '@nicaea/types/hiring'
+import { DbService } from '../../services/dbService'
+import { LeaderHiringHappyCaseFixture } from '../fixtures/leaderHiringHappyCase'
 
 tap.mocha.describe('Worker application happy case scenario', async () => {
   initConfig()
@@ -29,12 +27,14 @@ tap.mocha.describe('Worker application happy case scenario', async () => {
   const nodeUrl: string = process.env.NODE_URL!
   const sudoUri: string = process.env.SUDO_ACCOUNT_URI!
   const keyring = new Keyring({ type: 'sr25519' })
+  const db: DbService = DbService.getInstance()
+
   const provider = new WsProvider(nodeUrl)
   const apiWrapper: ApiWrapper = await ApiWrapper.create(provider)
   const sudo: KeyringPair = keyring.addFromUri(sudoUri)
 
   const N: number = +process.env.WORKING_GROUP_N!
-  const nKeyPairs: KeyringPair[] = Utils.createKeyPairs(keyring, N)
+  let nKeyPairs: KeyringPair[] = Utils.createKeyPairs(keyring, N)
   const leadKeyPair: KeyringPair[] = Utils.createKeyPairs(keyring, 1)
   const nonMemberKeyPairs = Utils.createKeyPairs(keyring, N)
 
@@ -51,72 +51,26 @@ tap.mocha.describe('Worker application happy case scenario', async () => {
 
   setTestTimeout(apiWrapper, durationInBlocks)
 
-  const happyCaseFixture: BuyMembershipHappyCaseFixture = new BuyMembershipHappyCaseFixture(
-    apiWrapper,
-    sudo,
-    nKeyPairs,
-    paidTerms
-  )
-  tap.test('Creating a set of members', async () => happyCaseFixture.runner(false))
-
-  const leaderHappyCaseFixture: BuyMembershipHappyCaseFixture = new BuyMembershipHappyCaseFixture(
-    apiWrapper,
-    sudo,
-    leadKeyPair,
-    paidTerms
-  )
-  tap.test('Buying membership for leader account', async () => leaderHappyCaseFixture.runner(false))
-
-  const addLeaderOpeningFixture: AddLeaderOpeningFixture = new AddLeaderOpeningFixture(
-    apiWrapper,
-    nKeyPairs,
-    sudo,
-    applicationStake,
-    roleStake,
-    leadOpeningActivationDelay,
-    WorkingGroups.StorageWorkingGroup
-  )
-  tap.test('Add lead opening', async () => await addLeaderOpeningFixture.runner(false))
-
-  let applyForLeaderOpeningFixture: ApplyForOpeningFixture
-  tap.test('Apply for lead opening', async () => {
-    applyForLeaderOpeningFixture = new ApplyForOpeningFixture(
+  if (db.hasLeader(apiWrapper.getWorkingGroupString(WorkingGroups.StorageWorkingGroup))) {
+    nKeyPairs = db.getMembers()
+    leadKeyPair[0] = db.getLeader(apiWrapper.getWorkingGroupString(WorkingGroups.StorageWorkingGroup))
+  } else {
+    const leaderHiringHappyCaseFixture: LeaderHiringHappyCaseFixture = new LeaderHiringHappyCaseFixture(
       apiWrapper,
-      leadKeyPair,
       sudo,
+      nKeyPairs,
+      leadKeyPair,
+      paidTerms,
       applicationStake,
       roleStake,
-      addLeaderOpeningFixture.getResult() as OpeningId,
-      WorkingGroups.StorageWorkingGroup
-    )
-    await applyForLeaderOpeningFixture.runner(false)
-  })
-
-  let beginLeaderApplicationReviewFixture: BeginLeaderApplicationReviewFixture
-  tap.test('Begin lead application review', async () => {
-    beginLeaderApplicationReviewFixture = new BeginLeaderApplicationReviewFixture(
-      apiWrapper,
-      sudo,
-      addLeaderOpeningFixture.getResult() as OpeningId,
-      WorkingGroups.StorageWorkingGroup
-    )
-    await beginLeaderApplicationReviewFixture.runner(false)
-  })
-
-  let fillLeaderOpeningFixture: FillLeaderOpeningFixture
-  tap.test('Fill lead opening', async () => {
-    fillLeaderOpeningFixture = new FillLeaderOpeningFixture(
-      apiWrapper,
-      leadKeyPair,
-      sudo,
-      addLeaderOpeningFixture.getResult() as OpeningId,
-      firstRewardInterval,
+      leadOpeningActivationDelay,
       rewardInterval,
+      firstRewardInterval,
       payoutAmount,
       WorkingGroups.StorageWorkingGroup
     )
-    await fillLeaderOpeningFixture.runner(false)
-  })
+    await leaderHiringHappyCaseFixture.runner(false)
+  }
 
   const addWorkerOpeningFixture: AddWorkerOpeningFixture = new AddWorkerOpeningFixture(
     apiWrapper,
@@ -194,13 +148,15 @@ tap.mocha.describe('Worker application happy case scenario', async () => {
   )
   tap.test('Terminate worker applicaitons', async () => terminateApplicationsFixture.runner(false))
 
-  const leaveRoleFixture: LeaveRoleFixture = new LeaveRoleFixture(
-    apiWrapper,
-    leadKeyPair,
-    sudo,
-    WorkingGroups.StorageWorkingGroup
-  )
-  tap.test('Leaving lead role', async () => leaveRoleFixture.runner(false))
+  if (!db.hasLeader(apiWrapper.getWorkingGroupString(WorkingGroups.StorageWorkingGroup))) {
+    const leaveRoleFixture: LeaveRoleFixture = new LeaveRoleFixture(
+      apiWrapper,
+      leadKeyPair,
+      sudo,
+      WorkingGroups.StorageWorkingGroup
+    )
+    tap.test('Leaving lead role', async () => leaveRoleFixture.runner(false))
+  }
 
   closeApi(apiWrapper)
 })

+ 43 - 89
tests/network-tests/src/iznik/tests/workingGroup/workerPayoutTest.ts

@@ -6,26 +6,24 @@ import { WsProvider, Keyring } from '@polkadot/api'
 import { KeyringPair } from '@polkadot/keyring/types'
 import { setTestTimeout } from '../../utils/setTestTimeout'
 import {
-  AddLeaderOpeningFixture,
   AddWorkerOpeningFixture,
   ApplyForOpeningFixture,
   AwaitPayoutFixture,
   BeginApplicationReviewFixture,
-  BeginLeaderApplicationReviewFixture,
   ExpectMintCapacityChangedFixture,
-  FillLeaderOpeningFixture,
   FillOpeningFixture,
   LeaveRoleFixture,
 } from '../fixtures/workingGroupModule'
 import BN from 'bn.js'
 import tap from 'tap'
-import { BuyMembershipHappyCaseFixture } from '../fixtures/membershipModule'
 import { Utils } from '../../utils/utils'
-import { ElectCouncilFixture } from '../fixtures/councilElectionModule'
 import { VoteForProposalFixture, WorkingGroupMintCapacityProposalFixture } from '../fixtures/proposalsModule'
 import { PaidTermId } from '@nicaea/types/members'
 import { OpeningId } from '@nicaea/types/hiring'
 import { ProposalId } from '@nicaea/types/proposals'
+import { DbService } from '../../services/dbService'
+import { CouncilElectionHappyCaseFixture } from '../fixtures/councilElectionHappyCase'
+import { LeaderHiringHappyCaseFixture } from '../fixtures/leaderHiringHappyCase'
 
 tap.mocha.describe('Worker application happy case scenario', async () => {
   initConfig()
@@ -34,13 +32,15 @@ tap.mocha.describe('Worker application happy case scenario', async () => {
   const nodeUrl: string = process.env.NODE_URL!
   const sudoUri: string = process.env.SUDO_ACCOUNT_URI!
   const keyring = new Keyring({ type: 'sr25519' })
+  const db: DbService = DbService.getInstance()
+
   const provider = new WsProvider(nodeUrl)
   const apiWrapper: ApiWrapper = await ApiWrapper.create(provider)
   const sudo: KeyringPair = keyring.addFromUri(sudoUri)
 
   const N: number = +process.env.WORKING_GROUP_N!
-  const m1KeyPairs: KeyringPair[] = Utils.createKeyPairs(keyring, N)
-  const m2KeyPairs: KeyringPair[] = Utils.createKeyPairs(keyring, N)
+  let m1KeyPairs: KeyringPair[] = Utils.createKeyPairs(keyring, N)
+  let m2KeyPairs: KeyringPair[] = Utils.createKeyPairs(keyring, N)
   const leadKeyPair: KeyringPair[] = Utils.createKeyPairs(keyring, 1)
 
   const paidTerms: PaidTermId = new PaidTermId(+process.env.MEMBERSHIP_PAID_TERMS!)
@@ -61,91 +61,43 @@ tap.mocha.describe('Worker application happy case scenario', async () => {
 
   setTestTimeout(apiWrapper, durationInBlocks)
 
-  const firstMemberSetFixture: BuyMembershipHappyCaseFixture = new BuyMembershipHappyCaseFixture(
-    apiWrapper,
-    sudo,
-    m1KeyPairs,
-    paidTerms
-  )
-  tap.test('Creating first set of members', async () => firstMemberSetFixture.runner(false))
-
-  const secondMemberSetFixture: BuyMembershipHappyCaseFixture = new BuyMembershipHappyCaseFixture(
-    apiWrapper,
-    sudo,
-    m2KeyPairs,
-    paidTerms
-  )
-  tap.test('Creating second set of members', async () => secondMemberSetFixture.runner(false))
-
-  const electCouncilFixture: ElectCouncilFixture = new ElectCouncilFixture(
-    apiWrapper,
-    m1KeyPairs,
-    m2KeyPairs,
-    K,
-    sudo,
-    greaterStake,
-    lesserStake
-  )
-  tap.test('Elect council', async () => electCouncilFixture.runner(false))
-
-  const leaderHappyCaseFixture: BuyMembershipHappyCaseFixture = new BuyMembershipHappyCaseFixture(
-    apiWrapper,
-    sudo,
-    leadKeyPair,
-    paidTerms
-  )
-  tap.test('Buying membership for leader account', async () => leaderHappyCaseFixture.runner(false))
-
-  const addLeaderOpeningFixture: AddLeaderOpeningFixture = new AddLeaderOpeningFixture(
-    apiWrapper,
-    m1KeyPairs,
-    sudo,
-    applicationStake,
-    roleStake,
-    openingActivationDelay,
-    WorkingGroups.StorageWorkingGroup
-  )
-  tap.test('Add lead opening', async () => await addLeaderOpeningFixture.runner(false))
-
-  let applyForLeaderOpeningFixture: ApplyForOpeningFixture
-  tap.test('Apply for lead opening', async () => {
-    applyForLeaderOpeningFixture = new ApplyForOpeningFixture(
+  if (db.hasCouncil()) {
+    m1KeyPairs = db.getMembers()
+    m2KeyPairs = db.getCouncil()
+  } else {
+    const councilElectionHappyCaseFixture = new CouncilElectionHappyCaseFixture(
       apiWrapper,
-      leadKeyPair,
       sudo,
-      applicationStake,
-      roleStake,
-      addLeaderOpeningFixture.getResult() as OpeningId,
-      WorkingGroups.StorageWorkingGroup
+      m1KeyPairs,
+      m2KeyPairs,
+      paidTerms,
+      K,
+      greaterStake,
+      lesserStake
     )
-    await applyForLeaderOpeningFixture.runner(false)
-  })
-
-  let beginLeaderApplicationReviewFixture: BeginLeaderApplicationReviewFixture
-  tap.test('Begin lead application review', async () => {
-    beginLeaderApplicationReviewFixture = new BeginLeaderApplicationReviewFixture(
+    councilElectionHappyCaseFixture.runner(false)
+  }
+
+  if (db.hasLeader(apiWrapper.getWorkingGroupString(WorkingGroups.StorageWorkingGroup))) {
+    m1KeyPairs = db.getMembers()
+    leadKeyPair[0] = db.getLeader(apiWrapper.getWorkingGroupString(WorkingGroups.StorageWorkingGroup))
+  } else {
+    const leaderHiringHappyCaseFixture: LeaderHiringHappyCaseFixture = new LeaderHiringHappyCaseFixture(
       apiWrapper,
       sudo,
-      addLeaderOpeningFixture.getResult() as OpeningId,
-      WorkingGroups.StorageWorkingGroup
-    )
-    await beginLeaderApplicationReviewFixture.runner(false)
-  })
-
-  let fillLeaderOpeningFixture: FillLeaderOpeningFixture
-  tap.test('Fill lead opening', async () => {
-    fillLeaderOpeningFixture = new FillLeaderOpeningFixture(
-      apiWrapper,
+      m1KeyPairs,
       leadKeyPair,
-      sudo,
-      addLeaderOpeningFixture.getResult() as OpeningId,
-      leaderFirstRewardInterval,
+      paidTerms,
+      applicationStake,
+      roleStake,
+      openingActivationDelay,
       leaderRewardInterval,
+      leaderFirstRewardInterval,
       payoutAmount,
       WorkingGroups.StorageWorkingGroup
     )
-    await fillLeaderOpeningFixture.runner(false)
-  })
+    await leaderHiringHappyCaseFixture.runner(false)
+  }
 
   const workingGroupMintCapacityProposalFixture: WorkingGroupMintCapacityProposalFixture = new WorkingGroupMintCapacityProposalFixture(
     apiWrapper,
@@ -234,13 +186,15 @@ tap.mocha.describe('Worker application happy case scenario', async () => {
   )
   tap.test('Await worker payout', async () => awaitPayoutFixture.runner(false))
 
-  const leaveRoleFixture: LeaveRoleFixture = new LeaveRoleFixture(
-    apiWrapper,
-    leadKeyPair,
-    sudo,
-    WorkingGroups.StorageWorkingGroup
-  )
-  tap.test('Leaving lead role', async () => leaveRoleFixture.runner(false))
+  if (!db.hasLeader(apiWrapper.getWorkingGroupString(WorkingGroups.StorageWorkingGroup))) {
+    const leaveRoleFixture: LeaveRoleFixture = new LeaveRoleFixture(
+      apiWrapper,
+      leadKeyPair,
+      sudo,
+      WorkingGroups.StorageWorkingGroup
+    )
+    tap.test('Leaving lead role', async () => leaveRoleFixture.runner(false))
+  }
 
   closeApi(apiWrapper)
 })

+ 12 - 9
tests/network-tests/src/iznik/utils/sender.ts

@@ -1,33 +1,36 @@
 import BN from 'bn.js'
-import { ApiPromise } from '@polkadot/api'
+import { ApiPromise, Keyring } from '@polkadot/api'
 import { Index } from '@polkadot/types/interfaces'
 import { SubmittableExtrinsic } from '@polkadot/api/types'
 import { KeyringPair } from '@polkadot/keyring/types'
+import { DbService } from '../services/dbService'
 
 export class Sender {
   private readonly api: ApiPromise
-  private static nonceMap: Map<string, BN> = new Map()
+  private db: DbService = DbService.getInstance()
 
   constructor(api: ApiPromise) {
     this.api = api
   }
 
   private async getNonce(address: string): Promise<BN> {
-    let oncahinNonce: BN = new BN(0)
-    if (!Sender.nonceMap.get(address)) {
-      oncahinNonce = await this.api.query.system.accountNonce<Index>(address)
+    let oncahinNonce: BN = await this.api.query.system.accountNonce<Index>(address)
+    let nonce: BN
+    if (!this.db.hasNonce(address)) {
+      nonce = oncahinNonce
+    } else {
+      nonce = this.db.getNonce(address)
     }
-    let nonce: BN | undefined = Sender.nonceMap.get(address)
-    if (!nonce) {
+    if (oncahinNonce.gt(nonce)) {
       nonce = oncahinNonce
     }
     const nextNonce: BN = nonce.addn(1)
-    Sender.nonceMap.set(address, nextNonce)
+    this.db.setNonce(address, nextNonce)
     return nonce
   }
 
   private clearNonce(address: string): void {
-    Sender.nonceMap.delete(address)
+    this.db.removeNonce(address)
   }
 
   public async signAndSend(