council.ts 3.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import { ParsedMember } from '../types/members';
  2. import BaseTransport from './base';
  3. import { Seats, ElectionParameters } from '@joystream/types/council';
  4. import { MemberId, Membership } from '@joystream/types/members';
  5. import { u32, Vec } from '@polkadot/types/';
  6. import { Balance, BlockNumber } from '@polkadot/types/interfaces';
  7. import { FIRST_MEMBER_ID } from '../consts/members';
  8. import { ApiPromise } from '@polkadot/api';
  9. import MembersTransport from './members';
  10. import ChainTransport from './chain';
  11. import { APIQueryCache } from '../APIQueryCache';
  12. export default class CouncilTransport extends BaseTransport {
  13. private membersT: MembersTransport;
  14. private chainT: ChainTransport;
  15. constructor (api: ApiPromise, cacheApi: APIQueryCache, membersTransport: MembersTransport, chainTransport: ChainTransport) {
  16. super(api, cacheApi);
  17. this.membersT = membersTransport;
  18. this.chainT = chainTransport;
  19. }
  20. async councilMembersLength (atBlock?: number): Promise<number> {
  21. if (atBlock) {
  22. const blockHash = await this.chainT.blockHash(atBlock);
  23. return ((await this.api.query.council.activeCouncil.at(blockHash)) as Seats).length;
  24. }
  25. return ((await this.council.activeCouncil()) as Seats).length;
  26. }
  27. async councilMembers (): Promise<(ParsedMember & { memberId: MemberId })[]> {
  28. const council = (await this.council.activeCouncil()) as Seats;
  29. return Promise.all(
  30. council.map(async seat => {
  31. const memberIds = (await this.members.memberIdsByControllerAccountId(seat.member)) as Vec<MemberId>;
  32. const member = (await this.membersT.expectedMembership(memberIds[0])).toJSON() as ParsedMember;
  33. return {
  34. ...member,
  35. memberId: memberIds[0]
  36. };
  37. })
  38. );
  39. }
  40. async membersExceptCouncil (): Promise<{ id: number; profile: Membership }[]> {
  41. // Council members to filter out
  42. const activeCouncil = (await this.council.activeCouncil()) as Seats;
  43. const membersCount = ((await this.members.nextMemberId()) as MemberId).toNumber();
  44. const profiles: { id: number; profile: Membership }[] = [];
  45. for (let id = FIRST_MEMBER_ID.toNumber(); id < membersCount; ++id) {
  46. const profile = (await this.membersT.membershipById(new MemberId(id)));
  47. if (
  48. !profile ||
  49. // Filter out council members
  50. activeCouncil.some(
  51. seat =>
  52. seat.member.toString() === profile.controller_account.toString() ||
  53. seat.member.toString() === profile.root_account.toString()
  54. )
  55. ) {
  56. continue;
  57. }
  58. profiles.push({ id, profile });
  59. }
  60. return profiles;
  61. }
  62. async electionParameters (): Promise<ElectionParameters> {
  63. const announcing_period = (await this.councilElection.announcingPeriod()) as BlockNumber;
  64. const voting_period = (await this.councilElection.votingPeriod()) as BlockNumber;
  65. const revealing_period = (await this.councilElection.revealingPeriod()) as BlockNumber;
  66. const new_term_duration = (await this.councilElection.newTermDuration()) as BlockNumber;
  67. const min_council_stake = (await this.councilElection.minCouncilStake()) as Balance;
  68. const min_voting_stake = (await this.councilElection.minVotingStake()) as Balance;
  69. const candidacy_limit = (await this.councilElection.candidacyLimit()) as u32;
  70. const council_size = (await this.councilElection.councilSize()) as u32;
  71. return new ElectionParameters({
  72. announcing_period,
  73. voting_period,
  74. revealing_period,
  75. new_term_duration,
  76. min_council_stake,
  77. min_voting_stake,
  78. candidacy_limit,
  79. council_size
  80. });
  81. }
  82. }