@stake-dao/reader 0.2.21 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/dist/esm/abis/lockersMulticall.js +17 -0
  2. package/dist/esm/abis/lockersMulticall.js.map +1 -1
  3. package/dist/esm/bytecodes/index.js +13 -0
  4. package/dist/esm/bytecodes/index.js.map +1 -1
  5. package/dist/esm/bytecodes/votemarket/batchCurveGauges.js +32 -0
  6. package/dist/esm/bytecodes/votemarket/batchCurveGauges.js.map +1 -0
  7. package/dist/esm/bytecodes/votemarket/batchGaugesMetadata.js +58 -0
  8. package/dist/esm/bytecodes/votemarket/batchGaugesMetadata.js.map +1 -0
  9. package/dist/esm/index.js +6 -0
  10. package/dist/esm/index.js.map +1 -1
  11. package/dist/esm/lockers/fetch/index.js +67 -167
  12. package/dist/esm/lockers/fetch/index.js.map +1 -1
  13. package/dist/esm/lockers/fetch/parsePeg.js +21 -0
  14. package/dist/esm/lockers/fetch/parsePeg.js.map +1 -0
  15. package/dist/esm/lockers/fetch/parseVoteBoosterData.js +28 -0
  16. package/dist/esm/lockers/fetch/parseVoteBoosterData.js.map +1 -0
  17. package/dist/esm/lockers/utils/callsForLockers/depositorCalls.js +5 -5
  18. package/dist/esm/lockers/utils/callsForLockers/depositorCalls.js.map +1 -1
  19. package/dist/esm/lockers/utils/callsForLockers/feeCalls.js +13 -11
  20. package/dist/esm/lockers/utils/callsForLockers/feeCalls.js.map +1 -1
  21. package/dist/esm/lockers/utils/callsForLockers/index.js +2 -4
  22. package/dist/esm/lockers/utils/callsForLockers/index.js.map +1 -1
  23. package/dist/esm/lockers/utils/callsForLockers/pegCalls.js +9 -11
  24. package/dist/esm/lockers/utils/callsForLockers/pegCalls.js.map +1 -1
  25. package/dist/esm/lockers/utils/callsForLockers/veCalls.js +4 -4
  26. package/dist/esm/lockers/utils/callsForLockers/veCalls.js.map +1 -1
  27. package/dist/esm/lockers/utils/endpoints.js +2 -22
  28. package/dist/esm/lockers/utils/endpoints.js.map +1 -1
  29. package/dist/esm/lockers/utils/getBribesRewardsData.js +0 -1
  30. package/dist/esm/lockers/utils/getBribesRewardsData.js.map +1 -1
  31. package/dist/esm/lockers/utils/getCherries.js +34 -0
  32. package/dist/esm/lockers/utils/getCherries.js.map +1 -0
  33. package/dist/esm/lockers/utils/getHttpCalls.js +5 -7
  34. package/dist/esm/lockers/utils/getHttpCalls.js.map +1 -1
  35. package/dist/esm/tsconfig.build.tsbuildinfo +1 -1
  36. package/dist/esm/votemarket/curve/config.js +6 -0
  37. package/dist/esm/votemarket/curve/config.js.map +1 -0
  38. package/dist/esm/votemarket/curve/fetchCurveGauges.js +86 -0
  39. package/dist/esm/votemarket/curve/fetchCurveGauges.js.map +1 -0
  40. package/dist/types/abis/lockersMulticall.d.ts +16 -0
  41. package/dist/types/abis/lockersMulticall.d.ts.map +1 -1
  42. package/dist/types/bytecodes/index.d.ts +2 -0
  43. package/dist/types/bytecodes/index.d.ts.map +1 -1
  44. package/dist/types/bytecodes/votemarket/batchCurveGauges.d.ts +4 -0
  45. package/dist/types/bytecodes/votemarket/batchCurveGauges.d.ts.map +1 -0
  46. package/dist/types/bytecodes/votemarket/batchGaugesMetadata.d.ts +4 -0
  47. package/dist/types/bytecodes/votemarket/batchGaugesMetadata.d.ts.map +1 -0
  48. package/dist/types/index.d.ts +1 -0
  49. package/dist/types/index.d.ts.map +1 -1
  50. package/dist/types/lockers/fetch/index.d.ts +88 -2
  51. package/dist/types/lockers/fetch/index.d.ts.map +1 -1
  52. package/dist/types/lockers/fetch/parsePeg.d.ts +3 -0
  53. package/dist/types/lockers/fetch/parsePeg.d.ts.map +1 -0
  54. package/dist/types/lockers/fetch/parseVoteBoosterData.d.ts +13 -0
  55. package/dist/types/lockers/fetch/parseVoteBoosterData.d.ts.map +1 -0
  56. package/dist/types/lockers/utils/callsForLockers/depositorCalls.d.ts +2 -1
  57. package/dist/types/lockers/utils/callsForLockers/depositorCalls.d.ts.map +1 -1
  58. package/dist/types/lockers/utils/callsForLockers/feeCalls.d.ts +3 -1
  59. package/dist/types/lockers/utils/callsForLockers/feeCalls.d.ts.map +1 -1
  60. package/dist/types/lockers/utils/callsForLockers/index.d.ts +2 -1
  61. package/dist/types/lockers/utils/callsForLockers/index.d.ts.map +1 -1
  62. package/dist/types/lockers/utils/callsForLockers/pegCalls.d.ts +3 -2
  63. package/dist/types/lockers/utils/callsForLockers/pegCalls.d.ts.map +1 -1
  64. package/dist/types/lockers/utils/callsForLockers/veCalls.d.ts +2 -1
  65. package/dist/types/lockers/utils/callsForLockers/veCalls.d.ts.map +1 -1
  66. package/dist/types/lockers/utils/endpoints.d.ts +2 -2
  67. package/dist/types/lockers/utils/endpoints.d.ts.map +1 -1
  68. package/dist/types/lockers/utils/getBribesRewardsData.d.ts +10 -12
  69. package/dist/types/lockers/utils/getBribesRewardsData.d.ts.map +1 -1
  70. package/dist/types/lockers/utils/getCherries.d.ts +4 -0
  71. package/dist/types/lockers/utils/getCherries.d.ts.map +1 -0
  72. package/dist/types/lockers/utils/getHttpCalls.d.ts +5 -1
  73. package/dist/types/lockers/utils/getHttpCalls.d.ts.map +1 -1
  74. package/dist/types/votemarket/curve/config.d.ts +4 -0
  75. package/dist/types/votemarket/curve/config.d.ts.map +1 -0
  76. package/dist/types/votemarket/curve/fetchCurveGauges.d.ts +16 -0
  77. package/dist/types/votemarket/curve/fetchCurveGauges.d.ts.map +1 -0
  78. package/package.json +2 -2
  79. package/src/abis/lockersMulticall.ts +17 -0
  80. package/src/bytecodes/index.ts +18 -0
  81. package/src/bytecodes/votemarket/batchCurveGauges.ts +34 -0
  82. package/src/bytecodes/votemarket/batchGaugesMetadata.ts +67 -0
  83. package/src/index.ts +9 -0
  84. package/src/lockers/fetch/index.ts +104 -227
  85. package/src/lockers/fetch/parsePeg.ts +25 -0
  86. package/src/lockers/fetch/parseVoteBoosterData.ts +34 -0
  87. package/src/lockers/utils/callsForLockers/depositorCalls.ts +7 -6
  88. package/src/lockers/utils/callsForLockers/feeCalls.ts +17 -15
  89. package/src/lockers/utils/callsForLockers/index.ts +6 -10
  90. package/src/lockers/utils/callsForLockers/pegCalls.ts +11 -12
  91. package/src/lockers/utils/callsForLockers/veCalls.ts +6 -5
  92. package/src/lockers/utils/endpoints.ts +2 -25
  93. package/src/lockers/utils/getBribesRewardsData.ts +11 -2
  94. package/src/lockers/utils/getCherries.ts +48 -0
  95. package/src/lockers/utils/getHttpCalls.ts +6 -7
  96. package/src/votemarket/curve/config.ts +6 -0
  97. package/src/votemarket/curve/fetchCurveGauges.ts +119 -0
  98. package/dist/esm/lockers/utils/callsForLockers/gaugeControllerCalls.js +0 -8
  99. package/dist/esm/lockers/utils/callsForLockers/gaugeControllerCalls.js.map +0 -1
  100. package/dist/esm/lockers/utils/getCherriesLeaderBoard.js +0 -22
  101. package/dist/esm/lockers/utils/getCherriesLeaderBoard.js.map +0 -1
  102. package/dist/types/lockers/utils/callsForLockers/gaugeControllerCalls.d.ts +0 -11
  103. package/dist/types/lockers/utils/callsForLockers/gaugeControllerCalls.d.ts.map +0 -1
  104. package/dist/types/lockers/utils/getCherriesLeaderBoard.d.ts +0 -2
  105. package/dist/types/lockers/utils/getCherriesLeaderBoard.d.ts.map +0 -1
  106. package/src/lockers/utils/callsForLockers/gaugeControllerCalls.ts +0 -8
  107. package/src/lockers/utils/getCherriesLeaderBoard.ts +0 -34
