From 8f8793450201d637467d9c87ca0e43bb51ccbf4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=ED=98=B8=EC=9E=AC?= <161708856+ghwo336@users.noreply.github.com> Date: Wed, 4 Mar 2026 14:08:32 +0900 Subject: [PATCH 1/2] feat(week-04): complete week-04 assignment --- week-04/dev/my-dapp/app/layout.tsx | 57 +++ week-04/dev/my-dapp/app/page.tsx | 34 ++ .../dev/my-dapp/components/ContractReader.tsx | 36 ++ .../dev/my-dapp/components/ContractWriter.tsx | 56 +++ .../dev/my-dapp/components/EventListener.tsx | 88 ++++ .../dev/my-dapp/components/WalletConnect.tsx | 90 ++++ week-04/theory/quiz-04-solution.md | 456 ++++++++++++++++++ 7 files changed, 817 insertions(+) create mode 100644 week-04/dev/my-dapp/app/layout.tsx create mode 100644 week-04/dev/my-dapp/app/page.tsx create mode 100644 week-04/dev/my-dapp/components/ContractReader.tsx create mode 100644 week-04/dev/my-dapp/components/ContractWriter.tsx create mode 100644 week-04/dev/my-dapp/components/EventListener.tsx create mode 100644 week-04/dev/my-dapp/components/WalletConnect.tsx create mode 100644 week-04/theory/quiz-04-solution.md diff --git a/week-04/dev/my-dapp/app/layout.tsx b/week-04/dev/my-dapp/app/layout.tsx new file mode 100644 index 0000000..178df6a --- /dev/null +++ b/week-04/dev/my-dapp/app/layout.tsx @@ -0,0 +1,57 @@ +'use client'; + +// ============================================================ +// RainbowKit 스타일 import +// ============================================================ +// RainbowKit의 UI 컴포넌트가 제대로 표시되려면 +// 반드시 이 스타일시트를 import해야 합니다. +import '@rainbow-me/rainbowkit/styles.css'; + +import { RainbowKitProvider } from '@rainbow-me/rainbowkit'; +import { WagmiProvider } from 'wagmi'; +import { QueryClientProvider, QueryClient } from '@tanstack/react-query'; +import { config } from '@/config/wagmi'; + +// ============================================================ +// React Query 클라이언트 설정 +// ============================================================ +// wagmi v2는 내부적으로 TanStack Query를 사용합니다. +// 이 클라이언트가 데이터 캐싱, 리페칭, 동기화를 담당합니다. +const queryClient = new QueryClient(); + +// ============================================================ +// Root Layout +// ============================================================ +// Next.js App Router의 루트 레이아웃입니다. +// 모든 페이지가 이 레이아웃을 공유합니다. +export default function RootLayout({ + children, +}: { + children: React.ReactNode; +}) { + return ( + +
+ {/* ============================================================ + Provider 순서가 중요합니다! + ============================================================ + + WagmiProvider > QueryClientProvider > RainbowKitProvider + + 1. WagmiProvider: 가장 바깥. wagmi config를 전체 앱에 제공 + 2. QueryClientProvider: 데이터 페칭 상태 관리 + 3. RainbowKitProvider: 지갑 UI 및 연결 상태 관리 + + 순서가 바뀌면 "Cannot find WagmiContext" 같은 오류 발생! + ============================================================ */} +Count: {data?.toString()}
+이벤트 대기중
+ ):(연결된 지갑
+ + {/* 지갑 주소 */} ++ 주소: {address?.slice(0, 6)}...{address?.slice(-4)} +
+ + {/* ETH 잔액 */} ++ 잔액: {isBalanceLoading + ? '로딩 중...' + : `${balance?.formatted ?? '0'} ${balance?.symbol ?? 'ETH'}` + } +
+ + {/* ============================================================ + TODO: 추가 기능 구현 + ============================================================ + - 컨트랙트 상태 읽기 (useReadContract) + - 컨트랙트 함수 호출 (useWriteContract) + - 트랜잭션 히스토리 표시 + - 토큰 잔액 표시 (ERC20) + ============================================================ */} +연결된 주소: {address}
+연결된 주소: {address}
+