ドメインを販売できるようにしよう
🏠 ドメインを販売する
スマートコントラクトがで きてきました。
ただし、現在はマッピングを提供しているだけです。
ウォレットやOpenSeaで実際に表示することはできません。
これから行うことは、ドメインを OpenSea で表示可能な NFT に変換し、ドメインの長さに応じてさまざまな金額で販売することです。
ちなみに、ENSドメインでは一度に特定のドメインを保持できるウォレットは1つだけです。
💰 支払いを実装しよう
私たちは実際には.ethのようなTLD(トップレベルドメイン)をコントラクトに入れていません。
ミントしたいドメインを設定しましょう! 私は.ninjaを使います 🥷
ご自身のものを設定してみてください。。「.takeshi」など何でも結構です:
Domains.solを変更します。
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.17;
// インポートを忘れずに。
import {StringUtils} from "./libraries/StringUtils.sol";
import "hardhat/console.sol";
contract Domains {
// トップレベルドメイン(TLD)です。
string public tld;
mapping(string => address) public domains;
mapping(string => string) public records;
// constructorに"payable"を加えます。
constructor(string memory _tld) payable {
tld = _tld;
console.log("%s name service deployed", _tld);
}
// domainの長さにより価格が変わります。
function price(string calldata name) public pure returns (uint) {
uint len = StringUtils.strlen(name);
require(len > 0);
if (len == 3) {
// 3文字のドメインの場合 (通常,ドメインは3文字以上とされます。あとのセクションで触れます。)
return 0.005 * 10 ** 18; // 5 MATIC = 5 000 000 000 000 000 000 (18ケタ).あとでfaucetから少量もらう関係 0.005MATIC。
} else if (len == 4) {
//4文字のドメインの場合
return 0.003 * 10 ** 18; // 0.003MATIC
} else {
return 0.001 * 10 ** 18; // 0.001MATIC
}
}
function register(string calldata name) public payable {
require(domains[name] == address(0));
uint _price = price(name);
// トランザクションを処理できる分だけのMATICがあるか確認
require(msg.value >= _price, "Not enough Matic paid");
domains[name] = msg.sender;
console.log("%s has registered a domain!", msg.sender);
}
// 他のfunction は変更せず。
}
ここで新しい言葉に気付くでしょう。
registerにpayableを追加しました。
uint _price = price(name);
require(msg.value >= _price, "Not enough Matic paid");
ここでは、送信されたmsgのvalueが一定量を超えているかどうかを確認します。 valueは送信されたMaticの量であり、msgはトランザクション本体です。
これは実はすごいことです。 数行のコードで、アプリに支払い機能を追加できます。APIキーは必要ありません。 大手プロバイダーとやりとりする必要もありません。
これがブロックチェーンのすばらしいところです。
また、トランザクションに十分なMaticがない場合、トランザクションは元に戻され、何も変更されません。
price関数を詳しく見ると、これはpure関数であることがわかります。
つまり、コントラクトの状態を読み取ったり変更したりすることはありません。
価格はJavaScriptなどを使用してフロントエンドでも実行できますが、その必要もないでしょう。ここでは、チェーン上で最終価格を計算します。
ドメインの長さに基づいて価格を返すように設定しました。 ドメインが短いほどコストが高くなります
.comなどでもシンプルなドメインは価値が出ますよね。
MATICトークンには小数点以下18桁があるため、価格の最後に* 10**18を付ける必要があります。
function price(string calldata name) public pure returns(uint) {
uint len = StringUtils.strlen(name);
require(len > 0);
if (len == 3) {
return 0.005 * 10**18; // 5 MATIC = 5 000 000 000 000 000 000 (18ケタ).
//ここではあとでfaucetから少量のMATICをもらう関係で0.005MATICとしておきます。
} else if (len == 4) {
return 0.003 * 10**18; // ドメイン文字数が増えると少し安くなる。0.003MATIC
} else {
return 0.001 * 10**18; // 0.001MATIC
}
}
注:Amoy などテストネットでは価格を下げてミントしましょう。 1 Matic のような設定をするとテストネットの資金がすぐになくなります。 ローカルで実行している場合は何回でも課金できますが、実際のテストネットワークを使用している場合は注意が必要です。
他に、次の3つを追加しました。
-
StringUtilsパッケージをインポートしています。 これについては下で説明しています。 -
文字列
tldこれは、ドメインの末尾を記録します(例:.ninja)。 -
string memory _tldconstructorは1回だけ実行されます。これはpublicのtld変数を設定する方法です。
contractsフォルダーにlibraries