Utangulizi Kutokana na kuelewa rundo la teknolojia kwa ajili ya ukuzaji wa Web3 DApp, lazima uwe umejifunza safu kuu ya teknolojia ya ukuzaji wa web3 dApp, jukumu la RPC katika uundaji wa dApp, na jinsi ya kutumia dRPC kuunda akaunti, kuunda ufunguo wa API, vidokezo, uchanganuzi wa mwisho. , ongeza pesa kwenye Akaunti yako ya dRPC, na uangalie salio lako. Jukumu la dRPC katika kupeleka mikataba ya smart ni kurahisisha mchakato wa kuanzisha nodi ya Ethereum, ili iwe rahisi kwa watengenezaji kuingiliana na kupeleka kwa mstari mmoja tu wa kanuni. Katika makala haya, utaandika, kukusanya, kujaribu, na kupeleka mkataba mahiri wa malipo ya kahawa kwa Ethereum Sepolia Testnet kwa kutumia sehemu ya mwisho ya dRPC na ufunguo wa API. Vipengele ni pamoja na: Malipo ya Kahawa Kupitia bei ya Kahawa Kurejesha Jumla ya idadi ya Kahawa iliyouzwa na Jumla ya pesa iliyopatikana Wacha tuchafue mikono yako. Masharti Tayari fadhili akaunti yako na Sepolia Faucet. Kuwa na Pochi kwa mfano, Metamask. Mhariri wa Kanuni. Tayari imesakinisha maktaba zozote za Js au mifumo ya chaguo lako (km React.js, Next.js nk). Jar ya Maji. Teknolojia na Zana Zinahitajika Mshikamano. React.js kwa kutumia Vite.js(Typescript) Hardhat. Web3.js. Dotenv. dRPC API muhimu na Endpoint. Ufunguo wa faragha wa akaunti yako. MetaMask Kuandika Mkataba Mahiri wa Malipo ya Kahawa Unda Folda chini ya saraka yako ya mizizi, na uipe jina . contracts Unda Faili chini ya folda , na uipe jina . contracts coffee.sol utakuwa unatumia solidity kuandika mkataba wa busara. Faili za Solidity zimepewa jina kwa kiendelezi cha kwa sababu ndicho kiendelezi cha kawaida cha faili kwa msimbo wa chanzo wa Solidity. .sol Ongeza msimbo wa chanzo ufuatao kwa : 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; } } Pragma : Kitambulishi hiki cha leseni kinaonyesha kuwa msimbo umeidhinishwa chini ya Leseni . //SPDX-License-Identifier: MIT ya Taasisi ya Teknolojia ya Massachusetts (MIT) : Inabainisha kuwa msimbo umeandikwa kwa matoleo ya Solidity kati ya 0.8.0 (pamoja) na 0.9.0 (isiyojumuisha). pragma solidity >=0.8.0 <0.9.0; Hali Tofauti uint256 public constant coffeePrice = 0.0002 ether; uint256 public totalCoffeesSold; uint256 public totalEtherReceived; : Weka kama thamani isiyobadilika ya . coffeePrice 0.0002 ether : Hufuatilia idadi ya kahawa zinazouzwa. totalCoffeesSold : Hufuatilia jumla ya Etheri iliyopokelewa na mkataba. totalEtherReceived Makosa Maalum Hitilafu maalum katika Solidity ni . Wanaweza kusaidia kuboresha matumizi ya mtumiaji, na pia wanaweza kusaidia kutatua hitilafu na kudumisha mikataba mahiri. ujumbe wa hitilafu ambao umeundwa kulingana na hali maalum ya matumizi, badala ya ujumbe wa hitilafu chaguo-msingi ambao hutolewa na lugha ya programu Ili kufafanua kosa maalum katika Solidity, unaweza kutumia syntax ifuatayo: : Neno kuu hili linatumika kufafanua hitilafu maalum error Jina la kipekee: Hitilafu lazima iwe na jina la kipekee Vigezo: Ikiwa unataka kujumuisha maelezo maalum au vigezo katika ujumbe wa hitilafu, unaweza kuviongeza kwenye mabano baada ya jina la hitilafu. error QuantityMustBeGreaterThanZero(); error InsufficientEtherSent(uint256 required, uint256 sent); error DirectEtherTransferNotAllowed(); : Inahakikisha kuwa idadi ni kubwa kuliko sifuri. QuantityMustBeGreaterThanZero() : Inahakikisha kuwa Etheri iliyotumwa inatosha. InsufficientEtherSent(uint256 required, uint256 sent) : Huzuia uhamisho wa moja kwa moja wa Etha kwenye mkataba. DirectEtherTransferNotAllowed() Matukio Tukio ni sehemu ya mkataba ambayo huhifadhi hoja zilizopitishwa kwenye kumbukumbu za miamala zinapotolewa. Matukio kwa kawaida hutumiwa kufahamisha programu ya kupiga simu kuhusu hali ya sasa ya mkataba kwa kutumia kipengele cha ukataji miti cha EVM. Wanajulisha maombi kuhusu mabadiliko yaliyofanywa kwa kandarasi, ambayo yanaweza kutumika kutekeleza mantiki inayohusiana. event CoffeePurchased(address indexed buyer, uint256 quantity, uint256 totalCost); : Huweka kumbukumbu za ununuzi wa kahawa. CoffeePurchased(address indexed buyer, uint256 quantity, uint256 totalCost) Kazi Wanaondoa upungufu wa kuandika tena kipande sawa cha msimbo. Badala yake, devs inaweza kuita chaguo za kukokotoa katika programu inapohitajika. Kazi ni moduli zinazojitosheleza za msimbo zinazotimiza kazi mahususi. 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; } : Hushughulikia ununuzi wa kahawa na kutekeleza shughuli zifuatazo: buyCoffee(uint256 quantity) external payable Angalia ikiwa kiasi ni halali. Huhesabu jumla ya gharama. Huhakikisha Etha ya kutosha inatumwa. Inasasisha vigezo vya hali. Hutoa tukio la ununuzi. Hurejesha Etha iliyozidi. : Hurejesha uhamisho wa moja kwa moja wa Etha iwapo mtu atatuma pesa kwa anwani ya mkataba moja kwa moja. receive() external payable : Hurejesha jumla ya kahawa zilizouzwa. getTotalCoffeesSold() external view returns (uint256) : Hurejesha jumla ya Etheri iliyopokelewa. getTotalEtherReceived() external view returns (uint256) Kuandaa Mkataba Mahiri wa Malipo ya Kahawa Hapa, utakuwa ukitumia Hardhat kuunda mkataba mzuri. Sakinisha Hardhat kwa kutumia haraka ya amri ifuatayo. npm install --save-dev hardhat Utapata jibu hapa chini baada ya usakinishaji uliofaulu. Katika saraka ile ile ambapo unaanzisha hardhat kwa kutumia haraka amri hii: npx hardhat init Chagua Create a Javascript project kwa kutumia kitufe cha mshale chini na ubonyeze ingiza. Bonyeza enter ili kusakinisha kwenye folda ya mizizi Kubali vidokezo vyote kwa kutumia y kwenye kibodi yako ikijumuisha utegemezi wa @nomicfoundation/hardhat-toolbox Unaona jibu hili hapa chini likionyesha kuwa umeanzisha kwa ufanisi Utagundua baadhi ya folda mpya na faili zimeongezwa kwenye mradi wako. kwa mfano, Lock.sol , iginition/modules , test/Lock.js na hardhat.config.cjs . Usijali kuhusu wao. folda folda Ya pekee yenye manufaa ni iginition/modules na hardhat.config.cjs . Utajua wanatumiwa nini baadaye. Jisikie huru kufuta Lock.sol chini ya contracts na Lock.js chini ya iginition/modules . Kusanya mkataba kwa kutumia haraka amri ifuatayo: npx hardhat compile Unaweza kuona folda na faili za ziada kama hii. faili ya Ndani ya Coffee.json kuna msimbo wa ABI katika umbizo la JSON ambao utauita unapotumia mkataba mahiri. { "_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": {} } Kujaribu Mkataba Mahiri Kuandika hati ya majaribio ya kiotomatiki wakati wa kuunda mkataba wako mahiri ni muhimu na inapendekezwa sana. Hufanya kazi kama uthibitishaji wa vipengele viwili (2FA), kuhakikisha kuwa mkataba wako mahiri unafanya kazi inavyotarajiwa kabla ya kuupeleka kwenye mtandao wa moja kwa moja. folda cjs. Ndani ya faili, bandika nambari hii hapa chini: Chini ya test unda faili mpya, na uipe jina 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"); }); }); }); Nambari hii hujaribu utendakazi wa mkataba mahiri wa Kahawa. Inajumuisha vipimo vya kupelekwa, kununua kahawa, na kushughulikia uhamisho wa moja kwa moja wa Etha kwenye mkataba. Hapa kuna muhtasari: Kazi ya Urekebishaji: 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 }; } : Huunda mfano mpya wa mkataba na kuutumia kwa kutumia akaunti ya msambazaji. Hutumia mkataba wa Kahawa : Hukadiria gesi inayohitajika kupelekwa. Makadirio ya gesi : Mfano wa mkataba uliowekwa, akaunti za msambazaji na mnunuzi. Kurejesha Vipimo vya Usambazaji 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"); }); }); : Huhakikisha kuwa na zimewekwa kuwa sufuri baada ya kupelekwa. Hukagua thamani za awali totalCoffeesSold totalEtherReceived Kununua Vipimo vya Kahawa 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); }); }); : Majaribio ambayo ununuzi wa kahawa husasisha hali na hutoa tukio la . Kununua kahawa na kutoa tukio CoffeePurchased : Inahakikisha kwamba muamala unarejeshwa ikiwa wingi ni sifuri. Kurejesha kwa kiasi cha sifuri : Inathibitisha kuwa na zinasasishwa kwa usahihi baada ya ununuzi. Hali ya kusasisha kwa usahihi totalCoffeesSold totalEtherReceived Mtihani wa Kazi ya Fallback 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"); }); }); : Inahakikisha kwamba kutuma Etha moja kwa moja kwa mkataba (bila kupiga simu ya utendaji) kunarejesha muamala. Kurejesha kwenye uhamisho wa moja kwa moja wa Etha Kujaribu Mkataba Mahiri Baada ya kuandika maandishi ya jaribio, uta : Unapoendesha kandarasi na majaribio yako kwenye Hardhat Network, unaweza kuchapisha jumbe za kumbukumbu na viambatisho vya mkataba kupiga simu console.log() kutoka kwa msimbo wako wa Solidity. Ili kuitumia, lazima uingize hardhat/console.sol katika msimbo wako wa mkataba kama hii: //SPDX-License-Identifier: MIT pragma solidity >=0.8.0 <0.9.0; import "hardhat/console.sol"; contract Coffee { //... } Ili kujaribu mkataba, endesha amri ifuatayo kwenye terminal yako: npx hardhat test Unapaswa kuwa na pato kama hili hapa chini: Hii inaonyesha kuwa mkataba wako mahiri hufanya kazi jinsi inavyotarajiwa. Ukiendesha npx hardhat test itakusanya kiotomatiki na kujaribu mkataba mahiri. Unaweza kujaribu na unijulishe katika sehemu ya maoni. Kutuma Mkataba Mahiri Hapa, utakuwa unapeleka mkataba wako mahiri kwa Testnet hukuruhusu kujaribu mkataba wako mahiri katika mazingira ambayo yanaiga mainnet ya Ethereum bila kulipia gharama kubwa. Ikiwa unatumia vyema utendakazi wa dApp, unaweza kisha kusambaza tena kwa Ethereum Mainnet. Sepolia Testnet. Sakinisha kifurushi cha dotenv na utegemezi huu. npm install dotenv npm install --save-dev @nomicfoundation/hardhat-web3-v4 'web3@4' Hii itaongeza Web3.Js na Dotenv kwenye mradi wako kwa kuujumuisha kwenye folda ya 'node_modules'. yako ziingize kwenye faili 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", } }; Unda faili ya .env kwenye folda yako ya mizizi. Pata ufunguo wa faragha wa akaunti yako kutoka kwa pochi yako ya MetaMask na ufunguo wa API ya dRPC. Zihifadhi katika faili yako ya .env . DRPC_API_KEY=your_drpc_api_key PRIVATE_KEY=your_wallet_private_key faili ya Sasisha hardhat.config.cjs ili kujumuisha Usanidi wa Sepolia Testnet: 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}`], } } }; folda Unda faili mpya ya hati chini ya ignition/module , na ulipe jina deploy.cjs . Ongeza msimbo ufuatao ili kupeleka mkataba wako mahiri: const { buildModule } = require("@nomicfoundation/hardhat-ignition/modules"); const CoffeeModule = buildModule("CoffeeModule", (m) => { const coffee = m.contract("Coffee"); return { coffee }; }); module.exports = CoffeeModule; Sambaza mkataba mahiri kwa kutekeleza amri ifuatayo kwenye terminal yako: npx hardhat ignition deploy ./ignition/modules/deploy.cjs --network sepolia Baada ya kutekeleza kidokezo cha amri, utaulizwa , chapa . Unapaswa kuona anwani ya kandarasi yako mahiri uliyoweka kwenye kituo baada ya kutumwa kwa mafanikio. Confirm deploy to network sepolia (11155111)? (y/n) y Unaweza pia kufikia anwani ya mkataba katika faili ya . deployed_addresses.json Hongera, umefaulu kupeleka mkataba wako mahiri kwa Sepolia Testnet. 🎉 Hitimisho Makala haya yamekufundisha jinsi ya kuandika mkataba mahiri wa malipo, mtihani, kukusanya na kupeleka kandarasi mahiri kwa kutumia hardhat CLI. Katika makala inayofuata, utajifunza kujenga mwisho wa mbele wa dApp hii. UI hii itajumuisha: Sehemu ya kuingiza kwa idadi ya Kahawa iliyonunuliwa. Kitufe kinachoanzisha shughuli ya malipo na kuiondoa kwenye akaunti yako. Onyesha Jumla ya kahawa iliyonunuliwa na kiasi kilichopokelewa kwa etha na USD Bei ya Kahawa yenyewe katika etha na USD. Rejea Zaidi ya Ujumbe Chaguomsingi: Kudhibiti Hitilafu Maalum katika Mshikamano Kudhibiti Makosa ya Kimila katika Mshikamano: Inua Mikataba Yako Mahiri Zaidi ya Ujumbe Chaguomsingi Kazi za Solidity ni nini? Je! ni Matukio gani katika Mshikamano? ← Makala Iliyotangulia Makala Inayofuata →