Skip to content

Commit 637e2f5

Browse files
committed
fixes
1 parent 4a320f9 commit 637e2f5

38 files changed

+1322
-729
lines changed

.npmrc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
@cowprotocol:registry=https://npm.pkg.github.com
2-
always-auth=true
3-
# registry=https://registry.npmjs.org/
4-
//npm.pkg.github.com/:_authToken=${GITHUB_TOKEN}
1+
# @cowprotocol:registry=https://npm.pkg.github.com
2+
# always-auth=true
3+
# # registry=https://registry.npmjs.org/
4+
# //npm.pkg.github.com/:_authToken=${GITHUB_TOKEN}

package.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,10 @@
3636
"@aave/react": "0.6.1",
3737
"@amplitude/analytics-browser": "^2.13.0",
3838
"@bgd-labs/aave-address-book": "^4.31.0",
39-
"@cowprotocol/sdk-app-data": "4.1.3-pr-614-5b1d24e9.0",
40-
"@cowprotocol/cow-sdk": "7.0.10-pr-614-5b1d24e9.0",
41-
"@cowprotocol/sdk-flash-loans": "0.0.1-pr-614-5b1d24e9.0",
42-
"@cowprotocol/sdk-viem-adapter": "0.1.2-pr-614-5b1d24e9.0",
39+
"@cowprotocol/sdk-app-data": "4.1.4",
40+
"@cowprotocol/cow-sdk": "7.0.11",
41+
"@cowprotocol/sdk-flash-loans": "1.1.0",
42+
"@cowprotocol/sdk-viem-adapter": "0.1.3",
4343
"@emotion/cache": "11.10.3",
4444
"@emotion/react": "11.10.4",
4545
"@emotion/server": "latest",

