Write Your First Uniswap Contract
This guide will walk you through the process of creating and deploying a simple Uniswap-like decentralized exchange (DEX) contract on the Pharos blockchain. By the end of this guide, you will have a basic understanding of how automated market makers (AMMs) work and how to implement a simple DEX.
Prerequisites
Before you begin, ensure you have the following:
Git: Used for code management and obtain examples.
Node.js: Install it from nodejs.org.
Pharos Devnet/Testnet Access: Access to a Pharos node (local or remote) for interacting with the blockchain.
Setup 1: Install Hardhat
Setup 2: Set Up the Project
Clone the example repo:
git clone https://github.com/PharosNetwork/examples
cd examples/uniswap/hardhat/contract
Install OpenZeppelin Contracts:
npm install
Step 3: Write the Uniswap Contract
Create a New Solidity File:
Create a new file for your uniswap contract:
touch contracts/Uniswap.sol
Write the uniswap Contract:
Open
contracts/Uniswap.sol
in your favorite text editor and add the following code:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
contract Uniswap {
address public tokenA;
address public tokenB;
uint256 public reserveA;
uint256 public reserveB;
constructor(address _tokenA, address _tokenB) {
tokenA = _tokenA;
tokenB = _tokenB;
}
function addLiquidity(uint256 amountA, uint256 amountB) external {
require(IERC20(tokenA).transferFrom(msg.sender, address(this), amountA), "Transfer failed");
require(IERC20(tokenB).transferFrom(msg.sender, address(this), amountB), "Transfer failed");
reserveA += amountA;
reserveB += amountB;
}
function removeLiquidity(uint256 amountA, uint256 amountB) external {
require(reserveA >= amountA && reserveB >= amountB, "Insufficient reserves");
reserveA -= amountA;
reserveB -= amountB;
require(IERC20(tokenA).transfer(msg.sender, amountA), "Transfer failed");
require(IERC20(tokenB).transfer(msg.sender, amountB), "Transfer failed");
}
function swapAToB(uint256 amountA) external {
uint256 amountB = (amountA * reserveB) / reserveA;
require(IERC20(tokenA).transferFrom(msg.sender, address(this), amountA), "Transfer failed");
require(IERC20(tokenB).transfer(msg.sender, amountB), "Transfer failed");
reserveA += amountA;
reserveB -= amountB;
}
function swapBToA(uint256 amountB) external {
uint256 amountA = (amountB * reserveA) / reserveB;
require(IERC20(tokenB).transferFrom(msg.sender, address(this), amountB), "Transfer failed");
require(IERC20(tokenA).transfer(msg.sender, amountA), "Transfer failed");
reserveB += amountB;
reserveA -= amountA;
}
}
Compile the Smart Contract:
npx hardhat compile
Test the Smart Contract
npx hardhat test
Step 4: Deploy the Uniswap Contract
Set the private key:
npx hardhat vars set PRIVATE_KEY
Deploy the Contract:
npx hardhat ignition deploy ./ignition/modules/Token.js --network pharos
Troubleshooting
Contract Deployment Fails: Ensure you have enough testnet tokens to cover the deployment cost.
Interaction Issues: Verify that the contract address and ABI are correct.
Test Failures: Check the test output for detailed error messages and adjust the tests accordingly.
Conclusion
This guide provides a comprehensive introduction to creating and deploying a Uniswap-like contract on the Pharos blockchain using Hardhat. If you encounter any issues, refer to the Hardhat documentation or the troubleshooting section. Happy building! 🚀
Last updated