Skip to content

Commit 3365bca

Browse files
committed
Collect shielded swap sus fees
1 parent e2ebb07 commit 3365bca

File tree

2 files changed

+65
-18
lines changed

2 files changed

+65
-18
lines changed

crates/sdk/src/args.rs

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ use std::time::Duration as StdDuration;
99
use either::Either;
1010
use masp_primitives::transaction::components::sapling::builder::BuildParams;
1111
use masp_primitives::zip32::PseudoExtendedKey;
12-
use namada_core::address::Address;
12+
use namada_core::address::{Address, MASP};
13+
use namada_core::arith::checked;
1314
use namada_core::chain::{BlockHeight, ChainId, Epoch};
1415
use namada_core::collections::HashMap;
1516
use namada_core::dec::Dec;
@@ -669,6 +670,44 @@ impl TxOsmosisSwap<SdkTypes> {
669670
return Err(Error::Other("Swap has been cancelled".to_owned()));
670671
}
671672

673+
let frontend_sus_fee = 'frontend_sus_fee: {
674+
let Some((target, fee_percentage)) = &transfer.frontend_sus_fee
675+
else {
676+
break 'frontend_sus_fee None;
677+
};
678+
if !swap_into_znam {
679+
break 'frontend_sus_fee None;
680+
}
681+
682+
let fee_receiver = match target {
683+
crate::TransferTarget::Address(MASP)
684+
| crate::TransferTarget::PaymentAddress(_)
685+
| crate::TransferTarget::Ibc(_) => {
686+
return Err(Error::Other(
687+
"Only transparent sus fee receivers are supported in \
688+
Osmosis shielded swaps"
689+
.to_owned(),
690+
));
691+
}
692+
crate::TransferTarget::Address(addr) => addr.clone(),
693+
};
694+
let remaining_amount_percentage =
695+
checked!(Dec::one() - *fee_percentage)?;
696+
let new_received_amount = tx::compute_raw_masp_frontend_sus_fee(
697+
&trade_min_output_amount,
698+
&remaining_amount_percentage,
699+
)?;
700+
701+
Some(assert_json_obj(
702+
serde_json::to_value(&NamadaMemo {
703+
namada: NamadaMemoData::VoluntaryFees {
704+
new_received_amount,
705+
fee_receiver,
706+
},
707+
})
708+
.unwrap(),
709+
))
710+
};
672711
let cosmwasm_memo = Memo {
673712
wasm: Wasm {
674713
contract: transfer.receiver.clone(),
@@ -683,7 +722,7 @@ impl TxOsmosisSwap<SdkTypes> {
683722
local_recovery_addr,
684723
},
685724
route,
686-
final_memo: None,
725+
final_memo: frontend_sus_fee,
687726
},
688727
},
689728
},

crates/sdk/src/tx.rs

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3631,9 +3631,29 @@ async fn compute_masp_frontend_sus_fee(
36313631
token: &Address,
36323632
force: bool,
36333633
) -> Result<namada_token::DenominatedAmount> {
3634-
let sus_fee_amt = namada_token::Amount::from_uint(
3635-
input_amount
3636-
.amount()
3634+
let sus_fee_amt =
3635+
compute_raw_masp_frontend_sus_fee(&input_amount.amount(), percentage)?;
3636+
3637+
// Validate the amount given
3638+
validate_amount(
3639+
context,
3640+
args::InputAmount::Unvalidated(DenominatedAmount::new(
3641+
sus_fee_amt,
3642+
input_amount.denom(),
3643+
)),
3644+
token,
3645+
force,
3646+
)
3647+
.await
3648+
}
3649+
3650+
/// Extract the raw amount for the masp frontend sustainability fee
3651+
pub fn compute_raw_masp_frontend_sus_fee(
3652+
amount: &namada_token::Amount,
3653+
percentage: &namada_core::dec::Dec,
3654+
) -> Result<namada_token::Amount> {
3655+
namada_token::Amount::from_uint(
3656+
amount
36373657
.raw_amount()
36383658
.checked_mul_div(
36393659
percentage.abs(),
@@ -3647,19 +3667,7 @@ async fn compute_masp_frontend_sus_fee(
36473667
.0,
36483668
0,
36493669
)
3650-
.map_err(|e| Error::Other(e.to_string()))?;
3651-
3652-
// Validate the amount given
3653-
validate_amount(
3654-
context,
3655-
args::InputAmount::Unvalidated(DenominatedAmount::new(
3656-
sus_fee_amt,
3657-
input_amount.denom(),
3658-
)),
3659-
token,
3660-
force,
3661-
)
3662-
.await
3670+
.map_err(|e| Error::Other(e.to_string()))
36633671
}
36643672

36653673
/// Build a shielding transfer

0 commit comments

Comments
 (0)