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.
You will need a license for kdb+ to use this (32bit works).
Instructions: mortals require instructions.
Jupyter Notebook for Sushiswap/Uniswap Liquidity and Market Depth
From https://code.kx.com/q4m3/14_Introduction_to_Kdb+/1481-the-environment-variables,
set QHOME
to the location of q.k
.
To pass in a license, invoke q with QLIC
set to the directory in which
kc.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.
const blockNumber = await provider.getBlockNumber()
const minTimestamp = (await provider.getBlock(blockNumber)).timestamp
const maxTimestamp = minTimestamp + 120
const signedBundle = flashbotsProvider.signBundle(
[
{
signedTransaction: SIGNED_ORACLE_UPDATE_FROM_PENDING_POOL // serialized signed transaction hex
},
{
signer: wallet, // ethers signer
transaction: transaction // ethers populated transaction object
}
])
const bundleReceipt = await flashbotsProvider.sendRawBundle(
signedBundle, // bundle we signed above
targetBlockNumber, // 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}(new bytes(0));
subject to reentrancy 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 target blockNumber
and a priorityFeePerGas
>= 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:
const signedTransactions = await flashbotsProvider.signBundle(transactionBundle)
const simulation = await flashbotsProvider.simulate(signedTransactions, targetBlockNumber, targetBlockNumber + 1)
console.log(JSON.stringify(simulation, null, 2))
- Competitors paying more
Get conflicting bundles for a prior block:
const signedTransactions = await flashbotsProvider.signBundle(transactionBundle)
console.log(await flashbotsProvider.getConflictingBundle(
signedTransactions,
13140328 // blockNumber
))
- Bundle received too late to appear in target block
Get submission time data and compare to block time:
console.log(
await flashbotsProvider.getBundleStats("0x123456789abcdef123456789abcdef123456789abcdef123456789abcdef1234", 13509887)
)
This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.