diff --git a/tig-protocol/src/contracts/rewards.rs b/tig-protocol/src/contracts/rewards.rs index ab28db4..84ebae1 100644 --- a/tig-protocol/src/contracts/rewards.rs +++ b/tig-protocol/src/contracts/rewards.rs @@ -136,40 +136,44 @@ pub(crate) async fn update(cache: &mut AddBlockCache) { let zero = PreciseNumber::from(0); for (delegatee, opow_data) in active_opow_block_data.iter_mut() { opow_data.reward = opow_data.influence * reward_pool; - opow_data.reward_share = active_players_state[delegatee] - .reward_share - .as_ref() - .map_or(config.deposits.default_reward_share, |x| x.value) - .clone(); - opow_data.coinbase = active_players_state[delegatee] - .coinbase - .as_ref() - .map_or_else( - || HashMap::from([(delegatee.clone(), 1.0)]), - |x| x.value.clone(), - ); if opow_data.reward == zero { continue; } - let shared_amount = if opow_data.delegated_weighted_deposit == zero { - zero.clone() - } else { - opow_data.reward * PreciseNumber::from_f64(opow_data.reward_share) - }; - let coinbase_amount = opow_data.reward - shared_amount; + if opow_data.delegated_weighted_deposit > zero { + opow_data.reward_share = opow_data.reward + * PreciseNumber::from_f64( + active_players_state[delegatee] + .reward_share + .as_ref() + .map_or(config.deposits.default_reward_share, |x| x.value) + .clone(), + ) + } + let coinbase_amount = opow_data.reward - opow_data.reward_share; - for (output, fraction) in opow_data.coinbase.iter() { - let player_data = active_players_block_data.get_mut(output).unwrap(); + for (output, fraction) in active_players_state[delegatee] + .coinbase + .as_ref() + .map_or_else( + || HashMap::from([(delegatee.clone(), 1.0)]), + |x| x.value.clone(), + ) + .iter() + { let fraction = PreciseNumber::from_f64(*fraction); + let amount = coinbase_amount * fraction; + opow_data.coinbase.insert(output.clone(), amount.clone()); + + let player_data = active_players_block_data.get_mut(output).unwrap(); *player_data .reward_by_type .entry(RewardType::Benchmarker) - .or_insert(zero.clone()) += coinbase_amount * fraction; + .or_insert(zero.clone()) += amount; } - if shared_amount == zero { + if opow_data.reward_share == zero { continue; } @@ -179,8 +183,9 @@ pub(crate) async fn update(cache: &mut AddBlockCache) { *player_data .reward_by_type .entry(RewardType::Delegator) - .or_insert(zero.clone()) += shared_amount * fraction * player_data.weighted_deposit - / opow_data.delegated_weighted_deposit; + .or_insert(zero.clone()) += + opow_data.reward_share * fraction * player_data.weighted_deposit + / opow_data.delegated_weighted_deposit; } } } diff --git a/tig-structs/src/core.rs b/tig-structs/src/core.rs index 889239d..64f8635 100644 --- a/tig-structs/src/core.rs +++ b/tig-structs/src/core.rs @@ -353,8 +353,8 @@ serializable_struct_with_getters! { self_deposit: PreciseNumber, delegated_weighted_deposit: PreciseNumber, delegators: HashSet, - reward_share: f64, - coinbase: HashMap, + reward_share: PreciseNumber, + coinbase: HashMap, imbalance: PreciseNumber, influence: PreciseNumber, reward: PreciseNumber,