From 05b088773cb0e233979a71414e44d6b9c061cbba Mon Sep 17 00:00:00 2001 From: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> Date: Wed, 24 Jan 2024 12:45:29 -0700 Subject: [PATCH 01/49] fix mobile margin --- web-ui/pages/defi.tsx | 2 +- web-ui/pages/governance.tsx | 2 +- web-ui/pages/staking/index.tsx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/web-ui/pages/defi.tsx b/web-ui/pages/defi.tsx index 4c33c872d..8cecdeb51 100644 --- a/web-ui/pages/defi.tsx +++ b/web-ui/pages/defi.tsx @@ -12,7 +12,7 @@ export default function Home() { - + diff --git a/web-ui/pages/staking/index.tsx b/web-ui/pages/staking/index.tsx index f61a96af1..716c24a42 100644 --- a/web-ui/pages/staking/index.tsx +++ b/web-ui/pages/staking/index.tsx @@ -65,7 +65,7 @@ export default function Staking() { Date: Wed, 24 Jan 2024 12:49:07 -0700 Subject: [PATCH 02/49] fix margin on staking page --- web-ui/pages/staking/index.tsx | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/web-ui/pages/staking/index.tsx b/web-ui/pages/staking/index.tsx index 716c24a42..5c89fa063 100644 --- a/web-ui/pages/staking/index.tsx +++ b/web-ui/pages/staking/index.tsx @@ -124,8 +124,18 @@ export default function Staking() { - - Quicksilver + + Quicksilver From 39a59abca9af369c3aab85ed7ebd944bb45bdad2 Mon Sep 17 00:00:00 2001 From: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> Date: Wed, 24 Jan 2024 20:03:45 -0700 Subject: [PATCH 03/49] add more margin to mobile top --- web-ui/pages/staking/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web-ui/pages/staking/index.tsx b/web-ui/pages/staking/index.tsx index 5c89fa063..e53bbed02 100644 --- a/web-ui/pages/staking/index.tsx +++ b/web-ui/pages/staking/index.tsx @@ -65,7 +65,7 @@ export default function Staking() { Date: Wed, 24 Jan 2024 20:48:55 -0700 Subject: [PATCH 04/49] more mobile resizing, filter intents when <= 0 --- web-ui/components/Assets/intents.tsx | 23 +-- .../Assets/modals/signalIntentProcess.tsx | 5 +- web-ui/components/Assets/portfolio.tsx | 2 +- web-ui/components/Assets/unbondingTable.tsx | 22 ++- web-ui/components/Defi/defiBox.tsx | 131 ++++++++++-------- web-ui/components/Governance/ProposalCard.tsx | 7 +- .../components/Governance/ProposalModal.tsx | 7 +- .../components/Governance/VotingSection.tsx | 7 +- .../Staking/modals/stakingProcessModal.tsx | 28 +++- .../Staking/modals/transferProcessModal.tsx | 4 +- 10 files changed, 138 insertions(+), 98 deletions(-) diff --git a/web-ui/components/Assets/intents.tsx b/web-ui/components/Assets/intents.tsx index 5ebc66413..95bf91bac 100644 --- a/web-ui/components/Assets/intents.tsx +++ b/web-ui/components/Assets/intents.tsx @@ -16,13 +16,12 @@ import { } from '@chakra-ui/react'; import { Key, useState } from 'react'; +import SignalIntentModal from './modals/signalIntentProcess'; + import { useIntentQuery, useValidatorLogos, useValidatorsQuery } from '@/hooks/useQueries'; import { networks as prodNetworks, testNetworks as devNetworks } from '@/state/chains/prod'; import { truncateString } from '@/utils'; -import SignalIntentModal from './modals/signalIntentProcess'; - - export interface StakingIntentProps { address: string; isWalletConnected: boolean; @@ -64,14 +63,16 @@ const StakingIntent: React.FC = ({ address, isWalletConnecte }, {}) || {}; const validatorsWithDetails = - intent?.data?.intent.intents.map((validatorIntent: { valoper_address: string; weight: string }) => { - const validatorDetails = validatorsMap[validatorIntent.valoper_address]; - return { - moniker: validatorDetails?.moniker, - logoUrl: validatorDetails?.logoUrl, - percentage: `${(parseFloat(validatorIntent.weight) * 100).toFixed(2)}%`, - }; - }) || []; + intent?.data?.intent.intents + .filter((validatorIntent: { valoper_address: string; weight: string }) => parseFloat(validatorIntent.weight) > 0) + .map((validatorIntent: { valoper_address: string; weight: string }) => { + const validatorDetails = validatorsMap[validatorIntent.valoper_address]; + return { + moniker: validatorDetails?.moniker, + logoUrl: validatorDetails?.logoUrl, + percentage: `${(parseFloat(validatorIntent.weight) * 100).toFixed(2)}%`, + }; + }) || []; const handleLeftArrowClick = () => { setCurrentChainIndex((prevIndex) => (prevIndex === 0 ? networks.length - 1 : prevIndex - 1)); diff --git a/web-ui/components/Assets/modals/signalIntentProcess.tsx b/web-ui/components/Assets/modals/signalIntentProcess.tsx index 5fcaa24fd..1ea899ff5 100644 --- a/web-ui/components/Assets/modals/signalIntentProcess.tsx +++ b/web-ui/components/Assets/modals/signalIntentProcess.tsx @@ -23,10 +23,9 @@ import { assets } from 'chain-registry'; import { quicksilver } from 'quicksilverjs'; import React, { useEffect, useState } from 'react'; -import { useTx } from '@/hooks'; - import { IntentMultiModal } from './intentMultiModal'; +import { useTx } from '@/hooks'; const ChakraModalContent = styled(ModalContent)` position: relative; @@ -343,7 +342,7 @@ export const SignalIntentModal: React.FC = ({ isOpen, onClose )} diff --git a/web-ui/components/Assets/unbondingTable.tsx b/web-ui/components/Assets/unbondingTable.tsx index 8f070163b..3b7660925 100644 --- a/web-ui/components/Assets/unbondingTable.tsx +++ b/web-ui/components/Assets/unbondingTable.tsx @@ -36,9 +36,10 @@ interface UnbondingAssetsTableProps { } const UnbondingAssetsTable: React.FC = ({ address, isWalletConnected }) => { - const chains = ['Cosmos', 'Stargaze', 'Osmosis', 'Regen', 'Sommelier', 'Juno']; + const chains = ['Cosmos', 'Stargaze', 'Osmosis', 'Regen', 'Sommelier', 'Juno', 'Dydx']; const [currentChainIndex, setCurrentChainIndex] = useState(0); + // Switcher lets us use a pretty name for the chain in the UI, but query the chain by its actual name. const currentChainName = chains[currentChainIndex]; let newChainName: string | undefined; if (currentChainName === 'Cosmos') { @@ -53,6 +54,8 @@ const UnbondingAssetsTable: React.FC = ({ address, is newChainName = 'sommelier'; } else if (currentChainName === 'Juno') { newChainName = 'juno'; + } else if (currentChainName === 'Dydx') { + newChainName = 'dydx'; } else { // Default case newChainName = currentChainName; diff --git a/web-ui/components/Staking/assetsAccordion.tsx b/web-ui/components/Staking/assetsAccordion.tsx index 145a0b813..89a7ae160 100644 --- a/web-ui/components/Staking/assetsAccordion.tsx +++ b/web-ui/components/Staking/assetsAccordion.tsx @@ -16,7 +16,8 @@ type AssetsAccordianProps = { }; export const AssetsAccordian: React.FC = ({ selectedOption, balance, qBalance }) => { - const qAssets = shiftDigits(qBalance, -6); + const exponent = selectedOption.value === 'DYDX' ? -18 : -6; + const qAssets = shiftDigits(qBalance, exponent); const qAssetsDisplay = qAssets.includes('.') ? qAssets.substring(0, qAssets.indexOf('.') + 3) : qAssets; const balanceDisplay = balance.includes('.') ? balance.substring(0, balance.indexOf('.') + 4) : balance; diff --git a/web-ui/components/Staking/infoBox.tsx b/web-ui/components/Staking/infoBox.tsx index cd73094d1..438b26ddd 100644 --- a/web-ui/components/Staking/infoBox.tsx +++ b/web-ui/components/Staking/infoBox.tsx @@ -21,7 +21,7 @@ export const InfoBox: React.FC = ({ selectedOption, displa if (!isZoneLoading && zone) { return ( - 1 q{selectedOption.value.toUpperCase()} = {Number(zone.redemption_rate).toFixed(2)} {selectedOption.value.toUpperCase()} + 1 q{selectedOption.value.toUpperCase()} = {Number(zone.redemptionRate).toFixed(2)} {selectedOption.value.toUpperCase()} ); } else { @@ -51,7 +51,7 @@ export const InfoBox: React.FC = ({ selectedOption, displa const renderUnbondingPeriod = () => { if (!isZoneLoading && zone) { - return {(Number(zone?.unbonding_period) / 86400000000000).toString()} days; + return {(Number(zone?.unbondingPeriod) / 86400000000000).toString()} days; } else { return ( diff --git a/web-ui/components/Staking/modals/revertSharesProcessModal.tsx b/web-ui/components/Staking/modals/revertSharesProcessModal.tsx index a90a1a6c3..6764e3349 100644 --- a/web-ui/components/Staking/modals/revertSharesProcessModal.tsx +++ b/web-ui/components/Staking/modals/revertSharesProcessModal.tsx @@ -150,7 +150,7 @@ export const RevertSharesProcessModal: React.FC = ({ const { redeemTokensForShares } = cosmos.staking.v1beta1.MessageComposer.withTypeUrl; const msg = redeemTokensForShares({ - delegator_address: address, + delegatorAddress: address, amount: { denom: denom ?? combinedDenom, amount: selectedValidator.tokenAmount.toString(), diff --git a/web-ui/components/Staking/modals/stakingProcessModal.tsx b/web-ui/components/Staking/modals/stakingProcessModal.tsx index 2c54a1d12..f32178416 100644 --- a/web-ui/components/Staking/modals/stakingProcessModal.tsx +++ b/web-ui/components/Staking/modals/stakingProcessModal.tsx @@ -234,14 +234,20 @@ export const StakingProcessModal: React.FC = ({ isOpen, onClo numericAmount = 0; } - const smallestUnitAmount = numericAmount * Math.pow(10, 6); + let smallestUnitAmount: number; + + if (zone?.chainId === 'dydx-mainnet-1') { + smallestUnitAmount = numericAmount * Math.pow(10, 18); + } else { + smallestUnitAmount = numericAmount * Math.pow(10, 6); + } const { send } = cosmos.bank.v1beta1.MessageComposer.withTypeUrl; const msgSend = send({ - from_address: address ?? '', - to_address: zone?.deposit_address?.address ?? '', - amount: coins(smallestUnitAmount.toFixed(0), zone?.base_denom ?? ''), + fromAddress: address ?? '', + toAddress: zone?.depositAddress?.address ?? '', + amount: coins(smallestUnitAmount.toFixed(0), zone?.baseDenom ?? ''), }); const mainTokens = assets.find(({ chain_name }) => chain_name === newChainName); @@ -664,7 +670,7 @@ export const StakingProcessModal: React.FC = ({ isOpen, onClo Receiving: {!isZoneLoading ? ( - `${(Number(tokenAmount) / Number(zone?.redemption_rate || 1)).toFixed(2)} q${selectedOption?.value}` + `${(Number(tokenAmount) / Number(zone?.redemptionRate || 1)).toFixed(2)} q${selectedOption?.value}` ) : ( )} diff --git a/web-ui/components/Staking/modals/transferProcessModal.tsx b/web-ui/components/Staking/modals/transferProcessModal.tsx index 9ce2de761..4c116a13f 100644 --- a/web-ui/components/Staking/modals/transferProcessModal.tsx +++ b/web-ui/components/Staking/modals/transferProcessModal.tsx @@ -132,13 +132,13 @@ export const TransferProcessModal: React.FC = ({ const { tokenizeShares } = cosmos.staking.v1beta1.MessageComposer.withTypeUrl; const msg = tokenizeShares({ - delegator_address: address, - validator_address: selectedValidator.operatorAddress, + delegatorAddress: address, + validatorAddress: selectedValidator.operatorAddress, amount: { denom: 'u' + selectedOption?.value.toLowerCase(), amount: selectedValidator.tokenAmount.toString(), }, - tokenized_share_owner: address, + tokenizedShareOwner: address, }); const mainTokens = assets.find(({ chain_name }) => chain_name === newChainName); @@ -218,8 +218,8 @@ export const TransferProcessModal: React.FC = ({ } const msgSend = send({ - from_address: address ?? '', - to_address: zone?.deposit_address?.address ?? '', + fromAddress: address ?? '', + toAddress: zone?.depositAddress?.address ?? '', amount: coins(numericAmount, denom ?? combinedDenom), }); diff --git a/web-ui/components/Staking/modals/validatorSelectionModal.tsx b/web-ui/components/Staking/modals/validatorSelectionModal.tsx index 3625708d6..d793ca6ef 100644 --- a/web-ui/components/Staking/modals/validatorSelectionModal.tsx +++ b/web-ui/components/Staking/modals/validatorSelectionModal.tsx @@ -67,16 +67,17 @@ export const MultiModal: React.FC = ({ }); }; - const handleQuickSelect = (count: number) => { - if (!validatorsData || !validators) return; + // TODO: Implement quick select and rankings + // const handleQuickSelect = (count: number) => { + // if (!validatorsData || !validators) return; - const topValidators = validators.slice(0, count).map((validator) => ({ - name: validator.name, - operatorAddress: validator.address, - })); + // const topValidators = validators.slice(0, count).map((validator) => ({ + // name: validator.name, + // operatorAddress: validator.address, + // })); - setSelectedValidators(topValidators); - }; + // setSelectedValidators(topValidators); + // }; const handleSearchChange = (event: React.ChangeEvent) => { setSearchTerm(event.target.value.toLowerCase()); diff --git a/web-ui/components/Staking/stakingBox.tsx b/web-ui/components/Staking/stakingBox.tsx index a7e8d8ce2..14b882237 100644 --- a/web-ui/components/Staking/stakingBox.tsx +++ b/web-ui/components/Staking/stakingBox.tsx @@ -133,7 +133,8 @@ export const StakingBox = ({ const [inputError, setInputError] = useState(false); - const qAssetsExponent = shiftDigits(qAssets, -6); + const exponent = qBalance?.balance.denom === 'aqdydx' ? -18 : -6; + const qAssetsExponent = shiftDigits(qAssets, exponent); const qAssetsDisplay = qAssetsExponent.includes('.') ? qAssetsExponent.substring(0, qAssetsExponent.indexOf('.') + 3) : qAssetsExponent; const maxUnstakingAmount = truncateToThreeDecimals(Number(qAssetsDisplay)); @@ -147,11 +148,11 @@ export const StakingBox = ({ const { requestRedemption } = quicksilver.interchainstaking.v1.MessageComposer.withTypeUrl; const numericAmount = Number(tokenAmount); const smallestUnitAmount = numericAmount * Math.pow(10, 6); - const value: Coin = { amount: smallestUnitAmount.toFixed(0), denom: zone?.local_denom ?? '' }; + const value: Coin = { amount: smallestUnitAmount.toFixed(0), denom: zone?.localDenom ?? '' }; const msgRequestRedemption = requestRedemption({ value: value, - from_address: qAddress ?? '', - destination_address: address ?? '', + fromAddress: qAddress ?? '', + destinationAddress: address ?? '', }); const fee: StdFee = { @@ -180,6 +181,7 @@ export const StakingBox = ({ } }; + // DO NOT REMOVE THESE COMMENTS // import { useToaster, ToastType, type CustomToast } from '@/hooks/useToaster'; // import useToast from chakra-ui // You can use this Toast handler and the below message to show there is an issue with unbonding @@ -199,7 +201,7 @@ export const StakingBox = ({ }; const { delegations, delegationsIsError, delegationsIsLoading } = useNativeStakeQuery(selectedOption.chainName, address ?? ''); - const delegationsResponse = delegations?.delegation_responses; + const delegationsResponse = delegations?.delegationResponses; const nativeStakedAmount = delegationsResponse?.reduce((acc: number, delegationResponse: { balance: { amount: any } }) => { const amount = Number(delegationResponse?.balance?.amount) || 0; return acc + amount; @@ -271,8 +273,8 @@ export const StakingBox = ({ const [validatorAddress, uniqueId] = balance.denom.split('/'); return { delegation: { - delegator_address: '', - validator_address: validatorAddress, + delegatorAddress: '', + validatorAddress: validatorAddress, unique_id: uniqueId, shares: '', }, @@ -525,7 +527,7 @@ export const StakingBox = ({ {!isZoneLoading ? ( - (Number(tokenAmount) * Number(zone?.redemption_rate || 1)).toFixed(2) + (Number(tokenAmount) * Number(zone?.redemptionRate || 1)).toFixed(2) ) : ( )} @@ -838,7 +840,7 @@ export const StakingBox = ({ {!isZoneLoading ? ( - (Number(tokenAmount) * Number(zone?.redemption_rate || 1)).toFixed(2) + (Number(tokenAmount) * Number(zone?.redemptionRate || 1)).toFixed(2) ) : ( )} diff --git a/web-ui/components/react/accountControlModal.tsx b/web-ui/components/react/accountControlModal.tsx new file mode 100644 index 000000000..cb6bdc01d --- /dev/null +++ b/web-ui/components/react/accountControlModal.tsx @@ -0,0 +1,409 @@ +import { + Modal, + ModalOverlay, + ModalContent, + ModalHeader, + ModalFooter, + ModalBody, + ModalCloseButton, + Button, + Text, + Spacer, + Spinner, + Flex, + Box, +} from '@chakra-ui/react'; +import { StdFee } from '@cosmjs/amino'; +import { useChain } from '@cosmos-kit/react'; +import { assets, chains } from 'chain-registry'; +import { quicksilver, cosmos } from 'quicksilverjs'; +import { GenericAuthorization } from 'quicksilverjs/dist/codegen/cosmos/authz/v1beta1/authz'; +import { useState } from 'react'; + +import { useTx } from '@/hooks'; +import { useAuthChecker, useIncorrectAuthChecker } from '@/hooks/useQueries'; + +interface AccountControlModalProps { + isOpen: boolean; + onClose: () => void; +} + +export const AccountControlModal: React.FC = ({ isOpen, onClose }) => { + const [authzSection, setAuthzSection] = useState(false); + const [lsmSection, setLsmSection] = useState(false); + + const { address: lsmAddress } = useChain('cosmoshub'); + const { tx: lsmTx } = useTx('cosmoshub'); + + const { address: authAddress } = useChain('quicksilver'); + const { tx: authTx } = useTx('quicksilver'); + + const { authData: incorrectAccount } = useIncorrectAuthChecker(authAddress ?? ''); + const { authData: correctAccount } = useAuthChecker(authAddress ?? ''); + + const { enableTokenizeShares } = cosmos.staking.v1beta1.MessageComposer.withTypeUrl; + const { disableTokenizeShares } = cosmos.staking.v1beta1.MessageComposer.withTypeUrl; + + const msgEnable = enableTokenizeShares({ + delegatorAddress: lsmAddress ?? '', + }); + + const msgDisable = disableTokenizeShares({ + delegatorAddress: lsmAddress ?? '', + }); + + const [isSigningEnable, setIsSigningEnable] = useState(false); + const [isSigningDisable, setIsSingingDisable] = useState(false); + const [isError, setIsError] = useState(false); + + const mainTokens = assets.find(({ chain_name }) => chain_name === chain_name); + const fees = chains.find(({ chain_name }) => chain_name === chain_name)?.fees?.fee_tokens; + const mainDenom = mainTokens?.assets[0].base ?? ''; + const fixedMinGasPrice = fees?.find(({ denom }) => denom === mainDenom)?.high_gas_price ?? ''; + const feeAmount = Number(fixedMinGasPrice) * 750000; + + const fee: StdFee = { + amount: [ + { + denom: mainDenom, + amount: feeAmount.toString(), + }, + ], + gas: '750000', // test txs were using well in excess of 600k + }; + + const handleDisable = async (event: React.MouseEvent) => { + event.preventDefault(); + setIsSingingDisable(true); + + try { + await lsmTx([msgDisable], { + fee, + onSuccess: () => { + onClose(); + }, + }); + } catch (error) { + console.error('Transaction failed', error); + + setIsError(true); + } finally { + setIsSingingDisable(false); + } + }; + + const handleEnable = async (event: React.MouseEvent) => { + event.preventDefault(); + setIsSigningEnable(true); + + try { + await lsmTx([msgEnable], { + fee, + onSuccess: () => { + onClose(); + }, + }); + } catch (error) { + console.error('Transaction failed', error); + + setIsError(true); + } finally { + setIsSigningEnable(false); + } + }; + + const { grant, revoke } = cosmos.authz.v1beta1.MessageComposer.withTypeUrl; + + const genericAuth = { + msg: quicksilver.participationrewards.v1.MsgSubmitClaim.typeUrl, + }; + + const binaryMessage = GenericAuthorization.encode(genericAuth).finish(); + const msgGrant = grant({ + granter: authAddress ?? '', + grantee: 'quick1psevptdp90jad76zt9y9x2nga686hutgmasmwd', + grant: { + authorization: { + typeUrl: cosmos.authz.v1beta1.GenericAuthorization.typeUrl, + value: binaryMessage, + }, + }, + }); + + const revokeGrant = revoke({ + granter: authAddress ?? '', + grantee: 'quick1psevptdp90jad76zt9y9x2nga686hutgmasmwd', + + msgTypeUrl: quicksilver.participationrewards.v1.MsgSubmitClaim.typeUrl, + }); + + const msgRevokeBad = revoke({ + granter: authAddress ?? '', + grantee: 'quick1w5ennfhdqrpyvewf35sv3y3t8yuzwq29mrmyal', + msgTypeUrl: quicksilver.participationrewards.v1.MsgSubmitClaim.typeUrl, + }); + + const handleAutoClaimRewards = async (event: React.MouseEvent) => { + event.preventDefault(); + setIsSigningEnable(true); + + try { + await authTx([msgGrant], { + fee, + onSuccess: () => {}, + }); + } catch (error) { + console.error('Transaction failed', error); + + setIsError(true); + } finally { + setIsSigningEnable(false); + } + }; + + const handleRemoveAutoClaim = async (event: React.MouseEvent) => { + event.preventDefault(); + setIsSingingDisable(true); + + try { + if (incorrectAccount) { + // Call msgRevokeBad + await authTx([msgRevokeBad], { + fee, + onSuccess: () => {}, + }); + } + // Continue with msgGrant + if (correctAccount) { + // Call msgRevokeBad + await authTx([msgRevokeBad], { + fee, + onSuccess: () => {}, + }); + } + } catch (error) { + console.error('Transaction failed', error); + setIsError(true); + } finally { + setIsSingingDisable(false); + } + }; + + const handleAuthzSection = () => { + setAuthzSection(!authzSection); + }; + + const handleLsmSection = () => { + setLsmSection(!lsmSection); + }; + + return ( + + + + {!authzSection && !lsmSection && ( + + Account Controls + + + + + + LSM Controls + + + + + + + + + Authz Controls + + + + + + {/* Buttons or any other footer content */} + + )} + + {/* Authz Section */} + {authzSection && ( + + XCC Authz Controls + + + + Disable or reenable the ability to auto claim your cross chain rewards. + + + + Disabling this feature will prevent you from automatically claiming your cross chain rewards. + + + + + + + + + + + + + )} + + {/* LSM Section */} + {lsmSection && ( + + Liquid Staking Module Controls + + + + If your wallet is compromised, hackers can easily tokenize your staked assets and steal them. Disabling LSM prevents this from + happening. + + + + Remember that you will not be able to directly stake your LSM-supported assets, such as Atom, unless you re-enable LSM. + + + + + + + + + + + + + )} + + ); +}; diff --git a/web-ui/components/react/disableLsmModal.tsx b/web-ui/components/react/disableLsmModal.tsx deleted file mode 100644 index 572331c5b..000000000 --- a/web-ui/components/react/disableLsmModal.tsx +++ /dev/null @@ -1,170 +0,0 @@ -import { - Modal, - ModalOverlay, - ModalContent, - ModalHeader, - ModalFooter, - ModalBody, - ModalCloseButton, - Button, - Text, - Spacer, - Spinner, -} from '@chakra-ui/react'; -import { StdFee } from '@cosmjs/amino'; -import { useChain } from '@cosmos-kit/react'; -import { assets, chains } from 'chain-registry'; -import { cosmos } from 'quicksilverjs'; -import { useState } from 'react'; - -import { useTx } from '@/hooks'; - -interface DisableLsmModalProps { - isOpen: boolean; - onClose: () => void; -} - -export const DisableLsmModal: React.FC = ({ isOpen, onClose }) => { - const { address } = useChain('cosmoshub'); - const { tx } = useTx('cosmoshub'); - - // TODO: requires quicksilverjs update to better support disable & enable lsm msgs - const msgEnableValue = { - delegator_address: address ?? '', - }; - const enableBinary = cosmos.staking.v1beta1.MsgEnableTokenizeShares.encode(msgEnableValue).finish(); - - const msgEnable = { - typeUrl: cosmos.staking.v1beta1.MsgEnableTokenizeShares.typeUrl, - value: enableBinary, - }; - - const msgDisableValue = { - delegator_address: address ?? '', - }; - const disableBinary = cosmos.staking.v1beta1.MsgDisableTokenizeShares.encode(msgDisableValue).finish(); - - const msgDisable = { - typeUrl: cosmos.staking.v1beta1.MsgDisableTokenizeShares.typeUrl, - value: disableBinary, - }; - - const [isSigningEnable, setIsSigningEnable] = useState(false); - const [isSigningDisable, setIsSingingDisable] = useState(false); - const [isError, setIsError] = useState(false); - - const mainTokens = assets.find(({ chain_name }) => chain_name === chain_name); - const fees = chains.find(({ chain_name }) => chain_name === chain_name)?.fees?.fee_tokens; - const mainDenom = mainTokens?.assets[0].base ?? ''; - const fixedMinGasPrice = fees?.find(({ denom }) => denom === mainDenom)?.high_gas_price ?? ''; - const feeAmount = Number(fixedMinGasPrice) * 750000; - - const fee: StdFee = { - amount: [ - { - denom: mainDenom, - amount: feeAmount.toString(), - }, - ], - gas: '750000', // test txs were using well in excess of 600k - }; - - const handleDisable = async (event: React.MouseEvent) => { - event.preventDefault(); - setIsSingingDisable(true); - - try { - await tx([msgDisable], { - fee, - onSuccess: () => { - onClose(); - }, - }); - } catch (error) { - console.error('Transaction failed', error); - - setIsError(true); - } finally { - setIsSingingDisable(false); - } - }; - - const handleEnable = async (event: React.MouseEvent) => { - event.preventDefault(); - setIsSigningEnable(true); - - try { - await tx([msgEnable], { - fee, - onSuccess: () => { - onClose(); - }, - }); - } catch (error) { - console.error('Transaction failed', error); - - setIsError(true); - } finally { - setIsSigningEnable(false); - } - }; - - return ( - - - - Liquid Staking Module Controls - - - - If your wallet is compromised, hackers can easily tokenize your staked assets and steal them. Disabling LSM prevents this from - happening. - - - - Remember that you will not be able to directly stake your LSM-supported assets, such as Atom, unless you re-enable LSM. - - - - - - - - - ); -}; diff --git a/web-ui/components/react/sideHeader.tsx b/web-ui/components/react/sideHeader.tsx index ea5053b5b..19aa19dfb 100644 --- a/web-ui/components/react/sideHeader.tsx +++ b/web-ui/components/react/sideHeader.tsx @@ -28,7 +28,7 @@ import { MdPrivacyTip } from 'react-icons/md'; import { DrawerControlProvider } from '@/state/chains/drawerControlProvider'; -import { DisableLsmModal } from './disableLsmModal'; +import { AccountControlModal } from './accountControlModal'; export const SideHeader = () => { @@ -388,7 +388,7 @@ export const SideHeader = () => { - + { - + ; } -// Type for the useLiquidEpochQuery return + interface UseLiquidEpochQueryReturnType { liquidEpoch: LiquidEpochData | undefined; isLoading: boolean; @@ -118,7 +117,6 @@ interface UseLiquidEpochQueryReturnType { } - const BigNumber = require('bignumber.js'); const Long = require('long'); @@ -152,6 +150,37 @@ export const useBalanceQuery = (chainName: string, address: string) => { }; }; +export const useIncorrectAuthChecker = (address: string) => { + const authQuery = useQuery( + ['authWrong', address], + async () => { + if (!address) { + throw new Error('Address is undefined or null'); + } + + try { + const url = `https://lcd.quicksilver.zone/cosmos/authz/v1beta1/grants?granter=${address}&grantee=quick1w5ennfhdqrpyvewf35sv3y3t8yuzwq29mrmyal&msgTypeUrl=/quicksilver.participationrewards.v1.MsgSubmitClaim`; + const response = await axios.get(url); + return { data: response.data, error: null }; + } catch (error) { + // Capture and return error + return { data: null, error: error }; + } + }, + { + enabled: !!address, + staleTime: Infinity, + }, + ); + + return { + authData: authQuery.data?.data, + authError: authQuery.data?.error, + isLoading: authQuery.isLoading, + isError: authQuery.isError, + }; +}; + export const useAuthChecker = (address: string) => { const authQuery = useQuery( ['auth', address], @@ -161,7 +190,7 @@ export const useAuthChecker = (address: string) => { } try { - const url = `https://lcd.quicksilver.zone/cosmos/authz/v1beta1/grants?granter=${address}&grantee=quick1w5ennfhdqrpyvewf35sv3y3t8yuzwq29mrmyal&msgTypeUrl=/quicksilver.participationrewards.v1.MsgSubmitClaim`; + const url = `https://lcd.quicksilver.zone/cosmos/authz/v1beta1/grants?granter=${address}&grantee=quick1psevptdp90jad76zt9y9x2nga686hutgmasmwd&msgTypeUrl=/quicksilver.participationrewards.v1.MsgSubmitClaim`; const response = await axios.get(url); return { data: response.data, error: null }; } catch (error) { @@ -223,14 +252,14 @@ export const useAllBalancesQuery = (chainName: string, address: string) => { if (!grpcQueryClient) { throw new Error('RPC Client not ready'); } - const nextKey = new Uint8Array() + const next_key = new Uint8Array() const balance = await grpcQueryClient.cosmos.bank.v1beta1.allBalances({ address: address || '', pagination: { - key: nextKey, + key: next_key, offset: Long.fromNumber(0), limit: Long.fromNumber(100), - count_total: true, + countTotal: true, reverse: false, }, }); @@ -258,14 +287,14 @@ export const useIbcBalanceQuery = (chainName: string, address: string) => { if (!grpcQueryClient) { throw new Error('RPC Client not ready'); } - const nextKey = new Uint8Array() + const next_key = new Uint8Array() const balance = await grpcQueryClient.cosmos.bank.v1beta1.allBalances({ address: address || '', pagination: { - key: nextKey, + key: next_key, offset: Long.fromNumber(0), limit: Long.fromNumber(100), - count_total: true, + countTotal: true, reverse: false, }, }); @@ -313,10 +342,11 @@ export const useQBalanceQuery = (chainName: string, address: string, qAsset: str if (!grpcQueryClient) { throw new Error('RPC Client not ready'); } + const denom = qAsset === 'dydx' ? 'aq'+ qAsset : 'uq' + qAsset; const balance = await grpcQueryClient.cosmos.bank.v1beta1.balance({ address: address || '', - denom: 'uq' + qAsset, + denom: denom, }); return balance; @@ -386,7 +416,7 @@ export const useLiquidRewardsQuery = (address: string): UseLiquidRewardsQueryRet throw new Error('Address is not avaialble'); } - const response = await axios.get(`https://claim.test.quicksilver.zone/${address}/current`); + const response = await axios.get(`https://claim.quicksilver.zone/${address}/current`); return response.data; }, { @@ -411,7 +441,7 @@ export const useLiquidEpochQuery = (address: string): UseLiquidEpochQueryReturnT throw new Error('Address is not available'); } - const response = await axios.get(`https://claim.test.quicksilver.zone/${address}/epoch`); + const response = await axios.get(`https://claim.quicksilver.zone/${address}/epoch`); if (response.data.messages.length === 0) { @@ -485,25 +515,27 @@ export const useValidatorsQuery = (chainName: string) => { key: key, offset: Long.fromNumber(0), limit: Long.fromNumber(500), - count_total: true, + countTotal: true, reverse: false, }, }); + return validators; }; + //TODO: migrate this to use evince cache endpoint. const validatorQuery = useQuery( ['validators', chainName], async () => { let allValidators: any[] = []; - let nextKey = new Uint8Array(); + let next_key = new Uint8Array(); do { - const response = await fetchValidators(nextKey); + const response = await fetchValidators(next_key); allValidators = allValidators.concat(response.validators); - nextKey = response.pagination.next_key ?? new Uint8Array(); - } while (nextKey && nextKey.length > 0); + next_key = response.pagination.next_key ?? new Uint8Array(); + } while (next_key && next_key.length > 0); const sorted = allValidators.sort((a, b) => new BigNumber(b.tokens).minus(a.tokens).toNumber()); return parseValidators(sorted); }, @@ -574,33 +606,33 @@ export const useAPYQuery = (chainId: any, liveNetworks?: string[] ) => { function parseZone(apiZone: any): Zone { return { - connection_id: apiZone.connection_id, - chain_id: apiZone.chain_id, - deposit_address: apiZone.deposit_address, - withdrawal_address: apiZone.withdrawal_address, - performance_address: apiZone.performance_address, - delegation_address: apiZone.delegation_address, - account_prefix: apiZone.account_prefix, - local_denom: apiZone.local_denom, - base_denom: apiZone.base_denom, - redemption_rate: apiZone.redemption_rate, - last_redemption_rate: apiZone.last_redemption_rate, + connectionId: apiZone.connection_id, + chainId: apiZone.chain_id, + depositAddress: apiZone.deposit_address, + withdrawalAddress: apiZone.withdrawal_address, + performanceAddress: apiZone.performance_address, + delegationAddress: apiZone.delegation_address, + accountPrefix: apiZone.account_prefix, + localDenom: apiZone.local_denom, + baseDenom: apiZone.base_denom, + redemptionRate: apiZone.redemption_rate, + lastRedemptionRate: apiZone.last_redemption_rate, validators: apiZone.validators, - aggregate_intent: apiZone.aggregate_intent, - multi_send: apiZone.multi_send, - liquidity_module: apiZone.liquidity_module, - withdrawal_waitgroup: apiZone.withdrawal_waitgroup, - ibc_next_validators_hash: apiZone.ibc_next_validators_hash, - validator_selection_allocation: apiZone.validator_selection_allocation, - holdings_allocation: apiZone.holdings_allocation, - last_epoch_height: apiZone.last_epoch_height, + aggregateIntent: apiZone.aggregate_intent, + multiSend: apiZone.multi_send, + liquidityModule: apiZone.liquidity_module, + withdrawalWaitgroup: apiZone.withdrawal_waitgroup, + ibcNextValidatorsHash: apiZone.ibc_next_validators_hash, + validatorSelectionAllocation: apiZone.validator_selection_allocation, + holdingsAllocation: apiZone.holdings_allocation, + lastEpochHeight: apiZone.last_epoch_height, tvl: apiZone.tvl, - unbonding_period: apiZone.unbonding_period, - messages_per_tx: apiZone.messages_per_tx, + unbondingPeriod: apiZone.unbonding_period, + messagesPerTx: apiZone.messages_per_tx, decimals: apiZone.decimals, - return_to_sender: apiZone.return_to_sender, - unbonding_enabled: apiZone.unbonding_enabled, - deposits_enabled: apiZone.deposits_enabled, + returnToSender: apiZone.return_to_sender, + unbondingEnabled: apiZone.unbonding_enabled, + depositsEnabled: apiZone.deposits_enabled, is118: apiZone.is118, subzoneInfo: apiZone.subzoneInfo, }; @@ -644,35 +676,35 @@ export const useZoneQuery = (chainId: string, liveNetworks?: string[]) => { // Parse or map the API zone data to your Zone interface const parsedZone: Zone = { - connection_id: apiZone.connection_id, - chain_id: apiZone.chain_id, - deposit_address: apiZone.deposit_address, - withdrawal_address: apiZone.withdrawal_address, - performance_address: apiZone.performance_address, - delegation_address: apiZone.delegation_address, - account_prefix: apiZone.account_prefix, - local_denom: apiZone.local_denom, - base_denom: apiZone.base_denom, - redemption_rate: apiZone.redemption_rate, - last_redemption_rate: apiZone.last_redemption_rate, - validators: apiZone.validators, - aggregate_intent: apiZone.aggregate_intent, - multi_send: apiZone.multi_send, - liquidity_module: apiZone.liquidity_module, - withdrawal_waitgroup: apiZone.withdrawal_waitgroup, - ibc_next_validators_hash: apiZone.ibc_next_validators_hash, - validator_selection_allocation: apiZone.validator_selection_allocation, - holdings_allocation: apiZone.holdings_allocation, - last_epoch_height: apiZone.last_epoch_height, - tvl: apiZone.tvl, - unbonding_period: apiZone.unbonding_period, - messages_per_tx: apiZone.messages_per_tx, - decimals: apiZone.decimals, - return_to_sender: apiZone.return_to_sender, - unbonding_enabled: apiZone.unbonding_enabled, - deposits_enabled: apiZone.deposits_enabled, - is118: apiZone.is118, - subzoneInfo: apiZone.subzoneInfo, + connectionId: apiZone.connection_id, + chainId: apiZone.chain_id, + depositAddress: apiZone.deposit_address, + withdrawalAddress: apiZone.withdrawal_address, + performanceAddress: apiZone.performance_address, + delegationAddress: apiZone.delegation_address, + accountPrefix: apiZone.account_prefix, + localDenom: apiZone.local_denom, + baseDenom: apiZone.base_denom, + redemptionRate: apiZone.redemption_rate, + lastRedemptionRate: apiZone.last_redemption_rate, + validators: apiZone.validators, + aggregateIntent: apiZone.aggregate_intent, + multiSend: apiZone.multi_send, + liquidityModule: apiZone.liquidity_module, + withdrawalWaitgroup: apiZone.withdrawal_waitgroup, + ibcNextValidatorsHash: apiZone.ibc_next_validators_hash, + validatorSelectionAllocation: apiZone.validator_selection_allocation, + holdingsAllocation: apiZone.holdings_allocation, + lastEpochHeight: apiZone.last_epoch_height, + tvl: apiZone.tvl, + unbondingPeriod: apiZone.unbonding_period, + messagesPerTx: apiZone.messages_per_tx, + decimals: apiZone.decimals, + returnToSender: apiZone.return_to_sender, + unbondingEnabled: apiZone.unbonding_enabled, + depositsEnabled: apiZone.deposits_enabled, + is118: apiZone.is118, + subzoneInfo: apiZone.subzoneInfo, }; return parsedZone; @@ -706,15 +738,15 @@ export const useMissedBlocks = (chainName: string) => { } let allMissedBlocks: any[] = []; - let nextKey = new Uint8Array(); + let next_key = new Uint8Array(); do { const response = await grpcQueryClient.cosmos.slashing.v1beta1.signingInfos({ pagination: { - key: nextKey, + key: next_key, offset: Long.fromNumber(0), limit: Long.fromNumber(100), - count_total: true, + countTotal: true, reverse: false, }, }); @@ -728,8 +760,8 @@ export const useMissedBlocks = (chainName: string) => { }); allMissedBlocks = allMissedBlocks.concat(filteredMissedBlocks); - nextKey = response.pagination?.next_key ?? new Uint8Array(); - } while (nextKey && nextKey.length > 0); + next_key = response.pagination?.next_key ?? new Uint8Array(); + } while (next_key && next_key.length > 0); return allMissedBlocks; }; @@ -790,14 +822,14 @@ export const useGovernanceQuery = (chainName: string) => { if (!grpcQueryClient) { throw new Error('RPC Client not ready'); } - const nextKey = new Uint8Array() + const next_key = new Uint8Array() const governance = await grpcQueryClient.cosmos.gov.v1beta1.proposals({ - proposal_status: cosmos.gov.v1.ProposalStatus.PROPOSAL_STATUS_UNSPECIFIED, + proposalStatus: cosmos.gov.v1.ProposalStatus.PROPOSAL_STATUS_UNSPECIFIED, pagination: { - key: nextKey, + key: next_key, offset: Long.fromNumber(0), limit: Long.fromNumber(100), - count_total: true, + countTotal: true, reverse: true, }, voter: '', @@ -828,14 +860,14 @@ export const useNativeStakeQuery = (chainName: string, address: string) => { if (!grpcQueryClient) { throw new Error('RPC Client not ready'); } - const nextKey = new Uint8Array() + const next_key = new Uint8Array() const balance = await grpcQueryClient.cosmos.staking.v1beta1.delegatorDelegations({ - delegator_addr: address || '', + delegatorAddr: address || '', pagination: { - key: nextKey, + key: next_key, offset: Long.fromNumber(0), limit: Long.fromNumber(100), - count_total: true, + countTotal: true, reverse: false, }, }); diff --git a/web-ui/hooks/useVotingData.ts b/web-ui/hooks/useVotingData.ts index e9dc64268..da7366be5 100644 --- a/web-ui/hooks/useVotingData.ts +++ b/web-ui/hooks/useVotingData.ts @@ -110,7 +110,7 @@ export const useVotingData = ( throw new Error("Required information for query is missing"); } return grpcQueryClient.cosmos.gov.v1beta1.vote({ - proposal_id: new Long(Number(proposalId)), + proposalId: new Long(Number(proposalId)), voter: address || '', }); }, diff --git a/web-ui/package.json b/web-ui/package.json index 80666a97d..942c78ce8 100644 --- a/web-ui/package.json +++ b/web-ui/package.json @@ -44,7 +44,7 @@ "interchain-query": "1.8.7", "next": "12.2.3", "next-transpile-modules": "^10.0.1", - "quicksilverjs": "1.2.1", + "quicksilverjs": "1.3.7", "react": "18.2.0", "react-dom": "18.2.0", "react-icons": "5.0.1", diff --git a/web-ui/pages/_app.tsx b/web-ui/pages/_app.tsx index ea218a5d1..5e4e94394 100644 --- a/web-ui/pages/_app.tsx +++ b/web-ui/pages/_app.tsx @@ -34,20 +34,15 @@ const queryClient = new QueryClient({ function QuickApp({ Component, pageProps }: AppProps) { const { themeClass } = useTheme(); const signerOptions: SignerOptions = { - //@ts-ignore - signingStargate: (chain: Chain): SigningStargateClientOptions | undefined => { - //@ts-ignore + signingStargate: (_chain: string | Chain): SigningStargateClientOptions | undefined => { const mergedRegistry = new Registry([...quicksilverProtoRegistry, ...ibcProtoRegistry, ...cosmosProtoRegistry]); - const mergedAminoTypes = new AminoTypes({ ...cosmosAminoConverters, ...quicksilverAminoConverters, ...ibcAminoConverters, }); - return { aminoTypes: mergedAminoTypes, - //@ts-ignore registry: mergedRegistry, }; }, @@ -272,6 +267,7 @@ function QuickApp({ Component, pageProps }: AppProps) { modalTheme={modalThemeOverrides} chains={chains} assetLists={assets} + // @ts-ignore wallets={[...keplrWallets, ...cosmostationWallets, ...leapWallets]} walletConnectOptions={{ signClient: { diff --git a/web-ui/pages/assets.tsx b/web-ui/pages/assets.tsx index ea09558ff..8abd886d5 100644 --- a/web-ui/pages/assets.tsx +++ b/web-ui/pages/assets.tsx @@ -125,8 +125,9 @@ function Home() { qRegen: regenAPY ?? 0, qSomm: sommAPY ?? 0, qJuno: junoAPY ?? 0, + qDydx: dydxAPY ?? 0, }), - [cosmosAPY, osmoAPY, starsAPY, regenAPY, sommAPY, junoAPY], + [cosmosAPY, osmoAPY, starsAPY, regenAPY, sommAPY, junoAPY, dydxAPY], ); // useMemo hook to cache qBalance data const qBalances: BalanceRates = useMemo( @@ -137,39 +138,44 @@ function Home() { qRegen: shiftDigits(qRegen?.balance?.amount ?? '000000', -6), qSomm: shiftDigits(qSomm?.balance?.amount ?? '000000', -6), qJuno: shiftDigits(qJuno?.balance?.amount ?? '000000', -6), + qDydx: shiftDigits(qDydx?.balance?.amount ?? '000000', -18), }), - [qAtom, qOsmo, qStars, qRegen, qSomm, qJuno], + [qAtom, qOsmo, qStars, qRegen, qSomm, qJuno, qDydx], ); // useMemo hook to cache redemption rate data const redemptionRates: RedemptionRates = useMemo( () => ({ atom: { - current: CosmosZone?.redemption_rate ? parseFloat(CosmosZone.redemption_rate) : 1, - last: CosmosZone?.last_redemption_rate ? parseFloat(CosmosZone.last_redemption_rate) : 1, + current: CosmosZone?.redemptionRate ? parseFloat(CosmosZone.redemptionRate) : 1, + last: CosmosZone?.lastRedemptionRate ? parseFloat(CosmosZone.lastRedemptionRate) : 1, }, osmo: { - current: OsmoZone?.redemption_rate ? parseFloat(OsmoZone.redemption_rate) : 1, - last: OsmoZone?.last_redemption_rate ? parseFloat(OsmoZone.last_redemption_rate) : 1, + current: OsmoZone?.redemptionRate ? parseFloat(OsmoZone.redemptionRate) : 1, + last: OsmoZone?.lastRedemptionRate ? parseFloat(OsmoZone.lastRedemptionRate) : 1, }, stars: { - current: StarZone?.redemption_rate ? parseFloat(StarZone.redemption_rate) : 1, - last: StarZone?.last_redemption_rate ? parseFloat(StarZone.last_redemption_rate) : 1, + current: StarZone?.redemptionRate ? parseFloat(StarZone.redemptionRate) : 1, + last: StarZone?.lastRedemptionRate ? parseFloat(StarZone.lastRedemptionRate) : 1, }, regen: { - current: RegenZone?.redemption_rate ? parseFloat(RegenZone.redemption_rate) : 1, - last: RegenZone?.last_redemption_rate ? parseFloat(RegenZone.last_redemption_rate) : 1, + current: RegenZone?.redemptionRate ? parseFloat(RegenZone.redemptionRate) : 1, + last: RegenZone?.lastRedemptionRate ? parseFloat(RegenZone.lastRedemptionRate) : 1, }, somm: { - current: SommZone?.redemption_rate ? parseFloat(SommZone.redemption_rate) : 1, - last: SommZone?.last_redemption_rate ? parseFloat(SommZone.last_redemption_rate) : 1, + current: SommZone?.redemptionRate ? parseFloat(SommZone.redemptionRate) : 1, + last: SommZone?.lastRedemptionRate ? parseFloat(SommZone.lastRedemptionRate) : 1, }, juno: { - current: JunoZone?.redemption_rate ? parseFloat(JunoZone.redemption_rate) : 1, - last: JunoZone?.last_redemption_rate ? parseFloat(JunoZone.last_redemption_rate) : 1, + current: JunoZone?.redemptionRate ? parseFloat(JunoZone.redemptionRate) : 1, + last: JunoZone?.lastRedemptionRate ? parseFloat(JunoZone.lastRedemptionRate) : 1, + }, + dydx: { + current: DydxZone?.redemptionRate ? parseFloat(DydxZone.redemptionRate) : 1, + last: DydxZone?.lastRedemptionRate ? parseFloat(DydxZone.lastRedemptionRate) : 1, }, }), - [CosmosZone, OsmoZone, StarZone, RegenZone, SommZone, JunoZone], + [CosmosZone, OsmoZone, StarZone, RegenZone, SommZone, JunoZone, DydxZone], ); // State hooks for portfolio items, total portfolio value, and other metrics diff --git a/web-ui/pages/staking/[chainId]/[valoperAddress].tsx b/web-ui/pages/staking/[chainId]/[valoperAddress].tsx index 2fdd4e82f..7ddc0dfd3 100644 --- a/web-ui/pages/staking/[chainId]/[valoperAddress].tsx +++ b/web-ui/pages/staking/[chainId]/[valoperAddress].tsx @@ -141,11 +141,7 @@ export const StakingBox = ({ selectedOption, valoperAddress }: StakingBoxProps) const exp = getExponent(selectedOption.chainName); const { balance, isLoading } = useBalanceQuery(selectedOption.chainName, address ?? ''); - const { - balance: qBalance, - isLoading: qIsLoading, - isError: qIsError, - } = useQBalanceQuery('quicksilver', qAddress ?? '', selectedOption.value.toLowerCase()); + const { balance: qBalance } = useQBalanceQuery('quicksilver', qAddress ?? '', selectedOption.value.toLowerCase()); const qAssets = qBalance?.balance.amount || ''; @@ -170,7 +166,8 @@ export const StakingBox = ({ selectedOption, valoperAddress }: StakingBoxProps) const [inputError, setInputError] = useState(false); - const qAssetsExponent = shiftDigits(qAssets, -6); + const exponent = qBalance?.balance.denom === 'aqdydx' ? -18 : -6; + const qAssetsExponent = shiftDigits(qAssets, exponent); const qAssetsDisplay = qAssetsExponent.includes('.') ? qAssetsExponent.substring(0, qAssetsExponent.indexOf('.') + 3) : qAssetsExponent; const maxUnstakingAmount = truncateToThreeDecimals(Number(qAssetsDisplay)); @@ -184,13 +181,13 @@ export const StakingBox = ({ selectedOption, valoperAddress }: StakingBoxProps) const { requestRedemption } = quicksilver.interchainstaking.v1.MessageComposer.withTypeUrl; const numericAmount = Number(tokenAmount); const smallestUnitAmount = numericAmount * Math.pow(10, 6); - const value: Coin = { amount: smallestUnitAmount.toFixed(0), denom: zone?.local_denom ?? '' }; + const value: Coin = { amount: smallestUnitAmount.toFixed(0), denom: zone?.localDenom ?? '' }; // Create the message only executes if the unstake button is clickable const msgRequestRedemption = requestRedemption({ value: value, - from_address: qAddress ?? '', - destination_address: address ?? '', + fromAddress: qAddress ?? '', + destinationAddress: address ?? '', }); const fee: StdFee = { @@ -264,9 +261,9 @@ export const StakingBox = ({ selectedOption, valoperAddress }: StakingBoxProps) const { send } = cosmos.bank.v1beta1.MessageComposer.withTypeUrl; // Create the message only executes if the liquid stake button is clickable const msgSend = send({ - from_address: address ?? '', - to_address: zone?.deposit_address?.address ?? '', - amount: coins(smallestUnitAmount.toFixed(0), zone?.base_denom ?? ''), + fromAddress: address ?? '', + toAddress: zone?.depositAddress?.address ?? '', + amount: coins(smallestUnitAmount.toFixed(0), zone?.baseDenom ?? ''), }); const mainTokens = assets.find(({ chain_name }) => chain_name === selectedOption.chainName); @@ -546,7 +543,7 @@ export const StakingBox = ({ selectedOption, valoperAddress }: StakingBoxProps) {!isZoneLoading ? ( - (Number(tokenAmount) * Number(zone?.redemption_rate || 1)).toFixed(2) + (Number(tokenAmount) * Number(zone?.redemptionRate || 1)).toFixed(2) ) : ( )} @@ -706,7 +703,7 @@ export const StakingBox = ({ selectedOption, valoperAddress }: StakingBoxProps) {!isZoneLoading ? ( - (Number(tokenAmount) * Number(zone?.redemption_rate || 1)).toFixed(2) + (Number(tokenAmount) * Number(zone?.redemptionRate || 1)).toFixed(2) ) : ( )} diff --git a/web-ui/public/img/networks/dydx.png b/web-ui/public/img/networks/dydx.png new file mode 100644 index 0000000000000000000000000000000000000000..44a45ea4cfe1787ac92d8acef5d3e62afb2a7705 GIT binary patch literal 20752 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 = ({ children } const fetchLiveZones = async () => { try { const response = await axios.get(`${process.env.NEXT_PUBLIC_QUICKSILVER_API}/quicksilver/interchainstaking/v1/zones`); - const liveZones = response.data.zones.map((zone: Zone) => zone.chain_id); + const liveZones = response.data.zones.map((zone: Zone) => zone.chainId); setLiveNetworks(liveZones); } catch (error) { console.error('Failed to fetch live zones:', error); diff --git a/web-ui/state/chains/prod.ts b/web-ui/state/chains/prod.ts index 2d6ba9533..4cc30a5ff 100644 --- a/web-ui/state/chains/prod.ts +++ b/web-ui/state/chains/prod.ts @@ -6,6 +6,7 @@ export const ibcDenomWithdrawMapping = { qREGEN: 'qregen', qSOMM: 'qsomm', qJUNO: 'qjuno', + qDYDX: 'qdydx', } }; @@ -16,7 +17,8 @@ export const ibcDenomWithdrawMapping = { qSTARS: 'ibc/46C83BB054E12E189882B5284542DB605D94C99827E367C9192CF0579CD5BC83', qREGEN: 'ibc/79A676508A2ECA1021EDDC7BB9CF70CEEC9514C478DA526A5A8B3E78506C2206', qSOMM: 'ibc/EAF76AD1EEF7B16D167D87711FB26ABE881AC7D9F7E6D0CF313D5FA530417208', - qJUNO: 'ibc/B4E18E61E1505C2F371B621E49B09E983F6A138F251A7B5286A6BDF739FD0D54' + qJUNO: 'ibc/B4E18E61E1505C2F371B621E49B09E983F6A138F251A7B5286A6BDF739FD0D54', + qDYDX: '' }, umee: { qATOM: 'ibc/454725EA4029BAA99C293904336DE9A4B84E2BF7D83B9C56EE6B03E8A65FB5A1', @@ -24,7 +26,8 @@ export const ibcDenomWithdrawMapping = { qSTARS: 'ibc/31946162F3E898B9E3A21792DD2AC740F2E82E7B92769BDF239C3DDA1726BB9F', qREGEN: 'ibc/16F0C7E49C2FE3A99E92A20DBCF4006B38ABC4E29F7F37829AD40F2C585BE835', qSOMM: 'ibc/ACF9DA139FE5BC8F95AC4A12B0B6D7710274DEDAC57284B881BEE1896F40642D', - qJUNO: 'ibc/CA0BEF2524A37205009210EFCFB09585FBA9648C5F065FA078944A5C6704E8DC' + qJUNO: 'ibc/CA0BEF2524A37205009210EFCFB09585FBA9648C5F065FA078944A5C6704E8DC', + qDYDX: '' }, }; diff --git a/web-ui/utils/staking.ts b/web-ui/utils/staking.ts index 8a75e26f8..6fb355239 100644 --- a/web-ui/utils/staking.ts +++ b/web-ui/utils/staking.ts @@ -54,6 +54,7 @@ export const parseValidators = (validators: Validator[]) => { const commissionRate = validator.commission?.commission_rates?.rate || ZERO; const commissionPercentage = parseFloat(commissionRate) * 100; + //TODO: Add valconsAddress to query missed blocks const valconsPrefix = extractValconsPrefix(validator.operator_address); const valconsAddress = getValconsAddress(validator.consensus_pubkey, valconsPrefix); @@ -64,21 +65,21 @@ export const parseValidators = (validators: Validator[]) => { name: validator.description?.moniker || '', identity: validator.description?.identity || '', address: validator.operator_address || '', - commission: commissionPercentage.toFixed() + '%', + commission: commissionPercentage.toFixed(2) + '%', votingPower: toNumber(shiftDigits(validator.tokens, -6, 0), 0), }; }); }; -function getValconsAddress(consensus_pubkey: any, valconsPrefix: string) { - if (!consensus_pubkey || typeof consensus_pubkey.key !== 'string') { +function getValconsAddress(consensusPubkey: any, valconsPrefix: string) { + if (!consensusPubkey || typeof consensusPubkey.key !== 'string') { console.error('Invalid or missing consensus public key'); return ''; } try { // Decode the Base64 key directly to bytes - const decoded = Buffer.from(consensus_pubkey.key, 'base64'); + const decoded = Buffer.from(consensusPubkey.key, 'base64'); // Convert bytes to Bech32 words const valconsWords = bech32.bech32.toWords(new Uint8Array(decoded)); From 5b93273786a97e0ce1a70cc77bbfdafcdebade19 Mon Sep 17 00:00:00 2001 From: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> Date: Wed, 20 Mar 2024 19:56:29 -0700 Subject: [PATCH 41/49] fix lsm queries --- web-ui/README.md | 3 +-- web-ui/bun.lockb | Bin 426884 -> 426916 bytes web-ui/components/Staking/stakingBox.tsx | 17 +++++++++-------- web-ui/hooks/useQueries.ts | 4 ++-- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/web-ui/README.md b/web-ui/README.md index 659bb1b88..50ea63205 100644 --- a/web-ui/README.md +++ b/web-ui/README.md @@ -56,9 +56,8 @@ Please ensure your IDE is configured to use Typescript v4.9.3 **Has Blockers** -- [ ] Fix CCX in assets page - [ ] Build liquid governance page **Assets** -- [ ] Fix the way queries for networks and entries in components are created. Rather than defining one for each network, create a function that iterates through the .env entry for live networks and creates the queries and components for each. `pages/assets.tsx` +- [ ] Fix the way queries for networks and entries in components are created. Rather than defining one for each network, create a function that iterates through the .env entry or liveNetworks call for live networks and creates the queries and components for each. `pages/assets.tsx` diff --git a/web-ui/bun.lockb b/web-ui/bun.lockb index 37b105e0a655e5228e08e3c8e9f4fb98d7519239..3aabb02c4455634419098b8d6c856c18bd2775e8 100755 GIT binary patch delta 3202 zcmeH}Yfu$s7{_PO{`cF{qp#p>mjvGOB-J9Ia#x^?d;vExk|a$+5_n`k~}q= zCQE;|C0MSlOS&1i*(-HuWwNEVv3OJ6=BnmMqdZ)$iBIgt&4L2P*Ky;wHQ0K}0OQEFa;hrSz z;{_~xAYVn&(8av|uSxw%*i$N4UWp{XinEmc8YGQfj>Ml-fq&GmQkQzir=s_u1+7J+ zq?6c=q-(JoN$36%l6JHYNsW?rw4awLsb38*Q_}M1yi7^`4U2FYX6k9zb5pfD|ih_2XLM91`>bLZTzEtzsR~#k|a0y|Nkib=N|>5 z_)YnZX-T0QV;)*pG&NSfo%vqXu#SE8`+vRsWAKGbnG5|Ywv2Ar8s4_O`cBjIfM-65 z8tW*%^+EpcFYR8u!>I2`C^^$C&A(^FT#zSsC2hE}?bAcHy%l0p;q1f(;X=QW^(b{u z*s^kak#&E$RnIdIT;G0o_bKz9>z(TpqHaZ}bxyjN7V6WUReUUYMX&dS|tQknSQpv(mrmOosi2X^~4=!5x!Pa7US=%SVmlor=xmI8E;fS|^TxUZJ7j z$$NYcj$R)Js1|aU;yH%q8k$DCc~vOt4ZMr{?1sa=!|nmQFt`O`MwjB-I~Db?j(}c- zuI|W3>>^P+(QJVBnB54}W_C1J(ou~B?(AfCQE=5X<)E3^MWgW*XbrY`IfQM>SQ zy09AqC$pn{&>@cnhiIlmbA!X>kj8;lD$oY-wn?Z{`dq2x!7>?g4)$V0da@gjIs?uh z>BTMu^>DZVq&K?>s8u*>KI|rn0J~>V@8V}Ikli#m`i-P#a}c}f zsOwNuv$IP_?dWrEQV`1-kfFl<0LOF_if+_kUX_Wuy|2F%%x)&!PwYb2Wx?g}O&bD7 zr!fn(z|jq*F=>-*(8?|hg6@3|Xz1H^o)iU%>mtntoq$?2yIj;Y*fU+I7&yB5c_4z{ zh&b*y2QGnKJiC0jEQ|1XsGRer1Dn9U5cLljJX`$sP#NM)LrmsXOHkKhxLhNwM=_gp z`UU?I95%*0R`w{~^b7tCXaFa{DR5eJo7B=6noa0SqY6}mH^FK^(*{iw8v%U^%?As> zLa;;}P*l(0S5RhxnIH?y0@)x3M-W3Peb;C0X+cmZ$V1AKuW7ziHY(iRx&%xbEv z(bvd%aoM5<_Pc_z1+;?iMUO?b>GVOL@*Id0;wPk zOa&Pr6U+ozU>3**Ibb%(1xtayQLU>{vb_z%wS!xr5dKB57!-kMxERsltlH#YLw8Zr zWPK>qFc2#8UDXrXQIv)V?x&9Prth@dc=KrXr|G&7q>JKy>WLAJD9?gAuoKWnDZPAK zfC5qhxfC!Kbc$te>T-=fHCKraH+7!#H5|<)u)!iS+|?3!yK&xKO&P4M!6Uue7!a+N zDf-1&JcnpCVrQ%xYBa{GwYNotLyHw2cFii*J8M?s+aRspNAHU7dwULxt?^p2XpYzF joqtZ~bFOQRT?tyzRC$EqUZ%C&6cwIMgABdMX@&0}biTi6 delta 3256 zcmeH}dr(wW9LMk7dl$GOtOCoTfU>KIJVjwed?W-a`9Po&9}uMCleBzm5vU+iHiMEL zEJyQ|srib{tBy1(nc!sPM1@d}&0r;if7sxNh}icBzowdT`l~-Zv!DI`&iDN8xo6Kg z_v}4T+_$i}Z)t?BPo#C_>biKbqkY@hA8O9~|B;vy7+4kR6<)BXXvfVoYwLznDXDRu zMfaR!>F=@_^$JH^(}=SA=E#cbwWW@-`ni$%<_Os_B-MyKS51=Kp?#oK?+0~;210v6 zheB1T9cqBaK&d=UWl{8s+&`YWiQ~%>S(Bhn@ROmvp;=HGXEv0|zf@d9H~G{&8_gcj z6;K+*8czSGQr=qjNfp%Jf|8%d`ZoLPp)`zQC_Yjtz9?@iRaj~GJ2WZ3%RtaIEgwQ@ zTJ}L{8V*3Iqa#o%q}0(-u9H&UF|LzR{RG!ZDgPvt`Z>*Yo%M`{`_o7&+4utLg8Elb z`h_)6D*vT)gR97+8T<)K1Gve03yP0)2Va!eOcgFs&?vnmPOk8Ownv`rk*DmDPE#js z8oi`I&P|T%NX#k83%on2*h3oDvU0fD*H*h?SHS+9&aj}pTdqtlbxi!^!Lsi+nwIx! z9aPu5tz}b3x-I8}b$68O>qaeJI4w-K*UCw4ajVk9qCIRgJ)8W$E9`anW}#`TecZ<7 zMIqidsxy-#&KA@<++E!#J~|Sz>d?5QUa}>6WNXd5ywSThkGJkmbVOa$E3X(DeO|4_ zK~dir;Y_x-dN#_-cqDnKnF1DjmN52bSYBYQE3zeP;NiMd79p(H%xpI>uy% zy0SNhVjd^uQ{HnxX3q^Cjd(0LO~)*X2_B|MiUW-lNca!%;EUr?OXxNwPxhXNmw{e< zphxwh&T*hKd3i*;}EOxs94w=kGLHp4S@P|d05g3sI z1KJF`G59^;eZ<>AsR(ygE%Aj2i@+ve$Gp-@+e)wstOh3F3A}(AcmoUY0Z%ZkS$dJP zIziU1qW(4bMqGDM`)fB4Hh@O)*hTf#=*{aOI4rE1>YKR*7rqC!fikci>;`+lesBOB z0km$Pf@9z~H~~(AQ{XeO1PlXFAR3GZe)>*LjgqZRxZQ2=J6HgJAy@=*K@_}bakq!+ zD-YB)S9OxC1;GjiAtJM{k$0g9`8w zpf^`~$jZP*uD9WSZz6UB6M>I-&0Sq>q<7LhamQWFaypBQ08ONs)OB*Xe$AvN4Aca+ z?h0(VEuyzw_0%Jy)m%lZj=^T^G7rY6p?Y16dZJm}^)tqZealsgJXCM7883Nj^|9TL xO1aQujqzA=(H3jG(4%@}x81TqzckXAJ6Vp@hZGwdn#6|LP6PC?T&FdbKLO8s!ju32 diff --git a/web-ui/components/Staking/stakingBox.tsx b/web-ui/components/Staking/stakingBox.tsx index 14b882237..5fd230721 100644 --- a/web-ui/components/Staking/stakingBox.tsx +++ b/web-ui/components/Staking/stakingBox.tsx @@ -33,6 +33,10 @@ import { quicksilver } from 'quicksilverjs'; import React, { useCallback, useEffect, useMemo, useState } from 'react'; import { FaStar } from 'react-icons/fa'; +import RevertSharesProcessModal from './modals/revertSharesProcessModal'; +import StakingProcessModal from './modals/stakingProcessModal'; +import TransferProcessModal from './modals/transferProcessModal'; + import { useTx } from '@/hooks'; import { useAllBalancesQuery, @@ -45,11 +49,6 @@ import { } from '@/hooks/useQueries'; import { getExponent, shiftDigits } from '@/utils'; -import RevertSharesProcessModal from './modals/revertSharesProcessModal'; -import StakingProcessModal from './modals/stakingProcessModal'; -import TransferProcessModal from './modals/transferProcessModal'; - - type StakingBoxProps = { selectedOption: { name: string; @@ -201,7 +200,9 @@ export const StakingBox = ({ }; const { delegations, delegationsIsError, delegationsIsLoading } = useNativeStakeQuery(selectedOption.chainName, address ?? ''); - const delegationsResponse = delegations?.delegationResponses; + + const delegationsResponse = delegations?.delegation_responses; + const nativeStakedAmount = delegationsResponse?.reduce((acc: number, delegationResponse: { balance: { amount: any } }) => { const amount = Number(delegationResponse?.balance?.amount) || 0; return acc + amount; @@ -273,8 +274,8 @@ export const StakingBox = ({ const [validatorAddress, uniqueId] = balance.denom.split('/'); return { delegation: { - delegatorAddress: '', - validatorAddress: validatorAddress, + delegator_address: '', + validator_address: validatorAddress, unique_id: uniqueId, shares: '', }, diff --git a/web-ui/hooks/useQueries.ts b/web-ui/hooks/useQueries.ts index f0bfbf9df..e7cadb0e1 100644 --- a/web-ui/hooks/useQueries.ts +++ b/web-ui/hooks/useQueries.ts @@ -862,7 +862,7 @@ export const useNativeStakeQuery = (chainName: string, address: string) => { } const next_key = new Uint8Array() const balance = await grpcQueryClient.cosmos.staking.v1beta1.delegatorDelegations({ - delegatorAddr: address || '', + delegator_addr: address || '', pagination: { key: next_key, offset: Long.fromNumber(0), @@ -871,7 +871,7 @@ export const useNativeStakeQuery = (chainName: string, address: string) => { reverse: false, }, }); - + return balance; }, { From fa30679547140007650b9daa0e7a3a2eaf602c3b Mon Sep 17 00:00:00 2001 From: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> Date: Wed, 20 Mar 2024 19:58:29 -0700 Subject: [PATCH 42/49] lint --- web-ui/components/Staking/stakingBox.tsx | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/web-ui/components/Staking/stakingBox.tsx b/web-ui/components/Staking/stakingBox.tsx index 5fd230721..d51ff1c45 100644 --- a/web-ui/components/Staking/stakingBox.tsx +++ b/web-ui/components/Staking/stakingBox.tsx @@ -33,10 +33,6 @@ import { quicksilver } from 'quicksilverjs'; import React, { useCallback, useEffect, useMemo, useState } from 'react'; import { FaStar } from 'react-icons/fa'; -import RevertSharesProcessModal from './modals/revertSharesProcessModal'; -import StakingProcessModal from './modals/stakingProcessModal'; -import TransferProcessModal from './modals/transferProcessModal'; - import { useTx } from '@/hooks'; import { useAllBalancesQuery, @@ -49,6 +45,11 @@ import { } from '@/hooks/useQueries'; import { getExponent, shiftDigits } from '@/utils'; +import RevertSharesProcessModal from './modals/revertSharesProcessModal'; +import StakingProcessModal from './modals/stakingProcessModal'; +import TransferProcessModal from './modals/transferProcessModal'; + + type StakingBoxProps = { selectedOption: { name: string; From 0d5f3e0a3413f0bc99930ba8e447a628319a367a Mon Sep 17 00:00:00 2001 From: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> Date: Wed, 20 Mar 2024 20:28:34 -0700 Subject: [PATCH 43/49] build --- web-ui/bun.lockb | Bin 426916 -> 426916 bytes web-ui/components/Staking/stakingBox.tsx | 1 + .../components/react/accountControlModal.tsx | 2 +- web-ui/package.json | 2 +- 4 files changed, 3 insertions(+), 2 deletions(-) diff --git a/web-ui/bun.lockb b/web-ui/bun.lockb index 3aabb02c4455634419098b8d6c856c18bd2775e8..d6413f3dc15283caad84f0e539a177bfc829465c 100755 GIT binary patch delta 299 zcmZ3|F14gxYJ#3Za>ik&t9ktParV~f^RnMh{A4Skrxz6|eT2F)Ci+c_c`pL#g#YcPL*XHgGdJwu+%-WwvdXW8Bxs&hYR z)yrpRPI{P>C|AE@4txA6|4A~3?j5xf`)3=lWkvJ7m`=|wpT*qa%Qm&^E@IrSyND^< zF7Y8N1H%pJ>0nzE(spHo?53s|({{y&OzGV132&ITC%j>P;?HO?eParXaC?Le%k~Hx S*5%5K7HtWv+Y;E8C<6dgr(@Ls delta 299 zcmZ3|F14gxYJ#4^qS~DX&klue*1XPn)#>kjwausV4i)`9vaa^&$uBeFm^(K51v?0{ zO0zODAV4;dzj=#;io|4zLW5?G$n6}Fj88orYPl<~J(Y7bF<8G}qs?*7d5`JSo*i9q zXi2W}z3-6`GdEAvYunk?vH$Lp*AvbxxUj^!d_n1|xjzHNKDA8vpH=N#+OE5Zal7s! zrfj>!IA#Wh8_^M9TNBiN=78*`rWn(9#fMDk-0cZ(n6@XpVSeJzXg+;o3X5=igbmB~ U2piVr%8cf139Q=^*p?^*09!_BqW}N^ diff --git a/web-ui/components/Staking/stakingBox.tsx b/web-ui/components/Staking/stakingBox.tsx index d51ff1c45..93c7ee681 100644 --- a/web-ui/components/Staking/stakingBox.tsx +++ b/web-ui/components/Staking/stakingBox.tsx @@ -269,6 +269,7 @@ export const StakingBox = ({ // Combine delegationsResponse with valoper entries from allBalances const combinedDelegations = safeDelegationsResponse.concat( + // @ts-ignore safeAllBalances .filter((balance) => balance.denom.includes('valoper')) .map((balance) => { diff --git a/web-ui/components/react/accountControlModal.tsx b/web-ui/components/react/accountControlModal.tsx index cb6bdc01d..5c9d8cc7a 100644 --- a/web-ui/components/react/accountControlModal.tsx +++ b/web-ui/components/react/accountControlModal.tsx @@ -176,7 +176,7 @@ export const AccountControlModal: React.FC = ({ isOpen // Continue with msgGrant if (correctAccount) { // Call msgRevokeBad - await authTx([msgRevokeBad], { + await authTx([revokeGrant], { fee, onSuccess: () => {}, }); diff --git a/web-ui/package.json b/web-ui/package.json index 942c78ce8..adcfa85f6 100644 --- a/web-ui/package.json +++ b/web-ui/package.json @@ -44,7 +44,7 @@ "interchain-query": "1.8.7", "next": "12.2.3", "next-transpile-modules": "^10.0.1", - "quicksilverjs": "1.3.7", + "quicksilverjs": "1.3.8", "react": "18.2.0", "react-dom": "18.2.0", "react-icons": "5.0.1", From 18256e82984668e5cba6533108c2eb73eef04078 Mon Sep 17 00:00:00 2001 From: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> Date: Wed, 20 Mar 2024 20:36:06 -0700 Subject: [PATCH 44/49] remove xcc warnings --- web-ui/components/Assets/assetsGrid.tsx | 3 --- 1 file changed, 3 deletions(-) diff --git a/web-ui/components/Assets/assetsGrid.tsx b/web-ui/components/Assets/assetsGrid.tsx index ca22a9249..041d45622 100644 --- a/web-ui/components/Assets/assetsGrid.tsx +++ b/web-ui/components/Assets/assetsGrid.tsx @@ -174,9 +174,6 @@ const AssetsGrid: React.FC = ({ assets, isWalletConnected, nonNa qAssets - - - {!isWalletConnected && ( Date: Thu, 21 Mar 2024 11:29:30 +0000 Subject: [PATCH 45/49] add dydx unstake notice, fix qasset amount --- web-ui/components/Staking/stakingBox.tsx | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/web-ui/components/Staking/stakingBox.tsx b/web-ui/components/Staking/stakingBox.tsx index 93c7ee681..8fc3420ba 100644 --- a/web-ui/components/Staking/stakingBox.tsx +++ b/web-ui/components/Staking/stakingBox.tsx @@ -530,7 +530,7 @@ export const StakingBox = ({ {!isZoneLoading ? ( - (Number(tokenAmount) * Number(zone?.redemptionRate || 1)).toFixed(2) + (Number(tokenAmount) / Number(zone?.redemptionRate || 1)).toFixed(2) ) : ( )} @@ -710,6 +710,17 @@ export const StakingBox = ({ {/* Unstake TabPanel */} + { selectedOption.value.toUpperCase() == "DYDX" && ( + + + + + DyDx unstaking will be live very soon! + + + + + ) || ( @@ -872,6 +883,7 @@ export const StakingBox = ({ + )} From 2ec0349418c20c63a7bbde7d281c731e27f76494 Mon Sep 17 00:00:00 2001 From: Joe Bowman Date: Thu, 21 Mar 2024 11:29:39 +0000 Subject: [PATCH 46/49] fix build issue --- web-ui/bun.lockb | Bin 426916 -> 426388 bytes web-ui/package.json | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/web-ui/bun.lockb b/web-ui/bun.lockb index d6413f3dc15283caad84f0e539a177bfc829465c..fc829ea076c477027513ec602a9da69cb48b18e7 100755 GIT binary patch delta 61242 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 Q57kocc1pazSV?~Rf4t(OcmMzZ delta 74035 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
Gbv_T9J&`wC9i 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 BifRA= diff --git a/web-ui/package.json b/web-ui/package.json index adcfa85f6..ad5e444c9 100644 --- a/web-ui/package.json +++ b/web-ui/package.json @@ -1,6 +1,6 @@ { "name": "bun-qs", - "version": "0.15.3", + "version": "0.15.4", "private": true, "homepage": "https://quicksilver-zone.github.io/quicksilver/", "scripts": { @@ -35,7 +35,7 @@ "bech32": "^2.0.0", "chain-registry": "1.28.0", "chakra-react-select": "^4.7.6", - "cosmjs-types": "0.5.0", + "cosmjs-types": "0.9.0", "crypto-js": "^4.2.0", "dayjs": "^1.11.9", "express": "^4.18.2", From d1cfc900f52a7945ecdfeb381ca7dedad238a6e6 Mon Sep 17 00:00:00 2001 From: Joe Bowman Date: Thu, 21 Mar 2024 11:48:12 +0000 Subject: [PATCH 47/49] fix proof_type field --- web-ui/components/Assets/rewardsClaim.tsx | 5 +---- web-ui/hooks/useQueries.ts | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/web-ui/components/Assets/rewardsClaim.tsx b/web-ui/components/Assets/rewardsClaim.tsx index b40883438..6ac13fb4b 100644 --- a/web-ui/components/Assets/rewardsClaim.tsx +++ b/web-ui/components/Assets/rewardsClaim.tsx @@ -102,10 +102,7 @@ export const RewardsClaim: React.FC = ({ address, onClose zone: message.zone, srcZone: message.src_zone, claimType: message.claim_type, - proofs: message.proofs.map((proof) => ({ - ...proof, - proofType: '', - })), + proofs: message.proofs, }); }); diff --git a/web-ui/hooks/useQueries.ts b/web-ui/hooks/useQueries.ts index e7cadb0e1..669fe0d31 100644 --- a/web-ui/hooks/useQueries.ts +++ b/web-ui/hooks/useQueries.ts @@ -86,7 +86,7 @@ interface Proof { ops: ProofOp[]; }; height: Long; - proofTypes: string; + proofType: string; } interface Message { From f577d186f34f14473076824db5d80a6f8a22a160 Mon Sep 17 00:00:00 2001 From: Joe Bowman Date: Thu, 21 Mar 2024 11:56:10 +0000 Subject: [PATCH 48/49] fix proof_type case --- web-ui/components/Assets/rewardsClaim.tsx | 5 ++++- web-ui/hooks/useQueries.ts | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/web-ui/components/Assets/rewardsClaim.tsx b/web-ui/components/Assets/rewardsClaim.tsx index 6ac13fb4b..22ab01d5d 100644 --- a/web-ui/components/Assets/rewardsClaim.tsx +++ b/web-ui/components/Assets/rewardsClaim.tsx @@ -102,7 +102,10 @@ export const RewardsClaim: React.FC = ({ address, onClose zone: message.zone, srcZone: message.src_zone, claimType: message.claim_type, - proofs: message.proofs, + proofs: message.proofs.map((proof) => ({ + ...proof, + proofType: proof.proof_type, + })), }); }); diff --git a/web-ui/hooks/useQueries.ts b/web-ui/hooks/useQueries.ts index 669fe0d31..a26ce6c8b 100644 --- a/web-ui/hooks/useQueries.ts +++ b/web-ui/hooks/useQueries.ts @@ -86,7 +86,7 @@ interface Proof { ops: ProofOp[]; }; height: Long; - proofType: string; + proof_type: string; } interface Message { From be4ba44fba65836d43693e953eed5462a119d14d Mon Sep 17 00:00:00 2001 From: Joe Bowman Date: Thu, 21 Mar 2024 12:02:23 +0000 Subject: [PATCH 49/49] fix proof_ops case --- web-ui/components/Assets/rewardsClaim.tsx | 1 + web-ui/hooks/useQueries.ts | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/web-ui/components/Assets/rewardsClaim.tsx b/web-ui/components/Assets/rewardsClaim.tsx index 22ab01d5d..ad536e53c 100644 --- a/web-ui/components/Assets/rewardsClaim.tsx +++ b/web-ui/components/Assets/rewardsClaim.tsx @@ -104,6 +104,7 @@ export const RewardsClaim: React.FC = ({ address, onClose claimType: message.claim_type, proofs: message.proofs.map((proof) => ({ ...proof, + proofOps: proof.proof_ops, proofType: proof.proof_type, })), }); diff --git a/web-ui/hooks/useQueries.ts b/web-ui/hooks/useQueries.ts index a26ce6c8b..9c1b105b3 100644 --- a/web-ui/hooks/useQueries.ts +++ b/web-ui/hooks/useQueries.ts @@ -82,7 +82,7 @@ interface ProofOp { interface Proof { key: Uint8Array; data: Uint8Array; - proofOps: { + proof_ops: { ops: ProofOp[]; }; height: Long;