Skip to content

Commit 2da66f9

Browse files
committed
feat: add more information to the treasury report
1 parent 6409772 commit 2da66f9

File tree

19 files changed

+253
-117
lines changed

19 files changed

+253
-117
lines changed

.github/workflows/publish.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,15 @@ jobs:
4040
- name: 🍀 Generate .env file
4141
run: |
4242
echo "SPRING_PROFILES_ACTIVE=ci" >> src/test/resources/.env
43+
echo "RUN_MODE=plot" >> src/test/resources/.env
4344
echo "JSON_DATA_SOURCE_FOLDER=./rewards-calculation-test-data" >> src/test/resources/.env
4445
4546
- name: Build
4647
run: |
4748
mvn --batch-mode --update-snapshots clean package -DskipTests && mv target/rewards-*.jar target/rewards-calculation.jar
4849
4950
- name: 📊 Generate plots
50-
run: java -jar target/rewards-calculation.jar --action=plot
51+
run: java -jar target/rewards-calculation.jar
5152

5253
- name: JSON result to js file
5354
run: |

pom.xml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,9 @@
4444
<properties>
4545
<version.java>17</version.java>
4646
<version.lombok>1.18.26</version.lombok>
47-
<version.koios-java-client>1.17.2</version.koios-java-client>
47+
<version.koios-java-client>1.18.1</version.koios-java-client>
4848
<version.spring-boot>3.1.3</version.spring-boot>
49+
<version.spring-dotenv>4.0.0</version.spring-dotenv>
4950
<version.flyway>9.16.0</version.flyway>
5051
<version.h2>2.2.220</version.h2>
5152
<version.jacoco-maven-plugin>0.8.8</version.jacoco-maven-plugin>
@@ -96,7 +97,7 @@
9697
<dependency>
9798
<groupId>me.paulschwarz</groupId>
9899
<artifactId>spring-dotenv</artifactId>
99-
<version>4.0.0</version>
100+
<version>${version.spring-dotenv}</version>
100101
</dependency>
101102

102103
<dependency>

report/index.js

Lines changed: 60 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ window.onload = () => {
1818
connectgaps: true,
1919
line: {
2020
color: '#5C8DFF'
21-
}
21+
}
2222
}
2323

2424
const difference = {
@@ -29,7 +29,7 @@ window.onload = () => {
2929
connectgaps: true,
3030
line: {
3131
color: '#1EC198'
32-
}
32+
}
3333
}
3434

3535
const relativeDifference = {
@@ -40,13 +40,18 @@ window.onload = () => {
4040
connectgaps: true,
4141
line: {
4242
color: '#1EC198'
43-
}
43+
}
4444
}
4545

4646
const lovelaceToAda = (lovelace) => {
4747
return Math.round(lovelace / 1000000);
4848
}
4949

50+
const formatAda = (ada) => {
51+
const amount = ada.toLocaleString();
52+
return `${amount === '-0' ? '0' : amount}₳`;
53+
}
54+
5055
const treasuryCalculationTable = document.getElementById('treasury-calculation-table');
5156

