Skip to content

Commit 2a8be75

Browse files
committed
feat(c-brige): force min collateral
1 parent 0eba400 commit 2a8be75

File tree

2 files changed

+21
-6
lines changed

2 files changed

+21
-6
lines changed

bridges/centralized-ethereum/src/actors/dr_sender.rs

+20-6
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ use std::{fmt, time::Duration};
1111
use witnet_config::defaults::PSEUDO_CONSENSUS_CONSTANTS_WIP0022_REWARD_COLLATERAL_RATIO;
1212
use witnet_data_structures::{
1313
chain::{tapi::current_active_wips, DataRequestOutput, Hashable},
14+
data_request::calculate_reward_collateral_ratio,
1415
error::TransactionError,
1516
proto::ProtobufConvert,
1617
radon_error::RadonErrors,
@@ -177,7 +178,7 @@ impl DrSender {
177178
Err(err) => {
178179
// Error deserializing or validating data request: mark data request as
179180
// error and report error as result to ethereum.
180-
log::error!("[{}] >< unacceptable data request bytecode: {}", dr_id, err);
181+
log::error!("[{}] >< unacceptable data request: {}", dr_id, err);
181182
let result = err.encode_cbor();
182183
// In this case there is no data request transaction, so
183184
// we set both the dr_tx_hash and dr_tally_tx_hash to zero values.
@@ -310,12 +311,11 @@ fn deserialize_and_validate_dr_bytes(
310311
match DataRequestOutput::from_pb_bytes(dr_bytes) {
311312
Err(e) => Err(DrSenderError::Deserialization { msg: e.to_string() }),
312313
Ok(dr_output) => {
313-
let required_reward_collateral_ratio =
314-
PSEUDO_CONSENSUS_CONSTANTS_WIP0022_REWARD_COLLATERAL_RATIO;
314+
let mut dr_output = dr_output.clone();
315315
validate_data_request_output(
316316
&dr_output,
317-
dr_output.collateral, // we don't want to ever alter the dro_hash
318-
required_reward_collateral_ratio,
317+
dr_min_collateral_nanowits, // dro_hash may be altered if dr_output.collateral goes below this value
318+
PSEUDO_CONSENSUS_CONSTANTS_WIP0022_REWARD_COLLATERAL_RATIO,
319319
&current_active_wips(),
320320
)
321321
.map_err(|e| match e {
@@ -326,7 +326,21 @@ fn deserialize_and_validate_dr_bytes(
326326
})?;
327327

328328
// Collateral value validation
329-
// If collateral is equal to 0 means that is equal to collateral_minimum value
329+
if dr_output.collateral < dr_min_collateral_nanowits {
330+
// modify data request's collateral if below some minimum,
331+
// while maintaining same reward collateral ratio in such case:
332+
let reward_collateral_ratio = calculate_reward_collateral_ratio(
333+
dr_output.collateral,
334+
dr_min_collateral_nanowits,
335+
dr_output.witness_reward,
336+
);
337+
dr_output.collateral = dr_min_collateral_nanowits;
338+
dr_output.witness_reward = calculate_reward_collateral_ratio(
339+
dr_min_collateral_nanowits,
340+
dr_min_collateral_nanowits,
341+
reward_collateral_ratio,
342+
);
343+
}
330344
if (dr_output.collateral != 0) && (dr_output.collateral < dr_min_collateral_nanowits) {
331345
return Err(DrSenderError::InvalidCollateral {
332346
msg: format!(

data_structures/src/data_request.rs

+1
Original file line numberDiff line numberDiff line change
@@ -517,6 +517,7 @@ pub fn calculate_reward_collateral_ratio(
517517
witness_reward: u64,
518518
) -> u64 {
519519
let dr_collateral = if collateral == 0 {
520+
// if collateral is equal to 0 means that is equal to collateral_minimum value
520521
collateral_minimum
521522
} else {
522523
collateral

0 commit comments

Comments
 (0)