🚀了解如何在 Super Apps 中自动启动/停止 Superfluid 流。
web3 最不寻常的事情之一是我们仍处于早期阶段,正如我们所说,web3 生态系统正在随着新协议、工具等的发展而发展,无论我们的专业水平如何,我们都可以为帮助他人做出贡献正如我们正在学习的那样。该博客旨在帮助开发人员将 Gelato 网络与智能合约一起使用,特别是用于将 Gelato 自动化与 Superfluid Super Apps 结合使用。
Superfluid 协议以及其他功能允许用户通过一笔交易和最少的资本锁定将资金/代币流式传输给用户/合约。需要注意的是,您必须记住停止流,否则流将无休止地继续。请访问 Superfluid 网站了解更多信息https://www.superfluid.finance/home
Gelato Network允许您在未来的某个时间点执行任务(因为 ex-web2 类似于一种调度程序)。主要用例是重复任务。对于 Superfluid 流,我们只需要一次执行(开始或停止),因此我们必须部署任务,同时“取消任务”。请访问 Gelato 网站了解更多信息https://www.gelato.network/
该项目展示了使用冰淇淋自动化智能合约的通用示例以及超流体流的应用程序,展示了一个非常简单的 3+3 步骤指南来创建可编程现金流
为此,我们在https://gelato-superapp.web.app部署了一个展示 dapp。我们将与两个在孟买合约上验证和部署的主要合约进行交互:
代码可以在这个存储库中找到
在这里,您将找到 3 + 3 个最简单的步骤来添加冰淇淋基础设施并非常轻松地自动化您的智能合约任务:
Wire Gelato 基础设施
冰淇淋融资策略
Gelato 业务逻辑
3.1) 任务创建
3.2) 检查条件
3.3) 可执行函数
为了与 Gelato 网络进行交互,我们需要与 Gelato 合约进行交互(地址可以在这里找到)。我们将与三个合约交互:
Ops 合约:创建、取消、获取交易费用、转账费用等的主要合约。我们将继承合约OpsReady.sol
,我们将在构造函数中传递 gelato ops 和 gelato 资金地址,我们很高兴!
import {OpsReady} from "./gelato/OpsReady.sol"; import {IOps} from "./gelato/IOps.sol"; import {ITaskTreasury} from "./gelato/ITaskTreasury.sol"; contract PartyApp is OpsReady, Ownable { constructor(address payable _ops, address payable _treasury) OpsReady(_ops, payable(_treasury)){ }
Gelato Treasury Contract :根据我们的融资策略,我们将需要与 Gelato 资金合约进行交互以进行资金/提款(参见步骤 2)
Gelato Network :我们将在测试中与此合约进行交互……更多关于 Bonus Track #2
OpsReady.sol 合约以及接口可以在存储库中的gelato 文件中找到。你可以复制它们,它就可以工作!
Gelato 在未来的某个时间点执行交易,因此我们需要选择一种为 Gelato 将代表我们执行的交易提供资金的方式。有两种选择:
1)为Gelato金库合约注资:只要您在金库合约中有正余额,未来的交易就会被执行。如果我们选择这种替代方案,我们需要与为其提供资金的 Gelato 国库合约进行交互。
function fundGelato(uint256 amount) public payable { require(msg.value == amount, "NO_FUNDING"); ITaskTreasury(treasury).depositFunds{value: amount}(address(this),ETH,amount); } function withdrawGelato() public onlyOwner { uint256 maxAmount = ITaskTreasury(treasury).userTokenBalance(address(this),ETH); ITaskTreasury(treasury).withdrawFunds(payable(msg.sender), ETH, maxAmount); }
2) 为每笔交易提供资金:我们的智能合约将在未来的每笔交易中转移要求支付费用的金额。在这种情况下,我们不需要与 Gelato Treasury Contract 交互,但我们必须在合约中保持正平衡。
我们必须在业务逻辑中定义三个主要部分/步骤:
3.1) 创建任务:我们必须定义一个任务来告诉 Gelato 我们想要执行什么。
function createTask() public { require(taskIdByUser[msg.sender] == bytes32(0), "TASK_STILL_ACTIVE"); bytes32 taskId = IOps(ops).createTask( address(this), /// Contract executing the task this.startParty.selector, /// Executable function's selector address(this), /// Resolver contract, in our case will be the same abi.encodeWithSelector(this.checkerStartParty.selector) /// Checker Condition ); taskIdByUser[msg.sender] = taskId; }
3.2) Checker Condition:为了执行未来的交易,我们必须向 Gelato 提供条件来检查 Gelato 是否可以执行
function checkerStartParty() external view returns (bool canExec, bytes memory execPayload) { canExec = headachePresent == false; execPayload = abi.encodeWithSelector(this.startParty.selector); }
3.3) 可执行函数:当条件和/或时间满足时将执行的函数。
function startParty() external onlyOps { require(headachePresent == false, "NOT_READY"); lastPartyStart = block.timestamp; headachePresent = true; }
https://gist.github.com/donoso-eth/0678b0613db36c6c332063c9f39cddfd
我们的第一个 Gelato 应用程序将非常简单。它检查我们的冰淇淋派对是否已经开始。如果我们没有对上一次聚会感到“头疼”,聚会总是会开始的。
当我们的“头痛”结束时,我们可以手动设置,然后 Gelato 网络将能够执行开始派对,设置新的开始派对时间戳并将我们的“头痛”设置为 true
根据我们的资金策略,我们的屏幕分为两部分。
该合约允许三个用例:
创建任务后,我们可以访问gelato ops 网站,我们将看到我们的任务正在等待执行
成功执行后,ops 仪表板将向我们显示类似这样的内容。
创建一个由资金资助的简单任务,并在第一次执行后取消(稍后我们将在 Superfluid 流中使用此模式)。
https://gist.github.com/donoso-eth/517e2dca691980de506229cbe27eee62
创建一个简单的任务来支付每笔交易(不是国库资金)
https://gist.github.com/donoso-eth/340ca96b53005dd457defab0991a735c
我们的 Gelato 超级应用程序将通过自动停止或启动流来帮助我们使超流体流可编程。
我们将像在派对应用程序中一样实施冰淇淋基础设施(第 1 步),我们选择财政部资金作为融资策略(第 2 步)
我们将在预定义的几分钟后演示停止流。我们的业务逻辑将如下所示:
https://gist.github.com/donoso-eth/e4fc0145ed75ed84309da1a467175931
现在,如果您已经为国库提供资金,已经开始了一个流,并且冰淇淋已经被执行,停止了您已经解锁奖金的流!!
到目前为止,我们已经实现了自动停止流式传输,但是按照相同的逻辑,我可能希望在上班的第一天凌晨 00:00 开始向新员工流式传输,并且我不想每天都保持清醒因为希望我们会雇佣很多员工!
.. 然后是CFA ACL (CFA 访问控制列表),只需从 SDK 或直接向合同调用 CFA 常量协议,您可能希望允许我们的超级应用程序代表您启动流式传输。经过一定的时间并执行“冰淇淋任务”。
在这个用例中,我们连接了两个任务,当第一个任务被执行时,流将被启动,任务被取消,另一个任务来停止流将被创建。
https://gist.github.com/donoso-eth/5491f5f94409f9648fa196c3ed24ca3d
区块链开发中令人愉快的体验之一是能够一键创建......
随着我们的 dapps 变得越来越复杂,我们将需要与现有的链上合约进行交互,如果我们想保持本地化,我们将不得不模拟/部署协议。在某些情况下,这可能很麻烦,我们会花费宝贵的开发时间。克服这个问题的最佳选择是使用分叉,在我们的hardhat.config.ts
中进行非常简单的配置(感谢Sam Flamini和Hilmar X指出正确的方向)。
https://gist.github.com/donoso-eth/1dbfc57d3d40679e324048e1d7c01ab4
然后使用npx hardhat node --network "hardhat"
,我们将能够创建目标区块链的“虚拟”副本。我们从现在开始创建的块将存储在本地,对于较旧的块,我们将使用我们的 RPC 提供程序查询“真实”区块链(上面我们使用的是炼金术)
在我们的示例中,我们正在与孟买合作,Superfluid 合约(Host、ConstanFlowAgreent、Supertoken ......)以及 Gelato 合约(网络、OPS 和财政部)以它们在分叉区块号处的状态存在允许我们与他们互动,就像我们与“真实”区块链互动一样。
现在,您拥有本地“mumbai”以及其他帮助方法来真正掌握链:
https://gist.github.com/donoso-eth/148d031bbc57e6a3b6708367a52b0069
在我们的 Dapp 中,我们使用 Gelato 合约。 “执行者”将负责自动执行我们的任务,但在我们本地的“虚拟”链中没有执行者……谁来执行我们的任务?答案很简单,我们将自己执行任务。我们可以做到这一点,因为我们掌握了本地区块链,我们可以成为我们想成为的任何人,我们可以选择成为执行者。 Hardhat 为我们提供了绝妙的方法hardhat_impersonateAcount
,我们将使用它成为本地的“执行者”。
在这里,我们可以看到模拟 Gelato NetWork 合约执行 Gelato 任务的实现细节
https://gist.github.com/donoso-eth/88b3e43f5957cf1e6cdbcd326067fee0
我们需要构建能够执行任务的参数,如果我们查看 Ops 界面,我们会看到我们需要以下参数
/// @notice Execution API called by Gelato /// @param _txFee Fee paid to Gelato for execution, deducted on the TaskTreasury /// @param _feeToken Token used to pay for the execution. ETH = 0xeeeeee... /// @param _taskCreator On which contract should Gelato check when to execute the tx /// @param _useTaskTreasuryFunds If msg.sender's balance on TaskTreasury should pay for the tx /// @param _revertOnFailure To revert or not if call to execAddress fails /// @param _execAddress On which contract should Gelato execute the tx /// @param _execData Data used to execute the tx, queried from the Resolver by Gelato function exec( uint256 _txFee, address _feeToken, address _taskCreator, bool _useTaskTreasuryFunds, bool _revertOnFailure, bytes32 _resolverHash, address _execAddress, bytes calldata _execData ) external;
在聚会应用程序中使用我们的示例之一,我们将拥有:
https://gist.github.com/donoso-eth/bacd13ccb9718d70f618eca6c82587f7
我们的 dapp 测试中的实现可以在代码中看到。我们在合约测试中使用这种技术。
正如我们所见,将冰淇淋网络连接到我们的智能合约并释放自动化的全部潜力相对简单。专门针对 Superfluid 流,gelato 可以让 Super Apps 进行流调度。
希望这篇文章可以帮助其他开发者快速上手和运行 gelato 并将其应用到 Superfluid 流中。
您可以在 Twitter @donoso_eth上与我联系
也在这里发布。