working-groups.ts 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. import { WsProvider, ApiPromise } from "@polkadot/api";
  2. import { types } from "@joystream/types";
  3. import { Worker, WorkerId } from "@joystream/types/working-group";
  4. import { Null, Vec } from "@polkadot/types";
  5. import { RewardRelationship } from "@joystream/types/recurring-rewards";
  6. import { Stake, StakingStatus, Staked } from "@joystream/types/stake";
  7. import { ApplicationOf, WorkerOf } from "@joystream/types/augment-codec/all";
  8. interface WorkingGroupStake {
  9. stakeId: number,
  10. roleStake: number,
  11. }
  12. interface WorkingGroupReward {
  13. rewardRelationshipId: number,
  14. rewardSize: number,
  15. rewardInterval: number,
  16. rewardPerWeek: number,
  17. totalEarned: number,
  18. totalMissed: number,
  19. }
  20. interface ContentCurator {
  21. curatorId: number,
  22. memberId: number,
  23. roleAccount: string,
  24. applicationId: number,
  25. stakeProfile?: WorkingGroupStake,
  26. rewardRelationship?: WorkingGroupReward,
  27. }
  28. interface StorageProvider {
  29. workerId: number,
  30. memberId: number,
  31. roleAccount: string,
  32. stakeProfile?: WorkingGroupStake,
  33. rewardRelationship?: WorkingGroupReward,
  34. }
  35. async function main() {
  36. // Initialise the provider to connect to the local node
  37. const provider = new WsProvider('ws://127.0.0.1:9944');
  38. //If you want to play around on our staging network, go ahead and connect to this staging network instead.
  39. //const provider = new WsProvider('wss://testnet-rpc-2-singapore.joystream.org');
  40. // Create the API and wait until ready
  41. const api = await ApiPromise.create({ provider, types })
  42. const storageProviders: StorageProvider[] = []
  43. const contentCurators: ContentCurator[] = []
  44. // get all active storage workers
  45. const storageWorkerKeys = await api.query.storageWorkingGroup.workerById.keys()
  46. const storageWorkerIds = storageWorkerKeys.map(({ args: [workerId]}) => workerId) as Vec<WorkerId>
  47. storageWorkerIds.sort((a,b) => a.toNumber()-b.toNumber())
  48. console.log('all storageWorkerIds:', storageWorkerIds.join(', '));
  49. for (let key of storageWorkerIds) {
  50. const worker = await api.query.storageWorkingGroup.workerById(key) as Worker
  51. //console.log("worker",worker.toHuman())
  52. const storageProvider: StorageProvider = {
  53. workerId: key.toNumber(),
  54. memberId: worker.member_id.toNumber(),
  55. roleAccount: worker.role_account_id.toString(),
  56. }
  57. if (worker.reward_relationship.isSome) {
  58. const rewardRelationshipId = worker.reward_relationship.unwrap()
  59. const rewardRelationship = await api.query.recurringRewards.rewardRelationships(rewardRelationshipId) as RewardRelationship
  60. //console.log("rewardRelationship",rewardRelationship.toHuman())
  61. let rewardInterval = 0
  62. let rewardPerWeek = 0
  63. if (!(rewardRelationship.payout_interval.value instanceof Null)) {
  64. rewardInterval = rewardRelationship.payout_interval.unwrap().toNumber()
  65. rewardPerWeek = rewardRelationship.amount_per_payout.toNumber()*100800/rewardInterval
  66. }
  67. storageProvider.rewardRelationship = {
  68. rewardRelationshipId: rewardRelationshipId.toNumber(),
  69. rewardSize: rewardRelationship.amount_per_payout.toNumber(),
  70. rewardInterval,
  71. rewardPerWeek,
  72. totalEarned: rewardRelationship.total_reward_received.toNumber(),
  73. totalMissed: rewardRelationship.total_reward_missed.toNumber(),
  74. }
  75. }
  76. if (worker.role_stake_profile.isSome && !(worker.role_stake_profile instanceof Null)) {
  77. const stake = worker.role_stake_profile.unwrap()
  78. const workerStake = await api.query.stake.stakes(stake.stake_id) as Stake
  79. //console.log("workerStake",workerStake.toHuman())
  80. const stakingStatus = (workerStake.staking_status as StakingStatus).value
  81. if (stakingStatus instanceof Staked) {
  82. storageProvider.stakeProfile = {
  83. stakeId: stake.stake_id.toNumber(),
  84. roleStake: stakingStatus.staked_amount.toNumber(),
  85. }
  86. }
  87. }
  88. storageProviders.push(storageProvider)
  89. }
  90. // get all active content curators
  91. for (let i = 0; i < +(await api.query.contentDirectoryWorkingGroup.activeWorkerCount()).toString(); i++) {
  92. const curator = await api.query.contentDirectoryWorkingGroup.workerById(i) as WorkerOf
  93. // filter out inactive
  94. if (curator.is_active) {
  95. const nextApplicationId = +(await api.query.contentDirectoryWorkingGroup.nextApplicationId()).toString()
  96. let applicationId = {} as ApplicationOf
  97. for (let j = 0; j < nextApplicationId - 1; j++) {
  98. const appId = await api.query.contentDirectoryWorkingGroup.applicationById(j) as ApplicationOf
  99. if(appId.member_id?.toNumber() == curator.member_id?.toNumber()) {
  100. applicationId = appId
  101. break
  102. }
  103. }
  104. const contentCurator: ContentCurator = {
  105. curatorId: i,
  106. memberId: applicationId?.member_id.toNumber(),
  107. roleAccount: curator.role_account_id.toString(),
  108. applicationId: applicationId?.application_id.toNumber(),
  109. }
  110. if (curator.reward_relationship.isSome) {
  111. const rewardRelationshipId = curator.reward_relationship.unwrap()
  112. const rewardRelationship = await api.query.recurringRewards.rewardRelationships(rewardRelationshipId) as RewardRelationship
  113. //console.log("rewardRelationship",rewardRelationship.toHuman())
  114. let rewardInterval = 0
  115. let rewardPerWeek = 0
  116. if (!(rewardRelationship.payout_interval.value instanceof Null)) {
  117. rewardInterval = rewardRelationship.payout_interval.unwrap().toNumber()
  118. rewardPerWeek = rewardRelationship.amount_per_payout.toNumber()*100800/rewardInterval
  119. }
  120. contentCurator.rewardRelationship = {
  121. rewardRelationshipId: rewardRelationshipId.toNumber(),
  122. rewardSize: rewardRelationship.amount_per_payout.toNumber(),
  123. rewardInterval,
  124. rewardPerWeek,
  125. totalEarned: rewardRelationship.total_reward_received.toNumber(),
  126. totalMissed: rewardRelationship.total_reward_missed.toNumber(),
  127. }
  128. }
  129. if (curator.role_stake_profile.isSome && !(curator.role_stake_profile instanceof Null)) {
  130. const stake = curator.role_stake_profile.unwrap()
  131. const workerStake = await api.query.stake.stakes(stake.stake_id) as Stake
  132. //console.log("workerStake",workerStake.toHuman())
  133. const stakingStatus = (workerStake.staking_status as StakingStatus).value
  134. if (stakingStatus instanceof Staked) {
  135. contentCurator.stakeProfile = {
  136. stakeId: stake.stake_id.toNumber(),
  137. roleStake: stakingStatus.staked_amount.toNumber(),
  138. }
  139. }
  140. }
  141. contentCurators.push(contentCurator)
  142. }
  143. }
  144. console.log("storageProviders",JSON.stringify(storageProviders, null, 4))
  145. console.log("contentCurators",JSON.stringify(contentCurators, null, 4))
  146. api.disconnect()
  147. }
  148. main()