Skip to content

Commit

Permalink
first commit
Browse files Browse the repository at this point in the history
  • Loading branch information
brentstone committed Jun 11, 2023
1 parent 1e2ad23 commit 1967ef7
Show file tree
Hide file tree
Showing 2 changed files with 67 additions and 55 deletions.
120 changes: 66 additions & 54 deletions proof_of_stake/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ use storage::{
bonds_for_source_prefix, bonds_prefix, consensus_keys_key,
decimal_mult_amount, get_validator_address_from_bond, into_tm_voting_power,
is_bond_key, is_unbond_key, is_validator_slashes_key,
last_block_proposer_key, mult_change_to_amount, params_key, slashes_prefix,
last_block_proposer_key, params_key, slashes_prefix,
unbonds_for_source_prefix, unbonds_prefix, validator_address_raw_hash_key,
validator_last_slash_key, validator_max_commission_rate_change_key,
BondDetails, BondsAndUnbondsDetail, BondsAndUnbondsDetails,
Expand Down Expand Up @@ -2599,6 +2599,7 @@ where
let validator = bond_id.validator.clone();
let (bonds, _unbonds) = bonds_and_unbonds.entry(bond_id).or_default();
bonds.push(make_bond_details(
params,
&validator,
change,
start,
Expand Down Expand Up @@ -2662,6 +2663,7 @@ where
.filter(|(_start, change)| *change > token::Change::default())
.map(|(start, change)| {
make_bond_details(
params,
&validator,
change,
start,
Expand Down Expand Up @@ -2696,6 +2698,7 @@ where

// TODO: check carefully for validity
fn make_bond_details(
params: &PosParams,
validator: &Address,
change: token::Change,
start: Epoch,
Expand All @@ -2708,28 +2711,34 @@ fn make_bond_details(
.cloned()
.unwrap_or_default();
let amount = token::Amount::from_change(change);
let slashed_amount =
slashes
.iter()
.fold(None, |acc: Option<token::Amount>, slash| {
if slash.epoch >= start {
let validator_slashes =
applied_slashes.entry(validator.clone()).or_default();
if !prev_applied_slashes
.iter()
.any(|s| s.clone() == slash.clone())
{
validator_slashes.push(slash.clone());
}
return Some(
acc.unwrap_or_default()
+ mult_change_to_amount(slash.rate, change),
);
}
acc
});
let slashed_amount =
slashed_amount.map(|slashed| cmp::min(amount, slashed));

let validator_slashes =
applied_slashes.entry(validator.clone()).or_default();
for slash in slashes {
if slash.epoch >= start
&& !prev_applied_slashes
.iter()
.any(|s| s.clone() == slash.clone())
{
validator_slashes.push(slash.clone());
}
}
let slash_rates_by_epoch = validator_slashes.iter().fold(
BTreeMap::<Epoch, Decimal>::new(),
|mut map, s| {
let cur_rate = map.entry(s.epoch).or_default();
*cur_rate = cmp::min(Decimal::ONE, *cur_rate + s.rate);
map
},
);

let slashed_amount = if slash_rates_by_epoch.is_empty() {
None
} else {
let amount_after_slashing =
get_slashed_amount(params, amount, &slash_rates_by_epoch).unwrap();
Some(amount - token::Amount::from_change(amount_after_slashing))
};
BondDetails {
start,
amount,
Expand All @@ -2751,37 +2760,40 @@ fn make_unbond_details(
.get(validator)
.cloned()
.unwrap_or_default();
// TODO: checks bounds for considering valid unbond with slash!
let slashed_amount =
slashes
.iter()
.fold(None, |acc: Option<token::Amount>, slash| {
if slash.epoch >= start
&& slash.epoch
< withdraw
.checked_sub(Epoch(
params.unbonding_len
+ params.cubic_slashing_window_length,
))
.unwrap_or_default()
{
let validator_slashes =
applied_slashes.entry(validator.clone()).or_default();
if !prev_applied_slashes
.iter()
.any(|s| s.clone() == slash.clone())
{
validator_slashes.push(slash.clone());
}
return Some(
acc.unwrap_or_default()
+ decimal_mult_amount(slash.rate, amount),
);
}
acc
});
let slashed_amount =
slashed_amount.map(|slashed| cmp::min(amount, slashed));

let validator_slashes =
applied_slashes.entry(validator.clone()).or_default();
for slash in slashes {
if slash.epoch >= start
&& slash.epoch
< withdraw
.checked_sub(Epoch(
params.unbonding_len
+ params.cubic_slashing_window_length,
))
.unwrap_or_default()
&& !prev_applied_slashes
.iter()
.any(|s| s.clone() == slash.clone())
{
validator_slashes.push(slash.clone());
}
}
let slash_rates_by_epoch = validator_slashes.iter().fold(
BTreeMap::<Epoch, Decimal>::new(),
|mut map, s| {
let cur_rate = map.entry(s.epoch).or_default();
*cur_rate = cmp::min(Decimal::ONE, *cur_rate + s.rate);
map
},
);
let slashed_amount = if slash_rates_by_epoch.is_empty() {
None
} else {
let amount_after_slashing =
get_slashed_amount(params, amount, &slash_rates_by_epoch).unwrap();
Some(amount - token::Amount::from_change(amount_after_slashing))
};
UnbondDetails {
start,
withdraw,
Expand Down
2 changes: 1 addition & 1 deletion proof_of_stake/src/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1003,7 +1003,7 @@ fn test_slashes_with_unbonding_aux(
.unwrap()
.unwrap()
.rate;
println!("Slash 0 rate {slash_rate_0}, slash 1 {slash_rate_1}");
println!("Slash 0 rate {slash_rate_0}, slash 1 rate {slash_rate_1}");

let expected_withdrawn_amount = decimal_mult_amount(
dec!(1) - slash_rate_1,
Expand Down

0 comments on commit 1967ef7

Please sign in to comment.