src/components/transactions/Repay/CollateralRepayActions.tsx

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,26 @@ export const CollateralRepayActions = ({
6464
protocolAction: ProtocolAction.repayCollateral,
6565
handleGetTxns: async (signature, deadline) => {
6666
const route = await buildTxFn();
67+
68+
console.log('paraswapRepayWithCollateral', {
69+
repayAllDebt,
70+
repayAmount,
71+
rateMode,
72+
repayWithAmount,
73+
74+
fromAssetData,
75+
poolReserve,
76+
symbol,
77+
isWrongNetwork,
78+
useFlashLoan,
79+
blocked,
80+
swapCallData: route.swapCallData,
81+
augustus: route.augustus,
82+
signature,
83+
deadline,
84+
signedAmount: calculateSignedAmount(repayWithAmount, fromAssetData.decimals),
85+
});
86+
6787
return paraswapRepayWithCollateral({
6888
repayAllDebt,
6989
repayAmount,
@@ -83,6 +103,25 @@ export const CollateralRepayActions = ({
83103
});
84104
},
85105
handleGetApprovalTxns: async () => {
106+
console.log('paraswapRepayWithCollateral', {
107+
repayAllDebt,
108+
repayAmount,
109+
rateMode,
110+
repayWithAmount,
111+
112+
fromAssetData,
113+
poolReserve,
114+
symbol,
115+
isWrongNetwork,
116+
useFlashLoan,
117+
blocked,
118+
swapCallData: '0x',
119+
augustus: API_ETH_MOCK_ADDRESS,
120+
signature: '0x',
121+
deadline: '0',
122+
signedAmount: calculateSignedAmount(repayWithAmount, fromAssetData.decimals),
123+
});
124+
86125
return paraswapRepayWithCollateral({
87126
repayAllDebt,
88127
repayAmount,

src/components/transactions/Repay/CollateralRepayModalContent.tsx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,13 @@ export function CollateralRepayModalContent({
257257
/>
258258
);
259259

260+
console.log('poolReserve', poolReserve.symbol, poolReserve.underlyingAsset);
261+
console.log(
262+
'collateralReserveData',
263+
collateralReserveData.symbol,
264+
collateralReserveData.underlyingAsset
265+
);
266+
260267
return (
261268
<>
262269
<AssetInput

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

Lines changed: 115 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,73 @@
1-
import { normalize } from '@aave/math-utils';
2-
import { getOrderToSign, LimitTradeParameters, OrderKind, TradingSdk } from '@cowprotocol/cow-sdk';
3-
import { AaveCollateralSwapSdk, HASH_ZERO } from '@cowprotocol/sdk-flash-loans';
1+
import { normalize, normalizeBN } from '@aave/math-utils';
2+
import { getOrderToSign, LimitTradeParameters, OrderKind } from '@cowprotocol/cow-sdk';
3+
import { AaveFlashLoanType, HASH_ZERO } from '@cowprotocol/sdk-flash-loans';
44
import { Trans } from '@lingui/macro';
5-
import { Dispatch, useEffect, useState } from 'react';
5+
import { Dispatch, useEffect, useMemo, useState } from 'react';
66
import { TxActionsWrapper } from 'src/components/transactions/TxActionsWrapper';
7+
import { calculateSignedAmount } from 'src/hooks/paraswap/common';
78
import { useModalContext } from 'src/hooks/useModal';
89
import { useRootStore } from 'src/store/root';
910
import { getErrorTextFromError, TxAction } from 'src/ui-config/errorMapping';
1011
import { useShallow } from 'zustand/react/shallow';
1112

1213
import { TrackAnalyticsHandlers } from '../../analytics/useTrackAnalytics';
13-
import { COW_PARTNER_FEE, FLASH_LOAN_FEE_BPS } from '../../constants/cow.constants';
14+
import { FLASH_LOAN_FEE_BPS } from '../../constants/cow.constants';
1415
import { APP_CODE_PER_SWAP_TYPE } from '../../constants/shared.constants';
15-
import { getCowAdapter } from '../../helpers/cow';
16-
import { calculateInstanceAddress } from '../../helpers/cow/adapters.helpers';
16+
import { getCowFlashLoanSdk, getCowTradingSdkByChainIdAndAppCode } from '../../helpers/cow';
17+
import { calculateInstanceAddress, OrderCore } from '../../helpers/cow/adapters.helpers';
1718
import { useSwapGasEstimation } from '../../hooks/useSwapGasEstimation';
18-
import { OrderType, SwapParams, SwapState } from '../../types';
19+
import { ExpiryToSecondsMap, OrderType, SwapParams, SwapState } from '../../types';
1920
import { useSwapTokenApproval } from '../approval/useSwapTokenApproval';
2021

22+
export const getCollateralSwapOrderCore = (state: SwapState): OrderCore => {
23+
// In limit orders, slippage is zero.
24+
let slippageInPercentage = state.orderType === OrderType.LIMIT ? 0 : Number(state.slippage) / 100;
25+
26+
console.log('slippageInPercentage', slippageInPercentage);
27+
slippageInPercentage = 2 * slippageInPercentage;
28+
console.log('slippageInPercentage', slippageInPercentage);
29+
30+
const sellToken = state.sourceToken;
31+
const buyToken = state.destinationToken;
32+
const side = state.side;
33+
34+
// If side is sell, we allow less buy amount to ensure sell amount
35+
// If side is buy, we allow more sell amount to ensure buy amount
36+
const sellAmount =
37+
side === 'sell'
38+
? normalizeBN(state.inputAmount, -sellToken.decimals)
39+
: normalizeBN(state.inputAmount, -sellToken.decimals)
40+
.multipliedBy(1 + slippageInPercentage)
41+
.decimalPlaces(0);
42+
const buyAmount =
43+
side === 'sell'
44+
? normalizeBN(state.outputAmount, -buyToken.decimals)
45+
.dividedBy(1 + slippageInPercentage)
46+
.decimalPlaces(0)
47+
: normalizeBN(state.outputAmount, -buyToken.decimals).decimalPlaces(0);
48+
49+
// TODO: REQUIRES FIX IN COW SDK
50+
// slippageBps = slippageInPercentage * 10000
51+
// const partnerFee = COW_PARTNER_FEE(state.sourceToken.symbol, state.destinationToken.symbol);
52+
53+
const partnerFee = {
54+
volumeBps: 0,
55+
recipient: '0x0000000000000000000000000000000000000000',
56+
};
57+
const slippageBps = 0;
58+
59+
return {
60+
chainId: state.chainId,
61+
sellAmount,
62+
buyAmount,
63+
sellToken,
64+
buyToken,
65+
side,
66+
slippageBps,
67+
partnerFee,
68+
};
69+
};
70+
2171
export const CollateralSwapActionsViaCowAdapters = ({
2272
params,
2373
state,
@@ -37,15 +87,36 @@ export const CollateralSwapActionsViaCowAdapters = ({
3787
const [precalculatedInstanceAddress, setPrecalculatedInstanceAddress] = useState<
3888
string | undefined
3989
>();
40-
const validTo = state.expiry || Math.floor(Date.now() / 1000) + 10 * 60; // 10 minutes
4190

42-
const slippageBps =
43-
state.orderType === OrderType.LIMIT ? 0 : Math.round(Number(state.slippage) * 100); // percent to bps
91+
const validTo = useMemo(
92+
() => Math.floor(Date.now() / 1000) + ExpiryToSecondsMap[state.expiry],
93+
[state.expiry]
94+
);
95+
96+
const orderCore = useMemo(
97+
() => getCollateralSwapOrderCore(state),
98+
[
99+
state.inputAmount,
100+
state.outputAmount,
101+
state.sourceToken,
102+
state.destinationToken,
103+
state.side,
104+
state.slippage,
105+
state.orderType,
106+
state.chainId,
107+
]
108+
);
109+
console.log('validTo', validTo, state.expiry);
44110

45111
// Pre-compute instance address
46112
useEffect(() => {
47113
if (state.chainId !== 100) return; // TODO: remove this once we have a supported chainId
48-
calculateInstanceAddress(state, user, validTo)
114+
calculateInstanceAddress({
115+
user,
116+
validTo,
117+
type: AaveFlashLoanType.CollateralSwap,
118+
orderCore,
119+
})
49120
.catch((error) => {
50121
console.error('calculateInstanceAddress error', error);
51122
setTxError(getErrorTextFromError(error, TxAction.MAIN_ACTION, true));
@@ -58,24 +129,23 @@ export const CollateralSwapActionsViaCowAdapters = ({
58129
.then((address) => {
59130
if (address) setPrecalculatedInstanceAddress(address);
60131
});
61-
}, [
62-
user,
63-
state.inputAmount,
64-
state.minimumReceived,
65-
state.destinationToken.underlyingAddress,
66-
state.sourceToken.symbol,
67-
state.destinationToken.symbol,
68-
state.slippage,
69-
state.autoSlippage,
70-
APP_CODE_PER_SWAP_TYPE[state.swapType],
71-
]);
132+
}, [user, validTo, orderCore, state.chainId]);
72133

73134
// Approval is aToken ERC20 Approval
135+
const amountToApprove = useMemo(
136+
() =>
137+
calculateSignedAmount(
138+
normalizeBN(orderCore.sellAmount.toString(), orderCore.sellToken.decimals).toString(),
139+
orderCore.sellToken.decimals
140+
),
141+
[orderCore.sellAmount, orderCore.sellToken.decimals]
142+
);
143+
74144
const { requiresApproval, approval, tryPermit, signatureParams } = useSwapTokenApproval({
75145
chainId: state.chainId,
76146
token: state.sourceToken.addressToSwap,
77147
symbol: state.sourceToken.symbol,
78-
amount: state.inputAmount,
148+
amount: normalize(amountToApprove.toString(), orderCore.sellToken.decimals),
79149
decimals: state.sourceToken.decimals,
80150
spender: precalculatedInstanceAddress,
81151
setState,
@@ -101,23 +171,13 @@ export const CollateralSwapActionsViaCowAdapters = ({
101171
});
102172

103173
try {
104-
if (!state.minimumReceived) return;
105-
106-
const sellAmount = normalize(state.inputAmount, -state.sourceToken.decimals);
107-
const buyAmount = normalize(state.minimumReceived, -state.destinationToken.decimals);
108-
109-
const adapter = await getCowAdapter(state.chainId);
110-
const tradingSdk = new TradingSdk(
111-
{
112-
chainId: state.chainId,
113-
appCode: APP_CODE_PER_SWAP_TYPE[state.swapType],
114-
env: 'staging',
115-
signer: adapter.signer,
116-
},
117-
{},
118-
adapter
174+
const tradingSdk = await getCowTradingSdkByChainIdAndAppCode(
175+
orderCore.chainId,
176+
APP_CODE_PER_SWAP_TYPE[state.swapType],
177+
'staging'
119178
);
120-
const flashLoanSdk = new AaveCollateralSwapSdk();
179+
const flashLoanSdk = await getCowFlashLoanSdk(orderCore.chainId);
180+
121181
const collateralPermit = signatureParams
122182
? {
123183
amount: signatureParams?.amount,
@@ -128,42 +188,41 @@ export const CollateralSwapActionsViaCowAdapters = ({
128188
}
129189
: undefined;
130190

131-
const partnerFee = COW_PARTNER_FEE(state.sourceToken.symbol, state.destinationToken.symbol);
132-
133191
const { flashLoanFeeAmount, sellAmountToSign } = flashLoanSdk.calculateFlashLoanAmounts({
134192
flashLoanFeePercent: FLASH_LOAN_FEE_BPS / 100,
135-
sellAmount: BigInt(sellAmount),
193+
sellAmount: BigInt(orderCore.sellAmount.toString()),
136194
});
137195

138196
const limitOrder: LimitTradeParameters = {
139-
sellToken: state.sourceToken.underlyingAddress,
140-
sellTokenDecimals: state.sourceToken.decimals,
141-
buyToken: state.destinationToken.underlyingAddress,
142-
buyTokenDecimals: state.destinationToken.decimals,
197+
sellToken: orderCore.sellToken.underlyingAddress,
198+
sellTokenDecimals: orderCore.sellToken.decimals,
199+
buyToken: orderCore.buyToken.underlyingAddress,
200+
buyTokenDecimals: orderCore.buyToken.decimals,
143201
sellAmount: sellAmountToSign.toString(),
144-
buyAmount: buyAmount.toString(),
145-
kind: state.side === 'buy' ? OrderKind.BUY : OrderKind.SELL,
202+
buyAmount: orderCore.buyAmount.toString(),
203+
kind: orderCore.side === 'buy' ? OrderKind.BUY : OrderKind.SELL,
146204
validTo,
147-
slippageBps,
148-
partnerFee,
205+
slippageBps: orderCore.slippageBps,
206+
partnerFee: orderCore.partnerFee,
149207
};
150208

151209
const orderToSign = getOrderToSign(
152-
{ chainId: state.chainId, from: user, networkCostsAmount: '0', isEthFlow: false },
210+
{ chainId: orderCore.chainId, from: user, networkCostsAmount: '0', isEthFlow: false },
153211
limitOrder,
154212
HASH_ZERO
155213
);
156214

157215
const orderPostParams = await flashLoanSdk.getOrderPostingSettings(
216+
AaveFlashLoanType.CollateralSwap,
158217
{
159-
chainId: state.chainId,
218+
chainId: orderCore.chainId,
160219
validTo,
161220
owner: user as `0x${string}`,
162-
flashLoanFeeAmount,
221+
flashLoanFeeAmount: flashLoanFeeAmount + BigInt(1), // Fix for flashloanfee rounding error
163222
},
164223
{
165-
sellAmount: BigInt(sellAmount),
166-
buyAmount: BigInt(buyAmount),
224+
sellAmount: BigInt(orderCore.sellAmount.toString()),
225+
buyAmount: BigInt(orderCore.buyAmount.toString()),
167226
orderToSign,
168227
collateralPermit,
169228
}

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,10 @@ export const CollateralSwapActionsViaParaswapAdapters = ({
5959
if (!state.swapRate || !isParaswapRates(state.swapRate))
6060
throw new Error('Route required to build transaction');
6161

62+
setMainTxState({
63+
txHash: undefined,
64+
loading: true,
65+
});
6266
const isMaxSelected = state.isMaxSelected;
6367
const optimalRateData = state.swapRate.optimalRateData;
6468

@@ -186,7 +190,8 @@ export const CollateralSwapActionsViaParaswapAdapters = ({
186190
chainId: state.chainId,
187191
}
188192
);
189-
// TODO: fix success
193+
trackingHandlers.trackSwap(); // TODO: check this happening in all actions
194+
params.invalidateAppState(); // TODO: check this happening in all actions
190195
setMainTxState({
191196
txHash: response.hash,
192197
loading: false,

0 commit comments

Comments
 (0)