Commit a598a157 authored by Ian Lapham's avatar Ian Lapham Committed by GitHub

feat: Make pending txn status functional (#3193)

* update swap hooks to add swap txn confirmations

* fix: remove uneeded comments

* update with latest

* update utils to separate swap callback hooks

* create generic swap callabck to be used by both app and widget

* update app swap callback to use logic from lib

* update big number import

* add swap txn to state on submit

* remove redundant  fields in txn interfaces

* consolidate trade type logic
parent b0265c08
...@@ -9,6 +9,7 @@ import { useCallback, useMemo, useState } from 'react' ...@@ -9,6 +9,7 @@ import { useCallback, useMemo, useState } from 'react'
import ActionButton from '../../ActionButton' import ActionButton from '../../ActionButton'
import Column from '../../Column' import Column from '../../Column'
import Row from '../../Row' import Row from '../../Row'
import Summary from '../Summary'
const errorMessage = ( const errorMessage = (
<Trans> <Trans>
...@@ -77,9 +78,7 @@ function TransactionStatus({ tx, onClose }: TransactionStatusProps) { ...@@ -77,9 +78,7 @@ function TransactionStatus({ tx, onClose }: TransactionStatusProps) {
<Column flex padded gap={0.75} align="stretch" style={{ height: '100%' }}> <Column flex padded gap={0.75} align="stretch" style={{ height: '100%' }}>
<StatusHeader icon={Icon} iconColor={tx.receipt?.status ? 'success' : undefined}> <StatusHeader icon={Icon} iconColor={tx.receipt?.status ? 'success' : undefined}>
<ThemedText.Subhead1>{heading}</ThemedText.Subhead1> <ThemedText.Subhead1>{heading}</ThemedText.Subhead1>
{/* TODO(zzmp): Display actual transaction. <Summary input={tx.info.inputCurrencyAmount} output={tx.info.outputCurrencyAmount} />
<Summary input={tx.info.inputCurrency} output={tx.info.outputCurrency} />
*/}
</StatusHeader> </StatusHeader>
<TransactionRow flex> <TransactionRow flex>
<ThemedText.ButtonSmall> <ThemedText.ButtonSmall>
......
import { BigNumber } from '@ethersproject/bignumber' import { BigNumber } from '@ethersproject/bignumber'
import { Trans } from '@lingui/macro' import { Trans } from '@lingui/macro'
import { Token } from '@uniswap/sdk-core' import { Token, TradeType } from '@uniswap/sdk-core'
import { CHAIN_INFO } from 'constants/chainInfo' import { CHAIN_INFO } from 'constants/chainInfo'
import useCurrentBlockTimestamp from 'hooks/useCurrentBlockTimestamp' import useCurrentBlockTimestamp from 'hooks/useCurrentBlockTimestamp'
import { useERC20PermitFromTrade } from 'hooks/useERC20Permit' import { useERC20PermitFromTrade } from 'hooks/useERC20Permit'
...@@ -18,10 +18,11 @@ import { usePendingApproval } from 'lib/hooks/transactions' ...@@ -18,10 +18,11 @@ import { usePendingApproval } from 'lib/hooks/transactions'
import useActiveWeb3React from 'lib/hooks/useActiveWeb3React' import useActiveWeb3React from 'lib/hooks/useActiveWeb3React'
import { Link, Spinner } from 'lib/icons' import { Link, Spinner } from 'lib/icons'
import { transactionTtlAtom } from 'lib/state/settings' import { transactionTtlAtom } from 'lib/state/settings'
import { displayTxHashAtom, Field } from 'lib/state/swap' import { displayTxHashAtom, Field, independentFieldAtom } from 'lib/state/swap'
import { TransactionType } from 'lib/state/transactions' import { TransactionType } from 'lib/state/transactions'
import styled from 'lib/theme' import styled from 'lib/theme'
import { useCallback, useEffect, useMemo, useState } from 'react' import { useCallback, useEffect, useMemo, useState } from 'react'
import invariant from 'tiny-invariant'
import ActionButton from '../ActionButton' import ActionButton from '../ActionButton'
import Dialog from '../Dialog' import Dialog from '../Dialog'
...@@ -49,9 +50,11 @@ export default function SwapButton({ disabled }: SwapButtonProps) { ...@@ -49,9 +50,11 @@ export default function SwapButton({ disabled }: SwapButtonProps) {
allowedSlippage, allowedSlippage,
currencies: { [Field.INPUT]: inputCurrency }, currencies: { [Field.INPUT]: inputCurrency },
currencyBalances: { [Field.INPUT]: inputCurrencyBalance }, currencyBalances: { [Field.INPUT]: inputCurrencyBalance },
currencyAmounts: { [Field.INPUT]: inputCurrencyAmount }, currencyAmounts: { [Field.INPUT]: inputCurrencyAmount, [Field.OUTPUT]: outputCurrencyAmount },
} = useSwapInfo() } = useSwapInfo()
const independentField = useAtomValue(independentFieldAtom)
const [activeTrade, setActiveTrade] = useState<typeof trade.trade | undefined>() const [activeTrade, setActiveTrade] = useState<typeof trade.trade | undefined>()
useEffect(() => { useEffect(() => {
setActiveTrade((activeTrade) => activeTrade && trade.trade) setActiveTrade((activeTrade) => activeTrade && trade.trade)
...@@ -129,18 +132,25 @@ export default function SwapButton({ disabled }: SwapButtonProps) { ...@@ -129,18 +132,25 @@ export default function SwapButton({ disabled }: SwapButtonProps) {
//@TODO(ianlapham): add a loading state, process errors //@TODO(ianlapham): add a loading state, process errors
const setDisplayTxHash = useUpdateAtom(displayTxHashAtom) const setDisplayTxHash = useUpdateAtom(displayTxHashAtom)
const onConfirm = useCallback(() => { const onConfirm = useCallback(() => {
swapCallback?.() swapCallback?.()
.then((transactionResponse) => { .then((response) => {
// TODO(ianlapham): Add the swap tx to transactionsAtom setDisplayTxHash(response.hash)
console.log(transactionResponse) invariant(inputCurrencyAmount && outputCurrencyAmount)
setDisplayTxHash(transactionResponse.hash) addTransaction({
response,
type: TransactionType.SWAP,
tradeType: independentField === Field.INPUT ? TradeType.EXACT_INPUT : TradeType.EXACT_OUTPUT,
inputCurrencyAmount,
outputCurrencyAmount,
})
}) })
.catch((error) => { .catch((error) => {
//@TODO(ianlapham): add error handling //@TODO(ianlapham): add error handling
console.log(error) console.log(error)
}) })
}, [setDisplayTxHash, swapCallback]) }, [addTransaction, independentField, inputCurrencyAmount, outputCurrencyAmount, setDisplayTxHash, swapCallback])
return ( return (
<> <>
......
...@@ -28,7 +28,7 @@ export type DefaultAddress = string | { [chainId: number]: string | 'NATIVE' } | ...@@ -28,7 +28,7 @@ export type DefaultAddress = string | { [chainId: number]: string | 'NATIVE' } |
function getSwapTx(txs: { [hash: string]: Transaction }, hash?: string): Transaction<SwapTransactionInfo> | undefined { function getSwapTx(txs: { [hash: string]: Transaction }, hash?: string): Transaction<SwapTransactionInfo> | undefined {
if (hash) { if (hash) {
const tx = txs[hash] const tx = txs[hash]
if (tx.info.type === TransactionType.SWAP) { if (tx?.info?.type === TransactionType.SWAP) {
return tx as Transaction<SwapTransactionInfo> return tx as Transaction<SwapTransactionInfo>
} }
} }
......
import { TransactionReceipt, TransactionResponse } from '@ethersproject/abstract-provider' import { TransactionReceipt, TransactionResponse } from '@ethersproject/abstract-provider'
import { TradeType } from '@uniswap/sdk-core' import { Currency, CurrencyAmount, TradeType } from '@uniswap/sdk-core'
import { atomWithImmer } from 'jotai/immer' import { atomWithImmer } from 'jotai/immer'
export enum TransactionType { export enum TransactionType {
...@@ -21,20 +21,18 @@ export interface ApprovalTransactionInfo extends BaseTransactionInfo { ...@@ -21,20 +21,18 @@ export interface ApprovalTransactionInfo extends BaseTransactionInfo {
export interface SwapTransactionInfo extends BaseTransactionInfo { export interface SwapTransactionInfo extends BaseTransactionInfo {
type: TransactionType.SWAP type: TransactionType.SWAP
tradeType: TradeType tradeType: TradeType
inputCurrencyAddress: string inputCurrencyAmount: CurrencyAmount<Currency>
outputCurrencyAddress: string outputCurrencyAmount: CurrencyAmount<Currency>
} }
export interface InputSwapTransactionInfo extends SwapTransactionInfo { export interface InputSwapTransactionInfo extends SwapTransactionInfo {
tradeType: TradeType.EXACT_INPUT tradeType: TradeType.EXACT_INPUT
inputCurrencyAmount: string
expectedOutputCurrencyAmount: string expectedOutputCurrencyAmount: string
minimumOutputCurrencyAmount: string minimumOutputCurrencyAmount: string
} }
export interface OutputSwapTransactionInfo extends SwapTransactionInfo { export interface OutputSwapTransactionInfo extends SwapTransactionInfo {
tradeType: TradeType.EXACT_OUTPUT tradeType: TradeType.EXACT_OUTPUT
outputCurrencyAmount: string
expectedInputCurrencyAmount: string expectedInputCurrencyAmount: string
maximumInputCurrencyAmount: string maximumInputCurrencyAmount: string
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment