Skip to content

Commit 86f884f

Browse files
authored
Merge pull request #50 from VenusProtocol/filter-conversion-pairs-list-by-converter
feat: filter conversion pairs list by converter
2 parents ef6197b + 68e89bd commit 86f884f

File tree

4 files changed

+64
-24
lines changed

4 files changed

+64
-24
lines changed

packages/cli/source/commands/conversionPairs.tsx

Lines changed: 44 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,67 @@
1+
import { option } from "pastel";
2+
import zod from "zod";
13
import { useEffect, useState } from "react";
24
import { Box, Text, useApp } from "ink";
3-
import { TokenConverterConfigs, getAllConverterConfigs } from "@venusprotocol/keeper-bots";
5+
import {
6+
BalanceResult,
7+
getAllConverterConfigs,
8+
getConverterConfigsByConverter,
9+
getTokenConvertersTokenBalances,
10+
} from "@venusprotocol/keeper-bots";
11+
import { addressValidation } from "../utils/validation.js";
12+
13+
export const options = zod.object({
14+
converter: addressValidation
15+
.describe(
16+
option({
17+
description: "Token converter address",
18+
alias: "c",
19+
}),
20+
)
21+
.optional(),
22+
});
23+
24+
interface Props {
25+
options: zod.infer<typeof options>;
26+
}
427

