Skip to content

Commit

Permalink
solve merge conflicts
Browse files Browse the repository at this point in the history
  • Loading branch information
aburkut committed Jun 22, 2023
2 parents 8d78beb + c233acc commit 0a2f78a
Show file tree
Hide file tree
Showing 6 changed files with 105 additions and 15 deletions.
2 changes: 2 additions & 0 deletions src/dex/generic-rfq/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -96,3 +96,5 @@ export type RFQFirmRateResponse = {
};

export class SlippageCheckError extends Error {}

export class TooStrictSlippageCheckError extends Error {}
10 changes: 8 additions & 2 deletions src/dex/hashflow/constants.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
// 7 days
export const HASHFLOW_BLACKLIST_TTL_S = 60 * 60 * 24 * 7;
import BigNumber from 'bignumber.js';

export const HASHFLOW_BLACKLIST_TTL_S = 60 * 60 * 24 * 7; // 7 days

export const HASHFLOW_MM_RESTRICT_TTL_S = 60 * 60;

Expand All @@ -14,3 +15,8 @@ export const HASHFLOW_API_MARKET_MAKERS_POLLING_INTERVAL_MS = 28 * 1000; // 28 s
export const HASHFLOW_API_URL = 'https://api.hashflow.com';

export const HASHFLOW_API_CLIENT_NAME = 'paraswap';

export const HASHFLOW_GAS_COST = 100_000;

export const HASHFLOW_MIN_SLIPPAGE_FACTOR_THRESHOLD_FOR_RESTRICTION =
new BigNumber('0.001');
50 changes: 45 additions & 5 deletions src/dex/hashflow/hashflow.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,11 @@ import {
HASHFLOW_API_MARKET_MAKERS_POLLING_INTERVAL_MS,
HASHFLOW_PRICES_CACHES_TTL_S,
HASHFLOW_MARKET_MAKERS_CACHES_TTL_S,
HASHFLOW_GAS_COST,
HASHFLOW_MIN_SLIPPAGE_FACTOR_THRESHOLD_FOR_RESTRICTION,
} from './constants';
import { BI_MAX_UINT256 } from '../../bigint-constants';
import { TooStrictSlippageCheckError } from '../generic-rfq/types';

