L'Attaque du Sandwich
Published: 2022-08-25 16:00:35

---
title: L'Attaque du Sandwich
published: true
description: 
tags: 
cover_image: https://dev-to-uploads.s3.amazonaws.com/uploads/articles/06tq1ekywbct8col986r.png
---

Le MEV (éxtraction de valeur pour les mineurs) est un problème qu'existe en PoW (preuve de travail) comme en PoS (preuve de staking). Le MEV donne une avantage aux mineurs sur les autres utilisateurs du blockchain. On veux pas ça. C'est pour ça qu'il y a différentes manières de le combattre comme flash bots ou même des idées a niveau du protocol. Malheureusement ce problème persiste et c'est mieux de l'attaquer depuis différentes angles. En ce vidéo on montre comment on peut prévenir un des attaques plus connues: L'attaque du Sandwich. On va faire un token qui protège l'achat ou vente du token dans les DEXes en-chain.

En [eigenphi](https://www.eigenphi.io/ethereum/sandwich) des exemples des Attaques de Sandwich on chain.

https://www.youtube.com/watch?v=KMgAfsGs8es&list=PLRqVznADKueHhGXnFwDfQzb483dmclpT_&index=1&t=7s

## Avant de commencer

Pour ce video tu auras besoin de [Metamask](https://metamask.io/) ou n'importe quel wallet compatible avec l'EVM et aussi du GoerliETH que tu peux trouver gratuitement en un [faucet](https://goerlifaucet.com/).

## Token ERC20 avec mécanisme anti-sandwich

Faites attention a utiliser un router qui existe dans lo blockchain que vous êtes en train d'utiliser.

* Uniswap Router: `0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D`
* Quickswap Router: `0xa5E0829CaCEd8fFDD4De3c43696c57F7D7A678ff`
* Pancakeswap Router: `0x10ED43C718714eb63d5aA57B78B54704E256024E`

```solidity
// SPDX-License-Identifier: MIT
pragma solidity 0.8.16;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

interface IUniswapV2Factory {
    function createPair(address tokenA, address tokenB) external returns (address pair);
}

interface IUniswapV2Router {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
}

contract MyToken is ERC20 {
    mapping(address => uint256) public lastTxByAddress;
    uint public blockCooldownAmount = 1;
    address pair;

    constructor() ERC20("My Token", "MTKN") {
        _mint(msg.sender, 1_000_000 ether);

        IUniswapV2Router uniswapRouter = IUniswapV2Router(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        pair = IUniswapV2Factory(uniswapRouter.factory()).createPair(address(this), uniswapRouter.WETH());
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        amount;
        if(from == pair)
        {
            ensureMaxTxFrequency(to);
            lastTxByAddress[to] = block.number;
        } else if(to == pair)
        {
            ensureMaxTxFrequency(from);
            lastTxByAddress[from] = block.number;
        }else
        {
            ensureMaxTxFrequency(from);
            lastTxByAddress[from] = block.number;
            ensureMaxTxFrequency(to);
            lastTxByAddress[to] = block.number;
        }
    }

    function ensureMaxTxFrequency(address addr) internal virtual {
        bool isAllowed = lastTxByAddress[addr] == 0 ||
            ((lastTxByAddress[addr] + blockCooldownAmount) < (block.number + 1));
        require(isAllowed, "Max tx frequency exceeded!");
    }
}
```

**¡Merci pour voir ce video!**

Suivez nous ici en dev.to et en [Youtube](https://www.youtube.com/channel/UCl3hXoRETXvoTWI-j0Y6ZTw) pour tout ce qui a à voir avec Blockchain en Francais.