@stake-dao/reader 0.1.1 → 0.1.2

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 (191) hide show
  1. package/dist/esm/batches/buildYearnStrats.js +39 -0
  2. package/dist/esm/batches/buildYearnStrats.js.map +1 -0
  3. package/dist/esm/batches/curveStrats.js +4 -6
  4. package/dist/esm/batches/curveStrats.js.map +1 -1
  5. package/dist/esm/batches/fetchYearnGauges.js +76 -0
  6. package/dist/esm/batches/fetchYearnGauges.js.map +1 -0
  7. package/dist/esm/batches/index.js +2 -0
  8. package/dist/esm/batches/index.js.map +1 -1
  9. package/dist/esm/index.js +2 -0
  10. package/dist/esm/index.js.map +1 -1
  11. package/dist/esm/lockers/abis/MulticallLockers.json +591 -0
  12. package/dist/esm/lockers/fetch/index.js +306 -0
  13. package/dist/esm/lockers/fetch/index.js.map +1 -0
  14. package/dist/esm/lockers/utils/cakeLockerAirdrop.js +46 -0
  15. package/dist/esm/lockers/utils/cakeLockerAirdrop.js.map +1 -0
  16. package/dist/esm/lockers/utils/callsForLockers/depositorCalls.js +20 -0
  17. package/dist/esm/lockers/utils/callsForLockers/depositorCalls.js.map +1 -0
  18. package/dist/esm/lockers/utils/callsForLockers/feeCalls.js +94 -0
  19. package/dist/esm/lockers/utils/callsForLockers/feeCalls.js.map +1 -0
  20. package/dist/esm/lockers/utils/callsForLockers/gaugeCalls.js +6 -0
  21. package/dist/esm/lockers/utils/callsForLockers/gaugeCalls.js.map +1 -0
  22. package/dist/esm/lockers/utils/callsForLockers/gaugeControllerCalls.js +8 -0
  23. package/dist/esm/lockers/utils/callsForLockers/gaugeControllerCalls.js.map +1 -0
  24. package/dist/esm/lockers/utils/callsForLockers/index.js +29 -0
  25. package/dist/esm/lockers/utils/callsForLockers/index.js.map +1 -0
  26. package/dist/esm/lockers/utils/callsForLockers/pegCalls.js +38 -0
  27. package/dist/esm/lockers/utils/callsForLockers/pegCalls.js.map +1 -0
  28. package/dist/esm/lockers/utils/callsForLockers/veCalls.js +26 -0
  29. package/dist/esm/lockers/utils/callsForLockers/veCalls.js.map +1 -0
  30. package/dist/esm/lockers/utils/callsForLockers/veSdtCalls.js +14 -0
  31. package/dist/esm/lockers/utils/callsForLockers/veSdtCalls.js.map +1 -0
  32. package/dist/esm/lockers/utils/endpoints.js +23 -0
  33. package/dist/esm/lockers/utils/endpoints.js.map +1 -0
  34. package/dist/esm/lockers/utils/getBribesRewardsData.js +46 -0
  35. package/dist/esm/lockers/utils/getBribesRewardsData.js.map +1 -0
  36. package/dist/esm/lockers/utils/getCherriesLeaderBoard.js +22 -0
  37. package/dist/esm/lockers/utils/getCherriesLeaderBoard.js.map +1 -0
  38. package/dist/esm/lockers/utils/getFees.js +30 -0
  39. package/dist/esm/lockers/utils/getFees.js.map +1 -0
  40. package/dist/esm/lockers/utils/getHttpCalls.js +44 -0
  41. package/dist/esm/lockers/utils/getHttpCalls.js.map +1 -0
  42. package/dist/esm/lockers/utils/getSdtInflationData.js +38 -0
  43. package/dist/esm/lockers/utils/getSdtInflationData.js.map +1 -0
  44. package/dist/esm/lockers/utils/index.js +157 -0
  45. package/dist/esm/lockers/utils/index.js.map +1 -0
  46. package/dist/esm/lockers/utils/substractFees.js +22 -0
  47. package/dist/esm/lockers/utils/substractFees.js.map +1 -0
  48. package/dist/esm/strategies/curve/build.js +10 -7
  49. package/dist/esm/strategies/curve/build.js.map +1 -1
  50. package/dist/esm/strategies/curve/fetch/getStratsWithApr.js +1 -1
  51. package/dist/esm/strategies/curve/fetch/getStratsWithApr.js.map +1 -1
  52. package/dist/esm/strategies/curve/fetch/index.js +4 -17
  53. package/dist/esm/strategies/curve/fetch/index.js.map +1 -1
  54. package/dist/esm/strategies/curve/httpCalls.js +3 -1
  55. package/dist/esm/strategies/curve/httpCalls.js.map +1 -1
  56. package/dist/esm/strategies/utils/abis/MulticallYearnStratsAbi.json +107 -0
  57. package/dist/esm/strategies/{curve/fetch → utils}/getAprBreakdown.js +17 -7
  58. package/dist/esm/strategies/utils/getAprBreakdown.js.map +1 -0
  59. package/dist/esm/strategies/utils/index.js +1 -0
  60. package/dist/esm/strategies/utils/index.js.map +1 -1
  61. package/dist/esm/strategies/utils/sdt.js +17 -0
  62. package/dist/esm/strategies/utils/sdt.js.map +1 -1
  63. package/dist/esm/strategies/yearn/build.js +97 -0
  64. package/dist/esm/strategies/yearn/build.js.map +1 -0
  65. package/dist/esm/strategies/yearn/fetch/computeYearnApr.js +28 -0
  66. package/dist/esm/strategies/yearn/fetch/computeYearnApr.js.map +1 -0
  67. package/dist/esm/strategies/yearn/fetch/fetchAllYearnGauges.js +61 -0
  68. package/dist/esm/strategies/yearn/fetch/fetchAllYearnGauges.js.map +1 -0
  69. package/dist/esm/strategies/yearn/fetch/index.js +169 -0
  70. package/dist/esm/strategies/yearn/fetch/index.js.map +1 -0
  71. package/dist/esm/tsconfig.build.tsbuildinfo +1 -1
  72. package/dist/esm/utils.js +33 -1
  73. package/dist/esm/utils.js.map +1 -1
  74. package/dist/types/batches/buildYearnStrats.d.ts +4 -0
  75. package/dist/types/batches/buildYearnStrats.d.ts.map +1 -0
  76. package/dist/types/batches/curveStrats.d.ts.map +1 -1
  77. package/dist/types/batches/fetchYearnGauges.d.ts +4 -0
  78. package/dist/types/batches/fetchYearnGauges.d.ts.map +1 -0
  79. package/dist/types/batches/index.d.ts +2 -0
  80. package/dist/types/batches/index.d.ts.map +1 -1
  81. package/dist/types/index.d.ts +2 -0
  82. package/dist/types/index.d.ts.map +1 -1
  83. package/dist/types/lockers/fetch/index.d.ts +11 -0
  84. package/dist/types/lockers/fetch/index.d.ts.map +1 -0
  85. package/dist/types/lockers/utils/cakeLockerAirdrop.d.ts +8 -0
  86. package/dist/types/lockers/utils/cakeLockerAirdrop.d.ts.map +1 -0
  87. package/dist/types/lockers/utils/callsForLockers/depositorCalls.d.ts +3 -0
  88. package/dist/types/lockers/utils/callsForLockers/depositorCalls.d.ts.map +1 -0
  89. package/dist/types/lockers/utils/callsForLockers/feeCalls.d.ts +11 -0
  90. package/dist/types/lockers/utils/callsForLockers/feeCalls.d.ts.map +1 -0
  91. package/dist/types/lockers/utils/callsForLockers/gaugeCalls.d.ts +6 -0
  92. package/dist/types/lockers/utils/callsForLockers/gaugeCalls.d.ts.map +1 -0
  93. package/dist/types/lockers/utils/callsForLockers/gaugeControllerCalls.d.ts +11 -0
  94. package/dist/types/lockers/utils/callsForLockers/gaugeControllerCalls.d.ts.map +1 -0
  95. package/dist/types/lockers/utils/callsForLockers/index.d.ts +3 -0
  96. package/dist/types/lockers/utils/callsForLockers/index.d.ts.map +1 -0
  97. package/dist/types/lockers/utils/callsForLockers/pegCalls.d.ts +15 -0
  98. package/dist/types/lockers/utils/callsForLockers/pegCalls.d.ts.map +1 -0
  99. package/dist/types/lockers/utils/callsForLockers/veCalls.d.ts +3 -0
  100. package/dist/types/lockers/utils/callsForLockers/veCalls.d.ts.map +1 -0
  101. package/dist/types/lockers/utils/callsForLockers/veSdtCalls.d.ts +11 -0
  102. package/dist/types/lockers/utils/callsForLockers/veSdtCalls.d.ts.map +1 -0
  103. package/dist/types/lockers/utils/endpoints.d.ts +3 -0
  104. package/dist/types/lockers/utils/endpoints.d.ts.map +1 -0
  105. package/dist/types/lockers/utils/getBribesRewardsData.d.ts +18 -0
  106. package/dist/types/lockers/utils/getBribesRewardsData.d.ts.map +1 -0
  107. package/dist/types/lockers/utils/getCherriesLeaderBoard.d.ts +2 -0
  108. package/dist/types/lockers/utils/getCherriesLeaderBoard.d.ts.map +1 -0
  109. package/dist/types/lockers/utils/getFees.d.ts +4 -0
  110. package/dist/types/lockers/utils/getFees.d.ts.map +1 -0
  111. package/dist/types/lockers/utils/getHttpCalls.d.ts +11 -0
  112. package/dist/types/lockers/utils/getHttpCalls.d.ts.map +1 -0
  113. package/dist/types/lockers/utils/getSdtInflationData.d.ts +8 -0
  114. package/dist/types/lockers/utils/getSdtInflationData.d.ts.map +1 -0
  115. package/dist/types/lockers/utils/index.d.ts +30 -0
  116. package/dist/types/lockers/utils/index.d.ts.map +1 -0
  117. package/dist/types/lockers/utils/substractFees.d.ts +3 -0
  118. package/dist/types/lockers/utils/substractFees.d.ts.map +1 -0
  119. package/dist/types/prices.d.ts.map +1 -1
  120. package/dist/types/strategies/curve/build.d.ts +2 -31
  121. package/dist/types/strategies/curve/build.d.ts.map +1 -1
  122. package/dist/types/strategies/curve/endpoints.d.ts +2 -2
  123. package/dist/types/strategies/curve/fetch/curveApiData/getGaugesFromRegistry.d.ts.map +1 -1
  124. package/dist/types/strategies/curve/fetch/curveApiData/getGaugesWeights.d.ts.map +1 -1
  125. package/dist/types/strategies/curve/fetch/index.d.ts +2 -7
  126. package/dist/types/strategies/curve/fetch/index.d.ts.map +1 -1
  127. package/dist/types/strategies/curve/httpCalls.d.ts.map +1 -1
  128. package/dist/types/strategies/types.d.ts +49 -6
  129. package/dist/types/strategies/types.d.ts.map +1 -1
  130. package/dist/types/strategies/utils/getAprBreakdown.d.ts +15 -0
  131. package/dist/types/strategies/utils/getAprBreakdown.d.ts.map +1 -0
  132. package/dist/types/strategies/utils/index.d.ts +1 -0
  133. package/dist/types/strategies/utils/index.d.ts.map +1 -1
  134. package/dist/types/strategies/utils/promise.d.ts.map +1 -1
  135. package/dist/types/strategies/utils/sdt.d.ts +1 -0
  136. package/dist/types/strategies/utils/sdt.d.ts.map +1 -1
  137. package/dist/types/strategies/yearn/build.d.ts +8 -0
  138. package/dist/types/strategies/yearn/build.d.ts.map +1 -0
  139. package/dist/types/strategies/yearn/fetch/computeYearnApr.d.ts +9 -0
  140. package/dist/types/strategies/yearn/fetch/computeYearnApr.d.ts.map +1 -0
  141. package/dist/types/strategies/yearn/fetch/fetchAllYearnGauges.d.ts +2 -0
  142. package/dist/types/strategies/yearn/fetch/fetchAllYearnGauges.d.ts.map +1 -0
  143. package/dist/types/strategies/yearn/fetch/index.d.ts +5 -0
  144. package/dist/types/strategies/yearn/fetch/index.d.ts.map +1 -0
  145. package/dist/types/utils.d.ts +5 -0
  146. package/dist/types/utils.d.ts.map +1 -1
  147. package/package.json +3 -2
  148. package/src/batches/buildYearnStrats.ts +41 -0
  149. package/src/batches/curveStrats.ts +4 -6
  150. package/src/batches/fetchYearnGauges.ts +78 -0
  151. package/src/batches/index.ts +2 -0
  152. package/src/index.ts +2 -0
  153. package/src/lockers/fetch/index.ts +407 -0
  154. package/src/lockers/utils/cakeLockerAirdrop.ts +73 -0
  155. package/src/lockers/utils/callsForLockers/depositorCalls.ts +25 -0
  156. package/src/lockers/utils/callsForLockers/feeCalls.ts +118 -0
  157. package/src/lockers/utils/callsForLockers/gaugeCalls.ts +6 -0
  158. package/src/lockers/utils/callsForLockers/gaugeControllerCalls.ts +8 -0
  159. package/src/lockers/utils/callsForLockers/index.ts +44 -0
  160. package/src/lockers/utils/callsForLockers/pegCalls.ts +40 -0
  161. package/src/lockers/utils/callsForLockers/veCalls.ts +31 -0
  162. package/src/lockers/utils/callsForLockers/veSdtCalls.ts +15 -0
  163. package/src/lockers/utils/endpoints.ts +24 -0
  164. package/src/lockers/utils/getBribesRewardsData.ts +64 -0
  165. package/src/lockers/utils/getCherriesLeaderBoard.ts +34 -0
  166. package/src/lockers/utils/getFees.ts +34 -0
  167. package/src/lockers/utils/getHttpCalls.ts +55 -0
  168. package/src/lockers/utils/getSdtInflationData.ts +54 -0
  169. package/src/lockers/utils/index.ts +200 -0
  170. package/src/lockers/utils/substractFees.ts +26 -0
  171. package/src/strategies/curve/build.ts +49 -44
  172. package/src/strategies/curve/fetch/getStratsWithApr.ts +1 -1
  173. package/src/strategies/curve/fetch/index.ts +12 -22
  174. package/src/strategies/curve/httpCalls.ts +3 -1
  175. package/src/strategies/types.ts +52 -6
  176. package/src/strategies/{curve/fetch → utils}/getAprBreakdown.ts +25 -8
  177. package/src/strategies/utils/index.ts +1 -0
  178. package/src/strategies/utils/sdt.ts +24 -0
  179. package/src/strategies/yearn/build.ts +156 -0
  180. package/src/strategies/yearn/fetch/computeYearnApr.ts +47 -0
  181. package/src/strategies/yearn/fetch/fetchAllYearnGauges.ts +78 -0
  182. package/src/strategies/yearn/fetch/index.ts +225 -0
  183. package/src/utils.ts +43 -1
  184. package/dist/esm/strategies/curve/fetch/getAprBreakdown.js.map +0 -1
  185. package/dist/esm/strategies/curve/fetch/types.js +0 -2
  186. package/dist/esm/strategies/curve/fetch/types.js.map +0 -1
  187. package/dist/types/strategies/curve/fetch/getAprBreakdown.d.ts +0 -17
  188. package/dist/types/strategies/curve/fetch/getAprBreakdown.d.ts.map +0 -1
  189. package/dist/types/strategies/curve/fetch/types.d.ts +0 -11
  190. package/dist/types/strategies/curve/fetch/types.d.ts.map +0 -1
  191. package/src/strategies/curve/fetch/types.ts +0 -11
