Skip to content

Commit 9e11005

Browse files
committed
fix: wip
1 parent 80d5030 commit 9e11005

File tree

4 files changed

+113
-43
lines changed

4 files changed

+113
-43
lines changed

src/components/transactions/Switch/LimitSwitch.tsx

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,10 @@ export const LimitSwitch = ({
208208
rateToUse = 1 / rate.rate;
209209
}
210210

211-
const newOutputAmount = valueToBigNumber(amountToSet).multipliedBy(rateToUse).toString();
211+
const newOutputAmount = valueToBigNumber(amountToSet)
212+
.multipliedBy(rateToUse)
213+
.decimalPlaces(selectedOutputToken.decimals)
214+
.toString();
212215
setOutputAmount(newOutputAmount);
213216
debouncedOutputChange(newOutputAmount);
214217
}
@@ -241,7 +244,10 @@ export const LimitSwitch = ({
241244
rateToUse = 1 / rate.rate;
242245
}
243246

244-
const newInputAmount = valueToBigNumber(amountToSet).multipliedBy(rateToUse).toString();
247+
const newInputAmount = valueToBigNumber(amountToSet)
248+
.multipliedBy(rateToUse)
249+
.decimalPlaces(selectedInputToken.decimals)
250+
.toString();
245251
setInputAmount(newInputAmount);
246252
debouncedInputChange(newInputAmount);
247253
}
@@ -402,16 +408,18 @@ export const LimitSwitch = ({
402408

403409
if (rateFrom == selectedOutputToken) {
404410
rateAmount = Number(
405-
normalizeBN(switchRates.srcAmount, switchRates.srcDecimals).div(
406-
normalizeBN(switchRates.destAmount, switchRates.destDecimals)
407-
)
411+
normalizeBN(switchRates.srcAmount, switchRates.srcDecimals)
412+
.div(normalizeBN(switchRates.destAmount, switchRates.destDecimals))
413+
.decimalPlaces(selectedInputToken.decimals)
414+
.toString()
408415
);
409416
rateUsd = rateAmount * Number(switchRates.srcTokenPriceUsd);
410417
} else if (rateFrom == selectedInputToken) {
411418
rateAmount = Number(
412-
normalizeBN(switchRates.destAmount, switchRates.destDecimals).div(
413-
normalizeBN(switchRates.srcAmount, switchRates.srcDecimals)
414-
)
419+
normalizeBN(switchRates.destAmount, switchRates.destDecimals)
420+
.div(normalizeBN(switchRates.srcAmount, switchRates.srcDecimals))
421+
.decimalPlaces(selectedOutputToken.decimals)
422+
.toString()
415423
);
416424
rateUsd = rateAmount * Number(switchRates.destTokenPriceUsd);
417425
}
@@ -504,6 +512,7 @@ export const LimitSwitch = ({
504512
const [cowOpenOrdersTotalAmountFormatted, setCowOpenOrdersTotalAmountFormatted] = useState<
505513
string | undefined
506514
>(undefined);
515+
507516
useEffect(() => {
508517
if (
509518
switchProvider == 'cowprotocol' &&
@@ -790,6 +799,7 @@ export const LimitSwitch = ({
790799
outputToken={selectedOutputToken.address}
791800
inputName={selectedInputToken.name}
792801
orderKind="limit"
802+
limitOrderKind={limitOrderKind}
793803
outputName={selectedOutputToken.name}
794804
inputSymbol={selectedInputToken.symbol}
795805
outputSymbol={selectedOutputToken.symbol}
@@ -806,7 +816,7 @@ export const LimitSwitch = ({
806816
? {
807817
...switchRates,
808818
srcAmount: normalizeBN(
809-
debounceInputAmount || '0',
819+
debounceInputAmount ?? '0',
810820
-1 * selectedInputToken.decimals
811821
).toFixed(0),
812822
destAmount: normalizeBN(

src/components/transactions/Switch/MarketSwitch.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
import { normalize, normalizeBN } from '@aave/math-utils';
2-
import { OrderStatus, SupportedChainId, WRAPPED_NATIVE_CURRENCIES } from '@cowprotocol/cow-sdk';
2+
import {
3+
OrderKind,
4+
OrderStatus,
5+
SupportedChainId,
6+
WRAPPED_NATIVE_CURRENCIES,
7+
} from '@cowprotocol/cow-sdk';
38
import { SwitchVerticalIcon } from '@heroicons/react/outline';
49
import { Trans } from '@lingui/macro';
510
import { Box, CircularProgress, IconButton, SvgIcon, Typography } from '@mui/material';
@@ -621,6 +626,7 @@ export const MarketSwitch = ({
621626
outputName={selectedOutputToken.name}
622627
inputSymbol={selectedInputToken.symbol}
623628
outputSymbol={selectedOutputToken.symbol}
629+
limitOrderKind={OrderKind.SELL}
624630
orderKind="market"
625631
slippage={safeSlippage.toString()}
626632
setShowGasStation={setShowGasStation}

src/components/transactions/Switch/SwitchActions.tsx

Lines changed: 62 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,59 @@ 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
231241

242+
srcAmount = isNativeToken(inputToken)
243+
? switchRates.srcAmount
244+
: switchRates.amountAndCosts.afterNetworkCosts.buyAmount.toString();
245+
destAmount = destAmountWithSlippage;
246+
} else if (limitOrderKind === OrderKind.SELL) {
247+
const partnerFee = COW_PARTNER_FEE_IN_DECIMAL(inputSymbol, outputSymbol);
248+
const outputAmountBN = valueToBigNumber(switchRates.destAmount);
249+
const outputPartnerFeeAmount = outputAmountBN.multipliedBy(partnerFee).toString() || '0';
250+
const buyAmountWithoutPartnerFees =
251+
outputAmountBN.minus(outputPartnerFeeAmount).decimalPlaces(0).toString() || '0';
252+
253+
console.log('sell order');
254+
console.log('output amount', switchRates.destAmount);
255+
console.log('output partner fee amount', outputPartnerFeeAmount.toString());
256+
console.log('buy amount without partner fees', buyAmountWithoutPartnerFees.toString());
257+
258+
srcAmount = switchRates.srcAmount;
259+
destAmount = buyAmountWithoutPartnerFees;
260+
} else if (limitOrderKind === OrderKind.BUY) {
261+
const partnerFee = COW_PARTNER_FEE_IN_DECIMAL(inputSymbol, outputSymbol);
262+
const inputAmountBN = valueToBigNumber(switchRates.srcAmount);
263+
const inputPartnerFeeAmount = inputAmountBN.multipliedBy(partnerFee).toString() || '0';
264+
const sellAmountWithoutPartnerFees =
265+
inputAmountBN.minus(inputPartnerFeeAmount).decimalPlaces(0).toString() || '0';
266+
267+
console.log('input amount', inputAmountBN.toString());
268+
console.log('input partner fee amount', inputPartnerFeeAmount.toString());
269+
console.log('sell amount without partner fees', sellAmountWithoutPartnerFees.toString());
270+
271+
srcAmount = sellAmountWithoutPartnerFees;
272+
destAmount = switchRates.destAmount;
273+
} else {
274+
throw new Error('Invalid order kind'); // This should never happen.
275+
}
276+
277+
try {
232278
// If srcToken is native, we need to use the eth-flow instead of the orderbook
233279
if (isNativeToken(inputToken)) {
234280
const ethFlowTx = await populateEthFlowTx(
235-
switchRates.srcAmount,
236-
destAmountWithSlippage.toString(),
281+
srcAmount,
282+
destAmount,
237283
outputToken,
238284
user,
239285
validTo,
@@ -261,14 +307,15 @@ export const SwitchActions = ({
261307
});
262308

263309
const unsignerOrder = await getUnsignerOrder(
264-
switchRates.srcAmount,
265-
destAmountWithSlippage.toString(),
310+
srcAmount,
311+
destAmount,
266312
outputToken,
267313
user,
268314
chainId,
269315
inputSymbol,
270316
outputSymbol,
271-
validTo
317+
validTo,
318+
limitOrderKind
272319
);
273320
const calculatedOrderId = await calculateUniqueOrderId(chainId, unsignerOrder);
274321

@@ -311,17 +358,15 @@ export const SwitchActions = ({
311358
tokenDest: outputToken,
312359
chainId,
313360
user,
314-
amount: switchRates.srcAmount,
315361
tokenSrc: inputToken,
316362
tokenSrcDecimals: switchRates.srcDecimals,
317363
tokenDestDecimals: switchRates.destDecimals,
318-
afterNetworkCostsBuyAmount:
319-
orderKind === 'market'
320-
? switchRates.amountAndCosts.afterNetworkCosts.buyAmount.toString()
321-
: switchRates.destAmount, // TODO: check with cow team
364+
sellAmount: srcAmount,
365+
beforePartnerFeesBuyAmount: destAmount,
322366
slippageBps,
323367
inputSymbol,
324368
outputSymbol,
369+
kind: limitOrderKind,
325370
validTo,
326371
quote: switchRates.order,
327372
});
@@ -355,18 +400,16 @@ export const SwitchActions = ({
355400
tokenDest: outputToken,
356401
tokenDestDecimals: switchRates.destDecimals,
357402
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
403+
sellAmount: srcAmount,
404+
beforePartnerFeesBuyAmount: destAmount,
363405
slippageBps,
364406
chainId,
365407
user,
366408
provider,
367409
inputSymbol,
368-
validTo,
369410
outputSymbol,
411+
validTo,
412+
kind: limitOrderKind,
370413
});
371414
setMainTxState({
372415
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)