Skip to content

Commit 71e1637

Browse files
committed
try fetch permit support from onchain fallback
1 parent 755c7c9 commit 71e1637

26 files changed

+457
-309
lines changed

src/components/transactions/Swap/actions/ActionsSkeleton.tsx

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { Trans } from '@lingui/macro';
22
import { Button, CircularProgress } from '@mui/material';
3+
import React, { useEffect, useRef, useState } from 'react';
34

45
import { SwapState } from '../types';
56

@@ -13,6 +14,36 @@ const stateToLoadingType = (state: SwapState): LoadingType => {
1314
export const ActionsLoading: React.FC<{ state: SwapState }> = ({ state }) => {
1415
const loadingType = stateToLoadingType(state);
1516

17+
// Timer logic for updating the loading text after 2 seconds when loadingType is 'quote'
18+
const [quoteTimeElapsed, setQuoteTimeElapsed] = useState(false);
19+
const timerRef = useRef<NodeJS.Timeout | null>(null);
20+
21+
useEffect(() => {
22+
if (loadingType === 'quote') {
23+
setQuoteTimeElapsed(false);
24+
if (timerRef.current) {
25+
clearTimeout(timerRef.current);
26+
}
27+
timerRef.current = setTimeout(() => {
28+
setQuoteTimeElapsed(true);
29+
}, 2000);
30+
} else {
31+
// In case the loading type changes, clear timer and reset state
32+
setQuoteTimeElapsed(false);
33+
if (timerRef.current) {
34+
clearTimeout(timerRef.current);
35+
timerRef.current = null;
36+
}
37+
}
38+
// Cleanup on unmount
39+
return () => {
40+
if (timerRef.current) {
41+
clearTimeout(timerRef.current);
42+
timerRef.current = null;
43+
}
44+
};
45+
}, [loadingType]);
46+
1647
return (
1748
<Button
1849
variant="contained"
@@ -23,7 +54,11 @@ export const ActionsLoading: React.FC<{ state: SwapState }> = ({ state }) => {
2354
>
2455
<CircularProgress color="inherit" size="16px" sx={{ mr: 2 }} />
2556
{loadingType === 'quote' ? (
26-
<Trans>Loading quote...</Trans>
57+
quoteTimeElapsed ? (
58+
<Trans>Comparing best rates...</Trans>
59+
) : (
60+
<Trans>Loading quote...</Trans>
61+
)
2762
) : loadingType === 'actions' ? (
2863
<Trans>Waiting for actions...</Trans>
2964
) : (

src/components/transactions/Swap/actions/CollateralSwap/CollateralSwapActionsViaCoWAdapters.tsx

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -98,16 +98,17 @@ export const CollateralSwapActionsViaCowAdapters = ({
9898
state.sellAmountToken?.underlyingAddress || state.sourceToken.addressToSwap;
9999
const disablePermitDueToActiveOrder = hasActiveOrderForSellToken(state.chainId, sellAssetAddress);
100100

101-
const { requiresApproval, approval, tryPermit, signatureParams } = useSwapTokenApproval({
102-
chainId: state.chainId,
103-
token: state.sourceToken.addressToSwap,
104-
symbol: state.sourceToken.symbol,
105-
amount: normalize(amountToApprove.toString(), state.sellAmountToken?.decimals ?? 18),
106-
decimals: state.sourceToken.decimals,
107-
spender: precalculatedInstanceAddress,
108-
setState,
109-
allowPermit: !disablePermitDueToActiveOrder, // CoW Adapters do support permit but avoid nonce reuse
110-
});
101+
const { requiresApproval, approval, tryPermit, signatureParams, loadingPermitData } =
102+
useSwapTokenApproval({
103+
chainId: state.chainId,
104+
token: state.sourceToken.addressToSwap,
105+
symbol: state.sourceToken.symbol,
106+
amount: normalize(amountToApprove.toString(), state.sellAmountToken?.decimals ?? 18),
107+
decimals: state.sourceToken.decimals,
108+
spender: precalculatedInstanceAddress,
109+
setState,
110+
allowPermit: !disablePermitDueToActiveOrder, // CoW Adapters do support permit but avoid nonce reuse
111+
});
111112

112113
// Use centralized gas estimation
113114
useSwapGasEstimation({
@@ -265,7 +266,7 @@ export const CollateralSwapActionsViaCowAdapters = ({
265266
),
266267
handleClick: action,
267268
}}
268-
fetchingData={state.actionsLoading}
269+
fetchingData={state.actionsLoading || loadingPermitData}
269270
blocked={state.actionsBlocked || !precalculatedInstanceAddress}
270271
tryPermit={tryPermit}
271272
permitInUse={disablePermitDueToActiveOrder}

src/components/transactions/Swap/actions/CollateralSwap/CollateralSwapActionsViaParaswapAdapters.tsx

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -40,16 +40,22 @@ export const CollateralSwapActionsViaParaswapAdapters = ({
4040
return calculateSignedAmount(state.sellAmountFormatted, state.sellAmountToken.decimals);
4141
}, [state.sellAmountFormatted, state.sellAmountToken]);
4242

43-
const { requiresApproval, signatureParams, approval, tryPermit, approvedAmount } =
44-
useSwapTokenApproval({
45-
chainId: state.chainId,
46-
token: state.sourceToken.addressToSwap, // aToken
47-
symbol: state.sourceToken.symbol,
48-
amount: normalize(amountToApprove.toString(), state.sourceToken?.decimals ?? 18),
49-
decimals: state.sourceToken.decimals,
50-
spender: currentMarketData.addresses.SWAP_COLLATERAL_ADAPTER,
51-
setState,
52-
});
43+
const {
44+
requiresApproval,
45+
signatureParams,
46+
approval,
47+
tryPermit,
48+
approvedAmount,
49+
loadingPermitData,
50+
} = useSwapTokenApproval({
51+
chainId: state.chainId,
52+
token: state.sourceToken.addressToSwap, // aToken
53+
symbol: state.sourceToken.symbol,
54+
amount: normalize(amountToApprove.toString(), state.sourceToken?.decimals ?? 18),
55+
decimals: state.sourceToken.decimals,
56+
spender: currentMarketData.addresses.SWAP_COLLATERAL_ADAPTER,
57+
setState,
58+
});
5359

5460
// Use centralized gas estimation
5561
useSwapGasEstimation({
@@ -253,7 +259,7 @@ export const CollateralSwapActionsViaParaswapAdapters = ({
253259
)
254260
}
255261
actionInProgressText={<Trans>Swapping {state.sourceToken.symbol} collateral</Trans>}
256-
fetchingData={state.actionsLoading}
262+
fetchingData={state.actionsLoading || loadingPermitData}
257263
errorParams={{
258264
loading: false,
259265
disabled: state.actionsBlocked,

src/components/transactions/Swap/actions/DebtSwap/DebtSwapActionsViaCoW.tsx

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -100,19 +100,20 @@ export const DebtSwapActionsViaCoW = ({
100100
const disablePermitDueToActiveOrder = hasActiveOrderForSellToken(state.chainId, sellAssetAddress);
101101

102102
// Approval is to the destination token via delegation Approval
103-
const { requiresApproval, approval, tryPermit, signatureParams } = useSwapTokenApproval({
104-
chainId: state.chainId,
105-
token: isProtocolSwapState(state)
106-
? state.destinationReserve.reserve.variableDebtTokenAddress
107-
: zeroAddress,
108-
symbol: state.destinationToken.symbol,
109-
amount: normalize(amountToApprove, state.sellAmountToken?.decimals ?? 18),
110-
decimals: state.destinationToken.decimals,
111-
spender: precalculatedInstanceAddress,
112-
setState,
113-
allowPermit: !disablePermitDueToActiveOrder, // avoid nonce reuse if active order present
114-
type: 'delegation', // Debt swap uses delegation
115-
});
103+
const { requiresApproval, approval, tryPermit, signatureParams, loadingPermitData } =
104+
useSwapTokenApproval({
105+
chainId: state.chainId,
106+
token: isProtocolSwapState(state)
107+
? state.destinationReserve.reserve.variableDebtTokenAddress
108+
: zeroAddress,
109+
symbol: state.destinationToken.symbol,
110+
amount: normalize(amountToApprove, state.sellAmountToken?.decimals ?? 18),
111+
decimals: state.destinationToken.decimals,
112+
spender: precalculatedInstanceAddress,
113+
setState,
114+
allowPermit: !disablePermitDueToActiveOrder, // avoid nonce reuse if active order present
115+
type: 'delegation', // Debt swap uses delegation
116+
});
116117

117118
// Use centralized gas estimation
118119
useSwapGasEstimation({
@@ -271,7 +272,7 @@ export const DebtSwapActionsViaCoW = ({
271272
),
272273
handleClick: action,
273274
}}
274-
fetchingData={state.actionsLoading}
275+
fetchingData={state.actionsLoading || loadingPermitData}
275276
blocked={state.actionsBlocked || !precalculatedInstanceAddress}
276277
tryPermit={tryPermit}
277278
permitInUse={disablePermitDueToActiveOrder}

src/components/transactions/Swap/actions/DebtSwap/DebtSwapActionsViaParaswap.tsx

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -62,18 +62,19 @@ export const DebtSwapActionsViaParaswap = ({
6262
state.sellAmountToken?.decimals || 18
6363
);
6464

65-
const { requiresApproval, approval, tryPermit, signatureParams } = useSwapTokenApproval({
66-
chainId: state.chainId,
67-
token: state.destinationReserve.reserve.variableDebtTokenAddress,
68-
symbol: state.destinationReserve.reserve.symbol,
69-
amount: maxNewDebtAmountToReceiveWithSlippage,
70-
decimals: state.destinationReserve.reserve.decimals,
71-
spender: currentMarketData.addresses.DEBT_SWITCH_ADAPTER,
72-
setState,
73-
allowPermit: currentMarketData.v3,
74-
margin: 0.25,
75-
type: 'delegation',
76-
});
65+
const { requiresApproval, approval, tryPermit, signatureParams, loadingPermitData } =
66+
useSwapTokenApproval({
67+
chainId: state.chainId,
68+
token: state.destinationReserve.reserve.variableDebtTokenAddress,
69+
symbol: state.destinationReserve.reserve.symbol,
70+
amount: maxNewDebtAmountToReceiveWithSlippage,
71+
decimals: state.destinationReserve.reserve.decimals,
72+
spender: currentMarketData.addresses.DEBT_SWITCH_ADAPTER,
73+
setState,
74+
allowPermit: currentMarketData.v3,
75+
margin: 0.25,
76+
type: 'delegation',
77+
});
7778

7879
// Use centralized gas estimation
7980
useSwapGasEstimation({
@@ -207,7 +208,7 @@ export const DebtSwapActionsViaParaswap = ({
207208
requiresApproval={requiresApproval}
208209
actionText={<Trans>Swap</Trans>}
209210
actionInProgressText={<Trans>Swapping</Trans>}
210-
fetchingData={state.ratesLoading}
211+
fetchingData={state.ratesLoading || loadingPermitData}
211212
errorParams={{
212213
loading: false,
213214
disabled: state.actionsBlocked || !approvalTxState?.success,

src/components/transactions/Swap/actions/RepayWithCollateral/RepayWithCollateralActionsViaCoW.tsx

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -102,16 +102,17 @@ export const RepayWithCollateralActionsViaCoW = ({
102102
const disablePermitDueToActiveOrder = hasActiveOrderForSellToken(state.chainId, sellAssetAddress);
103103

104104
// Approval is aToken ERC20 Approval
105-
const { requiresApproval, approval, tryPermit, signatureParams } = useSwapTokenApproval({
106-
chainId: state.chainId,
107-
token: state.destinationToken.addressToSwap, // aToken to repay with
108-
symbol: state.destinationToken.symbol,
109-
amount: normalize(amountToApprove.toString(), state.sellAmountToken?.decimals ?? 18),
110-
decimals: state.destinationToken.decimals,
111-
spender: precalculatedInstanceAddress,
112-
setState,
113-
allowPermit: !disablePermitDueToActiveOrder, // avoid nonce reuse if active order present
114-
});
105+
const { requiresApproval, approval, tryPermit, signatureParams, loadingPermitData } =
106+
useSwapTokenApproval({
107+
chainId: state.chainId,
108+
token: state.destinationToken.addressToSwap, // aToken to repay with
109+
symbol: state.destinationToken.symbol,
110+
amount: normalize(amountToApprove.toString(), state.sellAmountToken?.decimals ?? 18),
111+
decimals: state.destinationToken.decimals,
112+
spender: precalculatedInstanceAddress,
113+
setState,
114+
allowPermit: !disablePermitDueToActiveOrder, // avoid nonce reuse if active order present
115+
});
115116

116117
// Use centralized gas estimation
117118
useSwapGasEstimation({
@@ -276,7 +277,7 @@ export const RepayWithCollateralActionsViaCoW = ({
276277
),
277278
handleClick: action,
278279
}}
279-
fetchingData={state.actionsLoading}
280+
fetchingData={state.actionsLoading || loadingPermitData}
280281
blocked={state.actionsBlocked || !precalculatedInstanceAddress}
281282
tryPermit={tryPermit}
282283
permitInUse={disablePermitDueToActiveOrder}

src/components/transactions/Swap/actions/RepayWithCollateral/RepayWithCollateralActionsViaParaswap.tsx

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -62,16 +62,22 @@ export const RepayWithCollateralActionsViaParaswap = ({
6262
);
6363

6464
// Approval is aToken ERC20 Approval
65-
const { requiresApproval, signatureParams, approval, tryPermit, approvedAmount } =
66-
useSwapTokenApproval({
67-
chainId: state.chainId,
68-
token: state.destinationToken.addressToSwap, // aToken
69-
symbol: state.destinationToken.symbol,
70-
decimals: state.destinationToken.decimals,
71-
amount: collateralToRepayAmountToApprove.toString(),
72-
spender: currentMarketData.addresses.REPAY_WITH_COLLATERAL_ADAPTER,
73-
setState,
74-
});
65+
const {
66+
requiresApproval,
67+
signatureParams,
68+
approval,
69+
tryPermit,
70+
approvedAmount,
71+
loadingPermitData,
72+
} = useSwapTokenApproval({
73+
chainId: state.chainId,
74+
token: state.destinationToken.addressToSwap, // aToken
75+
symbol: state.destinationToken.symbol,
76+
decimals: state.destinationToken.decimals,
77+
amount: collateralToRepayAmountToApprove.toString(),
78+
spender: currentMarketData.addresses.REPAY_WITH_COLLATERAL_ADAPTER,
79+
setState,
80+
});
7581

7682
// Use centralized gas estimation
7783
useSwapGasEstimation({
@@ -239,7 +245,7 @@ export const RepayWithCollateralActionsViaParaswap = ({
239245
handleApproval={approval}
240246
actionText={<Trans>Repay {state.sourceReserve.reserve.symbol}</Trans>}
241247
actionInProgressText={<Trans>Repaying {state.sourceReserve.reserve.symbol}</Trans>}
242-
fetchingData={state.ratesLoading}
248+
fetchingData={state.ratesLoading || loadingPermitData}
243249
errorParams={{
244250
loading: false,
245251
disabled: state.actionsBlocked,

src/components/transactions/Swap/actions/SwapActions/SwapActionsViaCoW.tsx

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -73,19 +73,25 @@ export const SwapActionsViaCoW = ({
7373
state.sourceToken.addressToSwap
7474
);
7575

76-
const { requiresApproval, requiresApprovalReset, approval, tryPermit, signatureParams } =
77-
useSwapTokenApproval({
78-
chainId: state.chainId,
79-
token: state.sourceToken.addressToSwap,
80-
symbol: state.sourceToken.symbol,
81-
amount: state.sellAmountFormatted ?? '0',
82-
decimals: state.sourceToken.decimals,
83-
spender: isCowProtocolRates(state.swapRate)
84-
? COW_PROTOCOL_VAULT_RELAYER_ADDRESS[state.chainId as SupportedChainId]
85-
: undefined,
86-
setState,
87-
allowPermit: !disablePermitDueToActiveOrder,
88-
});
76+
const {
77+
requiresApproval,
78+
requiresApprovalReset,
79+
approval,
80+
tryPermit,
81+
signatureParams,
82+
loadingPermitData,
83+
} = useSwapTokenApproval({
84+
chainId: state.chainId,
85+
token: state.sourceToken.addressToSwap,
86+
symbol: state.sourceToken.symbol,
87+
amount: state.sellAmountFormatted ?? '0',
88+
decimals: state.sourceToken.decimals,
89+
spender: isCowProtocolRates(state.swapRate)
90+
? COW_PROTOCOL_VAULT_RELAYER_ADDRESS[state.chainId as SupportedChainId]
91+
: undefined,
92+
setState,
93+
allowPermit: !disablePermitDueToActiveOrder,
94+
});
8995

9096
// Use centralized gas estimation
9197
useSwapGasEstimation({
@@ -372,7 +378,7 @@ export const SwapActionsViaCoW = ({
372378
content: <Trans>Swap</Trans>,
373379
handleClick: action,
374380
}}
375-
fetchingData={state.actionsLoading}
381+
fetchingData={state.actionsLoading || loadingPermitData}
376382
blocked={state.actionsBlocked}
377383
tryPermit={tryPermit}
378384
permitInUse={disablePermitDueToActiveOrder}

src/components/transactions/Swap/actions/SwapActions/SwapActionsViaParaswap.tsx

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -41,18 +41,24 @@ export const SwapActionsViaParaswap = ({
4141

4242
const slippageInPercent = (Number(state.slippage) * 100).toString();
4343

44-
const { requiresApproval, requiresApprovalReset, signatureParams, approval, tryPermit } =
45-
useSwapTokenApproval({
46-
chainId: state.chainId,
47-
token: state.sourceToken.addressToSwap,
48-
symbol: state.sourceToken.symbol,
49-
amount: state.inputAmount,
50-
decimals: state.sourceToken.decimals,
51-
spender: isParaswapRates(state.swapRate)
52-
? state?.swapRate?.optimalRateData?.tokenTransferProxy
53-
: undefined,
54-
setState,
55-
});
44+
const {
45+
requiresApproval,
46+
requiresApprovalReset,
47+
signatureParams,
48+
approval,
49+
tryPermit,
50+
loadingPermitData,
51+
} = useSwapTokenApproval({
52+
chainId: state.chainId,
53+
token: state.sourceToken.addressToSwap,
54+
symbol: state.sourceToken.symbol,
55+
amount: state.inputAmount,
56+
decimals: state.sourceToken.decimals,
57+
spender: isParaswapRates(state.swapRate)
58+
? state?.swapRate?.optimalRateData?.tokenTransferProxy
59+
: undefined,
60+
setState,
61+
});
5662

5763
// Use centralized gas estimation
5864
useSwapGasEstimation({
@@ -200,7 +206,7 @@ export const SwapActionsViaParaswap = ({
200206
content: <Trans>Swap</Trans>,
201207
handleClick: action,
202208
}}
203-
fetchingData={state.actionsLoading}
209+
fetchingData={state.actionsLoading || loadingPermitData}
204210
blocked={state.actionsBlocked}
205211
tryPermit={tryPermit}
206212
/>

0 commit comments

Comments
 (0)