+```
+
+Teraz jesteśmy gotowi do skonfigurowania naszego punktu końcowego Alchemy Web3 w naszej dapce! Wróćmy do naszego pliku `interact.js`, który jest zagnieżdżony w naszym folderze `util` i dodajmy następujący kod na początku pliku:
+
+```javascript
+// interact.js
+
+require("dotenv").config()
+const alchemyKey = process.env.REACT_APP_ALCHEMY_KEY
+const { createAlchemyWeb3 } = require("@alch/alchemy-web3")
+const web3 = createAlchemyWeb3(alchemyKey)
+
+//export const helloWorldContract;
+```
+
+Powyżej najpierw zaimportowaliśmy klucz Alchemy z naszego pliku `.env`, a następnie przekazaliśmy nasz `alchemyKey` do `createAlchemyWeb3`, aby ustanowić nasz punkt końcowy Alchemy Web3.
+
+Gdy ten punkt końcowy jest gotowy, nadszedł czas, aby załadować nasz inteligentny kontrakt!
+
+#### Ładowanie Twojego inteligentnego kontraktu Witaj Świecie {#loading-your-hello-world-smart-contract}
+
+Aby załadować swój inteligentny kontrakt Witaj Świecie, będziesz potrzebować jego adresu kontraktu i ABI, które można znaleźć w Etherscan, jeśli ukończyłeś [część 3 tego samouczka](/developers/tutorials/hello-world-smart-contract-fullstack/#part-3-publish-your-smart-contract-to-etherscan-part-3-publish-your-smart-contract-to-etherscan).
+
+#### Jak uzyskać ABI kontraktu z Etherscan {#how-to-get-your-contract-abi-from-etherscan}
+
+Jeśli pominąłeś część 3 tego samouczka, możesz użyć kontraktu HelloWorld z adresem [0x6f3f635A9762B47954229Ea479b4541eAF402A6A](https://goerli.etherscan.io/address/0x6f3f635a9762b47954229ea479b4541eaf402a6a#code). Jego ABI można znaleźć [tutaj](https://goerli.etherscan.io/address/0x6f3f635a9762b47954229ea479b4541eaf402a6a#code).
+
+ABI kontraktu jest niezbędne do określenia, którą funkcję kontrakt wywoła, a także do zapewnienia, że funkcja zwróci dane w oczekiwanym formacie. Po skopiowaniu naszego ABI kontraktu, zapiszmy go jako plik JSON o nazwie `contract-abi.json` w swoim katalogu `src`.
+
+Twój plik contract-abi.json powinien być przechowywany w folderze src.
+
+Mając do dyspozycji adres kontraktu, ABI i punkt końcowy Alchemy Web3, możemy użyć [metody kontraktu](https://docs.web3js.org/api/web3-eth-contract/class/Contract), aby załadować instancję naszego inteligentnego kontraktu. Zaimportuj ABI kontraktu do pliku `interact.js` i dodaj adres kontraktu.
+
+```javascript
+// interact.js
+
+const contractABI = require("../contract-abi.json")
+const contractAddress = "0x6f3f635A9762B47954229Ea479b4541eAF402A6A"
+```
+
+Możemy teraz wreszcie odkomentować naszą zmienną `helloWorldContract` i załadować inteligentny kontrakt za pomocą naszego punktu końcowego AlchemyWeb3:
+
+```javascript
+// interact.js
+export const helloWorldContract = new web3.eth.Contract(
+ contractABI,
+ contractAddress
+)
+```
+
+Podsumowując, pierwsze 12 linii pliku `interact.js` powinno teraz wyglądać tak:
+
+```javascript
+// interact.js
+
+require("dotenv").config()
+const alchemyKey = process.env.REACT_APP_ALCHEMY_KEY
+const { createAlchemyWeb3 } = require("@alch/alchemy-web3")
+const web3 = createAlchemyWeb3(alchemyKey)
+
+const contractABI = require("../contract-abi.json")
+const contractAddress = "0x6f3f635A9762B47954229Ea479b4541eAF402A6A"
+
+export const helloWorldContract = new web3.eth.Contract(
+ contractABI,
+ contractAddress
+)
+```
+
+Teraz, gdy nasz kontrakt jest załadowany, możemy zaimplementować naszą funkcję `loadCurrentMessage`!
+
+#### Implementacja `loadCurrentMessage` w pliku `interact.js` {#implementing-loadCurrentMessage-in-your-interact-js-file}
+
+Ta funkcja jest super prosta. Zrobimy proste asynchroniczne wywołanie web3, aby odczytać z naszego kontraktu. Nasza funkcja zwróci wiadomość zapisaną w inteligentnym kontrakcie:
+
+Zaktualizuj `loadCurrentMessage` w swoim pliku `interact.js` do następującej postaci:
+
+```javascript
+// interact.js
+
+export const loadCurrentMessage = async () => {
+ const message = await helloWorldContract.methods.message().call()
+ return message
+}
+```
+
+Ponieważ chcemy wyświetlić ten inteligentny kontrakt w naszym interfejsie użytkownika, zaktualizujmy funkcję `useEffect` w naszym komponencie `HelloWorld.js` do następującej postaci:
+
+```javascript
+// HelloWorld.js
+
+// wywoływane tylko raz
+useEffect(async () => {
+ const message = await loadCurrentMessage()
+ setMessage(message)
+}, [])
+```
+
+Zauważ, że chcemy, aby nasza funkcja `loadCurrentMessage` była wywoływana tylko raz podczas pierwszego renderowania komponentu. Wkrótce zaimplementujemy `addSmartContractListener`, aby automatycznie aktualizować interfejs użytkownika po zmianie wiadomości w inteligentnym kontrakcie.
+
+Zanim przejdziemy do naszego nasłuchiwacza, sprawdźmy, co mamy do tej pory! Zapisz pliki `HelloWorld.js` i `interact.js`, a następnie przejdź do [http://localhost:3000/](http://localhost:3000/)
+
+Zauważysz, że bieżąca wiadomość nie brzmi już „Brak połączenia z siecią”. Zamiast tego odzwierciedla ona wiadomość zapisaną w inteligentnym kontrakcie. Super!
+
+#### Twój interfejs użytkownika powinien teraz odzwierciedlać wiadomość zapisaną w inteligentnym kontrakcie {#your-UI-should-now-reflect-the-message-stored-in-the-smart-contract}
+
+A propos tego nasłuchiwacza...
+
+#### Zaimplementuj `addSmartContractListener` {#implement-addsmartcontractlistener}
+
+Jeśli przypomnisz sobie plik `HelloWorld.sol`, który napisaliśmy w [części 1 tej serii samouczków](https://docs.alchemy.com/alchemy/tutorials/hello-world-smart-contract#step-10-write-our-contract), przypomnisz sobie, że istnieje zdarzenie inteligentnego kontraktu o nazwie `UpdatedMessages`, które jest emitowane po wywołaniu funkcji `update` naszego inteligentnego kontraktu (patrz linie 9 i 27):
+
+```javascript
+// HelloWorld.sol
+
+// Określa wersję Solidity, używając semantycznego wersjonowania.
+// Dowiedz się więcej: https://solidity.readthedocs.io/en/v0.5.10/layout-of-source-files.html#pragma
+pragma solidity ^0.7.3;
+
+// Definiuje kontrakt o nazwie `HelloWorld`.
+// Kontrakt jest zbiorem funkcji i danych (jego stanu). Po wdrożeniu kontrakt znajduje się pod określonym adresem w blockchainie Ethereum. Dowiedz się więcej: https://solidity.readthedocs.io/en/v0.5.10/structure-of-a-contract.html
+contract HelloWorld {
+
+ // Emitowane, gdy wywoływana jest funkcja aktualizacji
+ // Zdarzenia inteligentnych kontraktów to sposób, w jaki kontrakt komunikuje, że coś wydarzyło się na blockchainie do front-endu aplikacji, który może „nasłuchiwać” określonych zdarzeń i podejmować działania, gdy one wystąpią.
+ event UpdatedMessages(string oldStr, string newStr);
+
+ // Deklaruje zmienną stanu `message` typu `string`.
+ // Zmienne stanu to zmienne, których wartości są trwale przechowywane w pamięci kontraktu. Słowo kluczowe `public` udostępnia zmienne spoza kontraktu i tworzy funkcję, którą inne kontrakty lub klienci mogą wywołać w celu uzyskania dostępu do wartości.
+ string public message;
+
+ // Podobnie jak w wielu językach obiektowych opartych na klasach, konstruktor jest specjalną funkcją, która jest wykonywana tylko podczas tworzenia kontraktu.
+ // Konstruktory służą do inicjalizacji danych kontraktu. Dowiedz się więcej: https://solidity.readthedocs.io/en/v0.5.10/contracts.html#constructors
+ constructor(string memory initMessage) {
+
+ // Akceptuje argument ciągu znaków `initMessage` i ustawia wartość w zmiennej pamięci kontraktu `message`).
+ message = initMessage;
+ }
+
+ // Funkcja publiczna, która akceptuje argument w postaci ciągu znaków i aktualizuje zmienną pamięci masowej `message`.
+ function update(string memory newMessage) public {
+ string memory oldMsg = message;
+ message = newMessage;
+ emit UpdatedMessages(oldMsg, newMessage);
+ }
+}
+```
+
+Zdarzenia inteligentnych kontraktów to sposób, w jaki kontrakt komunikuje, że coś się stało (tj. miało miejsce _zdarzenie_) na blockchainie do Twojej aplikacji front-endowej, która może „nasłuchiwać” określonych zdarzeń i podejmować działania, gdy one wystąpią.
+
+Funkcja `addSmartContractListener` będzie konkretnie nasłuchiwać zdarzenia `UpdatedMessages` naszego inteligentnego kontraktu Witaj Świecie i aktualizować nasz interfejs użytkownika, aby wyświetlić nową wiadomość.
+
+Zmodyfikuj `addSmartContractListener` do następującej postaci:
+
+```javascript
+// HelloWorld.js
+
+function addSmartContractListener() {
+ helloWorldContract.events.UpdatedMessages({}, (error, data) => {
+ if (error) {
+ setStatus("😥 " + error.message)
+ } else {
+ setMessage(data.returnValues[1])
+ setNewMessage("")
+ setStatus("🎉 Twoja wiadomość została zaktualizowana!")
+ }
+ })
+}
+```
+
+Przeanalizujmy, co się dzieje, gdy nasłuchiwacz wykryje zdarzenie:
+
+- Jeśli wystąpi błąd podczas emitowania zdarzenia, zostanie on odzwierciedlony w interfejsie użytkownika za pośrednictwem naszej zmiennej stanu `status`.
+- W przeciwnym razie użyjemy zwróconego obiektu `data`. `data.returnValues` to tablica indeksowana od zera, w której pierwszy element tablicy przechowuje poprzednią wiadomość, a drugi element przechowuje zaktualizowaną. W sumie, w przypadku pomyślnego zdarzenia, ustawimy nasz ciąg znaków `message` na zaktualizowaną wiadomość, wyczyścimy ciąg znaków `newMessage` i zaktualizujemy naszą zmienną stanu `status`, aby odzwierciedlić, że nowa wiadomość została opublikowana w naszym inteligentnym kontrakcie.
+
+Na koniec wywołajmy naszego nasłuchiwacza w naszej funkcji `useEffect`, aby został zainicjowany podczas pierwszego renderowania komponentu `HelloWorld.js`. W sumie Twoja funkcja `useEffect` powinna wyglądać tak:
+
+```javascript
+// HelloWorld.js
+
+useEffect(async () => {
+ const message = await loadCurrentMessage()
+ setMessage(message)
+ addSmartContractListener()
+}, [])
+```
+
+Teraz, gdy jesteśmy w stanie czytać z naszego inteligentnego kontraktu, byłoby wspaniale dowiedzieć się, jak do niego pisać! Jednak, aby pisać do naszej dapki, musimy najpierw mieć do niej podłączony portfel Ethereum.
+
+Więc następnie zajmiemy się konfiguracją naszego portfela Ethereum (MetaMask), a następnie podłączeniem go do naszej dapki!
+
+### Krok 4: Skonfiguruj swój portfel Ethereum {#step-4-set-up-your-ethereum-wallet}
+
+Aby cokolwiek zapisać w łańcuchu Ethereum, użytkownicy muszą podpisywać transakcje za pomocą kluczy prywatnych swojego wirtualnego portfela. W tym samouczku użyjemy [MetaMask](https://metamask.io/), wirtualnego portfela w przeglądarce używanego do zarządzania adresem konta Ethereum, ponieważ znacznie ułatwia to podpisywanie transakcji dla użytkownika końcowego.
+
+Jeśli chcesz dowiedzieć się więcej o tym, jak działają transakcje w Ethereum, sprawdź [tę stronę](/developers/docs/transactions/) od Ethereum Foundation.
+
+#### Pobierz MetaMask {#download-metamask}
+
+Możesz pobrać i utworzyć konto MetaMask za darmo [tutaj](https://metamask.io/download). Podczas tworzenia konta, lub jeśli już je posiadasz, upewnij się, że przełączyłeś się na „Sieć testową Goerli” w prawym górnym rogu (aby nie mieć do czynienia z prawdziwymi pieniędzmi).
+
+#### Dodaj ether z Faucet {#add-ether-from-a-faucet}
+
+Aby podpisać transakcję na blockchainie Ethereum, będziemy potrzebować trochę fałszywego Eth. Aby uzyskać Eth, możesz przejść do [FaucETH](https://fauceth.komputing.org) i wprowadzić swój adres konta Goerli, kliknąć „Poproś o fundusze”, następnie wybrać „Ethereum Testnet Goerli” w menu rozwijanym i na koniec ponownie kliknąć przycisk „Poproś o fundusze”. Wkrótce powinieneś zobaczyć Eth na swoim koncie MetaMask!
+
+#### Sprawdź swoje saldo {#check-your-balance}
+
+Aby sprawdzić, czy nasze saldo jest na miejscu, wykonajmy żądanie [eth_getBalance](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_getbalance) za pomocą [narzędzia kompozytora Alchemy](https://composer.alchemyapi.io/?composer_state=%7B%22network%22%3A0%2C%22methodName%22%3A%22eth_getBalance%22%2C%22paramValues%22%3A%5B%22%22%2C%22latest%22%5D%7D). Zwróci to ilość Eth w naszym portfelu. Po wprowadzeniu adresu konta MetaMask i kliknięciu „Wyślij żądanie” powinieneś zobaczyć następującą odpowiedź:
+
+```text
+{"jsonrpc": "2.0", "id": 0, "result": "0xde0b6b3a7640000"}
+```
+
+**UWAGA:** ten wynik jest w wei, a nie w eth. Wei jest używany jako najmniejsza jednostka etheru. Konwersja z wei na eth to: 1 eth = 10¹⁸ wei. Więc jeśli przekonwertujemy 0xde0b6b3a7640000 na system dziesiętny, otrzymamy 1\*10¹⁸, co równa się 1 eth.
+
+Uff! Nasze fałszywe pieniądze są na miejscu! 🤑
+
+### Krok 5: Podłącz MetaMask do swojego interfejsu użytkownika {#step-5-connect-metamask-to-your-UI}
+
+Teraz, gdy nasz portfel MetaMask jest skonfigurowany, połączmy z nim naszą dapką!
+
+#### Funkcja `connectWallet` {#the-connectWallet-function}
+
+W naszym pliku `interact.js` zaimplementujmy funkcję `connectWallet`, którą następnie możemy wywołać w naszym komponencie `HelloWorld.js`.
+
+Zmodyfikujmy `connectWallet` do następującej postaci:
+
+```javascript
+// interact.js
+
+export const connectWallet = async () => {
+ if (window.ethereum) {
+ try {
+ const addressArray = await window.ethereum.request({
+ method: "eth_requestAccounts",
+ })
+ const obj = {
+ status: "👆🏽 Wpisz wiadomość w polu tekstowym powyżej.",
+ address: addressArray[0],
+ }
+ return obj
+ } catch (err) {
+ return {
+ address: "",
+ status: "😥 " + err.message,
+ }
+ }
+ } else {
+ return {
+ address: "",
+ status: (
+
+
+ {" "}
+ 🦊
+ Musisz zainstalować MetaMask, wirtualny portfel Ethereum, w swojej
+ przeglądarce.
+
+
+
+ ),
+ }
+ }
+}
+```
+
+Więc co dokładnie robi ten gigantyczny blok kodu?
+
+Po pierwsze, sprawdza, czy `window.ethereum` jest włączone w przeglądarce.
+
+`window.ethereum` to globalny interfejs API wstrzykiwany przez MetaMask i innych dostawców portfeli, który pozwala stronom internetowym na żądanie dostępu do kont Ethereum użytkowników. Jeśli zostanie zatwierdzony, może odczytywać dane z blockchainów, z którymi użytkownik jest połączony, i sugerować, aby użytkownik podpisywał wiadomości i transakcje. Sprawdź [dokumentację MetaMask](https://docs.metamask.io/guide/ethereum-provider.html#table-of-contents), aby uzyskać więcej informacji!
+
+Jeśli `window.ethereum` _nie jest_ obecne, oznacza to, że MetaMask nie jest zainstalowany. Powoduje to zwrócenie obiektu JSON, w którym zwrócony `adres` jest pustym ciągiem, a obiekt `status` JSX informuje, że użytkownik musi zainstalować MetaMask.
+
+Teraz, jeśli `window.ethereum` _jest_ obecne, to wtedy robi się ciekawie.
+
+Używając pętli try/catch, spróbujemy połączyć się z MetaMask, wywołując [`window.ethereum.request({ method: "eth_requestAccounts" });`](https://docs.metamask.io/guide/rpc-api.html#eth-requestaccounts). Wywołanie tej funkcji otworzy MetaMask w przeglądarce, gdzie użytkownik zostanie poproszony o podłączenie swojego portfela do Twojej dapki.
+
+- Jeśli użytkownik zdecyduje się połączyć, `method: "eth_requestAccounts"` zwróci tablicę zawierającą wszystkie adresy kont użytkownika, które połączyły się z dappką. W sumie nasza funkcja `connectWallet` zwróci obiekt JSON, który zawiera _pierwszy_ `adres` w tej tablicy (patrz linia 9) oraz wiadomość `status`, która prosi użytkownika o napisanie wiadomości do inteligentnego kontraktu.
+- Jeśli użytkownik odrzuci połączenie, obiekt JSON będzie zawierał pusty ciąg dla zwróconego `adresu` oraz komunikat `status`, który odzwierciedla, że użytkownik odrzucił połączenie.
+
+Teraz, gdy napisaliśmy tę funkcję `connectWallet`, następnym krokiem jest wywołanie jej w naszym komponencie `HelloWorld.js`.
+
+#### Dodaj funkcję `connectWallet` do swojego komponentu interfejsu użytkownika HelloWorld.js {#add-the-connectWallet-function-to-your-HelloWorld-js-ui-component}
+
+Przejdź do funkcji `connectWalletPressed` w `HelloWorld.js` i zaktualizuj ją do następującej postaci:
+
+```javascript
+// HelloWorld.js
+
+const connectWalletPressed = async () => {
+ const walletResponse = await connectWallet()
+ setStatus(walletResponse.status)
+ setWallet(walletResponse.address)
+}
+```
+
+Zauważ, jak większość naszej funkcjonalności jest abstrahowana od naszego komponentu `HelloWorld.js` z pliku `interact.js`? Robimy tak, aby zachować zgodność z paradygmatem M-V-C!
+
+W `connectWalletPressed` po prostu wykonujemy wywołanie await do naszej zaimportowanej funkcji `connectWallet`, a za pomocą jej odpowiedzi aktualizujemy nasze zmienne `status` i `walletAddress` za pomocą ich hooków stanu.
+
+Teraz zapiszmy oba pliki (`HelloWorld.js` i `interact.js`) i przetestujmy nasz dotychczasowy interfejs użytkownika.
+
+Otwórz przeglądarkę na stronie [http://localhost:3000/](http://localhost:3000/) i naciśnij przycisk „Połącz portfel” w prawym górnym rogu strony.
+
+Jeśli masz zainstalowany MetaMask, powinieneś zostać poproszony o podłączenie swojego portfela do Twojej dapki. Zaakceptuj zaproszenie do połączenia.
+
+Powinieneś zobaczyć, że przycisk portfela odzwierciedla teraz, że Twój adres jest połączony! Jeeee 🔥
+
+Następnie spróbuj odświeżyć stronę... to jest dziwne. Nasz przycisk portfela prosi nas o podłączenie MetaMask, mimo że jest już podłączony...
+
+Jednak nie ma się czego bać! Możemy łatwo to rozwiązać (zaadresować?) implementując `getCurrentWalletConnected`, który sprawdzi, czy adres jest już połączony z naszą dappką i odpowiednio zaktualizuje nasz interfejs użytkownika!
+
+#### Funkcja `getCurrentWalletConnected` {#the-getcurrentwalletconnected-function}
+
+Zaktualizuj swoją funkcję `getCurrentWalletConnected` w pliku `interact.js` do następującej postaci:
+
+```javascript
+// interact.js
+
+export const getCurrentWalletConnected = async () => {
+ if (window.ethereum) {
+ try {
+ const addressArray = await window.ethereum.request({
+ method: "eth_accounts",
+ })
+ if (addressArray.length > 0) {
+ return {
+ address: addressArray[0],
+ status: "👆🏽 Wpisz wiadomość w polu tekstowym powyżej.",
+ }
+ } else {
+ return {
+ address: "",
+ status: "🦊 Połącz się z MetaMask za pomocą przycisku w prawym górnym rogu.",
+ }
+ }
+ } catch (err) {
+ return {
+ address: "",
+ status: "😥 " + err.message,
+ }
+ }
+ } else {
+ return {
+ address: "",
+ status: (
+
+
+ {" "}
+ 🦊
+ Musisz zainstalować MetaMask, wirtualny portfel Ethereum, w swojej
+ przeglądarce.
+
+
+
+ ),
+ }
+ }
+}
+```
+
+Ten kod jest _bardzo_ podobny do funkcji `connectWallet`, którą właśnie napisaliśmy w poprzednim kroku.
+
+Główna różnica polega na tym, że zamiast wywoływać metodę `eth_requestAccounts`, która otwiera MetaMask, aby użytkownik mógł połączyć swój portfel, tutaj wywołujemy metodę `eth_accounts`, która po prostu zwraca tablicę zawierającą adresy MetaMask aktualnie połączone z naszą dapką.
+
+Aby zobaczyć tę funkcję w działaniu, wywołajmy ją w naszej funkcji `useEffect` naszego komponentu `HelloWorld.js`:
+
+```javascript
+// HelloWorld.js
+
+useEffect(async () => {
+ const message = await loadCurrentMessage()
+ setMessage(message)
+ addSmartContractListener()
+
+ const { address, status } = await getCurrentWalletConnected()
+ setWallet(address)
+ setStatus(status)
+}, [])
+```
+
+Zauważ, że używamy odpowiedzi z naszego wywołania `getCurrentWalletConnected`, aby zaktualizować nasze zmienne stanu `walletAddress` i `status`.
+
+Teraz, gdy dodałeś ten kod, spróbujmy odświeżyć okno przeglądarki.
+
+Fajnieee! Przycisk powinien informować, że jesteś połączony i pokazywać podgląd adresu podłączonego portfela - nawet po odświeżeniu!
+
+#### Zaimplementuj `addWalletListener` {#implement-addwalletlistener}
+
+Ostatnim krokiem w konfiguracji portfela naszej dapki jest zaimplementowanie nasłuchiwacza portfela, aby nasz interfejs użytkownika aktualizował się, gdy zmieni się stan naszego portfela, na przykład gdy użytkownik się rozłączy lub zmieni konto.
+
+W pliku `HelloWorld.js` zmodyfikuj swoją funkcję `addWalletListener` w następujący sposób:
+
+```javascript
+// HelloWorld.js
+
+function addWalletListener() {
+ if (window.ethereum) {
+ window.ethereum.on("accountsChanged", (accounts) => {
+ if (accounts.length > 0) {
+ setWallet(accounts[0])
+ setStatus("👆🏽 Wpisz wiadomość w polu tekstowym powyżej.")
+ } else {
+ setWallet("")
+ setStatus("🦊 Połącz się z MetaMask za pomocą przycisku w prawym górnym rogu.")
+ }
+ })
+ } else {
+ setStatus(
+
+ {" "}
+ 🦊
+ Musisz zainstalować MetaMask, wirtualny portfel Ethereum, w swojej przeglądarce.
+
+
+ )
+ }
+}
+```
+
+Założę się, że w tym momencie nie potrzebujesz nawet naszej pomocy, aby zrozumieć, co się tutaj dzieje, ale dla porządku szybko to omówmy:
+
+- Najpierw nasza funkcja sprawdza, czy `window.ethereum` jest włączone (tj. MetaMask jest zainstalowany).
+ - Jeśli nie jest, po prostu ustawiamy naszą zmienną stanu `status` na ciąg JSX, który prosi użytkownika o zainstalowanie MetaMask.
+ - Jeśli jest włączone, ustawiamy nasłuchiwacz `window.ethereum.on("accountsChanged")` w linii 3, który nasłuchuje zmian stanu w portfelu MetaMask, co obejmuje sytuacje, gdy użytkownik podłącza dodatkowe konto do dapki, zmienia konta lub odłącza konto. Jeśli co najmniej jedno konto jest połączone, zmienna stanu `walletAddress` jest aktualizowana jako pierwsze konto w tablicy `konta` zwróconej przez nasłuchiwacz. W przeciwnym razie `walletAddress` jest ustawiany jako pusty ciąg.
+
+Na koniec musimy wywołać ją w naszej funkcji `useEffect`:
+
+```javascript
+// HelloWorld.js
+
+useEffect(async () => {
+ const message = await loadCurrentMessage()
+ setMessage(message)
+ addSmartContractListener()
+
+ const { address, status } = await getCurrentWalletConnected()
+ setWallet(address)
+ setStatus(status)
+
+ addWalletListener()
+}, [])
+```
+
+I to wszystko! Pomyślnie ukończyliśmy programowanie całej naszej funkcjonalności portfela! Teraz przejdźmy do naszego ostatniego zadania: aktualizacji wiadomości zapisanej w naszym inteligentnym kontrakcie!
+
+### Krok 6: Zaimplementuj funkcję `updateMessage` {#step-6-implement-the-updateMessage-function}
+
+Dobra, ekipa, dotarliśmy do ostatniej prostej! W `updateMessage` w swoim pliku `interact.js`, zrobimy następujące rzeczy:
+
+1. Upewnij się, że wiadomość, którą chcemy opublikować w naszym inteligentnym kontakcie, jest ważna
+2. Podpisz naszą transakcję za pomocą MetaMask
+3. Wywołaj tę funkcję z naszego komponentu frontendowego `HelloWorld.js`
+
+To nie potrwa długo; dokończmy tę dappkę!
+
+#### Obsługa błędów wejściowych {#input-error-handling}
+
+Naturalnie, sensowne jest posiadanie jakiejś formy obsługi błędów wejściowych na początku funkcji.
+
+Będziemy chcieli, aby nasza funkcja zakończyła się wcześniej, jeśli nie ma zainstalowanego rozszerzenia MetaMask, nie jest podłączony portfel (tj. przekazany `address` jest pustym ciągiem znaków) lub `message` jest pustym ciągiem znaków. Dodajmy następującą obsługę błędów do `updateMessage`:
+
+```javascript
+// interact.js
+
+export const updateMessage = async (address, message) => {
+ if (!window.ethereum || address === null) {
+ return {
+ status:
+ "💡 Połącz swój portfel MetaMask, aby zaktualizować wiadomość na blockchainie.",
+ }
+ }
+
+ if (message.trim() === "") {
+ return {
+ status: "❌ Twoja wiadomość nie może być pustym ciągiem znaków.",
+ }
+ }
+}
+```
+
+Teraz, gdy mamy właściwą obsługę błędów wejściowych, nadszedł czas, aby podpisać transakcję za pomocą MetaMask!
+
+#### Podpisywanie naszej transakcji {#signing-our-transaction}
+
+Jeśli jesteś już zaznajomiony z tradycyjnymi transakcjami Ethereum web3, kod, który napiszemy dalej, będzie bardzo znajomy. Poniżej kodu obsługi błędów wejściowych dodaj następujący kod do `updateMessage`:
+
+```javascript
+// interact.js
+
+// ustaw parametry transakcji
+const transactionParameters = {
+ to: contractAddress, // Wymagane z wyjątkiem publikacji kontraktów.
+ from: address, // musi pasować do aktywnego adresu użytkownika.
+ data: helloWorldContract.methods.update(message).encodeABI(),
+}
+
+// podpisz transakcję
+try {
+ const txHash = await window.ethereum.request({
+ method: "eth_sendTransaction",
+ params: [transactionParameters],
+ })
+ return {
+ status: (
+
+ ✅{" "}
+
+ Zobacz status swojej transakcji na Etherscan!
+
+
+ ℹ️ Gdy transakcja zostanie zweryfikowana przez sieć, wiadomość zostanie
+ zaktualizowana automatycznie.
+
+ ),
+ }
+} catch (error) {
+ return {
+ status: "😥 " + error.message,
+ }
+}
+```
+
+Przeanalizujmy, co się dzieje. Najpierw ustawiamy parametry naszej transakcji, gdzie:
+
+- `to` określa adres odbiorcy (nasz inteligentny kontrakt)
+- `from` określa sygnatariusza transakcji, zmienną `address`, którą przekazaliśmy do naszej funkcji
+- `data` zawiera wywołanie metody `update` naszego inteligentnego kontraktu Witaj Świecie, otrzymując jako dane wejściowe naszą zmienną ciągu znaków `message`
+
+Następnie wykonujemy wywołanie await, `window.ethereum.request`, w którym prosimy MetaMask o podpisanie transakcji. Zauważ, że w liniach 11 i 12 określamy naszą metodę eth, `eth_sendTransaction` i przekazujemy nasze `transactionParameters`.
+
+W tym momencie w przeglądarce otworzy się MetaMask i poprosi użytkownika o podpisanie lub odrzucenie transakcji.
+
+- Jeśli transakcja się powiedzie, funkcja zwróci obiekt JSON, w którym ciąg JSX `status` prosi użytkownika o sprawdzenie Etherscan w celu uzyskania dalszych informacji o transakcji.
+- Jeśli transakcja się nie powiedzie, funkcja zwróci obiekt JSON, w którym ciąg znaków `status` przekaże komunikat o błędzie.
+
+W sumie nasza funkcja `updateMessage` powinna wyglądać tak:
+
+```javascript
+// interact.js
+
+export const updateMessage = async (address, message) => {
+ // obsługa błędów wejściowych
+ if (!window.ethereum || address === null) {
+ return {
+ status:
+ "💡 Połącz swój portfel MetaMask, aby zaktualizować wiadomość na blockchainie.",
+ }
+ }
+
+ if (message.trim() === "") {
+ return {
+ status: "❌ Twoja wiadomość nie może być pustym ciągiem znaków.",
+ }
+ }
+
+ // ustaw parametry transakcji
+ const transactionParameters = {
+ to: contractAddress, // Wymagane z wyjątkiem publikacji kontraktów.
+ from: address, // musi pasować do aktywnego adresu użytkownika.
+ data: helloWorldContract.methods.update(message).encodeABI(),
+ }
+
+ // podpisz transakcję
+ try {
+ const txHash = await window.ethereum.request({
+ method: "eth_sendTransaction",
+ params: [transactionParameters],
+ })
+ return {
+ status: (
+
+ ✅{" "}
+
+ Zobacz status swojej transakcji na Etherscan!
+
+
+ ℹ️ Gdy transakcja zostanie zweryfikowana przez sieć, wiadomość zostanie
+ zaktualizowana automatycznie.
+
+ ),
+ }
+ } catch (error) {
+ return {
+ status: "😥 " + error.message,
+ }
+ }
+}
+```
+
+Na koniec musimy połączyć naszą funkcję `updateMessage` z naszym komponentem `HelloWorld.js`.
+
+#### Połącz `updateMessage` z frontendem `HelloWorld.js` {#connect-updatemessage-to-the-helloworld-js-frontend}
+
+Nasza funkcja `onUpdatePressed` powinna wykonać wywołanie await do zaimportowanej funkcji `updateMessage` i zmodyfikować zmienną stanu `status`, aby odzwierciedlić, czy nasza transakcja się powiodła, czy nie:
+
+```javascript
+// HelloWorld.js
+
+const onUpdatePressed = async () => {
+ const { status } = await updateMessage(walletAddress, newMessage)
+ setStatus(status)
+}
+```
+
+To super czyste i proste. I zgadnij co... TWOJA DAPPKA JEST UKOŃCZONA!!!
+
+Śmiało przetestuj przycisk **Aktualizuj**!
+
+### Stwórz swoją własną dappkę {#make-your-own-custom-dapp}
+
+Hura, dotarłeś do końca samouczka! Podsumowując, nauczyłeś się, jak:
+
+- Podłącz portfel MetaMask do swojego projektu dapp
+- Odczytaj dane ze swojego inteligentnego kontraktu za pomocą interfejsu API [Alchemy Web3](https://docs.alchemy.com/alchemy/documentation/alchemy-web3)
+- Podpisz transakcje Ethereum za pomocą MetaMask
+
+Teraz jesteś w pełni wyposażony, aby zastosować umiejętności z tego samouczka do zbudowania własnego, niestandardowego projektu dapp! Jak zawsze, jeśli masz jakieś pytania, nie wahaj się skontaktować z nami w celu uzyskania pomocy na [Discordzie Alchemy](https://discord.gg/gWuC7zB). 🧙♂️
+
+Po ukończeniu tego samouczka daj nam znać, jak Ci poszło lub czy masz jakieś uwagi, oznaczając nas na Twitterze [@alchemyplatform](https://twitter.com/AlchemyPlatform)!
diff --git a/public/content/translations/pl/developers/tutorials/hello-world-smart-contract/index.md b/public/content/translations/pl/developers/tutorials/hello-world-smart-contract/index.md
new file mode 100644
index 00000000000..51f58532f80
--- /dev/null
+++ b/public/content/translations/pl/developers/tutorials/hello-world-smart-contract/index.md
@@ -0,0 +1,367 @@
+---
+title: "Inteligentny kontrakt Hello World dla początkujących"
+description: "Samouczek wprowadzający na temat pisania i wdrażania prostego inteligentnego kontraktu na Ethereum."
+author: "elanh"
+tags:
+ [
+ "solidity",
+ "hardhat",
+ "alchemy",
+ "smart kontrakty",
+ "wdrażanie"
+ ]
+skill: beginner
+lang: pl
+published: 2021-03-31
+---
+
+Jeśli dopiero zaczynasz przygodę z tworzeniem oprogramowania blockchain i nie wiesz, od czego zacząć, lub jeśli po prostu chcesz zrozumieć, jak wdrażać inteligentne kontrakty i wchodzić z nimi w interakcję, ten przewodnik jest dla Ciebie. Przeprowadzimy Cię przez proces tworzenia i wdrażania prostego inteligentnego kontraktu w sieci testowej Sepolia przy użyciu wirtualnego portfela [MetaMask](https://metamask.io/), [Solidity](https://docs.soliditylang.org/en/v0.8.0/), [Hardhat](https://hardhat.org/) i [Alchemy](https://www.alchemy.com/) (nie martw się, jeśli jeszcze nie rozumiesz, co to wszystko znaczy, wyjaśnimy to).
+
+W [części 2](https://docs.alchemy.com/docs/interacting-with-a-smart-contract) tego samouczka omówimy, jak wejść w interakcję z naszym inteligentnym kontraktem po jego wdrożeniu, a w [części 3](https://www.alchemy.com/docs/submitting-your-smart-contract-to-etherscan) omówimy, jak opublikować go na Etherscan.
+
+Jeśli w dowolnym momencie będziesz mieć pytania, śmiało odezwij się na [Discordzie Alchemy](https://discord.gg/gWuC7zB)!
+
+## Krok 1: Połącz się z siecią Ethereum {#step-1}
+
+Istnieje wiele sposobów na wysyłanie żądań do łańcucha Ethereum. Dla uproszczenia użyjemy darmowego konta na Alchemy, platformy deweloperskiej i interfejsu API blockchain, która pozwala nam komunikować się z łańcuchem Ethereum bez konieczności uruchamiania własnych węzłów. Platforma posiada również narzędzia deweloperskie do monitorowania i analityki, które wykorzystamy w tym samouczku, aby zrozumieć, co dzieje się „pod maską” podczas wdrażania naszego inteligentnego kontraktu. Jeśli nie masz jeszcze konta Alchemy, [możesz zarejestrować się za darmo tutaj](https://dashboard.alchemy.com/signup).
+
+## Krok 2: Stwórz swoją aplikację (i klucz API) {#step-2}
+
+Po utworzeniu konta Alchemy możesz wygenerować klucz API, tworząc aplikację. Pozwoli nam to na wysyłanie żądań do sieci testowej Sepolia. Jeśli nie znasz sieci testowych, sprawdź [tę stronę](/developers/docs/networks/).
+
+1. Przejdź na stronę "Utwórz nową aplikację" w pulpicie nawigacyjnym Alchemy, wybierając "Wybierz aplikację" na pasku nawigacyjnym i klikając "Utwórz nową aplikację"
+
+
+
+2. Nazwij swoją aplikację "Hello World", podaj krótki opis i wybierz przypadek użycia, np. "Infrastruktura i narzędzia". Następnie wyszukaj "Ethereum" i wybierz sieć.
+
+
+
+3. Kliknij "Dalej", aby kontynuować, następnie "Utwórz aplikację" i to wszystko! Twoja aplikacja powinna pojawić się w rozwijanym menu paska nawigacyjnego, z kluczem API dostępnym do skopiowania.
+
+## Krok 3: Utwórz konto Ethereum (adres) {#step-3}
+
+Potrzebujemy konta Ethereum do wysyłania i odbierania transakcji. W tym samouczku użyjemy MetaMask, wirtualnego portfela w przeglądarce, który służy do zarządzania adresem konta Ethereum. Więcej o [transakcjach](/developers/docs/transactions/).
+
+Możesz pobrać MetaMask i utworzyć darmowe konto Ethereum [tutaj](https://metamask.io/download). Podczas tworzenia konta lub jeśli już je posiadasz, pamiętaj, aby przełączyć się na sieć testową "Sepolia" za pomocą rozwijanego menu sieci (abyśmy nie mieli do czynienia z prawdziwymi pieniędzmi).
+
+Jeśli nie widzisz na liście sieci Sepolia, przejdź do menu, następnie do opcji Zaawansowane i przewiń w dół, aby włączyć opcję "Pokaż sieci testowe". W menu wyboru sieci wybierz kartę "Niestandardowe", aby znaleźć listę sieci testowych, i wybierz "Sepolia".
+
+
+
+## Krok 4: Dodaj ether z kranu (faucet) {#step-4}
+
+Aby wdrożyć nasz inteligentny kontrakt w sieci testowej, będziemy potrzebować trochę fałszywego ETH. Aby otrzymać Sepolia ETH, możesz przejść do [szczegółów sieci Sepolia](/developers/docs/networks/#sepolia), aby zobaczyć listę różnych kranów (faucetów). Jeśli jeden nie działa, spróbuj innego, ponieważ czasami mogą się wyczerpać. Otrzymanie fałszywego ETH może zająć trochę czasu ze względu na ruch w sieci. Wkrótce powinieneś zobaczyć ETH na swoim koncie Metamask!
+
+## Krok 5: Sprawdź saldo {#step-5}
+
+Aby upewnić się, że nasze saldo tam jest, wykonajmy żądanie [eth_getBalance](/developers/docs/apis/json-rpc/#eth_getbalance) za pomocą [narzędzia kompozytora Alchemy](https://sandbox.alchemy.com/?network=ETH_SEPOLIA&method=eth_getBalance&body.id=1&body.jsonrpc=2.0&body.method=eth_getBalance&body.params%5B0%5D=&body.params%5B1%5D=latest). Zwróci to ilość ETH w naszym portfelu. Po wprowadzeniu adresu konta MetaMask i kliknięciu „Wyślij żądanie” powinieneś zobaczyć następującą odpowiedź:
+
+```json
+{ "jsonrpc": "2.0", "id": 0, "result": "0x2B5E3AF16B1880000" }
+```
+
+> **UWAGA:** Ten wynik jest w wei, a nie w ETH. Wei jest używany jako najmniejsza jednostka etheru. Przeliczenie z wei na ETH wynosi: 1 eth = 1018 wei. Więc jeśli przekonwertujemy 0x2B5E3AF16B1880000 na liczbę dziesiętną, otrzymamy 5\*10¹⁸, co równa się 5 ETH.
+>
+> Uff! Nasze fałszywe pieniądze są na miejscu .
+
+## Krok 6: Zainicjuj nasz projekt {#step-6}
+
+Najpierw musimy utworzyć folder dla naszego projektu. Przejdź do wiersza poleceń i wpisz:
+
+```
+mkdir hello-world
+cd hello-world
+```
+
+Teraz, gdy jesteśmy w folderze naszego projektu, użyjemy `npm init`, aby zainicjować projekt. Jeśli nie masz jeszcze zainstalowanego npm, postępuj zgodnie z [tymi instrukcjami](https://docs.alchemyapi.io/alchemy/guides/alchemy-for-macs#1-install-nodejs-and-npm) (będziemy również potrzebować Node.js, więc pobierz go również!).
+
+```
+npm init
+```
+
+Nie ma większego znaczenia, jak odpowiesz na pytania instalacyjne, dla porównania przedstawiamy, jak my to zrobiliśmy:
+
+```
+nazwa pakietu: (hello-world)
+wersja: (1.0.0)
+opis: inteligentny kontrakt hello world
+punkt wejścia: (index.js)
+polecenie testowe:
+repozytorium git:
+słowa kluczowe:
+autor:
+licencja: (ISC)
+Zapisywanie do /Users/.../.../.../hello-world/package.json:
+
+{
+ "name": "hello-world",
+ "version": "1.0.0",
+ "description": "inteligentny kontrakt hello world",
+ "main": "index.js",
+ "scripts": {
+ "test": "echo \"Błąd: nie określono testu\" && exit 1"
+ },
+ "author": "",
+ "license": "ISC"
+}
+```
+
+Zatwierdź plik package.json i gotowe!
+
+## Krok 7: Pobierz [Hardhat](https://hardhat.org/getting-started/#overview) {#step-7}
+
+Hardhat to środowisko programistyczne do kompilacji, wdrażania, testowania i debugowania oprogramowania Ethereum. Pomaga deweloperom w tworzeniu inteligentnych kontraktów i dapek lokalnie przed wdrożeniem ich na żywym łańcuchu.
+
+W naszym projekcie `hello-world` uruchom:
+
+```
+npm install --save-dev hardhat
+```
+
+Sprawdź tę stronę, aby uzyskać więcej szczegółów na temat [instrukcji instalacji](https://hardhat.org/getting-started/#overview).
+
+## Krok 8: Stwórz projekt Hardhat {#step-8}
+
+W folderze naszego projektu uruchom:
+
+```
+npx hardhat
+```
+
+Powinieneś wtedy zobaczyć wiadomość powitalną i opcję wyboru tego, co chcesz zrobić. Wybierz „utwórz pusty hardhat.config.js”:
+
+```
+888 888 888 888 888
+888 888 888 888 888
+888 888 888 888 888
+8888888888 8888b. 888d888 .d88888 88888b. 8888b. 888888
+888 888 "88b 888P" d88" 888 888 "88b "88b 888
+888 888 .d888888 888 888 888 888 888 .d888888 888
+888 888 888 888 888 Y88b 888 888 888 888 888 Y88b.
+888 888 "Y888888 888 "Y88888 888 888 "Y888888 "Y888
+
+👷 Witamy w Hardhat v2.0.11 👷?
+
+Co chcesz zrobić? …
+Stwórz przykładowy projekt
+❯ Stwórz pusty plik hardhat.config.js
+Wyjdź
+```
+
+Spowoduje to wygenerowanie dla nas pliku `hardhat.config.js`, w którym określimy całą konfigurację naszego projektu (w kroku 13).
+
+## Krok 9: Dodaj foldery projektu {#step-9}
+
+Aby utrzymać porządek w naszym projekcie, utworzymy dwa nowe foldery. Przejdź do katalogu głównego projektu w wierszu poleceń i wpisz:
+
+```
+mkdir contracts
+mkdir scripts
+```
+
+- w `contracts/` będziemy przechowywać plik z kodem naszego inteligentnego kontraktu hello world
+- w `scripts/` będziemy przechowywać skrypty do wdrażania naszego kontraktu i interakcji z nim
+
+## Krok 10: Napisz nasz kontrakt {#step-10}
+
+Możesz zadawać sobie pytanie: kiedy, do licha, zaczniemy pisać kod?? Cóż, jesteśmy tutaj, w kroku 10.
+
+Otwórz projekt hello-world w swoim ulubionym edytorze (my lubimy [VSCode](https://code.visualstudio.com/)). Inteligentne kontrakty pisane są w języku o nazwie Solidity, którego użyjemy do napisania naszego inteligentnego kontraktu HelloWorld.sol.
+
+1. Przejdź do folderu "contracts" i utwórz nowy plik o nazwie HelloWorld.sol
+2. Poniżej znajduje się przykładowy inteligentny kontrakt Hello World z Ethereum Foundation, którego będziemy używać w tym samouczku. Skopiuj i wklej poniższą zawartość do pliku HelloWorld.sol i koniecznie przeczytaj komentarze, aby zrozumieć, co robi ten kontrakt:
+
+```solidity
+// Określa wersję Solidity, używając wersjonowania semantycznego.
+// Dowiedz się więcej: https://solidity.readthedocs.io/en/v0.5.10/layout-of-source-files.html#pragma
+pragma solidity ^0.7.0;
+
+// Definiuje kontrakt o nazwie `HelloWorld`.
+// Kontrakt to zbiór funkcji i danych (jego stanu). Po wdrożeniu kontrakt znajduje się pod określonym adresem na blockchainie Ethereum. Dowiedz się więcej: https://solidity.readthedocs.io/en/v0.5.10/structure-of-a-contract.html
+contract HelloWorld {
+
+ // Deklaruje zmienną stanu `message` typu `string`.
+ // Zmienne stanu to zmienne, których wartości są trwale przechowywane w pamięci kontraktu. Słowo kluczowe `public` udostępnia zmienne z zewnątrz kontraktu i tworzy funkcję, którą inne kontrakty lub klienci mogą wywołać w celu uzyskania dostępu do wartości.
+ string public message;
+
+ // Podobnie jak w wielu obiektowych językach programowania opartych na klasach, konstruktor jest specjalną funkcją, która jest wykonywana tylko podczas tworzenia kontraktu.
+ // Konstruktory służą do inicjalizacji danych kontraktu. Dowiedz się więcej:https://solidity.readthedocs.io/en/v0.5.10/contracts.html#constructors
+ constructor(string memory initMessage) {
+
+ // Akceptuje argument typu string `initMessage` i ustawia jego wartość w zmiennej `message` w pamięci kontraktu).
+ message = initMessage;
+ }
+
+ // Funkcja publiczna, która akceptuje argument typu string i aktualizuje zmienną `message` w pamięci.
+ function update(string memory newMessage) public {
+ message = newMessage;
+ }
+}
+```
+
+To jest bardzo prosty inteligentny kontrakt, który przechowuje wiadomość po utworzeniu i może być aktualizowany przez wywołanie funkcji `update`.
+
+## Krok 11: Połącz MetaMask i Alchemy ze swoim projektem {#step-11}
+
+Stworzyliśmy portfel MetaMask, konto Alchemy i napisaliśmy nasz inteligentny kontrakt, teraz nadszedł czas, aby połączyć te trzy elementy.
+
+Każda transakcja wysłana z Twojego wirtualnego portfela wymaga podpisu przy użyciu Twojego unikalnego klucza prywatnego. Aby udzielić naszemu programowi tego uprawnienia, możemy bezpiecznie przechowywać nasz klucz prywatny (i klucz API Alchemy) w pliku środowiskowym.
+
+> Aby dowiedzieć się więcej o wysyłaniu transakcji, sprawdź [ten samouczek](/developers/tutorials/sending-transactions-using-web3-and-alchemy/) o wysyłaniu transakcji przy użyciu web3.
+
+Najpierw zainstaluj pakiet dotenv w katalogu swojego projektu:
+
+```
+npm install dotenv --save
+```
+
+Następnie utwórz plik `.env` w katalogu głównym naszego projektu i dodaj do niego swój klucz prywatny MetaMask oraz adres URL HTTP API Alchemy.
+
+- Postępuj zgodnie z [tymi instrukcjami](https://support.metamask.io/configure/accounts/how-to-export-an-accounts-private-key/), aby wyeksportować swój klucz prywatny
+- Poniżej dowiesz się, jak uzyskać adres URL interfejsu API HTTP Alchemy
+
+
+
+Skopiuj adres URL interfejsu API Alchemy
+
+Twój plik `.env` powinien wyglądać następująco:
+
+```
+API_URL = "https://eth-sepolia.g.alchemy.com/v2/twój-klucz-api"
+PRIVATE_KEY = "twój-klucz-prywatny-metamask"
+```
+
+Aby faktycznie połączyć je z naszym kodem, odwołamy się do tych zmiennych w naszym pliku `hardhat.config.js` w kroku 13.
+
+
+
+
+Nie commituj pliku .env! Upewnij się, że nigdy nie udostępniasz ani nie ujawniasz nikomu swojego pliku .env, ponieważ w ten sposób narażasz swoje poufne dane. Jeśli używasz kontroli wersji, dodaj swój plik .env do pliku gitignore.
+
+
+
+
+## Krok 12: Zainstaluj Ethers.js {#step-12-install-ethersjs}
+
+Ethers.js to biblioteka, która ułatwia interakcję i wysyłanie żądań do Ethereum, opakowując [standardowe metody JSON-RPC](/developers/docs/apis/json-rpc/) w bardziej przyjazne dla użytkownika metody.
+
+Hardhat bardzo ułatwia integrację [wtyczek](https://hardhat.org/plugins/) w celu uzyskania dodatkowych narzędzi i rozszerzonej funkcjonalności. Skorzystamy z [wtyczki Ethers](https://hardhat.org/docs/plugins/official-plugins#hardhat-ethers) do wdrażania kontraktów ([Ethers.js](https://github.com/ethers-io/ethers.js/) ma kilka bardzo przejrzystych metod wdrażania kontraktów).
+
+W katalogu projektu wpisz:
+
+```
+npm install --save-dev @nomiclabs/hardhat-ethers "ethers@^5.0.0"
+```
+
+Będziemy również wymagać ethers w naszym pliku `hardhat.config.js` w następnym kroku.
+
+## Krok 13: Zaktualizuj hardhat.config.js {#step-13-update-hardhatconfigjs}
+
+Do tej pory dodaliśmy kilka zależności i wtyczek, teraz musimy zaktualizować `hardhat.config.js`, aby nasz projekt wiedział o wszystkich.
+
+Zaktualizuj swój `hardhat.config.js`, aby wyglądał następująco:
+
+```
+require('dotenv').config();
+
+require("@nomiclabs/hardhat-ethers");
+const { API_URL, PRIVATE_KEY } = process.env;
+
+/**
+* @type import('hardhat/config').HardhatUserConfig
+*/
+module.exports = {
+ solidity: "0.7.3",
+ defaultNetwork: "sepolia",
+ networks: {
+ hardhat: {},
+ sepolia: {
+ url: API_URL,
+ accounts: [`0x${PRIVATE_KEY}`]
+ }
+ },
+}
+```
+
+## Krok 14: Skompiluj nasz kontrakt {#step-14-compile-our-contracts}
+
+Aby upewnić się, że wszystko do tej pory działa, skompilujmy nasz kontrakt. Zadanie `compile` jest jednym z wbudowanych zadań hardhat.
+
+Z wiersza poleceń uruchom:
+
+```
+npx hardhat compile
+```
+
+Możesz otrzymać ostrzeżenie o `SPDX license identifier not provided in source file` (brak identyfikatora licencji SPDX w pliku źródłowym), ale nie musisz się tym martwić — miejmy nadzieję, że wszystko inne wygląda dobrze! Jeśli nie, zawsze możesz napisać wiadomość na [discordzie Alchemy](https://discord.gg/u72VCg3).
+
+## Krok 15: Napisz nasz skrypt wdrożeniowy {#step-15-write-our-deploy-scripts}
+
+Teraz, gdy nasz kontrakt jest napisany, a nasz plik konfiguracyjny jest gotowy, nadszedł czas, aby napisać nasz skrypt wdrażający kontrakt.
+
+Przejdź do folderu `scripts/` i utwórz nowy plik o nazwie `deploy.js`, dodając do niego następującą zawartość:
+
+```
+async function main() {
+ const HelloWorld = await ethers.getContractFactory("HelloWorld");
+
+ // Rozpocznij wdrażanie, zwracając obietnicę, która prowadzi do obiektu kontraktu
+ const hello_world = await HelloWorld.deploy("Hello World!");
+ console.log("Kontrakt wdrożony pod adresem:", hello_world.address);}
+
+main()
+ .then(() => process.exit(0))
+ .catch(error => {
+ console.error(error);
+ process.exit(1);
+ });
+```
+
+Hardhat wykonuje niesamowitą robotę, wyjaśniając, co robi każda z tych linii kodu w swoim [samouczku dotyczącym kontraktów](https://hardhat.org/tutorial/testing-contracts.html#writing-tests), a my przyjęliśmy ich wyjaśnienia tutaj.
+
+```
+const HelloWorld = await ethers.getContractFactory("HelloWorld");
+```
+
+`ContractFactory` w ethers.js to abstrakcja używana do wdrażania nowych inteligentnych kontraktów, więc `HelloWorld` jest tutaj fabryką dla instancji naszego kontraktu hello world. Podczas korzystania z wtyczki `hardhat-ethers` instancje `ContractFactory` i `Contract` są domyślnie połączone z pierwszym sygnatariuszem.
+
+```
+const hello_world = await HelloWorld.deploy();
+```
+
+Wywołanie `deploy()` na `ContractFactory` rozpocznie wdrażanie i zwróci `Promise`, które prowadzi do `Contract`. Jest to obiekt, który ma metodę dla każdej z naszych funkcji inteligentnego kontraktu.
+
+## Krok 16: Wdróż nasz kontrakt {#step-16-deploy-our-contract}
+
+Jesteśmy wreszcie gotowi do wdrożenia naszego inteligentnego kontraktu! Przejdź do wiersza poleceń i uruchom:
+
+```
+npx hardhat run scripts/deploy.js --network sepolia
+```
+
+Powinieneś wtedy zobaczyć coś takiego:
+
+```
+Kontrakt wdrożony pod adresem: 0x6cd7d44516a20882cEa2DE9f205bF401c0d23570
+```
+
+Jeśli przejdziemy do [Etherscan Sepolia](https://sepolia.etherscan.io/) i wyszukamy adres naszego kontraktu, powinniśmy zobaczyć, że został on pomyślnie wdrożony. Transakcja będzie wyglądać mniej więcej tak:
+
+
+
+Adres `Od` powinien pasować do adresu Twojego konta MetaMask, a adres `Do` będzie miał napis „Tworzenie Kontraktu”, ale jeśli klikniemy w transakcję, zobaczymy adres naszego kontraktu w polu `Do`:
+
+
+
+Gratulacje! Właśnie wdrożyłeś inteligentny kontrakt w łańcuchu Ethereum 🎉
+
+Aby zrozumieć, co dzieje się pod maską, przejdźmy do karty Explorer w naszym [panelu Alchemy](https://dashboard.alchemyapi.io/explorer). Jeśli masz wiele aplikacji Alchemy, pamiętaj, aby filtrować według aplikacji i wybrać „Hello World”.
+
+
+Tutaj zobaczysz kilka wywołań JSON-RPC, które Hardhat/Ethers wykonały za nas „pod maską”, gdy wywołaliśmy funkcję `.deploy()`. Dwa ważne, które należy tu wymienić, to [`eth_sendRawTransaction`](https://www.alchemy.com/docs/node/abstract/abstract-api-endpoints/eth-send-raw-transaction), czyli żądanie faktycznego zapisania naszego kontraktu w łańcuchu Sepolia, oraz [`eth_getTransactionByHash`](https://www.alchemy.com/docs/node/abstract/abstract-api-endpoints/eth-get-transaction-by-hash), czyli żądanie odczytania informacji o naszej transakcji na podstawie haszu (typowy wzorzec podczas
+transakcji). Aby dowiedzieć się więcej o wysyłaniu transakcji, zapoznaj się z tym samouczkiem na temat [wysyłania transakcji za pomocą Web3](/developers/tutorials/sending-transactions-using-web3-and-alchemy/)
+
+To wszystko w części 1 tego samouczka, w części 2 faktycznie [wejdziemy w interakcję z naszym inteligentnym kontraktem](https://www.alchemy.com/docs/interacting-with-a-smart-contract) poprzez aktualizację naszej początkowej wiadomości, a w części 3 [opublikujemy nasz inteligentny kontrakt na Etherscan](https://www.alchemy.com/docs/submitting-your-smart-contract-to-etherscan), aby każdy wiedział, jak z nim wchodzić w interakcję.
+
+**Chcesz dowiedzieć się więcej o Alchemy?** Sprawdź naszą [stronę internetową](https://www.alchemy.com/eth). Nie chcesz przegapić żadnej aktualizacji? Zapisz się do naszego newslettera [tutaj](https://www.alchemy.com/newsletter)! Pamiętaj, aby dołączyć również do naszego [Discorda](https://discord.gg/u72VCg3).\*\*.
diff --git a/public/content/translations/pl/developers/tutorials/how-to-implement-an-erc721-market/index.md b/public/content/translations/pl/developers/tutorials/how-to-implement-an-erc721-market/index.md
index 4b8ddf84a6e..2effc79c82d 100644
--- a/public/content/translations/pl/developers/tutorials/how-to-implement-an-erc721-market/index.md
+++ b/public/content/translations/pl/developers/tutorials/how-to-implement-an-erc721-market/index.md
@@ -1,12 +1,8 @@
---
-title: Jak wdrożyć rynek ERC-721
-description: Jak umieścić tokenizowane przedmioty w celu sprzedaży w zdecentralizowanym serwisie ogłoszeniowym
-author: "Alberto Cuesta Cañada"
-tags:
- - "inteligentne kontrakty"
- - "erc-721"
- - "solidity"
- - "tokeny"
+title: "Jak wdrożyć rynek ERC-721"
+description: "Jak umieścić tokenizowane przedmioty w celu sprzedaży w zdecentralizowanym serwisie ogłoszeniowym"
+author: "Alberto Cuesta Cañada"
+tags: [ "smart kontrakty", "erc-721", "solidity", "tokeny" ]
skill: intermediate
lang: pl
published: 2020-03-19
@@ -26,13 +22,13 @@ Blockchain ponownie zmieni te rynki — pozwolę sobie pokazać, w jaki sposób.
Model biznesowy serwisu ogłoszeniowego w publicznym blockchainie będzie musiał różnić się od modelu Ebay i spółki.
-Po pierwsze, jest [kąt decentralizacji](/developers/docs/web2-vs-web3/). Istniejące platformy muszą utrzymywać własne serwery. Zdecentralizowana platforma jest utrzymywana przez użytkowników, a zatem koszt obsługi głównej platformy spadnie do zera dla właściciela platformy.
+Po pierwsze, jest [aspekt decentralizacji](/developers/docs/web2-vs-web3/). Istniejące platformy muszą utrzymywać własne serwery. Zdecentralizowana platforma jest utrzymywana przez użytkowników, a zatem koszt obsługi głównej platformy spadnie do zera dla właściciela platformy.
-Następnie frontend — strona internetowa lub interfejs dający dostęp do platformy. Tutaj jest wiele możliwości. Właściciele platformy mogą ograniczyć dostęp i zmusić wszystkich do korzystania ze swojego interfejsu, pobierając opłaty. Właściciele platform mogą również zdecydować o otwarciu dostępu (Power to the People!) i pozwolić każdemu budować interfejsy na platformie. Lub właściciele mogliby wybrać jakiekolwiek pośrednie podejście.
+Następnie frontend — strona internetowa lub interfejs dający dostęp do platformy. Tutaj jest wiele możliwości. Właściciele platformy mogą ograniczyć dostęp i zmusić wszystkich do korzystania ze swojego interfejsu, pobierając opłaty. Właściciele platformy mogą również zdecydować się na otwarcie dostępu (Władza w ręce ludu!) i pozwolić każdemu na budowanie interfejsów do platformy. Lub właściciele mogliby wybrać jakiekolwiek pośrednie podejście.
_Liderzy biznesu, którzy mają więcej wizji niż ja, będą wiedzieć, jak na tym zarabiać. Widzę jedynie, że różni się to od status quo i prawdopodobnie jest opłacalne._
-Ponadto istnieje kąt automatyzacji i płatności. Niektóre rzeczy mogą być bardzo [skutecznie tokenizowane](https://hackernoon.com/tokenization-of-digital-assets-g0ffk3v8s?ref=hackernoon.com) i sprzedawane w serwisach. Tokenizowane aktywa są łatwo przenoszone w blockchainie. Bardzo skomplikowane metody płatności mogą być łatwo wdrożone w blockchainie.
+Ponadto istnieje kąt automatyzacji i płatności. Niektóre rzeczy można bardzo [skutecznie stokenizować](https://hackernoon.com/tokenization-of-digital-assets-g0ffk3v8s?ref=hackernoon.com) i handlować nimi na tablicy ogłoszeń. Tokenizowane aktywa są łatwo przenoszone w blockchainie. Bardzo skomplikowane metody płatności mogą być łatwo wdrożone w blockchainie.
Po prostu wyczuwam tutaj okazję biznesową. W łatwy sposób można wdrożyć serwis ogłoszeniowy bez kosztów bieżących, ze złożonymi ścieżkami płatności uwzględnionymi w każdej transakcji. Jestem pewien, że ktoś wymyśli, do czego to wykorzystać.
@@ -40,9 +36,9 @@ Po prostu cieszę się, że to buduję. Rzućmy okiem na kod.
## Implementacja {#implementation}
-Jakiś czas temu uruchomiliśmy [repozytorium open source](https://github.com/HQ20/contracts?ref=hackernoon.com) z implementacjami zastosowań biznesowych i innymi ciekawymi rzeczami. Rzuć okiem.
+Jakiś czas temu uruchomiliśmy [repozytorium open source](https://github.com/HQ20/contracts?ref=hackernoon.com) z przykładowymi implementacjami biznesowymi i innymi dodatkami. Zachęcamy do zapoznania się.
-Kod tego [serwisu ogłoszeniowego Ethereum](https://github.com/HQ20/contracts/tree/master/contracts/classifieds?ref=hackernoon.com) jest dostępny, możesz go używać do woli. Pamiętaj tylko, że kod nie został poddany audytowi i musisz zrobić własną analizę due dililgence, zanim włożysz w niego pieniądze.
+Kod tej [tablicy ogłoszeń Ethereum](https://github.com/HQ20/contracts/tree/master/contracts/classifieds?ref=hackernoon.com) jest tam dostępny, prosimy, korzystajcie z niego i testujcie go do woli. Pamiętaj tylko, że kod nie został poddany audytowi i musisz zrobić własną analizę due dililgence, zanim włożysz w niego pieniądze.
Podstawy tablicy nie są skomplikowane. Wszystkie reklamy na tablicy będą tylko strukturą z kilkoma polami:
@@ -67,7 +63,7 @@ Korzystanie z mapowania oznacza, że przed opublikowaniem tej wiadomości musimy
Następnie pojawia się pytanie, z czym mamy do czynienia i jaka waluta jest wykorzystywana do zapłaty za transakcję.
-Jeśli chodzi o przedmioty, zamierzamy tylko poprosić o implementację interfejsu [ERC-721](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/IERC721.sol?ref=hackernoon.com), który naprawdę jest sposobem na reprezentowanie realnych pozycji świata w blockchain, chociaż [najlepiej współpracuje z cyfrowymi aktywami](https://hackernoon.com/tokenization-of-digital-assets-g0ffk3v8s?ref=hackernoon.com). Zamierzamy określić nasz własny kontrakt ERC721 w konstruktorze, co oznacza, że wszelkie aktywa w naszym serwisie muszą być uprzednio tokenizowane.
+W przypadku przedmiotów będziemy wymagać jedynie implementacji interfejsu [ERC-721](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/IERC721.sol?ref=hackernoon.com), który jest po prostu sposobem reprezentacji rzeczywistych przedmiotów w blockchainie, chociaż [najlepiej działa w przypadku aktywów cyfrowych](https://hackernoon.com/tokenization-of-digital-assets-g0ffk3v8s?ref=hackernoon.com). Zamierzamy określić nasz własny kontrakt ERC721 w konstruktorze, co oznacza, że wszelkie aktywa w naszym serwisie muszą być uprzednio tokenizowane.
W przypadku płatności zamierzamy zrobić coś podobnego. Większość projektów blockchain definiuje własną kryptowalutę [ERC-20](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol?ref=hackernoon.com). Inni wolą korzystać z głównego nurtu takiego jak DAI. W tym serwisie ogłoszeniowym musisz tylko zdecydować podczas budowy, jaka będzie Twoja waluta. Łatwo.
@@ -127,18 +123,18 @@ function cancelTrade(uint256 _trade)
Trade memory trade = trades[_trade];
require(
msg.sender == trade.poster,
- "Trade can be cancelled only by poster."
+ "Ogłoszenie może być anulowane tylko przez wystawiającego."
);
- require(trade.status == "Open", "Trade is not Open.");
+ require(trade.status == "Open", "Ogłoszenie nie jest otwarte.");
itemToken.transferFrom(address(this), trade.poster, trade.item);
trades[_trade].status = "Cancelled";
emit TradeStatusChange(_trade, "Cancelled");
}
```
-To już wszystko. Dotrwałeś do końca implementacji. To zaskakujące, jak kompaktowe są niektóre pojęcia biznesowe wyrażane w kodzie i jest to jeden z tych przypadków. Sprawdź pełną umowę [w naszym repozytorium](https://github.com/HQ20/contracts/blob/master/contracts/classifieds/Classifieds.sol).
+To już wszystko. Dotrwałeś do końca implementacji. To zaskakujące, jak kompaktowe są niektóre pojęcia biznesowe wyrażane w kodzie i jest to jeden z tych przypadków. Sprawdź pełny kontrakt [w naszym repozytorium](https://github.com/HQ20/contracts/blob/master/contracts/classifieds/Classifieds.sol).
-## Podsumowanie {#conclusion}
+## Wnioski {#conclusion}
Serwisy ogłoszeniowe to powszechna konfiguracja rynku, która intensywnie rosła wraz z Internetem, stając się niezwykle popularnym modelem biznesowym z kilkoma monopolistycznymi zwycięzcami.
@@ -146,4 +142,4 @@ Serwisy ogłoszeniowe stały się również łatwym narzędziem do replikacji w
W tym artykule podjąłem próbę połączenia realiów biznesowych serwisów ogłoszeniowych z implementacją technologii. Ta wiedza powinna pomóc w stworzeniu wizji i planu implementacji, jeśli masz odpowiednie umiejętności.
-Jak zawsze, jeśli chcesz zbudować coś fajnego i chciałbyś otrzymać jakąś radę, proszę [napisz do mnie](https://albertocuesta.es/)! Zawsze chętnie służę pomocą.
+Jak zawsze, jeśli chcecie zbudować coś fajnego i przydałaby Wam się jakaś rada, [skontaktujcie się ze mną](https://albertocuesta.es/)! Zawsze chętnie służę pomocą.