Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Misc fixes #276

Merged
merged 7 commits into from
Nov 15, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ abci = [
"reqwest",
]
merk-verify = ["merk/verify"]
merk-full = ["merk/full", "ics23"]
merk-full = ["merk/full", "merk-verify", "ics23"]
state-sync = []
feat-ibc = ["ibc", "ics23", "prost-types", "ibc-proto", "tendermint"]

Expand All @@ -104,4 +104,4 @@ required-features = ["abci", "merk-full", "feat-ibc"]
name = "app"
crate-type = ["bin"]
path = "examples/app/main.rs"
required-features = ["feat-ibc", "merk-verify"]
required-features = ["abci", "merk-full", "feat-ibc"]
5 changes: 3 additions & 2 deletions src/coins/staking/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -500,13 +500,14 @@
validator.jail_forever();
validator.slash(self.slash_fraction_double_sign, false)?
};
let multiplier = (Decimal::one() - self.slash_fraction_double_sign)?;
for entry in redelegations.iter() {
let del_address = entry.delegator_address;
for redelegation in entry.outbound_redelegations.iter() {
let mut validator = self.validators.get_mut(redelegation.address.into())?;
let mut delegator = validator.get_mut(del_address.into())?;
delegator.slash_redelegation((multiplier * redelegation.amount)?.amount()?)?;
delegator.slash_redelegation(
(self.slash_fraction_double_sign * redelegation.amount)?.amount()?,
)?;

Check warning on line 510 in src/coins/staking/mod.rs

View check run for this annotation

Codecov / codecov/patch

src/coins/staking/mod.rs#L510

Added line #L510 was not covered by tests
}
}
self.update_vp(val_address)
Expand Down
106 changes: 53 additions & 53 deletions src/coins/staking/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,8 @@ fn setup_state() -> Result<Staking<Simp>> {
unbonding_seconds: UNBONDING_SECONDS,
max_validators: 100,
max_offline_blocks: 50_000,
slash_fraction_downtime: (Amount::new(1) / Amount::new(2))?,
slash_fraction_double_sign: (Amount::new(1) / Amount::new(2))?,
slash_fraction_downtime: (Amount::new(1) / Amount::new(3))?,
slash_fraction_double_sign: (Amount::new(1) / Amount::new(3))?,
min_self_delegation_min: 1,
..Default::default()
};
Expand Down Expand Up @@ -541,12 +541,12 @@ fn undelegate_slash_before_unbond() -> Result<()> {
assert_eq!(ctx.updates.get(&[0; 32]).unwrap().power, 0);
assert_eq!(staking.get(val_0)?.get(staker)?.staked.amount()?, 0);

assert_eq!(staking.get_mut(val_0)?.delegators.balance()?.amount()?, 50);
assert_eq!(staking.get_mut(val_0)?.delegators.balance()?.amount()?, 67);

Context::add(Time::from_seconds(10));
staking.end_block_step(&Default::default())?;
let balance: Amount = simp_balance(&staking.get(val_0)?.get(staker)?.liquid);
assert_eq!(balance, 50);
assert_eq!(balance, 67);

Ok(())
}
Expand Down Expand Up @@ -595,7 +595,7 @@ fn undelegate_slash_after_unbond() -> Result<()> {
assert_eq!(ctx.updates.get(&[0; 32]).unwrap().power, 0);
assert_eq!(staking.get(val_0)?.get(staker)?.staked.amount()?, 0);

assert_eq!(staking.get_mut(val_0)?.delegators.balance()?.amount()?, 50);
assert_eq!(staking.get_mut(val_0)?.delegators.balance()?.amount()?, 67);

staking.end_block_step(&Default::default())?;
let balance: Amount = simp_balance(&staking.get(val_0)?.get(staker)?.liquid);
Expand Down Expand Up @@ -702,10 +702,10 @@ fn redelegate_slash_before_unbond() -> Result<()> {
let val_1 = Address::from_pubkey([1; 33]);

assert_eq!(staking.get(val_0)?.get(staker)?.staked.amount()?, 0);
assert_eq!(staking.get(val_1)?.get(staker)?.staked.amount()?, 50);
assert_eq!(staking.get(val_1)?.get(staker)?.staked.amount()?, 67);

assert_eq!(staking.get_mut(val_0)?.delegators.balance()?.amount()?, 50);
assert_eq!(staking.get_mut(val_1)?.delegators.balance()?.amount()?, 150);
assert_eq!(staking.get_mut(val_0)?.delegators.balance()?.amount()?, 67);
assert_eq!(staking.get_mut(val_1)?.delegators.balance()?.amount()?, 167);

Ok(())
}
Expand Down Expand Up @@ -766,7 +766,7 @@ fn redelegate_slash_after_unbond() -> Result<()> {
assert_eq!(staking.get(val_0)?.get(staker)?.staked.amount()?, 0);
assert_eq!(staking.get(val_1)?.get(staker)?.staked.amount()?, 100);

assert_eq!(staking.get_mut(val_0)?.delegators.balance()?.amount()?, 50);
assert_eq!(staking.get_mut(val_0)?.delegators.balance()?.amount()?, 67);
assert_eq!(staking.get_mut(val_1)?.delegators.balance()?.amount()?, 200);

Ok(())
Expand Down Expand Up @@ -848,23 +848,23 @@ fn redelegation_slash() -> Result<()> {
let val_1 = Address::from_pubkey([1; 33]);
let val_2 = Address::from_pubkey([2; 33]);

assert_eq!(staking.get(val_0)?.get(staker)?.staked.amount()?, 65);
assert_eq!(staking.get(val_1)?.get(staker)?.staked.amount()?, 20);
assert_eq!(staking.get(val_2)?.get(staker)?.staked.amount()?, 165);
assert_eq!(staking.get(val_0)?.get(staker)?.staked.amount()?, 70);
assert_eq!(staking.get(val_1)?.get(staker)?.staked.amount()?, 27);
assert_eq!(staking.get(val_2)?.get(staker)?.staked.amount()?, 170);

assert_eq!(staking.get_mut(val_0)?.delegators.balance()?.amount()?, 165);
assert_eq!(staking.get_mut(val_1)?.delegators.balance()?.amount()?, 70);
assert_eq!(staking.get_mut(val_2)?.delegators.balance()?.amount()?, 265);
assert_eq!(staking.get_mut(val_0)?.delegators.balance()?.amount()?, 170);
assert_eq!(staking.get_mut(val_1)?.delegators.balance()?.amount()?, 93);
assert_eq!(staking.get_mut(val_2)?.delegators.balance()?.amount()?, 270);

staking.punish_double_sign(Address::from_pubkey([0; 33]))?;
staking.end_block_step(&Default::default())?;
assert_eq!(staking.get(val_0)?.get(staker)?.staked.amount()?, 32);
assert_eq!(staking.get(val_1)?.get(staker)?.staked.amount()?, 20);
assert_eq!(staking.get(val_2)?.get(staker)?.staked.amount()?, 140);
assert_eq!(staking.get(val_0)?.get(staker)?.staked.amount()?, 47);
assert_eq!(staking.get(val_1)?.get(staker)?.staked.amount()?, 27);
assert_eq!(staking.get(val_2)?.get(staker)?.staked.amount()?, 153);

assert_eq!(staking.get_mut(val_0)?.delegators.balance()?.amount()?, 82);
assert_eq!(staking.get_mut(val_1)?.delegators.balance()?.amount()?, 70);
assert_eq!(staking.get_mut(val_2)?.delegators.balance()?.amount()?, 240);
assert_eq!(staking.get_mut(val_0)?.delegators.balance()?.amount()?, 113);
assert_eq!(staking.get_mut(val_1)?.delegators.balance()?.amount()?, 93);
assert_eq!(staking.get_mut(val_2)?.delegators.balance()?.amount()?, 253);

Ok(())
}
Expand Down Expand Up @@ -915,7 +915,7 @@ fn redelegation_double_slash() -> Result<()> {
staking.end_block_step(&Default::default())?;

assert_eq!(staking.get(val_0)?.get(staker)?.staked.amount()?, 0);
assert_eq!(staking.get(val_1)?.get(staker)?.staked.amount()?, 25);
assert_eq!(staking.get(val_1)?.get(staker)?.staked.amount()?, 45);

Ok(())
}
Expand Down Expand Up @@ -996,27 +996,27 @@ fn redelegation_slash_with_unbond() -> Result<()> {
let val_1 = Address::from_pubkey([1; 33]);
let val_2 = Address::from_pubkey([2; 33]);

assert_eq!(staking.get(val_0)?.get(staker)?.staked.amount()?, 65);
assert_eq!(staking.get(val_1)?.get(staker)?.staked.amount()?, 20);
assert_eq!(staking.get(val_2)?.get(staker)?.staked.amount()?, 165);
assert_eq!(staking.get(val_0)?.get(staker)?.staked.amount()?, 70);
assert_eq!(staking.get(val_1)?.get(staker)?.staked.amount()?, 27);
assert_eq!(staking.get(val_2)?.get(staker)?.staked.amount()?, 170);

assert_eq!(staking.get_mut(val_0)?.delegators.balance()?.amount()?, 165);
assert_eq!(staking.get_mut(val_1)?.delegators.balance()?.amount()?, 70);
assert_eq!(staking.get_mut(val_2)?.delegators.balance()?.amount()?, 265);
assert_eq!(staking.get_mut(val_0)?.delegators.balance()?.amount()?, 170);
assert_eq!(staking.get_mut(val_1)?.delegators.balance()?.amount()?, 93);
assert_eq!(staking.get_mut(val_2)?.delegators.balance()?.amount()?, 270);

staking.unbond(val_2, staker, Amount::from(100))?;
staking.end_block_step(&Default::default())?;

staking.punish_double_sign(Address::from_pubkey([0; 33]))?;
staking.end_block_step(&Default::default())?;

assert_eq!(staking.get(val_0)?.get(staker)?.staked.amount()?, 32);
assert_eq!(staking.get(val_1)?.get(staker)?.staked.amount()?, 20);
assert_eq!(staking.get(val_2)?.get(staker)?.staked.amount()?, 40);
assert_eq!(staking.get(val_0)?.get(staker)?.staked.amount()?, 47);
assert_eq!(staking.get(val_1)?.get(staker)?.staked.amount()?, 27);
assert_eq!(staking.get(val_2)?.get(staker)?.staked.amount()?, 53);

assert_eq!(staking.get_mut(val_0)?.delegators.balance()?.amount()?, 82);
assert_eq!(staking.get_mut(val_1)?.delegators.balance()?.amount()?, 70);
assert_eq!(staking.get_mut(val_2)?.delegators.balance()?.amount()?, 140);
assert_eq!(staking.get_mut(val_0)?.delegators.balance()?.amount()?, 113);
assert_eq!(staking.get_mut(val_1)?.delegators.balance()?.amount()?, 93);
assert_eq!(staking.get_mut(val_2)?.delegators.balance()?.amount()?, 153);

Context::add(Time::from_seconds(10));
staking.end_block_step(&Default::default())?;
Expand Down Expand Up @@ -1102,37 +1102,37 @@ fn redelegation_slash_with_slash_unbond_overflow() -> Result<()> {
let val_1 = Address::from_pubkey([1; 33]);
let val_2 = Address::from_pubkey([2; 33]);

assert_eq!(staking.get(val_0)?.get(staker)?.staked.amount()?, 65);
assert_eq!(staking.get(val_1)?.get(staker)?.staked.amount()?, 20);
assert_eq!(staking.get(val_2)?.get(staker)?.staked.amount()?, 165);
assert_eq!(staking.get(val_0)?.get(staker)?.staked.amount()?, 70);
assert_eq!(staking.get(val_1)?.get(staker)?.staked.amount()?, 27);
assert_eq!(staking.get(val_2)?.get(staker)?.staked.amount()?, 170);

assert_eq!(staking.get_mut(val_0)?.delegators.balance()?.amount()?, 165);
assert_eq!(staking.get_mut(val_1)?.delegators.balance()?.amount()?, 70);
assert_eq!(staking.get_mut(val_2)?.delegators.balance()?.amount()?, 265);
assert_eq!(staking.get_mut(val_0)?.delegators.balance()?.amount()?, 170);
assert_eq!(staking.get_mut(val_1)?.delegators.balance()?.amount()?, 93);
assert_eq!(staking.get_mut(val_2)?.delegators.balance()?.amount()?, 270);

for _ in 0..15 {
staking.unbond(val_2, staker, Amount::from(10))?;
}

staking.end_block_step(&Default::default())?;

assert_eq!(staking.get(val_2)?.get(staker)?.staked.amount()?, 15);
assert_eq!(staking.get(val_2)?.get(staker)?.staked.amount()?, 20);

staking.punish_double_sign(Address::from_pubkey([0; 33]))?;
staking.end_block_step(&Default::default())?;

assert_eq!(staking.get(val_0)?.get(staker)?.staked.amount()?, 32);
assert_eq!(staking.get(val_1)?.get(staker)?.staked.amount()?, 20);
assert_eq!(staking.get(val_2)?.get(staker)?.staked.amount()?, 0);
assert_eq!(staking.get(val_0)?.get(staker)?.staked.amount()?, 47);
assert_eq!(staking.get(val_1)?.get(staker)?.staked.amount()?, 27);
assert_eq!(staking.get(val_2)?.get(staker)?.staked.amount()?, 3);

assert_eq!(staking.get_mut(val_0)?.delegators.balance()?.amount()?, 82);
assert_eq!(staking.get_mut(val_1)?.delegators.balance()?.amount()?, 70);
assert_eq!(staking.get_mut(val_2)?.delegators.balance()?.amount()?, 100);
assert_eq!(staking.get_mut(val_0)?.delegators.balance()?.amount()?, 113);
assert_eq!(staking.get_mut(val_1)?.delegators.balance()?.amount()?, 93);
assert_eq!(staking.get_mut(val_2)?.delegators.balance()?.amount()?, 103);

Context::add(Time::from_seconds(10));
staking.end_block_step(&Default::default())?;

assert_eq!(simp_balance(&staking.get(val_2)?.get(staker)?.liquid), 140);
assert_eq!(simp_balance(&staking.get(val_2)?.get(staker)?.liquid), 150);

Ok(())
}
Expand Down Expand Up @@ -1204,7 +1204,7 @@ fn min_delegation_fall_below() -> Result<()> {
staking.end_block_step(&Default::default())?;

staking.punish_downtime(Address::from_pubkey([0; 33]))?;
assert_eq!(staking.get_mut(val_0)?.delegators.balance()?.amount()?, 50);
assert_eq!(staking.get_mut(val_0)?.delegators.balance()?.amount()?, 67);
Context::add(Time::from_seconds(10));

staking.end_block_step(&Default::default())?;
Expand All @@ -1219,8 +1219,8 @@ fn min_delegation_fall_below() -> Result<()> {

staking.end_block_step(&Default::default())?;

assert_eq!(staking.get_mut(val_0)?.delegators.balance()?.amount()?, 75);
assert_eq!(ctx.updates.get(&[0; 32]).unwrap().power, 75);
assert_eq!(staking.get_mut(val_0)?.delegators.balance()?.amount()?, 92);
assert_eq!(ctx.updates.get(&[0; 32]).unwrap().power, 92);

Ok(())
}
Expand Down Expand Up @@ -1314,13 +1314,13 @@ fn punish_downtime_jailed() -> Result<()> {
staking.end_block_step(&Default::default())?;

staking.punish_downtime(Address::from_pubkey([0; 33]))?;
assert_eq!(staking.get_mut(val_0)?.delegators.balance()?.amount()?, 50);
assert_eq!(staking.get_mut(val_0)?.delegators.balance()?.amount()?, 67);
staking.end_block_step(&Default::default())?;

staking.punish_double_sign(val_0)?;
staking.end_block_step(&Default::default())?;

assert_eq!(staking.get_mut(val_0)?.delegators.balance()?.amount()?, 25);
assert_eq!(staking.get_mut(val_0)?.delegators.balance()?.amount()?, 44);

Ok(())
}
Expand Down
6 changes: 5 additions & 1 deletion src/ibc/client_contexts.rs
Original file line number Diff line number Diff line change
Expand Up @@ -191,6 +191,10 @@
&mut self,
consensus_state_path: ibc::core::host::types::path::ClientConsensusStatePath,
) -> Result<(), ContextError> {
let epoch_height = format!(
"{}-{}",
consensus_state_path.revision_number, consensus_state_path.revision_height
);

Check warning on line 197 in src/ibc/client_contexts.rs

View check run for this annotation

Codecov / codecov/patch

src/ibc/client_contexts.rs#L194-L197

Added lines #L194 - L197 were not covered by tests
self.clients
.get_mut(consensus_state_path.client_id.clone().into())
.map_err(|_| ClientError::ClientSpecific {
Expand All @@ -200,7 +204,7 @@
client_id: consensus_state_path.client_id.clone(),
})?
.consensus_states
.remove(consensus_state_path.revision_height.to_string().into())
.remove(epoch_height.into())

Check warning on line 207 in src/ibc/client_contexts.rs

View check run for this annotation

Codecov / codecov/patch

src/ibc/client_contexts.rs#L207

Added line #L207 was not covered by tests
.map_err(|_| ClientError::ClientSpecific {
description: "Unable to delete consensus state".to_string(),
})?;
Expand Down
2 changes: 2 additions & 0 deletions src/merk/store.rs
Original file line number Diff line number Diff line change
Expand Up @@ -302,6 +302,7 @@
self.write(metadata)?;
self.merk.as_mut().unwrap().flush()?;

#[cfg(feature = "state-sync")]
let recent = std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.unwrap()
Expand Down Expand Up @@ -393,6 +394,7 @@
&& calc_app_hash(snapshot.hash.to_vec().as_slice()) == req.app_hash
{
self.target_snapshot = Some(snapshot);
self.restorer = None;

Check warning on line 397 in src/merk/store.rs

View check run for this annotation

Codecov / codecov/patch

src/merk/store.rs#L397

Added line #L397 was not covered by tests
res.set_result(abci::response_offer_snapshot::Result::Accept);
}
}
Expand Down
Loading