getContentCuratorData.ts 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import { ApiPromise } from '@polkadot/api';
  2. import { Reward } from './getTokenomicsData';
  3. type ContentCurator = {
  4. reward_relationship: number;
  5. role_stake_profile: {
  6. stake_id: number;
  7. };
  8. }
  9. const getCurators = async (api: ApiPromise): Promise<Array<ContentCurator>> => {
  10. const curators: Array<ContentCurator> = [];
  11. const [workerIds, curatorData] = ((await api.query.contentWorkingGroup.curatorById()).toJSON() as [Array<number>, Array<object>]);
  12. curatorData.map((data: any, index: number) => {
  13. if (Object.keys(data.stage)[0] === 'Active') {
  14. curators.push({ ...data, workerId: workerIds[index] });
  15. }
  16. });
  17. return curators;
  18. };
  19. const calculateRewards = (curators: Array<ContentCurator>, recurringRewards: Array<Reward>): number => {
  20. let rewardsPerBlock = 0;
  21. curators.forEach((curator: ContentCurator) => {
  22. const reward: Reward = recurringRewards.filter((reward: Reward) => reward.recipient === curator.reward_relationship)[0];
  23. if (reward && reward.amount_per_payout && reward.payout_interval) {
  24. rewardsPerBlock += reward.amount_per_payout / reward.payout_interval;
  25. }
  26. });
  27. return rewardsPerBlock;
  28. };
  29. const calculateStake = async (api: ApiPromise, curators: Array<ContentCurator>): Promise<number> => {
  30. const stakeIds: Array<number> = []; let totalContentCuratorStake = 0;
  31. curators.forEach((curator: any) => {
  32. if (curator.role_stake_profile) {
  33. stakeIds.push(curator.role_stake_profile.stake_id);
  34. }
  35. });
  36. const curatorStakeData = await api.query.stake.stakes.multi(stakeIds);
  37. curatorStakeData.map((stakeData: any) => {
  38. totalContentCuratorStake += stakeData.toJSON()[0].staking_status.Staked.staked_amount;
  39. });
  40. return totalContentCuratorStake;
  41. };
  42. export default async (api: ApiPromise, recurringRewards: Array<Reward>): Promise<any> => {
  43. const currentLead = (await api.query.contentWorkingGroup.currentLeadId()).toJSON() as number;
  44. const curators = await getCurators(api);
  45. const rewardsPerBlock = calculateRewards(curators, recurringRewards);
  46. const totalContentCuratorStake = await calculateStake(api, curators);
  47. return {
  48. numberOfCurators: curators.length,
  49. contentCuratorLead: currentLead ? 1 : 0,
  50. curatorRewardsPerWeeek: rewardsPerBlock * 100800,
  51. totalContentCuratorStake
  52. };
  53. };