Integracja portfela MetaMask w aplikacji React

Paulina Lewandowska

19 gru 2022
Integracja portfela MetaMask w aplikacji React

Wprowadzenie

W większości zdecentralizowanych aplikacji portfele kryptograficzne są wymagane aby użytkownicy mogli dokonywać w nich interakcji z blockchain. Aby to było możliwe developerzy zajmujący się implementacją warstwy frontend muszą dokonać integracji z aplikacjami portfelowymi użytkowników. Poniższy artykuł poświęcony jest developerem zajmującym się tworzeniem interfejsów użytkownika z pomocą biblioteki React. Jest to poradnik krok po kroku jak dokonać integracji aplikacji reactowej z wtyczką do przeglądarki obecnie jednego z najbardziej popularnych porteli jakim jest MetaMask.

Podstawowa aplikacja w React

Kod źródłowy aplikacji napisanej na potrzeby tego tutariala znajduje się pod tym linkiem. Do stworzenia aplikacji wykorzystałem następujące biblioteki:

Do pracy z tym poradnikiem można wykorzystać aplikację zamieszczoną pod linkiem wyżej, bądź samodzielnie skonfigurować aplikację w React z pomocą np. create-react-app lub vite.

Gdy nasza aplikacja jest już skonfigurowana, należy upewnić się że mamy zainstalowane wszystkie niezbędne zależności, aby tego dokonać należy wykonać komendę

npm install wagmi ethers

Do przygotowania aplikacji skorzystałem równiez bliblioteki komponentów o nazwie Material-ui, jeśli również chcesz z niej skorzystać zainstaluj następujące paczki komendą:

npm install @mui/material @emotion/react @emotion/styled

Po ukończonej konfiguracji i zainstalowaniu wszystkich niezbędnych zależności możemy przejść do kolejnego punktu.

Biblioteka Wagmi

Do integracji z aplikacją portfelową MetaMask wykorzystamy dedykowaną bibliotekę do React o nazwie wagmi zawierającą pokaźną liczbę hooków oraz funkcji potrzebnych w codziennej pracy przy interakcjach z blockchain w aplikacjach frontendowych.

Pierwszym krokiem będzie konfiguracja biblioteki, aby tego dokonać należy opakować naszą aplikację w komponent WagmiConfig przekazując zmienną client z naszą konfiguracją:

import { WagmiConfig, createClient } from "wagmi";
import { getDefaultProvider } from "ethers";
 
import { Home } from "./pages";
import "./styles.css";
 
const client = createClient({
 autoConnect: true,
 provider: getDefaultProvider()
});
 
export default function App() {
 return (
   <WagmiConfig client={client}>
     <Home />
   </WagmiConfig>
 );
}

Wszystkie dostępne opcje konfiguracyjne znajdziejsz pod tym linkiem w oficjalnej dokumentacji wagmi

Podłączenie portfela MetaMask

Po ukończonej konfiguracji bliblioteki wagmi możemy przejść do tworzenia komponentu odpowiedzialnego za połączenie z naszym portfelem. W implementacji pomocne będą hooki dostępne w blibliotece.

Aby uzyskać dostęp do funkcji, która umożliwi nam wykonanie requestu o podłączenie portfela należy skorzystać z hooka useConnect(). Aby wskazać, że portfelem, z którym chcemy się połączoyć jest MetaMask, w obiekcie konfiguracyjnym do hooka pod kluczem connecter należy przekazać utworzoną instancję klasy InjectedConnector

import { useConnect } from "wagmi";
import { InjectedConnector } from "wagmi/dist/connectors/injected";
 
 ...
 
 const { connect } = useConnect({
   connector: new InjectedConnector()
 });
 
 ...

Hook zwraca nam funkcję connect, którą możemy wywołać np. po kliknięciu przycisku.

 ...
 
<Button onClick={() => connect()}>Connect</Button>
 
 ...

Aby otrzymać informacje o podłączonym portfelu bądź stanie jego podłączenia, można skorzystać z hooka useAccount(), który zwraca nam m.in. takie informacje jak:

  • adres podłączonego portfela
  • to czy akcją podłączania portfela jest w trakcie
  • Czy aktualnie w aplikacji portfel użytkownika jest podłączony
...
 
 const { address, isConnected, isConnecting } = useAccount();
 
 ...

Jeśli użytkownikowi naszej aplikacji udało się podłączyć portfel należy umożliwić mu również jego odłączenie, do tego należy skorzystać z funkcji disconnect do której możemy się dostać z pomocą hooka useDisconnect()

 ...
 
 const { disconnect } = useDisconnect();
 
 ...

