Skip to content

Commit c1e5d52

Browse files
committed
Collect shielded swap sus fees
1 parent a7748d9 commit c1e5d52

File tree

2 files changed

+61
-18
lines changed

2 files changed

+61
-18
lines changed

crates/sdk/src/args.rs

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ 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};
1313
use namada_core::chain::{BlockHeight, ChainId, Epoch};
1414
use namada_core::collections::HashMap;
1515
use namada_core::dec::Dec;
@@ -669,6 +669,41 @@ impl TxOsmosisSwap<SdkTypes> {
669669
return Err(Error::Other("Swap has been cancelled".to_owned()));
670670
}
671671

672+
let frontend_sus_fee = 'frontend_sus_fee: {
673+
let Some((target, percentage)) = &transfer.frontend_sus_fee else {
674+
break 'frontend_sus_fee None;
675+
};
676+
if !swap_into_znam {
677+
break 'frontend_sus_fee None;
678+
}
679+
680+
let fee_receiver = match target {
681+
crate::TransferTarget::Address(MASP)
682+
| crate::TransferTarget::PaymentAddress(_)
683+
| crate::TransferTarget::Ibc(_) => {
684+
return Err(Error::Other(
685+
"Only transparent sus fee receivers are supported in \
686+
Osmosis shielded swaps"
687+
.to_owned(),
688+
));
689+
}
690+
crate::TransferTarget::Address(addr) => addr.clone(),
691+
};
692+
let fee_amount = tx::compute_raw_masp_frontend_sus_fee(
693+
&trade_min_output_amount,
694+
percentage,
695+
)?;
696+
697+
Some(assert_json_obj(
698+
serde_json::to_value(&NamadaMemo {
699+
namada: NamadaMemoData::VoluntaryFees {
700+
fee_amount,
701+
fee_receiver,
702+
},
703+
})
704+
.unwrap(),
705+
))
706+
};
672707
let cosmwasm_memo = Memo {
673708
wasm: Wasm {
674709
contract: transfer.receiver.clone(),
@@ -683,7 +718,7 @@ impl TxOsmosisSwap<SdkTypes> {
683718
local_recovery_addr,
684719
},
685720
route,
686-
final_memo: None,
721+
final_memo: frontend_sus_fee,
687722
},
688723
},
689724
},

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)