Compare commits

...
Author SHA1 Message Date
Bill He 464f8165d6 add TODO 2023-10-19 10:50:26 -07:00
Bill He 1eed6e3e5c address comments 2023-10-19 10:34:14 -07:00
Bill He 483ea78260 use cancelRawOrder 2023-10-19 10:09:35 -07:00
Bill He eceaea5235 chain -> chaintoken 2023-10-19 10:04:47 -07:00
Bill He ab04f262ab bump 2023-10-19 10:04:47 -07:00
Bill He 0dae28d605 Have tokens be configurable, bump v4-client 2023-10-19 10:04:44 -07:00
20 changed files with 218 additions and 155 deletions
+2 -2
View File
@@ -38,8 +38,8 @@
"@cosmjs/proto-signing": "^0.31.0", "@cosmjs/proto-signing": "^0.31.0",
"@cosmjs/stargate": "^0.31.0", "@cosmjs/stargate": "^0.31.0",
"@cosmjs/tendermint-rpc": "^0.31.0", "@cosmjs/tendermint-rpc": "^0.31.0",
"@dydxprotocol/v4-abacus": "^0.7.0", "@dydxprotocol/v4-abacus": "^0.7.2",
"@dydxprotocol/v4-client-js": "^0.36.1", "@dydxprotocol/v4-client-js": "^0.40.3",
"@dydxprotocol/v4-localization": "^0.1.30", "@dydxprotocol/v4-localization": "^0.1.30",
"@ethersproject/providers": "^5.7.2", "@ethersproject/providers": "^5.7.2",
"@js-joda/core": "^5.5.3", "@js-joda/core": "^5.5.3",
+21 -20
View File
@@ -27,11 +27,11 @@ dependencies:
specifier: ^0.31.0 specifier: ^0.31.0
version: 0.31.0 version: 0.31.0
'@dydxprotocol/v4-abacus': '@dydxprotocol/v4-abacus':
specifier: ^0.7.0 specifier: ^0.7.2
version: 0.7.0 version: 0.7.2
'@dydxprotocol/v4-client-js': '@dydxprotocol/v4-client-js':
specifier: ^0.36.1 specifier: ^0.40.3
version: 0.36.1 version: 0.40.3
'@dydxprotocol/v4-localization': '@dydxprotocol/v4-localization':
specifier: ^0.1.30 specifier: ^0.1.30
version: 0.1.30 version: 0.1.30
@@ -645,7 +645,7 @@ packages:
/@confio/ics23@0.6.8: /@confio/ics23@0.6.8:
resolution: {integrity: sha512-wB6uo+3A50m0sW/EWcU64xpV/8wShZ6bMTa7pF8eYsTrSkQA7oLUIJcs/wb8g4y2Oyq701BaGiO6n/ak5WXO1w==} resolution: {integrity: sha512-wB6uo+3A50m0sW/EWcU64xpV/8wShZ6bMTa7pF8eYsTrSkQA7oLUIJcs/wb8g4y2Oyq701BaGiO6n/ak5WXO1w==}
dependencies: dependencies:
'@noble/hashes': 1.3.1 '@noble/hashes': 1.3.2
protobufjs: 6.11.4 protobufjs: 6.11.4
dev: false dev: false
@@ -717,7 +717,7 @@ packages:
'@cosmjs/encoding': 0.30.1 '@cosmjs/encoding': 0.30.1
'@cosmjs/math': 0.30.1 '@cosmjs/math': 0.30.1
'@cosmjs/utils': 0.30.1 '@cosmjs/utils': 0.30.1
'@noble/hashes': 1.3.1 '@noble/hashes': 1.3.2
bn.js: 5.2.1 bn.js: 5.2.1
elliptic: 6.5.4 elliptic: 6.5.4
libsodium-wrappers: 0.7.11 libsodium-wrappers: 0.7.11
@@ -979,12 +979,12 @@ packages:
resolution: {integrity: sha512-RpfLEtTlyIxeNPGKcokS+p3BZII/Q3bYxryFRglh5H3A3T8q9fsLYm72VYAMEOOIBLEa8o93kFLiBDUWKrwXZA==} resolution: {integrity: sha512-RpfLEtTlyIxeNPGKcokS+p3BZII/Q3bYxryFRglh5H3A3T8q9fsLYm72VYAMEOOIBLEa8o93kFLiBDUWKrwXZA==}
dev: true dev: true
/@dydxprotocol/v4-abacus@0.7.0: /@dydxprotocol/v4-abacus@0.7.2:
resolution: {integrity: sha512-XheqfIpOODfQFG860oH0fneVgp9qQKPMDTwrvFXaM/JtKH9ekOUUO6De72EsJ7qOuxWwl1WgoALA8b4tRs0tiw==} resolution: {integrity: sha512-5foamomN82FH6ko3EuzwFlSoAEY6Sal8fDgvZo2RsB19Ks6SFgFDeeOcEDdfoa3DNwvl8yW0C9cfxeQ+BfU8uA==}
dev: false dev: false
/@dydxprotocol/v4-client-js@0.36.1: /@dydxprotocol/v4-client-js@0.40.3:
resolution: {integrity: sha512-KJ3MtWI61wmm+xZtXQd7/hYKIoVFG32TRdyyVaXXO8vpW9Oqd0JD8QSM/wuegkciAh5YmP/BrDzYuu77zHO6yg==} resolution: {integrity: sha512-nMQd6tYisKDKIbfx0BGJSYEOSt+I+t5SsaBSmlgTdso+w2rCRO9vyxS+u6MF9h4w5FsVRfhHo3e6uTWX48WpGQ==}
dependencies: dependencies:
'@cosmjs/amino': 0.30.1 '@cosmjs/amino': 0.30.1
'@cosmjs/encoding': 0.31.1 '@cosmjs/encoding': 0.31.1
@@ -993,14 +993,15 @@ packages:
'@cosmjs/stargate': 0.30.1 '@cosmjs/stargate': 0.30.1
'@cosmjs/tendermint-rpc': 0.30.1 '@cosmjs/tendermint-rpc': 0.30.1
'@cosmjs/utils': 0.31.1 '@cosmjs/utils': 0.31.1
'@dydxprotocol/v4-proto': 0.2.1 '@dydxprotocol/v4-proto': 0.4.1
'@osmonauts/lcd': 0.6.0 '@osmonauts/lcd': 0.6.0
'@scure/bip32': 1.3.1 '@scure/bip32': 1.3.2
'@scure/bip39': 1.2.1 '@scure/bip39': 1.2.1
axios: 1.1.3 axios: 1.1.3
bech32: 1.1.4 bech32: 1.1.4
bignumber.js: 9.1.1 bignumber.js: 9.1.1
ethereum-cryptography: 2.1.2 ethereum-cryptography: 2.1.2
ethers: 6.6.1
long: 4.0.0 long: 4.0.0
protobufjs: 6.11.4 protobufjs: 6.11.4
ws: 8.13.0(bufferutil@4.0.7)(utf-8-validate@5.0.10) ws: 8.13.0(bufferutil@4.0.7)(utf-8-validate@5.0.10)
@@ -1014,8 +1015,8 @@ packages:
resolution: {integrity: sha512-xTlQuQmPz7wfGkjd07giYMAxRrolDbJE3DryJSIMB6R1MBq1wLzAcwp/iR/nELRwilRX9c44Tap0gGt+oAajiQ==} resolution: {integrity: sha512-xTlQuQmPz7wfGkjd07giYMAxRrolDbJE3DryJSIMB6R1MBq1wLzAcwp/iR/nELRwilRX9c44Tap0gGt+oAajiQ==}
dev: false dev: false
/@dydxprotocol/v4-proto@0.2.1: /@dydxprotocol/v4-proto@0.4.1:
resolution: {integrity: sha512-Q5b/g331DoyMjBpO2/jtrxUX3WF5UaIKZp/unK332xuefHNFnkMYtZ05p0V71iSdO35tBdz8yt0VYP2WtUsp+w==} resolution: {integrity: sha512-2pBkokufWcxfIpiXE6QuQOBXUe154OTp6ojCIdOPW9TFLxzchoygxXnb5dL6rAQVNj9Qbg+hhXBllutt4m99dw==}
dependencies: dependencies:
protobufjs: 6.11.4 protobufjs: 6.11.4
dev: false dev: false
@@ -4708,8 +4709,8 @@ packages:
resolution: {integrity: sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A==} resolution: {integrity: sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A==}
dependencies: dependencies:
'@noble/curves': 1.1.0 '@noble/curves': 1.1.0
'@noble/hashes': 1.3.1 '@noble/hashes': 1.3.2
'@scure/base': 1.1.1 '@scure/base': 1.1.3
dev: false dev: false
/@scure/bip32@1.3.2: /@scure/bip32@1.3.2:
@@ -4731,7 +4732,7 @@ packages:
resolution: {integrity: sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==} resolution: {integrity: sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==}
dependencies: dependencies:
'@noble/hashes': 1.3.2 '@noble/hashes': 1.3.2
'@scure/base': 1.1.1 '@scure/base': 1.1.3
dev: false dev: false
/@solana/buffer-layout@4.0.1: /@solana/buffer-layout@4.0.1:
@@ -4745,8 +4746,8 @@ packages:
resolution: {integrity: sha512-up5VG1dK+GPhykmuMIozJZBbVqpm77vbOG6/r5dS7NBGZonwHfTLdBbsYc3rjmaQ4DpCXUa3tUc4RZHRORvZrw==} resolution: {integrity: sha512-up5VG1dK+GPhykmuMIozJZBbVqpm77vbOG6/r5dS7NBGZonwHfTLdBbsYc3rjmaQ4DpCXUa3tUc4RZHRORvZrw==}
dependencies: dependencies:
'@babel/runtime': 7.22.10 '@babel/runtime': 7.22.10
'@noble/curves': 1.1.0 '@noble/curves': 1.2.0
'@noble/hashes': 1.3.1 '@noble/hashes': 1.3.2
'@solana/buffer-layout': 4.0.1 '@solana/buffer-layout': 4.0.1
agentkeepalive: 4.5.0 agentkeepalive: 4.5.0
bigint-buffer: 1.1.5 bigint-buffer: 1.1.5
@@ -7144,7 +7145,7 @@ packages:
/bip39@3.1.0: /bip39@3.1.0:
resolution: {integrity: sha512-c9kiwdk45Do5GL0vJMe7tS95VjCii65mYAH7DfWl3uW8AVzXKQVUm64i3hzVybBDMp9r7j9iNxR85+ul8MdN/A==} resolution: {integrity: sha512-c9kiwdk45Do5GL0vJMe7tS95VjCii65mYAH7DfWl3uW8AVzXKQVUm64i3hzVybBDMp9r7j9iNxR85+ul8MdN/A==}
dependencies: dependencies:
'@noble/hashes': 1.3.1 '@noble/hashes': 1.3.2
dev: false dev: false
/bl@5.1.0: /bl@5.1.0:
+14 -14
View File
@@ -40,7 +40,7 @@
"isMainNet": false, "isMainNet": false,
"tokens": { "tokens": {
"chain": { "chain": {
"name": "DYDX", "name": "Dv4TNT",
"denom": "adv4tnt", "denom": "adv4tnt",
"decimals": 18, "decimals": 18,
"image": "/currencies/dydx.png" "image": "/currencies/dydx.png"
@@ -100,7 +100,7 @@
"isMainNet": false, "isMainNet": false,
"tokens": { "tokens": {
"chain": { "chain": {
"name": "DYDX", "name": "Dv4TNT",
"denom": "adv4tnt", "denom": "adv4tnt",
"decimals": 18, "decimals": 18,
"image": "/currencies/dydx.png" "image": "/currencies/dydx.png"
@@ -159,7 +159,7 @@
"isMainNet": false, "isMainNet": false,
"tokens": { "tokens": {
"chain": { "chain": {
"name": "DYDX", "name": "Dv4TNT",
"denom": "adv4tnt", "denom": "adv4tnt",
"decimals": 18, "decimals": 18,
"image": "/currencies/dydx.png" "image": "/currencies/dydx.png"
@@ -218,7 +218,7 @@
"isMainNet": false, "isMainNet": false,
"tokens": { "tokens": {
"chain": { "chain": {
"name": "DYDX", "name": "Dv4TNT",
"denom": "adv4tnt", "denom": "adv4tnt",
"decimals": 18, "decimals": 18,
"image": "/currencies/dydx.png" "image": "/currencies/dydx.png"
@@ -277,7 +277,7 @@
"isMainNet": false, "isMainNet": false,
"tokens": { "tokens": {
"chain": { "chain": {
"name": "DYDX", "name": "Dv4TNT",
"denom": "adv4tnt", "denom": "adv4tnt",
"decimals": 18, "decimals": 18,
"image": "/currencies/dydx.png" "image": "/currencies/dydx.png"
@@ -340,7 +340,7 @@
"isMainNet": false, "isMainNet": false,
"tokens": { "tokens": {
"chain": { "chain": {
"name": "DYDX", "name": "Dv4TNT",
"denom": "adv4tnt", "denom": "adv4tnt",
"decimals": 18, "decimals": 18,
"image": "/currencies/dydx.png" "image": "/currencies/dydx.png"
@@ -403,7 +403,7 @@
"isMainNet": false, "isMainNet": false,
"tokens": { "tokens": {
"chain": { "chain": {
"name": "DYDX", "name": "Dv4TNT",
"denom": "adv4tnt", "denom": "adv4tnt",
"decimals": 18, "decimals": 18,
"image": "/currencies/dydx.png" "image": "/currencies/dydx.png"
@@ -468,7 +468,7 @@
"isMainNet": false, "isMainNet": false,
"tokens": { "tokens": {
"chain": { "chain": {
"name": "DYDX", "name": "Dv4TNT",
"denom": "adv4tnt", "denom": "adv4tnt",
"decimals": 18, "decimals": 18,
"image": "/currencies/dydx.png" "image": "/currencies/dydx.png"
@@ -532,7 +532,7 @@
"isMainNet": false, "isMainNet": false,
"tokens": { "tokens": {
"chain": { "chain": {
"name": "DYDX", "name": "Dv4TNT",
"denom": "adv4tnt", "denom": "adv4tnt",
"decimals": 18, "decimals": 18,
"image": "/currencies/dydx.png" "image": "/currencies/dydx.png"
@@ -596,7 +596,7 @@
"isMainNet": false, "isMainNet": false,
"tokens": { "tokens": {
"chain": { "chain": {
"name": "DYDX", "name": "Dv4TNT",
"denom": "adv4tnt", "denom": "adv4tnt",
"decimals": 18, "decimals": 18,
"image": "/currencies/dydx.png" "image": "/currencies/dydx.png"
@@ -660,7 +660,7 @@
"isMainNet": false, "isMainNet": false,
"tokens": { "tokens": {
"chain": { "chain": {
"name": "DYDX", "name": "Dv4TNT",
"denom": "adv4tnt", "denom": "adv4tnt",
"decimals": 18, "decimals": 18,
"image": "/currencies/dydx.png" "image": "/currencies/dydx.png"
@@ -724,7 +724,7 @@
"isMainNet": false, "isMainNet": false,
"tokens": { "tokens": {
"chain": { "chain": {
"name": "DYDX", "name": "Dv4TNT",
"denom": "adv4tnt", "denom": "adv4tnt",
"decimals": 18, "decimals": 18,
"image": "/currencies/dydx.png" "image": "/currencies/dydx.png"
@@ -789,8 +789,8 @@
"tokens": { "tokens": {
"comment": "Change according to mainnet release", "comment": "Change according to mainnet release",
"chain": { "chain": {
"name": "DYDX", "name": "TokenName",
"denom": "adv4tnt", "denom": "tokenDenom",
"decimals": 18, "decimals": 18,
"image": "/currencies/dydx.png" "image": "/currencies/dydx.png"
}, },
+9 -2
View File
@@ -7,7 +7,13 @@ import { GrazProvider } from 'graz';
import { AppRoute, DEFAULT_TRADE_ROUTE } from '@/constants/routes'; import { AppRoute, DEFAULT_TRADE_ROUTE } from '@/constants/routes';
import { useBreakpoints, useInitializePage, useShouldShowFooter, useAnalytics } from '@/hooks'; import {
useBreakpoints,
useTokenConfigs,
useInitializePage,
useShouldShowFooter,
useAnalytics,
} from '@/hooks';
import { DydxProvider } from '@/hooks/useDydxClient'; import { DydxProvider } from '@/hooks/useDydxClient';
import { AccountsProvider } from '@/hooks/useAccounts'; import { AccountsProvider } from '@/hooks/useAccounts';
import { DialogAreaProvider, useDialogArea } from '@/hooks/useDialogArea'; import { DialogAreaProvider, useDialogArea } from '@/hooks/useDialogArea';
@@ -57,6 +63,7 @@ const Content = () => {
const { isTablet, isNotTablet } = useBreakpoints(); const { isTablet, isNotTablet } = useBreakpoints();
const isShowingHeader = isNotTablet; const isShowingHeader = isNotTablet;
const isShowingFooter = useShouldShowFooter(); const isShowingFooter = useShouldShowFooter();
const { chainTokenLabel } = useTokenConfigs();
return ( return (
<Styled.Content isShowingHeader={isShowingHeader} isShowingFooter={isShowingFooter}> <Styled.Content isShowingHeader={isShowingHeader} isShowingFooter={isShowingFooter}>
@@ -71,7 +78,7 @@ const Content = () => {
</Route> </Route>
<Route path={AppRoute.Markets} element={<MarketsPage />} /> <Route path={AppRoute.Markets} element={<MarketsPage />} />
<Route path={AppRoute.Rewards} element={<RewardsPage />} /> <Route path={`/${chainTokenLabel}`} element={<RewardsPage />} />
{isTablet && ( {isTablet && (
<> <>
<Route path={AppRoute.Alerts} element={<AlertsPage />} /> <Route path={AppRoute.Alerts} element={<AlertsPage />} />
-1
View File
@@ -7,7 +7,6 @@ export enum AppRoute {
Profile = '/profile', Profile = '/profile',
Alerts = '/alerts', Alerts = '/alerts',
Settings = '/settings', Settings = '/settings',
Rewards = '/DV4TNT',
Terms = '/terms', Terms = '/terms',
Privacy = '/privacy', Privacy = '/privacy',
} }
+2 -12
View File
@@ -1,5 +1,5 @@
import type { ExternalProvider } from '@ethersproject/providers'; import type { ExternalProvider } from '@ethersproject/providers';
import { USDC_DENOM, type onboarding, DYDX_DENOM } from '@dydxprotocol/v4-client-js'; import { type onboarding } from '@dydxprotocol/v4-client-js';
import type { suggestChain } from 'graz'; import type { suggestChain } from 'graz';
import { STRING_KEYS } from '@/constants/localization'; import { STRING_KEYS } from '@/constants/localization';
@@ -352,15 +352,5 @@ export const DYDX_CHAIN_INFO: Parameters<typeof suggestChain>[0] = {
// TODO: export this type from abacus instead // TODO: export this type from abacus instead
export enum DydxChainAsset { export enum DydxChainAsset {
USDC = 'usdc', USDC = 'usdc',
DYDX = 'dydx', CHAINTOKEN = 'chain',
} }
export const DYDX_CHAIN_ASSET_COIN_DENOM: Record<DydxChainAsset, string> = {
[DydxChainAsset.USDC]: USDC_DENOM,
[DydxChainAsset.DYDX]: DYDX_DENOM,
};
export const DYDX_CHAIN_ASSET_TAGS: Record<DydxChainAsset, string> = {
[DydxChainAsset.USDC]: 'USDC',
[DydxChainAsset.DYDX]: 'Dv4TNT',
};
+2
View File
@@ -1,5 +1,6 @@
import { useApiState } from './useApiState'; import { useApiState } from './useApiState';
import { useBreakpoints } from './useBreakpoints'; import { useBreakpoints } from './useBreakpoints';
import { useTokenConfigs } from './useTokenConfigs';
import { useCommandMenu } from './useCommandMenu'; import { useCommandMenu } from './useCommandMenu';
import { useCurrentMarketId } from './useCurrentMarketId'; import { useCurrentMarketId } from './useCurrentMarketId';
import { useDebounce } from './useDebounce'; import { useDebounce } from './useDebounce';
@@ -25,6 +26,7 @@ import { useSubaccount } from './useSubaccount';
export { export {
useApiState, useApiState,
useBreakpoints, useBreakpoints,
useTokenConfigs,
useCommandMenu, useCommandMenu,
useCurrentMarketId, useCurrentMarketId,
useDebounce, useDebounce,
+8 -12
View File
@@ -5,8 +5,6 @@ import { StargateClient } from '@cosmjs/stargate';
import { useQuery } from 'react-query'; import { useQuery } from 'react-query';
import { formatUnits } from 'viem'; import { formatUnits } from 'viem';
import { USDC_DENOM, DYDX_DENOM } from '@dydxprotocol/v4-client-js';
import { ENVIRONMENT_CONFIG_MAP } from '@/constants/networks'; import { ENVIRONMENT_CONFIG_MAP } from '@/constants/networks';
import { QUANTUM_MULTIPLIER } from '@/constants/numbers'; import { QUANTUM_MULTIPLIER } from '@/constants/numbers';
import { EvmAddress } from '@/constants/wallets'; import { EvmAddress } from '@/constants/wallets';
@@ -18,6 +16,7 @@ import { getBalances, getStakingBalances } from '@/state/accountSelectors';
import { getSelectedNetwork } from '@/state/appSelectors'; import { getSelectedNetwork } from '@/state/appSelectors';
import { useAccounts } from './useAccounts'; import { useAccounts } from './useAccounts';
import { useTokenConfigs } from './useTokenConfigs';
type UseAccountBalanceProps = { type UseAccountBalanceProps = {
// Token Items // Token Items
@@ -52,6 +51,7 @@ export const useAccountBalance = ({
const selectedNetwork = useSelector(getSelectedNetwork); const selectedNetwork = useSelector(getSelectedNetwork);
const balances = useSelector(getBalances, shallowEqual); const balances = useSelector(getBalances, shallowEqual);
const { chainTokenDenom, usdcDenom } = useTokenConfigs();
const evmChainId = Number(ENVIRONMENT_CONFIG_MAP[selectedNetwork].ethereumChainId); const evmChainId = Number(ENVIRONMENT_CONFIG_MAP[selectedNetwork].ethereumChainId);
const stakingBalances = useSelector(getStakingBalances, shallowEqual); const stakingBalances = useSelector(getStakingBalances, shallowEqual);
@@ -93,18 +93,14 @@ export const useAccountBalance = ({
const { formatted: evmBalance } = evmQuery.data || {}; const { formatted: evmBalance } = evmQuery.data || {};
const balance = !assetSymbol ? '0' : isCosmosChain ? cosmosQuery.data : evmBalance; const balance = !assetSymbol ? '0' : isCosmosChain ? cosmosQuery.data : evmBalance;
const nativeTokenCoinBalance = balances?.[DYDX_DENOM]; const nativeTokenCoinBalance = balances?.[chainTokenDenom];
const nativeTokenBalance = MustBigNumber(nativeTokenCoinBalance?.amount) const nativeTokenBalance = MustBigNumber(nativeTokenCoinBalance?.amount);
.div(QUANTUM_MULTIPLIER)
.toNumber();
const usdcCoinBalance = balances?.[USDC_DENOM]; const usdcCoinBalance = balances?.[usdcDenom];
const usdcBalance = MustBigNumber(usdcCoinBalance?.amount).div(QUANTUM_MULTIPLIER).toNumber(); const usdcBalance = MustBigNumber(usdcCoinBalance?.amount).toNumber();
const nativeStakingCoinBalanace = stakingBalances?.[DYDX_DENOM]; const nativeStakingCoinBalanace = stakingBalances?.[chainTokenDenom];
const nativeStakingBalance = MustBigNumber(nativeStakingCoinBalanace?.amount) const nativeStakingBalance = MustBigNumber(nativeStakingCoinBalanace?.amount).toNumber();
.div(QUANTUM_MULTIPLIER)
.toNumber();
return { return {
balance, balance,
+2 -11
View File
@@ -2,7 +2,7 @@ import { useCallback, useContext, createContext, useEffect, useState, useMemo }
import { useDispatch } from 'react-redux'; import { useDispatch } from 'react-redux';
import { AES, enc } from 'crypto-js'; import { AES, enc } from 'crypto-js';
import { LocalWallet, USDC_DENOM, type Subaccount } from '@dydxprotocol/v4-client-js'; import { LocalWallet, type Subaccount } from '@dydxprotocol/v4-client-js';
import { OnboardingGuard, OnboardingState, type EvmDerivedAddresses } from '@/constants/account'; import { OnboardingGuard, OnboardingState, type EvmDerivedAddresses } from '@/constants/account';
import { DialogTypes } from '@/constants/dialogs'; import { DialogTypes } from '@/constants/dialogs';
@@ -130,16 +130,8 @@ const useAccountsContext = () => {
// dYdX subaccounts // dYdX subaccounts
const [dydxSubaccounts, setDydxSubaccounts] = useState<Subaccount[] | undefined>(); const [dydxSubaccounts, setDydxSubaccounts] = useState<Subaccount[] | undefined>();
const { getAccountBalance, getSubaccounts } = useMemo( const { getSubaccounts } = useMemo(
() => ({ () => ({
getAccountBalance: async ({
dydxAddress,
denom = USDC_DENOM,
}: {
dydxAddress: DydxAddress;
denom?: string;
}) => await compositeClient?.validatorClient.get.getAccountBalance(dydxAddress, denom),
getSubaccounts: async ({ dydxAddress }: { dydxAddress: DydxAddress }) => { getSubaccounts: async ({ dydxAddress }: { dydxAddress: DydxAddress }) => {
try { try {
const response = await compositeClient?.indexerClient.account.getSubaccounts(dydxAddress); const response = await compositeClient?.indexerClient.account.getSubaccounts(dydxAddress);
@@ -326,7 +318,6 @@ const useAccountsContext = () => {
disconnect, disconnect,
// dydxClient Account methods // dydxClient Account methods
getAccountBalance,
getSubaccounts, getSubaccounts,
}; };
}; };
+21 -16
View File
@@ -3,15 +3,10 @@ import { shallowEqual, useSelector, useDispatch } from 'react-redux';
import type { Nullable } from '@dydxprotocol/v4-abacus'; import type { Nullable } from '@dydxprotocol/v4-abacus';
import Long from 'long'; import Long from 'long';
import type { IndexedTx } from '@cosmjs/stargate'; import type { IndexedTx } from '@cosmjs/stargate';
import type { EncodeObject, Coin } from '@cosmjs/proto-signing'; import type { EncodeObject } from '@cosmjs/proto-signing';
import { Method } from '@cosmjs/tendermint-rpc'; import { Method } from '@cosmjs/tendermint-rpc';
import { import { type LocalWallet, SubaccountClient } from '@dydxprotocol/v4-client-js';
type LocalWallet,
SubaccountClient,
DYDX_DENOM,
USDC_DENOM,
} from '@dydxprotocol/v4-client-js';
import type { import type {
AccountBalance, AccountBalance,
@@ -34,6 +29,7 @@ import { MustBigNumber } from '@/lib/numbers';
import { log } from '@/lib/telemetry'; import { log } from '@/lib/telemetry';
import { useAccounts } from './useAccounts'; import { useAccounts } from './useAccounts';
import { useTokenConfigs } from './useTokenConfigs';
import { useDydxClient } from './useDydxClient'; import { useDydxClient } from './useDydxClient';
type SubaccountContextType = ReturnType<typeof useSubaccountContext>; type SubaccountContextType = ReturnType<typeof useSubaccountContext>;
@@ -52,6 +48,7 @@ export const useSubaccount = () => useContext(SubaccountContext);
export const useSubaccountContext = ({ localDydxWallet }: { localDydxWallet?: LocalWallet }) => { export const useSubaccountContext = ({ localDydxWallet }: { localDydxWallet?: LocalWallet }) => {
const dispatch = useDispatch(); const dispatch = useDispatch();
const { usdcDenom } = useTokenConfigs();
const { compositeClient, faucetClient } = useDydxClient(); const { compositeClient, faucetClient } = useDydxClient();
const { getFaucetFunds } = useMemo( const { getFaucetFunds } = useMemo(
@@ -91,7 +88,7 @@ export const useSubaccountContext = ({ localDydxWallet }: { localDydxWallet?: Lo
}: { }: {
subaccountClient: SubaccountClient; subaccountClient: SubaccountClient;
amount: number; amount: number;
}) => await compositeClient?.withdrawFromSubaccount(subaccountClient, amount), }) => await compositeClient?.withdrawFromSubaccount(subaccountClient, amount.toString()),
transferFromSubaccountToAddress: async ({ transferFromSubaccountToAddress: async ({
subaccountClient, subaccountClient,
@@ -134,12 +131,21 @@ export const useSubaccountContext = ({ localDydxWallet }: { localDydxWallet?: Lo
amount: number; amount: number;
recipient: string; recipient: string;
}) => }) =>
await compositeClient?.validatorClient.post.sendToken( await compositeClient?.validatorClient.post.send(
subaccountClient, subaccountClient.wallet,
() =>
new Promise((resolve) => {
const msg = compositeClient?.sendTokenMessage(
subaccountClient.wallet,
amount.toString(),
recipient, recipient,
DYDX_DENOM, );
Long.fromNumber(amount * QUANTUM_MULTIPLIER),
resolve([msg]);
}),
false, false,
compositeClient?.validatorClient?.post.defaultDydxGasPrice,
undefined,
Method.BroadcastTxCommit Method.BroadcastTxCommit
), ),
@@ -156,7 +162,7 @@ export const useSubaccountContext = ({ localDydxWallet }: { localDydxWallet?: Lo
const transaction = JSON.parse(payload); const transaction = JSON.parse(payload);
const msg = compositeClient.withdrawFromSubaccountMessage(subaccountClient, amount); const msg = compositeClient.withdrawFromSubaccountMessage(subaccountClient, amount.toString());
const ibcMsg: EncodeObject = { const ibcMsg: EncodeObject = {
typeUrl: transaction.msgTypeUrl, typeUrl: transaction.msgTypeUrl,
value: transaction.msg, value: transaction.msg,
@@ -210,7 +216,7 @@ export const useSubaccountContext = ({ localDydxWallet }: { localDydxWallet?: Lo
); );
const balances = useSelector(getBalances, shallowEqual); const balances = useSelector(getBalances, shallowEqual);
const usdcCoinBalance = balances?.[USDC_DENOM]; const usdcCoinBalance = balances?.[usdcDenom];
useEffect(() => { useEffect(() => {
if (usdcCoinBalance) { if (usdcCoinBalance) {
@@ -247,8 +253,7 @@ export const useSubaccountContext = ({ localDydxWallet }: { localDydxWallet?: Lo
if (!subaccountClient) { if (!subaccountClient) {
return; return;
} }
return (await (coinDenom === usdcDenom
return (await (coinDenom === USDC_DENOM
? transferFromSubaccountToAddress ? transferFromSubaccountToAddress
: transferNativeToken)({ subaccountClient, amount, recipient })) as IndexedTx; : transferNativeToken)({ subaccountClient, amount, recipient })) as IndexedTx;
}, },
+34
View File
@@ -0,0 +1,34 @@
import { ENVIRONMENT_CONFIG_MAP } from '@/constants/networks';
import { DydxChainAsset } from '@/constants/wallets';
import { useSelectedNetwork } from '@/hooks';
export const useTokenConfigs = (): {
tokensConfigs: {
[DydxChainAsset.USDC]: {
denom: string;
name: string;
decimals: number;
},
[DydxChainAsset.CHAINTOKEN]: {
denom: string;
name: string;
decimals: number;
},
};
usdcDenom: string;
usdcLabel: string;
chainTokenDenom: string;
chainTokenLabel: string;
} => {
const { selectedNetwork } = useSelectedNetwork();
const tokensConfigs = ENVIRONMENT_CONFIG_MAP[selectedNetwork].tokens;
return {
tokensConfigs,
usdcDenom: tokensConfigs[DydxChainAsset.USDC].denom,
usdcLabel: tokensConfigs[DydxChainAsset.USDC].name,
chainTokenDenom: tokensConfigs[DydxChainAsset.CHAINTOKEN].denom,
chainTokenLabel: tokensConfigs[DydxChainAsset.CHAINTOKEN].name,
};
};
+6 -4
View File
@@ -6,9 +6,10 @@ import { ButtonShape } from '@/constants/buttons';
import { DialogTypes } from '@/constants/dialogs'; import { DialogTypes } from '@/constants/dialogs';
import { STRING_KEYS } from '@/constants/localization'; import { STRING_KEYS } from '@/constants/localization';
import { AppRoute } from '@/constants/routes'; import { AppRoute } from '@/constants/routes';
import { useStringGetter } from '@/hooks';
import { LogoShortIcon, BellStrokeIcon } from '@/icons'; import { LogoShortIcon, BellStrokeIcon } from '@/icons';
import { useTokenConfigs, useStringGetter } from '@/hooks';
import { Icon, IconName } from '@/components/Icon'; import { Icon, IconName } from '@/components/Icon';
import { IconButton } from '@/components/IconButton'; import { IconButton } from '@/components/IconButton';
import { NavigationMenu } from '@/components/NavigationMenu'; import { NavigationMenu } from '@/components/NavigationMenu';
@@ -27,6 +28,7 @@ import { layoutMixins } from '@/styles/layoutMixins';
export const HeaderDesktop = () => { export const HeaderDesktop = () => {
const stringGetter = useStringGetter(); const stringGetter = useStringGetter();
const dispatch = useDispatch(); const dispatch = useDispatch();
const { chainTokenLabel } = useTokenConfigs();
const navItems = [ const navItems = [
{ {
@@ -43,9 +45,9 @@ export const HeaderDesktop = () => {
href: AppRoute.Trade, href: AppRoute.Trade,
}, },
{ {
value: 'Dv4TNT', value: chainTokenLabel,
label: 'Dv4TNT', label: chainTokenLabel,
href: AppRoute.Rewards, href: `/${chainTokenLabel}`,
}, },
{ {
value: 'PORTFOLIO', value: 'PORTFOLIO',
+34 -13
View File
@@ -14,8 +14,6 @@ import {
OrderSide, OrderSide,
OrderTimeInForce, OrderTimeInForce,
OrderExecution, OrderExecution,
DYDX_DENOM,
GAS_PRICE_DYDX_DENOM,
} from '@dydxprotocol/v4-client-js'; } from '@dydxprotocol/v4-client-js';
import { import {
@@ -66,16 +64,37 @@ class DydxChainTransactions implements AbacusDYDXChainTransactionsProtocol {
): Promise<void> { ): Promise<void> {
try { try {
const parsedParams = paramsInJson ? JSON.parse(paramsInJson) : {}; const parsedParams = paramsInJson ? JSON.parse(paramsInJson) : {};
const { indexerUrl, websocketUrl, validatorUrl, chainId } = parsedParams; const {
indexerUrl,
websocketUrl,
validatorUrl,
chainId,
USDC_DENOM,
USDC_DECIMALS,
USDC_GAS_DENOM,
CHAINTOKEN_DENOM,
CHAINTOKEN_DECIMALS,
} = parsedParams;
const compositeClient = await CompositeClient.connect( const compositeClient = await CompositeClient.connect(
new Network( new Network(
chainId, chainId,
new IndexerConfig(indexerUrl, websocketUrl), new IndexerConfig(indexerUrl, websocketUrl),
new ValidatorConfig(validatorUrl, chainId, { new ValidatorConfig(
validatorUrl,
chainId,
{
USDC_DENOM,
USDC_DECIMALS,
USDC_GAS_DENOM,
CHAINTOKEN_DENOM,
CHAINTOKEN_DECIMALS,
},
{
broadcastPollIntervalMs: 3_000, broadcastPollIntervalMs: 3_000,
broadcastTimeoutMs: 60_000, broadcastTimeoutMs: 60_000,
}) }
)
) )
); );
@@ -204,13 +223,13 @@ class DydxChainTransactions implements AbacusDYDXChainTransactionsProtocol {
params ?? {}; params ?? {};
try { try {
const tx = await this.compositeClient?.cancelOrder( const tx = await this.compositeClient?.cancelRawOrder(
new SubaccountClient(this.localWallet, subaccountNumber), new SubaccountClient(this.localWallet, subaccountNumber),
clientId, clientId,
orderFlags, orderFlags,
clobPairId, clobPairId,
goodTilBlock ?? undefined, goodTilBlock || undefined,
goodTilBlockTime ?? undefined goodTilBlockTime || undefined,
); );
const parsedTx = this.parseToPrimitives(tx); const parsedTx = this.parseToPrimitives(tx);
@@ -273,16 +292,18 @@ class DydxChainTransactions implements AbacusDYDXChainTransactionsProtocol {
this.localWallet, this.localWallet,
() => () =>
new Promise((resolve) => { new Promise((resolve) => {
const msg = compositeClient?.validatorClient.post.composer.composeMsgSendToken( if (!this.localWallet) {
subaccountClient.address, throw new Error('Missing compositeClient or localWallet');
}
const msg = compositeClient?.sendTokenMessage(
this.localWallet,
amount,
recipient, recipient,
DYDX_DENOM,
Long.fromNumber(amount * QUANTUM_MULTIPLIER)
); );
resolve([msg]); resolve([msg]);
}), }),
GAS_PRICE_DYDX_DENOM this.compositeClient?.validatorClient?.post.defaultDydxGasPrice,
); );
const parsedTx = this.parseToPrimitives(tx); const parsedTx = this.parseToPrimitives(tx);
+10 -4
View File
@@ -3,7 +3,7 @@ import styled, { AnyStyledComponent } from 'styled-components';
import { shallowEqual, useDispatch, useSelector } from 'react-redux'; import { shallowEqual, useDispatch, useSelector } from 'react-redux';
import { layoutMixins } from '@/styles/layoutMixins'; import { layoutMixins } from '@/styles/layoutMixins';
import { useAccountBalance, useAccounts, useStringGetter } from '@/hooks'; import { useAccountBalance, useAccounts, useTokenConfigs, useStringGetter } from '@/hooks';
import { ButtonAction, ButtonSize } from '@/constants/buttons'; import { ButtonAction, ButtonSize } from '@/constants/buttons';
import { DialogTypes } from '@/constants/dialogs'; import { DialogTypes } from '@/constants/dialogs';
@@ -30,6 +30,7 @@ export const DYDXBalancePanel = () => {
const { walletType } = useAccounts(); const { walletType } = useAccounts();
const canAccountTrade = useSelector(calculateCanAccountTrade, shallowEqual); const canAccountTrade = useSelector(calculateCanAccountTrade, shallowEqual);
const { nativeTokenBalance, nativeStakingBalance } = useAccountBalance(); const { nativeTokenBalance, nativeStakingBalance } = useAccountBalance();
const { chainTokenLabel } = useTokenConfigs();
return ( return (
<Panel <Panel
@@ -37,7 +38,7 @@ export const DYDXBalancePanel = () => {
<Styled.Header> <Styled.Header>
<Styled.Title> <Styled.Title>
{/* <AssetIcon symbol="DYDX" /> */} {/* <AssetIcon symbol="DYDX" /> */}
Dv4TNT {chainTokenLabel}
</Styled.Title> </Styled.Title>
<Styled.ReceiveAndTransferButtons> <Styled.ReceiveAndTransferButtons>
{!canAccountTrade ? ( {!canAccountTrade ? (
@@ -106,7 +107,13 @@ export const DYDXBalancePanel = () => {
{ {
key: 'totalBalance', key: 'totalBalance',
label: 'Total balance', label: 'Total balance',
value: <Output type={OutputType.Asset} value={nativeTokenBalance + nativeStakingBalance} tag="Dv4TNT" />, value: (
<Output
type={OutputType.Asset}
value={nativeTokenBalance + nativeStakingBalance}
tag={chainTokenLabel}
/>
),
}, },
]} ]}
/> />
@@ -174,7 +181,6 @@ Styled.WalletAndStakedBalance = styled(Details)`
grid-template-columns: 1fr 1fr; grid-template-columns: 1fr 1fr;
gap: 0.5rem; gap: 0.5rem;
> div { > div {
gap: 1rem; gap: 1rem;
@@ -75,7 +75,6 @@ export const AccountInfoConnectedState = () => {
<Styled.Header> <Styled.Header>
<span>{stringGetter({ key: STRING_KEYS.ACCOUNT })}</span> <span>{stringGetter({ key: STRING_KEYS.ACCOUNT })}</span>
<Styled.TransferButtons> <Styled.TransferButtons>
{import.meta.env.MODE !== 'production' && (
<Styled.Button <Styled.Button
state={{ isDisabled: !dydxAccounts }} state={{ isDisabled: !dydxAccounts }}
onClick={() => dispatch(openDialog({ type: DialogTypes.Withdraw }))} onClick={() => dispatch(openDialog({ type: DialogTypes.Withdraw }))}
@@ -84,7 +83,6 @@ export const AccountInfoConnectedState = () => {
> >
{stringGetter({ key: STRING_KEYS.WITHDRAW })} {stringGetter({ key: STRING_KEYS.WITHDRAW })}
</Styled.Button> </Styled.Button>
)}
<Styled.Button <Styled.Button
state={{ isDisabled: !dydxAccounts }} state={{ isDisabled: !dydxAccounts }}
onClick={() => dispatch(openDialog({ type: DialogTypes.Deposit }))} onClick={() => dispatch(openDialog({ type: DialogTypes.Deposit }))}
-3
View File
@@ -32,12 +32,9 @@ export const DepositDialog = ({ setIsOpen }: ElementProps) => {
> >
<Styled.Content> <Styled.Content>
{showTestDeposit ? <TestnetDepositForm onDeposit={closeDialog} /> : <DepositForm />} {showTestDeposit ? <TestnetDepositForm onDeposit={closeDialog} /> : <DepositForm />}
{/* TODO TRCL-1693 - uncomment when deposit form is ready */}
{import.meta.env.MODE !== 'production' && (
<Styled.TextToggle onClick={() => setShowTestDeposit(!showTestDeposit)}> <Styled.TextToggle onClick={() => setShowTestDeposit(!showTestDeposit)}>
{showTestDeposit ? 'Show deposit form (Under Construction)' : 'Show test faucet'} {showTestDeposit ? 'Show deposit form (Under Construction)' : 'Show test faucet'}
</Styled.TextToggle> </Styled.TextToggle>
)}
</Styled.Content> </Styled.Content>
</Dialog> </Dialog>
); );
+7 -5
View File
@@ -6,7 +6,7 @@ import { DydxChainAsset } from '@/constants/wallets';
import { formMixins } from '@/styles/formMixins'; import { formMixins } from '@/styles/formMixins';
import { layoutMixins } from '@/styles/layoutMixins'; import { layoutMixins } from '@/styles/layoutMixins';
import { useAccounts, useStringGetter } from '@/hooks'; import { useAccounts, useTokenConfigs, useStringGetter } from '@/hooks';
import { AssetIcon } from '@/components/AssetIcon'; import { AssetIcon } from '@/components/AssetIcon';
import { CopyButton } from '@/components/CopyButton'; import { CopyButton } from '@/components/CopyButton';
@@ -24,9 +24,10 @@ type ElementProps = {
setIsOpen: (open: boolean) => void; setIsOpen: (open: boolean) => void;
}; };
export const ReceiveDialog = ({ selectedAsset = DydxChainAsset.DYDX, setIsOpen }: ElementProps) => { export const ReceiveDialog = ({ selectedAsset = DydxChainAsset.CHAINTOKEN, setIsOpen }: ElementProps) => {
const stringGetter = useStringGetter(); const stringGetter = useStringGetter();
const { dydxAddress } = useAccounts(); const { dydxAddress } = useAccounts();
const { chainTokenLabel, usdcLabel } = useTokenConfigs();
const [asset, setAsset] = useState(selectedAsset); const [asset, setAsset] = useState(selectedAsset);
@@ -35,16 +36,17 @@ export const ReceiveDialog = ({ selectedAsset = DydxChainAsset.DYDX, setIsOpen }
value: DydxChainAsset.USDC, value: DydxChainAsset.USDC,
label: ( label: (
<Styled.InlineRow> <Styled.InlineRow>
<AssetIcon symbol="USDC" /> USDC <AssetIcon symbol="USDC" /> {usdcLabel}
</Styled.InlineRow> </Styled.InlineRow>
), ),
}, },
{ {
value: DydxChainAsset.DYDX, value: DydxChainAsset.CHAINTOKEN,
label: ( label: (
<Styled.InlineRow> <Styled.InlineRow>
{/* TODO: conditionally display the native token assetIcon */}
{/* <AssetIcon symbol="DYDX" /> */} {/* <AssetIcon symbol="DYDX" /> */}
Dv4TNT {chainTokenLabel}
</Styled.InlineRow> </Styled.InlineRow>
), ),
}, },
+10 -12
View File
@@ -11,11 +11,7 @@ import { ButtonShape, ButtonSize } from '@/constants/buttons';
import { STRING_KEYS } from '@/constants/localization'; import { STRING_KEYS } from '@/constants/localization';
import { ENVIRONMENT_CONFIG_MAP } from '@/constants/networks'; import { ENVIRONMENT_CONFIG_MAP } from '@/constants/networks';
import { NumberSign } from '@/constants/numbers'; import { NumberSign } from '@/constants/numbers';
import { import { DydxChainAsset } from '@/constants/wallets';
DYDX_CHAIN_ASSET_COIN_DENOM,
DYDX_CHAIN_ASSET_TAGS,
DydxChainAsset,
} from '@/constants/wallets';
import { import {
useAccountBalance, useAccountBalance,
@@ -25,6 +21,7 @@ import {
useSelectedNetwork, useSelectedNetwork,
useStringGetter, useStringGetter,
useSubaccount, useSubaccount,
useTokenConfigs,
} from '@/hooks'; } from '@/hooks';
import { formMixins } from '@/styles/formMixins'; import { formMixins } from '@/styles/formMixins';
@@ -57,7 +54,7 @@ type TransferFormProps = {
}; };
export const TransferForm = ({ export const TransferForm = ({
selectedAsset = DydxChainAsset.DYDX, selectedAsset = DydxChainAsset.CHAINTOKEN,
onDone, onDone,
className, className,
}: TransferFormProps) => { }: TransferFormProps) => {
@@ -72,6 +69,7 @@ export const TransferForm = ({
const { transfer } = useSubaccount(); const { transfer } = useSubaccount();
const { nativeTokenBalance, usdcBalance } = useAccountBalance(); const { nativeTokenBalance, usdcBalance } = useAccountBalance();
const { selectedNetwork } = useSelectedNetwork(); const { selectedNetwork } = useSelectedNetwork();
const { tokensConfigs, usdcLabel, chainTokenLabel } = useTokenConfigs();
// User Input // User Input
const [asset, setAsset] = useState<DydxChainAsset>(selectedAsset); const [asset, setAsset] = useState<DydxChainAsset>(selectedAsset);
@@ -138,7 +136,7 @@ export const TransferForm = ({
try { try {
// Subtract fees from amount if sending native tokens // Subtract fees from amount if sending native tokens
const amountToTransfer = ( const amountToTransfer = (
asset === DydxChainAsset.DYDX ? amountBN.minus(fee) : amountBN asset === DydxChainAsset.CHAINTOKEN ? amountBN.minus(fee) : amountBN
).toNumber(); ).toNumber();
const screenResults = await screenAddresses({ const screenResults = await screenAddresses({
@@ -161,7 +159,7 @@ export const TransferForm = ({
const txResponse = await transfer( const txResponse = await transfer(
amountToTransfer, amountToTransfer,
recipientAddress as string, recipientAddress as string,
DYDX_CHAIN_ASSET_COIN_DENOM[asset] tokensConfigs[asset].denom,
); );
if (txResponse?.code === 0) { if (txResponse?.code === 0) {
@@ -220,16 +218,16 @@ export const TransferForm = ({
value: DydxChainAsset.USDC, value: DydxChainAsset.USDC,
label: ( label: (
<Styled.InlineRow> <Styled.InlineRow>
<AssetIcon symbol="USDC" /> {DYDX_CHAIN_ASSET_TAGS[DydxChainAsset.USDC]} <AssetIcon symbol="USDC" /> {usdcLabel}
</Styled.InlineRow> </Styled.InlineRow>
), ),
}, },
{ {
value: DydxChainAsset.DYDX, value: DydxChainAsset.CHAINTOKEN,
label: ( label: (
<Styled.InlineRow> <Styled.InlineRow>
{/* <AssetIcon symbol="DYDX" /> */} {/* <AssetIcon symbol="DYDX" /> */}
{DYDX_CHAIN_ASSET_TAGS[DydxChainAsset.DYDX]} {chainTokenLabel}
</Styled.InlineRow> </Styled.InlineRow>
), ),
}, },
@@ -251,7 +249,7 @@ export const TransferForm = ({
key: 'amount', key: 'amount',
label: ( label: (
<span> <span>
{stringGetter({ key: STRING_KEYS.AVAILABLE })} <Tag>{DYDX_CHAIN_ASSET_TAGS[asset]}</Tag> {stringGetter({ key: STRING_KEYS.AVAILABLE })} <Tag>{tokensConfigs[asset].name}</Tag>
</span> </span>
), ),
value: ( value: (
@@ -3,9 +3,9 @@ import { shallowEqual, useSelector } from 'react-redux';
import { ButtonAction, ButtonSize, ButtonType } from '@/constants/buttons'; import { ButtonAction, ButtonSize, ButtonType } from '@/constants/buttons';
import { STRING_KEYS } from '@/constants/localization'; import { STRING_KEYS } from '@/constants/localization';
import { NumberSign } from '@/constants/numbers'; import { NumberSign } from '@/constants/numbers';
import { DYDX_CHAIN_ASSET_TAGS, DydxChainAsset } from '@/constants/wallets'; import { DydxChainAsset } from '@/constants/wallets';
import { useAccountBalance, useStringGetter } from '@/hooks'; import { useAccountBalance, useTokenConfigs, useStringGetter } from '@/hooks';
import { Button } from '@/components/Button'; import { Button } from '@/components/Button';
import { DiffOutput } from '@/components/DiffOutput'; import { DiffOutput } from '@/components/DiffOutput';
@@ -37,6 +37,7 @@ export const TransferButtonAndReceipt = ({
const stringGetter = useStringGetter(); const stringGetter = useStringGetter();
const canAccountTrade = useSelector(calculateCanAccountTrade, shallowEqual); const canAccountTrade = useSelector(calculateCanAccountTrade, shallowEqual);
const { size } = useSelector(getTransferInputs, shallowEqual) || {}; const { size } = useSelector(getTransferInputs, shallowEqual) || {};
const { tokensConfigs } = useTokenConfigs();
const { equity: equityInfo, leverage: leverageInfo } = const { equity: equityInfo, leverage: leverageInfo } =
useSelector(getSubaccount, shallowEqual) || {}; useSelector(getSubaccount, shallowEqual) || {};
@@ -60,7 +61,7 @@ export const TransferButtonAndReceipt = ({
key: 'fees', key: 'fees',
label: ( label: (
<span> <span>
{stringGetter({ key: STRING_KEYS.FEES })} <Tag>{DYDX_CHAIN_ASSET_TAGS[selectedAsset]}</Tag> {stringGetter({ key: STRING_KEYS.FEES })} <Tag>{tokensConfigs[selectedAsset].name}</Tag>
</span> </span>
), ),
value: <Output type={OutputType.Asset} value={fees} />, value: <Output type={OutputType.Asset} value={fees} />,
@@ -69,7 +70,7 @@ export const TransferButtonAndReceipt = ({
key: 'balance', key: 'balance',
label: ( label: (
<span> <span>
{stringGetter({ key: STRING_KEYS.BALANCE })} <Tag>{DYDX_CHAIN_ASSET_TAGS[selectedAsset]}</Tag> {stringGetter({ key: STRING_KEYS.BALANCE })} <Tag>{tokensConfigs[selectedAsset].name}</Tag>
</span> </span>
), ),
value: ( value: (
+17 -4
View File
@@ -9,7 +9,13 @@ import { DialogTypes } from '@/constants/dialogs';
import { STRING_KEYS, TOOLTIP_STRING_KEYS } from '@/constants/localization'; import { STRING_KEYS, TOOLTIP_STRING_KEYS } from '@/constants/localization';
import { DydxChainAsset, wallets } from '@/constants/wallets'; import { DydxChainAsset, wallets } from '@/constants/wallets';
import { useAccounts, useBreakpoints, useStringGetter, useAccountBalance } from '@/hooks'; import {
useAccounts,
useBreakpoints,
useTokenConfigs,
useStringGetter,
useAccountBalance,
} from '@/hooks';
import { OnboardingTriggerButton } from '@/views/dialogs/OnboardingTriggerButton'; import { OnboardingTriggerButton } from '@/views/dialogs/OnboardingTriggerButton';
@@ -39,6 +45,7 @@ export const AccountMenu = () => {
const onboardingState = useSelector(getOnboardingState); const onboardingState = useSelector(getOnboardingState);
const { freeCollateral } = useSelector(getSubaccount, shallowEqual) || {}; const { freeCollateral } = useSelector(getSubaccount, shallowEqual) || {};
const { nativeTokenBalance } = useAccountBalance(); const { nativeTokenBalance } = useAccountBalance();
const { usdcLabel, chainTokenLabel } = useTokenConfigs();
const { evmAddress, walletType, dydxAddress, hdKey } = useAccounts(); const { evmAddress, walletType, dydxAddress, hdKey } = useAccounts();
@@ -107,17 +114,23 @@ export const AccountMenu = () => {
<div> <div>
<div> <div>
<Styled.label> <Styled.label>
{stringGetter({ key: STRING_KEYS.ASSET_BALANCE, params: { ASSET: 'Dv4TNT' } })} {stringGetter({
key: STRING_KEYS.ASSET_BALANCE,
params: { ASSET: chainTokenLabel },
})}
{/* <AssetIcon symbol="DYDX" /> */} {/* <AssetIcon symbol="DYDX" /> */}
</Styled.label> </Styled.label>
<Styled.BalanceOutput type={OutputType.Asset} value={nativeTokenBalance} /> <Styled.BalanceOutput type={OutputType.Asset} value={nativeTokenBalance} />
</div> </div>
<AssetActions asset={DydxChainAsset.DYDX} dispatch={dispatch} /> <AssetActions asset={DydxChainAsset.CHAINTOKEN} dispatch={dispatch} />
</div> </div>
<div> <div>
<div> <div>
<Styled.label> <Styled.label>
{stringGetter({ key: STRING_KEYS.ASSET_BALANCE, params: { ASSET: 'USDC' } })} {stringGetter({
key: STRING_KEYS.ASSET_BALANCE,
params: { ASSET: usdcLabel },
})}
<AssetIcon symbol="USDC" /> <AssetIcon symbol="USDC" />
</Styled.label> </Styled.label>
<Styled.BalanceOutput <Styled.BalanceOutput