@@ -0,0 +1,25 @@
1
+ import { type Locker } from '@stake-dao/constants'
2
+ import { formatUnits, parseUnits, zeroAddress } from 'viem'
3
+
4
+ export const parsePeg = (locker: Locker, chunkedRawLockersData: any) => {
5
+ const rawPeg =
6
+ locker.secondaryMarket?.pool !== zeroAddress
7
+ ? chunkedRawLockersData[locker.voteBooster ? 14 : 10].result
8
+ : undefined
9
+
10
+ let parsedPeg = rawPeg
11
+ switch (locker.id) {
12
+ case 'bal':
13
+ parsedPeg = rawPeg[1] * BigInt(-1)
14
+ break
15
+ case 'cake':
16
+ parsedPeg = rawPeg[0]
17
+ break
18
+ }
19
+ const peg =
20
+ rawPeg && parsedPeg
21
+ ? formatUnits(parsedPeg / parseUnits(locker.secondaryMarket?.pegBase?.toString() || '1', 0), 18)
22
+ : '-'
23
+
24
+ return peg
25
+ }
@@ -0,0 +1,34 @@
1
+ import { type Locker } from '@stake-dao/constants'
2
+ import { formatUnits, zeroAddress } from 'viem'
3
+ import { mainnet } from 'viem/chains'
4
+
5
+ export const parseVoteBoosterData = (locker: Locker, chunkedRawLockersData: any) => {
6
+ if (locker.voteBooster) {
7
+ const voteBoosterBalance = {
8
+ token: formatUnits(chunkedRawLockersData[10].result, locker.token.decimals),
9
+ sdToken: formatUnits(chunkedRawLockersData[11].result, locker.sdToken.decimals),
10
+ staked:
11
+ locker.modules.gauge !== zeroAddress
12
+ ? formatUnits(chunkedRawLockersData[12].result, locker.sdToken.decimals)
13
+ : '0',
14
+ working:
15
+ locker.chainId === mainnet.id && locker.modules.gauge !== zeroAddress
16
+ ? formatUnits(chunkedRawLockersData[13].result, locker.sdToken.decimals)
17
+ : '0',
18
+ }
19
+
20
+ const voteBoosterBoost =
21
+ voteBoosterBalance && Number(voteBoosterBalance.working) > 0 && Number(voteBoosterBalance.staked) > 0
22
+ ? Number(voteBoosterBalance.working) / (Number(voteBoosterBalance.staked) * 0.4)
23
+ : 1
24
+
25
+ return {
26
+ booster: locker.voteBooster.booster,
27
+ vSdToken: locker.voteBooster.vSdToken,
28
+ balance: voteBoosterBalance,
29
+ boost: voteBoosterBoost,
30
+ }
31
+ }
32
+
33
+ return undefined
34
+ }
@@ -1,15 +1,16 @@
1
1
  import { lockerWithId } from '@stake-dao/constants'
