Swap / Intercambiar tokens desde Solidity

Ahmed Castro - Aug 10 '21 - - Dev Community

Cuando lanzamos un contrato en DeFi no queremos que sea una isla. Al contrario, queremos que sea parte de un ecosistema. Nosotros mismos podemos lograr esto gracias a la decentralización del blockchain. En este tutorial vamos a lanzar un contrato que se comunica con un DEX. En este caso usaremos Quickswap de Polygon Mainnet Layer 2 de Ethereum pero este código aplica para Ethereum Mainnet, Binance Smart Chain o cualquier otra red que desees siempre y cuando actualices los Smart Contracts que detallo a continuación.

1. Lanzamos el contrato

Nota que debes seleccionar el address del contrato Router dependiendo de dónde deseas lanzar el contrato:

  • Polygon Quickswap: 0xa5E0829CaCEd8fFDD4De3c43696c57F7D7A678ff
  • Ethereum Uniswap V2: 0x10ED43C718714eb63d5aA57B78B54704E256024E
  • BSC Mainnet Pancake: 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
  • BSC Testnet Pancake: 0xD99D1c33F9fC3444f8101754aBC46c52416550D1

En este ejemplo usamos los addresses 0x8f3Cf7ad23Cd3CaDbD9735AFf958023239c6A063 y 0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174 para DAI y USDC respectivamente. Modifícalos con los tokens que desees.

// SPDX-License-Identifier: MIT
pragma solidity 0.8.6;

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

contract Router {
  function swapExactTokensForTokens(
    uint amountIn,
    uint amountOutMin,
    address[] calldata path,
    address to,
    uint deadline
  ) external returns (uint[] memory amounts)  {}
}

contract Swapper
{
  Router router = Router(0xa5E0829CaCEd8fFDD4De3c43696c57F7D7A678ff);
  ERC20 DAI_token  = ERC20(0x8f3Cf7ad23Cd3CaDbD9735AFf958023239c6A063);
  ERC20 USDC_token = ERC20(0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174);

  function swapDAIToUSDC(uint amount) public
  {
    DAI_token.transferFrom(
      msg.sender,
      address(this),
      amount
    );

    address[] memory path = new address[](2);
    path[0] = address(DAI_token);
    path[1] = address(USDC_token);

    DAI_token.approve(address(router), amount);

    router.swapExactTokensForTokens(
      amount,
      0,
      path,
      msg.sender,
      block.timestamp
    );
  }
}
Enter fullscreen mode Exit fullscreen mode

2. Aprobar y probar

Una vez lanzado el contrato nos dirigimos al explorador del primer token, en este caso DAI. Y utilizamos la función approve pasando el address del contrato que recién lanzamos y un número grande de tokens.

Ahora estamos listos para usar nuestro contrato y swapear fondos.

Documentación oficial

Gracias por ver este tutorial!

Sígueme en dev.to y en Youtube para todo lo relacionado al desarrollo en Blockchain en Español.

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .