diff --git a/Frontend/BackgroundServices/PrometheusService.cs b/Frontend/BackgroundServices/PrometheusService.cs index 677f6dd2fac3e8cf5a7d8babc25808a090b8e8f4..2dd0336c626ac79c82d0838c45f84b1592b50163 100644 --- a/Frontend/BackgroundServices/PrometheusService.cs +++ b/Frontend/BackgroundServices/PrometheusService.cs @@ -25,7 +25,8 @@ public class PrometheusService : BackgroundService Web3 web3, Account account, PotatoStorageMetrics potatoStorageMetrics, - PotatoMarketplaceMetrics potatoMarketplaceMetrics + PotatoMarketplaceMetrics potatoMarketplaceMetrics, + RebalancerMetrics rebalancerMetrics ) { _logger = logger; @@ -43,6 +44,7 @@ public class PrometheusService : BackgroundService potatoMarketplaceMetrics.CreateMetrics(); PoolV3Client poolClient = new(web3, chainSettings, account); _poolMetrics.CreateMetrics(poolClient); + rebalancerMetrics.CreateMetrics(); } protected async override Task ExecuteAsync(CancellationToken stoppingToken) diff --git a/Frontend/Metrics/RebalancerMetrics.cs b/Frontend/Metrics/RebalancerMetrics.cs new file mode 100644 index 0000000000000000000000000000000000000000..aa8976dcfd7a900105404932a51bb1696b2c88d3 --- /dev/null +++ b/Frontend/Metrics/RebalancerMetrics.cs @@ -0,0 +1,20 @@ +using System.Diagnostics.Metrics; +using Frontend.Marketplaces.Interfaces; + +namespace Frontend.Metrics; + +public class RebalancerMetrics( + Rebalancer rebalancer, + IMeterFactory meterFactory +){ + private readonly Rebalancer rebalancer = rebalancer; + private readonly IMeterFactory MeterFactory = meterFactory; + + public void CreateMetrics() + { + var meter = MeterFactory.Create("RoestiCoin"); + meter.CreateObservableGauge("Rebalancer.TradeExecutedCount", () => (int)rebalancer.RebalanceTradeExecutedCount, unit: "count"); + meter.CreateObservableGauge("Rebalancer.Reserves.ROC", () => (double)rebalancer.Token0Reserve().Result, unit: "ROC"); + meter.CreateObservableGauge("Rebalancer.Reserves.ETH", () => (double)rebalancer.Token1Reserve().Result, unit: "ETH"); + } +} \ No newline at end of file diff --git a/Frontend/Program.cs b/Frontend/Program.cs index 2699c933d8ca82501ce12cba028d380d46d65f27..7dbadc8118a1b9817cb561d0cc929ddb80bb12cf 100644 --- a/Frontend/Program.cs +++ b/Frontend/Program.cs @@ -43,6 +43,7 @@ builder.Services.AddHostedService<PrometheusService>(); builder.Services.AddSingleton<Erc20TokenMetrics>(); builder.Services.AddSingleton<PotatoStorageMetrics>(); builder.Services.AddSingleton<PotatoMarketplaceMetrics>(); +builder.Services.AddSingleton<RebalancerMetrics>(); Account account = new Account( accountPrivateKey, diff --git a/Frontend/Rebalancer.cs b/Frontend/Rebalancer.cs index 751afc01b3cb35a972549d12e7c500b09f037dc3..2f57019f987a3259cca134ffa0957c4373e4802b 100644 --- a/Frontend/Rebalancer.cs +++ b/Frontend/Rebalancer.cs @@ -51,6 +51,7 @@ public class Rebalancer _potatoStorage = potatoStorage; } + public async Task<decimal> GetPoolPriceAsync() { @@ -85,11 +86,10 @@ public class Rebalancer public async Task MaintainLiquidReservesAsync() { - var token0WeiReserve = await _token0Client.BalanceOf(_account.Address); - var token1WeiReserve = await _token1Client.BalanceOf(_account.Address); + var token0Reserve = await Token0Reserve(); var meanPoolPrice = await GetPoolPriceAsync(); - var token0ReservesInToken1 = Web3.Convert.FromWei(token0WeiReserve) * meanPoolPrice; - var token1Reserve = Web3.Convert.FromWei(token1WeiReserve); + var token0ReservesInToken1 = token0Reserve * meanPoolPrice; + var token1Reserve = await Token1Reserve(); if (token0ReservesInToken1 / token1Reserve > 2) // token0 is ROC , token1 is WETH, our reserves in ROC are twice as big as in WETH { _logger.LogDebug("Must rebalance reserves: Token0 reserves {}(expressed in token1), Token1 reserves {}(expressed in token1)", token0ReservesInToken1, token1Reserve); @@ -129,7 +129,7 @@ public class Rebalancer { var rwaSupply = (decimal)_potatoStorage.SupplyWeight(); var tokenSupply = await _token0Client.TotalSupply(); - var tokenReserve = Web3.Convert.FromWei(await _token0Client.BalanceOf(_account.Address)); + var tokenReserve = await Token0Reserve(); if(Math.Abs(rwaSupply-tokenSupply) < EPSIOLON){ _logger.LogDebug("Token supply matches RWA supply"); @@ -156,4 +156,14 @@ public class Rebalancer } } + + public async Task<decimal> Token0Reserve() + { + return Web3.Convert.FromWei(await _token0Client.BalanceOf(_account.Address)); + } + + public async Task<decimal> Token1Reserve() + { + return Web3.Convert.FromWei(await _token1Client.BalanceOf(_account.Address)); + } } diff --git a/grafana/dashboards/totalSupply.json b/grafana/dashboards/totalSupply.json index f2893371d02b437b4e790af6d2f65189aa5b0185..8b02d01c0cba88df6609f4de068359392baf2817 100644 --- a/grafana/dashboards/totalSupply.json +++ b/grafana/dashboards/totalSupply.json @@ -536,6 +536,87 @@ "title": "Available Potatos [kg] per ROC", "type": "timeseries" }, + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "description": "Shows the distribution of the reserves to rebalance the pool price", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + } + }, + "mappings": [], + "unit": "currencyCHF" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 12, + "y": 15 + }, + "id": 11, + "options": { + "displayLabels": [ + "percent" + ], + "legend": { + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "pieType": "pie", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.3.0+security-01", + "targets": [ + { + "editorMode": "code", + "exemplar": false, + "expr": "Rebalancer_Reserves_ROC*Uniswap_ROCWETH_price_WETH_per_ROC*Marketplace_Ethereum_Price_CHF", + "instant": true, + "legendFormat": "Reserves ROC", + "range": false, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "editorMode": "code", + "exemplar": false, + "expr": "Rebalancer_Reserves_ETH*Marketplace_Ethereum_Price_CHF", + "hide": false, + "instant": true, + "legendFormat": "Reserves (W)ETH", + "range": false, + "refId": "B" + } + ], + "title": "Rebalancer Reserves", + "type": "piechart" + }, { "datasource": { "type": "prometheus",