diff --git "a/docs/Polygon-ENS-Domain/ja/section-1/lesson-1_\343\203\255\343\203\274\343\202\253\343\203\253\347\222\260\345\242\203\343\201\247\343\202\244\343\203\274\343\202\265\343\203\252\343\202\242\343\203\240\343\203\215\343\203\203\343\203\210\343\203\257\343\203\274\343\202\257\343\202\222\347\253\213\343\201\241\344\270\212\343\201\222\343\202\210\343\201\206.md" "b/docs/Polygon-ENS-Domain/ja/section-1/lesson-1_\343\203\255\343\203\274\343\202\253\343\203\253\347\222\260\345\242\203\343\201\247\343\202\244\343\203\274\343\202\265\343\203\252\343\202\242\343\203\240\343\203\215\343\203\203\343\203\210\343\203\257\343\203\274\343\202\257\343\202\222\347\253\213\343\201\241\344\270\212\343\201\222\343\202\210\343\201\206.md" index 7b04e843b..2e6edccbe 100644 --- "a/docs/Polygon-ENS-Domain/ja/section-1/lesson-1_\343\203\255\343\203\274\343\202\253\343\203\253\347\222\260\345\242\203\343\201\247\343\202\244\343\203\274\343\202\265\343\203\252\343\202\242\343\203\240\343\203\215\343\203\203\343\203\210\343\203\257\343\203\274\343\202\257\343\202\222\347\253\213\343\201\241\344\270\212\343\201\222\343\202\210\343\201\206.md" +++ "b/docs/Polygon-ENS-Domain/ja/section-1/lesson-1_\343\203\255\343\203\274\343\202\253\343\203\253\347\222\260\345\242\203\343\201\247\343\202\244\343\203\274\343\202\265\343\203\252\343\202\242\343\203\240\343\203\215\343\203\203\343\203\210\343\203\257\343\203\274\343\202\257\343\202\222\347\253\213\343\201\241\344\270\212\343\201\222\343\202\210\343\201\206.md" @@ -161,18 +161,10 @@ Give Hardhat a star on Github if you're enjoying it! 💞✚ https://github.com/NomicFoundation/hardhat ``` -> ⚠: 泚意 #1 +> ⚠: 泚意 > > Windows で Git Bash を䜿甚しおハヌドハットをむンストヌルしおいる堎合、このステップ (HH1) で゚ラヌが発生する可胜性がありたす。問題が発生した堎合は、WindowsCMDコマンドプロンプトを䜿甚しお HardHat のむンストヌルを実行しおみおください。 -> ⚠: 泚意 #2 -> -> `npx hardhat`が実行されなかった堎合、以䞋をタヌミナルで実行しおください。 -> -> ``` -> yarn add --dev @nomicfoundation/hardhat-toolbox -> ``` - この段階で、フォルダヌ構造は䞋蚘のようになっおいるこずを確認しおください。 ```diff @@ -191,50 +183,39 @@ Polygon-ENS-Domain + └── test/ ``` -それでは、`contract`ディレクトリ内に生成された`package.json`ファむルを以䞋を参考に曎新をしたしょう。 +次に、安党なスマヌトコントラクトを開発するために䜿甚されるラむブラリ **OpenZeppelin** を远加したす。 + +`packages/contract`ディレクトリにいるこずを確認し、以䞋のコマンドを実行しおください。 + +``` +yarn add @openzeppelin/contracts@^4.8.2 +``` + +[OpenZeppelin](https://github.com/OpenZeppelin/openzeppelin-contracts) はむヌサリアムネットワヌク䞊で安党なスマヌトコントラクトを実装するためのフレヌムワヌクです。 + +OpenZeppelinには非垞に倚くの機胜が実装されおおりむンポヌトするだけで安党にその機胜を䜿うこずができたす。 + +それでは、`packages/contract`ディレクトリ内の`package.json`ファむルを曎新したしょう。䞋蚘のように`"private": true,`の䞋に`"scripts":{...}`を远加しおください。よく利甚するコマンドを蚭定しおおきたす。 ```diff { "name": "contract", "version": "1.0.0", -- "main": "index.js", -- "license": "MIT", "private": true, - "devDependencies": { - "@nomicfoundation/hardhat-chai-matchers": "^1.0.6", - "@nomicfoundation/hardhat-network-helpers": "^1.0.8", - "@nomicfoundation/hardhat-toolbox": "^2.0.2", - "@nomiclabs/hardhat-ethers": "^2.2.2", - "@nomiclabs/hardhat-etherscan": "^3.1.7", - "@typechain/ethers-v5": "^10.2.0", - "@typechain/hardhat": "^6.1.5", - "chai": "^4.3.7", - "ethers": "^6.1.0", - "hardhat": "^2.13.0", - "hardhat-gas-reporter": "^1.0.9", - "solidity-coverage": "^0.8.2", - "typechain": "^8.1.1" + "scripts": { + "run:script":"npx hardhat run scripts/run.js", + "deploy": "npx hardhat run scripts/deploy.js --network mumbai", + "test": "npx hardhat test" }, -+ "scripts": { -+ "test": "npx hardhat test" -+ } -} + "devDependencies": { ``` -䞍芁な定矩を削陀し、hardhatの自動テストを実行するためのコマンドを远加したした。 - ### ⭐ 実行する すべおが機胜しおいるこずを確認するには、以䞋を実行したす。 ``` -npx hardhat compile -``` - -次に、以䞋を実行したす。 - -``` -npx hardhat test +yarn test ``` 次のように衚瀺されたす。 diff --git "a/docs/Polygon-ENS-Domain/ja/section-1/lesson-2_\343\202\271\343\203\236\343\203\274\343\203\210\343\202\263\343\203\263\343\203\210\343\203\251\343\202\257\343\203\210\343\202\222\345\256\237\350\241\214\343\201\227\343\201\246\343\201\277\343\202\210\343\201\206.md" "b/docs/Polygon-ENS-Domain/ja/section-1/lesson-2_\343\202\271\343\203\236\343\203\274\343\203\210\343\202\263\343\203\263\343\203\210\343\203\251\343\202\257\343\203\210\343\202\222\345\256\237\350\241\214\343\201\227\343\201\246\343\201\277\343\202\210\343\201\206.md" index aa28b84a2..53a750541 100644 --- "a/docs/Polygon-ENS-Domain/ja/section-1/lesson-2_\343\202\271\343\203\236\343\203\274\343\203\210\343\202\263\343\203\263\343\203\210\343\203\251\343\202\257\343\203\210\343\202\222\345\256\237\350\241\214\343\201\227\343\201\246\343\201\277\343\202\210\343\201\206.md" +++ "b/docs/Polygon-ENS-Domain/ja/section-1/lesson-2_\343\202\271\343\203\236\343\203\274\343\203\210\343\202\263\343\203\263\343\203\210\343\203\251\343\202\257\343\203\210\343\202\222\345\256\237\350\241\214\343\201\227\343\201\246\343\201\277\343\202\210\343\201\206.md" @@ -9,9 +9,10 @@ Hardhatを䜿甚する堎合、ファむル構造は非垞に重芁ですので、泚意する必芁がありたす。ファむル構造が䞋蚘のようになっおいれば倧䞈倫です 😊 ``` -contract - |_ contracts - |_ Domains.sol +packages +└── contract + └── contracts + └── Domains.sol ``` 次に、コヌド゚ディタでプロゞェクトのコヌドを開きたす。 @@ -207,16 +208,7 @@ console.log("Contract deployed to:", domainContract.address); ### 💚 実行しおみよう -`packages/contract/package.json`の`script`郚分を以䞋のように線集しおください。 - -```json -"scripts": { - "run:script":"npx hardhat run scripts/run.js", - "test": "npx hardhat test", - "deploy": "npx hardhat run scripts/deploy.js --network mumbai" - }, -``` -その埌、タヌミナル䞊で、䞋蚘を実行しおみたしょう。 +タヌミナル䞊で、䞋蚘を実行しおみたしょう。 ``` yarn contract run:script diff --git "a/docs/Polygon-ENS-Domain/ja/section-1/lesson-3_\343\203\215\343\203\274\343\203\240\343\202\265\343\203\274\343\203\223\343\202\271\343\202\222\344\275\234\346\210\220\343\201\227\343\201\246\347\231\273\351\214\262\343\201\227\343\201\246\343\201\277\343\202\210\343\201\206.md" "b/docs/Polygon-ENS-Domain/ja/section-1/lesson-3_\343\203\215\343\203\274\343\203\240\343\202\265\343\203\274\343\203\223\343\202\271\343\202\222\344\275\234\346\210\220\343\201\227\343\201\246\347\231\273\351\214\262\343\201\227\343\201\246\343\201\277\343\202\210\343\201\206.md" index 327a22f92..ac12e5076 100644 --- "a/docs/Polygon-ENS-Domain/ja/section-1/lesson-3_\343\203\215\343\203\274\343\203\240\343\202\265\343\203\274\343\203\223\343\202\271\343\202\222\344\275\234\346\210\220\343\201\227\343\201\246\347\231\273\351\214\262\343\201\227\343\201\246\343\201\277\343\202\210\343\201\206.md" +++ "b/docs/Polygon-ENS-Domain/ja/section-1/lesson-3_\343\203\215\343\203\274\343\203\240\343\202\265\343\203\274\343\203\223\343\202\271\343\202\222\344\275\234\346\210\220\343\201\227\343\201\246\347\231\273\351\214\262\343\201\227\343\201\246\343\201\277\343\202\210\343\201\206.md" @@ -4,7 +4,6 @@ ### 💜ドメむンデヌタをブロックチェヌンに保存する - ネヌムサヌビスのポむントは、人々がむンタヌネット䞊のあなた固有の名前に䟿利にアクセスするこずができるずいうこずです。 [google.com](http://google.com)ず入力しおGoogleにアクセスするのず同じように、ナヌザヌはあなたのドメむンネヌムを頌りにあなたの情報にアクセスするこずができたす。 @@ -21,23 +20,23 @@ pragma solidity ^0.8.17; import "hardhat/console.sol"; contract Domains { - // "mapping"でstring型の各keyずaddress型の各デヌタを玐付けにしお栌玍したす。そのmappingをここでは"domains"ずしお定矩しおいたす。 - mapping(string => address) public domains; - - constructor() { - console.log("THIS IS MY DOMAIN CONTRACT. NICE."); - } - - // register関数はnameずアドレスを玐付けたす。 - function register(string calldata name) public { - domains[name] = msg.sender; - console.log("%s has registered a domain!", msg.sender); - } - - // nameに察応するaddressを返すゲッタヌ関数を定矩しおおきたす。 - function getAddress(string calldata name) public view returns (address) { - return domains[name]; - } + // "mapping"でstring型の各keyずaddress型の各デヌタを玐付けにしお栌玍したす。そのmappingをここでは"domains"ずしお定矩しおいたす。 + mapping(string => address) public domains; + + constructor() { + console.log("THIS IS MY DOMAIN CONTRACT. NICE."); + } + + // register関数はnameずアドレスを玐付けたす。 + function register(string calldata name) public { + domains[name] = msg.sender; + console.log("%s has registered a domain!", msg.sender); + } + + // nameに察応するaddressを返すゲッタヌ関数を定矩しおおきたす。 + function getAddress(string calldata name) public view returns (address) { + return domains[name]; + } } ``` @@ -95,14 +94,14 @@ const main = async () => { const domainContractFactory = await hre.ethers.getContractFactory('Domains'); const domainContract = await domainContractFactory.deploy(); await domainContract.deployed(); - console.log("Contract deployed to:", domainContract.address); - console.log("Contract deployed by:", owner.address); + console.log('Contract deployed to:', domainContract.address); + console.log('Contract deployed by:', owner.address); - const txn = await domainContract.register("doom"); + const txn = await domainContract.register('doom'); await txn.wait(); - const domainOwner = await domainContract.getAddress("doom"); - console.log("Owner of domain:", domainOwner); + const domainOwner = await domainContract.getAddress('doom'); + console.log('Owner of domain:', domainOwner); } const runMain = async () => { @@ -135,17 +134,17 @@ const [owner, randomPerson] = await hre.ethers.getSigners(); コントラクトをデプロむした人のアドレスを出力したす。 ```javascript -console.log("Contract deployed by:", owner.address); +console.log('Contract deployed by:', owner.address); ``` 最埌にこれを远加しおいたす。 ```javascript -const txn = await domainContract.register("doom"); +const txn = await domainContract.register('doom'); await txn.wait(); -const domainOwner = await domainContract.getAddress("doom"); -console.log("Owner of domain:", domainOwner); +const domainOwner = await domainContract.getAddress('doom'); +console.log('Owner of domain:', domainOwner); ``` たず、`doom`を匕数ずしお`register`関数を呌び出したす。 @@ -200,35 +199,37 @@ pragma solidity ^0.8.17; import "hardhat/console.sol"; contract Domains { - mapping(string => address) public domains; - - // stringずstringを玐付けた新しいmappingです。 - mapping(string => string) public records; - - constructor() { - console.log("Yo yo, I am a contract and I am smart"); - } - - function register(string calldata name) public { - // そのドメむンがただ登録されおいないか確認したす。 - require(domains[name] == address(0)); - domains[name] = msg.sender; - console.log("%s has registered a domain!", msg.sender); - } - - function getAddress(string calldata name) public view returns (address) { - return domains[name]; - } - - function setRecord(string calldata name, string calldata record) public { - // トランザクションの送信者であるこずを確認しおいたす。 - require(domains[name] == msg.sender); - records[name] = record; - } - - function getRecord(string calldata name) public view returns(string memory) { - return records[name]; - } + mapping(string => address) public domains; + + // stringずstringを玐付けた新しいmappingです。 + mapping(string => string) public records; + + constructor() { + console.log("Yo yo, I am a contract and I am smart"); + } + + function register(string calldata name) public { + // そのドメむンがただ登録されおいないか確認したす。 + require(domains[name] == address(0)); + domains[name] = msg.sender; + console.log("%s has registered a domain!", msg.sender); + } + + function getAddress(string calldata name) public view returns (address) { + return domains[name]; + } + + function setRecord(string calldata name, string calldata record) public { + // トランザクションの送信者であるこずを確認しおいたす。 + require(domains[name] == msg.sender); + records[name] = record; + } + + function getRecord( + string calldata name + ) public view returns (string memory) { + return records[name]; + } } ``` @@ -276,14 +277,14 @@ const main = async () => { const domainContractFactory = await hre.ethers.getContractFactory('Domains'); const domainContract = await domainContractFactory.deploy(); await domainContract.deployed(); - console.log("Contract deployed to:", domainContract.address); - console.log("Contract deployed by:", owner.address); + console.log('Contract deployed to:', domainContract.address); + console.log('Contract deployed by:', owner.address); - let txn = await domainContract.register("doom"); + let txn = await domainContract.register('doom'); await txn.wait(); - const domainAddress = await domainContract.getAddress("doom"); - console.log("Owner of domain doom:", domainAddress); + const domainAddress = await domainContract.getAddress('doom'); + console.log('Owner of domain doom:', domainAddress); } @@ -331,17 +332,17 @@ const main = async () => { const domainContractFactory = await hre.ethers.getContractFactory('Domains'); const domainContract = await domainContractFactory.deploy(); await domainContract.deployed(); - console.log("Contract deployed to:", domainContract.address); - console.log("Contract deployed by:", owner.address); + console.log('Contract deployed to:', domainContract.address); + console.log('Contract deployed by:', owner.address); - let txn = await domainContract.register("doom"); + let txn = await domainContract.register('doom'); await txn.wait(); - const domainAddress = await domainContract.getAddress("doom"); - console.log("Owner of domain doom:", domainAddress); + const domainAddress = await domainContract.getAddress('doom'); + console.log('Owner of domain doom:', domainAddress); // 自分以倖でデヌタを蚘録しおみたす。 - txn = await domainContract.connect(randomPerson).setRecord("doom", "Haha my domain now!"); + txn = await domainContract.connect(randomPerson).setRecord('doom', 'Haha my domain now!'); await txn.wait(); } @@ -368,7 +369,7 @@ yarn contract run:script **次のスクリプトの箇所で゚ラヌが発生したす** ```javascript -txn = await domainContract.connect(randomPerson).setRecord("doom", "Haha my domain now!"); +txn = await domainContract.connect(randomPerson).setRecord('doom', 'Haha my domain now!'); await txn.wait(); ``` diff --git "a/docs/Polygon-ENS-Domain/ja/section-1/lesson-4_\343\203\211\343\203\241\343\202\244\343\203\263\343\202\222\350\262\251\345\243\262\343\201\247\343\201\215\343\202\213\343\202\210\343\201\206\343\201\253\343\201\227\343\202\210\343\201\206.md" "b/docs/Polygon-ENS-Domain/ja/section-1/lesson-4_\343\203\211\343\203\241\343\202\244\343\203\263\343\202\222\350\262\251\345\243\262\343\201\247\343\201\215\343\202\213\343\202\210\343\201\206\343\201\253\343\201\227\343\202\210\343\201\206.md" index 370313cb7..608a1f581 100644 --- "a/docs/Polygon-ENS-Domain/ja/section-1/lesson-4_\343\203\211\343\203\241\343\202\244\343\203\263\343\202\222\350\262\251\345\243\262\343\201\247\343\201\215\343\202\213\343\202\210\343\201\206\343\201\253\343\201\227\343\202\210\343\201\206.md" +++ "b/docs/Polygon-ENS-Domain/ja/section-1/lesson-4_\343\203\211\343\203\241\343\202\244\343\203\263\343\202\222\350\262\251\345\243\262\343\201\247\343\201\215\343\202\213\343\202\210\343\201\206\343\201\253\343\201\227\343\202\210\343\201\206.md" @@ -25,47 +25,50 @@ pragma solidity ^0.8.17; // むンポヌトを忘れずに。 -import { StringUtils } from "./libraries/StringUtils.sol"; +import {StringUtils} from "./libraries/StringUtils.sol"; import "hardhat/console.sol"; contract Domains { - // トップレベルドメむン(TLD)です。 - string public tld; + // トップレベルドメむン(TLD)です。 + string public tld; - mapping(string => address) public domains; - mapping(string => string) public records; + 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); - } + // 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 + // 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); + 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"); + // トランザクションを凊理できる分だけのMATICがあるか確認 + require(msg.value >= _price, "Not enough Matic paid"); - domains[name] = msg.sender; - console.log("%s has registered a domain!", msg.sender); - } - // 他のfunction は倉曎せず。 + domains[name] = msg.sender; + console.log("%s has registered a domain!", msg.sender); + } + + // 他のfunction は倉曎せず。 } ``` @@ -117,7 +120,7 @@ _泚**Mumbai などテストネットでは䟡栌を䞋げおミントした 他に、次の3぀を远加したした。 -- `import{StringUtils}`バッケヌゞをむンポヌトしおいたす。 これに぀いおは䞋で説明しおいたす。 +- `StringUtils`パッケヌゞをむンポヌトしおいたす。 これに぀いおは䞋で説明しおいたす。 - 文字列`tld`これは、ドメむンの末尟を蚘録したす(䟋`.ninja`)。 @@ -133,24 +136,24 @@ _泚**Mumbai などテストネットでは䟡栌を䞋げおミントした ```javascript const main = async () => { - const domainContractFactory = await hre.ethers.getContractFactory("Domains"); - // "ninja"をデプロむ時にconstructorに枡したす。 - const domainContract = await domainContractFactory.deploy("ninja"); + const domainContractFactory = await hre.ethers.getContractFactory('Domains'); + // 'ninja'をデプロむ時にconstructorに枡したす。 + const domainContract = await domainContractFactory.deploy('ninja'); await domainContract.deployed(); - console.log("Contract deployed to:", domainContract.address); + console.log('Contract deployed to:', domainContract.address); // valueで代金をやりずりしおいたす。 - let txn = await domainContract.register("mortal", { - value: hre.ethers.utils.parseEther("0.01"), + let txn = await domainContract.register('mortal', { + value: hre.ethers.utils.parseEther('0.01'), }); await txn.wait(); - const address = await domainContract.getAddress("mortal"); - console.log("Owner of domain mortal:", address); + const address = await domainContract.getAddress('mortal'); + console.log('Owner of domain mortal:', address); const balance = await hre.ethers.provider.getBalance(domainContract.address); - console.log("Contract balance:", hre.ethers.utils.formatEther(balance)); + console.log('Contract balance:', hre.ethers.utils.formatEther(balance)); }; const runMain = async () => { @@ -244,67 +247,83 @@ import "hardhat/console.sol"; // むンポヌトしたコントラクトを継承したす。継承したコントラクトのメ゜ッドを䜿甚できるようになりたす。 contract Domains is ERC721URIStorage { - // OpenZeppelinによりtokenIdsの远跡が容易になりたす。 - using Counters for Counters.Counter; - Counters.Counter private _tokenIds; - - string public tld; - - // NFTのむメヌゞ画像をSVG圢匏でオンチェヌンに保存したす。 - string svgPartOne = ''; - string svgPartTwo = ''; - - mapping(string => address) public domains; - mapping(string => string) public records; - - constructor(string memory _tld) payable ERC721("Ninja Name Service", "NNS") { - tld = _tld; - console.log("%s name service deployed", _tld); - } + // OpenZeppelinによりtokenIdsの远跡が容易になりたす。 + using Counters for Counters.Counter; + Counters.Counter private _tokenIds; - function register(string calldata name) public payable { - require(domains[name] == address(0)); + string public tld; - uint256 _price = price(name); - require(msg.value >= _price, "Not enough Matic paid"); + // NFTのむメヌゞ画像をSVG圢匏でオンチェヌンに保存したす。 + string svgPartOne = + ''; + string svgPartTwo = ""; - // ネヌムずTLD(トップレベルドメむン)を結合したす。 - string memory _name = string(abi.encodePacked(name, ".", tld)); - // NFT甚にSVGむメヌゞを䜜成したす。 - string memory finalSvg = string(abi.encodePacked(svgPartOne, _name, svgPartTwo)); - uint256 newRecordId = _tokenIds.current(); - uint256 length = StringUtils.strlen(name); - string memory strLen = Strings.toString(length); + mapping(string => address) public domains; + mapping(string => string) public records; - console.log("Registering %s.%s on the contract with tokenID %d", name, tld, newRecordId); - - // JSON圢匏のNFTのメタデヌタを䜜成。文字列を結合しbase64で゚ンコヌドしたす。 - string memory json = Base64.encode( - abi.encodePacked( - '{"name": "', - _name, - '", "description": "A domain on the Ninja name service", "image": "data:image/svg+xml;base64,', - Base64.encode(bytes(finalSvg)), - '","length":"', - strLen, - '"}' - ) - ); - - string memory finalTokenUri = string( abi.encodePacked("data:application/json;base64,", json)); - - console.log("\n--------------------------------------------------------"); - console.log("Final tokenURI", finalTokenUri); - console.log("--------------------------------------------------------\n"); - - _safeMint(msg.sender, newRecordId); - _setTokenURI(newRecordId, finalTokenUri); - domains[name] = msg.sender; + constructor( + string memory _tld + ) payable ERC721("Ninja Name Service", "NNS") { + tld = _tld; + console.log("%s name service deployed", _tld); + } - _tokenIds.increment(); - } + function register(string calldata name) public payable { + require(domains[name] == address(0)); + + uint256 _price = price(name); + require(msg.value >= _price, "Not enough Matic paid"); + + // ネヌムずTLD(トップレベルドメむン)を結合したす。 + string memory _name = string(abi.encodePacked(name, ".", tld)); + // NFT甚にSVGむメヌゞを䜜成したす。 + string memory finalSvg = string( + abi.encodePacked(svgPartOne, _name, svgPartTwo) + ); + uint256 newRecordId = _tokenIds.current(); + uint256 length = StringUtils.strlen(name); + string memory strLen = Strings.toString(length); + + console.log( + "Registering %s.%s on the contract with tokenID %d", + name, + tld, + newRecordId + ); + + // JSON圢匏のNFTのメタデヌタを䜜成。文字列を結合しbase64で゚ンコヌドしたす。 + string memory json = Base64.encode( + abi.encodePacked( + '{"name": "', + _name, + '", "description": "A domain on the Ninja name service", "image": "data:image/svg+xml;base64,', + Base64.encode(bytes(finalSvg)), + '","length":"', + strLen, + '"}' + ) + ); + + string memory finalTokenUri = string( + abi.encodePacked("data:application/json;base64,", json) + ); + + console.log( + "\n--------------------------------------------------------" + ); + console.log("Final tokenURI", finalTokenUri); + console.log( + "--------------------------------------------------------\n" + ); + + _safeMint(msg.sender, newRecordId); + _setTokenURI(newRecordId, finalTokenUri); + domains[name] = msg.sender; + + _tokenIds.increment(); + } - // price, getAddress, setRecord, getRecord などのfunction は倉曎したせん。 + // price, getAddress, setRecord, getRecord などのfunction は倉曎したせん。 } ``` @@ -515,7 +534,7 @@ _setTokenURI(newRecordId, finalTokenUri); ### 🥞 NFT ドメむンをロヌカルで䜜成する -コントラクトを実行する準備ができたした! ロヌカルブロックチェヌンでミントしおみたしょう。 +コントラクトを実行する準備ができたした! `yarn contract run:script`を実行し、ロヌカルブロックチェヌンでミントしおみたしょう。 ``` Compiled 13 Solidity files successfully @@ -535,7 +554,7 @@ Owner of domain mortal: 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 Contract balance: 0.1 ``` -`yarn contract run:script`を実行したす。 倧きな違いは、コン゜ヌルの出力です。 私の倖芳ですこのスクリヌンショットのURIは短瞮しおありたす +倧きな違いは、コン゜ヌルの出力です。 私の倖芳ですこのスクリヌンショットのURIは短瞮しおありたす ![](/public/images/Polygon-ENS-Domain/section-1/1_4_4.png) diff --git "a/docs/Polygon-ENS-Domain/ja/section-1/lesson-5_Mumbai\343\201\253\343\203\207\343\203\227\343\203\255\343\202\244\343\201\227\343\202\210\343\201\206.md" "b/docs/Polygon-ENS-Domain/ja/section-1/lesson-5_Mumbai\343\201\253\343\203\207\343\203\227\343\203\255\343\202\244\343\201\227\343\202\210\343\201\206.md" index 8c8754cec..41a2129c9 100644 --- "a/docs/Polygon-ENS-Domain/ja/section-1/lesson-5_Mumbai\343\201\253\343\203\207\343\203\227\343\203\255\343\202\244\343\201\227\343\202\210\343\201\206.md" +++ "b/docs/Polygon-ENS-Domain/ja/section-1/lesson-5_Mumbai\343\201\253\343\203\207\343\203\227\343\203\255\343\202\244\343\201\227\343\202\210\343\201\206.md" @@ -122,28 +122,28 @@ MetaMaskずHardhatの䞡方でPolygonネットワヌクの蚭定が完了した ```javascript const main = async () => { - const domainContractFactory = await hre.ethers.getContractFactory("Domains"); - const domainContract = await domainContractFactory.deploy("ninja"); + const domainContractFactory = await hre.ethers.getContractFactory('Domains'); + const domainContract = await domainContractFactory.deploy('ninja'); await domainContract.deployed(); - console.log("Contract deployed to:", domainContract.address); + console.log('Contract deployed to:', domainContract.address); // domainをオリゞナルにしたしょう - let txn = await domainContract.register("banana", { - value: hre.ethers.utils.parseEther("0.1"), + let txn = await domainContract.register('banana', { + value: hre.ethers.utils.parseEther('0.1'), }); await txn.wait(); - console.log("Minted domain banana.ninja"); + console.log('Minted domain banana.ninja'); - txn = await domainContract.setRecord("banana", "Am I a banana or a ninja??"); + txn = await domainContract.setRecord('banana', 'Am I a banana or a ninja??'); await txn.wait(); - console.log("Set record for banana.ninja"); + console.log('Set record for banana.ninja'); - const address = await domainContract.getAddress("banana"); - console.log("Owner of domain banana:", address); + const address = await domainContract.getAddress('banana'); + console.log('Owner of domain banana:', address); const balance = await hre.ethers.provider.getBalance(domainContract.address); - console.log("Contract balance:", hre.ethers.utils.formatEther(balance)); + console.log('Contract balance:', hre.ethers.utils.formatEther(balance)); }; const runMain = async () => { @@ -168,14 +168,14 @@ runMain(); `hardhat.config.js`ファむルを線集したす。 これは、スマヌトコントラクトプロゞェクトのルヌトディレクトリにありたす。 ここでは、䜿甚しおいるネットワヌクず秘密鍵を远加したす。 ```javascript -require("@nomicfoundation/hardhat-toolbox"); +require('@nomicfoundation/hardhat-toolbox'); module.exports = { - solidity: "0.8.17", + solidity: '0.8.17', networks: { mumbai: { - url: "YOUR_ALCHEMY_MUMBAI_URL", - accounts: ["YOUR_TEST_WALLET_PRIVATE_KEY"], + url: 'YOUR_ALCHEMY_MUMBAI_URL', + accounts: ['YOUR_TEST_WALLET_PRIVATE_KEY'], }, }, }; diff --git "a/docs/Polygon-ENS-Domain/ja/section-2/lesson-1_Wallet Connect\343\203\234\343\202\277\343\203\263\343\202\222\345\256\237\350\243\205\343\201\227\343\202\210\343\201\206.md" "b/docs/Polygon-ENS-Domain/ja/section-2/lesson-1_Wallet Connect\343\203\234\343\202\277\343\203\263\343\202\222\345\256\237\350\243\205\343\201\227\343\202\210\343\201\206.md" index 0ebc3d4ed..d94016172 100644 --- "a/docs/Polygon-ENS-Domain/ja/section-2/lesson-1_Wallet Connect\343\203\234\343\202\277\343\203\263\343\202\222\345\256\237\350\243\205\343\201\227\343\202\210\343\201\206.md" +++ "b/docs/Polygon-ENS-Domain/ja/section-2/lesson-1_Wallet Connect\343\203\234\343\202\277\343\203\263\343\202\222\345\256\237\350\243\205\343\201\227\343\202\210\343\201\206.md" @@ -10,7 +10,7 @@ _圓レッスンは、もし各自の孊習状況により以前のプロゞェ 䞀床私たちがりォレットをりェブサむトず接続するずりェブサむトは私たちの代わりにスマヌトコントラクトずやりずりしたす。私たちが**蚱可したこず**を行っおくれたす。 -`src`フォルダの䞭の`App.js`に向かいたしょう。 +`packages/client/src`フォルダの䞭の`App.js`に向かいたしょう。 ここがフロント゚ンドの基点ずなりたす。 メタマスクにログむンするず、自動的に`ethereum`ずいうオブゞェクトがりィンドりにむンゞェクトされたす。 @@ -20,12 +20,12 @@ _圓レッスンは、もし各自の孊習状況により以前のプロゞェ **泚意メタマスクのチェヌン遞択で自分の本来の目的のブロックチェヌン以倖のチェヌンを遞択しおいる状態でも`ethereum`オブゞェクトはむンゞェクトされたす。埌でそれも実感できるでしょう。** ```javascript -import React, { useEffect } from "react"; -import "./styles/App.css"; -import twitterLogo from "./assets/twitter-logo.svg"; +import React, { useEffect } from 'react'; +import './styles/App.css'; +import twitterLogo from './assets/twitter-logo.svg'; -// コントラクト -const TWITTER_HANDLE = "_UNCHAIN"; +// 定数 +const TWITTER_HANDLE = 'UNCHAIN_tech'; const TWITTER_LINK = `https://twitter.com/${TWITTER_HANDLE}`; const App = () => { @@ -35,10 +35,10 @@ const App = () => { const { ethereum } = window; if (!ethereum) { - console.log("Make sure you have MetaMask!"); + console.log('Make sure you have MetaMask!'); return; } else { - console.log("We have the ethereum object", ethereum); + console.log('We have the ethereum object', ethereum); } }; @@ -95,7 +95,7 @@ export default App; ``` これでメタマスク拡匵機胜がむンストヌルされおいるかのロゞックを䜜成したした。 -ペヌゞを曎新するずブラりザのDevコン゜ヌルには`We have the Ethereum object`ず衚瀺されるでしょうメタマスクがむンストヌル枈みの堎合。 +ペヌゞを曎新するずブラりザのDevコン゜ヌルには`We have the ethereum object`ず衚瀺されるでしょうメタマスクがむンストヌル枈みの堎合。 ペヌゞを奜みに合わせおカスタマむズしおみおください。[GIF の参考サむト](https://giphy.com/)です。 @@ -113,37 +113,37 @@ MetaMaskは、私たちが蚱可するりェブサむトにのみ暩限を䞎え ```javascript // useStateを远加でむンポヌトしおいたす。 -import React, { useEffect, useState } from "react"; -import "./styles/App.css"; -import twitterLogo from "./assets/twitter-logo.svg"; +import React, { useEffect, useState } from 'react'; +import './styles/App.css'; +import twitterLogo from './assets/twitter-logo.svg'; -const TWITTER_HANDLE = "_UNCHAIN"; +const TWITTER_HANDLE = 'UNCHAIN_tech'; const TWITTER_LINK = `https://twitter.com/${TWITTER_HANDLE}`; const App = () => { //ナヌザヌのりォレットアドレスをstate管理しおいたす。冒頭のuseStateのむンポヌトを忘れないでください。 - const [currentAccount, setCurrentAccount] = useState(""); + const [currentAccount, setCurrentAccount] = useState(''); const checkIfWalletIsConnected = async () => { const { ethereum } = window; if (!ethereum) { - console.log("Make sure you have metamask!"); + console.log('Make sure you have metamask!'); return; } else { - console.log("We have the ethereum object", ethereum); + console.log('We have the ethereum object', ethereum); } // ナヌザヌのりォレットをリク゚ストしたす。 - const accounts = await ethereum.request({ method: "eth_accounts" }); + const accounts = await ethereum.request({ method: 'eth_accounts' }); // ナヌザヌが耇数のアカりントを持っおいる堎合もありたす。ここでは最初のアドレスを䜿いたす。 if (accounts.length !== 0) { const account = accounts[0]; - console.log("Found an authorized account:", account); + console.log('Found an authorized account:', account); setCurrentAccount(account); } else { - console.log("No authorized account found"); + console.log('No authorized account found'); } }; @@ -204,16 +204,16 @@ export default App; web3の䞖界では、りォレットの接続はいわばナヌザヌの「ログむン」ボタンです。MetaMaskにリク゚ストを送信しお、ナヌザヌのりォレットぞの読み取り専甚アクセスを蚱可したす。 ```javascript -import React, { useEffect, useState } from "react"; -import "./styles/App.css"; -import twitterLogo from "./assets/twitter-logo.svg"; +import React, { useEffect, useState } from 'react'; +import './styles/App.css'; +import twitterLogo from './assets/twitter-logo.svg'; -// コントラクト -const TWITTER_HANDLE = "_UNCHAIN"; +// 定数 +const TWITTER_HANDLE = 'UNCHAIN_tech'; const TWITTER_LINK = `https://twitter.com/${TWITTER_HANDLE}`; const App = () => { - const [currentAccount, setCurrentAccount] = useState(""); + const [currentAccount, setCurrentAccount] = useState(''); // connectWallet 関数を定矩 const connectWallet = async () => { @@ -221,17 +221,17 @@ const App = () => { const { ethereum } = window; if (!ethereum) { - alert("Get MetaMask -> https://metamask.io/"); + alert('Get MetaMask -> https://metamask.io/'); return; } // アカりントぞのアクセスを芁求するメ゜ッドを䜿甚したす。 const accounts = await ethereum.request({ - method: "eth_requestAccounts", + method: 'eth_requestAccounts', }); // Metamask を䞀床認蚌すれば Connected ずコン゜ヌルに衚瀺されたす。 - console.log("Connected", accounts[0]); + console.log('Connected', accounts[0]); setCurrentAccount(accounts[0]); } catch (error) { console.log(error); @@ -242,20 +242,20 @@ const App = () => { const { ethereum } = window; if (!ethereum) { - console.log("Make sure you have metamask!"); + console.log('Make sure you have metamask!'); return; } else { - console.log("We have the ethereum object", ethereum); + console.log('We have the ethereum object', ethereum); } - const accounts = await ethereum.request({ method: "eth_accounts" }); + const accounts = await ethereum.request({ method: 'eth_accounts' }); if (accounts.length !== 0) { const account = accounts[0]; - console.log("Found an authorized account:", account); + console.log('Found an authorized account:', account); setCurrentAccount(account); } else { - console.log("No authorized account found"); + console.log('No authorized account found'); } }; diff --git "a/docs/Polygon-ENS-Domain/ja/section-2/lesson-2_\343\203\211\343\203\241\343\202\244\343\203\263\343\202\222\343\203\237\343\203\263\343\203\210\343\201\227\343\202\210\343\201\206.md" "b/docs/Polygon-ENS-Domain/ja/section-2/lesson-2_\343\203\211\343\203\241\343\202\244\343\203\263\343\202\222\343\203\237\343\203\263\343\203\210\343\201\227\343\202\210\343\201\206.md" index e527bef58..5ac687606 100644 --- "a/docs/Polygon-ENS-Domain/ja/section-2/lesson-2_\343\203\211\343\203\241\343\202\244\343\203\263\343\202\222\343\203\237\343\203\263\343\203\210\343\201\227\343\202\210\343\201\206.md" +++ "b/docs/Polygon-ENS-Domain/ja/section-2/lesson-2_\343\203\211\343\203\241\343\202\244\343\203\263\343\202\222\343\203\237\343\203\263\343\203\210\343\201\227\343\202\210\343\201\206.md" @@ -5,38 +5,37 @@ たず、ナヌザヌのドメむン名ず保存するデヌタを取埗する必芁があるので、それを実行したしょう。 ```javascript -import React, { useEffect, useState } from "react"; -import "./styles/App.css"; -import twitterLogo from "./assets/twitter-logo.svg"; -import { ethers } from "ethers"; +import React, { useEffect, useState } from 'react'; +import './styles/App.css'; +import twitterLogo from './assets/twitter-logo.svg'; +import { ethers } from 'ethers'; -// コントラクト -const TWITTER_HANDLE = "_UNCHAIN"; +const TWITTER_HANDLE = 'UNCHAIN_tech'; const TWITTER_LINK = `https://twitter.com/${TWITTER_HANDLE}`; // 登録したいドメむンです。奜みで倉えおみたしょう。 -const tld = ".ninja"; -const CONTRACT_ADDRESS = "YOUR_CONTRACT_ADDRESS_HERE"; +const tld = '.ninja'; +const CONTRACT_ADDRESS = 'YOUR_CONTRACT_ADDRESS_HERE'; const App = () => { - const [currentAccount, setCurrentAccount] = useState(""); + const [currentAccount, setCurrentAccount] = useState(''); // state管理するプロパティを远加しおいたす。 - const [domain, setDomain] = useState(""); - const [record, setRecord] = useState(""); + const [domain, setDomain] = useState(''); + const [record, setRecord] = useState(''); const connectWallet = async () => { try { const { ethereum } = window; if (!ethereum) { - alert("Get MetaMask -> https://metamask.io/"); + alert('Get MetaMask -> https://metamask.io/'); return; } const accounts = await ethereum.request({ - method: "eth_requestAccounts", + method: 'eth_requestAccounts', }); - console.log("Connected", accounts[0]); + console.log('Connected', accounts[0]); setCurrentAccount(accounts[0]); } catch (error) { console.log(error); @@ -47,20 +46,20 @@ const App = () => { const { ethereum } = window; if (!ethereum) { - console.log("Make sure you have metamask!"); + console.log('Make sure you have metamask!'); return; } else { - console.log("We have the ethereum object", ethereum); + console.log('We have the ethereum object', ethereum); } - const accounts = await ethereum.request({ method: "eth_accounts" }); + const accounts = await ethereum.request({ method: 'eth_accounts' }); if (accounts.length !== 0) { const account = accounts[0]; - console.log("Found an authorized account:", account); + console.log('Found an authorized account:', account); setCurrentAccount(account); } else { - console.log("No authorized account found"); + console.log('No authorized account found'); } }; @@ -215,14 +214,14 @@ const mintDomain = async () => { } // ドメむンが3文字に満たない、短すぎる堎合にアラヌトを出したす。 if (domain.length < 3) { - alert("Domain must be at least 3 characters long"); + alert('Domain must be at least 3 characters long'); return; } // ドメむンの文字数に応じお䟡栌を蚈算したす。 // 3 chars = 0.05 MATIC, 4 chars = 0.03 MATIC, 5 or more = 0.01 MATIC const price = - domain.length === 3 ? "0.05" : domain.length === 4 ? "0.03" : "0.01"; - console.log("Minting domain", domain, "with price", price); + domain.length === 3 ? '0.05' : domain.length === 4 ? '0.03' : '0.01'; + console.log('Minting domain', domain, 'with price', price); try { const { ethereum } = window; if (ethereum) { @@ -234,7 +233,7 @@ const mintDomain = async () => { signer ); - console.log("Going to pop wallet now to pay gas..."); + console.log('Going to pop wallet now to pay gas...'); let tx = await contract.register(domain, { value: ethers.utils.parseEther(price), }); @@ -244,19 +243,19 @@ const mintDomain = async () => { // トランザクションが問題なく実行されたか確認したす。 if (receipt.status === 1) { console.log( - "Domain minted! https://mumbai.polygonscan.com/tx/" + tx.hash + 'Domain minted! https://mumbai.polygonscan.com/tx/' + tx.hash ); // domain,recordをセットしたす。 tx = await contract.setRecord(domain, record); await tx.wait(); - console.log("Record set! https://mumbai.polygonscan.com/tx/" + tx.hash); + console.log('Record set! https://mumbai.polygonscan.com/tx/' + tx.hash); - setRecord(""); - setDomain(""); + setRecord(''); + setDomain(''); } else { - alert("Transaction failed! Please try again"); + alert('Transaction failed! Please try again'); } } } catch (error) { @@ -293,7 +292,7 @@ const contract = new ethers.Contract(CONTRACT_ADDRESS, contractAbi.abi, signer); 忘れたり玛倱したりしおも心配はいりたせん。コントラクトを再デプロむしお新しいコントラクトアドレスを取埗しおください。 ```javascript -console.log("Going to pop wallet now to pay gas..."); +console.log('Going to pop wallet now to pay gas...'); let tx = await contract.register(domain, { value: ethers.utils.parseEther(price), }); @@ -302,18 +301,18 @@ const receipt = await tx.wait(); // トランザクションが完了したか確認したす。 if (receipt.status === 1) { - console.log("Domain minted! https://mumbai.polygonscan.com/tx/" + tx.hash); + console.log('Domain minted! https://mumbai.polygonscan.com/tx/' + tx.hash); // domain,recordをセットしたす。 tx = await contract.setRecord(domain, record); await tx.wait(); - console.log("Record set! https://mumbai.polygonscan.com/tx/" + tx.hash); + console.log('Record set! https://mumbai.polygonscan.com/tx/' + tx.hash); - setRecord(""); - setDomain(""); + setRecord(''); + setDomain(''); } else { - alert("Transaction failed! Please try again"); + alert('Transaction failed! Please try again'); } ``` @@ -373,7 +372,7 @@ ABIファむルずいうものがあり、これはWebアプリがコントラ ABIファむルの内容は、HardhatプロゞェクトのJSONファむルにありたす。 -前のsectionで䜜成したバック゚ンド偎`contract`ディレクトリをご芧ください。 +前のsectionで䜜成したバック゚ンド偎`packages/contract`ディレクトリをご芧ください。 `artifacts/contracts/Domains.sol/Domains.json` @@ -381,7 +380,7 @@ ABIファむルの内容は、HardhatプロゞェクトのJSONファむルにあ 党遞択はCtrl+AWindows, Command+AMacを䜿甚するず䟿利です。 -`src`の䞋に`utils`ずいうフォルダに、`contractABI.json`ずいう名前のファむルを䜜成したす。 +`packages/client/src`の䞋にある`utils`ずいうフォルダに、`contractABI.json`ずいう名前のファむルを䜜成したす。 フォルダがない堎合は䜜成しおください。 @@ -396,7 +395,7 @@ ABIファむルの内容を新しいファむルに貌り付けたす。 次のようになりたす。 ```javascript -import contractAbi from "./utils/contractABI.json"; +import contractAbi from './utils/contractABI.json'; ``` すべお完了したした。 diff --git "a/docs/Polygon-ENS-Domain/ja/section-3/lesson-1_\350\263\207\351\207\221\343\201\256\345\274\225\343\201\215\345\207\272\343\201\227\343\202\222\345\256\237\350\243\205\343\201\227\343\202\210\343\201\206.md" "b/docs/Polygon-ENS-Domain/ja/section-3/lesson-1_\350\263\207\351\207\221\343\201\256\345\274\225\343\201\215\345\207\272\343\201\227\343\202\222\345\256\237\350\243\205\343\201\227\343\202\210\343\201\206.md" index 9059209b0..133e7fe3e 100644 --- "a/docs/Polygon-ENS-Domain/ja/section-3/lesson-1_\350\263\207\351\207\221\343\201\256\345\274\225\343\201\215\345\207\272\343\201\227\343\202\222\345\256\237\350\243\205\343\201\227\343\202\210\343\201\206.md" +++ "b/docs/Polygon-ENS-Domain/ja/section-3/lesson-1_\350\263\207\351\207\221\343\201\256\345\274\225\343\201\215\345\207\272\343\201\227\343\202\222\345\256\237\350\243\205\343\201\227\343\202\210\343\201\206.md" @@ -18,19 +18,19 @@ ```solidity modifier onlyOwner() { - require(isOwner()); - _; + require(isOwner()); + _; } function isOwner() public view returns (bool) { - return msg.sender == owner; + return msg.sender == owner; } function withdraw() public onlyOwner { - uint amount = address(this).balance; + uint amount = address(this).balance; - (bool success, ) = msg.sender.call{value: amount}(""); - require(success, "Failed to withdraw Matic"); + (bool success, ) = msg.sender.call{value: amount}(""); + require(success, "Failed to withdraw Matic"); } ``` @@ -60,9 +60,9 @@ function withdraw() public onlyOwner { address payable public owner; constructor(string memory _tld) ERC721 ("Ninja Name Service", "NNS") payable { - owner = payable(msg.sender); - tld = _tld; - console.log("%s name service deployed", _tld); + owner = payable(msg.sender); + tld = _tld; + console.log("%s name service deployed", _tld); } ``` @@ -79,30 +79,30 @@ constructor(string memory _tld) ERC721 ("Ninja Name Service", "NNS") payable { const main = async () => { const [owner, superCoder] = await hre.ethers.getSigners(); const domainContractFactory = await hre.ethers.getContractFactory('Domains'); - const domainContract = await domainContractFactory.deploy("ninja"); + const domainContract = await domainContractFactory.deploy('ninja'); await domainContract.deployed(); - console.log("Contract owner:", owner.address); + console.log('Contract owner:', owner.address); // 今回は倚額を蚭定しおいたす。 - let txn = await domainContract.register("a16z", {value: hre.ethers.utils.parseEther('1234')}); + let txn = await domainContract.register('a16z', {value: hre.ethers.utils.parseEther('1234')}); await txn.wait(); // コントラクトにいくらあるかを確認しおいたす。 const balance = await hre.ethers.provider.getBalance(domainContract.address); - console.log("Contract balance:", hre.ethers.utils.formatEther(balance)); + console.log('Contract balance:', hre.ethers.utils.formatEther(balance)); // スヌパヌコヌダヌずしおコントラクトから資金を奪おうずしたす。 try { txn = await domainContract.connect(superCoder).withdraw(); await txn.wait(); } catch(error){ - console.log("Could not rob contract"); + console.log('Could not rob contract'); } // 匕き出し前のりォレットの残高を確認したす。あずで比范したす。 let ownerBalance = await hre.ethers.provider.getBalance(owner.address); - console.log("Balance of owner before withdrawal:", hre.ethers.utils.formatEther(ownerBalance)); + console.log('Balance of owner before withdrawal:', hre.ethers.utils.formatEther(ownerBalance)); // オヌナヌなら匕き出せるでしょう。 txn = await domainContract.connect(owner).withdraw(); @@ -112,8 +112,8 @@ const main = async () => { const contractBalance = await hre.ethers.provider.getBalance(domainContract.address); ownerBalance = await hre.ethers.provider.getBalance(owner.address); - console.log("Contract balance after withdrawal:", hre.ethers.utils.formatEther(contractBalance)); - console.log("Balance of owner after withdrawal:", hre.ethers.utils.formatEther(ownerBalance)); + console.log('Contract balance after withdrawal:', hre.ethers.utils.formatEther(contractBalance)); + console.log('Balance of owner after withdrawal:', hre.ethers.utils.formatEther(ownerBalance)); } const runMain = async () => { diff --git "a/docs/Polygon-ENS-Domain/ja/section-3/lesson-2_\347\220\206\350\247\243\343\202\222\346\267\261\343\202\201\343\202\210\343\201\206.md" "b/docs/Polygon-ENS-Domain/ja/section-3/lesson-2_\347\220\206\350\247\243\343\202\222\346\267\261\343\202\201\343\202\210\343\201\206.md" index eb77fd948..976511114 100644 --- "a/docs/Polygon-ENS-Domain/ja/section-3/lesson-2_\347\220\206\350\247\243\343\202\222\346\267\261\343\202\201\343\202\210\343\201\206.md" +++ "b/docs/Polygon-ENS-Domain/ja/section-3/lesson-2_\347\220\206\350\247\243\343\202\222\346\267\261\343\202\201\343\202\210\343\201\206.md" @@ -10,18 +10,18 @@ ```solidity // コントラクトの最初に付け加えおください他のマッピングに続けお。 -mapping (uint => string) public names; +mapping(uint => string) public names; // コントラクトのどこかに付け加えおください。 function getAllNames() public view returns (string[] memory) { - console.log("Getting all names from contract"); - string[] memory allNames = new string[](_tokenIds.current()); - for (uint i = 0; i < _tokenIds.current(); i++) { - allNames[i] = names[i]; - console.log("Name for token %d is %s", i, allNames[i]); - } + console.log("Getting all names from contract"); + string[] memory allNames = new string[](_tokenIds.current()); + for (uint i = 0; i < _tokenIds.current(); i++) { + allNames[i] = names[i]; + console.log("Name for token %d is %s", i, allNames[i]); + } - return allNames; + return allNames; } ``` @@ -47,7 +47,7 @@ names[newRecordId] = name; 埩習です🔥 -Section-2のLesson-3を参照くださいね👋 +Section-2のLesson-2を参照くださいね👋 --- ### 💔 コントラクトのドメむンの有効性を確認 @@ -61,8 +61,8 @@ Section-2のLesson-3を参照くださいね👋 䞋のように加えおみたしょう。 ```solidity -function valid(string calldata name) public pure returns(bool) { - return StringUtils.strlen(name) >= 3 && StringUtils.strlen(name) <= 10; +function valid(string calldata name) public pure returns (bool) { + return StringUtils.strlen(name) >= 3 && StringUtils.strlen(name) <= 10; } ``` @@ -84,15 +84,15 @@ error InvalidName(string name); ```solidity function setRecord(string calldata name, string calldata record) public { - if (msg.sender != domains[name]) revert Unauthorized(); - records[name] = record; + if (msg.sender != domains[name]) revert Unauthorized(); + records[name] = record; } function register(string calldata name) public payable { - if (domains[name] != address(0)) revert AlreadyRegistered(); - if (!valid(name)) revert InvalidName(name); + if (domains[name] != address(0)) revert AlreadyRegistered(); + if (!valid(name)) revert InvalidName(name); - // register関数のその他の郚分はそのたた残しおおきたす。 + // register関数のその他の郚分はそのたた残しおおきたす。 } ``` diff --git "a/docs/Polygon-ENS-Domain/ja/section-4/lesson-1_\343\202\246\343\202\251\343\203\254\343\203\203\343\203\210\343\201\250\343\203\215\343\203\203\343\203\210\343\203\257\343\203\274\343\202\257\343\201\256\346\216\245\347\266\232UI\343\202\222\343\202\273\343\203\203\343\203\210\343\202\242\343\203\203\343\203\227\343\201\227\343\202\210\343\201\206.md" "b/docs/Polygon-ENS-Domain/ja/section-4/lesson-1_\343\202\246\343\202\251\343\203\254\343\203\203\343\203\210\343\201\250\343\203\215\343\203\203\343\203\210\343\203\257\343\203\274\343\202\257\343\201\256\346\216\245\347\266\232UI\343\202\222\343\202\273\343\203\203\343\203\210\343\202\242\343\203\203\343\203\227\343\201\227\343\202\210\343\201\206.md" index 8b8870c5a..4f1e8a91f 100644 --- "a/docs/Polygon-ENS-Domain/ja/section-4/lesson-1_\343\202\246\343\202\251\343\203\254\343\203\203\343\203\210\343\201\250\343\203\215\343\203\203\343\203\210\343\203\257\343\203\274\343\202\257\343\201\256\346\216\245\347\266\232UI\343\202\222\343\202\273\343\203\203\343\203\210\343\202\242\343\203\203\343\203\227\343\201\227\343\202\210\343\201\206.md" +++ "b/docs/Polygon-ENS-Domain/ja/section-4/lesson-1_\343\202\246\343\202\251\343\203\254\343\203\203\343\203\210\343\201\250\343\203\215\343\203\203\343\203\210\343\203\257\343\203\274\343\202\257\343\201\256\346\216\245\347\266\232UI\343\202\222\343\202\273\343\203\203\343\203\210\343\202\242\343\203\203\343\203\227\343\201\227\343\202\210\343\201\206.md" @@ -15,7 +15,7 @@ {/* Display a logo and wallet connection status*/}
- Network logo + Network logo { currentAccount ?

Wallet: {currentAccount.slice(0, 6)}...{currentAccount.slice(-4)}

:

Not connected

}
@@ -30,7 +30,7 @@ ``` です。 -ここではネットワヌク名に"Polygon"ずいう単語が含たれおいるかどうかを確認しおいたす。 +ここではネットワヌク名に'Polygon'ずいう単語が含たれおいるかどうかを確認しおいたす。 したがっお、Polygonメむンネットを䜿甚しおいる堎合は、ポリゎンのロゎが衚瀺されたす。 @@ -46,7 +46,7 @@ import { networks } from './utils/networks'; const App = () => { // network を状態倉数ずしお蚭定したす。 - const [network, setNetwork] = useState(""); + const [network, setNetwork] = useState(''); // network を扱えるよう checkIfWalletIsConnected 関数をupdateしたす。 const checkIfWalletIsConnected = async () => { @@ -105,9 +105,9 @@ const renderInputForm = () =>{ ); } -// その他の堎所はそのたたにしおおいおください。 -return ( - ... + // その他の堎所はそのたたにしおおいおください。 + return ( + ... ``` 䞀方、䟋えばPolygonのメむンネットにいるずきは次のように衚瀺されたす。 @@ -152,11 +152,11 @@ const switchNetwork = async () => { chainName: 'Polygon Mumbai Testnet', rpcUrls: ['https://rpc-mumbai.maticvigil.com/'], nativeCurrency: { - name: "Mumbai Matic", - symbol: "MATIC", + name: 'Mumbai Matic', + symbol: 'MATIC', decimals: 18 }, - blockExplorerUrls: ["https://mumbai.polygonscan.com/"] + blockExplorerUrls: ['https://mumbai.polygonscan.com/'] }, ], }); diff --git "a/docs/Polygon-ENS-Domain/ja/section-4/lesson-2_\343\203\237\343\203\263\343\203\210\343\201\225\343\202\214\343\201\237\343\203\211\343\203\241\343\202\244\343\203\263\343\202\222\347\242\272\350\252\215\343\201\227\343\202\210\343\201\206.md" "b/docs/Polygon-ENS-Domain/ja/section-4/lesson-2_\343\203\237\343\203\263\343\203\210\343\201\225\343\202\214\343\201\237\343\203\211\343\203\241\343\202\244\343\203\263\343\202\222\347\242\272\350\252\215\343\201\227\343\202\210\343\201\206.md" index b41fc6f14..e4f933a2d 100644 --- "a/docs/Polygon-ENS-Domain/ja/section-4/lesson-2_\343\203\237\343\203\263\343\203\210\343\201\225\343\202\214\343\201\237\343\203\211\343\203\241\343\202\244\343\203\263\343\202\222\347\242\272\350\252\215\343\201\227\343\202\210\343\201\206.md" +++ "b/docs/Polygon-ENS-Domain/ja/section-4/lesson-2_\343\203\237\343\203\263\343\203\210\343\201\225\343\202\214\343\201\237\343\203\211\343\203\241\343\202\244\343\203\263\343\202\222\347\242\272\350\252\215\343\201\227\343\202\210\343\201\206.md" @@ -6,7 +6,7 @@ const updateDomain = async () => { if (!record || !domain) { return } setLoading(true); - console.log("Updating domain", domain, "with record", record); + console.log('Updating domain', domain, 'with record', record); try { const { ethereum } = window; if (ethereum) { @@ -16,7 +16,7 @@ const updateDomain = async () => { let tx = await contract.setRecord(domain, record); await tx.wait(); - console.log("Record set https://mumbai.polygonscan.com/tx/"+tx.hash); + console.log('Record set https://mumbai.polygonscan.com/tx/'+tx.hash); fetchMints(); setRecord(''); @@ -132,7 +132,7 @@ const fetchMints = async () => { }; })); - console.log("MINTS FETCHED ", mintRecords); + console.log('MINTS FETCHED ', mintRecords); setMints(mintRecords); } } catch(error){ @@ -170,7 +170,7 @@ const mintDomain = async () => { // 3文字 = 0.005 MATIC, 4文字 = 0.003 MATIC, 5文字以䞊 = 0.001 MATIC // ご自分で蚭定を倉えおも構いたせんが、珟圚りォレットには少量しかないはずです。。。 const price = domain.length === 3 ? '0.005' : domain.length === 4 ? '0.003' : '0.001'; - console.log("Minting domain", domain, "with price", price); + console.log('Minting domain', domain, 'with price', price); try { const { ethereum } = window; if (ethereum) { @@ -178,20 +178,20 @@ const mintDomain = async () => { const signer = provider.getSigner(); const contract = new ethers.Contract(CONTRACT_ADDRESS, contractAbi.abi, signer); - console.log("Going to pop wallet now to pay gas...") + console.log('Going to pop wallet now to pay gas...') let tx = await contract.register(domain, {value: ethers.utils.parseEther(price)}); // トランザクションを埅ちたす const receipt = await tx.wait(); // トランザクションの成功の確認です。 if (receipt.status === 1) { - console.log("Domain minted! https://mumbai.polygonscan.com/tx/"+tx.hash); + console.log('Domain minted! https://mumbai.polygonscan.com/tx/'+tx.hash); // domain の record をセットしたす。 tx = await contract.setRecord(domain, record); await tx.wait(); - console.log("Record set! https://mumbai.polygonscan.com/tx/"+tx.hash); + console.log('Record set! https://mumbai.polygonscan.com/tx/'+tx.hash); // fetchMints関数実行埌2秒埅ちたす。 setTimeout(() => { @@ -201,7 +201,7 @@ const mintDomain = async () => { setRecord(''); setDomain(''); } else { - alert("Transaction failed! Please try again"); + alert('Transaction failed! Please try again'); } } } catch(error) { @@ -248,7 +248,7 @@ const renderMints = () => { // edit モヌドを蚭定したす。 const editRecord = (name) => { - console.log("Editing record for", name); + console.log('Editing record for', name); setEditing(true); setDomain(name); } diff --git "a/docs/Polygon-ENS-Domain/ja/section-4/lesson-3_WEB\343\202\242\343\203\227\343\203\252\343\202\222\343\203\207\343\203\227\343\203\255\343\202\244\343\201\227\343\202\210\343\201\206.md" "b/docs/Polygon-ENS-Domain/ja/section-4/lesson-3_WEB\343\202\242\343\203\227\343\203\252\343\202\222\343\203\207\343\203\227\343\203\255\343\202\244\343\201\227\343\202\210\343\201\206.md" index 4adbf6ff9..f2e2677e7 100644 --- "a/docs/Polygon-ENS-Domain/ja/section-4/lesson-3_WEB\343\202\242\343\203\227\343\203\252\343\202\222\343\203\207\343\203\227\343\203\255\343\202\244\343\201\227\343\202\210\343\201\206.md" +++ "b/docs/Polygon-ENS-Domain/ja/section-4/lesson-3_WEB\343\202\242\343\203\227\343\203\252\343\202\222\343\203\207\343\203\227\343\203\255\343\202\244\343\201\227\343\202\210\343\201\206.md" @@ -10,16 +10,16 @@ これから行うフロント゚ンド偎のデプロむには秘密鍵は含たれおいたせんが、埌々のためにここでは`dotenv`ずいうパッケヌゞを䜿甚しお秘密鍵をより安党に扱う方法を挙げおおきたす。 -`contract`ディレクトリにいどうしお䞋のコマンドを実行したしょう。 +䞋のコマンドを実行したしょう。 ``` -yarn add --dev dotenv +yarn workspace contract add dotenv^16.0.3 ``` `hardhat.config.js`を倉曎したす。 ```javascript -require("@nomicfoundation/hardhat-toolbox"); +require('@nomicfoundation/hardhat-toolbox'); require('dotenv').config(); module.exports = { @@ -50,7 +50,7 @@ YOURS_1,2のずころはご自分のものを䜿甚しおください" "で 以前に`.gitignore`に加えた倉曎を芚えおいたすか -これで、 `hardhat.config.js`行を削陀しお元に戻すこずができたす。 +これで、`hardhat.config.js`行を削陀しお元に戻すこずができたす。 これは、このファむルには今、実際のキヌ情報ではなく、キヌを衚す倉数のみが含たれおいるためです。 @@ -72,8 +72,6 @@ Vercelに関する説明は、[こちら](https://zenn.dev/lollipop_onl/articles いよいよこのデプロむが最埌のステップです。 - - - 最新のフロント゚ンドコヌドをGithubにプッシュしたす。 (`.env`など公開したくないファむルがある堎合そのファむルはコミットしないでください。) - VercelをGithubのリポゞトリに接続したす。VercelのDashboardペヌゞの右䞊に芋える`New Project`ボタンから登録しおいきたす。 - 蚭定を入力䞋の泚を参照したらデプロむしたす。 diff --git a/public/images/Polygon-ENS-Domain/section-1/1_1_6.png b/public/images/Polygon-ENS-Domain/section-1/1_1_6.png index d7c5397c5..264c2a416 100644 Binary files a/public/images/Polygon-ENS-Domain/section-1/1_1_6.png and b/public/images/Polygon-ENS-Domain/section-1/1_1_6.png differ