0%

Project-cake-syrup-pools-lover-PancakeSwap糖浆池TgBot-开发记录

引言:

需求:

  1. 持仓cake成本较高,现在不想割掉,利用糖浆池白嫖,加快回本周期。
    原来的Stake Cake Earn Cake糖浆池更新后,增加了锁仓期,不太喜欢。
    PancakeSwap周期性会上新币,糖浆池挖矿会有bonus期,头几天可以有不错的收益。

  2. 后期计划开发个Bot,在链下自动化将cake投入apr最高的糖浆池中,定期执行挖提卖策略.

  3. 后期计划开发理财机枪池dapp,此部分可作为链下策略逻辑,feed给SmartContract。

  4. practice go language

先手工测测收益如何?

简单实测收益:

1
2
2022/08/05 07:56:08 stake 100Cake 372.59$
2022/08/07 09:57:00 新糖浆池挖提卖 4.57$

1000cake的话,头2天可以白嫖45.7u,大约11个cake,几顿猪脚饭钱

收益会比Stake Cake Earn Cake糖浆池强,还不用锁仓

Bot功能简介:

命令菜单:

20220826162537

1
2
3
4
5
6
/syrup_pools_pie # 糖浆池日收益的饼状图 Syrup Pool Daily Pie Chart
/syrup_pools_table # 糖浆池完整信息的表格图 Syrup Pool Infos Table Chart
/syrup_pools_full # 查询最新糖浆池信息(每10分钟更新一次) Query SyrupPool infos(updated per10mins)
/subscribe_syrup_pool # 订阅糖浆池新池提醒 Subscribe to New Syrup Pool Alerts
/subscribe_result # 查询是否订阅成功 Check Subscription Status
/subscribe_nums # 查询订阅人数 Check Subscription nums

订阅新糖浆池通知:

20220826162704
订阅后,如果上了PancakeSwap上了新的糖浆池,会推送消息给你的Tg.
新池越早冲,收益越高.

查询糖浆池日收益的饼状图:

20220826162807

查询糖浆池完整信息的表格图:

20220826163247

查询最新糖浆池信息:

20220826163351
其中我认为比较实用的信息是,计算出 每100cake 每日/周/月/年对应的usd收益
类似该工具网站bsctools:
20220821164116

程序流程:

  1. 获取pancake github上的糖浆池配置列表

  2. 解析糖浆池配置列表,获取SyrupPool数组

  3. 生成此次糖浆池配置信息的MD5哈希值

  4. 比较与上次的md5,判断有无新池

  5. 填充糖浆池detail信息,如计算出每日/周/月/年对应的usd收益

  6. 更新数据库里的糖浆池信息

  7. 生成糖浆池日收益的饼状图和完整信息的表格图

  8. 如果出现新池,推送给订阅的tg用户

下面记录一下,一些模块的实现方法和实际开发过程中遇到的一些问题

功能的具体实现:

获取糖浆池列表信息:

1
2
3
4
# 获取到的是GitHub返回的html页面
https://github.com/pancakeswap/pancake-frontend/blob/develop/src/config/constants/pools.tsx
# 源文件,要用这个url
https://raw.githubusercontent.com/pancakeswap/pancake-frontend/develop/src/config/constants/pools.tsx

需要获取的数据:
20220817095033

1
2
3
4
5
6
7
8
9
10
11
12
{
sousId: 291, // 应该是糖浆池id
stakingToken: serializedTokens.cake, // 这个是统一的,质押用的token都用的是cake
earningToken: serializedTokens.pstake, // 挖出的XToken项目方代币
contractAddress: {
56: '0x56D6955Ba6404647191DD7A5D65A5c9Fe43905e1', // bsc上的合约地址
97: '',
},
poolCategory: PoolCategory.CORE,
tokenPerBlock: '1.1574', // 每区块奖励的XToken数量
version: 3,
},

思路1:
使用goja里的JavaScript 虚拟机直接解析js/ts文件,直接获取到需要的变量值.
但可能是不支持tsx文件的解析,使用goja库解析时会报错.
example: 在 Go 中运行 JS 代码

思路2:
将原数据填充成标准的json格式,然后json-> go struct

思路3:
任何文本处理都可以使用正则匹配来解决,最后还是采取这种古老的方法.

20220817093337

监测pools.tsx变更:

思路1:
订阅commit事件,第一时间可以知道上新的糖浆池了20220817095512
思路2:
定时获取,md5比较

查询Token价格:

思路1:通过pancake的api获取到价格
优缺点:

  • 优点: 方便

  • 缺点: 中心化api可能会挂,虽然几率较小,这不好说

1
2
3
https://api.pancakeswap.info/api/v2/tokens/0x734548a9e43d2D564600b1B2ed5bE9C2b911c6aB
Or
https://bsctools.xyz/pancakeswap/api/price.php

20220821165255
思路2:自己通过查询合约计算出来
参考Retrive the price of any bsc token from it’s address without using external service like poocoin/dextools,计算方法如下:

  1. 计算BNB价格usd,调用PancakeSwapRouter合约的getAmountsOut方法,看一个BNB可以获得多少USDT

  2. 同理,继续调用getAmountsOut方法,看一个shitToken可以获得多少BNB

  3. 已知BNB的美元价格,shitTokenBNB的比例关系,就可以计算出shitToken的美元价格了

优缺点:

  • 优点: 可作为备用方法、更通用一些,可迁移到如以太坊的uniswap上

  • 缺点: 步骤较麻烦一些

以上两种方法,我都实现了,实际暂用的是第一种方法

计算ROI投资回报率:

每日/周/月/年对应的usd收益计算思路:

  1. 一天下来BSC约出多少个区块?
    一天246060=86400秒, 除以3 等于 28800 块,一天可以出28800块

  2. 糖浆池一天产出的奖励代币值多少u?
    每区块奖励代币数量 X 代币价格 X 一天区块数
    例子:rewardPerBlock每区块奖励 4.34(Ether),每区块共可以挖出4.34个PEEL
    PEEL单价是0.1582美元,每区块可以产出0.686588美元
    一天可以产出多少U? 一天区块数*每区块的u产出=19773.7344美元

  3. 你质押的cake占池子总cake的比例是多少?
    总cake:9485879 ,你质押的100个cake
    比例: 100/100+9485879 = ≈ 0.00001054
    比例 * 一天产出总u = 0.20845223 U

总结一下,每日的usd收益计算公式为: 每区块奖励代币数量 X 代币价格 X 一天区块数 X 你质押占池子的比例

生成饼状图和表格图:

  • 使用go-echarts生成html文件

  • 本地启动一个简单的http服务器,能够访问生成的html文件

  • 本地启用doctron服务:html转为图片

go mod tidy安装go-echarts时,会出现安装错误

1
github.com/go-echarts/go-echarts/v2 v2.2.5-0.20211021024243-33ae1aa415d6 

运行/是用doctron时,可能会出现的问题:

1
2
3
4
5
6
# 指定config文件、
go run main.go --config "/github/doctron/conf/default.yaml"
# 简单html转成图片
http://199.255.96.224:8080/convert/html2image?u=doctron&p=lampnick&url=http://127.0.0.1:9090/table.html
# 裁剪图片
http://127.0.0.1:8080/convert/html2image?u=doctron&p=lampnick&url=http://199.255.96.224:9090/bar.html&customClip=true&clipX=0&clipY=0&clipWidth=400&clipHeight=1500&clipScale=2&format=jpeg&Quality=80

效果图:
20220826162056
20220826162107

生成GoAbi文件:

然后将interface智能合约编译为JSON ABI,并使用abigenABI创建Go包。

1
2
3
4
5
6
7
8
solc --abi erc20.sol
abigen --abi=erc20_sol_ERC20.abi --pkg=token --out=erc20.go
abigen --abi=erc20_sol_ERC20.abi --pkg=erc20 --out=erc20.go
# 基于json
# pkg 指定输出文件的包名,也就是package名称
# type 指定合约结构体名称
# out 指定输出go文件名称
abigen --abi=pancakeRouter.json --pkg=pancakeRouter --type=pancakeRouter --out=pancakeRouter.go

