Skip to content

Commit 9fb6f3e

Browse files
committed
feat: use correct namada assets
1 parent 7054fcb commit 9fb6f3e

File tree

4 files changed

+189
-68
lines changed

4 files changed

+189
-68
lines changed

apps/namadillo/src/App/Ibc/OsmosisSwap.tsx

Lines changed: 17 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
import { Asset } from "@chain-registry/types";
22
import { Stack } from "@namada/components";
3-
import { IbcToken } from "@namada/indexer-client";
43
import { AccountType, BparamsMsgValue } from "@namada/types";
54
import { allDefaultAccountsAtom } from "atoms/accounts";
65
import { 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";
98
import { SwapResponse, SwapResponseError, SwapResponseOk } from "atoms/swaps";
109
import { createOsmosisSwapTxAtom } from "atoms/transfer/atoms";
1110
import BigNumber from "bignumber.js";
@@ -17,36 +16,26 @@ import { useCallback, useEffect, useState } from "react";
1716
import { AddressWithAssetAndAmount } from "types";
1817
import { getSdkInstance } from "utils/sdk";
1918

20-
const SUPPORTED_TOKENS_SYMBOLS = ["OSMO", "ATOM", "TIA"] as const;
2119
const SLIPPAGE = 0.005;
2220
const SWAP_CONTRACT_ADDRESS =
2321
"osmo1lrlqeq38ephw8mz0c3uzfdpt4fh3fr0s2atur5n33md90m4wx3mqmz7fq6";
2422

2523
export 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()}

apps/namadillo/src/atoms/chain/atoms.ts

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -103,26 +103,6 @@ export const chainAssetsMapAtom = atom<Record<Address, Asset | undefined>>(
103103
}
104104
);
105105

106-
export const osmosisSymbolAssetMapAtom = atom<Record<string, Asset>>(() => {
107-
const assets = osmosis.assets.assets;
108-
const symbolAssetMap: Record<Address, Asset> = {};
109-
assets.forEach((asset: Asset) => {
110-
symbolAssetMap[asset.symbol] = asset;
111-
});
112-
113-
return symbolAssetMap;
114-
});
115-
116-
export const osmosisBaseAssetMapAtom = atom<Record<string, Asset>>(() => {
117-
const assets = osmosis.assets.assets;
118-
const baseAssetMap: Record<Address, Asset> = {};
119-
assets.forEach((asset: Asset) => {
120-
baseAssetMap[asset.base] = asset;
121-
});
122-
123-
return baseAssetMap;
124-
});
125-
126106
// Prefer calling settings@rpcUrlAtom instead, because default rpc url might be
127107
// overrided by the user
128108
export const indexerRpcUrlAtom = atomWithQuery<string>((get) => {

apps/namadillo/src/atoms/integrations/functions.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,10 +250,29 @@ const findOriginalAsset = async (
250250
};
251251
};
252252

253+
export const findAssetsByChainById = (chainId: string): Asset[] => {
254+
const chain = findChainById(chainId);
255+
if (!chain) {
256+
throw new Error(`Chain with ID ${chainId} not found`);
257+
}
258+
const assetList = findAssetsByChainName(chain.chain_name);
259+
if (!assetList) {
260+
throw new Error(`Assets for chain ${chain.chain_name} not found`);
261+
}
262+
263+
return assetList.assets;
264+
};
265+
253266
export const findChainById = (chainId: string): Chain | undefined => {
254267
return registry.chains.find((chain) => chain.chain_id === chainId);
255268
};
256269

270+
export const findAssetsByChainName = (
271+
chainName: string
272+
): AssetList | undefined => {
273+
return registry.assets.find((chain) => chain.chain_name === chainName);
274+
};
275+
257276
export const mapCoinsToAssets = async (
258277
coins: Coin[],
259278
chainId: string,

0 commit comments

Comments
 (0)