diff --git a/apps/namadillo/src/atoms/accounts/atoms.ts b/apps/namadillo/src/atoms/accounts/atoms.ts index 40957ef08..e483d972b 100644 --- a/apps/namadillo/src/atoms/accounts/atoms.ts +++ b/apps/namadillo/src/atoms/accounts/atoms.ts @@ -7,6 +7,7 @@ import { namadaExtensionConnectedAtom } from "atoms/settings"; import { queryDependentFn } from "atoms/utils"; import BigNumber from "bignumber.js"; import { atomWithMutation, atomWithQuery } from "jotai-tanstack-query"; +import { chainConfigByName } from "registry"; import { fetchAccountBalance, fetchAccounts, @@ -50,6 +51,7 @@ export const accountBalanceAtom = atomWithQuery((get) => { const tokenAddress = get(nativeTokenAddressAtom); const enablePolling = get(shouldUpdateBalanceAtom); const api = get(indexerApiAtom); + const chainConfig = chainConfigByName("namada"); return { // TODO: subscribe to indexer events when it's done @@ -59,7 +61,10 @@ export const accountBalanceAtom = atomWithQuery((get) => { return await fetchAccountBalance( api, defaultAccount.data, - tokenAddress.data! + tokenAddress.data!, + // As this is a nam balance specific atom, we can safely assume that the + // first currency is the native token + chainConfig.currencies[0].coinDecimals ); }, [tokenAddress, defaultAccount]), }; diff --git a/apps/namadillo/src/atoms/accounts/services.ts b/apps/namadillo/src/atoms/accounts/services.ts index 453fb0ba9..44e546441 100644 --- a/apps/namadillo/src/atoms/accounts/services.ts +++ b/apps/namadillo/src/atoms/accounts/services.ts @@ -17,12 +17,13 @@ export const fetchDefaultAccount = async (): Promise => { export const fetchAccountBalance = async ( api: DefaultApi, account: Account | undefined, - tokenAddress: string + tokenAddress: string, + decimals: number ): Promise => { if (!account) return BigNumber(0); const balancesResponse = await api.apiV1AccountAddressGet(account.address); - const balances = balancesResponse.data + const balance = balancesResponse.data // TODO: add filter to the api call .filter(({ tokenAddress: ta }) => ta === tokenAddress) .map(({ tokenAddress, balance }) => { @@ -30,8 +31,10 @@ export const fetchAccountBalance = async ( token: tokenAddress, amount: balance, }; - }); + }) + .at(0); - if (balances.length === 0) return BigNumber(0); - return new BigNumber(balances[0].amount || 0); + return balance ? + BigNumber(balance.amount).shiftedBy(-decimals) + : BigNumber(0); }; diff --git a/apps/namadillo/src/registry/cosmoshub.json b/apps/namadillo/src/registry/cosmoshub.json new file mode 100644 index 000000000..f3e605021 --- /dev/null +++ b/apps/namadillo/src/registry/cosmoshub.json @@ -0,0 +1,22 @@ +{ + "chainName": "Cosmos Hub", + "currencies": [ + { + "coinDecimals": 6, + "coinDenom": "ATOM", + "coinMinimalDenom": "uatom" + } + ], + "feeCurrencies": [ + { + "coinDecimals": 6, + "coinDenom": "ATOM", + "coinMinimalDenom": "uatom" + } + ], + "stakeCurrency": { + "coinDecimals": 6, + "coinDenom": "ATOM", + "coinMinimalDenom": "uatom" + } +} diff --git a/apps/namadillo/src/registry/index.ts b/apps/namadillo/src/registry/index.ts new file mode 100644 index 000000000..a230bd96b --- /dev/null +++ b/apps/namadillo/src/registry/index.ts @@ -0,0 +1,54 @@ +import cosmoshub from "./cosmoshub.json"; +import namada from "./namada.json"; + +type MinimalDenom = string; +type ConfigName = string; +type ChainName = "cosmoshub" | "namada"; +type ChainMinDenom = "uatom" | "namnam"; + +type Currency = { + coinDecimals: number; + coinDenom: string; + coinMinimalDenom: string; +}; + +export type ChainConfig = { + currencies: Currency[]; + feeCurrencies: Currency[]; + stakeCurrency: Currency; +}; + +const loadedConfigs: ChainConfig[] = []; +const minimalDenomMap: Map = new Map(); +const nameMap: Map = new Map(); + +export function chainConfigByMinDenom(minDenom: ChainMinDenom): ChainConfig { + const index = minimalDenomMap.get(minDenom); + if (!index) { + throw new Error("Chain config not found"); + } + + return loadedConfigs[index]; +} + +export function chainConfigByName(name: ChainName): ChainConfig { + const index = nameMap.get(name); + if (!index) { + throw new Error("Chain config not found"); + } + return loadedConfigs[index]; +} + +function loadConfigs(configs: [MinimalDenom, ConfigName, ChainConfig][]): void { + configs.forEach(([minimalDenom, name, config], index) => { + loadedConfigs.push(config); + + minimalDenomMap.set(minimalDenom, index); + nameMap.set(name, index); + }); +} + +loadConfigs([ + ["namnam", "namada", namada], + ["uatom", "cosmoshub", cosmoshub], +]); diff --git a/apps/namadillo/src/registry/namada.json b/apps/namadillo/src/registry/namada.json new file mode 100644 index 000000000..7ec080145 --- /dev/null +++ b/apps/namadillo/src/registry/namada.json @@ -0,0 +1,22 @@ +{ + "chainName": "Namada", + "currencies": [ + { + "coinDecimals": 6, + "coinDenom": "NAM", + "coinMinimalDenom": "namnam" + } + ], + "feeCurrencies": [ + { + "coinDecimals": 6, + "coinDenom": "NAM", + "coinMinimalDenom": "namnam" + } + ], + "stakeCurrency": { + "coinDecimals": 6, + "coinDenom": "NAM", + "coinMinimalDenom": "namnam" + } +}