Technology

ChatGPTを使ってイーサリアムのガス代変動を通知するスクリプトを書いてみた

応援したいNFTプロジェクトのローンチ当日にガス代が大きく変動すると、mintするタイミングを計りたくなりますよね。

記事を書いた2023/5/1は直近30~40gweiで落ち着きがちなガス代が急に暴騰しました。ガス代が少しでも落ち着いたタイミングでmintしたくて、ガス代が下がったら通知を送るプログラムを作ることにしました。ChatGPTでベースを作って、GoogleのApps Scriptで動かしたので、その手順を紹介します。

下の画像は実際のメール通知ですが、このプログラムで40gweiを下回ったときにメールが飛んできて、ガス代を抑えてmintすることが出来ました。
(後からチャート見ると40gweiでmintできたのは運が良かったですね。)

Notification Mail Sample

超具体的な手順を画像盛りだくさんでまとめました。すべて無料で使えるので、興味のある方は実際に手を動かしてみると、ChatGPTGoogle Apps Scriptの勉強になると思います。(既に使い方がわかっている人にとっては、初歩的すぎる内容かもしれませんが…)

プログラムの動作環境と関連サイト

今回のプログラムは上記構成で実現しています。誰もがアカウントを持ってるGoogleの

Google スプレットシート (Excelのような表計算ソフト機能)
Google Apps Script(Googleサーバー上でプログラムを走らせる環境)

でプログラムを動かしています。プログラムでは

Etherscan API
ChatGPT(言わずと知れた、チャットAIです)

を使ってます。

すけてっく

本業プログラマーじゃないので、真似される方は自己責任でお願いします。

Etherscanのユーザ登録とEtherscan APIの使い方

今回イーサリアムのガス代はEtherscanのEtherscan APIを使って取得しました。Etherscanはウォレットやトランザクションといった、ブロックチェーン情報を確認するために使われる方が多いと思います。

下はEtherscanトップページの内容ですが、ガスの価格情報も取得することが出来ます。MED GAS PRICE欄がそうですが、87gweiとかなり高騰していますね。

Gas Price on Etherscan

この情報をEtherscanが用意しているAPIを使うと、プログラム上で簡単に取得することが出来ます。Etherscan APIを利用するにはEtherscanのWebサイトで会員登録が必要です。

会員登録し、ログインするとAPI Keyを3つまで無料で作成することが出来ます。
画面下部のAPI Key Usageから作成・追加できます。

Etherscan Account Overview

API Keysの画面は、次の様になっています。今回はApp Name(名前)を「GAS」としてAPI Keyを作成しました。

Etherscan API Keys

API KeyToken欄に表示された文字列をプログラム上でアクセスキーとして用います。(Etherscanから情報取得に使うパスワードのようなものです)

無料プランでは5回/秒の呼び出しまで対応しているので、1分に1回ガス価格を取得するような使い方では全然問題ありません。

通知を実現するスクリプト作成

さっそくプログラム作成です。

本業プログラマーの方ならサラッと書いてしまうのでしょうが、私にそこまでのプログラミング能力はないのでChatGPTを頼ってみました。ユーザ登録すると無料で利用できます。少し会話すると良い感じのコードが生成されます。

下の画像は実際にChatGPTを利用した時のやり取りです。

Chat GPT
Chat GPT

本当に素晴らしいですね。

私自身、ChatGPTの利用は不慣れなので、もっと良い質問があるのかもしれませんが、このようなコードが生成されました。

function sendNotificationIfGasPriceDrops() {
var apiKey = "YourApiKeyToken"; // APIキーをここに入力してください
var apiUrl = "https://api.etherscan.io/api?module=gastracker&action=gasoracle&apikey=" + apiKey;

// 通知する価格の閾値を取得します。
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var notificationThreshold = sheet.getRange("A1").getValue(); // 通知する価格の閾値をA1セルに入力します。

// 最新の価格情報を取得します。
var response = UrlFetchApp.fetch(apiUrl);
var json = response.getContentText();
var data = JSON.parse(json).result;
var safeGasPrice = data.SafeGasPrice;

// 通知を送信します。
if (safeGasPrice < notificationThreshold) {
var recipient = "your-email@example.com"; // 通知を受け取るアドレスをここに入力してください。
var subject = "Gas price has dropped below the notification threshold";
var message = "The current safe gas price is " + safeGasPrice + ". This is below the notification threshold of " + notificationThreshold + ".";
GmailApp.sendEmail(recipient, subject, message);
}
}

既にだいぶ良い感じに仕上がっていますが、通知のon/off(B1セル)や、閾値を下回ったときだけでなく、上回ったときの通知に切り替えできるように(F1セル)微修正しました。また、関数名もmyFunction()に変更しています。
(コードを利用する時は、apiKeyとメールアドレスを自分のものに書き換えてください。)

function myFunction() {
var apiKey = "YourApiKeyToken"; // APIキーをここに入力してください
var apiUrl = "https://api.etherscan.io/api?module=gastracker&action=gasoracle&apikey=" + apiKey;

var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var lastRow = sheet.getLastRow();

var notificationFlag = sheet.getRange("B1").getValue(); // 通知する価格の閾値をB1セルに入力します。(on or off)
var notificationThreshold = sheet.getRange("D1").getValue(); // 通知するガス代(gwei)の閾値をD1セルに入力します。 (ex.40)
var notificationMode = sheet.getRange("F1").getValue(); // 通知するモードをF1セルに入力します。(lower or higher)

var response = UrlFetchApp.fetch(apiUrl);
var json = response.getContentText();
var data = JSON.parse(json).result;
var ProposeGasPrice = data.SafeGasPrice;

var newRow = [new Date(), data.LastBlock, data.SafeGasPrice, data.ProposeGasPrice, data.FastGasPrice];
sheet.getRange(lastRow + 1, 1, 1, newRow.length).setValues([newRow]);

// 通知を送信します。
if (((notificationFlag=='on')&&(notificationMode=='lower')&&(ProposeGasPrice < notificationThreshold))|| ((notificationFlag=='on')&&(notificationMode=='higher')&&(ProposeGasPrice > notificationThreshold))) {
var recipient = "your-email@example.com"; // 通知を受け取るアドレスをここに入力してください。
var subject = "Gas price has moved over the notification threshold.";
var message = "The current safe gas price is " + ProposeGasPrice + ". This is below the notification threshold of " + notificationThreshold + ".";
GmailApp.sendEmail(recipient, subject, message);
}

}

Google Apps Scriptでのガス代取得

このコードをスプレットシートGoogle Apps Scriptで動かしてみます。

まずはGoogle スプレットシートで新規作成し、データを入れる受け皿を作成します。
こんな感じで、取得されるEtherscan APIで取得されるデータに合わせておきます。
(説明が前後しましたが、今回利用しているAPIはこちらのGet Gas Oracleになります。)

Google Sheets

ここまで出来たらプログラムを打ち込みたいので、画面上部の「拡張機能 > Apps Script」 のメニューに入ります。

Google Sheets

コードの入力画面になるので、ChatGPTが書いてくれたプログラムを入力します。

Google Apps Script

var apiKey = "YourApiKeyToken"; (2行目) と
var recipient = "your-email@example.com"; (24行目) は、
自分の環境に合わせて""内を書き換えてください。

コードが入力できたら、コード入力欄の上にある「実行」をクリックします。

すると作成したプログラムが、
自分のGoogleアカウントでEtherscanにアクセスしたり、メールを送ったりするので
権限を与えて良いか確認されます。問題ないので承認しました。

Approval for Google Apps

少し怖い警告画面ですが、詳細を表示してデベロッパー(自分)を信頼します。

Approval for Google Apps

何段階も聞かれますが、許可します。

Approval for Google Apps

権限を与えるとスクリプトが実行されます。
エラーがなければ、画面下側の実行ログに「実行完了」と表示されます。

Google Apps Script

スプレットシートの方に戻ってみると、無事データが取得されました。

Google Sheets

B1セルをon、D1セルの数字を大きくすると、記入した数値を下回るとメールで通知が飛ぶことも、Apps Script側の実行ボタンで都度実験できます。

ガス代取得・通知の自動実行

プログラムが手動でうまく動くようになったら、1分に1度実行されるようにスケジュールを組みます。Apps Scriptでは、自動実行の機能が付いているので今回はこちらを使います。

Apps Scriptの画面に戻り、左側に並んでいる時計アイコン「トリガー」に入ります。

Google Apps Script

トリガーの実行条件
・イベントのソースを選択「時間主導型」
・時間ベースのトリガーのタイプを選択「分ベースのタイマー」
・時間の間隔を選択(分)「1分おき」
に設定します。

Google Apps Script

これで保存すると、自動的に1分ごとにスクリプトが実行されるようになります。

Google Sheets

あとはガス代が下がって通知が来るのを待ちました。
(数字だけ眺めても面白くないので、チャートも追加しておきました。)

最後に

ほとんどコードを書かず簡単に作れながらも、実用に足るものが出来たと思います。

ガス代が一定以下であれば毎分メールが飛び続けます。一時的に動かす分には十分ですが、一度通知したらしばらくは送らないなど、もう少し気の利いたプログラムにした方がより実用的でしょうか。今回は速度優先でそのまま完成とすることにしました。

すけてっく

私にとっては無事mintできて、運用で充分カバーできました

ほぼプログラムを書かずにこのような機能が実現できるのは、技術の進歩を感じます。たまにしかプログラムを触らない私でも1時間かからず実現でき、改めてChatGPTの威力は凄いと認識させられます。Google Apps Scriptは誰でも簡単にBOTなど実装できるので、気になった方はこれを期に一度触ってみてはいかがでしょうか。