|
1 | 1 | import { Hex } from 'viem'
|
2 | 2 | import { StakewiseConnector } from '../connector'
|
3 |
| -import { RewardsDataPoint } from '../types/rewards' |
4 |
| - |
5 |
| -async function extractVaultUserRewards ( |
6 |
| - connector: StakewiseConnector, |
7 |
| - vault: Hex, |
8 |
| - allocatorAddress: string, |
9 |
| - dateFrom: Date, |
10 |
| - dateTo: Date |
11 |
| -): Promise<RewardsDataPoint[]> { |
12 |
| - const vars_getRewards = { |
13 |
| - vaultAddress: vault, |
14 |
| - user: allocatorAddress.toLowerCase(), |
15 |
| - dateFrom: Math.floor(dateFrom.getTime() / 1000).toString() |
16 |
| - } |
17 |
| - |
18 |
| - const rewardsData = await connector.graphqlRequest({ |
19 |
| - type: 'api', |
20 |
| - op: 'UserRewards', |
21 |
| - query: `query UserRewards($user: String!, $vaultAddress: String!, $dateFrom: DateAsTimestamp!) { userRewards(user: $user, vaultAddress: $vaultAddress, dateFrom: $dateFrom) { date, sumRewards, }}`, |
22 |
| - variables: vars_getRewards |
23 |
| - }) |
24 |
| - |
25 |
| - if (!rewardsData.data.userRewards) { |
26 |
| - throw new Error(`Rewards data is missing the userRewards field`) |
27 |
| - } |
28 |
| - const dataPoints: RewardsDataPoint[] = [] |
29 |
| - // eslint-disable-next-line @typescript-eslint/no-explicit-any |
30 |
| - rewardsData.data.userRewards.forEach((reward: any) => { |
31 |
| - const when: Date = new Date(parseInt(reward.date) * 1000) |
32 |
| - if (when <= dateTo) { |
33 |
| - const sumRewards: string = reward.sumRewards |
34 |
| - dataPoints.push({ |
35 |
| - when: when, |
36 |
| - amount: BigInt(sumRewards), |
37 |
| - vault: vault |
38 |
| - }) |
39 |
| - } |
40 |
| - }) |
41 |
| - |
42 |
| - return dataPoints |
43 |
| -} |
44 | 3 |
|
45 | 4 | export async function getRewardsHistory (params: {
|
46 | 5 | connector: StakewiseConnector
|
47 |
| - from: Date |
48 |
| - to: Date |
| 6 | + from: number |
| 7 | + to: number |
49 | 8 | vault: Hex
|
50 | 9 | userAccount: Hex
|
51 |
| -}): Promise<Array<RewardsDataPoint>> { |
| 10 | +}) { |
52 | 11 | const { connector, from, to, vault, userAccount } = params
|
53 |
| - let vaultRewards: RewardsDataPoint[] = [] |
| 12 | + const rewardsData = await connector.graphqlRequest({ |
| 13 | + type: 'graph', |
| 14 | + op: 'UserRewards', |
| 15 | + query: |
| 16 | + 'query UserRewards( $where: AllocatorStats_filter $limit: Int) { allocator: allocatorStats_collection( interval: day first: $limit where: $where ) { apy timestamp earnedAssets totalAssets }}', |
| 17 | + // variables: vars_getRewards |
| 18 | + variables: { |
| 19 | + limit: 365, |
| 20 | + where: { |
| 21 | + timestamp_gte: (from * 1000).toString(), |
| 22 | + allocator_: { |
| 23 | + address: userAccount.toLowerCase(), |
| 24 | + vault: vault.toLowerCase() |
| 25 | + } |
| 26 | + } |
| 27 | + } |
| 28 | + }) |
| 29 | + |
| 30 | + if (!rewardsData.data.allocator) { |
| 31 | + throw new Error(`Rewards data is missing the allocator field`) |
| 32 | + } |
54 | 33 |
|
55 |
| - vaultRewards = await extractVaultUserRewards(connector, vault, userAccount, from, to) |
| 34 | + const data = rewardsData.data.allocator as { |
| 35 | + timestamp: string |
| 36 | + earnedAssets: string |
| 37 | + totalAssets: string |
| 38 | + }[] |
56 | 39 |
|
57 |
| - return vaultRewards |
| 40 | + return data |
| 41 | + .reduce( |
| 42 | + (acc, reward) => { |
| 43 | + const timestamp = Math.floor(parseInt(reward.timestamp) / 1000) |
| 44 | + if (timestamp > to) return acc |
| 45 | + return [ |
| 46 | + ...acc, |
| 47 | + { |
| 48 | + timestamp, |
| 49 | + totalRewards: BigInt(reward.totalAssets), |
| 50 | + dailyRewards: BigInt(reward.earnedAssets) |
| 51 | + } |
| 52 | + ] |
| 53 | + }, |
| 54 | + [] as { |
| 55 | + timestamp: number |
| 56 | + totalRewards: bigint |
| 57 | + dailyRewards: bigint |
| 58 | + }[] |
| 59 | + ) |
| 60 | + .sort((a, b) => a.timestamp - b.timestamp) |
58 | 61 | }
|
0 commit comments