@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.
- package/dist/esm/abis/lockersMulticall.js +17 -0
- package/dist/esm/abis/lockersMulticall.js.map +1 -1
- package/dist/esm/bytecodes/index.js +13 -0
- package/dist/esm/bytecodes/index.js.map +1 -1
- package/dist/esm/bytecodes/votemarket/batchCurveGauges.js +32 -0
- package/dist/esm/bytecodes/votemarket/batchCurveGauges.js.map +1 -0
- package/dist/esm/bytecodes/votemarket/batchGaugesMetadata.js +58 -0
- package/dist/esm/bytecodes/votemarket/batchGaugesMetadata.js.map +1 -0
- package/dist/esm/index.js +6 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/lockers/fetch/index.js +67 -167
- package/dist/esm/lockers/fetch/index.js.map +1 -1
- package/dist/esm/lockers/fetch/parsePeg.js +21 -0
- package/dist/esm/lockers/fetch/parsePeg.js.map +1 -0
- package/dist/esm/lockers/fetch/parseVoteBoosterData.js +28 -0
- package/dist/esm/lockers/fetch/parseVoteBoosterData.js.map +1 -0
- package/dist/esm/lockers/utils/callsForLockers/depositorCalls.js +5 -5
- package/dist/esm/lockers/utils/callsForLockers/depositorCalls.js.map +1 -1
- package/dist/esm/lockers/utils/callsForLockers/feeCalls.js +13 -11
- package/dist/esm/lockers/utils/callsForLockers/feeCalls.js.map +1 -1
- package/dist/esm/lockers/utils/callsForLockers/index.js +2 -4
- package/dist/esm/lockers/utils/callsForLockers/index.js.map +1 -1
- package/dist/esm/lockers/utils/callsForLockers/pegCalls.js +9 -11
- package/dist/esm/lockers/utils/callsForLockers/pegCalls.js.map +1 -1
- package/dist/esm/lockers/utils/callsForLockers/veCalls.js +4 -4
- package/dist/esm/lockers/utils/callsForLockers/veCalls.js.map +1 -1
- package/dist/esm/lockers/utils/endpoints.js +2 -22
- package/dist/esm/lockers/utils/endpoints.js.map +1 -1
- package/dist/esm/lockers/utils/getBribesRewardsData.js +0 -1
- package/dist/esm/lockers/utils/getBribesRewardsData.js.map +1 -1
- package/dist/esm/lockers/utils/getCherries.js +34 -0
- package/dist/esm/lockers/utils/getCherries.js.map +1 -0
- package/dist/esm/lockers/utils/getHttpCalls.js +5 -7
- package/dist/esm/lockers/utils/getHttpCalls.js.map +1 -1
- package/dist/esm/tsconfig.build.tsbuildinfo +1 -1
- package/dist/esm/votemarket/curve/config.js +6 -0
- package/dist/esm/votemarket/curve/config.js.map +1 -0
- package/dist/esm/votemarket/curve/fetchCurveGauges.js +86 -0
- package/dist/esm/votemarket/curve/fetchCurveGauges.js.map +1 -0
- package/dist/types/abis/lockersMulticall.d.ts +16 -0
- package/dist/types/abis/lockersMulticall.d.ts.map +1 -1
- package/dist/types/bytecodes/index.d.ts +2 -0
- package/dist/types/bytecodes/index.d.ts.map +1 -1
- package/dist/types/bytecodes/votemarket/batchCurveGauges.d.ts +4 -0
- package/dist/types/bytecodes/votemarket/batchCurveGauges.d.ts.map +1 -0
- package/dist/types/bytecodes/votemarket/batchGaugesMetadata.d.ts +4 -0
- package/dist/types/bytecodes/votemarket/batchGaugesMetadata.d.ts.map +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/lockers/fetch/index.d.ts +88 -2
- package/dist/types/lockers/fetch/index.d.ts.map +1 -1
- package/dist/types/lockers/fetch/parsePeg.d.ts +3 -0
- package/dist/types/lockers/fetch/parsePeg.d.ts.map +1 -0
- package/dist/types/lockers/fetch/parseVoteBoosterData.d.ts +13 -0
- package/dist/types/lockers/fetch/parseVoteBoosterData.d.ts.map +1 -0
- package/dist/types/lockers/utils/callsForLockers/depositorCalls.d.ts +2 -1
- package/dist/types/lockers/utils/callsForLockers/depositorCalls.d.ts.map +1 -1
- package/dist/types/lockers/utils/callsForLockers/feeCalls.d.ts +3 -1
- package/dist/types/lockers/utils/callsForLockers/feeCalls.d.ts.map +1 -1
- package/dist/types/lockers/utils/callsForLockers/index.d.ts +2 -1
- package/dist/types/lockers/utils/callsForLockers/index.d.ts.map +1 -1
- package/dist/types/lockers/utils/callsForLockers/pegCalls.d.ts +3 -2
- package/dist/types/lockers/utils/callsForLockers/pegCalls.d.ts.map +1 -1
- package/dist/types/lockers/utils/callsForLockers/veCalls.d.ts +2 -1
- package/dist/types/lockers/utils/callsForLockers/veCalls.d.ts.map +1 -1
- package/dist/types/lockers/utils/endpoints.d.ts +2 -2
- package/dist/types/lockers/utils/endpoints.d.ts.map +1 -1
- package/dist/types/lockers/utils/getBribesRewardsData.d.ts +10 -12
- package/dist/types/lockers/utils/getBribesRewardsData.d.ts.map +1 -1
- package/dist/types/lockers/utils/getCherries.d.ts +4 -0
- package/dist/types/lockers/utils/getCherries.d.ts.map +1 -0
- package/dist/types/lockers/utils/getHttpCalls.d.ts +5 -1
- package/dist/types/lockers/utils/getHttpCalls.d.ts.map +1 -1
- package/dist/types/votemarket/curve/config.d.ts +4 -0
- package/dist/types/votemarket/curve/config.d.ts.map +1 -0
- package/dist/types/votemarket/curve/fetchCurveGauges.d.ts +16 -0
- package/dist/types/votemarket/curve/fetchCurveGauges.d.ts.map +1 -0
- package/package.json +2 -2
- package/src/abis/lockersMulticall.ts +17 -0
- package/src/bytecodes/index.ts +18 -0
- package/src/bytecodes/votemarket/batchCurveGauges.ts +34 -0
- package/src/bytecodes/votemarket/batchGaugesMetadata.ts +67 -0
- package/src/index.ts +9 -0
- package/src/lockers/fetch/index.ts +104 -227
- package/src/lockers/fetch/parsePeg.ts +25 -0
- package/src/lockers/fetch/parseVoteBoosterData.ts +34 -0
- package/src/lockers/utils/callsForLockers/depositorCalls.ts +7 -6
- package/src/lockers/utils/callsForLockers/feeCalls.ts +17 -15
- package/src/lockers/utils/callsForLockers/index.ts +6 -10
- package/src/lockers/utils/callsForLockers/pegCalls.ts +11 -12
- package/src/lockers/utils/callsForLockers/veCalls.ts +6 -5
- package/src/lockers/utils/endpoints.ts +2 -25
- package/src/lockers/utils/getBribesRewardsData.ts +11 -2
- package/src/lockers/utils/getCherries.ts +48 -0
- package/src/lockers/utils/getHttpCalls.ts +6 -7
- package/src/votemarket/curve/config.ts +6 -0
- package/src/votemarket/curve/fetchCurveGauges.ts +119 -0
- package/dist/esm/lockers/utils/callsForLockers/gaugeControllerCalls.js +0 -8
- package/dist/esm/lockers/utils/callsForLockers/gaugeControllerCalls.js.map +0 -1
- package/dist/esm/lockers/utils/getCherriesLeaderBoard.js +0 -22
- package/dist/esm/lockers/utils/getCherriesLeaderBoard.js.map +0 -1
- package/dist/types/lockers/utils/callsForLockers/gaugeControllerCalls.d.ts +0 -11
- package/dist/types/lockers/utils/callsForLockers/gaugeControllerCalls.d.ts.map +0 -1
- package/dist/types/lockers/utils/getCherriesLeaderBoard.d.ts +0 -2
- package/dist/types/lockers/utils/getCherriesLeaderBoard.d.ts.map +0 -1
- package/src/lockers/utils/callsForLockers/gaugeControllerCalls.ts +0 -8
- 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:
|
|
4
|
+
const depositorCalls = (depositor: string, locker: Address) => {
|
|
4
5
|
const calls: any[] = []
|
|
5
6
|
|
|
6
7
|
if (
|
|
7
8
|
[
|
|
8
|
-
lockerWithId('crv')!.
|
|
9
|
-
lockerWithId('mav')!.
|
|
10
|
-
lockerWithId('cake', 56)!.
|
|
11
|
-
lockerWithId('fxn')!.
|
|
12
|
-
lockerWithId('yfi')!.
|
|
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:
|
|
6
|
-
const calls:
|
|
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'
|
|
13
|
+
calls.push({ address: accumulatorAddress, name: 'claimerFee' })
|
|
14
14
|
|
|
15
15
|
// Treasury
|
|
16
|
-
if (['
|
|
17
|
-
calls.push({ address: accumulatorAddress, name: 'daoFee'
|
|
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: '
|
|
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'
|
|
26
|
+
calls.push({ address: accumulatorAddress, name: 'liquidityFee' })
|
|
27
27
|
break
|
|
28
28
|
case 'pendle':
|
|
29
|
-
calls.push({ address: accumulatorAddress, name: 'bountyFee'
|
|
29
|
+
calls.push({ address: accumulatorAddress, name: 'bountyFee' })
|
|
30
30
|
break
|
|
31
31
|
case 'fpis':
|
|
32
|
-
calls.push({ address: accumulatorAddress, name: 'bribeFee'
|
|
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'
|
|
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
|
-
|
|
87
|
-
daoFee = BigInt(
|
|
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
|
-
|
|
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,
|
|
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:
|
|
7
|
-
|
|
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,
|
|
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,
|
|
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,
|
|
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:
|
|
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')!.
|
|
13
|
-
lockerWithId('mav')!.
|
|
14
|
-
lockerWithId('cake', 56)!.
|
|
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')!.
|
|
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
|
-
|
|
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
|
|
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
|
|
41
|
+
const httpResponses = (await Promise.allSettled(httpCalls)).map((result) =>
|
|
42
42
|
result.status === 'fulfilled' ? result.value : undefined,
|
|
43
43
|
)
|
|
44
44
|
|
|
45
|
-
const
|
|
45
|
+
const bribesData = httpResponses[0]
|
|
46
46
|
|
|
47
|
-
return {
|
|
48
|
-
bribesData: delegationsAPRsData,
|
|
49
|
-
}
|
|
47
|
+
return { bribesData }
|
|
50
48
|
}
|
|
51
49
|
}
|
|
52
|
-
|
|
50
|
+
|
|
51
|
+
return {}
|
|
53
52
|
}
|
|
54
53
|
|
|
55
54
|
export default getHttpCalls
|
|
@@ -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 +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
|
-
}
|