fix: sign and verify for evm wallets (#3599)

This commit is contained in:
David Adegoke
2026-09-14 21:58:22 +02:00
committed by GitHub
parent ef6879b617
commit 96e5329b32
+31 -10
View File
@@ -41,7 +41,6 @@ import 'package:mobx/mobx.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:web3dart/crypto.dart';
import 'package:web3dart/web3dart.dart';
import 'package:eth_sig_util/eth_sig_util.dart';
import 'contract/erc20.dart';
import 'evm_chain_transaction_info.dart';
@@ -1564,20 +1563,42 @@ abstract class EVMChainWalletBase
}
@override
Future<String> signMessage(String message, {String? address}) async {
return bytesToHex(await _evmChainPrivateKey.signPersonalMessage(ascii.encode(message)));
}
Future<String> signMessage(String message, {String? address}) async =>
bytesToHex(await _evmChainPrivateKey.signPersonalMessage(utf8.encode(message)));
@override
Future<bool> verifyMessage(String message, String signature, {String? address}) async {
if (address == null) {
if (address == null || address.isEmpty) {
return false;
}
try {
final signatureBytes = hexToBytes(signature.trim().toLowerCase());
if (signatureBytes.length != 65) {
return false;
}
final messageBytes = utf8.encode(message);
final prefixedMessage = Uint8List.fromList(
ascii.encode("\x19Ethereum Signed Message:\n${messageBytes.length}") + messageBytes,
);
final v = signatureBytes[64] < 27 ? signatureBytes[64] + 27 : signatureBytes[64];
final publicKey = ecRecover(
keccak256(prefixedMessage),
MsgSignature(
bytesToUnsignedInt(signatureBytes.sublist(0, 32)),
bytesToUnsignedInt(signatureBytes.sublist(32, 64)),
v,
),
);
final paddedPublicKey = Uint8List(64)..setRange(64 - publicKey.length, 64, publicKey);
final recoveredAddress = EthereumAddress.fromPublicKey(paddedPublicKey);
return recoveredAddress.hexNo0x == strip0x(address.trim().toLowerCase());
} catch (e) {
printV("Failed to verify EVM message signature: $e");
return false;
}
final recoveredAddress = EthSigUtil.recoverPersonalSignature(
message: ascii.encode(message),
signature: signature,
);
return recoveredAddress.toUpperCase() == address.toUpperCase();
}
Web3Client? getWeb3Client() => _client.getWeb3Client();