Practical Guide into Analyzing MEV in the Proof-of-Stake Era

Toni Wahrstätter
17 min readOct 18, 2022

--

If you’re only interested in some nice stats and visualization and you don’t need basic info to MEV, MEV-Boost or PBS, I’d recommend you to directly jump forward to the analysis section and check out mevboost.pics.
Special thanks to @bertcmiller and @metachris for their great support!
All code on Github.

With block 15,537,393, Ethereum has completed the transition to proof-of-stake. While on the application layer, things more or less stayed the same, Ethereum’s consensus layer has been completely redesigned. Ethereum 2.0 does not only come with better security and decentralization but also with new terminology that is essential to know when doing data analyses. Over the recent weeks, I started digging into the data that the beacon- and the eth1 chain together produce. In most parts, everything seemed quite familiar, yet completely new challenges arose. Since we are still very early, many trivial questions have not yet been answered publicly.

In this article, my goal is to provide a quick guide to analyzing Ethereum data through the example of MEV. The goal is to enable fellows a quick start into the Ethereum Data Science game, while learning something about a highly topical challenge, MEV.

Maximal Extractable Value (MEV), previously referred to as Miner Extractable Value has been a widely discussed topic in recent years. MEV extraction was dominated by a few specialized players, while ordinary users could only hope not to get affected by its negative externalities. With Ethereum’s switch to Proof-of-Stake and the introduction of Proposer-Builder-Separation (PBS), the game has been reshuffled, allowing common validators to benefit from MEV extraction themselves.

In the following, we will quantitatively analyze MEV, MEV-Boost, and the effects of the PoS-switch on MEV. This article might act as a guide to jump in and start digging deeper into the loads of data that Ethereum produces daily. The following is structured as follows:

Content

  1. Intro to MEV and MEV-Boost
  2. Data collection and Data Preproces
  3. Analysis of Post-Merge MEV
    General Overview
    — Quantifying MEV
    — Censorship
    — Successive Blocks

Intro to MEV

MEV stands for Maximal Extractable Value and represents the value which originates from non-arbitrary transaction ordering. This can result in different strategies, such as arbitrage trading or front- and back-running that target to optimize the total revenue per block.

In the PoW era, we relied on miners to determine the final order of transactions. This came with potential advantages for miners that have demonstrably been exploited for profit-maximizing reasons [1]. Miners could sell block space to willing bidders or engage in MEV-extraction themselves. In most cases, different actors, namely MEV-bots (searchers/sequencers), which were mostly operated by highly specialized teams, have predominantly been competing for MEV opportunities [2]. This didn’t leave much room for competition. Especially small actors, who usually couldn’t cope with the soft- and hardware requirements, were forced to quit the fight for MEV.

MEV can potentially lead to inefficient markets for block space that rely heavily on economies of scale. This leads to negative externalities such as network- and chain congestion. Moreover, putting block building into the hands of a few entities who then decide upon the content of blocks, opens the system up against censoring attacks by state actors [3].

What is MEV-Boost?

MEV-Boost is built by Flashbots and represents an optional software that employs proposer-builder separation (PBS). Validators can use MEV-Boost to capture the MEV in their proposed blocks themselves. Its goal is to democratize the MEV extraction by opening it up to common validators and allowing competitive markets for block space.

In theory, PBS mostly addresses the centralizing effect of MEV on the validator set by separating block production and block proposal. Validators (who eventually propose a block) have access to a market for blocks and select those blocks that bring the most profit. Consequently, block builders find themselves in a competitive market in which they have to outbid other builders to get selected by a validator. This mechanism results in (parts of) the captured MEV being shifted from the block builders to the validators [4]. PBS helps democratizing the most profitable block or MEV to any staker, however, introduces new risks such as builder centralization.For example, imagine a block builder B who created a revenue-optimized block in which amount x was extracted: Economically rational B would pay up to x-1 as a proposer payment to the validator for being selected. The bidding process is supposed to be executed as a sealed-bid auction, which should result in the highest bidders submitting a bid that is close to their actual value.

By the time of writing, it’s still done as an open-bid auction.

Source: https://github.com/flashbots/mev-boost

For some issues that are still under discussion, including latency issues, bid-withholding, etc., check out the discussion here.

Sitting between the consensus client/validator and the block builders, MEV-Boost represents the interface to the market of MEV-injected blocks. It is an independent piece of software that validators can use to receive more profitable blocks. If the software fails, validators automatically fall back to producing blocks locally. Commonly the phrase sidecar implementation is used to describe it.

