Skip to content

Commit 67455cf

Browse files
Merge pull request #3 from kryptobaseddev/release0.0.1
update Approval function double allowance if less than 0
2 parents af1f3b1 + d05548a commit 67455cf

9 files changed

Lines changed: 226 additions & 138 deletions

File tree

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ error_logs/commit_error.log
1010
temp.json
1111
.DS_Store
1212
design/
13+
contracts/
1314
# Xcode
1415
#
1516
files/images/

ABIs/erc20.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,17 @@ function erc20(account, tokenAddress) {
3838
stateMutability: "nonpayable",
3939
type: "function",
4040
},
41+
{
42+
constant: true,
43+
inputs: [
44+
{ name: "_owner", type: "address" },
45+
{ name: "_spender", type: "address" }
46+
],
47+
name: "allowance",
48+
outputs: [{ name: "remaining", type: "uint256" }],
49+
type: "function",
50+
},
51+
4152
],
4253
account
4354
);

Functions/buyToken.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,4 +63,4 @@ const buyToken = async (account, tokenContract, gasLimit, gasPrice) => {
6363

6464
}
6565

66-
export default buyToken;
66+
export default buyToken;

Functions/sellToken.js

Lines changed: 100 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -4,39 +4,29 @@ import constants from '../Config/constants.js';
44
const delay = ms => new Promise(res => setTimeout(res, ms));
55

