PromleeBlog
sitemapaboutMe

posting thumbnail
앱에서 MetaMask 연동하기 (Flutter, reown, walletconnect)
Connect MetaMask to a Flutter app (reown, walletconnect)

📅

🚀

들어가기 전에🔗

기본적인 flutter 프로젝트가 생성되어있는 상태를 가정하고 진행합니다.

MetaMask란?🔗

https://metamask.io/
start enjoying the convenience of tracking and managing your web3 everything, all in one place.
웹3.0의 모든 것을 한 곳에서 추적하고 관리할 수 있습니다.
MetaMask
MetaMask
메타마스크는 이더리움 블록체인과 상호 작용하는 데 사용되는 소프트웨어
암호화폐 지갑
입니다. 브라우저 확장 프로그램과 모바일 앱으로 제공되는 MetaMask는 키 보관소, 보안 로그인, 토큰 지갑, 토큰 교환 등 디지털 자산 관리에 필요한 모든 기능을 갖추고 있습니다.
이를 통해 사용자는 브라우저 확장이나 모바일 앱을 통해 자신의 이더리움 지갑에 액세스할 수 있으며, 이를 통해
분산형 애플리케이션
과 상호 작용할 수 있습니다.

Reown이란?🔗

https://reown.com/
Reown gives developers the tools to build user experiences that make digital ownership effortless, intuitive, and secure.
개발자에게 디지털 소유권을 쉽고, 직관적이고, 안전하게 만드는 도구를 제공합니다.
Reown
Reown
Reown(전 WalletConnection)은 분산형 앱(DApps)과 지갑 간의 연동을 쉽게 할 수 있도록 도와주는 툴입니다. 위에서 설명한 메타마스크와 같은 지갑을 연동할 수 있습니다. 우리는 이 툴을 사용해 Flutter 앱에서 메타마스크와 연동해보겠습니다.

🚀

1. 라이브러리 설치 및 기본 설정🔗

1.1. 라이브러리 설치🔗

Reown 공식 문서에 따라 라이브러리를 설치합니다.
flutter pub add reown_appkit

1.2. IOS 설정🔗

/ios/Podfile 파일의 상단에 주석 처리 되어있는 platform :ios, 'xx.0' 주석을 해제한 후 13.0 이상의 버전을 설정합니다.
만약, 주석 처리 되어있는 라인이 없다면 상단에 추가 해 주세요.
/ios/Podfile
platform :ios, '13.0'
다음 명령어를 입력하여 ios 폴더 안에서 설정을 완료합니다.
cd ios
pod install

1.3 지갑 연동 설정 (IOS, Android)🔗

각 운영체제에 맞는 방식으로 네이티브 코드에 지갑 코드를 추가해야 합니다. 이 포스팅에서는 MetaMask만을 추가하지만 다른 지갑을 추가하고 싶으면 예시(ios)예시(android)를 참고하세요.
➡️

IOS🔗

/ios/Runner/Info.plist 파일을 열어 원하는 지갑을 추가합니다.
추가적으로 url scheme을 설정해야 합니다. 임의의 소문자로 이루어진 문자열을 입력합니다. 여기서는 exampleapp을 입력하겠습니다. 뒤에서 사용하니 기억해주세요!!
앱의 Bundle ID를 입력합니다. 여기서는 com.example.yourBundleId를 입력하겠습니다.
/ios/Runner/Info.plist
<dict>
	<key>LSApplicationQueriesSchemes</key>
	<array>
		<string>metamask</string> <!-- 지갑 이름 -->
		<!-- 다른 지갑 이름을 추가할 수 있습니다 -->
	</array>
	<array>
		<dict>
    <key>CFBundleTypeRole</key>
    <string>Editor</string>
    <key>CFBundleURLName</key>
    <string>com.example.yourBundleId</string> <!-- 앱의 Bundle ID -->
    <key>CFBundleURLSchemes</key>
    <array>
      <string>exampleapp</string> <!-- 임의의 소문자로 이루어진 문자열 -->
			</array>
		</dict>
	</array>
</dict>
➡️

Android🔗

/android/app/src/main/AndroidManifest.xml 파일을 열어 원하는 지갑을 추가합니다.
추가적으로 안드로이드도 url scheme을 설정해야 합니다. 임의의 소문자로 이루어진 문자열을 입력합니다. 여기서는 exampleapp을 입력하겠습니다. 뒤에서 사용하니 기억해주세요!!
/android/app/src/main/AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <application>
			<activity > <!-- 태그 속성 생략 -->
				<intent-filter>
					<action android:name="android.intent.action.VIEW" />
					<category android:name="android.intent.category.DEFAULT" />
					<category android:name="android.intent.category.BROWSABLE" />
					<data android:scheme="exampleapp" /> <!-- 임의의 소문자로 이루어진 문자열 -->
				</intent-filter>
			</activity>
    </application>
		<!-- ... -->
    <queries>
        <package android:name="io.metamask"/> <!-- 지갑 이름 -->
        <!-- 다른 지갑 이름을 추가할 수 있습니다 -->
    </queries>	
</manifest>

1.4 reown 프로젝트 생성🔗

