Skip to content

Commit 11d22cd

Browse files
committed
Moving get_minimum_delegation_rate back to runtime
1 parent cf970bf commit 11d22cd

File tree

5 files changed

+93
-39
lines changed

5 files changed

+93
-39
lines changed

execution_engine/src/runtime/mod.rs

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ use casper_types::{
5252
},
5353
system::{
5454
self,
55-
auction::{self, DelegatorKind, EraInfo},
55+
auction::{self, DelegatorKind, EraInfo, MINIMUM_DELEGATION_RATE_KEY},
5656
handle_payment,
5757
mint::{self, MINT_SUSTAIN_PURSE_KEY},
5858
CallStackElement, Caller, CallerInfo, SystemEntityType, AUCTION, HANDLE_PAYMENT, MINT,
@@ -1084,7 +1084,7 @@ where
10841084

10851085
let max_delegators_per_validator =
10861086
self.context.engine_config().max_delegators_per_validator();
1087-
1087+
let minimum_delegation_rate = self.get_minimum_delegation_rate()?;
10881088
let minimum_bid_amount = self.context().engine_config().minimum_bid_amount();
10891089

10901090
let result = runtime
@@ -1099,6 +1099,7 @@ where
10991099
reserved_slots,
11001100
global_minimum_delegation_amount,
11011101
global_maximum_delegation_amount,
1102+
minimum_delegation_rate,
11021103
)
11031104
.map_err(Self::reverter)?;
11041105

@@ -1325,8 +1326,9 @@ where
13251326
let reservations =
13261327
Self::get_named_argument(runtime_args, auction::ARG_RESERVATIONS)?;
13271328

1329+
let minimum_delegation_rate = self.get_minimum_delegation_rate()?;
13281330
runtime
1329-
.add_reservations(reservations)
1331+
.add_reservations(reservations, minimum_delegation_rate)
13301332
.map_err(Self::reverter)?;
13311333

13321334
CLValue::from_t(()).map_err(Self::reverter)
@@ -4665,6 +4667,31 @@ where
46654667
)?;
46664668
Ok(Ok(()))
46674669
}
4670+
4671+
fn get_minimum_delegation_rate(&self) -> Result<u8, ExecError> {
4672+
let auction_contract_hash = self.context.get_system_contract(AUCTION)?;
4673+
let auction_named_keys = self
4674+
.context
4675+
.state()
4676+
.borrow_mut()
4677+
.get_named_keys(EntityAddr::System(auction_contract_hash.value()))?;
4678+
let minimum_delegation_rate_key =
4679+
auction_named_keys.get(MINIMUM_DELEGATION_RATE_KEY).ok_or(
4680+
ExecError::NamedKeyNotFound(MINIMUM_DELEGATION_RATE_KEY.to_string()),
4681+
)?;
4682+
let stored_value = self
4683+
.context
4684+
.state()
4685+
.borrow_mut()
4686+
.read(minimum_delegation_rate_key)?
4687+
.ok_or_else(|| ExecError::KeyNotFound(*minimum_delegation_rate_key))?;
4688+
if let StoredValue::CLValue(cl_value) = stored_value {
4689+
let minimum_delegation_rate: u8 = cl_value.into_t().map_err(ExecError::CLValue)?;
4690+
Ok(minimum_delegation_rate)
4691+
} else {
4692+
Err(ExecError::UnexpectedStoredValueVariant)
4693+
}
4694+
}
46684695
}
46694696

46704697
#[cfg(feature = "test-support")]

storage/src/global_state/state/mod.rs

