<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: THE CODE DOCTOR</title>
    <description>The latest articles on Forem by THE CODE DOCTOR (@thecodedoctor).</description>
    <link>https://forem.com/thecodedoctor</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F795417%2F3bde8848-1d9d-43b6-b0f0-0dceeb4c9167.png</url>
      <title>Forem: THE CODE DOCTOR</title>
      <link>https://forem.com/thecodedoctor</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/thecodedoctor"/>
    <language>en</language>
    <item>
      <title>03.DEFI ATTACKS - Falsche Slippagekalkulation</title>
      <dc:creator>THE CODE DOCTOR</dc:creator>
      <pubDate>Wed, 02 Oct 2024 10:16:02 +0000</pubDate>
      <link>https://forem.com/thecodedoctor/03defi-attacks-falsche-slippagekalkulation-4d3k</link>
      <guid>https://forem.com/thecodedoctor/03defi-attacks-falsche-slippagekalkulation-4d3k</guid>
      <description>&lt;p&gt;Die Slippage-Parameter sollten in etwa als "minTokensOut" definiert sein – also die minimale Anzahl an Token, die der Nutzer bei einem Swap akzeptieren würde. Alles, was davon abweicht, sollte als Warnsignal betrachtet werden, da dies höchstwahrscheinlich einen fehlerhaften Slippage-Parameter darstellt.&lt;/p&gt;

&lt;p&gt;Zur Veranschaulichung könnte man sich diesen vereinfachten &lt;a href="https://github.com/OriginProtocol/origin-dollar/blob/bf4ff28d5944ecc277e66294fd2c702fee5cd58b/contracts/contracts/strategies/ThreePoolStrategy.sol#L204" rel="noopener noreferrer"&gt;Code&lt;/a&gt; aus OpenZeppelins Audit von Origin Dollar ansehen. Hierbei wird gezeigt, dass falsche oder ungenaue Slippage-Parameter potenziell zu einem ungewollten Verlust von Vermögenswerten führen können, wenn der minimale Token-Ausgang nicht korrekt festgelegt ist.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;withdraw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt; &lt;span class="nx"&gt;_recipient&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;address&lt;/span&gt; &lt;span class="nx"&gt;_asset&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;uint256&lt;/span&gt; &lt;span class="nx"&gt;_amount&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;external&lt;/span&gt; &lt;span class="nx"&gt;onlyVault&lt;/span&gt; &lt;span class="nx"&gt;nonReentrant&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;

    &lt;span class="c1"&gt;// Calculate how much of the pool token we need to withdraw&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;uint256&lt;/span&gt; &lt;span class="nx"&gt;contractPTokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;uint256&lt;/span&gt; &lt;span class="nx"&gt;totalPTokens&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;_getTotalPTokens&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="nx"&gt;uint256&lt;/span&gt; &lt;span class="nx"&gt;poolCoinIndex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;_getPoolCoinIndex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;_asset&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="c1"&gt;// Calculate the max amount of the asset we'd get if we withdrew all the&lt;/span&gt;
    &lt;span class="c1"&gt;// platform tokens&lt;/span&gt;
    &lt;span class="nx"&gt;ICurvePool&lt;/span&gt; &lt;span class="nx"&gt;curvePool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ICurvePool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;platformAddress&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;uint256&lt;/span&gt; &lt;span class="nx"&gt;maxAmount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;curvePool&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;calc_withdraw_one_coin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nx"&gt;totalPTokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nf"&gt;int128&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;poolCoinIndex&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Calculate how many platform tokens we need to withdraw the asset amount&lt;/span&gt;
    &lt;span class="nx"&gt;uint256&lt;/span&gt; &lt;span class="nx"&gt;withdrawPTokens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;totalPTokens&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mul&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;_amount&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;div&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;maxAmount&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Calculate a minimum withdrawal amount&lt;/span&gt;
    &lt;span class="nx"&gt;uint256&lt;/span&gt; &lt;span class="nx"&gt;assetDecimals&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Helpers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getDecimals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;_asset&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="c1"&gt;// 3crv is 1e18, subtract slippage percentage and scale to asset&lt;/span&gt;
    &lt;span class="c1"&gt;// decimals&lt;/span&gt;
    &lt;span class="c1"&gt;// @audit not using user-provided _amount, but calculating a non-sensical&lt;/span&gt;
    &lt;span class="c1"&gt;// value based on the LP tokens&lt;/span&gt;
    &lt;span class="nx"&gt;uint256&lt;/span&gt; &lt;span class="nx"&gt;minWithdrawAmount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;withdrawPTokens&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mulTruncate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;uint256&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="nx"&gt;e18&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;maxSlippage&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;scaleBy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;int8&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;assetDecimals&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

    &lt;span class="nx"&gt;curvePool&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;remove_liquidity_one_coin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nx"&gt;withdrawPTokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nf"&gt;int128&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;poolCoinIndex&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="nx"&gt;minWithdrawAmount&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Und die &lt;a href="https://github.com/OriginProtocol/origin-dollar/pull/716/files" rel="noopener noreferrer"&gt;korrigierte Version&lt;/a&gt; nach dem Audit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;curvePool&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;remove_liquidity_one_coin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;withdrawPTokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nf"&gt;int128&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;poolCoinIndex&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nx"&gt;_amount&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Auditoren sollten sicherstellen, dass die Slippage-Parameter klar definiert sind und keine versteckten Risiken für den Benutzer darstellen.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Weitere Beispiele findest du in den folgenden Verweisen:&lt;/strong&gt; &lt;br&gt;
&lt;a href="https://code4rena.com/reports/2021-04-vader#h-15-wrong-slippage-protection-on-token---token-trades" rel="noopener noreferrer"&gt;1 - [H-15] Wrong slippage protection on Token -&amp;gt; Token trades&lt;/a&gt;, &lt;br&gt;
&lt;a href="https://github.com/sherlock-audit/2023-02-notional-judging/issues/12" rel="noopener noreferrer"&gt;2 - Ineffective slippage mechanism when redeeming proportionally&lt;/a&gt;, &lt;br&gt;
&lt;a href="https://github.com/sherlock-audit/2023-02-notional-judging/issues/10" rel="noopener noreferrer"&gt;3 - Slippage/Minimum amount does not work during single-side redemption&lt;/a&gt;, &lt;br&gt;
&lt;a href="https://github.com/sherlock-audit/2023-01-illuminate-judging/issues/16" rel="noopener noreferrer"&gt;4 - Illuminate's PT doesn't respect users' slippage specifications for underlying&lt;/a&gt;, &lt;br&gt;
&lt;a href="https://github.com/sherlock-audit/2023-02-notional-judging/issues/18" rel="noopener noreferrer"&gt;5 - Oracle slippage rate is used for checking primary and secondary ratio&lt;/a&gt;, &lt;br&gt;
&lt;a href="https://github.com/sherlock-audit/2022-10-rage-trade-judging/issues/39" rel="noopener noreferrer"&gt;6 - WithdrawPeriphery uses incorrect value for MAX_BPS which will allow much higher slippage than intended&lt;/a&gt;,&lt;br&gt;
&lt;a href="https://solodit.xyz/issues/7240" rel="noopener noreferrer"&gt;7 - &lt;/a&gt;, &lt;br&gt;
&lt;a href="https://code4rena.com/reports/2022-02-redacted-cartel#m-05-wrong-slippage-check" rel="noopener noreferrer"&gt;8 - [M-05] Wrong slippage check&lt;/a&gt;, &lt;br&gt;
&lt;a href="https://github.com/sherlock-audit/2023-04-blueberry-judging/issues/131" rel="noopener noreferrer"&gt;9 - IchiSpell applies slippage to sqrtPrice which is wrong and leads to unpredictable slippage&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>defi</category>
      <category>solidity</category>
      <category>web3</category>
      <category>smartcontract</category>
    </item>
    <item>
      <title>02.DEFI ATTACKS - Keine Verfallsfrist/Deadline</title>
      <dc:creator>THE CODE DOCTOR</dc:creator>
      <pubDate>Tue, 01 Oct 2024 07:39:46 +0000</pubDate>
      <link>https://forem.com/thecodedoctor/02defi-attacks-keine-verfallsfristdeadline-1548</link>
      <guid>https://forem.com/thecodedoctor/02defi-attacks-keine-verfallsfristdeadline-1548</guid>
      <description>&lt;p&gt;Fortgeschrittene Protokolle wie Automated Market Makers (AMMs) können es den Benutzern ermöglichen, einen Deadline-Parameter festzulegen, der eine zeitliche Begrenzung erzwingt, bis zu der die Transaktion ausgeführt werden muss. Ohne einen Deadline-Parameter kann die Transaktion im Mempool verbleiben und zu einem viel späteren Zeitpunkt ausgeführt werden, was möglicherweise zu einem schlechteren Preis für den Benutzer führt.&lt;/p&gt;

&lt;p&gt;Protokolle sollten d&lt;a href="https://code4rena.com/reports/2022-11-paraspace#m-13-interactions-with-amms-do-not-use-deadlines-for-operations" rel="noopener noreferrer"&gt;ie Deadline nicht auf &lt;code&gt;block.timestamp&lt;/code&gt; setzen&lt;/a&gt; &lt;a href="https://blog.bytes032.xyz/p/why-you-should-stop-using-block-timestamp-as-deadline-in-swaps" rel="noopener noreferrer"&gt;[mehr dazu]&lt;/a&gt;, da ein Validator die Transaktion zurückhalten kann, und der Block, in den sie schließlich aufgenommen wird, den &lt;code&gt;block.timestamp&lt;/code&gt; enthält. Dies bietet also keinen Schutz.&lt;/p&gt;

&lt;p&gt;Protokolle sollten Benutzern, die mit AMMs interagieren, ermöglichen, Verfallsfristen festzulegen. Ohne eine solche Frist besteht eine potenzielle kritische Anfälligkeit für Verluste, insbesondere wenn auch kein Slippage-Parameter festgelegt wurde. Untersuchen Sie diesen schwerwiegenden Fund aus Sherlocks BlueBerry Update 1-Wettbewerb.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// 2. Swap rewards tokens to debt token
uint256 rewards = _doCutRewardsFee(CRV);
_ensureApprove(CRV, address(swapRouter), rewards);
swapRouter.swapExactTokensForTokens(
    rewards,
    0, // @audit no slippage, can receive 0 output tokens
    swapPath,
    address(this),
    type(uint256).max // @audit no deadline, transaction can 
    // be executed later at more unfavorable time
);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hier ist „&lt;code&gt;minTokensOut&lt;/code&gt;“ auf 0 fest codiert, sodass der Swap potenziell 0 Tokens zurückgeben kann. Der Deadline-Parameter ist auf den Maximalwert von uint256 fest codiert, sodass die Transaktion lange zurückgehalten und zu einem viel späteren und ungünstigeren Zeitpunkt für den Benutzer ausgeführt werden kann. Diese Kombination aus fehlendem Slippage- und Deadline-Parameter setzt den Benutzer dem potenziellen Verlust aller seiner eingesetzten Tokens aus! &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Weitere Beispiele:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://github.com/sherlock-audit/2023-02-bond-judging/issues/60" rel="noopener noreferrer"&gt;1 - The createMarket transaction lack of expiration timestamp check&lt;/a&gt;, &lt;br&gt;
&lt;a href="https://code4rena.com/reports/2022-06-canto-v2#m-01-stableswap---deadline-do-not-work" rel="noopener noreferrer"&gt;2 - [M-01] Stableswap - Deadline do not work&lt;/a&gt;, &lt;br&gt;
&lt;a href="https://code4rena.com/reports/2022-12-caviar#m-01-missing-deadline-checks-allow-pending-transactions-to-be-maliciously-executed" rel="noopener noreferrer"&gt;3 - [M-01] Missing deadline checks allow pending transactions to be maliciously executed&lt;/a&gt;&lt;br&gt;
&lt;a href="https://code4rena.com/reports/2022-12-backed#m-01-missing-deadline-checks-allow-pending-transactions-to-be-maliciously-executed" rel="noopener noreferrer"&gt;4 - [M-01] Missing deadline checks allow pending transactions to be maliciously executed&lt;/a&gt;, &lt;br&gt;
&lt;a href="https://code4rena.com/reports/2022-06-badger#m-01-_harvest-has-no-slippage-protection-when-swapping-aurabal-for-aura--" rel="noopener noreferrer"&gt;5 - [M-01] _harvest has no slippage protection when swapping auraBAL for AURA&lt;/a&gt;, &lt;br&gt;
&lt;a href="https://github.com/sherlock-audit/2023-04-blueberry-judging/issues/121" rel="noopener noreferrer"&gt;6 - Users are forced to swap all reward tokens with no slippage protection&lt;/a&gt;&lt;/p&gt;

