引言:
需求:
-
持仓cake成本较高,现在不想割掉,利用糖浆池白嫖,加快回本周期。
原来的Stake Cake Earn Cake
糖浆池更新后,增加了锁仓期,不太喜欢。
PancakeSwap
周期性会上新币,糖浆池挖矿会有bonus期,头几天可以有不错的收益。 -
后期计划开发个Bot,在链下自动化将cake投入apr最高的糖浆池中,定期执行挖提卖策略.
-
后期计划开发理财机枪池dapp,此部分可作为链下策略逻辑,feed给SmartContract。
-
practice go language
先手工测测收益如何?
简单实测收益:
1 | 2022/08/05 07:56:08 stake 100Cake 372.59$ |
1000cake的话,头2天可以白嫖45.7u,大约11个cake,几顿猪脚饭钱
收益会比
Stake Cake Earn Cake
糖浆池强,还不用锁仓
Bot功能简介:
-
Github源码: https://github.com/jerrychan807/cake-syrup-pools-lover
-
TgBot链接: https://t.me/J_bsc_bot
命令菜单:
1 | /syrup_pools_pie # 糖浆池日收益的饼状图 Syrup Pool Daily Pie Chart |
订阅新糖浆池通知:
订阅后,如果上了PancakeSwap
上了新的糖浆池,会推送消息给你的Tg.
新池越早冲,收益越高.
查询糖浆池日收益的饼状图:
查询糖浆池完整信息的表格图:
查询最新糖浆池信息:
其中我认为比较实用的信息是,计算出 每100cake 每日/周/月/年对应的usd收益
类似该工具网站bsctools:
程序流程:
-
获取pancake github上的糖浆池配置列表
-
解析糖浆池配置列表,获取SyrupPool数组
-
生成此次糖浆池配置信息的MD5哈希值
-
比较与上次的md5,判断有无新池
-
填充糖浆池detail信息,如计算出
每日/周/月/年对应的usd收益
等 -
更新数据库里的糖浆池信息
-
生成糖浆池日收益的饼状图和完整信息的表格图
-
如果出现新池,推送给订阅的tg用户
下面记录一下,一些模块的实现方法和实际开发过程中遇到的一些问题
功能的具体实现:
获取糖浆池列表信息:
1 | # 获取到的是GitHub返回的html页面 |
需要获取的数据:
1 | { |
思路1:
使用goja里的JavaScript 虚拟机直接解析js/ts文件,直接获取到需要的变量值.
但可能是不支持tsx
文件的解析,使用goja
库解析时会报错.
example: 在 Go 中运行 JS 代码
思路2:
将原数据填充成标准的json格式,然后json-> go struct
思路3:
任何文本处理都可以使用正则匹配来解决,最后还是采取这种古老的方法.
监测pools.tsx变更:
思路1:
订阅commit事件,第一时间可以知道上新的糖浆池了
思路2:
定时获取,md5比较
查询Token价格:
思路1:通过pancake的api获取到价格
优缺点:
-
优点: 方便
-
缺点: 中心化api可能会挂,虽然几率较小,这不好说
1 | https://api.pancakeswap.info/api/v2/tokens/0x734548a9e43d2D564600b1B2ed5bE9C2b911c6aB |
思路2:自己通过查询合约计算出来
参考Retrive the price of any bsc token from it’s address without using external service like poocoin/dextools,计算方法如下:
-
计算BNB价格usd,调用
PancakeSwap
的Router
合约的getAmountsOut
方法,看一个BNB
可以获得多少USDT
-
同理,继续调用
getAmountsOut
方法,看一个shitToken
可以获得多少BNB
-
已知BNB的美元价格,
shitToken
和BNB
的比例关系,就可以计算出shitToken
的美元价格了
优缺点:
-
优点: 可作为备用方法、更通用一些,可迁移到如以太坊的uniswap上
-
缺点: 步骤较麻烦一些
以上两种方法,我都实现了,实际暂用的是第一种方法
计算ROI投资回报率:
每日/周/月/年对应的usd收益
计算思路:
-
一天下来BSC约出多少个区块?
一天246060=86400秒, 除以3 等于 28800 块,一天可以出28800块 -
糖浆池一天产出的奖励代币值多少u?
每区块奖励代币数量 X 代币价格 X 一天区块数
例子:rewardPerBlock每区块奖励 4.34(Ether),每区块共可以挖出4.34个PEEL
PEEL单价是0.1582美元,每区块可以产出0.686588美元
一天可以产出多少U? 一天区块数*每区块的u产出=19773.7344美元 -
你质押的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 | # 指定config文件、 |
效果图:
生成GoAbi文件:
然后将interface
智能合约编译为JSON ABI
,并使用abigen
从ABI
创建Go包。
1 | solc --abi erc20.sol |
基于json的话,就方便一些,不用自己再solc
编译,直接从区块链浏览器copy abi的json数据下来,再生成go文件。
清除TgBot的自定义键盘:
参考How to remove a button from the telebot keyboard?
1 | # 使用库PyTelegramBotAPI |
DexGuruApi:
1 | # api endpoint |
postman
测试后可直接调用,没有什么validate的限制
1 | # 解析一下字段,看看哪些是我需要的 |
暂未解决的Bug:
提示新池子出现了Bug:
新池子的配置文件pools.tsx
下午就更新了,但新糖浆池实际上开始的时间在晚上,
然后TgBot下午就触发了新池提醒,但实际上池子还没有正式上线,在pancake swap
的前端页面也没有显示出来。
也会导致日收益饼状图计算比例失真:
糖浆池正式开始的标志:开始区块转换为utc+8时间 or 总质押cake数量不为0
好奇?会有机器人在区块刚开始的后几个区块就质押进去吗?gas消耗情况?
Inspire:
-
监测新糖浆池信息,质押u借出cake,冲新池白嫖bonus奖励,挖提卖成u,bonus期结束,归还cake
-
Base Binance交易所的稳定币APR 10%,尝试自己能否开发出接近的理财工具/策略(低风险,较好的收益)
-
数据可视化值得多尝试