@@ -26,14 +26,18 @@ use namada_sdk::ibc::convert_masp_tx_to_ibc_memo;
2626use namada_sdk:: ibc:: core:: host:: types:: identifiers:: { ChannelId , PortId } ;
2727use namada_sdk:: io:: NamadaIo ;
2828use namada_sdk:: key:: { common, ed25519, RefTo , SigScheme } ;
29+ use namada_sdk:: masp:: shielded_wallet:: ShieldedApi ;
2930use namada_sdk:: masp:: ShieldedContext ;
30- use namada_sdk:: masp_primitives:: transaction:: components:: sapling:: fees:: InputView ;
31+ use namada_sdk:: masp_primitives:: transaction:: components:: {
32+ amount:: I128Sum , sapling:: fees:: InputView ,
33+ } ;
3134use namada_sdk:: masp_primitives:: zip32:: { ExtendedFullViewingKey , ExtendedKey } ;
35+ use namada_sdk:: rpc:: query_denom;
3236use namada_sdk:: rpc:: { query_epoch, InnerTxResult } ;
3337use namada_sdk:: signing:: SigningTxData ;
3438use namada_sdk:: string_encoding:: Format ;
3539use namada_sdk:: tendermint_rpc:: Url ;
36- use namada_sdk:: token:: DenominatedAmount ;
40+ use namada_sdk:: token:: { Amount , DenominatedAmount , MaspEpoch } ;
3741use namada_sdk:: token:: { MaspTxId , OptionExt } ;
3842use namada_sdk:: tx:: data:: TxType ;
3943use namada_sdk:: tx:: {
@@ -44,7 +48,7 @@ use namada_sdk::tx::{
4448 ProcessTxResponse , Tx ,
4549} ;
4650use namada_sdk:: wallet:: { Store , Wallet } ;
47- use namada_sdk:: { Namada , NamadaImpl , PaymentAddress , TransferTarget } ;
51+ use namada_sdk:: { ExtendedViewingKey , Namada , NamadaImpl , PaymentAddress , TransferTarget } ;
4852use std:: collections:: BTreeMap ;
4953use std:: str:: FromStr ;
5054use tx:: MaspSigningData ;
@@ -760,6 +764,74 @@ impl Sdk {
760764 }
761765 }
762766
767+ // This should be a part of query.rs but we have to pass whole "namada" into estimate_next_epoch_rewards
768+ pub async fn shielded_rewards (
769+ & self ,
770+ owner : String ,
771+ chain_id : String ,
772+ ) -> Result < JsValue , JsError > {
773+ let mut shielded: ShieldedContext < masp:: JSShieldedUtils > = ShieldedContext :: default ( ) ;
774+ shielded. utils . chain_id = chain_id. clone ( ) ;
775+ shielded. load ( ) . await ?;
776+
777+ let xvk = ExtendedViewingKey :: from_str ( & owner) ?;
778+ let raw_balance = shielded
779+ . compute_shielded_balance ( & xvk. as_viewing_key ( ) )
780+ . await
781+ . map_err ( |e| JsError :: new ( & e. to_string ( ) ) ) ?;
782+
783+ let rewards = match raw_balance {
784+ Some ( balance) => shielded
785+ . estimate_next_epoch_rewards ( & self . namada , & balance)
786+ . await
787+ . map ( |r| r. amount ( ) )
788+ . map_err ( |e| JsError :: new ( & e. to_string ( ) ) ) ?,
789+ None => Amount :: zero ( ) ,
790+ } ;
791+
792+ to_js_result ( rewards. to_string ( ) )
793+ }
794+
795+ pub async fn simulate_shielded_rewards (
796+ & self ,
797+ chain_id : String ,
798+ token : String ,
799+ amount : String ,
800+ ) -> Result < JsValue , JsError > {
801+ let token = Address :: from_str ( & token) ?;
802+ // TODO: as an improvement we could pass the denom from the client
803+ let denom = query_denom ( & self . namada . client , & token)
804+ . await
805+ . ok_or ( JsError :: new ( & format ! (
806+ "Denom for token {} not found" ,
807+ token. to_string( )
808+ ) ) ) ?;
809+ let amount = DenominatedAmount :: new ( Amount :: from_str ( amount, denom) ?, denom) ;
810+
811+ let mut shielded: ShieldedContext < masp:: JSShieldedUtils > = ShieldedContext :: default ( ) ;
812+ shielded. utils . chain_id = chain_id. clone ( ) ;
813+ shielded. load ( ) . await ?;
814+
815+ let ( _, masp_value) = shielded
816+ . convert_namada_amount_to_masp (
817+ self . namada . client ( ) ,
818+ // Masp epoch should not matter
819+ MaspEpoch :: zero ( ) ,
820+ & token,
821+ amount. denom ( ) ,
822+ amount. amount ( ) ,
823+ )
824+ . await
825+ . map_err ( |e| JsError :: new ( & e. to_string ( ) ) ) ?;
826+
827+ let reward = shielded
828+ . estimate_next_epoch_rewards ( & self . namada , & I128Sum :: from_sum ( masp_value. clone ( ) ) )
829+ . await
830+ . map_err ( |e| JsError :: new ( & e. to_string ( ) ) ) ?;
831+
832+ to_js_result ( reward)
833+ }
834+
763835 pub fn masp_address ( & self ) -> String {
764836 MASP . to_string ( )
765837 }
0 commit comments