-
-
Save abracu/f4c521ae989e698021629109ecc76b87 to your computer and use it in GitHub Desktop.
Uniswap v2: fork mainnet and swap
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 ethers = require('ethers'); | |
| const routerArtifact = require('@uniswap/v2-periphery/build/UniswapV2Router02.json') | |
| const erc20Abi = require("../erc20.json") | |
| const wethArtifact = require("../weth.json") | |
| WETH_ADDRESS= '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2' | |
| USDT_ADDRESS= '0xdAC17F958D2ee523a2206206994597C13D831ec7' | |
| ROUTER_ADDRESS= '0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D' | |
| PAIR_ADDRESS= '0x0d4a11d5eeaac28ec3f61d100daf4d40471f1852' | |
| const provider = new ethers.JsonRpcProvider('http://127.0.0.1:8545/') | |
| const wallet = new ethers.Wallet('0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80') | |
| const signer = wallet.connect(provider) | |
| const router = new ethers.Contract(ROUTER_ADDRESS, routerArtifact.abi, provider) | |
| const usdt = new ethers.Contract(USDT_ADDRESS, erc20Abi, provider) | |
| const weth = new ethers.Contract(WETH_ADDRESS, wethArtifact.abi, provider) | |
| const logBalances = async () => { | |
| const ethBalance = await provider.getBalance(signer.address) | |
| const usdtBalance = await usdt.balanceOf(signer.address) | |
| const wethBalance = await weth.balanceOf(signer.address) | |
| console.log('--------------------') | |
| console.log('ETH Balance:', ethers.formatUnits(ethBalance, 18)) | |
| console.log('WETH Balance:', ethers.formatUnits(wethBalance, 18)) | |
| console.log('USDT Balance:', ethers.formatUnits(usdtBalance, 6)) | |
| console.log('--------------------') | |
| } | |
| const main = async () => { | |
| await signer.sendTransaction({ | |
| to: WETH_ADDRESS, | |
| value: ethers.parseUnits('5', 18) | |
| }) | |
| logBalances() | |
| const amountIn = ethers.parseUnits('1', 18) | |
| const tx1 = await weth.connect(signer).approve(router.target, amountIn) | |
| tx1.wait() | |
| const tx2 = await router.connect(signer).swapExactTokensForTokens( | |
| amountIn, | |
| 0, | |
| [WETH_ADDRESS, USDT_ADDRESS], | |
| signer.address, | |
| Math.floor(Date.now() / 1000) + (60 * 10), | |
| { | |
| gasLimit: 1000000, | |
| } | |
| ) | |
| await tx2.wait() | |
| logBalances() | |
| } | |
| main() | |
| /* | |
| node scripts/01_v2Swap.js | |
| */ |
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
| [ | |
| { | |
| "inputs": [], | |
| "stateMutability": "nonpayable", | |
| "type": "constructor" | |
| }, | |
| { | |
| "anonymous": false, | |
| "inputs": [ | |
| { | |
| "indexed": true, | |
| "internalType": "address", | |
| "name": "owner", | |
| "type": "address" | |
| }, | |
| { | |
| "indexed": true, | |
| "internalType": "address", | |
| "name": "spender", | |
| "type": "address" | |
| }, | |
| { | |
| "indexed": false, | |
| "internalType": "uint256", | |
| "name": "value", | |
| "type": "uint256" | |
| } | |
| ], | |
| "name": "Approval", | |
| "type": "event" | |
| }, | |
| { | |
| "anonymous": false, | |
| "inputs": [ | |
| { | |
| "indexed": true, | |
| "internalType": "address", | |
| "name": "from", | |
| "type": "address" | |
| }, | |
| { | |
| "indexed": true, | |
| "internalType": "address", | |
| "name": "to", | |
| "type": "address" | |
| }, | |
| { | |
| "indexed": false, | |
| "internalType": "uint256", | |
| "name": "value", | |
| "type": "uint256" | |
| } | |
| ], | |
| "name": "Transfer", | |
| "type": "event" | |
| }, | |
| { | |
| "inputs": [ | |
| { | |
| "internalType": "address", | |
| "name": "owner", | |
| "type": "address" | |
| }, | |
| { | |
| "internalType": "address", | |
| "name": "spender", | |
| "type": "address" | |
| } | |
| ], | |
| "name": "allowance", | |
| "outputs": [ | |
| { | |
| "internalType": "uint256", | |
| "name": "", | |
| "type": "uint256" | |
| } | |
| ], | |
| "stateMutability": "view", | |
| "type": "function" | |
| }, | |
| { | |
| "inputs": [ | |
| { | |
| "internalType": "address", | |
| "name": "spender", | |
| "type": "address" | |
| }, | |
| { | |
| "internalType": "uint256", | |
| "name": "amount", | |
| "type": "uint256" | |
| } | |
| ], | |
| "name": "approve", | |
| "outputs": [ | |
| { | |
| "internalType": "bool", | |
| "name": "", | |
| "type": "bool" | |
| } | |
| ], | |
| "stateMutability": "nonpayable", | |
| "type": "function" | |
| }, | |
| { | |
| "inputs": [ | |
| { | |
| "internalType": "address", | |
| "name": "account", | |
| "type": "address" | |
| } | |
| ], | |
| "name": "balanceOf", | |
| "outputs": [ | |
| { | |
| "internalType": "uint256", | |
| "name": "", | |
| "type": "uint256" | |
| } | |
| ], | |
| "stateMutability": "view", | |
| "type": "function" | |
| }, | |
| { | |
| "inputs": [], | |
| "name": "decimals", | |
| "outputs": [ | |
| { | |
| "internalType": "uint8", | |
| "name": "", | |
| "type": "uint8" | |
| } | |
| ], | |
| "stateMutability": "view", | |
| "type": "function" | |
| }, | |
| { | |
| "inputs": [ | |
| { | |
| "internalType": "address", | |
| "name": "spender", | |
| "type": "address" | |
| }, | |
| { | |
| "internalType": "uint256", | |
| "name": "subtractedValue", | |
| "type": "uint256" | |
| } | |
| ], | |
| "name": "decreaseAllowance", | |
| "outputs": [ | |
| { | |
| "internalType": "bool", | |
| "name": "", | |
| "type": "bool" | |
| } | |
| ], | |
| "stateMutability": "nonpayable", | |
| "type": "function" | |
| }, | |
| { | |
| "inputs": [ | |
| { | |
| "internalType": "address", | |
| "name": "spender", | |
| "type": "address" | |
| }, | |
| { | |
| "internalType": "uint256", | |
| "name": "addedValue", | |
| "type": "uint256" | |
| } | |
| ], | |
| "name": "increaseAllowance", | |
| "outputs": [ | |
| { | |
| "internalType": "bool", | |
| "name": "", | |
| "type": "bool" | |
| } | |
| ], | |
| "stateMutability": "nonpayable", | |
| "type": "function" | |
| }, | |
| { | |
| "inputs": [], | |
| "name": "name", | |
| "outputs": [ | |
| { | |
| "internalType": "string", | |
| "name": "", | |
| "type": "string" | |
| } | |
| ], | |
| "stateMutability": "view", | |
| "type": "function" | |
| }, | |
| { | |
| "inputs": [], | |
| "name": "symbol", | |
| "outputs": [ | |
| { | |
| "internalType": "string", | |
| "name": "", | |
| "type": "string" | |
| } | |
| ], | |
| "stateMutability": "view", | |
| "type": "function" | |
| }, | |
| { | |
| "inputs": [], | |
| "name": "totalSupply", | |
| "outputs": [ | |
| { | |
| "internalType": "uint256", | |
| "name": "", | |
| "type": "uint256" | |
| } | |
| ], | |
| "stateMutability": "view", | |
| "type": "function" | |
| }, | |
| { | |
| "inputs": [ | |
| { | |
| "internalType": "address", | |
| "name": "to", | |
| "type": "address" | |
| }, | |
| { | |
| "internalType": "uint256", | |
| "name": "amount", | |
| "type": "uint256" | |
| } | |
| ], | |
| "name": "transfer", | |
| "outputs": [ | |
| { | |
| "internalType": "bool", | |
| "name": "", | |
| "type": "bool" | |
| } | |
| ], | |
| "stateMutability": "nonpayable", | |
| "type": "function" | |
| }, | |
| { | |
| "inputs": [ | |
| { | |
| "internalType": "address", | |
| "name": "from", | |
| "type": "address" | |
| }, | |
| { | |
| "internalType": "address", | |
| "name": "to", | |
| "type": "address" | |
| }, | |
| { | |
| "internalType": "uint256", | |
| "name": "amount", | |
| "type": "uint256" | |
| } | |
| ], | |
| "name": "transferFrom", | |
| "outputs": [ | |
| { | |
| "internalType": "bool", | |
| "name": "", | |
| "type": "bool" | |
| } | |
| ], | |
| "stateMutability": "nonpayable", | |
| "type": "function" | |
| } | |
| ] |
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
| /** @type import('hardhat/config').HardhatUserConfig */ | |
| module.exports = { | |
| solidity: "0.8.18", | |
| networks: { | |
| hardhat: { | |
| forking: { | |
| url: "https://mainnet.infura.io/v3/abc" | |
| } | |
| } | |
| } | |
| }; |
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": "callForkedUniswapLocally", | |
| "version": "1.0.0", | |
| "description": "", | |
| "main": "index.js", | |
| "scripts": { | |
| "test": "echo \"Error: no test specified\" && exit 1" | |
| }, | |
| "keywords": [], | |
| "author": "", | |
| "license": "ISC", | |
| "dependencies": { | |
| "@uniswap/v2-periphery": "^1.1.0-beta.0", | |
| "ethers": "^6.3.0", | |
| "hardhat": "^2.14.0" | |
| } | |
| } |
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