일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- react
- 리액트
- CSS
- 프로그래머스
- next13
- 타입스크립트
- leetcode
- JavaScript
- 자바스크립트 알고리즘
- til
- 자바스크립트 문제 풀이
- Baekjoon
- NPM
- Next.js13
- Next
- lodash
- 리액트쿼리
- 자바스크립트코딩테스트
- 자바스크립트 문제풀이
- 프론트엔드
- stack문제
- 자바스크립트 문제
- JS
- 알고리즘문제풀이
- 자바스크립트 알고리즘 문제
- 자바스크립트 연결리스트
- leetcode문제풀이
- 자바스크립트
- HTML
- 제로베이스
- Today
- Total
코드노트
wagmi web3 지갑 연동 라이브러리 정리 본문
Wagmi
- react, typescript를 지원하는 라이브러리로 이더리움 어플리케이션을 구축할 때 지갑 연결 및 체인 데이터 관리에 있어서 직관적이고 효율적으로 처리할 수 있도록 도와주는 라이브러리이다.
주요 특징
- React Hook 기반 설계를 통해 리액트에서 쉽게 사용 가능하다.
- typescript로 구현되어 있다.
- 다양한 지갑 지원 ( MetaMask, WalletConnect, Coinbase Wallet 등 여러 지갑 연동 )
- 다양한 체인 지원 ( 이더리움 외에도 Polygon, Arbitrum 등 다양한 체인 지원 )
- Type-safe API 지원
Type-safe API
abi 기반으로 스마트 계약 함수 호출
import { useContractRead, useContractWrite } from 'wagmi';
import { abi } from './MyContractABI'; // ABI JSON 파일
const contractConfig = {
address: '0xYourContractAddress',
abi: abi,
};
const MyComponent = () => {
// 타입 안전하게 함수 호출
const { data, isError } = useContractRead({
...contractConfig,
functionName: 'balanceOf',
args: ['0xUserAddress'], // 타입에 맞는 파라미터 자동 체크
});
const { write } = useContractWrite({
...contractConfig,
functionName: 'transfer',
args: ['0xRecipientAddress', BigInt(1000)], // 타입 안전
});
return (
<div>
<p>Balance: {data?.toString()}</p>
<button onClick={() => write()}>Transfer</button>
</div>
);
};
- useContractRead, useContractWrite를 사용하여 스마트 계약과 상호작용할 때 타입 안전성을 제공한다.
체인 연결 타입 강제
import { useSwitchNetwork } from 'wagmi';
const SwitchNetworkButton = () => {
const { switchNetwork, chain } = useSwitchNetwork();
return (
<button onClick={() => switchNetwork?.(1)}>
Switch to {chain?.name ?? 'Ethereum'}
</button>
);
};
- useSwitchNetwork를 사용하여 사용자가 특정 네트워크로 강제할 수 있다.
- 숫자 형식의 체인 ID만 허용하며, 잘못된 형식의 데이터는 컴파일 타임에 에러를 발생 시킨다.
Wagmi React Hook
- useAccount
import { useAccount } from 'wagmi';
const AccountInfo = () => {
const { address, isConnected } = useAccount();
return isConnected ? <p>Address: {address}</p> : <p>Not Connected</p>;
};
- 현재 연결된 계정 정보를 반환한다.
- address: 연결된 지갑 주소
- isConnected: 연결 여부
- useConnect
import { useConnect } from 'wagmi';
const ConnectWallet = () => {
const { connect, connectors } = useConnect();
return (
<div>
{connectors.map((connector) => (
<button key={connector.id} onClick={() => connect(connector)}>
Connect {connector.name}
</button>
))}
</div>
);
};
- 사용자가 지갑을 연결할 수 있도록 도와준다.
- connect: 지갑 연결 함수
- connectors: 사용 가능한 지갑 목록
- error: 연결 시 발생한 에러
- useDiconnect
import { useDisconnect } from 'wagmi';
const DisconnectWallet = () => {
const { disconnect } = useDisconnect();
return <button onClick={disconnect}>Disconnect</button>;
};
- 현재 연결된 지갑을 해제한다.
- disconnect: 연결 해제 함수
- useSignMessage
import { useSignMessage } from 'wagmi';
const SignMessage = () => {
const { signMessage, data } = useSignMessage();
return (
<div>
<button onClick={() => signMessage({ message: 'Hello, Ethereum!' })}>
Sign Message
</button>
{data && <p>Signed Message: {data}</p>}
</div>
);
};
- 사용자의 메시지 서명을 요청하고, 결과를 반환다.
- signMessage: 서명 요청 함수
- data: 서명 결과
- isLoading: 서명 처리 상태
- useChainId
import { useChainId } from 'wagmi';
const NetworkInfo = () => {
const chainId = useChainId();
return <p>Connected to Chain ID: {chainId}</p>;
};
- 현재 연결된 네트워크의 체인 ID를 반환 한다.
- chainId: 연결된 네트워크의 체인 ID
- useConnectors
import { useConnectors } from 'wagmi';
const WalletList = () => {
const { connectors } = useConnectors();
return (
<ul>
{connectors.map((connector) => (
<li key={connector.id}>{connector.name}</li>
))}
</ul>
);
};
- 사용 가능한 지갑 커넥터 목록을 반환
- connectors : 지갑 커넥터 배열
Wagmi 사용 흐름도
- 지갑 연결 : useConnect로 사용자가 원하는 지갑을 연결 한다.
- 계정 상태 확인 : useAccount로 현재 연결된 지갑 정보를 가져온다.
- 네트워크 확인: useChainId로 사용자가 올바른 체인에 연결되었는지 확인한다.
- 메시지 서명: useSignMessage로 데이터를 서명받아 인증 과정을 처리한다.
- 연결 해제: useDisconnect로 연결을 해제한다.
'Code note > codenote' 카테고리의 다른 글
Stomp.js, SockJS / SockJS-client 정리 (0) | 2024.06.03 |
---|---|
Nexus를 사용하여 npm 패키지 저장소 구축, feat.npm private7$ (0) | 2024.03.21 |
디자인 시스템 깃허브로 연결, feat.피그마 (0) | 2024.03.08 |
구글, 네이버, 카카오 Oauth 소셜로그인 인가코드 구현 (1) | 2024.01.24 |
Mac에서 React-Native CLI 환경 구축 및 실행 정리 (0) | 2023.12.20 |