@@ -11,6 +11,7 @@ use std::{fmt, time::Duration};
1111use witnet_config:: defaults:: PSEUDO_CONSENSUS_CONSTANTS_WIP0022_REWARD_COLLATERAL_RATIO ;
1212use 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,27 @@ 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+ let dro_hash = dr_output. hash ( ) ;
338+ let dro_prev_collateral = dr_output. collateral ;
339+ let dro_prev_witness_reward = dr_output. witness_reward ;
340+ dr_output. collateral = dr_min_collateral_nanowits;
341+ dr_output. witness_reward = calculate_reward_collateral_ratio (
342+ dr_min_collateral_nanowits,
343+ dr_min_collateral_nanowits,
344+ reward_collateral_ratio,
345+ ) ;
346+ log:: warn!( "DRO [{}]: witnessing collateral ({}) increased to mininum ({})" , dro_hash, dro_prev_collateral, dr_min_collateral_nanowits) ;
347+ log:: warn!( "DRO [{}]: witnessing reward ({}) proportionally increased ({})" , dro_hash, dro_prev_witness_reward, dr_output. witness_reward)
348+
349+ }
330350 if ( dr_output. collateral != 0 ) && ( dr_output. collateral < dr_min_collateral_nanowits) {
331351 return Err ( DrSenderError :: InvalidCollateral {
332352 msg : format ! (
0 commit comments