Skip to content

Instantly share code, notes, and snippets.

@taarushv
Last active January 26, 2024 09:16
Show Gist options
  • Save taarushv/f8aee04b593c4dac24afc65aca9e37cd to your computer and use it in GitHub Desktop.
Save taarushv/f8aee04b593c4dac24afc65aca9e37cd to your computer and use it in GitHub Desktop.
Analyzing backrun/rebate in txs 0/1/2 in https://etherscan.io/block/17358588
// TX 1 - Admin wallet enables trading on FCKIT token https://etherscan.io/tx/0x12b949cf5605bb4da83efd14b6d38ad628a9ebf3befb42141d2ddb8cfc43d53e
// TX 2 - Searcher uses a proxy contract to buy ~2B FCKIT --for 60 ETH-- into multiple wallets (and to pay builder for gas fees/rebate) https://etherscan.io/tx/0xc3a37580a96b52a718a5b516dfef209f150e87a75032c725536821ea0d6cc875
// TX 3 - Rebate is forwarded from the flashbots builder back to the user https://etherscan.io/tx/0x80dc2721d833cd221bdf9264f1138a88907f57303bc606f8ee4034297201e095
const { ethers } = require('ethers'); // v5
const rpc = "https://mainnet.infura.io/v3/YOUR_API_KEY_HERE"
const provider = new ethers.providers.JsonRpcProvider(rpc)
// uni v2 router, to fetch trades using logs
const uniPool ="0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D"
// To get around the anti token sniping limit, searcher simple uses 1 proxy contract
// and multiple wallets to buy the token after trading is enabled.
// The following accounts have their token balances increased after tx 2
// source: https://dashboard.tenderly.co/tx/mainnet/0xc3a37580a96b52a718a5b516dfef209f150e87a75032c725536821ea0d6cc875/state-diff
const accounts = [
"0x04287c7bf06c7e9121e3700861410d1cd489d872",
"0x072e06ddac45f643b2cadf8eb3721b111b9c3dbb",
"0x0ac3c761fa8d0f0b4be3f8849c6a12880e45a441",
"0x0fe59520431451170d6ca1c49d5659da0519ce18",
"0x142ce7a0ac45d6d866218b1f1d77500b8e7c34a6",
"0x1f93249ee6b6fc44c36cdcf30ca3faac76a6abe1",
"0x2b254e1888a37cd7ac68e25dce98d43d5afecf13",
"0x2b732f067f440edd49986dc6c50cb93af3698e10",
"0x342f28bbd622ee58ca1325df22767152d439ed9b",
"0x4558012c64e7f2c5e55caf2b2e701d89270cbec2",
"0x4a55e96619edb8719859179f63b28b8d47dead21",
"0x4c009b83467b61a196619f93e98b40e561ed89a5",
"0x5129d7026b55aecc1c1a0a18f618b93868c2be6a",
"0x552916a87aed04704c25ba9c1a88a43f4926e45a",
"0x55b7144f6067e488831092074cafd148b8fe701a",
"0x5a09a9ac96d908d5824ce49325b84c592db192b2",
"0x5c2d3fe72591e66c781ac78437347600e99adf8c",
"0x5f6f33cf5b9194fdc062ee035625b129f37c8c7d",
"0x6570f963a93dfc75d0816971c8257a8188d14293",
"0x6b2e314b3456cef77ea6408ae4d935a2fadca914",
"0x6edbbc42669121106a9fb2f5c5cc47654fe1b45f",
"0x6f000cc839689b52a95fb0d52e401bd46c70a2de",
"0x716576481a689b124344d51a7ce2d018af019440",
"0x72fe3e85f3e84093ac0d2cef4474fbdb3d844ce8",
"0x8840db22a5f535dd10ed1253ee730f252a635e6d",
"0x8d1fd7aa0b88483a49e4a174a6ce1739849e81c5",
"0x94c3075bc4011f69026dbd54b74b22399cb40d4c",
"0xa19d50a87c4c50131b320e905327b71d22b7d7e4",
"0xa8d7e9930b8afe024189976eaba5a54b6fef9db9",
"0xbaaa383463a057cc95d60ddf7b40230d819e2e96",
"0xcdef6ce0abbad6426b32a785cb8604317fc91070",
"0xcdfb3337d1e4b1865c8cecd5668af79fb82a375a",
"0xde4e8e8a9541aa7050c1a6b7480bd728508b5da9",
"0xe96e6267c73378754709600130fdfd9b5f2892e7",
"0xe9757e2660a89a811b25fe2aff3cf995c88e7934",
"0xec2347d9c64922da279c5ee02ae71b949af6b924",
"0xeed804b484c9a27875b601445e12e34a625396f4",
"0xf7e522b8fd87096ae0db2dba4cc3b25d239e6c0c",
"0xf9de78b65bf0835a2634862aeae60f567ab9097f"
]
// Hacky way to go from raw logs => how many FCKIT tokens were sold for how much ETH
const parseData = (log) => {
const data = log[0]['data']
const cleanedData = data.slice(10);
const result = cleanedData.match(/.{1,64}/g);
const amount0In = ethers.BigNumber.from('0x' + result[result.length -4].substring(0, 56));
const amount1Out = ethers.BigNumber.from('0x' + result[result.length - 1]);
parsedTokenAmount = ethers.utils.formatEther(amount0In.toString())
parsedETHAmount = ethers.utils.formatEther(amount1Out.toString())
return [parseFloat(parsedTokenAmount), parseFloat(parsedETHAmount)]
}
// For each of these accounts, fetch logs from when the tokens were eventually sold
// Use logs to determine how many total tokens were sold/for how much ETH/after how many blocks
const main = async () => {
var totalTokensSold = 0
var totalETHMade = 0
for(i=0;i<accounts.length;i++){
const address = accounts[i]
const paddedAddress = '0x' + address.slice(2).padStart(64, '0');
const paddedUniPool = '0x' + uniPool.slice(2).padStart(64, '0');
const filter = {
fromBlock: 17358588 + 1, // First block after the snipe
toBlock: "latest", // The ending block for the search
topics: [
"0xd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822", // topic 0
paddedUniPool,
paddedAddress
]
};
const logs = await provider.getLogs(filter);
const tradeDetails = parseData(logs)
var totalTokensSold = totalTokensSold + tradeDetails[0]
var totalETHMade = totalETHMade + tradeDetails[1]
console.log(i+1, address)
console.log( `Sold: ${(tradeDetails[0]).toFixed(2)} tokens for ${(tradeDetails[1]).toFixed(2)} ETH, (${logs[0].blockNumber-17358588} blocks later)`)
console.log("-------------------------------------------------------")
}
console.log("TOTAL TOKENS SOLD: ", totalTokensSold.toFixed(2))
console.log("TOTAL ETH MADE: ", totalETHMade.toFixed(2))
console.log("TOTAL PROFIT: ", totalETHMade.toFixed(2) - 60 - 12.024) // 60 ETH to buy 2B tokens initially, 12 ETH paid to user + proposer (ignoring gas fees on final sells from different wallets)
}
main()
/* OUTPUT:
1 0x04287c7bf06c7e9121e3700861410d1cd489d872
Sold: 70610491.72 tokens for 4.13 ETH, (14 blocks later)
-------------------------------------------------------
2 0x072e06ddac45f643b2cadf8eb3721b111b9c3dbb
Sold: 70612708.97 tokens for 3.90 ETH, (32 blocks later)
-------------------------------------------------------
3 0x0ac3c761fa8d0f0b4be3f8849c6a12880e45a441
Sold: 70611004.79 tokens for 4.14 ETH, (19 blocks later)
-------------------------------------------------------
4 0x0fe59520431451170d6ca1c49d5659da0519ce18
Sold: 70609840.77 tokens for 4.11 ETH, (10 blocks later)
-------------------------------------------------------
5 0x142ce7a0ac45d6d866218b1f1d77500b8e7c34a6
Sold: 70613136.86 tokens for 3.70 ETH, (33 blocks later)
-------------------------------------------------------
6 0x1f93249ee6b6fc44c36cdcf30ca3faac76a6abe1
Sold: 70612176.12 tokens for 4.08 ETH, (31 blocks later)
-------------------------------------------------------
7 0x2b254e1888a37cd7ac68e25dce98d43d5afecf13
Sold: 70610110.82 tokens for 4.37 ETH, (13 blocks later)
-------------------------------------------------------
8 0x2b732f067f440edd49986dc6c50cb93af3698e10
Sold: 70609178.88 tokens for 4.38 ETH, (6 blocks later)
-------------------------------------------------------
9 0x342f28bbd622ee58ca1325df22767152d439ed9b
Sold: 70610794.34 tokens for 4.00 ETH, (15 blocks later)
-------------------------------------------------------
10 0x4558012c64e7f2c5e55caf2b2e701d89270cbec2
Sold: 70610019.38 tokens for 4.50 ETH, (13 blocks later)
-------------------------------------------------------
11 0x4a55e96619edb8719859179f63b28b8d47dead21
Sold: 70612049.14 tokens for 4.19 ETH, (31 blocks later)
-------------------------------------------------------
12 0x4c009b83467b61a196619f93e98b40e561ed89a5
Sold: 70611802.16 tokens for 3.53 ETH, (20 blocks later)
-------------------------------------------------------
13 0x5129d7026b55aecc1c1a0a18f618b93868c2be6a
Sold: 70610298.18 tokens for 4.38 ETH, (14 blocks later)
-------------------------------------------------------
14 0x552916a87aed04704c25ba9c1a88a43f4926e45a
Sold: 70612991.38 tokens for 3.70 ETH, (32 blocks later)
-------------------------------------------------------
15 0x55b7144f6067e488831092074cafd148b8fe701a
Sold: 70612305.53 tokens for 4.07 ETH, (31 blocks later)
-------------------------------------------------------
16 0x5a09a9ac96d908d5824ce49325b84c592db192b2
Sold: 70611112.75 tokens for 4.02 ETH, (19 blocks later)
-------------------------------------------------------
17 0x5c2d3fe72591e66c781ac78437347600e99adf8c
Sold: 70611682.03 tokens for 3.79 ETH, (20 blocks later)
-------------------------------------------------------
18 0x5f6f33cf5b9194fdc062ee035625b129f37c8c7d
Sold: 70611564.07 tokens for 3.90 ETH, (20 blocks later)
-------------------------------------------------------
19 0x6570f963a93dfc75d0816971c8257a8188d14293
Sold: 70609499.80 tokens for 4.00 ETH, (7 blocks later)
-------------------------------------------------------
20 0x6b2e314b3456cef77ea6408ae4d935a2fadca914
Sold: 70609929.37 tokens for 4.28 ETH, (11 blocks later)
-------------------------------------------------------
21 0x6edbbc42669121106a9fb2f5c5cc47654fe1b45f
Sold: 70610394.16 tokens for 4.25 ETH, (14 blocks later)
-------------------------------------------------------
22 0x6f000cc839689b52a95fb0d52e401bd46c70a2de
Sold: 70610898.67 tokens for 3.89 ETH, (15 blocks later)
-------------------------------------------------------
23 0x716576481a689b124344d51a7ce2d018af019440
Sold: 70610203.74 tokens for 4.51 ETH, (14 blocks later)
-------------------------------------------------------
24 0x72fe3e85f3e84093ac0d2cef4474fbdb3d844ce8
Sold: 70612848.77 tokens for 3.80 ETH, (32 blocks later)
-------------------------------------------------------
25 0x8840db22a5f535dd10ed1253ee730f252a635e6d
Sold: 54241861.42 tokens for 2.99 ETH, (38 blocks later)
-------------------------------------------------------
26 0x8d1fd7aa0b88483a49e4a174a6ce1739849e81c5
Sold: 70609667.66 tokens for 4.36 ETH, (10 blocks later)
-------------------------------------------------------
27 0x94c3075bc4011f69026dbd54b74b22399cb40d4c
Sold: 70612571.88 tokens for 4.01 ETH, (32 blocks later)
-------------------------------------------------------
28 0xa19d50a87c4c50131b320e905327b71d22b7d7e4
Sold: 70612437.42 tokens for 4.13 ETH, (32 blocks later)
-------------------------------------------------------
29 0xa8d7e9930b8afe024189976eaba5a54b6fef9db9
Sold: 70610691.77 tokens for 4.11 ETH, (15 blocks later)
-------------------------------------------------------
30 0xbaaa383463a057cc95d60ddf7b40230d819e2e96
Sold: 70609336.94 tokens for 4.13 ETH, (6 blocks later)
-------------------------------------------------------
31 0xcdef6ce0abbad6426b32a785cb8604317fc91070
Sold: 70609417.76 tokens for 4.02 ETH, (6 blocks later)
-------------------------------------------------------
32 0xcdfb3337d1e4b1865c8cecd5668af79fb82a375a
Sold: 70611222.61 tokens for 3.59 ETH, (20 blocks later)
-------------------------------------------------------
33 0xde4e8e8a9541aa7050c1a6b7480bd728508b5da9
Sold: 70611334.42 tokens for 3.69 ETH, (20 blocks later)
-------------------------------------------------------
34 0xe96e6267c73378754709600130fdfd9b5f2892e7
Sold: 70611448.22 tokens for 3.50 ETH, (20 blocks later)
-------------------------------------------------------
35 0xe9757e2660a89a811b25fe2aff3cf995c88e7934
Sold: 70609583.09 tokens for 4.48 ETH, (10 blocks later)
-------------------------------------------------------
36 0xec2347d9c64922da279c5ee02ae71b949af6b924
Sold: 70610590.91 tokens for 4.02 ETH, (14 blocks later)
-------------------------------------------------------
37 0xeed804b484c9a27875b601445e12e34a625396f4
Sold: 70611924.50 tokens for 4.31 ETH, (31 blocks later)
-------------------------------------------------------
38 0xf7e522b8fd87096ae0db2dba4cc3b25d239e6c0c
Sold: 70609753.54 tokens for 4.23 ETH, (10 blocks later)
-------------------------------------------------------
39 0xf9de78b65bf0835a2634862aeae60f567ab9097f
Sold: 70609257.32 tokens for 4.25 ETH, (6 blocks later)
-------------------------------------------------------
TOTAL TOKENS SOLD: 2737458141.86
TOTAL ETH MADE: 157.44
TOTAL PROFIT: 85.416
**/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment