Skip to content

Commit 0eb6b07

Browse files
committed
fix: refactor get best trade to query amount again
1 parent 8fd86f2 commit 0eb6b07

File tree

5 files changed

+74
-31
lines changed

5 files changed

+74
-31
lines changed

packages/keeper-bots/src/converter-bot/TokenConverter.test.ts

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -77,9 +77,14 @@ describe("Token Converter", () => {
7777
(SmartRouter.getBestTrade as jest.Mock).mockImplementationOnce(() => null);
7878

7979
// eslint-disable-next-line @typescript-eslint/no-floating-promises
80-
expect(tokenConverter.getBestTrade(addresses.WBNB, addresses.USDC, 1000000000000000000000n)).rejects.toThrow(
81-
"No trade found",
82-
);
80+
expect(
81+
tokenConverter.getBestTrade(
82+
addresses.USDCPrimeConverter,
83+
addresses.WBNB,
84+
addresses.USDC,
85+
1000000000000000000000n,
86+
),
87+
).rejects.toThrow("No trade found");
8388
});
8489

8590
test("should handle thrown error", async () => {
@@ -96,9 +101,14 @@ describe("Token Converter", () => {
96101
throw new Error("Cannot find a valid swap route");
97102
});
98103
// eslint-disable-next-line @typescript-eslint/no-floating-promises
99-
expect(tokenConverter.getBestTrade(addresses.WBNB, addresses.USDC, 1000000000000000000000n)).rejects.toThrow(
100-
"Error getting best trade - Cannot find a valid swap route",
101-
);
104+
expect(
105+
tokenConverter.getBestTrade(
106+
addresses.USDCPrimeConverter,
107+
addresses.WBNB,
108+
addresses.USDC,
109+
1000000000000000000000n,
110+
),
111+
).rejects.toThrow("Error getting best trade - Cannot find a valid swap route");
102112
});
103113

