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