Skip to content

Commit 7b47380

Browse files
committed
feat(monero): add Monero stagenet to Stack Wallet and Stack Duo
1 parent e4efcee commit 7b47380

7 files changed

Lines changed: 80 additions & 4 deletions

File tree

lib/wallets/crypto_currency/coins/monero.dart

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ class Monero extends CryptonoteCurrency {
1414
_id = _idMain;
1515
_name = "Monero";
1616
_ticker = "XMR";
17+
case CryptoCurrencyNetwork.stage:
18+
_id = "${_idMain}Stagenet";
19+
_name = "sMonero";
20+
_ticker = "sXMR";
1721
default:
1822
throw Exception("Unsupported network: $network");
1923
}
@@ -53,6 +57,8 @@ class Monero extends CryptonoteCurrency {
5357
switch (network) {
5458
case CryptoCurrencyNetwork.main:
5559
return csMonero.validateAddress(address, 0);
60+
case CryptoCurrencyNetwork.stage:
61+
return csMonero.validateAddress(address, 2);
5662
default:
5763
throw Exception("Unsupported network: $network");
5864
}
@@ -78,6 +84,24 @@ class Monero extends CryptonoteCurrency {
7884
isPrimary: isPrimary,
7985
);
8086

87+
case CryptoCurrencyNetwork.stage:
88+
// Public third-party clearnet stagenet node; not auto-trusted.
89+
return NodeModel(
90+
host: "http://node3.monerodevs.org",
91+
port: 38089,
92+
name: DefaultNodes.defaultName,
93+
id: DefaultNodes.buildId(this),
94+
useSSL: false,
95+
enabled: true,
96+
coinName: identifier,
97+
isFailover: true,
98+
isDown: false,
99+
trusted: false,
100+
torEnabled: true,
101+
clearnetEnabled: true,
102+
isPrimary: isPrimary,
103+
);
104+
81105
default:
82106
throw UnimplementedError();
83107
}
@@ -114,6 +138,8 @@ class Monero extends CryptonoteCurrency {
114138
switch (network) {
115139
case CryptoCurrencyNetwork.main:
116140
return Uri.parse("https://xmrchain.net/tx/$txid");
141+
case CryptoCurrencyNetwork.stage:
142+
return Uri.parse("https://stagenet.xmrchain.net/tx/$txid");
117143
default:
118144
throw Exception(
119145
"Unsupported network for defaultBlockExplorer(): $network",

lib/wallets/crypto_currency/crypto_currency.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,9 @@ enum CryptoCurrencyNetwork {
3535
test4;
3636

3737
bool get isTestNet =>
38-
this == CryptoCurrencyNetwork.test || this == CryptoCurrencyNetwork.test4;
38+
this == CryptoCurrencyNetwork.test ||
39+
this == CryptoCurrencyNetwork.test4 ||
40+
this == CryptoCurrencyNetwork.stage;
3941
}
4042

4143
abstract class CryptoCurrency {

lib/wallets/wallet/impl/monero_wallet.dart

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,19 +41,27 @@ class MoneroWallet extends LibMoneroWallet {
4141
Future<WrappedWallet> loadWallet({
4242
required String path,
4343
required String password,
44-
}) => csMonero.loadWallet(walletId, path: path, password: password);
44+
int network = 0,
45+
}) => csMonero.loadWallet(
46+
walletId,
47+
path: path,
48+
password: password,
49+
network: network,
50+
);
4551

4652
@override
4753
Future<WrappedWallet> getCreatedWallet({
4854
required String path,
4955
required String password,
5056
required int wordCount,
5157
required String seedOffset,
58+
int network = 0,
5259
}) => csMonero.getCreatedWallet(
5360
path: path,
5461
password: password,
5562
wordCount: wordCount,
5663
seedOffset: seedOffset,
64+
network: network,
5765
);
5866

5967
@override
@@ -62,13 +70,15 @@ class MoneroWallet extends LibMoneroWallet {
6270
required String password,
6371
required String mnemonic,
6472
required String seedOffset,
73+
int network = 0,
6574
int height = 0,
6675
}) => csMonero.getRestoredWallet(
6776
path: path,
6877
password: password,
6978
mnemonic: mnemonic,
7079
height: height,
7180
seedOffset: seedOffset,
81+
network: network,
7282
walletId: walletId,
7383
);
7484

@@ -78,13 +88,15 @@ class MoneroWallet extends LibMoneroWallet {
7888
required String password,
7989
required String address,
8090
required String privateViewKey,
91+
int network = 0,
8192
int height = 0,
8293
}) => csMonero.getRestoredFromViewKeyWallet(
8394
walletId: walletId,
8495
path: path,
8596
password: password,
8697
address: address,
8798
privateViewKey: privateViewKey,
99+
network: network,
88100
height: height,
89101
);
90102

lib/wallets/wallet/intermediate/lib_monero_wallet.dart

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import '../../../utilities/stack_file_system.dart';
3737
import '../../../wl_gen/interfaces/cs_monero_interface.dart';
3838
import '../../../wl_gen/interfaces/cs_salvium_interface.dart'
3939
show WrappedWallet;
40+
import '../../crypto_currency/crypto_currency.dart';
4041
import '../../crypto_currency/intermediate/cryptonote_currency.dart';
4142
import '../../isar/models/wallet_info.dart';
4243
import '../../models/tx_data.dart';
@@ -110,6 +111,20 @@ abstract class LibMoneroWallet<T extends CryptonoteCurrency>
110111

111112
final lib_monero_compat.WalletType compatType;
112113

114+
/// Maps CryptoCurrencyNetwork to monero_c network type integer.
115+
int getNetworkType() {
116+
switch (cryptoCurrency.network) {
117+
case CryptoCurrencyNetwork.main:
118+
return 0;
119+
case CryptoCurrencyNetwork.test:
120+
return 1;
121+
case CryptoCurrencyNetwork.stage:
122+
return 2;
123+
default:
124+
throw Exception("Unsupported network: ${cryptoCurrency.network}");
125+
}
126+
}
127+
113128
lib_monero_compat.SyncStatus? get syncStatus => _syncStatus;
114129
lib_monero_compat.SyncStatus? _syncStatus;
115130
int _syncedCount = 0;
@@ -138,20 +153,23 @@ abstract class LibMoneroWallet<T extends CryptonoteCurrency>
138153
Future<WrappedWallet> loadWallet({
139154
required String path,
140155
required String password,
156+
int network = 0,
141157
});
142158

143159
Future<WrappedWallet> getCreatedWallet({
144160
required String path,
145161
required String password,
146162
required int wordCount,
147163
required String seedOffset,
164+
int network = 0,
148165
});
149166

150167
Future<WrappedWallet> getRestoredWallet({
151168
required String path,
152169
required String password,
153170
required String mnemonic,
154171
required String seedOffset,
172+
int network = 0,
155173
int height = 0,
156174
});
157175

@@ -160,6 +178,7 @@ abstract class LibMoneroWallet<T extends CryptonoteCurrency>
160178
required String password,
161179
required String address,
162180
required String privateViewKey,
181+
int network = 0,
163182
int height = 0,
164183
});
165184