</description>
      <category>defi</category>
      <category>solidity</category>
      <category>web3</category>
      <category>smartcontract</category>
    </item>
    <item>
      <title>01.DEFI ATTACKS - Kein Slippage Parameter</title>
      <dc:creator>THE CODE DOCTOR</dc:creator>
      <pubDate>Mon, 30 Sep 2024 12:52:21 +0000</pubDate>
      <link>https://forem.com/thecodedoctor/01defi-attacks-kein-slippage-parameter-k8f</link>
      <guid>https://forem.com/thecodedoctor/01defi-attacks-kein-slippage-parameter-k8f</guid>
      <description>&lt;p&gt;Slippage bezieht sich auf den Preisunterschied zwischen dem Zeitpunkt, an dem ein Marktteilnehmer einen DeFi-Tauschhandel einreicht, und dem tatsächlichen Preis, wenn der Handel ausgeführt wird. Dieser Unterschied ist normalerweise vernachlässigbar, kann jedoch in Zeiten hoher Volatilität und bei Tokens mit geringer Liquidität erheblich sein. Slippage kann dazu führen, dass der Benutzer mehr oder (häufig) weniger Tokens erhält, als er erhalten hätte, wenn der Handel sofort abgewickelt worden wäre.&lt;/p&gt;

&lt;p&gt;DeFi-Plattformen sollten den Benutzern die Möglichkeit geben, einen Slippage-Parameter "minTokensOut" festzulegen – also die Mindestanzahl an ausgegebenen Tokens, die vom Tausch erhalten werden sollen. Der Tausch wird zurückgesetzt, wenn die vom Benutzer angegebene Mindestanzahl an Tokens nicht erreicht wird. Es gibt mehrere häufige Implementierungsfehler in DeFi-Systemen, auf die Entwickler und Prüfer achten sollten.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kein Slippage-Parameter&lt;/strong&gt;&lt;br&gt;
DeFi-Plattformen müssen den Nutzern die Möglichkeit bieten, einen Slippage-Parameter festzulegen: die Mindestanzahl an Tokens, die sie von einem Swap zurückerhalten möchten. Prüfer sollten immer auf Swaps achten, bei denen der Slippage-Wert auf 0 gesetzt ist.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// 1. Beispiel:
IUniswapRouterV2(SUSHI_ROUTER).swapExactTokensForTokens(
    toSwap,
    0, // @audit min return 0 tokens; no slippage =&amp;gt; user loss of funds
    path,
    address(this),
    now
);

