応援したいNFTプロジェクトのローンチ当日にガス代が大きく変動すると、mintするタイミングを計りたくなりますよね。
記事を書いた2023/5/1は直近30~40gweiで落ち着きがちなガス代が急に暴騰しました。ガス代が少しでも落ち着いたタイミングでmintしたくて、ガス代が下がったら通知を送るプログラムを作ることにしました。ChatGPTでベースを作って、GoogleのApps Scriptで動かしたので、その手順を紹介します。
下の画像は実際のメール通知ですが、このプログラムで40gweiを下回ったときにメールが飛んできて、ガス代を抑えてmintすることが出来ました。
(後からチャート見ると40gweiでmintできたのは運が良かったですね。)
超具体的な手順を画像盛りだくさんでまとめました。すべて無料で使えるので、興味のある方は実際に手を動かしてみると、ChatGPTやGoogle 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とかなり高騰していますね。
この情報をEtherscanが用意しているAPIを使うと、プログラム上で簡単に取得することが出来ます。Etherscan APIを利用するにはEtherscanのWebサイトで会員登録が必要です。
会員登録し、ログインするとAPI Keyを3つまで無料で作成することが出来ます。
画面下部のAPI Key Usageから作成・追加できます。
API Keysの画面は、次の様になっています。今回はApp Name(名前)を「GAS」としてAPI Keyを作成しました。
API KeyToken欄に表示された文字列をプログラム上でアクセスキーとして用います。(Etherscanから情報取得に使うパスワードのようなものです)
無料プランでは5回/秒の呼び出しまで対応しているので、1分に1回ガス価格を取得するような使い方では全然問題ありません。
通知を実現するスクリプト作成
さっそくプログラム作成です。
本業プログラマーの方ならサラッと書いてしまうのでしょうが、私にそこまでのプログラミング能力はないのでChatGPTを頼ってみました。ユーザ登録すると無料で利用できます。少し会話すると良い感じのコードが生成されます。
下の画像は実際にChatGPTを利用した時のやり取りです。
本当に素晴らしいですね。
私自身、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になります。)
ここまで出来たらプログラムを打ち込みたいので、画面上部の「拡張機能 > Apps Script」 のメニューに入ります。
コードの入力画面になるので、ChatGPTが書いてくれたプログラムを入力します。
var apiKey = "YourApiKeyToken"; (2行目) と
var recipient = "your-email@example.com"; (24行目) は、
自分の環境に合わせて""内を書き換えてください。
コードが入力できたら、コード入力欄の上にある「実行」をクリックします。
すると作成したプログラムが、
自分のGoogleアカウントでEtherscanにアクセスしたり、メールを送ったりするので
権限を与えて良いか確認されます。問題ないので承認しました。
少し怖い警告画面ですが、詳細を表示してデベロッパー(自分)を信頼します。
何段階も聞かれますが、許可します。
権限を与えるとスクリプトが実行されます。
エラーがなければ、画面下側の実行ログに「実行完了」と表示されます。
スプレットシートの方に戻ってみると、無事データが取得されました。
B1セルをon、D1セルの数字を大きくすると、記入した数値を下回るとメールで通知が飛ぶことも、Apps Script側の実行ボタンで都度実験できます。
ガス代取得・通知の自動実行
プログラムが手動でうまく動くようになったら、1分に1度実行されるようにスケジュールを組みます。Apps Scriptでは、自動実行の機能が付いているので今回はこちらを使います。
Apps Scriptの画面に戻り、左側に並んでいる時計アイコン「トリガー」に入ります。
トリガーの実行条件
・イベントのソースを選択「時間主導型」
・時間ベースのトリガーのタイプを選択「分ベースのタイマー」
・時間の間隔を選択(分)「1分おき」
に設定します。
これで保存すると、自動的に1分ごとにスクリプトが実行されるようになります。
あとはガス代が下がって通知が来るのを待ちました。
(数字だけ眺めても面白くないので、チャートも追加しておきました。)
最後に
ほとんどコードを書かず簡単に作れながらも、実用に足るものが出来たと思います。
ガス代が一定以下であれば毎分メールが飛び続けます。一時的に動かす分には十分ですが、一度通知したらしばらくは送らないなど、もう少し気の利いたプログラムにした方がより実用的でしょうか。今回は速度優先でそのまま完成とすることにしました。
私にとっては無事mintできて、運用で充分カバーできました
ほぼプログラムを書かずにこのような機能が実現できるのは、技術の進歩を感じます。たまにしかプログラムを触らない私でも1時間かからず実現でき、改めてChatGPTの威力は凄いと認識させられます。Google Apps Scriptは誰でも簡単にBOTなど実装できるので、気になった方はこれを期に一度触ってみてはいかがでしょうか。