Browse Source

query node - council & referendum mappings XIII

ondratra 3 years ago
parent
commit
e24e10d996

+ 116 - 17
query-node/mappings/src/council.ts

@@ -32,6 +32,8 @@ import {
   StakeReleasedEvent,
 
   // Council & referendum structures
+  ReferendumStageVoting,
+  ReferendumStageRevealing,
   ReferendumStageRevealingOptionResult,
 
   // Council & referendum schema types
@@ -50,6 +52,7 @@ import {
 
   // Misc
   Membership,
+  VariantNone,
 } from 'query-node/dist/model'
 import { Council, Referendum } from '../generated/types'
 import { CouncilCandidacyNoteMetadata } from '@joystream/metadata-protobuf'
@@ -78,7 +81,7 @@ async function getCandidate(
   store: DatabaseManager,
   memberId: string,
   electionRound?: ElectionRound,
-  relations?: string[]
+  relations: string[] = []
 ): Promise<Candidate> {
   const event = await store.get(NewCandidateEvent, {
     join: { alias: 'event', innerJoin: { candidate: 'event.candidate' } },
@@ -89,9 +92,10 @@ async function getCandidate(
       }
     },
     order: { inBlock: 'DESC', indexInBlock: 'DESC' },
-    relations: ['candidate'].concat((relations || []).map((r) => `candidate.${r}`)),
+    relations: ['candidate'].concat(relations.map((r) => `candidate.${r}`)),
   })
 
+
   if (!event) {
     throw new Error(`Candidate not found. memberId '${memberId}' electionRound '${electionRound?.id}'`)
   }
@@ -118,8 +122,11 @@ async function getCouncilMember(store: DatabaseManager, memberId: string): Promi
 /*
   Returns the current election round record.
 */
-async function getCurrentElectionRound(store: DatabaseManager): Promise<ElectionRound> {
-  const electionRound = await store.get(ElectionRound, { order: { cycleId: 'DESC' } })
+async function getCurrentElectionRound(
+  store: DatabaseManager,
+  relations: string[] = []
+): Promise<ElectionRound> {
+  const electionRound = await store.get(ElectionRound, { order: { cycleId: 'DESC' }, relations: relations })
 
   if (!electionRound) {
     throw new Error(`No election round found`)
@@ -780,7 +787,6 @@ export async function council_RequestFunded({ event, store }: EventContext & Sto
 */
 export async function referendum_ReferendumStarted({ event, store }: EventContext & StoreContext): Promise<void> {
   // common event processing
-
   const [winningTargetCount] = new Referendum.ReferendumStartedEvent(event).params
 
   const referendumStartedEvent = new ReferendumStartedEvent({
@@ -790,7 +796,9 @@ export async function referendum_ReferendumStarted({ event, store }: EventContex
 
   await store.save<ReferendumStartedEvent>(referendumStartedEvent)
 
-  // no specific event processing
+  // specific event processing
+
+  await recordReferendumVotingStart(store, event.blockNumber, winningTargetCount.toNumber())
 }
 
 /*
@@ -811,7 +819,23 @@ export async function referendum_ReferendumStartedForcefully({
 
   await store.save<ReferendumStartedForcefullyEvent>(referendumStartedForcefullyEvent)
 
-  // no specific event processing
+  // specific event processing
+
+  await recordReferendumVotingStart(store, event.blockNumber, winningTargetCount.toNumber())
+}
+
+/*
+  Adds record about referendum voting start to the current election round.
+*/
+async function recordReferendumVotingStart(store: DatabaseManager, blockNumber: number, winningTargetCount: number) {
+  const electionRound = await getCurrentElectionRound(store)
+
+  // add referendum voting stage record to election round
+  const referendumStage = new ReferendumStageVoting()
+  referendumStage.startedAtBlock = new BN(blockNumber)
+  referendumStage.winningTargetCount = new BN(winningTargetCount)
+  referendumStage.electionRound = electionRound
+  await store.save<ReferendumStageVoting>(referendumStage)
 }
 
 /*
@@ -828,7 +852,18 @@ export async function referendum_RevealingStageStarted({ event, store }: EventCo
 
   await store.save<RevealingStageStartedEvent>(revealingStageStartedEvent)
 
-  // no specific event processing
+  // specific event processing
+
+  const electionRound = await getCurrentElectionRound(store, ['referendumStageVoting'])
+
+  // add referendum revealing stage record to election round
+  const referendumStage = new ReferendumStageRevealing()
+  referendumStage.startedAtBlock = new BN(event.blockNumber)
+
+  referendumStage.winningTargetCount = (electionRound.referendumStageVoting as ReferendumStageVoting).winningTargetCount
+  referendumStage.intermediateWinners = []
+  referendumStage.electionRound = electionRound
+  await store.save<ReferendumStageRevealing>(referendumStage)
 }
 
 /*
@@ -839,15 +874,11 @@ export async function referendum_ReferendumFinished({ event, store }: EventConte
 
   const [optionResultsRaw] = new Referendum.ReferendumFinishedEvent(event).params
 
+  const electionRound = await getCurrentElectionRound(store, ['referendumStageRevealing', 'referendumStageRevealing.intermediateWinners'])
+
   const referendumFinishedEvent = new ReferendumFinishedEvent({
     ...genericEventFields(event),
-    optionResults: optionResultsRaw.map(
-      (item, index) =>
-        new ReferendumStageRevealingOptionResult({
-          votePower: item.vote_power,
-          option: new Membership({ id: optionResultsRaw[index].option_id.toString() }),
-        })
-    ),
+    optionResults: electionRound.referendumStageRevealing!.intermediateWinners,
   })
 
   await store.save<ReferendumFinishedEvent>(referendumFinishedEvent)
@@ -899,17 +930,28 @@ export async function referendum_VoteRevealed({ event, store }: EventContext & S
   // specific event processing
 
   // read vote info
-  const electionRound = await getCurrentElectionRound(store)
-  const candidate = await getCandidate(store, memberId.toString(), electionRound)
+  const electionRound = await getCurrentElectionRound(store, [
+    'referendumStageRevealing',
+    'referendumStageRevealing.intermediateWinners',
+  ])
+  const candidate = await getCandidate(store, memberId.toString(), electionRound, ['member'])
   const castVote = await getAccountCastVote(store, account.toString(), electionRound)
 
   // update cast vote's voteFor info
   castVote.voteFor = candidate
   await store.save<CastVote>(castVote)
 
+  // increase candidate's total vote power received accordingly
   candidate.votePower = candidate.votePower.add(castVote.votePower)
   await store.save<Candidate>(candidate)
 
+  // recalculate intermediate winners
+  await integrateCandidateToIntermediateWinners(
+    store,
+    electionRound.referendumStageRevealing! as ReferendumStageRevealing,
+    candidate
+  )
+
   // common event processing - save
 
   const voteRevealedEvent = new VoteRevealedEvent({
@@ -920,6 +962,63 @@ export async function referendum_VoteRevealed({ event, store }: EventContext & S
   await store.save<VoteRevealedEvent>(voteRevealedEvent)
 }
 
+/*
+  Recalculates the list of intermediate winners after a candidate receives a new vote.
+*/
+async function integrateCandidateToIntermediateWinners(
+  store: DatabaseManager,
+  referendumStageRevealing: ReferendumStageRevealing,
+  candidate: Candidate
+): Promise<ReferendumStageRevealingOptionResult[]> {
+  const winningTargetCount = referendumStageRevealing.winningTargetCount.toNumber()
+
+  // adds a new intermediate winner record
+  const addRecord = async () => {
+    const newRecord = new ReferendumStageRevealingOptionResult({
+      votePower: candidate.votePower,
+      option: candidate.member,
+      referendumStageRevealing,
+    })
+
+    await store.save<ReferendumStageRevealingOptionResult>(newRecord)
+
+    return newRecord
+  }
+
+  // compose new list of intermediate winners
+  const [result, toBeAdded] = await referendumStageRevealing.intermediateWinners!.reduce(
+    async (acc, item, index) => {
+      let [newWinners, toBeAdded] = await acc
+
+      // place winner to the list if it has more votes than previous one
+      if (toBeAdded && item.votePower < candidate.votePower) {
+        const newRecord = await addRecord()
+
+        newWinners = [...newWinners, newRecord]
+        toBeAdded = false
+      }
+
+      // remove no-longer-winner record if needed
+      if (newWinners.length >= winningTargetCount) {
+        await store.remove(item)
+
+        return [newWinners, false]
+      }
+
+      // place winner to the list (possibly to new place among intermediate winners)
+      return [[...newWinners, item], toBeAdded]
+    },
+    Promise.resolve([[], true] as [ReferendumStageRevealingOptionResult[], boolean])
+  )
+
+  // place winner to end of list if needed
+  if (toBeAdded && result.length < winningTargetCount) {
+    return [...result, await addRecord()]
+  }
+
+  return result
+}
+
 /*
   The event is emitted when a vote's stake is released.
 */

+ 7 - 1
query-node/mappings/src/genesis.ts

@@ -1,6 +1,12 @@
 import { StoreContext, DatabaseManager } from '@joystream/hydra-common'
 import BN from 'bn.js'
-import { MembershipSystemSnapshot, WorkingGroup, ElectedCouncil, ElectionRound } from 'query-node/dist/model'
+import {
+  MembershipSystemSnapshot,
+  WorkingGroup,
+  ElectedCouncil,
+  ElectionRound,
+  VariantNone,
+} from 'query-node/dist/model'
 import { membershipSystem, workingGroups } from './genesis-data'
 import { CURRENT_NETWORK } from './common'
 

+ 35 - 48
query-node/schemas/council.graphql

@@ -122,42 +122,33 @@ type CandidacyNoteMetadata @entity {
 
 ################### Referendum #################################################
 
-# This section (ReferendumStage*) is not useful before referencing variant is solved.
-# See commented reference in ElectionRound, for example.
-# Uncomment after solving the issue or delete if it can't be solved or is not needed
-# in the future.
-#
-#type ReferendumStageInactive @variant {
-#  # no properties
-#
-#  # TODO: remove me - variant needs to have at least 1 property now
-#  dummy: Int
-#}
-#
-#type ReferendumStageVoting @variant {
-#  "Block in which referendum started."
-#  started: BigInt!
-#
-#  "Target number of winners."
-#  winningTargetCount: BigInt!
-#
-#  "Index of current election"
-#  electionRound: ElectionRound!
-#}
-#
-#type ReferendumStageRevealing @variant {
-#  "Block in which referendum started"
-#  started: BigInt!
-#
-#  "Target number of winners"
-#  winningTargetCount: BigInt!
-#
-#  "Intermediate winning options"
-#  intermediateWinners: [ReferendumStageRevealingOptionResult!]!
-#
-#  "Index of current election"
-#  electionRound: ElectionRound!
-#}
+# NOTE: Due to the bug https://github.com/Joystream/hydra/issues/467 `ReferendumStage*` variants were transformed to entities.
+#       It shouldn't have any negative impact on current usage, but it might need remodeling in the future depending on usage.
+
+type ReferendumStageVoting @entity {
+  "Block in which referendum started."
+  startedAtBlock: BigInt!
+
+  "Target number of winners."
+  winningTargetCount: BigInt!
+
+  "Election round"
+  electionRound: ElectionRound!
+}
+
+type ReferendumStageRevealing @entity {
+  "Block in which referendum started"
+  startedAtBlock: BigInt!
+
+  "Target number of winners"
+  winningTargetCount: BigInt!
+
+  "Intermediate winning options"
+  intermediateWinners: [ReferendumStageRevealingOptionResult!]! @derivedFrom(field: "referendumStageRevealing")
+
+  "Election round."
+  electionRound: ElectionRound!
+}
 
 type ReferendumStageRevealingOptionResult @entity {
   "Member that received votes."
@@ -166,19 +157,13 @@ type ReferendumStageRevealingOptionResult @entity {
   "Sum of votes' power received."
   votePower: BigInt!
 
-  # TODO: reference variant (how?)
-  #referendumRevealingStages: [ReferendumStageRevealing!]! @derivedFrom(field: "intermediateWinners")
-
-  "Election round."
-  electionRound: ElectionRound!
+  "Referendum revealing stage."
+  referendumStageRevealing: ReferendumStageRevealing!
 
   "Event that concluded the referendum."
-  referendumFinishedEvent: ReferendumFinishedEvent!
+  referendumFinishedEvent: ReferendumFinishedEvent
 }
 
-# TODO: this maybe needs to be @entity - so it's saved in db
-#union ReferendumStage = ReferendumStageInactive | ReferendumStageVoting | ReferendumStageRevealing | VariantNone
-
 type CastVote @entity {
   "Hashed vote that was casted before being revealed. Hex format."
   commitment: String!
@@ -251,9 +236,11 @@ type ElectionRound @entity {
   "Vote cast in the election round."
   castVotes: [CastVote!]! @derivedFrom(field: "electionRound")
 
-  # TODO: reference variant (how?)
-  #referendumStageVoting: ReferendumStage @derivedFrom(field: "cycleId")
-  #referendumStageRevealing: ReferendumStage @derivedFrom(field: "cycleId")
+  "Referendum voting stage that happened during this election round."
+  referendumStageVoting: ReferendumStageVoting @derivedFrom(field: "electionRound")
+
+  "Referendum revealing stage that happened during this election round."
+  referendumStageRevealing: ReferendumStageRevealing @derivedFrom(field: "electionRound")
 
   "Council that is ruling during the election."
   electedCouncil: ElectedCouncil!

+ 1 - 1
query-node/schemas/councilEvents.graphql

@@ -490,7 +490,7 @@ type ReferendumFinishedEvent implements Event @entity {
   ### SPECIFIC DATA ###
 
   "Referendum results."
-  optionResults: [ReferendumStageRevealingOptionResult!] @derivedFrom(field: "referendumFinishedEvent")
+  optionResults: [ReferendumStageRevealingOptionResult!]! @derivedFrom(field: "referendumFinishedEvent")
 }
 
 type VoteCastEvent implements Event @entity {

+ 12 - 0
tests/integration-tests/src/QueryNodeApi.ts

@@ -8,6 +8,10 @@ import {
   GetCurrentCouncilMembers,
   GetCurrentCouncilMembersQuery,
   GetCurrentCouncilMembersQueryVariables,
+  ReferendumIntermediateWinnersFieldsFragment,
+  GetReferendumIntermediateWinners,
+  GetReferendumIntermediateWinnersQuery,
+  GetReferendumIntermediateWinnersQueryVariables,
   GetMemberByIdQuery,
   GetMemberByIdQueryVariables,
   GetMemberById,
@@ -446,6 +450,14 @@ export class QueryNodeApi {
     )
   }
 
+  public async getReferendumIntermediateWinners(): Promise<ReferendumIntermediateWinnersFieldsFragment | null> {
+    return this.firstEntityQuery<GetReferendumIntermediateWinnersQuery, GetReferendumIntermediateWinnersQueryVariables>(
+      GetReferendumIntermediateWinners,
+      {},
+      'electionRounds'
+    )
+  }
+
   // TODO: Use event id
   public async getInvitesTransferredEvent(
     sourceMemberId: MemberId

+ 14 - 1
tests/integration-tests/src/fixtures/council/ElectCouncilFixture.ts

@@ -77,12 +77,25 @@ export class ElectCouncilFixture extends BaseQueryNodeFixture {
     await api.prepareAccountsForFeeExpenses(votersStakingAccounts, votingTxs)
     await api.sendExtrinsicsAndGetResults(revealingTxs, votersStakingAccounts)
 
+    const candidatesToWinIds = candidatesMemberIds.slice(0, councilSize.toNumber()).map((id) => id.toString())
+
+    // check intermediate election winners are properly set
+    await query.tryQueryWithTimeout(
+      () => query.getReferendumIntermediateWinners(),
+      (qnReferendumIntermediateWinners) => {
+        assert.sameMembers(
+          qnReferendumIntermediateWinners!.referendumStageRevealing!.intermediateWinners!.map(item => item.option.id.toString()),
+          candidatesToWinIds
+        )
+      }
+    )
+
     await this.api.untilCouncilStage('Idle')
 
     const councilMembers = await api.query.council.councilMembers()
     assert.sameMembers(
       councilMembers.map((m) => m.membership_id.toString()),
-      candidatesMemberIds.slice(0, councilSize.toNumber()).map((id) => id.toString())
+      candidatesToWinIds
     )
 
     await assertCouncilMembersRuntimeQnMatch(this.api, this.query)

+ 11 - 11
tests/integration-tests/src/fixtures/proposals/CreateProposalsFixture.ts

@@ -125,8 +125,8 @@ export class CreateProposalsFixture extends StandardizedFixture {
         Utils.assert(qProposal.details.__typename === 'CreateWorkingGroupLeadOpeningProposalDetails')
         const details = proposalDetails.asType('CreateWorkingGroupLeadOpening')
         assert.equal(qProposal.details.group?.id, getWorkingGroupModuleName(details.working_group))
-        assert.equal(qProposal.details.rewardPerBlock, details.reward_per_block.toString())
-        assert.equal(qProposal.details.stakeAmount, details.stake_policy.stake_amount.toString())
+        assert.equal(qProposal.details.rewardPerBlock.toString(), details.reward_per_block.toString())
+        assert.equal(qProposal.details.stakeAmount.toString(), details.stake_policy.stake_amount.toString())
         assert.equal(qProposal.details.unstakingPeriod, details.stake_policy.leaving_unstaking_period.toNumber())
         Utils.assert(qProposal.details.metadata)
         assertQueriedOpeningMetadataIsValid(
@@ -140,7 +140,7 @@ export class CreateProposalsFixture extends StandardizedFixture {
         const details = proposalDetails.asType('DecreaseWorkingGroupLeadStake')
         const [workerId, amount, group] = details
         const expectedId = `${getWorkingGroupModuleName(group)}-${workerId.toString()}`
-        assert.equal(qProposal.details.amount, amount.toString())
+        assert.equal(qProposal.details.amount.toString(), amount.toString())
         assert.equal(qProposal.details.lead?.id, expectedId)
         break
       }
@@ -200,19 +200,19 @@ export class CreateProposalsFixture extends StandardizedFixture {
       case 'SetCouncilBudgetIncrement': {
         Utils.assert(qProposal.details.__typename === 'SetCouncilBudgetIncrementProposalDetails')
         const details = proposalDetails.asType('SetCouncilBudgetIncrement')
-        assert.equal(qProposal.details.newAmount, details.toString())
+        assert.equal(qProposal.details.newAmount.toString(), details.toString())
         break
       }
       case 'SetCouncilorReward': {
         Utils.assert(qProposal.details.__typename === 'SetCouncilorRewardProposalDetails')
         const details = proposalDetails.asType('SetCouncilorReward')
-        assert.equal(qProposal.details.newRewardPerBlock, details.toString())
+        assert.equal(qProposal.details.newRewardPerBlock.toString(), details.toString())
         break
       }
       case 'SetInitialInvitationBalance': {
         Utils.assert(qProposal.details.__typename === 'SetInitialInvitationBalanceProposalDetails')
         const details = proposalDetails.asType('SetInitialInvitationBalance')
-        assert.equal(qProposal.details.newInitialInvitationBalance, details.toString())
+        assert.equal(qProposal.details.newInitialInvitationBalance.toString(), details.toString())
         break
       }
       case 'SetInitialInvitationCount': {
@@ -236,7 +236,7 @@ export class CreateProposalsFixture extends StandardizedFixture {
       case 'SetMembershipPrice': {
         Utils.assert(qProposal.details.__typename === 'SetMembershipPriceProposalDetails')
         const details = proposalDetails.asType('SetMembershipPrice')
-        assert.equal(qProposal.details.newPrice, details.toString())
+        assert.equal(qProposal.details.newPrice.toString(), details.toString())
         break
       }
       case 'SetReferralCut': {
@@ -250,7 +250,7 @@ export class CreateProposalsFixture extends StandardizedFixture {
         const details = proposalDetails.asType('SetWorkingGroupLeadReward')
         const [workerId, reward, group] = details
         const expectedId = `${getWorkingGroupModuleName(group)}-${workerId.toString()}`
-        assert.equal(qProposal.details.newRewardPerBlock, reward.toString())
+        assert.equal(qProposal.details.newRewardPerBlock.toString(), reward.toString())
         assert.equal(qProposal.details.lead?.id, expectedId)
         break
       }
@@ -266,7 +266,7 @@ export class CreateProposalsFixture extends StandardizedFixture {
         const [workerId, amount, group] = details
         const expectedId = `${getWorkingGroupModuleName(group)}-${workerId.toString()}`
         assert.equal(qProposal.details.lead?.id, expectedId)
-        assert.equal(qProposal.details.amount, amount.toString())
+        assert.equal(qProposal.details.amount.toString(), amount.toString())
         break
       }
       case 'TerminateWorkingGroupLead': {
@@ -274,7 +274,7 @@ export class CreateProposalsFixture extends StandardizedFixture {
         const details = proposalDetails.asType('TerminateWorkingGroupLead')
         const expectedId = `${getWorkingGroupModuleName(details.working_group)}-${details.worker_id.toString()}`
         assert.equal(qProposal.details.lead?.id, expectedId)
-        assert.equal(qProposal.details.slashingAmount, details.slashing_amount.toString())
+        assert.equal(qProposal.details.slashingAmount!.toString(), details.slashing_amount.toString())
         break
       }
       case 'UnlockBlogPost': {
@@ -287,7 +287,7 @@ export class CreateProposalsFixture extends StandardizedFixture {
         Utils.assert(qProposal.details.__typename === 'UpdateWorkingGroupBudgetProposalDetails')
         const details = proposalDetails.asType('UpdateWorkingGroupBudget')
         const [balance, group, balanceKind] = details
-        assert.equal(qProposal.details.amount, (balanceKind.isOfType('Negative') ? '-' : '') + balance.toString())
+        assert.equal(qProposal.details.amount.toString(), (balanceKind.isOfType('Negative') ? '-' : '') + balance.toString())
         assert.equal(qProposal.details.group?.id, getWorkingGroupModuleName(group))
         break
       }

+ 40 - 11
tests/integration-tests/src/graphql/generated/queries.ts

@@ -5,10 +5,20 @@ export type CouncilMemberFieldsFragment = { id: string; member: { id: string } }
 
 export type ElectedCouncilFieldsFragment = { councilMembers: Array<CouncilMemberFieldsFragment> }
 
+export type ReferendumIntermediateWinnersFieldsFragment = {
+  referendumStageRevealing?: Types.Maybe<{ intermediateWinners: Array<{ option: { id: string } }> }>
+}
+
 export type GetCurrentCouncilMembersQueryVariables = Types.Exact<{ [key: string]: never }>
 
 export type GetCurrentCouncilMembersQuery = { electedCouncils: Array<ElectedCouncilFieldsFragment> }
 
+export type GetReferendumIntermediateWinnersQueryVariables = Types.Exact<{ [key: string]: never }>
+
+export type GetReferendumIntermediateWinnersQuery = {
+  electionRounds: Array<ReferendumIntermediateWinnersFieldsFragment>
+}
+
 export type ForumCategoryFieldsFragment = {
   id: string
   createdAt: any
@@ -846,9 +856,9 @@ type ProposalDetailsFields_SetMaxValidatorCountProposalDetails_Fragment = {
 
 type ProposalDetailsFields_CreateWorkingGroupLeadOpeningProposalDetails_Fragment = {
   __typename: 'CreateWorkingGroupLeadOpeningProposalDetails'
-  stakeAmount: any
+  stakeAmount: number
   unstakingPeriod: number
-  rewardPerBlock: any
+  rewardPerBlock: number
   metadata?: Types.Maybe<OpeningMetadataFieldsFragment>
   group?: Types.Maybe<{ id: string }>
 }
@@ -861,31 +871,31 @@ type ProposalDetailsFields_FillWorkingGroupLeadOpeningProposalDetails_Fragment =
 
 type ProposalDetailsFields_UpdateWorkingGroupBudgetProposalDetails_Fragment = {
   __typename: 'UpdateWorkingGroupBudgetProposalDetails'
-  amount: any
+  amount: number
   group?: Types.Maybe<{ id: string }>
 }
 
 type ProposalDetailsFields_DecreaseWorkingGroupLeadStakeProposalDetails_Fragment = {
   __typename: 'DecreaseWorkingGroupLeadStakeProposalDetails'
-  amount: any
+  amount: number
   lead?: Types.Maybe<{ id: string }>
 }
 
 type ProposalDetailsFields_SlashWorkingGroupLeadProposalDetails_Fragment = {
   __typename: 'SlashWorkingGroupLeadProposalDetails'
-  amount: any
+  amount: number
   lead?: Types.Maybe<{ id: string }>
 }
 
 type ProposalDetailsFields_SetWorkingGroupLeadRewardProposalDetails_Fragment = {
   __typename: 'SetWorkingGroupLeadRewardProposalDetails'
-  newRewardPerBlock: any
+  newRewardPerBlock: number
   lead?: Types.Maybe<{ id: string }>
 }
 
 type ProposalDetailsFields_TerminateWorkingGroupLeadProposalDetails_Fragment = {
   __typename: 'TerminateWorkingGroupLeadProposalDetails'
-  slashingAmount?: Types.Maybe<any>
+  slashingAmount?: Types.Maybe<number>
   lead?: Types.Maybe<{ id: string }>
 }
 
@@ -901,22 +911,22 @@ type ProposalDetailsFields_CancelWorkingGroupLeadOpeningProposalDetails_Fragment
 
 type ProposalDetailsFields_SetMembershipPriceProposalDetails_Fragment = {
   __typename: 'SetMembershipPriceProposalDetails'
-  newPrice: any
+  newPrice: number
 }
 
 type ProposalDetailsFields_SetCouncilBudgetIncrementProposalDetails_Fragment = {
   __typename: 'SetCouncilBudgetIncrementProposalDetails'
-  newAmount: any
+  newAmount: number
 }
 
 type ProposalDetailsFields_SetCouncilorRewardProposalDetails_Fragment = {
   __typename: 'SetCouncilorRewardProposalDetails'
-  newRewardPerBlock: any
+  newRewardPerBlock: number
 }
 
 type ProposalDetailsFields_SetInitialInvitationBalanceProposalDetails_Fragment = {
   __typename: 'SetInitialInvitationBalanceProposalDetails'
-  newInitialInvitationBalance: any
+  newInitialInvitationBalance: number
 }
 
 type ProposalDetailsFields_SetInitialInvitationCountProposalDetails_Fragment = {
@@ -1907,6 +1917,17 @@ export const ElectedCouncilFields = gql`
   }
   ${CouncilMemberFields}
 `
+export const ReferendumIntermediateWinnersFields = gql`
+  fragment ReferendumIntermediateWinnersFields on ElectionRound {
+    referendumStageRevealing {
+      intermediateWinners {
+        option {
+          id
+        }
+      }
+    }
+  }
+`
 export const ForumCategoryFields = gql`
   fragment ForumCategoryFields on ForumCategory {
     id
@@ -3648,6 +3669,14 @@ export const GetCurrentCouncilMembers = gql`
   }
   ${ElectedCouncilFields}
 `
+export const GetReferendumIntermediateWinners = gql`
+  query getReferendumIntermediateWinners {
+    electionRounds(orderBy: createdAt_DESC) {
+      ...ReferendumIntermediateWinnersFields
+    }
+  }
+  ${ReferendumIntermediateWinnersFields}
+`
 export const GetCategoriesByIds = gql`
   query getCategoriesByIds($ids: [ID!]) {
     forumCategories(where: { id_in: $ids }) {

File diff suppressed because it is too large
+ 58 - 607
tests/integration-tests/src/graphql/generated/schema.ts


+ 16 - 0
tests/integration-tests/src/graphql/queries/council.graphql

@@ -11,8 +11,24 @@ fragment ElectedCouncilFields on ElectedCouncil {
   }
 }
 
+fragment ReferendumIntermediateWinnersFields on ElectionRound {
+  referendumStageRevealing {
+    intermediateWinners {
+      option {
+        id
+      }
+    }
+  }
+}
+
 query getCurrentCouncilMembers {
   electedCouncils(where: { endedAtBlock_eq: null }) {
     ...ElectedCouncilFields
   }
 }
+
+query getReferendumIntermediateWinners {
+  electionRounds(orderBy: createdAt_DESC) {
+    ...ReferendumIntermediateWinnersFields
+  }
+}

Some files were not shown because too many files changed in this diff