Commit fd808572 authored by Zach Pomerantz's avatar Zach Pomerantz Committed by GitHub

fix: mark permit not syncing if not permitted (#5706)

* fix: mark permit not syncing if not permitted

* fix: clarify naming

* fix: show approval when loading
parent a60a85db
...@@ -20,13 +20,13 @@ enum SyncState { ...@@ -20,13 +20,13 @@ enum SyncState {
export enum PermitState { export enum PermitState {
INVALID, INVALID,
LOADING, LOADING,
PERMIT_NEEDED, APPROVAL_OR_PERMIT_NEEDED,
PERMITTED, APPROVAL_LOADING,
APPROVED_AND_PERMITTED,
} }
export interface Permit { export interface Permit {
state: PermitState state: PermitState
isSyncing?: boolean
signature?: PermitSignature signature?: PermitSignature
callback?: () => Promise<{ callback?: () => Promise<{
response: ContractTransaction response: ContractTransaction
...@@ -81,9 +81,8 @@ export default function usePermit(amount?: CurrencyAmount<Token>, spender?: stri ...@@ -81,9 +81,8 @@ export default function usePermit(amount?: CurrencyAmount<Token>, spender?: stri
// Permit2 should be marked syncing from the time approval is submitted (pending) until it is // Permit2 should be marked syncing from the time approval is submitted (pending) until it is
// synced in tokenAllowance, to avoid re-prompting the user for an already-submitted approval. // synced in tokenAllowance, to avoid re-prompting the user for an already-submitted approval.
// It should *not* be marked syncing if not permitted, because the user must still take action.
const [syncState, setSyncState] = useState(SyncState.SYNCED) const [syncState, setSyncState] = useState(SyncState.SYNCED)
const isSyncing = isPermitted || isSigned ? false : syncState !== SyncState.SYNCED const isApprovalLoading = syncState !== SyncState.SYNCED
const hasPendingApproval = useHasPendingApproval(amount?.currency, PERMIT2_ADDRESS) const hasPendingApproval = useHasPendingApproval(amount?.currency, PERMIT2_ADDRESS)
useEffect(() => { useEffect(() => {
if (hasPendingApproval) { if (hasPendingApproval) {
...@@ -117,13 +116,25 @@ export default function usePermit(amount?: CurrencyAmount<Token>, spender?: stri ...@@ -117,13 +116,25 @@ export default function usePermit(amount?: CurrencyAmount<Token>, spender?: stri
return { state: PermitState.INVALID } return { state: PermitState.INVALID }
} else if (!tokenAllowance || !permitAllowance) { } else if (!tokenAllowance || !permitAllowance) {
return { state: PermitState.LOADING } return { state: PermitState.LOADING }
} else if (isAllowed) { } else if (!(isPermitted || isSigned)) {
if (isPermitted) { return { state: PermitState.APPROVAL_OR_PERMIT_NEEDED, callback }
return { state: PermitState.PERMITTED } } else if (!isAllowed) {
} else if (isSigned) { return {
return { state: PermitState.PERMITTED, signature } state: isApprovalLoading ? PermitState.APPROVAL_LOADING : PermitState.APPROVAL_OR_PERMIT_NEEDED,
callback,
} }
} else {
return { state: PermitState.APPROVED_AND_PERMITTED, signature: isPermitted ? undefined : signature }
} }
return { state: PermitState.PERMIT_NEEDED, isSyncing, callback } }, [
}, [amount, callback, isAllowed, isPermitted, isSigned, isSyncing, permitAllowance, signature, tokenAllowance]) amount,
callback,
isAllowed,
isApprovalLoading,
isPermitted,
isSigned,
permitAllowance,
signature,
tokenAllowance,
])
} }
...@@ -299,7 +299,7 @@ export default function Swap({ className }: { className?: string }) { ...@@ -299,7 +299,7 @@ export default function Swap({ className }: { className?: string }) {
permit2Enabled ? maximumAmountIn : undefined, permit2Enabled ? maximumAmountIn : undefined,
permit2Enabled && chainId ? UNIVERSAL_ROUTER_ADDRESS(chainId) : undefined permit2Enabled && chainId ? UNIVERSAL_ROUTER_ADDRESS(chainId) : undefined
) )
const isApprovalPending = permit.isSyncing const isApprovalLoading = permit.state === PermitState.APPROVAL_LOADING
const [isPermitPending, setIsPermitPending] = useState(false) const [isPermitPending, setIsPermitPending] = useState(false)
const [isPermitFailed, setIsPermitFailed] = useState(false) const [isPermitFailed, setIsPermitFailed] = useState(false)
const addTransaction = useTransactionAdder() const addTransaction = useTransactionAdder()
...@@ -786,10 +786,12 @@ export default function Swap({ className }: { className?: string }) { ...@@ -786,10 +786,12 @@ export default function Swap({ className }: { className?: string }) {
</ButtonError> </ButtonError>
</AutoColumn> </AutoColumn>
</AutoRow> </AutoRow>
) : isValid && permit.state === PermitState.PERMIT_NEEDED ? ( ) : isValid &&
(permit.state === PermitState.APPROVAL_OR_PERMIT_NEEDED ||
permit.state === PermitState.APPROVAL_LOADING) ? (
<ButtonYellow <ButtonYellow
onClick={updatePermit} onClick={updatePermit}
disabled={isPermitPending || isApprovalPending} disabled={isPermitPending || isApprovalLoading}
style={{ gap: 14 }} style={{ gap: 14 }}
> >
{isPermitPending ? ( {isPermitPending ? (
...@@ -806,7 +808,7 @@ export default function Swap({ className }: { className?: string }) { ...@@ -806,7 +808,7 @@ export default function Swap({ className }: { className?: string }) {
<Trans>Approval failed. Try again.</Trans> <Trans>Approval failed. Try again.</Trans>
</ThemedText.SubHeader> </ThemedText.SubHeader>
</> </>
) : isApprovalPending ? ( ) : isApprovalLoading ? (
<> <>
<Loader size="20px" stroke={theme.accentWarning} /> <Loader size="20px" stroke={theme.accentWarning} />
<ThemedText.SubHeader color="accentWarning"> <ThemedText.SubHeader color="accentWarning">
......
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