Browse Source

query node - council & referendum mappings XIV

ondratra 3 years ago
parent
commit
a87dc67e18

+ 14 - 102
query-node/mappings/src/council.ts

@@ -34,7 +34,6 @@ import {
   // Council & referendum structures
   // Council & referendum structures
   ReferendumStageVoting,
   ReferendumStageVoting,
   ReferendumStageRevealing,
   ReferendumStageRevealing,
-  ReferendumStageRevealingOptionResult,
 
 
   // Council & referendum schema types
   // Council & referendum schema types
   CouncilStageUpdate,
   CouncilStageUpdate,
@@ -146,23 +145,11 @@ async function getCurrentStageUpdate(store: DatabaseManager): Promise<CouncilSta
 /*
 /*
   Returns current elected council record.
   Returns current elected council record.
 */
 */
-async function getCurrentElectedCouncil(store: DatabaseManager): Promise<ElectedCouncil | undefined> {
+async function getCurrentElectedCouncil(store: DatabaseManager): Promise<ElectedCouncil> {
   const electedCouncil = await store.get(ElectedCouncil, { order: { electedAtBlock: 'DESC' } })
   const electedCouncil = await store.get(ElectedCouncil, { order: { electedAtBlock: 'DESC' } })
 
 
-  return electedCouncil
-}
-
-/*
-  Returns current elected council record. Throws error when no council is elected
-*/
-async function getRequiredCurrentElectedCouncil(store: DatabaseManager): Promise<ElectedCouncil> {
-  const electedCouncil = await getCurrentElectedCouncil(store)
-
-  if (!electedCouncil) {
-    throw new Error('No council is elected.')
-  }
-
-  return electedCouncil
+  // elected council's existence is guaranteed because one is inserted in `genesis.ts`
+  return electedCouncil as ElectedCouncil
 }
 }
 
 
 /*
 /*
@@ -217,9 +204,6 @@ async function updateCouncilStage(
   electionProblem?: ElectionProblem
   electionProblem?: ElectionProblem
 ): Promise<void> {
 ): Promise<void> {
   const electedCouncil = await getCurrentElectedCouncil(store)
   const electedCouncil = await getCurrentElectedCouncil(store)
-  if (!electedCouncil) {
-    return
-  }
 
 
   const councilStageUpdate = new CouncilStageUpdate({
   const councilStageUpdate = new CouncilStageUpdate({
     stage: councilStage,
     stage: councilStage,
@@ -321,7 +305,7 @@ export async function council_AnnouncingPeriodStarted({ event, store }: EventCon
   // specific event processing
   // specific event processing
 
 
   // restart elections
   // restart elections
-  const electedCouncil = await getRequiredCurrentElectedCouncil(store)
+  const electedCouncil = await getCurrentElectedCouncil(store)
   await startNextElectionRound(store, electedCouncil, event.blockNumber)
   await startNextElectionRound(store, electedCouncil, event.blockNumber)
 }
 }
 
 
@@ -342,7 +326,7 @@ export async function council_NotEnoughCandidates({ event, store }: EventContext
   // specific event processing
   // specific event processing
 
 
   // restart elections
   // restart elections
-  const electedCouncil = await getRequiredCurrentElectedCouncil(store)
+  const electedCouncil = await getCurrentElectedCouncil(store)
   await startNextElectionRound(store, electedCouncil, event.blockNumber, ElectionProblem.NOT_ENOUGH_CANDIDATES)
   await startNextElectionRound(store, electedCouncil, event.blockNumber, ElectionProblem.NOT_ENOUGH_CANDIDATES)
 }
 }
 
 
@@ -440,13 +424,11 @@ export async function council_NewCouncilElected({ event, store }: EventContext &
 
 
   // mark old council as resinged
   // mark old council as resinged
   const oldElectedCouncil = await getCurrentElectedCouncil(store)
   const oldElectedCouncil = await getCurrentElectedCouncil(store)
-  if (oldElectedCouncil) {
-    oldElectedCouncil.isResigned = true
-    oldElectedCouncil.endedAtBlock = event.blockNumber
-    oldElectedCouncil.endedAtTime = new Date(event.blockTimestamp)
-    oldElectedCouncil.endedAtNetwork = CURRENT_NETWORK
-    await store.save<ElectedCouncil>(oldElectedCouncil)
-  }
+  oldElectedCouncil.isResigned = true
+  oldElectedCouncil.endedAtBlock = event.blockNumber
+  oldElectedCouncil.endedAtTime = new Date(event.blockTimestamp)
+  oldElectedCouncil.endedAtNetwork = CURRENT_NETWORK
+  await store.save<ElectedCouncil>(oldElectedCouncil)
 
 
   // get election round and its candidates
   // get election round and its candidates
   const electionRound = await getCurrentElectionRound(store)
   const electionRound = await getCurrentElectionRound(store)
@@ -532,7 +514,7 @@ export async function council_NewCouncilNotElected({ event, store }: EventContex
   // specific event processing
   // specific event processing
 
 
   // restart elections
   // restart elections
-  const electedCouncil = await getRequiredCurrentElectedCouncil(store)
+  const electedCouncil = await getCurrentElectedCouncil(store)
   await startNextElectionRound(store, electedCouncil, event.blockNumber, ElectionProblem.NEW_COUNCIL_NOT_ELECTED)
   await startNextElectionRound(store, electedCouncil, event.blockNumber, ElectionProblem.NEW_COUNCIL_NOT_ELECTED)
 }
 }
 
 
@@ -854,9 +836,7 @@ export async function referendum_RevealingStageStarted({ event, store }: EventCo
   // add referendum revealing stage record to election round
   // add referendum revealing stage record to election round
   const referendumStage = new ReferendumStageRevealing()
   const referendumStage = new ReferendumStageRevealing()
   referendumStage.startedAtBlock = new BN(event.blockNumber)
   referendumStage.startedAtBlock = new BN(event.blockNumber)
-
   referendumStage.winningTargetCount = (electionRound.referendumStageVoting as ReferendumStageVoting).winningTargetCount
   referendumStage.winningTargetCount = (electionRound.referendumStageVoting as ReferendumStageVoting).winningTargetCount
-  referendumStage.intermediateWinners = []
   referendumStage.electionRound = electionRound
   referendumStage.electionRound = electionRound
   await store.save<ReferendumStageRevealing>(referendumStage)
   await store.save<ReferendumStageRevealing>(referendumStage)
 }
 }
@@ -869,14 +849,8 @@ export async function referendum_ReferendumFinished({ event, store }: EventConte
 
 
   // const [optionResultsRaw] = new Referendum.ReferendumFinishedEvent(event).params
   // const [optionResultsRaw] = new Referendum.ReferendumFinishedEvent(event).params
 
 
-  const electionRound = await getCurrentElectionRound(store, [
-    'referendumStageRevealing',
-    'referendumStageRevealing.intermediateWinners',
-  ])
-
   const referendumFinishedEvent = new ReferendumFinishedEvent({
   const referendumFinishedEvent = new ReferendumFinishedEvent({
     ...genericEventFields(event),
     ...genericEventFields(event),
-    optionResults: electionRound.referendumStageRevealing!.intermediateWinners,
   })
   })
 
 
   await store.save<ReferendumFinishedEvent>(referendumFinishedEvent)
   await store.save<ReferendumFinishedEvent>(referendumFinishedEvent)
@@ -928,10 +902,7 @@ export async function referendum_VoteRevealed({ event, store }: EventContext & S
   // specific event processing
   // specific event processing
 
 
   // read vote info
   // read vote info
-  const electionRound = await getCurrentElectionRound(store, [
-    'referendumStageRevealing',
-    'referendumStageRevealing.intermediateWinners',
-  ])
+  const electionRound = await getCurrentElectionRound(store)
   const candidate = await getCandidate(store, memberId.toString(), electionRound, ['member'])
   const candidate = await getCandidate(store, memberId.toString(), electionRound, ['member'])
   const castVote = await getAccountCastVote(store, account.toString(), electionRound)
   const castVote = await getAccountCastVote(store, account.toString(), electionRound)
 
 
@@ -941,15 +912,10 @@ export async function referendum_VoteRevealed({ event, store }: EventContext & S
 
 
   // increase candidate's total vote power received accordingly
   // increase candidate's total vote power received accordingly
   candidate.votePower = candidate.votePower.add(castVote.votePower)
   candidate.votePower = candidate.votePower.add(castVote.votePower)
+  candidate.lastVoteReceivedAtBlock = new BN(event.blockNumber)
+  candidate.lastVoteReceivedAtEventNumber = event.indexInBlock
   await store.save<Candidate>(candidate)
   await store.save<Candidate>(candidate)
 
 
-  // recalculate intermediate winners
-  await integrateCandidateToIntermediateWinners(
-    store,
-    electionRound.referendumStageRevealing! as ReferendumStageRevealing,
-    candidate
-  )
-
   // common event processing - save
   // common event processing - save
 
 
   const voteRevealedEvent = new VoteRevealedEvent({
   const voteRevealedEvent = new VoteRevealedEvent({
@@ -960,60 +926,6 @@ export async function referendum_VoteRevealed({ event, store }: EventContext & S
   await store.save<VoteRevealedEvent>(voteRevealedEvent)
   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) => {
-    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.
   The event is emitted when a vote's stake is released.
 */
 */

+ 1 - 1
query-node/mappings/src/membership.ts

@@ -106,8 +106,8 @@ async function createNewMemberFromParams(
     isFoundingMember: false,
     isFoundingMember: false,
     isCouncilMember: false,
     isCouncilMember: false,
 
 
+    councilCandidacies: [],
     councilMembers: [],
     councilMembers: [],
-    referendumStageRevealingOptionResults: [],
   })
   })
 
 
   await store.save<MemberMetadata>(member.metadata)
   await store.save<MemberMetadata>(member.metadata)

