Titres Titres
Passons maintenant à la frappe NFT !
Étape 1 : Obtenez un faux MATIC
Comme les transactions blockchain sont liées aux frais de gaz, nous devons collecter de faux MATIC pour frapper notre NFT.
Obtenez du faux MATIC à partir d’ici : https://faucet.polygon.technology/.
Autres robinets MATIC disponibles :
- https://faucet.pearzap.com/
- https://matic.supply/
- https://www.coinclarified.com/tools/faucets/polygon
- https://faucet.firebird.finance/
Étape 2 : Créer un fichier .env
Le fichier .env doit contenir les détails suivants :
API_URL = “your alchemy URL"PRIVATE_KEY = “metamask private key”PUBLIC_KEY = “your metamask wallet address”CONTRACT_ADDRESS =”deployed contract address"PINATA_API_KEY = “pinata api key”PINATA_SECRET_KEY = “pinata secret key”
Étape 3 : Créez votre fichier nft.js
Copiez le contenu suivant dans le fichier.
require("dotenv").config();
const fs = require("fs");
const FormData = require("form-data");
const axios = require("axios");
const { ethers } = require("ethers");//Grab the contract ABI
const contract = require("../artifacts/contracts/ArGram.sol/ArGram.json");const {
PINATA_API_KEY,
PINATA_SECRET_KEY,
API_URL,
PRIVATE_KEY,
PUBLIC_KEY,
CONTRACT_ADDRESS
} = process.env;
Tout d’abord, assurez-vous d’avoir authentifié avec succès l’API Pinata.
const authResponse = await axios.get("https://api.pinata.cloud/data/testAuthentication", {
headers: {
pinata_api_key: PINATA_API_KEY,
pinata_secret_api_key: PINATA_SECRET_KEY,
},
});
Ton authResponse doit contenir un message du type « Toutes nos félicitations! Vous communiquez avec l’API Pinata !”.
Maintenant, lisez le fichier image à partir de votre système local.
const stream = fs.createReadStream(req.file.path);
const data = new FormData();
data.append(“file”, stream);
Télécharger le fichier image sur IPFS en utilisant pinFichier API. En cas de succès, il renverra un hashcode.
const fileResponse = await axios.post("https://api.pinata.cloud/pinning/pinFileToIPFS", data, {
headers: {
“Content-Type”: `multipart/form-data; boundary= ${data._boundary}`,
pinata_api_key: PINATA_API_KEY,
pinata_secret_api_key: PINATA_SECRET_KEY,
},
});
const { data: fileData = {} } = fileResponse;
const { IpfsHash } = fileData;
const fileIPFS= `https://gateway.pinata.cloud/ipfs/${IpfsHash}`;
Ton fichierIPFS devrait être comme https://gateway.pinata.cloud/ipfs/
par exemple : https://gateway.pinata.cloud/ipfs/QmeK8t9Lom2AcH8s7gLpuZordcxisegwkcSJpqL46S87uC
Nous pouvons maintenant télécharger les métadonnées JSON sur IPFS en utilisant pinJSON API. En cas de succès, il renverra un code de hachage que nous utiliserons comme URI de jeton à frapper.
//Create NFT metadata JSON
const metadata = {
image: https://gateway.pinata.cloud/ipfs/QmeK8t9Lom2AcH8s7gLpuZordcxisegwkcSJpqL46S87uC",
name: "MyArGramNFT",
description: "MyArGramNFT Description",
attributes: [
{ "trait_type": "color", "value": "brown"},
{ "trait_type": "background", "value": "white"}
]
}const pinataJSONBody = {
pinataContent: metadata
};
const jsonResponse = await axios.post("https://api.pinata.cloud/pinning/pinJSONToIPFS", pinataJSONBody, {
headers: {
“Content-Type”: `application/json`,
pinata_api_key: PINATA_API_KEY,
pinata_secret_api_key: PINATA_SECRET_KEY,
},
});
const { data: jsonData = {} } = jsonResponse;
const { IpfsHash } = jsonData;
const tokenURI = `https://gateway.pinata.cloud/ipfs/${IpfsHash}`;
Votre tokenURI devrait ressembler à https://gateway.pinata.cloud/ipfs/
par exemple : https://gateway.pinata.cloud/ipfs/QmammqqQDpmk4oAuyfgJA9Ni7ChEzxEkmzQLLhjbGAKHax
Enfin, nous pouvons créer notre URI de jeton que nous avons obtenu du téléchargement IPFS json. Appeler le mentheNFT méthode que nous avons écrite dans notre contrat intelligent. Reportez-vous au contrat intelligent ci-dessous :
Utilisez votre clé privée pour signer la transaction.
const provider = new ethers.providers.JsonRpcProvider(API_URL);
const wallet = new ethers.Wallet(PRIVATE_KEY, provider);
const etherInterface = new ethers.utils.Interface(contract.abi);// Get latest nonce
const nonce = await provider.getTransactionCount(PUBLIC_KEY, "latest");// Get gas price
const gasPrice = await provider.getGasPrice();// Get network
const network = await provider.getNetwork();
const { chainId } = network;//Transaction object
const transaction = {
from: PUBLIC_KEY,
to: CONTRACT_ADDRESS,
nonce,
chainId,
gasPrice,
data: etherInterface.encodeFunctionData("mintNFT",
[ PUBLIC_KEY, tokenURI ])
};//Estimate gas limit
const estimatedGas = await provider.estimateGas(transaction);
transaction["gasLimit"] = estimatedGas;//Sign & Send transaction
const signedTx = await wallet.signTransaction(transaction);
const transactionReceipt = await provider.sendTransaction(signedTx);
await transactionReceipt.wait();
const hash = transactionReceipt.hash;
console.log("Your Transaction Hash is:", hash);// Get transaction receipt
const receipt = await provider.getTransactionReceipt(hash);
const { logs } = receipt;// Get token ID
const tokenInBigNumber = ethers.BigNumber.from(logs[0].topics[3]);
const tokenId = tokenInBigNumber.toNumber();
console.log("Token ID minted:", tokenId);
Vous obtiendrez une réponse du type :
Your Transaction Hash is: 0x9732ca53cfb6b8e29e13873b51407f431bc798cbe3abe82ea110c0e5924506c8 Token ID minted: 1
Vous pouvez rechercher ce hachage de transaction sur mumbai polygonscan.
Génial! Vous avez créé avec succès votre premier NFT sur Polygon Mumbai Testnet.