Skip to content

Instantly share code, notes, and snippets.

@diegoxter
Created September 19, 2023 15:41
Show Gist options
  • Save diegoxter/f3c53a538abff3f92dfb5f7ffd1c0f6e to your computer and use it in GitHub Desktop.
Save diegoxter/f3c53a538abff3f92dfb5f7ffd1c0f6e to your computer and use it in GitHub Desktop.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
// Importa las interfaces de Uniswap Router y Factory
//import './UniswapRouterV2ABI.sol'; // Reemplaza con el ABI del Router
//import './UniswapFactoryV2ABI.sol'; // Reemplaza con el ABI de la Factory
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
contract PoolCreator {
// Dirección del Uniswap V2 Router
address public uniswapRouterAddress; // Reemplaza con la dirección del Router
// Dirección de la Uniswap V2 Factory
address public uniswapFactoryAddress; // Reemplaza con la dirección de la Factory
// Direcciones de los tokens que quieres emparejar
address public token1;
address public token2;
// Dirección del nuevo par de tokens (pool) creado
address public lpToken;
constructor(
) {
uniswapRouterAddress = 0xC532a74256D3Db42D0Bf7a0400fEFDbad7694008;
uniswapFactoryAddress = 0x7E0987E5b3a30e3f2828572Bb659A548460a3003;
}
function crearPoolCon(address _token1, address _token2) external {
token1 = _token1;
token2 = _token2;
require(recibir1EtherDeCadaToken());
// Crea una instancia del Uniswap Router
IUniswapV2Router02 router = IUniswapV2Router02(uniswapRouterAddress);
// Obtén la dirección del WETH (Wrapped Ether) para usarlo en el emparejamiento
//address weth = router.WETH();
// Aprobación de los tokens por parte del contrato para el Router
IERC20(token1).approve(uniswapRouterAddress, type(uint256).max);
IERC20(token2).approve(uniswapRouterAddress, type(uint256).max);
// Obtén el par (pool) si ya existe
address pair = IUniswapV2Factory(uniswapFactoryAddress).getPair(token1, token2);
// Si el par aún no existe, créalo
if (pair == address(0)) {
pair = IUniswapV2Factory(uniswapFactoryAddress).createPair(token1, token2);
}
// Asegúrate de que el contrato tenga suficiente liquidez para hacer el emparejamiento
uint256 amountToken1 = 1 ether; // Cantidad de Token 1
uint256 amountToken2 = 1 ether; // Cantidad de Token 2
require(IERC20(token1).balanceOf(address(this)) >= amountToken1, "Insufficient balance of Token 1");
require(IERC20(token2).balanceOf(address(this)) >= amountToken2, "Insufficient balance of Token 2");
// Agrega liquidez al par
router.addLiquidity(
token1,
token2,
amountToken1,
amountToken2,
0, // slippage tolerancia (0 para ninguno)
0, // slippage tolerancia (0 para ninguno)
address(this),
block.timestamp + 60 // tiempo de expiración en segundos
);
// Obtén la dirección del nuevo par de tokens (pool)
lpToken = pair;
}
function recibir1EtherDeCadaToken() internal returns (bool success){
uint256 cantidadTokens = 1000000000000000000; // 1 seguido de 18 ceros
// Transfiere las tokens al contrato
IERC20(token1).transferFrom(msg.sender, address(this), cantidadTokens);
IERC20(token2).transferFrom(msg.sender, address(this), cantidadTokens);
return true;
}
}
interface IUniswapV2Factory {
function getPair(address token0, address token1) external view returns (address pair);
function createPair(address tokenA, address tokenB) external returns (address pair);
}
interface IUniswapV2Router02 {
function WETH() external pure returns (address);
function addLiquidity(
address tokenA,
address tokenB,
uint256 amountADesired,
uint256 amountBDesired,
uint256 amountAMin,
uint256 amountBMin,
address to,
uint256 deadline
) external returns (uint256 amountA, uint256 amountB, uint256 liquidity);
}
@diegoxter
Copy link
Author

0xb39FD6717f3271aBfC9b13f399037367D00A7493

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment