-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmain.js
165 lines (132 loc) · 6.18 KB
/
main.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
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
require("dotenv").config();
const version = "0.0.1";
const Web3 = require('web3');
const cron = require("node-cron");
const addresses = require("./addresses");
const abis = require('./abis');
const web3 = new Web3(process.env.FTM_PUBLIC_URL);
const esterMasterChef = new web3.eth.Contract(abis.esterStakingChef, addresses.FTM.esterStakingChef);
const ester = new web3.eth.Contract(abis.erc20Token, addresses.FTM.ester);
const spiritMasterChef = new web3.eth.Contract(abis.spiritMasterChef, addresses.FTM.spiritMAsterChef);
const spiritRouter = new web3.eth.Contract(abis.spiritRouter, addresses.FTM.spiritRouter);
const spirit = new web3.eth.Contract(abis.erc20Token, addresses.FTM.spirit);
const spiritFtmLP = new web3.eth.Contract(abis.erc20Token, addresses.FTM.spiritFtmLP);
const froyoLpStaker = new web3.eth.Contract(abis.froyoLpTokenStaker, addresses.FTM.froyoLpTokenStaker);
const sushiRouter = new web3.eth.Contract(abis.sushiRouter, addresses.FTM.sushiRouter);
const multiFeeDist = new web3.eth.Contract(abis.MultiFeeDistribution, addresses.FTM.MultiFeeDistribution);
const froyo = new web3.eth.Contract(abis.erc20Token, addresses.FTM.froyo);
const froyoFtmSushiLP = new web3.eth.Contract(abis.erc20Token, addresses.FTM.froyoFtmSushiLP);
// get admin account
const { address: admin } = web3.eth.accounts.wallet.add(process.env.FTM_ADMIN_PRIVATE_KEY);
const ESTER_PID = 2;
const SPIRIT_FTM_POOL_PID =1;
const FROYO_FTM_POOL_PID = 0;
const GAS_COST = 1020000000;
const GAS_LIMIT = 500000;
console.log("staring.....")
console.log("version ", version);
console.log('admin is ', admin);
// compound est!
const compoundEst = async() => {
var bal = await web3.eth.getBalance(admin);
console.log("initial ftm balance is ", bal/(10**18));
const transactionParams = {
from: admin,
gas: GAS_LIMIT,
gasPrice: GAS_COST
};
console.log("--- STEP 1: harvesting ---");
await esterMasterChef.methods.withdraw(ESTER_PID, 0).send(transactionParams);
harvestedPheromones = await ester.methods.balanceOf(admin).call();
console.log('--- STEP 2: restake');
await await esterMasterChef.methods.deposit(ESTER_PID, harvestedPheromones.toString()).send(transactionParams);
console.log("---done---")
}
//compound spirit-ftm LP
const compoundSpiritFtm = async() => {
var bal = await web3.eth.getBalance(admin);
console.log("initial ftm balance is ", bal/(10**18));
const transactionParams = {
from: admin,
gas: GAS_LIMIT,
gasPrice: GAS_COST
};
const deadline = Math.floor(Date.now() / 1000) + 60 * 10; // 10 min
// doing no other spirit compounding, so need to check before and after,
// just look at spirit balance, divide it in half and change to ftm
// make LP and compound!
// change it accoirding to your needs!
console.log("--- STEP 1: harvesting ---");
await spiritMasterChef.methods.deposit(SPIRIT_FTM_POOL_PID, 0).send(transactionParams);
genkiDama = await spirit.methods.balanceOf(admin).call();
halfGenkiDama = (genkiDama/2).toString();
console.log("--- STEP 2: swapping half spirit to ftm ---");
ftmBalanceBeforeSwap = await web3.eth.getBalance(admin);
path = [addresses.FTM.spirit, addresses.FTM.wftm];
await spiritRouter.methods.swapExactTokensForETH(halfGenkiDama, 0, path, admin, deadline).send(transactionParams);
ftmBalanceAfterSwap = await web3.eth.getBalance(admin);
ftmHarvested = ftmBalanceAfterSwap - ftmBalanceBeforeSwap;
console.log("--- STEP 3: adding liquidity ---");
const transactionParamsETH = {
from: admin,
gas: GAS_LIMIT,
gasPrice: GAS_COST,
value : ftmHarvested
};
await spiritRouter.methods.addLiquidityETH(addresses.FTM.spirit, halfGenkiDama, 0, 0, admin, deadline).send(transactionParamsETH);
console.log('--- STEP 4: depositing lp back in pool');
lpBalance = await spiritFtmLP.methods.balanceOf(admin).call();
await await spiritMasterChef.methods.deposit(SPIRIT_FTM_POOL_PID, lpBalance).send(transactionParams);
console.log("---done---")
}
const compoundFroyo = async() => {
var bal = await web3.eth.getBalance(admin);
console.log("initial ftm balance is ", bal/(10**18));
const transactionParams = {
from: admin,
gas: GAS_LIMIT,
gasPrice: GAS_COST
};
const deadline = Math.floor(Date.now() / 1000) + 60 * 10; // 10 min
console.log("--- STEP 1: claiming---");
const pids = [FROYO_FTM_POOL_PID];
claimableRewardBefore = await froyoLpStaker.methods.claimableReward(FROYO_FTM_POOL_PID,admin).call();
await froyoLpStaker.methods.claim(pids).send(transactionParams);
claimableRewardAfter = await froyoLpStaker.methods.claimableReward(FROYO_FTM_POOL_PID,admin).call();
claimedReward = claimableRewardBefore - claimableRewardAfter;
half = (claimedReward/2).toString();
// take the 50% hit
console.log("--- STEP 2: 50 percent hit!---");
froyoBalanceBeforeHarvest = await froyo.methods.balanceOf(admin).call();
await multiFeeDist.methods.withdraw(half).send(transactionParams);
froyoBalanceAfterHarvest = await froyo.methods.balanceOf(admin).call();
yogurtMama = froyoBalanceAfterHarvest - froyoBalanceBeforeHarvest;
halfBalance = (yogurtMama/2).toString();
console.log("--- STEP 3: swapping half froyo to ftm ---");
ftmBalanceBeforeSwap = await web3.eth.getBalance(admin);
path = [addresses.FTM.froyo, addresses.FTM.wftm];
await sushiRouter.methods.swapExactTokensForETH(halfBalance, 0, path, admin, deadline).send(transactionParams);
ftmBalanceAfterSwap = await web3.eth.getBalance(admin);
ftmHarvested = ftmBalanceAfterSwap - ftmBalanceBeforeSwap;
console.log("--- STEP 4: adding liquidity ---");
const transactionParamsETH = {
from: admin,
gas: GAS_LIMIT,
gasPrice: GAS_COST,
value : ftmHarvested
};
await sushiRouter.methods.addLiquidityETH(addresses.FTM.froyo, halfBalance, 0, 0, admin, deadline).send(transactionParamsETH);
console.log('--- STEP 5: depositing lp back in pool');
lpBalance = await froyoFtmSushiLP.methods.balanceOf(admin).call();
await await froyoLpStaker.methods.deposit(FROYO_FTM_POOL_PID, lpBalance).send(transactionParams);
console.log("---done---")
}
const compound = async () => {
await compoundEst();
await compoundSpiritFtm();
await compoundFroyo();
}
compound();
// cron.schedule("*/10 * * * *", function() {
// compound();
// });