The validator receives its MEV-injected blocks from relays through MEV-Boost. MEV-Boost can be configured to connect to multiple relays who, in turn, can connect to multiple builders. On the other end, we have searchers who create bundles of transactions that are eventually included in a block by a builder. A bundle is a sequence of transactions that are executed in a predefined order. It could be a sandwich attack, consisting of 3 transactions: The victim’s transaction, plus the front- and back run.

Importantly, the feeRecipient of a block may not always be the proposer. Instead, the builders use their addresses for the MEV extraction and include a transaction with the bid to the validator at the last position in the block. The validators can then take the block that maximizes their revenue.

The builders of Flashbots, BloXroute, and Eden follow the described approach and include a transaction with the payment to the validator. The builders of Manifold and Blocknative, on the other hand, directly write the proposer into the fee recipient field.

Technically, validators could connect to a single relay without even using MEV-Boost: By doing so they might miss the opportunity to get the most profitable block because it would be the job of MEV-Boost to select the best-paying block of all connected relays. Yet, in the case of a failing relay, the sidecar effect remains. This means validators would fall back and traditionally produce blocks locally, using the transactions they have in their local mem-pool.

To summarize the different actors:

Validator: Gets info about being selected to propose a block, and requests a block from a relay. Submits block and receives payment from the builder, obeys rules as defined in consensus-client.

MEV-Boost: Interface to block markets, can connect to multiple relays, sidecar design.

Relay: Can connect to multiple builders, aggregates blocks, and selects revenue-maximizing one from connected builders, acts as DDoS protection

Builder: Specialised actors connected to multiple relays and searchers. Take bundles (consisting of transactions) and create the final blocks, set themselves as feeRecipient so that the builders receive the block’s MEV (incl. fees), include transaction into the block with proposer payment to the validator.

Searcher: Highly specialized actors constantly looking for MEV opportunities, create bundles of transactions, and pass them to builders.

Open issues

One challenge, that was discussed actively in the Flashbots forum is exclusive order flows (EOF) and their potential threat to decentralized block building. Every builder is dependent on the transactions that he receives. This means the “better” the transactions to which a builder has access, the better the final blocks. Because there is nothing like a transparent mem-pool including every existing unconfirmed transaction, builders might establish private agreements with 3rd parties (that produce high MEV transactions) to exclusively receive their transactions. The reason why builders would engage in that is to boost their profits and reputation. Furthermore, builders could engage in market manipulation by exclusively including the transactions of app X while strictly ignoring those of rival Y.

The outcome could be a scenario in which we’d have a few specialized builders that all have special agreements with applications (e.g. Infura) for exclusively serving their transactions. The result would be centralization.

While on-chain data is great because of properties like immutability, verifiability, and transparency, mem-pool data is different: There is nothing like “THE meme pool”. Everybody has an individual perception of what is going on and parties like Infura have huge impact in forwarding transactions to searchers.

Check out this post for more details on that topic.

Another issue commonly raised concerning a centralized set of builders is censorship. There are many open questions regarding the extent of the power that block builders should have. Just recently, Vitalik shared a great blog post on that topic. Summarizing, there are different approaches to how one could tackle that problem. Most prominently using crLists or proposer suffixes. Nevertheless, no final conclusions have been drawn yet.

Also Flashbots has announced some major update on the censorship topic: Phil Daian announced SUAVE at the end of his talk at Devcon, which will essentially include an encrypted mempool and builder decentralization.

https://twitter.com/hasufl/status/1580983853824765952?s=20&t=UOxIgbhAK86qiRKkBkSd6w

Data collection

Before we can start analyzing the dynamics of MEV-Boost, we have to decide how the final data set should look to allow us to uncover interesting insights. In our example, we want to have information about every MEV-boosted block. This includes consensus layer information such as the builder_publickey ,proposer_paymentor the slotnr but also execution layer data like eth1_fee_recipient and information about every transaction included in respective blocks.

The code was open-sourced in the mevboost.pics repository on Github.

Summary of the data pipeline.

For data on MEV-Boost, we use the Relay API to parse every slot since the Merge and collect information about the validator & block builder of the respective slot. More technically, we use the ProposerPayloadsDelivered endpoint to retrieve that data from the Relay Data API. Since we have multiple Relay services, we have to query all of them to obtain a complete picture. In the following, we use the following relays:

