From dbc15322e7167e11ee7c749b9b878e6022cc7b7a Mon Sep 17 00:00:00 2001 From: TWloYWkgQm9kbmFyaXU= Date: Mon, 31 Jul 2023 11:21:43 +0300 Subject: [PATCH] Feat: Apply migration to vemnde (#75) * feat: apply migration to vemnde * fix: change localhost url * fix: deprecate mnde * fix: check if voted validator is eligible * Update scripts/scoring.R Co-authored-by: janlegner <32453746+janlegner@users.noreply.github.com> * fix: update reports_scoring --------- Co-authored-by: janlegner <32453746+janlegner@users.noreply.github.com> --- api.md | 6 +- api/src/handlers/admin_score_upload.rs | 5 +- api/src/handlers/cluster_stats.rs | 7 +- api/src/handlers/list_validators.rs | 2 - api/src/handlers/reports_scoring.rs | 35 ++++- api/src/handlers/reports_staking.rs | 6 +- api/src/handlers/unstake_hints.rs | 7 +- api/src/handlers/validator_score_breakdown.rs | 23 +++- .../handlers/validator_score_breakdowns.rs | 9 +- collect/src/marinade_service.rs | 59 +-------- collect/src/validators.rs | 18 --- migrations/0002-scores.sql | 4 +- migrations/0007-scores-msol-votes.sql | 2 + scripts/scoring-fetch-inputs.bash | 16 ++- scripts/scoring-report.Rmd | 16 +-- scripts/scoring-run.bash | 3 +- scripts/scoring-summary.Rmd | 8 +- scripts/scoring.R | 122 ++++++++++-------- store/src/dto.rs | 19 ++- store/src/lib.rs | 2 +- store/src/scoring.rs | 16 ++- store/src/utils.rs | 34 ++--- store/src/validators.rs | 6 - 23 files changed, 205 insertions(+), 220 deletions(-) create mode 100644 migrations/0007-scores-msol-votes.sql diff --git a/api.md b/api.md index 93855e3..6e7fa5b 100644 --- a/api.md +++ b/api.md @@ -43,7 +43,6 @@ curl -sfLS 'localhost:8000/validators?limit=1&offset=0' | jq "commission_effective": null, "commission_aggregated": null, "version": "1.13.5", - "mnde_votes": "0", "activated_stake": "9488392700088216", "marinade_stake": "0", "decentralizer_stake": "0", @@ -59,7 +58,6 @@ curl -sfLS 'localhost:8000/validators?limit=1&offset=0' | jq "commission_advertised": 8, "commission_effective": null, "version": "1.13.5", - "mnde_votes": 0, "activated_stake": 9488392700088216, "marinade_stake": 0, "decentralizer_stake": 0, @@ -356,10 +354,10 @@ curl -sfLS 'localhost:8000/validators/score-breakdown?query_vote_account=DumiCKH "DC_CONCENTRATION" ], "eligible_stake_algo": true, - "eligible_stake_mnde": true, + "eligible_stake_vemnde": true, "eligible_stake_msol": true, "target_stake_algo": 0, - "target_stake_mnde": 0, + "target_stake_vemnde": 0, "target_stake_msol": 1214035, "scoring_run_id": 4, "created_at": "2023-03-03T06:23:00.734614Z", diff --git a/api/src/handlers/admin_score_upload.rs b/api/src/handlers/admin_score_upload.rs index 4fa0537..6ed07d9 100644 --- a/api/src/handlers/admin_score_upload.rs +++ b/api/src/handlers/admin_score_upload.rs @@ -126,7 +126,10 @@ pub async fn handler( .await; Ok(match result { - Ok(_) => warp::reply::with_status(json(&ResponseAdminScoreUpload { rows_processed }), StatusCode::OK), + Ok(_) => warp::reply::with_status( + json(&ResponseAdminScoreUpload { rows_processed }), + StatusCode::OK, + ), Err(err) => { log::error!("Failed to store the scoring: {}", err); response_error_500("Failed to store the scoring!".into()) diff --git a/api/src/handlers/cluster_stats.rs b/api/src/handlers/cluster_stats.rs index 5e12f61..935c84f 100644 --- a/api/src/handlers/cluster_stats.rs +++ b/api/src/handlers/cluster_stats.rs @@ -42,9 +42,10 @@ pub async fn handler( .get_cluster_stats(query_params.epochs.unwrap_or(DEFAULT_EPOCHS)); Ok(match cluster_stats { - Some(cluster_stats) => { - warp::reply::with_status(json(&ResponseClusterStats { cluster_stats }), StatusCode::OK) - } + Some(cluster_stats) => warp::reply::with_status( + json(&ResponseClusterStats { cluster_stats }), + StatusCode::OK, + ), _ => { error!("No cluster stats found"); response_error(StatusCode::NOT_FOUND, "Failed to fetch records!".into()) diff --git a/api/src/handlers/list_validators.rs b/api/src/handlers/list_validators.rs index 6c675ab..35d8e64 100644 --- a/api/src/handlers/list_validators.rs +++ b/api/src/handlers/list_validators.rs @@ -45,7 +45,6 @@ pub struct QueryParams { #[derive(Deserialize, Serialize, Debug)] pub enum OrderField { Stake, - MndeVotes, Credits, MarinadeScore, Apy, @@ -116,7 +115,6 @@ pub async fn get_validators( fn get_field_extractor(order_field: OrderField) -> Box Decimal> { match order_field { OrderField::Stake => Box::new(|a: &ValidatorRecord| a.activated_stake), - OrderField::MndeVotes => Box::new(|a: &ValidatorRecord| a.mnde_votes.unwrap_or(0.into())), OrderField::Credits => Box::new(|a: &ValidatorRecord| Decimal::from(a.credits)), OrderField::MarinadeScore => { Box::new(|a: &ValidatorRecord| Decimal::from(to_fixed_for_sort(a.score.unwrap_or(0.0)))) diff --git a/api/src/handlers/reports_scoring.rs b/api/src/handlers/reports_scoring.rs index 5e54807..745809f 100644 --- a/api/src/handlers/reports_scoring.rs +++ b/api/src/handlers/reports_scoring.rs @@ -46,6 +46,33 @@ fn md_pre_msol_votes(ui_id: &String) -> String { ", ui_id, ui_id, ui_id, ui_id, ui_id, ui_id) } +fn md_pre_vemnde_votes(ui_id: &String) -> String { + format!( + "# Report {}\n\ + - [HTML report](https://validators-api-dev.marinade.finance/reports/scoring/{})\n\ + - [CSV Scores](https://raw.githubusercontent.com/marinade-finance/delegation-strategy-pipeline/master/scoring/{}/scores.csv)\n\ + ## Reproduce the results\n\ + Get the source data:\n\ + ```bash\n\ + mkdir -p \"scoring-{}\"\n\ + cd \"scoring-{}\"\n\ + wget --base \"https://raw.githubusercontent.com/marinade-finance/delegation-strategy-pipeline/master/scoring/{}/\" \ + --input-file - --no-clobber <<<$'validators.csv\nmsol-votes.csv\nparams.env\nblacklist.csv'\n\ + ```\n\ + Install dependencies for R (assumes you have R installed already):\n\ + ```bash\n\ + bash -c \"$(curl -sSfL https://raw.githubusercontent.com/marinade-finance/delegation-strategy-2/master/scripts/scoring-install.bash)\"\n\ + ```\n\ + Generate scores:\n\ + ```bash\n\ + wget https://raw.githubusercontent.com/marinade-finance/delegation-strategy-2/7c51106/scripts/scoring.R\n\ + export SCORING_WORKING_DIRECTORY=.\n\ + export SCORING_R=./scoring.R\n\ + bash -c \"$(curl -sSfL https://raw.githubusercontent.com/marinade-finance/delegation-strategy-2/7c51106/scripts/scoring-run.bash)\"\n\ + ```\n\ + ", ui_id, ui_id, ui_id, ui_id, ui_id, ui_id) +} + fn md_latest(ui_id: &String) -> String { format!( "# Report {}\n\ @@ -76,7 +103,13 @@ fn md_latest(ui_id: &String) -> String { fn scoring_run_to_report(scoring_run: ScoringRunRecord) -> Report { Report { created_at: scoring_run.created_at, - md: if scoring_run.epoch < 500 { md_pre_msol_votes(&scoring_run.ui_id) } else { md_latest(&scoring_run.ui_id) }, + md: if scoring_run.epoch < 454 { + md_pre_msol_votes(&scoring_run.ui_id) + } else if scoring_run.epoch < 481 { + md_pre_vemnde_votes(&scoring_run.ui_id) + } else { + md_latest(&scoring_run.ui_id) + }, } } diff --git a/api/src/handlers/reports_staking.rs b/api/src/handlers/reports_staking.rs index bcc8aa5..937fed7 100644 --- a/api/src/handlers/reports_staking.rs +++ b/api/src/handlers/reports_staking.rs @@ -1,7 +1,7 @@ use crate::{ cache::CachedSingleRunScores, context::WrappedContext, metrics, utils::response_error, }; -use log::{error, info}; +use log::{error, info, warn}; use serde::Serialize; use solana_program::native_token::LAMPORTS_PER_SOL; use store::utils::get_last_epoch; @@ -59,7 +59,7 @@ async fn get_planned_stakes(context: WrappedContext) -> anyhow::Result { @@ -86,7 +86,7 @@ async fn get_planned_stakes(context: WrappedContext) -> anyhow::Result { - error!("Couldn't find info for {} in current epoch", vote_account); + warn!("Couldn't find info for {} in current epoch", vote_account); continue; } } diff --git a/api/src/handlers/unstake_hints.rs b/api/src/handlers/unstake_hints.rs index 1dfb23b..88014f5 100644 --- a/api/src/handlers/unstake_hints.rs +++ b/api/src/handlers/unstake_hints.rs @@ -38,9 +38,10 @@ pub async fn handler( .await; Ok(match unstake_hints { - Ok(unstake_hints) => { - warp::reply::with_status(json(&ResponseUnstakeHints { unstake_hints }), StatusCode::OK) - } + Ok(unstake_hints) => warp::reply::with_status( + json(&ResponseUnstakeHints { unstake_hints }), + StatusCode::OK, + ), Err(err) => { error!("Failed to load unstake hints: {}", err); response_error_500("Failed to load unstake hints!".into()) diff --git a/api/src/handlers/validator_score_breakdown.rs b/api/src/handlers/validator_score_breakdown.rs index 18f42c5..b47715c 100644 --- a/api/src/handlers/validator_score_breakdown.rs +++ b/api/src/handlers/validator_score_breakdown.rs @@ -25,16 +25,21 @@ pub struct ScoreBreakdown { pub min_score_eligible_algo: Option, pub rank: i32, pub ui_hints: Vec, - pub mnde_votes: u64, + pub vemnde_votes: u64, + pub msol_votes: u64, pub component_scores: Vec, pub component_ranks: Vec, pub component_values: Vec>, pub component_weights: Vec, pub components: Vec, pub eligible_stake_algo: bool, + pub eligible_stake_vemnde: bool, + #[deprecated = "Use `eligible_stake_vemnde` instead"] pub eligible_stake_mnde: bool, pub eligible_stake_msol: bool, pub target_stake_algo: u64, + pub target_stake_vemnde: u64, + #[deprecated = "Use `target_stake_vemnde` instead"] pub target_stake_mnde: u64, pub target_stake_msol: u64, pub scoring_run_id: i64, @@ -92,15 +97,16 @@ pub async fn handler( score, rank, ui_hints, - mnde_votes, + vemnde_votes, + msol_votes, component_scores, component_ranks, component_values, eligible_stake_algo, - eligible_stake_mnde, + eligible_stake_vemnde, eligible_stake_msol, target_stake_algo, - target_stake_mnde, + target_stake_vemnde, target_stake_msol, scoring_run_id, created_at, @@ -129,17 +135,20 @@ pub async fn handler( min_score_eligible_algo, rank, ui_hints, - mnde_votes, + vemnde_votes, + msol_votes, component_scores, component_ranks, component_values, component_weights, components, eligible_stake_algo, - eligible_stake_mnde, + eligible_stake_vemnde, + eligible_stake_mnde: eligible_stake_vemnde, eligible_stake_msol, target_stake_algo, - target_stake_mnde, + target_stake_vemnde, + target_stake_mnde: target_stake_vemnde, target_stake_msol, scoring_run_id, created_at, diff --git a/api/src/handlers/validator_score_breakdowns.rs b/api/src/handlers/validator_score_breakdowns.rs index 0012c4e..2d290c3 100644 --- a/api/src/handlers/validator_score_breakdowns.rs +++ b/api/src/handlers/validator_score_breakdowns.rs @@ -184,17 +184,20 @@ fn compute_score_breakdowns( .get(&scoring_run.scoring_run_id) .unwrap(), ui_hints: score.ui_hints.clone(), - mnde_votes: score.mnde_votes, + vemnde_votes: score.vemnde_votes, + msol_votes: score.msol_votes, component_scores: score.component_scores.clone(), component_ranks: score.component_ranks.clone(), component_values: score.component_values.clone(), component_weights: scoring_run.component_weights.clone(), components: scoring_run.components.clone(), eligible_stake_algo: score.eligible_stake_algo, - eligible_stake_mnde: score.eligible_stake_mnde, + eligible_stake_vemnde: score.eligible_stake_vemnde, + eligible_stake_mnde: score.eligible_stake_vemnde, eligible_stake_msol: score.eligible_stake_msol, target_stake_algo: score.target_stake_algo, - target_stake_mnde: score.target_stake_mnde, + target_stake_vemnde: score.target_stake_vemnde, + target_stake_mnde: score.target_stake_vemnde, target_stake_msol: score.target_stake_msol, scoring_run_id: score.scoring_run_id, created_at: score.created_at, diff --git a/collect/src/marinade_service.rs b/collect/src/marinade_service.rs index 0dc9c16..24335b7 100644 --- a/collect/src/marinade_service.rs +++ b/collect/src/marinade_service.rs @@ -1,5 +1,3 @@ -use anchor_lang::prelude::*; -use log::info; use solana_account_decoder::*; use solana_client::{ rpc_client::RpcClient, @@ -105,59 +103,4 @@ fn get_stake_accounts( .iter() .map(|(pubkey, account)| (pubkey.clone(), bincode::deserialize(&account.data).unwrap())) .collect()) -} - -#[derive(Debug, Default, borsh::BorshDeserialize, borsh::BorshSchema)] -pub struct Gauge { - pub gaugemeister: Pubkey, - pub total_weight: u64, - pub vote_count: u64, - pub is_disabled: bool, - // snapshots make reading more flexible and make time of reading predicted (no delays because of inet/cpu) - pub snapshot_time: i64, - pub snapshot_slot: u64, - pub snapshot_total_weight: u64, - pub info: Vec, -} - -impl Gauge { - pub const LEN: usize = 200; -} - -pub fn get_mnde_votes( - rpc_client: &RpcClient, - escrow_relocker: Pubkey, - gauge_meister: Pubkey, -) -> anyhow::Result> { - info!("Getting MNDE votes"); - let accounts = rpc_client.get_program_accounts_with_config( - &escrow_relocker, - RpcProgramAccountsConfig { - filters: Some(vec![RpcFilterType::Memcmp(Memcmp { - offset: 8, - bytes: MemcmpEncodedBytes::Binary(gauge_meister.to_string()), - encoding: None, - })]), - account_config: RpcAccountInfoConfig { - encoding: Some(UiAccountEncoding::Base64), - commitment: Some(rpc_client.commitment()), - min_context_slot: None, - data_slice: None, - }, - with_context: None, - }, - )?; - - let gauges: Vec = accounts - .iter() - .flat_map(|(_, account)| Gauge::deserialize(&mut &account.data[8..])) - .collect(); - - Ok(gauges - .iter() - .flat_map(|gauge| match Pubkey::try_from_slice(&gauge.info) { - Ok(vote_address) => Some((vote_address.to_string(), gauge.total_weight)), - _ => None, - }) - .collect()) -} +} \ No newline at end of file diff --git a/collect/src/validators.rs b/collect/src/validators.rs index 5343013..c6c0380 100644 --- a/collect/src/validators.rs +++ b/collect/src/validators.rs @@ -7,17 +7,10 @@ use crate::whois_service::*; use log::info; use serde::{Deserialize, Serialize}; use solana_sdk::clock::Epoch; -use solana_sdk::pubkey::Pubkey; use structopt::StructOpt; #[derive(Debug, StructOpt)] pub struct ValidatorsOptions { - #[structopt(long = "gauge-meister", help = "Gauge meister of the vote gauges.")] - gauge_meister: Option, - - #[structopt(long = "escrow-relocker", help = "Escrow relocker program address.")] - escrow_relocker: Option, - #[structopt(long = "whois", help = "Base URL for whois API.")] whois: Option, @@ -73,7 +66,6 @@ pub struct ValidatorSnapshot { pub info_url: Option, pub info_details: Option, pub info_keybase: Option, - pub mnde_votes: Option, pub data_center: Option, pub activated_stake: u64, pub marinade_stake: u64, @@ -132,13 +124,6 @@ pub fn collect_validators_info( let decentralizer_stake = get_decentralizer_stakes(&client)?; let validators_info = get_validators_info(&client)?; - let mnde_votes = if let (Some(escrow_relocker), Some(gauge_meister)) = - (options.escrow_relocker, options.gauge_meister) - { - Some(get_mnde_votes(&client, escrow_relocker, gauge_meister)?) - } else { - None - }; let node_ips = get_cluster_nodes_ips(&client)?; let data_centers = match options.whois { @@ -173,9 +158,6 @@ pub fn collect_validators_info( vote_account: vote_pubkey.clone(), identity: identity.clone(), node_ip: data_centers.get(&identity).map(|(ip, _)| ip.clone()), - mnde_votes: mnde_votes - .clone() - .map_or(None, |v| Some(*v.get(&vote_pubkey).unwrap_or(&0))), data_center: data_centers .get(&identity) .map_or(None, |(_ip, data_center)| { diff --git a/migrations/0002-scores.sql b/migrations/0002-scores.sql index 470403c..4aba4c8 100644 --- a/migrations/0002-scores.sql +++ b/migrations/0002-scores.sql @@ -15,10 +15,10 @@ CREATE TABLE "scores" ( "rank" int NOT NULL, "ui_hints" text[] NOT NULL, "eligible_stake_algo" boolean, - "eligible_stake_mnde" boolean, + "eligible_stake_vemnde" boolean, "eligible_stake_msol" boolean, "target_stake_algo" numeric, - "target_stake_mnde" numeric, + "target_stake_vemnde" numeric, "target_stake_msol" numeric, "scoring_run_id" bigint, PRIMARY KEY ("score_id"), diff --git a/migrations/0007-scores-msol-votes.sql b/migrations/0007-scores-msol-votes.sql new file mode 100644 index 0000000..78ca31a --- /dev/null +++ b/migrations/0007-scores-msol-votes.sql @@ -0,0 +1,2 @@ +alter table scores add column "msol_votes" numeric NOT NULL default 0; +alter table scores alter column "msol_votes" drop default; \ No newline at end of file diff --git a/scripts/scoring-fetch-inputs.bash b/scripts/scoring-fetch-inputs.bash index 1abebe8..88cd168 100755 --- a/scripts/scoring-fetch-inputs.bash +++ b/scripts/scoring-fetch-inputs.bash @@ -4,6 +4,8 @@ set -exu file_epoch_info_response="./epoch-info.txt" file_response_tvl="./tvl.txt" +file_response_vemnde_votes="./vemnde-votes.json" +file_parsed_vemnde_votes="./vemnde-votes.csv" file_response_msol_votes="./msol-votes.json" file_parsed_msol_votes="./msol-votes.csv" file_validators="./validators.csv" @@ -20,6 +22,10 @@ TOTAL_STAKE=$(<"$file_response_tvl" jq 'fromjson? | .total_virtual_staked_sol' - echo "Total Stake: $TOTAL_STAKE" +curl -sfLS https://snapshots-api.marinade.finance/v1/votes/vemnde/latest > "$file_response_vemnde_votes" +echo "vote_account,vemnde_votes" > "$file_parsed_vemnde_votes" +jq '.records | group_by(.validatorVoteAccount) | map(.[0].validatorVoteAccount + "," + (map(.amount | tonumber? // 0) | add | tostring)) | join("\n")' -r "$file_response_vemnde_votes" >> "$file_parsed_vemnde_votes" + curl -sfLS https://snapshots-api.marinade.finance/v1/votes/msol/latest > "$file_response_msol_votes" echo "vote_account,msol_votes" > "$file_parsed_msol_votes" jq '.records | group_by(.validatorVoteAccount) | map(.[0].validatorVoteAccount + "," + (map(.amount | tonumber? // 0) | add | tostring)) | join("\n")' -r "$file_response_msol_votes" >> "$file_parsed_msol_votes" @@ -45,9 +51,9 @@ COMPONENT_WEIGHTS=10,1,2 ELIGIBILITY_ALGO_STAKE_MAX_COMMISSION=10 ELIGIBILITY_ALGO_STAKE_MIN_STAKE=1000 -ELIGIBILITY_MNDE_STAKE_MAX_COMMISSION=10 -ELIGIBILITY_MNDE_STAKE_MIN_STAKE=100 -ELIGIBILITY_MNDE_SCORE_THRESHOLD_MULTIPLIER=0.9 +ELIGIBILITY_VEMNDE_STAKE_MAX_COMMISSION=10 +ELIGIBILITY_VEMNDE_STAKE_MIN_STAKE=100 +ELIGIBILITY_VEMNDE_SCORE_THRESHOLD_MULTIPLIER=0.9 ELIGIBILITY_MSOL_STAKE_MAX_COMMISSION=10 ELIGIBILITY_MSOL_STAKE_MIN_STAKE=100 @@ -55,9 +61,9 @@ ELIGIBILITY_MSOL_SCORE_THRESHOLD_MULTIPLIER=0.8 ELIGIBILITY_MIN_VERSION=1.14.18 -MNDE_VALIDATOR_CAP=0.1 +VEMNDE_VALIDATOR_CAP=0.1 -STAKE_CONTROL_MNDE=0.2 +STAKE_CONTROL_VEMNDE=0.2 STAKE_CONTROL_MSOL=0.2 EOF diff --git a/scripts/scoring-report.Rmd b/scripts/scoring-report.Rmd index 75592eb..db73e6a 100644 --- a/scripts/scoring-report.Rmd +++ b/scripts/scoring-report.Rmd @@ -21,24 +21,24 @@ knit_hooks$set(inline = function(x) { # Marinade Scoring Report `r args[2]` ## Overview ```{r, echo=FALSE} -df <- data.frame(type = c("Performance-based stake", "MNDE directed stake", "mSOL directed stake", "", "**Total stake**"), +df <- data.frame(type = c("Performance-based stake", "VeMNDE directed stake", "mSOL directed stake", "", "**Total stake**"), stake = c( sum(validators$target_stake_algo), - sum(validators$target_stake_mnde), + sum(validators$target_stake_vemnde), sum(validators$target_stake_msol), "", sum(validators$target_stake) ), validators = c( sum(validators$target_stake_algo > 0), - sum(validators$target_stake_mnde > 0), + sum(validators$target_stake_vemnde > 0), sum(validators$target_stake_msol > 0), "", sum(validators$target_stake > 0) ), perf = c( round(sum(validators$avg_adjusted_credits * validators$target_stake_algo) / sum(validators$target_stake_algo)), - round(sum(validators$avg_adjusted_credits * validators$target_stake_mnde) / sum(validators$target_stake_mnde)), + round(sum(validators$avg_adjusted_credits * validators$target_stake_vemnde) / sum(validators$target_stake_vemnde)), round(sum(validators$avg_adjusted_credits * validators$target_stake_msol) / sum(validators$target_stake_msol)), "", round(sum(validators$avg_adjusted_credits * validators$target_stake) / sum(validators$target_stake)) @@ -64,7 +64,7 @@ ggplot(df, aes(x=df$x, y=df$avg_adjusted_credits)) + theme_minimal() ``` -The plots below show validators and their scores as calculated by the Delegation Strategy. The plot (A) shows which validators were picked by the performance-based scoring formula. The plot (B) shows which validators were picked by MNDE votes. +The plots below show validators and their scores as calculated by the Delegation Strategy. The plot (A) shows which validators were picked by the performance-based scoring formula. The plot (B) shows which validators were picked by VeMNDE votes. ```{r, echo=FALSE, fig.align="center", fig.width = 10} df <- validators @@ -72,7 +72,7 @@ df$x <- factor(df$vote_account, levels = df$vote_account[order(-df$score)]) df$fill_algo <- ifelse(df$target_stake_algo > 0, "purple", "gray") -df$fill_mnde <- ifelse(df$target_stake_mnde > 0, "purple", "gray") +df$fill_vemnde <- ifelse(df$target_stake_vemnde > 0, "purple", "gray") plot1 <- ggplot(df, aes(x=x, y=score)) + @@ -83,9 +83,9 @@ plot1 <- ggplot(df, aes(x=x, y=score)) + theme_minimal() plot2 <- ggplot(df, aes(x=x, y=score)) + - geom_bar(stat = "identity", width = 1, colour = "transparent", fill = df$fill_mnde) + + geom_bar(stat = "identity", width = 1, colour = "transparent", fill = df$fill_vemnde) + ylim(0, 1) + - labs(title="MNDE voted validators", x = "Validators", y = "Score", tag = "B") + + labs(title="VeMNDE voted validators", x = "Validators", y = "Score", tag = "B") + scale_x_discrete(labels = NULL) + theme_minimal() diff --git a/scripts/scoring-run.bash b/scripts/scoring-run.bash index 2a9dfd2..951f7b8 100755 --- a/scripts/scoring-run.bash +++ b/scripts/scoring-run.bash @@ -15,4 +15,5 @@ Rscript --vanilla "$file_scoring_r" \ "$(realpath "$working_directory/params.env")" \ "$(realpath "$working_directory/blacklist.csv")" \ "$(realpath "$working_directory/validators.csv")" \ - "$(realpath "$working_directory/msol-votes.csv")" + "$(realpath "$working_directory/msol-votes.csv")" \ + "$(realpath "$working_directory/vemnde-votes.csv")" diff --git a/scripts/scoring-summary.Rmd b/scripts/scoring-summary.Rmd index dca3e8e..47b6b77 100644 --- a/scripts/scoring-summary.Rmd +++ b/scripts/scoring-summary.Rmd @@ -12,24 +12,24 @@ validators <- read.csv(args[1]) # Scoring results `r args[2]` ```{r, echo=FALSE} library(knitr) -df <- data.frame(type = c("Performance-based stake", "MNDE directed stake", "mSOL directed stake", "", "**Total stake**"), +df <- data.frame(type = c("Performance-based stake", "VeMNDE directed stake", "mSOL directed stake", "", "**Total stake**"), stake = c( sum(validators$target_stake_algo), - sum(validators$target_stake_mnde), + sum(validators$target_stake_vemnde), sum(validators$target_stake_msol), "", sum(validators$target_stake) ), validators = c( sum(validators$target_stake_algo > 0), - sum(validators$target_stake_mnde > 0), + sum(validators$target_stake_vemnde > 0), sum(validators$target_stake_msol > 0), "", sum(validators$target_stake > 0) ), perf = c( round(sum(validators$avg_adjusted_credits * validators$target_stake_algo) / sum(validators$target_stake_algo)), - round(sum(validators$avg_adjusted_credits * validators$target_stake_mnde) / sum(validators$target_stake_mnde)), + round(sum(validators$avg_adjusted_credits * validators$target_stake_vemnde) / sum(validators$target_stake_vemnde)), round(sum(validators$avg_adjusted_credits * validators$target_stake_msol) / sum(validators$target_stake_msol)), "", round(sum(validators$avg_adjusted_credits * validators$target_stake) / sum(validators$target_stake)) diff --git a/scripts/scoring.R b/scripts/scoring.R index c936e78..9be6c11 100644 --- a/scripts/scoring.R +++ b/scripts/scoring.R @@ -15,6 +15,7 @@ file_params <- args[3] file_blacklist <- args[4] file_validators <- args[5] file_msol_votes <- args[6] +file_vemnde_votes <- args[7] t(data.frame( file_out_scores, @@ -22,9 +23,11 @@ t(data.frame( file_params, file_blacklist, file_validators, - file_msol_votes + file_msol_votes, + file_vemnde_votes )) +vemnde_votes <- read.csv(file_vemnde_votes) msol_votes <- read.csv(file_msol_votes) validators <- read.csv(file_validators) blacklist <- read.csv(file_blacklist) @@ -41,9 +44,9 @@ WEIGHT_DC_CONCENTRATION <- as.numeric(Sys.getenv("WEIGHT_DC_CONCENTRATION")) ELIGIBILITY_ALGO_STAKE_MAX_COMMISSION <- as.numeric(Sys.getenv("ELIGIBILITY_ALGO_STAKE_MAX_COMMISSION")) ELIGIBILITY_ALGO_STAKE_MIN_STAKE <- as.numeric(Sys.getenv("ELIGIBILITY_ALGO_STAKE_MIN_STAKE")) -ELIGIBILITY_MNDE_STAKE_MAX_COMMISSION <- as.numeric(Sys.getenv("ELIGIBILITY_MNDE_STAKE_MAX_COMMISSION")) -ELIGIBILITY_MNDE_STAKE_MIN_STAKE <- as.numeric(Sys.getenv("ELIGIBILITY_MNDE_STAKE_MIN_STAKE")) -ELIGIBILITY_MNDE_SCORE_THRESHOLD_MULTIPLIER <- as.numeric(Sys.getenv("ELIGIBILITY_MNDE_SCORE_THRESHOLD_MULTIPLIER")) +ELIGIBILITY_VEMNDE_STAKE_MAX_COMMISSION <- as.numeric(Sys.getenv("ELIGIBILITY_VEMNDE_STAKE_MAX_COMMISSION")) +ELIGIBILITY_VEMNDE_STAKE_MIN_STAKE <- as.numeric(Sys.getenv("ELIGIBILITY_VEMNDE_STAKE_MIN_STAKE")) +ELIGIBILITY_VEMNDE_SCORE_THRESHOLD_MULTIPLIER <- as.numeric(Sys.getenv("ELIGIBILITY_VEMNDE_SCORE_THRESHOLD_MULTIPLIER")) ELIGIBILITY_MSOL_STAKE_MAX_COMMISSION <- as.numeric(Sys.getenv("ELIGIBILITY_MSOL_STAKE_MAX_COMMISSION")) ELIGIBILITY_MSOL_STAKE_MIN_STAKE <- as.numeric(Sys.getenv("ELIGIBILITY_MSOL_STAKE_MIN_STAKE")) @@ -51,11 +54,11 @@ ELIGIBILITY_MSOL_SCORE_THRESHOLD_MULTIPLIER <- as.numeric(Sys.getenv("ELIGIBILIT ELIGIBILITY_MIN_VERSION <- Sys.getenv("ELIGIBILITY_MIN_VERSION") -MNDE_VALIDATOR_CAP <- as.numeric(Sys.getenv("MNDE_VALIDATOR_CAP")) +VEMNDE_VALIDATOR_CAP <- as.numeric(Sys.getenv("VEMNDE_VALIDATOR_CAP")) -STAKE_CONTROL_MNDE <- as.numeric(Sys.getenv("STAKE_CONTROL_MNDE")) +STAKE_CONTROL_VEMNDE <- as.numeric(Sys.getenv("STAKE_CONTROL_VEMNDE")) STAKE_CONTROL_MSOL <- as.numeric(Sys.getenv("STAKE_CONTROL_MSOL")) -STAKE_CONTROL_ALGO <- 1 - STAKE_CONTROL_MNDE - STAKE_CONTROL_MSOL +STAKE_CONTROL_ALGO <- 1 - STAKE_CONTROL_VEMNDE - STAKE_CONTROL_MSOL # Perform min-max normalization of algo staking formula's components validators$normalized_dc_concentration <- normalize(1 - validators$avg_dc_concentration) @@ -118,11 +121,25 @@ validators$in_algo_stake_set[validators$eligible_stake_algo == 0] <- 0 # Mark msol votes for each validator validators$msol_votes <- 0 if (nrow(msol_votes) > 0) { - for(i in 1:nrow(msol_votes)) { + for (i in 1:nrow(msol_votes)) { validators[validators$vote_account == msol_votes[i, "vote_account"], ]$msol_votes <- msol_votes[i, "msol_votes"] } } +# Mark veMNDE votes for each validator +validators$vemnde_votes <- 0 +if (nrow(vemnde_votes) > 0) { + for (i in 1:nrow(vemnde_votes)) { + matching_rows <- validators$vote_account == vemnde_votes[i, "vote_account"] + if (any(matching_rows)) { + validators[matching_rows, "vemnde_votes"] <- vemnde_votes[i, "vemnde_votes"] + } + } +} + +# Convert from lamports +validators$vemnde_votes <- validators$vemnde_votes / 1e9 + # Apply msol staking eligibility criteria validators$eligible_stake_msol <- 1 - validators$blacklisted validators$eligible_stake_msol[validators$max_commission > ELIGIBILITY_MSOL_STAKE_MAX_COMMISSION] <- 0 @@ -151,78 +168,79 @@ if (msol_valid_votes_total > 0) { validators$msol_power <- msol_valid_votes / msol_valid_votes_total } -# Apply mnde staking eligibility criteria -validators$eligible_stake_mnde <- 1 - validators$blacklisted -validators$eligible_stake_mnde[validators$max_commission > ELIGIBILITY_MNDE_STAKE_MAX_COMMISSION] <- 0 -validators$eligible_stake_mnde[validators$minimum_stake < ELIGIBILITY_MNDE_STAKE_MIN_STAKE] <- 0 -validators$eligible_stake_mnde[validators$score < min_score_in_algo_set * ELIGIBILITY_MNDE_SCORE_THRESHOLD_MULTIPLIER] <- 0 -validators$eligible_stake_mnde[parse_version(validators$version) < ELIGIBILITY_MIN_VERSION] <- 0 # UI hint provided earlier +# Apply VeMNDE staking eligibility criteria +validators$eligible_stake_vemnde <- 1 - validators$blacklisted +validators$eligible_stake_vemnde[validators$max_commission > ELIGIBILITY_VEMNDE_STAKE_MAX_COMMISSION] <- 0 +validators$eligible_stake_vemnde[validators$minimum_stake < ELIGIBILITY_VEMNDE_STAKE_MIN_STAKE] <- 0 +validators$eligible_stake_vemnde[validators$score < min_score_in_algo_set * ELIGIBILITY_VEMNDE_SCORE_THRESHOLD_MULTIPLIER] <- 0 +validators$eligible_stake_vemnde[parse_version(validators$version) < ELIGIBILITY_MIN_VERSION] <- 0 # UI hint provided earlier for (i in 1:nrow(validators)) { - if (validators[i, "max_commission"] > ELIGIBILITY_MNDE_STAKE_MAX_COMMISSION) { - validators[i, "ui_hints"][[1]] <- list(c(validators[i, "ui_hints"][[1]], "NOT_ELIGIBLE_MNDE_STAKE_MAX_COMMISSION_OVER_10")) + if (validators[i, "max_commission"] > ELIGIBILITY_VEMNDE_STAKE_MAX_COMMISSION) { + validators[i, "ui_hints"][[1]] <- list(c(validators[i, "ui_hints"][[1]], "NOT_ELIGIBLE_VEMNDE_STAKE_MAX_COMMISSION_OVER_10")) } - if (validators[i, "minimum_stake"] < ELIGIBILITY_MNDE_STAKE_MIN_STAKE) { - validators[i, "ui_hints"][[1]] <- list(c(validators[i, "ui_hints"][[1]], "NOT_ELIGIBLE_MNDE_STAKE_MIN_STAKE_BELOW_100")) + if (validators[i, "minimum_stake"] < ELIGIBILITY_VEMNDE_STAKE_MIN_STAKE) { + validators[i, "ui_hints"][[1]] <- list(c(validators[i, "ui_hints"][[1]], "NOT_ELIGIBLE_VEMNDE_STAKE_MIN_STAKE_BELOW_100")) } - if (validators[i, "score"] < min_score_in_algo_set * ELIGIBILITY_MNDE_SCORE_THRESHOLD_MULTIPLIER) { - validators[i, "ui_hints"][[1]] <- list(c(validators[i, "ui_hints"][[1]], "NOT_ELIGIBLE_MNDE_STAKE_SCORE_TOO_LOW")) + if (validators[i, "score"] < min_score_in_algo_set * ELIGIBILITY_VEMNDE_SCORE_THRESHOLD_MULTIPLIER) { + validators[i, "ui_hints"][[1]] <- list(c(validators[i, "ui_hints"][[1]], "NOT_ELIGIBLE_VEMNDE_STAKE_SCORE_TOO_LOW")) } } # Apply eligibility on votes to get effective votes -mnde_valid_votes <- round(validators$mnde_votes * validators$eligible_stake_mnde / 1e9) +vemnde_valid_votes <- round(validators$vemnde_votes * validators$eligible_stake_vemnde) +vemnde_valid_votes_total <- sum(vemnde_valid_votes) -# Apply cap on the share of mnde votes -mnde_power_cap <- round(sum(mnde_valid_votes) * MNDE_VALIDATOR_CAP) -validators$mnde_power <- pmin(mnde_valid_votes, mnde_power_cap) +# Apply cap on the share of vemnde votes +vemnde_power_cap <- round(sum(vemnde_valid_votes) * VEMNDE_VALIDATOR_CAP) +validators$vemnde_power <- pmin(vemnde_valid_votes, vemnde_power_cap) # Find out how much votes got truncated -mnde_overflow <- sum(mnde_valid_votes) - sum(validators$mnde_power) +vemnde_overflow <- sum(vemnde_valid_votes) - sum(validators$vemnde_power) -# Sort validators by MNDE power -validators <- validators[order(validators$mnde_power, decreasing = T),] +# Sort validators by veMNDE power +validators <- validators[order(validators$vemnde_power, decreasing = T),] # Distribute the overflow from the capping -for (v in 1:length(validators$mnde_power)) { - validators_index <- seq(1, along.with = validators$mnde_power) +for (v in 1:length(validators$vemnde_power)) { + validators_index <- seq(1, along.with = validators$vemnde_power) # Ignore weights of already processed validators as they 1) already received their share from the overflow; 2) were overflowing - moving_weights <- (validators_index > v - 1) * validators$mnde_power - # Break the loop if no one else should receive stake from the mnde voting + moving_weights <- (validators_index > v - 1) * validators$vemnde_power + # Break the loop if no one else should receive stake from the vemnde voting if (sum(moving_weights) == 0) { break } # How much should the power increase from the overflow - mnde_power_increase <- round(mnde_overflow * moving_weights[v] / sum(moving_weights)) - # Limit the increase of mnde power if cap should be applied - mnde_power_increase_capped <- min(mnde_power_increase, mnde_power_cap - moving_weights[v]) - # Increase mnde power for this validator - validators$mnde_power <- validators$mnde_power + (validators_index == v) * mnde_power_increase_capped + vemnde_power_increase <- round(vemnde_overflow * moving_weights[v] / sum(moving_weights)) + # Limit the increase of vemnde power if cap should be applied + vemnde_power_increase_capped <- min(vemnde_power_increase, vemnde_power_cap - moving_weights[v]) + # Increase vemnde power for this validator + validators$vemnde_power <- validators$vemnde_power + (validators_index == v) * vemnde_power_increase_capped # Reduce the overflow by what was given to this validator - mnde_overflow <- mnde_overflow - mnde_power_increase_capped + vemnde_overflow <- vemnde_overflow - vemnde_power_increase_capped } -# Scale mnde power to a percentage -if (sum(validators$mnde_power) > 0) { - total_mnde_power <- sum(validators$mnde_power, mnde_overflow) - validators$mnde_power <- validators$mnde_power / total_mnde_power - mnde_overflow_power <- mnde_overflow / total_mnde_power +# Scale vemnde power to a percentage +if (sum(validators$vemnde_power) > 0) { + total_vemnde_power <- sum(validators$vemnde_power, vemnde_overflow) + validators$vemnde_power <- validators$vemnde_power / total_vemnde_power + vemnde_overflow_power <- vemnde_overflow / total_vemnde_power } else { - mnde_overflow_power <- 1 + vemnde_overflow_power <- 1 } -STAKE_CONTROL_MNDE_SOL <- TOTAL_STAKE * STAKE_CONTROL_MNDE * (1 - mnde_overflow_power) -STAKE_CONTROL_MNDE_OVERFLOW_SOL <- mnde_overflow_power * TOTAL_STAKE * STAKE_CONTROL_MNDE +STAKE_CONTROL_VEMNDE_SOL <- TOTAL_STAKE * STAKE_CONTROL_VEMNDE * (1 - vemnde_overflow_power) +STAKE_CONTROL_VEMNDE_OVERFLOW_SOL <- vemnde_overflow_power * TOTAL_STAKE * STAKE_CONTROL_VEMNDE STAKE_CONTROL_MSOL_SOL <- if (msol_valid_votes_total > 0) { TOTAL_STAKE * STAKE_CONTROL_MSOL } else { 0 } STAKE_CONTROL_MSOL_UNUSED_SOL <- if (msol_valid_votes_total > 0) { 0 } else { TOTAL_STAKE * STAKE_CONTROL_MSOL } -STAKE_CONTROL_ALGO_SOL <- TOTAL_STAKE * STAKE_CONTROL_ALGO + STAKE_CONTROL_MNDE_OVERFLOW_SOL + STAKE_CONTROL_MSOL_UNUSED_SOL +STAKE_CONTROL_ALGO_SOL <- TOTAL_STAKE * STAKE_CONTROL_ALGO + STAKE_CONTROL_VEMNDE_OVERFLOW_SOL + STAKE_CONTROL_MSOL_UNUSED_SOL -validators$target_stake_mnde <- round(validators$mnde_power * STAKE_CONTROL_MNDE_SOL) +validators$target_stake_vemnde <- round(validators$vemnde_power * STAKE_CONTROL_VEMNDE_SOL) validators$target_stake_msol <- round(validators$msol_power * STAKE_CONTROL_MSOL_SOL) validators$target_stake_algo <- round(validators$score * validators$in_algo_stake_set / sum(validators$score * validators$in_algo_stake_set) * STAKE_CONTROL_ALGO_SOL) -validators$target_stake <- validators$target_stake_mnde + validators$target_stake_algo + validators$target_stake_msol +validators$target_stake <- validators$target_stake_vemnde + validators$target_stake_algo + validators$target_stake_msol -perf_target_stake_mnde <- sum(validators$avg_adjusted_credits * validators$target_stake_mnde) / sum(validators$target_stake_mnde) +perf_target_stake_vemnde <- sum(validators$avg_adjusted_credits * validators$target_stake_vemnde) / sum(validators$target_stake_vemnde) perf_target_stake_algo <- sum(validators$avg_adjusted_credits * validators$target_stake_algo) / sum(validators$target_stake_algo) perf_target_stake_msol <- sum(validators$avg_adjusted_credits * validators$target_stake_msol) / sum(validators$target_stake_msol) @@ -230,10 +248,10 @@ print(t(data.frame( TOTAL_STAKE, STAKE_CONTROL_MSOL_SOL, STAKE_CONTROL_MSOL_UNUSED_SOL, - STAKE_CONTROL_MNDE_SOL, - STAKE_CONTROL_MNDE_OVERFLOW_SOL, + STAKE_CONTROL_VEMNDE_SOL, + STAKE_CONTROL_VEMNDE_OVERFLOW_SOL, STAKE_CONTROL_ALGO_SOL, - perf_target_stake_mnde, + perf_target_stake_vemnde, perf_target_stake_algo, perf_target_stake_msol ))) diff --git a/store/src/dto.rs b/store/src/dto.rs index b153f82..b73c4a9 100644 --- a/store/src/dto.rs +++ b/store/src/dto.rs @@ -51,7 +51,6 @@ pub struct Validator { pub commission_advertised: Option, pub commission_effective: Option, pub version: Option, - pub mnde_votes: Option, pub activated_stake: Decimal, pub marinade_stake: Decimal, pub decentralizer_stake: Decimal, @@ -105,7 +104,6 @@ impl Validator { commission_advertised: Some(v.performance.commission as i32), commission_effective: None, version: v.performance.version.clone(), - mnde_votes: v.mnde_votes.map(|mnde_votes| mnde_votes.into()), activated_stake: v.activated_stake.into(), marinade_stake: v.marinade_stake.into(), decentralizer_stake: v.decentralizer_stake.into(), @@ -134,7 +132,6 @@ pub struct ValidatorEpochStats { pub commission_advertised: Option, pub commission_effective: Option, pub version: Option, - pub mnde_votes: Option, pub activated_stake: u64, pub marinade_stake: u64, pub decentralizer_stake: u64, @@ -183,7 +180,6 @@ pub struct ValidatorRecord { pub commission_effective: Option, pub commission_aggregated: Option, pub version: Option, - pub mnde_votes: Option, pub activated_stake: Decimal, pub marinade_stake: Decimal, pub decentralizer_stake: Decimal, @@ -279,7 +275,6 @@ pub struct ValidatorAggregatedFlat { pub max_commission: u8, pub avg_adjusted_credits: f64, pub dc_aso: String, - pub mnde_votes: u64, pub marinade_stake: f64, pub version: String, } @@ -289,12 +284,13 @@ pub struct ValidatorScoringCsvRow { pub vote_account: String, pub score: f64, pub rank: i32, - pub mnde_votes: Decimal, + pub vemnde_votes: Decimal, + pub msol_votes: Decimal, pub ui_hints: String, #[serde(deserialize_with = "bool_from_int")] pub eligible_stake_algo: bool, #[serde(deserialize_with = "bool_from_int")] - pub eligible_stake_mnde: bool, + pub eligible_stake_vemnde: bool, #[serde(deserialize_with = "bool_from_int")] pub eligible_stake_msol: bool, pub normalized_dc_concentration: f64, @@ -307,7 +303,7 @@ pub struct ValidatorScoringCsvRow { pub rank_grace_skip_rate: i32, pub rank_adjusted_credits: i32, pub target_stake_algo: Decimal, - pub target_stake_mnde: Decimal, + pub target_stake_vemnde: Decimal, pub target_stake_msol: Decimal, } @@ -316,16 +312,17 @@ pub struct ValidatorScoreRecord { pub vote_account: String, pub score: f64, pub rank: i32, - pub mnde_votes: u64, + pub vemnde_votes: u64, + pub msol_votes: u64, pub ui_hints: Vec, pub component_scores: Vec, pub component_ranks: Vec, pub component_values: Vec>, pub eligible_stake_algo: bool, - pub eligible_stake_mnde: bool, + pub eligible_stake_vemnde: bool, pub eligible_stake_msol: bool, pub target_stake_algo: u64, - pub target_stake_mnde: u64, + pub target_stake_vemnde: u64, pub target_stake_msol: u64, pub scoring_run_id: i64, pub created_at: DateTime, diff --git a/store/src/lib.rs b/store/src/lib.rs index 98489b9..8d3e619 100644 --- a/store/src/lib.rs +++ b/store/src/lib.rs @@ -1,3 +1,3 @@ pub mod dto; -pub mod utils; pub mod scoring; +pub mod utils; diff --git a/store/src/scoring.rs b/store/src/scoring.rs index 637f683..4dff0d4 100644 --- a/store/src/scoring.rs +++ b/store/src/scoring.rs @@ -184,16 +184,17 @@ pub async fn load_all_scores( SELECT vote_account, score, rank, - mnde_votes, + vemnde_votes, + msol_votes, ui_hints, component_scores, component_ranks, component_values, eligible_stake_algo, - eligible_stake_mnde, + eligible_stake_vemnde, eligible_stake_msol, target_stake_algo, - target_stake_mnde, + target_stake_vemnde, target_stake_msol, scores.scoring_run_id, scoring_runs.created_at as created_at @@ -216,20 +217,21 @@ pub async fn load_all_scores( vote_account: row.get("vote_account"), score: row.get("score"), rank: row.get("rank"), - mnde_votes: row.get::<_, Decimal>("mnde_votes").try_into().unwrap(), + vemnde_votes: row.get::<_, Decimal>("vemnde_votes").try_into().unwrap(), + msol_votes: row.get::<_, Decimal>("msol_votes").try_into().unwrap(), ui_hints: row.get("ui_hints"), component_scores: row.get("component_scores"), component_ranks: row.get("component_ranks"), component_values: row.get("component_values"), eligible_stake_algo: row.get("eligible_stake_algo"), - eligible_stake_mnde: row.get("eligible_stake_mnde"), + eligible_stake_vemnde: row.get("eligible_stake_vemnde"), eligible_stake_msol: row.get("eligible_stake_msol"), target_stake_algo: row .get::<_, Decimal>("target_stake_algo") .try_into() .unwrap(), - target_stake_mnde: row - .get::<_, Decimal>("target_stake_mnde") + target_stake_vemnde: row + .get::<_, Decimal>("target_stake_vemnde") .try_into() .unwrap(), target_stake_msol: row diff --git a/store/src/utils.rs b/store/src/utils.rs index 393c6b2..9dece50 100644 --- a/store/src/utils.rs +++ b/store/src/utils.rs @@ -496,7 +496,6 @@ pub async fn load_validators( commission_advertised, commission_effective, version, - mnde_votes, activated_stake, marinade_stake, decentralizer_stake, @@ -613,9 +612,6 @@ pub async fn load_validators( .map(|n| n.try_into().unwrap()), commission_aggregated: None, version: row.get("version"), - mnde_votes: row - .get::<_, Option>("mnde_votes") - .map(|n| n.try_into().unwrap()), activated_stake: row.get::<_, Decimal>("activated_stake").try_into().unwrap(), marinade_stake: row.get::<_, Decimal>("marinade_stake").try_into().unwrap(), decentralizer_stake: row @@ -659,9 +655,6 @@ pub async fn load_validators( .get::<_, Option>("commission_effective") .map(|n| n.try_into().unwrap()), version: row.get("version"), - mnde_votes: row - .get::<_, Option>("mnde_votes") - .map(|n| n.try_into().unwrap()), activated_stake: row.get::<_, Decimal>("activated_stake").try_into().unwrap(), marinade_stake: row.get::<_, Decimal>("marinade_stake").try_into().unwrap(), decentralizer_stake: row @@ -849,16 +842,17 @@ pub async fn load_scores( SELECT vote_account, score, rank, - mnde_votes, + vemnde_votes, + msol_votes, ui_hints, component_scores, component_ranks, component_values, eligible_stake_algo, - eligible_stake_mnde, + eligible_stake_vemnde, eligible_stake_msol, target_stake_algo, - target_stake_mnde, + target_stake_vemnde, target_stake_msol, scores.scoring_run_id, scoring_runs.created_at as created_at @@ -881,20 +875,21 @@ pub async fn load_scores( vote_account: vote_account.clone(), score: row.get("score"), rank: row.get("rank"), - mnde_votes: row.get::<_, Decimal>("mnde_votes").try_into().unwrap(), + vemnde_votes: row.get::<_, Decimal>("vemnde_votes").try_into().unwrap(), + msol_votes: row.get::<_, Decimal>("msol_votes").try_into().unwrap(), ui_hints: row.get("ui_hints"), component_scores: row.get("component_scores"), component_ranks: row.get("component_ranks"), component_values: row.get("component_values"), eligible_stake_algo: row.get("eligible_stake_algo"), - eligible_stake_mnde: row.get("eligible_stake_mnde"), + eligible_stake_vemnde: row.get("eligible_stake_vemnde"), eligible_stake_msol: row.get("eligible_stake_msol"), target_stake_algo: row .get::<_, Decimal>("target_stake_algo") .try_into() .unwrap(), - target_stake_mnde: row - .get::<_, Decimal>("target_stake_mnde") + target_stake_vemnde: row + .get::<_, Decimal>("target_stake_vemnde") .try_into() .unwrap(), target_stake_msol: row @@ -1116,7 +1111,6 @@ pub async fn load_validators_aggregated_flat( max(coalesce(commission_effective, commission_advertised, 100)) as max_commission, (coalesce(avg(credits * greatest(0, 100 - coalesce(commission_effective, commission_advertised, 100))), 0) / 100)::double precision as avg_adjusted_credits, coalesce((array_agg(validators.dc_aso ORDER BY validators.epoch DESC))[1], 'Unknown') dc_aso, - coalesce((array_agg(mnde_votes ORDER BY validators.epoch DESC))[1], 0) as mnde_votes, coalesce((array_agg((marinade_stake / 1e9)::double precision ORDER BY validators.epoch DESC))[1], 0) as marinade_stake, coalesce((array_agg(agg_versions.last_version))[1], '0.0.0') as last_version from @@ -1146,7 +1140,6 @@ pub async fn load_validators_aggregated_flat( max_commission: row.get::<_, i32>("max_commission").try_into()?, avg_adjusted_credits: row.get("avg_adjusted_credits"), dc_aso: row.get("dc_aso"), - mnde_votes: row.get::<_, Decimal>("mnde_votes").try_into()?, marinade_stake: row.get("marinade_stake"), version: row.get("last_version"), }); @@ -1245,7 +1238,7 @@ pub async fn store_scoring( for chunk in scores.chunks(500) { let mut query = InsertQueryCombiner::new( "scores".to_string(), - "vote_account, score, component_scores, component_ranks, component_values, mnde_votes, rank, ui_hints, eligible_stake_algo, eligible_stake_mnde, eligible_stake_msol, target_stake_algo, target_stake_mnde, target_stake_msol, scoring_run_id".to_string(), + "vote_account, score, component_scores, component_ranks, component_values, vemnde_votes, msol_votes, rank, ui_hints, eligible_stake_algo, eligible_stake_vemnde, eligible_stake_msol, target_stake_algo, target_stake_vemnde, target_stake_msol, scoring_run_id".to_string(), ); for row in chunk { let mut params: Vec<&(dyn ToSql + Sync)> = vec![ @@ -1260,14 +1253,15 @@ pub async fn store_scoring( component_values_by_vote_account .get(&row.vote_account) .unwrap(), - &row.mnde_votes, + &row.vemnde_votes, + &row.msol_votes, &row.rank, ui_hints_parsed.get(&row.vote_account).unwrap(), &row.eligible_stake_algo, - &row.eligible_stake_mnde, + &row.eligible_stake_vemnde, &row.eligible_stake_msol, &row.target_stake_algo, - &row.target_stake_mnde, + &row.target_stake_vemnde, &row.target_stake_msol, &scoring_run_id, ]; diff --git a/store/src/validators.rs b/store/src/validators.rs index 09c6c83..04b1381 100644 --- a/store/src/validators.rs +++ b/store/src/validators.rs @@ -75,7 +75,6 @@ pub async fn store_validators( dc_aso = u.dc_aso, commission_advertised = u.commission_advertised, version = u.version, - mnde_votes = u.mnde_votes, activated_stake = u.activated_stake, marinade_stake = u.marinade_stake, decentralizer_stake = u.decentralizer_stake, @@ -106,7 +105,6 @@ pub async fn store_validators( dc_aso, commission_advertised, version, - mnde_votes, activated_stake, marinade_stake, decentralizer_stake, @@ -143,7 +141,6 @@ pub async fn store_validators( &v.dc_aso, &v.commission_advertised, &v.version, - &v.mnde_votes, &v.activated_stake, &v.marinade_stake, &v.decentralizer_stake, @@ -163,7 +160,6 @@ pub async fn store_validators( (8, "DOUBLE PRECISION".into()), // dc_coordinates_lon (13, "INTEGER".into()), // dc_asn (15, "INTEGER".into()), // commission_advertised - (17, "NUMERIC".into()), // mnde_votes (18, "NUMERIC".into()), // activated_stake (19, "NUMERIC".into()), // marinade_stake (20, "NUMERIC".into()), // decentralizer_stake @@ -216,7 +212,6 @@ pub async fn store_validators( commission_advertised, commission_effective, version, - mnde_votes, activated_stake, marinade_stake, decentralizer_stake, @@ -259,7 +254,6 @@ pub async fn store_validators( &v.commission_advertised, &v.commission_effective, &v.version, - &v.mnde_votes, &v.activated_stake, &v.marinade_stake, &v.decentralizer_stake,