🚀 Super Apps で Superfluid ストリームの開始/停止を自動化する方法を学びます。
web3 の最も驚くべき点の 1 つは、私たちがまだ初期段階にあることです。私たちが話しているように、web3 エコシステムは新しいプロトコルやツールなどで成長しており、私たちの専門知識のレベルに関係なく、他の人を助けることに貢献できます。私たちが学んでいるように。このブログは、開発者がスマート コントラクトで Gelato ネットワークを使用できるようにすること、特に Superfluid Super Apps で Gelato 自動化を使用できるようにすることを目的としています。
Superfluid Protocolは、他の機能の中でもとりわけ、ユーザーが 1 回のトランザクションと最小限の資本ロックアップで、お金/トークンをユーザー/契約にストリーミングできるようにします。警告は、ストリームを停止することを忘れないでください。そうしないと、ストリームが際限なく続きます。詳細については、Superfluid の Web サイトをご覧ください https://www.superfluid.finance/home
Gelato Networkを使用すると、将来の時点でタスクを実行できます (ex-web2 は一種のスケジューラに似ています)。主な使用例は、繰り返されるタスクです。 Superfluid ストリームの場合、1 回の実行 (開始または停止) のみが必要になるため、タスクをデプロイすると同時に「タスクをキャンセル」する必要があります。詳細については、ジェラートのウェブサイトをご覧ください https://www.gelato.network/
このプロジェクトでは、gelato を使用したスマート コントラクトの自動化の一般的な例と、プログラム可能なキャッシュ フローを作成するための非常にシンプルな 3 + 3 ステップ ガイドを提示する超流動ストリームのアプリケーションを紹介します。
そのために、 https: //gelato-superapp.web.app でショーケース dapp をデプロイしました。ムンバイ契約で検証および展開された2つの主要な契約とやり取りします。
コードはこのリポジトリにあります
ここでは、gelato インフラストラクチャを追加し、スマート コントラクト タスクを非常に簡単に自動化するための 3 + 3 の最も簡単な手順を紹介します。
Wire Gelato インフラストラクチャ
ジェラートの資金調達戦略
Gelato ビジネスロジック
3.1) タスクの作成
3.2) チェッカー条件
3.3) 実行可能な機能
Gelato ネットワークと対話するには、Gelato コントラクトと対話する必要があります (アドレスはここにあります)。 3 つのコントラクトを操作します。
Ops コントラクト:作成、キャンセル、取引手数料、送金手数料などを取得するためのメイン コントラクトです。コントラクトOpsReady.sol
を継承し、コンストラクターに gelato ops と gelato treasury アドレスを渡します。
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 財務コントラクト: 資金調達戦略に応じて、資金/引き出しのためにジェラート財務コントラクトとやり取りする必要があります (ステップ 2 を参照)。
Gelato Network : テストでこのコントラクトと対話します…ボーナス トラック #2 の詳細
OpsReady.sol コントラクトとインターフェイスは、リポジトリ内のgelato ファイルにあります。それらをコピーするだけで機能します。
Gelato は将来の時点でトランザクションを実行するため、Gelato が私たちに代わって実行しようとしているトランザクションに資金を提供する方法を選択する必要があります。それには 2 つの方法があります。
1) Gelato Treasury コントラクトに資金を提供します。Treasury コントラクトにプラスの残高がある限り、将来の取引は実行されます。この代替案を選択した場合、それを資金提供する Gelato Treasury Contract と対話する必要があります。
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 コントラクトを操作する必要はありませんが、コントラクトでプラスの残高を維持する必要があります。
ビジネス ロジック内で定義する必要がある 3 つの主要な部分/ステップがあります。
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) チェッカー条件:将来のトランザクションを実行するために、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」に設定されます。
私たちの画面は、資金調達戦略に応じて 2 つの部分に分かれています。
このコントラクトでは、次の 3 つのユース ケースが可能です。
タスクが作成されたら、 gelato ops Web サイトにアクセスすると、タスクが実行を待っていることがわかります。
実行が成功すると、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
財務省に資金を提供し、ストリームを開始し、ジェラートがすでに実行されてストリームを停止している場合は、ボーナスのロックを解除しています!!
これまでのところ、ストリームを自動的に停止することができましたが、同じロジックに従って、仕事の初日の午前 0 時ちょうどに新しい従業員へのストリーミングを開始したい場合があり、毎日起きている必要はありません。うまくいけば、私たちは多くの従業員を雇うつもりです!
.. 次に、 CFA ACL (CFA アクセス コントロール リスト) を使用して救助します。SDK から、またはコントラクトに直接、CFA 定数契約を呼び出すだけで、スーパー アプリがあなたに代わってストリームを開始できるようにすることができます。一定時間が経過すると「ジェラートタスク」が実行されます。
この使用例では、2 つのタスクを連結しています。最初のタスクが実行されると、ストリームが開始され、タスクがキャンセルされ、ストリームを停止する別のタスクが作成されます。
https://gist.github.com/donoso-eth/5491f5f94409f9648fa196c3ed24ca3d
ブロックチェーン開発における快適な体験の 1 つは、ワンクリックで…..を作成できることです。
私たちの dapps が複雑になるにつれて、既存のオンチェーン コントラクトと対話する必要があり、ローカルにとどまりたい場合は、プロトコルをモック/デプロイする必要があります。場合によっては面倒で、貴重な開発時間を費やすことになります。この問題を克服するための最良の代替手段は、 hardhat.config.ts
内の非常に単純な構成でフォークを使用することです (正しい方向を指摘してくれたSam Flamini とHilmar Xに感謝します)。
https://gist.github.com/donoso-eth/1dbfc57d3d40679e324048e1d7c01ab4
次に、 npx hardhat node --network "hardhat"
を使用して、ターゲットとするブロックチェーンの「仮想」コピーを作成できます。これから作成するブロックはローカルに保存され、古いブロックについては、RPC プロバイダーを使用して「実際の」ブロックチェーンにクエリを実行します (上記では錬金術を使用しています)。
この例では、ムンバイで作業しており、Superfluid コントラクト (Host、ConstanFlowAgreeent、Supertoken など) と Gelato コントラクト (Network、OPS、および Treasury) が、フォークのブロック番号での状態で存在します。 「本物の」ブロックチェーンと対話するように、それらと対話することができます。
これで、チェーンを真にマスターするための追加のヘルパー メソッドを使用して、ローカルの「ムンバイ」ができました。
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;
パーティー アプリの例の 1 つを使用すると、次のようになります。
https://gist.github.com/donoso-eth/bacd13ccb9718d70f618eca6c82587f7
dapp テストの実装は、 コードで確認できます。この手法は、契約テストで使用されます。
これまで見てきたように、ジェラート ネットワークをスマート コントラクトに接続して自動化の可能性を最大限に引き出すのは比較的簡単です。特に Superfluid ストリームの場合、gelato は Super Apps がストリーム スケジューリングを実行できるようにします。
この記事が、他の開発者がジェラートをすばやく起動して実行し、スーパーフルイド ストリームに適用するのに役立つことを願っています。
Twitter @donoso_ethで私とつながることができます
ここにも掲載されています。