SEED 技术实现细节

项目的核心玩法是基于Lens协议,把前三长的跟帖转化为收益,提供给原帖作者。有创新和难度的部分是实现:

  1. 如何让跟帖付费

  2. 如何结算收益

对于1.,根据Lens的module扩展模块,可以在follow(关注)、collect(收集)、reference(跟帖)中间添加自定义功能。我们的场景可以用reference module来实现。官方core合约只提供了FollowerOnlyReferenceModule(仅关注者可跟帖)模块,收费部分只有follow和collect里有,所以得自己编写,下面是ReferenceSeedModule的部分代码:

function processComment(uint256 profileId_, uint256 profileIdPointed_, uint256 pubIdPointed_, bytes calldata data_)
        external
        override
        onlyHub
    {
        require(IERC20(currency).transferFrom(tx.origin, address(this), amount), "Seed pay failed");
    }

跟帖付费部分可以在processComment中进行转账。当然需要用户提前授权currency ERC20 token给该合约,这样实现每次评论进行付费。

对于2. 如何结算收益,经过评估在solidity中实现一个Tree结构进行每日收益结算,会消耗大量gas,所以采取的方案是进行链下计算,推送积分到合约。

计算收益并更新合约,采取的是Web3 函数的解决方案,这会比让服务端处理去处理更加透明和稳定。最终在openzeppelin autotask、tenderly web3 actions 和 gelato web3 function中选择了gelato,虽然在内测,但他们的SDK和Web面板更加好用,并且链下的js代码是透明的。点此查看

每天会查询和过滤当天所有使用了ReferenceSeedModule的CreatedComment的事件,组成一个Tree结构(或添加Node到前一天的Tree)

依次计算每个Node的前三帖子数量,得到一个收益Tree,并和前一天的收益Tree进行比对,更新增量部分的三种积分到合约的Struct{sun, water, soil}中。

最后用户随时可以把三种积分合成为currency ERC20 token 提走。

由于lens在sandbox环境的API有些问题,example无法正常使用,所以我们编写了单独的服务来存储,直接调用合约来交互,没有使用lens的SDK和API。

剩下部分就是常规的合约调用和内容显示,没有特别的地方。

最后更新于

Logo

未来人日记 FPF-DAO © 2023, All rights reserved