- Notifications
You must be signed in to change notification settings - Fork92
MEV Bot and Flashbots Bundler written in q using kdb+
License
sambacha/q-evm
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
kdb+ adapted for usage on Ethereum/EVM Chains
This code is no longer in usage at Manifold Finance, which is why we have open sourced it.
Warning
mortals require instructions, you have been warned.
These libraries arerequired
https://github.com/manifoldfinance/qBigInt
https://github.com/manifoldfinance/qQuarticRoots
https://github.com/manifoldfinance/qAbiEncode
Will start 4 processes.
q realtime db for user balances.
subscribe to all lender events to update db balances.
query snapshot of every user balance (will take a long time to complete but liquidations can still occur in the background).
scan for unstable health and try to liquidate (prompt will appear for unlocking your accounts).
logs folder will hold log info.
To view live user balances and health:http://localhost:5010
.
Jupyter Notebook for Sushiswap/Uniswap Liquidity and Market Depth
Fromhttps://code.kx.com/q4m3/14_Introduction_to_Kdb+/1481-the-environment-variables,setQHOME
to the location ofq.k
.To pass in a license, invoke q withQLIC
set to thedirectory in whichkc.lic
is located.Other .q (or .k) files are loaded with\l path/to/file
..so
files are loaded by defining their name/path when defining the function:
https://docs.flashbots.net/flashbots-auction/overview
Notes on the current state of flashbots docs with relevance to assumptions of bundle process.
constblockNumber=awaitprovider.getBlockNumber()constminTimestamp=(awaitprovider.getBlock(blockNumber)).timestampconstmaxTimestamp=minTimestamp+120constsignedBundle=flashbotsProvider.signBundle([{signedTransaction:SIGNED_ORACLE_UPDATE_FROM_PENDING_POOL// serialized signed transaction hex},{signer:wallet,// ethers signertransaction:transaction// ethers populated transaction object}])constbundleReceipt=awaitflashbotsProvider.sendRawBundle(signedBundle,// bundle we signed abovetargetBlockNumber,// block number at which this bundle is valid{ minTimestamp,// optional minimum timestamp at which this bundle is valid (inclusive) maxTimestamp,// optional maximum timestamp at which this bundle is valid (inclusive)revertingTxHashes:[tx1,tx2]// optional list of transaction hashes allowed to revert. Without specifying here, any revert invalidates the entire bundle.}))
https://docs.flashbots.net/flashbots-auction/searchers/advanced/coinbase-payment
To include as last action of smart contract
block.coinbase.transfer(AMOUNT_TO_TRANSFER)
Edge case to deal with sending to a miner contract
block.coinbase.call{value: _ethAmountToCoinbase}(newbytes(0));
subject toreentrancy attacks
https://docs.flashbots.net/flashbots-auction/searchers/advanced/bundle-pricing
Conflicting bundles received by flashbots are ordered by the following formula:
https://docs.flashbots.net/flashbots-auction/miners/mev-geth-spec/v04
Bundles must have a targetblockNumber
and apriorityFeePerGas
>= 1 Gwei.
https://docs.flashbots.net/flashbots-auction/miners/mev-geth-spec/v04
"When constructing a block the node should reject any bundle or megabundle that has a reverting transaction unless its hash is included in the RevertingTxHashes list of the bundle"
https://docs-staging.flashbots.net/flashbots-auction/searchers/advanced/troubleshooting
- Transaction failure (ANY within the bundle)
- Incentives (gas price/coinbase transfers) not high enough to offset value of block space
Simulate bundle:
constsignedTransactions=awaitflashbotsProvider.signBundle(transactionBundle)constsimulation=awaitflashbotsProvider.simulate(signedTransactions,targetBlockNumber,targetBlockNumber+1)console.log(JSON.stringify(simulation,null,2))
- Competitors paying more
Get conflicting bundles for a prior block:
constsignedTransactions=awaitflashbotsProvider.signBundle(transactionBundle)console.log(awaitflashbotsProvider.getConflictingBundle(signedTransactions,13140328// blockNumber))
- Bundle received too late to appear in target block
Get submission time data and compare to block time:
console.log(awaitflashbotsProvider.getBundleStats("0x123456789abcdef123456789abcdef123456789abcdef123456789abcdef1234",13509887))
This Source Code Form is subject to the terms of the Mozilla PublicLicense, v. 2.0. If a copy of the MPL was not distributed with thisfile, You can obtain one athttp://mozilla.org/MPL/2.0/.