Skip to content

Commit

Permalink
fix weth pools discovery for hashflow
Browse files Browse the repository at this point in the history
  • Loading branch information
aburkut committed Oct 9, 2024
1 parent 3112d68 commit 3c26857
Show file tree
Hide file tree
Showing 5 changed files with 425 additions and 1,490 deletions.
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,8 @@
"@balancer-labs/sor": "4.1.1-beta.4",
"@bgd-labs/aave-address-book": "2.21.1",
"@ethersproject/abi": "^5.7.0",
"@hashflow/sdk": "1.2.4",
"@hashflow/taker-js": "0.3.4",
"@hashflow/sdk": "^2.2.7",
"@hashflow/taker-js": "^0.3.7",
"@paraswap/core": "2.4.0",
"async": "^3.2.4",
"axios": "0.27.2",
Expand Down
140 changes: 70 additions & 70 deletions src/dex/hashflow/hashflow-e2e.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,16 +33,16 @@ function testForNetwork(
const nativeTokenSymbol = NativeTokenSymbols[network];

const sideToContractMethods = new Map([
// [
// SwapSide.SELL,
// [
// // ContractMethod.swapExactAmountIn,
// ContractMethod.simpleSwap,
// ContractMethod.multiSwap,
// // ContractMethod.megaSwap,
// ],
// ],
[SwapSide.BUY, [ContractMethod.simpleBuy, ContractMethod.buy]],
[
SwapSide.SELL,
[
// ContractMethod.swapExactAmountIn,
ContractMethod.simpleSwap,
// ContractMethod.multiSwap,
// ContractMethod.megaSwap,
],
],
// [SwapSide.BUY, [ContractMethod.simpleBuy, ContractMethod.buy]],
// [SwapSide.BUY, [ContractMethod.swapExactAmountOut]],
]);

Expand All @@ -52,24 +52,24 @@ function testForNetwork(
contractMethods.forEach((contractMethod: ContractMethod) => {
describe(`${contractMethod}`, () => {
if (excludeNativeTokenTests) {
it(`${tokenASymbol} -> ${tokenBSymbol}`, async () => {
await testE2E(
tokens[tokenASymbol],
tokens[tokenBSymbol],
holders[tokenASymbol],
side === SwapSide.SELL ? tokenAAmount : tokenBAmount,
side,
dexKey,
contractMethod,
network,
provider,
undefined,
undefined,
undefined,
undefined,
sleepMs,
);
});
// it(`${tokenASymbol} -> ${tokenBSymbol}`, async () => {
// await testE2E(
// tokens[tokenASymbol],
// tokens[tokenBSymbol],
// holders[tokenASymbol],
// side === SwapSide.SELL ? tokenAAmount : tokenBAmount,
// side,
// dexKey,
// contractMethod,
// network,
// provider,
// undefined,
// undefined,
// undefined,
// undefined,
// sleepMs,
// );
// });
it(`${tokenBSymbol} -> ${tokenASymbol}`, async () => {
await testE2E(
tokens[tokenBSymbol],
Expand Down Expand Up @@ -194,44 +194,44 @@ describe('Hashflow E2E', () => {
);
});

describe('DAI -> USDC', () => {
const tokenASymbol: string = 'DAI';
const tokenBSymbol: string = 'USDC';

const tokenAAmount: string = '100000000000000000000';
const tokenBAmount: string = '100000000';
const nativeTokenAmount = '1000000000000000000';

testForNetwork(
network,
dexKey,
tokenASymbol,
tokenBSymbol,
tokenAAmount,
tokenBAmount,
nativeTokenAmount,
);
});

describe('WETH -> USDC', () => {
const tokenASymbol: string = 'WETH';
const tokenBSymbol: string = 'USDC';

const tokenAAmount: string = '100000000000000000';
const tokenBAmount: string = '1000000';
const nativeTokenAmount = '100000000000000000';

testForNetwork(
network,
dexKey,
tokenASymbol,
tokenBSymbol,
tokenAAmount,
tokenBAmount,
nativeTokenAmount,
true,
);
});
// describe('DAI -> USDC', () => {
// const tokenASymbol: string = 'DAI';
// const tokenBSymbol: string = 'USDC';
//
// const tokenAAmount: string = '100000000000000000000';
// const tokenBAmount: string = '100000000';
// const nativeTokenAmount = '1000000000000000000';
//
// testForNetwork(
// network,
// dexKey,
// tokenASymbol,
// tokenBSymbol,
// tokenAAmount,
// tokenBAmount,
// nativeTokenAmount,
// );
// });
//
// describe('WETH -> USDC', () => {
// const tokenASymbol: string = 'WETH';
// const tokenBSymbol: string = 'USDC';
//
// const tokenAAmount: string = '100000000000000000';
// const tokenBAmount: string = '1000000';
// const nativeTokenAmount = '100000000000000000';
//
// testForNetwork(
// network,
// dexKey,
// tokenASymbol,
// tokenBSymbol,
// tokenAAmount,
// tokenBAmount,
// nativeTokenAmount,
// true,
// );
// });
});
describe('Polygon_V6', () => {
const network = Network.POLYGON;
Expand Down Expand Up @@ -276,11 +276,11 @@ describe('Hashflow E2E', () => {
describe('Arbitrum', () => {
const network = Network.ARBITRUM;

const tokenASymbol: string = 'USDC';
const tokenBSymbol: string = 'WETH';
const tokenASymbol: string = 'ETH';
const tokenBSymbol: string = 'DAI';

const tokenAAmount: string = '100000000';
const tokenBAmount: string = '1000000000000000000';
const tokenAAmount: string = '300000000000000000';
const tokenBAmount: string = '100000000000000000000';
const nativeTokenAmount = '1000000000000000000';

testForNetwork(
Expand Down
49 changes: 24 additions & 25 deletions src/dex/hashflow/hashflow.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { ChainId, ZERO_ADDRESS } from '@hashflow/sdk';
import { ChainId } from '@hashflow/sdk';
import { Chain, ChainType, HashflowApi } from '@hashflow/taker-js';
import {
MarketMakersResponse,
Expand All @@ -12,12 +12,7 @@ import routerAbi from '../../abi/hashflow/HashflowRouter.abi.json';
import { BI_MAX_UINT256 } from '../../bigint-constants';
import { BN_0, BN_1, getBigNumberPow } from '../../bignumber-constants';
import * as CALLDATA_GAS_COST from '../../calldata-gas-cost';
import {
CACHE_PREFIX,
ETHER_ADDRESS,
Network,
SwapSide,
} from '../../constants';
import { CACHE_PREFIX, Network, NULL_ADDRESS, SwapSide } from '../../constants';
import { IDexHelper } from '../../dex-helper/idex-helper';
import { IDex } from '../../dex/idex';
import {
Expand Down Expand Up @@ -211,8 +206,8 @@ export class Hashflow extends SimpleExchange implements IDex<HashflowData> {
const pairs = levels[m]?.map(entry => entry.pair) ?? [];
return pairs.some(
p =>
_srcToken.address === p.baseToken.toLowerCase() &&
_destToken.address === p.quoteToken.toLowerCase(),
_srcToken.address.toLowerCase() === p.baseToken.toLowerCase() &&
_destToken.address.toLowerCase() === p.quoteToken.toLowerCase(),
);
})
.map(m =>
Expand Down Expand Up @@ -561,18 +556,22 @@ export class Hashflow extends SimpleExchange implements IDex<HashflowData> {
);
const chainId = this.network as ChainId;
let chainType: ChainType = 'evm';
const chain: Chain = { chainType, chainId };
const chain = { chainType, chainId } as Chain;

const _srcToken = this.dexHelper.config.wrapETH(srcToken);
const _destToken = this.dexHelper.config.wrapETH(destToken);

const _srcTokenAddress = _srcToken.address.toLowerCase();
const _destTokenAddress = _destToken.address.toLowerCase();

let rfq: RfqResponse;

try {
rfq = await this.api.requestQuote({
// sender is not passed, so for now ignore executionContractAddress
baseChain: chain,
baseToken: _srcToken.address,
quoteToken: _destToken.address,
baseToken: _srcTokenAddress,
quoteToken: _destTokenAddress,
...(side === SwapSide.SELL
? {
baseTokenAmount: optimalSwapExchange.srcAmount,
Expand All @@ -588,38 +587,38 @@ export class Hashflow extends SimpleExchange implements IDex<HashflowData> {
const message = `${this.dexKey}-${
this.network
}: Failed to fetch RFQ for ${this.getPairName(
_srcToken.address,
_destToken.address,
_srcTokenAddress,
_destTokenAddress,
)}: ${JSON.stringify(rfq)}`;
this.logger.warn(message);
throw new RfqError(message, `${rfq?.error?.code}` as ErrorCode);
} else if (!rfq.quotes[0].quoteData) {
const message = `${this.dexKey}-${
this.network
}: Failed to fetch RFQ for ${this.getPairName(
_srcToken.address,
_destToken.address,
_srcTokenAddress,
_destTokenAddress,
)}. Missing quote data`;
this.logger.warn(message);
throw new RfqError(message, 'MISSING_QUOTE_DATA');
} else if (!rfq.quotes[0].signature) {
const message = `${this.dexKey}-${
this.network
}: Failed to fetch RFQ for ${this.getPairName(
_srcToken.address,
_destToken.address,
_srcTokenAddress,
_destTokenAddress,
)}. Missing signature`;
this.logger.warn(message);
throw new RfqError(message, 'MISSING_SIGNATURE_DATA');
}

assert(
rfq.quotes[0].quoteData.baseToken === _srcToken.address,
`QuoteData baseToken=${rfq.quotes[0].quoteData.baseToken} is different from srcToken=${_srcToken.address}`,
rfq.quotes[0].quoteData.baseToken === _srcTokenAddress,
`QuoteData baseToken=${rfq.quotes[0].quoteData.baseToken} is different from srcToken=${_srcTokenAddress}`,
);
assert(
rfq.quotes[0].quoteData.quoteToken === _destToken.address,
`QuoteData baseToken=${rfq.quotes[0].quoteData.quoteToken} is different from srcToken=${_destToken.address}`,
rfq.quotes[0].quoteData.quoteToken === _destTokenAddress,
`QuoteData baseToken=${rfq.quotes[0].quoteData.quoteToken} is different from srcToken=${_destTokenAddress}`,
);

const expiryAsBigInt = BigInt(rfq.quotes[0].quoteData.quoteExpiry);
Expand Down Expand Up @@ -894,7 +893,7 @@ export class Hashflow extends SimpleExchange implements IDex<HashflowData> {
{
pool: quoteData.pool,
quoteToken: quoteData.quoteToken,
externalAccount: quoteData.externalAccount ?? ZERO_ADDRESS,
externalAccount: quoteData.externalAccount ?? NULL_ADDRESS,
baseTokenAmount: quoteData.baseTokenAmount,
quoteTokenAmount: quoteData.quoteTokenAmount,
quoteExpiry: quoteData.quoteExpiry,
Expand Down Expand Up @@ -958,7 +957,7 @@ export class Hashflow extends SimpleExchange implements IDex<HashflowData> {
const swapData = this.routerInterface.encodeFunctionData('tradeRFQT', [
[
quoteData.pool,
quoteData.externalAccount ?? ZERO_ADDRESS,
quoteData.externalAccount ?? NULL_ADDRESS,
quoteData.trader,
quoteData.effectiveTrader ?? quoteData.trader,
quoteData.baseToken,
Expand Down Expand Up @@ -1003,7 +1002,7 @@ export class Hashflow extends SimpleExchange implements IDex<HashflowData> {
const exchangeData = this.routerInterface.encodeFunctionData('tradeRFQT', [
[
quoteData.pool,
quoteData.externalAccount ?? ZERO_ADDRESS,
quoteData.externalAccount ?? NULL_ADDRESS,
quoteData.trader,
quoteData.effectiveTrader ?? quoteData.trader,
quoteData.baseToken,
Expand Down
8 changes: 4 additions & 4 deletions src/implementations/local-paraswap-sdk.ts
Original file line number Diff line number Diff line change
Expand Up @@ -200,12 +200,12 @@ export class LocalParaswapSDK implements IParaSwapSDK {
others: [],
side,
// For V5 tests, put Augustus V5 address here
// contractAddress: '0xDEF171Fe48CF0115B1d80b88dc8eAB59176FEe57',
contractAddress: '',
contractAddress: '0xDEF171Fe48CF0115B1d80b88dc8eAB59176FEe57',
// contractAddress: '',
tokenTransferProxy: '',
// For V5 tests, put V5 version here
// version: ParaSwapVersion.V5,
version: ParaSwapVersion.V6,
version: ParaSwapVersion.V5,
// version: ParaSwapVersion.V6,
};

const optimizedRate = this.pricingHelper.optimizeRate(unoptimizedRate);
Expand Down
Loading

0 comments on commit 3c26857

Please sign in to comment.