Skip to content

Commit cdaeb5b

Browse files
committed
fix: wip
1 parent 80d5030 commit cdaeb5b

File tree

4 files changed

+97
-41
lines changed

4 files changed

+97
-41
lines changed

src/components/transactions/Switch/LimitSwitch.tsx

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ import { parseUnits } from 'viem';
3434
import { ChangeNetworkWarning } from '../Warnings/ChangeNetworkWarning';
3535
import { ParaswapErrorDisplay } from '../Warnings/ParaswapErrorDisplay';
3636
import { SupportedNetworkWithChainId } from './common';
37-
import { getOrders, isNativeToken } from './cowprotocol.helpers';
37+
import { COW_PARTNER_FEE, COW_PARTNER_FEE_IN_DECIMAL, getOrders, isNativeToken } from './cowprotocol.helpers';
3838
import { Expiry, ExpirySelector } from './ExpirySelector';
3939
import { NetworkSelector } from './NetworkSelector';
4040
import { SwitchPriceInput } from './PriceInput';
@@ -208,7 +208,7 @@ export const LimitSwitch = ({
208208
rateToUse = 1 / rate.rate;
209209
}
210210

211-
const newOutputAmount = valueToBigNumber(amountToSet).multipliedBy(rateToUse).toString();
211+
const newOutputAmount = valueToBigNumber(amountToSet).multipliedBy(rateToUse).decimalPlaces(selectedOutputToken.decimals).toString();
212212
setOutputAmount(newOutputAmount);
213213
debouncedOutputChange(newOutputAmount);
214214
}
@@ -241,7 +241,7 @@ export const LimitSwitch = ({
241241
rateToUse = 1 / rate.rate;
242242
}
243243

244-
const newInputAmount = valueToBigNumber(amountToSet).multipliedBy(rateToUse).toString();
244+
const newInputAmount = valueToBigNumber(amountToSet).multipliedBy(rateToUse).decimalPlaces(selectedInputToken.decimals).toString();
245245
setInputAmount(newInputAmount);
246246
debouncedInputChange(newInputAmount);
247247
}
@@ -404,14 +404,14 @@ export const LimitSwitch = ({
404404
rateAmount = Number(
405405
normalizeBN(switchRates.srcAmount, switchRates.srcDecimals).div(
406406
normalizeBN(switchRates.destAmount, switchRates.destDecimals)
407-
)
407+
).decimalPlaces(selectedInputToken.decimals).toString()
408408
);
409409
rateUsd = rateAmount * Number(switchRates.srcTokenPriceUsd);
410410
} else if (rateFrom == selectedInputToken) {
411411
rateAmount = Number(
412412
normalizeBN(switchRates.destAmount, switchRates.destDecimals).div(
413413
normalizeBN(switchRates.srcAmount, switchRates.srcDecimals)
414-
)
414+
).decimalPlaces(selectedOutputToken.decimals).toString()
415415
);
416416
rateUsd = rateAmount * Number(switchRates.destTokenPriceUsd);
417417
}
@@ -504,6 +504,7 @@ export const LimitSwitch = ({
504504
const [cowOpenOrdersTotalAmountFormatted, setCowOpenOrdersTotalAmountFormatted] = useState<
505505
string | undefined
506506
>(undefined);
507+
507508
useEffect(() => {
508509
if (
509510
switchProvider == 'cowprotocol' &&
@@ -578,7 +579,7 @@ export const LimitSwitch = ({
578579
const maxAmountFormatted = maxAmount
579580
? normalize(maxAmount.toString(), nativeDecimals).toString()
580581
: undefined;
581-
582+
582583
// Component
583584
return (
584585
<>
@@ -790,6 +791,7 @@ export const LimitSwitch = ({
790791
outputToken={selectedOutputToken.address}
791792
inputName={selectedInputToken.name}
792793
orderKind="limit"
794+
limitOrderKind={limitOrderKind}
793795
outputName={selectedOutputToken.name}
794796
inputSymbol={selectedInputToken.symbol}
795797
outputSymbol={selectedOutputToken.symbol}
@@ -806,7 +808,7 @@ export const LimitSwitch = ({
806808
? {
807809
...switchRates,
808810
srcAmount: normalizeBN(
809-
debounceInputAmount || '0',
811+
debounceInputAmount ?? '0',
810812
-1 * selectedInputToken.decimals
811813
).toFixed(0),
812814
destAmount: normalizeBN(

src/components/transactions/Switch/MarketSwitch.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { normalize, normalizeBN } from '@aave/math-utils';
2-
import { OrderStatus, SupportedChainId, WRAPPED_NATIVE_CURRENCIES } from '@cowprotocol/cow-sdk';
2+
import { OrderKind, OrderStatus, SupportedChainId, WRAPPED_NATIVE_CURRENCIES } from '@cowprotocol/cow-sdk';
33
import { SwitchVerticalIcon } from '@heroicons/react/outline';
44
import { Trans } from '@lingui/macro';
55
import { Box, CircularProgress, IconButton, SvgIcon, Typography } from '@mui/material';
@@ -621,6 +621,7 @@ export const MarketSwitch = ({
621621
outputName={selectedOutputToken.name}
622622
inputSymbol={selectedInputToken.symbol}
623623
outputSymbol={selectedOutputToken.symbol}
624+
limitOrderKind={OrderKind.SELL}
624625
orderKind="market"
625626
slippage={safeSlippage.toString()}
626627
setShowGasStation={setShowGasStation}

src/components/transactions/Switch/SwitchActions.tsx

Lines changed: 61 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { valueToBigNumber } from '@aave/math-utils';
33
import {
44
calculateUniqueOrderId,
55
COW_PROTOCOL_VAULT_RELAYER_ADDRESS,
6+
OrderKind,
67
SupportedChainId,
78
} from '@cowprotocol/cow-sdk';
89
import { Trans } from '@lingui/macro';
@@ -33,6 +34,7 @@ import { TxActionsWrapper } from '../TxActionsWrapper';
3334
import { APPROVAL_GAS_LIMIT } from '../utils';
3435
import {
3536
COW_APP_DATA,
37+
COW_PARTNER_FEE_IN_DECIMAL,
3638
getPreSignTransaction,
3739
getUnsignerOrder,
3840
isNativeToken,
@@ -54,6 +56,7 @@ interface SwitchProps {
5456
isWrongNetwork: boolean;
5557
chainId: number;
5658
orderKind: 'market' | 'limit';
59+
limitOrderKind: OrderKind;
5760
switchRates?: SwitchRatesType;
5861
inputName: string;
5962
outputName: string;
@@ -79,6 +82,7 @@ export const SwitchActions = ({
7982
outputSymbol,
8083
slippage: slippageInPercent = '0',
8184
orderKind,
85+
limitOrderKind,
8286
expiry,
8387
blocked,
8488
loading,
@@ -146,6 +150,8 @@ export const SwitchActions = ({
146150
}, [approvedAmount, inputAmount, isWrongNetwork]);
147151

148152
const action = async () => {
153+
if (!switchRates) return;
154+
149155
setMainTxState({ ...mainTxState, loading: true });
150156
if (isParaswapRates(switchRates)) {
151157
try {
@@ -221,19 +227,58 @@ export const SwitchActions = ({
221227
});
222228
}
223229
} else if (isCowProtocolRates(switchRates)) {
230+
const provider = await getEthersProvider(wagmiConfig, { chainId });
224231
const validTo = Math.floor(Date.now() / 1000) + (expiry ?? Expiry['Half hour']);
225-
try {
226-
const provider = await getEthersProvider(wagmiConfig, { chainId });
232+
const slippageBps = Math.round(Number(slippageInPercent) * 100 * 100); // percent to bps
233+
234+
let srcAmount;
235+
let destAmount;
236+
237+
if (orderKind === 'market') {
227238
const destAmountWithSlippage = valueToBigNumber(switchRates.destAmount)
228239
.multipliedBy(valueToBigNumber(1).minus(valueToBigNumber(slippageInPercent)))
229240
.toFixed(0);
230-
const slippageBps = Math.round(Number(slippageInPercent) * 100 * 100); // percent to bps
241+
242+
srcAmount = isNativeToken(inputToken) ? switchRates.srcAmount : switchRates.amountAndCosts.afterNetworkCosts.buyAmount.toString()
243+
destAmount = destAmountWithSlippage
244+
} else if (limitOrderKind === OrderKind.SELL) {
245+
246+
const partnerFee = COW_PARTNER_FEE_IN_DECIMAL(inputSymbol, outputSymbol);
247+
const outputAmountBN = valueToBigNumber(switchRates.destAmount);
248+
const outputPartnerFeeAmount = outputAmountBN.multipliedBy(partnerFee).toString() || '0'
249+
const buyAmountWithoutPartnerFees = outputAmountBN.minus(outputPartnerFeeAmount).decimalPlaces(0).toString() || '0'
250+
251+
console.log("sell order")
252+
console.log("output amount", switchRates.destAmount)
253+
console.log("output partner fee amount", outputPartnerFeeAmount.toString())
254+
console.log("buy amount without partner fees", buyAmountWithoutPartnerFees.toString())
255+
256+
257+
srcAmount = switchRates.srcAmount
258+
destAmount = buyAmountWithoutPartnerFees
259+
} else if (limitOrderKind === OrderKind.BUY) {
260+
const partnerFee = COW_PARTNER_FEE_IN_DECIMAL(inputSymbol, outputSymbol);
261+
const inputAmountBN = valueToBigNumber(switchRates.srcAmount);
262+
const inputPartnerFeeAmount = inputAmountBN.multipliedBy(partnerFee).toString() || '0'
263+
const sellAmountWithoutPartnerFees = inputAmountBN.minus(inputPartnerFeeAmount).decimalPlaces(0).toString() || '0'
264+
265+
console.log("input amount", inputAmountBN.toString())
266+
console.log("input partner fee amount", inputPartnerFeeAmount.toString())
267+
console.log("sell amount without partner fees", sellAmountWithoutPartnerFees.toString())
268+
269+
srcAmount = sellAmountWithoutPartnerFees
270+
destAmount = switchRates.destAmount
271+
} else {
272+
throw new Error('Invalid order kind') // This should never happen.
273+
}
274+
275+
try {
231276

232277
// If srcToken is native, we need to use the eth-flow instead of the orderbook
233278
if (isNativeToken(inputToken)) {
234279
const ethFlowTx = await populateEthFlowTx(
235-
switchRates.srcAmount,
236-
destAmountWithSlippage.toString(),
280+
srcAmount,
281+
destAmount,
237282
outputToken,
238283
user,
239284
validTo,
@@ -261,14 +306,15 @@ export const SwitchActions = ({
261306
});
262307

263308
const unsignerOrder = await getUnsignerOrder(
264-
switchRates.srcAmount,
265-
destAmountWithSlippage.toString(),
309+
srcAmount,
310+
destAmount,
266311
outputToken,
267312
user,
268313
chainId,
269314
inputSymbol,
270315
outputSymbol,
271-
validTo
316+
validTo,
317+
limitOrderKind,
272318
);
273319
const calculatedOrderId = await calculateUniqueOrderId(chainId, unsignerOrder);
274320

@@ -311,17 +357,15 @@ export const SwitchActions = ({
311357
tokenDest: outputToken,
312358
chainId,
313359
user,
314-
amount: switchRates.srcAmount,
315360
tokenSrc: inputToken,
316361
tokenSrcDecimals: switchRates.srcDecimals,
317362
tokenDestDecimals: switchRates.destDecimals,
318-
afterNetworkCostsBuyAmount:
319-
orderKind === 'market'
320-
? switchRates.amountAndCosts.afterNetworkCosts.buyAmount.toString()
321-
: switchRates.destAmount, // TODO: check with cow team
363+
sellAmount: srcAmount,
364+
beforePartnerFeesBuyAmount: destAmount,
322365
slippageBps,
323366
inputSymbol,
324367
outputSymbol,
368+
kind: limitOrderKind,
325369
validTo,
326370
quote: switchRates.order,
327371
});
@@ -355,18 +399,16 @@ export const SwitchActions = ({
355399
tokenDest: outputToken,
356400
tokenDestDecimals: switchRates.destDecimals,
357401
quote: switchRates.order,
358-
amount: switchRates.srcAmount,
359-
afterNetworkCostsBuyAmount:
360-
orderKind === 'market'
361-
? switchRates.amountAndCosts.afterNetworkCosts.buyAmount.toString()
362-
: switchRates.destAmount, // TODO: check with cow team
402+
sellAmount: srcAmount,
403+
beforePartnerFeesBuyAmount: destAmount,
363404
slippageBps,
364405
chainId,
365406
user,
366407
provider,
367408
inputSymbol,
368-
validTo,
369409
outputSymbol,
410+
validTo,
411+
kind: limitOrderKind,
370412
});
371413
setMainTxState({
372414
loading: false,

src/components/transactions/Switch/cowprotocol.helpers.ts

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,10 @@ export const COW_PARTNER_FEE = (tokenFromSymbol: string, tokenToSymbol: string)
7878
volumeBps: cowSymbolGroup(tokenFromSymbol) == cowSymbolGroup(tokenToSymbol) ? 15 : 25,
7979
recipient: COW_EVM_RECIPIENT,
8080
});
81+
export const COW_PARTNER_FEE_IN_DECIMAL = (tokenFromSymbol: string, tokenToSymbol: string) => {
82+
const volumeBps = COW_PARTNER_FEE(tokenFromSymbol, tokenToSymbol).volumeBps;
83+
return volumeBps / 10000;
84+
};
8185
export const COW_APP_DATA = (tokenFromSymbol: string, tokenToSymbol: string) => ({
8286
appCode: HEADER_WIDGET_APP_CODE, // todo: use ADAPTER_APP_CODE for contract adapters
8387
version: '1.4.0',
@@ -91,14 +95,15 @@ export type CowProtocolActionParams = {
9195
provider: JsonRpcProvider;
9296
chainId: number;
9397
user: string;
94-
amount: string;
98+
sellAmount: string;
9599
tokenDest: string;
96100
tokenSrc: string;
97101
tokenSrcDecimals: number;
98102
tokenDestDecimals: number;
99103
inputSymbol: string;
100104
outputSymbol: string;
101-
afterNetworkCostsBuyAmount: string;
105+
beforePartnerFeesBuyAmount: string;
106+
kind: OrderKind;
102107
slippageBps: number;
103108
validTo: number;
104109
};
@@ -108,12 +113,13 @@ export const getPreSignTransaction = async ({
108113
tokenDest,
109114
chainId,
110115
user,
111-
amount,
116+
sellAmount,
112117
tokenSrc,
113118
tokenSrcDecimals,
114119
tokenDestDecimals,
115-
afterNetworkCostsBuyAmount,
120+
beforePartnerFeesBuyAmount,
116121
slippageBps,
122+
kind,
117123
inputSymbol,
118124
outputSymbol,
119125
validTo,
@@ -137,9 +143,9 @@ export const getPreSignTransaction = async ({
137143
const orderResult = await tradingSdk.postLimitOrder(
138144
{
139145
owner: user as `0x${string}`,
140-
sellAmount: amount,
141-
buyAmount: afterNetworkCostsBuyAmount, // TODO: check partner fees on limit orders
142-
kind: OrderKind.SELL,
146+
sellAmount,
147+
buyAmount: beforePartnerFeesBuyAmount,
148+
kind,
143149
sellToken: tokenSrc,
144150
buyToken: tokenDest,
145151
slippageBps,
@@ -172,11 +178,12 @@ export const sendOrder = async ({
172178
tokenDest,
173179
chainId,
174180
user,
175-
amount,
181+
sellAmount,
176182
tokenSrc,
177183
tokenSrcDecimals,
178184
tokenDestDecimals,
179-
afterNetworkCostsBuyAmount,
185+
beforePartnerFeesBuyAmount,
186+
kind,
180187
slippageBps,
181188
inputSymbol,
182189
outputSymbol,
@@ -198,13 +205,16 @@ export const sendOrder = async ({
198205
throw new Error('Smart contract wallets should use presign.');
199206
}
200207

208+
console.log('kind', kind)
209+
console.log('sell amount sending to cow', sellAmount)
210+
console.log('before partner fees buy amount', beforePartnerFeesBuyAmount)
201211
return tradingSdk
202212
.postLimitOrder(
203213
{
204214
owner: user as `0x${string}`,
205-
sellAmount: amount,
206-
buyAmount: afterNetworkCostsBuyAmount, // TODO: check with cow team, this is being modified adding partner fees
207-
kind: OrderKind.SELL,
215+
sellAmount,
216+
buyAmount: beforePartnerFeesBuyAmount,
217+
kind,
208218
sellToken: tokenSrc,
209219
slippageBps,
210220
buyToken: tokenDest,
@@ -268,7 +278,8 @@ export const getUnsignerOrder = async (
268278
chainId: number,
269279
tokenFromSymbol: string,
270280
tokenToSymbol: string,
271-
validTo: number
281+
validTo: number,
282+
kind: OrderKind
272283
): Promise<UnsignedOrder> => {
273284
const metadataApi = new MetadataApi();
274285
const { appDataHex } = await metadataApi.getAppDataInfo(
@@ -284,7 +295,7 @@ export const getUnsignerOrder = async (
284295
feeAmount: '0',
285296
validTo,
286297
partiallyFillable: false,
287-
kind: OrderKind.SELL,
298+
kind,
288299
sellToken: WRAPPED_NATIVE_CURRENCIES[chainId as SupportedChainId].address.toLowerCase(),
289300
buyTokenBalance: BuyTokenDestination.ERC20,
290301
sellTokenBalance: SellTokenSource.ERC20,

0 commit comments

Comments
 (0)