66
const sellToken = async (account, tokenContract, gasLimit, gasPrice, value = 99) => {
7-
let attempts = 10; // max attempts
8-
let slippage = constants.Slippage; // starting slippage
7+
let attempts = 10; // max attempts
8+
let slippage = constants.Slippage; // starting slippage
99

10-
while (attempts > 0) {
11-
try {
12-
const sellTokenContract = new constants.ethers.Contract(
13-
tokenContract,
14-
constants.swapAbi,
15-
account
16-
);
17-
18-
const contract = new constants.ethers.Contract(constants.PANROUTERADDRESS, constants.abi, account);
19-
const accountAddress = account.address;
20-
const tokenBalance = await constants.erc20(account, tokenContract).balanceOf(
21-
accountAddress
22-
);
23-
let amountOutMin = 0;
24-
const amountIn = tokenBalance.mul(value).div(100);
25-
const amounts = await constants.router(account).getAmountsOut(amountIn, [
26-
tokenContract,
27-
constants.BNBCONTRACT
28-
]);
10+
while (attempts > 0) {
11+
try {
12+
const contract = new constants.ethers.Contract(constants.PANROUTERADDRESS, constants.abi, account);
13+
const accountAddress = account.address;
14+
const tokenBalance = await constants.erc20(account, tokenContract).balanceOf(
15+
accountAddress
16+
);
17+
let amountOutMin = 0;
18+
const amountIn = tokenBalance.mul(value).div(100);
2919

30-
// increment slippage by 2% for each attempt
31-
slippage += 2;
20+
const sellTokenContract = new constants.ethers.Contract(
21+
tokenContract,
22+
constants.swapAbi,
23+
account
24+
);
25+
const allowance = await sellTokenContract.allowance(account.address, constants.PANROUTERADDRESS);
3226

33-
if (parseInt(slippage) !== 0) {
34-
amountOutMin = amounts[1].sub(amounts[1].mul(slippage.toString()).div(100));
35-
} else {
36-
amountOutMin = amounts[1];
37-
}
38-
39-
const approve = await sellTokenContract.approve(constants.PANROUTERADDRESS, amountIn);
27+
// If allowance is less than double the amount we want to sell, approve double the spending
28+
if (allowance.lt(amountIn.mul(2))) {
29+
const approve = await sellTokenContract.approve(constants.PANROUTERADDRESS, amountIn.mul(2));
4030
const receipt_approve = await approve.wait();
4131
if (
4232
receipt_approve &&
@@ -46,79 +36,92 @@ const sellToken = async (account, tokenContract, gasLimit, gasPrice, value = 99)
4636
const message = `INFO - Approved https://bscscan.com/tx/${receipt_approve.transactionHash} ${constants.chalk.green('✅')}`;
4737
console.log(constants.chalk.green(message));
4838
constants.fs.appendFileSync('./error_logs/log.txt', `${new Date().toLocaleString()} - ${message}\n`);
49-
const swap_txn =
50-
await contract.swapExactTokensForETHSupportingFeeOnTransferTokens(
51-
amountIn,
52-
amountOutMin,
53-
[tokenContract, constants.BNBCONTRACT],
54-
accountAddress,
55-
Date.now() + 1000 * 60 * 10,
56-
{
57-
gasLimit: gasLimit,
58-
gasPrice: gasPrice,
59-
}
60-
);
61-
const receipt = await swap_txn.wait();
62-
if (receipt && receipt.blockNumber && receipt.status === 1) {
63-
// 0 - failed, 1 - success
64-
const message = `INFO - Transaction https://bscscan.com/tx/${receipt.transactionHash} mined, status success ${constants.chalk.green('✅')}`;
65-
console.log(constants.chalk.green(message));
66-
constants.fs.appendFileSync('./error_logs/log.txt', `${new Date().toLocaleString()} - ${message}\n`);
67-
// if the sell transaction is successful, break the loop
68-
break;
69-
} else if (receipt && receipt.blockNumber && receipt.status === 0) {
70-
const message = `ERROR - Transaction https://bscscan.com/tx/${receipt.transactionHash} mined, status failed ${constants.chalk.red('❌')}`;
71-
console.log(constants.chalk.red(message));
72-
constants.fs.appendFileSync('./error_logs/log.txt', `${new Date().toLocaleString()} - ${message}\n`);
73-
} else {
74-
const message = `WARNING - Transaction https://bscscan.com/tx/${receipt.transactionHash} not mined ${constants.chalk.yellow('⚠️')}`;
75-
console.log(constants.chalk.yellow(message));
76-
constants.fs.appendFileSync('./error_logs/log.txt', `${new Date().toLocaleString()} - ${message}\n`);
77-
}
7839
}
40+
}
7941

80-
// decrement the value by 10 each time
81-
value -= 10;
82-
attempts--;
42+
const amounts = await constants.router(account).getAmountsOut(amountIn, [
43+
tokenContract,
44+
constants.BNBCONTRACT
45+
]);
8346

84-
// delay execution for 5 second (5000 milliseconds) between each sell attempt
85-
await delay(5000);
86-
} catch (error) {
87-
let errorMessage = error.message;
88-
const errorReasonIndex = errorMessage.indexOf("(reason=");
89-
90-
// Extract error reason if it exists
91-
if (errorReasonIndex !== -1) {
92-
errorMessage = errorMessage.substring(errorReasonIndex + 9, errorMessage.indexOf(","));
93-
errorMessage = `Error reason: ${errorMessage}`;
94-
}
95-
96-
const message = `ERROR - Error while selling token: ${errorMessage} ${constants.chalk.red('❌')}`;
97-
console.error(constants.chalk.red(message));
98-
constants.fs.appendFileSync('./error_logs/log.txt', `${new Date().toLocaleString()} - ${message}\n`);
99-
attempts--;
100-
101-
// delay execution for 5 second (5000 milliseconds) between each sell attempt
102-
await delay(5000);
47+
// increment slippage by 2% for each attempt
48+
slippage += 2;
49+
50+
if (parseInt(slippage) !== 0) {
51+
amountOutMin = amounts[1].sub(amounts[1].mul(slippage.toString()).div(100));
52+
} else {
53+
amountOutMin = amounts[1];
10354
}
104-
105-
} // closing brace for while loop
106-
// If all attempts have been made and the token couldn't be sold, add to blacklist
107-
if (attempts === 0) {
108-
constants.blacklist.push(tokenContract);
109-
constants.fs.writeFile('./Lists/blacklist.json', JSON.stringify(constants.blacklist), (err) => {
110-
if (err) {
111-
const message = `ERROR - Error while updating blacklist: ${err} ${constants.chalk.red('❌')}`;
112-
console.error(constants.chalk.red(message));
113-
constants.fs.appendFileSync('./error_logs/log.txt', `${new Date().toLocaleString()} - ${message}\n`);
114-
} else {
115-
const message = `INFO - Token ${tokenContract} added to blacklist after unsuccessful sell attempts ${constants.chalk.green('✅')}`;
116-
console.log(constants.chalk.green(message));
117-
constants.fs.appendFileSync('./error_logs/log.txt', `${new Date().toLocaleString()} - ${message}\n`);
55+
56+
const swap_txn = await contract.swapExactTokensForETHSupportingFeeOnTransferTokens(
57+
amountIn,
58+
amountOutMin,
59+
[tokenContract, constants.BNBCONTRACT],
60+
accountAddress,
61+
Date.now() + 1000 * 60 * 10,
62+
{
63+
gasLimit: gasLimit,
64+
gasPrice: gasPrice,
11865
}
119-
});
66+
);
67+
const receipt = await swap_txn.wait();
68+
if (receipt && receipt.blockNumber && receipt.status === 1) {
69+
// 0 - failed, 1 - success
70+
const message = `INFO - Transaction https://bscscan.com/tx/${receipt.transactionHash} mined, status success ${constants.chalk.green('✅')}`;
71+
console.log(constants.chalk.green(message));
72+
constants.fs.appendFileSync('./error_logs/log.txt', `${new Date().toLocaleString()} - ${message}\n`);
73+
// if the sell transaction is successful, break the loop
74+
break;
75+
} else if (receipt && receipt.blockNumber && receipt.status === 0) {
76+
const message = `ERROR - Transaction https://bscscan.com/tx/${receipt.transactionHash} mined, status failed ${constants.chalk.red('❌')}`;
77+
console.log(constants.chalk.red(message));
78+
constants.fs.appendFileSync('./error_logs/log.txt', `${new Date().toLocaleString()} - ${message}\n`);
79+
} else {
80+
const message = `WARNING - Transaction https://bscscan.com/tx/${receipt.transactionHash} not mined ${constants.chalk.yellow('⚠️')}`;
81+
console.log(constants.chalk.yellow(message));
82+
constants.fs.appendFileSync('./error_logs/log.txt', `${new Date().toLocaleString()} - ${message}\n`);
83+
}
84+
// decrement the value by 10 each time
85+
value -= 10;
86+
attempts--;
87+
88+
// delay execution for 5 second (5000 milliseconds) between each sell attempt
89+
await delay(5000);
90+
} catch (error) {
91+
let errorMessage = error.message;
92+
const errorReasonIndex = errorMessage.indexOf("(reason=");
93+
94+
// Extract error reason if it exists
95+
if (errorReasonIndex !== -1) {
96+
errorMessage = errorMessage.substring(errorReasonIndex + 9, errorMessage.indexOf(","));
97+
errorMessage = `Error reason: ${errorMessage}`;
98+
}
99+
100+
const message = `ERROR - Error while selling token: ${errorMessage} ${constants.chalk.red('❌')}`;
101+
console.error(constants.chalk.red(message));
102+
constants.fs.appendFileSync('./error_logs/log.txt', `${new Date().toLocaleString()} - ${message}\n`);
103+
attempts--;
104+
105+
// delay execution for 1 second (1000 milliseconds) between each sell attempt
106+
await delay(1000);
120107
}
108+
109+
} // closing brace for while loop
110+
// If all attempts have been made and the token couldn't be sold, add to blacklist
111+
if (attempts === 0) {
112+
constants.blacklist.push(tokenContract);
113+
constants.fs.writeFile('./Lists/blacklist.json', JSON.stringify(constants.blacklist), (err) => {
114+
if (err) {
115+
const message = `ERROR - Error while updating blacklist: ${err} ${constants.chalk.red('❌')}`;
116+
console.error(constants.chalk.red(message));
117+
constants.fs.appendFileSync('./error_logs/log.txt', `${new Date().toLocaleString()} - ${message}\n`);
118+
} else {
119+
const message = `INFO - Token ${tokenContract} added to blacklist after unsuccessful sell attempts ${constants.chalk.green('✅')}`;
120+
console.log(constants.chalk.green(message));
121+
constants.fs.appendFileSync('./error_logs/log.txt', `${new Date().toLocaleString()} - ${message}\n`);
122+
}
123+
});
124+
}
121125
}
122126

123127
export default sellToken;
124-

Lists/blacklist.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
["0x171130a203df66c50B2Ec2BC0E385dF4F5F6eC20","0x556a527E17732735cf7baBf582a7cF001Fc309C2","0xC41Cd7cE260704b1Fb2AA630ec2d959C529A36BA","0xa18F57919851387Affc4482bF77c2A0609F4DE67","0x55d398326f99059fF775485246999027B3197955","0xB10EDe74D38b15751BACe7CdA02dd6d684126c30","0xda74cD3D68A3E54D955162110Ea40c04Bf7e17E6","0xC4Fd0a6328f39F1db9E9A0DFc32534C78E19Bf6f","0xb5002A946c0150A0EF30eEB034b099928490E67C","0x877839Cc5312743aAEc1F1DDa0c195d89Cd755D5","0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56","0x0E09FaBB73Bd3Ade0a17ECC321fD13a19e81cE82","0x608756c184A0723077B0c10F97f4D054c9eE1C0F","0x1E84BFB6dc6cf352572344B772DF549c04Fda869","0x1e3eC969F9D8fb8FcF01267a56eA2D603B914991","0x082744dD08Dc96929e476d7C65a29B6Bfd6b0755","0x5053C014eB017757e343ff4fc8741195aF76B40c","0xC708Fa57A4e9c821443f6251a4FF11DC446b6741","0x0baB3607beEDC157EccDFECbCAD8Dc038d72f8c5","0x55d398326f99059fF775485246999027B3197955","0x1e84bfb6dc6cf352572344b772df549c04fda869","0xFEC99f71DD6e58Be0711A251eaA44ce1c5B64c01","0x556a527E17732735cf7baBf582a7cF001Fc309C2","0x1E84BFB6dc6cf352572344B772DF549c04Fda869","0x78b617aFA309aF36Fc8606728026C8fd1FC78BBC","0x47974d4117280bb6f6b60182323177f6a1df61b2","0x494c83CaED27aeb836d7fd1482D080e1D35DD0f3","0xedbd18b82215e7e39b7080ad967669b00ff1b8b4","0xf8b8C14CDCCeD823CACCe592c82f526aEB197a30","0x8A3AE5f13Aff94A3E72F45951d2f191Befbc006c","0x253c0460cC962F48e2ff4Be8D9F790B47CE4d756","0x1b9DEc855E98d1c01426a3eD615dd25d2947290E","0x8A3AE5f13Aff94A3E72F45951d2f191Befbc006c","0xd692500383Eb72e271426E732Cdb5668948058d5","0xE5bA47fD94CB645ba4119222e34fB33F59C7CD90","0x7cF551258d6871b72EE1bD1624588a6245bF48c4","0x1dcDC54cFd22E0FF5586A505c827D55A6D8ceB1d","0xC496108Ed523AF656bb0F3E1Cb63E3daaCB987F4","0xF0C26f3c132FF29FfCd236DB51E18b935137E76c","0x0451BCC93E8bbAfd6849A7cFa747c484658094AD","0x9D655C9eD8D2291f0df80051b2D4d403Ef930acC","0xbC606aFE23c6c77Ab4a19138167053a6bd0C83c3","0x47Fd014706081068448b89Fc6bAca2730977216a","0x237ace23Ab2C36a004AA5e4fB134fe5c1cedF06c","0x13C2C08ebBf9589e47F4F62cC21fFfcD89F69e5B"]
1+
["0x171130a203df66c50B2Ec2BC0E385dF4F5F6eC20","0x556a527E17732735cf7baBf582a7cF001Fc309C2","0xC41Cd7cE260704b1Fb2AA630ec2d959C529A36BA","0xa18F57919851387Affc4482bF77c2A0609F4DE67","0x55d398326f99059fF775485246999027B3197955","0xB10EDe74D38b15751BACe7CdA02dd6d684126c30","0xda74cD3D68A3E54D955162110Ea40c04Bf7e17E6","0xC4Fd0a6328f39F1db9E9A0DFc32534C78E19Bf6f","0xb5002A946c0150A0EF30eEB034b099928490E67C","0x877839Cc5312743aAEc1F1DDa0c195d89Cd755D5","0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56","0x0E09FaBB73Bd3Ade0a17ECC321fD13a19e81cE82","0x608756c184A0723077B0c10F97f4D054c9eE1C0F","0x1E84BFB6dc6cf352572344B772DF549c04Fda869","0x1e3eC969F9D8fb8FcF01267a56eA2D603B914991","0x082744dD08Dc96929e476d7C65a29B6Bfd6b0755","0x5053C014eB017757e343ff4fc8741195aF76B40c","0xC708Fa57A4e9c821443f6251a4FF11DC446b6741","0x0baB3607beEDC157EccDFECbCAD8Dc038d72f8c5","0x55d398326f99059fF775485246999027B3197955","0x1e84bfb6dc6cf352572344b772df549c04fda869","0xFEC99f71DD6e58Be0711A251eaA44ce1c5B64c01","0x556a527E17732735cf7baBf582a7cF001Fc309C2","0x1E84BFB6dc6cf352572344B772DF549c04Fda869","0x78b617aFA309aF36Fc8606728026C8fd1FC78BBC","0x47974d4117280bb6f6b60182323177f6a1df61b2","0x494c83CaED27aeb836d7fd1482D080e1D35DD0f3","0xedbd18b82215e7e39b7080ad967669b00ff1b8b4","0xf8b8C14CDCCeD823CACCe592c82f526aEB197a30","0x8A3AE5f13Aff94A3E72F45951d2f191Befbc006c","0x253c0460cC962F48e2ff4Be8D9F790B47CE4d756","0x1b9DEc855E98d1c01426a3eD615dd25d2947290E","0x8A3AE5f13Aff94A3E72F45951d2f191Befbc006c","0xd692500383Eb72e271426E732Cdb5668948058d5","0xE5bA47fD94CB645ba4119222e34fB33F59C7CD90","0x7cF551258d6871b72EE1bD1624588a6245bF48c4","0x1dcDC54cFd22E0FF5586A505c827D55A6D8ceB1d","0xC496108Ed523AF656bb0F3E1Cb63E3daaCB987F4","0xF0C26f3c132FF29FfCd236DB51E18b935137E76c","0x0451BCC93E8bbAfd6849A7cFa747c484658094AD","0x9D655C9eD8D2291f0df80051b2D4d403Ef930acC","0xbC606aFE23c6c77Ab4a19138167053a6bd0C83c3","0x47Fd014706081068448b89Fc6bAca2730977216a","0x237ace23Ab2C36a004AA5e4fB134fe5c1cedF06c","0x13C2C08ebBf9589e47F4F62cC21fFfcD89F69e5B","0x845d551fAE4Be2dD871Eb978beb509fD74261231","0x5fa26252c23e43De50D3368f624e47Fa8808488E","0xbF2F3084B0050A318bA04b9569dB34f84832183D","0x49AD9aC79a9C730b55f2Ee2DA92f2Bc38234fc36","0xdb93cefbc621Fa18bEe2B3fcdFC34860351a1532","0xc9Bb93672E4C10A9BcCCC570D1F1407db2bac1Ac","0xb5640A587dCDc5964A1A441455A41d6Fbb071719","0x7704d0EaD6F74E625d7371b079D8b2475bc852d4","0x98f20E497D2579FF3adb8F37d09f1F5fbFAb42Cb","0x02887cD6615BD7A005b5cB72f27EBbAd70884406","0x8E0c77B827963Cacf18ac170e95f67973d93ed1c","0x69C2fcAe7e30b429166BD616A322e32BeC036bCf","0xCaCbE4A581A7A0e5f4740f981E26299FE4712369","0x9A2478C4036548864d96a97Fbf93f6a3341fedac","0xe01B835630d63DF7Dd09E36B4aae694816e19bdb"]

0 commit comments

Comments
 (0)