Skip to content

Commit

Permalink
Merge pull request #25 from dhedge/refactor/wagmi-reactivity
Browse files Browse the repository at this point in the history
Refactor/wagmi reactivity
  • Loading branch information
dimlbc authored Feb 24, 2024
2 parents b871169 + f11bad2 commit 51b8bfc
Show file tree
Hide file tree
Showing 16 changed files with 125 additions and 46 deletions.
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
"storybook": "pnpx nx run trading-widget:storybook"
},
"dependencies": {
"@tanstack/react-query-devtools": "^5.24.0",
"erc7412": "^0.2.2",
"lodash.chunk": "^4.2.0",
"lodash.debounce": "^4.0.8",
Expand Down
3 changes: 2 additions & 1 deletion packages/core-ui-kit/.eslintrc.json
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,8 @@
"@testing-library/jest-dom",
"@testing-library/dom",
"@testing-library/react",
"erc7412"
"erc7412",
"@tanstack/react-query-devtools"
]
}
]
Expand Down
2 changes: 1 addition & 1 deletion packages/core-ui-kit/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@dhedge/core-ui-kit",
"version": "2.0.6",
"version": "2.0.7",
"description": "Core UI Kit",
"type": "module",
"main": "dist/index.js",
Expand Down
4 changes: 2 additions & 2 deletions packages/core-ui-kit/src/const/default-data.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ import { AddressZero } from './web3'

export const DEFAULT_PRECISION = 18

export const DEFAULT_POLLING_INTERVAL = 23_000
export const SHORTEN_POLLING_INTERVAL = 15_000
export const DEFAULT_POLLING_INTERVAL = 59_000
export const SHORTEN_POLLING_INTERVAL = 30_000