export class Hashflow extends SimpleExchange implements IDex<HashflowData> {
readonly isStatePollingDex = true;
Expand Down Expand Up @@ -512,7 +515,7 @@ export class Hashflow extends SimpleExchange implements IDex<HashflowData> {
);

return {
gasCost: 100_000,
gasCost: HASHFLOW_GAS_COST,
exchange: this.dexKey,
data: { mm },
prices,
Expand Down Expand Up @@ -648,6 +651,9 @@ export class Hashflow extends SimpleExchange implements IDex<HashflowData> {

const slippageFactor = options.slippageFactor;

let isFailOnSlippage = false;
let slippageErrorMessage = '';

if (side === SwapSide.SELL) {
if (
quoteTokenAmount <
Expand All @@ -657,30 +663,58 @@ export class Hashflow extends SimpleExchange implements IDex<HashflowData> {
.toFixed(0),
)
) {
isFailOnSlippage = true;
const message = `${this.dexKey}-${this.network}: too much slippage on quote ${side} quoteTokenAmount ${quoteTokenAmount} / destAmount ${destAmount} < ${slippageFactor}`;
slippageErrorMessage = message;
this.logger.warn(message);
throw new SlippageCheckError(message);
}
} else {
if (quoteTokenAmount < destAmount) {
isFailOnSlippage = true;
// Won't receive enough assets
const message = `${this.dexKey}-${this.network}: too much slippage on quote ${side} quoteTokenAmount ${quoteTokenAmount} < destAmount ${destAmount}`;
slippageErrorMessage = message;
this.logger.warn(message);
throw new SlippageCheckError(message);
} else {
if (
baseTokenAmount >
BigInt(slippageFactor.times(srcAmount.toString()).toFixed(0))
) {
isFailOnSlippage = true;
const message = `${this.dexKey}-${
this.network
}: too much slippage on quote ${side} baseTokenAmount ${baseTokenAmount} / srcAmount ${srcAmount} > ${slippageFactor.toFixed()}`;
slippageErrorMessage = message;
this.logger.warn(message);
throw new SlippageCheckError(message);
}
}
}

let isTooStrictSlippage = false;
if (
isFailOnSlippage &&
side === SwapSide.SELL &&
new BigNumber(1)
.minus(slippageFactor)
.lt(HASHFLOW_MIN_SLIPPAGE_FACTOR_THRESHOLD_FOR_RESTRICTION)
) {
isTooStrictSlippage = true;
} else if (
isFailOnSlippage &&
side === SwapSide.BUY &&
slippageFactor
.minus(1)
.lt(HASHFLOW_MIN_SLIPPAGE_FACTOR_THRESHOLD_FOR_RESTRICTION)
) {
isTooStrictSlippage = true;
}

if (isFailOnSlippage && isTooStrictSlippage) {
throw new TooStrictSlippageCheckError(slippageErrorMessage);
} else if (isFailOnSlippage && !isTooStrictSlippage) {
throw new SlippageCheckError(slippageErrorMessage);
}

return [
{
...optimalSwapExchange,
Expand All @@ -703,7 +737,13 @@ export class Hashflow extends SimpleExchange implements IDex<HashflowData> {
);
await this.setBlacklist(options.txOrigin);
} else {
await this.restrictMM(mm);
if(e instanceof TooStrictSlippageCheckError) {
this.logger.warn(
`${this.dexKey}-${this.network}: Market Maker ${mm} failed to build transaction on side ${side} with too strict slippage. Skipping restriction`,
);
} else {
await this.restrictMM(mm);
}
}

throw e;
Expand Down
5 changes: 5 additions & 0 deletions src/dex/swaap-v2/constants.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import BigNumber from 'bignumber.js';

export const SWAAP_RFQ_PRICES_CACHES_TTL_S = 3;

export const SWAAP_RFQ_QUOTE_TIMEOUT_MS = 2000;
Expand Down Expand Up @@ -35,3 +37,6 @@ export const CALLER_SLOT = 160;
export const SWAAP_ORDER_TYPE_SELL = 1;

export const SWAAP_ORDER_TYPE_BUY = 2;

export const SWAAP_MIN_SLIPPAGE_FACTOR_THRESHOLD_FOR_RESTRICTION =
new BigNumber('0.001');
51 changes: 44 additions & 7 deletions src/dex/swaap-v2/swaap-v2.ts
Original file line number Diff line number Diff line change
Expand Up @@ -51,10 +51,11 @@ import {
SWAAP_TOKENS_CACHE_KEY,
SWAAP_ORDER_TYPE_SELL,
SWAAP_ORDER_TYPE_BUY,
SWAAP_MIN_SLIPPAGE_FACTOR_THRESHOLD_FOR_RESTRICTION,
} from './constants';
import { getPoolIdentifier, normalizeTokenAddress, getPairName } from './utils';
import { Method } from '../../dex-helper/irequest-wrapper';
import { SlippageCheckError } from '../generic-rfq/types';
import { SlippageCheckError, TooStrictSlippageCheckError } from '../generic-rfq/types';
import { BI_MAX_UINT256 } from '../../bigint-constants';

const BLACKLISTED = 'blacklisted';
Expand Down Expand Up @@ -487,6 +488,9 @@ export class SwaapV2 extends SimpleExchange implements IDex<SwaapV2Data> {
const quoteTokenAmount = BigInt(quote.amount);
const slippageFactor = options.slippageFactor;

let isFailOnSlippage = false;
let slippageErrorMessage = '';

if (side === SwapSide.SELL) {
if (
quoteTokenAmount <
Expand All @@ -496,23 +500,50 @@ export class SwaapV2 extends SimpleExchange implements IDex<SwaapV2Data> {
.toFixed(0),
)
) {
isFailOnSlippage = true;
const message = `${this.dexKey}-${this.network}: too much slippage on quote ${side} quoteTokenAmount ${quoteTokenAmount} / destAmount ${destAmount} < ${slippageFactor}`;
slippageErrorMessage = message;
this.logger.warn(message);
throw new SlippageCheckError(message);
}
} else {
if (
quoteTokenAmount >
BigInt(slippageFactor.times(srcAmount.toString()).toFixed(0))
) {
isFailOnSlippage = true;
const message = `${this.dexKey}-${
this.network
}: too much slippage on quote ${side} baseTokenAmount ${srcAmount} / srcAmount ${srcAmount} > ${slippageFactor.toFixed()}`;
slippageErrorMessage = message;
this.logger.warn(message);
throw new SlippageCheckError(message);
}
}

let isTooStrictSlippage = false;
if (
isFailOnSlippage &&
side === SwapSide.SELL &&
new BigNumber(1)
.minus(slippageFactor)
.lt(SWAAP_MIN_SLIPPAGE_FACTOR_THRESHOLD_FOR_RESTRICTION)
) {
isTooStrictSlippage = true;
} else if (
isFailOnSlippage &&
side === SwapSide.BUY &&
slippageFactor
.minus(1)
.lt(SWAAP_MIN_SLIPPAGE_FACTOR_THRESHOLD_FOR_RESTRICTION)
) {
isTooStrictSlippage = true;
}

if (isFailOnSlippage && isTooStrictSlippage) {
throw new TooStrictSlippageCheckError(slippageErrorMessage);
} else if (isFailOnSlippage && !isTooStrictSlippage) {
throw new SlippageCheckError(slippageErrorMessage);
}

const expiryAsBigInt = BigInt(quote.expiration);
const minDeadline = expiryAsBigInt > 0 ? expiryAsBigInt : BI_MAX_UINT256;

Expand All @@ -536,10 +567,16 @@ export class SwaapV2 extends SimpleExchange implements IDex<SwaapV2Data> {
`${this.dexKey}-${this.network}: Encountered restricted user=${options.txOrigin}. Adding to local blacklist cache`,
);
} else {
this.logger.warn(
`${this.dexKey}-${this.network}: protocol is restricted`,
);
await this.restrict();
if(e instanceof TooStrictSlippageCheckError) {
this.logger.warn(
`${this.dexKey}-${this.network}: failed to build transaction on side ${side} with too strict slippage. Skipping restriction`,
);
} else {
this.logger.warn(
`${this.dexKey}-${this.network}: protocol is restricted`,
);
await this.restrict();
}
}

throw e;
Expand Down
2 changes: 1 addition & 1 deletion tests/constants-e2e.ts
Original file line number Diff line number Diff line change
Expand Up @@ -899,7 +899,7 @@ export const Holders: {
MATIC: '0xe7804c37c13166fF0b37F5aE0BB07A3aEbb6e245',
DAI: '0x06959153B974D0D5fDfd87D561db6d8d4FA0bb0B',
WETH: '0x62ac55b745f9b08f1a81dcbbe630277095cf4be1',
WMATIC: '0xFffbCD322cEace527C8ec6Da8de2461C6D9d4e6e',
WMATIC: '0x016ba20db4b681f83e5fbbe0c433c96268ab5815',
AMWMATIC: '0x8832924854e3Cedb0a6Abf372e6CCFF9F7654332',
USDC: '0xf89d7b9c864f589bbf53a82105107622b35eaa40',
POPS: '0x2693b57ee51f4e2a26dfb339a911fa8731061f49',
Expand Down

0 comments on commit 0a2f78a

Please sign in to comment.