1- import { Asset } from "@chain-registry/types" ;
1+ import { Asset , IBCTrace } from "@chain-registry/types" ;
22import { Stack } from "@namada/components" ;
33import { AccountType , BparamsMsgValue } from "@namada/types" ;
44import { allDefaultAccountsAtom } from "atoms/accounts" ;
55import { namadaShieldedAssetsAtom } from "atoms/balance" ;
66import { chainParametersAtom } from "atoms/chain" ;
7- import { findAssetsByChainById , ibcChannelsFamily } from "atoms/integrations" ;
7+ import { findAssetsByChainId , ibcChannelsFamily } from "atoms/integrations" ;
88import { SwapResponse , SwapResponseError , SwapResponseOk } from "atoms/swaps" ;
99import { createOsmosisSwapTxAtom } from "atoms/transfer/atoms" ;
1010import BigNumber from "bignumber.js" ;
@@ -31,14 +31,16 @@ export const OsmosisSwap: React.FC = () => {
3131 const chainParameters = useAtomValue ( chainParametersAtom ) ;
3232 const namadaAssets =
3333 chainParameters . data ?
34- findAssetsByChainById ( chainParameters . data . chainId )
34+ findAssetsByChainId ( chainParameters . data . chainId )
3535 : [ ] ;
36+ const osmosisAssets =
37+ chainParameters . data ? findAssetsByChainId ( "osmosis-1" ) : [ ] ;
3638
3739 const [ from , setFrom ] = useState < AddressWithAssetAndAmount | undefined > ( ) ;
3840 const [ to , setTo ] = useState < Asset | undefined > ( ) ;
3941 const [ amount , setAmount ] = useState < string > ( "" ) ;
4042 const [ recipient , setRecipient ] = useState < string > (
41- "znam17k7jw0wmvzdzmfm46m8600t9cah5mjl6se75cu9jvwxywk75k3kmxehmxk7wha62l35puzl6srd "
43+ "znam17drxewzvge966gzcl0u6tr4j90traepujm2vd8ptwwkgrftnhs2hdtnyzgl5freyjsdnchn4ddy "
4244 ) ;
4345 const [ localRecoveryAddr , setLocalRecoveryAddress ] = useState < string > (
4446 "osmo18st0wqx84av8y6xdlss9d6m2nepyqwj6n3q7js"
@@ -53,11 +55,24 @@ export const OsmosisSwap: React.FC = () => {
5355
5456 useEffect ( ( ) => {
5557 const call = async ( ) : Promise < void > => {
58+ invariant ( from , "No from asset selected" ) ;
59+ invariant ( to , "No to asset selected" ) ;
60+ // We have to map namada assets to osmosis assets to get correct base
61+ const fromOsmosis = osmosisAssets . find (
62+ ( assets ) => assets . symbol === from . asset . symbol
63+ ) ;
64+ const toOsmosis = osmosisAssets . find (
65+ ( assets ) => assets . symbol === to . symbol
66+ ) ;
67+
68+ invariant ( fromOsmosis , "From asset is not found in Osmosis assets" ) ;
69+ invariant ( toOsmosis , "To asset is not found in Osmosis assets" ) ;
70+
5671 const quote = await fetch (
5772 "https://sqs.osmosis.zone/router/quote?" +
5873 new URLSearchParams ( {
59- tokenIn : `${ amount } ${ from ! . asset . base } ` ,
60- tokenOutDenom : to ! . base ,
74+ tokenIn : `${ amount } ${ fromOsmosis . base } ` ,
75+ tokenOutDenom : toOsmosis . base ,
6176 humanDenoms : "false" ,
6277 } ) . toString ( )
6378 ) ;
@@ -90,11 +105,21 @@ export const OsmosisSwap: React.FC = () => {
90105 invariant ( transparentAccount , "No transparent account is found" ) ;
91106 invariant ( shieldedAccount , "No shielded account is found" ) ;
92107 invariant ( from , "No from asset" ) ;
108+ invariant ( to , "No to asset" ) ;
93109 invariant ( ibcChannels , "No ibc channels" ) ;
94110 invariant ( quote , "No quote" ) ;
95111 invariant ( localRecoveryAddr , "No local recovery address" ) ;
96112 invariant ( recipient , "No recipient" ) ;
97113
114+ const toTrace = to . traces ?. find ( ( t ) : t is IBCTrace => t . type === "ibc" )
115+ ?. chain . path ;
116+ invariant ( toTrace , "No IBC trace found for the to asset" ) ;
117+ invariant ( quote . route [ 0 ] , "No route found in the quote" ) ;
118+ const route = quote . route [ 0 ] . pools . map ( ( p ) => ( {
119+ poolId : String ( p . id ) ,
120+ tokenOutDenom : p . token_out_denom ,
121+ } ) ) ;
122+
98123 let bparams : BparamsMsgValue [ ] | undefined ;
99124 if ( transparentAccount . type === AccountType . Ledger ) {
100125 const sdk = await getSdkInstance ( ) ;
@@ -106,7 +131,7 @@ export const OsmosisSwap: React.FC = () => {
106131 const transfer = {
107132 amountInBaseDenom : BigNumber ( amount ) ,
108133 // osmosis channel
109- channelId : "channel-13 " ,
134+ channelId : "channel-7 " ,
110135 portId : "transfer" ,
111136 token : from . originalAddress ,
112137 source : shieldedAccount . pseudoExtendedKey ! ,
@@ -118,7 +143,7 @@ export const OsmosisSwap: React.FC = () => {
118143 } ;
119144 const params = {
120145 transfer,
121- outputDenom : "TODO" ,
146+ outputDenom : toTrace ,
122147 recipient,
123148 // TODO: this should also be disposable address most likely
124149 overflow : transparentAccount . address ,
@@ -128,6 +153,7 @@ export const OsmosisSwap: React.FC = () => {
128153 . toString ( ) ,
129154 } ,
130155 localRecoveryAddr,
156+ route,
131157 // TODO: not sure if hardcoding is ok, maybe we should connect keplr wallet
132158 osmosisRestRpc : "https://osmosis-rest.publicnode.com" ,
133159 } ;
@@ -149,7 +175,8 @@ export const OsmosisSwap: React.FC = () => {
149175 encodedTxData ,
150176 transparentAccount . address !
151177 ) ;
152- await broadcastTransaction ( encodedTxData , signedTxs ) ;
178+ const wwww = await broadcastTransaction ( encodedTxData , signedTxs ) ;
179+ console . log ( "Transaction broadcasted:" , wwww ) ;
153180 alert ( "Transaction sent 🚀" ) ;
154181 } catch ( error ) {
155182 console . error ( "Error performing Osmosis swap:" , error ) ;
@@ -166,8 +193,8 @@ export const OsmosisSwap: React.FC = () => {
166193 onChange = { ( e ) => setFrom ( availableAssets ?. [ e . target . value ] ) }
167194 >
168195 < option value = "" > </ option >
169- { Object . values ( availableAssets || { } ) . map ( ( al ) => (
170- < option key = { al . asset . base } value = { al . originalAddress } >
196+ { Object . values ( availableAssets || { } ) . map ( ( al , idx ) => (
197+ < option key = { ` ${ al . asset . base } _ ${ idx } ` } value = { al . originalAddress } >
171198 { al . asset . symbol }
172199 </ option >
173200 ) ) }
0 commit comments