Merge pull request from cypherstack/cryptonote/validation

Use native address validation for cryptonote coins
This commit is contained in:
julian-CStack 2022-11-10 18:30:51 -06:00 committed by GitHub
commit 939e241f61
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 41 additions and 19 deletions
crypto_plugins
lib/services/coins
test/services/coins

@ -1 +1 @@
Subproject commit b9bc2dcc56e13f235a6c5b0fc02c0e543eb87758 Subproject commit 2da77438527732dfaa5398aa391eab5253dabe19

View file

@ -1353,10 +1353,8 @@ class MoneroWallet extends CoinServiceAPI {
Future<List<UtxoObject>> get unspentOutputs => throw UnimplementedError(); Future<List<UtxoObject>> get unspentOutputs => throw UnimplementedError();
@override @override
// TODO: implement validateAddress
bool validateAddress(String address) { bool validateAddress(String address) {
bool valid = RegExp("[a-zA-Z0-9]{95}").hasMatch(address) || bool valid = walletBase!.validateAddress(address);
RegExp("[a-zA-Z0-9]{106}").hasMatch(address);
return valid; return valid;
} }

View file

@ -1378,10 +1378,8 @@ class WowneroWallet extends CoinServiceAPI {
Future<List<UtxoObject>> get unspentOutputs => throw UnimplementedError(); Future<List<UtxoObject>> get unspentOutputs => throw UnimplementedError();
@override @override
// TODO: implement validateAddress
bool validateAddress(String address) { bool validateAddress(String address) {
bool valid = RegExp("[a-zA-Z0-9]{95}").hasMatch(address) || bool valid = walletBase!.validateAddress(address);
RegExp("[a-zA-Z0-9]{106}").hasMatch(address);
return valid; return valid;
} }

View file

@ -90,12 +90,12 @@ void main() async {
final dirPath = await pathForWalletDir(name: name, type: type); final dirPath = await pathForWalletDir(name: name, type: type);
path = await pathForWallet(name: name, type: type); path = await pathForWallet(name: name, type: type);
credentials = credentials =
// // creating a new wallet // // creating a new wallet
// monero.createMoneroNewWalletCredentials( // monero.createMoneroNewWalletCredentials(
// name: name, language: "English"); // name: name, language: "English");
// restoring a previous wallet // restoring a previous wallet
monero.createMoneroRestoreWalletFromSeedCredentials( monero.createMoneroRestoreWalletFromSeedCredentials(
name: name, height: 2580000, mnemonic: testMnemonic); name: name, height: 2580000, mnemonic: testMnemonic);
walletInfo = WalletInfo.external( walletInfo = WalletInfo.external(
id: WalletBase.idFor(name, type), id: WalletBase.idFor(name, type),
@ -124,8 +124,8 @@ void main() async {
test("Test mainnet address generation from seed", () async { test("Test mainnet address generation from seed", () async {
final wallet = await final wallet = await
// _walletCreationService.create(credentials); // _walletCreationService.create(credentials);
_walletCreationService.restoreFromSeed(credentials); _walletCreationService.restoreFromSeed(credentials);
walletInfo.address = wallet.walletAddresses.address; walletInfo.address = wallet.walletAddresses.address;
//print(walletInfo.address); //print(walletInfo.address);
@ -134,6 +134,9 @@ void main() async {
walletBase = wallet as MoneroWalletBase; walletBase = wallet as MoneroWalletBase;
//print("${walletBase?.seed}"); //print("${walletBase?.seed}");
expect(
await walletBase!.validateAddress(walletInfo.address ?? ''), true);
// print(walletBase); // print(walletBase);
// loggerPrint(walletBase.toString()); // loggerPrint(walletBase.toString());
// loggerPrint("name: ${walletBase!.name} seed: ${walletBase!.seed} id: " // loggerPrint("name: ${walletBase!.name} seed: ${walletBase!.seed} id: "
@ -153,6 +156,21 @@ void main() async {
await walletBase!.getTransactionAddress(1, 1), mainnetTestData[1][1]); await walletBase!.getTransactionAddress(1, 1), mainnetTestData[1][1]);
expect( expect(
await walletBase!.getTransactionAddress(1, 2), mainnetTestData[1][2]); await walletBase!.getTransactionAddress(1, 2), mainnetTestData[1][2]);
expect(
await walletBase!.validateAddress(''), false);
expect(
await walletBase!.validateAddress('4AeRgkWZsMJhAWKMeCZ3h4ZSPnAcW5VBtRFyLd6gBEf6GgJU2FHXDA6i1DnQTd6h8R3VU5AkbGcWSNhtSwNNPgaD48gp4nn'), true);
expect(
await walletBase!.validateAddress('4asdfkWZsMJhAWKMeCZ3h4ZSPnAcW5VBtRFyLd6gBEf6GgJU2FHXDA6i1DnQTd6h8R3VU5AkbGcWSNhtSwNNPgaD48gpjkl'), false);
expect(
await walletBase!.validateAddress('8AeRgkWZsMJhAWKMeCZ3h4ZSPnAcW5VBtRFyLd6gBEf6GgJU2FHXDA6i1DnQTd6h8R3VU5AkbGcWSNhtSwNNPgaD48gp4nn'), false);
expect(
await walletBase!.validateAddress('84kYPuZ1eaVKGQhf26QPNWbSLQG16BywXdLYYShVrPNMLAUAWce5vcpRc78FxwRphrG6Cda7faCKdUMr8fUCH3peHPenvHy'), true);
expect(
await walletBase!.validateAddress('8asdfuZ1eaVKGQhf26QPNWbSLQG16BywXdLYYShVrPNMLAUAWce5vcpRc78FxwRphrG6Cda7faCKdUMr8fUCH3peHPenjkl'), false);
expect(
await walletBase!.validateAddress('44kYPuZ1eaVKGQhf26QPNWbSLQG16BywXdLYYShVrPNMLAUAWce5vcpRc78FxwRphrG6Cda7faCKdUMr8fUCH3peHPenvHy'), false);
}); });
}); });
/* /*
@ -211,6 +229,6 @@ Future<String> pathForWalletDir(
} }
Future<String> pathForWallet( Future<String> pathForWallet(
{required String name, required WalletType type}) async => {required String name, required WalletType type}) async =>
await pathForWalletDir(name: name, type: type) await pathForWalletDir(name: name, type: type)
.then((path) => path + '/$name'); .then((path) => path + '/$name');

View file

@ -126,13 +126,21 @@ void main() async {
walletBase?.close(); walletBase?.close();
walletBase = wallet as WowneroWalletBase; walletBase = wallet as WowneroWalletBase;
// TODO validate expect(
//expect(walletInfo.address, mainnetTestData14[0][0]); await walletBase!.validateAddress(wallet.walletAddresses.address ?? ''), true);
} catch (_) { } catch (_) {
hasThrown = true; hasThrown = true;
} }
expect(hasThrown, false); expect(hasThrown, false);
// Address validation
expect(
await walletBase!.validateAddress(''), false);
expect(
await walletBase!.validateAddress('Wo3jmHvTMLwE6h29fpgcb8PbJSpaKuqM7XTXVfiiu8bLCZsJvrQCbQSJR48Vo3BWNQKsMsXZ4VixndXTH25QtorC27NCjmsEi'), true);
expect(
await walletBase!.validateAddress('WasdfHvTMLwE6h29fpgcb8PbJSpaKuqM7XTXVfiiu8bLCZsJvrQCbQSJR48Vo3BWNQKsMsXZ4VixndXTH25QtorC27NCjmjkl'), false);
walletBase?.close(); walletBase?.close();
walletBase = wallet as WowneroWalletBase; walletBase = wallet as WowneroWalletBase;
}); });
@ -359,6 +367,6 @@ Future<String> pathForWalletDir(
} }
Future<String> pathForWallet( Future<String> pathForWallet(
{required String name, required WalletType type}) async => {required String name, required WalletType type}) async =>
await pathForWalletDir(name: name, type: type) await pathForWalletDir(name: name, type: type)
.then((path) => path + '/$name'); .then((path) => path + '/$name');