Skip to content

Commit d2d6f8a

Browse files
committed
refactor: extract fee calculation and distribution logic into a separate function
1 parent aed23cf commit d2d6f8a

File tree

3 files changed

+84
-45
lines changed

3 files changed

+84
-45
lines changed

contracts/escrow/src/core/dispute.rs

Lines changed: 23 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use soroban_sdk::{Address, Env, Map, String};
44
use crate::core::escrow::EscrowManager;
55
use crate::core::validators::milestone::validate_and_convert_milestone_index;
66
use crate::error::ContractError;
7+
use crate::modules::fee::distribution::calculate_and_distribute_fees;
78
use crate::modules::{
89
fee::{FeeCalculator, FeeCalculatorTrait},
910
math::{BasicArithmetic, BasicMath},
@@ -59,29 +60,17 @@ impl DisputeManager {
5960

6061
let fee_result =
6162
FeeCalculator::calculate_standard_fees(total, escrow.platform_fee)?;
62-
let total_fees = BasicMath::safe_add(fee_result.trustless_work_fee, fee_result.platform_fee)?;
63-
64-
if fee_result.trustless_work_fee > 0 {
65-
token_client.transfer(&contract_address, &trustless_work_address, &fee_result.trustless_work_fee);
66-
}
67-
if fee_result.platform_fee > 0 {
68-
token_client.transfer(
69-
&contract_address,
70-
&escrow.roles.platform,
71-
&fee_result.platform_fee,
72-
);
73-
}
74-
75-
for (addr, amount) in distributions.iter() {
76-
if amount > 0 {
77-
let fee_share =
78-
BasicMath::safe_div(BasicMath::safe_mul(amount, total_fees)?, total)?;
79-
let net_amount = BasicMath::safe_sub(amount, fee_share)?;
80-
if net_amount > 0 {
81-
token_client.transfer(&contract_address, &addr, &net_amount);
82-
}
83-
}
84-
}
63+
64+
calculate_and_distribute_fees(
65+
e,
66+
&token_client,
67+
&contract_address,
68+
&trustless_work_address,
69+
&escrow.roles.platform,
70+
&fee_result,
71+
&distributions,
72+
total,
73+
)?;
8574

8675
e.storage().persistent().set(&DataKey::Escrow, &escrow);
8776
e.storage()
@@ -131,28 +120,17 @@ impl DisputeManager {
131120

132121
let fee_result =
133122
FeeCalculator::calculate_standard_fees(total, escrow.platform_fee)?;
134-
let total_fees = BasicMath::safe_add(fee_result.trustless_work_fee, fee_result.platform_fee)?;
135-
136-
if fee_result.trustless_work_fee > 0 {
137-
token_client.transfer(&contract_address, &trustless_work_address, &fee_result.trustless_work_fee);
138-
}
139-
if fee_result.platform_fee > 0 {
140-
token_client.transfer(
141-
&contract_address,
142-
&escrow.roles.platform,
143-
&fee_result.platform_fee,
144-
);
145-
}
146-
147-
for (addr, amount) in distributions.iter() {
148-
if amount > 0 {
149-
let fee_share = BasicMath::safe_div(BasicMath::safe_mul(amount, total_fees)?, total)?;
150-
let net_amount = BasicMath::safe_sub(amount, fee_share)?;
151-
if net_amount > 0 {
152-
token_client.transfer(&contract_address, &addr, &net_amount);
153-
}
154-
}
155-
}
123+
124+
calculate_and_distribute_fees(
125+
e,
126+
&token_client,
127+
&contract_address,
128+
&trustless_work_address,
129+
&escrow.roles.platform,
130+
&fee_result,
131+
&distributions,
132+
total,
133+
)?;
156134

157135
let mut updated_milestones = escrow.milestones.clone();
158136
let mut new_flags = milestone.flags.clone();

contracts/escrow/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ mod modules {
2929

3030
pub mod fee {
3131
pub mod calculator;
32+
pub mod distribution;
3233

3334
pub use calculator::*;
3435
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
use soroban_sdk::token::Client as TokenClient;
2+
use soroban_sdk::{Address, Env, Map, Vec};
3+
4+
use crate::error::ContractError;
5+
use super::StandardFeeResult;
6+
use crate::modules::math::{BasicArithmetic, BasicMath};
7+
8+
pub fn calculate_and_distribute_fees(
9+
e: &Env,
10+
token_client: &TokenClient,
11+
contract_address: &Address,
12+
trustless_work_address: &Address,
13+
platform_address: &Address,
14+
fee_result: &StandardFeeResult,
15+
distributions: &Map<Address, i128>,
16+
total: i128,
17+
) -> Result<(), ContractError> {
18+
let mut actual_trustless_fees = 0i128;
19+
let mut actual_platform_fees = 0i128;
20+
let mut net_distributions: Vec<(Address, i128)> = Vec::new(e);
21+
22+
for (addr, amount) in distributions.iter() {
23+
if amount > 0 {
24+
let recipient_trustless_fee = BasicMath::safe_div(
25+
BasicMath::safe_mul(amount, fee_result.trustless_work_fee)?,
26+
total,
27+
)?;
28+
let recipient_platform_fee = BasicMath::safe_div(
29+
BasicMath::safe_mul(amount, fee_result.platform_fee)?,
30+
total,
31+
)?;
32+
33+
let total_recipient_fee =
34+
BasicMath::safe_add(recipient_trustless_fee, recipient_platform_fee)?;
35+
let net_amount = BasicMath::safe_sub(amount, total_recipient_fee)?;
36+
37+
actual_trustless_fees =
38+
BasicMath::safe_add(actual_trustless_fees, recipient_trustless_fee)?;
39+
actual_platform_fees =
40+
BasicMath::safe_add(actual_platform_fees, recipient_platform_fee)?;
41+
42+
if net_amount > 0 {
43+
net_distributions.push_back((addr.clone(), net_amount));
44+
}
45+
}
46+
}
47+
48+
if actual_trustless_fees > 0 {
49+
token_client.transfer(contract_address, trustless_work_address, &actual_trustless_fees);
50+
}
51+
if actual_platform_fees > 0 {
52+
token_client.transfer(contract_address, platform_address, &actual_platform_fees);
53+
}
54+
55+
for (addr, net_amount) in net_distributions.iter() {
56+
token_client.transfer(contract_address, &addr, &net_amount);
57+
}
58+
59+
Ok(())
60+
}

0 commit comments

Comments
 (0)