Skip to content

Commit

Permalink
Merge pull request #216 from WalletConnect/feature/verify_implementation
Browse files Browse the repository at this point in the history
v2.1.9
  • Loading branch information
quetool committed Nov 7, 2023
2 parents f7bb820 + 3983101 commit adec734
Show file tree
Hide file tree
Showing 29 changed files with 1,049 additions and 194 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
## 2.1.9

- Added support for Verify API

## 2.1.8

- Minor changes.
Expand Down
8 changes: 5 additions & 3 deletions example/dapp/lib/pages/connect_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -160,8 +160,10 @@ class ConnectPageState extends State<ConnectPage> {
);
}

Future<void> _onConnect(List<ChainMetadata> chains,
{Function(String message)? showToast}) async {
Future<void> _onConnect(
List<ChainMetadata> chains, {
Function(String message)? showToast,
}) async {
// Use the chain metadata to build the required namespaces:
// Get the methods, get the events
final Map<String, RequiredNamespace> requiredNamespaces = {};
Expand All @@ -184,7 +186,7 @@ class ConnectPageState extends State<ConnectPage> {
// Send off a connect
debugPrint('Creating connection and session');
final ConnectResponse res = await widget.web3App.connect(
requiredNamespaces: requiredNamespaces,
optionalNamespaces: requiredNamespaces,
);
// debugPrint('Connection created, connection response: ${res.uri}');

Expand Down
4 changes: 2 additions & 2 deletions example/wallet/android/app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ android {

defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId "com.walletconnect.flutter_wallet"
applicationId "com.walletconnect.flutterwallet"
// You can update the following values to match your application needs.
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-build-configuration.
minSdkVersion 21
Expand All @@ -60,7 +60,7 @@ android {
signingConfig signingConfigs.debug
}
}
namespace 'com.example.wallet'
namespace 'com.walletconnect.flutterwallet'
}

flutter {
Expand Down
2 changes: 1 addition & 1 deletion example/wallet/android/app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
android:name="${applicationName}"
android:icon="@mipmap/ic_launcher">
<activity
android:name="com.walletconnect.flutter_wallet.MainActivity"
android:name="com.walletconnect.flutterwallet.MainActivity"
android:exported="true"
android:launchMode="singleTop"
android:theme="@style/LaunchTheme"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.walletconnect.flutter_wallet
package com.walletconnect.flutterwallet

import io.flutter.embedding.android.FlutterActivity

Expand Down
6 changes: 3 additions & 3 deletions example/wallet/ios/Runner.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -365,7 +365,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.example.wallet;
PRODUCT_BUNDLE_IDENTIFIER = com.walletconnect.flutterwallet;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
Expand Down Expand Up @@ -494,7 +494,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.example.wallet;
PRODUCT_BUNDLE_IDENTIFIER = com.walletconnect.flutterwallet;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
Expand All @@ -517,7 +517,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.example.wallet;
PRODUCT_BUNDLE_IDENTIFIER = com.walletconnect.flutterwallet;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
Expand Down
12 changes: 6 additions & 6 deletions example/wallet/ios/Runner/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CADisableMinimumFrameDurationOnPhone</key>
<true/>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key>
Expand All @@ -24,6 +26,10 @@
<string>$(FLUTTER_BUILD_NUMBER)</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>NSCameraUsageDescription</key>
<string>This app needs camera access to scan QR codes</string>
<key>UIApplicationSupportsIndirectInputEvents</key>
<true/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIMainStoryboardFile</key>
Expand All @@ -43,11 +49,5 @@
</array>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>CADisableMinimumFrameDurationOnPhone</key>
<true/>
<key>UIApplicationSupportsIndirectInputEvents</key>
<true/>
<key>NSCameraUsageDescription</key>
<string>This app needs camera access to scan QR codes</string>
</dict>
</plist>
3 changes: 2 additions & 1 deletion example/wallet/lib/dependencies/web3wallet_service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ class Web3WalletService extends IWeb3WalletService {

@override
void create() {
// Create the web3wallet
// Create the web3wallet
_web3Wallet = Web3Wallet(
core: Core(
projectId: DartDefines.projectId,
Expand Down Expand Up @@ -137,6 +137,7 @@ class Web3WalletService extends IWeb3WalletService {
wallet: _web3Wallet!,
sessionProposal: WCSessionRequestModel(
request: args.params,
verifyContext: args.verifyContext,
),
),
);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import 'package:walletconnect_flutter_v2/apis/core/verify/models/verify_context.dart';
import 'package:walletconnect_flutter_v2/walletconnect_flutter_v2.dart';
import 'package:walletconnect_flutter_v2_wallet/utils/constants.dart';
import 'package:walletconnect_flutter_v2_wallet/utils/namespace_model_builder.dart';
Expand Down Expand Up @@ -49,10 +50,8 @@ class WCConnectionRequestWidget extends StatelessWidget {
textAlign: TextAlign.center,
),
const SizedBox(height: StyleConstants.linear8),
Text(
metadata.metadata.url,
style: StyleConstants.bodyText,
textAlign: TextAlign.center,
VerifyContextWidget(
verifyContext: sessionProposal?.verifyContext,
),
const SizedBox(height: StyleConstants.linear8),
authRequest != null
Expand Down Expand Up @@ -109,3 +108,130 @@ class WCConnectionRequestWidget extends StatelessWidget {
// );
}
}

class VerifyContextWidget extends StatelessWidget {
const VerifyContextWidget({
super.key,
required this.verifyContext,
});
final VerifyContext? verifyContext;

@override
Widget build(BuildContext context) {
if (verifyContext == null) {
return const SizedBox.shrink();
}

if (verifyContext!.validation.scam) {
return VerifyBanner(
color: StyleConstants.errorColor,
origin: verifyContext!.origin,
title: 'Security risk',
text: 'This domain is flagged as unsafe by multiple security providers.'
' Leave immediately to protect your assets.',
);
}
if (verifyContext!.validation.invalid) {
return VerifyBanner(
color: StyleConstants.errorColor,
origin: verifyContext!.origin,
title: 'Domain mismatch',
text:
'This website has a domain that does not match the sender of this request.'
' Approving may lead to loss of funds.',
);
}
if (verifyContext!.validation.valid) {
return VerifyHeader(
iconColor: StyleConstants.successColor,
title: verifyContext!.origin,
);
}
return VerifyBanner(
color: Colors.orange,
origin: verifyContext!.origin,
title: 'Cannot verify',
text: 'This domain cannot be verified. '
'Check the request carefully before approving.',
);
}
}

class VerifyHeader extends StatelessWidget {
const VerifyHeader({
super.key,
required this.iconColor,
required this.title,
});
final Color iconColor;
final String title;

@override
Widget build(BuildContext context) {
return Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(
Icons.shield_outlined,
color: iconColor,
),
const SizedBox(width: StyleConstants.linear8),
Text(
title,
style: const TextStyle(
color: Colors.white,
fontWeight: FontWeight.bold,
),
),
],
);
}
}

class VerifyBanner extends StatelessWidget {
const VerifyBanner({
super.key,
required this.origin,
required this.title,
required this.text,
required this.color,
});
final String origin, title, text;
final Color color;

@override
Widget build(BuildContext context) {
return Column(
children: [
Text(
origin,
style: const TextStyle(
color: Colors.white,
fontWeight: FontWeight.bold,
),
),
const SizedBox.square(dimension: 8.0),
Container(
padding: const EdgeInsets.all(8.0),
decoration: BoxDecoration(
color: color,
borderRadius: const BorderRadius.all(Radius.circular(12.0)),
),
child: Column(
children: [
VerifyHeader(
iconColor: Colors.white,
title: title,
),
const SizedBox(height: 4.0),
Text(
text,
style: const TextStyle(color: Colors.white),
),
],
),
),
],
);
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
import 'package:walletconnect_flutter_v2/apis/core/verify/models/verify_context.dart';
import 'package:walletconnect_flutter_v2/walletconnect_flutter_v2.dart';

class WCSessionRequestModel {
// final List<String> accounts;
final ProposalData request;
final VerifyContext? verifyContext;

WCSessionRequestModel({
// required this.accounts,
required this.request,
this.verifyContext,
});
}
18 changes: 14 additions & 4 deletions lib/apis/core/core.dart
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ import 'package:walletconnect_flutter_v2/apis/core/store/i_store.dart';
import 'package:walletconnect_flutter_v2/apis/core/relay_client/i_relay_client.dart';
import 'package:walletconnect_flutter_v2/apis/core/pairing/i_pairing.dart';
import 'package:walletconnect_flutter_v2/apis/core/store/shared_prefs_store.dart';
import 'package:walletconnect_flutter_v2/apis/core/verify/i_verify.dart';
import 'package:walletconnect_flutter_v2/apis/core/verify/verify.dart';
import 'package:walletconnect_flutter_v2/apis/utils/constants.dart';
import 'package:walletconnect_flutter_v2/apis/utils/log_level.dart';
import 'package:walletconnect_flutter_v2/apis/utils/walletconnect_utils.dart';
Expand All @@ -34,13 +36,13 @@ class Core implements ICore {
String get version => '2';

@override
String relayUrl = WalletConnectConstants.DEFAULT_RELAY_URL;
final String projectId;

@override
final String projectId;
String relayUrl = WalletConnectConstants.DEFAULT_RELAY_URL;

@override
final String pushUrl;
String pushUrl = WalletConnectConstants.DEFAULT_PUSH_URL;

@override
late ICrypto crypto;
Expand All @@ -60,6 +62,9 @@ class Core implements ICore {
@override
late IHeartBeat heartbeat;

@override
late IVerify verify;

Logger _logger = Logger(
level: Level.off,
printer: PrettyPrinter(),
Expand All @@ -71,8 +76,8 @@ class Core implements ICore {
late IStore<Map<String, dynamic>> storage;

Core({
this.relayUrl = WalletConnectConstants.DEFAULT_RELAY_URL,
required this.projectId,
this.relayUrl = WalletConnectConstants.DEFAULT_RELAY_URL,
this.pushUrl = WalletConnectConstants.DEFAULT_PUSH_URL,
bool memoryStore = false,
LogLevel logLevel = LogLevel.nothing,
Expand Down Expand Up @@ -150,6 +155,11 @@ class Core implements ICore {
httpClient: httpClient,
),
);
verify = Verify(
core: this,
projectId: projectId,
httpClient: httpClient,
);
}

@override
Expand Down
2 changes: 2 additions & 0 deletions lib/apis/core/i_core.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import 'package:walletconnect_flutter_v2/apis/core/pairing/i_expirer.dart';
import 'package:walletconnect_flutter_v2/apis/core/pairing/i_pairing.dart';
import 'package:walletconnect_flutter_v2/apis/core/relay_client/i_relay_client.dart';
import 'package:walletconnect_flutter_v2/apis/core/store/i_store.dart';
import 'package:walletconnect_flutter_v2/apis/core/verify/i_verify.dart';

abstract class ICore {
final String protocol = 'wc';
Expand All @@ -24,6 +25,7 @@ abstract class ICore {
abstract IPairing pairing;
abstract IEcho echo;
abstract final Logger logger;
abstract IVerify verify;

Future<void> start();
}
1 change: 1 addition & 0 deletions lib/apis/core/pairing/utils/pairing_models.dart
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ class PairingMetadata with _$PairingMetadata {
required String description,
required String url,
required List<String> icons,
String? verifyUrl,
Redirect? redirect,
}) = _PairingMetadata;

Expand Down
Loading

0 comments on commit adec734

Please sign in to comment.