Z pomocą tych trzech prostych hooków jesteśmy w stanie obsłużyć podłącznie portfela. Pełny kod źródłowy komponentu obsługującego podłączanie z przykładowej aplikacjij:

import { useConnect, useDisconnect, useAccount } from "wagmi";
import { InjectedConnector } from "wagmi/dist/connectors/injected";
import { Card, Button, Heading } from "../../components";
import Typography from "@mui/material/Typography";
import { WalletInfo } from "./WalletInfo";
 
export const WalletConnect = () => {
 const { isConnected, isConnecting } = useAccount();
 
 const { connect } = useConnect({
   connector: new InjectedConnector()
 });
 
 const { disconnect } = useDisconnect();
 
 return (
   <Card>
     <Heading sx={{ mb: 2 }}>
       {isConnected ? "Your connected wallet:" : "Connect your MetaMask"}
     </Heading>
 
     {isConnecting && <Typography>Connecting...</Typography>}
 
     {isConnected ? (
       <>
         <WalletInfo />
         <Button sx={{ mt: 2 }} onClick={() => disconnect()}>
           Disconnect
         </Button>
       </>
     ) : (
       <Button
         disabled={isConnecting}
         sx={{ mt: 2 }}
         onClick={() => connect()}
       >
         Connect
       </Button>
     )}
   </Card>
 );
};

Na powyższym przykładzie znajduje się komponent <WalletInfo />, który posłuży nam do wyświetlenia informacji o podłączonym portfelu, jego utworzeniem zajmiemy się w kolejnym kroku

Wyświetlanie informacji o podłączonym portfelu

Kolejnym krokiem będzie wyświetlenie użytkownikowi informacji o podłączonym portfelu takich jak:

  • Adres portfela
  • Aktualny balans ETH na portfelu

W tym celu przygotujemy dwa proste komponenty <WalletAddress/> oraz <WalletBalance/>, które następnie umieścimy w komponencie <WalletInfo/>:

Adres aktualnie podłączonego portfela

import { WalletAddress } from "./WalletAddress";
import { WalletBalance } from "./WalletBalance";
 
export const WalletInfo = () => {
 return (
   <div>
     <walletaddress />
     <walletbalance />
   </div>
 );
};
import { useAccount } from "wagmi";
import Typography from "@mui/material/Typography";
 
export const WalletAddress = () => {
 const { address } = useAccount();
 return (
   <typography>
     <strong>Address: </strong>
     {address}
   </typography>
 );
};

W celu wyświetlenia podłączonego portfela skorzystamy z wcześniej wspomnianego hooka useAccount(), który zwraca nam zmienną address. Implementacja prostego komponentu do wyświetlenia adresu wygląda następująco:

import { useAccount } from "wagmi";
import Typography from "@mui/material/Typography";
 
export const WalletAddress = () => {
 const { address } = useAccount();
 return (
   <typography>
     <strong>Address: </strong>
     {address}
   </typography>
 );
};

Balans aktualnie podłączonego portfela

Biblioteka wagmi posiada również hooka useBalance(), który znacznie ułatwi nam proces pobierania aktualnego balansu portfela. Proces pobierania tej wartości z blockchain jest asynchroniczny, więc hook ten zwraca na m.in. takie informacje w zmiennych jak:

  • isLoading - czy pobieranie balansu jest w trakcie
  • isFetched - czy balans portfela został pobrany
  • isError - czy podczas pobierania danych wystąpił błąd
  • data - obiekt zawierający takie pola jak:
    • value - balans użytkownika w jednostach WEI
    • formatted - balans użytkownika sformatowany do jednostek ETH
    • symbol - Symbol aktywa dla którego został pobrany balans
    • decimals - Liczba miejsc po przecinku jakie może posiadać liczba opisująca ilość danego aktywa

W celu lepszego zrozumienia czym jest jednostka WEI, ETH bądź parametr decimals zachęcam do zapoznania się z tymi artykułami:

Aby wskazać, dla jakiego portfela chcemy pobrać balans środków, przy wywołaniu hooka musimy przekazać adres tego portfela jako parametr w następujący sposób, aby to zrobić możemy skorzystać ponownie z hooka useAccount() z poprzedniego kroku:

 ...
 
 const { address } = useAccount();
 const { isLoading, isFetched, isError, data } = useBalance({ address });
 
 ...

Dzięki tym informacjom jesteśmy w stanie zaimplementować cały komponent z obsługą procesu ładowania danych:

import { useAccount, useBalance } from "wagmi";
import Typography from "@mui/material/Typography";
import Skeleton from "@mui/material/Skeleton";
 
