Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

update Approval function double allowance if less than 0 #3

Merged
merged 1 commit into from
Jun 10, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ error_logs/commit_error.log
temp.json
.DS_Store
design/
contracts/
# Xcode
#
files/images/
Expand Down
11 changes: 11 additions & 0 deletions ABIs/erc20.js
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,17 @@ function erc20(account, tokenAddress) {
stateMutability: "nonpayable",
type: "function",
},
{
constant: true,
inputs: [
{ name: "_owner", type: "address" },
{ name: "_spender", type: "address" }
],
name: "allowance",
outputs: [{ name: "remaining", type: "uint256" }],
type: "function",
},

],
account
);
Expand Down
2 changes: 1 addition & 1 deletion Functions/buyToken.js
Original file line number Diff line number Diff line change
Expand Up @@ -63,4 +63,4 @@ const buyToken = async (account, tokenContract, gasLimit, gasPrice) => {

}

export default buyToken;
export default buyToken;
197 changes: 100 additions & 97 deletions Functions/sellToken.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,39 +4,29 @@ import constants from '../Config/constants.js';
const delay = ms => new Promise(res => setTimeout(res, ms));

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

while (attempts > 0) {
try {
const sellTokenContract = new constants.ethers.Contract(
tokenContract,
constants.swapAbi,
account
);

const contract = new constants.ethers.Contract(constants.PANROUTERADDRESS, constants.abi, account);
const accountAddress = account.address;
const tokenBalance = await constants.erc20(account, tokenContract).balanceOf(
accountAddress
);
let amountOutMin = 0;
const amountIn = tokenBalance.mul(value).div(100);
const amounts = await constants.router(account).getAmountsOut(amountIn, [
tokenContract,
constants.BNBCONTRACT
]);
while (attempts > 0) {
try {
const contract = new constants.ethers.Contract(constants.PANROUTERADDRESS, constants.abi, account);
const accountAddress = account.address;
const tokenBalance = await constants.erc20(account, tokenContract).balanceOf(
accountAddress
);
let amountOutMin = 0;
const amountIn = tokenBalance.mul(value).div(100);

// increment slippage by 2% for each attempt
slippage += 2;
const sellTokenContract = new constants.ethers.Contract(
tokenContract,
constants.swapAbi,
account
);
const allowance = await sellTokenContract.allowance(account.address, constants.PANROUTERADDRESS);

if (parseInt(slippage) !== 0) {
amountOutMin = amounts[1].sub(amounts[1].mul(slippage.toString()).div(100));
} else {
amountOutMin = amounts[1];
}

const approve = await sellTokenContract.approve(constants.PANROUTERADDRESS, amountIn);
// If allowance is less than double the amount we want to sell, approve double the spending
if (allowance.lt(amountIn.mul(2))) {
const approve = await sellTokenContract.approve(constants.PANROUTERADDRESS, amountIn.mul(2));
const receipt_approve = await approve.wait();
if (
receipt_approve &&
Expand All @@ -46,79 +36,92 @@ const sellToken = async (account, tokenContract, gasLimit, gasPrice, value = 99)
const message = `INFO - Approved https://bscscan.com/tx/${receipt_approve.transactionHash} ${constants.chalk.green('✅')}`;
console.log(constants.chalk.green(message));
constants.fs.appendFileSync('./error_logs/log.txt', `${new Date().toLocaleString()} - ${message}\n`);
const swap_txn =
await contract.swapExactTokensForETHSupportingFeeOnTransferTokens(
amountIn,
amountOutMin,
[tokenContract, constants.BNBCONTRACT],
accountAddress,
Date.now() + 1000 * 60 * 10,
{
gasLimit: gasLimit,
gasPrice: gasPrice,
}
);
const receipt = await swap_txn.wait();
if (receipt && receipt.blockNumber && receipt.status === 1) {
// 0 - failed, 1 - success
const message = `INFO - Transaction https://bscscan.com/tx/${receipt.transactionHash} mined, status success ${constants.chalk.green('✅')}`;
console.log(constants.chalk.green(message));
constants.fs.appendFileSync('./error_logs/log.txt', `${new Date().toLocaleString()} - ${message}\n`);
// if the sell transaction is successful, break the loop
break;
} else if (receipt && receipt.blockNumber && receipt.status === 0) {
const message = `ERROR - Transaction https://bscscan.com/tx/${receipt.transactionHash} mined, status failed ${constants.chalk.red('❌')}`;
console.log(constants.chalk.red(message));
constants.fs.appendFileSync('./error_logs/log.txt', `${new Date().toLocaleString()} - ${message}\n`);
} else {
const message = `WARNING - Transaction https://bscscan.com/tx/${receipt.transactionHash} not mined ${constants.chalk.yellow('⚠️')}`;
console.log(constants.chalk.yellow(message));
constants.fs.appendFileSync('./error_logs/log.txt', `${new Date().toLocaleString()} - ${message}\n`);
}
}
}

// decrement the value by 10 each time
value -= 10;
attempts--;
const amounts = await constants.router(account).getAmountsOut(amountIn, [
tokenContract,
constants.BNBCONTRACT
]);

// delay execution for 5 second (5000 milliseconds) between each sell attempt
await delay(5000);
} catch (error) {
let errorMessage = error.message;
const errorReasonIndex = errorMessage.indexOf("(reason=");

// Extract error reason if it exists
if (errorReasonIndex !== -1) {
errorMessage = errorMessage.substring(errorReasonIndex + 9, errorMessage.indexOf(","));
errorMessage = `Error reason: ${errorMessage}`;
}

const message = `ERROR - Error while selling token: ${errorMessage} ${constants.chalk.red('❌')}`;
console.error(constants.chalk.red(message));
constants.fs.appendFileSync('./error_logs/log.txt', `${new Date().toLocaleString()} - ${message}\n`);
attempts--;

// delay execution for 5 second (5000 milliseconds) between each sell attempt
await delay(5000);
// increment slippage by 2% for each attempt
slippage += 2;

if (parseInt(slippage) !== 0) {
amountOutMin = amounts[1].sub(amounts[1].mul(slippage.toString()).div(100));
} else {
amountOutMin = amounts[1];
}

} // closing brace for while loop
// If all attempts have been made and the token couldn't be sold, add to blacklist
if (attempts === 0) {
constants.blacklist.push(tokenContract);
constants.fs.writeFile('./Lists/blacklist.json', JSON.stringify(constants.blacklist), (err) => {
if (err) {
const message = `ERROR - Error while updating blacklist: ${err} ${constants.chalk.red('❌')}`;
console.error(constants.chalk.red(message));
constants.fs.appendFileSync('./error_logs/log.txt', `${new Date().toLocaleString()} - ${message}\n`);
} else {
const message = `INFO - Token ${tokenContract} added to blacklist after unsuccessful sell attempts ${constants.chalk.green('✅')}`;
console.log(constants.chalk.green(message));
constants.fs.appendFileSync('./error_logs/log.txt', `${new Date().toLocaleString()} - ${message}\n`);

const swap_txn = await contract.swapExactTokensForETHSupportingFeeOnTransferTokens(
amountIn,
amountOutMin,
[tokenContract, constants.BNBCONTRACT],
accountAddress,
Date.now() + 1000 * 60 * 10,
{
gasLimit: gasLimit,
gasPrice: gasPrice,
}
});
);
const receipt = await swap_txn.wait();
if (receipt && receipt.blockNumber && receipt.status === 1) {
// 0 - failed, 1 - success
const message = `INFO - Transaction https://bscscan.com/tx/${receipt.transactionHash} mined, status success ${constants.chalk.green('✅')}`;
console.log(constants.chalk.green(message));
constants.fs.appendFileSync('./error_logs/log.txt', `${new Date().toLocaleString()} - ${message}\n`);
// if the sell transaction is successful, break the loop
break;
} else if (receipt && receipt.blockNumber && receipt.status === 0) {
const message = `ERROR - Transaction https://bscscan.com/tx/${receipt.transactionHash} mined, status failed ${constants.chalk.red('❌')}`;
console.log(constants.chalk.red(message));
constants.fs.appendFileSync('./error_logs/log.txt', `${new Date().toLocaleString()} - ${message}\n`);
} else {
const message = `WARNING - Transaction https://bscscan.com/tx/${receipt.transactionHash} not mined ${constants.chalk.yellow('⚠️')}`;
console.log(constants.chalk.yellow(message));
constants.fs.appendFileSync('./error_logs/log.txt', `${new Date().toLocaleString()} - ${message}\n`);
}
// decrement the value by 10 each time
value -= 10;
attempts--;

// delay execution for 5 second (5000 milliseconds) between each sell attempt
await delay(5000);
} catch (error) {
let errorMessage = error.message;
const errorReasonIndex = errorMessage.indexOf("(reason=");

// Extract error reason if it exists
if (errorReasonIndex !== -1) {
errorMessage = errorMessage.substring(errorReasonIndex + 9, errorMessage.indexOf(","));
errorMessage = `Error reason: ${errorMessage}`;
}

const message = `ERROR - Error while selling token: ${errorMessage} ${constants.chalk.red('❌')}`;
console.error(constants.chalk.red(message));
constants.fs.appendFileSync('./error_logs/log.txt', `${new Date().toLocaleString()} - ${message}\n`);
attempts--;

// delay execution for 1 second (1000 milliseconds) between each sell attempt
await delay(1000);
}

} // closing brace for while loop
// If all attempts have been made and the token couldn't be sold, add to blacklist
if (attempts === 0) {
constants.blacklist.push(tokenContract);
constants.fs.writeFile('./Lists/blacklist.json', JSON.stringify(constants.blacklist), (err) => {
if (err) {
const message = `ERROR - Error while updating blacklist: ${err} ${constants.chalk.red('❌')}`;
console.error(constants.chalk.red(message));
constants.fs.appendFileSync('./error_logs/log.txt', `${new Date().toLocaleString()} - ${message}\n`);
} else {
const message = `INFO - Token ${tokenContract} added to blacklist after unsuccessful sell attempts ${constants.chalk.green('✅')}`;
console.log(constants.chalk.green(message));
constants.fs.appendFileSync('./error_logs/log.txt', `${new Date().toLocaleString()} - ${message}\n`);
}
});
}
}

export default sellToken;

2 changes: 1 addition & 1 deletion Lists/blacklist.json
Original file line number Diff line number Diff line change
@@ -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"]
["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"]
Loading