<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>gokgokdak</title>
        <link>https://paragraph.com/@gokgokdak</link>
        <description>undefined</description>
        <lastBuildDate>Fri, 14 Aug 2026 00:44:46 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <image>
            <title>gokgokdak</title>
            <url>https://storage.googleapis.com/papyrus_images/ad2226e2f31e0153e4015b6971f98e770674cf73189389580f09f435a1768435.png</url>
            <link>https://paragraph.com/@gokgokdak</link>
        </image>
        <copyright>All rights reserved</copyright>
        <item>
            <title><![CDATA[How to use Tornado Cash in 2025 (Run the command line tool from Python source code)]]></title>
            <link>https://paragraph.com/@gokgokdak/how-to-use-tornado-cash-in-2025-run-the-command-line-tool-from-python-source-code</link>
            <guid>ln3oFg8HYW8qATQTQTw9</guid>
            <pubDate>Tue, 07 Oct 2025 16:38:44 GMT</pubDate>
            <description><![CDATA[Security Warnings:Only run the open source code and scripts locally or binaries compiled on your machineDo not trust or use ANY Tornado Cash service from the webpage or IPFSThere’s no longer any such thing as an "official website" after the sanctionsAny websites that claim themselves as "official" are 100% FAKESee 👉 [Block Domain] Fake ethereum Tornado cash websites PhishingBackgroundI got scammed by a Tornado Cash honeypot website and it really frustrated me, so I did a lot of research and ...]]></description>
            <content:encoded><![CDATA[<p><strong><em>Security Warnings:</em></strong></p><ol><li><p><em>Only run the open source code and scripts locally or binaries compiled on your machine</em></p></li><li><p><em>Do not trust or use </em><strong><em>ANY</em></strong><em> Tornado Cash service from the webpage or IPFS</em></p></li><li><p><em>There’s no longer any such thing as an &quot;official website&quot; after the sanctions</em></p></li><li><p><em>Any websites that claim themselves as &quot;official&quot; are 100% </em><strong><em>FAKE</em></strong></p></li><li><p><em>See 👉 </em><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/MetaMask/eth-phishing-detect/issues/13826"><em>[Block Domain] Fake ethereum Tornado cash websites Phishing</em></a></p></li></ol><h1 id="h-background" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Background</h1><p>I got scammed by a Tornado Cash honeypot website and it really frustrated me, so I did a lot of research and found out that almost all of the Tornado Cash websites are fake.</p><p>And actually, there is no need for an “Official“ website to use the Tornado Cash, since it is an open sourced protocol.</p><p>So the best way to use it is write a simple script yourself, or using an existing code, to interact with the smart contract.</p><h1 id="h-code-repositories" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Code Repositories</h1><ul><li><p><strong>The official one</strong> - <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/tornadocash/tornado-cli">https://github.com/tornadocash/tornado-cli</a></p></li></ul><p>Although the official website is dead and there are many phishing website that imitates it closely, the official code repository remains archived but outdated and has not been maintained for years after the sanctions.</p><ul><li><p><strong>Community alternative A</strong> - <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://git.tornado.ws/tornadocash/tornado-cli">https://git.tornado.ws/tornadocash/tornado-cli</a></p></li></ul><p>A fork of the official repository, running it from source code requires older version of node.js runtime and dependency, which cost me a lot of time to set up the environment.</p><p>Even though it provides a prebuilt Windows executable for convenient, I don’t think I can trust it.</p><ul><li><p><strong>Community alternative B</strong> - <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/gokgokdak/tornadocash-py">https://github.com/gokgokdak/tornadocash-py</a></p></li></ul><p>I hate Javascript personally and I really don’t want to develop new features based on it, so I re-implement the whole <code>tornado-cli</code> in Python and add some cool features like “Batch Deposit“.</p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/gokgokdak/tornadocash-py">https://github.com/gokgokdak/tornadocash-py</a></p><p>In the Python version, contract event cache was managed by SQLite database instead of JSON files. I create a Github repository to publish the latest database cache per 15 days.</p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/gokgokdak/tornadocash-db">https://github.com/gokgokdak/tornadocash-db</a></p><p>This tutorial is based on the <code>tornadocash-py</code> implementation, if you want to use the original cli tool, please checkout another article 👉 <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://mirror.xyz/0xac295671C427cbe1bFd54d9910B11382E19cbd4a/SGIFLQLs-HBY7Q1B-CfLtCTdLN8qmzQa9SEpyDd4JH8">How to Use the Tornado-CLI Command Line Tool</a></p><h1 id="h-step-1-download-the-source-code" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Step 1: Download the source code</h1><p>Git clone or download the repository to your local machine.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/d526e1bc495ab9923a3da79705edad28a29aacaac569c1630196bcdf824240cf.png" alt="Download the source code" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">Download the source code</figcaption></figure><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/2d70c0220ac8bf7d5ecc996fa55a455bf1832ccbe8c874add0a6e2c37050e1a5.png" alt="Download the source code" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">Download the source code</figcaption></figure><h1 id="h-step-2-download-the-database-cache" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Step 2: Download the database cache</h1><p>To make a withdrawal from the Tornado Cash smart contract, user are required to provide a zero knowledge proof calculated from the latest merkle tree.</p><p>The merkle tree contains all historical commitments, which means we have to download all the deposit events from the blockchain.</p><p>To skip the blockchain syncing, just download the latest database cache from Github.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/23f2b5d02fcf99285fce4a48d7bfcb5b1a098235ee48a66ef74bab4a13823836.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>Under the <code>db</code> directory of the project, you should see these <code>.sqlite</code> files.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/0ccf9223612dc9d2c59c8e289426a63642eac3efebc7928d9e9cb99c3edb03fd.png" alt="Download the database" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">Download the database</figcaption></figure><h1 id="h-step-3-install-the-pip-packages" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Step 3: Install the PIP packages</h1><p>Under the source code directory, simply run <code>pip install -r requirements.txt</code></p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/3c7f46adffed5452378ce1d09ea74c70cb464a4c4e515af137283e3fc8f13b1c.png" alt="Install PIP dependencies" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">Install PIP dependencies</figcaption></figure><h1 id="h-make-a-deposit" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Make a deposit</h1><p>The command line option is <code>python cli.py --deposit &lt;key&gt; &lt;chain&gt; &lt;symbol&gt; &lt;unit&gt;</code></p><ul><li><p><code>key</code>: The address contains ETHs to deposit, also pay for the gas fee</p></li><li><p><code>chain</code>: Which chain to deposit, <code>ethereum</code>, <code>polygon</code>, <code>bsc</code>, <code>avalance</code>, <code>optimism</code> and <code>arbitrum</code>, etc…</p></li><li><p><code>symbol</code>: Which kind of coins or token, <code>eth</code>, <code>dai</code>, <code>pol</code>, <code>usdt</code> and <code>usdc</code>, etc…</p></li><li><p><code>unit</code>: How many coins to deposit, for ETH, avaialable units are <code>0.1</code>, <code>1</code>, <code>10</code>, <code>100</code></p></li></ul><p>The private note will be like: <code>ethereum-eth-0.1-d9a5f2eb782a50932fec4fdeecf0bda409070686caecb68bfd9822192f6626-14e44248c0956fba5259651f617a771ac54c3df2a65e64392bd30203e66f1c</code>, please keep it private.</p><p>If succeed, you should see console output like below:</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/b728c323bca9682c826b468bcb201ea542a62974e2b2ee80fe0e6c32b60a74fc.png" alt="Deposit example" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">Deposit example</figcaption></figure><h1 id="h-make-a-batch-deposit" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Make a batch deposit</h1><p>This is my favorite feature😋</p><p>For example, you have an address holds 136 ETHs and 11000 POLs, going to deposit them separately into 1x100 ETHs, 2x10 ETHs and 16x1 ETHs on Ethereum mainnet, also 1x10000 POLs and 1000 POLs on Polygon, you could do this in one command.</p><p>I don’t have too much money so I will demonstrate it in 3x0.1 ETHs</p><p>The command line option is <code>python cli.py &lt;key&gt; &lt;json&gt;</code></p><p><code>key</code>: The address contains ETHs to deposit and pay for the gas fee</p><p><code>json</code>: Specify the multi-deposit configuration in JSON string, <code>“{ ‘&lt;chain&gt;‘: { ‘&lt;symbol&gt;‘: { ‘&lt;unit&gt;‘: &lt;num_of_deposit&gt; } } }“</code></p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/1a895e1054d19038f2ef18f08aafffa2db88beb2410f2e201725113c1c8d33e5.png" alt="Batch deposit example" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">Batch deposit example</figcaption></figure><h1 id="h-make-a-withdraw" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Make a withdraw</h1><p>The command line option is <code>python cli.py --withdraw &lt;note&gt; &lt;recipient&gt; &lt;key/relayer&gt;</code></p><p><code>note</code>: The private note generated during the deposit</p><p><code>key/relayer</code>: Private key to pay for the gas fee</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/3c4025e74dbc12f12bc877f96a6fa47b827af788acf7404cba7bc012eda15e56.png" alt="Withdraw example" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">Withdraw example</figcaption></figure><h1 id="h-make-a-withdraw-with-a-relayer" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Make a withdraw with a relayer</h1><p>The command line option is <code>python cli.py --withdraw &lt;note&gt; &lt;recipient&gt; &lt;key/relayer&gt;</code></p><p><code>note</code>: The private note generated during the deposit.</p><p><code>key/relayer</code>: The relayer to pay for the gas fee</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/2932285134130bc9e644b44536dd37708a3aae7d0a1729530151b83f11f932ba.png" alt="Withdraw example with a relayer" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">Withdraw example with a relayer</figcaption></figure><h1 id="h-keep-synced-to-the-block-chain" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Keep synced to the block chain</h1><p>To sync a single deployment: <code>python cli.py --sync &lt;chain&gt; &lt;symbol&gt; &lt;unit&gt;</code></p><p>To sync all contract deployments: <code>python cli.py --sync_all</code></p><p>It is recommended to keep the program running to stay synchronized with the blockchain, simply add a <code>--keep</code> option to <code>--sync</code> or <code>--sync_all</code> command.</p><h1 id="h-whats-more" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">What’s more</h1><p>The WebUI interface is under developing, which will supports wallet connect.</p><p>Buy me a coffee if you like this project😘</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/4e9b505067364a8cfd87fd51f1b3d48f21428d7960487fdc7ca68c7a5cb6ebbe.png" alt="EVM Address: 0xd54eA9e8106227080f72bfD4b9d99BbD96Eacd11" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">EVM Address: 0xd54eA9e8106227080f72bfD4b9d99BbD96Eacd11</figcaption></figure>]]></content:encoded>
            <author>gokgokdak@newsletter.paragraph.com (gokgokdak)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/5b9cb984010ceee977889e0224c8446f180927a853bb6e041522119d92332be7.jpg" length="0" type="image/jpg"/>
        </item>
    </channel>
</rss>