diff --git a/bridges/centralized-ethereum/src/actors/dr_sender.rs b/bridges/centralized-ethereum/src/actors/dr_sender.rs index 7798d1d06..0f80f64f2 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; 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,36 @@ 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, + ); + let dro_hash = dr_output.hash(); + let dro_prev_collateral = dr_output.collateral; + let dro_prev_witness_reward = 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, + ); + log::warn!( + "DRO [{}]: witnessing collateral ({}) increased to minimum ({})", + dro_hash, + dro_prev_collateral, + dr_min_collateral_nanowits + ); + log::warn!( + "DRO [{}]: witnessing reward ({}) proportionally increased ({})", + dro_hash, + dro_prev_witness_reward, + dr_output.witness_reward + ) + } 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 diff --git a/data_structures/src/staking/errors.rs b/data_structures/src/staking/errors.rs index d0c26600b..03ac013a8 100644 --- a/data_structures/src/staking/errors.rs +++ b/data_structures/src/staking/errors.rs @@ -1,4 +1,4 @@ -use crate::staking::aux::StakeKey; +use crate::staking::helpers::StakeKey; use failure::Fail; use std::{ convert::From, diff --git a/data_structures/src/staking/mod.rs b/data_structures/src/staking/mod.rs index d678c71e3..3b9fe5e98 100644 --- a/data_structures/src/staking/mod.rs +++ b/data_structures/src/staking/mod.rs @@ -1,11 +1,11 @@ #![deny(missing_docs)] -/// Auxiliary convenience types and data structures. -pub mod helpers; /// Constants related to the staking functionality. pub mod constants; /// Errors related to the staking functionality. pub mod errors; +/// Auxiliary convenience types and data structures. +pub mod helpers; /// The data structure and related logic for stake entries. pub mod stake; /// The data structure and related logic for keeping track of multiple stake entries. @@ -16,9 +16,9 @@ pub mod stakes; pub mod prelude { pub use crate::capabilities::*; - pub use super::helpers::*; pub use super::constants::*; pub use super::errors::*; + pub use super::helpers::*; pub use super::stake::*; pub use super::stakes::*; } diff --git a/data_structures/src/wit.rs b/data_structures/src/wit.rs index c9974003b..0023df3ea 100644 --- a/data_structures/src/wit.rs +++ b/data_structures/src/wit.rs @@ -2,7 +2,7 @@ use std::{fmt, ops::*}; use serde::{Deserialize, Serialize}; -use crate::{chain::Epoch, staking::aux::Power}; +use crate::{chain::Epoch, staking::helpers::Power}; /// 1 nanowit is the minimal unit of value /// 1 wit = 10^9 nanowits diff --git a/node/src/actors/messages.rs b/node/src/actors/messages.rs index 3b31b0ee7..efb18b360 100644 --- a/node/src/actors/messages.rs +++ b/node/src/actors/messages.rs @@ -27,7 +27,7 @@ use witnet_data_structures::{ }, fee::{deserialize_fee_backwards_compatible, Fee}, radon_report::RadonReport, - staking::{aux::StakeKey, stakes::QueryStakesKey}, + staking::{helpers::StakeKey, stakes::QueryStakesKey}, transaction::{ CommitTransaction, DRTransaction, RevealTransaction, StakeTransaction, Transaction, VTTransaction,