@@ -48,7 +48,7 @@ class PulseMetricService(
48
48
private val validatorService : ValidatorService ,
49
49
private val pricingService : PricingService ,
50
50
private val assetService : AssetService ,
51
- private val exchangeGrpcClient : ExchangeGrpcClient
51
+ private val exchangeGrpcClient : ExchangeGrpcClient ,
52
52
) {
53
53
protected val logger = logger(PulseMetricService ::class )
54
54
@@ -69,6 +69,11 @@ class PulseMetricService(
69
69
maximumSize(100 )
70
70
}.build()
71
71
72
+ /* so it turns out that the `usd` in metadata nav events
73
+ use 3 decimal places - :|
74
+ */
75
+ private val scopeNAVDecimal = inversePowerOfTen(3 )
76
+
72
77
val base = UTILITY_TOKEN
73
78
val quote = USD_UPPER
74
79
@@ -264,9 +269,9 @@ class PulseMetricService(
264
269
* Uses metadata module reported values to calculate receivables since
265
270
* all data in metadata today is loan receivables
266
271
*/
267
- private fun pulseReceivableValue (): PulseMetric =
272
+ private fun pulseTodaysNavs (): PulseMetric =
268
273
fetchOrBuildCacheFromDataSource(
269
- type = PulseCacheType .PULSE_RECEIVABLES_METRIC
274
+ type = PulseCacheType .PULSE_TODAYS_NAV_METRIC
270
275
) { // TODO technically correct assuming only metadata nav events are receivables
271
276
NavEventsRecord .getNavEvents(
272
277
fromDate = LocalDateTime .now().startOfDay(),
@@ -278,16 +283,48 @@ class PulseMetricService(
278
283
it.scopeId
279
284
}
280
285
.sumOf { it.priceAmount!! }.toBigDecimal().let {
281
- /* so it turns out that the `usd` in metadata nav events
282
- use 3 decimal places - :|
283
- */
284
286
PulseMetric .build(
285
287
base = USD_UPPER ,
286
- amount = it.times(inversePowerOfTen(3 ))
288
+ amount = it.times(scopeNAVDecimal)
289
+ )
290
+ }
291
+ }
292
+
293
+ private fun dailyNavDecrease (): PulseMetric =
294
+ fetchOrBuildCacheFromDataSource(
295
+ type = PulseCacheType .PULSE_NAV_DECREASE_METRIC
296
+ ) {
297
+ val today = LocalDateTime .now().startOfDay()
298
+ NavEventsRecord .navPricesBetweenDays(
299
+ startDateTime = today.minusDays(1 ),
300
+ endDateTime = today
301
+ ).map {
302
+ val currentAmount = BigDecimal (it[" current_amount" ].toString())
303
+ val previousAmount = BigDecimal (it[" previous_amount" ].toString())
304
+ val changeAmount = previousAmount.minus(currentAmount)
305
+
306
+ Triple (currentAmount, previousAmount, changeAmount)
307
+ }.filter { it.third >= BigDecimal .ZERO }
308
+ .sumOf { it.third }.let {
309
+ PulseMetric .build(
310
+ base = USD_UPPER ,
311
+ amount = it.times(scopeNAVDecimal)
287
312
)
288
313
}
289
314
}
290
315
316
+ private fun totalMetadataNavs (): PulseMetric =
317
+ fetchOrBuildCacheFromDataSource(
318
+ type = PulseCacheType .PULSE_TOTAL_NAV_METRIC
319
+ ) {
320
+ NavEventsRecord .totalMetadataNavs().let {
321
+ PulseMetric .build(
322
+ base = USD_UPPER ,
323
+ amount = it.times(scopeNAVDecimal)
324
+ )
325
+ }
326
+ }
327
+
291
328
/* *
292
329
* Retrieves the transaction volume for the last 30 days to build
293
330
* metric chart data
@@ -510,7 +547,11 @@ class PulseMetricService(
510
547
PulseCacheType .HASH_SUPPLY_METRIC -> hashMetric(type)
511
548
PulseCacheType .PULSE_MARKET_CAP_METRIC -> pulseMarketCap()
512
549
PulseCacheType .PULSE_TRANSACTION_VOLUME_METRIC -> transactionVolume()
513
- PulseCacheType .PULSE_RECEIVABLES_METRIC -> pulseReceivableValue()
550
+
551
+ PulseCacheType .PULSE_TODAYS_NAV_METRIC -> pulseTodaysNavs()
552
+ PulseCacheType .PULSE_NAV_DECREASE_METRIC -> dailyNavDecrease()
553
+ PulseCacheType .PULSE_TOTAL_NAV_METRIC -> totalMetadataNavs()
554
+
514
555
PulseCacheType .PULSE_TRADE_SETTLEMENT_METRIC -> pulseTradesSettled()
515
556
PulseCacheType .PULSE_TRADE_VALUE_SETTLED_METRIC -> pulseTradeValueSettled()
516
557
PulseCacheType .PULSE_PARTICIPANTS_METRIC -> totalParticipants()
0 commit comments