@@ -11,6 +11,7 @@ use std::{fmt, time::Duration};
11
11
use witnet_config:: defaults:: PSEUDO_CONSENSUS_CONSTANTS_WIP0022_REWARD_COLLATERAL_RATIO ;
12
12
use witnet_data_structures:: {
13
13
chain:: { tapi:: current_active_wips, DataRequestOutput , Hashable } ,
14
+ data_request:: calculate_reward_collateral_ratio,
14
15
error:: TransactionError ,
15
16
proto:: ProtobufConvert ,
16
17
radon_error:: RadonErrors ,
@@ -177,7 +178,7 @@ impl DrSender {
177
178
Err ( err) => {
178
179
// Error deserializing or validating data request: mark data request as
179
180
// 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) ;
181
182
let result = err. encode_cbor ( ) ;
182
183
// In this case there is no data request transaction, so
183
184
// 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(
310
311
match DataRequestOutput :: from_pb_bytes ( dr_bytes) {
311
312
Err ( e) => Err ( DrSenderError :: Deserialization { msg : e. to_string ( ) } ) ,
312
313
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 ( ) ;
315
315
validate_data_request_output (
316
316
& 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 ,
319
319
& current_active_wips ( ) ,
320
320
)
321
321
. map_err ( |e| match e {
@@ -326,7 +326,21 @@ fn deserialize_and_validate_dr_bytes(
326
326
} ) ?;
327
327
328
328
// 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
+ }
330
344
if ( dr_output. collateral != 0 ) && ( dr_output. collateral < dr_min_collateral_nanowits) {
331
345
return Err ( DrSenderError :: InvalidCollateral {
332
346
msg : format ! (
0 commit comments