Skip to content

Commit 9fec18f

Browse files
committed
feat: add bsc bunny platform
1 parent a2988fa commit 9fec18f

File tree

3 files changed

+137
-0
lines changed

3 files changed

+137
-0
lines changed

src/providers/BSCDeFi.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
const Web3 = require('web3')
22

33
const AutoFarmChef = require('./bsc/AutoFarmChef')
4+
const BunnyChef = require('./bsc/BunnyChef')
45
const BVaultChef = require('./bsc/BVaultChef')
56
const MidasGoldChef = require('./bsc/MidasGoldChef')
67
const PancakeSwapChef = require('./bsc/PancakeSwapChef')
@@ -26,6 +27,7 @@ class BSCDeFi extends AbstractExplorer {
2627
alpaca: new PancakeSwapCloneChef(web3, '0xA625AB01B08ce023B2a342Dbb12a16f2C8489A8F', 'pendingAlpaca', 'ALPACA'),
2728
apeSwap: new PancakeSwapCloneChef(web3, '0x5c8D727b265DBAfaba67E050f2f739cAeEB4A6F9', 'pendingCake', 'BANANA'),
2829
autoFarm: new AutoFarmChef(web3),
30+
bunny: new BunnyChef(web3),
2931
bVault: new BVaultChef(web3),
3032
cafeSwap: new PancakeSwapCloneChef(web3, '0xc772955c33088a97D56d0BBf473d05267bC4feBB', 'pendingCake', 'BREW'),
3133
coralFarm: new PancakeSwapCloneChef(web3, '0x713e34640ef300a0B178a9688458BbA8b1FA35A7', 'pendingCrl', 'CRL'),

src/providers/bsc/BunnyChef.js

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
const Web3 = require('web3')
2+
3+
const MasterChef = require('./MasterChef')
4+
const Token = require('./Token')
5+
const LiquidityPool = require('./LiquidityPool')
6+
7+
// PancakeSwap
8+
const bunnyVaultABI = require('../resources/abis/bunny.json')
9+
10+
class BunnyChef extends MasterChef {
11+
constructor (web3) {
12+
super(web3, bunnyVaultABI)
13+
14+
this.vaults = [
15+
// https://github.com/PancakeBunny-finance/Bunny#cake-maximizer---deposit-flip-earn-cake
16+
'0xEDfcB78e73f7bA6aD2D829bf5D462a0924da28eD',
17+
'0x3f139386406b0924eF115BAFF71D0d30CC090Bd5',
18+
'0xCBd4472cbeB7229278F841b2a81F1c0DF1AD0058',
19+
'0x41dF17D1De8D4E43d5493eb96e01100908FCcc4f',
20+
'0x92a0f75a0f07C90a7EcB65eDD549Fa6a45a4975C',
21+
'0xE07BdaAc4573a00208D148bD5b3e5d2Ae4Ebd0Cc',
22+
'0xa5B8cdd3787832AdEdFe5a04bF4A307051538FF2',
23+
'0x866FD0028eb7fc7eeD02deF330B05aB503e199d4',
24+
// https://github.com/PancakeBunny-finance/Bunny#auto-compounding-flip---deposit-flip-earn-flip
25+
'0x7eaaEaF2aB59C2c85a17BEB15B110F81b192e98a',
26+
'0x0137d886e832842a3B11c568d5992Ae73f7A792e',
27+
'0xE02BCFa3D0072AD2F52eD917a7b125e257c26032',
28+
'0x1b6e3d394f1D809769407DEA84711cF57e507B99',
29+
'0xC1aAE51746bEA1a1Ec6f17A4f75b422F8a656ee6',
30+
'0xa59EFEf41040e258191a4096DC202583765a43E7',
31+
'0xC0314BbE19D4D5b048D3A3B974f0cA1B2cEE5eF3'
32+
]
33+
}
34+
35+
async listStakedPools (walletAddress, tx) {
36+
let pools = []
37+
for (let poolID = 0; poolID < this.vaults.length; poolID++) {
38+
pools.push(this.stakedPool(poolID, walletAddress, tx))
39+
}
40+
41+
pools = await Promise.all(pools)
42+
43+
return pools.filter(pool => pool)
44+
}
45+
46+
lpTransactions (walletTx, lpAddress) {
47+
const chefTx = walletTx.filter(t => t.to.toUpperCase() === lpAddress.toUpperCase())
48+
49+
let lastWithdrawAllTime = 0
50+
51+
return chefTx.map(t => {
52+
const decoded = this.decoder.decodeData(t.input)
53+
54+
if (decoded.method === 'withdrawAll') {
55+
lastWithdrawAllTime = lastWithdrawAllTime === 0 ? parseInt(t.timeStamp) : lastWithdrawAllTime
56+
return null
57+
}
58+
59+
if (decoded.method !== 'deposit' && decoded.method !== 'withdraw') {
60+
return null
61+
}
62+
63+
let lpTokenTx = parseFloat(Web3.utils.fromWei(decoded.inputs[0].toString(10)))
64+
if (decoded.method === 'withdraw') {
65+
lpTokenTx *= -1
66+
}
67+
68+
return {
69+
type: decoded.method,
70+
hash: t.hash,
71+
amount: lpTokenTx,
72+
timestamp: t.timeStamp
73+
}
74+
}).filter(t => t !== null)
75+
.filter(t => parseInt(t.timestamp) > lastWithdrawAllTime)
76+
}
77+
78+
async stakedPool (poolID, walletAddress, tx) {
79+
const lpAddress = this.vaults[poolID]
80+
const vault = new BunnyVault(this.web3, lpAddress)
81+
await vault.init()
82+
const lpTokenAmount = await vault.balanceOf(walletAddress)
83+
84+
if (lpTokenAmount === 0) {
85+
return
86+
}
87+
88+
const tokens = await vault.stakedTokenEquivalent(lpTokenAmount)
89+
const lpTransactions = this.lpTransactions(tx, lpAddress)
90+
const totalDeposited = MasterChef.totalDeposited(lpTransactions)
91+
92+
const rewardPerYear = 0
93+
const pendingReward = 0
94+
95+
return {
96+
poolID, lpTokenAmount, totalDeposited, pendingReward, tokens, rewardPerYear, lpAddress, lpTransactions
97+
}
98+
}
99+
}
100+
101+
class BunnyVault {
102+
constructor (web3, address) {
103+
this.web3 = web3
104+
this.contract = new web3.eth.Contract(bunnyVaultABI, address)
105+
}
106+
107+
async init () {
108+
const lpAddress = await this.contract.methods.stakingToken().call()
109+
const isLP = await LiquidityPool.isLP(this.web3, lpAddress)
110+
const Pool = isLP ? LiquidityPool : Token
111+
const pool = new Pool(this.web3, lpAddress)
112+
await pool.init()
113+
this.pool = pool
114+
}
115+
116+
async profit (walletAddress) {
117+
const rewardTokenAddress = await this.contract.methods.rewardsToken().call()
118+
const rewardToken = new Token(this.web3, rewardTokenAddress)
119+
await rewardToken.init()
120+
const result = {}
121+
result[rewardToken.symbol] = parseFloat(Web3.utils.fromWei(await this.contract.methods.earned(walletAddress).call()))
122+
return result
123+
}
124+
125+
async balanceOf (walletAddress) {
126+
return parseFloat(Web3.utils.fromWei(await this.contract.methods.balanceOf(walletAddress).call()))
127+
}
128+
129+
async stakedTokenEquivalent (lpTokenAmount) {
130+
return this.pool.stakedTokenEquivalent(lpTokenAmount)
131+
}
132+
}
133+
134+
module.exports = BunnyChef
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"profit","type":"uint256"}],"name":"Harvested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"isPaused","type":"bool"}],"name":"PauseChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"profit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"performanceFee","type":"uint256"}],"name":"ProfitPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Recovered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"bool","name":"whitelist","type":"bool"}],"name":"Whitelisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"withdrawalFee","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[],"name":"balance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"depositedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"earned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"keeper","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastPauseTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolType","outputs":[{"internalType":"enum PoolConstant.PoolTypes","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"principalOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"recoverToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardsToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_keeper","type":"address"}],"name":"setKeeper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IBunnyMinter","name":"newMinter","type":"address"}],"name":"setMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_on","type":"bool"}],"name":"setWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"sharesOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawableBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

0 commit comments

Comments
 (0)