From 9586b78e10f299dc6d5ce95fdcd4c9ab4f40fec2 Mon Sep 17 00:00:00 2001 From: Kirill Fedoseev Date: Wed, 2 Feb 2022 22:13:50 +0300 Subject: [PATCH] Fake MEV execution for BSC --- oracle/docker-compose-helpers.yml | 3 +++ oracle/src/mevSender.js | 27 +++++++++++++++++++++++---- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/oracle/docker-compose-helpers.yml b/oracle/docker-compose-helpers.yml index 096d7669..72fb7fe0 100644 --- a/oracle/docker-compose-helpers.yml +++ b/oracle/docker-compose-helpers.yml @@ -51,5 +51,8 @@ services: ORACLE_MEV_FOREIGN_MAX_FEE_PER_GAS: '1000000000000' # 1000 gwei ORACLE_MEV_FOREIGN_FLASHBOTS_RPC_URL: 'https://relay-goerli.flashbots.net' ORACLE_MEV_FOREIGN_FLASHBOTS_AUTH_SIGNING_KEY: 82db7175932f4e6c8e45283b78b54fd5f195149378ec90d95b8fd0ec8bdadf1d + FAKE_MEV_RELAY_TX_SENDING: 'true' + FAKE_MEV_RELAY_NO_EIP1559: 'true' + COMMON_FOREIGN_GAS_PRICE_FALLBACK: 100000000000 # will essentially replace block base fee restart: unless-stopped entrypoint: yarn mev:sender:foreign diff --git a/oracle/src/mevSender.js b/oracle/src/mevSender.js index f2c4f9e1..6ad82e03 100644 --- a/oracle/src/mevSender.js +++ b/oracle/src/mevSender.js @@ -15,9 +15,13 @@ if (process.argv.length < 3) { } const config = require(path.join('../config/', process.argv[2])) +const GasPrice = require('./services/gasPrice') const { web3, mevForeign, validatorAddress } = config +const FAKE_MEV_RELAY_TX_SENDING = process.env.FAKE_MEV_RELAY_TX_SENDING === 'true' +const FAKE_MEV_RELAY_NO_EIP1559 = process.env.FAKE_MEV_RELAY_NO_EIP1559 === 'true' + let chainId = 0 let flashbotsProvider @@ -28,7 +32,9 @@ async function initialize() { web3.currentProvider.urls.forEach(checkHttps(config.id)) chainId = await getChainId(web3) - flashbotsProvider = await mevForeign.getFlashbotsProvider(chainId) + if (!FAKE_MEV_RELAY_TX_SENDING) { + flashbotsProvider = await mevForeign.getFlashbotsProvider(chainId) + } return runMain() } catch (e) { logger.error(e.message) @@ -65,7 +71,13 @@ async function main() { return } - const { baseFeePerGas: pendingBaseFee, number: pendingBlockNumber } = await getBlock(web3, 'pending') + const { baseFeePerGas, number: pendingBlockNumber } = await getBlock(web3, 'pending') + let pendingBaseFee = baseFeePerGas + if (FAKE_MEV_RELAY_TX_SENDING && FAKE_MEV_RELAY_NO_EIP1559) { + // emulate baseFee with the current gasPrice + await GasPrice.start('foreign', web3, true) + pendingBaseFee = GasPrice.gasPriceOptions().gasPrice + } const bestJob = pickBestJob(jobs, pendingBaseFee) if (!bestJob) { @@ -115,7 +127,7 @@ async function main() { { nonce, fromBlock: pendingBlockNumber, toBlock: pendingBlockNumber + mevForeign.bundlesPerIteration - 1 }, 'Sending MEV bundles' ) - const txHash = await sendTx({ + const opts = { data: bestJob.data, nonce, value: bestJob.value, @@ -134,7 +146,14 @@ async function main() { toBlock: pendingBlockNumber + mevForeign.bundlesPerIteration - 1, logger } - }) + } + if (FAKE_MEV_RELAY_TX_SENDING) { + if (FAKE_MEV_RELAY_NO_EIP1559) { + opts.gasPriceOptions = { gasPrice: pendingBaseFee } + } + delete opts.mevOptions + } + const txHash = await sendTx(opts) jobLogger.info({ txHash }, `Tx generated ${txHash} for event Tx ${bestJob.transactionReference}`)