Lines changed: 27 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1271,20 +1271,25 @@ pub trait StateProvider: Send + Sync + Sized {
12711271
minimum_bid_amount,
12721272
reserved_slots,
12731273
} => runtime
1274-
.add_bid(
1275-
public_key,
1276-
delegation_rate,
1277-
amount,
1278-
minimum_delegation_amount,
1279-
maximum_delegation_amount,
1280-
minimum_bid_amount,
1281-
max_delegators_per_validator,
1282-
reserved_slots,
1283-
global_minimum_delegation_limit,
1284-
global_maximum_delegation_limit,
1285-
)
1286-
.map(AuctionMethodRet::UpdatedAmount)
1287-
.map_err(TrackingCopyError::Api),
1274+
.get_minimum_delegation_rate()
1275+
.and_then(|minimum_delegation_rate| {
1276+
runtime
1277+
.add_bid(
1278+
public_key,
1279+
delegation_rate,
1280+
amount,
1281+
minimum_delegation_amount,
1282+
maximum_delegation_amount,
1283+
minimum_bid_amount,
1284+
max_delegators_per_validator,
1285+
reserved_slots,
1286+
global_minimum_delegation_limit,
1287+
global_maximum_delegation_limit,
1288+
minimum_delegation_rate,
1289+
)
1290+
.map(AuctionMethodRet::UpdatedAmount)
1291+
.map_err(TrackingCopyError::Api)
1292+
}),
12881293
AuctionMethod::WithdrawBid {
12891294
public_key,
12901295
amount,
@@ -1335,10 +1340,14 @@ pub trait StateProvider: Send + Sync + Sized {
13351340
TrackingCopyError::SystemContract(system::Error::Auction(auc_err))
13361341
}),
13371342
AuctionMethod::AddReservations { reservations } => runtime
1338-
.add_reservations(reservations)
1339-
.map(|_| AuctionMethodRet::Unit)
1340-
.map_err(|auc_err| {
1341-
TrackingCopyError::SystemContract(system::Error::Auction(auc_err))
1343+
.get_minimum_delegation_rate()
1344+
.and_then(|minimum_delegation_rate| {
1345+
runtime
1346+
.add_reservations(reservations, minimum_delegation_rate)
1347+
.map(|_| AuctionMethodRet::Unit)
1348+
.map_err(|auc_err| {
1349+
TrackingCopyError::SystemContract(system::Error::Auction(auc_err))
1350+
})
13421351
}),
13431352
AuctionMethod::CancelReservations {
13441353
validator,

storage/src/system/auction.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,14 +80,14 @@ pub trait Auction:
8080
reserved_slots: u32,
8181
global_minimum_delegation_amount: u64,
8282
global_maximum_delegation_amount: u64,
83+
minimum_delegation_rate: u8,
8384
) -> Result<U512, ApiError> {
8485
if !self.allow_auction_bids() {
8586
// The validator set may be closed on some side chains,
8687
// which is configured by disabling bids.
8788
return Err(Error::AuctionBidsDisabled.into());
8889
}
8990

90-
let minimum_delegation_rate = detail::get_minimum_delegation_rate(self)?;
9191
if amount == U512::zero() {
9292
return Err(Error::BondTooSmall.into());
9393
}
@@ -397,12 +397,15 @@ pub trait Auction:
397397
/// delegator slots is exceeded it returns an error.
398398
///
399399
/// If given reservation exists already and the delegation rate was changed it's updated.
400-
fn add_reservations(&mut self, reservations: Vec<Reservation>) -> Result<(), Error> {
400+
fn add_reservations(
401+
&mut self,
402+
reservations: Vec<Reservation>,
403+
minimum_delegation_rate: u8,
404+
) -> Result<(), Error> {
401405
if !self.allow_auction_bids() {
402406
// The auction process can be disabled on a given network.
403407
return Err(Error::AuctionBidsDisabled);
404408
}
405-
let minimum_delegation_rate = detail::get_minimum_delegation_rate(self)?;
406409
for reservation in reservations {
407410
if !self
408411
.is_allowed_session_caller(&AccountHash::from(reservation.validator_public_key()))

storage/src/system/auction/detail.rs

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,13 @@ use super::{
66
use casper_types::{
77
bytesrepr::{FromBytes, ToBytes},
88
system::auction::{
9-
BidAddr, BidAddrTag, BidKind, DelegationRate, DelegatorBid, DelegatorBids, DelegatorKind,
10-
Error, Reservation, Reservations, SeigniorageRecipient, SeigniorageRecipientV2,
9+
BidAddr, BidAddrTag, BidKind, DelegatorBid, DelegatorBids, DelegatorKind, Error,
10+
Reservation, Reservations, SeigniorageRecipient, SeigniorageRecipientV2,
1111
SeigniorageRecipientsSnapshot, SeigniorageRecipientsSnapshotV1,
1212
SeigniorageRecipientsSnapshotV2, SeigniorageRecipientsV2, Unbond, UnbondEra, UnbondKind,
1313
ValidatorBid, ValidatorBids, ValidatorCredit, ValidatorCredits, WeightsBreakout,
1414
AUCTION_DELAY_KEY, DELEGATION_RATE_DENOMINATOR, ERA_END_TIMESTAMP_MILLIS_KEY, ERA_ID_KEY,
15-
MINIMUM_DELEGATION_RATE_KEY, SEIGNIORAGE_RECIPIENTS_SNAPSHOT_KEY, UNBONDING_DELAY_KEY,
16-
VALIDATOR_SLOTS_KEY,
15+
SEIGNIORAGE_RECIPIENTS_SNAPSHOT_KEY, UNBONDING_DELAY_KEY, VALIDATOR_SLOTS_KEY,
1716
},
1817
AccessRights, ApiError, CLTyped, EraId, Key, KeyTag, PublicKey, URef, U512,
1918
};
@@ -404,14 +403,6 @@ where
404403
read_from(provider, SEIGNIORAGE_RECIPIENTS_SNAPSHOT_KEY)
405404
}
406405

407-
/// Returns minimum_delegation_rate.
408-
pub fn get_minimum_delegation_rate<P>(provider: &mut P) -> Result<DelegationRate, Error>
409-
where
410-
P: StorageProvider + RuntimeProvider + ?Sized,
411-
{
412-
read_from(provider, MINIMUM_DELEGATION_RATE_KEY)
413-
}
414-
415406
/// Returns seigniorage recipients snapshot in legacy format.
416407
pub fn get_legacy_seigniorage_recipients_snapshot<P>(
417408
provider: &mut P,

storage/src/system/runtime_native.rs

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,12 @@ use crate::{
44
AddressGenerator, TrackingCopy,
55
};
66
use casper_types::{
7-
account::AccountHash, contracts::NamedKeys, Chainspec, ContextAccessRights, EntityAddr,
8-
FeeHandling, Key, Phase, ProtocolVersion, PublicKey, RefundHandling, RewardsHandling,
9-
RuntimeFootprint, StoredValue, TransactionHash, Transfer, URef, U512,
7+
account::AccountHash,
8+
contracts::NamedKeys,
9+
system::{auction::MINIMUM_DELEGATION_RATE_KEY, AUCTION},
10+
Chainspec, ContextAccessRights, EntityAddr, FeeHandling, Key, Phase, ProtocolVersion,
11+
PublicKey, RefundHandling, RewardsHandling, RuntimeFootprint, StoredValue, TransactionHash,
12+
Transfer, URef, U512,
1013
};
1114
use num_rational::Ratio;
1215
use parking_lot::RwLock;
@@ -600,4 +603,25 @@ where
600603
pub(crate) fn native_transfer_cost(&self) -> u32 {
601604
self.config.native_transfer_cost
602605
}
606+
607+
pub(crate) fn get_minimum_delegation_rate(&self) -> Result<u8, TrackingCopyError> {
608+
let mut borrow_mut = self.tracking_copy.borrow_mut();
609+
let key = borrow_mut
610+
.system_contract_named_key(AUCTION, MINIMUM_DELEGATION_RATE_KEY)?
611+
.ok_or(TrackingCopyError::NamedKeyNotFound(
612+
MINIMUM_DELEGATION_RATE_KEY.to_string(),
613+
))?;
614+
let stored_value = borrow_mut
615+
.read(&key)?
616+
.ok_or(TrackingCopyError::ValueNotFound(
617+
MINIMUM_DELEGATION_RATE_KEY.to_string(),
618+
))?;
619+
if let StoredValue::CLValue(cl_value) = stored_value {
620+
let minimum_delegation_rate: u8 =
621+
cl_value.into_t().map_err(TrackingCopyError::CLValue)?;
622+
Ok(minimum_delegation_rate)
623+
} else {
624+
Err(TrackingCopyError::UnexpectedStoredValueVariant)
625+
}
626+
}
603627
}

0 commit comments

Comments
 (0)