@moonwell-fi/moonwell-sdk 0.20.4 → 0.20.5
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/CHANGELOG.md +6 -0
- package/_cjs/actions/governance/common.js +15 -2
- package/_cjs/actions/governance/common.js.map +1 -1
- package/_cjs/errors/version.js +1 -1
- package/_esm/actions/governance/common.js +29 -3
- package/_esm/actions/governance/common.js.map +1 -1
- package/_esm/errors/version.js +1 -1
- package/_types/actions/governance/common.d.ts.map +1 -1
- package/_types/errors/version.d.ts +1 -1
- package/actions/governance/common.ts +39 -3
- package/errors/version.ts +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# @moonwell-fi/moonwell-sdk
|
|
2
2
|
|
|
3
|
+
## 0.20.5
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#319](https://github.com/moonwell-fi/moonwell-sdk/pull/319) [`af336bbdb4b160e0f31ee20d538abb0fbd082219`](https://github.com/moonwell-fi/moonwell-sdk/commit/af336bbdb4b160e0f31ee20d538abb0fbd082219) Thanks [@james-saint](https://github.com/james-saint)! - Dedupe Merkl reward breakdowns across pages so staking rewards are no longer inflated (MOO-587). The Merkl `/rewards` endpoint clamps an out-of-range `breakdownPage` back to page 0 instead of returning an empty page, so `getMerklRewardsData` appended the same breakdowns on every page and multiplied the reported staking rewards by the page count (the app showed 7,648 WELL vs Merkl's 764.9, ~10x). `getMerklRewardsData` now seeds a seen-set from page 0 and only appends breakdowns it has not already collected, stopping as soon as a page contributes nothing new; genuinely paginated, distinct breakdowns are still merged. No public API changes.
|
|
8
|
+
|
|
3
9
|
## 0.20.4
|
|
4
10
|
|
|
5
11
|
### Patch Changes
|
|
@@ -9,6 +9,7 @@ const lunar_indexer_helpers_js_1 = require("../../common/lunar-indexer-helpers.j
|
|
|
9
9
|
const MOONWELL_MERKL_CREATOR = "0x8b621804a7637b781e2BbD58e256a591F2dF7d51";
|
|
10
10
|
const CAMPAIGN_IDS_CACHE_TTL_MS = 4 * 60 * 60 * 1000;
|
|
11
11
|
const MAX_BREAKDOWN_PAGES = 10;
|
|
12
|
+
const breakdownKey = (b) => `${b.campaignId}|${b.reason}|${b.amount}|${b.claimed}|${b.pending}|${b.subCampaignId ?? ""}`;
|
|
12
13
|
let campaignIdsCache = null;
|
|
13
14
|
function resetMerklCampaignIdsCache() {
|
|
14
15
|
campaignIdsCache = null;
|
|
@@ -49,6 +50,7 @@ async function getMerklRewardsData(campaignId, chainId, account, lunarIndexerUrl
|
|
|
49
50
|
if (data.length === 0) {
|
|
50
51
|
return [];
|
|
51
52
|
}
|
|
53
|
+
const seenBreakdowns = new Set(data.flatMap((reward) => reward.rewards.flatMap((r) => r.breakdowns.map(breakdownKey))));
|
|
52
54
|
for (let page = 1; page < MAX_BREAKDOWN_PAGES; page++) {
|
|
53
55
|
const pageResponse = await fetch(`${merklProxyBaseUrl}/users/${account}/rewards?chainId=${chainId}&test=false&breakdownPage=${page}&reloadChainId=${chainId}`, {
|
|
54
56
|
headers: fetch_headers_js_1.MOONWELL_FETCH_JSON_HEADERS,
|
|
@@ -61,6 +63,7 @@ async function getMerklRewardsData(campaignId, chainId, account, lunarIndexerUrl
|
|
|
61
63
|
if (allBreakdownsEmpty) {
|
|
62
64
|
break;
|
|
63
65
|
}
|
|
66
|
+
let addedNewBreakdown = false;
|
|
64
67
|
for (const pageReward of pageData) {
|
|
65
68
|
const baseReward = data.find((d) => d.chain.id === pageReward.chain.id);
|
|
66
69
|
if (!baseReward)
|
|
@@ -68,11 +71,21 @@ async function getMerklRewardsData(campaignId, chainId, account, lunarIndexerUrl
|
|
|
68
71
|
for (const pageRewardEntry of pageReward.rewards) {
|
|
69
72
|
const baseRewardEntry = baseReward.rewards.find((r) => r.token.address.toLowerCase() ===
|
|
70
73
|
pageRewardEntry.token.address.toLowerCase());
|
|
71
|
-
if (baseRewardEntry)
|
|
72
|
-
|
|
74
|
+
if (!baseRewardEntry)
|
|
75
|
+
continue;
|
|
76
|
+
for (const breakdown of pageRewardEntry.breakdowns) {
|
|
77
|
+
const key = breakdownKey(breakdown);
|
|
78
|
+
if (seenBreakdowns.has(key))
|
|
79
|
+
continue;
|
|
80
|
+
seenBreakdowns.add(key);
|
|
81
|
+
baseRewardEntry.breakdowns.push(breakdown);
|
|
82
|
+
addedNewBreakdown = true;
|
|
73
83
|
}
|
|
74
84
|
}
|
|
75
85
|
}
|
|
86
|
+
if (!addedNewBreakdown) {
|
|
87
|
+
break;
|
|
88
|
+
}
|
|
76
89
|
}
|
|
77
90
|
return data
|
|
78
91
|
.filter((reward) => reward.rewards.some((r) => r.breakdowns.some((b) => campaignId.includes(b.campaignId))))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../../actions/governance/common.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../../actions/governance/common.ts"],"names":[],"mappings":"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"}
|
package/_cjs/errors/version.js
CHANGED
|
@@ -3,6 +3,15 @@ import { getMerklProxyBaseUrl } from "../../common/lunar-indexer-helpers.js";
|
|
|
3
3
|
const MOONWELL_MERKL_CREATOR = "0x8b621804a7637b781e2BbD58e256a591F2dF7d51";
|
|
4
4
|
const CAMPAIGN_IDS_CACHE_TTL_MS = 4 * 60 * 60 * 1000; // 4 hours
|
|
5
5
|
const MAX_BREAKDOWN_PAGES = 10;
|
|
6
|
+
/**
|
|
7
|
+
* Stable identity for a Merkl reward breakdown. The Merkl `/rewards` endpoint
|
|
8
|
+
* clamps an out-of-range `breakdownPage` back to the first page instead of
|
|
9
|
+
* returning an empty page, so appending each page's breakdowns blindly
|
|
10
|
+
* re-counts the same rewards and inflates the total by the page count (up to
|
|
11
|
+
* 10x). Keying on the full breakdown content lets us skip exact repeats while
|
|
12
|
+
* still keeping genuinely distinct distributions that share a campaignId.
|
|
13
|
+
*/
|
|
14
|
+
const breakdownKey = (b) => `${b.campaignId}|${b.reason}|${b.amount}|${b.claimed}|${b.pending}|${b.subCampaignId ?? ""}`;
|
|
6
15
|
let campaignIdsCache = null;
|
|
7
16
|
/** Resets the in-memory campaign IDs cache. Intended for use in tests only. */
|
|
8
17
|
export function resetMerklCampaignIdsCache() {
|
|
@@ -51,6 +60,9 @@ export async function getMerklRewardsData(campaignId, chainId, account, lunarInd
|
|
|
51
60
|
if (data.length === 0) {
|
|
52
61
|
return [];
|
|
53
62
|
}
|
|
63
|
+
// Track breakdowns already collected (seeded from page 0) so repeated
|
|
64
|
+
// pages don't double-count. See breakdownKey for why Merkl repeats them.
|
|
65
|
+
const seenBreakdowns = new Set(data.flatMap((reward) => reward.rewards.flatMap((r) => r.breakdowns.map(breakdownKey))));
|
|
54
66
|
// Paginate through remaining breakdown pages to collect all breakdowns
|
|
55
67
|
for (let page = 1; page < MAX_BREAKDOWN_PAGES; page++) {
|
|
56
68
|
const pageResponse = await fetch(`${merklProxyBaseUrl}/users/${account}/rewards?chainId=${chainId}&test=false&breakdownPage=${page}&reloadChainId=${chainId}`, {
|
|
@@ -64,7 +76,8 @@ export async function getMerklRewardsData(campaignId, chainId, account, lunarInd
|
|
|
64
76
|
if (allBreakdownsEmpty) {
|
|
65
77
|
break;
|
|
66
78
|
}
|
|
67
|
-
// Merge breakdowns
|
|
79
|
+
// Merge only breakdowns we haven't collected yet.
|
|
80
|
+
let addedNewBreakdown = false;
|
|
68
81
|
for (const pageReward of pageData) {
|
|
69
82
|
const baseReward = data.find((d) => d.chain.id === pageReward.chain.id);
|
|
70
83
|
if (!baseReward)
|
|
@@ -72,11 +85,24 @@ export async function getMerklRewardsData(campaignId, chainId, account, lunarInd
|
|
|
72
85
|
for (const pageRewardEntry of pageReward.rewards) {
|
|
73
86
|
const baseRewardEntry = baseReward.rewards.find((r) => r.token.address.toLowerCase() ===
|
|
74
87
|
pageRewardEntry.token.address.toLowerCase());
|
|
75
|
-
if (baseRewardEntry)
|
|
76
|
-
|
|
88
|
+
if (!baseRewardEntry)
|
|
89
|
+
continue;
|
|
90
|
+
for (const breakdown of pageRewardEntry.breakdowns) {
|
|
91
|
+
const key = breakdownKey(breakdown);
|
|
92
|
+
if (seenBreakdowns.has(key))
|
|
93
|
+
continue;
|
|
94
|
+
seenBreakdowns.add(key);
|
|
95
|
+
baseRewardEntry.breakdowns.push(breakdown);
|
|
96
|
+
addedNewBreakdown = true;
|
|
77
97
|
}
|
|
78
98
|
}
|
|
79
99
|
}
|
|
100
|
+
// A page that only repeats breakdowns we've already seen means the API
|
|
101
|
+
// has stopped advancing (out-of-range page clamped to page 0), so
|
|
102
|
+
// continuing would just re-count the same rewards.
|
|
103
|
+
if (!addedNewBreakdown) {
|
|
104
|
+
break;
|
|
105
|
+
}
|
|
80
106
|
}
|
|
81
107
|
return data
|
|
82
108
|
.filter((reward) => reward.rewards.some((r) => r.breakdowns.some((b) => campaignId.includes(b.campaignId))))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../../actions/governance/common.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;
|
|
1
|
+
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../../actions/governance/common.ts"],"names":[],"mappings":"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"}
|
package/_esm/errors/version.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export const version = '0.20.
|
|
1
|
+
export const version = '0.20.5';
|
|
2
2
|
//# sourceMappingURL=version.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../../actions/governance/common.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AA2CpC,KAAK,WAAW,GAAG;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE;QACL,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;
|
|
1
|
+
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../../actions/governance/common.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AA2CpC,KAAK,WAAW,GAAG;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE;QACL,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAqCF,+EAA+E;AAC/E,wBAAgB,0BAA0B,IAAI,IAAI,CAEjD;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,eAAe,CAAC,EAAE,MAAM,GACvB,OAAO,CAAC,MAAM,EAAE,CAAC,CAiCnB;AAED,wBAAsB,mBAAmB,CACvC,UAAU,EAAE,MAAM,EAAE,EACpB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,OAAO,EAChB,eAAe,CAAC,EAAE,MAAM,GACvB,OAAO,CAAC,WAAW,EAAE,CAAC,CAiHxB;AAED,wBAAsB,kBAAkB,CACtC,eAAe,EAAE,MAAM,EACvB,eAAe,CAAC,EAAE,MAAM,GACvB,OAAO,CAAC,MAAM,CAAC,CA6BjB"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const version = "0.20.
|
|
1
|
+
export declare const version = "0.20.5";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
|
@@ -70,10 +70,24 @@ type CampaignIdsCache = {
|
|
|
70
70
|
fetchedAt: number;
|
|
71
71
|
};
|
|
72
72
|
|
|
73
|
+
type MerklBreakdown =
|
|
74
|
+
MerklRewardsResponse["rewards"][number]["breakdowns"][number];
|
|
75
|
+
|
|
73
76
|
const MOONWELL_MERKL_CREATOR = "0x8b621804a7637b781e2BbD58e256a591F2dF7d51";
|
|
74
77
|
const CAMPAIGN_IDS_CACHE_TTL_MS = 4 * 60 * 60 * 1000; // 4 hours
|
|
75
78
|
const MAX_BREAKDOWN_PAGES = 10;
|
|
76
79
|
|
|
80
|
+
/**
|
|
81
|
+
* Stable identity for a Merkl reward breakdown. The Merkl `/rewards` endpoint
|
|
82
|
+
* clamps an out-of-range `breakdownPage` back to the first page instead of
|
|
83
|
+
* returning an empty page, so appending each page's breakdowns blindly
|
|
84
|
+
* re-counts the same rewards and inflates the total by the page count (up to
|
|
85
|
+
* 10x). Keying on the full breakdown content lets us skip exact repeats while
|
|
86
|
+
* still keeping genuinely distinct distributions that share a campaignId.
|
|
87
|
+
*/
|
|
88
|
+
const breakdownKey = (b: MerklBreakdown): string =>
|
|
89
|
+
`${b.campaignId}|${b.reason}|${b.amount}|${b.claimed}|${b.pending}|${b.subCampaignId ?? ""}`;
|
|
90
|
+
|
|
77
91
|
let campaignIdsCache: CampaignIdsCache | null = null;
|
|
78
92
|
|
|
79
93
|
/** Resets the in-memory campaign IDs cache. Intended for use in tests only. */
|
|
@@ -150,6 +164,14 @@ export async function getMerklRewardsData(
|
|
|
150
164
|
return [];
|
|
151
165
|
}
|
|
152
166
|
|
|
167
|
+
// Track breakdowns already collected (seeded from page 0) so repeated
|
|
168
|
+
// pages don't double-count. See breakdownKey for why Merkl repeats them.
|
|
169
|
+
const seenBreakdowns = new Set(
|
|
170
|
+
data.flatMap((reward) =>
|
|
171
|
+
reward.rewards.flatMap((r) => r.breakdowns.map(breakdownKey)),
|
|
172
|
+
),
|
|
173
|
+
);
|
|
174
|
+
|
|
153
175
|
// Paginate through remaining breakdown pages to collect all breakdowns
|
|
154
176
|
for (let page = 1; page < MAX_BREAKDOWN_PAGES; page++) {
|
|
155
177
|
const pageResponse = await fetch(
|
|
@@ -173,7 +195,8 @@ export async function getMerklRewardsData(
|
|
|
173
195
|
break;
|
|
174
196
|
}
|
|
175
197
|
|
|
176
|
-
// Merge breakdowns
|
|
198
|
+
// Merge only breakdowns we haven't collected yet.
|
|
199
|
+
let addedNewBreakdown = false;
|
|
177
200
|
for (const pageReward of pageData) {
|
|
178
201
|
const baseReward = data.find((d) => d.chain.id === pageReward.chain.id);
|
|
179
202
|
if (!baseReward) continue;
|
|
@@ -184,11 +207,24 @@ export async function getMerklRewardsData(
|
|
|
184
207
|
r.token.address.toLowerCase() ===
|
|
185
208
|
pageRewardEntry.token.address.toLowerCase(),
|
|
186
209
|
);
|
|
187
|
-
if (baseRewardEntry)
|
|
188
|
-
|
|
210
|
+
if (!baseRewardEntry) continue;
|
|
211
|
+
|
|
212
|
+
for (const breakdown of pageRewardEntry.breakdowns) {
|
|
213
|
+
const key = breakdownKey(breakdown);
|
|
214
|
+
if (seenBreakdowns.has(key)) continue;
|
|
215
|
+
seenBreakdowns.add(key);
|
|
216
|
+
baseRewardEntry.breakdowns.push(breakdown);
|
|
217
|
+
addedNewBreakdown = true;
|
|
189
218
|
}
|
|
190
219
|
}
|
|
191
220
|
}
|
|
221
|
+
|
|
222
|
+
// A page that only repeats breakdowns we've already seen means the API
|
|
223
|
+
// has stopped advancing (out-of-range page clamped to page 0), so
|
|
224
|
+
// continuing would just re-count the same rewards.
|
|
225
|
+
if (!addedNewBreakdown) {
|
|
226
|
+
break;
|
|
227
|
+
}
|
|
192
228
|
}
|
|
193
229
|
|
|
194
230
|
return data
|
package/errors/version.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const version = '0.20.
|
|
1
|
+
export const version = '0.20.5'
|