mirror of
https://github.com/Such-Software/hash-wallet.git
synced 2026-10-26 06:08:40 +01:00
fix: sign and verify for evm wallets (#3599)
This commit is contained in:
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user