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' ;
44import { Trans } from '@lingui/macro' ;
5- import { Dispatch , useEffect , useState } from 'react' ;
5+ import { Dispatch , useEffect , useMemo , useState } from 'react' ;
66import { TxActionsWrapper } from 'src/components/transactions/TxActionsWrapper' ;
7+ import { calculateSignedAmount } from 'src/hooks/paraswap/common' ;
78import { useModalContext } from 'src/hooks/useModal' ;
89import { useRootStore } from 'src/store/root' ;
910import { getErrorTextFromError , TxAction } from 'src/ui-config/errorMapping' ;
1011import { useShallow } from 'zustand/react/shallow' ;
1112
1213import { 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' ;
1415import { 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' ;
1718import { useSwapGasEstimation } from '../../hooks/useSwapGasEstimation' ;
18- import { OrderType , SwapParams , SwapState } from '../../types' ;
19+ import { ExpiryToSecondsMap , OrderType , SwapParams , SwapState } from '../../types' ;
1920import { 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+
2171export 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 }
0 commit comments