@factordao/governance 1.0.3 → 1.0.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/README.md +7 -7
- package/dist/cjs/index.js +230 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/types/index.js.map +1 -1
- package/dist/cjs/utils/subgraphs.js +19 -1
- package/dist/cjs/utils/subgraphs.js.map +1 -1
- package/dist/mjs/index.js +227 -1
- package/dist/mjs/index.js.map +1 -1
- package/dist/mjs/types/index.js.map +1 -1
- package/dist/mjs/utils/subgraphs.js +19 -1
- package/dist/mjs/utils/subgraphs.js.map +1 -1
- package/package.json +1 -1
- package/types/index.d.ts +5 -1
- package/types/types/index.d.ts +57 -0
- package/types/utils/subgraphs.d.ts +3 -2
package/README.md
CHANGED
|
@@ -7,12 +7,12 @@ This repository contains the governance for Factor.
|
|
|
7
7
|
- [x] Create the function to get all the vaults for all the available chains
|
|
8
8
|
- [x] Create the subgraph to track the `emit Vote(user, vaults[i], weights[i], newVote);` event from `FactorScale`
|
|
9
9
|
- [x] Create the function to get all the votes for a given user
|
|
10
|
-
- [] Create the function to get all the votes for all the users
|
|
10
|
+
- [x] Create the function to get all the votes for all the users
|
|
11
11
|
- [ ] Create the function to get all the votes allocations
|
|
12
|
-
- [
|
|
13
|
-
- [
|
|
14
|
-
- [
|
|
15
|
-
- [
|
|
16
|
-
- [ ] Create the function to get the
|
|
12
|
+
- [x] Create the subgraph to track the `emit ReceiveVotingResults(wTime, vaults, fctrAmounts);` event from `FactorGaugeController` of both Arbitrum and Base which is emitted after the broadcast
|
|
13
|
+
- [x] Create the subgraph to track the `emit UpdateVaultReward(vault, newSpeed, uint128(block.timestamp) + WEEK);` event from `FactorGaugeController`
|
|
14
|
+
- [x] Create the function to get all the rewards for a given vault
|
|
15
|
+
- [x] Create the function to get all the rewards for all vaults
|
|
16
|
+
- [ ] Create the function to get the incentives, if they're active or not and how much they're worth
|
|
17
17
|
- [ ] Create the function to get the `function earned(address account, address _rewardsToken)` for a given account and rewards token to get the rewards for the user (?)
|
|
18
|
-
- [ ] Calculate the APY for scale and the given vault (?)
|
|
18
|
+
- [ ] Calculate the APY for scale and the given vault (?)
|
package/dist/cjs/index.js
CHANGED
|
@@ -3,6 +3,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.getAvailableVaultsForVoting = getAvailableVaultsForVoting;
|
|
4
4
|
exports.getVotesForUser = getVotesForUser;
|
|
5
5
|
exports.getVotesForAllUsers = getVotesForAllUsers;
|
|
6
|
+
exports.getRewardsForVault = getRewardsForVault;
|
|
7
|
+
exports.getRewardsForAllVaults = getRewardsForAllVaults;
|
|
8
|
+
exports.getTokenBalancesForUser = getTokenBalancesForUser;
|
|
9
|
+
exports.getTokenBalancesForAllUsers = getTokenBalancesForAllUsers;
|
|
6
10
|
const subgraphs_1 = require("./utils/subgraphs");
|
|
7
11
|
async function getAvailableVaultsForVoting(chainId, environment) {
|
|
8
12
|
const subgraphUrl = subgraphs_1.factorScaleSubgraphUrl[chainId]?.[environment];
|
|
@@ -80,4 +84,230 @@ async function getVotesForAllUsers(chainId, environment) {
|
|
|
80
84
|
}
|
|
81
85
|
return votesByVault;
|
|
82
86
|
}
|
|
87
|
+
const DECIMALS = 18n;
|
|
88
|
+
const DECIMALS_DIVISOR = 10n ** DECIMALS;
|
|
89
|
+
function formatWeiToDecimal(wei) {
|
|
90
|
+
const whole = wei / DECIMALS_DIVISOR;
|
|
91
|
+
const remainder = wei % DECIMALS_DIVISOR;
|
|
92
|
+
if (remainder === 0n) {
|
|
93
|
+
return whole.toString();
|
|
94
|
+
}
|
|
95
|
+
const remainderStr = remainder.toString().padStart(Number(DECIMALS), '0');
|
|
96
|
+
const trimmed = remainderStr.replace(/0+$/, '');
|
|
97
|
+
return `${whole}.${trimmed}`;
|
|
98
|
+
}
|
|
99
|
+
function transformVaultReward(data) {
|
|
100
|
+
const fctrPerSec = BigInt(data.fctrPerSec);
|
|
101
|
+
const incentiveEndsAt = Number(data.incentiveEndsAt);
|
|
102
|
+
const timestamp = Number(data.timestamp);
|
|
103
|
+
const durationSec = BigInt(incentiveEndsAt - timestamp);
|
|
104
|
+
const totalIncentive = fctrPerSec * durationSec;
|
|
105
|
+
return {
|
|
106
|
+
vault: data.vault,
|
|
107
|
+
fctrPerSec,
|
|
108
|
+
incentiveEndsAt,
|
|
109
|
+
block: Number(data.block),
|
|
110
|
+
timestamp,
|
|
111
|
+
txid: data.txid,
|
|
112
|
+
totalIncentive,
|
|
113
|
+
totalIncentiveFmt: formatWeiToDecimal(totalIncentive),
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
async function getRewardsForVault(chainId, environment, vault) {
|
|
117
|
+
const subgraphUrl = subgraphs_1.factorGaugeControllerSubgraphUrl[chainId]?.[environment];
|
|
118
|
+
if (!subgraphUrl) {
|
|
119
|
+
throw new Error(`Subgraph URL not found for chainId ${chainId} and environment ${environment}`);
|
|
120
|
+
}
|
|
121
|
+
const query = `
|
|
122
|
+
{
|
|
123
|
+
vaultReward(id: "${vault.toLowerCase()}") {
|
|
124
|
+
id
|
|
125
|
+
vault
|
|
126
|
+
fctrPerSec
|
|
127
|
+
incentiveEndsAt
|
|
128
|
+
block
|
|
129
|
+
timestamp
|
|
130
|
+
txid
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
`;
|
|
134
|
+
const response = await fetch(subgraphUrl, {
|
|
135
|
+
method: 'POST',
|
|
136
|
+
headers: {
|
|
137
|
+
'Content-Type': 'application/json',
|
|
138
|
+
},
|
|
139
|
+
body: JSON.stringify({ query }),
|
|
140
|
+
});
|
|
141
|
+
const data = await response.json();
|
|
142
|
+
if (!data.data.vaultReward) {
|
|
143
|
+
return null;
|
|
144
|
+
}
|
|
145
|
+
return transformVaultReward(data.data.vaultReward);
|
|
146
|
+
}
|
|
147
|
+
async function getRewardsForAllVaults(chainId, environment) {
|
|
148
|
+
const subgraphUrl = subgraphs_1.factorGaugeControllerSubgraphUrl[chainId]?.[environment];
|
|
149
|
+
if (!subgraphUrl) {
|
|
150
|
+
throw new Error(`Subgraph URL not found for chainId ${chainId} and environment ${environment}`);
|
|
151
|
+
}
|
|
152
|
+
const rewards = await (0, subgraphs_1.fetchPaginatedData)(subgraphUrl, (first, skip) => `
|
|
153
|
+
{
|
|
154
|
+
vaultRewards(
|
|
155
|
+
first: ${first}
|
|
156
|
+
skip: ${skip}
|
|
157
|
+
orderBy: timestamp
|
|
158
|
+
orderDirection: desc
|
|
159
|
+
) {
|
|
160
|
+
id
|
|
161
|
+
vault
|
|
162
|
+
fctrPerSec
|
|
163
|
+
incentiveEndsAt
|
|
164
|
+
block
|
|
165
|
+
timestamp
|
|
166
|
+
txid
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
`, (data) => data.data.vaultRewards || []);
|
|
170
|
+
return rewards.map(transformVaultReward);
|
|
171
|
+
}
|
|
172
|
+
function formatBalanceToDecimal(balance, decimals) {
|
|
173
|
+
const divisor = 10n ** BigInt(decimals);
|
|
174
|
+
const whole = balance / divisor;
|
|
175
|
+
const remainder = balance % divisor;
|
|
176
|
+
if (remainder === 0n) {
|
|
177
|
+
return whole.toString();
|
|
178
|
+
}
|
|
179
|
+
const remainderStr = remainder.toString().padStart(decimals, '0');
|
|
180
|
+
const trimmed = remainderStr.replace(/0+$/, '');
|
|
181
|
+
return `${whole}.${trimmed}`;
|
|
182
|
+
}
|
|
183
|
+
// veFCTR voting power calculation based on VeBalanceLib.sol
|
|
184
|
+
// MAX_LOCK_TIME = 104 weeks in seconds
|
|
185
|
+
const MAX_LOCK_TIME = 104n * 7n * 24n * 60n * 60n; // 104 weeks in seconds
|
|
186
|
+
/**
|
|
187
|
+
* Calculate voting power for veFCTR based on locked amount and expiry
|
|
188
|
+
* Formula: votingPower = amount * (expiry - currentTime) / MAX_LOCK_TIME
|
|
189
|
+
*
|
|
190
|
+
* If the position is expired (expiry <= currentTime), voting power is 0
|
|
191
|
+
*/
|
|
192
|
+
function calculateVotingPower(amount, expiry) {
|
|
193
|
+
const currentTime = BigInt(Math.floor(Date.now() / 1000));
|
|
194
|
+
const expiryBigInt = BigInt(expiry);
|
|
195
|
+
if (expiryBigInt <= currentTime) {
|
|
196
|
+
return 0n;
|
|
197
|
+
}
|
|
198
|
+
const timeRemaining = expiryBigInt - currentTime;
|
|
199
|
+
return (amount * timeRemaining) / MAX_LOCK_TIME;
|
|
200
|
+
}
|
|
201
|
+
function transformAccountBalance(data) {
|
|
202
|
+
const balance = BigInt(data.balance);
|
|
203
|
+
const decimals = data.token.decimals ?? 18;
|
|
204
|
+
const expiry = data.expiry ? Number(data.expiry) : null;
|
|
205
|
+
// Calculate voting power if expiry is present (veFCTR token)
|
|
206
|
+
let votingPower = null;
|
|
207
|
+
let votingPowerFmt = null;
|
|
208
|
+
if (expiry !== null) {
|
|
209
|
+
votingPower = calculateVotingPower(balance, expiry);
|
|
210
|
+
votingPowerFmt = formatBalanceToDecimal(votingPower, decimals);
|
|
211
|
+
}
|
|
212
|
+
return {
|
|
213
|
+
tokenAddress: data.token.address,
|
|
214
|
+
tokenName: data.token.name,
|
|
215
|
+
tokenSymbol: data.token.symbol,
|
|
216
|
+
tokenDecimals: data.token.decimals,
|
|
217
|
+
balance,
|
|
218
|
+
balanceFmt: formatBalanceToDecimal(balance, decimals),
|
|
219
|
+
expiry,
|
|
220
|
+
votingPower,
|
|
221
|
+
votingPowerFmt,
|
|
222
|
+
lastBlock: Number(data.lastBlock),
|
|
223
|
+
lastTimestamp: Number(data.lastTimestamp),
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
async function getTokenBalancesForUser(chainId, environment, user) {
|
|
227
|
+
const subgraphUrl = subgraphs_1.factorFCTRSubgraphUrl[chainId]?.[environment];
|
|
228
|
+
if (!subgraphUrl) {
|
|
229
|
+
throw new Error(`Subgraph URL not found for chainId ${chainId} and environment ${environment}`);
|
|
230
|
+
}
|
|
231
|
+
const userAddress = user.toLowerCase();
|
|
232
|
+
const query = `
|
|
233
|
+
{
|
|
234
|
+
accountBalances(where: { account_: { address: "${userAddress}" }, balance_gt: "0" }) {
|
|
235
|
+
id
|
|
236
|
+
account {
|
|
237
|
+
id
|
|
238
|
+
address
|
|
239
|
+
}
|
|
240
|
+
token {
|
|
241
|
+
id
|
|
242
|
+
address
|
|
243
|
+
name
|
|
244
|
+
symbol
|
|
245
|
+
decimals
|
|
246
|
+
totalSupply
|
|
247
|
+
}
|
|
248
|
+
balance
|
|
249
|
+
expiry
|
|
250
|
+
lastBlock
|
|
251
|
+
lastTimestamp
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
`;
|
|
255
|
+
const response = await fetch(subgraphUrl, {
|
|
256
|
+
method: 'POST',
|
|
257
|
+
headers: {
|
|
258
|
+
'Content-Type': 'application/json',
|
|
259
|
+
},
|
|
260
|
+
body: JSON.stringify({ query }),
|
|
261
|
+
});
|
|
262
|
+
const data = await response.json();
|
|
263
|
+
const accountBalances = data.data.accountBalances || [];
|
|
264
|
+
return {
|
|
265
|
+
userAddress,
|
|
266
|
+
balances: accountBalances.map(transformAccountBalance),
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
async function getTokenBalancesForAllUsers(chainId, environment) {
|
|
270
|
+
const subgraphUrl = subgraphs_1.factorFCTRSubgraphUrl[chainId]?.[environment];
|
|
271
|
+
if (!subgraphUrl) {
|
|
272
|
+
throw new Error(`Subgraph URL not found for chainId ${chainId} and environment ${environment}`);
|
|
273
|
+
}
|
|
274
|
+
const accountBalances = await (0, subgraphs_1.fetchPaginatedData)(subgraphUrl, (first, skip) => `
|
|
275
|
+
{
|
|
276
|
+
accountBalances(
|
|
277
|
+
first: ${first}
|
|
278
|
+
skip: ${skip}
|
|
279
|
+
where: { balance_gt: "0" }
|
|
280
|
+
orderBy: lastTimestamp
|
|
281
|
+
orderDirection: desc
|
|
282
|
+
) {
|
|
283
|
+
id
|
|
284
|
+
account {
|
|
285
|
+
id
|
|
286
|
+
address
|
|
287
|
+
}
|
|
288
|
+
token {
|
|
289
|
+
id
|
|
290
|
+
address
|
|
291
|
+
name
|
|
292
|
+
symbol
|
|
293
|
+
decimals
|
|
294
|
+
totalSupply
|
|
295
|
+
}
|
|
296
|
+
balance
|
|
297
|
+
expiry
|
|
298
|
+
lastBlock
|
|
299
|
+
lastTimestamp
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
`, (data) => data.data.accountBalances || []);
|
|
303
|
+
const balancesByUser = {};
|
|
304
|
+
for (const accountBalance of accountBalances) {
|
|
305
|
+
const userAddress = accountBalance.account.address;
|
|
306
|
+
if (!balancesByUser[userAddress]) {
|
|
307
|
+
balancesByUser[userAddress] = [];
|
|
308
|
+
}
|
|
309
|
+
balancesByUser[userAddress].push(transformAccountBalance(accountBalance));
|
|
310
|
+
}
|
|
311
|
+
return balancesByUser;
|
|
312
|
+
}
|
|
83
313
|
//# sourceMappingURL=index.js.map
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":";;;AAAA,IAAY,iBAIX;AAJD,WAAY,iBAAiB;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":";;;AAAA,IAAY,iBAIX;AAJD,WAAY,iBAAiB;IAC3B,wCAAmB,CAAA;IACnB,wCAAmB,CAAA;IACnB,8CAAyB,CAAA;AAC3B,CAAC,EAJW,iBAAiB,iCAAjB,iBAAiB,QAI5B"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.factorGaugeControllerSubgraphUrl = exports.factorScaleSubgraphUrl = void 0;
|
|
3
|
+
exports.factorFCTRSubgraphUrl = exports.factorGaugeControllerSubgraphUrl = exports.factorScaleSubgraphUrl = void 0;
|
|
4
4
|
exports.fetchPaginatedData = fetchPaginatedData;
|
|
5
5
|
const tokenlist_1 = require("@factordao/tokenlist");
|
|
6
6
|
const DEFAULT_PAGE_SIZE = 1000;
|
|
@@ -51,9 +51,27 @@ exports.factorScaleSubgraphUrl = {
|
|
|
51
51
|
};
|
|
52
52
|
exports.factorGaugeControllerSubgraphUrl = {
|
|
53
53
|
[tokenlist_1.ChainId.ARBITRUM_ONE]: {
|
|
54
|
+
testing: 'https://api.goldsky.com/api/public/project_cmgzitcts001c5np28moc9lyy/subgraphs/gauge-arbitrum_testing/v0.0.1/gn',
|
|
55
|
+
production: '',
|
|
56
|
+
},
|
|
57
|
+
[tokenlist_1.ChainId.BASE]: {
|
|
58
|
+
testing: 'https://api.goldsky.com/api/public/project_cmgzitcts001c5np28moc9lyy/subgraphs/gauge-base_testing/v0.0.2/gn',
|
|
59
|
+
production: '',
|
|
60
|
+
},
|
|
61
|
+
[tokenlist_1.ChainId.OPTIMISM]: {
|
|
62
|
+
testing: '',
|
|
63
|
+
production: '',
|
|
64
|
+
},
|
|
65
|
+
[tokenlist_1.ChainId.SONIC]: {
|
|
54
66
|
testing: '',
|
|
55
67
|
production: '',
|
|
56
68
|
},
|
|
69
|
+
};
|
|
70
|
+
exports.factorFCTRSubgraphUrl = {
|
|
71
|
+
[tokenlist_1.ChainId.ARBITRUM_ONE]: {
|
|
72
|
+
testing: 'https://api.goldsky.com/api/public/project_cmgzitcts001c5np28moc9lyy/subgraphs/token-balance-arbitrum_testing/v0.0.3/gn',
|
|
73
|
+
production: '',
|
|
74
|
+
},
|
|
57
75
|
[tokenlist_1.ChainId.BASE]: {
|
|
58
76
|
testing: '',
|
|
59
77
|
production: '',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subgraphs.js","sourceRoot":"","sources":["../../../src/utils/subgraphs.ts"],"names":[],"mappings":";;;AAKA,gDAqCC;AA1CD,oDAA+C;AAG/C,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAExB,KAAK,UAAU,kBAAkB,
|
|
1
|
+
{"version":3,"file":"subgraphs.js","sourceRoot":"","sources":["../../../src/utils/subgraphs.ts"],"names":[],"mappings":"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"}
|
package/dist/mjs/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { factorScaleSubgraphUrl, fetchPaginatedData } from './utils/subgraphs';
|
|
1
|
+
import { factorScaleSubgraphUrl, factorGaugeControllerSubgraphUrl, factorFCTRSubgraphUrl, fetchPaginatedData, } from './utils/subgraphs';
|
|
2
2
|
export async function getAvailableVaultsForVoting(chainId, environment) {
|
|
3
3
|
const subgraphUrl = factorScaleSubgraphUrl[chainId]?.[environment];
|
|
4
4
|
if (!subgraphUrl) {
|
|
@@ -75,4 +75,230 @@ export async function getVotesForAllUsers(chainId, environment) {
|
|
|
75
75
|
}
|
|
76
76
|
return votesByVault;
|
|
77
77
|
}
|
|
78
|
+
const DECIMALS = 18n;
|
|
79
|
+
const DECIMALS_DIVISOR = 10n ** DECIMALS;
|
|
80
|
+
function formatWeiToDecimal(wei) {
|
|
81
|
+
const whole = wei / DECIMALS_DIVISOR;
|
|
82
|
+
const remainder = wei % DECIMALS_DIVISOR;
|
|
83
|
+
if (remainder === 0n) {
|
|
84
|
+
return whole.toString();
|
|
85
|
+
}
|
|
86
|
+
const remainderStr = remainder.toString().padStart(Number(DECIMALS), '0');
|
|
87
|
+
const trimmed = remainderStr.replace(/0+$/, '');
|
|
88
|
+
return `${whole}.${trimmed}`;
|
|
89
|
+
}
|
|
90
|
+
function transformVaultReward(data) {
|
|
91
|
+
const fctrPerSec = BigInt(data.fctrPerSec);
|
|
92
|
+
const incentiveEndsAt = Number(data.incentiveEndsAt);
|
|
93
|
+
const timestamp = Number(data.timestamp);
|
|
94
|
+
const durationSec = BigInt(incentiveEndsAt - timestamp);
|
|
95
|
+
const totalIncentive = fctrPerSec * durationSec;
|
|
96
|
+
return {
|
|
97
|
+
vault: data.vault,
|
|
98
|
+
fctrPerSec,
|
|
99
|
+
incentiveEndsAt,
|
|
100
|
+
block: Number(data.block),
|
|
101
|
+
timestamp,
|
|
102
|
+
txid: data.txid,
|
|
103
|
+
totalIncentive,
|
|
104
|
+
totalIncentiveFmt: formatWeiToDecimal(totalIncentive),
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
export async function getRewardsForVault(chainId, environment, vault) {
|
|
108
|
+
const subgraphUrl = factorGaugeControllerSubgraphUrl[chainId]?.[environment];
|
|
109
|
+
if (!subgraphUrl) {
|
|
110
|
+
throw new Error(`Subgraph URL not found for chainId ${chainId} and environment ${environment}`);
|
|
111
|
+
}
|
|
112
|
+
const query = `
|
|
113
|
+
{
|
|
114
|
+
vaultReward(id: "${vault.toLowerCase()}") {
|
|
115
|
+
id
|
|
116
|
+
vault
|
|
117
|
+
fctrPerSec
|
|
118
|
+
incentiveEndsAt
|
|
119
|
+
block
|
|
120
|
+
timestamp
|
|
121
|
+
txid
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
`;
|
|
125
|
+
const response = await fetch(subgraphUrl, {
|
|
126
|
+
method: 'POST',
|
|
127
|
+
headers: {
|
|
128
|
+
'Content-Type': 'application/json',
|
|
129
|
+
},
|
|
130
|
+
body: JSON.stringify({ query }),
|
|
131
|
+
});
|
|
132
|
+
const data = await response.json();
|
|
133
|
+
if (!data.data.vaultReward) {
|
|
134
|
+
return null;
|
|
135
|
+
}
|
|
136
|
+
return transformVaultReward(data.data.vaultReward);
|
|
137
|
+
}
|
|
138
|
+
export async function getRewardsForAllVaults(chainId, environment) {
|
|
139
|
+
const subgraphUrl = factorGaugeControllerSubgraphUrl[chainId]?.[environment];
|
|
140
|
+
if (!subgraphUrl) {
|
|
141
|
+
throw new Error(`Subgraph URL not found for chainId ${chainId} and environment ${environment}`);
|
|
142
|
+
}
|
|
143
|
+
const rewards = await fetchPaginatedData(subgraphUrl, (first, skip) => `
|
|
144
|
+
{
|
|
145
|
+
vaultRewards(
|
|
146
|
+
first: ${first}
|
|
147
|
+
skip: ${skip}
|
|
148
|
+
orderBy: timestamp
|
|
149
|
+
orderDirection: desc
|
|
150
|
+
) {
|
|
151
|
+
id
|
|
152
|
+
vault
|
|
153
|
+
fctrPerSec
|
|
154
|
+
incentiveEndsAt
|
|
155
|
+
block
|
|
156
|
+
timestamp
|
|
157
|
+
txid
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
`, (data) => data.data.vaultRewards || []);
|
|
161
|
+
return rewards.map(transformVaultReward);
|
|
162
|
+
}
|
|
163
|
+
function formatBalanceToDecimal(balance, decimals) {
|
|
164
|
+
const divisor = 10n ** BigInt(decimals);
|
|
165
|
+
const whole = balance / divisor;
|
|
166
|
+
const remainder = balance % divisor;
|
|
167
|
+
if (remainder === 0n) {
|
|
168
|
+
return whole.toString();
|
|
169
|
+
}
|
|
170
|
+
const remainderStr = remainder.toString().padStart(decimals, '0');
|
|
171
|
+
const trimmed = remainderStr.replace(/0+$/, '');
|
|
172
|
+
return `${whole}.${trimmed}`;
|
|
173
|
+
}
|
|
174
|
+
// veFCTR voting power calculation based on VeBalanceLib.sol
|
|
175
|
+
// MAX_LOCK_TIME = 104 weeks in seconds
|
|
176
|
+
const MAX_LOCK_TIME = 104n * 7n * 24n * 60n * 60n; // 104 weeks in seconds
|
|
177
|
+
/**
|
|
178
|
+
* Calculate voting power for veFCTR based on locked amount and expiry
|
|
179
|
+
* Formula: votingPower = amount * (expiry - currentTime) / MAX_LOCK_TIME
|
|
180
|
+
*
|
|
181
|
+
* If the position is expired (expiry <= currentTime), voting power is 0
|
|
182
|
+
*/
|
|
183
|
+
function calculateVotingPower(amount, expiry) {
|
|
184
|
+
const currentTime = BigInt(Math.floor(Date.now() / 1000));
|
|
185
|
+
const expiryBigInt = BigInt(expiry);
|
|
186
|
+
if (expiryBigInt <= currentTime) {
|
|
187
|
+
return 0n;
|
|
188
|
+
}
|
|
189
|
+
const timeRemaining = expiryBigInt - currentTime;
|
|
190
|
+
return (amount * timeRemaining) / MAX_LOCK_TIME;
|
|
191
|
+
}
|
|
192
|
+
function transformAccountBalance(data) {
|
|
193
|
+
const balance = BigInt(data.balance);
|
|
194
|
+
const decimals = data.token.decimals ?? 18;
|
|
195
|
+
const expiry = data.expiry ? Number(data.expiry) : null;
|
|
196
|
+
// Calculate voting power if expiry is present (veFCTR token)
|
|
197
|
+
let votingPower = null;
|
|
198
|
+
let votingPowerFmt = null;
|
|
199
|
+
if (expiry !== null) {
|
|
200
|
+
votingPower = calculateVotingPower(balance, expiry);
|
|
201
|
+
votingPowerFmt = formatBalanceToDecimal(votingPower, decimals);
|
|
202
|
+
}
|
|
203
|
+
return {
|
|
204
|
+
tokenAddress: data.token.address,
|
|
205
|
+
tokenName: data.token.name,
|
|
206
|
+
tokenSymbol: data.token.symbol,
|
|
207
|
+
tokenDecimals: data.token.decimals,
|
|
208
|
+
balance,
|
|
209
|
+
balanceFmt: formatBalanceToDecimal(balance, decimals),
|
|
210
|
+
expiry,
|
|
211
|
+
votingPower,
|
|
212
|
+
votingPowerFmt,
|
|
213
|
+
lastBlock: Number(data.lastBlock),
|
|
214
|
+
lastTimestamp: Number(data.lastTimestamp),
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
export async function getTokenBalancesForUser(chainId, environment, user) {
|
|
218
|
+
const subgraphUrl = factorFCTRSubgraphUrl[chainId]?.[environment];
|
|
219
|
+
if (!subgraphUrl) {
|
|
220
|
+
throw new Error(`Subgraph URL not found for chainId ${chainId} and environment ${environment}`);
|
|
221
|
+
}
|
|
222
|
+
const userAddress = user.toLowerCase();
|
|
223
|
+
const query = `
|
|
224
|
+
{
|
|
225
|
+
accountBalances(where: { account_: { address: "${userAddress}" }, balance_gt: "0" }) {
|
|
226
|
+
id
|
|
227
|
+
account {
|
|
228
|
+
id
|
|
229
|
+
address
|
|
230
|
+
}
|
|
231
|
+
token {
|
|
232
|
+
id
|
|
233
|
+
address
|
|
234
|
+
name
|
|
235
|
+
symbol
|
|
236
|
+
decimals
|
|
237
|
+
totalSupply
|
|
238
|
+
}
|
|
239
|
+
balance
|
|
240
|
+
expiry
|
|
241
|
+
lastBlock
|
|
242
|
+
lastTimestamp
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
`;
|
|
246
|
+
const response = await fetch(subgraphUrl, {
|
|
247
|
+
method: 'POST',
|
|
248
|
+
headers: {
|
|
249
|
+
'Content-Type': 'application/json',
|
|
250
|
+
},
|
|
251
|
+
body: JSON.stringify({ query }),
|
|
252
|
+
});
|
|
253
|
+
const data = await response.json();
|
|
254
|
+
const accountBalances = data.data.accountBalances || [];
|
|
255
|
+
return {
|
|
256
|
+
userAddress,
|
|
257
|
+
balances: accountBalances.map(transformAccountBalance),
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
export async function getTokenBalancesForAllUsers(chainId, environment) {
|
|
261
|
+
const subgraphUrl = factorFCTRSubgraphUrl[chainId]?.[environment];
|
|
262
|
+
if (!subgraphUrl) {
|
|
263
|
+
throw new Error(`Subgraph URL not found for chainId ${chainId} and environment ${environment}`);
|
|
264
|
+
}
|
|
265
|
+
const accountBalances = await fetchPaginatedData(subgraphUrl, (first, skip) => `
|
|
266
|
+
{
|
|
267
|
+
accountBalances(
|
|
268
|
+
first: ${first}
|
|
269
|
+
skip: ${skip}
|
|
270
|
+
where: { balance_gt: "0" }
|
|
271
|
+
orderBy: lastTimestamp
|
|
272
|
+
orderDirection: desc
|
|
273
|
+
) {
|
|
274
|
+
id
|
|
275
|
+
account {
|
|
276
|
+
id
|
|
277
|
+
address
|
|
278
|
+
}
|
|
279
|
+
token {
|
|
280
|
+
id
|
|
281
|
+
address
|
|
282
|
+
name
|
|
283
|
+
symbol
|
|
284
|
+
decimals
|
|
285
|
+
totalSupply
|
|
286
|
+
}
|
|
287
|
+
balance
|
|
288
|
+
expiry
|
|
289
|
+
lastBlock
|
|
290
|
+
lastTimestamp
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
`, (data) => data.data.accountBalances || []);
|
|
294
|
+
const balancesByUser = {};
|
|
295
|
+
for (const accountBalance of accountBalances) {
|
|
296
|
+
const userAddress = accountBalance.account.address;
|
|
297
|
+
if (!balancesByUser[userAddress]) {
|
|
298
|
+
balancesByUser[userAddress] = [];
|
|
299
|
+
}
|
|
300
|
+
balancesByUser[userAddress].push(transformAccountBalance(accountBalance));
|
|
301
|
+
}
|
|
302
|
+
return balancesByUser;
|
|
303
|
+
}
|
|
78
304
|
//# sourceMappingURL=index.js.map
|
package/dist/mjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,iBAIX;AAJD,WAAY,iBAAiB;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,iBAIX;AAJD,WAAY,iBAAiB;IAC3B,wCAAmB,CAAA;IACnB,wCAAmB,CAAA;IACnB,8CAAyB,CAAA;AAC3B,CAAC,EAJW,iBAAiB,KAAjB,iBAAiB,QAI5B"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ChainId } from
|
|
1
|
+
import { ChainId } from '@factordao/tokenlist';
|
|
2
2
|
const DEFAULT_PAGE_SIZE = 1000;
|
|
3
3
|
export async function fetchPaginatedData(subgraphUrl, queryBuilder, dataExtractor) {
|
|
4
4
|
const allData = [];
|
|
@@ -47,9 +47,27 @@ export const factorScaleSubgraphUrl = {
|
|
|
47
47
|
};
|
|
48
48
|
export const factorGaugeControllerSubgraphUrl = {
|
|
49
49
|
[ChainId.ARBITRUM_ONE]: {
|
|
50
|
+
testing: 'https://api.goldsky.com/api/public/project_cmgzitcts001c5np28moc9lyy/subgraphs/gauge-arbitrum_testing/v0.0.1/gn',
|
|
51
|
+
production: '',
|
|
52
|
+
},
|
|
53
|
+
[ChainId.BASE]: {
|
|
54
|
+
testing: 'https://api.goldsky.com/api/public/project_cmgzitcts001c5np28moc9lyy/subgraphs/gauge-base_testing/v0.0.2/gn',
|
|
55
|
+
production: '',
|
|
56
|
+
},
|
|
57
|
+
[ChainId.OPTIMISM]: {
|
|
58
|
+
testing: '',
|
|
59
|
+
production: '',
|
|
60
|
+
},
|
|
61
|
+
[ChainId.SONIC]: {
|
|
50
62
|
testing: '',
|
|
51
63
|
production: '',
|
|
52
64
|
},
|
|
65
|
+
};
|
|
66
|
+
export const factorFCTRSubgraphUrl = {
|
|
67
|
+
[ChainId.ARBITRUM_ONE]: {
|
|
68
|
+
testing: 'https://api.goldsky.com/api/public/project_cmgzitcts001c5np28moc9lyy/subgraphs/token-balance-arbitrum_testing/v0.0.3/gn',
|
|
69
|
+
production: '',
|
|
70
|
+
},
|
|
53
71
|
[ChainId.BASE]: {
|
|
54
72
|
testing: '',
|
|
55
73
|
production: '',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subgraphs.js","sourceRoot":"","sources":["../../../src/utils/subgraphs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAG/C,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAE/B,MAAM,CAAC,KAAK,UAAU,kBAAkB,
|
|
1
|
+
{"version":3,"file":"subgraphs.js","sourceRoot":"","sources":["../../../src/utils/subgraphs.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/types/index.d.ts
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
|
-
import { FactorEnvironment, VaultVotes } from './types';
|
|
1
|
+
import { FactorEnvironment, VaultVotes, VaultReward, UserTokenBalances, AllUsersTokenBalances } from './types';
|
|
2
2
|
import { ChainId } from '@factordao/tokenlist';
|
|
3
3
|
export declare function getAvailableVaultsForVoting(chainId: ChainId, environment: FactorEnvironment): Promise<any>;
|
|
4
4
|
export declare function getVotesForUser(chainId: ChainId, environment: FactorEnvironment, user: string): Promise<any>;
|
|
5
5
|
export declare function getVotesForAllUsers(chainId: ChainId, environment: FactorEnvironment): Promise<VaultVotes>;
|
|
6
|
+
export declare function getRewardsForVault(chainId: ChainId, environment: FactorEnvironment, vault: string): Promise<VaultReward | null>;
|
|
7
|
+
export declare function getRewardsForAllVaults(chainId: ChainId, environment: FactorEnvironment): Promise<VaultReward[]>;
|
|
8
|
+
export declare function getTokenBalancesForUser(chainId: ChainId, environment: FactorEnvironment, user: string): Promise<UserTokenBalances>;
|
|
9
|
+
export declare function getTokenBalancesForAllUsers(chainId: ChainId, environment: FactorEnvironment): Promise<AllUsersTokenBalances>;
|
package/types/types/index.d.ts
CHANGED
|
@@ -14,3 +14,60 @@ export type VaultVotes = Record<string, Array<{
|
|
|
14
14
|
timestamp: number;
|
|
15
15
|
userAddress: string;
|
|
16
16
|
}>>;
|
|
17
|
+
export type VaultRewardData = {
|
|
18
|
+
id: string;
|
|
19
|
+
vault: string;
|
|
20
|
+
fctrPerSec: string;
|
|
21
|
+
incentiveEndsAt: string;
|
|
22
|
+
block: string;
|
|
23
|
+
timestamp: string;
|
|
24
|
+
txid: string;
|
|
25
|
+
};
|
|
26
|
+
export type VaultReward = {
|
|
27
|
+
vault: string;
|
|
28
|
+
fctrPerSec: bigint;
|
|
29
|
+
incentiveEndsAt: number;
|
|
30
|
+
block: number;
|
|
31
|
+
timestamp: number;
|
|
32
|
+
txid: string;
|
|
33
|
+
totalIncentive: bigint;
|
|
34
|
+
totalIncentiveFmt: string;
|
|
35
|
+
};
|
|
36
|
+
export type TokenData = {
|
|
37
|
+
id: string;
|
|
38
|
+
address: string;
|
|
39
|
+
name: string | null;
|
|
40
|
+
symbol: string | null;
|
|
41
|
+
decimals: number | null;
|
|
42
|
+
totalSupply: string | null;
|
|
43
|
+
};
|
|
44
|
+
export type AccountBalanceData = {
|
|
45
|
+
id: string;
|
|
46
|
+
account: {
|
|
47
|
+
id: string;
|
|
48
|
+
address: string;
|
|
49
|
+
};
|
|
50
|
+
token: TokenData;
|
|
51
|
+
balance: string;
|
|
52
|
+
expiry: string | null;
|
|
53
|
+
lastBlock: string;
|
|
54
|
+
lastTimestamp: string;
|
|
55
|
+
};
|
|
56
|
+
export type TokenBalance = {
|
|
57
|
+
tokenAddress: string;
|
|
58
|
+
tokenName: string | null;
|
|
59
|
+
tokenSymbol: string | null;
|
|
60
|
+
tokenDecimals: number | null;
|
|
61
|
+
balance: bigint;
|
|
62
|
+
balanceFmt: string;
|
|
63
|
+
expiry: number | null;
|
|
64
|
+
votingPower: bigint | null;
|
|
65
|
+
votingPowerFmt: string | null;
|
|
66
|
+
lastBlock: number;
|
|
67
|
+
lastTimestamp: number;
|
|
68
|
+
};
|
|
69
|
+
export type UserTokenBalances = {
|
|
70
|
+
userAddress: string;
|
|
71
|
+
balances: TokenBalance[];
|
|
72
|
+
};
|
|
73
|
+
export type AllUsersTokenBalances = Record<string, TokenBalance[]>;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { ChainId } from
|
|
2
|
-
import { FactorEnvironment } from
|
|
1
|
+
import { ChainId } from '@factordao/tokenlist';
|
|
2
|
+
import { FactorEnvironment } from '../types';
|
|
3
3
|
export declare function fetchPaginatedData<T>(subgraphUrl: string, queryBuilder: (first: number, skip: number) => string, dataExtractor: (response: any) => T[]): Promise<T[]>;
|
|
4
4
|
export declare const factorScaleSubgraphUrl: Record<ChainId, Partial<Record<FactorEnvironment, string>>>;
|
|
5
5
|
export declare const factorGaugeControllerSubgraphUrl: Record<ChainId, Partial<Record<FactorEnvironment, string>>>;
|
|
6
|
+
export declare const factorFCTRSubgraphUrl: Record<ChainId, Partial<Record<FactorEnvironment, string>>>;
|