2
+ import type { Address } from 'viem'
2
3
 
3
- const depositorCalls = (depositor: string, locker: string) => {
4
+ const depositorCalls = (depositor: string, locker: Address) => {
4
5
  const calls: any[] = []
5
6
 
6
7
  if (
7
8
  [
8
- lockerWithId('crv')!.extensions.locker,
9
- lockerWithId('mav')!.extensions.locker,
10
- lockerWithId('cake', 56)!.extensions.locker,
11
- lockerWithId('fxn')!.extensions.locker,
12
- lockerWithId('yfi')!.extensions.locker,
9
+ lockerWithId('crv')!.modules.locker,
10
+ lockerWithId('mav')!.modules.locker,
11
+ lockerWithId('cake', 56)!.modules.locker,
12
+ lockerWithId('fxn')!.modules.locker,
13
+ lockerWithId('yfi')!.modules.locker,
13
14
  ].includes(locker)
14
15
  ) {
15
16
  calls.push({ address: depositor, name: 'lockIncentivePercent' })
@@ -1,39 +1,39 @@
1
- import { zeroAddress } from 'viem'
2
-
1
+ import { type Address, zeroAddress } from 'viem'
3
2
  import { Zero } from '../../../index.js'
3
+ import type { Call } from '../../../utils.js'
4
4
 
5
- export const feeCalls = (lockerId: string, accumulatorAddress: string) => {
6
- const calls: any[] = []
5
+ export const feeCalls = (lockerId: string, accumulatorAddress: Address) => {
6
+ const calls: Call[] = []
7
7
 
8
8
  if (accumulatorAddress === zeroAddress || lockerId === 'mav') {
9
9
  return calls
10
10
  }
11
11
 
12
12
  // Harvester fees
13
- calls.push({ address: accumulatorAddress, name: 'claimerFee', params: [] })
13
+ calls.push({ address: accumulatorAddress, name: 'claimerFee' })
14
14
 
15
15
  // Treasury
16
- if (['crv', 'cake', 'yfi', 'pendle', 'fpis'].includes(lockerId)) {
17
- calls.push({ address: accumulatorAddress, name: 'daoFee', params: [] })
16
+ if (['cake', 'yfi', 'pendle', 'fpis'].includes(lockerId)) {
17
+ calls.push({ address: accumulatorAddress, name: 'daoFee' })
18
18
  }
19
19
 
20
20
  switch (lockerId) {
21
21
  case 'crv':
22
- calls.push({ address: accumulatorAddress, name: 'liquidityFee', params: [] })
22
+ calls.push({ address: accumulatorAddress, name: 'getFeeSplit' })
23
23
  break
24
24
  case 'cake':
25
25
  case 'yfi':
26
- calls.push({ address: accumulatorAddress, name: 'liquidityFee', params: [] })
26
+ calls.push({ address: accumulatorAddress, name: 'liquidityFee' })
27
27
  break
28
28
  case 'pendle':
29
- calls.push({ address: accumulatorAddress, name: 'bountyFee', params: [] })
29
+ calls.push({ address: accumulatorAddress, name: 'bountyFee' })
30
30
  break
31
31
  case 'fpis':
32
- calls.push({ address: accumulatorAddress, name: 'bribeFee', params: [] })
32
+ calls.push({ address: accumulatorAddress, name: 'bribeFee' })
33
33
  break
34
34
  case 'apw':
35
35
  case 'bpt':
36
- calls.push({ address: accumulatorAddress, name: 'lockerFee', params: [] })
36
+ calls.push({ address: accumulatorAddress, name: 'lockerFee' })
37
37
  break
38
38
  }
39
39
 
@@ -82,10 +82,12 @@ export const extractFees = (lockers: any, feesData: any): ILockerFee[] => {
82
82
  let lockerFee = Zero
83
83
 
84
84
  switch (locker.id) {
85
- case 'crv':
86
- liquidityFee = BigInt(feesData.pop()?.result)
87
- daoFee = BigInt(feesData.pop()?.result)
85
+ case 'crv': {
86
+ const crvFees = feesData.pop()?.result
87
+ daoFee = BigInt(crvFees.fees[0])
88
+ liquidityFee = BigInt(crvFees.fees[1])
88
89
  break
90
+ }
89
91
  case 'cake':
90
92
  case 'yfi':
91
93
  liquidityFee = BigInt(feesData.pop()?.result)
@@ -1,9 +1,9 @@
1
- import { FOUR_YEAR } from '@stake-dao/constants'
1
+ import { FOUR_YEAR, type LockerSecondaryMarket } from '@stake-dao/constants'
2
2
  import { OneEther } from '../../../index.js'
3
3
 
4
+ import type { Address } from 'viem'
4
5
  import depositorCalls from './depositorCalls.js'
5
6
  import gaugeCalls from './gaugeCalls.js'
6
- import gaugeControllerCalls from './gaugeControllerCalls.js'
7
7
  import pegCalls from './pegCalls.js'
8
8
  import veCalls from './veCalls.js'
9
9
  import veSdtCalls from './veSdtCalls.js'
@@ -14,22 +14,18 @@ const callsForLockers = (
14
14
  sdToken: string,
15
15
  votingEscrow: string,
16
16
  depositor: string,
17
- gaugeController: string,
18
17
  gauge: string,
19
18
  locker: string,
20
- pool: string,
21
- pegInfo: any,
22
- secondaryMarket: string,
19
+ secondaryMarket: LockerSecondaryMarket | undefined,
23
20
  voteBooster: any,
24
21
  ) => [
25
- ...veCalls(lockerId, votingEscrow, locker, token),
26
- ...depositorCalls(depositor, locker),
27
- ...gaugeControllerCalls(gaugeController, gauge),
22
+ ...veCalls(lockerId, votingEscrow, locker as Address, token),
23
+ ...depositorCalls(depositor, locker as Address),
28
24
  ...gaugeCalls(gauge),
29
25
  // Token
30
26
  { address: token, name: 'balanceOf', params: [depositor] },
31
27
  ...veSdtCalls(voteBooster, token, sdToken, gauge),
32
- pegCalls(secondaryMarket, pool, pegInfo, sdToken, token),
28
+ pegCalls(secondaryMarket, sdToken, token),
33
29
  ...(lockerId === 'mav'
34
30
  ? [
35
31
  {
@@ -1,38 +1,37 @@
1
1
  import { parseUnits, zeroAddress } from 'viem'
2
2
 
3
- import { contracts } from '@stake-dao/constants'
3
+ import { type LockerSecondaryMarket, contracts } from '@stake-dao/constants'
4
4
  import { One, Zero } from '../../../index.js'
5
5
 
6
- const pegCalls = (secondaryMarket: string, pool: string, pegInfo: any, sdToken: string, token: string) => {
7
- switch (secondaryMarket) {
6
+ const pegCalls = (secondaryMarket: LockerSecondaryMarket | undefined, sdToken: string, token: string) => {
7
+ const secondaryMarketLabel = secondaryMarket?.label || ''
8
+ const pool = secondaryMarket?.pool || zeroAddress
9
+ const pegBase = parseUnits(secondaryMarket?.pegBase?.toString() || '1', 18)
10
+
11
+ switch (secondaryMarketLabel) {
8
12
  case 'Balancer':
9
13
  return {
10
14
  address: contracts.balancerVault![1],
11
15
  name: 'queryBatchSwap',
12
- params: [
13
- Zero,
14
- [[pool, Zero, One, parseUnits(pegInfo?.basedOn ? pegInfo.basedOn.toString() : '1', 18), '0x']],
15
- [sdToken, token],
16
- [zeroAddress, false, zeroAddress, false],
17
- ],
16
+ params: [Zero, [[pool, Zero, One, pegBase, '0x']], [sdToken, token], [zeroAddress, false, zeroAddress, false]],
18
17
  }
19
18
  case 'Maverick':
20
19
  return {
21
20
  address: contracts.mavPoolInfos![1],
22
21
  name: 'calculateSwap',
23
- params: [pool, parseUnits(pegInfo?.basedOn ? pegInfo.basedOn.toString() : '1', 18), true, false, Zero],
22
+ params: [pool, pegBase, true, false, Zero],
24
23
  }
25
24
  case 'PancakeSwap':
26
25
  return {
27
26
  address: contracts.pancakeQuoter![56],
28
27
  name: 'quoteExactInputSingle',
29
- params: [[sdToken, token, parseUnits(pegInfo?.basedOn ? pegInfo.basedOn.toString() : '1', 18), '2500', '0']],
28
+ params: [[sdToken, token, pegBase, '2500', '0']],
30
29
  }
31
30
  default:
32
31
  return {
33
32
  address: pool,
34
33
  name: 'get_dy',
35
- params: [One, Zero, parseUnits(pegInfo?.basedOn ? pegInfo.basedOn.toString() : '1', 18)],
34
+ params: [One, Zero, pegBase],
36
35
  }
37
36
  }
38
37
  }
@@ -1,17 +1,18 @@
1
1
  import { lockerWithId } from '@stake-dao/constants'
2
2
 
3
+ import type { Address } from 'viem'
3
4
  import { lockedAmountCall } from '../index.js'
4
5
 
5
- const veCalls = (lockerId: string, votingEscrow: string, locker: string, token: string) => {
6
+ const veCalls = (lockerId: string, votingEscrow: string, locker: Address, token: string) => {
6
7
  const calls: any[] = []
7
8
  calls.push(lockedAmountCall(lockerId, votingEscrow, locker))
8
9
  calls.push({ address: votingEscrow, name: 'balanceOf', params: [locker] })
9
10
 
10
11
  if (
11
12
  [
12
- lockerWithId('pendle')!.extensions.locker,
13
- lockerWithId('mav')!.extensions.locker,
14
- lockerWithId('cake', 56)!.extensions.locker,
13
+ lockerWithId('pendle')!.modules.locker,
14
+ lockerWithId('mav')!.modules.locker,
15
+ lockerWithId('cake', 56)!.modules.locker,
15
16
  ].includes(locker)
16
17
  ) {
17
18
  calls.push({ address: token, name: 'balanceOf', params: [votingEscrow] })
@@ -19,7 +20,7 @@ const veCalls = (lockerId: string, votingEscrow: string, locker: string, token:
19
20
  calls.push({ address: votingEscrow, name: 'supply' })
20
21
  }
21
22
 
22
- if (locker === lockerWithId('pendle')!.extensions.locker) {
23
+ if (locker === lockerWithId('pendle')!.modules.locker) {
23
24
  calls.push({ address: votingEscrow, name: 'totalSupplyStored' })
24
25
  } else {
25
26
  calls.push({ address: votingEscrow, name: 'totalSupply' })
@@ -1,25 +1,2 @@
1
- import { gql } from 'graphql-request'
2
-
3
- export const SDCAKE_AIRDROP_GRAPH_URL =
4
- 'https://subgraph.satsuma-prod.com/76af23d9dd04/0xs-team--971274/sdcake-airdrop/api'
5
-
6
- export const SDCAKE_AIRDROP_GLOBAL_QUERY = gql`
7
- query Global {
8
- globals(first: 1) {
9
- timestamp
10
- points
11
- rate
12
- threeMTimestamp
13
- tenMTimestamp
14
- twentyFiveMTimestamp
15
- fiftyMTimestamp
16
- currentMultiplier
17
- }
18
- users(first: 1000) {
19
- address
20
- timestamp
21
- points
22
- rate
23
- }
24
- }
25
- `
1
+ export const SDCAKE_CHERRIES_API_URL = 'https://api.stakedao.org/api/cherries/'
2
+ export const SDCAKE_REFERRAL_SNAPSHOT_CHERRIES_API_URL = 'https://api.stakedao.org/api/cherries/referralSnapshot.json'
@@ -5,6 +5,16 @@ import { One, Zero } from '../../index.js'
5
5
 
6
6
  import { calculateAllData } from './index.js'
7
7
 
8
+ export type TBribesRewards = {
9
+ bribeMinApr: number
10
+ bribeMaxApr: number
11
+ bribeAverageApr: number
12
+ minBoost: string
13
+ maxBoost: string
14
+ token: string
15
+ hideBoostTab?: boolean
16
+ }
17
+
8
18
  const getBribesRewardsData = (
9
19
  locker: any,
10
20
  bribesData: any,
@@ -12,7 +22,7 @@ const getBribesRewardsData = (
12
22
  totalSupplyStaked: any,
13
23
  veBalanceOfLocker: any,
14
24
  gaugeWorkingSupply: any,
15
- ) => {
25
+ ): { bribeMinApr: number; bribeMaxApr: number; bribeRewards: TBribesRewards | undefined } => {
16
26
  const bribesAverageApr = [
17
27
  { id: 'crv', value: bribesData?.[delegationWithId('crv')!] / 100 || 0 },
18
28
  { id: 'bal', value: bribesData?.[delegationWithId('bal')!] / 100 || 0 },
@@ -47,7 +57,6 @@ const getBribesRewardsData = (
47
57
  bribeMinApr,
48
58
  bribeMaxApr,
49
59
  bribeAverageApr: bribesAverage.value * 100,
50
- average: bribesAverageApr,
51
60
  minBoost: (Number(votingPower.min) / 1000).toFixed(2),
52
61
  maxBoost: (Number(votingPower.max) / 1000).toFixed(2),
53
62
  token: `sd${bribesAverage.id}`,
@@ -0,0 +1,48 @@
1
+ import { formatEther } from 'viem'
2
+
3
+ import { SDCAKE_CHERRIES_API_URL, SDCAKE_REFERRAL_SNAPSHOT_CHERRIES_API_URL } from './endpoints.js'
4
+
5
+ import { equalTlc } from '../../utils.js'
6
+ import { computeRatePoints } from './cakeLockerAirdrop.js'
7
+
8
+ export const getCherriesLeaderBoard = async () => {
9
+ const cherriesData = await (await fetch(SDCAKE_CHERRIES_API_URL)).json()
10
+ const global = cherriesData.global
11
+
12
+ const now = Math.floor(Date.now() / 1000)
13
+
14
+ const leaderBoard =
15
+ cherriesData?.global &&
16
+ cherriesData.users.map((user) => {
17
+ const currentPoints = computeRatePoints(
18
+ BigInt(user.rate),
19
+ BigInt(user.timestamp),
20
+ BigInt(now),
21
+ {
22
+ threeMTimestamp: BigInt(global.threeMTimestamp),
23
+ tenMTimestamp: BigInt(global.tenMTimestamp),
24
+ twentyFiveMTimestamp: BigInt(global.twentyFiveMTimestamp),
25
+ fiftyMTimestamp: BigInt(global.fiftyMTimestamp),
26
+ },
27
+ BigInt(user.points),
28
+ )
29
+ return {
30
+ ...user,
31
+ currentPoints: Number(formatEther(currentPoints)),
32
+ }
33
+ })
34
+
35
+ return {
36
+ ...global,
37
+ leaderBoard: leaderBoard?.sort((a, b) => b.currentPoints - a.currentPoints),
38
+ }
39
+ }
40
+
41
+ export const getUserSnapshotCherries = async () => {
42
+ const cherriesData = await (await fetch(SDCAKE_REFERRAL_SNAPSHOT_CHERRIES_API_URL)).json()
43
+ return cherriesData
44
+ }
45
+
46
+ export const getUserCherries = (cherriesData: any, userAddress: string) => {
47
+ return cherriesData.find((user) => equalTlc(user.address, userAddress))
48
+ }
@@ -34,22 +34,21 @@ const getHttpCalls = async (chainId: number) => {
34
34
  }
35
35
  }
36
36
  case bsc.id: {
37
- const delegationsAPRsCall = [
37
+ const httpCalls = [
38
38
  (await fetch('https://raw.githubusercontent.com/stake-dao/bounties-report/main/delegationsAPRs.json')).json(),
39
39
  ]
40
40
 
41
- const delegationsAPRsResponse = (await Promise.allSettled(delegationsAPRsCall)).map((result) =>
41
+ const httpResponses = (await Promise.allSettled(httpCalls)).map((result) =>
42
42
  result.status === 'fulfilled' ? result.value : undefined,
43
43
  )
44
44
 
45
- const delegationsAPRsData = delegationsAPRsResponse[0]
45
+ const bribesData = httpResponses[0]
46
46
 
47
- return {
48
- bribesData: delegationsAPRsData,
49
- }
47
+ return { bribesData }
50
48
  }
51
49
  }
52
- return undefined
50
+
51
+ return {}
53
52
  }
54
53
 
55
54
  export default getHttpCalls
@@ -0,0 +1,6 @@
1
+ export const GAUGES_CHUNK_SIZE = 90
2
+ export const GAUGES_METADATA_CHUNK_SIZE = 10
3
+
4
+ export const BROKEN_GAUGES = [
5
+ '0x34ed182d0812d119c92907852d2b429f095a9b07', // lp token in gauge controller
6
+ ]
@@ -0,0 +1,119 @@
1
+ import { contracts } from '@stake-dao/constants'
2
+ import { chunk, groupBy, range } from 'lodash-es'
3
+ import { decodeAbiParameters, encodeAbiParameters, formatUnits, parseAbiParameters, zeroAddress } from 'viem'
4
+ import { mainnet } from 'viem/chains'
5
+ import { batchCurveGauges, batchGaugesMetadata } from '../../bytecodes/index.js'
6
+ import { concatBytecode } from '../../index.js'
7
+ import { batchJsonRpc, equalTlc, rpcCall } from '../../utils.js'
8
+ import { BROKEN_GAUGES, GAUGES_CHUNK_SIZE, GAUGES_METADATA_CHUNK_SIZE } from './config.js'
9
+
10
+ export type Gauge = {
11
+ gauge: string
12
+ inflationRate: string
13
+ relativeWeight: string
14
+ futureRelativeWeight: string
15
+ }
16
+
17
+ export type GaugesData = { totalGaugesWeight: string; gauges: Gauge[] }
18
+
19
+ type Rpcs = {
20
+ [chainId: number]: string
21
+ }
22
+
23
+ export const fetchCurveGauges = async (rpc: Rpcs): Promise<GaugesData> => {
24
+ const nGaugesRequest = await rpcCall(rpc[mainnet.id]!, [
25
+ { to: contracts.curveGaugeController![1]!, data: '0xe93841d0' }, // n_gauges
26
+ { to: contracts.curveGaugeController![1]!, data: '0x6977ff92' }, // get_total_weight
27
+ ])
28
+
29
+ const nGauges = Number(decodeAbiParameters([{ type: 'uint256', name: 'n_gauges' }], nGaugesRequest[0].result))
30
+ const totalGaugesWeight = formatUnits(
31
+ decodeAbiParameters([{ type: 'uint256', name: 'get_total_weight' }], nGaugesRequest[1].result)[0],
32
+ 0,
33
+ )
34
+
35
+ const gaugesControllerCalls = range(0, nGauges, GAUGES_CHUNK_SIZE).map((skip) => {
36
+ const inputParams = [nGauges, skip, skip + GAUGES_CHUNK_SIZE > nGauges ? nGauges : skip + GAUGES_CHUNK_SIZE]
37
+
38
+ const inputData = encodeAbiParameters(parseAbiParameters(batchCurveGauges.inputType[1]!) as any, inputParams)
39
+ return concatBytecode(batchCurveGauges.bytecode[1]!, inputData)
40
+ })
41
+
42
+ const rawGauges = await batchJsonRpc({
43
+ rpc: rpc[mainnet.id]!,
44
+ calls: gaugesControllerCalls,
45
+ outputTypeAbi: batchCurveGauges.outputType![1],
46
+ parse: false,
47
+ callsKey: `votemarket/curve/fetchCurveGauges.ts: rawGauges - chainId ${mainnet.id} - rpc ${rpc[mainnet.id]}`,
48
+ })
49
+
50
+ const gauges = rawGauges.map((g) => ({
51
+ gauge: g.gauge,
52
+ weight: formatUnits(g.weight, 0),
53
+ relativeWeight: formatUnits(g.relativeWeight, 0),
54
+ futureRelativeWeight: formatUnits(g.futureRelativeWeight, 0),
55
+ isKilled: g.isKilled,
56
+ chainId: Number(g.chainId),
57
+ }))
58
+
59
+ const gaugesMetadata: any[] = []
60
+ const filteredGauges = gauges.filter((g) => g.chainId > 0 && !BROKEN_GAUGES.includes(g.gauge.toLowerCase()))
61
+ const gaugesPerChain = groupBy(filteredGauges, 'chainId')
62
+
63
+ for (const chainId of Object.keys(gaugesPerChain)) {
64
+ const chainGauges = gaugesPerChain[chainId]!
65
+ const chunkedChainGauges = chunk(chainGauges, GAUGES_METADATA_CHUNK_SIZE)
66
+
67
+ const gaugesMetadataCalls = chunkedChainGauges.map((gaugeObj) => {
68
+ const inputParams = [gaugeObj.map((g) => g.gauge)]
69
+
70
+ const inputData = encodeAbiParameters(parseAbiParameters(batchGaugesMetadata.inputType[0]!) as any, inputParams)
71
+ return concatBytecode(
72
+ batchGaugesMetadata.bytecode[chainId] ? batchGaugesMetadata.bytecode[chainId] : batchGaugesMetadata.bytecode[0],
73
+ inputData,
74
+ )
75
+ })
76
+
77
+ const rawGaugesMetadata = await batchJsonRpc({
78
+ rpc: rpc[chainId]!,
79
+ calls: gaugesMetadataCalls,
80
+ outputTypeAbi: batchGaugesMetadata.outputType![0],
81
+ parse: false,
82
+ callsKey: `votemarket/curve/fetchCurveGauges.ts: rawGaugesMetadata - chainId ${chainId} - rpc ${[chainId]}`,
83
+ })
84
+
85
+ gaugesMetadata.push(...rawGaugesMetadata)
86
+ }
87
+
88
+ const augmentedGauges = filteredGauges.map((g) => {
89
+ const gaugeMetadata = gaugesMetadata.find((gm) => equalTlc(gm.gauge, g.gauge))
90
+
91
+ return {
92
+ gauge: g.gauge,
93
+ weight: g.weight,
94
+ relativeWeight: g.relativeWeight,
95
+ futureRelativeWeight: g.futureRelativeWeight,
96
+ isKilled: g.isKilled,
97
+ chainId: g.chainId,
98
+ lp: {
99
+ name: gaugeMetadata.lp.name,
100
+ symbol: gaugeMetadata.lp.symbol,
101
+ address: gaugeMetadata.lp._address,
102
+ decimals: Number(gaugeMetadata.lp.decimals),
103
+ },
104
+ coins: gaugeMetadata.coins
105
+ .map((c) => ({
106
+ name: c.name,
107
+ symbol: c.symbol,
108
+ address: c._address,
109
+ decimals: Number(c.decimals),
110
+ }))
111
+ .filter((c) => c.address !== zeroAddress),
112
+ }
113
+ })
114
+
115
+ return {
116
+ totalGaugesWeight,
117
+ gauges: augmentedGauges,
118
+ }
119
+ }
@@ -1,8 +0,0 @@
1
- const gaugeControllerCalls = (gaugeController, gauge) => [
2
- { address: gaugeController, name: 'gauge_relative_weight', params: [gauge] },
3
- { address: gaugeController, name: 'get_total_weight' },
4
- { address: gaugeController, name: 'get_gauge_weight', params: [gauge] },
5
- { address: gaugeController, name: 'time_total' },
6
- ];
7
- export default gaugeControllerCalls;
8
- //# sourceMappingURL=gaugeControllerCalls.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"gaugeControllerCalls.js","sourceRoot":"","sources":["../../../../../src/lockers/utils/callsForLockers/gaugeControllerCalls.ts"],"names":[],"mappings":"AAAA,MAAM,oBAAoB,GAAG,CAAC,eAAuB,EAAE,KAAa,EAAE,EAAE,CAAC;IACvE,EAAE,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,uBAAuB,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE;IAC5E,EAAE,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,kBAAkB,EAAE;IACtD,EAAE,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE;IACvE,EAAE,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,YAAY,EAAE;CACjD,CAAA;AAED,eAAe,oBAAoB,CAAA"}
@@ -1,22 +0,0 @@
1
- import { formatUnits } from 'viem';
2
- import { graphql } from '../../utils.js';
3
- import { SDCAKE_AIRDROP_GLOBAL_QUERY, SDCAKE_AIRDROP_GRAPH_URL } from './endpoints.js';
4
- import { computeRatePoints } from './cakeLockerAirdrop.js';
5
- export const getCherriesLeaderBoard = async () => {
6
- const subgraphData = await graphql(SDCAKE_AIRDROP_GRAPH_URL, SDCAKE_AIRDROP_GLOBAL_QUERY, {});
7
- const airdropGraph = subgraphData?.globals ? subgraphData.globals[0] : undefined;
8
- const now = Math.floor(Date.now() / 1000);
9
- const leaderBoard = subgraphData?.globals &&
10
- subgraphData.users.map((user) => {
11
- const currentPoints = computeRatePoints(BigInt(user.rate), BigInt(user.timestamp), BigInt(now), airdropGraph, BigInt(user.points));
12
- return {
13
- ...user,
14
- currentPoints: Number(formatUnits(currentPoints, 18)),
15
- };
16
- });
17
- return {
18
- ...airdropGraph,
19
- leaderBoard: leaderBoard?.sort((a, b) => b.currentPoints - a.currentPoints),
20
- };
21
- };
22
- //# sourceMappingURL=getCherriesLeaderBoard.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"getCherriesLeaderBoard.js","sourceRoot":"","sources":["../../../../src/lockers/utils/getCherriesLeaderBoard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,MAAM,CAAA;AAElC,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AACxC,OAAO,EAAE,2BAA2B,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAA;AAEtF,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAE1D,MAAM,CAAC,MAAM,sBAAsB,GAAG,KAAK,IAAI,EAAE;IAC/C,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,wBAAwB,EAAE,2BAA2B,EAAE,EAAE,CAAC,CAAA;IAC7F,MAAM,YAAY,GAAG,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAEhF,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAA;IAEzC,MAAM,WAAW,GACf,YAAY,EAAE,OAAO;QACrB,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YAC9B,MAAM,aAAa,GAAG,iBAAiB,CACrC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EACjB,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EACtB,MAAM,CAAC,GAAG,CAAC,EACX,YAAY,EACZ,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CACpB,CAAA;YACD,OAAO;gBACL,GAAG,IAAI;gBACP,aAAa,EAAE,MAAM,CAAC,WAAW,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;aACtD,CAAA;QACH,CAAC,CAAC,CAAA;IAEJ,OAAO;QACL,GAAG,YAAY;QACf,WAAW,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC,aAAa,CAAC;KAC5E,CAAA;AACH,CAAC,CAAA"}
@@ -1,11 +0,0 @@
1
- declare const gaugeControllerCalls: (gaugeController: string, gauge: string) => ({
2
- address: string;
3
- name: string;
4
- params: string[];
5
- } | {
6
- address: string;
7
- name: string;
8
- params?: undefined;
9
- })[];
10
- export default gaugeControllerCalls;
11
- //# sourceMappingURL=gaugeControllerCalls.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"gaugeControllerCalls.d.ts","sourceRoot":"","sources":["../../../../../src/lockers/utils/callsForLockers/gaugeControllerCalls.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,oBAAoB,oBAAqB,MAAM,SAAS,MAAM;;;;;;;;IAKnE,CAAA;AAED,eAAe,oBAAoB,CAAA"}
@@ -1,2 +0,0 @@
1
- export declare const getCherriesLeaderBoard: () => Promise<any>;
2
- //# sourceMappingURL=getCherriesLeaderBoard.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"getCherriesLeaderBoard.d.ts","sourceRoot":"","sources":["../../../../src/lockers/utils/getCherriesLeaderBoard.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,sBAAsB,oBA0BlC,CAAA"}
@@ -1,8 +0,0 @@
1
- const gaugeControllerCalls = (gaugeController: string, gauge: string) => [
2
- { address: gaugeController, name: 'gauge_relative_weight', params: [gauge] },
3
- { address: gaugeController, name: 'get_total_weight' },
4
- { address: gaugeController, name: 'get_gauge_weight', params: [gauge] },
5
- { address: gaugeController, name: 'time_total' },
6
- ]
7
-
8
- export default gaugeControllerCalls
@@ -1,34 +0,0 @@
1
- import { formatUnits } from 'viem'
2
-
3
- import { graphql } from '../../utils.js'
4
- import { SDCAKE_AIRDROP_GLOBAL_QUERY, SDCAKE_AIRDROP_GRAPH_URL } from './endpoints.js'
5
-
6
- import { computeRatePoints } from './cakeLockerAirdrop.js'
7
-
8
- export const getCherriesLeaderBoard = async () => {
9
- const subgraphData = await graphql(SDCAKE_AIRDROP_GRAPH_URL, SDCAKE_AIRDROP_GLOBAL_QUERY, {})
10
- const airdropGraph = subgraphData?.globals ? subgraphData.globals[0] : undefined
11
-
12
- const now = Math.floor(Date.now() / 1000)
13
-
14
- const leaderBoard =
15
- subgraphData?.globals &&
16
- subgraphData.users.map((user) => {
17
- const currentPoints = computeRatePoints(
18
- BigInt(user.rate),
19
- BigInt(user.timestamp),
20
- BigInt(now),
21
- airdropGraph,
22
- BigInt(user.points),
23
- )
24
- return {
25
- ...user,
26
- currentPoints: Number(formatUnits(currentPoints, 18)),
27
- }
28
- })
29
-
30
- return {
31
- ...airdropGraph,
32
- leaderBoard: leaderBoard?.sort((a, b) => b.currentPoints - a.currentPoints),
33
- }
34
- }