Skip to content

Commit

Permalink
add better typing for standalone balances
Browse files Browse the repository at this point in the history
  • Loading branch information
piyalbasu committed Sep 10, 2024
1 parent 046567f commit 82c3bb0
Show file tree
Hide file tree
Showing 5 changed files with 111 additions and 106 deletions.
14 changes: 7 additions & 7 deletions @shared/api/internal.ts
Original file line number Diff line number Diff line change
Expand Up @@ -521,10 +521,10 @@ export const getAccountBalancesStandalone = async ({
}: {
publicKey: string;
networkDetails: NetworkDetails;
}): Promise<AccountBalancesInterface> => {
}) => {
const { network, networkUrl, networkPassphrase } = networkDetails;

let balances: any = null;
let balances = null;
let isFunded = null;
let subentryCount = 0;

Expand Down Expand Up @@ -556,20 +556,20 @@ export const getAccountBalancesStandalone = async ({
// eslint-disable-next-line no-plusplus
for (let i = 0; i < Object.keys(resp.balances).length; i++) {
const k = Object.keys(resp.balances)[i];
const v: any = resp.balances[k];
if (v.liquidity_pool_id) {
const v = resp.balances[k];
if (v.liquidityPoolId) {
const server = stellarSdkServer(networkUrl, networkPassphrase);
// eslint-disable-next-line no-await-in-loop
const lp = await server
.liquidityPools()
.liquidityPoolId(v.liquidity_pool_id)
.liquidityPoolId(v.liquidityPoolId)
.call();
balances[k] = {
...balances[k],
liquidityPoolId: v.liquidity_pool_id,
liquidityPoolId: v.liquidityPoolId,
reserves: lp.reserves,
};
delete balances[k].liquidity_pool_id;
delete balances[k].liquidityPoolId;
}
}
isFunded = true;
Expand Down
8 changes: 5 additions & 3 deletions @shared/api/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -239,6 +239,10 @@ export interface Balance {
total: BigNumber;
buyingLiabilities: string;
sellingLiabilities: string;
liquidityPoolId?: string;
reserves?: Horizon.HorizonApi.Reserve[];
contractId?: string;
blockaidData: BlockAidScanAssetResult;
}

export interface BlockAidScanAssetResult {
Expand All @@ -247,21 +251,19 @@ export interface BlockAidScanAssetResult {
}

export interface AssetBalance extends Balance {
limit: BigNumber;
token: AssetToken;
sponsor?: string;
blockaidData: BlockAidScanAssetResult;
}

export interface NativeBalance extends Balance {
token: NativeToken;
minimumBalance: BigNumber;
blockaidData: BlockAidScanAssetResult;
}

export interface TokenBalance extends AssetBalance {
decimals: number;
name: string;
blockaidData: BlockAidScanAssetResult;
}

export interface BalanceMap {
Expand Down
165 changes: 83 additions & 82 deletions @shared/helpers/stellar.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,13 @@ import BigNumber from "bignumber.js";
import * as StellarSdk from "stellar-sdk";
import * as StellarSdkNext from "stellar-sdk-next";

import { BalanceMap } from "@shared/api/types";
import { BalanceMap, AssetBalance } from "@shared/api/types";
import {
BASE_RESERVE,
BASE_RESERVE_MIN_COUNT,
NetworkDetails,
} from "@shared/constants/stellar";
import { defaultBlockaidScanAssetResult } from "../../extension/src/popup/helpers/blockaid";

export const CUSTOM_NETWORK = "STANDALONE";

Expand Down Expand Up @@ -44,91 +45,91 @@ export function getBalanceIdentifier(

export function makeDisplayableBalances(
accountDetails: StellarSdk.Horizon.ServerApi.AccountRecord,
): BalanceMap {
) {
const { balances, subentry_count, num_sponsored, num_sponsoring } =
accountDetails;

const displayableBalances = Object.values(balances).reduce(
(memo, balance) => {
const identifier = getBalanceIdentifier(balance);
const total = new BigNumber(balance.balance);

let sellingLiabilities = new BigNumber(0);
let buyingLiabilities = new BigNumber(0);
let available;

if ("selling_liabilities" in balance) {
sellingLiabilities = new BigNumber(balance.selling_liabilities);
available = total.minus(sellingLiabilities);
}

if ("buying_liabilities" in balance) {
buyingLiabilities = new BigNumber(balance.buying_liabilities);
}

if (identifier === "native") {
// define the native balance line later
return {
...memo,
native: {
token: {
type: "native",
code: "XLM",
},
total,
available,
sellingLiabilities,
buyingLiabilities,
minimumBalance: new BigNumber(BASE_RESERVE_MIN_COUNT)
.plus(subentry_count)
.plus(num_sponsoring)
.minus(num_sponsored)
.times(BASE_RESERVE)
.plus(sellingLiabilities),
},
};
}

const liquidityPoolBalance =
balance as StellarSdk.Horizon.HorizonApi.BalanceLineLiquidityPool;
if (identifier.includes(":lp")) {
return {
...memo,
[identifier]: {
liquidity_pool_id: liquidityPoolBalance.liquidity_pool_id,
total,
limit: new BigNumber(liquidityPoolBalance.limit),
},
};
}

const assetBalance =
balance as StellarSdk.Horizon.HorizonApi.BalanceLineAsset;
const assetSponsor = assetBalance.sponsor
? { sponsor: assetBalance.sponsor }
: {};

return {
...memo,
[identifier]: {
token: {
type: assetBalance.asset_type,
code: assetBalance.asset_code,
issuer: {
key: assetBalance.asset_issuer,
},
},
sellingLiabilities,
buyingLiabilities,
total,
limit: new BigNumber(assetBalance.limit),
available: total.minus(sellingLiabilities),
...assetSponsor,
const displayableBalances = {} as BalanceMap;

for (let i = 0; i < balances.length; i++) {
const balance = balances[i];
const identifier = getBalanceIdentifier(balance);
const total = new BigNumber(balance.balance);

let sellingLiabilities = "0";
let buyingLiabilities = "0";
let available = new BigNumber("0");

if ("selling_liabilities" in balance) {
sellingLiabilities = new BigNumber(
balance.selling_liabilities,
).toString();
available = total.minus(sellingLiabilities);
}

if ("buying_liabilities" in balance) {
buyingLiabilities = new BigNumber(balance.buying_liabilities).toString();
}

if (identifier === "native") {
// define the native balance line later

displayableBalances.native = {
token: {
type: "native",
code: "XLM",
},
total,
available,
sellingLiabilities,
buyingLiabilities,
minimumBalance: new BigNumber(BASE_RESERVE_MIN_COUNT)
.plus(subentry_count)
.plus(num_sponsoring)
.minus(num_sponsored)
.times(BASE_RESERVE)
.plus(sellingLiabilities),
blockaidData: defaultBlockaidScanAssetResult,
};
},
{},
);
continue;
}

const liquidityPoolBalance =
balance as StellarSdk.Horizon.HorizonApi.BalanceLineLiquidityPool;
if (identifier.includes(":lp")) {
displayableBalances[identifier] = {
liquidityPoolId: liquidityPoolBalance.liquidity_pool_id,
total,
limit: new BigNumber(liquidityPoolBalance.limit),
} as AssetBalance;
continue;
}

const assetBalance =
balance as StellarSdk.Horizon.HorizonApi.BalanceLineAsset;
const assetSponsor = assetBalance.sponsor
? { sponsor: assetBalance.sponsor }
: {};

displayableBalances[identifier] = {
token: {
type: assetBalance.asset_type,
code: assetBalance.asset_code,
issuer: {
key: assetBalance.asset_issuer,
},
},
sellingLiabilities,
buyingLiabilities,
total,
limit: new BigNumber(assetBalance.limit),
available: total.minus(sellingLiabilities),
blockaidData: defaultBlockaidScanAssetResult,
...assetSponsor,
};

continue;
}

return displayableBalances as BalanceMap;
return displayableBalances;
}
26 changes: 14 additions & 12 deletions extension/src/popup/components/manageAssets/ChooseAsset/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -64,11 +64,16 @@ export const ChooseAsset = ({ balances }: ChooseAssetProps) => {
continue;
}

const {
token: { code, issuer },
contractId,
blockaidData,
} = sortedBalances[i];
const { token, contractId, blockaidData } = sortedBalances[i];

const code = token.code || "";
let issuer = {
key: "",
};

if ("issuer" in token) {
issuer = token.issuer;
}

// If we are in the swap flow and the asset has decimals (is a token), we skip it if Soroswap is not enabled
if ("decimals" in sortedBalances[i] && isSwap && !isSoroswapEnabled) {
Expand All @@ -79,11 +84,11 @@ export const ChooseAsset = ({ balances }: ChooseAssetProps) => {
if (code !== "XLM") {
let domain = "";

if (issuer?.key) {
if (issuer.key) {
try {
// eslint-disable-next-line no-await-in-loop
domain = await getAssetDomain(
issuer.key as string,
issuer.key,
networkDetails.networkUrl,
networkDetails.networkPassphrase,
);
Expand All @@ -94,11 +99,8 @@ export const ChooseAsset = ({ balances }: ChooseAssetProps) => {

collection.push({
code,
issuer: issuer?.key || "",
image:
assetIcons[
getCanonicalFromAsset(code as string, issuer?.key as string)
],
issuer: issuer.key,
image: assetIcons[getCanonicalFromAsset(code, issuer.key)],
domain,
contract: contractId,
isSuspicious: isAssetSuspicious(
Expand Down
4 changes: 2 additions & 2 deletions extension/src/popup/helpers/account.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ export const LP_IDENTIFIER = ":lp";
export const sortBalances = (
balances: Balances,
sorobanBalances?: TokenBalances,
) => {
): AssetType[] => {
const collection = [] as any[];
const lpBalances = [] as any[];
const _sorobanBalances = sorobanBalances || [];
Expand Down Expand Up @@ -95,7 +95,7 @@ export const sortOperationsByAsset = ({
bal.token !== undefined && "code" in bal.token ? bal.token.code : "";
assetOperationMap[getCanonicalFromAsset(code, issuer)] = [];
}
if ("contractId" in bal) {
if ("contractId" in bal && "symbol" in bal) {
assetOperationMap[getCanonicalFromAsset(bal.symbol, bal.contractId)] = [];
}
});
Expand Down

0 comments on commit 82c3bb0

Please sign in to comment.