104114
test("should return trade with low price impact", async () => {
@@ -110,7 +120,12 @@ describe("Token Converter", () => {
110120
(tokenConverter.publicClient.simulateContract as jest.Mock).mockImplementation(() => ({
111121
result: [1000000000000000000n, 1000000000000000000n],
112122
}));
113-
const trade = await tokenConverter.getBestTrade(addresses.WBNB, addresses.USDC, 1000000000000000000000n);
123+
const [trade] = await tokenConverter.getBestTrade(
124+
addresses.USDCPrimeConverter,
125+
addresses.WBNB,
126+
addresses.USDC,
127+
1000000000000000000000n,
128+
);
114129

115130
expect(trade.inputToken).toEqual({
116131
address: "0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c",
@@ -176,7 +191,12 @@ describe("Token Converter", () => {
176191
return new Percent(9n, 1000n);
177192
});
178193

179-
const trade = await pancakeSwapProvider.getBestTrade(addresses.WBNB, addresses.USDC, 1000000000000000000000n);
194+
const [trade] = await pancakeSwapProvider.getBestTrade(
195+
addresses.USDCPrimeConverter,
196+
addresses.WBNB,
197+
addresses.USDC,
198+
1000000000000000000000n,
199+
);
180200

181201
expect(trade.inputToken).toEqual({
182202
address: "0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c",

packages/keeper-bots/src/converter-bot/TokenConverter.ts

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,13 @@ export class TokenConverter extends BotBase {
5050
* @param amount The amount we will receive from the converter of swapFrom
5151
* @returns [SmartRouterTrade, [amount transferred out of converter, amount transferred in]]
5252
*/
53-
async getBestTrade(swapFrom: Address, swapTo: Address, amount: bigint): Promise<TradeRoute> {
54-
return this.swapProvider.getBestTrade(swapFrom, swapTo, amount);
53+
async getBestTrade(
54+
tokenConverter: Address,
55+
swapFrom: Address,
56+
swapTo: Address,
57+
amount: bigint,
58+
): Promise<[TradeRoute, bigint]> {
59+
return this.swapProvider.getBestTrade(tokenConverter, swapFrom, swapTo, amount);
5560
}
5661

5762
/**
@@ -384,7 +389,7 @@ export class TokenConverter extends BotBase {
384389
async prepareConversion(tokenConverter: Address, assetOut: Address, assetIn: Address, amountOut: bigint) {
385390
let error;
386391
let trade;
387-
let tradeAmount;
392+
let amount;
388393

389394
// [amount transferred out of converter, amount transferred in]
390395
const { result: updatedAmountIn } = await this.publicClient.simulateContract({
@@ -395,14 +400,13 @@ export class TokenConverter extends BotBase {
395400
});
396401

397402
try {
398-
trade = await this.getBestTrade(assetOut, assetIn, updatedAmountIn[1]);
403+
[trade, amount] = await this.getBestTrade(tokenConverter, assetOut, assetIn, updatedAmountIn[0]);
399404
} catch (e) {
400405
error = (e as Error).message;
401406
} finally {
402-
let tradeContext: Pick<GetBestTradeMessage["context"], "tradeAmount" | "swap"> = {};
403-
if (trade && tradeAmount) {
407+
let tradeContext: Pick<GetBestTradeMessage["context"], "swap"> = {};
408+
if (trade) {
404409
tradeContext = {
405-
tradeAmount: { amountOut: tradeAmount && tradeAmount[0], amountIn: tradeAmount && tradeAmount[1] },
406410
swap: {
407411
inputToken: {
408412
amount: trade.inputToken.amount.toFixed(0),
@@ -428,13 +432,13 @@ export class TokenConverter extends BotBase {
428432
});
429433
}
430434

431-
if (trade && tradeAmount) {
435+
if (trade && amount) {
432436
// the difference between the token you get from TokenConverter and the token you pay to the MM
433-
const minIncome = new Fraction(tradeAmount[0], 1).subtract(trade.inputToken.amount);
437+
const minIncome = new Fraction(amount).subtract(trade.inputToken.amount);
434438
return {
435439
trade,
436-
amount: tradeAmount[0],
437-
minIncome: BigInt(minIncome.toFixed(0, { groupSeparator: "" })),
440+
amount: trade.inputToken.amount.quotient,
441+
minIncome: minIncome.quotient,
438442
};
439443
}
440444
}

packages/keeper-bots/src/providers/pancake-swap.ts

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { Address, Hex, encodePacked, erc20Abi } from "viem";
55

66
import getConfig from "../config";
77
import type { SUPPORTED_CHAINS } from "../config/chains";
8+
import { tokenConverterAbi } from "../config/abis/generated";
89
import { chains } from "../config/chains";
910
import { ConverterBotMessage } from "../converter-bot/types";
1011
import { TradeRoute } from "../types";
@@ -22,9 +23,9 @@ class PancakeSwapProvider extends SwapProvider {
2223
super({ subscriber });
2324
this.v3PancakeSubgraphClient = config.swapSubgraphUrl
2425
? createClient({
25-
url: config.swapSubgraphUrl,
26-
requestPolicy: "network-only",
27-
})
26+
url: config.swapSubgraphUrl,
27+
requestPolicy: "network-only",
28+
})
2829
: undefined;
2930

3031
this.quoteProvider = SmartRouter.createQuoteProvider({ onChainProvider: () => this.publicClient });
@@ -66,10 +67,18 @@ class PancakeSwapProvider extends SwapProvider {
6667
throw new Error(`Unable to fetch token details for ${address}`);
6768
}
6869

69-
async getBestTrade(swapFrom: Address, swapTo: Address, amount: bigint): Promise<TradeRoute> {
70+
async getBestTrade(tokenConverter: Address, swapFrom: Address, swapTo: Address, amount: bigint): Promise<[TradeRoute, bigint]> {
7071
const swapFromToken = await this.getToken(swapFrom);
7172
const swapToToken = await this.getToken(swapTo);
7273

74+
// [amount transferred out of converter, amount transferred in]
75+
const { result: updatedAmountIn } = await this.publicClient.simulateContract({
76+
address: tokenConverter,
77+
abi: tokenConverterAbi,
78+
functionName: "getUpdatedAmountIn",
79+
args: [amount, swapTo, swapFrom],
80+
});
81+
7382
const candidatePools = await SmartRouter.getV3CandidatePools({
7483
onChainProvider: () => this.publicClient,
7584
subgraphProvider: () => this.v3PancakeSubgraphClient,
@@ -82,7 +91,7 @@ class PancakeSwapProvider extends SwapProvider {
8291

8392
try {
8493
const response = await SmartRouter.getBestTrade(
85-
CurrencyAmount.fromRawAmount(swapToToken, amount),
94+
CurrencyAmount.fromRawAmount(swapToToken, updatedAmountIn[1]),
8695
swapFromToken,
8796
TradeType.EXACT_OUTPUT,
8897
{
@@ -94,6 +103,7 @@ class PancakeSwapProvider extends SwapProvider {
94103
quoterOptimization: true,
95104
},
96105
);
106+
97107
if (response) {
98108
trade = {
99109
inputToken: {
@@ -128,9 +138,9 @@ class PancakeSwapProvider extends SwapProvider {
128138
},
129139
});
130140

131-
return this.getBestTrade(swapFrom, swapTo, (amount * 75n) / 100n);
141+
return this.getBestTrade(tokenConverter, swapFrom, swapTo, (updatedAmountIn[1] * 75n) / 100n);
132142
}
133-
return trade;
143+
return [trade, amount];
134144
}
135145

136146
/**

packages/keeper-bots/src/providers/swap-provider.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,14 +46,14 @@ class SwapProvider {
4646

4747
async getBestTrade(
4848
// eslint-disable-next-line
49-
// tokenConverter: Address,
49+
tokenConverter: Address,
5050
// eslint-disable-next-line
5151
swapFrom: Address,
5252
// eslint-disable-next-line
5353
swapTo: Address,
5454
// eslint-disable-next-line
5555
amount: bigint,
56-
): Promise<TradeRoute> {
56+
): Promise<[TradeRoute, bigint]> {
5757
throw new Error("Not Implemented Error");
5858
}
5959
}

packages/keeper-bots/src/providers/uniswap.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { Address, Hex, encodePacked, erc20Abi } from "viem";
1010
import getConfig from "../config";
1111
import type { SUPPORTED_CHAINS } from "../config/chains";
1212
import { chains } from "../config/chains";
13+
import { tokenConverterAbi } from "../config/abis/generated";
1314
import { ConverterBotMessage } from "../converter-bot/types";
1415
import { TradeRoute } from "../types";
1516
import SwapProvider from "./swap-provider";
@@ -61,14 +62,22 @@ class UniswapProvider extends SwapProvider {
6162
}
6263

6364
async getBestTrade(
64-
// tokenConverter: Address,
65+
tokenConverter: Address,
6566
swapFrom: Address,
6667
swapTo: Address,
6768
amount: bigint,
68-
): Promise<TradeRoute> {
69+
): Promise<[TradeRoute, bigint]> {
6970
const swapFromToken = await this.getToken(swapFrom);
7071
const swapToToken = await this.getToken(swapTo);
7172

73+
// [amount transferred out of converter, amount transferred in]
74+
const { result: updatedAmountIn } = await this.publicClient.simulateContract({
75+
address: tokenConverter,
76+
abi: tokenConverterAbi,
77+
functionName: "getUpdatedAmountIn",
78+
args: [amount, swapTo, swapFrom],
79+
});
80+
7281
const provider = new ethers.providers.JsonRpcProvider(config.rpcUrl);
7382
const router = new AlphaRouter({
7483
chainId: config.network.id as ChainId,
@@ -125,7 +134,7 @@ class UniswapProvider extends SwapProvider {
125134
throw new Error("No trade found");
126135
}
127136

128-
return trade;
137+
return [trade, amount];
129138
}
130139

131140
/**

0 commit comments

Comments
 (0)