528
/**
629
* Helper command to list available conversion pairs
730
*/
8-
export default function ConversionPairs() {
9-
const [configs, setConfigs] = useState<TokenConverterConfigs>([]);
31+
export default function ConversionPairs({ options }: Props) {
32+
const { converter } = options;
33+
const [configs, setConfigs] = useState<BalanceResult[]>([]);
1034

1135
const { exit } = useApp();
1236

1337
useEffect(() => {
1438
(async () => {
15-
const configs = await getAllConverterConfigs();
16-
setConfigs(configs);
39+
let configs = [];
40+
if (converter) {
41+
configs = await getConverterConfigsByConverter(converter);
42+
} else {
43+
configs = await getAllConverterConfigs();
44+
}
45+
const { results } = await getTokenConvertersTokenBalances(
46+
configs,
47+
"0x0000000000000000000000000000000000000000",
48+
false,
49+
);
50+
51+
setConfigs(results);
1752
})().finally(exit);
1853
}, []);
1954

2055
return (
2156
<Box flexDirection="column">
2257
{configs.map(c => (
23-
<Box key={c.id} flexDirection="row">
24-
<Text>Token Converter: {c.tokenConverter.id} </Text>
58+
<Box key={`${c.tokenConverter}-${c.assetIn.address}-${c.assetOut.address}`} flexDirection="row">
59+
<Text>Token Converter: {c.tokenConverter} </Text>
2560
<Text>
26-
Token In: {c.tokenIn.symbol} {c.tokenIn.address}{" "}
61+
Token In: {c.assetIn.symbol} {c.assetIn.address}{" "}
2762
</Text>
2863
<Text>
29-
Token Out: {c.tokenOut.symbol} {c.tokenOut.address}
64+
Token Out: {c.assetOut.symbol} {c.assetOut.address} (Balance {c.assetOut.balance.toString()})
3065
</Text>
3166
</Box>
3267
))}

packages/cli/source/commands/convert.tsx

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,8 @@ export default function Convert({ options }: Props) {
176176
await Promise.allSettled(
177177
potentialConversions.map(async (t: any) => {
178178
let amountOut = t.assetOut.balance;
179-
const vTokenAddress = t.assetOutVTokens.core || t.assetOutVTokens.isolated[1];
179+
180+
const vTokenAddress = t.assetOutVTokens.core || t.assetOutVTokens.isolated[0][1];
180181
const { underlyingPriceUsd, underlyingUsdValue, underlyingDecimals } = await tokenConverter.getUsdValue(
181182
t.assetOut.address,
182183
vTokenAddress,
@@ -191,7 +192,7 @@ export default function Convert({ options }: Props) {
191192
const arbitrageArgs = await tokenConverter.prepareConversion(
192193
t.tokenConverter,
193194
t.assetOut.address,
194-
t.assetIn,
195+
t.assetIn.address,
195196
amountOut,
196197
);
197198

@@ -209,7 +210,7 @@ export default function Convert({ options }: Props) {
209210
context: {
210211
converter: t.tokenConverter,
211212
tokenToReceiveFromConverter: t.assetOut.address,
212-
tokenToSendToConverter: t.assetIn,
213+
tokenToSendToConverter: t.assetIn.address,
213214
amount,
214215
minIncome,
215216
percentage: Number((minIncome * 10000000n) / amount) / 10000000,
@@ -225,7 +226,7 @@ export default function Convert({ options }: Props) {
225226
context: {
226227
converter: t.tokenConverter.id,
227228
tokenToReceiveFromConverter: t.assetOut.address,
228-
tokenToSendToConverter: t.assetIn,
229+
tokenToSendToConverter: t.assetIn.address,
229230
amount,
230231
minIncome,
231232
percentage: Number((minIncome * 10000000n) / amount) / 10000000,
@@ -239,7 +240,7 @@ export default function Convert({ options }: Props) {
239240
context: {
240241
converter: t.tokenConverter.id,
241242
tokenToReceiveFromConverter: t.assetOut.address,
242-
tokenToSendToConverter: t.assetIn,
243+
tokenToSendToConverter: t.assetIn.address,
243244
amount,
244245
minIncome,
245246
percentage: Number((minIncome * 10000000n) / amount) / 10000000,

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -530,15 +530,15 @@ describe("Token Converter", () => {
530530
const balanceResults: BalanceResult[] = [
531531
{
532532
tokenConverter: addresses.USDCPrimeConverter,
533-
assetIn: addresses.USDC,
534-
assetOut: { address: addresses.BUSD, balance: 600000000000000000000n },
533+
assetIn: { address: addresses.USDC, symbol: "USDC", decimals: 18 },
534+
assetOut: { address: addresses.BUSD, balance: 600000000000000000000n, symbol: "BUSD", decimals: 18 },
535535
assetOutVTokens: { core: addresses.vBNBCore, isolated: [] },
536536
accountBalanceAssetOut: 6000000000000000000n,
537537
},
538538
{
539539
tokenConverter: addresses.USDTPrimeConverter,
540-
assetIn: addresses.USDT,
541-
assetOut: { address: addresses.WBNB, balance: 400000000000000000000n },
540+
assetIn: { address: addresses.USDT, symbol: "USDT", decimals: 18 },
541+
assetOut: { address: addresses.WBNB, balance: 400000000000000000000n, symbol: "BUSD", decimals: 18 },
542542
assetOutVTokens: { core: undefined, isolated: [[addresses.stableCoinComptroller, addresses.vBNBIL]] },
543543
accountBalanceAssetOut: 4000000000000000000n,
544544
},

packages/keeper-bots/src/converter-bot/queries/getTokenConvertersTokenBalances.ts

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,12 @@ import getVTokensFromUnderlying from "./getVTokensFromUnderlying";
1313

1414
export interface BalanceResult {
1515
tokenConverter: Address;
16-
assetIn: Address;
17-
assetOut: { address: Address; balance: bigint };
16+
assetIn: {
17+
address: Address;
18+
symbol?: string | null;
19+
decimals: number;
20+
};
21+
assetOut: { address: Address; balance: bigint; symbol?: string | null; decimals: number };
1822
assetOutVTokens: {
1923
core: `0x${string}` | undefined;
2024
isolated: [`0x${string}`, `0x${string}`][] | undefined;
@@ -32,20 +36,20 @@ const formatResults = async (
3236
for (let i = 0; i < results.length; i += chunkSize) {
3337
const index = (i + chunkSize) / chunkSize - 1;
3438
const tokenConverter = tokenConverterConfigs[index].tokenConverter.id as Address;
35-
const assetIn = tokenConverterConfigs[index].tokenIn.address;
36-
const assetOut = tokenConverterConfigs[index].tokenOut.address;
39+
const assetIn = tokenConverterConfigs[index].tokenIn;
40+
const assetOut = tokenConverterConfigs[index].tokenOut;
3741

3842
const curr = results.slice(i, i + chunkSize);
3943

40-
const { coreVTokens, isolatedVTokens } = await getVTokensFromUnderlying(assetOut);
44+
const { coreVTokens, isolatedVTokens } = await getVTokensFromUnderlying(assetOut.address);
4145
const balance = {
4246
assetOutVTokens: {
4347
core: coreVTokens[0]?.id as Address,
4448
isolated: isolatedVTokens.map(v => [v.pool.id, v.id] as [Address, Address]),
4549
},
4650
tokenConverter,
4751
assetIn,
48-
assetOut: { address: assetOut, balance: BigInt(curr[0].toString()) },
52+
assetOut: { ...assetOut, balance: BigInt(curr[0].toString()) },
4953
accountBalanceAssetOut: BigInt(curr[1].toString()),
5054
};
5155

0 commit comments

Comments
 (0)