@glowlabs-org/utils 0.0.6 → 0.0.9

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 (85) hide show
  1. package/dist/cjs/index.js +192 -0
  2. package/dist/cjs/index.js.map +1 -0
  3. package/dist/esm/constants/index.d.ts +1 -0
  4. package/dist/esm/default-values/gca-to-server-urls.d.ts +0 -0
  5. package/dist/{index.js → esm/index.d.ts} +0 -1
  6. package/dist/esm/index.js +189 -0
  7. package/dist/esm/index.js.map +1 -0
  8. package/dist/esm/types/AuditCompleted.d.ts +3 -0
  9. package/dist/esm/types/AuditInherited.d.ts +6 -0
  10. package/dist/esm/types/Device.d.ts +5 -0
  11. package/dist/esm/types/DuplicatedButPastAuditCompleted.d.ts +8 -0
  12. package/dist/esm/types/Farm.d.ts +20 -0
  13. package/dist/esm/types/FarmStatus.d.ts +14 -0
  14. package/dist/esm/types/GCAAndServerUrl.d.ts +5 -0
  15. package/dist/esm/types/GCAServerResponse.d.ts +6 -0
  16. package/dist/esm/types/GetEquipmentDataHandlerParams.d.ts +5 -0
  17. package/dist/esm/types/PayoutWalletAndSplit.d.ts +17 -0
  18. package/dist/esm/types/PayoutWalletAndSplitWithRewardSplits.d.ts +15 -0
  19. package/dist/esm/types/RewardSplit.d.ts +5 -0
  20. package/dist/esm/types/RewardSplits.d.ts +2 -0
  21. package/dist/esm/types/SlotRange.d.ts +4 -0
  22. package/dist/esm/types/WeekAndSlotRange.d.ts +5 -0
  23. package/dist/{types/index.js → esm/types/index.d.ts} +0 -1
  24. package/dist/esm/types/stashed-Farm.d.ts +20 -0
  25. package/package.json +11 -9
  26. package/rollup.config.js +26 -0
  27. package/dist/constants/index.js +0 -2
  28. package/dist/constants/index.js.map +0 -1
  29. package/dist/default-values/gca-to-server-urls.js +0 -9
  30. package/dist/default-values/gca-to-server-urls.js.map +0 -1
  31. package/dist/index.js.map +0 -1
  32. package/dist/tsconfig.tsbuildinfo +0 -1
  33. package/dist/types/AuditCompleted.js +0 -3
  34. package/dist/types/AuditCompleted.js.map +0 -1
  35. package/dist/types/AuditInherited.js +0 -3
  36. package/dist/types/AuditInherited.js.map +0 -1
  37. package/dist/types/Device.js +0 -3
  38. package/dist/types/Device.js.map +0 -1
  39. package/dist/types/DuplicatedButPastAuditCompleted.js +0 -2
  40. package/dist/types/DuplicatedButPastAuditCompleted.js.map +0 -1
  41. package/dist/types/Farm.js +0 -2
  42. package/dist/types/Farm.js.map +0 -1
  43. package/dist/types/FarmStatus.js +0 -2
  44. package/dist/types/FarmStatus.js.map +0 -1
  45. package/dist/types/GCAAndServerUrl.js +0 -2
  46. package/dist/types/GCAAndServerUrl.js.map +0 -1
  47. package/dist/types/GCAServerResponse.js +0 -2
  48. package/dist/types/GCAServerResponse.js.map +0 -1
  49. package/dist/types/GetEquipmentDataHandlerParams.js +0 -3
  50. package/dist/types/GetEquipmentDataHandlerParams.js.map +0 -1
  51. package/dist/types/PayoutWalletAndSplit.js +0 -2
  52. package/dist/types/PayoutWalletAndSplit.js.map +0 -1
  53. package/dist/types/PayoutWalletAndSplitWithRewardSplits.js +0 -2
  54. package/dist/types/PayoutWalletAndSplitWithRewardSplits.js.map +0 -1
  55. package/dist/types/RewardSplit.js +0 -3
  56. package/dist/types/RewardSplit.js.map +0 -1
  57. package/dist/types/RewardSplits.js +0 -2
  58. package/dist/types/RewardSplits.js.map +0 -1
  59. package/dist/types/SlotRange.js +0 -3
  60. package/dist/types/SlotRange.js.map +0 -1
  61. package/dist/types/WeekAndSlotRange.js +0 -2
  62. package/dist/types/WeekAndSlotRange.js.map +0 -1
  63. package/dist/types/index.js.map +0 -1
  64. package/dist/types/stashed-Farm.js +0 -2
  65. package/dist/types/stashed-Farm.js.map +0 -1
  66. /package/dist/{constants → cjs/constants}/index.d.ts +0 -0
  67. /package/dist/{default-values → cjs/default-values}/gca-to-server-urls.d.ts +0 -0
  68. /package/dist/{index.d.ts → cjs/index.d.ts} +0 -0
  69. /package/dist/{types → cjs/types}/AuditCompleted.d.ts +0 -0
  70. /package/dist/{types → cjs/types}/AuditInherited.d.ts +0 -0
  71. /package/dist/{types → cjs/types}/Device.d.ts +0 -0
  72. /package/dist/{types → cjs/types}/DuplicatedButPastAuditCompleted.d.ts +0 -0
  73. /package/dist/{types → cjs/types}/Farm.d.ts +0 -0
  74. /package/dist/{types → cjs/types}/FarmStatus.d.ts +0 -0
  75. /package/dist/{types → cjs/types}/GCAAndServerUrl.d.ts +0 -0
  76. /package/dist/{types → cjs/types}/GCAServerResponse.d.ts +0 -0
  77. /package/dist/{types → cjs/types}/GetEquipmentDataHandlerParams.d.ts +0 -0
  78. /package/dist/{types → cjs/types}/PayoutWalletAndSplit.d.ts +0 -0
  79. /package/dist/{types → cjs/types}/PayoutWalletAndSplitWithRewardSplits.d.ts +0 -0
  80. /package/dist/{types → cjs/types}/RewardSplit.d.ts +0 -0
  81. /package/dist/{types → cjs/types}/RewardSplits.d.ts +0 -0
  82. /package/dist/{types → cjs/types}/SlotRange.d.ts +0 -0
  83. /package/dist/{types → cjs/types}/WeekAndSlotRange.d.ts +0 -0
  84. /package/dist/{types → cjs/types}/index.d.ts +0 -0
  85. /package/dist/{types → cjs/types}/stashed-Farm.d.ts +0 -0