export const DEFAULT_LOCK_TIME = formatDuration({ hours: 24 })
export const CUSTOM_LOCK_TIME = formatDuration({ minutes: 15 })
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import {
DEPOSIT_QUOTE_MULTIPLIER_CUSTOM,
DEPOSIT_QUOTE_MULTIPLIER_DEFAULT,
DEPOSIT_QUOTE_POOL_LOGIC_MULTIPLIER,
SHORTEN_POLLING_INTERVAL,
} from 'const'
import { usePoolTokenPrice } from 'hooks/pool'
import {
Expand All @@ -17,11 +18,7 @@ import {
} from 'hooks/state'
import { usePoolDepositAssetAddress } from 'hooks/trading/deposit'
import { useDebounce } from 'hooks/utils'
import {
useContractReadsErrorLogging,
useInvalidateOnBlock,
useReadContracts,
} from 'hooks/web3'
import { useContractReadsErrorLogging, useReadContracts } from 'hooks/web3'
import type { PoolConfig } from 'types/config.types'
import { getContractAddressById } from 'utils'

Expand Down Expand Up @@ -65,7 +62,7 @@ export const useDepositQuote = ({
.shiftedBy(sendToken.decimals)
.toFixed(0)

const { data, queryKey } = useReadContracts({
const { data } = useReadContracts({
contracts: [
{
address: getContractAddressById('easySwapper', chainId),
Expand All @@ -87,11 +84,10 @@ export const useDepositQuote = ({
!!sendToken.address &&
!!poolDepositAssetAddress &&
isEasySwapperTrading,
refetchInterval: SHORTEN_POLLING_INTERVAL,
},
})

useInvalidateOnBlock({ queryKey })

const depositQuote = data?.[0]?.result
useContractReadsErrorLogging(data)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,7 @@ import { useCallback, useEffect, useState } from 'react'

import { usePublicClient } from 'wagmi'

import {
AddressZero,
DEFAULT_POLLING_INTERVAL,
SHORTEN_POLLING_INTERVAL,
} from 'const'
import { AddressZero, DEFAULT_POLLING_INTERVAL } from 'const'
import { useTradingPanelModal, useTradingPanelPoolConfig } from 'hooks/state'
import type { Address, TransactionRequest } from 'types'
import {
Expand Down Expand Up @@ -97,8 +93,7 @@ export const useSynthetixV3OraclesUpdate = ({
const publicClient = usePublicClient({ chainId })
const [txData, setTxData] = useState<TransactionRequest | null>(null)
const { data: blockNumber } = useBlockNumber({
query: { enabled: !disabled, staleTime: SHORTEN_POLLING_INTERVAL },
watch: { enabled: !disabled, pollingInterval: DEFAULT_POLLING_INTERVAL },
query: { enabled: !disabled, refetchInterval: DEFAULT_POLLING_INTERVAL },
})
const updateTradingModal = useTradingPanelModal()[1]
const { sendTransaction } = useSendUpdateTransaction({ chainId })
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,10 @@ vi.mock('hooks/web3', () => ({
data: {},
error: null,
})),
useInvalidateTradingQueries: vi.fn(() => ({
invalidateAllowanceQueries: vi.fn(),
invalidateTradingQueries: vi.fn(),
})),
}))

describe('useTradingResultHandling', () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,10 @@ import {
useTradingPanelModal,
useTradingPanelTransactions,
} from 'hooks/state'
import { useWaitForTransactionReceipt } from 'hooks/web3'
import {
useInvalidateTradingQueries,
useWaitForTransactionReceipt,
} from 'hooks/web3'
import type { Address } from 'types/web3.types'
import { getExplorerLink } from 'utils'

Expand All @@ -24,10 +27,13 @@ export const useTradingResultHandling = () => {
const action = pendingTransaction?.action
const isTokenApproveTransaction = action === 'approve'
const chainId = pendingTransaction?.chainId
const { invalidateTradingQueries, invalidateAllowanceQueries } =
useInvalidateTradingQueries()

const { data, error } = useWaitForTransactionReceipt({
hash: txHash,
chainId,
pollingInterval: 15_000,
})

useEffect(() => {
Expand All @@ -43,6 +49,10 @@ export const useTradingResultHandling = () => {
updatePendingTransactions({ type: 'remove', status: 'success', txHash })
onTransactionSuccess?.(data, action, link)
}

isTokenApproveTransaction
? invalidateAllowanceQueries()
: invalidateTradingQueries()
}
}, [
data,
Expand All @@ -53,6 +63,8 @@ export const useTradingResultHandling = () => {
updatePendingTransactions,
updateTradingModal,
updateTradingMeta,
invalidateAllowanceQueries,
invalidateTradingQueries,
])

useEffect(() => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,7 @@ export const useWithdrawSlippage = ({
const isApproved = approvingStatus === 'success'
const insufficientBalance = useIsInsufficientBalance()
const { data: blockNumber } = useBlockNumber({
watch: { enabled: true, pollingInterval: SHORTEN_POLLING_INTERVAL },
query: { staleTime: SHORTEN_POLLING_INTERVAL },
query: { refetchInterval: SHORTEN_POLLING_INTERVAL },
})

const debouncedEstimateSell = useRef(noop)
Expand Down
1 change: 1 addition & 0 deletions packages/core-ui-kit/src/hooks/web3/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,3 +21,4 @@ export { useContractReadsErrorLogging } from './use-contract-reads-error-logging
export { useContractReadErrorLogging } from './use-contract-read-error-logging'
export { useStaticCallQuery } from './use-static-call-query'
export { useInvalidateOnBlock } from './use-invalidate-on-block'
export { useInvalidateTradingQueries } from './use-invalidate-trading-queries'
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { useEffect } from 'react'
import type { UseReadContractsReturnType } from 'wagmi'
import { useBlockNumber } from 'wagmi'

import { DEFAULT_POLLING_INTERVAL, SHORTEN_POLLING_INTERVAL } from 'const'
import { SHORTEN_POLLING_INTERVAL } from 'const'

export interface InvalidateOnBlockConfig {
queryKey: UseReadContractsReturnType['queryKey']
Expand All @@ -17,11 +17,9 @@ export const useInvalidateOnBlock = ({
const queryClient = useQueryClient()

const { data: blockNumber } = useBlockNumber({
watch: {
enabled: watch,
pollingInterval: DEFAULT_POLLING_INTERVAL,
query: {
refetchInterval: SHORTEN_POLLING_INTERVAL,
},
query: { staleTime: SHORTEN_POLLING_INTERVAL },
})

useEffect(() => {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
import type { QueryKey } from '@tanstack/react-query'
import { useQueryClient } from '@tanstack/react-query'
import { useCallback } from 'react'

type ContractReadQueryKey = ['readContract', { functionName?: string }]
type ContractReadsQueryKey = [
'readContracts',
{ contracts?: { functionName?: string }[] },
]

const tradingContractCalls = [
'balanceOf',
'getFundSummary',
'getFundComposition',
]
const allowanceContractCalls = ['allowance']

const filterQueries = (
queryKey: QueryKey,
contractCalls: string[],
): boolean => {
if (queryKey[0] === 'readContract') {
return contractCalls.includes(
(queryKey as ContractReadQueryKey)?.[1]?.functionName ?? '',
)
}
if (queryKey[0] === 'readContracts') {
const contracts = (queryKey as ContractReadsQueryKey)[1]?.contracts
return !!contracts?.some(({ functionName }) =>
contractCalls.includes(functionName ?? ''),
)
}
return false
}

export const useInvalidateTradingQueries = () => {
const queryClient = useQueryClient()

const invalidateAllowanceQueries = useCallback(() => {
queryClient.invalidateQueries({
predicate: ({ queryKey }) =>
filterQueries(queryKey, allowanceContractCalls),
})
}, [queryClient])

const invalidateTradingQueries = useCallback(() => {
queryClient.invalidateQueries({
predicate: ({ queryKey }) =>
filterQueries(queryKey, tradingContractCalls),
})
}, [queryClient])

return { invalidateAllowanceQueries, invalidateTradingQueries }
}
12 changes: 6 additions & 6 deletions packages/core-ui-kit/src/hooks/web3/use-token-allowance.test.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { erc20Abi } from 'abi'
import { optimism } from 'const'
import { DEFAULT_POLLING_INTERVAL, optimism } from 'const'
import * as web3Hooks from 'hooks/web3'
import { renderHook } from 'test-utils'

Expand Down Expand Up @@ -30,13 +30,13 @@ describe('useTokenAllowance', () => {
),
)

expect(web3Hooks.useInvalidateOnBlock).toHaveBeenCalledTimes(1)
expect(web3Hooks.useInvalidateOnBlock).toHaveBeenCalledWith({
queryKey: ['query'],
})
expect(web3Hooks.useReadContract).toHaveBeenCalledTimes(1)
expect(web3Hooks.useReadContract).toHaveBeenCalledWith(
expect.objectContaining({ functionName: 'allowance', abi: erc20Abi }),
expect.objectContaining({
functionName: 'allowance',
abi: erc20Abi,
query: { enabled: true, refetchInterval: DEFAULT_POLLING_INTERVAL },
}),
)
})
})
12 changes: 4 additions & 8 deletions packages/core-ui-kit/src/hooks/web3/use-token-allowance.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { erc20Abi } from 'abi'
import { SHORTEN_POLLING_INTERVAL } from 'const'
import { useInvalidateOnBlock, useReadContract } from 'hooks/web3'
import { DEFAULT_POLLING_INTERVAL } from 'const'
import { useReadContract } from 'hooks/web3'
import type { Address, ChainId } from 'types/web3.types'

export const useTokenAllowance = (
Expand All @@ -10,19 +10,15 @@ export const useTokenAllowance = (
chainId: ChainId,
skip: boolean,
): ReturnType<typeof useReadContract> => {
const query = useReadContract({
return useReadContract({
address: tokenAddress,
abi: erc20Abi,
functionName: 'allowance',
args: [ownerAddress, spenderAddress],
chainId,
query: {
enabled: !skip,
staleTime: SHORTEN_POLLING_INTERVAL,
refetchInterval: DEFAULT_POLLING_INTERVAL,
},
})

useInvalidateOnBlock({ queryKey: query.queryKey })

return query
}
6 changes: 5 additions & 1 deletion packages/core-ui-kit/src/providers/wagmi-provider.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
import { ReactQueryDevtools } from '@tanstack/react-query-devtools'
import type { FC, PropsWithChildren } from 'react'
import { createClient } from 'viem'
import { WagmiProvider as Provider, createConfig, http } from 'wagmi'
Expand Down Expand Up @@ -38,6 +39,9 @@ const queryClient = new QueryClient({

export const WagmiProvider: FC<PropsWithChildren> = ({ children }) => (
<Provider config={config}>
<QueryClientProvider client={queryClient}>{children}</QueryClientProvider>
<QueryClientProvider client={queryClient}>
{children}
<ReactQueryDevtools initialIsOpen={false} />
</QueryClientProvider>
</Provider>
)
26 changes: 22 additions & 4 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 51b8bfc

Please sign in to comment.