export const WalletBalance = () => {
 const { address } = useAccount();
 const { isLoading, isFetched, isError, data } = useBalance({ address });
 
 return (
   <typography>
     {isLoading && <skeleton width="{200}" />}
     {isFetched && (
       <>
         <strong>Balance: </strong>
         {data?.formatted} {data?.symbol}
       </>
     )}
     {isError && "Fetching balance failed!"}
   </typography>
 );
};

Podsumowanie

Przedstawiona aplikacja to tylko przykład, w produkcyjnych aplikacjach developerzy często muszą się mierzyć z integracją wielu aplikacji portfelowych, wspieraniem połączenia na wielu sieciach blockchain oraz interakcjami podłączonych portfeli z smart kontraktami. Wszystkie te funkcjonalności oraz znacznie więcej wspiera biblioteka wagmi zaprezentowana w tym turorialu. Dlatego też zachęcam do przestudiowania dokumentacji tej biblioteki w celu zapoznania się, jakie możliwości oferuje.

Tagi

Most viewed


Never miss a story

Stay updated about Nextrope news as it happens.

You are subscribed

Blockchain dla twórców: Bezpieczna i zrównoważona infrastruktura

Miłosz Mach

07 lis 2025
Blockchain dla twórców: Bezpieczna i zrównoważona infrastruktura

W świecie cyfrowej twórczości, gdzie granice między sztuką a technologią coraz bardziej się zacierają, projekty takie jak MARMALADE stają się symbolem nowej ery – ery, w której twórcy mogą chronić swoje prace i zachować nad nimi kontrolę dzięki blockchainowi. Dla Nextrope udział w MARMALADE to nie tylko implementacja narzędzi ochrony, takich jak blokowanie zrzutów ekranu czy watermarking. To przede wszystkim praca nad architekturą zaufania – tworzeniem infrastruktury, która pozwala twórcom działać w cyfrowym świecie bez obaw o utratę własności i bezpieczeństwo.

Nowy typ wyzwania dla blockchaina

Projekty kulturalne i edukacyjne mają zupełnie inne wymagania niż klasyczne rozwiązania DeFi. Tu nie chodzi o maksymalizację stóp zwrotu czy skomplikowane kontrakty finansowe.
W centrum znajduje się człowiek – artysta, ilustrator, edukator.

Dlatego jednym z największych wyzwań było stworzenie bezpiecznej, ale intuicyjnej infrastruktury. Systemy blockchain musiały być lekkie, energooszczędne i przyjazne użytkownikom, którzy często po raz pierwszy stykają się z technologią Web3.

„Naszym celem nie było zbudowanie kolejnego protokołu finansowego. Chcieliśmy stworzyć infrastrukturę zaufania dla twórców cyfrowych." - zespół Nextrope

Bezpieczeństwo, które nie przeszkadza

Najlepsze zabezpieczenia to te, których użytkownik… nie zauważa.
W MARMALADE położyliśmy nacisk na niewidoczne technologie bezpieczeństwa, które nie psują doświadczenia korzystania z platformy.

  • Blokowanie zrzutów ekranu chroni prace publikowane w przeglądarce.
  • Dynamiczny watermarking pozwala wykryć nieautoryzowane kopie.
  • Rejestr blockchain gwarantuje, że każdy dowód własności jest trwały i transparentny.

„Twórcy nie powinni martwić się o szyfrowanie czy klucze prywatne. Naszym zadaniem jest sprawić, by bezpieczeństwo działało w tle.”

Zrównoważony rozwój w DNA

MARMALADE to również odpowiedź na pytanie, jak łączyć innowacje z troską o środowisko.
Nextrope buduje rozwiązania, które korzystają z niskoemisyjnych sieci, a sama architektura jest modularna i łatwa do ponownego wykorzystania w innych projektach sektora kreatywnego.

Dzięki temu efekty prac MARMALADE mogą posłużyć nie tylko artystom, ale również instytucjom kultury czy uczelniom, które chcą w prosty sposób wprowadzać blockchain do swoich działań.

Więcej niż technologia

Dla Nextrope MARMALADE to coś więcej niż projekt – to dowód, że blockchain może być narzędziem społecznym, nie tylko finansowym.
Tworząc narzędzia dla artystów, pomagamy nie tylko chronić ich prace, ale też zrozumieć, że technologia może wspierać twórczość, a nie ją ograniczać.

Plasma (XPL). Architektura, kluczowe funkcje i znaczenie

Miłosz Mach

21 paź 2025
Plasma (XPL). Architektura, kluczowe funkcje i znaczenie