5257
for (const epoch of Object.keys(treasuryCalculationResult)) {
@@ -61,7 +66,7 @@ window.onload = () => {
6166

6267
relativeDifference.x.push(epoch);
6368
relativeDifference.y.push(
64-
Math.round(
69+
epoch === "208" ? 0 : Math.round(
6570
(Math.abs(treasuryCalculationResult[epoch].actualTreasury - treasuryCalculationResult[epoch].calculatedTreasury) /
6671
Math.abs((treasuryCalculationResult[epoch].actualTreasury + treasuryCalculationResult[epoch].calculatedTreasury) / 2) * 100) * 1000) / 1000
6772
);
@@ -70,10 +75,10 @@ window.onload = () => {
7075
const row = document.createElement('tr');
7176
row.innerHTML = `
7277
<td>${epoch}</td>
73-
<td>${lovelaceToAda(treasuryCalculationResult[epoch].actualTreasury)}</td>
74-
<td>${lovelaceToAda(treasuryCalculationResult[epoch].calculatedTreasury)}</td>
75-
<td>${differenceAbsolut}</td>
76-
<td>${Math.round(
78+
<td>${formatAda(lovelaceToAda(treasuryCalculationResult[epoch].actualTreasury))}</td>
79+
<td>${formatAda(lovelaceToAda(treasuryCalculationResult[epoch].calculatedTreasury))}</td>
80+
<td>${formatAda(differenceAbsolut)}</td>
81+
<td>${epoch === "208" ? 0 : Math.round(
7782
(Math.abs(treasuryCalculationResult[epoch].actualTreasury - treasuryCalculationResult[epoch].calculatedTreasury) /
7883
Math.abs((treasuryCalculationResult[epoch].actualTreasury + treasuryCalculationResult[epoch].calculatedTreasury) / 2) * 100) * 1000) / 1000
7984
}%</td>
@@ -87,6 +92,45 @@ window.onload = () => {
8792
treasuryCalculationTable.appendChild(row);
8893
}
8994

95+
const treasuryDevelopmentTable = document.getElementById('treasury-development-table');
96+
97+
let totalAdaAddedToTreasury = 0.0;
98+
let totalAdaWithdrawledFromTreasury = 0.0;
99+
let totalAdaAddedOnTopOfTreasuryCut = 0.0;
100+
101+
for (const epoch of Object.keys(treasuryCalculationResult)) {
102+
const currentEpochTreasury = treasuryCalculationResult[epoch].actualTreasury;
103+
const previousEpochTreasury = treasuryCalculationResult[epoch - 1]?.actualTreasury;
104+
105+
if (previousEpochTreasury === undefined) {
106+
continue;
107+
}
108+
109+
const totalRewardPot = treasuryCalculationResult[epoch].totalRewardPot;
110+
const treasuryWithdrawals = treasuryCalculationResult[epoch].treasuryWithdrawals;
111+
totalAdaWithdrawledFromTreasury += treasuryWithdrawals;
112+
const adaAddedToTreasury = (currentEpochTreasury + treasuryWithdrawals) - previousEpochTreasury;
113+
totalAdaAddedToTreasury += adaAddedToTreasury;
114+
const percentageAddedToTreasury = Math.round(adaAddedToTreasury / totalRewardPot * 100 * 1000) / 1000;
115+
116+
const tauParameter = 0.2;
117+
const treasuryCut = tauParameter * totalRewardPot;
118+
const adaAddedOnTopOfTreasuryCut = adaAddedToTreasury - treasuryCut;
119+
totalAdaAddedOnTopOfTreasuryCut += adaAddedOnTopOfTreasuryCut;
120+
121+
const row = document.createElement('tr');
122+
row.innerHTML = `
123+
<td>${epoch}</td>
124+
<td>${formatAda(lovelaceToAda(adaAddedToTreasury))}</td>
125+
<td>${formatAda(lovelaceToAda(totalRewardPot))}</td>
126+
<td>${percentageAddedToTreasury}%</td>
127+
<td>${formatAda(lovelaceToAda(adaAddedOnTopOfTreasuryCut))}</td>
128+
<td>${formatAda(lovelaceToAda(treasuryWithdrawals))}</td>
129+
`;
130+
131+
treasuryDevelopmentTable.appendChild(row);
132+
}
133+
90134
const layoutAda = {
91135
title: 'Treasury Calculation & Actual Values',
92136
showlegend: false,
@@ -100,7 +144,7 @@ window.onload = () => {
100144
showline: false
101145
}
102146
};
103-
147+
104148
const layoutAdaDifference = {
105149
title: 'Treasury Calculation - Difference in ADA',
106150
showlegend: false,
@@ -134,7 +178,7 @@ window.onload = () => {
134178
Plotly.newPlot('difference-percentage-plot', [relativeDifference], layoutPercentage);
135179

136180
const epochInfo = document.getElementById('epoch-info');
137-
const epochs = Object.keys(treasuryCalculationResult).map((epoch) => Number(epoch));
181+
const epochs = Object.keys(treasuryCalculationResult).map((epoch) => Number(epoch));
138182
const epochStart = Math.min(...epochs);
139183
const epochEnd = Math.max(...epochs);
140184
epochInfo.innerHTML = `Epoch ${epochStart} - ${epochEnd}`;
@@ -156,13 +200,13 @@ window.onload = () => {
156200

157201
const highestAbsolutDifference = Math.max(...difference.y);
158202
const highestAbsolutDifferenceEpoch = difference.x[difference.y.indexOf(highestAbsolutDifference)];
159-
fillCard('highest-absolut-difference', 'Highest absolut difference', `${highestAbsolutDifference}₳`, `Epoch ${highestAbsolutDifferenceEpoch}`);
203+
fillCard('highest-absolut-difference', 'Highest absolut difference', `${highestAbsolutDifference.toLocaleString()}₳`, `Epoch ${highestAbsolutDifferenceEpoch}`);
160204

161205
const averageDifferenceMedian = relativeDifference.y.sort((a, b) => a - b)[Math.round(relativeDifference.y.length / 2)];
162206
fillCard('average-difference-percentage', 'Average relative difference', `${averageDifferenceMedian}%`, 'Median');
163207

164208
const averageAbsolutDifferenceMedian = difference.y.sort((a, b) => a - b)[Math.round(difference.y.length / 2)]
165-
fillCard('average-absolut-difference', 'Average absolut difference', `${averageAbsolutDifferenceMedian}₳`, 'Median');
209+
fillCard('average-absolut-difference', 'Average absolut difference', `${averageAbsolutDifferenceMedian.toLocaleString()}₳`, 'Median');
166210

167211
const absolutDifferences = difference.y.map((difference) => Math.abs(difference));
168212

@@ -175,4 +219,8 @@ window.onload = () => {
175219
fillCard('difference-5k-10k-ADA', 'Difference between 5k₳ and 10k₳', `${absolutDifferences.filter((difference) => difference >= 5000 && difference < 10000).length}`, '');
176220
fillCard('difference-10k-50k-ADA', 'Difference between 10k₳ and 50k₳', `${absolutDifferences.filter((difference) => difference >= 10000 && difference < 50000).length}`, '');
177221
fillCard('difference-above-50k-ADA', 'Difference above 50k₳', `${absolutDifferences.filter((difference) => difference >= 50000).length}`, '');
222+
223+
fillCard('ada-added-to-treasury', 'Total ADA added to treasury', `${formatAda(lovelaceToAda(totalAdaAddedToTreasury))}`, '');
224+
fillCard('ada-withdrawled-from-treasury', 'Total ADA withdrawled from treasury', `${formatAda(lovelaceToAda(totalAdaWithdrawledFromTreasury))}`, '');
225+
fillCard('total-ada-added-on-top-of-treasury-cut', 'Total ADA added on top of treasury cut', `${formatAda(lovelaceToAda(totalAdaAddedOnTopOfTreasuryCut))}`, '');
178226
};

report/treasury_calculation.html

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
<!DOCTYPE html>
22
<html lang="en">
3+
34
<head>
45
<meta charset="utf-8" />
56
<meta name="viewport" content="width=device-width,user-scalable=no,initial-scale=1,maximum-scale=1" />
@@ -77,6 +78,7 @@
7778
table {
7879
border-collapse: collapse;
7980
width: 100%;
81+
overflow: scroll;
8082
text-align: center;
8183
vertical-align: middle;
8284
}
@@ -89,13 +91,13 @@
8991
background-color: #F6C667 !important;
9092
}
9193

92-
td, th {
94+
td,
95+
th {
9396
padding: 8px;
9497
}
9598

9699
.table-container {
97100
width: 100%;
98-
overflow: scroll;
99101
background-color: #fff;
100102
padding: 16px;
101103
border-radius: 12px;
@@ -106,11 +108,12 @@
106108
}
107109
</style>
108110
</head>
111+
109112
<body>
110113
<div id="content">
111114
<h2>Treasury Calculation Report</h2>
112115
<h4 id="epoch-info"></h4>
113-
<div class="cards" >
116+
<div class="cards">
114117
<div class="card" id="highest-difference-percentage"></div>
115118
<div class="card" id="average-difference-percentage"></div>
116119
<div class="card" id="highest-absolut-difference"></div>
@@ -147,7 +150,32 @@ <h4 id="epoch-info"></h4>
147150
</table>
148151
</div>
149152

150-
<footer></footer>
151-
</div>
153+
<h3>Treasury Development</h3>
154+
155+
<div class="table-container">
156+
<table>
157+
<thead>
158+
<tr>
159+
<th>Epoch</th>
160+
<th>ADA Added to Treasury</th>
161+
<th>Total Rewards Pot Size</th>
162+
<th>% Added to Treasury from Total Rewards Pot</th>
163+
<th>ADA Added on Top of Treasury Cut (PoolReap, etc.)</th>
164+
<th>ADA Removed from Treasury (MIR Cert)</th>
165+
</tr>
166+
</thead>
167+
<tbody id="treasury-development-table">
168+
</tbody>
169+
</table>
170+
171+
<footer></footer>
172+
</div>
173+
174+
<div class="cards">
175+
<div class="card" id="ada-added-to-treasury"></div>
176+
<div class="card" id="ada-withdrawled-from-treasury"></div>
177+
<div class="card" id="total-ada-added-on-top-of-treasury-cut"></div>
178+
</div>
152179
</body>
180+
153181
</html>

report/treasury_calculation_result.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 57 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package org.cardanofoundation.rewards;
22

3-
import org.cardanofoundation.rewards.data.fetcher.DataFetcher;
43
import org.cardanofoundation.rewards.data.fetcher.DbSyncDataFetcher;
54
import org.cardanofoundation.rewards.data.fetcher.KoiosDataFetcher;
65
import org.cardanofoundation.rewards.data.plotter.JsonDataPlotter;
6+
import org.checkerframework.checker.units.qual.A;
77
import org.slf4j.Logger;
88
import org.slf4j.LoggerFactory;
99
import org.springframework.beans.factory.annotation.Autowired;
@@ -25,50 +25,73 @@
2525
public class RewardsApplication implements ApplicationRunner {
2626
private static final Logger logger = LoggerFactory.getLogger(RewardsApplication.class);
2727

28+
@Value("${application.run.mode}")
29+
private String runMode;
30+
31+
@Value("${application.fetch.override}")
32+
private boolean overrideFetchedData;
33+
34+
@Value("${spring.profiles.active:Unknown}")
35+
private String activeProfiles;
36+
37+
@Value("${json.data-provider.source}")
38+
private String sourceFolder;
39+
2840
@Autowired
2941
private ApplicationContext context;
3042

43+
@Autowired
44+
private JsonDataPlotter jsonDataPlotter;
45+
46+
@Autowired
47+
private KoiosDataFetcher koiosDataFetcher;
48+
49+
@Autowired
50+
private DbSyncDataFetcher dbSyncDataFetcher;
51+
3152
public static void main(String[] args) {
3253
SpringApplication.run(RewardsApplication.class, args);
3354
}
3455

3556
@Override
3657
public void run(ApplicationArguments args) throws Exception {
37-
for (String name : args.getOptionNames()) {
38-
if (name.equals("action")) {
39-
List<String> action = args.getOptionValues("action");
40-
if (action == null || action.isEmpty()) {
41-
logger.warn("No action specified. Example usage: --action=fetch --override");
42-
int exitCode = SpringApplication.exit(context, (ExitCodeGenerator) () -> 0);
43-
System.exit(exitCode);
44-
}
45-
46-
if (action.get(0).equals("fetch")) {
47-
boolean override = args.containsOption("override");
48-
KoiosDataFetcher dataFetcher = new KoiosDataFetcher();
49-
DbSyncDataFetcher dbSyncDataFetcher = new DbSyncDataFetcher();
50-
for (int epoch = 208; epoch < 460; epoch++) {
51-
logger.info("Fetching data for epoch " + epoch);
52-
dataFetcher.fetch(epoch, override);
53-
dbSyncDataFetcher.fetch(epoch, override);
58+
59+
if (runMode == null) {
60+
logger.warn("No run mode specified. Set the environment variable RUN_MODE in your .env file to 'fetch' or 'plot' or 'test'");
61+
int exitCode = SpringApplication.exit(context, (ExitCodeGenerator) () -> 0);
62+
System.exit(exitCode);
63+
}
64+
65+
int startEpoch = 208;
66+
int endEpoch = 464;
67+
68+
if (runMode.equals("fetch")) {
69+
boolean override = overrideFetchedData;
70+
logger.info("Override fetched data: " + override);
71+
72+
if (activeProfiles.contains("db-sync")) {
73+
logger.info("DB Sync data provider is active. Fetching data from DB Sync...");
74+
75+
for (int epoch = startEpoch; epoch < endEpoch; epoch++) {
76+
logger.info("Fetching data for epoch with the DB sync data provider " + epoch);
77+
dbSyncDataFetcher.fetch(epoch, override);
78+
}
79+
}
80+
81+
for (int epoch = startEpoch; epoch < endEpoch; epoch++) {
82+
logger.info("Fetching data for epoch with the Koios data provider " + epoch);
83+
koiosDataFetcher.fetch(epoch, override);
5484
}
55-
} else if (action.get(0).equals("plot")) {
56-
int epochStart = 210;
57-
int epochEnd = 460;
58-
JsonDataPlotter dataPlotter = new JsonDataPlotter();
59-
dataPlotter.plot(epochStart, epochEnd);
60-
} else {
61-
logger.warn("Unknown action: " + action.get(0));
62-
}
63-
} else {
64-
logger.warn("Unknown option: " + name);
85+
} else if (runMode.equals("plot")) {
86+
jsonDataPlotter.plot(startEpoch, endEpoch);
87+
} else if (!runMode.equals("test")) {
88+
logger.warn("Unknown run mode: " + runMode);
6589
}
66-
}
6790

68-
if (!args.getOptionNames().isEmpty()) {
69-
logger.warn("Finished actions. Exiting...");
70-
int exitCode = SpringApplication.exit(context, () -> 0);
71-
System.exit(exitCode);
72-
}
91+
if (!runMode.equals("test")) {
92+
logger.info("Done. Exiting...");
93+
int exitCode = SpringApplication.exit(context, () -> 0);
94+
System.exit(exitCode);
95+
}
7396
}
7497
}

0 commit comments

Comments
 (0)