@stake-dao/reader 0.4.56 → 0.4.58

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 (54) hide show
  1. package/dist/esm/endpoints.js +1 -0
  2. package/dist/esm/endpoints.js.map +1 -1
  3. package/dist/esm/index.js +3 -1
  4. package/dist/esm/index.js.map +1 -1
  5. package/dist/esm/lockers/fetch/index.js +1 -1
  6. package/dist/esm/lockers/fetch/index.js.map +1 -1
  7. package/dist/esm/strategies/pendle/pendlePoints.js +1 -0
  8. package/dist/esm/strategies/pendle/pendlePoints.js.map +1 -1
  9. package/dist/esm/tsconfig.build.tsbuildinfo +1 -1
  10. package/dist/esm/votemarket/curve/fetchUserVlCvxClaimable.js +90 -40
  11. package/dist/esm/votemarket/curve/fetchUserVlCvxClaimable.js.map +1 -1
  12. package/dist/esm/votemarket/fetchCampaigns/index.js +64 -0
  13. package/dist/esm/votemarket/fetchCampaigns/index.js.map +1 -0
  14. package/dist/esm/votemarket/{fetchPendingRemoteCampaigns.js → fetchCampaigns/pendingRemote.js} +2 -1
  15. package/dist/esm/votemarket/fetchCampaigns/pendingRemote.js.map +1 -0
  16. package/dist/esm/votemarket/{fetchCampaigns.js → fetchCampaigns/processRawCampaigns.js} +15 -100
  17. package/dist/esm/votemarket/fetchCampaigns/processRawCampaigns.js.map +1 -0
  18. package/dist/esm/votemarket/fetchCampaigns/updateEpoch.js +41 -0
  19. package/dist/esm/votemarket/fetchCampaigns/updateEpoch.js.map +1 -0
  20. package/dist/types/endpoints.d.ts +1 -0
  21. package/dist/types/endpoints.d.ts.map +1 -1
  22. package/dist/types/index.d.ts +3 -1
  23. package/dist/types/index.d.ts.map +1 -1
  24. package/dist/types/lockers/fetch/index.d.ts +1 -0
  25. package/dist/types/lockers/fetch/index.d.ts.map +1 -1
  26. package/dist/types/strategies/pendle/pendlePoints.d.ts +4 -0
  27. package/dist/types/strategies/pendle/pendlePoints.d.ts.map +1 -1
  28. package/dist/types/votemarket/curve/fetchUserVlCvxClaimable.d.ts +17 -1
  29. package/dist/types/votemarket/curve/fetchUserVlCvxClaimable.d.ts.map +1 -1
  30. package/dist/types/votemarket/{fetchCampaigns.d.ts → fetchCampaigns/index.d.ts} +2 -2
  31. package/dist/types/votemarket/fetchCampaigns/index.d.ts.map +1 -0
  32. package/dist/types/votemarket/{fetchPendingRemoteCampaigns.d.ts → fetchCampaigns/pendingRemote.d.ts} +2 -1
  33. package/dist/types/votemarket/fetchCampaigns/pendingRemote.d.ts.map +1 -0
  34. package/dist/types/votemarket/fetchCampaigns/processRawCampaigns.d.ts +16 -0
  35. package/dist/types/votemarket/fetchCampaigns/processRawCampaigns.d.ts.map +1 -0
  36. package/dist/types/votemarket/fetchCampaigns/updateEpoch.d.ts +9 -0
  37. package/dist/types/votemarket/fetchCampaigns/updateEpoch.d.ts.map +1 -0
  38. package/dist/types/votemarket/types.d.ts +3 -1
  39. package/dist/types/votemarket/types.d.ts.map +1 -1
  40. package/package.json +5 -4
  41. package/src/endpoints.ts +2 -0
  42. package/src/index.ts +3 -1
  43. package/src/lockers/fetch/index.ts +1 -1
  44. package/src/strategies/pendle/pendlePoints.ts +1 -0
  45. package/src/votemarket/curve/fetchUserVlCvxClaimable.ts +114 -44
  46. package/src/votemarket/fetchCampaigns/index.ts +97 -0
  47. package/src/votemarket/{fetchPendingRemoteCampaigns.ts → fetchCampaigns/pendingRemote.ts} +1 -0
  48. package/src/votemarket/{fetchCampaigns.ts → fetchCampaigns/processRawCampaigns.ts} +19 -149
  49. package/src/votemarket/fetchCampaigns/updateEpoch.ts +63 -0
  50. package/src/votemarket/types.ts +3 -1
  51. package/dist/esm/votemarket/fetchCampaigns.js.map +0 -1
  52. package/dist/esm/votemarket/fetchPendingRemoteCampaigns.js.map +0 -1
  53. package/dist/types/votemarket/fetchCampaigns.d.ts.map +0 -1
  54. package/dist/types/votemarket/fetchPendingRemoteCampaigns.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"pendlePoints.d.ts","sourceRoot":"","sources":["../../../../src/strategies/pendle/pendlePoints.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;CAqBjB,CAAA;AAED,eAAe,YAAY,CAAA"}
