-
Notifications
You must be signed in to change notification settings - Fork 89
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* feat: track approval txs * refactor: update transactions * chore: add ms to deps * test: rm stale test * fix: comment usage of trade for optimized trade
- Loading branch information
Showing
11 changed files
with
335 additions
and
231 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,92 @@ | ||
import { Token } from '@uniswap/sdk-core' | ||
import { useAtomValue, useUpdateAtom } from 'jotai/utils' | ||
import useActiveWeb3React from 'lib/hooks/useActiveWeb3React' | ||
import { Transaction, TransactionInfo, transactionsAtom, TransactionType } from 'lib/state/transactions' | ||
import ms from 'ms.macro' | ||
import { useCallback } from 'react' | ||
import invariant from 'tiny-invariant' | ||
|
||
import useBlockNumber from '../useBlockNumber' | ||
import Updater from './updater' | ||
|
||
function isTransactionRecent(transaction: Transaction) { | ||
return Date.now() - transaction.addedTime < ms`1d` | ||
} | ||
|
||
export function usePendingTransactions() { | ||
const { chainId } = useActiveWeb3React() | ||
const txs = useAtomValue(transactionsAtom) | ||
return (chainId ? txs[chainId] : null) ?? {} | ||
} | ||
|
||
export function useAddTransaction() { | ||
const { chainId } = useActiveWeb3React() | ||
const blockNumber = useBlockNumber() | ||
const updateTxs = useUpdateAtom(transactionsAtom) | ||
|
||
return useCallback( | ||
(info: TransactionInfo) => { | ||
invariant(chainId) | ||
const txChainId = chainId | ||
const { hash } = info.response | ||
|
||
updateTxs((chainTxs) => { | ||
const txs = chainTxs[txChainId] || {} | ||
txs[hash] = { addedTime: new Date().getTime(), lastCheckedBlockNumber: blockNumber, info } | ||
chainTxs[chainId] = txs | ||
}) | ||
}, | ||
[blockNumber, chainId, updateTxs] | ||
) | ||
} | ||
|
||
export function useIsPendingApproval(token?: Token, spender?: string) { | ||
const { chainId } = useActiveWeb3React() | ||
const txs = useAtomValue(transactionsAtom) | ||
if (!chainId || !token || !spender) return false | ||
|
||
const chainTxs = txs[chainId] | ||
if (!chainTxs) return false | ||
|
||
return Object.values(chainTxs).some( | ||
(tx) => | ||
tx && | ||
tx.receipt === undefined && | ||
tx.info.type === TransactionType.APPROVAL && | ||
tx.info.tokenAddress === token.address && | ||
tx.info.spenderAddress === spender && | ||
isTransactionRecent(tx) | ||
) | ||
} | ||
|
||
export function TransactionsUpdater() { | ||
const pendingTransactions = usePendingTransactions() | ||
|
||
const updateTxs = useUpdateAtom(transactionsAtom) | ||
const onCheck = useCallback( | ||
({ chainId, hash, blockNumber }) => { | ||
updateTxs((txs) => { | ||
const tx = txs[chainId]?.[hash] | ||
if (tx) { | ||
tx.lastCheckedBlockNumber = tx.lastCheckedBlockNumber | ||
? Math.max(tx.lastCheckedBlockNumber, blockNumber) | ||
: blockNumber | ||
} | ||
}) | ||
}, | ||
[updateTxs] | ||
) | ||
const onReceipt = useCallback( | ||
({ chainId, hash, receipt }) => { | ||
updateTxs((txs) => { | ||
const tx = txs[chainId]?.[hash] | ||
if (tx) { | ||
tx.receipt = receipt | ||
} | ||
}) | ||
}, | ||
[updateTxs] | ||
) | ||
|
||
return <Updater pendingTransactions={pendingTransactions} onCheck={onCheck} onReceipt={onReceipt} /> | ||
} |
File renamed without changes.
Oops, something went wrong.