Skip to content

Commit

Permalink
change APY calculation to include stake_subsidy_start_epoch (#11646)
Browse files Browse the repository at this point in the history
## Description 

change APY calculation to use 30 days average of daily APY, also exclude
data point before `stake_subsidy_start_epoch`

## Test Plan 

Manual testing on testnet


```
{
    "jsonrpc": "2.0",
    "result": {
        "apys": [
            {
                "address": "0x44b1b319e23495995fc837dafd28fc6af8b645edddff0fc1467f1ad631362c23",
                "apy": 0.06367719923107278
            },
            {
                "address": "0x3d618b03660f4e8b4ec99c52af08a814f5248154937782d22b5a8f2e44ba15fc",
                "apy": 0.0644859486532715
            },
            {
                "address": "0x24e8511a01aa7ab06eb8ce61d6c002ac5b8b7e0fde809554ca3662fb184ce257",
                "apy": 0.06389054258577678
            },
            {
                "address": "0x4c05f4f76ed81d210e9a29ac0756c7a3129e4b9ecacbbb9fc1579505947630cf",
                "apy": 0.06450673689670251
            },
            {
                "address": "0x6881875df60daf5528d66a62b66dc5710bf06b220fa9266ffdfeeb9cd8d6ed94",
                "apy": 0.06450271281790321
            },
            {
                "address": "0xab4fb3eeaa7b0ab4f91eedab33adf140c6750e60ca5e44b3df82491937d7bab4",
                "apy": 0.06389171441107323
            },
            {
                "address": "0x2079cb58f32c868deb0f4f20f509b7f034c7bea84c964cb1316f77fc987445b8",
                "apy": 0.06435875500691252
            },
            {
                "address": "0xaaec0462f9286f2aa9db25143eaa428cc6527b1ef669772b40b011983837de77",
                "apy": 0.0644953761240235
            },
            {
                "address": "0xf941ae3cbe5645dccc15da8346b533f7f91f202089a5521653c062b2ff10b304",
                "apy": 0.06426658468803233
            },
            {
                "address": "0x2622b55585033f26b0a86b378de1a6284c2dda531e52ef30ea87a8df81f4630a",
                "apy": 0.06388688803532751
            },
            {
                "address": "0x43ff72d09170ab4712d7bf26f0475d7f94f60f7076d5da9ebcfe7dde87faf2a7",
                "apy": 0.06433257912493434
            },
            {
                "address": "0x9062fc51d91056246dc31f2b818a4ddb113a044ec22c8dd0674616bbe56f7192",
                "apy": 0.06389736912122047
            },
            {
                "address": "0xc397477d8b445e6295bc34e593b9a95d5d233cec1a8fe3740d0ab86012a460f6",
                "apy": 0.06389143306049831
            },
            {
                "address": "0xae1af1a8f2ab31a01c4552f08e07d6bb01722a0fc3932ef3c1b4cd2e00efdb39",
                "apy": 0.0636996581664304
            },
            {
                "address": "0x22b35a7481fb136e5585c43421cf8ab49d0e219e902dedc40c2778acdcc7bc9c",
                "apy": 0.06369987497328876
            },
            {
                "address": "0xd32da9c87c1164f7c686067067e37cc3bdd8ad3fc7ef62d5f24c5dc908bb5fcb",
                "apy": 0.06429543790329038
            },
            {
                "address": "0x407f2bd2d36f40e57e4b725e7b80d4afc588fd2deb746ad62ccc6ed086798e48",
                "apy": 0.06438211710029564
            },
            {
                "address": "0x2b761dda04b324c8f2aaf8429c0e160aa3772df37d00a37e6ec948aa1efebd1a",
                "apy": 0.06429566198073071
            },
            {
                "address": "0xbc1c3a11c476169457fd4b57b62e0ea17c3f87864d13d2ab2470a12b817e5e93",
                "apy": 0.06445673315770278
            },
            {
                "address": "0x58baf5de9454ce6e6d17ebcf7d31513d700d012f304b16ef02e4a5b187cd9c13",
                "apy": 0.06420046807086355
            },
            {
                "address": "0x51c0c51634393f904cbeed910714943a30a47a6dafaab99c59bdcac2521ba733",
                "apy": 0.06268428814559913
            },
            {
                "address": "0xcd65f892b2cf35c64864151b5f268f627294768fa74f445b30553edfbe50bcd6",
                "apy": 0.06415466449375312
            },
            {
                "address": "0x6d6e9f9d3d81562a0f9b767594286c69c21fea741b1c2303c5b7696d6c63618a",
                "apy": 0.05029878640536349
            },
            {
                "address": "0x88c0bb8c1ceefe9ebba35296cb1d4ef43189e1b66c3fb84bba85321ca414420c",
                "apy": 0.0642935026561264
            },
            {
                "address": "0x155d5e5f1904db5f3a16924d0211b4c34cfcc947f345a1deff1452fc5373fed4",
                "apy": 0.06389261295985307
            },
            {
                "address": "0x3b04afb1540fc9661aaaad152d4b63c5f59807a3da1ee432b3635bd92614d87c",
                "apy": 0.06389702268311954
            },
            {
                "address": "0x884515e99dab69c4c28662149db81ca563ed4c36e0c8ce44a58e40e25a0a64a1",
                "apy": 0.06449947208256572
            },
            {
                "address": "0x3cea1fe33a40499de25d10770da9cdc9fe67122bf11fbe2b5a1133b1e56021d6",
                "apy": 0.06419217807990049
            },
            {
                "address": "0xb750411294aeaf85851623aae6d58f91d057ee1ee14c7954ce29ea2323f79814",
                "apy": 0.06429268425232637
            },
            {
                "address": "0x0a9a3eaa26bfc6f66e47d136f288fa2174d2c43623479896148c94b22ff0c8b5",
                "apy": 0.06370437504593317
            },
            {
                "address": "0xf61e2528ce519e0644703f4da66cacc5180aba728fa76705021b1337c363741d",
                "apy": 0.06419037447310942
            },
            {
                "address": "0x6c21eaf4812308dd6ade04693a75453eeba8da61cce4900e5a6b35e58dbf3557",
                "apy": 0.06456196228372404
            },
            {
                "address": "0xe1fb42ed4790a5f61067ebe63d32dd4189531d619c043929463e9f135dba0afa",
                "apy": 0.06417158230098827
            },
            {
                "address": "0x788fc51bd21e0898e68c106306a9357a7e37416e9b2bfd6a416e56e11393cba6",
                "apy": 0.06428304356313551
            },
            {
                "address": "0xd07503d1bbe8c4dc2b905c70d379ace08e02f809eab131dc9c675cc146246b0c",
                "apy": 0.06420696487430567
            },
            {
                "address": "0x10052a36a52989971951f741b8497e7d93a5ce1a621dd30e0ae7dbef80e6f982",
                "apy": 0.06383863718052575
            },
            {
                "address": "0x1f446cc6caa6dff121d1540568e91e89b7e0d36f6e009522c59265c627ed0361",
                "apy": 0.06446069121202148
            },
            {
                "address": "0xb60d557602fc1913d9e1de30df280a2ab5e4cf9d0ae47ab151972e6f01017866",
                "apy": 0.06416045248586905
            },
            {
                "address": "0xd7601c6697b7eb561b0122708b76b0e74da9fd6d7b66a88527e563783b710004",
                "apy": 0.06420243487216196
            },
            {
                "address": "0xbc3d9f492df168d1f30a2a03c39b3a0f3875d81c4ff34b17c9a732f21b328653",
                "apy": 0.06421517754272452
            },
            {
                "address": "0xce2039cd80188004f995cdfe1360b31d4118bd4257febee958b6c6dcd861131d",
                "apy": 0.06420341519600596
            },
            {
                "address": "0xca5804bfb7e04282122dabc3a20157e2002e539dbab9a8ca6cb1b0f22a5254a2",
                "apy": 0.06420759860924162
            },
            {
                "address": "0xf72a0dc5295a03f8d39ce2b38e050053380ea8c3e1f3be21160ea3bb74b3d784",
                "apy": 0.06419843198507366
            },
            {
                "address": "0x77c2e69f6a03354c2e685a0d5bf49b26cd7efbb61f6b13582a3b3979760a5b23",
                "apy": 0.06420799599544474
            },
            {
                "address": "0x88127002d43aac4a92422b4b35d41e17d72b62d0336751ec52e341c8b8d10ba7",
                "apy": 0.0641921590521337
            },
            {
                "address": "0x531fc96d6a471d5dfe0d8f48a74f8c636af0f9f15900ac1a928a4cac34f1aa0f",
                "apy": 0.06419020900754725
            },
            {
                "address": "0x51653766eaeadac58fef860a588ad34d97e1ed3dd0f7703abd91b8c48fd5f714",
                "apy": 0.063881540853694
            },
            {
                "address": "0x605a355de6d115d4c6d0a4e0386b430581a86eb175bb734a170198c243c7c165",
                "apy": 0.06464032126616373
            },
            {
                "address": "0xf5ce4d13da3c011655b02fa28880b88aa68e1373eb22e385bcfd21cb7c541e56",
                "apy": 0.06454367996660385
            },
            {
                "address": "0x8933942921bd522d69d7af12f875ba4f4963ad01431df8403597dfa8692f417d",
                "apy": 0.06426812133066645
            },
            {
                "address": "0x10d435282b483abb93487d946f18239e445ae81a15fa4b93761160b3ae508a3a",
                "apy": 0.06389549562784066
            },
            {
                "address": "0x5d6c4b01c92fd7d76273e4b818c0dbd16f8ae5e3a46f03910ec847fc8e935073",
                "apy": 0.06429296146215063
            },
            {
                "address": "0x9c4155f9e901324198fc9c737e15e6b14da5b9d2f38243213f115a7d45f3d048",
                "apy": 0.0642451744893266
            },
            {
                "address": "0x0a392298244ca2694098d015b00cf49ae1168118b28d13cb0baafd5884e5559a",
                "apy": 0.06696864976070477
            },
            {
                "address": "0x764c9ed72c944d314290a257b4a88211c8e529257fc2fd00d3cb0b5b5666d8a7",
                "apy": 0.06408637170122725
            },
            {
                "address": "0xd42927d7a446332d9593d359cd1f9a63a719723568f514e65a3f2d0c6d2c6308",
                "apy": 0.0642095865813636
            },
            {
                "address": "0x9336c4c9d891e263cfac99adc397853a7392e5cf84cbd5df92207a57c7fbdadc",
                "apy": 0.06381626353709163
            },
            {
                "address": "0xe228873333285a6c34279c1a0c1b9e00b9b27cb1a803dde6c524f52dfae320ed",
                "apy": 0.0686803060051965
            },
            {
                "address": "0xe70aaff920dd38013abff4469c0632fdae96ee43d8451e767c1bce1201471b9d",
                "apy": 0.06430776536274536
            },
            {
                "address": "0xc64c306856aa14ad8a281e2b54a9a02b742d4485cd677527c377f48a9d12b332",
                "apy": 0.06419273028211317
            },
            {
                "address": "0x85d33c89396aa2fa606b214e8b7804a8f8d254283db7aed7c87ebca2f898462a",
                "apy": 0.06442428833485356
            },
            {
                "address": "0x18fed7071bb90b5f2093f7ded14874b5fabe7e32b8ac01f353ebfc002ba4fedf",
                "apy": 0.0642598000174871
            },
            {
                "address": "0xe0ecd8bb71c889b1bb6de0d1ce31fb4b8ee4f5de93a4f24c84e1f0af46a80f5a",
                "apy": 0.06389680571663087
            },
            {
                "address": "0xa020639deea73801fd9e7227a91d959446553c5f3c703f97ea6d57122bee9868",
                "apy": 0.06381579483648374
            },
            {
                "address": "0x986e642d1aef8a8174ee2da51a629383e8d807a1dd6417d1c7df58185d28f734",
                "apy": 0.0642096444926484
            },
            {
                "address": "0x9275c6e27c1ce98b08edb3d88e71880520aa114fbf3745d333252f7a47672882",
                "apy": 0.06370258106229555
            },
            {
                "address": "0x5de0810e785b33127446f752b00a67c04b834fbc375aba3037274fadf4c9ba46",
                "apy": 0.06388608616695013
            },
            {
                "address": "0x163f66f793f03ac3f309fc97058f5997283ccbdf92e4d4fa3323d290801375d8",
                "apy": 0.06420223290706073
            },
            {
                "address": "0x520289e77c838bae8501ae92b151b99a54407288fdd20dee6e5416bfe943eb7a",
                "apy": 0.030894384587994806
            },
            {
                "address": "0x1522781514015f10f4d4d98b77204f04a79f7a7f7d2c23ecb81eba99f39e4b60",
                "apy": 0.06421236539303407
            },
            {
                "address": "0x0cf761fee0542dbdad239aacd91a868ee9eadd3f68dc9aaa9554e5a653f9fe2d",
                "apy": 0.06421431903774306
            },
            {
                "address": "0xdf2dda5c0d8f86a950bd9aeed1ef68a13048505298e0031ae867c1445299f050",
                "apy": 0.06519410478251837
            },
            {
                "address": "0xba4d20899c7fd438d50b2de2486d08e03f34beb78a679142629a6baacb88b013",
                "apy": 0.06870470441210123
            },
            {
                "address": "0x6ac8c08225b9d54e32d314056e20d9da2283289236b6fa1f06a8c801b4957171",
                "apy": 0.06420343713694031
            },
            {
                "address": "0x70977fada000eb0da05483191f19de7cda9a9aa63db18d17bb55c69756b8454e",
                "apy": 0.06421947500058987
            },
            {
                "address": "0xf95ef0315cdf53688337437622fda6f854389d898c02ce9423be393cdde063de",
                "apy": 0.06389784041176003
            },
            {
                "address": "0xec2f944506291b18f7c7143317df63b738581894a12695daab6af35358174655",
                "apy": 0.06388881050623908
            },
            {
                "address": "0x9370070960e294f92c1427ed0a814605476155fa6452d59de16ed5c38c4746f9",
                "apy": 0.06421520839599339
            },
            {
                "address": "0x2ade594485fb795616b74156c91097ec517a05ac488364dd3ad1ec5f536db3f4",
                "apy": 0.06644187738546438
            },
            {
                "address": "0x07fffa5cb91c8522b6a5d57b8fda97deb803238b23dc3b0a3b3b723546483098",
                "apy": 0.06421324246893255
            },
            {
                "address": "0xc304e3d55fee31e7612a135ab4f3c48ca71ae332c0081afcf546d4e92bcfde34",
                "apy": 0.06370677080281482
            },
            {
                "address": "0x07466289c5f00ce745b24336a0efac170d8811379a62b2b87458126a9636bc3e",
                "apy": 0.0638892129318431
            },
            {
                "address": "0x72169c90b7ea87f8101285c849c09cacced9968f83aa30786dad546bb94c78ab",
                "apy": 0.06429211775242547
            },
            {
                "address": "0xbfaf08e600526abe628f4f5351278de290268c81c8ccd0217d6bd302e9645617",
                "apy": 0.06437915882806111
            },
            {
                "address": "0x4f9791d5c689306862b4eb9a25914c5433b7dfd5cb4827b461f7dfc813f28a7c",
                "apy": 0.06421800884365342
            },
            {
                "address": "0x1d451f7dd59b0ed8bdfbdcb8a0307a1e7285ba2ae7efaee45baffa2a1ee3b47f",
                "apy": 0.06370534150355646
            },
            {
                "address": "0x5c1b16b520fccd546b21e67d4e457bbf9579010f2f7090409561a011c8d15c05",
                "apy": 0.0645868705039813
            },
            {
                "address": "0xef2576680cb79c981db9a1e78484461cc3871ac1314bb434ab99cb982a6c6fc2",
                "apy": 0.06421884247389681
            },
            {
                "address": "0x1877ffe212141e1b59c71e80a12fea8150590495ddb67b5154c10a998731f393",
                "apy": 0.06383651175390241
            },
            {
                "address": "0x7293d297ac499c7c7d2e4db00015f7c2a9dfe51385368d869e7c8cf727b2febf",
                "apy": 0.06765317329938855
            },
            {
                "address": "0x9e0f392d794c167a8745d14e0aad21e4900865d59e669bebf18fc654349833fc",
                "apy": 0.07241679895645393
            },
            {
                "address": "0x2081a93bcf642f5964e1f5c4b84e2a22801a62d0137e03d0311ee317163cd27a",
                "apy": 0.06862313871797839
            },
            {
                "address": "0x89afed39dde1ce7d5f1c78f8c832e254b75e7c13ddf5158fa460e46416bd8f00",
                "apy": 0.06006170948281884
            },
            {
                "address": "0x8ffaea5d47a38291e5dd390b6d4c40fd3b1f17864aec217a2f808d8f1ca9b26b",
                "apy": 0.06465441506135745
            },
            {
                "address": "0x8c2feb7de11ec9ca97bdede1c0f8018d4564cc7e015cc57ef863708bbb6bb031",
                "apy": 0.06580730869094088
            },
            {
                "address": "0xb88d7b5d8a48a2d37438fc3eaf1170541880c9b3070e87d9a6dcbfc1ef991dfc",
                "apy": 0.06441475068669297
            },
            {
                "address": "0x421b21543d1c8aba69deb9ba4bf1cf7e5313ebe0e3ad606339378bb8a33ff7da",
                "apy": 0.06440442954348491
            }
        ],
        "epoch": "772"
    },
    "id": 10
}
```
  • Loading branch information
patrickkuo authored and ebmifa committed May 2, 2023
1 parent 0f43ad1 commit ae1212b
Showing 1 changed file with 34 additions and 15 deletions.
49 changes: 34 additions & 15 deletions crates/sui-json-rpc/src/governance_api.rs
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
// Copyright (c) Mysten Labs, Inc.
// SPDX-License-Identifier: Apache-2.0

use anyhow::anyhow;
use std::cmp::max;
use std::collections::BTreeMap;
use std::sync::Arc;

use anyhow::anyhow;
use async_trait::async_trait;
use cached::proc_macro::cached;
use cached::SizedCache;
use jsonrpsee::core::RpcResult;
use jsonrpsee::RpcModule;
use tracing::{info, instrument};

use cached::proc_macro::cached;
use cached::SizedCache;
use mysten_metrics::spawn_monitored_task;
use sui_core::authority::AuthorityState;
use sui_json_rpc_types::{DelegatedStake, Stake, StakeStatus};
Expand Down Expand Up @@ -277,23 +277,36 @@ impl GovernanceReadApiServer for GovernanceReadApi {
let mut apys = vec![];

for rates in exchange_rate_table.into_iter().filter(|r| r.active) {
let apy = if let Some((_, latest_rate)) = rates.rates.first() {
let (n, rates_n) = if rates.rates.len() < 29 {
(rates.rates.len() as f64, rates.rates.last())
} else {
(29.0, rates.rates.get(29))
};
if let Some((_, rate_n_days)) = rates_n {
(rate_n_days.rate() / latest_rate.rate()).powf(365.0 / (n + 1.0)) - 1.0
} else {
0.0
}
// we start the apy calculation from the epoch when the stake subsidy starts
let exchange_rates = rates
.rates
.into_iter()
.filter_map(|(epoch, rate)| {
if epoch >= system_state_summary.stake_subsidy_start_epoch {
Some(rate)
} else {
None
}
})
// we only need the last 30 + 1 days of data
.take(31)
.collect::<Vec<_>>();

// we need at least 2 data points to calculate apy
let average_apy = if exchange_rates.len() >= 2 {
// rates are sorted by epoch in descending order.
let er_e = &exchange_rates[1..];
// rate e+1
let er_e_1 = &exchange_rates[..exchange_rates.len() - 1];
let dp_count = er_e.len();
er_e.iter().zip(er_e_1).map(calculate_apy).sum::<f64>() / dp_count as f64
} else {
0.0
};

apys.push(ValidatorApy {
address: rates.address,
apy,
apy: average_apy,
});
}
Ok(ValidatorApys {
Expand All @@ -303,7 +316,13 @@ impl GovernanceReadApiServer for GovernanceReadApi {
}
}

// APY_e = (ER_e+1 / ER_e) ^ 365
fn calculate_apy((rate_e, rate_e_1): (&PoolTokenExchangeRate, &PoolTokenExchangeRate)) -> f64 {
(rate_e.rate() / rate_e_1.rate()).powf(365.0) - 1.0
}

/// Cached exchange rates for validators for the given epoch, the cache size is 1, it will be cleared when the epoch changes.
/// rates are in descending order by epoch.
#[cached(
type = "SizedCache<EpochId, Vec<ValidatorExchangeRates>>",
create = "{ SizedCache::with_size(1) }",
Expand Down

0 comments on commit ae1212b

Please sign in to comment.