EGO-LOG

40代2児の父。主にプログラム学習と開発、仮想通貨、メタバース、たまに関係ないことを綴る。

replitでdiscord bot常時起動できなくなったので対応した件

IDE(統合開発環境)のreplitで、discordのbotを常時起動させていた。

 

常時起動させるには、一定期間ごとにサービスにpingを送るサービス(uptimerobot)を使ってもいいが、何かの拍子でbotが落ちることがあったので、

replitの常時起動(always on)の機能を使っていた。

 

以前は有料課金(Hacker plan以上)にするか、複数常時起動にしたい場合は個別に課金することで対応していた。

 

それが、今年(2024)に入ったタイミング?で従来の方法では常時起動できなくなった模様。

同じことを実現したい場合はプロジェクト(Repls)をデプロイする必要アリ。

デプロイの種類には3種類アリ

discord botには多分Reserved VMが向いてるっぽい。

docs.replit.com

↑プランを選択

[Always on]が付いていればbotの場合最安プランで良いかと

 

今回ハマったのが↑の「Run command」で、プログラムを起動するコマンドを設定する。

botpythonで作っていて、最初に起動するファイルがmain.pyなので、今回は

python3 main.py 

↑のように設定した。

 

「Deploy」ボタン押下で結構時間がかかるがデプロイが進行する。

エラーが出なければデプロイ成功で、後は後ろで勝手に起動している状態。

 

この状態で別に「Run」で起動すると、二重に起動した状態になるようなので注意。

 

 

以上。

 

 

NFTをエアドロップするには

送付先ウォレットアドレスを収集して、アドレス宛にNFTをエアドロップしたい。

今回はthirdwebを使用したケース。

 

エアドロップするNFTを用意する

エアドロップするNFT(ERC721)をミントしておく。

アップロードするだけではダメで、ミントしておく(各NFTにアドレスが設定される)必要がある。

 

エアドロップ元のコントラクトで承認作業を行う

NFTをミントしたコントラクトで、setApprovalForAllの設定を行う。

  • operator:エアドロするコントラクトID
  • approved:true

 

※この設定はエアドロが終わったら解除(OFF)に戻した方が良いかも?

 

エアドロップ設定

thirdwebで「Airdrop ERC721」を選択してデプロイ

Explorerタブを選択

AirdropERC721を選択

  • Token Address:エアドロ元のコレクションのコントラクトアドレス
  • Token Owner:コントラクトのオーナーのウォレットアドレス
  • Contents:送り先のウォレットアドレスとトークンIDをペアでJSONを記述

 

エアドロ実行

実行して署名でエアドロ完了。

 

 

以上

thirdwebに脆弱性が見つかった件

英語のメールは基本無視しているのだけど、

今日thirdwebからのメールが来てて、タイトルに important とあったので、

何かいつもと違う気配を感じてXを覗いてみたら、

thirdwebのコントラクトに脆弱性が見つかったとのこと。

その時点でいくつかのプロジェクトは対応が済んでいたようで。

 

具体的な対応は以下のとおり。

  • thirdwebが提示するリンクから、各自コントラクトに脆弱性があるかチェックする。
  • 脆弱性がある場合、コントラクトをLockする。
  • 新しくコントラクトをデプロイして、元のホルダーにエアドロップする

と、簡単に言ってくれますが、

デプロイにもエアドロップにも相応のガス代(と手間)がかかるわけで、

ガス代は負担してくれるような情報もあるけど全員に対処できるとも思えない。

どうなるんだろうね。。

 

とりあえず、自分が担当するコントラクトをチェックする。

元のポストは↓

ポストから診断ツールにジャンプする。

t.co

そこでウォレットに接続してみると。。。

あぼーん

Vulnerable(脆弱)の文字が。

 

このまま強引に運用しても、何かあったら資産が無くなりかねないし、