flashbots =          “https://boost-relay.flashbots.net" 
bloxroute_ethical = “https://bloxroute.ethical.blxrbdn.com"
bloxroute_max_profit=“https://bloxroute.max-profit.blxrbdn.com"
bloxroute_regulated =“https://bloxroute.regulated.blxrbdn.com"
manifold = “https://mainnet-relay.securerpc.com"
eden = “https://relay.edennetwork.io/"
blocknative = "https://builder-relay-mainnet.blocknative.com"

Find a sample query here:
https://boost-relay.flashbots.net/relay/…

We use Python to loop over batches of 100 slots to avoid reaching API limits. The script is quite short and easy to read. It produces handy .csv files with the information retrieved from the Data API. The script can be run in a background process, allowing users to maintain up-to-date information on MEV-boosted blocks.

Eventually, we build a data set with the following structure:

relay,slot,block_hash,builder_pubkey,value,gas_used,gas_limit
flashbots,4766498,0xaa6052c740c80d505b943f76a49ea6275b97474baeeeecc7f2ad9c0f2c4019cd,0xa1dead01e65f0a0eee7b5170223f20c8f0cbf122eac3324d61afbdb33a8885ff8cab2ef514ac2c7698ae0d6289ef27fc,31293598656430125,9494173,30000000
flashbots,4766497,0x6206836f31e44d708af7ab0c3d17bdf97bd826ee4ae4e95716b3fef4d7143993,0xb194b2b8ec91a71c18f8483825234679299d146495a08db3bf3fb955e1d85a5fca77e88de93a74f4e32320fc922d3027,44017960531793406,10817487,30000000
...

The collected data does already contain enough information for setting up a Twitter bot that broadcasts significantly high proposer payments (payments from builders to validators for taking their block). Check it out and consider following.

Next, we enrich our data set with execution layer data. We use the web3.eth Python library to query blocks and collect information about the transactions. Our goal is to enrich the data by adding the following information to every row:

  • block number — eth1 block number
  • fee_recipient/miner — the builder of the block
  • txs — all transactions in the respective block

As mentioned above, within the minerfield of MEV-boosted blocks, we won’t always find the proposer’s address, but instead, the address of the block builder. This is important to be aware of to not interpret the figures wrong.

We collect the transactions of every block to analyze which builders/relayers participate in censoring the network by not including transactions to Tornado Cash.

As a reminder, Tornado Cash is of fundamental importance: It allows users to regain their privacy by anonymizing funds, making it an extremely important tool against mass surveillance. If you haven’t checked it out, definitely do so.

Collecting execution layer data

When it comes to execution layer data such as information about transactions or even more specifically, contract interactions, one could use an archive node (if available) for accessing the required data. Furthermore, using the web3 library + Infura might be the most intuitive way to take, however, Infura doesn’t support historic logs of contracts without having a paid subscription. Finally, one could use TheGraph for that job.

Another option, which I prefer to use is Ethereum-datafarm (shameless self-promotion alert). It’s a command line tool written in Python that uses the Etherscan API to parse contract logs directly into .csv files. This comes without requiring anything but a free Etherscan API key (and trust me, Etherscan’s limits are more than reasonable — never had any issues).

We use Ethereum-datafarm to collect information about the existing Tornado Cash contracts. We want to have a list of all transaction hashes since the Merge in which a Tornado Cash Deposit or Withdrawal Event (Transfer for $TORN) was emitted. This allows us to then analyze which relays and builders include those transactions and which censors the network by actively ignoring them. Please refer to this tutorial for additional information on how to use Ethereum-datafarm.

To collect information about block rewards, we use the Etherscan API again. This could also be done using Infura but requires a lot of requests since every transaction within a block has to be queried to determine the total reward of a block. Unfortunately, such information is not available within a block directly. This would require aggregating gas_used*gas_price for every transaction in that block and then deducting the base fee (EIP-1559) which gets burned. Instead, the Etherscan API offers an endpoint to retrieve that information:

Example: https://api.etherscan.io/api?module=block&acti…

Finally, we use Web3.py together with an Infura RPC endpoint to get information about the blocks. Our goal is to illuminate the proposer payments by separating them into MEV and transaction fees. Further, we aim to retrieve the spread between the block reward (consisting of transaction fees) and the MEV-boost proposer payment to determine the theoretical MEV per block.