@@ -0,0 +1,192 @@
1
+ 'use strict';
2
+
3
+ var ethers = require('ethers');
4
+ var merkletreejs = require('merkletreejs');
5
+ var viem = require('viem');
6
+
7
+ const GENESIS_TIMESTAMP = 1700352000;
8
+
9
+ const leafTypes = ["address", "uint256", "uint256"];
10
+ function hashLeaf({ address, glowWeight, usdcWeight, }) {
11
+ const hash = ethers.ethers.utils.solidityKeccak256(leafTypes, [
12
+ address,
13
+ glowWeight,
14
+ usdcWeight,
15
+ ]);
16
+ return hash;
17
+ }
18
+ //
19
+
20
+ /**
21
+ * @dev This is actually not as intuitive as it seems.
22
+ * Glow actually has 18 decimals, but glow weight is based on the amount of protocol fees (USDC) that the farm paid
23
+ * Therefore, the weight is based on the amount of USDC that was paid, which has 6 decimals
24
+ */
25
+ const GLOW_WEIGHT_DECIMAL_PRECISION = 6;
26
+ /**
27
+ * @dev This is actually not as intuitive as it seems.
28
+ * USDG weight is based on the amount of carbon credits produced, but the max value of a weight is ((2*64)-1) / 5 so we need to choose sensible precision to make sure that number never overflows
29
+ */
30
+ const USDG_WEIGHT_DECIMAL_PRECISION = 6;
31
+ // const GCA_URLS = ["http://95.217.194.59:35015"];
32
+ async function getFarmsForWeek(args) {
33
+ const { week: weekNumber, gcaUrls, apiUrl } = args;
34
+ const url = apiUrl;
35
+ // const url = "http://0.0.0.0:3005/headline_farm_stats";
36
+ const body = {
37
+ urls: gcaUrls,
38
+ week_number: weekNumber,
39
+ with_full_data: true,
40
+ include_unassigned_farms: false,
41
+ with_raw_data: true,
42
+ };
43
+ const res = await fetch(url, {
44
+ method: "POST",
45
+ body: JSON.stringify(body),
46
+ headers: {
47
+ "Content-Type": "application/json",
48
+ },
49
+ });
50
+ if (!res.ok) {
51
+ const errorText = await res.text();
52
+ throw new Error(`Failed to fetch farms for week ${weekNumber}: ${errorText || res.statusText}`);
53
+ }
54
+ const _json = await res.json();
55
+ return _json;
56
+ }
57
+ async function createWeeklyReport(args) {
58
+ const map = new Map();
59
+ function addValueToMap(key, value, map) {
60
+ if (map.has(key)) {
61
+ //+= everything
62
+ const existingValue = map.get(key);
63
+ existingValue.glowWeight += value.glowWeight;
64
+ existingValue.usdgWeight += value.usdgWeight;
65
+ map.set(key, existingValue);
66
+ }
67
+ else {
68
+ map.set(key, value);
69
+ }
70
+ }
71
+ const apiResposne = await getFarmsForWeek(args);
72
+ const farms = apiResposne.filteredFarms;
73
+ const rawData = apiResposne.rawData;
74
+ let totalCreditsProduced = 0;
75
+ //log the total farms in farms
76
+ for (const farm of farms) {
77
+ // const {
78
+ // shortId,
79
+ // payoutWallet,
80
+ // installerGlowFeePercent,
81
+ // installerUsdgFeePercent,
82
+ // } = farm;
83
+ // const key = farm.payoutWallet;
84
+ // farm.carbonCreditsProduced =
85
+ farm.status === "Unassigned" ? 0 : farm.carbonCreditsProduced;
86
+ console.log(farm.status);
87
+ if (farm.carbonCreditsProduced < 0) {
88
+ throw new Error("Carbon credits produced is less than 0");
89
+ }
90
+ totalCreditsProduced += farm.carbonCreditsProduced;
91
+ // const value = {
92
+ // wallet: payoutWallet,
93
+ // glowWeight: farm.weeklyPayment * (1 - installerGlowFeePercent),
94
+ // usdgWeight: farm.carbonCreditsProduced * (1 - installerUsdgFeePercent),
95
+ // };
96
+ // const installerKey = farm.installerWallet;
97
+ // const installerValue = {
98
+ // wallet: farm.installerWallet,
99
+ // glowWeight: farm.weeklyPayment * installerGlowFeePercent,
100
+ // usdgWeight: farm.carbonCreditsProduced * installerUsdgFeePercent,
101
+ // };
102
+ if (!farm.rewardSplits)
103
+ throw new Error("No reward splits");
104
+ const sumOfRewardSplitsGlowWeight = farm.rewardSplits.reduce((acc, rewardSplit) => acc + rewardSplit.glowSplitPercent, 0);
105
+ const sumOfRewardSplitsUSDGWeight = farm.rewardSplits.reduce((acc, rewardSplit) => acc + rewardSplit.usdgSplitPercent, 0);
106
+ if (sumOfRewardSplitsGlowWeight !== 1)
107
+ throw new Error("Glow weight splits do not add up to 1");
108
+ if (sumOfRewardSplitsUSDGWeight !== 1)
109
+ throw new Error("USDG weight splits do not add up to 1");
110
+ for (const rewardSplit of farm.rewardSplits) {
111
+ const value = {
112
+ wallet: rewardSplit.walletAddress,
113
+ glowWeight: farm.weeklyPayment * rewardSplit.glowSplitPercent,
114
+ usdgWeight: farm.carbonCreditsProduced * rewardSplit.usdgSplitPercent,
115
+ };
116
+ addValueToMap(rewardSplit.walletAddress, value, map);
117
+ }
118
+ // addValueToMap(key, value, map);
119
+ // addValueToMap(installerKey, installerValue, map);
120
+ }
121
+ const merkleLeaves = Array.from(map.values());
122
+ const finalLeaves = merkleLeaves.map(({ wallet, glowWeight, usdgWeight }) => ({
123
+ wallet,
124
+ glowWeight: viem.parseUnits(glowWeight.toString(), GLOW_WEIGHT_DECIMAL_PRECISION).toString(),
125
+ usdgWeight: viem.parseUnits(usdgWeight.toString(), USDG_WEIGHT_DECIMAL_PRECISION).toString(),
126
+ }));
127
+ const leaves = finalLeaves.map((leaf) => hashLeaf({
128
+ address: leaf.wallet,
129
+ glowWeight: leaf.glowWeight,
130
+ usdcWeight: leaf.usdgWeight,
131
+ }));
132
+ const tree = new merkletreejs.MerkleTree(leaves, ethers.ethers.utils.keccak256, { sort: true });
133
+ const root = tree.getHexRoot();
134
+ const totalGlowWeightFinalizedLeavesSum = finalLeaves.reduce((acc, { glowWeight }) => acc.add(glowWeight), ethers.ethers.BigNumber.from(0));
135
+ const totalGCCWeightFinalizedLeavesSum = finalLeaves.reduce((acc, { usdgWeight }) => acc.add(usdgWeight), ethers.ethers.BigNumber.from(0));
136
+ const headlineStats = {
137
+ weekNumber: args.week,
138
+ totalCreditsProduced,
139
+ totalCreditsProducedBN: viem.parseUnits(totalCreditsProduced.toString(), 18).toString(),
140
+ totalGlowWeightInFinalized: totalGlowWeightFinalizedLeavesSum.toString(),
141
+ totalGlowWeightHuman: viem.formatUnits(BigInt(totalGlowWeightFinalizedLeavesSum.toString()), GLOW_WEIGHT_DECIMAL_PRECISION).toString(),
142
+ totalUSDGWeightInFinalized: totalGCCWeightFinalizedLeavesSum.toString(),
143
+ totalUSDGWeightHuman: viem.formatUnits(BigInt(totalGCCWeightFinalizedLeavesSum.toString()), USDG_WEIGHT_DECIMAL_PRECISION).toString(),
144
+ root: root,
145
+ };
146
+ const farmsWithMerkleProofs = finalLeaves.map((leaf) => {
147
+ const hashedLeaf = hashLeaf({
148
+ address: leaf.wallet,
149
+ glowWeight: leaf.glowWeight,
150
+ usdcWeight: leaf.usdgWeight,
151
+ });
152
+ const proof = tree.getHexProof(hashedLeaf);
153
+ const isValid = tree.verify(proof, hashedLeaf, root);
154
+ if (!isValid) {
155
+ throw new Error("Invalid proof");
156
+ }
157
+ return {
158
+ ...leaf,
159
+ proof,
160
+ };
161
+ });
162
+ //-----------------------------------------------------//
163
+ //-Some invariant tests in case something got messed up//
164
+ //-----------------------------------------------------//
165
+ //Make sure that the sum of all the glow weight is equal to the sum of all the glow weight in the final leaves
166
+ let forLoopedGlowWeightSum = ethers.ethers.BigNumber.from(0);
167
+ for (const farm of farmsWithMerkleProofs) {
168
+ forLoopedGlowWeightSum = forLoopedGlowWeightSum.add(ethers.BigNumber.from(farm.glowWeight));
169
+ }
170
+ if (!forLoopedGlowWeightSum.eq(totalGlowWeightFinalizedLeavesSum)) {
171
+ throw new Error("Glow weight sum is not equal");
172
+ }
173
+ //do the same for gcc
174
+ let forLoopedGCCWeightSum = ethers.ethers.BigNumber.from(0);
175
+ for (const farm of farmsWithMerkleProofs) {
176
+ forLoopedGCCWeightSum = forLoopedGCCWeightSum.add(ethers.BigNumber.from(farm.usdgWeight));
177
+ }
178
+ if (!forLoopedGCCWeightSum.eq(totalGCCWeightFinalizedLeavesSum)) {
179
+ throw new Error("GCC weight sum is not equal");
180
+ }
181
+ return {
182
+ headlineStats,
183
+ finalLeaves,
184
+ farmsWithMerkleProofs,
185
+ farms,
186
+ rawData,
187
+ };
188
+ }
189
+
190
+ exports.GENESIS_TIMESTAMP = GENESIS_TIMESTAMP;
191
+ exports.createWeeklyReport = createWeeklyReport;
192
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../src/constants/index.ts","../../src/lib/create-weekly-report/utils/hash-leaf.ts","../../src/lib/create-weekly-report/index.ts"],"sourcesContent":["export const GENESIS_TIMESTAMP: number = 1700352000;\n","import { ethers } from \"ethers\";\nconst leafTypes = [\"address\", \"uint256\", \"uint256\"];\n\ntype HashLeafArgs = {\n address: string;\n glowWeight: string;\n usdcWeight: string;\n};\nexport function hashLeaf({\n address,\n glowWeight,\n usdcWeight,\n}: HashLeafArgs): string {\n const hash = ethers.utils.solidityKeccak256(leafTypes, [\n address,\n glowWeight,\n usdcWeight,\n ]);\n return hash;\n}\n\n//\n","import { hashLeaf } from \"./utils/hash-leaf\";\nimport { MerkleTree } from \"merkletreejs\";\nimport { BigNumber, ethers } from \"ethers\";\n\nimport { formatUnits, parseUnits } from \"viem\";\nimport { Farm, GCAServerResponse } from \"../../types\";\n\nexport type ApiRes = {\n filteredFarms: Farm[];\n rawData: GCAServerResponse;\n multiplier: number;\n};\n\nexport type MerkleLeafIntermediary = {\n wallet: string;\n glowWeight: number;\n usdgWeight: number;\n};\n\nexport type FinalLeaf = {\n wallet: string;\n glowWeight: string;\n usdgWeight: string;\n};\n\n/**\n * @dev This is actually not as intuitive as it seems.\n * Glow actually has 18 decimals, but glow weight is based on the amount of protocol fees (USDC) that the farm paid\n * Therefore, the weight is based on the amount of USDC that was paid, which has 6 decimals\n */\nconst GLOW_WEIGHT_DECIMAL_PRECISION = 6;\n\n/**\n * @dev This is actually not as intuitive as it seems.\n * USDG weight is based on the amount of carbon credits produced, but the max value of a weight is ((2*64)-1) / 5 so we need to choose sensible precision to make sure that number never overflows\n */\nconst USDG_WEIGHT_DECIMAL_PRECISION = 6;\nexport type CreateWeeklyReportArgs = {\n week: number;\n gcaUrls: string[];\n apiUrl: string;\n};\n// const GCA_URLS = [\"http://95.217.194.59:35015\"];\nasync function getFarmsForWeek(args: CreateWeeklyReportArgs): Promise<ApiRes> {\n const { week: weekNumber, gcaUrls, apiUrl } = args;\n const url = apiUrl;\n // const url = \"http://0.0.0.0:3005/headline_farm_stats\";\n const body = {\n urls: gcaUrls,\n week_number: weekNumber,\n with_full_data: true,\n include_unassigned_farms: false,\n with_raw_data: true,\n };\n\n const res = await fetch(url, {\n method: \"POST\",\n body: JSON.stringify(body),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n if (!res.ok) {\n const errorText = await res.text();\n throw new Error(\n `Failed to fetch farms for week ${weekNumber}: ${\n errorText || res.statusText\n }`\n );\n }\n const _json = await res.json();\n return _json as ApiRes;\n}\n\nexport async function createWeeklyReport(args: CreateWeeklyReportArgs) {\n const map = new Map<string, MerkleLeafIntermediary>();\n\n function addValueToMap(\n key: string,\n value: MerkleLeafIntermediary,\n map: Map<string, MerkleLeafIntermediary>\n ) {\n if (map.has(key)) {\n //+= everything\n const existingValue = map.get(key)!;\n existingValue.glowWeight += value.glowWeight;\n existingValue.usdgWeight += value.usdgWeight;\n map.set(key, existingValue);\n } else {\n map.set(key, value);\n }\n }\n const apiResposne = await getFarmsForWeek(args);\n const farms = apiResposne.filteredFarms;\n const rawData = apiResposne.rawData;\n let totalCreditsProduced: number = 0;\n //log the total farms in farms\n for (const farm of farms) {\n // const {\n // shortId,\n // payoutWallet,\n // installerGlowFeePercent,\n // installerUsdgFeePercent,\n // } = farm;\n // const key = farm.payoutWallet;\n // farm.carbonCreditsProduced =\n farm.status === \"Unassigned\" ? 0 : farm.carbonCreditsProduced;\n console.log(farm.status);\n if (farm.carbonCreditsProduced < 0) {\n throw new Error(\"Carbon credits produced is less than 0\");\n }\n totalCreditsProduced += farm.carbonCreditsProduced;\n // const value = {\n // wallet: payoutWallet,\n // glowWeight: farm.weeklyPayment * (1 - installerGlowFeePercent),\n // usdgWeight: farm.carbonCreditsProduced * (1 - installerUsdgFeePercent),\n // };\n\n // const installerKey = farm.installerWallet;\n // const installerValue = {\n // wallet: farm.installerWallet,\n // glowWeight: farm.weeklyPayment * installerGlowFeePercent,\n // usdgWeight: farm.carbonCreditsProduced * installerUsdgFeePercent,\n // };\n if (!farm.rewardSplits) throw new Error(\"No reward splits\");\n const sumOfRewardSplitsGlowWeight = farm.rewardSplits.reduce(\n (acc, rewardSplit) => acc + rewardSplit.glowSplitPercent,\n 0\n );\n const sumOfRewardSplitsUSDGWeight = farm.rewardSplits.reduce(\n (acc, rewardSplit) => acc + rewardSplit.usdgSplitPercent,\n 0\n );\n if (sumOfRewardSplitsGlowWeight !== 1)\n throw new Error(\"Glow weight splits do not add up to 1\");\n if (sumOfRewardSplitsUSDGWeight !== 1)\n throw new Error(\"USDG weight splits do not add up to 1\");\n for (const rewardSplit of farm.rewardSplits) {\n const value = {\n wallet: rewardSplit.walletAddress,\n glowWeight: farm.weeklyPayment * rewardSplit.glowSplitPercent,\n usdgWeight: farm.carbonCreditsProduced * rewardSplit.usdgSplitPercent,\n };\n\n addValueToMap(rewardSplit.walletAddress, value, map);\n }\n // addValueToMap(key, value, map);\n // addValueToMap(installerKey, installerValue, map);\n }\n\n const merkleLeaves = Array.from(map.values());\n const finalLeaves: FinalLeaf[] = merkleLeaves.map(\n ({ wallet, glowWeight, usdgWeight }) => ({\n wallet,\n glowWeight: parseUnits(\n glowWeight.toString(),\n GLOW_WEIGHT_DECIMAL_PRECISION\n ).toString(),\n usdgWeight: parseUnits(\n usdgWeight.toString(),\n USDG_WEIGHT_DECIMAL_PRECISION\n ).toString(),\n })\n );\n const leaves = finalLeaves.map((leaf) =>\n hashLeaf({\n address: leaf.wallet,\n glowWeight: leaf.glowWeight,\n usdcWeight: leaf.usdgWeight,\n })\n );\n\n const tree = new MerkleTree(leaves, ethers.utils.keccak256, { sort: true });\n const root = tree.getHexRoot();\n\n const totalGlowWeightFinalizedLeavesSum = finalLeaves.reduce(\n (acc, { glowWeight }) => acc.add(glowWeight),\n ethers.BigNumber.from(0)\n );\n const totalGCCWeightFinalizedLeavesSum = finalLeaves.reduce(\n (acc, { usdgWeight }) => acc.add(usdgWeight),\n ethers.BigNumber.from(0)\n );\n\n const headlineStats = {\n weekNumber: args.week,\n totalCreditsProduced,\n totalCreditsProducedBN: parseUnits(\n totalCreditsProduced.toString(),\n 18\n ).toString(),\n totalGlowWeightInFinalized: totalGlowWeightFinalizedLeavesSum.toString(),\n totalGlowWeightHuman: formatUnits(\n BigInt(totalGlowWeightFinalizedLeavesSum.toString()),\n GLOW_WEIGHT_DECIMAL_PRECISION\n ).toString(),\n totalUSDGWeightInFinalized: totalGCCWeightFinalizedLeavesSum.toString(),\n totalUSDGWeightHuman: formatUnits(\n BigInt(totalGCCWeightFinalizedLeavesSum.toString()),\n USDG_WEIGHT_DECIMAL_PRECISION\n ).toString(),\n root: root,\n };\n\n const farmsWithMerkleProofs = finalLeaves.map((leaf) => {\n const hashedLeaf = hashLeaf({\n address: leaf.wallet,\n glowWeight: leaf.glowWeight,\n usdcWeight: leaf.usdgWeight,\n });\n const proof = tree.getHexProof(hashedLeaf);\n const isValid = tree.verify(proof, hashedLeaf, root);\n if (!isValid) {\n throw new Error(\"Invalid proof\");\n }\n return {\n ...leaf,\n proof,\n };\n });\n\n //-----------------------------------------------------//\n //-Some invariant tests in case something got messed up//\n //-----------------------------------------------------//\n //Make sure that the sum of all the glow weight is equal to the sum of all the glow weight in the final leaves\n let forLoopedGlowWeightSum: ethers.BigNumber = ethers.BigNumber.from(0);\n for (const farm of farmsWithMerkleProofs) {\n forLoopedGlowWeightSum = forLoopedGlowWeightSum.add(\n BigNumber.from(farm.glowWeight)\n );\n }\n\n if (!forLoopedGlowWeightSum.eq(totalGlowWeightFinalizedLeavesSum)) {\n throw new Error(\"Glow weight sum is not equal\");\n }\n\n //do the same for gcc\n let forLoopedGCCWeightSum: ethers.BigNumber = ethers.BigNumber.from(0);\n for (const farm of farmsWithMerkleProofs) {\n forLoopedGCCWeightSum = forLoopedGCCWeightSum.add(\n BigNumber.from(farm.usdgWeight)\n );\n }\n\n if (!forLoopedGCCWeightSum.eq(totalGCCWeightFinalizedLeavesSum)) {\n throw new Error(\"GCC weight sum is not equal\");\n }\n\n return {\n headlineStats,\n finalLeaves,\n farmsWithMerkleProofs,\n farms,\n rawData,\n };\n}\n"],"names":["ethers","parseUnits","MerkleTree","formatUnits","BigNumber"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare const GENESIS_TIMESTAMP: number;
@@ -1,4 +1,3 @@
1
1
  export * from "./types/index";
2
2
  export * from "./constants/index";
3
3
  export { createWeeklyReport } from "./lib/create-weekly-report/index";
4
- //# sourceMappingURL=index.js.map
@@ -0,0 +1,189 @@
1
+ import { ethers, BigNumber } from 'ethers';
2
+ import { MerkleTree } from 'merkletreejs';
3
+ import { parseUnits, formatUnits } from 'viem';
4
+
5
+ const GENESIS_TIMESTAMP = 1700352000;
6
+
7
+ const leafTypes = ["address", "uint256", "uint256"];
8
+ function hashLeaf({ address, glowWeight, usdcWeight, }) {
9
+ const hash = ethers.utils.solidityKeccak256(leafTypes, [
10
+ address,
11
+ glowWeight,
12
+ usdcWeight,
13
+ ]);
14
+ return hash;
15
+ }
16
+ //
17
+
18
+ /**
19
+ * @dev This is actually not as intuitive as it seems.
20
+ * Glow actually has 18 decimals, but glow weight is based on the amount of protocol fees (USDC) that the farm paid
21
+ * Therefore, the weight is based on the amount of USDC that was paid, which has 6 decimals
22
+ */
23
+ const GLOW_WEIGHT_DECIMAL_PRECISION = 6;
24
+ /**
25
+ * @dev This is actually not as intuitive as it seems.
26
+ * USDG weight is based on the amount of carbon credits produced, but the max value of a weight is ((2*64)-1) / 5 so we need to choose sensible precision to make sure that number never overflows
27
+ */
28
+ const USDG_WEIGHT_DECIMAL_PRECISION = 6;
29
+ // const GCA_URLS = ["http://95.217.194.59:35015"];
30
+ async function getFarmsForWeek(args) {
31
+ const { week: weekNumber, gcaUrls, apiUrl } = args;
32
+ const url = apiUrl;
33
+ // const url = "http://0.0.0.0:3005/headline_farm_stats";
34
+ const body = {
35
+ urls: gcaUrls,
36
+ week_number: weekNumber,
37
+ with_full_data: true,
38
+ include_unassigned_farms: false,
39
+ with_raw_data: true,
40
+ };
41
+ const res = await fetch(url, {
42
+ method: "POST",
43
+ body: JSON.stringify(body),
44
+ headers: {
45
+ "Content-Type": "application/json",
46
+ },
47
+ });
48
+ if (!res.ok) {
49
+ const errorText = await res.text();
50
+ throw new Error(`Failed to fetch farms for week ${weekNumber}: ${errorText || res.statusText}`);
51
+ }
52
+ const _json = await res.json();
53
+ return _json;
54
+ }
55
+ async function createWeeklyReport(args) {
56
+ const map = new Map();
57
+ function addValueToMap(key, value, map) {
58
+ if (map.has(key)) {
59
+ //+= everything
60
+ const existingValue = map.get(key);
61
+ existingValue.glowWeight += value.glowWeight;
62
+ existingValue.usdgWeight += value.usdgWeight;
63
+ map.set(key, existingValue);
64
+ }
65
+ else {
66
+ map.set(key, value);
67
+ }
68
+ }
69
+ const apiResposne = await getFarmsForWeek(args);
70
+ const farms = apiResposne.filteredFarms;
71
+ const rawData = apiResposne.rawData;
72
+ let totalCreditsProduced = 0;
73
+ //log the total farms in farms
74
+ for (const farm of farms) {
75
+ // const {
76
+ // shortId,
77
+ // payoutWallet,
78
+ // installerGlowFeePercent,
79
+ // installerUsdgFeePercent,
80
+ // } = farm;
81
+ // const key = farm.payoutWallet;
82
+ // farm.carbonCreditsProduced =
83
+ farm.status === "Unassigned" ? 0 : farm.carbonCreditsProduced;
84
+ console.log(farm.status);
85
+ if (farm.carbonCreditsProduced < 0) {
86
+ throw new Error("Carbon credits produced is less than 0");
87
+ }
88
+ totalCreditsProduced += farm.carbonCreditsProduced;
89
+ // const value = {
90
+ // wallet: payoutWallet,
91
+ // glowWeight: farm.weeklyPayment * (1 - installerGlowFeePercent),
92
+ // usdgWeight: farm.carbonCreditsProduced * (1 - installerUsdgFeePercent),
93
+ // };
94
+ // const installerKey = farm.installerWallet;
95
+ // const installerValue = {
96
+ // wallet: farm.installerWallet,
97
+ // glowWeight: farm.weeklyPayment * installerGlowFeePercent,
98
+ // usdgWeight: farm.carbonCreditsProduced * installerUsdgFeePercent,
99
+ // };
100
+ if (!farm.rewardSplits)
101
+ throw new Error("No reward splits");
102
+ const sumOfRewardSplitsGlowWeight = farm.rewardSplits.reduce((acc, rewardSplit) => acc + rewardSplit.glowSplitPercent, 0);
103
+ const sumOfRewardSplitsUSDGWeight = farm.rewardSplits.reduce((acc, rewardSplit) => acc + rewardSplit.usdgSplitPercent, 0);
104
+ if (sumOfRewardSplitsGlowWeight !== 1)
105
+ throw new Error("Glow weight splits do not add up to 1");
106
+ if (sumOfRewardSplitsUSDGWeight !== 1)
107
+ throw new Error("USDG weight splits do not add up to 1");
108
+ for (const rewardSplit of farm.rewardSplits) {
109
+ const value = {
110
+ wallet: rewardSplit.walletAddress,
111
+ glowWeight: farm.weeklyPayment * rewardSplit.glowSplitPercent,
112
+ usdgWeight: farm.carbonCreditsProduced * rewardSplit.usdgSplitPercent,
113
+ };
114
+ addValueToMap(rewardSplit.walletAddress, value, map);
115
+ }
116
+ // addValueToMap(key, value, map);
117
+ // addValueToMap(installerKey, installerValue, map);
118
+ }
119
+ const merkleLeaves = Array.from(map.values());
120
+ const finalLeaves = merkleLeaves.map(({ wallet, glowWeight, usdgWeight }) => ({
121
+ wallet,
122
+ glowWeight: parseUnits(glowWeight.toString(), GLOW_WEIGHT_DECIMAL_PRECISION).toString(),
123
+ usdgWeight: parseUnits(usdgWeight.toString(), USDG_WEIGHT_DECIMAL_PRECISION).toString(),
124
+ }));
125
+ const leaves = finalLeaves.map((leaf) => hashLeaf({
126
+ address: leaf.wallet,
127
+ glowWeight: leaf.glowWeight,
128
+ usdcWeight: leaf.usdgWeight,
129
+ }));
130
+ const tree = new MerkleTree(leaves, ethers.utils.keccak256, { sort: true });
131
+ const root = tree.getHexRoot();
132
+ const totalGlowWeightFinalizedLeavesSum = finalLeaves.reduce((acc, { glowWeight }) => acc.add(glowWeight), ethers.BigNumber.from(0));
133
+ const totalGCCWeightFinalizedLeavesSum = finalLeaves.reduce((acc, { usdgWeight }) => acc.add(usdgWeight), ethers.BigNumber.from(0));
134
+ const headlineStats = {
135
+ weekNumber: args.week,
136
+ totalCreditsProduced,
137
+ totalCreditsProducedBN: parseUnits(totalCreditsProduced.toString(), 18).toString(),
138
+ totalGlowWeightInFinalized: totalGlowWeightFinalizedLeavesSum.toString(),
139
+ totalGlowWeightHuman: formatUnits(BigInt(totalGlowWeightFinalizedLeavesSum.toString()), GLOW_WEIGHT_DECIMAL_PRECISION).toString(),
140
+ totalUSDGWeightInFinalized: totalGCCWeightFinalizedLeavesSum.toString(),
141
+ totalUSDGWeightHuman: formatUnits(BigInt(totalGCCWeightFinalizedLeavesSum.toString()), USDG_WEIGHT_DECIMAL_PRECISION).toString(),
142
+ root: root,
143
+ };
144
+ const farmsWithMerkleProofs = finalLeaves.map((leaf) => {
145
+ const hashedLeaf = hashLeaf({
146
+ address: leaf.wallet,
147
+ glowWeight: leaf.glowWeight,
148
+ usdcWeight: leaf.usdgWeight,
149
+ });
150
+ const proof = tree.getHexProof(hashedLeaf);
151
+ const isValid = tree.verify(proof, hashedLeaf, root);
152
+ if (!isValid) {
153
+ throw new Error("Invalid proof");
154
+ }
155
+ return {
156
+ ...leaf,
157
+ proof,
158
+ };
159
+ });
160
+ //-----------------------------------------------------//
161
+ //-Some invariant tests in case something got messed up//
162
+ //-----------------------------------------------------//
163
+ //Make sure that the sum of all the glow weight is equal to the sum of all the glow weight in the final leaves
164
+ let forLoopedGlowWeightSum = ethers.BigNumber.from(0);
165
+ for (const farm of farmsWithMerkleProofs) {
166
+ forLoopedGlowWeightSum = forLoopedGlowWeightSum.add(BigNumber.from(farm.glowWeight));
167
+ }
168
+ if (!forLoopedGlowWeightSum.eq(totalGlowWeightFinalizedLeavesSum)) {
169
+ throw new Error("Glow weight sum is not equal");
170
+ }
171
+ //do the same for gcc
172
+ let forLoopedGCCWeightSum = ethers.BigNumber.from(0);
173
+ for (const farm of farmsWithMerkleProofs) {
174
+ forLoopedGCCWeightSum = forLoopedGCCWeightSum.add(BigNumber.from(farm.usdgWeight));
175
+ }
176
+ if (!forLoopedGCCWeightSum.eq(totalGCCWeightFinalizedLeavesSum)) {
177
+ throw new Error("GCC weight sum is not equal");
178
+ }
179
+ return {
180
+ headlineStats,
181
+ finalLeaves,
182
+ farmsWithMerkleProofs,
183
+ farms,
184
+ rawData,
185
+ };
186
+ }
187
+
188
+ export { GENESIS_TIMESTAMP, createWeeklyReport };
189
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../src/constants/index.ts","../../src/lib/create-weekly-report/utils/hash-leaf.ts","../../src/lib/create-weekly-report/index.ts"],"sourcesContent":["export const GENESIS_TIMESTAMP: number = 1700352000;\n","import { ethers } from \"ethers\";\nconst leafTypes = [\"address\", \"uint256\", \"uint256\"];\n\ntype HashLeafArgs = {\n address: string;\n glowWeight: string;\n usdcWeight: string;\n};\nexport function hashLeaf({\n address,\n glowWeight,\n usdcWeight,\n}: HashLeafArgs): string {\n const hash = ethers.utils.solidityKeccak256(leafTypes, [\n address,\n glowWeight,\n usdcWeight,\n ]);\n return hash;\n}\n\n//\n","import { hashLeaf } from \"./utils/hash-leaf\";\nimport { MerkleTree } from \"merkletreejs\";\nimport { BigNumber, ethers } from \"ethers\";\n\nimport { formatUnits, parseUnits } from \"viem\";\nimport { Farm, GCAServerResponse } from \"../../types\";\n\nexport type ApiRes = {\n filteredFarms: Farm[];\n rawData: GCAServerResponse;\n multiplier: number;\n};\n\nexport type MerkleLeafIntermediary = {\n wallet: string;\n glowWeight: number;\n usdgWeight: number;\n};\n\nexport type FinalLeaf = {\n wallet: string;\n glowWeight: string;\n usdgWeight: string;\n};\n\n/**\n * @dev This is actually not as intuitive as it seems.\n * Glow actually has 18 decimals, but glow weight is based on the amount of protocol fees (USDC) that the farm paid\n * Therefore, the weight is based on the amount of USDC that was paid, which has 6 decimals\n */\nconst GLOW_WEIGHT_DECIMAL_PRECISION = 6;\n\n/**\n * @dev This is actually not as intuitive as it seems.\n * USDG weight is based on the amount of carbon credits produced, but the max value of a weight is ((2*64)-1) / 5 so we need to choose sensible precision to make sure that number never overflows\n */\nconst USDG_WEIGHT_DECIMAL_PRECISION = 6;\nexport type CreateWeeklyReportArgs = {\n week: number;\n gcaUrls: string[];\n apiUrl: string;\n};\n// const GCA_URLS = [\"http://95.217.194.59:35015\"];\nasync function getFarmsForWeek(args: CreateWeeklyReportArgs): Promise<ApiRes> {\n const { week: weekNumber, gcaUrls, apiUrl } = args;\n const url = apiUrl;\n // const url = \"http://0.0.0.0:3005/headline_farm_stats\";\n const body = {\n urls: gcaUrls,\n week_number: weekNumber,\n with_full_data: true,\n include_unassigned_farms: false,\n with_raw_data: true,\n };\n\n const res = await fetch(url, {\n method: \"POST\",\n body: JSON.stringify(body),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n if (!res.ok) {\n const errorText = await res.text();\n throw new Error(\n `Failed to fetch farms for week ${weekNumber}: ${\n errorText || res.statusText\n }`\n );\n }\n const _json = await res.json();\n return _json as ApiRes;\n}\n\nexport async function createWeeklyReport(args: CreateWeeklyReportArgs) {\n const map = new Map<string, MerkleLeafIntermediary>();\n\n function addValueToMap(\n key: string,\n value: MerkleLeafIntermediary,\n map: Map<string, MerkleLeafIntermediary>\n ) {\n if (map.has(key)) {\n //+= everything\n const existingValue = map.get(key)!;\n existingValue.glowWeight += value.glowWeight;\n existingValue.usdgWeight += value.usdgWeight;\n map.set(key, existingValue);\n } else {\n map.set(key, value);\n }\n }\n const apiResposne = await getFarmsForWeek(args);\n const farms = apiResposne.filteredFarms;\n const rawData = apiResposne.rawData;\n let totalCreditsProduced: number = 0;\n //log the total farms in farms\n for (const farm of farms) {\n // const {\n // shortId,\n // payoutWallet,\n // installerGlowFeePercent,\n // installerUsdgFeePercent,\n // } = farm;\n // const key = farm.payoutWallet;\n // farm.carbonCreditsProduced =\n farm.status === \"Unassigned\" ? 0 : farm.carbonCreditsProduced;\n console.log(farm.status);\n if (farm.carbonCreditsProduced < 0) {\n throw new Error(\"Carbon credits produced is less than 0\");\n }\n totalCreditsProduced += farm.carbonCreditsProduced;\n // const value = {\n // wallet: payoutWallet,\n // glowWeight: farm.weeklyPayment * (1 - installerGlowFeePercent),\n // usdgWeight: farm.carbonCreditsProduced * (1 - installerUsdgFeePercent),\n // };\n\n // const installerKey = farm.installerWallet;\n // const installerValue = {\n // wallet: farm.installerWallet,\n // glowWeight: farm.weeklyPayment * installerGlowFeePercent,\n // usdgWeight: farm.carbonCreditsProduced * installerUsdgFeePercent,\n // };\n if (!farm.rewardSplits) throw new Error(\"No reward splits\");\n const sumOfRewardSplitsGlowWeight = farm.rewardSplits.reduce(\n (acc, rewardSplit) => acc + rewardSplit.glowSplitPercent,\n 0\n );\n const sumOfRewardSplitsUSDGWeight = farm.rewardSplits.reduce(\n (acc, rewardSplit) => acc + rewardSplit.usdgSplitPercent,\n 0\n );\n if (sumOfRewardSplitsGlowWeight !== 1)\n throw new Error(\"Glow weight splits do not add up to 1\");\n if (sumOfRewardSplitsUSDGWeight !== 1)\n throw new Error(\"USDG weight splits do not add up to 1\");\n for (const rewardSplit of farm.rewardSplits) {\n const value = {\n wallet: rewardSplit.walletAddress,\n glowWeight: farm.weeklyPayment * rewardSplit.glowSplitPercent,\n usdgWeight: farm.carbonCreditsProduced * rewardSplit.usdgSplitPercent,\n };\n\n addValueToMap(rewardSplit.walletAddress, value, map);\n }\n // addValueToMap(key, value, map);\n // addValueToMap(installerKey, installerValue, map);\n }\n\n const merkleLeaves = Array.from(map.values());\n const finalLeaves: FinalLeaf[] = merkleLeaves.map(\n ({ wallet, glowWeight, usdgWeight }) => ({\n wallet,\n glowWeight: parseUnits(\n glowWeight.toString(),\n GLOW_WEIGHT_DECIMAL_PRECISION\n ).toString(),\n usdgWeight: parseUnits(\n usdgWeight.toString(),\n USDG_WEIGHT_DECIMAL_PRECISION\n ).toString(),\n })\n );\n const leaves = finalLeaves.map((leaf) =>\n hashLeaf({\n address: leaf.wallet,\n glowWeight: leaf.glowWeight,\n usdcWeight: leaf.usdgWeight,\n })\n );\n\n const tree = new MerkleTree(leaves, ethers.utils.keccak256, { sort: true });\n const root = tree.getHexRoot();\n\n const totalGlowWeightFinalizedLeavesSum = finalLeaves.reduce(\n (acc, { glowWeight }) => acc.add(glowWeight),\n ethers.BigNumber.from(0)\n );\n const totalGCCWeightFinalizedLeavesSum = finalLeaves.reduce(\n (acc, { usdgWeight }) => acc.add(usdgWeight),\n ethers.BigNumber.from(0)\n );\n\n const headlineStats = {\n weekNumber: args.week,\n totalCreditsProduced,\n totalCreditsProducedBN: parseUnits(\n totalCreditsProduced.toString(),\n 18\n ).toString(),\n totalGlowWeightInFinalized: totalGlowWeightFinalizedLeavesSum.toString(),\n totalGlowWeightHuman: formatUnits(\n BigInt(totalGlowWeightFinalizedLeavesSum.toString()),\n GLOW_WEIGHT_DECIMAL_PRECISION\n ).toString(),\n totalUSDGWeightInFinalized: totalGCCWeightFinalizedLeavesSum.toString(),\n totalUSDGWeightHuman: formatUnits(\n BigInt(totalGCCWeightFinalizedLeavesSum.toString()),\n USDG_WEIGHT_DECIMAL_PRECISION\n ).toString(),\n root: root,\n };\n\n const farmsWithMerkleProofs = finalLeaves.map((leaf) => {\n const hashedLeaf = hashLeaf({\n address: leaf.wallet,\n glowWeight: leaf.glowWeight,\n usdcWeight: leaf.usdgWeight,\n });\n const proof = tree.getHexProof(hashedLeaf);\n const isValid = tree.verify(proof, hashedLeaf, root);\n if (!isValid) {\n throw new Error(\"Invalid proof\");\n }\n return {\n ...leaf,\n proof,\n };\n });\n\n //-----------------------------------------------------//\n //-Some invariant tests in case something got messed up//\n //-----------------------------------------------------//\n //Make sure that the sum of all the glow weight is equal to the sum of all the glow weight in the final leaves\n let forLoopedGlowWeightSum: ethers.BigNumber = ethers.BigNumber.from(0);\n for (const farm of farmsWithMerkleProofs) {\n forLoopedGlowWeightSum = forLoopedGlowWeightSum.add(\n BigNumber.from(farm.glowWeight)\n );\n }\n\n if (!forLoopedGlowWeightSum.eq(totalGlowWeightFinalizedLeavesSum)) {\n throw new Error(\"Glow weight sum is not equal\");\n }\n\n //do the same for gcc\n let forLoopedGCCWeightSum: ethers.BigNumber = ethers.BigNumber.from(0);\n for (const farm of farmsWithMerkleProofs) {\n forLoopedGCCWeightSum = forLoopedGCCWeightSum.add(\n BigNumber.from(farm.usdgWeight)\n );\n }\n\n if (!forLoopedGCCWeightSum.eq(totalGCCWeightFinalizedLeavesSum)) {\n throw new Error(\"GCC weight sum is not equal\");\n }\n\n return {\n headlineStats,\n finalLeaves,\n farmsWithMerkleProofs,\n farms,\n rawData,\n };\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export interface AuditCompleted {
2
+ week: number;
3
+ }
@@ -0,0 +1,6 @@
1
+ export interface AuditInherited {
2
+ originalAuditCompleteWeek: number;
3
+ oldFarmId: bigint;
4
+ weekAuditWasInherited: number;
5
+ slotRangeActiveInWeekInherited: [number, number];
6
+ }
@@ -0,0 +1,5 @@
1
+ export interface Device {
2
+ PublicKey: Array<number>;
3
+ powerOutputs: Array<number>;
4
+ impactRates: Array<number>;
5
+ }
@@ -0,0 +1,8 @@
1
+ import type { AuditInherited } from "./AuditInherited";
2
+ export interface DuplicatedButPastAuditCompleted {
3
+ weekDuplicated: number;
4
+ slotRangeActiveInWeekDuplicated: [number, number];
5
+ originalWeekAuditCompletedOrInherited: number;
6
+ newFarmId: bigint;
7
+ ifWasAlsoAuditInheritedInOnboardingWeek: AuditInherited | null;
8
+ }
@@ -0,0 +1,20 @@
1
+ import type { FarmStatus } from "./FarmStatus";
2
+ import type { RewardSplits } from "./RewardSplits";
3
+ import type { SlotRange } from "./SlotRange";
4
+ export interface Farm {
5
+ hexlifiedPublicKey: string;
6
+ carbonCreditsProduced: number;
7
+ powerOutputs: Array<number>;
8
+ impactRates: Array<number>;
9
+ weeklyPayment: number;
10
+ rollingImpactPoints: number;
11
+ powerOutput: number;
12
+ shortId: bigint;
13
+ protocolFee: number;
14
+ rewardSplits: RewardSplits | null;
15
+ status: FarmStatus;
16
+ protocolFeePaymentHash: string | null;
17
+ weeksAndSlotRangesToInvertPowerMap: Record<number, Array<SlotRange>> | null;
18
+ weeksAndSlotsToInvalidatePowerMap: Record<number, Array<SlotRange>> | null;
19
+ timestampAuditedComplete: bigint | null;
20
+ }
@@ -0,0 +1,14 @@
1
+ import type { AuditCompleted } from "./AuditCompleted";
2
+ import type { AuditInherited } from "./AuditInherited";
3
+ import type { DuplicatedButPastAuditCompleted } from "./DuplicatedButPastAuditCompleted";
4
+ export type FarmStatus = {
5
+ AuditCompleted: AuditCompleted;
6
+ } | {
7
+ AuditInherited: AuditInherited;
8
+ } | {
9
+ Banned: number;
10
+ } | {
11
+ Duplicate: number;
12
+ } | {
13
+ DuplicateWithPastAuditCompleted: DuplicatedButPastAuditCompleted;
14
+ } | "Unassigned";
@@ -0,0 +1,5 @@
1
+ export type GCAAndServerUrl = {
2
+ gca: `0x${string}`;
3
+ urls: string[];
4
+ notes?: string[];
5
+ };
@@ -0,0 +1,6 @@
1
+ import type { Device } from "./Device";
2
+ export interface GCAServerResponse {
3
+ Devices: Array<Device>;
4
+ TimeslotOffset: bigint;
5
+ signature: Array<number>;
6
+ }
@@ -0,0 +1,5 @@
1
+ export interface GetEquipmentDataHandlerParams {
2
+ url: string;
3
+ weekNumber: number;
4
+ withFullData: boolean | null;
5
+ }
@@ -0,0 +1,17 @@
1
+ import type { FarmStatus } from "./FarmStatus";
2
+ import type { SlotRange } from "./SlotRange";
3
+ export interface PayoutWalletAndSplit {
4
+ short_id: bigint;
5
+ payout_wallet: string;
6
+ auditor: string;
7
+ auditor_percenage_glow_weight: number;
8
+ auditor_percentage_usdc_weight: number;
9
+ glow_weight: number;
10
+ comments: Array<string> | null;
11
+ payment_tx_hash: string | null;
12
+ protocol_fee_paid_week: number;
13
+ status: FarmStatus | null;
14
+ weeks_and_slot_ranges_to_invert_power_map: Record<number, Array<SlotRange>> | null;
15
+ weeks_and_slots_to_invalidate_power_map: Record<number, Array<SlotRange>> | null;
16
+ timestamp_audited_completed: bigint | null;
17
+ }
@@ -0,0 +1,15 @@
1
+ import type { FarmStatus } from "./FarmStatus";
2
+ import type { RewardSplits } from "./RewardSplits";
3
+ import type { SlotRange } from "./SlotRange";
4
+ export interface PayoutWalletAndSplitWithRewardSplits {
5
+ short_id: bigint;
6
+ reward_splits: RewardSplits | null;
7
+ glow_weight: number;
8
+ comments: Array<string> | null;
9
+ payment_tx_hash: string | null;
10
+ protocol_fee_paid_week: number;
11
+ status: FarmStatus | null;
12
+ weeks_and_slot_ranges_to_invert_power_map: Record<number, Array<SlotRange>> | null;
13
+ weeks_and_slots_to_invalidate_power_map: Record<number, Array<SlotRange>> | null;
14
+ timestamp_audited_completed: bigint | null;
15
+ }
@@ -0,0 +1,5 @@
1
+ export interface RewardSplit {
2
+ walletAddress: string;
3
+ glowSplitPercent: number;
4
+ usdgSplitPercent: number;
5
+ }
@@ -0,0 +1,2 @@
1
+ import type { RewardSplit } from "./RewardSplit";
2
+ export type RewardSplits = Array<RewardSplit>;
@@ -0,0 +1,4 @@
1
+ export interface SlotRange {
2
+ start_slot: number;
3
+ end_slot: number;
4
+ }
@@ -0,0 +1,5 @@
1
+ import type { SlotRange } from "./SlotRange";
2
+ export interface WeekAndSlotRange {
3
+ week: number;
4
+ slot_ranges: Array<SlotRange>;
5
+ }
@@ -12,4 +12,3 @@ export * from "./RewardSplit";
12
12
  export * from "./RewardSplits";
13
13
  export * from "./SlotRange";
14
14
  export * from "./WeekAndSlotRange";
15
- //# sourceMappingURL=index.js.map
@@ -0,0 +1,20 @@
1
+ import type { FarmStatus } from "./FarmStatus";
2
+ import type { RewardSplits } from "./RewardSplits";
3
+ import type { SlotRange } from "./SlotRange";
4
+ export interface Farm {
5
+ hexlifiedPublicKey: string;
6
+ carbonCreditsProduced: number;
7
+ powerOutputs: Array<number>;
8
+ impactRates: Array<number>;
9
+ weeklyPayment: number;
10
+ rollingImpactPoints: number;
11
+ powerOutput: number;
12
+ shortId: bigint;
13
+ protocolFee: number;
14
+ rewardSplits: RewardSplits | null;
15
+ status: FarmStatus;
16
+ protocolFeePaymentHash: string | null;
17
+ weeksAndSlotRangesToInvertPowerMap: Record<number, Array<SlotRange>> | null;
18
+ weeksAndSlotsToInvalidatePowerMap: Record<number, Array<SlotRange>> | null;
19
+ timestampAuditedComplete: bigint | null;
20
+ }