Skip to content

Commit 893f85e

Browse files
authored
feat: add dollar support for multiple channels (#1609)
1 parent 035c2f6 commit 893f85e

File tree

3 files changed

+20
-39
lines changed

3 files changed

+20
-39
lines changed

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

Lines changed: 5 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,16 @@
11
import { IbcToken, NativeToken } from "@namada/indexer-client";
2-
import { nativeTokenAddressAtom } from "atoms/chain";
32
import { mapCoinsToAssets } from "atoms/integrations";
43
import BigNumber from "bignumber.js";
54
import { DenomTrace } from "cosmjs-types/ibc/applications/transfer/v1/transfer";
6-
import { getDefaultStore } from "jotai";
75
import { AddressWithAssetAndAmountMap } from "types";
86
import { isNamadaAsset } from "utils";
97
import { TokenBalance } from "./atoms";
108

11-
const getNativeTokenAddress = (): string | undefined => {
12-
const { get } = getDefaultStore();
13-
return get(nativeTokenAddressAtom).data;
14-
};
15-
16-
/**
17-
* Sum the dollar amount of a list of tokens
18-
* @param tokens
19-
* @returns The total of dollars, or `undefined` if at least one token has `dollar: undefined`
20-
*/
21-
export const sumDollars = (tokens: TokenBalance[]): BigNumber | undefined => {
22-
let sum = new BigNumber(0);
23-
for (let i = 0; i < tokens.length; i++) {
24-
const { dollar, originalAddress } = tokens[i];
25-
if (!dollar) {
26-
// create an exception for native token while we don't have a market price for it
27-
// we can safely delete this condition when osmosis api returns a native token price
28-
if (originalAddress === getNativeTokenAddress()) {
29-
continue;
30-
}
31-
return undefined;
32-
}
33-
sum = sum.plus(dollar);
34-
}
35-
return sum;
36-
};
37-
38-
export const getTotalDollar = (list?: TokenBalance[]): BigNumber | undefined =>
39-
sumDollars(list ?? []);
9+
export const getTotalDollar = (list?: TokenBalance[]): BigNumber =>
10+
(list ?? []).reduce(
11+
(sum, { dollar }) => (dollar ? sum.plus(dollar) : sum),
12+
new BigNumber(0)
13+
);
4014

4115
export const getTotalNam = (list?: TokenBalance[]): BigNumber =>
4216
list?.find((i) => isNamadaAsset(i.asset))?.amount ?? new BigNumber(0);

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

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,26 @@
11
import { IbcToken, NativeToken } from "@namada/indexer-client";
22
import BigNumber from "bignumber.js";
33
import * as osmosis from "chain-registry/mainnet/osmosis";
4-
import { Address } from "types";
4+
import { Address, BaseDenom } from "types";
55
import { findAssetByToken } from "utils/assets";
66
import { fetchCoinPrices } from "./services";
77

88
export const fetchTokenPrices = async (
99
tokenAddressToFetch: Address[],
10-
apiTokens: (NativeToken | IbcToken)[]
10+
chainTokens: (NativeToken | IbcToken)[]
1111
): Promise<Record<Address, BigNumber>> => {
12-
const baseMap: Record<string, string> = {};
12+
const baseMap: Record<BaseDenom, Address[]> = {};
1313
tokenAddressToFetch.forEach((address) => {
14-
const token = apiTokens?.find((t) => t.address === address);
14+
const token = chainTokens?.find((t) => t.address === address);
1515
if (token) {
1616
// searching only on osmosis because these are the assets supported by fetchCoinPrices
1717
const asset = findAssetByToken(token, osmosis.assets.assets);
1818
if (asset) {
19-
baseMap[asset.base] = address;
19+
if (baseMap[asset.base]) {
20+
baseMap[asset.base].push(address);
21+
} else {
22+
baseMap[asset.base] = [address];
23+
}
2024
}
2125
}
2226
});
@@ -25,10 +29,11 @@ export const fetchTokenPrices = async (
2529

2630
const tokenPrices: Record<string, BigNumber> = {};
2731
Object.entries(apiResponse).forEach(([base, value]) => {
28-
const address = baseMap[base];
2932
const dollar = Object.values(value)[0];
3033
if (dollar) {
31-
tokenPrices[address] = new BigNumber(dollar);
34+
baseMap[base].forEach((address) => {
35+
tokenPrices[address] = new BigNumber(dollar);
36+
});
3237
}
3338
});
3439
return tokenPrices;

apps/namadillo/src/types.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,16 @@ export type PublicKey = string;
2525

2626
export type Address = string;
2727

28+
export type BaseDenom = string;
29+
2830
export type ChainId = string;
2931

3032
export type GasLimit = BigNumber;
3133

3234
export type GasPrice = BigNumber;
3335

3436
// For Namada chain, it should be the address. For Ibc, it should be the base denom
35-
export type GasToken = Address | string;
37+
export type GasToken = Address | BaseDenom;
3638

3739
export type AddressBalance = Record<Address, BigNumber>;
3840

0 commit comments

Comments
 (0)