+ 6 - 17
query-node/schemas/council.graphql

@@ -71,6 +71,12 @@ type Candidate @entity {
   "Sum of power of all votes received."
   "Sum of power of all votes received."
   votePower: BigInt!
   votePower: BigInt!
 
 
+  "Block in which the last vote was received."
+  lastVoteReceivedAtBlock: BigInt
+
+  "Event number in block in which the last vote was received."
+  lastVoteReceivedAtEventNumber: Int
+
   "The metadata contained in note."
   "The metadata contained in note."
   noteMetadata: CandidacyNoteMetadata!
   noteMetadata: CandidacyNoteMetadata!
 
 
@@ -143,27 +149,10 @@ type ReferendumStageRevealing @entity {
   "Target number of winners"
   "Target number of winners"
   winningTargetCount: BigInt!
   winningTargetCount: BigInt!
 
 
-  "Intermediate winning options"
-  intermediateWinners: [ReferendumStageRevealingOptionResult!]! @derivedFrom(field: "referendumStageRevealing")
-
   "Election round."
   "Election round."
   electionRound: ElectionRound!
   electionRound: ElectionRound!
 }
 }
 
 
-type ReferendumStageRevealingOptionResult @entity {
-  "Member that received votes."
-  option: Membership!
-
-  "Sum of votes' power received."
-  votePower: BigInt!
-
-  "Referendum revealing stage."
-  referendumStageRevealing: ReferendumStageRevealing!
-
-  "Event that concluded the referendum."
-  referendumFinishedEvent: ReferendumFinishedEvent
-}
-
 type CastVote @entity {
 type CastVote @entity {
   "Hashed vote that was casted before being revealed. Hex format."
   "Hashed vote that was casted before being revealed. Hex format."
   commitment: String!
   commitment: String!

+ 0 - 3
query-node/schemas/councilEvents.graphql

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

+ 3 - 3
query-node/schemas/membership.graphql

@@ -89,11 +89,11 @@ type Membership @entity {
   #"Council reward payment made received by the member."
   #"Council reward payment made received by the member."
   #budgetPayments: [BudgetPayment!] @derivedFrom(field: "member")
   #budgetPayments: [BudgetPayment!] @derivedFrom(field: "member")
 
 
+  "Candidacies announced by this member."
+  councilCandidacies: [Candidate!] @derivedFrom(field: "member")
+
   "Elected councils' memberships of the member."
   "Elected councils' memberships of the member."
   councilMembers: [CouncilMember!] @derivedFrom(field: "member")
   councilMembers: [CouncilMember!] @derivedFrom(field: "member")
-
-  "Referendum results for the member."
-  referendumStageRevealingOptionResults: [ReferendumStageRevealingOptionResult!] @derivedFrom(field: "option")
 }
 }
 
 
 type MembershipSystemSnapshot @entity {
 type MembershipSystemSnapshot @entity {

+ 14 - 5
tests/integration-tests/src/QueryNodeApi.ts

@@ -8,7 +8,7 @@ import {
   GetCurrentCouncilMembers,
   GetCurrentCouncilMembers,
   GetCurrentCouncilMembersQuery,
   GetCurrentCouncilMembersQuery,
   GetCurrentCouncilMembersQueryVariables,
   GetCurrentCouncilMembersQueryVariables,
-  ReferendumIntermediateWinnersFieldsFragment,
+  CandidateFieldsFragment,
   GetReferendumIntermediateWinners,
   GetReferendumIntermediateWinners,
   GetReferendumIntermediateWinnersQuery,
   GetReferendumIntermediateWinnersQuery,
   GetReferendumIntermediateWinnersQueryVariables,
   GetReferendumIntermediateWinnersQueryVariables,
@@ -450,11 +450,20 @@ export class QueryNodeApi {
     )
     )
   }
   }
 
 
-  public async getReferendumIntermediateWinners(): Promise<ReferendumIntermediateWinnersFieldsFragment | null> {
-    return this.firstEntityQuery<GetReferendumIntermediateWinnersQuery, GetReferendumIntermediateWinnersQueryVariables>(
+  public async getReferendumIntermediateWinners(
+    electionRoundCycleId: number,
+    councilSize: number
+  ): Promise<CandidateFieldsFragment[]> {
+    return this.multipleEntitiesQuery<
+      GetReferendumIntermediateWinnersQuery,
+      GetReferendumIntermediateWinnersQueryVariables
+    >(
       GetReferendumIntermediateWinners,
       GetReferendumIntermediateWinners,
-      {},
-      'electionRounds'
+      {
+        electionRoundCycleId,
+        councilSize,
+      },
+      'candidates'
     )
     )
   }
   }
 
 

+ 2 - 4
tests/integration-tests/src/fixtures/council/ElectCouncilFixture.ts

@@ -81,12 +81,10 @@ export class ElectCouncilFixture extends BaseQueryNodeFixture {
 
 
     // check intermediate election winners are properly set
     // check intermediate election winners are properly set
     await query.tryQueryWithTimeout(
     await query.tryQueryWithTimeout(
-      () => query.getReferendumIntermediateWinners(),
+      () => query.getReferendumIntermediateWinners(cycleId.toNumber(), councilSize.toNumber()),
       (qnReferendumIntermediateWinners) => {
       (qnReferendumIntermediateWinners) => {
         assert.sameMembers(
         assert.sameMembers(
-          qnReferendumIntermediateWinners!.referendumStageRevealing!.intermediateWinners!.map((item) =>
-            item.option.id.toString()
-          ),
+          qnReferendumIntermediateWinners.map((item) => item.member.id.toString()),
           candidatesToWinIds
           candidatesToWinIds
         )
         )
       }
       }

+ 19 - 19
tests/integration-tests/src/graphql/generated/queries.ts

@@ -5,19 +5,18 @@ export type CouncilMemberFieldsFragment = { id: string; member: { id: string } }
 
 
 export type ElectedCouncilFieldsFragment = { councilMembers: Array<CouncilMemberFieldsFragment> }
 export type ElectedCouncilFieldsFragment = { councilMembers: Array<CouncilMemberFieldsFragment> }
 
 
-export type ReferendumIntermediateWinnersFieldsFragment = {
-  referendumStageRevealing?: Types.Maybe<{ intermediateWinners: Array<{ option: { id: string } }> }>
-}
+export type CandidateFieldsFragment = { id: string; member: { id: string } }
 
 
 export type GetCurrentCouncilMembersQueryVariables = Types.Exact<{ [key: string]: never }>
 export type GetCurrentCouncilMembersQueryVariables = Types.Exact<{ [key: string]: never }>
 
 
 export type GetCurrentCouncilMembersQuery = { electedCouncils: Array<ElectedCouncilFieldsFragment> }
 export type GetCurrentCouncilMembersQuery = { electedCouncils: Array<ElectedCouncilFieldsFragment> }
 
 
-export type GetReferendumIntermediateWinnersQueryVariables = Types.Exact<{ [key: string]: never }>
+export type GetReferendumIntermediateWinnersQueryVariables = Types.Exact<{
+  electionRoundCycleId: Types.Scalars['Int']
+  councilSize: Types.Scalars['Int']
+}>
 
 
-export type GetReferendumIntermediateWinnersQuery = {
-  electionRounds: Array<ReferendumIntermediateWinnersFieldsFragment>
-}
+export type GetReferendumIntermediateWinnersQuery = { candidates: Array<CandidateFieldsFragment> }
 
 
 export type ForumCategoryFieldsFragment = {
 export type ForumCategoryFieldsFragment = {
   id: string
   id: string
@@ -1917,14 +1916,11 @@ export const ElectedCouncilFields = gql`
   }
   }
   ${CouncilMemberFields}
   ${CouncilMemberFields}
 `
 `
-export const ReferendumIntermediateWinnersFields = gql`
-  fragment ReferendumIntermediateWinnersFields on ElectionRound {
-    referendumStageRevealing {
-      intermediateWinners {
-        option {
-          id
-        }
-      }
+export const CandidateFields = gql`
+  fragment CandidateFields on Candidate {
+    id
+    member {
+      id
     }
     }
   }
   }
 `
 `
@@ -3670,12 +3666,16 @@ export const GetCurrentCouncilMembers = gql`
   ${ElectedCouncilFields}
   ${ElectedCouncilFields}
 `
 `
 export const GetReferendumIntermediateWinners = gql`
 export const GetReferendumIntermediateWinners = gql`
-  query getReferendumIntermediateWinners {
-    electionRounds(orderBy: createdAt_DESC) {
-      ...ReferendumIntermediateWinnersFields
+  query getReferendumIntermediateWinners($electionRoundCycleId: Int!, $councilSize: Int!) {
+    candidates(
+      where: { electionRound: { cycleId_eq: $electionRoundCycleId }, votePower_gt: 0 }
+      orderBy: [votePower_DESC, lastVoteReceivedAtBlock_ASC, lastVoteReceivedAtEventNumber_ASC]
+      limit: $councilSize
+    ) {
+      ...CandidateFields
     }
     }
   }
   }
-  ${ReferendumIntermediateWinnersFields}
+  ${CandidateFields}
 `
 `
 export const GetCategoriesByIds = gql`
 export const GetCategoriesByIds = gql`
   query getCategoriesByIds($ids: [ID!]) {
   query getCategoriesByIds($ids: [ID!]) {

+ 28 - 142
tests/integration-tests/src/graphql/generated/schema.ts

@@ -2043,6 +2043,10 @@ export type Candidate = BaseGraphQlObject & {
   candidacyWithdrawn: Scalars['Boolean']
   candidacyWithdrawn: Scalars['Boolean']
   /** Sum of power of all votes received. */
   /** Sum of power of all votes received. */
   votePower: Scalars['BigInt']
   votePower: Scalars['BigInt']
+  /** Block in which the last vote was received. */
+  lastVoteReceivedAtBlock?: Maybe<Scalars['BigInt']>
+  /** Event number in block in which the last vote was received. */
+  lastVoteReceivedAtEventNumber?: Maybe<Scalars['Int']>
   noteMetadata: CandidacyNoteMetadata
   noteMetadata: CandidacyNoteMetadata
   noteMetadataId: Scalars['String']
   noteMetadataId: Scalars['String']
   votesRecieved: Array<CastVote>
   votesRecieved: Array<CastVote>
@@ -2067,6 +2071,8 @@ export type CandidateCreateInput = {
   stakeLocked: Scalars['Boolean']
   stakeLocked: Scalars['Boolean']
   candidacyWithdrawn: Scalars['Boolean']
   candidacyWithdrawn: Scalars['Boolean']
   votePower: Scalars['String']
   votePower: Scalars['String']
+  lastVoteReceivedAtBlock?: Maybe<Scalars['String']>
+  lastVoteReceivedAtEventNumber?: Maybe<Scalars['Float']>
   noteMetadata: Scalars['ID']
   noteMetadata: Scalars['ID']
 }
 }
 
 
@@ -2098,6 +2104,10 @@ export enum CandidateOrderByInput {
   CandidacyWithdrawnDesc = 'candidacyWithdrawn_DESC',
   CandidacyWithdrawnDesc = 'candidacyWithdrawn_DESC',
   VotePowerAsc = 'votePower_ASC',
   VotePowerAsc = 'votePower_ASC',
   VotePowerDesc = 'votePower_DESC',
   VotePowerDesc = 'votePower_DESC',
+  LastVoteReceivedAtBlockAsc = 'lastVoteReceivedAtBlock_ASC',
+  LastVoteReceivedAtBlockDesc = 'lastVoteReceivedAtBlock_DESC',
+  LastVoteReceivedAtEventNumberAsc = 'lastVoteReceivedAtEventNumber_ASC',
+  LastVoteReceivedAtEventNumberDesc = 'lastVoteReceivedAtEventNumber_DESC',
   NoteMetadataAsc = 'noteMetadata_ASC',
   NoteMetadataAsc = 'noteMetadata_ASC',
   NoteMetadataDesc = 'noteMetadata_DESC',
   NoteMetadataDesc = 'noteMetadata_DESC',
 }
 }
@@ -2111,6 +2121,8 @@ export type CandidateUpdateInput = {
   stakeLocked?: Maybe<Scalars['Boolean']>
   stakeLocked?: Maybe<Scalars['Boolean']>
   candidacyWithdrawn?: Maybe<Scalars['Boolean']>
   candidacyWithdrawn?: Maybe<Scalars['Boolean']>
   votePower?: Maybe<Scalars['String']>
   votePower?: Maybe<Scalars['String']>
+  lastVoteReceivedAtBlock?: Maybe<Scalars['String']>
+  lastVoteReceivedAtEventNumber?: Maybe<Scalars['Float']>
   noteMetadata?: Maybe<Scalars['ID']>
   noteMetadata?: Maybe<Scalars['ID']>
 }
 }
 
 
@@ -2165,6 +2177,18 @@ export type CandidateWhereInput = {
   votePower_lt?: Maybe<Scalars['BigInt']>
   votePower_lt?: Maybe<Scalars['BigInt']>
   votePower_lte?: Maybe<Scalars['BigInt']>
   votePower_lte?: Maybe<Scalars['BigInt']>
   votePower_in?: Maybe<Array<Scalars['BigInt']>>
   votePower_in?: Maybe<Array<Scalars['BigInt']>>
+  lastVoteReceivedAtBlock_eq?: Maybe<Scalars['BigInt']>
+  lastVoteReceivedAtBlock_gt?: Maybe<Scalars['BigInt']>
+  lastVoteReceivedAtBlock_gte?: Maybe<Scalars['BigInt']>
+  lastVoteReceivedAtBlock_lt?: Maybe<Scalars['BigInt']>
+  lastVoteReceivedAtBlock_lte?: Maybe<Scalars['BigInt']>
+  lastVoteReceivedAtBlock_in?: Maybe<Array<Scalars['BigInt']>>
+  lastVoteReceivedAtEventNumber_eq?: Maybe<Scalars['Int']>
+  lastVoteReceivedAtEventNumber_gt?: Maybe<Scalars['Int']>
+  lastVoteReceivedAtEventNumber_gte?: Maybe<Scalars['Int']>
+  lastVoteReceivedAtEventNumber_lt?: Maybe<Scalars['Int']>
+  lastVoteReceivedAtEventNumber_lte?: Maybe<Scalars['Int']>
+  lastVoteReceivedAtEventNumber_in?: Maybe<Array<Scalars['Int']>>
   member?: Maybe<MembershipWhereInput>
   member?: Maybe<MembershipWhereInput>
   electionRound?: Maybe<ElectionRoundWhereInput>
   electionRound?: Maybe<ElectionRoundWhereInput>
   noteMetadata?: Maybe<CandidacyNoteMetadataWhereInput>
   noteMetadata?: Maybe<CandidacyNoteMetadataWhereInput>
@@ -7130,9 +7154,8 @@ export type Membership = BaseGraphQlObject & {
   roles: Array<Worker>
   roles: Array<Worker>
   whitelistedIn: Array<ProposalDiscussionWhitelist>
   whitelistedIn: Array<ProposalDiscussionWhitelist>
   channels: Array<Channel>
   channels: Array<Channel>
+  councilCandidacies: Array<Candidate>
   councilMembers: Array<CouncilMember>
   councilMembers: Array<CouncilMember>
-  referendumStageRevealingOptionResults: Array<ReferendumStageRevealingOptionResult>
-  candidatemember?: Maybe<Array<Candidate>>
   forumpostauthor?: Maybe<Array<ForumPost>>
   forumpostauthor?: Maybe<Array<ForumPost>>
   forumpostreactionmember?: Maybe<Array<ForumPostReaction>>
   forumpostreactionmember?: Maybe<Array<ForumPostReaction>>
   forumthreadauthor?: Maybe<Array<ForumThread>>
   forumthreadauthor?: Maybe<Array<ForumThread>>
@@ -7747,15 +7770,12 @@ export type MembershipWhereInput = {
   channels_none?: Maybe<ChannelWhereInput>
   channels_none?: Maybe<ChannelWhereInput>
   channels_some?: Maybe<ChannelWhereInput>
   channels_some?: Maybe<ChannelWhereInput>
   channels_every?: Maybe<ChannelWhereInput>
   channels_every?: Maybe<ChannelWhereInput>
+  councilCandidacies_none?: Maybe<CandidateWhereInput>
+  councilCandidacies_some?: Maybe<CandidateWhereInput>
+  councilCandidacies_every?: Maybe<CandidateWhereInput>
   councilMembers_none?: Maybe<CouncilMemberWhereInput>
   councilMembers_none?: Maybe<CouncilMemberWhereInput>
   councilMembers_some?: Maybe<CouncilMemberWhereInput>
   councilMembers_some?: Maybe<CouncilMemberWhereInput>
   councilMembers_every?: Maybe<CouncilMemberWhereInput>
   councilMembers_every?: Maybe<CouncilMemberWhereInput>
-  referendumStageRevealingOptionResults_none?: Maybe<ReferendumStageRevealingOptionResultWhereInput>
-  referendumStageRevealingOptionResults_some?: Maybe<ReferendumStageRevealingOptionResultWhereInput>
-  referendumStageRevealingOptionResults_every?: Maybe<ReferendumStageRevealingOptionResultWhereInput>
-  candidatemember_none?: Maybe<CandidateWhereInput>
-  candidatemember_some?: Maybe<CandidateWhereInput>
-  candidatemember_every?: Maybe<CandidateWhereInput>
   forumpostauthor_none?: Maybe<ForumPostWhereInput>
   forumpostauthor_none?: Maybe<ForumPostWhereInput>
   forumpostauthor_some?: Maybe<ForumPostWhereInput>
   forumpostauthor_some?: Maybe<ForumPostWhereInput>
   forumpostauthor_every?: Maybe<ForumPostWhereInput>
   forumpostauthor_every?: Maybe<ForumPostWhereInput>
@@ -12102,9 +12122,6 @@ export type Query = {
   referendumFinishedEvents: Array<ReferendumFinishedEvent>
   referendumFinishedEvents: Array<ReferendumFinishedEvent>
   referendumFinishedEventByUniqueInput?: Maybe<ReferendumFinishedEvent>
   referendumFinishedEventByUniqueInput?: Maybe<ReferendumFinishedEvent>
   referendumFinishedEventsConnection: ReferendumFinishedEventConnection
   referendumFinishedEventsConnection: ReferendumFinishedEventConnection
-  referendumStageRevealingOptionResults: Array<ReferendumStageRevealingOptionResult>
-  referendumStageRevealingOptionResultByUniqueInput?: Maybe<ReferendumStageRevealingOptionResult>
-  referendumStageRevealingOptionResultsConnection: ReferendumStageRevealingOptionResultConnection
   referendumStageRevealings: Array<ReferendumStageRevealing>
   referendumStageRevealings: Array<ReferendumStageRevealing>
   referendumStageRevealingByUniqueInput?: Maybe<ReferendumStageRevealing>
   referendumStageRevealingByUniqueInput?: Maybe<ReferendumStageRevealing>
   referendumStageRevealingsConnection: ReferendumStageRevealingConnection
   referendumStageRevealingsConnection: ReferendumStageRevealingConnection
@@ -14006,26 +14023,6 @@ export type QueryReferendumFinishedEventsConnectionArgs = {
   orderBy?: Maybe<Array<ReferendumFinishedEventOrderByInput>>
   orderBy?: Maybe<Array<ReferendumFinishedEventOrderByInput>>
 }
 }
 
 
-export type QueryReferendumStageRevealingOptionResultsArgs = {
-  offset?: Maybe<Scalars['Int']>
-  limit?: Maybe<Scalars['Int']>
-  where?: Maybe<ReferendumStageRevealingOptionResultWhereInput>
-  orderBy?: Maybe<Array<ReferendumStageRevealingOptionResultOrderByInput>>
-}
-
-export type QueryReferendumStageRevealingOptionResultByUniqueInputArgs = {
-  where: ReferendumStageRevealingOptionResultWhereUniqueInput
-}
-
-export type QueryReferendumStageRevealingOptionResultsConnectionArgs = {
-  first?: Maybe<Scalars['Int']>
-  after?: Maybe<Scalars['String']>
-  last?: Maybe<Scalars['Int']>
-  before?: Maybe<Scalars['String']>
-  where?: Maybe<ReferendumStageRevealingOptionResultWhereInput>
-  orderBy?: Maybe<Array<ReferendumStageRevealingOptionResultOrderByInput>>
-}
-
 export type QueryReferendumStageRevealingsArgs = {
 export type QueryReferendumStageRevealingsArgs = {
   offset?: Maybe<Scalars['Int']>
   offset?: Maybe<Scalars['Int']>
   limit?: Maybe<Scalars['Int']>
   limit?: Maybe<Scalars['Int']>
@@ -14946,7 +14943,6 @@ export type ReferendumFinishedEvent = Event &
     deletedAt?: Maybe<Scalars['DateTime']>
     deletedAt?: Maybe<Scalars['DateTime']>
     deletedById?: Maybe<Scalars['String']>
     deletedById?: Maybe<Scalars['String']>
     version: Scalars['Int']
     version: Scalars['Int']
-    optionResults: Array<ReferendumStageRevealingOptionResult>
   }
   }
 
 
 export type ReferendumFinishedEventConnection = {
 export type ReferendumFinishedEventConnection = {
@@ -15035,9 +15031,6 @@ export type ReferendumFinishedEventWhereInput = {
   indexInBlock_lt?: Maybe<Scalars['Int']>
   indexInBlock_lt?: Maybe<Scalars['Int']>
   indexInBlock_lte?: Maybe<Scalars['Int']>
   indexInBlock_lte?: Maybe<Scalars['Int']>
   indexInBlock_in?: Maybe<Array<Scalars['Int']>>
   indexInBlock_in?: Maybe<Array<Scalars['Int']>>
-  optionResults_none?: Maybe<ReferendumStageRevealingOptionResultWhereInput>
-  optionResults_some?: Maybe<ReferendumStageRevealingOptionResultWhereInput>
-  optionResults_every?: Maybe<ReferendumStageRevealingOptionResultWhereInput>
   AND?: Maybe<Array<ReferendumFinishedEventWhereInput>>
   AND?: Maybe<Array<ReferendumFinishedEventWhereInput>>
   OR?: Maybe<Array<ReferendumFinishedEventWhereInput>>
   OR?: Maybe<Array<ReferendumFinishedEventWhereInput>>
 }
 }
@@ -15059,7 +15052,6 @@ export type ReferendumStageRevealing = BaseGraphQlObject & {
   startedAtBlock: Scalars['BigInt']
   startedAtBlock: Scalars['BigInt']
   /** Target number of winners */
   /** Target number of winners */
   winningTargetCount: Scalars['BigInt']
   winningTargetCount: Scalars['BigInt']
-  intermediateWinners: Array<ReferendumStageRevealingOptionResult>
   electionRound: ElectionRound
   electionRound: ElectionRound
   electionRoundId: Scalars['String']
   electionRoundId: Scalars['String']
 }
 }
@@ -15081,109 +15073,6 @@ export type ReferendumStageRevealingEdge = {
   cursor: Scalars['String']
   cursor: Scalars['String']
 }
 }
 
 
-export type ReferendumStageRevealingOptionResult = BaseGraphQlObject & {
-  id: Scalars['ID']
-  createdAt: Scalars['DateTime']
-  createdById: Scalars['String']
-  updatedAt?: Maybe<Scalars['DateTime']>
-  updatedById?: Maybe<Scalars['String']>
-  deletedAt?: Maybe<Scalars['DateTime']>
-  deletedById?: Maybe<Scalars['String']>
-  version: Scalars['Int']
-  option: Membership
-  optionId: Scalars['String']
-  /** Sum of votes' power received. */
-  votePower: Scalars['BigInt']
-  referendumStageRevealing: ReferendumStageRevealing
-  referendumStageRevealingId: Scalars['String']
-  referendumFinishedEvent?: Maybe<ReferendumFinishedEvent>
-  referendumFinishedEventId?: Maybe<Scalars['String']>
-}
-
-export type ReferendumStageRevealingOptionResultConnection = {
-  totalCount: Scalars['Int']
-  edges: Array<ReferendumStageRevealingOptionResultEdge>
-  pageInfo: PageInfo
-}
-
-export type ReferendumStageRevealingOptionResultCreateInput = {
-  option: Scalars['ID']
-  votePower: Scalars['String']
-  referendumStageRevealing: Scalars['ID']
-  referendumFinishedEvent?: Maybe<Scalars['ID']>
-}
-
-export type ReferendumStageRevealingOptionResultEdge = {
-  node: ReferendumStageRevealingOptionResult
-  cursor: Scalars['String']
-}
-
-export enum ReferendumStageRevealingOptionResultOrderByInput {
-  CreatedAtAsc = 'createdAt_ASC',
-  CreatedAtDesc = 'createdAt_DESC',
-  UpdatedAtAsc = 'updatedAt_ASC',
-  UpdatedAtDesc = 'updatedAt_DESC',
-  DeletedAtAsc = 'deletedAt_ASC',
-  DeletedAtDesc = 'deletedAt_DESC',
-  OptionAsc = 'option_ASC',
-  OptionDesc = 'option_DESC',
-  VotePowerAsc = 'votePower_ASC',
-  VotePowerDesc = 'votePower_DESC',
-  ReferendumStageRevealingAsc = 'referendumStageRevealing_ASC',
-  ReferendumStageRevealingDesc = 'referendumStageRevealing_DESC',
-  ReferendumFinishedEventAsc = 'referendumFinishedEvent_ASC',
-  ReferendumFinishedEventDesc = 'referendumFinishedEvent_DESC',
-}
-
-export type ReferendumStageRevealingOptionResultUpdateInput = {
-  option?: Maybe<Scalars['ID']>
-  votePower?: Maybe<Scalars['String']>
-  referendumStageRevealing?: Maybe<Scalars['ID']>
-  referendumFinishedEvent?: Maybe<Scalars['ID']>
-}
-
-export type ReferendumStageRevealingOptionResultWhereInput = {
-  id_eq?: Maybe<Scalars['ID']>
-  id_in?: Maybe<Array<Scalars['ID']>>
-  createdAt_eq?: Maybe<Scalars['DateTime']>
-  createdAt_lt?: Maybe<Scalars['DateTime']>
-  createdAt_lte?: Maybe<Scalars['DateTime']>
-  createdAt_gt?: Maybe<Scalars['DateTime']>
-  createdAt_gte?: Maybe<Scalars['DateTime']>
-  createdById_eq?: Maybe<Scalars['ID']>
-  createdById_in?: Maybe<Array<Scalars['ID']>>
-  updatedAt_eq?: Maybe<Scalars['DateTime']>
-  updatedAt_lt?: Maybe<Scalars['DateTime']>
-  updatedAt_lte?: Maybe<Scalars['DateTime']>
-  updatedAt_gt?: Maybe<Scalars['DateTime']>
-  updatedAt_gte?: Maybe<Scalars['DateTime']>
-  updatedById_eq?: Maybe<Scalars['ID']>
-  updatedById_in?: Maybe<Array<Scalars['ID']>>
-  deletedAt_all?: Maybe<Scalars['Boolean']>
-  deletedAt_eq?: Maybe<Scalars['DateTime']>
-  deletedAt_lt?: Maybe<Scalars['DateTime']>
-  deletedAt_lte?: Maybe<Scalars['DateTime']>
-  deletedAt_gt?: Maybe<Scalars['DateTime']>
-  deletedAt_gte?: Maybe<Scalars['DateTime']>
-  deletedById_eq?: Maybe<Scalars['ID']>
-  deletedById_in?: Maybe<Array<Scalars['ID']>>
-  votePower_eq?: Maybe<Scalars['BigInt']>
-  votePower_gt?: Maybe<Scalars['BigInt']>
-  votePower_gte?: Maybe<Scalars['BigInt']>
-  votePower_lt?: Maybe<Scalars['BigInt']>
-  votePower_lte?: Maybe<Scalars['BigInt']>
-  votePower_in?: Maybe<Array<Scalars['BigInt']>>
-  option?: Maybe<MembershipWhereInput>
-  referendumStageRevealing?: Maybe<ReferendumStageRevealingWhereInput>
-  referendumFinishedEvent?: Maybe<ReferendumFinishedEventWhereInput>
-  AND?: Maybe<Array<ReferendumStageRevealingOptionResultWhereInput>>
-  OR?: Maybe<Array<ReferendumStageRevealingOptionResultWhereInput>>
-}
-
-export type ReferendumStageRevealingOptionResultWhereUniqueInput = {
-  id: Scalars['ID']
-}
-
 export enum ReferendumStageRevealingOrderByInput {
 export enum ReferendumStageRevealingOrderByInput {
   CreatedAtAsc = 'createdAt_ASC',
   CreatedAtAsc = 'createdAt_ASC',
   CreatedAtDesc = 'createdAt_DESC',
   CreatedAtDesc = 'createdAt_DESC',
@@ -15242,9 +15131,6 @@ export type ReferendumStageRevealingWhereInput = {
   winningTargetCount_lt?: Maybe<Scalars['BigInt']>
   winningTargetCount_lt?: Maybe<Scalars['BigInt']>
   winningTargetCount_lte?: Maybe<Scalars['BigInt']>
   winningTargetCount_lte?: Maybe<Scalars['BigInt']>
   winningTargetCount_in?: Maybe<Array<Scalars['BigInt']>>
   winningTargetCount_in?: Maybe<Array<Scalars['BigInt']>>
-  intermediateWinners_none?: Maybe<ReferendumStageRevealingOptionResultWhereInput>
-  intermediateWinners_some?: Maybe<ReferendumStageRevealingOptionResultWhereInput>
-  intermediateWinners_every?: Maybe<ReferendumStageRevealingOptionResultWhereInput>
   electionRound?: Maybe<ElectionRoundWhereInput>
   electionRound?: Maybe<ElectionRoundWhereInput>
   AND?: Maybe<Array<ReferendumStageRevealingWhereInput>>
   AND?: Maybe<Array<ReferendumStageRevealingWhereInput>>
   OR?: Maybe<Array<ReferendumStageRevealingWhereInput>>
   OR?: Maybe<Array<ReferendumStageRevealingWhereInput>>

+ 11 - 10
tests/integration-tests/src/graphql/queries/council.graphql

@@ -11,13 +11,10 @@ fragment ElectedCouncilFields on ElectedCouncil {
   }
   }
 }
 }
 
 
-fragment ReferendumIntermediateWinnersFields on ElectionRound {
-  referendumStageRevealing {
-    intermediateWinners {
-      option {
-        id
-      }
-    }
+fragment CandidateFields on Candidate {
+  id
+  member {
+    id
   }
   }
 }
 }
 
 
@@ -27,8 +24,12 @@ query getCurrentCouncilMembers {
   }
   }
 }
 }
 
 
-query getReferendumIntermediateWinners {
-  electionRounds(orderBy: createdAt_DESC) {
-    ...ReferendumIntermediateWinnersFields
+query getReferendumIntermediateWinners($electionRoundCycleId: Int!, $councilSize: Int!) {
+  candidates(
+    where: { electionRound: { cycleId_eq: $electionRoundCycleId }, votePower_gt: 0 }
+    orderBy: [votePower_DESC, lastVoteReceivedAtBlock_ASC, lastVoteReceivedAtEventNumber_ASC]
+    limit: $councilSize
+  ) {
+    ...CandidateFields
   }
   }
 }
 }