वेब3 डीएपी विकास के लिए तकनीकी स्टैक को समझने से, आपने वेब3 डीएपी विकास के लिए कोर तकनीकी स्टैक, डीएपी विकास में आरपीसी की भूमिका और खाता बनाने, एपीआई कुंजी, एंडपॉइंट्स, एंडपॉइंट्स एनालिटिक्स बनाने, अपने डीआरपीसी खाते में धनराशि जोड़ने और अपनी शेष राशि की जांच करने के लिए डीआरपीसी का उपयोग कैसे करें, यह सीखा होगा।
स्मार्ट कॉन्ट्रैक्ट्स को तैनात करने में dRPC की भूमिका एथेरियम नोड स्थापित करने की प्रक्रिया को सरल बनाना है, जिससे डेवलपर्स के लिए कोड की सिर्फ एक पंक्ति के साथ बातचीत और तैनाती करना आसान हो जाता है।
इस लेख में, आप dRPC एंडपॉइंट और API कुंजी का उपयोग करके एथेरियम सेपोलिया टेस्टनेट पर कॉफी भुगतान स्मार्ट अनुबंध लिखेंगे, संकलित करेंगे, परीक्षण करेंगे और तैनात करेंगे।
इसकी विशेषताएं इस प्रकार हैं:
चलो अपने हाथ गंदे करें।
अपनी रूट निर्देशिका के अंतर्गत एक फ़ोल्डर बनाएं, और उसका नाम contracts
।
contracts
फ़ोल्डर के अंतर्गत एक फ़ाइल बनाएं और उसका नाम coffee.sol
रखें।
आप स्मार्ट कॉन्ट्रैक्ट लिखने के लिए सॉलिडिटी का उपयोग करेंगे। सॉलिडिटी फ़ाइलों को
.sol
एक्सटेंशन के साथ नामित किया गया है क्योंकि यह सॉलिडिटी स्रोत कोड के लिए मानक फ़ाइल एक्सटेंशन है।
coffee.sol
में निम्नलिखित स्रोत कोड जोड़ें:
// SPDX-License-Identifier: MIT pragma solidity >=0.8.0 <0.9.0; contract Coffee { uint256 public constant coffeePrice = 0.0002 ether; uint256 public totalCoffeesSold; uint256 public totalEtherReceived; // Custom error definitions error QuantityMustBeGreaterThanZero(); error InsufficientEtherSent(uint256 required, uint256 sent); error DirectEtherTransferNotAllowed(); // Event to log coffee purchases event CoffeePurchased(address indexed buyer, uint256 quantity, uint256 totalCost); // Function to buy coffee function buyCoffee(uint256 quantity) external payable { if (quantity <= 0) { revert QuantityMustBeGreaterThanZero(); } uint256 totalCost = coffeePrice * quantity; if (msg.value > totalCost) { revert InsufficientEtherSent(totalCost, msg.value); } // Update the total coffees sold and total ether received totalCoffeesSold += quantity; totalEtherReceived += totalCost; console.log("Total ether received updated:", totalEtherReceived); console.log("Total coffee sold updated:", totalCoffeesSold); // Emit the purchase event emit CoffeePurchased(msg.sender, quantity, totalCost); // Refund excess Ether sent if (msg.value > totalCost) { uint256 refundAmount = msg.value - totalCost; payable(msg.sender).transfer(refundAmount); } } // Fallback function to handle Ether sent directly to the contract receive() external payable { revert DirectEtherTransferNotAllowed(); } // Public view functions to get totals function getTotalCoffeesSold() external view returns (uint256) { console.log("getTotalCoffeesSold :", totalCoffeesSold); return totalCoffeesSold; } function getTotalEtherReceived() external view returns (uint256) { console.log("getTotalEtherReceived :", totalEtherReceived); return totalEtherReceived; } }
//SPDX-License-Identifier: MIT
: यह लाइसेंस पहचानकर्ता इंगित करता है कि कोड मैसाचुसेट्स इंस्टीट्यूट ऑफ टेक्नोलॉजी (MIT) लाइसेंस के अंतर्गत लाइसेंसीकृत है।
pragma solidity >=0.8.0 <0.9.0;
: निर्दिष्ट करता है कि कोड 0.8.0 (समावेशी) और 0.9.0 (अनन्य) के बीच सॉलिडिटी संस्करणों के लिए लिखा गया है। uint256 public constant coffeePrice = 0.0002 ether; uint256 public totalCoffeesSold; uint256 public totalEtherReceived;
coffeePrice
: 0.0002 ether
के स्थिर मान के रूप में सेट करें।totalCoffeesSold
: बेची गई कॉफ़ी की संख्या को ट्रैक करता है.totalEtherReceived
: अनुबंध द्वारा प्राप्त कुल ईथर को ट्रैक करता है।सॉलिडिटी में कस्टम त्रुटियाँ त्रुटि संदेश हैं जो किसी विशिष्ट उपयोग के मामले के लिए तैयार किए जाते हैं, न कि प्रोग्रामिंग भाषा द्वारा प्रदान किए जाने वाले डिफ़ॉल्ट त्रुटि संदेश। वे उपयोगकर्ता अनुभव को बेहतर बनाने में मदद कर सकते हैं, और स्मार्ट कॉन्ट्रैक्ट को डिबग करने और बनाए रखने में भी मदद कर सकते हैं।
सॉलिडिटी में कस्टम त्रुटि परिभाषित करने के लिए, आप निम्नलिखित सिंटैक्स का उपयोग कर सकते हैं:
error
: इस कीवर्ड का उपयोग कस्टम त्रुटि को परिभाषित करने के लिए किया जाता है error QuantityMustBeGreaterThanZero(); error InsufficientEtherSent(uint256 required, uint256 sent); error DirectEtherTransferNotAllowed();
QuantityMustBeGreaterThanZero()
: यह सुनिश्चित करता है कि मात्रा शून्य से अधिक है।InsufficientEtherSent(uint256 required, uint256 sent)
: यह सुनिश्चित करता है कि भेजा गया ईथर पर्याप्त है।DirectEtherTransferNotAllowed()
: अनुबंध में प्रत्यक्ष ईथर स्थानांतरण को रोकता है।इवेंट अनुबंध का एक हिस्सा है जो उत्सर्जित होने पर ट्रांजेक्शन लॉग में पारित तर्कों को संग्रहीत करता है। ईवेंट का उपयोग आमतौर पर EVM की लॉगिंग सुविधा का उपयोग करके अनुबंध की वर्तमान स्थिति के बारे में कॉलिंग एप्लिकेशन को सूचित करने के लिए किया जाता है। वे अनुबंधों में किए गए परिवर्तनों के बारे में अनुप्रयोगों को सूचित करते हैं, जिसका उपयोग तब संबंधित तर्क चलाने के लिए किया जा सकता है।
event CoffeePurchased(address indexed buyer, uint256 quantity, uint256 totalCost);
CoffeePurchased(address indexed buyer, uint256 quantity, uint256 totalCost)
: कॉफी खरीदारी लॉग करता है।फ़ंक्शन कोड के स्व-निहित मॉड्यूल होते हैं जो किसी विशिष्ट कार्य को पूरा करते हैं। वे कोड के एक ही हिस्से को फिर से लिखने की अनावश्यकता को खत्म करते हैं। इसके बजाय, जब आवश्यक हो तो डेवलपर प्रोग्राम में फ़ंक्शन को कॉल कर सकते हैं।
function buyCoffee(uint256 quantity) external payable { if (quantity <= 0) { revert QuantityMustBeGreaterThanZero(); } uint256 totalCost = coffeePrice * quantity; if (msg.value > totalCost) { revert InsufficientEtherSent(totalCost, msg.value); } // Update the total coffees sold and total ether received totalCoffeesSold += quantity; totalEtherReceived += totalCost; console.log("Total ether received updated:", totalEtherReceived); console.log("Total coffee sold updated:", totalCoffeesSold); // Emit the purchase event emit CoffeePurchased(msg.sender, quantity, totalCost); // Refund excess Ether sent if (msg.value > totalCost) { uint256 refundAmount = msg.value - totalCost; payable(msg.sender).transfer(refundAmount); } } receive() external payable { revert DirectEtherTransferNotAllowed(); } function getTotalCoffeesSold() external view returns (uint256) { console.log("getTotalCoffeesSold :", totalCoffeesSold); return totalCoffeesSold; } function getTotalEtherReceived() external view returns (uint256) { console.log("getTotalEtherReceived :", totalEtherReceived); return totalEtherReceived; }
buyCoffee(uint256 quantity) external payable
: कॉफी खरीद को संभालता है और निम्नलिखित संचालन करता है:receive() external payable
: यदि कोई व्यक्ति सीधे अनुबंध पते पर धन भेजता है तो प्रत्यक्ष ईथर स्थानान्तरण को वापस कर देता है।getTotalCoffeesSold() external view returns (uint256)
: बेची गई कुल कॉफ़ी लौटाता है।getTotalEtherReceived() external view returns (uint256)
: प्राप्त कुल ईथर रिटर्न करता है।यहां, आप स्मार्ट अनुबंध को संकलित करने के लिए हार्डहैट का उपयोग करेंगे।
निम्नलिखित कमांड प्रॉम्प्ट का उपयोग करके हार्डहैट स्थापित करें।
npm install --save-dev hardhat
सफल स्थापना के बाद आपको नीचे दिया गया उत्तर मिलेगा।
उसी निर्देशिका में जहां आप इस कमांड प्रॉम्प्ट का उपयोग करके हार्डहैट को आरंभ करते हैं:
npx hardhat init
नीचे तीर बटन का उपयोग करके Create a Javascript project
चयन करें और एंटर दबाएं।
रूट फ़ोल्डर में इंस्टॉल करने के लिए एंटर दबाएं
अपने कीबोर्ड पर y
का उपयोग करके सभी संकेतों को स्वीकार करें, जिसमें @nomicfoundation/hardhat-toolbox
निर्भरताएं भी शामिल हैं
आप नीचे यह प्रतिक्रिया देख रहे हैं जो दर्शाती है कि आपने सफलतापूर्वक आरंभीकरण कर लिया है
आप देखेंगे कि आपके प्रोजेक्ट में कुछ नए फ़ोल्डर और फ़ाइलें जोड़ी गई हैं। उदाहरण के लिए,
Lock.sol
,iginition/modules
,test/Lock.js
औरhardhat.config.cjs
। इनके बारे में चिंता न करें।
केवल
iginition/modules
औरhardhat.config.cjs
ही उपयोगी हैं । आपको बाद में पता चलेगा कि इनका क्या उपयोग है। आपcontracts
फ़ोल्डर के अंतर्गतLock.sol
औरiginition/modules
फ़ोल्डर के अंतर्गतLock.js
हटाने के लिए स्वतंत्र हैं।
निम्नलिखित कमांड प्रॉम्प्ट का उपयोग करके अनुबंध संकलित करें:
npx hardhat compile
Coffee.json
फ़ाइल के अंदर JSON प्रारूप में ABI कोड है जिसे आप स्मार्ट कॉन्ट्रैक्ट के साथ इंटरैक्ट करते समय कॉल करेंगे। { "_format": "hh-sol-artifact-1", "contractName": "Coffee", "sourceName": "contracts/coffee.sol", "abi": [ { "inputs": [], "name": "DirectEtherTransferNotAllowed", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "required", "type": "uint256" }, { "internalType": "uint256", "name": "sent", "type": "uint256" } ], "name": "InsufficientEtherSent", "type": "error" }, { "inputs": [], "name": "QuantityMustBeGreaterThanZero", "type": "error" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "buyer", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "quantity", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "totalCost", "type": "uint256" } ], "name": "CoffeePurchased", "type": "event" }, { "inputs": [ { "internalType": "uint256", "name": "quantity", "type": "uint256" } ], "name": "buyCoffee", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [], "name": "coffeePrice", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getTotalCoffeesSold", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getTotalEtherReceived", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "totalCoffeesSold", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "totalEtherReceived", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "stateMutability": "payable", "type": "receive" } ], "bytecode": "", "deployedBytecode": "", "linkReferences": {}, "deployedLinkReferences": {} }
अपने स्मार्ट कॉन्ट्रैक्ट को बनाते समय एक स्वचालित परीक्षण स्क्रिप्ट लिखना महत्वपूर्ण है और इसकी अत्यधिक अनुशंसा की जाती है। यह दो-कारक प्रमाणीकरण (2FA) की तरह काम करता है, यह सुनिश्चित करता है कि आपका स्मार्ट कॉन्ट्रैक्ट लाइव नेटवर्क पर तैनात होने से पहले अपेक्षित रूप से प्रदर्शन करे।
test
फ़ोल्डर के अंतर्गत एक नई फ़ाइल बनाएँ, और उसका नाम Coffee.
रखें। फ़ाइल के अंदर, नीचे दिया गया कोड पेस्ट करें:
const { loadFixture } = require("@nomicfoundation/hardhat-toolbox/network-helpers.js"); const { expect } = require("chai"); const pkg = require("hardhat"); const ABI = require('../artifacts/contracts/coffee.sol/Coffee.json'); const { web3 } = pkg; describe("Coffee Contract", function () { // Fixture to deploy the Coffee contract async function deployCoffeeFixture() { const coffeeContract = new web3.eth.Contract(ABI.abi); coffeeContract.handleRevert = true; const [deployer, buyer] = await web3.eth.getAccounts(); const rawContract = coffeeContract.deploy({ data: ABI.bytecode, }); // Estimate gas for the deployment const estimateGas = await rawContract.estimateGas({ from: deployer }); // Deploy the contract const coffee = await rawContract.send({ from: deployer, gas: estimateGas.toString(), gasPrice: "10000000000", }); console.log("Coffee contract deployed to: ", coffee.options.address); return { coffee, deployer, buyer, rawContract }; } describe("Deployment", function () { // Test to check initial values after deployment it("Should set the initial values correctly", async function () { const { coffee } = await loadFixture(deployCoffeeFixture); const totalCoffeesSold = await coffee.methods.totalCoffeesSold().call(); const totalEtherReceived = await coffee.methods.totalEtherReceived().call(); expect(totalCoffeesSold).to.equal("0"); expect(totalEtherReceived).to.equal("0"); }); }); describe("Buying Coffee", function () { // Test to check coffee purchase and event emission it("Should purchase coffee and emit an event", async function () { const { coffee, buyer } = await loadFixture(deployCoffeeFixture); const quantity = 3; const totalCost = web3.utils.toWei("0.0006", "ether"); // Buyer purchases coffee const receipt = await coffee.methods.buyCoffee(quantity).send({ from: buyer, value: totalCost }); // Check event const event = receipt.events.CoffeePurchased; expect(event).to.exist; expect(event.returnValues.buyer).to.equal(buyer); expect(event.returnValues.quantity).to.equal(String(quantity)); expect(event.returnValues.totalCost).to.equal(totalCost); }); // Test to check revert when quantity is zero it("Should revert if the quantity is zero", async function () { const { coffee, buyer } = await loadFixture(deployCoffeeFixture); expect( coffee.methods.buyCoffee(0).send({ from: buyer, value: web3.utils.toWei("0.0002", "ether") }) ).to.be.revertedWith("QuantityMustBeGreaterThanZero"); }); // Test to check if totalCoffeesSold and totalEtherReceived are updated correctly it("Should update totalCoffeesSold and totalEtherReceived correctly", async function () { const { coffee, buyer } = await loadFixture(deployCoffeeFixture); const quantity = 5; const totalCost = web3.utils.toWei("0.001", "ether"); await coffee.methods.buyCoffee(quantity).send({ from: buyer, value: totalCost }); const totalCoffeesSold = await coffee.methods.totalCoffeesSold().call(); const totalEtherReceived = await coffee.methods.totalEtherReceived().call(); expect(totalCoffeesSold).to.equal(String(quantity)); expect(totalEtherReceived).to.equal(totalCost); }); }); describe("Fallback function", function () { // Test to check revert when ether is sent directly to the contract it("Should revert if ether is sent directly to the contract", async function () { const { coffee, buyer } = await loadFixture(deployCoffeeFixture); expect( web3.eth.sendTransaction({ from: buyer, to: coffee.options.address, value: web3.utils.toWei("0.001", "ether"), }) ).to.be.revertedWith("DirectEtherTransferNotAllowed"); }); }); });
यह कोड कॉफ़ी स्मार्ट कॉन्ट्रैक्ट की कार्यक्षमता का परीक्षण करता है। इसमें तैनाती, कॉफ़ी खरीदना और कॉन्ट्रैक्ट में सीधे ईथर ट्रांसफ़र को संभालने के लिए परीक्षण शामिल हैं।
यहाँ इसका विवरण दिया गया है:
deployCoffeeFixture
async function deployCoffeeFixture() { const coffeeContract = new web3.eth.Contract(ABI.abi); coffeeContract.handleRevert = true; const [deployer, buyer] = await web3.eth.getAccounts(); const rawContract = coffeeContract.deploy({ data: ABI.bytecode, }); const estimateGas = await rawContract.estimateGas({ from: deployer }); const coffee = await rawContract.send({ from: deployer, gas: estimateGas.toString(), gasPrice: "10000000000", }); console.log("Coffee contract deployed to: ", coffee.options.address); return { coffee, deployer, buyer, rawContract }; }
describe("Deployment", function () { it("Should set the initial values correctly", async function () { const { coffee } = await loadFixture(deployCoffeeFixture); const totalCoffeesSold = await coffee.methods.totalCoffeesSold().call(); const totalEtherReceived = await coffee.methods.totalEtherReceived().call(); expect(totalCoffeesSold).to.equal("0"); expect(totalEtherReceived).to.equal("0"); }); });
totalCoffeesSold
और totalEtherReceived
शून्य पर सेट हैं। describe("Buying Coffee", function () { it("Should purchase coffee and emit an event", async function () { const { coffee, buyer } = await loadFixture(deployCoffeeFixture); const quantity = 3; const totalCost = web3.utils.toWei("0.0006", "ether"); const receipt = await coffee.methods.buyCoffee(quantity).send({ from: buyer, value: totalCost }); const event = receipt.events.CoffeePurchased; expect(event).to.exist; expect(event.returnValues.buyer).to.equal(buyer); expect(event.returnValues.quantity).to.equal(String(quantity)); expect(event.returnValues.totalCost).to.equal(totalCost); }); it("Should revert if the quantity is zero", async function () { const { coffee, buyer } = await loadFixture(deployCoffeeFixture); expect( coffee.methods.buyCoffee(0).send({ from: buyer, value: web3.utils.toWei("0.0002", "ether") }) ).to.be.revertedWith("QuantityMustBeGreaterThanZero"); }); it("Should update totalCoffeesSold and totalEtherReceived correctly", async function () { const { coffee, buyer } = await loadFixture(deployCoffeeFixture); const quantity = 5; const totalCost = web3.utils.toWei("0.001", "ether"); await coffee.methods.buyCoffee(quantity).send({ from: buyer, value: totalCost }); const totalCoffeesSold = await coffee.methods.totalCoffeesSold().call(); const totalEtherReceived = await coffee.methods.totalEtherReceived().call(); expect(totalCoffeesSold).to.equal(String(quantity)); expect(totalEtherReceived).to.equal(totalCost); }); });
CoffeePurchased
ईवेंट उत्सर्जित होता है।totalCoffeesSold
और totalEtherReceived
सही ढंग से अद्यतन किया गया है। describe("Fallback function", function () { it("Should revert if ether is sent directly to the contract", async function () { const { coffee, buyer } = await loadFixture(deployCoffeeFixture); expect( web3.eth.sendTransaction({ from: buyer, to: coffee.options.address, value: web3.utils.toWei("0.001", "ether"), }) ).to.be.revertedWith("DirectEtherTransferNotAllowed"); }); });
परीक्षण स्क्रिप्ट लिखने के बाद, आप :
console.log()
को कॉल करके लॉगिंग संदेश और अनुबंध चर प्रिंट कर सकते हैं। इसका उपयोग करने के लिए, आपको अपने अनुबंध कोड में इस तरह से hardhat/console.sol
आयात करना होगा : //SPDX-License-Identifier: MIT pragma solidity >=0.8.0 <0.9.0; import "hardhat/console.sol"; contract Coffee { //... }
अनुबंध का परीक्षण करने के लिए, अपने टर्मिनल में निम्नलिखित कमांड चलाएँ:
npx hardhat test
आपके पास नीचे दिए गए जैसा आउटपुट होना चाहिए:
इससे पता चलता है कि आपका स्मार्ट अनुबंध अपेक्षित तरीके से कार्य करता है।
यदि आप
npx hardhat test
चलाते हैं तो यह स्वचालित रूप से स्मार्ट कॉन्ट्रैक्ट को संकलित और परीक्षण करता है। आप इसे आज़मा सकते हैं और मुझे टिप्पणी अनुभाग में बता सकते हैं।
यहाँ, आप अपने स्मार्ट कॉन्ट्रैक्ट को सेपोलिया टेस्टनेट पर तैनात करेंगे। टेस्टनेट आपको अपने स्मार्ट कॉन्ट्रैक्ट को ऐसे वातावरण में परीक्षण करने की अनुमति देता है जो बिना किसी महत्वपूर्ण लागत के एथेरियम मेननेट की नकल करता है। यदि आप dApp के कार्य से अच्छे हैं, तो आप एथेरियम मेननेट पर फिर से तैनात कर सकते हैं।
Dotenv पैकेज और इन निर्भरताओं को स्थापित करें।
npm install dotenv npm install --save-dev @nomicfoundation/hardhat-web3-v4 'web3@4'
यह Web3.Js और Dotenv को 'node_modules' फ़ोल्डर में शामिल करके आपके प्रोजेक्ट में जोड़ देगा।
उन्हें अपनी hardhat.config.cjs
फ़ाइल में आयात करें
require('dotenv').config(); require("@nomicfoundation/hardhat-toolbox"); require("@nomicfoundation/hardhat-web3-v4"); const HardhatUserConfig = require("hardhat/config"); module.exports = { solidity: "0.8.24", } };
अपने रूट फ़ोल्डर में एक .env
फ़ाइल बनाएँ ।
अपने मेटामास्क वॉलेट और dRPC API कुंजी से अपने खाते की निजी कुंजी प्राप्त करें।
इन्हें अपनी .env
फ़ाइल में संग्रहीत करें.
DRPC_API_KEY=your_drpc_api_key PRIVATE_KEY=your_wallet_private_key
Sepolia टेस्टनेट कॉन्फ़िगरेशन को शामिल करने के लिए hardhat.config.cjs
फ़ाइल को अपडेट करें :
require('dotenv').config(); require("@nomicfoundation/hardhat-toolbox"); require("@nomicfoundation/hardhat-web3-v4"); const HardhatUserConfig = require("hardhat/config"); const dRPC_API_KEY = process.env.VITE_dRPC_API_KEY; const PRIVATE_KEY = process.env.VITE_PRIVATE_KEY; module.exports = { solidity: "0.8.24", networks: { sepolia: { url: `https://lb.drpc.org/ogrpc?network=sepolia&dkey=${dRPC_API_KEY}`, accounts: [`0x${PRIVATE_KEY}`], } } };
ignition/module
फ़ोल्डर के अंतर्गत एक नई स्क्रिप्ट फ़ाइल बनाएँ , और इसे deploy.cjs
नाम दें । अपने स्मार्ट कॉन्ट्रैक्ट को तैनात करने के लिए निम्न कोड जोड़ें:
const { buildModule } = require("@nomicfoundation/hardhat-ignition/modules"); const CoffeeModule = buildModule("CoffeeModule", (m) => { const coffee = m.contract("Coffee"); return { coffee }; }); module.exports = CoffeeModule;
अपने टर्मिनल में निम्नलिखित कमांड चलाकर स्मार्ट कॉन्ट्रैक्ट तैनात करें:
npx hardhat ignition deploy ./ignition/modules/deploy.cjs --network sepolia
कमांड प्रॉम्प्ट चलाने के बाद, आपसे पूछा जाएगा कि Confirm deploy to network sepolia (11155111)? (y/n)
, y
टाइप करें। सफल तैनाती पर आपको टर्मिनल में अपने तैनात स्मार्ट कॉन्ट्रैक्ट का पता देखना चाहिए।
आप deployed_addresses.json
फ़ाइल में अनुबंध पते तक भी पहुँच सकते हैं।
बधाई हो, आपने अपने स्मार्ट अनुबंध को सेपोलिया टेस्टनेट पर सफलतापूर्वक तैनात कर दिया है।
इस लेख में आपको हार्डहैट CLI का उपयोग करके भुगतान स्मार्ट अनुबंध लिखना, परीक्षण करना, संकलित करना और स्मार्ट अनुबंध को तैनात करना सिखाया गया है।
अगले लेख में, आप इस dApp के लिए फ्रंट एंड बनाना सीखेंगे। इस UI में निम्न शामिल होंगे:
डिफ़ॉल्ट संदेशों से परे: सॉलिडिटी में कस्टम त्रुटियों पर नियंत्रण