11import { Asset } from "@chain-registry/types" ;
22import { Stack } from "@namada/components" ;
3- import { IbcToken } from "@namada/indexer-client" ;
43import { AccountType , BparamsMsgValue } from "@namada/types" ;
54import { allDefaultAccountsAtom } from "atoms/accounts" ;
65import { namadaShieldedAssetsAtom } from "atoms/balance" ;
7- import { chainTokensAtom , osmosisSymbolAssetMapAtom } from "atoms/chain" ;
8- import { ibcChannelsFamily } from "atoms/integrations" ;
6+ import { chainParametersAtom } from "atoms/chain" ;
7+ import { findAssetsByChainById , ibcChannelsFamily } from "atoms/integrations" ;
98import { SwapResponse , SwapResponseError , SwapResponseOk } from "atoms/swaps" ;
109import { createOsmosisSwapTxAtom } from "atoms/transfer/atoms" ;
1110import BigNumber from "bignumber.js" ;
@@ -17,36 +16,26 @@ import { useCallback, useEffect, useState } from "react";
1716import { AddressWithAssetAndAmount } from "types" ;
1817import { getSdkInstance } from "utils/sdk" ;
1918
20- const SUPPORTED_TOKENS_SYMBOLS = [ "OSMO" , "ATOM" , "TIA" ] as const ;
2119const SLIPPAGE = 0.005 ;
2220const SWAP_CONTRACT_ADDRESS =
2321 "osmo1lrlqeq38ephw8mz0c3uzfdpt4fh3fr0s2atur5n33md90m4wx3mqmz7fq6" ;
2422
2523export const OsmosisSwap : React . FC = ( ) => {
26- // TODO: need to figure out those maps
27- const osmosisSymbolAssetsMap = useAtomValue ( osmosisSymbolAssetMapAtom ) ;
28- const chainTokens = useAtomValue ( chainTokensAtom ) ;
29-
3024 const { mutateAsync : performOsmosisSwap } = useAtomValue (
3125 createOsmosisSwapTxAtom
3226 ) ;
3327 const { data : availableAssets , isLoading : _isLoadingAssets } = useAtomValue (
3428 namadaShieldedAssetsAtom
3529 ) ;
3630
37- const supportedAssets : [ Asset , AddressWithAssetAndAmount | undefined ] [ ] =
38- SUPPORTED_TOKENS_SYMBOLS . map (
39- // TODO: we should not use availableAssets here
40- ( s ) => [
41- osmosisSymbolAssetsMap [ s ] ,
42- Object . values ( availableAssets || { } ) . find ( ( a ) => a . asset . symbol === s ) ,
43- ]
44- ) ;
31+ const chainParameters = useAtomValue ( chainParametersAtom ) ;
32+ const namadaAssets =
33+ chainParameters . data ?
34+ findAssetsByChainById ( chainParameters . data . chainId )
35+ : [ ] ;
4536
4637 const [ from , setFrom ] = useState < AddressWithAssetAndAmount | undefined > ( ) ;
47- const [ to , setTo ] = useState <
48- [ Asset , AddressWithAssetAndAmount | undefined ] | undefined
49- > ( ) ;
38+ const [ to , setTo ] = useState < Asset | undefined > ( ) ;
5039 const [ amount , setAmount ] = useState < string > ( "" ) ;
5140 const [ recipient , setRecipient ] = useState < string > (
5241 "znam17k7jw0wmvzdzmfm46m8600t9cah5mjl6se75cu9jvwxywk75k3kmxehmxk7wha62l35puzl6srd"
@@ -58,13 +47,6 @@ export const OsmosisSwap: React.FC = () => {
5847 ( SwapResponseOk & { minAmount : string } ) | null
5948 > ( null ) ;
6049
61- // TODO: we should get this from the namada assets
62- const toTrace = (
63- chainTokens ?. data ?. find (
64- ( t ) => t . address === to ?. [ 1 ] ?. originalAddress
65- ) as IbcToken
66- ) ?. trace ;
67-
6850 const { data : ibcChannels } = useAtomValue ( ibcChannelsFamily ( "osmosis" ) ) ;
6951
7052 const feeProps = useTransactionFee ( [ "IbcTransfer" ] , true ) ;
@@ -75,7 +57,7 @@ export const OsmosisSwap: React.FC = () => {
7557 "https://sqs.osmosis.zone/router/quote?" +
7658 new URLSearchParams ( {
7759 tokenIn : `${ amount } ${ from ! . asset . base } ` ,
78- tokenOutDenom : to ! [ 0 ] . base ,
60+ tokenOutDenom : to ! . base ,
7961 humanDenoms : "false" ,
8062 } ) . toString ( )
8163 ) ;
@@ -94,7 +76,7 @@ export const OsmosisSwap: React.FC = () => {
9476 if ( from && to && amount ) {
9577 call ( ) ;
9678 }
97- } , [ from ?. originalAddress , to ?. [ 1 ] ?. originalAddress , amount ] ) ;
79+ } , [ from ?. originalAddress , to ?. address , amount ] ) ;
9880
9981 const defaultAccounts = useAtomValue ( allDefaultAccountsAtom ) ;
10082 const shieldedAccount = defaultAccounts . data ?. find (
@@ -136,7 +118,7 @@ export const OsmosisSwap: React.FC = () => {
136118 } ;
137119 const params = {
138120 transfer,
139- outputDenom : toTrace ,
121+ outputDenom : "TODO" ,
140122 recipient,
141123 // TODO: this should also be disposable address most likely
142124 overflow : transparentAccount . address ,
@@ -173,7 +155,7 @@ export const OsmosisSwap: React.FC = () => {
173155 console . error ( "Error performing Osmosis swap:" , error ) ;
174156 alert ( "Transaction errror 🪦" ) ;
175157 }
176- } , [ transparentAccount , shieldedAccount , toTrace , quote ] ) ;
158+ } , [ transparentAccount , shieldedAccount , quote ] ) ;
177159
178160 return (
179161 < div className = "text-white" >
@@ -195,14 +177,10 @@ export const OsmosisSwap: React.FC = () => {
195177 < div > To:</ div >
196178 < select
197179 className = "text-black"
198- onChange = { ( e ) =>
199- // TODO: this sucks because avaialbleAssets only shows tokens that we can use,
200- // we need to change registry to get all supported tokens
201- setTo ( supportedAssets [ Number ( e . target . value ) ] )
202- }
180+ onChange = { ( e ) => setTo ( namadaAssets [ Number ( e . target . value ) ] ) }
203181 >
204182 < option value = "" > </ option >
205- { supportedAssets . map ( ( [ asset ] , i ) => (
183+ { namadaAssets . map ( ( asset , i ) => (
206184 < option key = { asset . base } value = { i } >
207185 { asset . symbol }
208186 </ option >
@@ -249,19 +227,19 @@ export const OsmosisSwap: React.FC = () => {
249227 </ div >
250228 < div >
251229 Amount out: { quote . amount_out }
252- { to ?. [ 1 ] ?. asset . denom_units [ 0 ] . aliases ?. [ 0 ] }
230+ { to ?. denom_units [ 0 ] . aliases ?. [ 0 ] }
253231 </ div >
254232 < div >
255233 Min amount out: { quote . minAmount }
256- { to ?. [ 1 ] ?. asset . denom_units [ 0 ] . aliases ?. [ 0 ] }
234+ { to ?. denom_units [ 0 ] . aliases ?. [ 0 ] }
257235 </ div >
258236 < div > Slippage: { SLIPPAGE * 100 } %</ div >
259237 < div > Routes: </ div >
260238 < div > Effective fee: { BigNumber ( quote . effective_fee ) . toString ( ) } </ div >
261239 < div >
262240 Price: 1 { from ?. asset . symbol } ≈{ " " }
263241 { BigNumber ( quote . amount_out ) . div ( BigNumber ( amount ) ) . toString ( ) } { " " }
264- { to ?. [ 1 ] ?. asset . symbol }
242+ { to ?. symbol }
265243 </ div >
266244 < div >
267245 Price impact: { BigNumber ( quote . price_impact ) . dp ( 3 ) . toString ( ) }
0 commit comments