All the scripts are available on my Github, here. In summary, they have the following purposes:

  • enrich_data.py is used to add additional information (block_nr, fee_recipient, and transaction data) to the parsed data.
  • add_block_rewards.py is used to add the reward/block to the data set.
  • dataprep.py is used to prepare the data for plotting.
  • chartprep.py is used to create the final HTML file with the charts.
  • twitterbot.py continuously scans the collected data for high proposer payments and tweets about it.
  • logger.py creates logs for monitoring purposes.

Analysis of Post-Merge MEV

In the following, our goal is to visualize multiple selected metrics to better understand the dynamics of post-merge MEV and the role that MEV-Boost plays in the bigger picture of PBS. We will try to do so by providing insightful visualizations.

Note that, if the resolution of the charts is not sufficient, head over to mevboost.pics to see the up-to-date versions in better quality.

When analyzing MEV-Boost, it is important to differentiate between relays and builders when concluding. Since builders could potentially send their blocks to every relay, the number of blocks per relay may become less meaningful over time and does not say something about the success of a specific company in the MEV game. By the time or writing, most relays are served exclusively by builders that belong to the same company as the relay.

Furthermore, builders may have different views of the mem-pool and receive different bundles from searchers. Thus, one cannot conclude that a specific builder produces better/more profitable blocks than another. Instead, one can only compare how well different setups (consisting of searchers, builders, and relays) perform, in comparison to others.

General overview

MEV-boosted blocks vs. total blocks

Screenshot of Oct. 18

The chart depicts the total cumulative share of MEV-boosted blocks, broken down by the relay providers. We can see that, at the time of writing, more than 50 % of all slots are filled with blocks created by third-party block builders. Furthermore, a clear trend toward using MEV-Boost is visible: The percentage of MEV-boosted blocks increased by 30 % within the last 3 weeks.

Screenshot of Oct. 18

Looking at the above pie charts, we can see that 46.8 % of the total block, have been built locally, not using MEV-Boost . The pie chart on the right clearly shows that the Flashbots relay is the most frequently used relay. Flashbots dominate this category, accounting for 78.6% of the total blocks relayed.

Focusing on the block builders, the picture looks quite different, although Flashbots is again clearly in the lead. The 4 Flashbots builders are responsible for more than 50% of the total MEV-boosted blocks. Detailed stats on builder, f.e. the number of built blocks, are visible on mevboost.org.

Screenshot of Oct. 18

Which builders collaborate with which relay?

As mentioned above, each builder can technically work with all the existing relays. So builders are free to choose the relays he wants to send their blocks to. At least in theory. Looking at the Sankey diagram below, we can see that most relay provides are exclusively served by their own builders. The Flashbots builders, for example, exclusively serve the Flashbots relay. The same holds true for Blocknative, Eden and Manifold. BloXroute, on the other hand, has already been sending blocks to other relays than their own, namely the Flashbots relay.

Interestingly, we have can observe a long tail of anonymous builders that submit their blocks to the Flashbots relay. Finally, we can see Builder 0x69, also serving the Flashbots relay.

Screenshot of Oct. 18

Quantifying MEV

Screenshot of Oct. 18

Quantifying MEV has been challenging to do for many reasons. We somehow have to quantify the true value of a block. Pre-Merge, the value of a block was the sum of the transaction fees, the miner reward, and the captured MEV:

blockValue = txFees + minerReward + MEV

Post-Merge, it’s still the same without the miner reward:

blockValue = txFees + MEV

Previously, it was difficult to measure the MEV per block. With MEV-Boost we now have a much simpler method to quantify the potential MEV per block. Assuming that the proposer payment is a measure of the true value of a block, soblockValue , and knowing the txFees,we can determine the MEV of each block.

Notably, searchers can pay the builder through both, coinbase payments and txsFees. Therefore, some parts that we’d now classify as txFees, should be MEV.

Remember that the block bidding process is supposed to be carried out as a sealed bid auction, causing the block builders to submit blocks with proposer payments close to the block’s true value.By subtracting the txFees from the blockValue, we get a reasonable estimate of the MEV in a block.

Importantly, we have to assume the following:

  • MEV-Builders capture 100% of the maximum MEV per block.
  • MEV-Builder passes close to 100% of the captured MEV to the proposer via the proposer payment.

Of course, Builders are not forced to pass 100% to the validator. Builders could also take a cut of e.g. 5% of the total MEV for themselves.

What about censorship?

It’s important to stress, that censorship resistance is one of the most important properties for Ethereum to have. Therefore, the switch to PoS has been carefully investigated by the community to not introduce censorship through PBS.