Czym jest Plasma?

Plasma (XPL) to blockchain warstwy 1 zaprojektowany specjalnie pod infrastrukturę stablecoinów łączy bezpieczeństwo Bitcoina z kompatybilnością EVM oraz ultraniskimi opłatami za transfery tokenów takich jak USDT.

To nowa generacja blockchaina, która ma umożliwić szybkie, tanie i skalowalne płatności w stablecoinach, eliminując ograniczenia znane z Ethereum czy Layer-2.

Dlaczego powstała Plasma?

Większość obecnych blockchainów nie została stworzona z myślą o stablecoinach w roli głównej. Wraz z ich rosnącą adopcją pojawiły się problemy: wysokie opłaty, zatłoczone sieci i ograniczona interoperacyjność.

Plasma rozwiązuje te problemy, oferując infrastrukturę dedykowaną do stablecoinów i przepływów finansowych.
Jej najważniejsze cechy to:

  • Brak opłat transakcyjnych (zero-fee) dla transferów USDT,
  • Własne tokeny gas – elastyczny model opłat,
  • Most Bitcoin (BTC bridge) – umożliwia wykorzystanie BTC jako zabezpieczenia,
  • Pełna kompatybilność z EVM – łatwe wdrożenia smart kontraktów z Ethereum.

Architektura i mechanizmy działania Plasmy (XPL)

Kompatybilność EVM i smart kontrakty

Deweloperzy korzystający z Solidity, Hardhat czy Foundry mogą bez problemu wdrażać swoje projekty na Plasmie. Migracja z Ethereum czy Polygon wymaga minimalnych zmian w kodzie, podobnie jak inne blockchain zgodne z EVM, które zostały omówione w niniejszym artykule: „Web3 Backend Przewodnik: Odblokuj Superszybką Skalowalność DApps Dzięki API!"

Model opłat (Gas Model)

Plasma wspiera niestandardowe tokeny gas, co oznacza, że użytkownik nie musi posiadać natywnego XPL, by opłacić transakcję. Dla stablecoinów (np. USDT) transfery mogą być całkowicie darmowe.

Most Bitcoin (BTC Bridge)

Dzięki wbudowanemu mostowi Plasma pozwala używać BTC jako zabezpieczenia w smart kontraktach. To połączenie bezpieczeństwa Bitcoina z elastycznością Ethereum dlatego często nazywa się ją „Bitcoin-secured blockchain for stablecoins”.

Bezpieczeństwo i finalność

Konsensus Plasmy został zoptymalizowany pod kątem finalności transakcji i ochrony przed reorganizacjami bloków.
Według danych z raportu The Block, sieć osiągnęła ponad 2 miliardy USD wartości stablecoinów (TVL) już w fazie beta mainnetu.

Czym Plasma (XPL) wyróżnia się na tle innych blockchainów?

FunkcjaPlasma (XPL)Inne L1 / L2
Dedykowana stablecoinom✅ Tak❌ Nie
Transfery USDT bez opłat✅ Tak⚠️ Rzadko
Most Bitcoin (BTC bridge)✅ Tak⚠️ Nieliczne przypadki
Kompatybilność z EVM✅ Tak✅ Tak, ale często z ograniczeniami
Płynność i adopcja stablecoinów✅ >2 mld USD⚠️ W fazie rozwoju

Przykładowe zastosowania Plasma (XPL)

Plasma jest idealna dla firm fintechowych, emitentów stablecoinów, projektów DeFi i startupów, które chcą tworzyć produkty oparte na tokenach powiązanych z walutami fiducjarnymi.

Możliwe zastosowania:

  • Portfele i aplikacje płatnicze (zero-fee),
  • Cross-border payments i remittance,
  • Skarbce (treasury management) i rozliczenia między firmami,
  • DeFi – rynki pożyczek, yield farming, AMM-y,
  • Tokeny zabezpieczone Bitcoinem (BTC-backed stablecoins).

Ropzpocznij budowę projektu na Plasma (XPL)

  1. Migracja smart kontraktów – sprawdź kompatybilność i dostosuj parametry gazu,
  2. Wybór modelu opłat – zdecyduj, czy użyjesz USDT, osobnych tokenów gas lub hybrydy,
  3. Audyt bezpieczeństwa – skup się na logice mostu, reentrancy, oracle’ach,
  4. Onboarding płynności – zbuduj pierwsze pule stablecoinów,
  5. Zgodność z regulacjami – szczególnie przy emisji stablecoinów,
  6. Wdrożenie MVP i skalowanie – testuj UX, koszty i bezpieczeństwo.