基于json的话,就方便一些,不用自己再solc编译,直接从区块链浏览器copy abi的json数据下来,再生成go文件。

清除TgBot的自定义键盘:

参考How to remove a button from the telebot keyboard?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 使用库PyTelegramBotAPI
import telebot
from telebot import types
from telebot.types import ReplyKeyboardRemove

TOKEN = ""
bot = telebot.TeleBot(TOKEN)

@bot.message_handler(commands=['start'])
def send_welcome(message):
bot.send_message(message.from_user.id, "Done with Keyboard", reply_markup=ReplyKeyboardRemove())

if __name__ == '__main__':
bot.polling()

DexGuruApi:

1
2
3
4
5
# api endpoint
https://api.dex.guru/v3/tokens
Request Method: POST

{"ids":["0xe5ba47fd94cb645ba4119222e34fb33f59c7cd90-bsc"],"network":"eth,optimism,bsc,polygon,fantom,arbitrum,celo,avalanche"}

postman测试后可直接调用,没有什么validate的限制

20220830112305

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
# 解析一下字段,看看哪些是我需要的
{
"total": 1,
"data": [
{
"marketType": "token",
"address": "0xe5ba47fd94cb645ba4119222e34fb33f59c7cd90", # erc20合约地址
"id": "0xe5ba47fd94cb645ba4119222e34fb33f59c7cd90-bsc",
"symbols": [ # 符号
"SAFUU"
],
"underlyingAddresses": null,
"name": "SAFUU", # 代币名称
"description": "Safuu/SAFUU",
"txns24h": 1435, # 买卖交易数量
"txns24hChange": -0.02711864406779661, # 买卖交易数量日变化量
"verified": true, # 应该是合约已在浏览器上开源
"decimals": 5, # 小数位
"volume24h": 0,
"volume24hUSD": 492295.9654380776, # 24小时交易额 usd
"volume24hETH": 1757.114873768033,
"liquidityUSD": 4879945.6020368, # 流动性总值usd
"liquidityETH": 17075.770014168,
"priceUSD": 4.708795540046774, # 价格usd
"priceETH": 0.016476886474312287,
"priceUSDChange24h": -0.04544822975053079, # 24小时/日价格变化百分比,实际使用保留2位小数即可
"priceETHChange24h": -0.06579597999452005,
"timestamp": 1646175168,
"blockNumber": 0,
"AMM": "uniswap",
"network": "bsc",
"tokenListsNames": [
"CoinGecko"
],
"marketCap": 92327128.84538096, # 市值
"marketCapChange24h": -3.4174444324253552,
"liquidityUSDChange24h": -0.001405521715464049,
"liquidityETHChange24h": -0.022692110533886735,
"volumeUSDChange24h": -0.4209862961472752, # 日交易额变化量
"volumeETHChange24h": -0.42125377954269494,
"logoURI": [
"https://assets.dex.guru/icons/0xe5ba47fd94cb645ba4119222e34fb33f59c7cd90-bsc.jpg"
] # logo资源文件
}
]
}

暂未解决的Bug:

提示新池子出现了Bug:
新池子的配置文件pools.tsx下午就更新了,但新糖浆池实际上开始的时间在晚上,
然后TgBot下午就触发了新池提醒,但实际上池子还没有正式上线,在pancake swap的前端页面也没有显示出来。

20220826164612
也会导致日收益饼状图计算比例失真:
20220826164921

糖浆池正式开始的标志:开始区块转换为utc+8时间 or 总质押cake数量不为0

好奇?会有机器人在区块刚开始的后几个区块就质押进去吗?gas消耗情况?

Inspire:

  1. 监测新糖浆池信息,质押u借出cake,冲新池白嫖bonus奖励,挖提卖成u,bonus期结束,归还cake

  2. Base Binance交易所的稳定币APR 10%,尝试自己能否开发出接近的理财工具/策略(低风险,较好的收益)

  3. 数据可视化值得多尝试

Refs: