- Listen for pending transactions and extract the logs using EVM simulations.
- If a new pair is found, we send it to the sniper module where we run EVM simulations to determine if it's a honeypot or not.
- If it passes the checks, we buy the token.
- From there, we monitor the price from the sell oracle.
- We also monitor the token from the Anti-Honeypot and Anti-Rug oracles.
We monitor the mempool for transactions that interact with the token contract address. We can see, for example, if we are going to be blacklisted, taxes increased to 100%, etc.
We monitor the mempool for transactions that touch the token's pool. We can see if the token's liquidity is going to be removed, or if a big amount of tokens is going to be sold which will have the same result, etc.
However, keep in mind if one of these transactions is sent directly to builders, we will not be able to detect them.
- Can almost detect all new pairs no matter the method they are created with.
- Send the transaction directly to builders.
- Keep track of the selling price on every block.
- Takes the initial amount in + total gas fees out as profit once the selling price met the criteria.
- Doesn't sell the token if the total gas cost is more than the WETH we are going to receive (see Anti-rug).
- Extremely fast and accurate simulations thanks to
revm
.
Note: I'm not recommending for anyone to try it on-chain as the chances of catching a token that will do a lot of Xs before it rugs are extremely low, plus the high gas fees of Ethereum are not helpful.
This repo is just for educational purposes only, showcasing some of the amazing capabilities of revm
(what will happen after this state change, etc...).
- While the bot is technically working and doesn't crash there may still be some bugs that I haven't noticed.
- Every information the bot holds for the tokens we bought is kept in memory if you restart the bot all the information will be lost and you will have to manually withdraw the tokens from the contract and sell them, use with caution!
If you want to try it:
- Go to
contracts/src/sniper.sol
and fill in your addresses. - Deploy and fund your contract.
- Go to
src/utils/constants.rs
and fill in your addresses and private keys. - Compile with:
RUSTFLAGS="-C target-cpu=native" cargo build --profile maxperf
- Navigate to the
target/maxperf
- And run it:
./rs-uniswap-sniper
Please make sure you read and understand the codebase and adjust some values as you like. Could do some better organization of the code, any contributions are welcome!
[08:17:21][INFO] New Pool Found!🚀
[08:17:21][INFO] Pool Address: 0xe1f61921b4a4bce352aab57ca4c696180c0f169a
[08:17:21][INFO] Token Address: 0xc300c7145bac98cb6748b908f4d26e9cee130594
[08:17:21][ERROR] Buy or sell reverted
[08:17:21][ERROR] Sniper Failed: for token 0xc300c7145bac98cb6748b908f4d26e9cee130594 Err Snipe Failed, sent it to retry oracle
[08:17:25][ERROR] Retry Tax Check Failed: Swap Buy reverted: b""
[08:53:56][INFO] New Pool Found!🚀
[08:53:56][INFO] Pool Address: 0x2b4d83a40ccdb6ff4af0846411732953053c3fbd
[08:53:56][INFO] Token Address: 0xdc19a59ba8308e4f55c1f24b11a63062a2733fbf
[08:53:56][INFO] Sniping with miner tip: BigDecimal("0.15")
[08:53:56][INFO] Token 0xdc19a59ba8308e4f55c1f24b11a63062a2733fbf Passed All Checks! 🚀
[08:53:56][INFO] Sending Tx...
[08:53:56][INFO] New Snipe Event Sent To Sell Oracle! 🚀
[08:53:57][INFO] Simulated Bundle Result: SimulatedBundle {hash: 0xdddc702790d4536d038091e6f5b2c7d6f9d499054d165963326df03e48c531dd, coinbase_diff: 285641200000000, coinbase_tip: 0, gas_price: 101822088, gas_used: 2805297, gas_fees: 285641200000000, simulation_block: 18404180, transactions: [SimulatedTransaction { hash: 0x1b2051f37f1ac424372fdf67118508b53ae124e53290426f8a0a38923dbb9c57, coinbase_diff: 270306700000000, coinbase_tip: 0, gas_price: 100000000, gas_used: 2703067, gas_fees: 270306700000000, from: 0x3752e7a1e18e2e297c7f139e1ea76b42eeecdfa3, to: Some(0x7a250d5630b4cf539739df2c5dacb4c659f2488d), value: Some(Bytes(0x0000000000000000000000000000000000000000204fce5e3e25026110000000000000000000000000000000000000000000000000000001a055690d9db800000000000000000000000000000000000000000000000073fc196e3c77728b3f61)), error: None, revert: None }, SimulatedTransaction { hash: 0x1deace75626eb1912f68f08099fc1b3bbc7ad91272d36872b2dc052454c5080a, coinbase_diff: 15334500000000, coinbase_tip: 0, gas_price: 150000000, gas_used: 102230, gas_fees: 15334500000000, from: 0xf6f9ea00f25cebfc6b51f0d7e0092076ad77f3eb, to: Some(0x773ea7f13c09af80ddce518aa97a0e8744a2fb78), value: Some(Bytes(0x)), error: None, revert: None }]}
[08:54:04][INFO] Is Bundle Included: true
[08:54:37][INFO] Token: 0xdc19a59ba8308e4f55c1f24b11a63062a2733fbf initial amount in: BigDecimal("0.025") ETH, current amount out: BigDecimal("0.024850348962065471") ETH
hash: 0x6b56458f61e959d5bf3912fe1fd27bea9c2f9ec0736ef94a35d4bc8fa433dea1
[08:55:49][ERROR] Failed to simulate sell for token: 0xdc19a59ba8308e4f55c1f24b11a63062a2733fbf Error: Sell Tx Reverted: b"\x08\xc3y\xa0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0&ERC20: transfer amount exceeds balance\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
[08:55:54][ERROR] Failed to simulate Anti-Rug Before sell tx for Token: 0xdc19a59ba8308e4f55c1f24b11a63062a2733fbf Err Sell Tx Reverted: b"\x08\xc3y\xa0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0&ERC20: transfer amount exceeds balance\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"