ホルダーさんにも迷惑がかかるので、Lockの一択。

  • Lockすると、スケジュールがクリアされる。
  • メタデータは凍結する。
  • コレクション名に「Locked」がつく

 

ちょっと待って、相当リスキーな行動を軽率にさせようとしてないか????

Lockしてデプロイ、エアドロ済の情報もあるにはあるけど、

そこまで慌ててやらないといけないことなのか。

個人のコレクションでもないので、決行していいものか確認しないと。

 

というわけで、個人のテストで作ったコントラクトがあったのを思い出したので、

実行してみる。

「Lock Contract」をクリック

ここでガス代がかかる。

Lock完了

「Capture snapshot」でスナップショット取得

 

安全なコントラクトをデプロイ

「Deploy Contract」でデプロイ

ここでもガス代発生

 

エアドロップ

コントラクトのNFTホルダーに、新コントラクトのNFTをエアドロップする

「AirdropTool」は↓の「Start Airdrop」で配布が始まる?

「Shareable claim page」はこれまでのようにClaim設定ページから配布する?

Airdrop tool」で配布したいのだが、

「Start Airdrop」ボタンが押せない。

ガス代を肩代わりしてくれるウォレットがBackend Wallet Addressで、

そこに入っている額が「Backend Wallet Balance」で0になっている。

「Minimum Balance Required」以上入っていないと実行できないっぽい。

 

「Withdraw Funds」で補充できるようだが、押しても実行できない。。

同じ時間帯に同じ作業をしている方が多いと、常にウォレットがカラになってしまう?

 

どうにも進めないので一旦ここまで!

 

新しくなったopenseaで出品迷子になった件

一言だけ。

 

コレクションを作成する際は、「Drop a Collection」ではなく「Mint an NFT」で作成すること。

Drop a Collection」で作るとERC-721で作成できるのは旧来どおりでうまくいきそうに見えるが、アイテムの追加方法が分からなかった。

「Mint an NFT」で作成するとERC-1155にはなるがリストまで動作確認できた。

これまでの規格で発行できないのはムズムズするけど、とりあえず発行したいよーという方は後者を選択しましょう、という話。

 

以上!

【NFT】ガスレスフリーミントできるようになっておこう

ガスレスフリーミントとは

現在はミント時のガス代が落ち着いてきたものの、まだバカにならない額。

イーサに拘らなければpolygonチェーンでも良いが、

ミントする側がPolygon(MATIC)を用意しなければならず煩わしい。

ならばPolygonで安いガス代をNFT発行側が負担してミントしてもらおう、というもの。

 

どうやるのか

流れは以下の通り

  1. Polygon(MATIC)を準備する。
  2. ThirdwebでNFTをデプロイする。
  3. NFTの価格を0にする(フリーミント)
  4. ThirdwebとOpenzeppelinを紐づける

この中で経験があるのは1~3

4が未体験なのでやってみる。Openzeppelinは、現在学習中のSolidityで使うライブラリ群の認識。

 

参考サイト

参考というか記事を購入しました。

note.com

なので詳細は記事を買って読んでください。。

 

やったこと概要

まずは対象のNFTをデプロイするところまで行う。

ここは特別なことは特にナシ

今回はERC1155でMumbaiでデプロイ

NFTを追加

ミント設定まで行う

SBTにしたいのでNon-Transfarsableとする

 

価格0MATICとする。

ここまではなんの変哲もないミント設定

 

大事なところ

ここからがガスレスフリーミントの大事なところ。

ポイントはOpenZeppelinでRelayerというガス代を入れておく箱を作っておいて、

そこからガス代を都度支払うように設定する。

それからAutoTaskというガス代をかわりに支払う仕組みを設定する。

 

ThirdWebにURI設定

↑でゴニョゴニョして取得したガスレスの仕組みが入ったURLを取得したら、

EmbedタブのGasless設定にURLを設定する。

これでガスレスでミントできる。

 

 

