-
Notifications
You must be signed in to change notification settings - Fork 1
/
FriendTech_Bot.js
150 lines (124 loc) Β· 5.13 KB
/
FriendTech_Bot.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
const ethers = require('ethers');
const dotenv = require('dotenv');
const fs = require('fs');
dotenv.config();
const friendsTechABI = require('./ftech.json');
const PROVIDER = process.env.BASE_PROVIDER;
const KEY = process.env.PRIVATE_KEY;
const provider = new ethers.WebSocketProvider(PROVIDER);
const wallet = new ethers.Wallet(String(KEY), provider);
const ftechAddr = "0xCF205808Ed36593aa40a44F10c7f7C2F67d4A4d4";
const newABI = [
"function buyShares(address sharesSubject, uint256 amount) public payable",
"function getBuyPriceAfterFee(address _subject, uint256 _amount) view returns (uint256)",
"function getSellPriceAfterFee(address _subject, uint256 _amount) view returns (uint256)",
"function getPrice(uint256 _supply, uint256 _amount) view returns (uint256)",
"function protocolFeePercent() view returns (uint256)",
"function subjectFeePercent() view returns (uint256)",
"event Trade(address trader, address subject, bool isBuy, uint256 shareAmount, uint256 ethAmount, uint256 protocolEthAmount, uint256 subjectEthAmount, uint256 supply)"
];
const ftech = new ethers.Contract(ftechAddr, newABI, wallet);
// console.log("Abi:", friendsTechABI);
// console.log("Contract:", ftech);
async function buy_shares(address, amount, supply) {
try {
// const estimatedGas = await ftech.estimateGas.buyShares(address, amount);
let _bp = BigInt(await ftech.getPrice(supply, "1"));
let _pf = BigInt(_bp) * BigInt(await ftech.protocolFeePercent()) / BigInt(1e18);
let _sf = BigInt(_bp) * BigInt(await ftech.subjectFeePercent()) / BigInt(1e18);
let _tf = _bp + _pf + _sf;
let buy_price = await get_Price_After_Fee_Buy(address, "1");
const tx = await ftech.buyShares(address, amount, {value: _tf});
await tx.wait();
const characteristics = {
buy_price: ethers.formatEther(buy_price),
status: "bought",
supply: supply.toString(),
};
writeSubjectsToFile(address, characteristics);
return true;
} catch (error) {
console.error("Error pushing transaction:", error);
return false;
}
}
async function get_Price_After_Fee_Buy(addr, amount) {
const price = await ftech.getBuyPriceAfterFee(addr, amount);
return price;
}
async function get_Price_After_Fee_Sell(addr, amount) {
const price = await ftech.getSellPriceAfterFee(addr, amount);
return ethers.formatEther(price);
}
async function subjectExistsInFile(subject) {
try {
const data = fs.readFileSync('subjects.json', 'utf8');
const subjectsFromFile = JSON.parse(data);
const data2 = fs.readFileSync('subjects_temp.json', 'utf8');
const subjectsFromTempFile = JSON.parse(data2);
return subjectsFromFile[subject] && subjectsFromTempFile[subject] ? true : false;
} catch (error) {
return false;
}
}
function writeSubjectsToFile(subject, characteristics) {
let subjectsFromFile = {};
try {
const data = fs.readFileSync('subjects.json', 'utf8');
subjectsFromFile = JSON.parse(data);
} catch (error) {
console.error('Error reading from file:', error);
}
subjectsFromFile[subject] = characteristics;
const tmpFileName = 'subjects_temp.json';
try {
fs.writeFileSync(tmpFileName, JSON.stringify(subjectsFromFile, null, 4));
} catch (err) {
console.error('Error writing to temporary file:', err);
return;
}
try {
fs.renameSync(tmpFileName, 'subjects.json');
} catch (err) {
console.error('Error renaming the temporary file:', err);
}
}
async function main() {
console.log("Looking for events π ...");
ftech.on("Trade", async (
trader,
subject,
isBuy,
shareAmount,
ethAmount,
protocolEthAmount,
subjectEthAmount,
supply
) => {
if(!isBuy) return;
if(supply > 12) return;
if(supply < 10) return;
console.log("Trade event detected!");
console.log("Supply:", supply.toString());
if(await subjectExistsInFile(subject)) return;
let sell_price = await get_Price_After_Fee_Sell(subject, "1");
// console.log("Buy Price:", ethers.formatEther(buy_price));
// if (ethers.formatEther(buy_price) > 0.005) return;
let success = await buy_shares(subject, "1", supply);
if(!success) {
console.error("Error buying shares!");
return;
};
console.log("Success! πππππππππ");
// console.log("\n");
// console.log("NEW BUY DETECTED πππππππππ");
// console.log("---------------------------------------");
// console.log("Subject Address: ", subject);
// console.log("Share Supply: ", supply.toString());
// console.log("Buy Price: ", ethers.formatEther(buy_price));
// console.log("Sell Price: ", sell_price);
// console.log("---------------------------------------");
// console.log("\n");
});
}
main();