自動実行を実装しよう
🐣 自動実行を実装しましょう
chainlinkの自動化には以下の2つの起動方法があります。
Time-based trigger
: あらかじめ指定した時間でコントラクトを実行します。定期実行です。Custom logic trigger
: あらかじめ用意した条件に合致した場合にコントラクトを実行します。
今回は、「有効期限が切れたfarmNft
がないかどうかの確認、 あった場合は削除処理をする」のでCustom logic trigger
を使用します。
Custom logic trigger
の実装
ここで行うことは、 Custom logic trigger
に必要な実装をAssetTokenization
コントラクトに実装します。
そしてchainlinkにCustom logic trigger
で実行してもらう旨をタスクとして登録します。
このタスクのことをUpkeep
と呼びます。
AssetTokenization.sol
の中に以下のimport文を追加し、 さらにAutomationCompatibleInterface
を継承するようにしてください。
※ 継承を記述した時点ではコードエディタによりAutomationCompatibleInterface
を実装できていない警告が出るかもしれませんが、 この時点では無視して構いません。
import "@chainlink/contracts/src/v0.8/AutomationCompatible.sol";
contract AssetTokenization is AutomationCompatibleInterface {
...
AutomationCompatibleInterface
はchainlinkが用意したインタフェースで、 これを実装することによりUpkeepはどの条件を確認し、 何を実行するのか判別することができます。
次にAssetTokenization
の最後の行に以下の関数を貼り付けてください。
// For upkeep that chainlink automation function.
// Check whether there are expired contracts.
// If checkUpkeep() returns true, chainlink automatically runs performUpkeep() that follows below.
function checkUpkeep(
bytes calldata /* optional data. don't use in this code */
)
external
view
override
returns (
bool upkeepNeeded,
bytes memory /* optional data. return initial value in this code */
)
{
for (uint256 index = 0; index < _farmers.length; index++) {
address farmer = _farmers[index];
if (!availableContract(farmer)) {
continue;
}
if (_farmerToNftContract[farmer].isExpired()) {
return (true, "");
}
}
return (false, "");
}
// For chainlink.
// Burn expired NFT and delete NFT Contract.
function performUpkeep(
bytes calldata /* optional data. don't use in this code */
) external override {
for (uint256 index = 0; index < _farmers.length; index++) {
address farmer = _farmers[index];
if (!availableContract(farmer)) {
continue;
}
if (_farmerToNftContract[farmer].isExpired()) {
_farmerToNftContract[farmer].burnNFT();
delete _farmerToNftContract[farmer];
}
}
}
checkUpkeep
とperformUpkeep
をによりAutomationCompatibleInterface
を実装することができました。
checkUpkeep
は条件に合致したかどうかの論理値を返却します。
今回は期限切れのfarmNft
があるかどうかを条件とし、 ある場合はtrue
を返却します。
performUpkeep
はcheckUpkeep
がtrue
を返却した場合に何を実行するのかを記述します。
今回は期限切れのfarmNft
に対してburnNFT
を実行し、 マッピングからdeleteします。