@@ -209,7 +228,11 @@ abstract class LibMoneroWallet<T extends CryptonoteCurrency>
209228
throw Exception("Password not found $e, $s");
210229
}
211230

212-
wallet = await loadWallet(path: path, password: password);
231+
wallet = await loadWallet(
232+
path: path,
233+
password: password,
234+
network: getNetworkType(),
235+
);
213236

214237
_setListener();
215238

@@ -329,7 +352,11 @@ abstract class LibMoneroWallet<T extends CryptonoteCurrency>
329352
} catch (e, s) {
330353
throw Exception("Password not found $e, $s");
331354
}
332-
wallet = await loadWallet(path: path, password: password);
355+
wallet = await loadWallet(
356+
path: path,
357+
password: password,
358+
network: getNetworkType(),
359+
);
333360
return (
334361
await csMonero.getAddress(wallet!),
335362
await csMonero.getPrivateViewKey(wallet!),
@@ -355,6 +382,7 @@ abstract class LibMoneroWallet<T extends CryptonoteCurrency>
355382
password: password,
356383
wordCount: wordCount,
357384
seedOffset: "", // default for non restored wallets for now
385+
network: getNetworkType(),
358386
);
359387

360388
await info.updateRestoreHeight(
@@ -438,6 +466,7 @@ abstract class LibMoneroWallet<T extends CryptonoteCurrency>
438466
mnemonic: mnemonic,
439467
height: height,
440468
seedOffset: seedOffset,
469+
network: getNetworkType(),
441470
);
442471

443472
if (this.wallet != null) {
@@ -1575,6 +1604,7 @@ abstract class LibMoneroWallet<T extends CryptonoteCurrency>
15751604
address: data.address,
15761605
privateViewKey: data.privateViewKey,
15771606
height: height,
1607+
network: getNetworkType(),
15781608
);
15791609

15801610
if (this.wallet == null) {

lib/wl_gen/interfaces/cs_monero_interface.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ abstract class CsMoneroInterface {
2525
String walletId, {
2626
required String path,
2727
required String password,
28+
int network = 0,
2829
});
2930

3031
Future<String> getAddress(
@@ -38,6 +39,7 @@ abstract class CsMoneroInterface {
3839
required String password,
3940
required int wordCount,
4041
required String seedOffset,
42+
int network = 0,
4143
});
4244

4345
Future<WrappedWallet> getRestoredWallet({
@@ -46,6 +48,7 @@ abstract class CsMoneroInterface {
4648
required String password,
4749
required String mnemonic,
4850
required String seedOffset,
51+
int network = 0,
4952
int height = 0,
5053
});
5154

@@ -55,6 +58,7 @@ abstract class CsMoneroInterface {
5558
required String password,
5659
required String address,
5760
required String privateViewKey,
61+
int network = 0,
5862
int height = 0,
5963
});
6064

scripts/app_config/configure_stack_duo.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ final List<CryptoCurrency> _supportedCoins = List.unmodifiable([
8383
Bitcoin(CryptoCurrencyNetwork.test4),
8484
BitcoinFrost(CryptoCurrencyNetwork.test),
8585
BitcoinFrost(CryptoCurrencyNetwork.test4),
86+
Monero(CryptoCurrencyNetwork.stage),
8687
]);
8788
8889
final ({String from, String fromFuzzyNet, String to, String toFuzzyNet})

scripts/app_config/configure_stack_wallet.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@ final List<CryptoCurrency> _supportedCoins = List.unmodifiable([
138138
Salvium(CryptoCurrencyNetwork.test),
139139
Stellar(CryptoCurrencyNetwork.test),
140140
Xelis(CryptoCurrencyNetwork.test),
141+
Monero(CryptoCurrencyNetwork.stage),
141142
]);
142143
143144
final ({String from, String fromFuzzyNet, String to, String toFuzzyNet})

0 commit comments

Comments
 (0)