自己部署DEX+liquidity+yield aggregator收益聚合器
这篇文章尚需完善,仅作记录使用
以pancakeswap+pancakebunny为例
文章目录
前言
在参考这篇文章学会部署uniswap后,为了后续进行科研,还要在想办法部署自己的收益聚合器
一、pancakeswap核心交易功能部署
这篇文章已经讲的非常清楚了
唯独可以需要注意的一点就是,pair合约不一定需要去进行字节码哈希拿init_code_pair_hash,也可以在部署后的facotry合约里面的INIT_CODE_PAIR_HASH看到
部署factory后可以查看
二、pancakeswap的liquidity功能部署
部署pancakeFarm:
1、部署cake与syrup
合约:caketoken部署,syruptoken部署
前端:修改项目内token地址:src/config/constants/tokens.ts(包括cake,syrup,wbb(注意wbb最好用官方的测试链/主网地址),下面有测试链的)
2、部署masterchef
合约:Masterchef合约部署,注意cakeperblock别太大,添加liquidity(如cake-b*b),然后添加一个pid到masterchef里
3、所有权设置
合约:设置caketoken和syruptoken的所有权到masterchef
4、前端修改
前端:修改masterchef项目内的地址:src/config/constants/contracts.ts
5、multicall
合约:Multicall部署(从主网查合约源代码)
前端:修改Multicall项目内的地址:src/config/constants/Multicall.ts
6、前端修改
前端:Pid的修改:src/config/constants/farm.ts,第一个一定是cake不要动,在部署masterchef的时候也已经设置好了,可以从masterchef的poolinfo函数中查看到,它的pid设置为0,后面我们从1开始设置起,如把1对应到CAKE-B*B LP,当前前提是你要在liquidity pool添加后把lp的地址拿到
前端:Pid的修改:callhelp:135,修改cakeb*b的id为1(我们在上一步已经设置为1)
前端:pid的修改:src/state/hook.ts:334
7、注意:
关于pid的修改,注意顺序和注释
Enterstaking()这个是专门用来进行单币质押的(应该)
注意不要担心是否没有wbb的,不要担心是否要先用bb换wb*b
在pancakeswap中已经有了一步1:1,将手里的bb也就是weth9,兑换为WBB,然后再兑换成第三方token
而兑换回来的话也是将第三方token兑换回b*b
也就是说我的lp是第三方token-wb*b
当然,以上选择是在第三方token-bb兑换过程中,如果你想单独的兑换成wbb也可以
三、pancakebunny收益聚合器部署
依赖架构图:
PancakeBunny部署顺序:每一个都是一个合约
1、Bunny:
可以先mint一下(1000个就行),用来添加bunny-b*b
2、Bunny-b*b:
3、ZAPBSC:
CONSTANT VARIABLES下修改cake,bunny,wb*b,busd,修改router
【initialize()】
4、PRICECALCULATOR:
【initialize()】
【创建 bunny-bb 创建cake-bb】
5、Timelock:
【Admin:我的地址;delay:86400(根据官方合约)】
查看timelock发现了一个transaction延时/定时执行机制
这样机制将tx的call数据保存在合约中,由外部大量用户的调用/使用合约功能作为触发支撑
6、StrategyheLPERV1:
这里的CAKEPOOL就是CAKE-B*B的地址
7、BUNNYPOOL:
更改28行bunny地址,更改61行startegyhelper地址
(44行presaleContract没有改,而是修改了95为:
uint soldInPresale = 10001e18;
//uint soldInPresale = IPresale(presaleContract).totalBalance().div(2).mul(3); // mint 150% of presale for making flip token
【setRewardToken:bunny-bb】
8、MINTER:
Deployer写自己,其他按照上面的地址更新
【Initialize()】
【bunnypool:setReawrdsDistribution:MINTER】
【bunny:transferOwnership->minter】
9、bunneyChef:
【Initialize()-》bunnyperblock:500000000000000000 0.5bunny,按官网上的;startblock:5585350,按官网上】
【Setminter:MINTER】
【MINTER:setBunnyChef:bunneyChef】
10、VaultController
修改bunny地址
11、Vaultfliptoflip:
找到想要收益聚合的pid-》initialize(),如cake-b*b是1
【SetbunnyChef:bunneyChef】
【SetKeeper:我的地址】
【SetMinter:MINTER】
【MINTER:setMinter:Vaultfliptoflip】
【BunnyPool:setstakepermission:MINTER,true 以及 Vaultfliptoflip,true】
四、pancakeBunny使用指导
怎么使用?
1、首先要进行授权,即cake-b*b给vaultfliptoflip的授权
2、然后选择非keeper用户(即非管理员用户(建议),避免混乱)添加liquidity,获得lp,然后deposit函数调用
3、此时调用vaultfliptoflip会发现earned为0,其关键原因在于,valutfliptoflip合约想要给你发奖励,必须要知道收集来的lp确实获得了cake
4、如何让它知道获得cake?让管理员用户,即keeper调用harvest函数(实际上查看官网合约也会发现有一个固定账户会不断的调用harvest函数,当然这个过程实际上可以通过外部调用自动化的来执行,这里是手动的)
5、调用harvest函数过后,flip合约就知道了这些LP确实获得了受益了,此时earned函数就会正确的计算出来收益,普通用户就可以调用getreward函数进行收益了