diff --git a/.github/workflows/merge.yml b/.github/workflows/merge.yml index fc54663a..9e873b83 100644 --- a/.github/workflows/merge.yml +++ b/.github/workflows/merge.yml @@ -20,6 +20,7 @@ jobs: REACT_APP_RPC_ATOM: "https://private-rpc-cm-cosmos.imperator.co" REACT_APP_RPC_HUAHUA: "https://private-rpc-cm-chihuahua.imperator.co" REACT_APP_RPC_OSMO: "https://private-rpc-cm-osmosis.imperator.co" + REACT_APP_RPC_INJ: "https://private-rpc-cm-injective.imperator.co" REACT_APP_FIREBASE_API_KEY: "AIzaSyA49DTslUcJG2b5TUdI_EbPzugFFXOfO0o" REACT_APP_FIREBASE_AUTH_DOMAIN: "lum-network.firebaseapp.com" REACT_APP_FIREBASE_DATABASE_URL: "https://lum-network-default-rtdb.firebaseio.com" diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index 0c113e94..8f665e67 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -27,10 +27,11 @@ jobs: REACT_APP_API_URL: "https://explorer-mainnet.infra.lum.network" REACT_APP_IMPERATOR_API_URL: "https://api-osmosis.imperator.co" GENERATE_SOURCEMAP: "false" - REACT_APP_RPC_LUM: "https://private-rpc-cm-lum.imperator.co" - REACT_APP_RPC_ATOM: "https://private-rpc-cm-cosmos.imperator.co" - REACT_APP_RPC_HUAHUA: "https://private-rpc-cm-chihuahua.imperator.co" - REACT_APP_RPC_OSMO: "https://private-rpc-cm-osmosis.imperator.co" + REACT_APP_RPC_LUM: "https://rpc.node0.mainnet.lum.network" + REACT_APP_RPC_ATOM: "https://cosmos-rpc.publicnode.com:443" + REACT_APP_RPC_HUAHUA: "https://chihuahua-rpc.publicnode.com:443" + REACT_APP_RPC_OSMO: "https://osmosis-rpc.publicnode.com:443" + REACT_APP_RPC_INJ: "https://injective-rpc.publicnode.com:443" REACT_APP_FIREBASE_API_KEY: "AIzaSyA49DTslUcJG2b5TUdI_EbPzugFFXOfO0o" REACT_APP_FIREBASE_AUTH_DOMAIN: "lum-network.firebaseapp.com" REACT_APP_FIREBASE_DATABASE_URL: "https://lum-network-default-rtdb.firebaseio.com" @@ -46,10 +47,11 @@ jobs: REACT_APP_API_URL: "https://explorer-mainnet.infra.lum.network" REACT_APP_IMPERATOR_API_URL: "https://api-osmosis.imperator.co" GENERATE_SOURCEMAP: "false" - REACT_APP_RPC_LUM: "https://private-rpc-cm-lum.imperator.co" - REACT_APP_RPC_ATOM: "https://rpc.cosmoshub.strange.love" + REACT_APP_RPC_LUM: "https://rpc.node0.mainnet.lum.network" + REACT_APP_RPC_ATOM: "https://cosmos-rpc.publicnode.com:443" REACT_APP_RPC_HUAHUA: "https://chihuahua-rpc.publicnode.com:443" - REACT_APP_RPC_OSMO: "https://private-rpc-cm-osmosis.imperator.co" + REACT_APP_RPC_OSMO: "https://osmosis-rpc.publicnode.com:443" + REACT_APP_RPC_INJ: "https://injective-rpc.publicnode.com:443" REACT_APP_FIREBASE_API_KEY: "AIzaSyA49DTslUcJG2b5TUdI_EbPzugFFXOfO0o" REACT_APP_FIREBASE_AUTH_DOMAIN: "lum-network.firebaseapp.com" REACT_APP_FIREBASE_DATABASE_URL: "https://lum-network-default-rtdb.firebaseio.com" diff --git a/README.md b/README.md index f2ecbe0c..23314db3 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ This is the front-end repository for **Cosmos Millions**. -This service use **Lum Network - Chain** (code hosted [here](https://github.com/lum-network/chain)) +This service uses **Lum Network - Chain** (code hosted [here](https://github.com/lum-network/chain)) ## Description diff --git a/package.json b/package.json index df8062df..c7aca476 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "@cosmostation/cosmos-client": "^0.0.5", "@cosmostation/extension-client": "^0.1.15", "@firebase/analytics": "^0.9.3", + "@injectivelabs/sdk-ts": "^1.14.7", "@keplr-wallet/types": "^0.12.67", "@keplr-wallet/unit": "^0.12.67", "@leapwallet/elements": "^0.6.6", diff --git a/src/assets/images/chains/inj.svg b/src/assets/images/chains/inj.svg new file mode 100644 index 00000000..3abb662d --- /dev/null +++ b/src/assets/images/chains/inj.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/assets/index.ts b/src/assets/index.ts index e7111ff9..f5c2dc3b 100644 --- a/src/assets/index.ts +++ b/src/assets/index.ts @@ -55,6 +55,7 @@ import atom from './images/chains/atom.svg'; import lum from './images/chains/lum.svg'; import osmo from './images/chains/osmo.svg'; import huahua from './images/chains/huahua.svg'; +import inj from './images/chains/inj.svg'; import atomIllustration from './images/chains/atom_illu.png'; import osmoIllustration from './images/chains/osmo_illu.png'; @@ -134,6 +135,7 @@ const Assets = { osmoIllustration, huahua, huahuaIllustration, + inj, }, }; diff --git a/src/components/AssetsSelect/AssetsSelect.tsx b/src/components/AssetsSelect/AssetsSelect.tsx index c72d0d66..0eecffd4 100644 --- a/src/components/AssetsSelect/AssetsSelect.tsx +++ b/src/components/AssetsSelect/AssetsSelect.tsx @@ -45,7 +45,7 @@ const AssetOption = (
{assetIcon && } {props.data.label}
- {balance && } + {balance && } ); diff --git a/src/components/BigWinnerCard/BigWinnerCard.tsx b/src/components/BigWinnerCard/BigWinnerCard.tsx index 582d95c6..7cced9a1 100644 --- a/src/components/BigWinnerCard/BigWinnerCard.tsx +++ b/src/components/BigWinnerCard/BigWinnerCard.tsx @@ -31,14 +31,14 @@ const BigWinnerCard = ({ apr, denom, address, prize, className, price }: IProps) Firebase.logEvent(FirebaseConstants.ANALYTICS_EVENTS.LUCKIEST_WINNERS_CARD_CLICK, { denom: DenomsUtils.getNormalDenom(denom), address: address, - amount: NumbersUtils.convertUnitNumber(prize), + amount: NumbersUtils.convertUnitNumber(prize, denom), }) } forcePurple > {denom} - {apr ? `APR: ${numeral(apr / 100).format('0,0%')}` : `$${numeral(NumbersUtils.convertUnitNumber(prize * price)).format('0,0[.]00a')}`} + {apr ? `APR: ${numeral(apr / 100).format('0,0%')}` : `$${numeral(NumbersUtils.convertUnitNumber(prize * price, denom)).format('0,0[.]00a')}`}
{StringsUtils.trunc(address, windowWidth <= Breakpoints.SM ? 3 : 6)}
arrow diff --git a/src/components/DepositIbcTransfer/DepositIbcTransfer.tsx b/src/components/DepositIbcTransfer/DepositIbcTransfer.tsx index dff315e8..e4e8fcfe 100644 --- a/src/components/DepositIbcTransfer/DepositIbcTransfer.tsx +++ b/src/components/DepositIbcTransfer/DepositIbcTransfer.tsx @@ -54,7 +54,7 @@ const DepositIbcTransfer = (props: Props) => { isLoading={isLoading} label={I18n.t('withdraw.amountInput.label')} sublabel={I18n.t('withdraw.amountInput.sublabel', { - amount: NumbersUtils.formatTo6digit(NumbersUtils.convertUnitNumber(balances.length > 0 ? balances[0].amount : '0')), + amount: NumbersUtils.formatTo6digit(NumbersUtils.convertUnitNumber(balances.length > 0 ? balances[0].amount : '0', balances.length > 0 ? balances[0].denom : undefined)), denom: DenomsUtils.getNormalDenom(currentPool.nativeDenom).toUpperCase(), })} onMax={() => { @@ -64,7 +64,7 @@ const DepositIbcTransfer = (props: Props) => { inputProps={{ type: 'number', min: 0, - max: balances.length > 0 ? balances[0].amount : '0', + max: WalletUtils.getMaxAmount(currentPool.nativeDenom, balances, currentPool.internalInfos?.fees), step: 'any', lang: 'en', disabled, diff --git a/src/components/Leaderboard/Leaderboard.tsx b/src/components/Leaderboard/Leaderboard.tsx index b255bbfb..d737912c 100644 --- a/src/components/Leaderboard/Leaderboard.tsx +++ b/src/components/Leaderboard/Leaderboard.tsx @@ -140,8 +140,8 @@ const Leaderboard = (props: Props) => { }; const renderRow = (item: LeaderboardItemModel, index: number) => { - const amount = NumbersUtils.convertUnitNumber(item.amount); - const totalUserDeposits = userRank ? NumbersUtils.convertUnitNumber(userRank.amount) : null; + const amount = NumbersUtils.convertUnitNumber(item.amount, item.nativeDenom); + const totalUserDeposits = userRank ? NumbersUtils.convertUnitNumber(userRank.amount, userRank.nativeDenom) : null; return (
{ totalDeposited && userRank && userRank.rank > item.rank && - NumbersUtils.convertUnitNumber(userRank.amount) !== totalDeposited ? ( + NumbersUtils.convertUnitNumber(userRank.amount, userRank.nativeDenom) !== totalDeposited ? ( @@ -215,11 +215,12 @@ const Leaderboard = (props: Props) => {
- {DenomsUtils.getNormalDenom(userRank.nativeDenom).toUpperCase()} + {' '} + {DenomsUtils.getNormalDenom(userRank.nativeDenom).toUpperCase()}
{price && (
- $ + $
)}
@@ -235,13 +236,16 @@ const Leaderboard = (props: Props) => {
- {' '} + {/* eslint-disable-next-line max-len */} + {' '} {DenomsUtils.getNormalDenom(userRank.nativeDenom).toUpperCase()}
{price ? (
$ - +
) : null}
diff --git a/src/components/ToastContent/ToastContent.tsx b/src/components/ToastContent/ToastContent.tsx index 3213b61f..3c1a2703 100644 --- a/src/components/ToastContent/ToastContent.tsx +++ b/src/components/ToastContent/ToastContent.tsx @@ -10,8 +10,8 @@ export interface ToastContentProps { export const ToastContent = (props: ToastContentProps) => { return (
-
{props.title}
-
{props.content}
+
+
); }; diff --git a/src/constant/denoms.ts b/src/constant/denoms.ts index 510a7870..991cad98 100644 --- a/src/constant/denoms.ts +++ b/src/constant/denoms.ts @@ -13,9 +13,10 @@ export const DENOMS_ICONS: DenomsIcons = { lum: Assets.chains.lum, osmo: Assets.chains.osmo, huahua: Assets.chains.huahua, + inj: Assets.chains.inj, }; -export const ALLOWED_DENOMS = ['atom', 'lum', 'osmo', 'huahua']; +export const ALLOWED_DENOMS = ['atom', 'lum', 'osmo', 'huahua', 'inj']; export const IBC_MINIMAL_MAP: { [key: string]: string; @@ -24,4 +25,11 @@ export const IBC_MINIMAL_MAP: { 'ibc/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2': 'uatom', 'ibc/51A818D8BBC385C152415882286C62169C05498B8EBCFB38310B1367583860FF': 'uhuahua', 'ibc/47BD209179859CDE4A2806763D7189B6E6FE13A17880FE2B42DE1E6C1E329E23': 'uosmo', + 'ibc/110A26548C514042AFDDEB1D4B46E71C1D43D9672659A3C958D7365FEECD9388': 'inj', +}; + +export const SPECIFIC_DENOM_DECIMALS: { + [key: string]: number; +} = { + inj: 18, }; diff --git a/src/constant/navigation.ts b/src/constant/navigation.ts index 646927ba..8b073e99 100644 --- a/src/constant/navigation.ts +++ b/src/constant/navigation.ts @@ -18,7 +18,8 @@ export const DISCORD = 'https://discord.com/invite/PWHUMdwQ5r'; export const TWITTER = 'https://twitter.com/CosmosMillions'; export const MEDIUM = 'https://medium.com/lum-network'; export const GITHUB = 'https://github.com/lum-network'; -export const MINTSCAN = 'https://mintscan.io/lum'; +export const MINTSCAN = 'https://mintscan.io'; +export const MINTSCAN_LUM = 'https://mintscan.io/lum'; export const TWEET_URL = 'https://twitter.com/intent/tweet'; export const KEPLR_EXTENSION_URL = 'https://chrome.google.com/webstore/detail/keplr/dmkamcknogkgcdfhhbddcghachkejeap'; export const LEAP_EXTENSION_URL = 'https://chrome.google.com/webstore/detail/leap-cosmos-wallet/fcfcfllfndlomdhbehjjcoimbgofdncg'; diff --git a/src/constant/pools.ts b/src/constant/pools.ts index c651f094..a3984e07 100644 --- a/src/constant/pools.ts +++ b/src/constant/pools.ts @@ -38,6 +38,17 @@ export const POOLS: { fees: 0.025, illustration: Assets.chains.osmoIllustration, }, + inj: { + rpc: process.env.REACT_APP_RPC_INJ ?? '', + chainName: 'Injective', + ibcSourceChannel: 'channel-273', + ibcTestnetSourceChannel: 'channel-0', + ibcDenom: 'ibc/110A26548C514042AFDDEB1D4B46E71C1D43D9672659A3C958D7365FEECD9388', + ibcTestnetDenom: 'ibc/110A26548C514042AFDDEB1D4B46E71C1D43D9672659A3C958D7365FEECD9388', + unbondingTime: 21, + fees: 0.016, + illustration: undefined, + }, }; -export const USED_CHAIN_IDS = ['cosmoshub-4', 'lum-network-1', 'chihuahua-1', 'osmosis-1']; +export const USED_CHAIN_IDS = ['cosmoshub-4', 'lum-network-1', 'chihuahua-1', 'osmosis-1', 'injective-1']; diff --git a/src/drops/components/CsvFileInput/CsvFileInput.tsx b/src/drops/components/CsvFileInput/CsvFileInput.tsx index c0e18ff5..9367e7e7 100644 --- a/src/drops/components/CsvFileInput/CsvFileInput.tsx +++ b/src/drops/components/CsvFileInput/CsvFileInput.tsx @@ -2,11 +2,10 @@ import React, { useState } from 'react'; import { useTranslation } from 'react-i18next'; import { useDropzone, ErrorCode } from 'react-dropzone'; import Papa from 'papaparse'; -import { LUM_DENOM, MICRO_LUM_DENOM, convertUnit } from '@lum-network/sdk-javascript'; import Assets from 'assets'; import { Card } from 'components'; -import { WalletUtils } from 'utils'; +import { DenomsUtils, NumbersUtils, WalletUtils } from 'utils'; import './CsvFileInput.scss'; @@ -17,6 +16,7 @@ const isValidRow = (info: unknown): info is [string, string] => { interface CsvFileInputProps { onValidCsv: (depositDrops: { amount: string; winnerAddress: string }[]) => void; onInvalidCsv: (error: string) => void; + poolNativeDenom: string; minDepositAmount?: number; className?: string; disabled: boolean; @@ -24,7 +24,7 @@ interface CsvFileInputProps { } const CsvFileInput = (props: CsvFileInputProps): JSX.Element => { - const { className, minDepositAmount, disabled, limit, onValidCsv, onInvalidCsv } = props; + const { className, poolNativeDenom, minDepositAmount, disabled, limit, onValidCsv, onInvalidCsv } = props; const { t } = useTranslation(); const [innerLabel, setInnerLabel] = useState(t('depositDrops.depositFlow.fileInputLabel.pending')); @@ -81,7 +81,7 @@ const CsvFileInput = (props: CsvFileInputProps): JSX.Element => { } drops.push({ - amount: convertUnit({ amount: amount, denom: LUM_DENOM }, MICRO_LUM_DENOM), + amount: NumbersUtils.convertUnitNumber(amount, DenomsUtils.getNormalDenom(poolNativeDenom), false).toString(), winnerAddress, }); } diff --git a/src/drops/components/DepositDropSteps/DepositDropSteps.tsx b/src/drops/components/DepositDropSteps/DepositDropSteps.tsx index a90aef90..b61a578e 100644 --- a/src/drops/components/DepositDropSteps/DepositDropSteps.tsx +++ b/src/drops/components/DepositDropSteps/DepositDropSteps.tsx @@ -96,7 +96,7 @@ const DepositDropStep = ( for (const input of inputs) { const amountToNumber = Number(input.amount); - const minDeposit = NumbersUtils.convertUnitNumber(currentPool.minDepositAmount); + const minDeposit = NumbersUtils.convertUnitNumber(currentPool.minDepositAmount, currentPool.nativeDenom); if (Object.keys(input.errors).length > 0 || !WalletUtils.isAddressValid(input.winnerAddress) || Number.isNaN(amountToNumber) || amountToNumber < minDeposit) { isValid = false; @@ -112,7 +112,7 @@ const DepositDropStep = ( const onValidCsv = useCallback((depositDrops: { amount: string; winnerAddress: string }[]) => { setDepositDrops([...depositDrops]); - setTotalDepositAmount(depositDrops.reduce((acc, drop) => NumbersUtils.convertUnitNumber(drop.amount) + acc, 0)); + setTotalDepositAmount(depositDrops.reduce((acc, drop) => NumbersUtils.convertUnitNumber(drop.amount, currentPool.nativeDenom) + acc, 0)); setCsvError(''); }, []); @@ -148,8 +148,8 @@ const DepositDropStep = ( input.amount = text; const amountToNumber = Number(text); - const maxAmount = NumbersUtils.convertUnitNumber(balances.find((bal) => bal.denom === currentPool.nativeDenom)?.amount || '0'); - const minDeposit = NumbersUtils.convertUnitNumber(currentPool.minDepositAmount); + const maxAmount = NumbersUtils.convertUnitNumber(balances.find((bal) => bal.denom === currentPool.nativeDenom)?.amount || '0', currentPool.nativeDenom); + const minDeposit = NumbersUtils.convertUnitNumber(currentPool.minDepositAmount, currentPool.nativeDenom); if (Number.isNaN(amountToNumber)) { input.errors = { @@ -215,7 +215,8 @@ const DepositDropStep = ( disabled={disabled} onValidCsv={onValidCsv} onInvalidCsv={onInvalidCsv} - minDepositAmount={NumbersUtils.convertUnitNumber(currentPool.minDepositAmount)} + minDepositAmount={NumbersUtils.convertUnitNumber(currentPool.minDepositAmount, currentPool.nativeDenom)} + poolNativeDenom={currentPool.nativeDenom} limit={limit} />
@@ -251,7 +252,11 @@ const DepositDropStep = ( type='number' step='any' min='0' - max={balances.length > 0 ? NumbersUtils.convertUnitNumber(balances.find((bal) => bal.denom === currentPool.nativeDenom)?.amount || '0') : '0'} + max={ + balances.length > 0 + ? NumbersUtils.convertUnitNumber(balances.find((bal) => bal.denom === currentPool.nativeDenom)?.amount || '0', currentPool.nativeDenom) + : '0' + } value={manualInputs[index].amount || ''} onChange={(event) => onAmountInputChange(event.target.value, index)} /> @@ -315,7 +320,7 @@ const DepositDropStep = ( @@ -410,7 +415,7 @@ const ShareStep = ({ txInfos, price, title, subtitle, onTwitterShare }: { txInfo withoutPadding className='step-3-cta-container d-flex flex-row align-items-center text-start p-4 w-100' onClick={() => { - window.open(`${NavigationConstants.MINTSCAN}/address/${txInfos.depositorAddress}`, '_blank'); + window.open(`${NavigationConstants.MINTSCAN_LUM}/address/${txInfos.depositorAddress}`, '_blank'); }} > Mintscan @@ -489,7 +494,7 @@ const DepositDropSteps = (props: Props) => { title={steps[currentStep].cardTitle ?? steps[currentStep]?.title ?? ''} balances={lumWallet?.balances || []} onDepositDrop={async (pool, deposits, callback, startIndex) => { - const totalDepositAmount = deposits.reduce((acc, deposit) => acc + NumbersUtils.convertUnitNumber(deposit.amount), 0); + const totalDepositAmount = deposits.reduce((acc, deposit) => acc + NumbersUtils.convertUnitNumber(deposit.amount, currentPool.nativeDenom), 0); const res = await onDepositDrop(pool, deposits, callback, startIndex); if (res) { @@ -497,7 +502,7 @@ const DepositDropSteps = (props: Props) => { setTxInfos({ amount: numeral(totalDepositAmount).format('0,0[.]00'), denom: DenomsUtils.getNormalDenom(pool.nativeDenom).toUpperCase(), - tvl: numeral(NumbersUtils.convertUnitNumber(pool.tvlAmount) + totalDepositAmount).format('0,0'), + tvl: numeral(NumbersUtils.convertUnitNumber(pool.tvlAmount, pool.nativeDenom) + totalDepositAmount).format('0,0'), poolId: pool.poolId.toString(), numOfWallets: deposits.length, depositorAddress: lumWallet?.address || '', diff --git a/src/drops/pages/MyDeposits/MyDeposits.tsx b/src/drops/pages/MyDeposits/MyDeposits.tsx index 03ae79b3..10e63a4b 100644 --- a/src/drops/pages/MyDeposits/MyDeposits.tsx +++ b/src/drops/pages/MyDeposits/MyDeposits.tsx @@ -62,7 +62,7 @@ const MyDeposits = () => { }; const renderDepositDrop = (drop: AggregatedDepositModel, index: number) => { - const usdPrice = NumbersUtils.convertUnitNumber(drop.amount?.amount || '0') * prices[DenomsUtils.getNormalDenom(drop.amount?.denom || '')] || 0; + const usdPrice = NumbersUtils.convertUnitNumber(drop.amount?.amount || '0', drop.amount?.denom) * prices[DenomsUtils.getNormalDenom(drop.amount?.denom || '')] || 0; return (
@@ -80,7 +80,7 @@ const MyDeposits = () => {
- +   {DenomsUtils.getNormalDenom(drop.amount?.denom || '')} diff --git a/src/drops/pages/MyDeposits/components/Modals/CancelDropModal/CancelDropModal.tsx b/src/drops/pages/MyDeposits/components/Modals/CancelDropModal/CancelDropModal.tsx index dc125fde..26a55230 100644 --- a/src/drops/pages/MyDeposits/components/Modals/CancelDropModal/CancelDropModal.tsx +++ b/src/drops/pages/MyDeposits/components/Modals/CancelDropModal/CancelDropModal.tsx @@ -25,7 +25,7 @@ const CancelDropModal = ({ deposits, limit }: { deposits?: DepositModel[]; limit provider: WalletUtils.getAutoconnectProvider(), }); - const depositsTotalAmount = deposits ? deposits.reduce((acc, deposit) => NumbersUtils.convertUnitNumber(deposit.amount?.amount || '0') + acc, 0) : 0; + const depositsTotalAmount = deposits ? deposits.reduce((acc, deposit) => NumbersUtils.convertUnitNumber(deposit.amount?.amount || '0', deposit.amount?.denom) + acc, 0) : 0; useEffect(() => { const handler = () => { diff --git a/src/drops/pages/MyDeposits/components/Modals/DropsDetailsModal/DropsDetailsModal.tsx b/src/drops/pages/MyDeposits/components/Modals/DropsDetailsModal/DropsDetailsModal.tsx index f2d22f7b..b8a8844b 100644 --- a/src/drops/pages/MyDeposits/components/Modals/DropsDetailsModal/DropsDetailsModal.tsx +++ b/src/drops/pages/MyDeposits/components/Modals/DropsDetailsModal/DropsDetailsModal.tsx @@ -90,9 +90,11 @@ const DropsDetails = ({ drops, poolDenom, prices, modalRef, onCancel, onEdit }:
-
{numeral(NumbersUtils.convertUnitNumber(drop.amount?.amount || 0) * (prices[poolDenom] || 0)).format('$0,0[.]00')}
+
+ {numeral(NumbersUtils.convertUnitNumber(drop.amount?.amount || 0, drop.amount?.denom) * (prices[poolDenom] || 0)).format('$0,0[.]00')} +
- {poolDenom.toUpperCase()} + {poolDenom.toUpperCase()}
diff --git a/src/drops/pages/MyDeposits/components/Modals/EditDepositModal/EditDepositModal.tsx b/src/drops/pages/MyDeposits/components/Modals/EditDepositModal/EditDepositModal.tsx index e3bbe217..273cca77 100644 --- a/src/drops/pages/MyDeposits/components/Modals/EditDepositModal/EditDepositModal.tsx +++ b/src/drops/pages/MyDeposits/components/Modals/EditDepositModal/EditDepositModal.tsx @@ -113,7 +113,7 @@ const EditDepositModal = ({ deposit }: { deposit: DepositModel | null }) => {
- +
diff --git a/src/drops/pages/Pools/Pools.tsx b/src/drops/pages/Pools/Pools.tsx index c20a447b..58d55dcc 100644 --- a/src/drops/pages/Pools/Pools.tsx +++ b/src/drops/pages/Pools/Pools.tsx @@ -35,7 +35,7 @@ const Pools = ({}: IProps): JSX.Element => { drawEndAt={pool.nextDrawAt || new Date()} denom={DenomsUtils.getNormalDenom(pool.nativeDenom)} poolId={pool.poolId.toString()} - tvl={NumbersUtils.convertUnitNumber(pool.tvlAmount)} + tvl={NumbersUtils.convertUnitNumber(pool.tvlAmount, pool.nativeDenom)} estimatedPrize={pool.estimatedPrizeToWin?.amount} apy={pool.apy} ctaText={I18n.t('depositDrops.pools.ctaText')} diff --git a/src/locales/en.ts b/src/locales/en.ts index 86b4f39a..fcbc00f1 100644 --- a/src/locales/en.ts +++ b/src/locales/en.ts @@ -85,6 +85,9 @@ export default { claimAndCompound: 'Failed to compound prizes', withdrawalRetry: 'Failed to retry withdrawal #{{ withdrawalId }} to pool #{{ poolId }}', }, + warning: { + ibcTransfer: 'Your IBC Transfer is still in progress, you may encounter issues while depositing so please wait a few minutes. Check transaction on Mintscan', + }, success: { wallet: 'Successfully connected', ibcTransfer: 'Successfully transferred {{ amount }} {{ denom }} to {{ chain }}', diff --git a/src/pages/Deposit/Deposit.tsx b/src/pages/Deposit/Deposit.tsx index 95c1322b..048780e6 100644 --- a/src/pages/Deposit/Deposit.tsx +++ b/src/pages/Deposit/Deposit.tsx @@ -48,7 +48,8 @@ const Deposit = ({ isDrop }: { isDrop: boolean }) => { const [currentStep, setCurrentStep] = useState( existsInLumBalances && denom !== LUM_DENOM && - ((!isDrop && NumbersUtils.convertUnitNumber(existsInLumBalances.amount) > NumbersUtils.convertUnitNumber(pool?.minDepositAmount || '0')) || isDrop) + ((!isDrop && NumbersUtils.convertUnitNumber(existsInLumBalances.amount, existsInLumBalances.denom) > NumbersUtils.convertUnitNumber(pool?.minDepositAmount || '0', pool?.nativeDenom)) || + isDrop) ? 1 : 0, ); @@ -171,8 +172,8 @@ const Deposit = ({ isDrop }: { isDrop: boolean }) => { .required(I18n.t('errors.generic.required', { field: 'Amount' })) .test( 'min-deposit', - () => I18n.t('errors.deposit.lessThanMinDeposit', { minDeposit: NumbersUtils.convertUnitNumber(pool?.minDepositAmount || '0'), denom: denom?.toUpperCase() }), - (value) => (pool && pool.minDepositAmount && value ? Number(value) >= NumbersUtils.convertUnitNumber(pool.minDepositAmount) : false), + () => I18n.t('errors.deposit.lessThanMinDeposit', { minDeposit: NumbersUtils.convertUnitNumber(pool?.minDepositAmount || '0', pool?.nativeDenom), denom: denom?.toUpperCase() }), + (value) => (pool && pool.minDepositAmount && value ? Number(value) >= NumbersUtils.convertUnitNumber(pool.minDepositAmount, pool.nativeDenom) : false), ), }), onSubmit: async (values) => { @@ -691,7 +692,7 @@ const Deposit = ({ isDrop }: { isDrop: boolean }) => { const onDepositDrop = async (pool: PoolModel, deposits: { amount: string; winnerAddress: string }[], onDepositCallback: (batchNum: number) => void, startIndex: number) => { const maxAmount = Number(WalletUtils.getMaxAmount(pool.nativeDenom, lumWallet?.balances || [])); - const depositAmountNumber = deposits.reduce((acc, deposit) => acc + NumbersUtils.convertUnitNumber(deposit.amount), 0); + const depositAmountNumber = deposits.reduce((acc, deposit) => acc + NumbersUtils.convertUnitNumber(deposit.amount, pool.nativeDenom), 0); if (depositAmountNumber > maxAmount) { const prev = depositAmountNumber.toFixed(6); @@ -1024,7 +1025,7 @@ const Deposit = ({ isDrop }: { isDrop: boolean }) => { }, }} onClose={() => { - dispatch.wallet.reloadOtherWalletInfo({ address: otherWallet.address }); + dispatch.wallet.reloadOtherWalletInfo(null); }} /> diff --git a/src/pages/Deposit/components/DepositSteps/DepositSteps.tsx b/src/pages/Deposit/components/DepositSteps/DepositSteps.tsx index 050ceb32..60b43ea7 100644 --- a/src/pages/Deposit/components/DepositSteps/DepositSteps.tsx +++ b/src/pages/Deposit/components/DepositSteps/DepositSteps.tsx @@ -3,7 +3,7 @@ import { FormikProps } from 'formik'; import numeral from 'numeral'; import { useNavigate, useParams } from 'react-router-dom'; import { useSelector } from 'react-redux'; -import { Coin, LUM_DENOM, MICRO_LUM_DENOM } from '@lum-network/sdk-javascript'; +import { Coin, MICRO_LUM_DENOM } from '@lum-network/sdk-javascript'; import { DepositState } from '@lum-network/sdk-javascript/build/codegen/lum/network/millions/deposit'; import Assets from 'assets'; @@ -69,9 +69,7 @@ const DepositStep = ( const navigate = useNavigate(); const { denom } = useParams(); - const [depositAmount, setDepositAmount] = useState( - initialAmount ? (NumbersUtils.convertUnitNumber(initialAmount, MICRO_LUM_DENOM, LUM_DENOM) - (currentPool.nativeDenom === MICRO_LUM_DENOM ? 0.005 : 0)).toFixed(6) : amount, - ); + const [depositAmount, setDepositAmount] = useState(initialAmount ? (parseFloat(initialAmount) - (currentPool.nativeDenom === MICRO_LUM_DENOM ? 0.005 : 0)).toFixed(6) : amount); const [poolToDeposit, setPoolToDeposit] = useState(currentPool); const [isModifying, setIsModifying] = useState(currentPool.nativeDenom === MICRO_LUM_DENOM); const [error, setError] = useState(''); @@ -90,7 +88,7 @@ const DepositStep = ( useEffect(() => { if (initialAmount) { - setDepositAmount((NumbersUtils.convertUnitNumber(initialAmount, MICRO_LUM_DENOM, LUM_DENOM) - (currentPool.nativeDenom === MICRO_LUM_DENOM ? 0.005 : 0)).toFixed(6)); + setDepositAmount((parseFloat(initialAmount) - (currentPool.nativeDenom === MICRO_LUM_DENOM ? 0.005 : 0)).toFixed(6)); } }, [initialAmount]); @@ -131,7 +129,9 @@ const DepositStep = ( ) : ( @@ -242,7 +242,7 @@ const ShareStep = ({ txInfos, price, title, subtitle, onTwitterShare }: { txInfo withoutPadding className='step-3-cta-container d-flex flex-row align-items-center text-start p-4 w-100' onClick={() => { - window.open(`${NavigationConstants.MINTSCAN}/tx/${txInfos.hash}`, '_blank'); + window.open(`${NavigationConstants.MINTSCAN_LUM}/tx/${txInfos.hash}`, '_blank'); }} > Mintscan @@ -304,7 +304,7 @@ const DepositSteps = (props: Props) => { useEffect(() => { if (!amountFromLocationState) { const existsInLumBalances = lumWallet?.balances?.find((balance) => balance.denom === currentPool.nativeDenom); - setInitialAmount(existsInLumBalances && currentPool.nativeDenom !== MICRO_LUM_DENOM ? existsInLumBalances.amount : '0'); + setInitialAmount(existsInLumBalances && currentPool.nativeDenom !== MICRO_LUM_DENOM ? NumbersUtils.convertUnitNumber(existsInLumBalances.amount, currentPool.nativeDenom).toFixed(6) : '0'); } }, [lumWallet]); @@ -342,7 +342,7 @@ const DepositSteps = (props: Props) => { hash: res.hash.toUpperCase(), amount: numeral(depositAmount).format('0,0[.]00'), denom: DenomsUtils.getNormalDenom(poolToDeposit.nativeDenom).toUpperCase(), - tvl: numeral(NumbersUtils.convertUnitNumber(poolToDeposit.tvlAmount) + Number(depositAmount)).format('0,0'), + tvl: numeral(NumbersUtils.convertUnitNumber(poolToDeposit.tvlAmount, poolToDeposit.nativeDenom) + Number(depositAmount)).format('0,0'), poolId: poolToDeposit.poolId.toString(), }); } diff --git a/src/pages/Home/Home.tsx b/src/pages/Home/Home.tsx index 94bbb59f..a6b2c9be 100644 --- a/src/pages/Home/Home.tsx +++ b/src/pages/Home/Home.tsx @@ -20,7 +20,7 @@ const Home = () => { const biggestAprPrizes = useSelector((state: RootState) => state.prizes.biggestAprPrizes); const navigate = useNavigate(); - const tvl = pools.reduce((acc, pool) => acc + NumbersUtils.convertUnitNumber(pool.tvlAmount) * (prices[DenomsUtils.getNormalDenom(pool.nativeDenom)] || 1), 0); + const tvl = pools.reduce((acc, pool) => acc + NumbersUtils.convertUnitNumber(pool.tvlAmount, pool.nativeDenom) * (prices[DenomsUtils.getNormalDenom(pool.nativeDenom)] || 1), 0); return (
diff --git a/src/pages/Landing/Landing.tsx b/src/pages/Landing/Landing.tsx index 4f891344..8f6f9afc 100644 --- a/src/pages/Landing/Landing.tsx +++ b/src/pages/Landing/Landing.tsx @@ -34,7 +34,7 @@ const Landing = () => { }; const pools = useSelector((state: RootState) => state.pools.pools); const prices = useSelector((state: RootState) => state.stats.prices); - const tvl = pools.reduce((acc, pool) => acc + NumbersUtils.convertUnitNumber(pool.tvlAmount) * (prices[DenomsUtils.getNormalDenom(pool.nativeDenom)] || 1), 0); + const tvl = pools.reduce((acc, pool) => acc + NumbersUtils.convertUnitNumber(pool.tvlAmount, pool.nativeDenom) * (prices[DenomsUtils.getNormalDenom(pool.nativeDenom)] || 1), 0); const timeline = useRef(); const { width } = useWindowSize(); @@ -374,7 +374,7 @@ const Landing = () => {
{pools.slice(0, 3).map((pool, index) => ( - + ))} {poolsPlaceholders.map((_, index) => ( diff --git a/src/pages/Landing/components/PoolCard.tsx b/src/pages/Landing/components/PoolCard.tsx index a67111a0..77b21883 100644 --- a/src/pages/Landing/components/PoolCard.tsx +++ b/src/pages/Landing/components/PoolCard.tsx @@ -13,22 +13,23 @@ interface IProps { const PoolCard = ({ denom, tvl, prize }: IProps) => { const prices = useSelector((state: RootState) => state.stats?.prices); - const price = prices?.[denom]; + const normalDenom = DenomsUtils.getNormalDenom(denom); + const price = prices?.[normalDenom]; return (
- {denom} + {normalDenom}
- {denom} + {normalDenom}
{I18n.t('landing.pools.deposited')} - {numeral(NumbersUtils.convertUnitNumber(tvl)).format('0,0')} {denom} + {numeral(NumbersUtils.convertUnitNumber(tvl, denom)).format('0,0')} {normalDenom} - ≃${price ? numeral(NumbersUtils.convertUnitNumber(tvl) * price).format('0,0') : ' --'} + ≃${price ? numeral(NumbersUtils.convertUnitNumber(tvl, denom) * price).format('0,0') : ' --'}
{I18n.t('landing.pools.prizeToWin')} diff --git a/src/pages/MySavings/MySavings.tsx b/src/pages/MySavings/MySavings.tsx index 1d0ffd21..a6532809 100644 --- a/src/pages/MySavings/MySavings.tsx +++ b/src/pages/MySavings/MySavings.tsx @@ -151,7 +151,7 @@ const MySavings = () => { const renderAsset = (asset: Coin) => { const icon = DenomsUtils.getIconFromDenom(asset.denom); const normalDenom = DenomsUtils.getNormalDenom(asset.denom); - const amount = NumbersUtils.convertUnitNumber(asset.amount); + const amount = NumbersUtils.convertUnitNumber(asset.amount, asset.denom); const bondedAmount = 0; const price = prices?.[normalDenom]; const usdAmount = price ? amount * price : 0; diff --git a/src/pages/MySavings/components/DepositTable/DepositTable.tsx b/src/pages/MySavings/components/DepositTable/DepositTable.tsx index b8e2786e..b9e78a58 100644 --- a/src/pages/MySavings/components/DepositTable/DepositTable.tsx +++ b/src/pages/MySavings/components/DepositTable/DepositTable.tsx @@ -50,7 +50,7 @@ const DepositTable = ({ deposits, pools, prices, onLeavePool, onDepositRetry, on Firebase.logEvent(FirebaseConstants.ANALYTICS_EVENTS.LEAVE_POOL_CLICK, { pool_id: deposit.poolId?.toString(), deposit_id: deposit.depositId?.toString(), - amount: NumbersUtils.convertUnitNumber(deposit.amount?.amount || 0), + amount: NumbersUtils.convertUnitNumber(deposit.amount?.amount || 0, deposit.amount?.denom), denom: DenomsUtils.getNormalDenom(deposit.amount?.denom || ''), }); onLeavePool(deposit as DepositModel); @@ -117,7 +117,7 @@ const DepositTable = ({ deposits, pools, prices, onLeavePool, onDepositRetry, on } } - const usdPrice = NumbersUtils.convertUnitNumber(deposit.amount?.amount || '0') * prices[DenomsUtils.getNormalDenom(deposit.amount?.denom || '')] || 0; + const usdPrice = NumbersUtils.convertUnitNumber(deposit.amount?.amount || '0', deposit.amount?.denom) * prices[DenomsUtils.getNormalDenom(deposit.amount?.denom || '')] || 0; const ActionsContainer = ({ children }: { children: JSX.Element[] }) => { if (winSizes.width < Breakpoints.MD) { @@ -134,7 +134,7 @@ const DepositTable = ({ deposits, pools, prices, onLeavePool, onDepositRetry, on coin icon

- {' '} + {' '} {DenomsUtils.getNormalDenom(deposit.amount?.denom || '').toUpperCase()} {deposit.isSponsor && ( @@ -170,7 +170,7 @@ const DepositTable = ({ deposits, pools, prices, onLeavePool, onDepositRetry, on const renderRow = (deposit: AggregatedDepositModel, index: number) => { if (deposit.deposits.length > 1) { - const usdPrice = NumbersUtils.convertUnitNumber(deposit.amount?.amount || '0') * prices[DenomsUtils.getNormalDenom(deposit.amount?.denom || '')] || 0; + const usdPrice = NumbersUtils.convertUnitNumber(deposit.amount?.amount || '0', deposit.amount?.denom) * prices[DenomsUtils.getNormalDenom(deposit.amount?.denom || '')] || 0; return (

- {' '} + {' '} {DenomsUtils.getNormalDenom(deposit.amount?.denom || '').toUpperCase()}

diff --git a/src/pages/MySavings/components/Modals/Claim/Claim.tsx b/src/pages/MySavings/components/Modals/Claim/Claim.tsx index 03d87b76..371c08a6 100644 --- a/src/pages/MySavings/components/Modals/Claim/Claim.tsx +++ b/src/pages/MySavings/components/Modals/Claim/Claim.tsx @@ -63,7 +63,7 @@ const ShareClaim = ({ infos, prices, modalRef, onTwitterShare }: { infos: ShareI withoutPadding className='step-3-cta-container d-flex flex-row align-items-center text-start p-4 w-100' onClick={() => { - window.open(`${NavigationConstants.MINTSCAN}/tx/${infos.hash}`, '_blank'); + window.open(`${NavigationConstants.MINTSCAN_LUM}/tx/${infos.hash}`, '_blank'); }} > Mintscan @@ -165,7 +165,9 @@ const Claim = ({ prizes, prices, pools, limit }: Props) => { if (denomExistIndex === -1) { amount.push({ amount: numeral( - prizes.filter((p) => p.amount?.denom === prize.amount?.denom).reduce((acc, prize) => (prize.amount ? acc + NumbersUtils.convertUnitNumber(prize.amount.amount) : acc), 0), + prizes + .filter((p) => p.amount?.denom === prize.amount?.denom) + .reduce((acc, prize) => (prize.amount ? acc + NumbersUtils.convertUnitNumber(prize.amount.amount, prize.amount.denom) : acc), 0), ).format('0,0.000000'), denom: DenomsUtils.getNormalDenom(prize.amount?.denom || ''), }); @@ -177,7 +179,7 @@ const Claim = ({ prizes, prices, pools, limit }: Props) => { setShareInfos({ hash: res.hash.toUpperCase(), amount, - tvl: numeral(NumbersUtils.convertUnitNumber(pool?.tvlAmount || '')).format('0,0'), + tvl: numeral(NumbersUtils.convertUnitNumber(pool?.tvlAmount || '', pool?.nativeDenom)).format('0,0'), compounded: compound, poolId: pool?.poolId.toString() || '', }); @@ -248,8 +250,8 @@ const Claim = ({ prizes, prices, pools, limit }: Props) => { for (const pToDeposit of toDeposit) { const pool = pools.find((p) => p.poolId === pToDeposit.pool.poolId); - const depositAmount = NumbersUtils.convertUnitNumber(pToDeposit.amount); - const minDeposit = NumbersUtils.convertUnitNumber(pool?.minDepositAmount || '0'); + const depositAmount = NumbersUtils.convertUnitNumber(pToDeposit.amount, pToDeposit.pool.nativeDenom); + const minDeposit = NumbersUtils.convertUnitNumber(pool?.minDepositAmount || '0', pool?.nativeDenom); if (!pool || (pool && depositAmount < minDeposit)) { blockCompound = true; @@ -309,7 +311,10 @@ const Claim = ({ prizes, prices, pools, limit }: Props) => { prizes.reduce( (acc, prize) => acc + - (prize.amount ? NumbersUtils.convertUnitNumber(prize.amount.amount) * (prices[DenomsUtils.getNormalDenom(prize.amount.denom)] || 1) : 0), + (prize.amount + ? NumbersUtils.convertUnitNumber(prize.amount.amount, prize.amount.denom) * + (prices[DenomsUtils.getNormalDenom(prize.amount.denom)] || 1) + : 0), 0, ), ).format('0,0')} @@ -330,13 +335,17 @@ const Claim = ({ prizes, prices, pools, limit }: Props) => { Denom

- + {DenomsUtils.getNormalDenom(prize.amount.denom).toUpperCase()}

$ {numeral( - NumbersUtils.convertUnitNumber(prize.amount.amount) * (prices[DenomsUtils.getNormalDenom(prize.amount.denom)] || 1), + NumbersUtils.convertUnitNumber(prize.amount.amount, prize.amount.denom) * + (prices[DenomsUtils.getNormalDenom(prize.amount.denom)] || 1), ).format('0,0.00')}

diff --git a/src/pages/MySavings/components/Modals/LeavePool/LeavePool.tsx b/src/pages/MySavings/components/Modals/LeavePool/LeavePool.tsx index e6703aef..8278503a 100644 --- a/src/pages/MySavings/components/Modals/LeavePool/LeavePool.tsx +++ b/src/pages/MySavings/components/Modals/LeavePool/LeavePool.tsx @@ -34,7 +34,7 @@ const LeavePool = ({ deposit }: Props) => { Firebase.logEvent(FirebaseConstants.ANALYTICS_EVENTS.LEAVE_POOL_CONFIRMED, { pool_id: deposit.poolId?.toString(), deposit_id: deposit.depositId?.toString(), - amount: NumbersUtils.convertUnitNumber(deposit.amount?.amount || 0), + amount: NumbersUtils.convertUnitNumber(deposit.amount?.amount || 0, deposit.amount?.denom), denom: DenomsUtils.getNormalDenom(deposit.amount?.denom || ''), }); @@ -106,7 +106,7 @@ const LeavePool = ({ deposit }: Props) => { {DenomsUtils.getNormalDenom(deposit?.amount?.denom || '').toUpperCase()}
- +

diff --git a/src/pages/MySavings/components/Modals/TransferOut/TransferOut.tsx b/src/pages/MySavings/components/Modals/TransferOut/TransferOut.tsx index 61a65a43..df87df30 100644 --- a/src/pages/MySavings/components/Modals/TransferOut/TransferOut.tsx +++ b/src/pages/MySavings/components/Modals/TransferOut/TransferOut.tsx @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from 'react'; +import React, { useEffect, useMemo, useState } from 'react'; import { Coin, MICRO_LUM_DENOM } from '@lum-network/sdk-javascript'; import { useDispatch } from 'react-redux'; import { useFormik } from 'formik'; @@ -117,6 +117,8 @@ const TransferOut = ({ lumWallet, otherWallets, asset, isLoading, balances, pric provider: WalletUtils.getAutoconnectProvider(), }); + const balance = useMemo(() => balances.find((balance) => balance.denom === form.values.denom), [form]); + return (
@@ -138,7 +140,7 @@ const TransferOut = ({ lumWallet, otherWallets, asset, isLoading, balances, pric className='mt-5' label={I18n.t('mySavings.transferOutModal.amountInput.label')} sublabel={I18n.t('mySavings.transferOutModal.amountInput.sublabel', { - amount: NumbersUtils.formatTo6digit(NumbersUtils.convertUnitNumber(balances.length > 0 ? balances[0].amount : '0')), + amount: balance ? NumbersUtils.formatTo6digit(NumbersUtils.convertUnitNumber(balance.amount, balance.denom)) : 0, denom: DenomsUtils.getNormalDenom(form.values.denom).toUpperCase(), })} onMax={() => { diff --git a/src/pages/MySavings/components/PrizesHistoryTable/PrizesHistoryTable.tsx b/src/pages/MySavings/components/PrizesHistoryTable/PrizesHistoryTable.tsx index 502d8fc3..f35e896a 100644 --- a/src/pages/MySavings/components/PrizesHistoryTable/PrizesHistoryTable.tsx +++ b/src/pages/MySavings/components/PrizesHistoryTable/PrizesHistoryTable.tsx @@ -26,7 +26,7 @@ const PrizesHistoryTable = ({ prizes, onPageChange, pagination }: IProps) => { const renderRow = (prize: PrizeModel, index: number) => { const icon = DenomsUtils.getIconFromDenom(prize.amount.denom); const normalDenom = DenomsUtils.getNormalDenom(prize.amount.denom); - const amount = NumbersUtils.convertUnitNumber(prize.amount.amount); + const amount = NumbersUtils.convertUnitNumber(prize.amount.amount, prize.amount.denom); const price = prices?.[normalDenom]; let tagType = TagsConstants.Types.UNCLAIMED; @@ -63,7 +63,7 @@ const PrizesHistoryTable = ({ prizes, onPageChange, pagination }: IProps) => {
- {prize.amount ? : '--'} + {amount ? : '--'} {DenomsUtils.getNormalDenom(prize.amount.denom || '').toUpperCase()}
{price && {numeral(amount * price).format('$0,0[.]00')}} @@ -81,7 +81,7 @@ const PrizesHistoryTable = ({ prizes, onPageChange, pagination }: IProps) => { const icon = DenomsUtils.getIconFromDenom(prize.amount.denom); const normalDenom = DenomsUtils.getNormalDenom(prize.amount.denom); - const amount = NumbersUtils.convertUnitNumber(prize.amount.amount); + const amount = NumbersUtils.convertUnitNumber(prize.amount.amount, prize.amount.denom); const price = prices?.[normalDenom]; let tagType = TagsConstants.Types.UNCLAIMED; @@ -117,7 +117,7 @@ const PrizesHistoryTable = ({ prizes, onPageChange, pagination }: IProps) => {
- {prize.amount ? : '--'} + {amount ? : '--'} {DenomsUtils.getNormalDenom(prize.amount.denom || '').toUpperCase()}
{price && {numeral(amount * price).format('$0,0[.]00')}} diff --git a/src/pages/MySavings/components/TransationsTable/TransactionsTable.tsx b/src/pages/MySavings/components/TransationsTable/TransactionsTable.tsx index 59f297b3..10d4117a 100644 --- a/src/pages/MySavings/components/TransationsTable/TransactionsTable.tsx +++ b/src/pages/MySavings/components/TransationsTable/TransactionsTable.tsx @@ -64,7 +64,7 @@ const TransactionsTable = ({ ) : null}
- + {StringsUtils.trunc(transaction.hash)}
@@ -72,10 +72,14 @@ const TransactionsTable = ({
- {transaction.amount.length > 0 ? : '--'} + {transaction.amount.length > 0 ? ( + + ) : ( + '--' + )} {DenomsUtils.getNormalDenom(transaction.amount[0]?.denom || 'ulum').toUpperCase()}
- {price && {numeral(NumbersUtils.convertUnitNumber(transaction.amount[0].amount) * price).format('$0,0[.]00')}} + {price && {numeral(NumbersUtils.convertUnitNumber(transaction.amount[0].amount, transaction.amount[0].denom) * price).format('$0,0[.]00')}}
@@ -110,7 +114,7 @@ const TransactionsTable = ({
@@ -119,10 +123,16 @@ const TransactionsTable = ({
- {transaction.amount.length > 0 ? : '--'} + {transaction.amount.length > 0 ? ( + + ) : ( + '--' + )} {DenomsUtils.getNormalDenom(transaction.amount[0]?.denom || 'ulum').toUpperCase()}
- {price && {numeral(NumbersUtils.convertUnitNumber(transaction.amount[0].amount) * price).format('$0,0[.]00')}} + {price && ( + {numeral(NumbersUtils.convertUnitNumber(transaction.amount[0].amount, transaction.amount[0].denom) * price).format('$0,0[.]00')} + )}
diff --git a/src/pages/PoolDetails/PoolDetails.tsx b/src/pages/PoolDetails/PoolDetails.tsx index b7436171..7b5c42da 100644 --- a/src/pages/PoolDetails/PoolDetails.tsx +++ b/src/pages/PoolDetails/PoolDetails.tsx @@ -97,8 +97,8 @@ const PoolDetails = () => { const drawHistoryHeaders = I18n.t('poolDetails.drawsHistory.tableHeaders', { returnObjects: true }); const prizeDistributionHeaders = I18n.t('poolDetails.prizeDistribution.tableHeaders', { returnObjects: true }); - const sponsorshipAmount = NumbersUtils.convertUnitNumber(pool.sponsorshipAmount); - const usersDepositsAmount = NumbersUtils.convertUnitNumber(pool.tvlAmount || '0') - sponsorshipAmount; + const sponsorshipAmount = NumbersUtils.convertUnitNumber(pool.sponsorshipAmount, pool.nativeDenom); + const usersDepositsAmount = NumbersUtils.convertUnitNumber(pool.tvlAmount || '0', pool.nativeDenom) - sponsorshipAmount; const userDeposits = lumWallet?.deposits.find((deposit) => (poolId ? Number(deposit.poolId) === Number(poolId) : deposit.amount?.denom === 'u' + denom)); const avgDeposit = (usersDepositsAmount / Number(pool.depositorsCount)) * (prices[denom] ?? 0); @@ -137,7 +137,7 @@ const PoolDetails = () => {

{I18n.t('home.totalValueLocked')}

-
${numeral(NumbersUtils.convertUnitNumber(pool.tvlAmount) * (prices[denom] || 1)).format('0,0')}
+
${numeral(NumbersUtils.convertUnitNumber(pool.tvlAmount, pool.nativeDenom) * (prices[denom] || 1)).format('0,0')}
diff --git a/src/pages/Winners/components/LatestWinnersTable/LatestWinnersTable.tsx b/src/pages/Winners/components/LatestWinnersTable/LatestWinnersTable.tsx index e523376f..7f6f4dae 100644 --- a/src/pages/Winners/components/LatestWinnersTable/LatestWinnersTable.tsx +++ b/src/pages/Winners/components/LatestWinnersTable/LatestWinnersTable.tsx @@ -45,11 +45,11 @@ const LatestWinnersTable = ({ prizes, metadata, visibleItem, onPageChange, onIte
- {' '} + {' '} {DenomsUtils.getNormalDenom(prize.amount.denom).toUpperCase()}
- {numeral(NumbersUtils.convertUnitNumber(prize.amount.amount) * (prices[DenomsUtils.getNormalDenom(prize.amount.denom)] ?? 0)).format('$0,0.00')} + {numeral(NumbersUtils.convertUnitNumber(prize.amount.amount, prize.amount.denom) * (prices[DenomsUtils.getNormalDenom(prize.amount.denom)] ?? 0)).format('$0,0.00')}
@@ -93,11 +93,11 @@ const LatestWinnersTable = ({ prizes, metadata, visibleItem, onPageChange, onIte
- {' '} + {' '} {DenomsUtils.getNormalDenom(prize.amount.denom).toUpperCase()}
- {numeral(NumbersUtils.convertUnitNumber(prize.amount.amount) * (prices[DenomsUtils.getNormalDenom(prize.amount.denom)] ?? 0)).format('$0,0.00')} + {numeral(NumbersUtils.convertUnitNumber(prize.amount.amount, prize.amount.denom) * (prices[DenomsUtils.getNormalDenom(prize.amount.denom)] ?? 0)).format('$0,0.00')}
diff --git a/src/pages/Winners/components/LuckiestWinnerCard/LuckiestWinnerCard.tsx b/src/pages/Winners/components/LuckiestWinnerCard/LuckiestWinnerCard.tsx index 4fa5593d..14a61c7e 100644 --- a/src/pages/Winners/components/LuckiestWinnerCard/LuckiestWinnerCard.tsx +++ b/src/pages/Winners/components/LuckiestWinnerCard/LuckiestWinnerCard.tsx @@ -29,7 +29,7 @@ const LuckiestWinnerCard = ({ prize, rank }: IProps) => { return ( { - window.open(`${NavigationConstants.MINTSCAN}/address/${prize.address}`, '_blank')?.focus(); + window.open(`${NavigationConstants.MINTSCAN_LUM}/address/${prize.address}`, '_blank')?.focus(); }} className='luckiest-winner-card p-3 p-xl-4' withoutPadding diff --git a/src/redux/models/pools.ts b/src/redux/models/pools.ts index 0e3e4d6f..2691dc17 100644 --- a/src/redux/models/pools.ts +++ b/src/redux/models/pools.ts @@ -139,7 +139,7 @@ export const pools = createModel()({ for (const pool of pools) { // Calculate Prize to win - const availablePrizePool = NumbersUtils.convertUnitNumber(pool.availablePrizePool?.amount || '0'); + const availablePrizePool = NumbersUtils.convertUnitNumber(pool.availablePrizePool?.amount || '0', await DenomsUtils.getDenomFromIbc(pool.availablePrizePool?.denom || '')); if (pool.nativeDenom !== MICRO_LUM_DENOM && !pool.internalInfos) { continue; @@ -156,7 +156,7 @@ export const pools = createModel()({ const prizePool = availablePrizePool + - NumbersUtils.convertUnitNumber(bankBalance ? parseInt(bankBalance.amount, 10) : 0) + + NumbersUtils.convertUnitNumber(bankBalance ? parseInt(bankBalance.amount, 10) : 0, pool.nativeDenom) + NumbersUtils.convertUnitNumber( stakingRewards ? stakingRewards.total @@ -164,6 +164,7 @@ export const pools = createModel()({ .reduce((a, b) => a + parseInt(b.amount, 10) / ApiConstants.CLIENT_PRECISION, 0) .toString() : '0', + pool.nativeDenom, ); pool.currentPrizeToWin = { amount: prizePool, denom: pool.nativeDenom }; @@ -179,21 +180,21 @@ export const pools = createModel()({ nativeApy = osmoApy / 100; } else { const [bonding, supply, communityTaxRate, inflation] = await Promise.all([ - client.getBonding(), + client.getBonding(pool.nativeDenom), client.getSupply(pool.nativeDenom), client.getCommunityTaxRate(), client.getInflation(), ]); - - const stakingRatio = NumbersUtils.convertUnitNumber(bonding || '0') / NumbersUtils.convertUnitNumber(supply || '1'); + const stakingRatio = (bonding || 0) / (supply || 1); nativeApy = ((inflation || 0) * (1 - (communityTaxRate || 0))) / stakingRatio; } - const poolTvl = NumbersUtils.convertUnitNumber(pool.tvlAmount); - const poolSponsorTvl = NumbersUtils.convertUnitNumber(pool.sponsorshipAmount); + const poolTvl = NumbersUtils.convertUnitNumber(pool.tvlAmount, pool.nativeDenom); + const poolSponsorTvl = NumbersUtils.convertUnitNumber(pool.sponsorshipAmount, pool.nativeDenom); + const tvlMinusSponsor = poolTvl - poolSponsorTvl; - const variableApy = (nativeApy * (1 - (feesStakers || 0)) * poolTvl) / (poolTvl - poolSponsorTvl); + const variableApy = tvlMinusSponsor === 0 ? 0 : (nativeApy * (1 - (feesStakers || 0)) * poolTvl) / tvlMinusSponsor; pool.apy = variableApy * 100; diff --git a/src/redux/models/wallet.ts b/src/redux/models/wallet.ts index 773aa834..c2c1366f 100644 --- a/src/redux/models/wallet.ts +++ b/src/redux/models/wallet.ts @@ -1,6 +1,6 @@ import axios from 'axios'; -import { Coin, LUM_DENOM, MICRO_LUM_DENOM, LUM_EXPONENT, LumBech32Prefixes, convertUnit } from '@lum-network/sdk-javascript'; +import { Coin, LUM_DENOM, MICRO_LUM_DENOM, LUM_EXPONENT, LumBech32Prefixes } from '@lum-network/sdk-javascript'; import { createModel } from '@rematch/core'; import { LumApi } from 'api'; @@ -385,8 +385,8 @@ export const wallet = createModel()({ await dispatch.wallet.getDepositsAndWithdrawalsDrops(address); } }, - async reloadOtherWalletInfo(payload: { address: string }, state) { - const { address } = payload; + async reloadOtherWalletInfo(_, state) { + const otherWallets = state.wallet.otherWallets; const poolsChainIds = state.pools.pools.reduce((acc, pool) => { if (!acc.includes(pool.chainId) && !pool.chainId.includes('lum')) { @@ -397,7 +397,6 @@ export const wallet = createModel()({ for (const chainId of poolsChainIds) { const pool = state.pools.pools.find((pool) => pool.chainId === chainId); - if (!pool) { continue; } @@ -406,20 +405,27 @@ export const wallet = createModel()({ continue; } + const poolNativeDenom = DenomsUtils.getNormalDenom(pool.nativeDenom); + const wallet = otherWallets[poolNativeDenom]; + + if (!wallet) { + continue; + } + const client = new WalletClient(); await client.connect(pool.internalInfos.rpc); - const res = await client.getWalletBalance(address); + const res = await client.getWalletBalance(wallet.address); dispatch.wallet.setOtherWalletData({ - address, + address: wallet.address, balances: res ? DenomsUtils.translateIbcBalances([...res.balances], pool.transferChannelId, pool.nativeDenom).filter( (balance) => state.pools.pools.find((pool) => pool.nativeDenom === balance.denom) || balance.denom === MICRO_LUM_DENOM, ) : [], - denom: DenomsUtils.getNormalDenom(pool.nativeDenom), + denom: poolNativeDenom, }); client.disconnect(); @@ -491,8 +497,8 @@ export const wallet = createModel()({ if (prizesToClaim) { prizesToClaimSorted = prizesToClaim.prizes .sort((a, b) => { - const aAmount = NumbersUtils.convertUnitNumber(a.amount?.amount || '0'); - const bAmount = NumbersUtils.convertUnitNumber(b.amount?.amount || '0'); + const aAmount = NumbersUtils.convertUnitNumber(a.amount?.amount || '0', a.amount?.denom); + const bAmount = NumbersUtils.convertUnitNumber(b.amount?.amount || '0', b.amount?.denom); return bAmount - aAmount; }) @@ -539,9 +545,9 @@ export const wallet = createModel()({ } if (totalPrizesWon[prize.amount.denom]) { - totalPrizesWon[prize.amount.denom] += NumbersUtils.convertUnitNumber(prize.amount.amount); + totalPrizesWon[prize.amount.denom] += NumbersUtils.convertUnitNumber(prize.amount.amount, prize.amount.denom); } else { - totalPrizesWon[prize.amount.denom] = NumbersUtils.convertUnitNumber(prize.amount.amount); + totalPrizesWon[prize.amount.denom] = NumbersUtils.convertUnitNumber(prize.amount.amount, prize.amount.denom); } } @@ -571,13 +577,7 @@ export const wallet = createModel()({ async ibcTransfer(payload: IbcTransferPayload, state): Promise<{ hash: string; error: string | null | undefined } | null> { const { toAddress, fromAddress, amount, normalDenom, type, ibcChannel, chainId } = payload; - const convertedAmount = convertUnit( - { - amount: amount.amount, - denom: LUM_DENOM, - }, - MICRO_LUM_DENOM, - ); + const convertedAmount = NumbersUtils.convertUnitNumber(amount.amount, normalDenom, false).toFixed(); const coin = { amount: convertedAmount, @@ -631,15 +631,18 @@ export const wallet = createModel()({ throw new Error(result?.error || undefined); } - while (true) { + let balanceUpdated = false; + + for (let ticks = 0; ticks < 6; ticks++) { await new Promise((resolve) => { setTimeout(resolve, 10000); }); const newBalances = await dispatch.wallet.getLumWalletBalances(null); + const res = WalletUtils.updatedBalances([...(state.wallet.lumWallet?.balances ?? [])], newBalances); - if (WalletUtils.updatedBalances(state.wallet.lumWallet?.balances, newBalances)) { - break; + if (res) { + balanceUpdated = res; } } @@ -654,12 +657,26 @@ export const wallet = createModel()({ } } - ToastUtils.updateLoadingToast(toastId, 'success', { - content: I18n.t('success.ibcTransfer', { amount: amount.amount, denom: normalDenom.toUpperCase(), chain: type === 'withdraw' ? 'native chain' : 'Lum Network' }), - }); + if (!balanceUpdated) { + ToastUtils.updateLoadingToast( + toastId, + 'warning', + { + content: I18n.t('warning.ibcTransfer', { link: `${NavigationConstants.MINTSCAN}/${chainId.split('-')[0]}/tx/${result.hash}` }), + }, + false, + { + closeButton: true, + }, + ); + } else { + ToastUtils.updateLoadingToast(toastId, 'success', { + content: I18n.t('success.ibcTransfer', { amount: amount.amount, denom: normalDenom.toUpperCase(), chain: type === 'withdraw' ? 'native chain' : 'Lum Network' }), + }); + } dispatch.wallet.reloadWalletInfos({ address: type === 'withdraw' ? fromAddress : toAddress, force: true }); - dispatch.wallet.reloadOtherWalletInfo({ address: type === 'withdraw' ? toAddress : fromAddress }); + dispatch.wallet.reloadOtherWalletInfo(null); return result; } catch (e) { @@ -1017,7 +1034,7 @@ export const wallet = createModel()({ content: I18n.t(batchCount === 1 ? 'success.deposit' : 'success.multiDeposit', { count: batchCount, denom: DenomsUtils.getNormalDenom(pool.nativeDenom).toUpperCase(), - amount: deposits.reduce((acc, deposit) => acc + NumbersUtils.convertUnitNumber(deposit.amount), 0), + amount: deposits.reduce((acc, deposit) => acc + NumbersUtils.convertUnitNumber(deposit.amount, pool.nativeDenom), 0), }), }); diff --git a/src/utils/numbers.ts b/src/utils/numbers.ts index 3db02346..efce80fd 100644 --- a/src/utils/numbers.ts +++ b/src/utils/numbers.ts @@ -1,28 +1,42 @@ import numeral from 'numeral'; import { Coin } from '@keplr-wallet/types'; import { LUM_DENOM, MICRO_LUM_DENOM, convertUnit } from '@lum-network/sdk-javascript'; +import { DenomsConstants } from 'constant'; -export const convertUnitNumber = (nb: number | string, fromDenom = MICRO_LUM_DENOM, toDenom = LUM_DENOM): number => { +export const convertUnitNumber = (nb: number | string, fromDenom = MICRO_LUM_DENOM, fromMinimalDenom = true): number => { let amount: string; if (!nb) { return 0; } + const specificExponent = DenomsConstants.SPECIFIC_DENOM_DECIMALS[fromDenom]; + const fromMinimal = fromMinimalDenom === true || fromDenom.startsWith('u'); + + if (specificExponent) { + const nbToNumber = Number(nb); + + if (Number.isNaN(nbToNumber)) { + return NaN; + } + + return fromMinimalDenom ? nbToNumber / 10 ** specificExponent : nbToNumber * 10 ** specificExponent; + } + if (typeof nb === 'string') { const split = nb.split('.'); - amount = split[0]; + amount = fromMinimal ? split[0] : nb; } else { - amount = nb.toFixed(fromDenom.startsWith('u') ? 0 : 6); + amount = nb.toFixed(fromMinimal ? 0 : 6); } const coin = { amount, - denom: fromDenom, + denom: fromMinimal ? MICRO_LUM_DENOM : LUM_DENOM, }; - return parseFloat(convertUnit(coin, toDenom)); + return parseFloat(convertUnit(coin, fromMinimal ? LUM_DENOM : MICRO_LUM_DENOM)); }; export const formatUnit = (coin: Coin, moreDecimal?: boolean): string => { diff --git a/src/utils/pools.ts b/src/utils/pools.ts index 06757fb5..e13ae55d 100644 --- a/src/utils/pools.ts +++ b/src/utils/pools.ts @@ -36,8 +36,8 @@ export const getBestPrize = (prizes: Prize[], prices: { [key: string]: number }) export const getWinningChances = (inputAmount: number, pool: PoolModel, prices?: { [index: string]: number } | number) => { const amount = prices ? inputAmount / (typeof prices === 'number' ? prices : prices[getNormalDenom(pool.nativeDenom)] || 1) : inputAmount; - const tvl = convertUnitNumber(pool.tvlAmount); - const sponsorTvl = convertUnitNumber(pool.sponsorshipAmount); + const tvl = convertUnitNumber(pool.tvlAmount, pool.nativeDenom); + const sponsorTvl = convertUnitNumber(pool.sponsorshipAmount, pool.nativeDenom); const prizeStrat = pool.prizeStrategy; let avgPrizesDrawn = 0; let estimated = 0; diff --git a/src/utils/toast.tsx b/src/utils/toast.tsx index c65424e7..fafbd317 100644 --- a/src/utils/toast.tsx +++ b/src/utils/toast.tsx @@ -39,13 +39,13 @@ export const showLoadingToast = (content: ToastContentProps, options?: ToastOpti }); }; -export const updateLoadingToast = (toastId: Id, type: TypeOptions, content: ToastContentProps, options?: ToastOptions): void => { +export const updateLoadingToast = (toastId: Id, type: TypeOptions, content: ToastContentProps, autoClose = true, options?: ToastOptions): void => { toast.update(toastId, { render: , icon: () => {type, type, isLoading: false, - autoClose: 5000, + autoClose: autoClose ? 5000 : false, ...options, }); }; diff --git a/src/utils/txs.ts b/src/utils/txs.ts index b541130e..b3e0a660 100644 --- a/src/utils/txs.ts +++ b/src/utils/txs.ts @@ -1,4 +1,4 @@ -import { Coin, LUM_DENOM, LumRegistry, MICRO_LUM_DENOM, lum, parseRawLogs, toJSON } from '@lum-network/sdk-javascript'; +import { Coin, LUM_DENOM, LumRegistry, lum, parseRawLogs, toJSON } from '@lum-network/sdk-javascript'; import Assets from 'assets'; import { TransactionModel } from 'models'; import { I18n, NumbersUtils } from 'utils'; @@ -69,13 +69,13 @@ export const findAmountInLogs = async (logs: any, event: string, index: number) export const parseLogs = async (tx: TransactionModel, msg: Any, index: number, logs: any, event: string, formattedTxs: TransactionModel[]) => { if (tx.amount.length > 0) { const msgAmount = await findAmountInLogs(logs, event, index); - const msgAmountNumber = NumbersUtils.convertUnitNumber(msgAmount[0].amount); + const msgAmountNumber = NumbersUtils.convertUnitNumber(msgAmount[0].amount, msgAmount[0].denom); const existingDenomIndex = tx.amount.findIndex((amount) => amount.denom === msgAmount[0].denom); if (existingDenomIndex > -1) { - const prevAmountNumber = NumbersUtils.convertUnitNumber(tx.amount[0].amount); - const amount = NumbersUtils.convertUnitNumber(prevAmountNumber + msgAmountNumber, LUM_DENOM, MICRO_LUM_DENOM).toFixed(); + const prevAmountNumber = NumbersUtils.convertUnitNumber(tx.amount[0].amount, tx.amount[0].denom); + const amount = NumbersUtils.convertUnitNumber(prevAmountNumber + msgAmountNumber, LUM_DENOM).toFixed(); tx.amount[existingDenomIndex].amount = amount; } else { const existingTx = formattedTxs.find((formattedTx) => formattedTx.hash === tx.hash && formattedTx.height === tx.height); @@ -95,8 +95,8 @@ export const parseLogs = async (tx: TransactionModel, msg: Any, index: number, l ], }); } else { - const prevAmountNumber = NumbersUtils.convertUnitNumber(existingTx.amount[0].amount); - const amount = NumbersUtils.convertUnitNumber(prevAmountNumber + msgAmountNumber, LUM_DENOM, MICRO_LUM_DENOM).toFixed(); + const prevAmountNumber = NumbersUtils.convertUnitNumber(existingTx.amount[0].amount, existingTx.amount[0].denom); + const amount = NumbersUtils.convertUnitNumber(prevAmountNumber + msgAmountNumber, LUM_DENOM).toFixed(); existingTx.amount = [ { diff --git a/src/utils/wallet.ts b/src/utils/wallet.ts index 7ebfeae4..3e0d301b 100644 --- a/src/utils/wallet.ts +++ b/src/utils/wallet.ts @@ -11,7 +11,7 @@ export const getTotalBalance = (balances: Coin[], prices: { [denom: string]: num balances.forEach((balance) => { const price = Object.entries(prices).find((price) => price[0] === getNormalDenom(balance.denom)); - const convertedAmount = convertUnitNumber(balance.amount); + const convertedAmount = convertUnitNumber(balance.amount, balance.denom); if (price) { totalBalance += convertedAmount * price[1]; @@ -43,7 +43,7 @@ export const getTotalBalanceFromDeposits = (deposits: AggregatedDepositModel[] | .filter((deposit) => deposit.state === DepositState.DEPOSIT_STATE_SUCCESS) .forEach((deposit) => { const price = prices ? Object.entries(prices).find((price) => price[0] === getNormalDenom(deposit.amount?.denom || '')) : null; - const convertedAmount = convertUnitNumber(deposit.amount?.amount || '0'); + const convertedAmount = convertUnitNumber(deposit.amount?.amount || '0', deposit.amount?.denom); if (prices && !price) { missingPrice = true; @@ -67,7 +67,7 @@ export const getMaxAmount = (denom?: string, balances?: Coin[], feesAmount?: num const balance = balances?.find((b) => b.denom === denom); if (balance) { - let amount = convertUnitNumber(balance.amount); + let amount = convertUnitNumber(balance.amount, balance.denom); if (feesAmount) { amount -= feesAmount; diff --git a/src/utils/walletClient.ts b/src/utils/walletClient.ts index df2f4e67..caa4bf49 100644 --- a/src/utils/walletClient.ts +++ b/src/utils/walletClient.ts @@ -4,6 +4,7 @@ import { SigningStargateClient, assertIsDeliverTxSuccess } from '@cosmjs/stargat import { Coin } from '@keplr-wallet/types'; import { Dec, IntPretty } from '@keplr-wallet/unit'; import { cosmos, fromAscii, getSigningIbcClient, ibc } from '@lum-network/sdk-javascript'; +import { InjectiveStargate } from '@injectivelabs/sdk-ts'; import { ApiConstants, GAS_MULTIPLIER } from 'constant'; import { I18n, NumbersUtils } from 'utils'; @@ -15,7 +16,7 @@ const { transfer } = ibc.applications.transfer.v1.MessageComposer.withTypeUrl; class WalletClient { private chainId: string | null = null; - private walletClient: SigningStargateClient | null = null; + private walletClient: SigningStargateClient | InjectiveStargate.InjectiveSigningStargateClient | null = null; private queryClient: Awaited> | null = null; // Utils @@ -29,15 +30,20 @@ class WalletClient { const { createRPCQueryClient } = cosmos.ClientFactory; const queryClient = await createRPCQueryClient({ rpcEndpoint: rpc }); - if (offlineSigner) { - this.walletClient = await getSigningIbcClient({ - rpcEndpoint: rpc, - signer: offlineSigner, - }); - } - this.queryClient = queryClient; this.chainId = (await queryClient.cosmos.base.tendermint.v1beta1.getNodeInfo()).nodeInfo?.network || 'lum-network-1'; + + if (offlineSigner) { + if (this.chainId.includes('injective')) { + const client = await InjectiveStargate.InjectiveSigningStargateClient.connectWithSigner(rpc, offlineSigner); + this.walletClient = client; + } else { + this.walletClient = await getSigningIbcClient({ + rpcEndpoint: rpc, + signer: offlineSigner, + }); + } + } } catch (e) { if (!silent) showErrorToast({ content: I18n.t('errors.client.rpc') }); throw e; @@ -87,14 +93,14 @@ class WalletClient { return this.queryClient.cosmos.distribution.v1beta1.delegationTotalRewards({ delegatorAddress: address }); }; - getBonding = async () => { + getBonding = async (denom: string) => { if (this.queryClient === null) { return null; } const bondedTokens = (await this.queryClient.cosmos.staking.v1beta1.pool()).pool?.bondedTokens; - return bondedTokens ? NumbersUtils.convertUnitNumber(bondedTokens) : null; + return bondedTokens ? NumbersUtils.convertUnitNumber(bondedTokens, denom) : null; }; getSupply = async (denom: string) => { @@ -104,7 +110,7 @@ class WalletClient { const supply = (await this.queryClient.cosmos.bank.v1beta1.supplyOf({ denom }))?.amount?.amount; - return supply ? NumbersUtils.convertUnitNumber(supply) : null; + return supply ? NumbersUtils.convertUnitNumber(supply, denom) : null; }; getCommunityTaxRate = async () => { diff --git a/yarn.lock b/yarn.lock index 5100d5dd..eb4d2214 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2912,6 +2912,16 @@ resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz#ea89004119dc42db2e1dba0f97d553f7372f6fcb" integrity sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg== +"@ensdomains/ens-validation@^0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@ensdomains/ens-validation/-/ens-validation-0.1.0.tgz#9ebfe66016fbf069a6ebca70c043714f6f02fbe6" + integrity sha512-rbDh2K6GfqXvBcJUISaTTYEt3f079WA4ohTE5Lh4/8EaaPAk/9vk3EisMUQV2UVxeFIZQEEyRCIOmRTpqN0W7A== + +"@ensdomains/eth-ens-namehash@^2.0.15": + version "2.0.15" + resolved "https://registry.yarnpkg.com/@ensdomains/eth-ens-namehash/-/eth-ens-namehash-2.0.15.tgz#5e5f2f24ba802aff8bc19edd822c9a11200cdf4a" + integrity sha512-JRDFP6+Hczb1E0/HhIg0PONgBYasfGfDheujmfxaZaAv/NAH4jE6Kf48WbqfRZdxt4IZI3jl3Ri7sZ1nP09lgw== + "@eslint/eslintrc@^1.4.1": version "1.4.1" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.4.1.tgz#af58772019a2d271b7e2d4c23ff4ddcba3ccfb3e" @@ -3791,6 +3801,16 @@ protobufjs "^7.0.0" rxjs "^7.4.0" +"@injectivelabs/core-proto-ts@^0.0.21": + version "0.0.21" + resolved "https://registry.yarnpkg.com/@injectivelabs/core-proto-ts/-/core-proto-ts-0.0.21.tgz#b52d4bee7556ce57c7c7e2c1ec7f6b920b4c2ffd" + integrity sha512-RBxSkRBCty60R/l55/D1jsSW0Aof5dyGFhCFdN3A010KjMv/SzZGGr+6DZPY/hflyFeaJzDv/VTopCymKNRBvQ== + dependencies: + "@injectivelabs/grpc-web" "^0.0.1" + google-protobuf "^3.14.0" + protobufjs "^7.0.0" + rxjs "^7.4.0" + "@injectivelabs/dmm-proto-ts@1.0.16": version "1.0.16" resolved "https://registry.yarnpkg.com/@injectivelabs/dmm-proto-ts/-/dmm-proto-ts-1.0.16.tgz#7e2d6652cf31700524c1933d40ffa54c213302c5" @@ -3801,6 +3821,16 @@ protobufjs "^7.0.0" rxjs "^7.4.0" +"@injectivelabs/dmm-proto-ts@1.0.19": + version "1.0.19" + resolved "https://registry.yarnpkg.com/@injectivelabs/dmm-proto-ts/-/dmm-proto-ts-1.0.19.tgz#fbb3432df9a3a6465a19fe68f3ebbfeb532fbd56" + integrity sha512-2FCzCziy1RhzmnkAVIU+Asby/GXAVQqKt5/o1s52j0LJXfJMpiCrV6soLfnjTebj61T+1WvJBPFoZCCiVYBpcw== + dependencies: + "@injectivelabs/grpc-web" "^0.0.1" + google-protobuf "^3.14.0" + protobufjs "^7.0.0" + rxjs "^7.4.0" + "@injectivelabs/exceptions@^1.11.0", "@injectivelabs/exceptions@^1.14.5": version "1.14.5" resolved "https://registry.yarnpkg.com/@injectivelabs/exceptions/-/exceptions-1.14.5.tgz#3ee2cb89f591c83bd325487511b3b553b19602d8" @@ -3812,6 +3842,17 @@ link-module-alias "^1.2.0" shx "^0.3.2" +"@injectivelabs/exceptions@^1.14.6": + version "1.14.6" + resolved "https://registry.yarnpkg.com/@injectivelabs/exceptions/-/exceptions-1.14.6.tgz#86f93815eb6bc60902c43072b8e212146d78614e" + integrity sha512-A+URJwygeDjFPhulGMNVw70z738NtpIiCr0W8q4Kr4Ggg30i+AaVAjViYLm56pSMXXpomu9CYJ/sY6ijQn48IQ== + dependencies: + "@injectivelabs/grpc-web" "^0.0.1" + "@injectivelabs/ts-types" "^1.14.6" + http-status-codes "^2.2.0" + link-module-alias "^1.2.0" + shx "^0.3.2" + "@injectivelabs/grpc-web-node-http-transport@^0.0.2": version "0.0.2" resolved "https://registry.yarnpkg.com/@injectivelabs/grpc-web-node-http-transport/-/grpc-web-node-http-transport-0.0.2.tgz#87c9bbd4db1f70cf18d6a55b54b2cf17d3cf30c0" @@ -3839,6 +3880,16 @@ protobufjs "^7.0.0" rxjs "^7.4.0" +"@injectivelabs/indexer-proto-ts@1.11.36": + version "1.11.36" + resolved "https://registry.yarnpkg.com/@injectivelabs/indexer-proto-ts/-/indexer-proto-ts-1.11.36.tgz#4a1476e52a5003a077b30a22679272eb9dd18d7a" + integrity sha512-s7E3Y28JrkylDwRVfF/AvcPy/zPgz52W+XbQ0FOcsqPof78xp8FvnM3ubVZi0Dad39LgDB5eeiMFPmeuLp8Uew== + dependencies: + "@injectivelabs/grpc-web" "^0.0.1" + google-protobuf "^3.14.0" + protobufjs "^7.0.0" + rxjs "^7.4.0" + "@injectivelabs/mito-proto-ts@1.0.17": version "1.0.17" resolved "https://registry.yarnpkg.com/@injectivelabs/mito-proto-ts/-/mito-proto-ts-1.0.17.tgz#543e0ca7356b5f7ae6d5c5c8dc01b3a9f097595d" @@ -3849,6 +3900,16 @@ protobufjs "^7.0.0" rxjs "^7.4.0" +"@injectivelabs/mito-proto-ts@1.0.62": + version "1.0.62" + resolved "https://registry.yarnpkg.com/@injectivelabs/mito-proto-ts/-/mito-proto-ts-1.0.62.tgz#45fc0746af7d1b283625816caeb9fff9887e050f" + integrity sha512-WtoO80Y597nZiAuE4H+L208I0i3ByWytR+HqABdCaA26uJ7F1LhXw8YXxh3pP9z0LAeW31T+N7bwtOMlVR4riA== + dependencies: + "@injectivelabs/grpc-web" "^0.0.1" + google-protobuf "^3.14.0" + protobufjs "^7.0.0" + rxjs "^7.4.0" + "@injectivelabs/networks@^1.11.0", "@injectivelabs/networks@^1.14.5": version "1.14.5" resolved "https://registry.yarnpkg.com/@injectivelabs/networks/-/networks-1.14.5.tgz#4d7536fede8edcc24ecbd2bceeca11affa7d24e9" @@ -3860,6 +3921,17 @@ link-module-alias "^1.2.0" shx "^0.3.2" +"@injectivelabs/networks@^1.14.6": + version "1.14.6" + resolved "https://registry.yarnpkg.com/@injectivelabs/networks/-/networks-1.14.6.tgz#29be5e81e60d725a0eef2db2c9b6ba0b4588141b" + integrity sha512-O1IkPFJl8ThNL6N+k/9OimrgCYsSWQ8A1FtVMXSQge+0QRZsDKSpRmQRwE601otXXauO31nOUct5AaiWPffXVQ== + dependencies: + "@injectivelabs/exceptions" "^1.14.6" + "@injectivelabs/ts-types" "^1.14.6" + "@injectivelabs/utils" "^1.14.6" + link-module-alias "^1.2.0" + shx "^0.3.2" + "@injectivelabs/sdk-ts@1.11.0": version "1.11.0" resolved "https://registry.yarnpkg.com/@injectivelabs/sdk-ts/-/sdk-ts-1.11.0.tgz#b347a01769242fa2486f44320b40f1c6522c0fc7" @@ -3903,6 +3975,49 @@ shx "^0.3.2" snakecase-keys "^5.4.1" +"@injectivelabs/sdk-ts@^1.14.7": + version "1.14.7" + resolved "https://registry.yarnpkg.com/@injectivelabs/sdk-ts/-/sdk-ts-1.14.7.tgz#16e84cecb14fe796314f8f616567511e1030f043" + integrity sha512-Qm8y8jKCMyNfYZGZVI+p0SIGJPtP5M9/DPFyPK+JSR2OOU0J4MX2yS/tQB5ViC/3Bt7yQhw/l3Rop93e7pTZEg== + dependencies: + "@apollo/client" "^3.5.8" + "@cosmjs/amino" "^0.32.2" + "@cosmjs/proto-signing" "^0.32.2" + "@cosmjs/stargate" "^0.32.2" + "@ensdomains/ens-validation" "^0.1.0" + "@ensdomains/eth-ens-namehash" "^2.0.15" + "@ethersproject/bytes" "^5.7.0" + "@injectivelabs/core-proto-ts" "^0.0.21" + "@injectivelabs/dmm-proto-ts" "1.0.19" + "@injectivelabs/exceptions" "^1.14.6" + "@injectivelabs/grpc-web" "^0.0.1" + "@injectivelabs/grpc-web-node-http-transport" "^0.0.2" + "@injectivelabs/grpc-web-react-native-transport" "^0.0.2" + "@injectivelabs/indexer-proto-ts" "1.11.36" + "@injectivelabs/mito-proto-ts" "1.0.62" + "@injectivelabs/networks" "^1.14.6" + "@injectivelabs/test-utils" "^1.14.3" + "@injectivelabs/token-metadata" "^1.14.7" + "@injectivelabs/ts-types" "^1.14.6" + "@injectivelabs/utils" "^1.14.6" + "@metamask/eth-sig-util" "^4.0.0" + axios "^0.27.2" + bech32 "^2.0.0" + bip39 "^3.0.4" + cosmjs-types "^0.9.0" + ethereumjs-util "^7.1.4" + ethers "^5.7.2" + google-protobuf "^3.21.0" + graphql "^16.3.0" + http-status-codes "^2.2.0" + js-sha3 "^0.8.0" + jscrypto "^1.0.3" + keccak256 "^1.0.6" + link-module-alias "^1.2.0" + secp256k1 "^4.0.3" + shx "^0.3.2" + snakecase-keys "^5.4.1" + "@injectivelabs/test-utils@^1.11.0": version "1.14.3" resolved "https://registry.yarnpkg.com/@injectivelabs/test-utils/-/test-utils-1.14.3.tgz#3c78b5f34669917f484aa8ac4a88df7bbc376f88" @@ -3915,6 +4030,18 @@ snakecase-keys "^5.1.2" store2 "^2.12.0" +"@injectivelabs/test-utils@^1.14.3": + version "1.14.4" + resolved "https://registry.yarnpkg.com/@injectivelabs/test-utils/-/test-utils-1.14.4.tgz#bf5b8c069eabac875e0c235589132b6166a5d08b" + integrity sha512-M7UoB5CIVVN7BtdmU26GwZsWKp0BQg9qV5a+YvcdhlwlSIkvt3gKVKBMq/vKClCakOu2AjhCVGDMZVnagIBogg== + dependencies: + axios "^0.21.1" + bignumber.js "^9.0.1" + link-module-alias "^1.2.0" + shx "^0.3.2" + snakecase-keys "^5.1.2" + store2 "^2.12.0" + "@injectivelabs/token-metadata@^1.11.0": version "1.14.5" resolved "https://registry.yarnpkg.com/@injectivelabs/token-metadata/-/token-metadata-1.14.5.tgz#73552e3e78e5d15f5317a05a5812d0be3647e38d" @@ -3932,6 +4059,23 @@ lodash.values "^4.3.0" shx "^0.3.2" +"@injectivelabs/token-metadata@^1.14.7": + version "1.14.7" + resolved "https://registry.yarnpkg.com/@injectivelabs/token-metadata/-/token-metadata-1.14.7.tgz#0adba14e76e8882dc13a6a488ced0762fd888ae3" + integrity sha512-RRRuyirzoThwQ5P8D3STH2YOavGsdnetQy6ZPQ8yA7VUavt00KBB26M92zSLbiUz5VrxhPHDCEEkuJVWx+xtmw== + dependencies: + "@injectivelabs/exceptions" "^1.14.6" + "@injectivelabs/networks" "^1.14.6" + "@injectivelabs/ts-types" "^1.14.6" + "@injectivelabs/utils" "^1.14.6" + "@types/lodash.values" "^4.3.6" + copyfiles "^2.4.1" + jsonschema "^1.4.0" + link-module-alias "^1.2.0" + lodash "^4.17.21" + lodash.values "^4.3.0" + shx "^0.3.2" + "@injectivelabs/ts-types@^1.11.0", "@injectivelabs/ts-types@^1.14.5": version "1.14.5" resolved "https://registry.yarnpkg.com/@injectivelabs/ts-types/-/ts-types-1.14.5.tgz#e7ed5fa87052b0763908bd77b132775aa37a097c" @@ -3940,6 +4084,14 @@ link-module-alias "^1.2.0" shx "^0.3.2" +"@injectivelabs/ts-types@^1.14.6": + version "1.14.6" + resolved "https://registry.yarnpkg.com/@injectivelabs/ts-types/-/ts-types-1.14.6.tgz#917a14c8fed81c683bc7dece3ec254388123a10e" + integrity sha512-/Ax5eCSfE9OhcyUc9wZk/LFKTYhIY9RJIaNT/n92rbHjXSfXRLSX+Bvk62vC9Ej+SEBPp77WYngtrePPA1HEgw== + dependencies: + link-module-alias "^1.2.0" + shx "^0.3.2" + "@injectivelabs/utils@^1.11.0", "@injectivelabs/utils@^1.14.5": version "1.14.5" resolved "https://registry.yarnpkg.com/@injectivelabs/utils/-/utils-1.14.5.tgz#4fe9055c2c36f6f09faed9a95e2d77ae8daaf71f" @@ -3955,6 +4107,21 @@ snakecase-keys "^5.1.2" store2 "^2.12.0" +"@injectivelabs/utils@^1.14.6": + version "1.14.6" + resolved "https://registry.yarnpkg.com/@injectivelabs/utils/-/utils-1.14.6.tgz#1e5c60973f9b2bb1a0334a0cd5b3f56377904472" + integrity sha512-5I0h4GiLB5PPTl+g2lpevRP+WScvEbntdkoUQVtAdHewl4kutd5p1Kcnoi1Nvpq+sz5N/e9qtBIRuyxG38akOg== + dependencies: + "@injectivelabs/exceptions" "^1.14.6" + "@injectivelabs/ts-types" "^1.14.6" + axios "^0.21.1" + bignumber.js "^9.0.1" + http-status-codes "^2.2.0" + link-module-alias "^1.2.0" + shx "^0.3.2" + snakecase-keys "^5.1.2" + store2 "^2.12.0" + "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced"