From 4bb6a6c670ed989d266dffb48c0e61653841e4e9 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Wed, 20 Nov 2024 17:55:23 +0000 Subject: [PATCH] update --- src/account.ts | 19 ++++++++++++++++--- src/cli.ts | 12 ++++++++---- src/error.ts | 4 ++++ src/modes/interOrderbook.ts | 9 --------- src/modes/intraOrderbook.ts | 9 --------- src/modes/routeProcessor.ts | 9 --------- test/account.test.js | 2 +- test/mode-interOrderbook.test.js | 1 + test/mode-intraOrderbook.test.js | 1 + test/mode-routeProcessor.test.js | 13 +++++++------ 10 files changed, 38 insertions(+), 41 deletions(-) diff --git a/src/account.ts b/src/account.ts index 5e5b418c..9c13819b 100644 --- a/src/account.ts +++ b/src/account.ts @@ -157,10 +157,19 @@ export async function manageAccounts( ) { const removedWallets: ViemClient[] = []; let accountsToAdd = 0; - const gasPrice = await config.viemClient.getGasPrice(); + try { + const balances = await getBatchEthBalance( + config.accounts.map((v) => v.account.address), + config.viemClient as any as ViemClient, + ); + config.accounts.forEach((v, i) => (v.BALANCE = balances[i])); + } catch { + /**/ + } for (let i = config.accounts.length - 1; i >= 0; i--) { if (config.accounts[i].BALANCE.lt(avgGasCost.mul(4))) { try { + const gasPrice = await config.viemClient.getGasPrice(); await sweepToMainWallet( config.accounts[i], config.mainAccount, @@ -529,11 +538,15 @@ export async function sweepToMainWallet( } } - if (cumulativeGasLimit.mul(gasPrice).gt(fromWallet.BALANCE)) { + if (cumulativeGasLimit.mul(gasPrice).mul(120).div(100).gt(fromWallet.BALANCE)) { const span = tracer?.startSpan("fund-wallet-to-sweep", undefined, mainCtx); span?.setAttribute("details.wallet", fromWallet.account.address); try { - const transferAmount = cumulativeGasLimit.mul(gasPrice).sub(fromWallet.BALANCE); + const transferAmount = cumulativeGasLimit + .mul(gasPrice) + .mul(120) + .div(100) + .sub(fromWallet.BALANCE); span?.setAttribute("details.amount", ethers.utils.formatUnits(transferAmount)); const hash = await toWallet.sendTransaction({ to: fromWallet.account.address, diff --git a/src/cli.ts b/src/cli.ts index a33e3163..4be3575a 100755 --- a/src/cli.ts +++ b/src/cli.ts @@ -310,7 +310,7 @@ export const arbRound = async ( span.setAttribute("didClear", false); } if (avgGasCost) { - span.setAttribute("avgGasCost", avgGasCost.toString()); + span.setAttribute("avgGasCost", ethers.utils.formatUnits(avgGasCost)); } span.setStatus({ code: SpanStatusCode.OK }); span.end(); @@ -713,10 +713,14 @@ export const main = async (argv: any, version?: string) => { roundSpan.setStatus({ code: SpanStatusCode.ERROR, message: snapshot }); } if (config.accounts.length) { - roundSpan.setAttribute( - "circulatingAccounts", - config.accounts.map((v) => v.account.address), + const accountsWithBalance: Record = {}; + config.accounts.forEach( + (v) => + (accountsWithBalance[v.account.address] = ethers.utils.formatUnits( + v.BALANCE, + )), ); + roundSpan.setAttribute("circulatingAccounts", JSON.stringify(accountsWithBalance)); } if (avgGasCost) { roundSpan.setAttribute("avgGasCost", ethers.utils.formatUnits(avgGasCost)); diff --git a/src/error.ts b/src/error.ts index 628efade..f3b367c6 100644 --- a/src/error.ts +++ b/src/error.ts @@ -15,6 +15,7 @@ import { decodeErrorResult, ExecutionRevertedError, InsufficientFundsError, + FeeCapTooLowError, // InvalidInputRpcError, // TransactionRejectedRpcError, } from "viem"; @@ -100,12 +101,15 @@ export function errorSnapshot(header: string, err: any): string { */ export function containsNodeError(err: BaseError): boolean { try { + const snapshot = errorSnapshot("", err); return ( // err instanceof TransactionRejectedRpcError || // err instanceof InvalidInputRpcError || + err instanceof FeeCapTooLowError || err instanceof ExecutionRevertedError || err instanceof InsufficientFundsError || (err instanceof RpcRequestError && err.code === ExecutionRevertedError.code) || + (snapshot.includes("exceeds allowance") && !snapshot.includes("out of gas")) || ("cause" in err && containsNodeError(err.cause as any)) ); } catch (error) { diff --git a/src/modes/interOrderbook.ts b/src/modes/interOrderbook.ts index a8779750..13568ac6 100644 --- a/src/modes/interOrderbook.ts +++ b/src/modes/interOrderbook.ts @@ -109,15 +109,6 @@ export async function dryrun({ try { blockNumber = Number(await viemClient.getBlockNumber()); spanAttributes["blockNumber"] = blockNumber; - try { - gasPrice = ethers.BigNumber.from(await viemClient.getGasPrice()) - .mul(config.gasPriceMultiplier) - .div("100") - .toBigInt(); - rawtx.gasPrice = gasPrice; - } catch { - /**/ - } gasLimit = ethers.BigNumber.from(await signer.estimateGas({ ...rawtx, type: "legacy" })) .mul(config.gasLimitMultiplier) .div(100); diff --git a/src/modes/intraOrderbook.ts b/src/modes/intraOrderbook.ts index a4ebeda0..8e285313 100644 --- a/src/modes/intraOrderbook.ts +++ b/src/modes/intraOrderbook.ts @@ -106,15 +106,6 @@ export async function dryrun({ try { blockNumber = Number(await viemClient.getBlockNumber()); spanAttributes["blockNumber"] = blockNumber; - try { - gasPrice = ethers.BigNumber.from(await viemClient.getGasPrice()) - .mul(config.gasPriceMultiplier) - .div("100") - .toBigInt(); - rawtx.gasPrice = gasPrice; - } catch { - /**/ - } gasLimit = ethers.BigNumber.from(await signer.estimateGas({ ...rawtx, type: "legacy" })) .mul(config.gasLimitMultiplier) .div(100); diff --git a/src/modes/routeProcessor.ts b/src/modes/routeProcessor.ts index 4f0739ff..7cbca636 100644 --- a/src/modes/routeProcessor.ts +++ b/src/modes/routeProcessor.ts @@ -174,15 +174,6 @@ export async function dryrun({ try { blockNumber = Number(await viemClient.getBlockNumber()); spanAttributes["blockNumber"] = blockNumber; - try { - gasPrice = ethers.BigNumber.from(await viemClient.getGasPrice()) - .mul(config.gasPriceMultiplier) - .div("100") - .toBigInt(); - rawtx.gasPrice = gasPrice; - } catch { - /**/ - } gasLimit = ethers.BigNumber.from(await signer.estimateGas({ ...rawtx, type: "legacy" })) .mul(config.gasLimitMultiplier) .div(100); diff --git a/test/account.test.js b/test/account.test.js index c4d0ecb3..59a87f51 100644 --- a/test/account.test.js +++ b/test/account.test.js @@ -105,7 +105,7 @@ describe("Test accounts", async function () { it("should manage accounts successfully", async function () { const viemClient = { chain: { id: 137 }, - multicall: async () => [10000n, 0n, 0n], + multicall: async () => [10n, 0n], getGasPrice: async () => 3000000n, }; const mnemonic = "test test test test test test test test test test test junk"; diff --git a/test/mode-interOrderbook.test.js b/test/mode-interOrderbook.test.js index b7ac2a7e..bb02ab7d 100644 --- a/test/mode-interOrderbook.test.js +++ b/test/mode-interOrderbook.test.js @@ -433,6 +433,7 @@ describe("Test inter-orderbook find opp", async function () { [opposingOrderbookAddress]: { maxInput: vaultBalance.toString(), blockNumber: oppBlockNumber, + stage: 1, isNodeError: false, error: errorSnapshot("", err), rawtx: JSON.stringify(rawtx), diff --git a/test/mode-intraOrderbook.test.js b/test/mode-intraOrderbook.test.js index a7c84110..e2647c24 100644 --- a/test/mode-intraOrderbook.test.js +++ b/test/mode-intraOrderbook.test.js @@ -334,6 +334,7 @@ describe("Test intra-orderbook find opp", async function () { intraOrderbook: [ JSON.stringify({ blockNumber: oppBlockNumber, + stage: 1, isNodeError: false, error: errorSnapshot("", err), rawtx: JSON.stringify(rawtx), diff --git a/test/mode-routeProcessor.test.js b/test/mode-routeProcessor.test.js index bd20ce12..ca373fd2 100644 --- a/test/mode-routeProcessor.test.js +++ b/test/mode-routeProcessor.test.js @@ -230,6 +230,7 @@ describe("Test route processor dryrun", async function () { blockNumber: oppBlockNumber, error: errorSnapshot("", ethers.errors.UNPREDICTABLE_GAS_LIMIT), route: expectedRouteVisual, + stage: 1, rawtx: JSON.stringify(rawtx), isNodeError: false, }, @@ -470,9 +471,9 @@ describe("Test route processor find opp", async function () { reason: RouteProcessorDryrunHaltReason.NoOpportunity, spanAttributes: { hops: [ - `{"amountIn":"${formatUnits(vaultBalance)}","amountOut":"${formatUnits(getAmountOut(vaultBalance), 6)}","marketPrice":"${formatUnits(getCurrentPrice(vaultBalance))}","route":${JSON.stringify(expectedRouteVisual)},"blockNumber":${oppBlockNumber},"isNodeError":false,"error":${JSON.stringify(errorSnapshot("", ethers.errors.UNPREDICTABLE_GAS_LIMIT))},"rawtx":${JSON.stringify(rawtx)}}`, - `{"amountIn":"${formatUnits(vaultBalance.div(2))}","amountOut":"${formatUnits(getAmountOut(vaultBalance.div(2)), 6)}","marketPrice":"${formatUnits(getCurrentPrice(vaultBalance.div(2)))}","route":${JSON.stringify(expectedRouteVisual)},"blockNumber":${oppBlockNumber},"isNodeError":false}`, - `{"amountIn":"${formatUnits(vaultBalance.div(4))}","amountOut":"${formatUnits(getAmountOut(vaultBalance.div(4)), 6)}","marketPrice":"${formatUnits(getCurrentPrice(vaultBalance.div(4)))}","route":${JSON.stringify(expectedRouteVisual)},"blockNumber":${oppBlockNumber},"isNodeError":false}`, + `{"amountIn":"${formatUnits(vaultBalance)}","amountOut":"${formatUnits(getAmountOut(vaultBalance), 6)}","marketPrice":"${formatUnits(getCurrentPrice(vaultBalance))}","route":${JSON.stringify(expectedRouteVisual)},"blockNumber":${oppBlockNumber},"stage":1,"isNodeError":false,"error":${JSON.stringify(errorSnapshot("", ethers.errors.UNPREDICTABLE_GAS_LIMIT))},"rawtx":${JSON.stringify(rawtx)}}`, + `{"amountIn":"${formatUnits(vaultBalance.div(2))}","amountOut":"${formatUnits(getAmountOut(vaultBalance.div(2)), 6)}","marketPrice":"${formatUnits(getCurrentPrice(vaultBalance.div(2)))}","route":${JSON.stringify(expectedRouteVisual)},"blockNumber":${oppBlockNumber},"stage":1,"isNodeError":false}`, + `{"amountIn":"${formatUnits(vaultBalance.div(4))}","amountOut":"${formatUnits(getAmountOut(vaultBalance.div(4)), 6)}","marketPrice":"${formatUnits(getCurrentPrice(vaultBalance.div(4)))}","route":${JSON.stringify(expectedRouteVisual)},"blockNumber":${oppBlockNumber},"stage":1,"isNodeError":false}`, ], }, }; @@ -672,9 +673,9 @@ describe("Test find opp with retries", async function () { reason: RouteProcessorDryrunHaltReason.NoOpportunity, spanAttributes: { hops: [ - `{"amountIn":"${formatUnits(vaultBalance)}","amountOut":"${formatUnits(getAmountOut(vaultBalance), 6)}","marketPrice":"${formatUnits(getCurrentPrice(vaultBalance))}","route":${JSON.stringify(expectedRouteVisual)},"blockNumber":${oppBlockNumber},"isNodeError":false,"error":${JSON.stringify(errorSnapshot("", ethers.errors.UNPREDICTABLE_GAS_LIMIT))},"rawtx":${JSON.stringify(rawtx)}}`, - `{"amountIn":"${formatUnits(vaultBalance.div(2))}","amountOut":"${formatUnits(getAmountOut(vaultBalance.div(2)), 6)}","marketPrice":"${formatUnits(getCurrentPrice(vaultBalance.div(2)))}","route":${JSON.stringify(expectedRouteVisual)},"blockNumber":${oppBlockNumber},"isNodeError":false}`, - `{"amountIn":"${formatUnits(vaultBalance.div(4))}","amountOut":"${formatUnits(getAmountOut(vaultBalance.div(4)), 6)}","marketPrice":"${formatUnits(getCurrentPrice(vaultBalance.div(4)))}","route":${JSON.stringify(expectedRouteVisual)},"blockNumber":${oppBlockNumber},"isNodeError":false}`, + `{"amountIn":"${formatUnits(vaultBalance)}","amountOut":"${formatUnits(getAmountOut(vaultBalance), 6)}","marketPrice":"${formatUnits(getCurrentPrice(vaultBalance))}","route":${JSON.stringify(expectedRouteVisual)},"blockNumber":${oppBlockNumber},"stage":1,"isNodeError":false,"error":${JSON.stringify(errorSnapshot("", ethers.errors.UNPREDICTABLE_GAS_LIMIT))},"rawtx":${JSON.stringify(rawtx)}}`, + `{"amountIn":"${formatUnits(vaultBalance.div(2))}","amountOut":"${formatUnits(getAmountOut(vaultBalance.div(2)), 6)}","marketPrice":"${formatUnits(getCurrentPrice(vaultBalance.div(2)))}","route":${JSON.stringify(expectedRouteVisual)},"blockNumber":${oppBlockNumber},"stage":1,"isNodeError":false}`, + `{"amountIn":"${formatUnits(vaultBalance.div(4))}","amountOut":"${formatUnits(getAmountOut(vaultBalance.div(4)), 6)}","marketPrice":"${formatUnits(getCurrentPrice(vaultBalance.div(4)))}","route":${JSON.stringify(expectedRouteVisual)},"blockNumber":${oppBlockNumber},"stage":1,"isNodeError":false}`, ], }, };