Swap / Intercambiar tokens desde Solidity
Tags: blockchain, ethereum, solidty, defi
Published: 2021-08-10 21:12:22

---
title: Swap / Intercambiar tokens desde Solidity
published: true
description: 
tags: #blockchain, #ethereum, #solidty, #defi
cover_image: https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9ge58khogm4dpcao9m1x.png
---

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.

{% youtube _4roSlvmDjQ %}

## 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.

```solidity
// 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
    );
  }
}
```

## 2. Aprobar y probar

Una vez lanzado el contrato nos dirigimos al explorador del primer token, [en este caso DAI](https://polygonscan.com/address/0x8f3cf7ad23cd3cadbd9735aff958023239c6a063#writeProxyContract). 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](https://docs.uniswap.org/protocol/V2/reference/smart-contracts/router-02)

**Gracias por ver este tutorial!**

Sígueme en dev.to y en [Youtube](https://www.youtube.com/channel/UCNRB4tgwp09z4391JRjEsRA) para todo lo relacionado al desarrollo en Blockchain en Español.