1
+ {"version":3,"file":"pendlePoints.d.ts","sourceRoot":"","sources":["../../../../src/strategies/pendle/pendlePoints.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;CAsBjB,CAAA;AAED,eAAe,YAAY,CAAA"}
@@ -2,7 +2,9 @@ import { type Address } from 'viem';
2
2
  type Rpcs = {
3
3
  [chainId: number]: string;
4
4
  };
5
- export declare const fetchUserVlCvxClaimable: (provider: any, rpc: Rpcs, user: string) => Promise<({
5
+ export declare const fetchUserVlCvxClaimable: (provider: any, rpc: Rpcs, user: string, chainId: number) => Promise<({
6
+ user: string;
7
+ recipient: string;
6
8
  token: any;
7
9
  claimable: string;
8
10
  claimableUsd: number;
@@ -11,6 +13,20 @@ export declare const fetchUserVlCvxClaimable: (provider: any, rpc: Rpcs, user: s
11
13
  proof: any;
12
14
  merkleAddress: Address;
13
15
  isClaimed: boolean;
16
+ chainId: number;
17
+ } | {
18
+ user: string;
19
+ recipient: string;
20
+ token: any;
21
+ claimable: string;
22
+ claimableUsd: number;
23
+ amount: string;
24
+ amountUsd: number;
25
+ proof: any;
26
+ merkleAddress: string;
27
+ isClaimed: any;
28
+ index: any;
29
+ chainId: 1;
14
30
  } | undefined)[]>;
15
31
  export {};
16
32
  //# sourceMappingURL=fetchUserVlCvxClaimable.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fetchUserVlCvxClaimable.d.ts","sourceRoot":"","sources":["../../../../src/votemarket/curve/fetchUserVlCvxClaimable.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,OAAO,EAAyB,MAAM,MAAM,CAAA;AAO1D,KAAK,IAAI,GAAG;IACV,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAA;CAC1B,CAAA;AAuGD,eAAO,MAAM,uBAAuB,aAAoB,GAAG,OAAO,IAAI,QAAQ,MAAM;;;;;;;mBAT1C,OAAO;;iBAsEhD,CAAA"}
1
+ {"version":3,"file":"fetchUserVlCvxClaimable.d.ts","sourceRoot":"","sources":["../../../../src/votemarket/curve/fetchUserVlCvxClaimable.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,OAAO,EAAyB,MAAM,MAAM,CAAA;AAO1D,KAAK,IAAI,GAAG;IACV,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAA;CAC1B,CAAA;AA4JD,eAAO,MAAM,uBAAuB,aAAoB,GAAG,OAAO,IAAI,QAAQ,MAAM,WAAW,MAAM;;;;;;;;;mBAnC3D,OAAO;;;;;;;;;;;;;;;;iBAiHhD,CAAA"}
@@ -1,4 +1,4 @@
1
- import type { Campaign } from './types.js';
1
+ import type { Campaign } from '../types.js';
2
2
  export declare const CAMPAIGNS_CHUNK_SIZE = 10;
3
3
  export declare const CLAIM_WINDOW_LENGTH = 24;
4
4
  export declare const CLOSE_WINDOW_LENGTH = 4;
@@ -15,4 +15,4 @@ interface FetchCampaignsProps {
15
15
  }
16
16
  export declare const fetchCampaigns: ({ platform, gaugeController, chainId, rpcs, etherscanApiKey, fromBlock, mainnetVmRemote, }: FetchCampaignsProps) => Promise<Campaign[]>;
17
17
  export {};
18
- //# sourceMappingURL=fetchCampaigns.d.ts.map
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/votemarket/fetchCampaigns/index.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAI3C,eAAO,MAAM,oBAAoB,KAAK,CAAA;AACtC,eAAO,MAAM,mBAAmB,KAAK,CAAA;AACrC,eAAO,MAAM,mBAAmB,IAAI,CAAA;AAEpC,UAAU,mBAAmB;IAC3B,QAAQ,EAAE,MAAM,CAAA;IAChB,eAAe,EAAE,MAAM,CAAA;IACvB,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE;QAAE,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAA;IACnC,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AAED,eAAO,MAAM,cAAc,+FAQxB,mBAAmB,KAAG,OAAO,CAAC,QAAQ,EAAE,CAgE1C,CAAA"}
@@ -39,8 +39,9 @@ export declare const fetchPendingRemoteCampaigns: ({ mainnetVmRemote, chainId, f
39
39
  }[];
40
40
  rewardAddress: any;
41
41
  rewardChainId: bigint;
42
+ eventTimestamp: any;
42
43
  }[];
43
44
  remoteCampaignsUpdate: any[];
44
45
  }>;
45
46
  export {};
46
- //# sourceMappingURL=fetchPendingRemoteCampaigns.d.ts.map
47
+ //# sourceMappingURL=pendingRemote.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pendingRemote.d.ts","sourceRoot":"","sources":["../../../../src/votemarket/fetchCampaigns/pendingRemote.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,oBAAoB,KAAK,CAAA;AACtC,eAAO,MAAM,mBAAmB,KAAK,CAAA;AACrC,eAAO,MAAM,mBAAmB,IAAI,CAAA;AAEpC,UAAU,gCAAgC;IACxC,eAAe,EAAE,MAAM,CAAA;IACvB,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,eAAe,EAAE,MAAM,CAAA;IACvB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,eAAO,MAAM,2BAA2B,yEAMrC,gCAAgC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsHlC,CAAA"}
@@ -0,0 +1,16 @@
1
+ import type { Campaign } from '../types.js';
2
+ export declare const CAMPAIGNS_CHUNK_SIZE = 10;
3
+ export declare const CLAIM_WINDOW_LENGTH = 24;
4
+ export declare const CLOSE_WINDOW_LENGTH = 4;
5
+ interface ProcessRawCampaignsProps {
6
+ rawCampaigns: any[];
7
+ platform: string;
8
+ gaugeController: string;
9
+ chainId: number;
10
+ rpcs: {
11
+ [chainId: number]: string;
12
+ };
13
+ }
14
+ export declare const processRawCampaigns: ({ rawCampaigns, platform, gaugeController, chainId, rpcs, }: ProcessRawCampaignsProps) => Promise<Campaign[]>;
15
+ export {};
16
+ //# sourceMappingURL=processRawCampaigns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"processRawCampaigns.d.ts","sourceRoot":"","sources":["../../../../src/votemarket/fetchCampaigns/processRawCampaigns.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAG3C,eAAO,MAAM,oBAAoB,KAAK,CAAA;AACtC,eAAO,MAAM,mBAAmB,KAAK,CAAA;AACrC,eAAO,MAAM,mBAAmB,IAAI,CAAA;AAEpC,UAAU,wBAAwB;IAChC,YAAY,EAAE,GAAG,EAAE,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,eAAe,EAAE,MAAM,CAAA;IACvB,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE;QAAE,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAA;CACpC;AASD,eAAO,MAAM,mBAAmB,gEAM7B,wBAAwB,KAAG,OAAO,CAAC,QAAQ,EAAE,CAkM/C,CAAA"}
@@ -0,0 +1,9 @@
1
+ import type { RawCampaign, RawPeriod } from '../types.js';
2
+ export declare const updateEpoch: ({ period, previousPeriod, campaign, totalVotes, remainingPeriods, }: {
3
+ period: RawPeriod;
4
+ previousPeriod?: RawPeriod;
5
+ campaign: RawCampaign;
6
+ totalVotes: bigint;
7
+ remainingPeriods: number;
8
+ }) => RawCampaign;
9
+ //# sourceMappingURL=updateEpoch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updateEpoch.d.ts","sourceRoot":"","sources":["../../../../src/votemarket/fetchCampaigns/updateEpoch.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAEzD,eAAO,MAAM,WAAW,wEAMrB;IACD,MAAM,EAAE,SAAS,CAAA;IACjB,cAAc,CAAC,EAAE,SAAS,CAAA;IAC1B,QAAQ,EAAE,WAAW,CAAA;IACrB,UAAU,EAAE,MAAM,CAAA;IAClB,gBAAgB,EAAE,MAAM,CAAA;CACzB,gBA8CA,CAAA"}
@@ -5,7 +5,9 @@ export type Period = {
5
5
  updated: boolean;
6
6
  };
7
7
  export type Campaign = {
8
+ key: string;
8
9
  id: number;
10
+ platform: string;
9
11
  chainId: number;
10
12
  gauge: string;
11
13
  gaugeChainId: number;
@@ -38,7 +40,7 @@ export type Campaign = {
38
40
  addresses: string[];
39
41
  isWhitelist: boolean;
40
42
  isBlacklist: boolean;
41
- previousPeriod: Period;
43
+ previousPeriod: Period | undefined;
42
44
  currentPeriod: Period;
43
45
  periodLeft: number;
44
46
  periods: Period[];
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/votemarket/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,MAAM,GAAG;IACnB,eAAe,EAAE,MAAM,CAAA;IACvB,aAAa,EAAE,MAAM,CAAA;IACrB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,OAAO,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,QAAQ,GAAG;IACrB,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,YAAY,EAAE,MAAM,CAAA;IACpB,OAAO,EAAE,MAAM,CAAA;IACf,eAAe,EAAE,MAAM,CAAA;IACvB,aAAa,EAAE,MAAM,CAAA;IACrB,kBAAkB,EAAE;QAClB,IAAI,EAAE,MAAM,CAAA;QACZ,MAAM,EAAE,MAAM,CAAA;QACd,OAAO,EAAE,MAAM,CAAA;QACf,QAAQ,EAAE,MAAM,CAAA;QAChB,OAAO,EAAE,MAAM,CAAA;KAChB,CAAA;IACD,WAAW,EAAE;QACX,IAAI,EAAE,MAAM,CAAA;QACZ,MAAM,EAAE,MAAM,CAAA;QACd,OAAO,EAAE,MAAM,CAAA;QACf,QAAQ,EAAE,MAAM,CAAA;QAChB,OAAO,EAAE,MAAM,CAAA;KAChB,CAAA;IACD,gBAAgB,EAAE,MAAM,CAAA;IACxB,eAAe,EAAE,MAAM,CAAA;IACvB,gBAAgB,EAAE,MAAM,CAAA;IACxB,iBAAiB,EAAE,MAAM,CAAA;IACzB,gBAAgB,EAAE,MAAM,CAAA;IACxB,cAAc,EAAE,MAAM,CAAA;IACtB,YAAY,EAAE,MAAM,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,OAAO,CAAA;IACjB,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,WAAW,EAAE,OAAO,CAAA;IACpB,WAAW,EAAE,OAAO,CAAA;IACpB,cAAc,EAAE,MAAM,CAAA;IACtB,aAAa,EAAE,MAAM,CAAA;IACrB,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,MAAM,EAAE;QACN,QAAQ,EAAE,OAAO,CAAA;QACjB,UAAU,EAAE,OAAO,CAAA;QACnB,SAAS,EAAE,OAAO,CAAA;QAClB,WAAW,EAAE,OAAO,CAAA;QACpB,OAAO,EAAE,OAAO,CAAA;KACjB,CAAA;IACD,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB,CAAA;AAID,MAAM,MAAM,SAAS,GAAG;IACtB,eAAe,EAAE,MAAM,CAAA;IACvB,aAAa,EAAE,MAAM,CAAA;IACrB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,OAAO,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,EAAE,MAAM,CAAA;IACf,YAAY,EAAE,MAAM,CAAA;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,gBAAgB,EAAE,MAAM,CAAA;IACxB,eAAe,EAAE,MAAM,CAAA;IACvB,WAAW,EAAE,MAAM,CAAA;IACnB,cAAc,EAAE,MAAM,CAAA;IACtB,gBAAgB,EAAE,MAAM,CAAA;IACxB,iBAAiB,EAAE,MAAM,CAAA;CAC1B,CAAA"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/votemarket/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,MAAM,GAAG;IACnB,eAAe,EAAE,MAAM,CAAA;IACvB,aAAa,EAAE,MAAM,CAAA;IACrB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,OAAO,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,QAAQ,GAAG;IACrB,GAAG,EAAE,MAAM,CAAA;IACX,EAAE,EAAE,MAAM,CAAA;IACV,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,YAAY,EAAE,MAAM,CAAA;IACpB,OAAO,EAAE,MAAM,CAAA;IACf,eAAe,EAAE,MAAM,CAAA;IACvB,aAAa,EAAE,MAAM,CAAA;IACrB,kBAAkB,EAAE;QAClB,IAAI,EAAE,MAAM,CAAA;QACZ,MAAM,EAAE,MAAM,CAAA;QACd,OAAO,EAAE,MAAM,CAAA;QACf,QAAQ,EAAE,MAAM,CAAA;QAChB,OAAO,EAAE,MAAM,CAAA;KAChB,CAAA;IACD,WAAW,EAAE;QACX,IAAI,EAAE,MAAM,CAAA;QACZ,MAAM,EAAE,MAAM,CAAA;QACd,OAAO,EAAE,MAAM,CAAA;QACf,QAAQ,EAAE,MAAM,CAAA;QAChB,OAAO,EAAE,MAAM,CAAA;KAChB,CAAA;IACD,gBAAgB,EAAE,MAAM,CAAA;IACxB,eAAe,EAAE,MAAM,CAAA;IACvB,gBAAgB,EAAE,MAAM,CAAA;IACxB,iBAAiB,EAAE,MAAM,CAAA;IACzB,gBAAgB,EAAE,MAAM,CAAA;IACxB,cAAc,EAAE,MAAM,CAAA;IACtB,YAAY,EAAE,MAAM,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,OAAO,CAAA;IACjB,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,WAAW,EAAE,OAAO,CAAA;IACpB,WAAW,EAAE,OAAO,CAAA;IACpB,cAAc,EAAE,MAAM,GAAG,SAAS,CAAA;IAClC,aAAa,EAAE,MAAM,CAAA;IACrB,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,MAAM,EAAE;QACN,QAAQ,EAAE,OAAO,CAAA;QACjB,UAAU,EAAE,OAAO,CAAA;QACnB,SAAS,EAAE,OAAO,CAAA;QAClB,WAAW,EAAE,OAAO,CAAA;QACpB,OAAO,EAAE,OAAO,CAAA;KACjB,CAAA;IACD,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB,CAAA;AAID,MAAM,MAAM,SAAS,GAAG;IACtB,eAAe,EAAE,MAAM,CAAA;IACvB,aAAa,EAAE,MAAM,CAAA;IACrB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,OAAO,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,EAAE,MAAM,CAAA;IACf,YAAY,EAAE,MAAM,CAAA;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,gBAAgB,EAAE,MAAM,CAAA;IACxB,eAAe,EAAE,MAAM,CAAA;IACvB,WAAW,EAAE,MAAM,CAAA;IACnB,cAAc,EAAE,MAAM,CAAA;IACtB,gBAAgB,EAAE,MAAM,CAAA;IACxB,iBAAiB,EAAE,MAAM,CAAA;CAC1B,CAAA"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@stake-dao/reader",
3
3
  "description": "",
4
- "version": "0.4.56",
4
+ "version": "0.4.58",
5
5
  "license": "AGPL-3.0-only",
6
6
  "repository": {
7
7
  "type": "git",
@@ -34,11 +34,12 @@
34
34
  "dayjs": "^1.11.11",
35
35
  "graphql-request": "^6.0.0",
36
36
  "lodash-es": "^4.17.21",
37
- "viem": "^2.9.31",
38
- "@stake-dao/constants": "0.4.25"
37
+ "viem": "^2.21.53",
38
+ "@stake-dao/constants": "0.4.26"
39
39
  },
40
40
  "devDependencies": {
41
- "@types/lodash-es": "^4.17.12"
41
+ "@types/lodash-es": "^4.17.12",
42
+ "typescript": "5.7.3"
42
43
  },
43
44
  "author": "Stake DAO",
44
45
  "contributors": [
package/src/endpoints.ts CHANGED
@@ -2,6 +2,8 @@ export const GH_STAKE_DAO_RAW_ORG = 'https://raw.githubusercontent.com/stake-dao
2
2
  export const GH_STAKE_DAO_BOUNTIES_REPORT = `${GH_STAKE_DAO_RAW_ORG}/bounties-report`
3
3
  export const GH_STAKE_DAO_VM_DATA = `${GH_STAKE_DAO_RAW_ORG}/votemarket-data`
4
4
 
5
+ export const STAKE_DAO_API = 'https://api.stakedao.org/api'
6
+
5
7
  export const LLAMA_API_URL = 'https://coins.llama.fi'
6
8
  export const THE_GRAPH_BASE_URL =
7
9
  'https://gateway-arbitrum.network.thegraph.com/api/e3c2ef8231c88703a5b450c188ce2db6/subgraphs/id'
package/src/index.ts CHANGED
@@ -67,7 +67,9 @@ export { fetchStakeDao } from './strategies/stakeDao/fetch.js'
67
67
  /// --- VOTEMARKET
68
68
 
69
69
  // General
70
- export { fetchCampaigns } from './votemarket/fetchCampaigns.js'
70
+ export { processRawCampaigns } from './votemarket/fetchCampaigns/processRawCampaigns.js'
71
+ export { fetchPendingRemoteCampaigns } from './votemarket/fetchCampaigns/pendingRemote.js'
72
+ export { fetchCampaigns } from './votemarket/fetchCampaigns/index.js'
71
73
  export type { Campaign } from './votemarket/types.js'
72
74
 
73
75
  // Curve
@@ -188,7 +188,7 @@ export const fetchLockers = async ({ provider, chainId, prices, withAirdropGraph
188
188
  const rewardPrice = prices.find((p) => p.address === r.address)?.usdPrice || 0
189
189
 
190
190
  const periodFinish = Number(formatUnits(rawData ? rawData[2] : Zero, 0))
191
- const streaming = periodFinish > Math.floor(Date.now() / 1000)
191
+ const streaming = r.distribution === 'streamed' && periodFinish > Math.floor(Date.now() / 1000)
192
192
 
193
193
  const rate = rawData ? rawData[3] : Zero
194
194
  const oneYearRate = rate * BigInt(ONE_YEAR)
@@ -19,6 +19,7 @@ const pendlePoints = {
19
19
  { multiplier: 1, label: 'EigenLayer Multiplier' },
20
20
  ],
21
21
  '0x353d0b2efb5b3a7987fb06d30ad6160522d08426': [{ multiplier: 15, label: 'Resolv Points' }],
22
+ '0x82d810ededb09614144900f914e75dd76700f19d': [{ multiplier: 45, label: 'Resolv Points' }],
22
23
  }
23
24
 
24
25
  export default pendlePoints
@@ -1,7 +1,7 @@
1
1
  import { Zero, contract, tokenWithAddress } from '@stake-dao/constants'
2
2
  import { type Address, formatUnits, parseAbi } from 'viem'
3
3
  import { mainnet } from 'viem/chains'
4
- import { GH_STAKE_DAO_BOUNTIES_REPORT } from '../../endpoints.js'
4
+ import { GH_STAKE_DAO_BOUNTIES_REPORT, STAKE_DAO_API } from '../../endpoints.js'
5
5
  import { type Price, getPrices } from '../../prices.js'
6
6
  import { rpcFetchTokensData } from '../../tokens.js'
7
7
  import { equalTlc, multicall } from '../../utils.js'
@@ -18,44 +18,52 @@ type UnknownToken = {
18
18
  chainId: number
19
19
  }
20
20
 
21
- const getMerkleData = async () => {
22
- const [delegators, nonDelegators] = await Promise.all([
21
+ const getMerkleData = async (chainId: number) => {
22
+ const [delegators, nonDelegators, votiumMerkle] = await Promise.all([
23
+ chainId === mainnet.id
24
+ ? fetch(
25
+ `${GH_STAKE_DAO_BOUNTIES_REPORT}/refs/heads/main/bounties-reports/latest/vlCVX/vlcvx_merkle_delegators.json`,
26
+ ).then((res) => res.json())
27
+ : {},
23
28
  fetch(
24
- `${GH_STAKE_DAO_BOUNTIES_REPORT}/refs/heads/main/bounties-reports/latest/vlCVX/vlcvx_merkle_delegators.json`,
29
+ `${GH_STAKE_DAO_BOUNTIES_REPORT}/refs/heads/main/bounties-reports/latest/vlCVX/vlcvx_merkle${
30
+ chainId === mainnet.id ? '' : `_${chainId}`
31
+ }.json`,
25
32
  ).then((res) => res.json()),
26
- fetch(`${GH_STAKE_DAO_BOUNTIES_REPORT}/refs/heads/main/bounties-reports/latest/vlCVX/vlcvx_merkle.json`).then(
27
- (res) => res.json(),
28
- ),
33
+ chainId === mainnet.id
34
+ ? fetch(`${STAKE_DAO_API}/votemarket/votium_merkles.json`).then((res) => res.json())
35
+ : { claims: {} },
29
36
  ])
30
37
 
31
- return { delegators, nonDelegators }
38
+ return { delegators, nonDelegators, votiumMerkle }
32
39
  }
33
40
 
34
- const isRootMatch = (contractRoot: string, fileRoot: string) =>
35
- (contractRoot === ZERO_ROOT && fileRoot === ZERO_ROOT) || equalTlc(contractRoot, fileRoot)
36
-
37
- const validateMerkleRoots = (delegatorRoot: string, nonDelegatorRoot: string, merkleData: any) => {
38
- const delegatorMatches = isRootMatch(delegatorRoot, merkleData.delegators.merkleRoot)
39
- const nonDelegatorMatches = isRootMatch(nonDelegatorRoot, merkleData.nonDelegators.merkleRoot)
41
+ const validateMerkleRoots = (delegatorRoot: string, nonDelegatorRoot: string, merkleData: any, isMainnet: boolean) => {
42
+ const delegatorMatches = isMainnet ? equalTlc(delegatorRoot, merkleData.delegators.merkleRoot) : false
43
+ const nonDelegatorMatches = equalTlc(nonDelegatorRoot, merkleData.nonDelegators.merkleRoot)
40
44
  return delegatorMatches || nonDelegatorMatches
41
45
  }
42
46
 
43
- const getMerkleRoots = async (provider: any) => {
47
+ const getMerkleRoots = async (provider: any, user: string) => {
44
48
  const contracts = [contract('vlCvxDelegatorMerkle', mainnet.id), contract('vlCvxNotDelegatorMerkle', mainnet.id)]
45
49
 
46
50
  const result = await multicall(
47
51
  provider,
48
- contracts.map((address) => ({
49
- address,
50
- name: 'root',
51
- params: [],
52
- })),
53
- parseAbi(['function root() external view returns (bytes32)']),
52
+ contracts.flatMap((address) => [
53
+ { address, name: 'root', params: [] },
54
+ { address, name: 'recipients', params: [user] },
55
+ ]),
56
+ parseAbi([
57
+ 'function root() external view returns (bytes32)',
58
+ 'function recipients(address) external view returns (address)',
59
+ ]),
54
60
  )
55
61
 
56
62
  return {
57
63
  delegatorRoot: result[0].result,
58
- nonDelegatorRoot: result[1].result,
64
+ delegatorRecipient: result[1].result,
65
+ nonDelegatorRoot: result[2].result,
66
+ nonDelegatorRecipient: result[3].result,
59
67
  }
60
68
  }
61
69
 
@@ -64,11 +72,7 @@ const getClaimedData = async (provider: any, tokens: string[], user: string, con
64
72
  tokens.length > 0
65
73
  ? await multicall(
66
74
  provider,
67
- tokens.map((t) => ({
68
- address: contract,
69
- name: 'claimed',
70
- params: [user, t],
71
- })),
75
+ tokens.flatMap((t) => [{ address: contract, name: 'claimed', params: [user, t] }]),
72
76
  parseAbi(['function claimed(address,address) external view returns (uint256)']),
73
77
  )
74
78
  : []
@@ -79,12 +83,33 @@ const getClaimedData = async (provider: any, tokens: string[], user: string, con
79
83
  }))
80
84
  }
81
85
 
86
+ const getVotiumClaimedData = async (provider: any, merkle: any) => {
87
+ const rawClaimed = await multicall(
88
+ provider,
89
+ Object.keys(merkle).map((t) => ({
90
+ address: contract('votiumMerkle'),
91
+ name: 'isClaimed',
92
+ params: [t, merkle[t].index],
93
+ })),
94
+ parseAbi(['function isClaimed(address,uint256) external view returns(bool)']),
95
+ )
96
+
97
+ return Object.keys(merkle).map((t, index) => ({
98
+ ...merkle[t],
99
+ token: t,
100
+ claimed: rawClaimed[index].result,
101
+ }))
102
+ }
103
+
82
104
  const getParsedData = (
105
+ user: string,
106
+ recipient: string,
83
107
  merkleAddress: string,
84
108
  userData: any,
85
109
  unknownTokensData: any[],
86
110
  claimedData: any[],
87
111
  prices: Price[],
112
+ chainId: number,
88
113
  ) => {
89
114
  return userData
90
115
  ? Object.keys(userData.tokens).map((token) => {
@@ -95,6 +120,8 @@ const getParsedData = (
95
120
  const claimable = BigInt(userData.tokens[token].amount) - claimed
96
121
 
97
122
  return {
123
+ user,
124
+ recipient,
98
125
  token: rewardToken,
99
126
  claimable: formatUnits(claimable, 0),
100
127
  claimableUsd: Number(formatUnits(claimable, rewardToken?.decimals || 18)) * tokenPrice,
@@ -104,71 +131,114 @@ const getParsedData = (
104
131
  proof: userData.tokens[token].proof,
105
132
  merkleAddress: merkleAddress as Address,
106
133
  isClaimed: claimable === Zero,
134
+ chainId,
107
135
  }
108
136
  })
109
137
  : undefined
110
138
  }
111
139
 
112
- const ZERO_ROOT = '0x0000000000000000000000000000000000000000000000000000000000000000'
140
+ const getVotiumParsedData = (user: string, userData: any[], unknownTokensData: any[], prices: Price[]) => {
141
+ return userData
142
+ ? userData.map((ud) => {
143
+ const rewardToken = tokenWithAddress(ud.token) || unknownTokensData.find((t) => equalTlc(t.address, ud.token))
144
+
145
+ const tokenPrice = prices.find((p) => equalTlc(ud.token, p.address))?.usdPrice || 0
113
146
 
114
- export const fetchUserVlCvxClaimable = async (provider: any, rpc: Rpcs, user: string) => {
115
- const { delegatorRoot, nonDelegatorRoot } = await getMerkleRoots(provider)
147
+ return {
148
+ user,
149
+ recipient: user,
150
+ token: rewardToken,
151
+ claimable: ud.claimed ? '0' : formatUnits(BigInt(ud.amount), 0),
152
+ claimableUsd: ud.claimed
153
+ ? 0
154
+ : Number(formatUnits(BigInt(ud.amount), rewardToken?.decimals || 18)) * tokenPrice,
155
+ amount: formatUnits(BigInt(ud.amount), 0),
156
+ amountUsd: Number(formatUnits(BigInt(ud.amount), rewardToken?.decimals || 18)) * tokenPrice,
157
+ proof: ud.proof,
158
+ merkleAddress: contract('votiumMerkle'),
159
+ isClaimed: ud.claimed,
160
+ index: ud.index,
161
+ chainId: mainnet.id,
162
+ }
163
+ })
164
+ : undefined
165
+ }
166
+
167
+ export const fetchUserVlCvxClaimable = async (provider: any, rpc: Rpcs, user: string, chainId: number) => {
168
+ const { delegatorRoot, delegatorRecipient, nonDelegatorRoot, nonDelegatorRecipient } = await getMerkleRoots(
169
+ provider,
170
+ user,
171
+ )
116
172
 
117
173
  let vlCvxClaimable: any
174
+ let votiumMerkleData: any
118
175
 
119
176
  try {
120
- const merkleData = await getMerkleData()
121
- if (validateMerkleRoots(delegatorRoot, nonDelegatorRoot, merkleData)) {
122
- vlCvxClaimable = merkleData
177
+ const merkleData = await getMerkleData(chainId)
178
+ if (validateMerkleRoots(delegatorRoot, nonDelegatorRoot, merkleData, chainId === mainnet.id)) {
179
+ vlCvxClaimable = { delegators: merkleData.delegators, nonDelegators: merkleData.nonDelegators }
123
180
  }
181
+ votiumMerkleData = merkleData.votiumMerkle.claims[user]
124
182
  } catch {}
125
183
 
126
- if (!vlCvxClaimable) {
127
- throw new Error('Could not find valid merkle data')
184
+ if (!vlCvxClaimable && !votiumMerkleData) {
185
+ console.error('Could not find valid merkle data')
186
+ return []
128
187
  }
129
188
 
130
- const vlCvxUserDelegated = vlCvxClaimable?.delegators.claims[user]
131
- const vlCvxUserNotDelegated = vlCvxClaimable?.nonDelegators.claims[user]
189
+ const vlCvxUserDelegated = vlCvxClaimable.delegators?.claims?.[user]
190
+ const vlCvxUserNotDelegated = vlCvxClaimable.nonDelegators.claims[user]
132
191
 
133
192
  const tokensDelegated = Object.keys(vlCvxUserDelegated?.tokens || {})
134
193
  const tokensNotDelegated = Object.keys(vlCvxUserNotDelegated?.tokens || {})
194
+ const tokensVotium = Object.keys(votiumMerkleData?.tokens || {})
135
195
 
136
- const tokens = [...tokensDelegated, ...tokensNotDelegated]
196
+ const tokens = [...tokensDelegated, ...tokensNotDelegated, ...tokensVotium]
137
197
 
138
198
  if (!tokens.length) return []
139
199
 
140
- const [delegatedClaimed, notDelegatedClaimed] = await Promise.all([
200
+ const [delegatedClaimed, notDelegatedClaimed, votiumClaimed] = await Promise.all([
141
201
  getClaimedData(provider, tokensDelegated, user, contract('vlCvxDelegatorMerkle')),
142
202
  getClaimedData(provider, tokensNotDelegated, user, contract('vlCvxNotDelegatorMerkle')),
203
+ votiumMerkleData?.tokens && Object.keys(votiumMerkleData?.tokens).length > 0
204
+ ? getVotiumClaimedData(provider, votiumMerkleData?.tokens)
205
+ : [],
143
206
  ])
144
207
 
145
208
  const unknownTokens = tokens.filter((t) => !tokenWithAddress(t))
146
- const rawUnknownTokensData = await rpcFetchTokensData(mainnet.id, rpc[mainnet.id]!, unknownTokens)
209
+ const rawUnknownTokensData = await rpcFetchTokensData(chainId, rpc[chainId]!, unknownTokens)
147
210
  const unknownTokensData: UnknownToken[] = rawUnknownTokensData.map((t) => ({
148
211
  name: t.name,
149
212
  symbol: t.symbol,
150
213
  address: t.tokenAddress,
151
214
  decimals: Number(t.decimals),
152
- chainId: mainnet.id,
215
+ chainId,
153
216
  }))
154
217
 
155
- const prices = await getPrices(tokens.map((t) => ({ address: t })) as any[], mainnet.id)
218
+ const prices = await getPrices(tokens.map((t) => ({ address: t })) as any[], chainId)
156
219
 
157
220
  return [
158
221
  getParsedData(
159
- contract('vlCvxDelegatorMerkle', mainnet.id),
222
+ user,
223
+ delegatorRecipient,
224
+ contract('vlCvxDelegatorMerkle'),
160
225
  vlCvxUserDelegated,
161
226
  unknownTokensData,
162
227
  delegatedClaimed,
163
228
  prices,
229
+ chainId,
164
230
  ),
165
231
  getParsedData(
166
- contract('vlCvxNotDelegatorMerkle', mainnet.id),
232
+ user,
233
+ nonDelegatorRecipient,
234
+ contract('vlCvxNotDelegatorMerkle', chainId),
167
235
  vlCvxUserNotDelegated,
168
236
  unknownTokensData,
169
237
  notDelegatedClaimed,
170
238
  prices,
239
+ chainId,
171
240
  ),
241
+ getVotiumParsedData(user, votiumClaimed, unknownTokensData, prices),
172
242
  ]
173
243
  .filter(Boolean)
174
244
  .flat()
@@ -0,0 +1,97 @@
1
+ import { contract } from '@stake-dao/constants'
2
+ import { range } from 'lodash-es'
3
+ import { decodeAbiParameters, encodeAbiParameters, parseAbiParameters } from 'viem'
4
+ import { arbitrum } from 'viem/chains'
5
+ import batchCampaigns from '../../bytecodes/votemarket/batchCampaigns.js'
6
+ import { batchJsonRpc, concatBytecode, equalTlc, rpcCall } from '../../utils.js'
7
+ import type { Campaign } from '../types.js'
8
+ import { fetchPendingRemoteCampaigns } from './pendingRemote.js'
9
+ import { processRawCampaigns } from './processRawCampaigns.js'
10
+
11
+ export const CAMPAIGNS_CHUNK_SIZE = 10
12
+ export const CLAIM_WINDOW_LENGTH = 24 // weeks
13
+ export const CLOSE_WINDOW_LENGTH = 4 // weeks
14
+
15
+ interface FetchCampaignsProps {
16
+ platform: string
17
+ gaugeController: string
18
+ chainId: number
19
+ rpcs: { [chainId: number]: string }
20
+ etherscanApiKey?: string
21
+ fromBlock?: number
22
+ mainnetVmRemote?: string
23
+ }
24
+
25
+ export const fetchCampaigns = async ({
26
+ platform,
27
+ gaugeController,
28
+ chainId,
29
+ rpcs,
30
+ etherscanApiKey,
31
+ fromBlock,
32
+ mainnetVmRemote,
33
+ }: FetchCampaignsProps): Promise<Campaign[]> => {
34
+ const rpc = rpcs[chainId]!
35
+
36
+ const nCampaignsRequest = await rpcCall(rpc, [{ to: platform, data: '0x7274e30d' }]) // campaignCount
37
+ const nCampaigns = Number(
38
+ decodeAbiParameters([{ type: 'uint256', name: 'campaignCount' }], nCampaignsRequest[0].result),
39
+ )
40
+
41
+ const calls = range(0, nCampaigns, CAMPAIGNS_CHUNK_SIZE).map((skip) => {
42
+ const inputParams = [
43
+ chainId,
44
+ platform,
45
+ contract('laPosteTokenFactory', chainId),
46
+ skip,
47
+ skip + CAMPAIGNS_CHUNK_SIZE > nCampaigns ? nCampaigns : skip + CAMPAIGNS_CHUNK_SIZE,
48
+ ]
49
+
50
+ const inputData = encodeAbiParameters(parseAbiParameters(batchCampaigns.inputType[1]!) as any, inputParams)
51
+ return concatBytecode(batchCampaigns.bytecode[1]!, inputData)
52
+ })
53
+
54
+ let rawCampaigns = await batchJsonRpc({
55
+ rpc,
56
+ calls,
57
+ outputTypeAbi: batchCampaigns.outputType![1]!,
58
+ parse: false,
59
+ callsKey: `votemarket/fetchCampaigns.ts: rawCampaigns - chainId ${chainId} - rpc ${rpc}`,
60
+ })
61
+
62
+ if (chainId === arbitrum.id && etherscanApiKey && fromBlock && mainnetVmRemote) {
63
+ const nextIndex = rawCampaigns.length > 0 ? Math.max(...rawCampaigns.map((rc) => Number(rc.id))) + 1 : 0
64
+ const { remoteCampaigns: pendingRemoteCampaigns } = await fetchPendingRemoteCampaigns({
65
+ mainnetVmRemote,
66
+ chainId,
67
+ fromBlock,
68
+ etherscanApiKey,
69
+ nextIndex,
70
+ })
71
+
72
+ rawCampaigns = [
73
+ ...rawCampaigns,
74
+ ...pendingRemoteCampaigns.filter((rmtC) => {
75
+ const existingCampaign = rawCampaigns.find(
76
+ (rc) =>
77
+ rc.addresses.length === rmtC.addresses.length &&
78
+ rc.addresses.every((rca, index) => equalTlc(rca, rmtC.addresses[index])) &&
79
+ equalTlc(rc.rewardAddress, rmtC.rewardAddress) &&
80
+ rc.rewardChainId === rmtC.rewardChainId &&
81
+ rc.campaign.startTimestamp === rmtC.campaign.startTimestamp &&
82
+ rc.campaign.endTimestamp === rmtC.campaign.endTimestamp &&
83
+ rc.campaign.numberOfPeriods === rmtC.campaign.numberOfPeriods &&
84
+ rc.campaign.maxRewardPerVote === rmtC.campaign.maxRewardPerVote &&
85
+ rc.campaign.totalRewardAmount === rmtC.campaign.totalRewardAmount &&
86
+ equalTlc(rc.campaign.gauge, rmtC.campaign.gauge) &&
87
+ equalTlc(rc.campaign.hook, rmtC.campaign.hook) &&
88
+ equalTlc(rc.campaign.manager, rmtC.campaign.manager),
89
+ )
90
+
91
+ return typeof existingCampaign === 'undefined'
92
+ }),
93
+ ]
94
+ }
95
+
96
+ return await processRawCampaigns({ rawCampaigns, platform, chainId, gaugeController, rpcs })
97
+ }
@@ -131,6 +131,7 @@ export const fetchPendingRemoteCampaigns = async ({
131
131
  })),
132
132
  rewardAddress: campaignParams.rewardToken,
133
133
  rewardChainId: BigInt(mainnet.id),
134
+ eventTimestamp: element.eventTimestamp,
134
135
  }
135
136
 
136
137
  nextIndex++