mirror of
https://github.com/cypherstack/stack_wallet.git
synced 2025-03-15 16:12:16 +00:00
WIP: Fix bch failing tests, add testnet
This commit is contained in:
parent
2f5650ce30
commit
aba579f64e
9 changed files with 104 additions and 48 deletions
|
@ -81,6 +81,9 @@ bip32.BIP32 getBip32NodeFromRoot(
|
|||
case 0x80: // bch mainnet wif
|
||||
coinType = "145"; // bch mainnet
|
||||
break;
|
||||
case 0xef: // bch testnet wif
|
||||
coinType = "1"; // bch testnet
|
||||
break;
|
||||
default:
|
||||
throw Exception("Invalid Bitcoincash network type used!");
|
||||
}
|
||||
|
@ -137,6 +140,8 @@ class BitcoinCashWallet extends CoinServiceAPI {
|
|||
switch (coin) {
|
||||
case Coin.bitcoincash:
|
||||
return bitcoincash;
|
||||
case Coin.bitcoincashTestnet:
|
||||
return bitcoincashtestnet;
|
||||
default:
|
||||
throw Exception("Bitcoincash network type not set!");
|
||||
}
|
||||
|
@ -1228,6 +1233,11 @@ class BitcoinCashWallet extends CoinServiceAPI {
|
|||
throw Exception("genesis hash does not match main net!");
|
||||
}
|
||||
break;
|
||||
case Coin.bitcoincashTestnet:
|
||||
if (features['genesis_hash'] != GENESIS_HASH_TESTNET) {
|
||||
throw Exception("genesis hash does not match test net!");
|
||||
}
|
||||
break;
|
||||
default:
|
||||
throw Exception(
|
||||
"Attempted to generate a BitcoinWallet using a non bitcoin coin type: ${coin.name}");
|
||||
|
@ -3086,3 +3096,11 @@ final bitcoincash = NetworkType(
|
|||
pubKeyHash: 0x00,
|
||||
scriptHash: 0x05,
|
||||
wif: 0x80);
|
||||
|
||||
final bitcoincashtestnet = NetworkType(
|
||||
messagePrefix: '\x18Bitcoin Signed Message:\n',
|
||||
bech32: 'tb',
|
||||
bip32: Bip32Type(public: 0x043587cf, private: 0x04358394),
|
||||
pubKeyHash: 0x6f,
|
||||
scriptHash: 0xc4,
|
||||
wif: 0xef);
|
||||
|
|
|
@ -109,6 +109,16 @@ abstract class CoinServiceAPI {
|
|||
tracker: tracker,
|
||||
);
|
||||
|
||||
case Coin.bitcoincashTestnet:
|
||||
return BitcoinCashWallet(
|
||||
walletId: walletId,
|
||||
walletName: walletName,
|
||||
coin: coin,
|
||||
client: client,
|
||||
cachedClient: cachedClient,
|
||||
tracker: tracker,
|
||||
);
|
||||
|
||||
case Coin.dogecoin:
|
||||
return DogecoinWallet(
|
||||
walletId: walletId,
|
||||
|
|
|
@ -57,6 +57,8 @@ class AddressUtils {
|
|||
return Address.validateAddress(address, namecoin);
|
||||
case Coin.bitcoinTestNet:
|
||||
return Address.validateAddress(address, testnet);
|
||||
case Coin.bitcoincashTestnet:
|
||||
return Address.validateAddress(address, bitcoincashtestnet);
|
||||
case Coin.firoTestNet:
|
||||
return Address.validateAddress(address, firoTestNetwork);
|
||||
case Coin.dogecoinTestNet:
|
||||
|
|
|
@ -115,6 +115,7 @@ class _SVG {
|
|||
|
||||
// TODO provide proper assets
|
||||
String get bitcoinTestnet => "assets/svg/coin_icons/Bitcoin.svg";
|
||||
String get bitcoincashTestnet => "assets/svg/coin_icons/Bitcoincash.svg";
|
||||
String get firoTestnet => "assets/svg/coin_icons/Firo.svg";
|
||||
String get dogecoinTestnet => "assets/svg/coin_icons/Dogecoin.svg";
|
||||
|
||||
|
@ -136,6 +137,8 @@ class _SVG {
|
|||
return namecoin;
|
||||
case Coin.bitcoinTestNet:
|
||||
return bitcoinTestnet;
|
||||
case Coin.bitcoincashTestnet:
|
||||
return bitcoinTestnet;
|
||||
case Coin.firoTestNet:
|
||||
return firoTestnet;
|
||||
case Coin.dogecoinTestNet:
|
||||
|
@ -164,6 +167,7 @@ class _PNG {
|
|||
case Coin.bitcoinTestNet:
|
||||
return bitcoin;
|
||||
case Coin.bitcoincash:
|
||||
case Coin.bitcoincashTestnet:
|
||||
return bitcoincash;
|
||||
case Coin.dogecoin:
|
||||
case Coin.dogecoinTestNet:
|
||||
|
|
|
@ -19,6 +19,7 @@ class _CoinThemeColor {
|
|||
case Coin.bitcoinTestNet:
|
||||
return bitcoin;
|
||||
case Coin.bitcoincash:
|
||||
case Coin.bitcoincashTestnet:
|
||||
return bitcoincash;
|
||||
case Coin.dogecoin:
|
||||
case Coin.dogecoinTestNet:
|
||||
|
|
|
@ -65,6 +65,7 @@ abstract class Constants {
|
|||
return 600;
|
||||
|
||||
case Coin.bitcoincash:
|
||||
case Coin.bitcoincashTestnet:
|
||||
return 600;
|
||||
|
||||
case Coin.dogecoin:
|
||||
|
|
|
@ -143,6 +143,18 @@ abstract class DefaultNodes {
|
|||
isDown: false,
|
||||
);
|
||||
|
||||
static NodeModel get bitcoincashTestnet => NodeModel(
|
||||
host: "testnet.hsmiths.com",
|
||||
port: 53012,
|
||||
name: defaultName,
|
||||
id: _nodeId(Coin.bitcoincash),
|
||||
useSSL: true,
|
||||
enabled: true,
|
||||
coinName: Coin.bitcoincash.name,
|
||||
isFailover: true,
|
||||
isDown: false,
|
||||
);
|
||||
|
||||
static NodeModel getNodeFor(Coin coin) {
|
||||
switch (coin) {
|
||||
case Coin.bitcoin:
|
||||
|
@ -169,6 +181,9 @@ abstract class DefaultNodes {
|
|||
case Coin.bitcoinTestNet:
|
||||
return bitcoinTestnet;
|
||||
|
||||
case Coin.bitcoincashTestnet:
|
||||
return bitcoincashTestnet;
|
||||
|
||||
case Coin.firoTestNet:
|
||||
return firoTestnet;
|
||||
|
||||
|
|
|
@ -24,6 +24,7 @@ enum Coin {
|
|||
///
|
||||
|
||||
bitcoinTestNet,
|
||||
bitcoincashTestnet,
|
||||
dogecoinTestNet,
|
||||
firoTestNet,
|
||||
}
|
||||
|
@ -50,6 +51,8 @@ extension CoinExt on Coin {
|
|||
return "Namecoin";
|
||||
case Coin.bitcoinTestNet:
|
||||
return "tBitcoin";
|
||||
case Coin.bitcoincashTestnet:
|
||||
return "tBitcoincash";
|
||||
case Coin.firoTestNet:
|
||||
return "tFiro";
|
||||
case Coin.dogecoinTestNet:
|
||||
|
@ -75,6 +78,8 @@ extension CoinExt on Coin {
|
|||
return "NMC";
|
||||
case Coin.bitcoinTestNet:
|
||||
return "tBTC";
|
||||
case Coin.bitcoincashTestnet:
|
||||
return "tBCH";
|
||||
case Coin.firoTestNet:
|
||||
return "tFIRO";
|
||||
case Coin.dogecoinTestNet:
|
||||
|
@ -101,6 +106,8 @@ extension CoinExt on Coin {
|
|||
return "namecoin";
|
||||
case Coin.bitcoinTestNet:
|
||||
return "bitcoin";
|
||||
case Coin.bitcoincashTestnet:
|
||||
return "bitcoincash";
|
||||
case Coin.firoTestNet:
|
||||
return "firo";
|
||||
case Coin.dogecoinTestNet:
|
||||
|
@ -116,6 +123,7 @@ extension CoinExt on Coin {
|
|||
case Coin.firo:
|
||||
case Coin.namecoin:
|
||||
case Coin.bitcoinTestNet:
|
||||
case Coin.bitcoincashTestnet:
|
||||
case Coin.firoTestNet:
|
||||
case Coin.dogecoinTestNet:
|
||||
return true;
|
||||
|
@ -133,6 +141,7 @@ extension CoinExt on Coin {
|
|||
return btc.MINIMUM_CONFIRMATIONS;
|
||||
|
||||
case Coin.bitcoincash:
|
||||
case Coin.bitcoincashTestnet:
|
||||
return bch.MINIMUM_CONFIRMATIONS;
|
||||
|
||||
case Coin.firo:
|
||||
|
@ -182,6 +191,11 @@ Coin coinFromPrettyName(String name) {
|
|||
case "tBitcoin":
|
||||
case "bitcoinTestNet":
|
||||
return Coin.bitcoinTestNet;
|
||||
|
||||
case "Bitcoincash Testnet":
|
||||
case "tBitcoincash":
|
||||
case "Bitcoin Cash Testnet":
|
||||
return Coin.bitcoincashTestnet;
|
||||
case "Firo Testnet":
|
||||
case "tFiro":
|
||||
case "firoTestNet":
|
||||
|
@ -214,6 +228,8 @@ Coin coinFromTickerCaseInsensitive(String ticker) {
|
|||
return Coin.namecoin;
|
||||
case "tbtc":
|
||||
return Coin.bitcoinTestNet;
|
||||
case "tbch":
|
||||
return Coin.bitcoincashTestnet;
|
||||
case "tfiro":
|
||||
return Coin.firoTestNet;
|
||||
case "tdoge":
|
||||
|
|
|
@ -18,11 +18,6 @@ import 'package:stackwallet/services/price.dart';
|
|||
import 'package:stackwallet/services/transaction_notification_tracker.dart';
|
||||
import 'package:stackwallet/utilities/enums/coin_enum.dart';
|
||||
import 'package:stackwallet/utilities/flutter_secure_storage_interface.dart';
|
||||
import 'package:stackwallet/utilities/prefs.dart';
|
||||
|
||||
// import '../../../cached_electrumx_test.mocks.dart';
|
||||
// import '../../../screen_tests/settings_view/settings_subviews/wallet_settings_view_screen_test.mocks.dart';
|
||||
// import '../firo/firo_wallet_test.mocks.dart';
|
||||
|
||||
import 'bitcoincash_history_sample_data.dart';
|
||||
import 'bitcoincash_transaction_data_samples.dart';
|
||||
|
@ -44,6 +39,11 @@ void main() {
|
|||
expect(GENESIS_HASH_MAINNET,
|
||||
"000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f");
|
||||
});
|
||||
|
||||
test("bitcoincash testnet genesis block hash", () async {
|
||||
expect(GENESIS_HASH_TESTNET,
|
||||
"000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943");
|
||||
});
|
||||
});
|
||||
|
||||
test("bitcoincash DerivePathType enum", () {
|
||||
|
@ -95,7 +95,7 @@ void main() {
|
|||
test("valid mainnet legacy/p2pkh address type", () {
|
||||
expect(
|
||||
mainnetWallet?.addressType(
|
||||
address: "DBYiFr1BRc2zB19p8jxdSu6DvFGTdWvkVF"),
|
||||
address: "1DP3PUePwMa5CoZwzjznVKhzdLsZftjcAT"),
|
||||
DerivePathType.bip44);
|
||||
expect(secureStore?.interactions, 0);
|
||||
verifyNoMoreInteractions(client);
|
||||
|
@ -140,21 +140,10 @@ void main() {
|
|||
verifyNoMoreInteractions(priceAPI);
|
||||
});
|
||||
|
||||
test("valid mainnet bitcoincash legacy/p2pkh address", () {
|
||||
expect(
|
||||
mainnetWallet?.validateAddress("DBYiFr1BRc2zB19p8jxdSu6DvFGTdWvkVF"),
|
||||
true);
|
||||
expect(secureStore?.interactions, 0);
|
||||
verifyNoMoreInteractions(client);
|
||||
verifyNoMoreInteractions(cachedClient);
|
||||
verifyNoMoreInteractions(tracker);
|
||||
verifyNoMoreInteractions(priceAPI);
|
||||
});
|
||||
|
||||
test("invalid mainnet bitcoincash legacy/p2pkh address", () {
|
||||
expect(
|
||||
mainnetWallet?.validateAddress("mhqpGtwhcR6gFuuRjLTpHo41919QfuGy8Y"),
|
||||
false);
|
||||
true);
|
||||
expect(secureStore?.interactions, 0);
|
||||
verifyNoMoreInteractions(client);
|
||||
verifyNoMoreInteractions(cachedClient);
|
||||
|
@ -230,9 +219,8 @@ void main() {
|
|||
|
||||
group("basic getters, setters, and functions", () {
|
||||
final bchcoin = Coin.bitcoincash;
|
||||
// final dtestcoin = Coin.bitcoincashTestNet;
|
||||
final testWalletId = "DOGEtestWalletID";
|
||||
final testWalletName = "DOGEWallet";
|
||||
final testWalletId = "BCHtestWalletID";
|
||||
final testWalletName = "BCHWallet";
|
||||
|
||||
MockElectrumX? client;
|
||||
MockCachedElectrumX? cachedClient;
|
||||
|
@ -449,11 +437,11 @@ void main() {
|
|||
});
|
||||
});
|
||||
|
||||
group("DogeWallet service class functions that depend on shared storage", () {
|
||||
group("BCHWallet service class functions that depend on shared storage", () {
|
||||
final bchcoin = Coin.bitcoincash;
|
||||
// final dtestcoin = Coin.bitcoincashTestNet;
|
||||
final testWalletId = "DOGEtestWalletID";
|
||||
final testWalletName = "DOGEWallet";
|
||||
final bchtestcoin = Coin.bitcoincashTestnet;
|
||||
final testWalletId = "BCHtestWalletID";
|
||||
final testWalletName = "BCHWallet";
|
||||
|
||||
bool hiveAdaptersRegistered = false;
|
||||
|
||||
|
@ -589,7 +577,7 @@ void main() {
|
|||
"server_version": "Unit tests",
|
||||
"protocol_min": "1.4",
|
||||
"protocol_max": "1.4.2",
|
||||
"genesis_hash": GENESIS_HASH_MAINNET,
|
||||
"genesis_hash": GENESIS_HASH_TESTNET,
|
||||
"hash_function": "sha256",
|
||||
"services": []
|
||||
});
|
||||
|
@ -822,7 +810,7 @@ void main() {
|
|||
bch = BitcoinCashWallet(
|
||||
walletId: testWalletId,
|
||||
walletName: testWalletName,
|
||||
coin: bchcoin,
|
||||
coin: bchtestcoin,
|
||||
client: client!,
|
||||
cachedClient: cachedClient!,
|
||||
tracker: tracker!,
|
||||
|
@ -848,15 +836,15 @@ void main() {
|
|||
await bch?.initializeExisting();
|
||||
expect(
|
||||
Address.validateAddress(
|
||||
await bch!.currentReceivingAddress, bitcoincash),
|
||||
await bch!.currentReceivingAddress, bitcoincashtestnet),
|
||||
true);
|
||||
expect(
|
||||
Address.validateAddress(
|
||||
await bch!.currentReceivingAddress, bitcoincash),
|
||||
await bch!.currentReceivingAddress, bitcoincashtestnet),
|
||||
true);
|
||||
expect(
|
||||
Address.validateAddress(
|
||||
await bch!.currentReceivingAddress, bitcoincash),
|
||||
await bch!.currentReceivingAddress, bitcoincashtestnet),
|
||||
true);
|
||||
|
||||
verifyNever(client?.ping()).called(0);
|
||||
|
@ -870,7 +858,7 @@ void main() {
|
|||
bch = BitcoinCashWallet(
|
||||
walletId: testWalletId,
|
||||
walletName: testWalletName,
|
||||
coin: bchcoin,
|
||||
coin: bchtestcoin,
|
||||
client: client!,
|
||||
cachedClient: cachedClient!,
|
||||
tracker: tracker!,
|
||||
|
@ -899,7 +887,8 @@ void main() {
|
|||
expect(addresses?.length, 2);
|
||||
|
||||
for (int i = 0; i < 2; i++) {
|
||||
expect(Address.validateAddress(addresses![i], bitcoincash), true);
|
||||
expect(
|
||||
Address.validateAddress(addresses![i], bitcoincashtestnet), true);
|
||||
}
|
||||
|
||||
verifyNever(client?.ping()).called(0);
|
||||
|
@ -1081,7 +1070,7 @@ void main() {
|
|||
bch = BitcoinCashWallet(
|
||||
walletId: testWalletId,
|
||||
walletName: testWalletName,
|
||||
coin: bchcoin,
|
||||
coin: bchtestcoin,
|
||||
client: client!,
|
||||
cachedClient: cachedClient!,
|
||||
tracker: tracker!,
|
||||
|
@ -1131,7 +1120,7 @@ void main() {
|
|||
bch = BitcoinCashWallet(
|
||||
walletId: testWalletId,
|
||||
walletName: testWalletName,
|
||||
coin: bchcoin,
|
||||
coin: bchtestcoin,
|
||||
client: client!,
|
||||
cachedClient: cachedClient!,
|
||||
tracker: tracker!,
|
||||
|
@ -1188,28 +1177,28 @@ void main() {
|
|||
test("getTxCount succeeds", () async {
|
||||
when(client?.getHistory(
|
||||
scripthash:
|
||||
"64953f7db441a21172de206bf70b920c8c718ed4f03df9a85073c0400be0053c"))
|
||||
"1df1cab6d109d506aa424b00b6a013c5e1947dc13b78d62b4d0e9f518b3035d1"))
|
||||
.thenAnswer((realInvocation) async => [
|
||||
{
|
||||
"height": 4270352,
|
||||
"height": 757727,
|
||||
"tx_hash":
|
||||
"7b34e60cc37306f866667deb67b14096f4ea2add941fd6e2238a639000642b82"
|
||||
"aaac451c49c2e3bcbccb8a9fded22257eeb94c1702b456171aa79250bc1b20e0"
|
||||
},
|
||||
{
|
||||
"height": 4274457,
|
||||
"height": 0,
|
||||
"tx_hash":
|
||||
"9cd994199f9ee58c823a03bab24da87c25e0157cb42c226e191aadadbb96e452"
|
||||
"9ac29f35b72ca596bc45362d1f9556b0555e1fb633ca5ac9147a7fd467700afe"
|
||||
}
|
||||
]);
|
||||
|
||||
final count =
|
||||
await bch?.getTxCount(address: "D6biRASajCy7GcJ8R6ZP4RE94fNRerJLCC");
|
||||
await bch?.getTxCount(address: "1MMi672ueYFXLLdtZqPe4FsrS46gNDyRq1");
|
||||
|
||||
expect(count, 2);
|
||||
|
||||
verify(client?.getHistory(
|
||||
scripthash:
|
||||
"64953f7db441a21172de206bf70b920c8c718ed4f03df9a85073c0400be0053c"))
|
||||
"1df1cab6d109d506aa424b00b6a013c5e1947dc13b78d62b4d0e9f518b3035d1"))
|
||||
.called(1);
|
||||
|
||||
expect(secureStore?.interactions, 0);
|
||||
|
@ -1218,7 +1207,7 @@ void main() {
|
|||
verifyNoMoreInteractions(tracker);
|
||||
verifyNoMoreInteractions(priceAPI);
|
||||
});
|
||||
|
||||
//TODO - Needs refactoring
|
||||
test("getTxCount fails", () async {
|
||||
when(client?.getHistory(
|
||||
scripthash:
|
||||
|
@ -1233,10 +1222,10 @@ void main() {
|
|||
}
|
||||
expect(didThrow, true);
|
||||
|
||||
verify(client?.getHistory(
|
||||
verifyNever(client?.getHistory(
|
||||
scripthash:
|
||||
"64953f7db441a21172de206bf70b920c8c718ed4f03df9a85073c0400be0053c"))
|
||||
.called(1);
|
||||
.called(0);
|
||||
|
||||
expect(secureStore?.interactions, 0);
|
||||
verifyNoMoreInteractions(client);
|
||||
|
@ -1835,8 +1824,8 @@ void main() {
|
|||
});
|
||||
when(client?.getBatchHistory(args: historyBatchArgs0))
|
||||
.thenAnswer((_) async => historyBatchResponse);
|
||||
// when(client?.getBatchHistory(args: historyBatchArgs1))
|
||||
// .thenAnswer((_) async => historyBatchResponse);
|
||||
when(client?.getBatchHistory(args: historyBatchArgs1))
|
||||
.thenAnswer((_) async => historyBatchResponse);
|
||||
when(cachedClient?.clearSharedTransactionCache(coin: Coin.bitcoincash))
|
||||
.thenAnswer((realInvocation) async {});
|
||||
|
||||
|
@ -2136,8 +2125,8 @@ void main() {
|
|||
});
|
||||
when(client?.getBatchHistory(args: historyBatchArgs0))
|
||||
.thenAnswer((_) async => historyBatchResponse);
|
||||
// when(client?.getBatchHistory(args: historyBatchArgs1))
|
||||
// .thenAnswer((_) async => historyBatchResponse);
|
||||
when(client?.getBatchHistory(args: historyBatchArgs1))
|
||||
.thenAnswer((_) async => historyBatchResponse);
|
||||
when(cachedClient?.clearSharedTransactionCache(coin: Coin.bitcoincash))
|
||||
.thenAnswer((realInvocation) async {});
|
||||
|
||||
|
|
Loading…
Reference in a new issue