빌드할 것
- 지갑을 연결하고 연결 상태를 처리하는 Next.js 앱
- Base Sepolia에 배포된 카운터에 대한 컨트랙트 읽기 및 쓰기
- EIP-5792를 통한 스마트 지갑의 배치 트랜잭션 지원
- 배치를 지원하지 않는 지갑을 위한 우아한 폴백
단계
1
프로젝트 설정
새 Next.js 앱을 만들고 필요한 의존성을 설치합니다.
Terminal
2
Base를 위한 Wagmi 설정
Base Sepolia로 Wagmi 설정을 만들고 앱을 필요한 프로바이더로 감쌉니다.루트 레이아웃을
config/wagmi.ts
ssr: true와 cookieStorage의 조합은 Next.js 하이드레이션 불일치를 방지합니다. baseAccount 커넥터는 Base Account SDK 스마트 지갑을 통해 사용자를 연결하며, 7단계에서 기능을 감지합니다. injected 커넥터는 MetaMask 같은 브라우저 확장 지갑을 처리합니다.app/providers.tsx
<Providers>로 감쌉니다.3
지갑 연결
네 가지 지갑 연결 상태를 모두 처리하는 컴포넌트를 만듭니다.
components/ConnectWallet.tsx
useAccount는 isConnecting, isReconnecting, isConnected, isDisconnected 네 가지 상태를 노출합니다. isConnected만 확인하면 페이지 로드 시 UI가 깜박입니다 — 네 가지 모두 처리하세요.4
Foundry로 컨트랙트 배포
Foundry를 설치하고 프로젝트 내에 contracts 디렉토리를 초기화합니다.환경 파일에 Base Sepolia를 설정합니다.변수를 로드하고 배포자 키를 안전하게 가져옵니다.컨트랙트를 배포합니다.초기 카운터 값을 읽어 배포를 확인합니다.배포 비용을 지불하려면 테스트넷 ETH가 필요합니다. 네트워크 파우셋에서 무료 Base Sepolia ETH를 받으세요.
Terminal
--no-git 플래그는 Foundry가 프로젝트 내에 중첩된 git 저장소를 초기화하는 것을 방지합니다.contracts/.env
https://sepolia.base.org에 접근할 수 없는 경우 https://base-sepolia-rpc.publicnode.com과 같은 대체 공개 엔드포인트를 사용하세요. 프로덕션 앱의 경우 전용 RPC 프로바이더를 사용하세요.Terminal
cast wallet import --interactive는 TTY(인터랙티브 터미널)가 필요합니다. 스크립트나 CI 환경에서는 키를 직접 전달하세요:Terminal
Terminal
Terminal
5
컨트랙트 데이터 읽기
컨트랙트 주소와 ABI를 정의한 다음 현재 카운터 값을 읽습니다.
config/counter.ts
as const는 필수입니다. 이것이 없으면 wagmi가 ABI에서 함수 이름, 인수 타입, 반환 타입을 추론할 수 없습니다.components/CounterDisplay.tsx
isError가 true여도 이전의 성공적인 페치에서 data에 유효한 캐시된 값이 남아 있을 수 있습니다. 오류 메시지보다 오래된 데이터가 선호되도록 항상 data === undefined를 조건으로 오류를 렌더링하세요.6
컨트랙트에 쓰기
트랜잭션을 전송하고 세 가지 확인 상태를 사용자에게 표시합니다.사용자에게 세 가지 상태를 표시합니다: 지갑 서명 대기, 온체인 확인 대기, 성공.
components/IncrementButton.tsx
useReadContract는 결과를 캐시하며 쓰기 후 자동으로 다시 가져오지 않습니다. 트랜잭션이 확인될 때 단일 재페치를 트리거하려면 읽기의 쿼리 키와 함께 queryClient.invalidateQueries를 사용하세요.7
지갑 기능 감지
스마트 지갑은 EIP-5792를 통해 배치 트랜잭션을 지원합니다. EOA는 지원하지 않습니다. 배치를 시도하기 전에 지원 여부를 감지하세요.EIP-5792 기능 감지에 대한 자세한 내용은 Wagmi를 사용한 배치 트랜잭션을 참조하세요.
hooks/useWalletCapabilities.ts
useChainId()는 배포 체인이 아닌 지갑의 현재 체인을 반환합니다. Ethereum 메인넷에 있는 MetaMask 사용자는 잘못된 기능 결과를 얻게 됩니다. 항상 컨트랙트가 배포된 체인에 대한 기능을 확인하세요.8
폴백을 포함한 배치 트랜잭션
스마트 지갑에는
useSendCalls를, EOA에는 useWriteContract를 사용합니다. 컴포넌트는 렌더링 시점에 어떤 경로를 선택할지 감지합니다.components/BatchIncrement.tsx
9
페이지 조합
컴포넌트들을 하나의 페이지로 구성합니다.개발 서버를 시작합니다.
app/page.tsx
Terminal
다음 단계
- 메인넷으로 이동 —
config/wagmi.ts의chains배열과 트랜스포트에base를 추가하고, 컨트랙트를 Base 메인넷에 재배포한 후COUNTER_ADDRESS를 업데이트하세요. - 가스 스폰서 —
useSendCalls와paymasterService기능을 사용하여 사용자의 트랜잭션 수수료를 대신 지불하세요. 가스 스폰서를 참조하세요. - 읽기 호출 배치 — viem의
multicall을 통해 읽기를 배치하여 RPC 왕복을 줄이세요. - 낙관적 업데이트 — TanStack Query의
onMutate콜백을 사용하여 확인 전에 UI를 업데이트하세요. - Wagmi 설정 참조 — 추가 설정 옵션을 위해 전체 Wagmi 설정 가이드를 검토하세요.