reown을 실행하기 위해 project_id가 필요합니다. 이를 위해 reown 프로젝트를 생성합니다.
reown 로그인
안내에 따라 프로젝트 생성 후 Dashboard에서 프로젝트 ID를 확인합니다.
reown project id
reown project id
이러면 상용화된 거의 모든 지갑과 연동 설정이 완료되었습니다. 이제 플러터 안에서 지갑을 연동하는 코드를 작성해보겠습니다.

🚀

2. MetaMask 연동하기🔗

🖐️
IOS 시뮬레이터에서 MetaMask를 설치하는 방법이 너무 어렵습니다(개발자 계정 필요). Android 시뮬레이터를 기반으로 진행하겠습니다.

2.1. MetaMask 설치🔗

Android 시뮬레이터의 Play Store에서 MetaMask를 검색, 설치한 후 로그인을 진행합니다. 기존 지갑이 있는 경우 복호화 구문을 이용하여 지갑을 연동합니다.

2.2. page_wallet.dart 파일 작성🔗

📦 lib
┣ 📜 page_wallet.dart
┗ 📜 main.dart
먼저, 패키지를 import 합니다.
import 'package:reown_appkit/reown_appkit.dart';
위젯을 StateFulWidget으로 생성합니다.
/lib/page_wallet.dart
class PageWallet extends StatefulWidget {
  const PageWallet({super.key});
  @override
  State<PageWallet> createState() => _PageWalletState();
}
 
class _PageWalletState extends State<PageWallet> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Wallet'),
      ),
    );
  }
}
_PageWalletState 클래스에서 @override 메서드를 재정의합니다.
이 때, 위에서 정의했던 url scheme을 사용합니다. 여기서는 exampleapp이겠죠? 나머지 항목은 key에 맞는 값을 입력합니다.
/lib/page_wallet.dart
// _PageWalletState 클래스 내부
	late ReownAppKitModal appKitModal;
 
	@override
	void initState() {
		super.initState();
 
		appKitModal = ReownAppKitModal(
			context: context,
			projectId: '{YOUR_PROJECT_ID}', // 프로젝트 ID 입력
			metadata: const PairingMetadata(
				name: 'Example App',
				description: 'Example app description',
				url: 'https://example.com/',
				icons: ['https://example.com/logo.png'],
				redirect: Redirect(  // OPTIONAL 이지만 (준)필수인 항목입니다
					native: 'exampleapp://', // 위에서 정의한 url scheme
					universal: 'https://reown.com/exampleapp',
					linkMode: true|false,
				),
			),
		);
 
		appKitModal.init().then((value) => setState(() {}));
	}
// ...

2.3. 지갑 주소 가져오기🔗

지갑 주소를 사용하여 로그인을 구현한다거나 트랜젝션 결과 등을 열람하는 링크를 생성할 수 있습니다. appKitModal을 리스너로 등록하여 연결 변화에 따라 지갑 주소를 업데이트합니다.
/lib/page_wallet.dart
// _PageWalletState 클래스 내부
	String address = "none";
	late ReownAppKitModal appKitModal;
 
	@override
	void initState() {
		super.initState();
 
		appKitModal = ReownAppKitModal(
			context: context,
			projectId: '{YOUR_PROJECT_ID}', // 프로젝트 ID 입력
			metadata: const PairingMetadata(
				name: 'Example App',
				description: 'Example app description',
				url: 'https://example.com/',
				icons: ['https://example.com/logo.png'],
				redirect: Redirect(  // OPTIONAL 이지만 (준)필수인 항목입니다
					native: 'exampleapp://', // 위에서 정의한 url scheme
					universal: 'https://reown.com/exampleapp',
					linkMode: true|false,
				),
			),
		);
 
 
    appKitModal.init();
    appKitModal.addListener(updateAddress);
	}
 
	void updateAddress() {
    setState(() {
      address = appKitModal.session
              ?.getAddress(ReownAppKitModalNetworks.getNamespaceForChainId(
            appKitModal.selectedChain?.chainId ?? "1",
          )) ??
          "none";
    });
  }
// ...

2.4. 지갑 연동 위젯 생성🔗

지갑 연동 위젯을 생성합니다. 크게 4가지 위젯이 있습니다.
/lib/page_wallet.dart
// _PageWalletState 클래스 내부
	@override
	Widget build(BuildContext context) {
		return Scaffold(
			backgroundColor: Colors.white,
			body: Center(
				child: Stack(
					children: [
						Column(
							mainAxisAlignment: MainAxisAlignment.center,
							crossAxisAlignment: CrossAxisAlignment.center,
							children: [
								AppKitModalNetworkSelectButton(
									appKit: appKitModal,
									context: context,
								),
								AppKitModalConnectButton(
									appKit: appKitModal,
									context: context,
								),
								AppKitModalAccountButton(
									appKitModal: appKitModal,
								),
								AppKitModalAddressButton(
									appKitModal: appKitModal,
									onTap: appKitModal.openModalView,
								),
								Text(address),
							],
						),
					],
				),
			),
		);
	}
지갑 연동 위젯 동작
지갑 연동 위젯 동작

🚀

결론🔗

MetaMask를 Flutter 앱에 연동하여 Web3 기반의 DAPP 기반을 만들 수 있습니다. 이 방법을 통해 사용자는 자신의 지갑을 앱과 연결하고 다양한 블록체인 기능을 활용할 수 있습니다.

더 생각해 보기🔗

참고🔗