肝心なところがわからんよ!という方は先のリンクから記事を購入するなり独自に調査するなりしてください~

 

 

以上

【discord】ロール設定botの紹介【bot】

できました

製作していたbotがとりあえず動くカタチとなったので紹介します。

 

tenomeuonome.hateblo.jp

 

欲しかったbot

所属しておりますDAO【tomajoDAO】で、先日ジェネラティブNFTがリリースされた。

NFTの特徴としては、トマトを擬人化したキャラクターと都道府県ごとの農作物を組み合わせたものとなっている。

以下のプロパティを持つ。

  • Character
  • Event
  • Nousakumotsu
  • Sora
  • Todoufuken

キャラクタは10種類で、各都道府県に3種類ずつ特産物がある。

所持しているNFTの組み合わせでロールを付与する特典を設けたい。

以下のようなロールを設定したい。

  1. 都道府県の特産物3種類をコンプリート
  2. 果物のNFTを10枚
  3. キャラクタ10種コンプリート
  4. 47都道府県コンプリート

既存botでできたこととできないこと

CollabLandで可能なのは、2.の~をN枚持っていたら、というもの。

これ以外は設定をいじってみたけどできなかった。

 

どんなbot

この他の条件でのロール設定を可能にするbotを作成した。

その名も「CryptoRoleDeliverer」ロール配達botというわけですね。

↑このゲボダセえアイコンが目印。

 

使い方

botをインストールして起動すると、使い方の通知が1日に一回流れる。

 

/crole_regist_waddr コマンドの後ろにNFTが入っているウォレットアドレスを指定して実行すると、チェック対象となる。

一定時間後チェックが実行されてロールが通知される。

/crole_remove_waddr コマンドでウォレットアドレスを解除する。

 

弱点

最大の弱点は、discordユーザとウォレットアドレスを正確に連携できないこと。

やろうと思えば他人のウォレットアドレスで登録できてしまう。

ロールを取得することで実質的な利益が得られてしまうような場合は使いにくいかも。

ただし、ロールを取得したら、誰にロールが付与されたかdiscordサーバ内に通知されるので、大概はバレると思う。

大規模サーバとかになってくると見逃しも発生するかも。

 

終わりに

というわけで今回必要な機能を備えたbotが一応完成。

追加機能も色々考えられるが、ひとまずここまで。

もし使ってみたいという方がいらっしゃればご連絡くださいー

 

以上

 

無いものは作る~discord ロール設定bot編~【製作中】

前回

tenomeuonome.hateblo.jp

 

CollabLandの機能でできるのかできないのかモジモジしたあげく、

できませんでした、というオチ。

CollabLand Compilation機能は、単にロールとロールを組み合わせて新たなロールをつけるというものだった。

 

目的のおさらい

所持しているNFTの組み合わせに応じてロールをつけたい。

例えばあるジェネラティブコレクションがあるとして、

Colorというプロパティがあるとする。

Colorには Red Green Blueの3種類があったとして、

Redを1枚、Greenを1枚以上持っていたらそのウォレットの持ち主のdiscordメンバーに特定のロールAをつける。

コンプリートという意味あいなら、Redを1枚、Greenを1枚、Blueを1枚以上それぞれもっていたらそれ用のロールをつけたい。

 

開発

環境:Replit

言語:Python

 

設定管理

NFTの条件をjson形式で管理する。色コンプリートなら以下の形式

'''

{
  "description": "色コンプリート",
  "contract_address": "0x99999999999999999999999999999",
  "roll_id": 12345678901234567890,
  "operator": "and",
  "attributes": [
    {
      "name": "Color",
      "value": "Red",
      "number": 1
    },
    {
      "name": "Color",
      "value": "Green",
      "number": 1
    },
    {
      "name": "Color",
      "value": "Blue",
      "number": 1
    }
  ]
}

複数設定したい場合は上記のような設定ファイルを必要なだけ用意する。

 

できたらまた報告します。

 

 

以上