From 2a8be75f8ec17dbd1b999bcec09dfaec25ee056d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guillermo=20D=C3=ADaz?= Date: Fri, 31 May 2024 13:45:07 +0200 Subject: [PATCH] feat(c-brige): force min collateral --- .../src/actors/dr_sender.rs | 26 ++++++++++++++----- data_structures/src/data_request.rs | 1 + 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/bridges/centralized-ethereum/src/actors/dr_sender.rs b/bridges/centralized-ethereum/src/actors/dr_sender.rs index 7798d1d06..bc6c9428e 100644 --- a/bridges/centralized-ethereum/src/actors/dr_sender.rs +++ b/bridges/centralized-ethereum/src/actors/dr_sender.rs @@ -11,6 +11,7 @@ use std::{fmt, time::Duration}; use witnet_config::defaults::PSEUDO_CONSENSUS_CONSTANTS_WIP0022_REWARD_COLLATERAL_RATIO; use witnet_data_structures::{ chain::{tapi::current_active_wips, DataRequestOutput, Hashable}, + data_request::calculate_reward_collateral_ratio, error::TransactionError, proto::ProtobufConvert, radon_error::RadonErrors, @@ -177,7 +178,7 @@ impl DrSender { Err(err) => { // Error deserializing or validating data request: mark data request as // error and report error as result to ethereum. - log::error!("[{}] >< unacceptable data request bytecode: {}", dr_id, err); + log::error!("[{}] >< unacceptable data request: {}", dr_id, err); let result = err.encode_cbor(); // In this case there is no data request transaction, so // 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( match DataRequestOutput::from_pb_bytes(dr_bytes) { Err(e) => Err(DrSenderError::Deserialization { msg: e.to_string() }), Ok(dr_output) => { - let required_reward_collateral_ratio = - PSEUDO_CONSENSUS_CONSTANTS_WIP0022_REWARD_COLLATERAL_RATIO; + let mut dr_output = dr_output.clone(); validate_data_request_output( &dr_output, - dr_output.collateral, // we don't want to ever alter the dro_hash - required_reward_collateral_ratio, + dr_min_collateral_nanowits, // dro_hash may be altered if dr_output.collateral goes below this value + PSEUDO_CONSENSUS_CONSTANTS_WIP0022_REWARD_COLLATERAL_RATIO, ¤t_active_wips(), ) .map_err(|e| match e { @@ -326,7 +326,21 @@ fn deserialize_and_validate_dr_bytes( })?; // Collateral value validation - // If collateral is equal to 0 means that is equal to collateral_minimum value + if dr_output.collateral < dr_min_collateral_nanowits { + // modify data request's collateral if below some minimum, + // while maintaining same reward collateral ratio in such case: + let reward_collateral_ratio = calculate_reward_collateral_ratio( + dr_output.collateral, + dr_min_collateral_nanowits, + dr_output.witness_reward, + ); + dr_output.collateral = dr_min_collateral_nanowits; + dr_output.witness_reward = calculate_reward_collateral_ratio( + dr_min_collateral_nanowits, + dr_min_collateral_nanowits, + reward_collateral_ratio, + ); + } if (dr_output.collateral != 0) && (dr_output.collateral < dr_min_collateral_nanowits) { return Err(DrSenderError::InvalidCollateral { msg: format!( diff --git a/data_structures/src/data_request.rs b/data_structures/src/data_request.rs index 4e74ad0b8..f7d375116 100644 --- a/data_structures/src/data_request.rs +++ b/data_structures/src/data_request.rs @@ -517,6 +517,7 @@ pub fn calculate_reward_collateral_ratio( witness_reward: u64, ) -> u64 { let dr_collateral = if collateral == 0 { + // if collateral is equal to 0 means that is equal to collateral_minimum value collateral_minimum } else { collateral