//2. Beispiel: 
function _swapLidoForWETH(uint256 amountToSwap) internal {
    IUniswapSwapRouter.ExactInputSingleParams
        memory params = IUniswapSwapRouter.ExactInputSingleParams({
            tokenIn: address(ldo),
            tokenOut: address(weth),
            fee: UNISWAP_FEE,
            recipient: address(this),
            deadline: block.timestamp,
            amountIn: amountToSwap,
            amountOutMinimum: 0,
            sqrtPriceLimitX96: 0
        });
    uniswapRouter.exactInputSingle(params);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dieser &lt;a href="https://github.com/code-423n4/2021-09-bvecvx-findings/issues/57" rel="noopener noreferrer"&gt;Code&lt;/a&gt; gibt an, dass der Benutzer bereit ist, eine Mindestmenge von 0 Tokens aus dem Swap zu akzeptieren, was den Benutzer einem katastrophalen Verlust von Mitteln durch &lt;a href="https://medium.com/coinmonks/defi-sandwich-attack-explain-776f6f43b2fd" rel="noopener noreferrer"&gt;MEV-Bot-Sandwich-Angriffe&lt;/a&gt; aussetzt. Plattformen sollten auch einen sinnvollen Standardwert festlegen, falls der Benutzer keinen Wert angibt. Benutzerdefinierte Slippage-Parameter müssen jedoch immer die Standardeinstellungen der Plattform überschreiben. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Weitere Beispiele:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://code4rena.com/reports/2022-05-rubicon#h-07-rubiconrouterswapentirebalance-doesnt-handle-the-slippage-check-properly" rel="noopener noreferrer"&gt;1 - [H-07] RubiconRouter.swapEntireBalance() doesn’t handle the slippage check properly&lt;/a&gt;, &lt;br&gt;
&lt;a href="https://code4rena.com/reports/2021-11-vader#h-31-unused-slippage-params" rel="noopener noreferrer"&gt;2 - [H-31] Unused slippage params&lt;/a&gt;, &lt;br&gt;
&lt;a href="https://solodit.xyz/issues/10773" rel="noopener noreferrer"&gt;3&lt;/a&gt;, &lt;br&gt;
&lt;a href="https://code4rena.com/reports/2021-10-mochi#h-12-feepool-is-vulnerable-to-sandwich-attack" rel="noopener noreferrer"&gt;4 - [H-12] feePool is vulnerable to sandwich attack.&lt;/a&gt;, &lt;br&gt;
&lt;a href="https://code4rena.com/reports/2021-07-spartan#h-07-missing-slippage-checks" rel="noopener noreferrer"&gt;5 - [H-07] Missing slippage checks&lt;/a&gt;, &lt;br&gt;
&lt;a href="https://github.com/sherlock-audit/2023-01-derby-judging/issues/107" rel="noopener noreferrer"&gt;6 - MainVault.rebalanceXChain doesn't check that savedTotalUnderlying&lt;/a&gt;, &lt;br&gt;
&lt;a href="https://github.com/sherlock-audit/2023-02-blueberry-judging/" rel="noopener noreferrer"&gt;7 - Withdrawals from IchiVaultSpell have no slippage protection&lt;/a&gt;, &lt;br&gt;
&lt;a href="https://solodit.xyz/auth?next=/issues/9806" rel="noopener noreferrer"&gt;8&lt;/a&gt;, &lt;br&gt;
&lt;a href="https://github.com/sherlock-audit/2023-01-uxd-judging/issues/429" rel="noopener noreferrer"&gt;9 - rebalanceLite should provide a slippage protection&lt;/a&gt;, &lt;br&gt;
&lt;a href="https://solodit.xyz/auth?next=/issues/7096" rel="noopener noreferrer"&gt;10&lt;/a&gt;, &lt;br&gt;
&lt;a href="https://solodit.xyz/auth?next=/issues/7044" rel="noopener noreferrer"&gt;11&lt;/a&gt;, &lt;br&gt;
&lt;a href="https://solodit.xyz/auth?next=/issues/10127" rel="noopener noreferrer"&gt;12&lt;/a&gt;, &lt;br&gt;
&lt;a href="https://code4rena.com/reports/2022-05-alchemix#m-04-yearntokenadapter-allows-a-maximum-loss-of-100-when-withdrawing" rel="noopener noreferrer"&gt;13 - [M-04] YearnTokenAdapter allows a maximum loss of 100% when withdrawing&lt;/a&gt;, &lt;br&gt;
&lt;a href="https://code4rena.com/reports/2022-06-connext#m-20-in-reimburseliquidityfees-of-sponservault-contract-swaps-tokens-without-slippage-limit-so-its-possible-to-perform-sandwich-attack-and-it-create-mev" rel="noopener noreferrer"&gt;14 - [M-20] In reimburseLiquidityFees() of SponserVault contract swaps tokens without slippage limit so its possible to perform sandwich attack and it create MEV&lt;/a&gt;, &lt;br&gt;
&lt;a href="https://code4rena.com/reports/2022-06-badger#m-01-_harvest-has-no-slippage-protection-when-swapping-aurabal-for-aura--" rel="noopener noreferrer"&gt;15 - [M-01] _harvest has no slippage protection when swapping auraBAL for AURA&lt;/a&gt;, &lt;br&gt;
&lt;a href="https://code4rena.com/reports/2022-06-illuminate#m-12-sandwich-attacks-are-possible-as-there-is-no-slippage-control-option-in-marketplace-and-in-lender-yield-swaps" rel="noopener noreferrer"&gt;16 - [M-12] Sandwich attacks are possible as there is no slippage control option in Marketplace and in Lender yield swaps&lt;/a&gt;, &lt;br&gt;
&lt;a href="https://code4rena.com/reports/2021-12-vader#m-01-vaderpoolv2mintfungible-exposes-users-to-unlimited-slippage" rel="noopener noreferrer"&gt;17 - [M-01] VaderPoolV2.mintFungible exposes users to unlimited slippage&lt;/a&gt;, &lt;br&gt;
&lt;a href="https://code4rena.com/reports/2022-01-notional#m-02-snotesol_mintfromassets-lack-of-slippage-control" rel="noopener noreferrer"&gt;18 - [M-02] sNOTE.sol#_mintFromAssets() Lack of slippage control&lt;/a&gt;, &lt;br&gt;
&lt;a href="https://code4rena.com/reports/2022-01-behodler#m-14-uniswaphelperbuyflanandburn-is-a-subject-to-sandwich-attacks" rel="noopener noreferrer"&gt;19 - [M-14] UniswapHelper.buyFlanAndBurn is a subject to sandwich attacks&lt;/a&gt;, &lt;br&gt;
&lt;a href="https://code4rena.com/reports/2022-04-backd#m-04-cvxcrvrewardslocker-implements-a-swap-without-a-slippage-check-that-can-result-in-a-loss-of-funds-through-mev" rel="noopener noreferrer"&gt;20 - [M-04] CvxCrvRewardsLocker implements a swap without a slippage check that can result in a loss of funds through MEV&lt;/a&gt;, &lt;br&gt;
&lt;a href="https://diligence.consensys.io/audits/2022/05/brahma-fi/#harvesterharvest-swaps-have-no-slippage-parameters" rel="noopener noreferrer"&gt;21 - 5.5 Harvester.harvest swaps have no slippage parameters&lt;/a&gt;, &lt;br&gt;
&lt;a href="https://code4rena.com/reports/2021-10-mochi#m-02-regerralfeepool-is-vulnerable-to-mev-searcher" rel="noopener noreferrer"&gt;22 - [M-02] regerralFeePool is vulnerable to MEV searcher&lt;/a&gt;, &lt;br&gt;
&lt;a href="https://solodit.xyz/auth?next=/issues/10228" rel="noopener noreferrer"&gt;23&lt;/a&gt;, &lt;br&gt;
&lt;a href="https://solodit.xyz/auth?next=/issues/10264" rel="noopener noreferrer"&gt;24&lt;/a&gt;, &lt;br&gt;
&lt;a href="https://code4rena.com/reports/2021-11-badgerzaps#m-05-no-slippage-control-on-deposit-of-ibbtcvaultzapsol" rel="noopener noreferrer"&gt;25 - [M-05] No slippage control on deposit of IbbtcVaultZap.sol&lt;/a&gt;, &lt;br&gt;
&lt;a href="https://code4rena.com/reports/2021-11-badgerzaps#m-01-improper-implementation-of-slippage-check" rel="noopener noreferrer"&gt;26 - [M-01] Improper implementation of slippage check&lt;/a&gt;, &lt;br&gt;
&lt;a href="https://code4rena.com/reports/2021-11-malt#m-02-frontrunning-in-uniswaphandler-calls-to-uniswapv2router" rel="noopener noreferrer"&gt;27 - [M-02] Frontrunning in UniswapHandler calls to UniswapV2Router&lt;/a&gt;, &lt;br&gt;
&lt;a href="https://solodit.xyz/auth?next=/issues/9025" rel="noopener noreferrer"&gt;28&lt;/a&gt;, &lt;br&gt;
&lt;a href="https://github.com/sherlock-audit/2023-04-blueberry-judging/issues/124" rel="noopener noreferrer"&gt;29 - 0x52 - ConvexSpell#closePositionFarm removes liquidity without any slippage protection&lt;/a&gt;, &lt;br&gt;
&lt;a href="https://github.com/sherlock-audit/2023-02-gmx-judging/issues/138" rel="noopener noreferrer"&gt;30 - User-supplied slippage for decrease orders is ignored&lt;/a&gt;, &lt;br&gt;
&lt;a href="https://github.com/sherlock-audit/2023-02-gmx-judging/issues/144" rel="noopener noreferrer"&gt;31 - Collateral tokens that cannot be automatically swapped to the PnL token, cannot have slippage applied to them&lt;/a&gt;, &lt;br&gt;
&lt;a href="https://github.com/sherlock-audit/2023-02-gmx-judging/issues/159" rel="noopener noreferrer"&gt;32 - Slippage is not respected if PnL swap associated with a decrease order fails&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>solidity</category>
      <category>web3js</category>
      <category>web3</category>
      <category>defi</category>
    </item>
    <item>
      <title>Einsatz von transfer oder send und das Out-of-Gas-Problem</title>
      <dc:creator>THE CODE DOCTOR</dc:creator>
      <pubDate>Thu, 26 Sep 2024 09:17:11 +0000</pubDate>
      <link>https://forem.com/thecodedoctor/einsatz-von-transfer-oder-send-das-out-of-gas-problem-3bd9</link>
      <guid>https://forem.com/thecodedoctor/einsatz-von-transfer-oder-send-das-out-of-gas-problem-3bd9</guid>
      <description>&lt;p&gt;Ja, in Solidity kann es beim Einsatz von &lt;code&gt;transfer&lt;/code&gt; oder &lt;code&gt;send&lt;/code&gt; zu einem &lt;strong&gt;Out-of-Gas-Problem&lt;/strong&gt; kommen, besonders wenn der Empfänger ein Smart Contract ist, der teure Operationen in seiner &lt;code&gt;fallback&lt;/code&gt;- oder &lt;code&gt;receive&lt;/code&gt;-Funktion ausführt.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Erklärung des Problems:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;transfer&lt;/code&gt; und &lt;code&gt;send&lt;/code&gt; sind beides Methoden, um Ether an einen anderen Account zu schicken.&lt;/li&gt;
&lt;li&gt;Sie schicken standardmäßig &lt;strong&gt;2300 Gas&lt;/strong&gt; mit, um den Empfang zu ermöglichen. Das ist normalerweise genug, um eine einfache &lt;code&gt;fallback&lt;/code&gt;- oder &lt;code&gt;receive&lt;/code&gt;-Funktion auszuführen.&lt;/li&gt;
&lt;li&gt;Falls der Empfänger aber mehr als diese 2300 Gas benötigt, schlägt die Transaktion fehl.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Beispiel:&lt;/strong&gt;&lt;br&gt;
Angenommen, du hast einen Smart Contract, der Ether an einen anderen Vertrag sendet. Wenn der Empfängervertrag in seiner fallback-Funktion eine komplexe Operation hat, könnte der Gasverbrauch über 2300 Gas liegen, was zu einem Out-of-Gas-Fehler führt.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Beispiel Smart Contract:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Vertrag A sendet Ether an Vertrag B&lt;/span&gt;
&lt;span class="nx"&gt;contract&lt;/span&gt; &lt;span class="nx"&gt;A&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;sendEther&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt; &lt;span class="nx"&gt;payable&lt;/span&gt; &lt;span class="nx"&gt;_to&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kr"&gt;public&lt;/span&gt; &lt;span class="nx"&gt;payable&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Versucht, 1 Ether zu senden&lt;/span&gt;
        &lt;span class="nx"&gt;_to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;transfer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="nx"&gt;ether&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Oder _to.send(1 ether);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Vertrag B hat eine teure fallback-Funktion&lt;/span&gt;
&lt;span class="nx"&gt;contract&lt;/span&gt; &lt;span class="nx"&gt;B&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Diese Funktion wird bei Empfang von Ether aufgerufen&lt;/span&gt;
    &lt;span class="nf"&gt;fallback&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="nx"&gt;external&lt;/span&gt; &lt;span class="nx"&gt;payable&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Hier wird eine teure Operation durchgeführt&lt;/span&gt;
        &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;uint&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// Komplexer Rechenaufwand&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Was passiert hier:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Vertrag A versucht, Ether an Vertrag B zu senden.&lt;/li&gt;
&lt;li&gt;Vertrag B hat eine fallback-Funktion, die teure Rechenoperationen ausführt.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;transfer&lt;/code&gt; schickt nur 2300 Gas mit, aber die &lt;code&gt;fallback&lt;/code&gt;-Funktion in Vertrag B braucht mehr Gas, um die Schleife durchzuführen.&lt;/li&gt;
&lt;li&gt;Da 2300 Gas nicht ausreichen, schlägt die Transaktion fehl und es kommt zu einem &lt;strong&gt;Out-of-Gas-Fehler&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Lösung:&lt;br&gt;
Um das zu vermeiden, kann man statt &lt;code&gt;transfer&lt;/code&gt; oder &lt;code&gt;send&lt;/code&gt; die Funktion &lt;code&gt;call&lt;/code&gt; verwenden, die es ermöglicht, mehr Gas mitzuschicken:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// contract A sends Ether using call with more gas&lt;/span&gt;
&lt;span class="nx"&gt;contract&lt;/span&gt; &lt;span class="nx"&gt;A&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;sendEtherWithCall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt; &lt;span class="nx"&gt;payable&lt;/span&gt; &lt;span class="nx"&gt;_to&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kr"&gt;public&lt;/span&gt; &lt;span class="nx"&gt;payable&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bool&lt;/span&gt; &lt;span class="nx"&gt;success&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;_to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;call&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="nx"&gt;ether&lt;/span&gt;&lt;span class="p"&gt;}(&lt;/span&gt;&lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Unbegrenztes Gas&lt;/span&gt;
        &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;success&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Transfer failed.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mit &lt;code&gt;call&lt;/code&gt; kannst du beliebig viel Gas mitgeben, sodass der Empfänger genug Gas für seine Operationen hat.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Zusammenfassen gehen beim Out-of-Gas-Fehler keine Gelder verloren – nur das verbrauchte Gas.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Der Ether bleibt sicher beim Sender (Vertrag A).&lt;/li&gt;
&lt;li&gt;Der Absender trägt nur die Gasgebühren, die während des Versuches aufgebraucht wurden.&lt;/li&gt;
&lt;li&gt;Der Empfänger (Vertrag B) erhält keinen Ether, da die Transaktion nicht erfolgreich war und zurückgerollt wurde.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>solidity</category>
      <category>web3js</category>
      <category>smartcontract</category>
    </item>
    <item>
      <title>Was ist der ERC-404 Token-Standard?</title>
      <dc:creator>THE CODE DOCTOR</dc:creator>
      <pubDate>Fri, 28 Jun 2024 11:44:24 +0000</pubDate>
      <link>https://forem.com/thecodedoctor/was-ist-der-erc-404-token-standard-5437</link>
      <guid>https://forem.com/thecodedoctor/was-ist-der-erc-404-token-standard-5437</guid>
      <description>&lt;p&gt;&lt;strong&gt;Was ist der ERC-404 Token-Standard?&lt;/strong&gt;&lt;br&gt;
Der ERC-404 ist ein neu entwickelter Token-Standard, der von den Entwicklern ctrl und Acme von Pandora Labs erfunden wurde. Einfach ausgedrückt, handelt es sich um eine Kombination aus ERC-20 und ERC-721 Token.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Welches Problem löst ERC-404?&lt;/strong&gt;&lt;br&gt;
Das Hauptziel von ERC-404 besteht darin, NFTs (Non-Fungible Tokens) liquide zu machen, sodass sie gehandelt und als Sicherheiten oder Liquidität für DeFi-Protokolle genutzt werden können. Darüber hinaus wird ein Konzept der fraktionierten Eigentümerschaft eingeführt, bei dem mehrere Benutzer einen Teil eines NFTs besitzen können. Dies ermöglicht es einer größeren Anzahl von Benutzern, zuvor unzugängliche Token zu erwerben.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Technische Eigenschaften von ERC-404&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fraktionierte Eigentümerschaft:&lt;/strong&gt; Wie bei ERC-20 Token können ERC-404 Token in Bruchteile unterteilt werden, was es mehreren Benutzern ermöglicht, einen Anteil an einem einzigen NFT zu besitzen.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Einzigartigkeit:&lt;/strong&gt; Wie bei ERC-721 Token bleibt jeder ERC-404 Token einzigartig und repräsentiert ein individuelles digitales Gut.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Liquidität:&lt;/strong&gt; ERC-404 Token können einfacher gekauft, verkauft und gehandelt werden, was die Liquidität von NFTs erhöht und sie für Investoren und DeFi-Enthusiasten zugänglicher macht.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Zusammenfassung&lt;/strong&gt;&lt;br&gt;
Der ERC-404 Token-Standard kombiniert die Vorteile von ERC-20 und ERC-721 Token, indem er sowohl die Teilbarkeit von ERC-20 als auch die Einzigartigkeit von ERC-721 bietet. Dies erleichtert den Handel und die Nutzung von NFTs in DeFi-Protokollen und ermöglicht fraktionierte Eigentümerschaft, wodurch NFTs für eine größere Anzahl von Benutzern zugänglich werden.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm7c7cw8y1m6sqn470lvk.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm7c7cw8y1m6sqn470lvk.jpg" alt="ERC404"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Technischer Überblick&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Es ist ganz einfach und kann leicht mit einem Diagramm erklärt werden:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8mtkn45oruotndlr7dgz.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8mtkn45oruotndlr7dgz.jpg" alt="Erklärung ERC-404"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Funktionsweise des ERC-404 Tokens&lt;/strong&gt;&lt;br&gt;
Beim Transfer eines ERC-404 Tokens überprüft der Kontrakt, ob die Anzahl der Tokens, die der Benutzer besitzt, ganzzahlig oder mit Dezimalstellen ist.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Einfach erklärt:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ganzzahlig:&lt;/strong&gt; Wenn ein Benutzer eine ganze Zahl (1, 2, 3, usw.) besitzt, erhält er ein vollständiges NFT.&lt;br&gt;
&lt;strong&gt;Mit Dezimalstellen:&lt;/strong&gt; Wenn ein Benutzer eine Dezimalzahl besitzt, erhält er einen Bruchteil des ERC-721 Tokens in fungiblen Tokens.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Beispiel&lt;/strong&gt;&lt;br&gt;
Nehmen wir an, ein Benutzer möchte &lt;strong&gt;69.420 ERC-404&lt;/strong&gt; Tokens erhalten:&lt;/p&gt;

&lt;p&gt;Der Benutzer erhält &lt;strong&gt;69 ERC721 Tokens&lt;/strong&gt; (ganze NFTs).&lt;br&gt;
Der Benutzer erhält &lt;strong&gt;42  ERC20 Tokens&lt;/strong&gt; (fungible Tokens), die den Dezimalanteil repräsentieren.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Technische Details der _transfer() Funktion&lt;/strong&gt;&lt;br&gt;
In der &lt;code&gt;_transfer()&lt;/code&gt; Funktion des ERC-404 Smart Contracts wird diese Logik umgesetzt. Hier wird geprüft, ob der Token-Betrag ganzzahlig oder mit Dezimalstellen ist, und entsprechend umgesetzt:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ganzzahliger Betrag:&lt;/strong&gt; Der gesamte Betrag wird als ein einzelnes NFT behandelt.&lt;br&gt;
&lt;strong&gt;Dezimalbetrag:&lt;/strong&gt; Der Betrag wird in zwei Teile aufgeteilt:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ein Teil als ganzer ERC-721 Token.&lt;/li&gt;
&lt;li&gt;Ein anderer Teil als ERC-20 Token, der den Dezimalanteil darstellt.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Diese Logik stellt sicher, dass Benutzer entweder ganze NFTs oder Bruchteile davon in Form von fungiblen Tokens (ERC20) erhalten. Dadurch wird die Interoperabilität und Handbarkeit von NFTs im DeFi-Bereich verbessert.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;// Burn für bestimmte Adressen überspringen, um Gas zu sparen&lt;br&gt;
if (!whitelist [from]) {&lt;br&gt;
   uint256 tokens_to_burn = (balanceBeforeSender / unit)&lt;br&gt;
      (balance0f [from] / unit);&lt;br&gt;
   for (uint256 i = 0; i &amp;lt; tokens_to_burn; i++) {&lt;br&gt;
      _burn(from);&lt;br&gt;
   }&lt;br&gt;
}&lt;br&gt;
if (!whitelist [from]) {&lt;br&gt;
   uint256 tokens_to_mint = (balanceOf[to] / unit)&lt;br&gt;
      (balanceBeforeReceiver / unit);&lt;br&gt;
   for (uint256 i = 0; i &amp;lt; tokens_to_mint; i++) {&lt;br&gt;
      _mint(to);&lt;br&gt;
   }&lt;br&gt;
}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wichtige Hinweise zum ERC-404 Token-Standard&lt;/strong&gt;&lt;br&gt;
Der ERC-404 Contract erbt nicht von ERC-20 oder ERC-721. Stattdessen handelt es sich um einen neu entwickelten Smart Contract, der Funktionen und Mechanismen seiner Vorgänger implementiert.&lt;br&gt;
&lt;strong&gt;Wichtige Punkte:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Neuer Smart Contract:&lt;/strong&gt; Der ERC-404 Contract ist eigenständig und nicht von ERC-20 oder ERC-721 abgeleitet. Er integriert jedoch deren Funktionen und Mechaniken.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Experimentell und nicht geprüft:&lt;/strong&gt; ERC-404 Tokens sind experimentell und wurden noch nicht auditiert. Sie haben keine Ethereum Improvement Proposal (EIP) und sind daher momentan nicht von allen Protokollen anerkannt.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sicherheitsrisiken:&lt;/strong&gt; Da sie nicht vollständig geprüft sind, weisen ERC-404 Tokens mehrere Sicherheitslücken auf, die später im Artikel beschrieben werden.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keine Token-IDs:&lt;/strong&gt; Im Gegensatz zu ERC-721 Tokens, die eindeutige Token-IDs besitzen, haben ERC-404 Tokens keine Token-IDs, ähnlich wie ERC-20 Tokens.
&lt;strong&gt;Zusammenfassung&lt;/strong&gt;
Der ERC-404 Token-Standard kombiniert zwar die Funktionen von ERC-20 und ERC-721, ist jedoch ein eigenständiger Contract ohne direkte Vererbung von diesen Standards. Aufgrund seines experimentellen Charakters und fehlender Audits bestehen derzeit Sicherheitsrisiken und Kompatibilitätsprobleme mit bestehenden Protokollen.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Anwendungsfälle des ERC-404 Token-Standards&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Die ersten ERC-404 Tokens wurden in diesem Jahr veröffentlicht, und es gibt bereits mehr als 20 solcher Tokens mit einer Gesamtkapitalisierung von über 300 Millionen Dollar (Stand: März 2024). Schauen wir uns an, wie diese Tokens genutzt werden können.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reale Vermögenswerte (RWAs)&lt;/strong&gt;&lt;br&gt;
ERC-404 Tokens erleichtern den Handel und den Kauf realer Vermögenswerte, wie zum Beispiel Häuser oder Luxusprodukte. Benutzer können Bruchteile teurer und illiquider Tokens besitzen, was den Handel vereinfacht und die Möglichkeit eröffnet, zusätzliche Erträge zu erzielen.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dezentrale Finanzen (DeFi)&lt;/strong&gt;&lt;br&gt;
Der Hauptgrund ist, dass NFTs durch ERC-404 Tokens liquider werden und als Sicherheiten für Kredite und Darlehen oder als Liquidität für Protokolle genutzt werden können. Dies eröffnet eine Vielzahl neuer Investitionsmöglichkeiten in dApps.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gaming&lt;/strong&gt;&lt;br&gt;
Da In-Game-Assets fraktioniert werden, haben Entwickler mehr Freiheit bei der Gestaltung von Spielmechaniken und -ökonomien. Für Benutzer wird es einfacher, In-Game-Assets zu kaufen und zu handeln.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Zusammenfassung&lt;/strong&gt;&lt;br&gt;
Der ERC-404 Token-Standard bietet vielfältige Anwendungsmöglichkeiten in verschiedenen Bereichen. Er ermöglicht den Handel mit realen Vermögenswerten, verbessert die Liquidität von NFTs für den Einsatz in DeFi-Protokollen und vereinfacht den Handel von In-Game-Assets in der Gaming-Industrie.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reale Beispiele für ERC-404 Tokens&lt;/strong&gt;&lt;br&gt;
Die drei bekanntesten ERC-404 Kollektionen sind derzeit Pandora, DeFrogs und Monkees. Schauen wir uns Pandora genauer an — es war der allererste ERC-404 Token und umfasst 10.000 NFTs, die mit weiteren 10.000 ERC-20 Tokens verknüpft sind. Beim Minten eines PANDORA-Tokens erhalten Benutzer 1 NFT.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mechanismus von Pandora&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Threshold:&lt;/strong&gt; Es gibt eine festgelegte Schwelle, wie viele Tokens jeder Benutzer haben darf. Wenn ein Benutzer mehr als die festgelegte Anzahl besitzt, erhält er ein neu gemintetes NFT. Besitzt er weniger, wird das NFT verbrannt.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wert und Seltenheit:&lt;/strong&gt; Dieses ständige Minten und Verbrennen von Tokens erneuert den Wert und die Seltenheit jedes Non-Fungible Tokens.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Technische Umsetzung&lt;/strong&gt;&lt;br&gt;
Früher im Artikel haben wir einen Ausschnitt aus dem ERC-404 Vertrag gezeigt, der speziell für Pandora verwendet wird. Dieser Codeabschnitt enthält eine spezifische Buchführung, die überprüft, ob das NFT eines Benutzers gemintet oder verbrannt werden soll.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Zusammenfassung&lt;/strong&gt;&lt;br&gt;
Pandora ist ein bahnbrechendes Beispiel für die Nutzung des ERC-404 Token-Standards. Durch das ständige Minten und Verbrennen wird der Wert und die Seltenheit der NFTs dynamisch gehalten, was die Attraktivität und den Handelswert dieser Tokens erhöht.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sicherheitsüberlegungen zum ERC-404 Token-Standard&lt;/strong&gt;&lt;br&gt;
Der ERC-404 Token-Standard ist noch experimentell und nicht vollständig mit bestehenden Protokollen kompatibel. Daher gibt es zwei Hauptprobleme, die beachtet werden sollten:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Unklare Standards und Mechaniken:&lt;/strong&gt; Viele Entwickler sind nicht ausreichend über den ERC-404 Token-Standard informiert, und es gibt keine formale Ethereum Improvement Proposal (EIP), die diesen Standard standardisiert. In der Zukunft könnten sich daher erhebliche Unterschiede in den Mechanismen der ERC-404 Tokens ergeben.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Inkompatibilität mit Protokollen:&lt;/strong&gt; Aktuelle Protokolle können nicht zu 100 % genau mit solchen Tokens arbeiten. Dies eröffnet eine Vielzahl von Sicherheitslücken, die mit willkürlichen externen Aufrufen oder einfach fehlerhaften Interaktionen verbunden sind. Solche Schwachstellen können dazu führen, dass Benutzer Geld verlieren, da sie möglicherweise nicht die erwarteten Ergebnisse erzielen.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Schlussfolgerung&lt;/strong&gt;&lt;br&gt;
ERC-404 Tokens haben das Potenzial, eine Innovation im Web3-Bereich darzustellen, indem sie die besten Eigenschaften der beiden Haupt-ERC-Standards kombinieren. Dies eröffnet neue Horizonte für Entwickler und Benutzer, um DeFi besser und benutzerfreundlicher zu gestalten.&lt;/p&gt;

&lt;p&gt;Jedoch ist zu beachten, dass ERC-404 derzeit ein experimenteller Standard ist, der ohne formale EIP und mit Inkompatibilitäten zu bestehenden Protokollen kommt. Daher können Benutzer unerwartete Verluste und Fehler erleben, während sie mit solchen Tokens interagieren, und böswillige Akteure haben mehr Möglichkeiten für Angriffe. Es ist wichtig, dass Entwickler und Benutzer sich dieser Risiken bewusst sind und entsprechende Sicherheitsmaßnahmen treffen, um ihre Interaktionen sicher zu gestalten.&lt;/p&gt;

</description>
      <category>erc404</category>
      <category>solidity</category>
      <category>web3js</category>
      <category>smartcontract</category>
    </item>
    <item>
      <title>Was ist der Unterschied zwischen der Call- und Apply-Methode?</title>
      <dc:creator>THE CODE DOCTOR</dc:creator>
      <pubDate>Mon, 28 Feb 2022 13:53:11 +0000</pubDate>
      <link>https://forem.com/thecodedoctor/was-ist-der-unterschied-zwischen-der-call-und-apply-methode-3f5m</link>
      <guid>https://forem.com/thecodedoctor/was-ist-der-unterschied-zwischen-der-call-und-apply-methode-3f5m</guid>
      <description>&lt;p&gt;Der Unterschied zwischen &lt;strong&gt;call u. apply&lt;/strong&gt; besteht darin, wie die Argumente an die aufgerufene Funktion übergeben werden. In apply werden die Argumente als Array und bei call getrennt durch ein Komma übergeben.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;object1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;result&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;object2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;result&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;reduceAdd&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;len&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;len&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
        &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nx"&gt;reduceAdd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;apply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;object1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="c1"&gt;//21&lt;/span&gt;
&lt;span class="nx"&gt;reduceAdd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;object2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;//21&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
  </channel>
</rss>