@@ -0,0 +1,40 @@
1
+ import { parseUnits, zeroAddress } from 'viem'
2
+
3
+ import { contracts } from '@stake-dao/constants'
4
+ import { One, Zero } from '../../../index.js'
5
+
6
+ const pegCalls = (secondaryMarket: string, pool: string, pegInfo: any, sdToken: string, token: string) => {
7
+ switch (secondaryMarket) {
8
+ case 'Balancer':
9
+ return {
10
+ address: contracts.balancerVault![1],
11
+ 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
+ ],
18
+ }
19
+ case 'Maverick':
20
+ return {
21
+ address: contracts.mavPoolInfos![1],
22
+ name: 'calculateSwap',
23
+ params: [pool, parseUnits(pegInfo?.basedOn ? pegInfo.basedOn.toString() : '1', 18), true, false, Zero],
24
+ }
25
+ case 'PancakeSwap':
26
+ return {
27
+ address: contracts.pancakeQuoter![56],
28
+ name: 'quoteExactInputSingle',
29
+ params: [[sdToken, token, parseUnits(pegInfo?.basedOn ? pegInfo.basedOn.toString() : '1', 18), '2500', '0']],
30
+ }
31
+ default:
32
+ return {
33
+ address: pool,
34
+ name: 'get_dy',
35
+ params: [One, Zero, parseUnits(pegInfo?.basedOn ? pegInfo.basedOn.toString() : '1', 18)],
36
+ }
37
+ }
38
+ }
39
+
40
+ export default pegCalls
@@ -0,0 +1,31 @@
1
+ import { lockerWithId } from '@stake-dao/constants'
2
+
3
+ import { lockedAmountCall } from '../index.js'
4
+
5
+ const veCalls = (lockerId: string, votingEscrow: string, locker: string, token: string) => {
6
+ const calls: any[] = []
7
+ calls.push(lockedAmountCall(lockerId, votingEscrow, locker))
8
+ calls.push({ address: votingEscrow, name: 'balanceOf', params: [locker] })
9
+
10
+ if (
11
+ [
12
+ lockerWithId('pendle')!.extensions.locker,
13
+ lockerWithId('mav')!.extensions.locker,
14
+ lockerWithId('cake', 56)!.extensions.locker,
15
+ ].includes(locker)
16
+ ) {
17
+ calls.push({ address: token, name: 'balanceOf', params: [votingEscrow] })
18
+ } else {
19
+ calls.push({ address: votingEscrow, name: 'supply' })
20
+ }
21
+
22
+ if (locker === lockerWithId('pendle')!.extensions.locker) {
23
+ calls.push({ address: votingEscrow, name: 'totalSupplyStored' })
24
+ } else {
25
+ calls.push({ address: votingEscrow, name: 'totalSupply' })
26
+ }
27
+
28
+ return calls
29
+ }
30
+
31
+ export default veCalls
@@ -0,0 +1,15 @@
1
+ import { contracts, tokenWithId } from '@stake-dao/constants'
2
+
3
+ const veSdtCalls = (voteBooster: any, token: string, sdToken: string, sdTokenGauge: string) => [
4
+ { address: tokenWithId('vesdt')!.address, name: 'totalSupply' },
5
+ ...(voteBooster
6
+ ? [
7
+ { address: token, name: 'balanceOf', params: [contracts.voteBoosterStrategy![1]] },
8
+ { address: sdToken, name: 'balanceOf', params: [contracts.voteBoosterStrategy![1]] },
9
+ { address: sdTokenGauge, name: 'balanceOf', params: [contracts.voteBoosterStrategy![1]] },
10
+ { address: sdTokenGauge, name: 'working_balances', params: [contracts.voteBoosterStrategy![1]] },
11
+ ]
12
+ : []),
13
+ ]
14
+
15
+ export default veSdtCalls
@@ -0,0 +1,24 @@
1
+ import { gql } from 'graphql-request'
2
+
3
+ export const SDCAKE_AIRDROP_GRAPH_URL = 'https://api.thegraph.com/subgraphs/name/lucasramadour/sdcake-airdrop'
4
+
5
+ export const SDCAKE_AIRDROP_GLOBAL_QUERY = gql`
6
+ query Global {
7
+ globals(first: 1) {
8
+ timestamp
9
+ points
10
+ rate
11
+ threeMTimestamp
12
+ tenMTimestamp
13
+ twentyFiveMTimestamp
14
+ fiftyMTimestamp
15
+ currentMultiplier
16
+ }
17
+ users(first: 1000) {
18
+ address
19
+ timestamp
20
+ points
21
+ rate
22
+ }
23
+ }
24
+ `
@@ -0,0 +1,64 @@
1
+ import { parseUnits } from 'viem'
2
+
3
+ import { delegationWithId } from '@stake-dao/constants'
4
+ import { One, Zero } from '../../index.js'
5
+
6
+ import { calculateAllData } from './index.js'
7
+
8
+ const getBribesRewardsData = (
9
+ locker: any,
10
+ bribesData: any,
11
+ veSdtTotalSupply: any,
12
+ totalSupplyStaked: any,
13
+ veBalanceOfLocker: any,
14
+ gaugeWorkingSupply: any,
15
+ ) => {
16
+ const bribesAverageApr = [
17
+ { id: 'crv', value: bribesData?.[delegationWithId('crv')!] / 100 || 0 },
18
+ { id: 'bal', value: bribesData?.[delegationWithId('bal')!] / 100 || 0 },
19
+ { id: 'fxs', value: bribesData?.[delegationWithId('fxs')!] / 100 || 0 }, // 1 FXS = 4 veFXS
20
+ { id: 'angle', value: bribesData?.[delegationWithId('angle')!] / 100 || 0 },
21
+ { id: 'pendle', value: bribesData?.[delegationWithId('pendle')!] / 100 || 0 },
22
+ { id: 'fxn', value: bribesData?.[delegationWithId('fxn')!] / 100 || 0 },
23
+ ]
24
+
25
+ // Vote incentives APR
26
+ const votingPower = calculateAllData(
27
+ locker.id,
28
+ {
29
+ veSDTSupply: veSdtTotalSupply,
30
+ userVeSDTBalance: Zero,
31
+ gaugeSupply: parseUnits(totalSupplyStaked, locker.token.decimals),
32
+ userSdTokenGaugeBalance: Zero,
33
+ llVotingPower: parseUnits(veBalanceOfLocker, locker.token.decimals),
34
+ gaugeWorkingSupply: parseUnits(gaugeWorkingSupply, locker.token.decimals),
35
+ delegatedVeSDTBalance: Zero,
36
+ receivedVeSDTBalance: Zero,
37
+ },
38
+ One,
39
+ Zero,
40
+ )
41
+
42
+ const bribesAverage = bribesAverageApr.find((b) => b.id === locker.id)
43
+ const bribeMinApr = (bribesAverage ? bribesAverage.value * (Number(votingPower.min) / 1000) : 0) * 100
44
+ const bribeMaxApr = (bribesAverage ? bribesAverage.value * (Number(votingPower.max) / 1000) : 0) * 100
45
+ const bribeRewards = bribesAverage
46
+ ? {
47
+ bribeMinApr,
48
+ bribeMaxApr,
49
+ bribeAverageApr: bribesAverage.value * 100,
50
+ average: bribesAverageApr,
51
+ minBoost: (Number(votingPower.min) / 1000).toFixed(2),
52
+ maxBoost: (Number(votingPower.max) / 1000).toFixed(2),
53
+ token: `sd${bribesAverage.id}`,
54
+ }
55
+ : undefined
56
+
57
+ return {
58
+ bribeMinApr,
59
+ bribeMaxApr,
60
+ bribeRewards,
61
+ }
62
+ }
63
+
64
+ export default getBribesRewardsData
@@ -0,0 +1,34 @@
1
+ import { formatEther } 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(formatEther(currentPoints)),
27
+ }
28
+ })
29
+
30
+ return {
31
+ ...airdropGraph,
32
+ leaderBoard: leaderBoard?.sort((a, b) => b.currentPoints - a.currentPoints),
33
+ }
34
+ }
@@ -0,0 +1,34 @@
1
+ import { type ILockerFee } from './callsForLockers/feeCalls.js'
2
+
3
+ const getFees = (locker: any, lockerFee: ILockerFee | null | undefined) => {
4
+ const fees: any[] = []
5
+
6
+ for (const fee of locker.fees) {
7
+ let value: number = fee.value
8
+ if (!fee.static) {
9
+ switch (fee.key) {
10
+ case 'voteFee':
11
+ value = Number(lockerFee?.bountyFee || 0) / 100
12
+ break
13
+ case 'claimerFee':
14
+ case 'liquidityFee':
15
+ case 'daoFee':
16
+ case 'lockerFee':
17
+ value = Number(lockerFee?.[fee.key] || 0) / 100
18
+ break
19
+ }
20
+ }
21
+
22
+ if (value > 0) {
23
+ fees.push({
24
+ label: fee.label,
25
+ value,
26
+ key: fee.key,
27
+ })
28
+ }
29
+ }
30
+
31
+ return fees
32
+ }
33
+
34
+ export default getFees
@@ -0,0 +1,55 @@
1
+ import { bsc, mainnet } from 'viem/chains'
2
+
3
+ const getHttpCalls = async (chainId: number) => {
4
+ switch (chainId) {
5
+ case mainnet.id: {
6
+ const httpCalls = [
7
+ (await fetch('https://raw.githubusercontent.com/stake-dao/bounties-report/main/delegationsAPRs.json')).json(),
8
+ fetch('https://api.frax.finance/v1/vefpisdata/1-day')
9
+ .then((result) => result.json())
10
+ .catch((error) => {
11
+ console.error(error)
12
+ return undefined
13
+ }),
14
+ fetch('https://api.cvg.finance//stake-dao/aprs')
15
+ .then((result) => result.json())
16
+ .catch((error) => {
17
+ console.error(error)
18
+ return undefined
19
+ }),
20
+ ]
21
+
22
+ const httpResponses = (await Promise.allSettled(httpCalls)).map((result) =>
23
+ result.status === 'fulfilled' ? result.value : undefined,
24
+ )
25
+
26
+ const bribesData = httpResponses[0]
27
+ const fpisBribesData = httpResponses[1]
28
+ const cvgAprs = httpResponses[2]?.aprProjecteds
29
+
30
+ return {
31
+ bribesData,
32
+ fpisBribesData,
33
+ cvgAprs,
34
+ }
35
+ }
36
+ case bsc.id: {
37
+ const delegationsAPRsCall = [
38
+ (await fetch('https://raw.githubusercontent.com/stake-dao/bounties-report/main/delegationsAPRs.json')).json(),
39
+ ]
40
+
41
+ const delegationsAPRsResponse = (await Promise.allSettled(delegationsAPRsCall)).map((result) =>
42
+ result.status === 'fulfilled' ? result.value : undefined,
43
+ )
44
+
45
+ const delegationsAPRsData = delegationsAPRsResponse[0]
46
+
47
+ return {
48
+ bribesData: delegationsAPRsData,
49
+ }
50
+ }
51
+ }
52
+ return undefined
53
+ }
54
+
55
+ export default getHttpCalls
@@ -0,0 +1,54 @@
1
+ import { mainnet } from 'viem/chains'
2
+
3
+ import {
4
+ ETH_SECONDS_PER_BLOCK,
5
+ LOCKERS_MASTERCHEF_PID,
6
+ STRATEGIES_MASTERCHEF_PID,
7
+ contracts,
8
+ } from '@stake-dao/constants'
9
+ import { parseAbi } from 'viem'
10
+ import { multicall } from '../../utils.js'
11
+
12
+ const getSdtInflationData = async (provider: any) => {
13
+ const chainId = await provider.getChainId()
14
+ if (chainId === mainnet.id) {
15
+ const rawSdtMasterchefData = await multicall(
16
+ provider,
17
+ [
18
+ { address: contracts.sdtMasterchef![1]!, name: 'sdtPerBlock' },
19
+ { address: contracts.sdtMasterchef![1]!, name: 'totalAllocPoint' },
20
+ { address: contracts.sdtMasterchef![1]!, name: 'poolInfo', params: [LOCKERS_MASTERCHEF_PID] },
21
+ { address: contracts.sdtMasterchef![1]!, name: 'poolInfo', params: [STRATEGIES_MASTERCHEF_PID] },
22
+ ],
23
+ parseAbi([
24
+ 'function sdtPerBlock() external view returns (uint256)',
25
+ 'function totalAllocPoint() external view returns (uint256)',
26
+ 'function poolInfo(uint256) external view returns (address,uint256,uint256)',
27
+ ]),
28
+ )
29
+
30
+ const sdtPerBlock = rawSdtMasterchefData[0].result as unknown as bigint
31
+ const totalAllocPoint = rawSdtMasterchefData[1].result as unknown as bigint
32
+ const lockerPoolInfo = rawSdtMasterchefData[2].result as unknown as bigint
33
+ const stratPoolInfo = rawSdtMasterchefData[3].result as unknown as bigint
34
+
35
+ const lockersAllocPoint = lockerPoolInfo[1] as unknown as bigint
36
+ const stratsAllocPoint = stratPoolInfo[1] as unknown as bigint
37
+
38
+ const lockersSdtPerBlock = (lockersAllocPoint * sdtPerBlock) / totalAllocPoint
39
+ const lockersSdtPerSecond = BigInt(lockersSdtPerBlock) / BigInt(ETH_SECONDS_PER_BLOCK)
40
+
41
+ const stratsSdtPerBlock = (stratsAllocPoint * sdtPerBlock) / totalAllocPoint
42
+ const stratsSdtPerSecond = BigInt(stratsSdtPerBlock) / BigInt(ETH_SECONDS_PER_BLOCK)
43
+
44
+ return {
45
+ lockersSdtPerBlock,
46
+ lockersSdtPerSecond,
47
+ stratsSdtPerBlock,
48
+ stratsSdtPerSecond,
49
+ }
50
+ }
51
+ return undefined
52
+ }
53
+
54
+ export default getSdtInflationData
@@ -0,0 +1,200 @@
1
+ import { formatUnits, parseUnits } from 'viem'
2
+
3
+ import { Zero } from '../../index.js'
4
+
5
+ interface Data {
6
+ veSDTSupply: bigint
7
+ userVeSDTBalance: bigint
8
+ gaugeSupply: bigint
9
+ userSdTokenGaugeBalance: bigint
10
+ llVotingPower: bigint
11
+ gaugeWorkingSupply: bigint
12
+ delegatedVeSDTBalance: bigint
13
+ receivedVeSDTBalance: bigint
14
+ }
15
+
16
+ /**
17
+ * Get the amount of veSDT to have more to have max boost
18
+ */
19
+ const getVeSDTAmountMaxBoostCalculator = (toAdd: bigint, data: Data): bigint => {
20
+ const newSdTokenGaugeToAdd = parseUnits(formatUnits(toAdd, 0), 18)
21
+
22
+ const w0 = data.veSDTSupply
23
+ const wu0 = data.userVeSDTBalance + data.receivedVeSDTBalance - data.delegatedVeSDTBalance
24
+ const bs = data.gaugeSupply + newSdTokenGaugeToAdd
25
+ const bu = data.userSdTokenGaugeBalance + newSdTokenGaugeToAdd
26
+
27
+ const a = w0 * bu
28
+ const b = wu0 * bs
29
+ const c = a - b
30
+ const d = bs - bu
31
+
32
+ if (d === Zero) {
33
+ return Zero
34
+ }
35
+
36
+ // x1000 to keep 3 decimals
37
+ const res = (c * BigInt(1000)) / d
38
+ if (res < 0) {
39
+ return Zero
40
+ }
41
+
42
+ return res
43
+ }
44
+
45
+ const getBetaU = (data: Data, toAdd: bigint, additionalVeSDT?: bigint): bigint => {
46
+ const sdTokenGaugeToAdd = parseUnits(formatUnits(toAdd, 0), 18)
47
+
48
+ const dvu = additionalVeSDT === Zero ? additionalVeSDT : getVeSDTAmountMaxBoostCalculator(toAdd, data) / BigInt(1000)
49
+
50
+ const newUserSdTokenGaugeBalance = data.userSdTokenGaugeBalance + sdTokenGaugeToAdd
51
+ const newUserVeSDTBalance = dvu + data.userVeSDTBalance + data.receivedVeSDTBalance - data.delegatedVeSDTBalance
52
+
53
+ const newVeSDTSupply = data.veSDTSupply + data.userVeSDTBalance + dvu
54
+
55
+ const newGaugeSupply = data.gaugeSupply + sdTokenGaugeToAdd
56
+
57
+ const a = (newUserSdTokenGaugeBalance * BigInt(4)) / BigInt(10)
58
+ const b = (((newGaugeSupply * newUserVeSDTBalance) / newVeSDTSupply) * BigInt(6)) / BigInt(10)
59
+ const c = a + b
60
+
61
+ if (c > newUserSdTokenGaugeBalance) {
62
+ return newUserSdTokenGaugeBalance
63
+ }
64
+
65
+ return c
66
+ }
67
+
68
+ const getBetaU0 = (data: Data): bigint => {
69
+ const a = (data.userSdTokenGaugeBalance * BigInt(4)) / BigInt(10)
70
+ const b =
71
+ (((data.gaugeSupply * (data.userVeSDTBalance + data.receivedVeSDTBalance - data.delegatedVeSDTBalance)) /
72
+ data.veSDTSupply) *
73
+ BigInt(6)) /
74
+ BigInt(10)
75
+ const c = a + b
76
+
77
+ if (c > data.userSdTokenGaugeBalance) {
78
+ return data.userSdTokenGaugeBalance
79
+ }
80
+
81
+ return c
82
+ }
83
+
84
+ /**
85
+ * Get the possible max boost for the user
86
+ */
87
+ const getMaxVotingPower = (toAdd: bigint, data: any, additionalVeSDT?: bigint): bigint => {
88
+ const sdTokenGaugeToAdd = parseUnits(formatUnits(toAdd, 0), 18)
89
+ const totalVotingPower = data.llVotingPower + sdTokenGaugeToAdd
90
+
91
+ const betaU = getBetaU(data, toAdd, additionalVeSDT)
92
+ const betaU0 = getBetaU0(data)
93
+
94
+ const ws = data.gaugeWorkingSupply + betaU - betaU0
95
+ if (ws === Zero) {
96
+ return Zero
97
+ }
98
+ const vu = (totalVotingPower * betaU) / ws
99
+
100
+ // x1000 to keep 3 decimals
101
+ const newSdUserTokenGauge = sdTokenGaugeToAdd + data.userSdTokenGaugeBalance
102
+ if (newSdUserTokenGauge === Zero) {
103
+ return Zero
104
+ }
105
+
106
+ return (vu * BigInt(1000)) / newSdUserTokenGauge
107
+ }
108
+
109
+ const getRewardBoost = (toAdd: bigint, data: any, additionalVeSDT?: bigint): number => {
110
+ const newSdTokenGaugeToAdd = parseUnits(formatUnits(toAdd, 0), 18)
111
+ const bu = data.userSdTokenGaugeBalance + newSdTokenGaugeToAdd
112
+ const betaUMax = getBetaU(data, toAdd, additionalVeSDT)
113
+ const betaUMin = getBetaU(data, toAdd, additionalVeSDT)
114
+ const betaU0 = getBetaU0(data)
115
+ const ws = data.gaugeWorkingSupply + betaUMin - betaU0
116
+ const wsMin = data.gaugeWorkingSupply + (bu * BigInt(4)) / BigInt(10) - betaU0
117
+
118
+ const wsMinNumber = Number.parseFloat(wsMin.toString())
119
+ const betaUMaxNumber = Number.parseFloat(betaUMax.toString())
120
+ const wsNumber = Number.parseFloat(ws.toString())
121
+ const ru_min = (Number.parseFloat(bu.toString()) * 0.4) / wsMinNumber
122
+ const ru = betaUMaxNumber / wsNumber
123
+
124
+ const res = ru / ru_min
125
+ return Number.isNaN(res) ? 0 : res
126
+ }
127
+
128
+ export const calculateAllData = (lockerId: string, data: Data, toAdd: bigint, additionalVeSDT: bigint = Zero) => {
129
+ additionalVeSDT = parseUnits(formatUnits(additionalVeSDT, 0), 18)
130
+
131
+ const veSDTAmountToMaxBoost = getVeSDTAmountMaxBoostCalculator(toAdd, data)
132
+ const maxVotingPower = getMaxVotingPower(toAdd, data)
133
+ const rewardBoost = getRewardBoost(toAdd, data)
134
+
135
+ const newMaxVotingPower = getMaxVotingPower(toAdd, data, additionalVeSDT)
136
+ const newRewardBoost = getRewardBoost(toAdd, data, additionalVeSDT)
137
+
138
+ return {
139
+ veSDTAmountToMaxBoost,
140
+ max: lockerId === 'fxs' ? maxVotingPower / BigInt(4) : maxVotingPower,
141
+ rewardBoost,
142
+ min: lockerId === 'fxs' ? newMaxVotingPower / BigInt(4) : newMaxVotingPower,
143
+ newRewardBoost,
144
+ }
145
+ }
146
+
147
+ export const lockedAmountCall = (lockerId: string, votingEscrow: string, locker: string) => {
148
+ switch (lockerId) {
149
+ case 'pendle':
150
+ return {
151
+ address: votingEscrow,
152
+ name: 'positionData',
153
+ params: [locker],
154
+ }
155
+ case 'mav':
156
+ return {
157
+ address: votingEscrow,
158
+ name: 'lockups',
159
+ params: [locker, 0],
160
+ }
161
+ case 'cake':
162
+ return {
163
+ address: votingEscrow,
164
+ name: 'locks',
165
+ params: [locker],
166
+ }
167
+ default:
168
+ return {
169
+ address: votingEscrow,
170
+ name: 'locked',
171
+ params: [locker],
172
+ }
173
+ }
174
+ }
175
+
176
+ export const lockedAmountCallSideChain = (lockerId: string, votingEscrow: string, locker: string, chainId: number) => {
177
+ switch (lockerId) {
178
+ case 'mav':
179
+ return {
180
+ address: votingEscrow,
181
+ name: 'lockups',
182
+ params: [locker, 0],
183
+ chainId,
184
+ }
185
+ case 'fxs':
186
+ return {
187
+ address: votingEscrow,
188
+ name: 'balanceOfLockedFxs',
189
+ params: [locker],
190
+ chainId,
191
+ }
192
+ default:
193
+ return {
194
+ address: votingEscrow,
195
+ name: 'locked',
196
+ params: [locker],
197
+ chainId,
198
+ }
199
+ }
200
+ }
@@ -0,0 +1,26 @@
1
+ const substractFees = (lockerId: string, maxApr: number, lockerFee: any): number => {
2
+ switch (lockerId) {
3
+ case 'yfi':
4
+ case 'bpt':
5
+ case 'apw': {
6
+ const totalFee = lockerFee
7
+ ? Object.keys(lockerFee).reduce(
8
+ (total, key) => (key !== 'lockerId' ? total + Number(lockerFee[key]) / 100 : total),
9
+ 0,
10
+ )
11
+ : 0
12
+
13
+ return (maxApr * (100 - totalFee)) / 100
14
+ }
15
+ case 'mav': {
16
+ // 10% airdrop fees
17
+ return (maxApr * (100 - 10)) / 100
18
+ }
19
+ default: {
20
+ // Streaming from gauges, fees are already substracted
21
+ return maxApr
22
+ }
23
+ }
24
+ }
25
+
26
+ export default substractFees