开发一个单币矿池,发现当质押和奖励的币种是同一个的时候,例如质押cake获得cake;计算会出现问题,无论用masterchef还是smartchef暂时还是没有计算对,请问是否有相关项目案例可以做参考学习,谢谢。
同一个币的时候才会出问题吗,能提供更详细的信息吗
提供一个猜测可能,以masterchef为例
// Update reward variables of the given pool to be up-to-date.
function updatePool(uint256 _pid) public {
PoolInfo storage pool = poolInfo[_pid];
if (block.number <= pool.lastRewardBlock) {
return;
}
uint256 lpSupply = pool.lpToken.balanceOf(address(this));
if (lpSupply == 0) {
pool.lastRewardBlock = block.number;
return;
}
uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number);
uint256 pudReward = multiplier.mul(pudPerBlock).mul(pool.allocPoint).div(totalAllocPoint);
pud.mint(devaddr, pudReward.div(10));
pud.mint(address(xPudding), pudReward);
pool.accPuddingPerShare = pool.accPuddingPerShare.add(pudReward.mul(1e12).div(lpSupply));
pool.lastRewardBlock = block.number;
}
以上是masterchef中更新奖励时的逻辑,计算奖励主要使用的是pool.accPuddingPerShare
字段,更新时用的是pool.lpToken.balanceOf(address(this))
。如果reward 和 stake的币是一个,那么用balanceOf,就会把reward的和stake的混在一起。
如果是这种情况的话,增加一个字段单独存储stake的总数量,代替用balanceOf的方式查询stake的总数量