With the OFAC banning Tornado Cash transactions and Flashbots announcing to comply, the introduction of MEV-Boost was carried out under many critical eyes.

Block building comes with much power. The block builders decide upon the inclusion of transactions and their order. If block builders decide to not include certain transactions, they are delayed until some other, non-censoring builder takes them up. Thus, block construction can be exploited for introducing censorship and can have harmful effects on the ecosystem as a whole.

Created at slot 4880782

To produce the above chart, we collect every transaction that interacted with an active Tornado Cash implementation. We collect every transaction that led to an event emission from the Tornado Cash ETH, DAI, USDC, cDAI, wBTC, and USDT contracts (see appendix). Then we compare the blocks of the respective relay providers with the blocks that contain Tornado Cash transactions to see which provider incorporates/censors them.

As shown, Flashbots is 100% OFAC compliant by censoring Tornado Cash transactions. For other relays, we can still see blocks with transactions of Tornado Cash coming through. It’s important to stress that Flashbots has been transparent about its operations and the reasons for doing so are clear too: Compliance.

Notably, the question of whether the precence of Falshbots as a builder/relay is still desirable, has been publicly discussed. Importantly, Flashbots open-sourced MEV-Boost and MEV-Boost Relay, enabling competition to get in. With the serious competition that does not censor specific transactions, users should be able to get their transactions included at any time, though, might have to pay more for that and accept some delay.

Successive Blocks

Created at slot 4851477

Since the merge, we were able to observe thousands of successive blocks being built by the same block builder. As visible above, Flashbot’s babe, dead, and beef builders created around 2700 successive blocks. The main issue with entities building successive is the possibility to manipulate oracles for multi-block MEV extraction (TWAP Oracle Attacks). In this context, it’s important to stress that the community is aware of the described attack.

Though, with now having MEV-Boost, an attacker can observe the set of upcoming proposers: If the attacker finds two successive proposers that have both been proposing blocks (e.g.) through the manifold relay in the past, then the attacker can anticipate the attack. With a large enough proposer payment (the avg. is currently around 0.1 ETH), two successive blocks can easily be bought.

We have already seen individual DeFi protocols (Fraktal Protocol) buying an entire block for reward distribution payments (check out the manifold blocks for that):

For more insights on that topic, check out the links that Alex from Flashbots posted here.

Conclusion

Although it looks like MEV-Boost is yet another new complicated and fancy addition to the extensive terminology that newcomers need to understand to slightly understand Ethereum as a whole, it comes with significant simplifications on the user/client side. With PBS, clients no longer need to build their blocks, but can, at least in theory, fully rely on third parties. This helps reduce hardware requirements on the customer side and ultimately benefits decentralization. Clients won’t have to think about profit maximization and can simply outsource it without giving up any benefits.

MEV-Boost came with tons of new data that turned out to be perfectly suited for quantitative data analyses. To summarize, Ethereum represents a great subject to research on. Immutable and transparent data, combined with the Open-Source spirit within the Ethereum ecosystem constitute a solid foundation for exciting research.

Feel free to contact me for feedback or questions!

Also check out tornado-warning.info for further information on the current state of censorship on Ethereum. — Not to be taken very seriously.

References

[1] Eskandari, S., Moosavi, S. and Clark, J., 2019, February. Transparent Dishonesty: front-running attacks on Blockchain. In 3rd Workshop on Trusted Smart Contracts (WTSC). http://fc19.ifca.ai/wtsc/TransparentDishonesty.pdf

[2] P. Daian et al., 2019, “Flash Boys 2.0: Frontrunning, Transaction Reordering, and Consensus Instability in Decentralized Exchanges”, https://ieeexplore.ieee.org/abstract/document/9152675

[3] Alex Obadia, Flashbots: Frontrunning the MEV Crisis https://medium.com/flashbots/frontrunning-the-mev-crisis-40629a613752

[4] Vitalik Buterin, 2021, Proposer/block builder separation-friendly fee market designs, https://ethresear.ch/t/proposer-block-builder-separation-friendly-fee-market-designs/9725

[5] P. Daian et al., 2020, “Flash Boys 2.0: Frontrunning in Decentralized Exchanges, Miner Extractable Value, and Consensus Instability,” 2020 IEEE Symposium on Security and Privacy (SP), pp. 910–927, doi: 10.1109/SP40000.2020.00040.

More on related content:

How much can we constrain builders without bringing back heavy burdens to proposers? — Vitalik

https://docs.flashbots.net/flashbots-mev-boost/resources

Find some more great papers with deep insights into MEV in the following:

Daian et al.: Flash Boys 2.0: Frontrunning, Transaction Reordering, and Consensus Instability in Decentralized Exchanges

Daian et al.: Flash Boys 2.0: Frontrunning in Decentralized Exchanges, Miner Extractable Value, and Consensus Instability

Appendix

0x77777FeDdddFfC19Ff86DB637967013e6C6A116C,torn,
0x12D66f87A04A9E220743712cE6d9bB1B5616B8Fc,tornadocash01eth,
0x12D66f87A04A9E220743712cE6d9bB1B5616B8Fc,tornadocash01eth,
0x910Cbd523D972eb0a6f4cAe4618aD62622b39DbF,tornadocash10eth,
0x47CE0C6eD5B0Ce3d3A51fdb1C52DC66a7c3c2936,tornadocash1eth,
0x910Cbd523D972eb0a6f4cAe4618aD62622b39DbF,tornadocash10eth,
0x47CE0C6eD5B0Ce3d3A51fdb1C52DC66a7c3c2936,tornadocash1eth,
0xA160cdAB225685dA1d56aa342Ad8841c3b53f291,tornadocash100eth,
0xA160cdAB225685dA1d56aa342Ad8841c3b53f291,tornadocash100eth,
0xD4B88Df4D29F5CedD6857912842cff3b20C8Cfa3,tornadocash01kdai,
0xD4B88Df4D29F5CedD6857912842cff3b20C8Cfa3,tornadocash01kdai,
0xFD8610d20aA15b7B2E3Be39B396a1bC3516c7144,tornadocash1kdai,
0xFD8610d20aA15b7B2E3Be39B396a1bC3516c7144,tornadocash1kdai,
0x07687e702b410Fa43f4cB4Af7FA097918ffD2730,tornadocash10kdai,
0x07687e702b410Fa43f4cB4Af7FA097918ffD2730,tornadocash10kdai,
0x23773E65ed146A459791799d01336DB287f25334,tornadocash100kdai,
0x23773E65ed146A459791799d01336DB287f25334,tornadocash100kdai,
0x22aaA7720ddd5388A3c0A3333430953C68f1849b,tornadocash5kcdai,
0x22aaA7720ddd5388A3c0A3333430953C68f1849b,tornadocash5kcdai,
0x03893a7c7463AE47D46bc7f091665f1893656003,tornadocash50kcdai,
0x03893a7c7463AE47D46bc7f091665f1893656003,tornadocash50kcdai,
0x2717c5e28cf931547B621a5dddb772Ab6A35B701,tornadocash500kcdai,
0x2717c5e28cf931547B621a5dddb772Ab6A35B701,tornadocash500kcdai,
0xD21be7248e0197Ee08E0c20D4a96DEBdaC3D20Af,tornadocash5mcdai,
0xD21be7248e0197Ee08E0c20D4a96DEBdaC3D20Af,tornadocash5mcdai,
0xd96f2B1c14Db8458374d9Aca76E26c3D18364307,tornadocash100usdc,
0xd96f2B1c14Db8458374d9Aca76E26c3D18364307,tornadocash100usdc,
0x4736dCf1b7A3d580672CcE6E7c65cd5cc9cFBa9D,tornadocash1kusdc,
0x4736dCf1b7A3d580672CcE6E7c65cd5cc9cFBa9D,tornadocash1kusdc,
0x169AD27A470D064DEDE56a2D3ff727986b15D52B,tornadocash100usdt,
0x169AD27A470D064DEDE56a2D3ff727986b15D52B,tornadocash100usdt,
0x0836222F2B2B24A3F36f98668Ed8F0B38D1a872f,tornadocash1000usdc,
0x0836222F2B2B24A3F36f98668Ed8F0B38D1a872f,tornadocash1000usdc,
0x178169B423a011fff22B9e3F3abeA13414dDD0F1,tornadocash01wbtc,
0x178169B423a011fff22B9e3F3abeA13414dDD0F1,tornadocash01wbtc,
0x610B717796ad172B316836AC95a2ffad065CeaB4,tornadocash1wbtc,
0x610B717796ad172B316836AC95a2ffad065CeaB4,tornadocash1wbtc,
0xbB93e510BbCD0B7beb5A853875f9eC60275CF498,tornadocash10wbtc,
0xbB93e510BbCD0B7beb5A853875f9eC60275CF498,tornadocash10wbtc

--

--