
DN404(ERC404)のローカル環境構築
概要
DN404(ERC404)は、ERC20(トークン)とERC721(NFT)の性質を保持しており、Uniswap取引可能且つ、NFTとしてOpenSea等のマーケットプレイスでも取引可能な企画。
従来はERC404と呼ばれていたが、ガス代を改善してよりEIPに近い形に直したものがDN404(Divisible NFT)として再構築されている(参照URL)。
DN404もERC404もEIPとして提案されていないが、すでにこの企画のトークンはPandoraを初め多数の404トークンで使用されている(PandoraはERC404)。
Pandoraはローンチ後1週間で12000%上昇。

プロポーザルが通る前に普及するという異次元の期待を見せるDN404はNFTの流動性が少ないという問題を解決するブレイクスルーであると考える。
どのように動作するかは下記の画像が見やすい。


ERC404と記載があるがそういう認識はあまりなく基本的にERC20もしくはERC721として取り扱われ、どちらかに変更が加わった際もう片方も影響を受ける、と言う仕様。
ERC20を指定量以上持っていればERC721が配布される
例)指定量が10のところを23持っていれば、2つNFT721を保有していることになる
ERC20が指定量以下であれば所持しているNFTはバーン
例)ERC20を20持っていて(NFTは2つの状態)、11誰かに送金した場合、送金先の人がERC20を11、NFTを1つ保有することになり、残りはバーンされる
ERC721はマケプレで取引可能。NFTが移動したときはERC20も定量移動する
ここではDN404のテスト環境をローカルで構築し、コントラクトの動作確認まで行う為の手順を記載する。
手順
(1) Foundryのインストール
DN404のgithubサイトにアクセス。
FoundryというSolidityの開発環境を構築しろと言われるので、下記のコマンドでFoundryをインストール。
curl -L https://foundry.paradigm.xyz | bash
(2) DN404レポジトリのPULL
DN404のレポジトリをpullしてくるのだが、git cloneはせず、下記のコマンドで持ってくる。
forge install vectorized/dn404
そのまま実行すると「.git」がないと怒られる可能性がある。
その場合は「git init」を実行してから上記コマンドを打つ。
libフォルダー下にdn404というフォルダができているはず。

(3) DN404のビルドとテスト
dn404フォルダに移動して下記のコマンドを実行。
forge build
次にテストを実行する。
forge test

:
:

(4) ローカルEVM(Anvil)起動
次のコマンドでローカルEVMを走らせる。
このEVMに404コントラクトをデプロイする。
anvil

デプロイする際、いずれかのアカウントからデプロイする必要があるのでコントラクトのオーナーとなる秘密鍵を上記のリストから選んでおく。
今回は
0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80
を使用する。
(5) DN404コントラクトのデプロイ
デプロイスクリプトを実行する前に環境変数を準備しておく必要があるので下記の2つのコマンドを実行。
export PRIVATE_KEY=0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80
export FOUNDRY=http://localhost:8545
デプロイスクリプトは
script/DeploySimpleDN404.s.sol
forge script script/DeploySimpleDN404.s.sol:SimpleDN404Script \
--fork-url $FOUNDRY \
--private-key \
$PRIVATE_KEY --broadcast

:
:

上記、実行結果でコントラクトアドレスがわかる。
0x5FbDB2315678afecb367f032d93F642f64180aa3
(6) コントラクトの呼び出し
デプロイされたコントラクトのファンクションを実行する。
ReadOnlyのコマンドは「cast call」を使用する。
コントラクトの名前を呼び出してみる。
cast call 0x5fbdb2315678afecb367f032d93f642f64180aa3 \
"name()(string)" \
--private-key $PRIVATE_KEY \
--rpc-url $FOUNDRY
実行すると
"DN404"
と結果が返ってくる。
コントラクトが問題なくデプロイされている事を確認。
次回はファンクションの実行やテストコードを書いて、どう言う風に動いているか検証していく。
結論
ローカル環境構築はそこまで難しくない。
ただ、当初git cloneをしてから環境構築をしようとしてハマった。
git cloneは行う必要はない。
git init
forge install vectorized/dn404
を行うだけ。
FoundryはUIは提供していないので扱いづらい…