Created
May 5, 2023 01:17
-
-
Save BlockmanCodes/f809c96b4c439077a96154d46ed8e52f to your computer and use it in GitHub Desktop.
Uniswap V2 & SushiSwap: Swap Tokens
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const { | |
Contract, ContractFactory, utils, constants, | |
} = require("ethers") | |
const WETH9 = require("../WETH9.json") | |
const factoryArtifact = require('@uniswap/v2-core/build/UniswapV2Factory.json') | |
const routerArtifact = require('@uniswap/v2-periphery/build/UniswapV2Router02.json') | |
const pairArtifact = require('@uniswap/v2-periphery/build/IUniswapV2Pair.json') | |
async function main() { | |
const [owner, trader] = await ethers.getSigners() | |
const Usdt = await ethers.getContractFactory('Tether', owner); | |
const usdt = await Usdt.deploy(); | |
const Usdc = await ethers.getContractFactory('UsdCoin', owner); | |
const usdc = await Usdc.deploy(); | |
const Weth = new ContractFactory(WETH9.abi, WETH9.bytecode, owner); | |
const weth = await Weth.deploy(); | |
const mintAmount = utils.parseEther('100000') | |
await usdt.connect(owner).mint(owner.address, mintAmount) | |
await usdc.connect(owner).mint(owner.address, mintAmount) | |
await usdt.connect(owner).mint(trader.address, mintAmount) | |
await usdc.connect(owner).mint(trader.address, mintAmount) | |
const FactoryA = new ContractFactory(factoryArtifact.abi, factoryArtifact.bytecode, owner); | |
const factoryA = await FactoryA.deploy(owner.address) | |
const FactoryB = new ContractFactory(factoryArtifact.abi, factoryArtifact.bytecode, owner); | |
const factoryB = await FactoryB.deploy(owner.address) | |
const txA1 = await factoryA.createPair(usdt.address, usdc.address); | |
await txA1.wait() | |
const txB1 = await factoryB.createPair(usdt.address, usdc.address); | |
await txB1.wait() | |
const pairAddressA = await factoryA.getPair(usdt.address, usdc.address) | |
const pairAddressB = await factoryB.getPair(usdt.address, usdc.address) | |
const pairA = new Contract(pairAddressA, pairArtifact.abi, owner) | |
const pairB = new Contract(pairAddressB, pairArtifact.abi, owner) | |
const RouterA = new ContractFactory(routerArtifact.abi, routerArtifact.bytecode, owner); | |
const routerA = await RouterA.deploy(factoryA.address, weth.address) | |
const RouterB = new ContractFactory(routerArtifact.abi, routerArtifact.bytecode, owner); | |
const routerB = await RouterB.deploy(factoryB.address, weth.address) | |
const approvalUsdtOwnerA = await usdt.connect(owner).approve(routerA.address, constants.MaxUint256); | |
await approvalUsdtOwnerA.wait(); | |
const approvalUsdcOwnerA = await usdc.connect(owner).approve(routerA.address, constants.MaxUint256); | |
await approvalUsdcOwnerA.wait(); | |
const approvalUsdtTraderA = await usdt.connect(trader).approve(routerA.address, constants.MaxUint256); | |
await approvalUsdtTraderA.wait(); | |
const approvalUsdcTraderA = await usdc.connect(trader).approve(routerA.address, constants.MaxUint256); | |
await approvalUsdcTraderA.wait(); | |
const approvalUsdtOwnerB = await usdt.connect(owner).approve(routerB.address, constants.MaxUint256); | |
await approvalUsdtOwnerB.wait(); | |
const approvalUsdcOwnerB = await usdc.connect(owner).approve(routerB.address, constants.MaxUint256); | |
await approvalUsdcOwnerB.wait(); | |
const approvalUsdtTraderB = await usdt.connect(trader).approve(routerB.address, constants.MaxUint256); | |
await approvalUsdtTraderB.wait(); | |
const approvalUsdcTraderB = await usdc.connect(trader).approve(routerB.address, constants.MaxUint256); | |
await approvalUsdcTraderB.wait(); | |
const addLiquidityTxA = await routerA.connect(owner).addLiquidity( | |
usdt.address, | |
usdc.address, | |
utils.parseEther('100'), | |
utils.parseEther('100'), | |
0, | |
0, | |
owner.address, | |
Math.floor(Date.now() / 1000 + (10 * 60)), | |
{ gasLimit: utils.hexlify(1_000_000)} | |
); | |
addLiquidityTxA.wait(); | |
const addLiquidityTxB = await routerB.connect(owner).addLiquidity( | |
usdt.address, | |
usdc.address, | |
utils.parseEther('50'), | |
utils.parseEther('150'), | |
0, | |
0, | |
owner.address, | |
Math.floor(Date.now() / 1000 + (10 * 60)), | |
{ gasLimit: utils.hexlify(1_000_000)} | |
); | |
addLiquidityTxB.wait(); | |
let reservesA | |
let reservesB | |
reservesA = await pairA.getReserves() | |
console.log('reservesA', reservesA) | |
reservesB = await pairB.getReserves() | |
console.log('reservesB', reservesB) | |
console.log('USDT_ADDRESS=', `'${usdt.address}'`) | |
console.log('USDC_ADDRESS=', `'${usdc.address}'`) | |
console.log('WETH_ADDRESS=', `'${weth.address}'`) | |
console.log('FACTORY_A_ADDRESS=', `'${factoryA.address}'`) | |
console.log('FACTORY_B_ADDRESS=', `'${factoryB.address}'`) | |
console.log('PAIR_A_ADDRESS=', `'${pairAddressA}'`) | |
console.log('PAIR_B_ADDRESS=', `'${pairAddressB}'`) | |
console.log('ROUTER_A_ADDRESS=', `'${routerA.address}'`) | |
console.log('ROUTER_B_ADDRESS=', `'${routerB.address}'`) | |
} | |
/* | |
npx hardhat run --network localhost scripts/01_deployContracts.js | |
*/ | |
main() | |
.then(() => process.exit(0)) | |
.catch((error) => { | |
console.error(error); | |
process.exit(1); | |
}); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const { providers, Contract, utils, constants } = require('ethers'); | |
const routerArtifact = require('@uniswap/v2-periphery/build/UniswapV2Router02.json') | |
const usdtArtifact = require("../artifacts/contracts/Tether.sol/Tether.json") | |
const usdcArtifact = require("../artifacts/contracts/UsdCoin.sol/UsdCoin.json") | |
// Copy Addresses | |
USDT_ADDRESS= '0x5FbDB2315678afecb367f032d93F642f64180aa3' | |
USDC_ADDRESS= '0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512' | |
WETH_ADDRESS= '0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0' | |
FACTORY_A_ADDRESS= '0xa513E6E4b8f2a923D98304ec87F64353C4D5C853' | |
FACTORY_B_ADDRESS= '0x2279B7A0a67DB372996a5FaB50D91eAA73d2eBe6' | |
PAIR_A_ADDRESS= '0xD1f1bbbF65CceB5cAf1691a76c17D4E75213B69c' | |
PAIR_B_ADDRESS= '0x41Cc89c770ddFcF9b54C6C04CaAfeA885Ce8c1b8' | |
ROUTER_A_ADDRESS= '0xB7f8BC63BbcaD18155201308C8f3540b07f84F5e' | |
ROUTER_B_ADDRESS= '0xA51c1fc2f0D1a1b8494Ed1FE312d7C3a78Ed91C0' | |
const provider = new providers.JsonRpcProvider('http://127.0.0.1:8545/') | |
const router = new Contract( | |
ROUTER_A_ADDRESS, | |
routerArtifact.abi, | |
provider | |
) | |
const usdt = new Contract( | |
USDT_ADDRESS, | |
usdtArtifact.abi, | |
provider | |
) | |
const usdc = new Contract( | |
USDC_ADDRESS, | |
usdcArtifact.abi, | |
provider | |
) | |
const logBalance = async (signerObj) => { | |
let ethBalance | |
let usdtBalance | |
let usdcBalance | |
let balances | |
ethBalance = await signerObj.getBalance() | |
usdtBalance = await usdt.balanceOf(signerObj.address) | |
usdcBalance = await usdc.balanceOf(signerObj.address) | |
balances = { | |
ethBalance: ethBalance, | |
usdtBalance: usdtBalance, | |
usdcBalance: usdcBalance, | |
} | |
console.log('balances', balances) | |
} | |
const main = async () => { | |
const [owner, trader] = await ethers.getSigners() | |
await logBalance(trader) | |
const tx = await router.connect(trader).swapExactTokensForTokens( | |
utils.parseUnits('1', 18), | |
0, | |
[USDT_ADDRESS, USDC_ADDRESS], | |
trader.address, | |
Math.floor(Date.now() / 1000) + (60 * 10), | |
{ | |
gasLimit: 1000000, | |
} | |
) | |
await tx.wait() | |
await logBalance(trader) | |
} | |
/* | |
npx hardhat run --network localhost scripts/02_simpleV2Swap.js | |
*/ | |
main() | |
.then(() => process.exit(0)) | |
.catch((error) => { | |
console.error(error); | |
process.exit(1); | |
}); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require("@nomiclabs/hardhat-waffle"); | |
/** @type import('hardhat/config').HardhatUserConfig */ | |
module.exports = { | |
solidity: { | |
version: "0.8.17", | |
settings: { | |
optimizer: { | |
enabled: true, | |
runs: 5000, | |
details: { yul: false }, | |
}, | |
} | |
}, | |
}; |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"name": "both", | |
"version": "1.0.0", | |
"description": "", | |
"main": "index.js", | |
"scripts": { | |
"test": "echo \"Error: no test specified\" && exit 1" | |
}, | |
"keywords": [], | |
"author": "", | |
"license": "ISC", | |
"dependencies": { | |
"@nomiclabs/hardhat-ethers": "^2.1.1", | |
"@nomiclabs/hardhat-waffle": "^2.0.3", | |
"@openzeppelin/contracts": "^4.7.3", | |
"@uniswap/v2-core": "^1.0.1", | |
"@uniswap/v2-periphery": "^1.1.0-beta.0", | |
"ethereum-waffle": "^3.4.4", | |
"ethers": "^5.7.1", | |
"hardhat": "^2.11.2" | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pragma solidity ^0.8.0; | |
import '@openzeppelin/contracts/token/ERC20/ERC20.sol'; | |
import "@openzeppelin/contracts/access/Ownable.sol"; | |
contract Tether is ERC20, Ownable { | |
constructor() ERC20('Tether', 'USDT') {} | |
function mint(address to, uint256 amount) public onlyOwner { | |
_mint(to, amount); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pragma solidity ^0.8.0; | |
import '@openzeppelin/contracts/token/ERC20/ERC20.sol'; | |
import "@openzeppelin/contracts/access/Ownable.sol"; | |
contract UsdCoin is ERC20, Ownable { | |
constructor() ERC20('UsdCoin', 'USDC') {} | |
function mint(address to, uint256 amount) public onlyOwner { | |
_mint(to, amount); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"bytecode": "60606040526040805190810160405280600d81526020017f57726170706564204574686572000000000000000000000000000000000000008152506000908051906020019061004f9291906100c8565b506040805190810160405280600481526020017f57455448000000000000000000000000000000000000000000000000000000008152506001908051906020019061009b9291906100c8565b506012600260006101000a81548160ff021916908360ff16021790555034156100c357600080fd5b61016d565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061010957805160ff1916838001178555610137565b82800160010185558215610137579182015b8281111561013657825182559160200191906001019061011b565b5b5090506101449190610148565b5090565b61016a91905b8082111561016657600081600090555060010161014e565b5090565b90565b610c348061017c6000396000f3006060604052600436106100af576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146100b9578063095ea7b31461014757806318160ddd146101a157806323b872dd146101ca5780632e1a7d4d14610243578063313ce5671461026657806370a082311461029557806395d89b41146102e2578063a9059cbb14610370578063d0e30db0146103ca578063dd62ed3e146103d4575b6100b7610440565b005b34156100c457600080fd5b6100cc6104dd565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561010c5780820151818401526020810190506100f1565b50505050905090810190601f1680156101395780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561015257600080fd5b610187600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061057b565b604051808215151515815260200191505060405180910390f35b34156101ac57600080fd5b6101b461066d565b6040518082815260200191505060405180910390f35b34156101d557600080fd5b610229600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061068c565b604051808215151515815260200191505060405180910390f35b341561024e57600080fd5b61026460048080359060200190919050506109d9565b005b341561027157600080fd5b610279610b05565b604051808260ff1660ff16815260200191505060405180910390f35b34156102a057600080fd5b6102cc600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b18565b6040518082815260200191505060405180910390f35b34156102ed57600080fd5b6102f5610b30565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561033557808201518184015260208101905061031a565b50505050905090810190601f1680156103625780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561037b57600080fd5b6103b0600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610bce565b604051808215151515815260200191505060405180910390f35b6103d2610440565b005b34156103df57600080fd5b61042a600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610be3565b6040518082815260200191505060405180910390f35b34600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040518082815260200191505060405180910390a2565b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105735780601f1061054857610100808354040283529160200191610573565b820191906000526020600020905b81548152906001019060200180831161055657829003601f168201915b505050505081565b600081600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b60003073ffffffffffffffffffffffffffffffffffffffff1631905090565b600081600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101515156106dc57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141580156107b457507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414155b156108cf5781600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015151561084457600080fd5b81600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505b81600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410151515610a2757600080fd5b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501515610ab457600080fd5b3373ffffffffffffffffffffffffffffffffffffffff167f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65826040518082815260200191505060405180910390a250565b600260009054906101000a900460ff1681565b60036020528060005260406000206000915090505481565b60018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610bc65780601f10610b9b57610100808354040283529160200191610bc6565b820191906000526020600020905b815481529060010190602001808311610ba957829003601f168201915b505050505081565b6000610bdb33848461068c565b905092915050565b60046020528160005260406000206020528060005260406000206000915091505054815600a165627a7a72305820deb4c2ccab3c2fdca32ab3f46728389c2fe2c165d5fafa07661e4e004f6c344a0029", | |
"abi": [ | |
{ | |
"constant": true, | |
"inputs": [], | |
"name": "name", | |
"outputs": [{ "name": "", "type": "string" }], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": false, | |
"inputs": [ | |
{ "name": "guy", "type": "address" }, | |
{ "name": "wad", "type": "uint256" } | |
], | |
"name": "approve", | |
"outputs": [{ "name": "", "type": "bool" }], | |
"payable": false, | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [], | |
"name": "totalSupply", | |
"outputs": [{ "name": "", "type": "uint256" }], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": false, | |
"inputs": [ | |
{ "name": "src", "type": "address" }, | |
{ "name": "dst", "type": "address" }, | |
{ "name": "wad", "type": "uint256" } | |
], | |
"name": "transferFrom", | |
"outputs": [{ "name": "", "type": "bool" }], | |
"payable": false, | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"constant": false, | |
"inputs": [{ "name": "wad", "type": "uint256" }], | |
"name": "withdraw", | |
"outputs": [], | |
"payable": false, | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [], | |
"name": "decimals", | |
"outputs": [{ "name": "", "type": "uint8" }], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [{ "name": "", "type": "address" }], | |
"name": "balanceOf", | |
"outputs": [{ "name": "", "type": "uint256" }], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [], | |
"name": "symbol", | |
"outputs": [{ "name": "", "type": "string" }], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": false, | |
"inputs": [ | |
{ "name": "dst", "type": "address" }, | |
{ "name": "wad", "type": "uint256" } | |
], | |
"name": "transfer", | |
"outputs": [{ "name": "", "type": "bool" }], | |
"payable": false, | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"constant": false, | |
"inputs": [], | |
"name": "deposit", | |
"outputs": [], | |
"payable": true, | |
"stateMutability": "payable", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [ | |
{ "name": "", "type": "address" }, | |
{ "name": "", "type": "address" } | |
], | |
"name": "allowance", | |
"outputs": [{ "name": "", "type": "uint256" }], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ "payable": true, "stateMutability": "payable", "type": "fallback" }, | |
{ | |
"anonymous": false, | |
"inputs": [ | |
{ "indexed": true, "name": "src", "type": "address" }, | |
{ "indexed": true, "name": "guy", "type": "address" }, | |
{ "indexed": false, "name": "wad", "type": "uint256" } | |
], | |
"name": "Approval", | |
"type": "event" | |
}, | |
{ | |
"anonymous": false, | |
"inputs": [ | |
{ "indexed": true, "name": "src", "type": "address" }, | |
{ "indexed": true, "name": "dst", "type": "address" }, | |
{ "indexed": false, "name": "wad", "type": "uint256" } | |
], | |
"name": "Transfer", | |
"type": "event" | |
}, | |
{ | |
"anonymous": false, | |
"inputs": [ | |
{ "indexed": true, "name": "dst", "type": "address" }, | |
{ "indexed": false, "name": "wad", "type": "uint256" } | |
], | |
"name": "Deposit", | |
"type": "event" | |
}, | |
{ | |
"anonymous": false, | |
"inputs": [ | |
{ "indexed": true, "name": "src", "type": "address" }, | |
{ "indexed": false, "name": "wad", "type": "uint256" } | |
], | |
"name": "Withdrawal", | |
"type": "event" | |
} | |
] | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Thank you and once i start making money again im taking you class, feels like ive been looking for this forever, If your interested i hhave an Nft that i want to lauch on the meta verse. if interested let me kmow