LCW-1144 cupcake litecoin (#2557)

* Add psbt rpcs * Only build arm64 * Rebuild protos * Update proto * Add psbt create rpc * Restore wallet stuff * more stuff * more stuff * more stuff * Fix open wallet * Fix mweb enabled * Start of buildPsbt * Update proto * Psbt add recipients * fixes * slightly better * more fixes * decode ur * add more commit code * Update proto * use new proto * Don't eat psbt rpc errors * Use unix domain socket for mwebd * add gitignore * Undo build only arm64 * fix pure mweb txns * fix mweb txids * fix ci * fix blank pegin address * chore: update cw_mweb dependencies chore: remove cw_core as dependency from cw_mweb * fix: Ltub restore * fix: address review crashes, fix non-mweb view only wallets * minor fixes --------- Co-authored-by: Hector Chu <hectorchu@gmail.com> Co-authored-by: OmarHatem <omarh.ismail1@gmail.com>

cyan committed Nov 24, 2025 at 13:58 UTC 77812016ac6f5619df012194ba4028f19a8c7c68
26 files changed +1909 -149
cw_bitcoin/lib/bitcoin_address_record.dart
+9 -2
@@ -1,4 +1,5 @@
1 import 'dart:convert';
2 +import 'package:cw_core/utils/print_verbose.dart';
3 import 'package:mobx/mobx.dart';
4
5 import 'package:bitcoin_base/bitcoin_base.dart';
@@ -65,8 +66,14 @@ class BitcoinAddressRecord extends BaseBitcoinAddressRecord {
66 required super.type,
67 String? scriptHash,
68 required super.network,
68 - }) : scriptHash = scriptHash ??
69 - (network != null ? BitcoinAddressUtils.scriptHash(address, network: network) : null);
69 + }) {
70 + try {
71 + this.scriptHash = scriptHash ??
72 + (network != null ? BitcoinAddressUtils.scriptHash(address, network: network!) : null);
73 + } catch (e) {
74 + printV(e);
75 + }
76 +}
77
78 factory BitcoinAddressRecord.fromJSON(String jsonSource, {BasedUtxoNetwork? network}) {
79 final decoded = json.decode(jsonSource) as Map;
cw_bitcoin/lib/bitcoin_wallet_creation_credentials.dart
+15
@@ -70,6 +70,21 @@ class BitcoinWalletFromKeysCredentials extends WalletCredentials {
70 final String xpub;
71 }
72
73 +class LitecoinWalletFromKeysCredentials extends WalletCredentials {
74 + LitecoinWalletFromKeysCredentials({
75 + required String name,
76 + required String password,
77 + required this.xpub,
78 + required this.scanSecret,
79 + required this.spendPubkey,
80 + WalletInfo? walletInfo,
81 + }) : super(name: name, password: password, walletInfo: walletInfo);
82 +
83 + final String xpub;
84 + final String scanSecret;
85 + final String spendPubkey;
86 +}
87 +
88 class BitcoinRestoreWalletFromHardware extends WalletCredentials {
89 BitcoinRestoreWalletFromHardware({
90 required String name,
cw_bitcoin/lib/bitcoin_wallet_service.dart
+2 -2
@@ -165,7 +165,7 @@ class BitcoinWalletService extends WalletService<
165 derivationInfo.derivationPath =
166 credentials.hwAccountData.derivationPath;
167
168 - final xpub = convertZpubToXpub(credentials.hwAccountData.xpub!);
168 + final xpub = convertAnyToXpub(credentials.hwAccountData.xpub!);
169
170 await credentials.walletInfo!.save();
171 final wallet = await BitcoinWallet(
@@ -189,7 +189,7 @@ class BitcoinWalletService extends WalletService<
189 final network = isTestnet == true ? BitcoinNetwork.testnet : BitcoinNetwork.mainnet;
190 credentials.walletInfo?.network = network.value;
191
192 - final xpub = convertZpubToXpub(credentials.xpub);
192 + final xpub = convertAnyToXpub(credentials.xpub);
193
194 final wallet = await BitcoinWallet(
195 password: credentials.password!,
cw_bitcoin/lib/litecoin_wallet.dart
+216 -55
@@ -1,7 +1,17 @@
1 import 'dart:async';
2 import 'dart:convert';
3 import 'dart:math';
4 -
4 +import 'package:collection/collection.dart';
5 +import 'package:crypto/crypto.dart';
6 +import 'package:cw_bitcoin/address_from_output.dart';
7 +import 'package:cw_bitcoin/bitcoin_transaction_credentials.dart';
8 +import 'package:cw_core/cake_hive.dart';
9 +import 'package:cw_core/mweb_utxo.dart';
10 +import 'package:cw_core/unspent_coin_type.dart';
11 +import 'package:cw_core/utils/print_verbose.dart';
12 +import 'package:cw_core/node.dart';
13 +import 'package:cw_mweb/mwebd.pbgrpc.dart';
14 +import 'package:fixnum/fixnum.dart';
15 import 'package:bip39/bip39.dart' as bip39;
16 import 'package:bitcoin_base/bitcoin_base.dart';
17 import 'package:bitcoin_base/src/crypto/keypair/sign_utils.dart';
@@ -51,6 +61,9 @@ import 'package:mobx/mobx.dart';
61 import 'package:pointycastle/ecc/api.dart';
62 import 'package:pointycastle/ecc/curves/secp256k1.dart';
63 import 'package:shared_preferences/shared_preferences.dart';
64 +import 'package:ur/cbor_lite.dart';
65 +import 'package:ur/ur.dart';
66 +import 'package:ur/ur_decoder.dart';
67
68 part 'litecoin_wallet.g.dart';
69
@@ -66,6 +79,8 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store {
79 Uint8List? seedBytes,
80 String? mnemonic,
81 String? xpub,
82 + this.scanSecretOverride,
83 + this.spendPubkeyOverride,
84 String? passphrase,
85 String? addressPageType,
86 List<BitcoinAddressRecord>? initialAddresses,
@@ -95,6 +110,9 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store {
110 mwebHd =
111 Bip32Slip10Secp256k1.fromSeed(seedBytes).derivePath("m/1000'") as Bip32Slip10Secp256k1;
112 mwebEnabled = alwaysScan ?? false;
113 + } else if (scanSecretOverride != null && spendPubkeyOverride != null) {
114 + mwebHd = null;
115 + mwebEnabled = alwaysScan ?? false;
116 } else {
117 mwebHd = null;
118 mwebEnabled = false;
@@ -110,6 +128,8 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store {
128 network: network,
129 mwebHd: mwebHd,
130 mwebEnabled: mwebEnabled,
131 + scanSecretOverride: scanSecretOverride,
132 + spendPubkeyOverride: spendPubkeyOverride,
133 isHardwareWallet: walletInfo.isHardwareWallet,
134 );
135 autorun((_) {
@@ -162,9 +182,15 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store {
182 @override
183 bool get hasRescan => true;
184
165 - List<int> get scanSecret => mwebHd!.childKey(Bip32KeyIndex(0x80000000)).privateKey.privKey.raw;
185
167 - List<int> get spendSecret => mwebHd!.childKey(Bip32KeyIndex(0x80000001)).privateKey.privKey.raw;
186 + final String? scanSecretOverride;
187 + final String? spendPubkeyOverride;
188 + List<int> get scanSecret => scanSecretOverride != null
189 + ? hex.decode(scanSecretOverride!)
190 + : mwebHd!.childKey(Bip32KeyIndex(0x80000000)).privateKey.privKey.raw;
191 +
192 + List<int> get spendSecret =>
193 + mwebHd?.childKey(Bip32KeyIndex(0x80000001)).privateKey.privKey.raw ?? List.filled(32, 0);
194
195 static Future<LitecoinWallet> create(
196 {required String mnemonic,
@@ -212,6 +238,10 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store {
238 );
239 }
240
241 + @override
242 + WalletKeysData get walletKeysData =>
243 + WalletKeysData(mnemonic: seed, xPub: xpub, passphrase: passphrase, scanSecret: scanSecretOverride, spendPubkey: spendPubkeyOverride);
244 +
245 static Future<LitecoinWallet> open({
246 required String name,
247 required WalletInfo walletInfo,
@@ -277,6 +307,8 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store {
307 return LitecoinWallet(
308 mnemonic: keysData.mnemonic,
309 xpub: keysData.xPub,
310 + scanSecretOverride: keysData.scanSecret,
311 + spendPubkeyOverride: keysData.spendPubkey,
312 password: password,
313 walletInfo: walletInfo,
314 derivationInfo: derivationInfo,
@@ -1064,6 +1096,47 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store {
1096 return fee.toInt() + feeIncrease;
1097 }
1098
1099 + Future<Uint8List> buildPsbt(PendingBitcoinTransaction transaction, bool isMweb) async {
1100 + final List<TxInput> inputs = [];
1101 + final List<TxOut> txouts = [];
1102 + for (final utxo in transaction.utxos) {
1103 + if (utxo.utxo.scriptType != SegwitAddresType.mweb) {
1104 + inputs.add(utxo.utxo.toInput());
1105 + txouts.add(TxOut(value: Int64(utxo.utxo.value.toInt()),
1106 + pkScript: utxo.ownerDetails.address.toScriptPubKey().toBytes()));
1107 + }
1108 + }
1109 + var resp = await CwMweb.psbtCreate(PsbtCreateRequest(
1110 + rawTx: inputs.isEmpty ? null : BtcTransaction(
1111 + inputs: inputs,
1112 + outputs: isMweb ? [] : transaction.outputs,
1113 + ).toBytes(),
1114 + witnessUtxo: txouts,
1115 + ));
1116 + for (final utxo in transaction.utxos) {
1117 + if (utxo.utxo.scriptType == SegwitAddresType.mweb) {
1118 + resp = await CwMweb.psbtAddInput(PsbtAddInputRequest(
1119 + psbtB64: resp.psbtB64,
1120 + scanSecret: scanSecret,
1121 + outputId: utxo.utxo.txHash,
1122 + addressIndex: utxo.utxo.vout,
1123 + ));
1124 + }
1125 + }
1126 + if (isMweb) for (final output in transaction.outputs) {
1127 + var address = addressFromOutputScript(output.scriptPubKey, LitecoinNetwork.mainnet);
1128 + if (output.scriptPubKey.getAddressType() == SegwitAddresType.mweb) {
1129 + address = SegwitBech32Encoder.encode("ltcmweb", 0, output.scriptPubKey.toBytes());
1130 + }
1131 + resp = await CwMweb.psbtAddRecipient(PsbtAddRecipientRequest(
1132 + psbtB64: resp.psbtB64,
1133 + recipient: PsbtRecipient(address: address, value: Int64(output.amount.toInt())),
1134 + feeRatePerKb: Int64.parseInt(transaction.feeRate) * 1000,
1135 + ));
1136 + }
1137 + return base64.decode(resp.psbtB64);
1138 + }
1139 +
1140 @override
1141 Future<PendingTransaction> createTransaction(Object credentials) async {
1142 try {
@@ -1074,18 +1147,13 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store {
1147 tx.changeAddressOverride = (await (walletAddresses as LitecoinWalletAddresses)
1148 .getChangeAddress(coinTypeToSpendFrom: UnspentCoinType.nonMweb))
1149 .address;
1150 + if (tx.shouldCommitUR()) {
1151 + tx.unsignedPsbt = await buildPsbt(tx, false);
1152 + }
1153 return tx;
1154 }
1155 await waitForMwebAddresses();
1156
1081 - final resp = await CwMweb.create(CreateRequest(
1082 - rawTx: hex.decode(tx.hex),
1083 - scanSecret: scanSecret,
1084 - spendSecret: spendSecret,
1085 - feeRatePerKb: Int64.parseInt(tx.feeRate) * 1000,
1086 - ));
1087 - final tx2 = BtcTransaction.fromRaw(hex.encode(resp.rawTx));
1088 -
1157 // check if the transaction doesn't contain any mweb inputs or outputs:
1158 final transactionCredentials = credentials as BitcoinTransactionCredentials;
1159
@@ -1117,6 +1185,26 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store {
1185 for (final utxo in tx.utxos) {
1186 if (utxo.utxo.scriptType == SegwitAddresType.mweb) {
1187 hasMwebInput = true;
1188 +
1189 + } else {
1190 + // check if any of the inputs of this transaction are hog-ex:
1191 + // this list is only non-mweb inputs:
1192 + bool isHogEx = true;
1193 +
1194 + final coin = unspentCoins
1195 + .firstWhere((coin) => coin.hash == utxo.utxo.txHash && coin.vout == utxo.utxo.vout);
1196 +
1197 + // TODO: detect actual hog-ex inputs
1198 +
1199 + if (!isHogEx) {
1200 + continue;
1201 + }
1202 +
1203 + int confirmations = coin.confirmations ?? 0;
1204 + if (confirmations < 6) {
1205 + throw Exception(
1206 + "A transaction input has less than 6 confirmations, please try again later.");
1207 + }
1208 }
1209 }
1210
@@ -1132,29 +1220,24 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store {
1220 .address;
1221 if (isRegular) {
1222 tx.isMweb = false;
1223 + if (tx.shouldCommitUR()) {
1224 + tx.unsignedPsbt = await buildPsbt(tx, false);
1225 + }
1226 return tx;
1227 }
1228
1138 - // check if any of the inputs of this transaction are hog-ex:
1139 - // this list is only non-mweb inputs:
1140 - tx2.inputs.forEach((txInput) {
1141 - bool isHogEx = true;
1142 -
1143 - final utxo = unspentCoins
1144 - .firstWhere((utxo) => utxo.hash == txInput.txId && utxo.vout == txInput.txIndex);
1145 -
1146 - // TODO: detect actual hog-ex inputs
1147 -
1148 - if (!isHogEx) {
1149 - return;
1150 - }
1229 + if (tx.shouldCommitUR()) {
1230 + tx.unsignedPsbt = await buildPsbt(tx, true);
1231 + return tx;
1232 + }
1233
1152 - int confirmations = utxo.confirmations ?? 0;
1153 - if (confirmations < 6) {
1154 - throw Exception(
1155 - "A transaction input has less than 6 confirmations, please try again later.");
1156 - }
1157 - });
1234 + final resp = await CwMweb.create(CreateRequest(
1235 + rawTx: hex.decode(tx.hex),
1236 + scanSecret: scanSecret,
1237 + spendSecret: spendSecret,
1238 + feeRatePerKb: Int64.parseInt(tx.feeRate) * 1000,
1239 + ));
1240 + final tx2 = BtcTransaction.fromRaw(hex.encode(resp.rawTx));
1241
1242 tx.hexOverride = tx2
1243 .copyWith(
@@ -1177,31 +1260,109 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store {
1260 .toHex();
1261 tx.outputAddresses = resp.outputId;
1262
1180 - return tx
1181 - ..addListener((transaction) async {
1182 - final addresses = <String>{};
1183 - transaction.inputAddresses?.forEach((id) async {
1184 - final utxo = mwebUtxosBox.get(id);
1185 - // await mwebUtxosBox.delete(id); // gets deleted in checkMwebUtxosSpent
1186 - if (utxo == null) return;
1187 - // mark utxo as spent so we add it to the unconfirmed balance (as negative):
1188 - utxo.spent = true;
1189 - await mwebUtxosBox.put(id, utxo);
1190 - final addressRecord = walletAddresses.allAddresses
1191 - .firstWhere((addressRecord) => addressRecord.address == utxo.address);
1192 - if (!addresses.contains(utxo.address)) {
1193 - addresses.add(utxo.address);
1194 - }
1195 - addressRecord.balance -= utxo.value.toInt();
1196 - });
1197 - transaction.inputAddresses?.addAll(addresses);
1198 - printV("isPegIn: $isPegIn, isPegOut: $isPegOut");
1199 - transaction.additionalInfo["isPegIn"] = isPegIn;
1200 - transaction.additionalInfo["isPegOut"] = isPegOut;
1201 - transactionHistory.addOne(transaction);
1202 - await updateUnspent();
1203 - await updateBalance();
1204 - });
1263 + addTransactionListener(tx, [], isPegIn, isPegOut);
1264 + return tx;
1265 + } catch (e, s) {
1266 + printV(e);
1267 + printV(s);
1268 + if (e.toString().contains("commit failed")) {
1269 + printV(e);
1270 + throw Exception("Transaction commit failed (no peers responded), please try again.");
1271 + }
1272 + rethrow;
1273 + }
1274 + }
1275 +
1276 + void addTransactionListener(PendingBitcoinTransaction tx,
1277 + List<String> inputAddresses, bool isPegIn, bool isPegOut) {
1278 + tx.addListener((transaction) async {
1279 + final addresses = <String>{};
1280 + transaction.inputAddresses?.addAll(inputAddresses);
1281 + transaction.inputAddresses?.forEach((id) async {
1282 + final utxo = mwebUtxosBox.get(id);
1283 + // await mwebUtxosBox.delete(id); // gets deleted in checkMwebUtxosSpent
1284 + if (utxo == null) return;
1285 + // mark utxo as spent so we add it to the unconfirmed balance (as negative):
1286 + utxo.spent = true;
1287 + await mwebUtxosBox.put(id, utxo);
1288 + final addressRecord = walletAddresses.allAddresses
1289 + .firstWhere((addressRecord) => addressRecord.address == utxo.address);
1290 + if (!addresses.contains(utxo.address)) {
1291 + addresses.add(utxo.address);
1292 + }
1293 + addressRecord.balance -= utxo.value.toInt();
1294 + });
1295 + transaction.inputAddresses?.addAll(addresses);
1296 + printV("isPegIn: $isPegIn, isPegOut: $isPegOut");
1297 + transaction.additionalInfo["isPegIn"] = isPegIn;
1298 + transaction.additionalInfo["isPegOut"] = isPegOut;
1299 + transactionHistory.addOne(transaction);
1300 + await updateUnspent();
1301 + await updateBalance();
1302 + });
1303 + }
1304 +
1305 + Future<void> commitPsbtUR(List<String> urCodes) async {
1306 + if (urCodes.isEmpty) throw Exception("No QR code got scanned");
1307 + bool isUr = urCodes.any((str) {
1308 + return str.startsWith("ur:psbt/");
1309 + });
1310 + if (!isUr) return;
1311 +
1312 + final ur = URDecoder();
1313 + for (final inp in urCodes) {
1314 + ur.receivePart(inp);
1315 + }
1316 + final result = ur.result as UR;
1317 + final psbtB64 = base64Encode(CBORDecoder(result.cbor).decodeBytes().$1);
1318 +
1319 + final resp = await CwMweb.psbtGetRecipients(PsbtGetRecipientsRequest(psbtB64: psbtB64));
1320 +
1321 + bool hasMwebInput = false;
1322 + bool hasMwebOutput = false;
1323 + bool hasRegularOutput = false;
1324 +
1325 + for (final recipient in resp.recipient) {
1326 + if (recipient.address.contains("mweb")) {
1327 + hasMwebOutput = true;
1328 + } else {
1329 + hasRegularOutput = true;
1330 + }
1331 + }
1332 +
1333 + for (final address in resp.inputAddress) {
1334 + try {
1335 + LitecoinAddress(address);
1336 + } catch (_) {
1337 + hasMwebInput = true;
1338 + }
1339 + }
1340 +
1341 + bool isPegIn = !hasMwebInput && hasMwebOutput;
1342 + bool isPegOut = hasMwebInput && hasRegularOutput;
1343 + bool isRegular = !hasMwebInput && !hasMwebOutput;
1344 +
1345 + final resp2 = await CwMweb.psbtExtract(PsbtExtractRequest(psbtB64: psbtB64));
1346 +
1347 + final btcTx = BtcTransaction.fromRaw(hex.encode(resp2.rawTx));
1348 +
1349 + final tx = PendingBitcoinTransaction(
1350 + btcTx,
1351 + type,
1352 + electrumClient: electrumClient,
1353 + amount: btcTx.outputs.reduce((a, b) => TxOutput(amount: a.amount + b.amount, scriptPubKey: a.scriptPubKey)).amount.toInt(),
1354 + fee: resp.fee.toInt(),
1355 + feeRate: "",
1356 + network: network,
1357 + hasChange: resp.recipient.length > 1,
1358 + isMweb: !isRegular,
1359 + isViewOnly: false,
1360 + );
1361 + tx.outputAddresses = resp2.outputId;
1362 + addTransactionListener(tx, resp.inputAddress, isPegIn, isPegOut);
1363 +
1364 + try {
1365 + await tx.commit();
1366 } catch (e, s) {
1367 printV(e);
1368 printV(s);
cw_bitcoin/lib/litecoin_wallet_addresses.dart
+19 -4
@@ -28,6 +28,8 @@ abstract class LitecoinWalletAddressesBase extends ElectrumWalletAddresses with
28 required super.isHardwareWallet,
29 required this.mwebHd,
30 required this.mwebEnabled,
31 + required this.scanSecretOverride,
32 + required this.spendPubkeyOverride,
33 super.initialAddresses,
34 super.initialMwebAddresses,
35 super.initialRegularAddressIndex,
@@ -45,9 +47,15 @@ abstract class LitecoinWalletAddressesBase extends ElectrumWalletAddresses with
47 List<String> mwebAddrs = [];
48 bool generating = false;
49
48 - List<int> get scanSecret => mwebHd!.childKey(Bip32KeyIndex(0x80000000)).privateKey.privKey.raw;
49 - List<int> get spendPubkey =>
50 - mwebHd!.childKey(Bip32KeyIndex(0x80000001)).publicKey.pubKey.compressed;
50 + final String? scanSecretOverride;
51 + final String? spendPubkeyOverride;
52 +
53 + List<int> get scanSecret => scanSecretOverride != null
54 + ? hex.decode(scanSecretOverride!)
55 + : mwebHd!.childKey(Bip32KeyIndex(0x80000000)).privateKey.privKey.raw;
56 + List<int> get spendPubkey => spendPubkeyOverride != null
57 + ? hex.decode(spendPubkeyOverride!)
58 + : mwebHd!.childKey(Bip32KeyIndex(0x80000001)).publicKey.pubKey.compressed;
59
60 @override
61 Future<void> init() async {
@@ -65,6 +73,10 @@ abstract class LitecoinWalletAddressesBase extends ElectrumWalletAddresses with
73 if (Platform.isLinux || Platform.isMacOS || Platform.isWindows) {
74 return null;
75 }
76 + if ((scanSecret.length < 1 || scanSecret.reduce((a, b) => a + b) == 0) ||
77 + (spendPubkey.length < 1 || spendPubkey.reduce((a, b) => a + b) == 0)) {
78 + return null;
79 + }
80
81 Uint8List scan = Uint8List.fromList(scanSecret);
82 Uint8List spend = Uint8List.fromList(spendPubkey);
@@ -95,7 +107,7 @@ abstract class LitecoinWalletAddressesBase extends ElectrumWalletAddresses with
107
108 // ensure mweb addresses are up to date:
109 // This is the Case if the Litecoin Wallet is a hardware Wallet
98 - if (mwebHd == null) return;
110 + if (mwebHd == null && scanSecretOverride == null) return;
111
112 if (mwebAddresses.length < mwebAddrs.length) {
113 List<BitcoinAddressRecord> addressRecords = mwebAddrs
@@ -127,6 +139,9 @@ abstract class LitecoinWalletAddressesBase extends ElectrumWalletAddresses with
139 BitcoinAddressType? addressType,
140 }) {
141 if (addressType == SegwitAddresType.mweb) {
142 + if (mwebAddrs.length == 0) {
143 + return "null";
144 + }
145 return hd == sideHd ? mwebAddrs[0] : mwebAddrs[index + 1];
146 }
147 return generateP2WPKHAddress(hd: hd, index: index, network: network);
cw_bitcoin/lib/litecoin_wallet_service.dart
+21 -4
@@ -20,7 +20,7 @@ import 'package:path_provider/path_provider.dart';
20 class LitecoinWalletService extends WalletService<
21 BitcoinNewWalletCredentials,
22 BitcoinRestoreWalletFromSeedCredentials,
23 - BitcoinRestoreWalletFromWIFCredentials,
23 + LitecoinWalletFromKeysCredentials,
24 BitcoinRestoreWalletFromHardware> {
25 LitecoinWalletService(this.unspentCoinsInfoSource, this.isDirect);
26
@@ -186,9 +186,26 @@ class LitecoinWalletService extends WalletService<
186 }
187
188 @override
189 - Future<LitecoinWallet> restoreFromKeys(BitcoinRestoreWalletFromWIFCredentials credentials,
190 - {bool? isTestnet}) async =>
191 - throw UnimplementedError();
189 + Future<LitecoinWallet> restoreFromKeys(LitecoinWalletFromKeysCredentials credentials,
190 + {bool? isTestnet}) async {
191 + final network = isTestnet == true ? LitecoinNetwork.testnet : LitecoinNetwork.mainnet;
192 + credentials.walletInfo?.network = network.value;
193 +
194 + final wallet = await LitecoinWallet(
195 + password: credentials.password!,
196 + xpub: credentials.xpub,
197 + scanSecretOverride: credentials.scanSecret,
198 + spendPubkeyOverride: credentials.spendPubkey,
199 + walletInfo: credentials.walletInfo!,
200 + derivationInfo: await credentials.walletInfo!.getDerivationInfo(),
201 + unspentCoinsInfo: unspentCoinsInfoSource,
202 + encryptionFileUtils: encryptionFileUtilsFor(isDirect),
203 + );
204 +
205 + await wallet.save();
206 + await wallet.init();
207 + return wallet;
208 + }
209
210 @override
211 Future<LitecoinWallet> restoreFromSeed(BitcoinRestoreWalletFromSeedCredentials credentials,
cw_core/lib/utils/zpub.dart
+39
@@ -3,6 +3,15 @@ import 'dart:typed_data';
3
4 import 'package:blockchain_utils/blockchain_utils.dart';
5
6 +String convertAnyToXpub(String any) {
7 + if (any.toLowerCase().startsWith("zpub")) {
8 + return convertZpubToXpub(any);
9 + } else if (any.toLowerCase().startsWith("ltub")) {
10 + return convertLtubToXpub(any);
11 + }
12 + return any;
13 +}
14 +
15 String convertZpubToXpub(String zpub) {
16 try {
17 final decoded = Base58Decoder.checkDecode(zpub);
@@ -37,6 +46,36 @@ String convertZpubToXpub(String zpub) {
46 }
47 }
48
49 +String convertLtubToXpub(String ltub) {
50 + try {
51 + final decoded = Base58Decoder.checkDecode(ltub);
52 +
53 + if (decoded.length < 4) {
54 + throw ArgumentError('Invalid extended public key length');
55 + }
56 +
57 + final versionBytes = decoded.sublist(0, 4);
58 + final ltubVersionBytes = [0x01, 0x9D, 0xA4, 0x62]; // Ltub mainnet version
59 +
60 + bool isLtub = listEquals(versionBytes, ltubVersionBytes);
61 +
62 + if (!isLtub) {
63 + return ltub;
64 + }
65 +
66 + final xpubVersionBytes = [0x04, 0x88, 0xb2, 0x1e];
67 +
68 + final newExtendedKey = Uint8List.fromList([
69 + ...xpubVersionBytes,
70 + ...decoded.sublist(4),
71 + ]);
72 +
73 + return Base58Encoder.checkEncode(newExtendedKey);
74 + } catch (e) {
75 + throw ArgumentError('Failed to convert ltub to xpub: $e');
76 + }
77 +}
78 +
79 bool listEquals<T>(List<T> a, List<T> b) {
80 if (a.length != b.length) return false;
81 for (int i = 0; i < a.length; i++) {
cw_core/lib/wallet_keys_file.dart
+8 -2
@@ -98,15 +98,19 @@ class WalletKeysData {
98 final String? altMnemonic;
99 final String? passphrase;
100 final String? xPub;
101 + final String? scanSecret;
102 + final String? spendPubkey;
103
102 - WalletKeysData({this.privateKey, this.mnemonic, this.altMnemonic, this.passphrase, this.xPub});
104 + WalletKeysData({this.privateKey, this.mnemonic, this.altMnemonic, this.passphrase, this.xPub, this.scanSecret, this.spendPubkey});
105
106 String toJSON() => jsonEncode({
107 "privateKey": privateKey,
108 "mnemonic": mnemonic,
109 if (altMnemonic != null) "altMnemonic": altMnemonic,
110 if (passphrase != null) "passphrase": passphrase,
109 - if (xPub != null) "xPub": xPub
111 + if (xPub != null) "xPub": xPub,
112 + if (scanSecret != null) "scanSecret": scanSecret,
113 + if (spendPubkey != null) "spendPubkey": spendPubkey,
114 });
115
116 static WalletKeysData fromJSON(Map<String, dynamic> json) => WalletKeysData(
@@ -115,5 +119,7 @@ class WalletKeysData {
119 altMnemonic: json["altMnemonic"] as String?,
120 passphrase: json["passphrase"] as String?,
121 xPub: json["xPub"] as String?,
122 + scanSecret: json["scanSecret"] as String?,
123 + spendPubkey: json["spendPubkey"] as String?,
124 );
125 }
cw_mweb/.gitignore
+1
@@ -28,3 +28,4 @@ migrate_working_dir/
28 .dart_tool/
29 .packages
30 build/
31 +jniLibs/
cw_mweb/go/go.mod
+13 -10
@@ -1,6 +1,10 @@
1 module github.com/cake-tech/cake_wallet/cw_mweb/go
2
3 -go 1.24.2
3 +go 1.24.1
4 +
5 +require github.com/ltcmweb/mwebd v0.1.16
6 +
7 +require github.com/ltcmweb/mwebd v0.1.16
8
9 require (
10 github.com/Microsoft/go-winio v0.6.2 // indirect
@@ -23,10 +27,9 @@ require (
27 github.com/kkdai/bstream v1.0.0 // indirect
28 github.com/klauspost/cpuid/v2 v2.2.7 // indirect
29 github.com/ltcmweb/coinswapd v0.1.0 // indirect
26 - github.com/ltcmweb/ltcd v0.25.6 // indirect
30 + github.com/ltcmweb/ltcd v0.25.11 // indirect
31 github.com/ltcmweb/ltcd/btcec/v2 v2.3.3 // indirect
32 github.com/ltcmweb/ltcd/chaincfg/chainhash v1.0.3 // indirect
29 - github.com/ltcmweb/mwebd v0.1.8 // indirect
33 github.com/ltcmweb/neutrino v0.17.4 // indirect
34 github.com/ltcmweb/neutrino/cache v1.1.0 // indirect
35 github.com/ltcmweb/secp256k1 v0.1.1 // indirect
@@ -37,14 +40,14 @@ require (
40 github.com/tklauser/go-sysconf v0.3.12 // indirect
41 github.com/tklauser/numcpus v0.6.1 // indirect
42 go.etcd.io/bbolt v1.3.10 // indirect
40 - golang.org/x/crypto v0.33.0 // indirect
43 + golang.org/x/crypto v0.39.0 // indirect
44 golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa // indirect
42 - golang.org/x/net v0.35.0 // indirect
43 - golang.org/x/sys v0.30.0 // indirect
44 - golang.org/x/text v0.22.0 // indirect
45 - google.golang.org/genproto/googleapis/rpc v0.0.0-20240509183442-62759503f434 // indirect
46 - google.golang.org/grpc v1.63.2 // indirect
47 - google.golang.org/protobuf v1.34.2 // indirect
45 + golang.org/x/net v0.41.0 // indirect
46 + golang.org/x/sys v0.33.0 // indirect
47 + golang.org/x/text v0.26.0 // indirect
48 + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect
49 + google.golang.org/grpc v1.75.0 // indirect
50 + google.golang.org/protobuf v1.36.6 // indirect
51 gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect
52 lukechampine.com/blake3 v1.3.0 // indirect
53 )
cw_mweb/go/go.sum
+92 -18
@@ -6,12 +6,22 @@ github.com/aead/siphash v1.0.1 h1:FwHfE/T45KPKYuuSAKyyvE+oPWcaQ+CUmFW0bPlM+kg=
6 github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII=
7 github.com/alitto/pond/v2 v2.2.0 h1:hX3B1Lu4b5PjSHR+IWNRDKD0Jfw2ew8V25J7Vu5j7RM=
8 github.com/alitto/pond/v2 v2.2.0/go.mod h1:xkjYEgQ05RSpWdfSd1nM3OVv7TBhLdy7rMp3+2Nq+yE=
9 +github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88=
10 +github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8=
11 +github.com/btcsuite/btcd/btcec/v2 v2.3.4 h1:3EJjcN70HCu/mwqlUsGK8GcNVyLVxFDlWurTXGPFfiQ=
12 +github.com/btcsuite/btcd/btcec/v2 v2.3.4/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04=
13 github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f h1:bAs4lUbRJpnnkd9VhRV3jjAVU7DJVjMaK+IsvSeZvFo=
14 github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA=
15 github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd h1:R/opQEbFEy9JGkIguV40SvRY1uliPX8ifOvi6ICsFCw=
16 github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg=
17 github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792 h1:R8vQdOQdZ9Y3SkEwmHoWBmX1DNXhXZqlTpq6s4tyJGc=
18 github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY=
19 +github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ=
20 +github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI=
21 +github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M=
22 +github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY=
23 +github.com/crate-crypto/go-kzg-4844 v1.0.0 h1:TsSgHwrkTKecKJ4kadtHi4b3xHW5dCFUDFnUp1TsawI=
24 +github.com/crate-crypto/go-kzg-4844 v1.0.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc=
25 github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
26 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
27 github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM=
@@ -22,11 +32,25 @@ github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 h1:rpfIENRNNilwHwZeG5+P150SMrnN
32 github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0=
33 github.com/decred/dcrd/lru v1.1.2 h1:KdCzlkxppuoIDGEvCGah1fZRicrDH36IipvlB1ROkFY=
34 github.com/decred/dcrd/lru v1.1.2/go.mod h1:gEdCVgXs1/YoBvFWt7Scgknbhwik3FgVSzlnCcXL2N8=
35 +github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA=
36 +github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0=
37 github.com/ethereum/go-ethereum v1.14.8 h1:NgOWvXS+lauK+zFukEvi85UmmsS/OkV0N23UZ1VTIig=
38 github.com/ethereum/go-ethereum v1.14.8/go.mod h1:TJhyuDq0JDppAkFXgqjwpdlQApywnu/m10kFPxh8vvs=
39 +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
40 +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
41 +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
42 +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
43 github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
44 github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE=
45 github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78=
46 +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
47 +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
48 +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk=
49 +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
50 +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
51 +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
52 +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
53 +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
54 github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
55 github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
56 github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k=
@@ -39,14 +63,14 @@ github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuV
63 github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
64 github.com/ltcmweb/coinswapd v0.1.0 h1:M6eoz4g7fDpsQeNA8wWbBh6PY1xykrihyLU44SgljeI=
65 github.com/ltcmweb/coinswapd v0.1.0/go.mod h1:CY5cVSympaLrMO8fHWXO+e/iuPLs2L0U9daMCRTstEM=
42 -github.com/ltcmweb/ltcd v0.25.6 h1:96aC38ZEyNVztylrBBqYnVZJ6cuF7IUvL2knhbMxs3Y=
43 -github.com/ltcmweb/ltcd v0.25.6/go.mod h1:jQbvPfnT4bBXJKRwU5SdD9ZUopwmSvhngdjeopv2cIU=
66 +github.com/ltcmweb/ltcd v0.25.11 h1:MI0n/9I0P2Ig+myofegrXXEvh00lY3TUqPk1akYHBxA=
67 +github.com/ltcmweb/ltcd v0.25.11/go.mod h1:jQbvPfnT4bBXJKRwU5SdD9ZUopwmSvhngdjeopv2cIU=
68 github.com/ltcmweb/ltcd/btcec/v2 v2.3.3 h1:gJc1ljDPCBtwBKFcC4SW44BFoJqoZzkeagndMYdqKKE=
69 github.com/ltcmweb/ltcd/btcec/v2 v2.3.3/go.mod h1:NRr2WtpiSiSO29TkdZhbGNRA/Q16DV2eNbORf+M2ykI=
70 github.com/ltcmweb/ltcd/chaincfg/chainhash v1.0.3 h1:CAPyzHI3bCFRrrVHZkDUR2i3Awj6l/aqAZIEi0E/nfM=
71 github.com/ltcmweb/ltcd/chaincfg/chainhash v1.0.3/go.mod h1:zB+HhI2IbIwTGpdAhdzpm1GVX4ShcWTgN42+ar9HXrg=
48 -github.com/ltcmweb/mwebd v0.1.8 h1:5TJgrM76H3s6kWUJ6CsU1L+DaafcAZ1edDlkyJ+GWt0=
49 -github.com/ltcmweb/mwebd v0.1.8/go.mod h1:KPf+lXEvEMuG0NaHume0imWMb9Cvr15SNPujZO6EAv4=
72 +github.com/ltcmweb/mwebd v0.1.16 h1:DaOIp/5TDhcDUxjvnWKHXkr6hF4LHe2bbY8I0zo7m9w=
73 +github.com/ltcmweb/mwebd v0.1.16/go.mod h1:GEhTe4RTG4ImmzsyqCzO2NKK11U2Zgb5+leQnwY+u+4=
74 github.com/ltcmweb/neutrino v0.17.4 h1:ZsguBvicTM5CtZDsKg+OBFuPUCKjfEJ3lRSGXPjF2oM=
75 github.com/ltcmweb/neutrino v0.17.4/go.mod h1:KktZ+McIwHuTHe0K8JK9Wv4qgv8orkA21a0ZOU4SwJ4=
76 github.com/ltcmweb/neutrino/cache v1.1.0 h1:C0Qn2p8ogcskRPfrBKPUayjn3m/CUJqI7otopNScvhk=
@@ -58,10 +82,38 @@ github.com/ltcsuite/lnd/queue v1.1.0/go.mod h1:DJrxK2gPC2FjJAVYxPOcnY2CplI3rhL2P
82 github.com/ltcsuite/lnd/ticker v1.0.1/go.mod h1:WZKpekfDVAVv7Gsrr0GAWC/U1XURfGesFg9sQYJbeL4=
83 github.com/ltcsuite/lnd/ticker v1.1.0 h1:3zYM/JlKNqq+DotW8jiEdHVeY5Yl7n7cUb2bTof1yXM=
84 github.com/ltcsuite/lnd/ticker v1.1.0/go.mod h1:K2qQ3EPe8enztYvn/VAbLafCPy13XHMuCRPsySoAbt8=
85 +github.com/ltcsuite/ltcd v0.22.0-beta h1:jYVHOeg2oBDvsduV26LtCZnzwifMDWoVbkdHTjGvHTk=
86 +github.com/ltcsuite/ltcd v0.22.0-beta/go.mod h1:/BXtm50r591uMfXf8XgSpL5er32HCvheJtBSPYK5bFM=
87 +github.com/ltcsuite/ltcd/btcec/v2 v2.1.0 h1:0DMWBjQDb0V1+4kCLOJlNdHs7ewwYturuUfLHq8mosY=
88 +github.com/ltcsuite/ltcd/btcec/v2 v2.1.0/go.mod h1:Vc9ZYXMcl5D6bA0VwMvGRDJYggO3YZ7/BuIri02Lq0E=
89 +github.com/ltcsuite/ltcd/ltcutil v1.1.0 h1:btwbdHO9cEr22zW/vgCLiF6ghh+IDngJdJsyhJ6mntU=
90 +github.com/ltcsuite/ltcd/ltcutil v1.1.0/go.mod h1:VbZlcopVgQteiCC5KRjIuxXH5wi1CtzhsvoYZ3K7FaE=
91 +github.com/ltcsuite/ltcwallet v0.13.1 h1:XMyrDHn0BmgUgkNbR/Lzg36vjRsup3xdiPLSD471UMg=
92 +github.com/ltcsuite/ltcwallet v0.13.1/go.mod h1:e6pIWRM9gsd5JnMsI9SgCJM0wi7awWdr20F1C1KUPiw=
93 +github.com/ltcsuite/ltcwallet/wallet/txauthor v1.1.0 h1:MaSgMq7LCB+6dVm9oLzNCVp0lmY1WKmevmMK/t2c6To=
94 +github.com/ltcsuite/ltcwallet/wallet/txauthor v1.1.0/go.mod h1:I53YELeELfA+dVporL+t44O8ArpuF8AjdJbbWIQaE2Q=
95 +github.com/ltcsuite/ltcwallet/wallet/txrules v1.2.0 h1:P6H9zsMpBBuGOsp9lnil7XfPaPujDqrbcmkqvDdiSiI=
96 +github.com/ltcsuite/ltcwallet/wallet/txrules v1.2.0/go.mod h1:lmA2Ozxvbr2M8Mqb6ugOv5/FQT6x2Qnwg3yT/NiWEks=
97 +github.com/ltcsuite/ltcwallet/wallet/txsizes v1.1.0 h1:W884jMwG3K3Hu8FEMnV7KX1bd4HQd/4yvaevisFo9s8=
98 +github.com/ltcsuite/ltcwallet/wallet/txsizes v1.1.0/go.mod h1:G9+XTWnE0xaXzHRzTuP+SOIXFPXFMfYF+w/wxPHb0K8=
99 github.com/ltcsuite/ltcwallet/walletdb v1.3.5 h1:WymVw0FBQ8KJgH7B88ujRqBOJ9R0en9K9urpJW4atAE=
100 github.com/ltcsuite/ltcwallet/walletdb v1.3.5/go.mod h1:29SBzxA55wNxY3ctFw6t5PgsULwf3NMwg2MiGQgtrJE=
101 +github.com/ltcsuite/neutrino v0.13.2 h1:SDbRn4zt4e6z/4uVkVzVeKYpgXyoAh8ksA3m/uCIBaU=
102 +github.com/ltcsuite/neutrino v0.13.2/go.mod h1:eTkaETZBeu3es/FisfjY8Cp3M2fC4s+2V2VUeS8O1Ic=
103 +github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY=
104 +github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU=
105 +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
106 +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
107 +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
108 +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
109 github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible h1:Bn1aCHHRnjv4Bl16T8rcaFjYSrGrIZvpiGO6P3Q4GpU=
110 github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
111 +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
112 +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
113 +github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4=
114 +github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw=
115 +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY=
116 +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc=
117 github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU=
118 github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI=
119 github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk=
@@ -69,29 +121,51 @@ github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9f
121 go.etcd.io/bbolt v1.3.5-0.20200615073812-232d8fc87f50/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ=
122 go.etcd.io/bbolt v1.3.10 h1:+BqfJTcCzTItrop8mq/lbzL8wSGtj94UO/3U31shqG0=
123 go.etcd.io/bbolt v1.3.10/go.mod h1:bK3UQLPJZly7IlNmV7uVHJDxfe5aK9Ll93e/74Y9oEQ=
72 -golang.org/x/crypto v0.33.0 h1:IOBPskki6Lysi0lo9qQvbxiQ+FvsCC/YWOecCHAixus=
73 -golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M=
124 +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
125 +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
126 +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ=
127 +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I=
128 +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE=
129 +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E=
130 +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI=
131 +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg=
132 +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc=
133 +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps=
134 +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4=
135 +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0=
136 +golang.org/x/crypto v0.39.0 h1:SHs+kF4LP+f+p14esP5jAoDpHU8Gu/v9lFRK6IT5imM=
137 +golang.org/x/crypto v0.39.0/go.mod h1:L+Xg3Wf6HoL4Bn4238Z6ft6KfEpN0tJGo53AAPC632U=
138 golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ=
139 golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE=
76 -golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8=
77 -golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk=
140 +golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=
141 +golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=
142 +golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8=
143 +golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
144 golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
145 golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
146 golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
147 golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
148 golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
149 golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
84 -golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=
85 -golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
86 -golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM=
87 -golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY=
88 -google.golang.org/genproto/googleapis/rpc v0.0.0-20240509183442-62759503f434 h1:umK/Ey0QEzurTNlsV3R+MfxHAb78HCEX/IkuR+zH4WQ=
89 -google.golang.org/genproto/googleapis/rpc v0.0.0-20240509183442-62759503f434/go.mod h1:I7Y+G38R2bu5j1aLzfFmQfTcU/WnFuqDwLZAbvKTKpM=
90 -google.golang.org/grpc v1.63.2 h1:MUeiw1B2maTVZthpU5xvASfTh3LDbxHd6IJ6QQVU+xM=
91 -google.golang.org/grpc v1.63.2/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA=
92 -google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
93 -google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
150 +golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
151 +golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
152 +golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M=
153 +golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA=
154 +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk=
155 +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E=
156 +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY=
157 +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
158 +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4=
159 +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ=
160 +google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=
161 +google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
162 gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=
163 gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=
164 +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
165 +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
166 +gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo=
167 +gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=
168 lukechampine.com/blake3 v1.3.0 h1:sJ3XhFINmHSrYCgl958hscfIa3bw8x4DqMP3u1YvoYE=
169 lukechampine.com/blake3 v1.3.0/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k=
170 +rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU=
171 +rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA=
cw_mweb/go/mweb.go
+5 -3
@@ -10,7 +10,7 @@ import (
10 var server *mwebd.Server
11
12 //export StartServer
13 -func StartServer(chain *C.char, dataDir *C.char, nodeUri *C.char) C.int {
13 +func StartServer(chain *C.char, dataDir *C.char, nodeUri *C.char, errMsg **C.char) C.int {
14 if server != nil {
15 server.Stop()
16 }
@@ -21,15 +21,17 @@ func StartServer(chain *C.char, dataDir *C.char, nodeUri *C.char) C.int {
21 var err error
22 server, err = mwebd.NewServer(goChain, goDataDir, goNodeUri)
23 if err != nil {
24 + *errMsg = C.CString(err.Error())
25 return 0
26 }
27
27 - start, err := server.Start(0)
28 + err = server.StartUnix(goDataDir + "/mwebd.sock")
29 if err != nil {
30 + *errMsg = C.CString(err.Error())
31 return 0
32 }
33
32 - return C.int(start)
34 + return 1
35 }
36
37 //export StopServer
cw_mweb/lib/cw_mweb.dart
+44 -5
@@ -4,8 +4,8 @@ import 'dart:developer';
4 import 'dart:io';
5 import 'dart:typed_data';
6
7 -import 'package:cw_core/utils/print_verbose.dart';
7 import 'package:cw_mweb/mweb_ffi.dart';
8 +import 'package:cw_mweb/print_verbose.dart';
9 import 'package:grpc/grpc.dart';
10 import 'package:path_provider/path_provider.dart';
11 import 'mwebd.pbgrpc.dart';
@@ -64,10 +64,8 @@ class CwMweb {
64 }
65 printV("Attempting to connect to server on port: $_port");
66
67 - // wait for the server to finish starting up before we try to connect to it:
68 - await Future.delayed(const Duration(seconds: 8));
69 -
70 - _clientChannel = ClientChannel('127.0.0.1', port: _port!, channelShutdownHandler: () {
67 + final address = InternetAddress("${appDir.path}/mwebd.sock", type: InternetAddressType.unix);
68 + _clientChannel = ClientChannel(address, channelShutdownHandler: () {
69 _rpcClient = null;
70 printV("Channel is shutting down!");
71 },
@@ -219,4 +217,45 @@ class CwMweb {
217 rethrow;
218 }
219 }
220 +
221 + static Future<PsbtResponse> psbtCreate(PsbtCreateRequest request) async {
222 + log("mweb.psbtCreate() called");
223 + _rpcClient = await stub();
224 + return await _rpcClient!.psbtCreate(request, options: CallOptions(timeout: TIMEOUT_DURATION));
225 + }
226 +
227 + static Future<PsbtResponse> psbtAddInput(PsbtAddInputRequest request) async {
228 + log("mweb.psbtAddInput() called");
229 + _rpcClient = await stub();
230 + return await _rpcClient!.psbtAddInput(request, options: CallOptions(timeout: TIMEOUT_DURATION));
231 + }
232 +
233 + static Future<PsbtResponse> psbtAddRecipient(PsbtAddRecipientRequest request) async {
234 + log("mweb.psbtAddRecipient() called");
235 + _rpcClient = await stub();
236 + return await _rpcClient!.psbtAddRecipient(request, options: CallOptions(timeout: TIMEOUT_DURATION));
237 + }
238 +
239 + static Future<PsbtGetRecipientsResponse> psbtGetRecipients(PsbtGetRecipientsRequest request) async {
240 + log("mweb.psbtGetRecipients() called");
241 + _rpcClient = await stub();
242 + return await _rpcClient!.psbtGetRecipients(request, options: CallOptions(timeout: TIMEOUT_DURATION));
243 + }
244 +
245 + static Future<CreateResponse> psbtExtract(PsbtExtractRequest request) async {
246 + log("mweb.psbtExtract() called");
247 + _rpcClient = await stub();
248 + return await _rpcClient!.psbtExtract(request, options: CallOptions(timeout: TIMEOUT_DURATION));
249 + }
250 + static Future<PsbtResponse> psbtSign(PsbtSignRequest request) async {
251 + printV("mweb.psbtSign() called");
252 + _rpcClient = await stub();
253 + return await _rpcClient!.psbtSign(request, options: CallOptions(timeout: TIMEOUT_DURATION));
254 + }
255 +
256 + static Future<PsbtResponse> psbtSignNonMweb(PsbtSignNonMwebRequest request) async {
257 + printV("mweb.psbtSignNonMweb() called");
258 + _rpcClient = await stub();
259 + return await _rpcClient!.psbtSignNonMweb(request, options: CallOptions(timeout: TIMEOUT_DURATION));
260 + }
261 }
cw_mweb/lib/mweb_ffi.dart
+9 -1
@@ -3,6 +3,7 @@ import 'dart:io';
3 import 'dart:typed_data';
4
5 import 'package:cw_mweb/generated_bindings.g.dart';
6 +import 'package:cw_mweb/print_verbose.dart';
7 import 'package:ffi/ffi.dart';
8
9 String libPath = (() {
@@ -24,12 +25,19 @@ class MWebFfi {
25 final chain = "".toNativeUtf8().cast<Char>();
26 final dataDir_ = dataDir.toNativeUtf8().cast<Char>();
27 final nodeUri_ = nodeUri.toNativeUtf8().cast<Char>();
28 + final errMsgPtr = calloc<Pointer<Char>>();
29
28 - final port = lib.StartServer(chain, dataDir_, nodeUri_);
30 + final port = lib.StartServer(chain, dataDir_, nodeUri_, errMsgPtr);
31 + if (port == 0) {
32 + final errMsg = errMsgPtr.value.cast<Utf8>().toDartString();
33 + printV('Error starting server: $errMsg');
34 + calloc.free(errMsgPtr.value);
35 + }
36
37 calloc.free(chain);
38 calloc.free(dataDir_);
39 calloc.free(nodeUri_);
40 + calloc.free(errMsgPtr);
41
42 return port;
43 }
cw_mweb/lib/mwebd.pb.dart
+1053 -35
@@ -101,6 +101,7 @@ class StatusResponse extends $pb.GeneratedMessage {
101 static StatusResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<StatusResponse>(create);
102 static StatusResponse? _defaultInstance;
103
104 + /// The height of the latest block.
105 @$pb.TagNumber(1)
106 $core.int get blockHeaderHeight => $_getIZ(0);
107 @$pb.TagNumber(1)
@@ -110,6 +111,7 @@ class StatusResponse extends $pb.GeneratedMessage {
111 @$pb.TagNumber(1)
112 void clearBlockHeaderHeight() => clearField(1);
113
114 + /// The height of the latest MWEB header.
115 @$pb.TagNumber(2)
116 $core.int get mwebHeaderHeight => $_getIZ(1);
117 @$pb.TagNumber(2)
@@ -119,6 +121,7 @@ class StatusResponse extends $pb.GeneratedMessage {
121 @$pb.TagNumber(2)
122 void clearMwebHeaderHeight() => clearField(2);
123
124 + /// The height at which the MWEB utxo set is synced to.
125 @$pb.TagNumber(3)
126 $core.int get mwebUtxosHeight => $_getIZ(2);
127 @$pb.TagNumber(3)
@@ -128,6 +131,7 @@ class StatusResponse extends $pb.GeneratedMessage {
131 @$pb.TagNumber(3)
132 void clearMwebUtxosHeight() => clearField(3);
133
134 + /// The timestamp of the latest block.
135 @$pb.TagNumber(4)
136 $core.int get blockTime => $_getIZ(3);
137 @$pb.TagNumber(4)
@@ -183,6 +187,10 @@ class UtxosRequest extends $pb.GeneratedMessage {
187 static UtxosRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<UtxosRequest>(create);
188 static UtxosRequest? _defaultInstance;
189
190 + /// The block height from which to start fetching utxos from.
191 + /// After all mined utxos have been streamed, unconfirmed and
192 + /// newly confirmed utxos will also be streamed. If this is set
193 + /// to 0 then all utxos belonging to the account will be fetched.
194 @$pb.TagNumber(1)
195 $core.int get fromHeight => $_getIZ(0);
196 @$pb.TagNumber(1)
@@ -192,6 +200,8 @@ class UtxosRequest extends $pb.GeneratedMessage {
200 @$pb.TagNumber(1)
201 void clearFromHeight() => clearField(1);
202
203 + /// The scan secret or view key represents the account for
204 + /// which utxos should be streamed.
205 @$pb.TagNumber(2)
206 $core.List<$core.int> get scanSecret => $_getN(1);
207 @$pb.TagNumber(2)
@@ -262,6 +272,7 @@ class Utxo extends $pb.GeneratedMessage {
272 static Utxo getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Utxo>(create);
273 static Utxo? _defaultInstance;
274
275 + /// The block height of the utxo, or 0 for unconfirmed.
276 @$pb.TagNumber(1)
277 $core.int get height => $_getIZ(0);
278 @$pb.TagNumber(1)
@@ -271,6 +282,7 @@ class Utxo extends $pb.GeneratedMessage {
282 @$pb.TagNumber(1)
283 void clearHeight() => clearField(1);
284
285 + /// The value of the utxo in litoshis.
286 @$pb.TagNumber(2)
287 $fixnum.Int64 get value => $_getI64(1);
288 @$pb.TagNumber(2)
@@ -280,6 +292,7 @@ class Utxo extends $pb.GeneratedMessage {
292 @$pb.TagNumber(2)
293 void clearValue() => clearField(2);
294
295 + /// The MWEB address that the utxo was received on.
296 @$pb.TagNumber(3)
297 $core.String get address => $_getSZ(2);
298 @$pb.TagNumber(3)
@@ -289,6 +302,8 @@ class Utxo extends $pb.GeneratedMessage {
302 @$pb.TagNumber(3)
303 void clearAddress() => clearField(3);
304
305 + /// The output ID. This functions like a transaction hash,
306 + /// but is unique to every utxo.
307 @$pb.TagNumber(4)
308 $core.String get outputId => $_getSZ(3);
309 @$pb.TagNumber(4)
@@ -298,6 +313,7 @@ class Utxo extends $pb.GeneratedMessage {
313 @$pb.TagNumber(4)
314 void clearOutputId() => clearField(4);
315
316 + /// The timestamp of the block the utxo was mined in.
317 @$pb.TagNumber(5)
318 $core.int get blockTime => $_getIZ(4);
319 @$pb.TagNumber(5)
@@ -363,6 +379,7 @@ class AddressRequest extends $pb.GeneratedMessage {
379 static AddressRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<AddressRequest>(create);
380 static AddressRequest? _defaultInstance;
381
382 + /// The starting index of the range.
383 @$pb.TagNumber(1)
384 $core.int get fromIndex => $_getIZ(0);
385 @$pb.TagNumber(1)
@@ -372,6 +389,8 @@ class AddressRequest extends $pb.GeneratedMessage {
389 @$pb.TagNumber(1)
390 void clearFromIndex() => clearField(1);
391
392 + /// The ending index of the range. The result will contain all
393 + /// addresses up to but not including this index.
394 @$pb.TagNumber(2)
395 $core.int get toIndex => $_getIZ(1);
396 @$pb.TagNumber(2)
@@ -381,6 +400,8 @@ class AddressRequest extends $pb.GeneratedMessage {
400 @$pb.TagNumber(2)
401 void clearToIndex() => clearField(2);
402
403 + /// The scan secret or view key represents the account for
404 + /// which addresses should be returned.
405 @$pb.TagNumber(3)
406 $core.List<$core.int> get scanSecret => $_getN(2);
407 @$pb.TagNumber(3)
@@ -390,6 +411,9 @@ class AddressRequest extends $pb.GeneratedMessage {
411 @$pb.TagNumber(3)
412 void clearScanSecret() => clearField(3);
413
414 + /// The public key of the spend secret for the account. The spend
415 + /// key is required for spending utxos but is also required
416 + /// for generating addresses.
417 @$pb.TagNumber(4)
418 $core.List<$core.int> get spendPubkey => $_getN(3);
419 @$pb.TagNumber(4)
@@ -440,10 +464,61 @@ class AddressResponse extends $pb.GeneratedMessage {
464 static AddressResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<AddressResponse>(create);
465 static AddressResponse? _defaultInstance;
466
467 + /// An array of MWEB addresses within the requested range.
468 @$pb.TagNumber(1)
469 $core.List<$core.String> get address => $_getList(0);
470 }
471
472 +class LedgerApdu extends $pb.GeneratedMessage {
473 + factory LedgerApdu({
474 + $core.List<$core.int>? data,
475 + }) {
476 + final $result = create();
477 + if (data != null) {
478 + $result.data = data;
479 + }
480 + return $result;
481 + }
482 + LedgerApdu._() : super();
483 + factory LedgerApdu.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
484 + factory LedgerApdu.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
485 +
486 + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'LedgerApdu', createEmptyInstance: create)
487 + ..a<$core.List<$core.int>>(1, _omitFieldNames ? '' : 'data', $pb.PbFieldType.OY)
488 + ..hasRequiredFields = false
489 + ;
490 +
491 + @$core.Deprecated(
492 + 'Using this can add significant overhead to your binary. '
493 + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
494 + 'Will be removed in next major version')
495 + LedgerApdu clone() => LedgerApdu()..mergeFromMessage(this);
496 + @$core.Deprecated(
497 + 'Using this can add significant overhead to your binary. '
498 + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
499 + 'Will be removed in next major version')
500 + LedgerApdu copyWith(void Function(LedgerApdu) updates) => super.copyWith((message) => updates(message as LedgerApdu)) as LedgerApdu;
501 +
502 + $pb.BuilderInfo get info_ => _i;
503 +
504 + @$core.pragma('dart2js:noInline')
505 + static LedgerApdu create() => LedgerApdu._();
506 + LedgerApdu createEmptyInstance() => create();
507 + static $pb.PbList<LedgerApdu> createRepeated() => $pb.PbList<LedgerApdu>();
508 + @$core.pragma('dart2js:noInline')
509 + static LedgerApdu getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<LedgerApdu>(create);
510 + static LedgerApdu? _defaultInstance;
511 +
512 + @$pb.TagNumber(1)
513 + $core.List<$core.int> get data => $_getN(0);
514 + @$pb.TagNumber(1)
515 + set data($core.List<$core.int> v) { $_setBytes(0, v); }
516 + @$pb.TagNumber(1)
517 + $core.bool hasData() => $_has(0);
518 + @$pb.TagNumber(1)
519 + void clearData() => clearField(1);
520 +}
521 +
522 class SpentRequest extends $pb.GeneratedMessage {
523 factory SpentRequest({
524 $core.Iterable<$core.String>? outputId,
@@ -484,6 +559,7 @@ class SpentRequest extends $pb.GeneratedMessage {
559 static SpentRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<SpentRequest>(create);
560 static SpentRequest? _defaultInstance;
561
562 + /// An array of output IDs to perform checks for.
563 @$pb.TagNumber(1)
564 $core.List<$core.String> get outputId => $_getList(0);
565 }
@@ -528,6 +604,9 @@ class SpentResponse extends $pb.GeneratedMessage {
604 static SpentResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<SpentResponse>(create);
605 static SpentResponse? _defaultInstance;
606
607 + /// An array of the output IDs that were not found in the
608 + /// unspent set. This means that the outputs are either
609 + /// unconfirmed or were spent.
610 @$pb.TagNumber(1)
611 $core.List<$core.String> get outputId => $_getList(0);
612 }
@@ -592,6 +671,16 @@ class CreateRequest extends $pb.GeneratedMessage {
671 static CreateRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<CreateRequest>(create);
672 static CreateRequest? _defaultInstance;
673
674 + /// The raw bytes of the serialized transaction. This will be
675 + /// a template where the non-MWEB inputs will remain unchanged,
676 + /// and the MWEB inputs are specified by TxIns with the outpoint
677 + /// hash set to the output ID of the utxo being spent, and the
678 + /// outpoint index set to the index of the address that the utxo
679 + /// was received on. MWEB outputs are specified by TxOuts with
680 + /// the script pubkey set to the serialized scan and spend pubkeys
681 + /// of the destination MWEB address. Any non-MWEB outputs will be
682 + /// transformed into MWEB peg-outs. If the transaction doesn't
683 + /// contain any MWEB i/o then the result will be unchanged.
684 @$pb.TagNumber(1)
685 $core.List<$core.int> get rawTx => $_getN(0);
686 @$pb.TagNumber(1)
@@ -601,6 +690,8 @@ class CreateRequest extends $pb.GeneratedMessage {
690 @$pb.TagNumber(1)
691 void clearRawTx() => clearField(1);
692
693 + /// The scan secret or view key represents the account that
694 + /// the utxos being spent belong to.
695 @$pb.TagNumber(2)
696 $core.List<$core.int> get scanSecret => $_getN(1);
697 @$pb.TagNumber(2)
@@ -610,6 +701,8 @@ class CreateRequest extends $pb.GeneratedMessage {
701 @$pb.TagNumber(2)
702 void clearScanSecret() => clearField(2);
703
704 + /// The spend secret is the private key necessary for spending
705 + /// the utxos belonging to the account.
706 @$pb.TagNumber(3)
707 $core.List<$core.int> get spendSecret => $_getN(2);
708 @$pb.TagNumber(3)
@@ -619,6 +712,7 @@ class CreateRequest extends $pb.GeneratedMessage {
712 @$pb.TagNumber(3)
713 void clearSpendSecret() => clearField(3);
714
715 + /// The fee rate per KB in litoshis.
716 @$pb.TagNumber(4)
717 $fixnum.Int64 get feeRatePerKb => $_getI64(3);
718 @$pb.TagNumber(4)
@@ -628,6 +722,8 @@ class CreateRequest extends $pb.GeneratedMessage {
722 @$pb.TagNumber(4)
723 void clearFeeRatePerKb() => clearField(4);
724
725 + /// Whether to skip MWEB transaction creation. This is useful
726 + /// for fee estimation.
727 @$pb.TagNumber(5)
728 $core.bool get dryRun => $_getBF(4);
729 @$pb.TagNumber(5)
@@ -683,6 +779,10 @@ class CreateResponse extends $pb.GeneratedMessage {
779 static CreateResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<CreateResponse>(create);
780 static CreateResponse? _defaultInstance;
781
782 + /// The raw bytes of the serialized transaction. It will contain
783 + /// a single TxOut representing the peg-in required. From this
784 + /// it is possible to determine the addtional fee that was added
785 + /// by the MWEB transaction.
786 @$pb.TagNumber(1)
787 $core.List<$core.int> get rawTx => $_getN(0);
788 @$pb.TagNumber(1)
@@ -692,26 +792,33 @@ class CreateResponse extends $pb.GeneratedMessage {
792 @$pb.TagNumber(1)
793 void clearRawTx() => clearField(1);
794
795 + /// The output IDs of any utxos created by the transaction,
796 + /// in the same order as in the template.
797 @$pb.TagNumber(2)
798 $core.List<$core.String> get outputId => $_getList(1);
799 }
800
699 -class BroadcastRequest extends $pb.GeneratedMessage {
700 - factory BroadcastRequest({
801 +class PsbtCreateRequest extends $pb.GeneratedMessage {
802 + factory PsbtCreateRequest({
803 $core.List<$core.int>? rawTx,
804 + $core.Iterable<TxOut>? witnessUtxo,
805 }) {
806 final $result = create();
807 if (rawTx != null) {
808 $result.rawTx = rawTx;
809 }
810 + if (witnessUtxo != null) {
811 + $result.witnessUtxo.addAll(witnessUtxo);
812 + }
813 return $result;
814 }
709 - BroadcastRequest._() : super();
710 - factory BroadcastRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
711 - factory BroadcastRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
815 + PsbtCreateRequest._() : super();
816 + factory PsbtCreateRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
817 + factory PsbtCreateRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
818
713 - static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'BroadcastRequest', createEmptyInstance: create)
819 + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'PsbtCreateRequest', createEmptyInstance: create)
820 ..a<$core.List<$core.int>>(1, _omitFieldNames ? '' : 'rawTx', $pb.PbFieldType.OY)
821 + ..pc<TxOut>(2, _omitFieldNames ? '' : 'witnessUtxo', $pb.PbFieldType.PM, subBuilder: TxOut.create)
822 ..hasRequiredFields = false
823 ;
824
@@ -719,23 +826,24 @@ class BroadcastRequest extends $pb.GeneratedMessage {
826 'Using this can add significant overhead to your binary. '
827 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
828 'Will be removed in next major version')
722 - BroadcastRequest clone() => BroadcastRequest()..mergeFromMessage(this);
829 + PsbtCreateRequest clone() => PsbtCreateRequest()..mergeFromMessage(this);
830 @$core.Deprecated(
831 'Using this can add significant overhead to your binary. '
832 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
833 'Will be removed in next major version')
727 - BroadcastRequest copyWith(void Function(BroadcastRequest) updates) => super.copyWith((message) => updates(message as BroadcastRequest)) as BroadcastRequest;
834 + PsbtCreateRequest copyWith(void Function(PsbtCreateRequest) updates) => super.copyWith((message) => updates(message as PsbtCreateRequest)) as PsbtCreateRequest;
835
836 $pb.BuilderInfo get info_ => _i;
837
838 @$core.pragma('dart2js:noInline')
732 - static BroadcastRequest create() => BroadcastRequest._();
733 - BroadcastRequest createEmptyInstance() => create();
734 - static $pb.PbList<BroadcastRequest> createRepeated() => $pb.PbList<BroadcastRequest>();
839 + static PsbtCreateRequest create() => PsbtCreateRequest._();
840 + PsbtCreateRequest createEmptyInstance() => create();
841 + static $pb.PbList<PsbtCreateRequest> createRepeated() => $pb.PbList<PsbtCreateRequest>();
842 @$core.pragma('dart2js:noInline')
736 - static BroadcastRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<BroadcastRequest>(create);
737 - static BroadcastRequest? _defaultInstance;
843 + static PsbtCreateRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<PsbtCreateRequest>(create);
844 + static PsbtCreateRequest? _defaultInstance;
845
846 + /// The raw bytes of the serialized transaction.
847 @$pb.TagNumber(1)
848 $core.List<$core.int> get rawTx => $_getN(0);
849 @$pb.TagNumber(1)
@@ -744,24 +852,33 @@ class BroadcastRequest extends $pb.GeneratedMessage {
852 $core.bool hasRawTx() => $_has(0);
853 @$pb.TagNumber(1)
854 void clearRawTx() => clearField(1);
855 +
856 + /// Witness utxos for each input.
857 + @$pb.TagNumber(2)
858 + $core.List<TxOut> get witnessUtxo => $_getList(1);
859 }
860
749 -class BroadcastResponse extends $pb.GeneratedMessage {
750 - factory BroadcastResponse({
751 - $core.String? txid,
861 +class TxOut extends $pb.GeneratedMessage {
862 + factory TxOut({
863 + $fixnum.Int64? value,
864 + $core.List<$core.int>? pkScript,
865 }) {
866 final $result = create();
754 - if (txid != null) {
755 - $result.txid = txid;
867 + if (value != null) {
868 + $result.value = value;
869 + }
870 + if (pkScript != null) {
871 + $result.pkScript = pkScript;
872 }
873 return $result;
874 }
759 - BroadcastResponse._() : super();
760 - factory BroadcastResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
761 - factory BroadcastResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
875 + TxOut._() : super();
876 + factory TxOut.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
877 + factory TxOut.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
878
763 - static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'BroadcastResponse', createEmptyInstance: create)
764 - ..aOS(1, _omitFieldNames ? '' : 'txid')
879 + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'TxOut', createEmptyInstance: create)
880 + ..aInt64(1, _omitFieldNames ? '' : 'value')
881 + ..a<$core.List<$core.int>>(2, _omitFieldNames ? '' : 'pkScript', $pb.PbFieldType.OY)
882 ..hasRequiredFields = false
883 ;
884
@@ -769,33 +886,934 @@ class BroadcastResponse extends $pb.GeneratedMessage {
886 'Using this can add significant overhead to your binary. '
887 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
888 'Will be removed in next major version')
772 - BroadcastResponse clone() => BroadcastResponse()..mergeFromMessage(this);
889 + TxOut clone() => TxOut()..mergeFromMessage(this);
890 @$core.Deprecated(
891 'Using this can add significant overhead to your binary. '
892 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
893 'Will be removed in next major version')
777 - BroadcastResponse copyWith(void Function(BroadcastResponse) updates) => super.copyWith((message) => updates(message as BroadcastResponse)) as BroadcastResponse;
894 + TxOut copyWith(void Function(TxOut) updates) => super.copyWith((message) => updates(message as TxOut)) as TxOut;
895
896 $pb.BuilderInfo get info_ => _i;
897
898 @$core.pragma('dart2js:noInline')
782 - static BroadcastResponse create() => BroadcastResponse._();
783 - BroadcastResponse createEmptyInstance() => create();
784 - static $pb.PbList<BroadcastResponse> createRepeated() => $pb.PbList<BroadcastResponse>();
899 + static TxOut create() => TxOut._();
900 + TxOut createEmptyInstance() => create();
901 + static $pb.PbList<TxOut> createRepeated() => $pb.PbList<TxOut>();
902 @$core.pragma('dart2js:noInline')
786 - static BroadcastResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<BroadcastResponse>(create);
787 - static BroadcastResponse? _defaultInstance;
903 + static TxOut getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<TxOut>(create);
904 + static TxOut? _defaultInstance;
905
906 @$pb.TagNumber(1)
790 - $core.String get txid => $_getSZ(0);
907 + $fixnum.Int64 get value => $_getI64(0);
908 @$pb.TagNumber(1)
792 - set txid($core.String v) { $_setString(0, v); }
909 + set value($fixnum.Int64 v) { $_setInt64(0, v); }
910 @$pb.TagNumber(1)
794 - $core.bool hasTxid() => $_has(0);
911 + $core.bool hasValue() => $_has(0);
912 @$pb.TagNumber(1)
796 - void clearTxid() => clearField(1);
913 + void clearValue() => clearField(1);
914 +
915 + @$pb.TagNumber(2)
916 + $core.List<$core.int> get pkScript => $_getN(1);
917 + @$pb.TagNumber(2)
918 + set pkScript($core.List<$core.int> v) { $_setBytes(1, v); }
919 + @$pb.TagNumber(2)
920 + $core.bool hasPkScript() => $_has(1);
921 + @$pb.TagNumber(2)
922 + void clearPkScript() => clearField(2);
923 +}
924 +
925 +class PsbtResponse extends $pb.GeneratedMessage {
926 + factory PsbtResponse({
927 + $core.String? psbtB64,
928 + }) {
929 + final $result = create();
930 + if (psbtB64 != null) {
931 + $result.psbtB64 = psbtB64;
932 + }
933 + return $result;
934 + }
935 + PsbtResponse._() : super();
936 + factory PsbtResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
937 + factory PsbtResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
938 +
939 + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'PsbtResponse', createEmptyInstance: create)
940 + ..aOS(1, _omitFieldNames ? '' : 'psbtB64')
941 + ..hasRequiredFields = false
942 + ;
943 +
944 + @$core.Deprecated(
945 + 'Using this can add significant overhead to your binary. '
946 + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
947 + 'Will be removed in next major version')
948 + PsbtResponse clone() => PsbtResponse()..mergeFromMessage(this);
949 + @$core.Deprecated(
950 + 'Using this can add significant overhead to your binary. '
951 + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
952 + 'Will be removed in next major version')
953 + PsbtResponse copyWith(void Function(PsbtResponse) updates) => super.copyWith((message) => updates(message as PsbtResponse)) as PsbtResponse;
954 +
955 + $pb.BuilderInfo get info_ => _i;
956 +
957 + @$core.pragma('dart2js:noInline')
958 + static PsbtResponse create() => PsbtResponse._();
959 + PsbtResponse createEmptyInstance() => create();
960 + static $pb.PbList<PsbtResponse> createRepeated() => $pb.PbList<PsbtResponse>();
961 + @$core.pragma('dart2js:noInline')
962 + static PsbtResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<PsbtResponse>(create);
963 + static PsbtResponse? _defaultInstance;
964 +
965 + /// The PSBT in base64 encoding.
966 + @$pb.TagNumber(1)
967 + $core.String get psbtB64 => $_getSZ(0);
968 + @$pb.TagNumber(1)
969 + set psbtB64($core.String v) { $_setString(0, v); }
970 + @$pb.TagNumber(1)
971 + $core.bool hasPsbtB64() => $_has(0);
972 + @$pb.TagNumber(1)
973 + void clearPsbtB64() => clearField(1);
974 +}
975 +
976 +class PsbtAddInputRequest extends $pb.GeneratedMessage {
977 + factory PsbtAddInputRequest({
978 + $core.String? psbtB64,
979 + $core.List<$core.int>? scanSecret,
980 + $core.String? outputId,
981 + $core.int? addressIndex,
982 + }) {
983 + final $result = create();
984 + if (psbtB64 != null) {
985 + $result.psbtB64 = psbtB64;
986 + }
987 + if (scanSecret != null) {
988 + $result.scanSecret = scanSecret;
989 + }
990 + if (outputId != null) {
991 + $result.outputId = outputId;
992 + }
993 + if (addressIndex != null) {
994 + $result.addressIndex = addressIndex;
995 + }
996 + return $result;
997 + }
998 + PsbtAddInputRequest._() : super();
999 + factory PsbtAddInputRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
1000 + factory PsbtAddInputRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
1001 +
1002 + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'PsbtAddInputRequest', createEmptyInstance: create)
1003 + ..aOS(1, _omitFieldNames ? '' : 'psbtB64')
1004 + ..a<$core.List<$core.int>>(2, _omitFieldNames ? '' : 'scanSecret', $pb.PbFieldType.OY)
1005 + ..aOS(3, _omitFieldNames ? '' : 'outputId')
1006 + ..a<$core.int>(4, _omitFieldNames ? '' : 'addressIndex', $pb.PbFieldType.OU3)
1007 + ..hasRequiredFields = false
1008 + ;
1009 +
1010 + @$core.Deprecated(
1011 + 'Using this can add significant overhead to your binary. '
1012 + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
1013 + 'Will be removed in next major version')
1014 + PsbtAddInputRequest clone() => PsbtAddInputRequest()..mergeFromMessage(this);
1015 + @$core.Deprecated(
1016 + 'Using this can add significant overhead to your binary. '
1017 + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
1018 + 'Will be removed in next major version')
1019 + PsbtAddInputRequest copyWith(void Function(PsbtAddInputRequest) updates) => super.copyWith((message) => updates(message as PsbtAddInputRequest)) as PsbtAddInputRequest;
1020 +
1021 + $pb.BuilderInfo get info_ => _i;
1022 +
1023 + @$core.pragma('dart2js:noInline')
1024 + static PsbtAddInputRequest create() => PsbtAddInputRequest._();
1025 + PsbtAddInputRequest createEmptyInstance() => create();
1026 + static $pb.PbList<PsbtAddInputRequest> createRepeated() => $pb.PbList<PsbtAddInputRequest>();
1027 + @$core.pragma('dart2js:noInline')
1028 + static PsbtAddInputRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<PsbtAddInputRequest>(create);
1029 + static PsbtAddInputRequest? _defaultInstance;
1030 +
1031 + /// The PSBT in base64 encoding.
1032 + @$pb.TagNumber(1)
1033 + $core.String get psbtB64 => $_getSZ(0);
1034 + @$pb.TagNumber(1)
1035 + set psbtB64($core.String v) { $_setString(0, v); }
1036 + @$pb.TagNumber(1)
1037 + $core.bool hasPsbtB64() => $_has(0);
1038 + @$pb.TagNumber(1)
1039 + void clearPsbtB64() => clearField(1);
1040 +
1041 + /// The scan secret or view key represents the account that
1042 + /// the utxos being spent belong to.
1043 + @$pb.TagNumber(2)
1044 + $core.List<$core.int> get scanSecret => $_getN(1);
1045 + @$pb.TagNumber(2)
1046 + set scanSecret($core.List<$core.int> v) { $_setBytes(1, v); }
1047 + @$pb.TagNumber(2)
1048 + $core.bool hasScanSecret() => $_has(1);
1049 + @$pb.TagNumber(2)
1050 + void clearScanSecret() => clearField(2);
1051 +
1052 + /// The output ID of the utxo.
1053 + @$pb.TagNumber(3)
1054 + $core.String get outputId => $_getSZ(2);
1055 + @$pb.TagNumber(3)
1056 + set outputId($core.String v) { $_setString(2, v); }
1057 + @$pb.TagNumber(3)
1058 + $core.bool hasOutputId() => $_has(2);
1059 + @$pb.TagNumber(3)
1060 + void clearOutputId() => clearField(3);
1061 +
1062 + /// The address index of the utxo.
1063 + @$pb.TagNumber(4)
1064 + $core.int get addressIndex => $_getIZ(3);
1065 + @$pb.TagNumber(4)
1066 + set addressIndex($core.int v) { $_setUnsignedInt32(3, v); }
1067 + @$pb.TagNumber(4)
1068 + $core.bool hasAddressIndex() => $_has(3);
1069 + @$pb.TagNumber(4)
1070 + void clearAddressIndex() => clearField(4);
1071 +}
1072 +
1073 +class PsbtAddRecipientRequest extends $pb.GeneratedMessage {
1074 + factory PsbtAddRecipientRequest({
1075 + $core.String? psbtB64,
1076 + PsbtRecipient? recipient,
1077 + $fixnum.Int64? feeRatePerKb,
1078 + }) {
1079 + final $result = create();
1080 + if (psbtB64 != null) {
1081 + $result.psbtB64 = psbtB64;
1082 + }
1083 + if (recipient != null) {
1084 + $result.recipient = recipient;
1085 + }
1086 + if (feeRatePerKb != null) {
1087 + $result.feeRatePerKb = feeRatePerKb;
1088 + }
1089 + return $result;
1090 + }
1091 + PsbtAddRecipientRequest._() : super();
1092 + factory PsbtAddRecipientRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
1093 + factory PsbtAddRecipientRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
1094 +
1095 + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'PsbtAddRecipientRequest', createEmptyInstance: create)
1096 + ..aOS(1, _omitFieldNames ? '' : 'psbtB64')
1097 + ..aOM<PsbtRecipient>(2, _omitFieldNames ? '' : 'recipient', subBuilder: PsbtRecipient.create)
1098 + ..a<$fixnum.Int64>(3, _omitFieldNames ? '' : 'feeRatePerKb', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)
1099 + ..hasRequiredFields = false
1100 + ;
1101 +
1102 + @$core.Deprecated(
1103 + 'Using this can add significant overhead to your binary. '
1104 + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
1105 + 'Will be removed in next major version')
1106 + PsbtAddRecipientRequest clone() => PsbtAddRecipientRequest()..mergeFromMessage(this);
1107 + @$core.Deprecated(
1108 + 'Using this can add significant overhead to your binary. '
1109 + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
1110 + 'Will be removed in next major version')
1111 + PsbtAddRecipientRequest copyWith(void Function(PsbtAddRecipientRequest) updates) => super.copyWith((message) => updates(message as PsbtAddRecipientRequest)) as PsbtAddRecipientRequest;
1112 +
1113 + $pb.BuilderInfo get info_ => _i;
1114 +
1115 + @$core.pragma('dart2js:noInline')
1116 + static PsbtAddRecipientRequest create() => PsbtAddRecipientRequest._();
1117 + PsbtAddRecipientRequest createEmptyInstance() => create();
1118 + static $pb.PbList<PsbtAddRecipientRequest> createRepeated() => $pb.PbList<PsbtAddRecipientRequest>();
1119 + @$core.pragma('dart2js:noInline')
1120 + static PsbtAddRecipientRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<PsbtAddRecipientRequest>(create);
1121 + static PsbtAddRecipientRequest? _defaultInstance;
1122 +
1123 + /// The PSBT in base64 encoding.
1124 + @$pb.TagNumber(1)
1125 + $core.String get psbtB64 => $_getSZ(0);
1126 + @$pb.TagNumber(1)
1127 + set psbtB64($core.String v) { $_setString(0, v); }
1128 + @$pb.TagNumber(1)
1129 + $core.bool hasPsbtB64() => $_has(0);
1130 + @$pb.TagNumber(1)
1131 + void clearPsbtB64() => clearField(1);
1132 +
1133 + @$pb.TagNumber(2)
1134 + PsbtRecipient get recipient => $_getN(1);
1135 + @$pb.TagNumber(2)
1136 + set recipient(PsbtRecipient v) { setField(2, v); }
1137 + @$pb.TagNumber(2)
1138 + $core.bool hasRecipient() => $_has(1);
1139 + @$pb.TagNumber(2)
1140 + void clearRecipient() => clearField(2);
1141 + @$pb.TagNumber(2)
1142 + PsbtRecipient ensureRecipient() => $_ensure(1);
1143 +
1144 + /// The fee rate per KB in litoshis.
1145 + @$pb.TagNumber(3)
1146 + $fixnum.Int64 get feeRatePerKb => $_getI64(2);
1147 + @$pb.TagNumber(3)
1148 + set feeRatePerKb($fixnum.Int64 v) { $_setInt64(2, v); }
1149 + @$pb.TagNumber(3)
1150 + $core.bool hasFeeRatePerKb() => $_has(2);
1151 + @$pb.TagNumber(3)
1152 + void clearFeeRatePerKb() => clearField(3);
1153 +}
1154 +
1155 +class PsbtGetRecipientsRequest extends $pb.GeneratedMessage {
1156 + factory PsbtGetRecipientsRequest({
1157 + $core.String? psbtB64,
1158 + }) {
1159 + final $result = create();
1160 + if (psbtB64 != null) {
1161 + $result.psbtB64 = psbtB64;
1162 + }
1163 + return $result;
1164 + }
1165 + PsbtGetRecipientsRequest._() : super();
1166 + factory PsbtGetRecipientsRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
1167 + factory PsbtGetRecipientsRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
1168 +
1169 + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'PsbtGetRecipientsRequest', createEmptyInstance: create)
1170 + ..aOS(1, _omitFieldNames ? '' : 'psbtB64')
1171 + ..hasRequiredFields = false
1172 + ;
1173 +
1174 + @$core.Deprecated(
1175 + 'Using this can add significant overhead to your binary. '
1176 + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
1177 + 'Will be removed in next major version')
1178 + PsbtGetRecipientsRequest clone() => PsbtGetRecipientsRequest()..mergeFromMessage(this);
1179 + @$core.Deprecated(
1180 + 'Using this can add significant overhead to your binary. '
1181 + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
1182 + 'Will be removed in next major version')
1183 + PsbtGetRecipientsRequest copyWith(void Function(PsbtGetRecipientsRequest) updates) => super.copyWith((message) => updates(message as PsbtGetRecipientsRequest)) as PsbtGetRecipientsRequest;
1184 +
1185 + $pb.BuilderInfo get info_ => _i;
1186 +
1187 + @$core.pragma('dart2js:noInline')
1188 + static PsbtGetRecipientsRequest create() => PsbtGetRecipientsRequest._();
1189 + PsbtGetRecipientsRequest createEmptyInstance() => create();
1190 + static $pb.PbList<PsbtGetRecipientsRequest> createRepeated() => $pb.PbList<PsbtGetRecipientsRequest>();
1191 + @$core.pragma('dart2js:noInline')
1192 + static PsbtGetRecipientsRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<PsbtGetRecipientsRequest>(create);
1193 + static PsbtGetRecipientsRequest? _defaultInstance;
1194 +
1195 + /// The PSBT in base64 encoding.
1196 + @$pb.TagNumber(1)
1197 + $core.String get psbtB64 => $_getSZ(0);
1198 + @$pb.TagNumber(1)
1199 + set psbtB64($core.String v) { $_setString(0, v); }
1200 + @$pb.TagNumber(1)
1201 + $core.bool hasPsbtB64() => $_has(0);
1202 + @$pb.TagNumber(1)
1203 + void clearPsbtB64() => clearField(1);
1204 +}
1205 +
1206 +class PsbtGetRecipientsResponse extends $pb.GeneratedMessage {
1207 + factory PsbtGetRecipientsResponse({
1208 + $core.Iterable<PsbtRecipient>? recipient,
1209 + $core.Iterable<$core.String>? inputAddress,
1210 + $fixnum.Int64? fee,
1211 + }) {
1212 + final $result = create();
1213 + if (recipient != null) {
1214 + $result.recipient.addAll(recipient);
1215 + }
1216 + if (inputAddress != null) {
1217 + $result.inputAddress.addAll(inputAddress);
1218 + }
1219 + if (fee != null) {
1220 + $result.fee = fee;
1221 + }
1222 + return $result;
1223 + }
1224 + PsbtGetRecipientsResponse._() : super();
1225 + factory PsbtGetRecipientsResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
1226 + factory PsbtGetRecipientsResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
1227 +
1228 + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'PsbtGetRecipientsResponse', createEmptyInstance: create)
1229 + ..pc<PsbtRecipient>(1, _omitFieldNames ? '' : 'recipient', $pb.PbFieldType.PM, subBuilder: PsbtRecipient.create)
1230 + ..pPS(2, _omitFieldNames ? '' : 'inputAddress')
1231 + ..aInt64(3, _omitFieldNames ? '' : 'fee')
1232 + ..hasRequiredFields = false
1233 + ;
1234 +
1235 + @$core.Deprecated(
1236 + 'Using this can add significant overhead to your binary. '
1237 + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
1238 + 'Will be removed in next major version')
1239 + PsbtGetRecipientsResponse clone() => PsbtGetRecipientsResponse()..mergeFromMessage(this);
1240 + @$core.Deprecated(
1241 + 'Using this can add significant overhead to your binary. '
1242 + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
1243 + 'Will be removed in next major version')
1244 + PsbtGetRecipientsResponse copyWith(void Function(PsbtGetRecipientsResponse) updates) => super.copyWith((message) => updates(message as PsbtGetRecipientsResponse)) as PsbtGetRecipientsResponse;
1245 +
1246 + $pb.BuilderInfo get info_ => _i;
1247 +
1248 + @$core.pragma('dart2js:noInline')
1249 + static PsbtGetRecipientsResponse create() => PsbtGetRecipientsResponse._();
1250 + PsbtGetRecipientsResponse createEmptyInstance() => create();
1251 + static $pb.PbList<PsbtGetRecipientsResponse> createRepeated() => $pb.PbList<PsbtGetRecipientsResponse>();
1252 + @$core.pragma('dart2js:noInline')
1253 + static PsbtGetRecipientsResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<PsbtGetRecipientsResponse>(create);
1254 + static PsbtGetRecipientsResponse? _defaultInstance;
1255 +
1256 + @$pb.TagNumber(1)
1257 + $core.List<PsbtRecipient> get recipient => $_getList(0);
1258 +
1259 + @$pb.TagNumber(2)
1260 + $core.List<$core.String> get inputAddress => $_getList(1);
1261 +
1262 + @$pb.TagNumber(3)
1263 + $fixnum.Int64 get fee => $_getI64(2);
1264 + @$pb.TagNumber(3)
1265 + set fee($fixnum.Int64 v) { $_setInt64(2, v); }
1266 + @$pb.TagNumber(3)
1267 + $core.bool hasFee() => $_has(2);
1268 + @$pb.TagNumber(3)
1269 + void clearFee() => clearField(3);
1270 +}
1271 +
1272 +class PsbtRecipient extends $pb.GeneratedMessage {
1273 + factory PsbtRecipient({
1274 + $core.String? address,
1275 + $fixnum.Int64? value,
1276 + }) {
1277 + final $result = create();
1278 + if (address != null) {
1279 + $result.address = address;
1280 + }
1281 + if (value != null) {
1282 + $result.value = value;
1283 + }
1284 + return $result;
1285 + }
1286 + PsbtRecipient._() : super();
1287 + factory PsbtRecipient.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
1288 + factory PsbtRecipient.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
1289 +
1290 + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'PsbtRecipient', createEmptyInstance: create)
1291 + ..aOS(1, _omitFieldNames ? '' : 'address')
1292 + ..aInt64(2, _omitFieldNames ? '' : 'value')
1293 + ..hasRequiredFields = false
1294 + ;
1295 +
1296 + @$core.Deprecated(
1297 + 'Using this can add significant overhead to your binary. '
1298 + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
1299 + 'Will be removed in next major version')
1300 + PsbtRecipient clone() => PsbtRecipient()..mergeFromMessage(this);
1301 + @$core.Deprecated(
1302 + 'Using this can add significant overhead to your binary. '
1303 + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
1304 + 'Will be removed in next major version')
1305 + PsbtRecipient copyWith(void Function(PsbtRecipient) updates) => super.copyWith((message) => updates(message as PsbtRecipient)) as PsbtRecipient;
1306 +
1307 + $pb.BuilderInfo get info_ => _i;
1308 +
1309 + @$core.pragma('dart2js:noInline')
1310 + static PsbtRecipient create() => PsbtRecipient._();
1311 + PsbtRecipient createEmptyInstance() => create();
1312 + static $pb.PbList<PsbtRecipient> createRepeated() => $pb.PbList<PsbtRecipient>();
1313 + @$core.pragma('dart2js:noInline')
1314 + static PsbtRecipient getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<PsbtRecipient>(create);
1315 + static PsbtRecipient? _defaultInstance;
1316 +
1317 + @$pb.TagNumber(1)
1318 + $core.String get address => $_getSZ(0);
1319 + @$pb.TagNumber(1)
1320 + set address($core.String v) { $_setString(0, v); }
1321 + @$pb.TagNumber(1)
1322 + $core.bool hasAddress() => $_has(0);
1323 + @$pb.TagNumber(1)
1324 + void clearAddress() => clearField(1);
1325 +
1326 + @$pb.TagNumber(2)
1327 + $fixnum.Int64 get value => $_getI64(1);
1328 + @$pb.TagNumber(2)
1329 + set value($fixnum.Int64 v) { $_setInt64(1, v); }
1330 + @$pb.TagNumber(2)
1331 + $core.bool hasValue() => $_has(1);
1332 + @$pb.TagNumber(2)
1333 + void clearValue() => clearField(2);
1334 +}
1335 +
1336 +class PsbtSignRequest extends $pb.GeneratedMessage {
1337 + factory PsbtSignRequest({
1338 + $core.String? psbtB64,
1339 + $core.List<$core.int>? scanSecret,
1340 + $core.List<$core.int>? spendSecret,
1341 + }) {
1342 + final $result = create();
1343 + if (psbtB64 != null) {
1344 + $result.psbtB64 = psbtB64;
1345 + }
1346 + if (scanSecret != null) {
1347 + $result.scanSecret = scanSecret;
1348 + }
1349 + if (spendSecret != null) {
1350 + $result.spendSecret = spendSecret;
1351 + }
1352 + return $result;
1353 + }
1354 + PsbtSignRequest._() : super();
1355 + factory PsbtSignRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
1356 + factory PsbtSignRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
1357 +
1358 + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'PsbtSignRequest', createEmptyInstance: create)
1359 + ..aOS(1, _omitFieldNames ? '' : 'psbtB64')
1360 + ..a<$core.List<$core.int>>(2, _omitFieldNames ? '' : 'scanSecret', $pb.PbFieldType.OY)
1361 + ..a<$core.List<$core.int>>(3, _omitFieldNames ? '' : 'spendSecret', $pb.PbFieldType.OY)
1362 + ..hasRequiredFields = false
1363 + ;
1364 +
1365 + @$core.Deprecated(
1366 + 'Using this can add significant overhead to your binary. '
1367 + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
1368 + 'Will be removed in next major version')
1369 + PsbtSignRequest clone() => PsbtSignRequest()..mergeFromMessage(this);
1370 + @$core.Deprecated(
1371 + 'Using this can add significant overhead to your binary. '
1372 + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
1373 + 'Will be removed in next major version')
1374 + PsbtSignRequest copyWith(void Function(PsbtSignRequest) updates) => super.copyWith((message) => updates(message as PsbtSignRequest)) as PsbtSignRequest;
1375 +
1376 + $pb.BuilderInfo get info_ => _i;
1377 +
1378 + @$core.pragma('dart2js:noInline')
1379 + static PsbtSignRequest create() => PsbtSignRequest._();
1380 + PsbtSignRequest createEmptyInstance() => create();
1381 + static $pb.PbList<PsbtSignRequest> createRepeated() => $pb.PbList<PsbtSignRequest>();
1382 + @$core.pragma('dart2js:noInline')
1383 + static PsbtSignRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<PsbtSignRequest>(create);
1384 + static PsbtSignRequest? _defaultInstance;
1385 +
1386 + /// The PSBT in base64 encoding.
1387 + @$pb.TagNumber(1)
1388 + $core.String get psbtB64 => $_getSZ(0);
1389 + @$pb.TagNumber(1)
1390 + set psbtB64($core.String v) { $_setString(0, v); }
1391 + @$pb.TagNumber(1)
1392 + $core.bool hasPsbtB64() => $_has(0);
1393 + @$pb.TagNumber(1)
1394 + void clearPsbtB64() => clearField(1);
1395 +
1396 + /// The scan secret or view key represents the account that
1397 + /// the utxos being spent belong to.
1398 + @$pb.TagNumber(2)
1399 + $core.List<$core.int> get scanSecret => $_getN(1);
1400 + @$pb.TagNumber(2)
1401 + set scanSecret($core.List<$core.int> v) { $_setBytes(1, v); }
1402 + @$pb.TagNumber(2)
1403 + $core.bool hasScanSecret() => $_has(1);
1404 + @$pb.TagNumber(2)
1405 + void clearScanSecret() => clearField(2);
1406 +
1407 + /// The spend secret is the private key necessary for spending
1408 + /// the utxos belonging to the account.
1409 + @$pb.TagNumber(3)
1410 + $core.List<$core.int> get spendSecret => $_getN(2);
1411 + @$pb.TagNumber(3)
1412 + set spendSecret($core.List<$core.int> v) { $_setBytes(2, v); }
1413 + @$pb.TagNumber(3)
1414 + $core.bool hasSpendSecret() => $_has(2);
1415 + @$pb.TagNumber(3)
1416 + void clearSpendSecret() => clearField(3);
1417 +}
1418 +
1419 +class PsbtSignNonMwebRequest extends $pb.GeneratedMessage {
1420 + factory PsbtSignNonMwebRequest({
1421 + $core.String? psbtB64,
1422 + $core.List<$core.int>? privKey,
1423 + $core.int? index,
1424 + }) {
1425 + final $result = create();
1426 + if (psbtB64 != null) {
1427 + $result.psbtB64 = psbtB64;
1428 + }
1429 + if (privKey != null) {
1430 + $result.privKey = privKey;
1431 + }
1432 + if (index != null) {
1433 + $result.index = index;
1434 + }
1435 + return $result;
1436 + }
1437 + PsbtSignNonMwebRequest._() : super();
1438 + factory PsbtSignNonMwebRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
1439 + factory PsbtSignNonMwebRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
1440 +
1441 + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'PsbtSignNonMwebRequest', createEmptyInstance: create)
1442 + ..aOS(1, _omitFieldNames ? '' : 'psbtB64')
1443 + ..a<$core.List<$core.int>>(2, _omitFieldNames ? '' : 'privKey', $pb.PbFieldType.OY)
1444 + ..a<$core.int>(3, _omitFieldNames ? '' : 'index', $pb.PbFieldType.OU3)
1445 + ..hasRequiredFields = false
1446 + ;
1447 +
1448 + @$core.Deprecated(
1449 + 'Using this can add significant overhead to your binary. '
1450 + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
1451 + 'Will be removed in next major version')
1452 + PsbtSignNonMwebRequest clone() => PsbtSignNonMwebRequest()..mergeFromMessage(this);
1453 + @$core.Deprecated(
1454 + 'Using this can add significant overhead to your binary. '
1455 + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
1456 + 'Will be removed in next major version')
1457 + PsbtSignNonMwebRequest copyWith(void Function(PsbtSignNonMwebRequest) updates) => super.copyWith((message) => updates(message as PsbtSignNonMwebRequest)) as PsbtSignNonMwebRequest;
1458 +
1459 + $pb.BuilderInfo get info_ => _i;
1460 +
1461 + @$core.pragma('dart2js:noInline')
1462 + static PsbtSignNonMwebRequest create() => PsbtSignNonMwebRequest._();
1463 + PsbtSignNonMwebRequest createEmptyInstance() => create();
1464 + static $pb.PbList<PsbtSignNonMwebRequest> createRepeated() => $pb.PbList<PsbtSignNonMwebRequest>();
1465 + @$core.pragma('dart2js:noInline')
1466 + static PsbtSignNonMwebRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<PsbtSignNonMwebRequest>(create);
1467 + static PsbtSignNonMwebRequest? _defaultInstance;
1468 +
1469 + /// The PSBT in base64 encoding.
1470 + @$pb.TagNumber(1)
1471 + $core.String get psbtB64 => $_getSZ(0);
1472 + @$pb.TagNumber(1)
1473 + set psbtB64($core.String v) { $_setString(0, v); }
1474 + @$pb.TagNumber(1)
1475 + $core.bool hasPsbtB64() => $_has(0);
1476 + @$pb.TagNumber(1)
1477 + void clearPsbtB64() => clearField(1);
1478 +
1479 + /// The private key necessary for spending the input.
1480 + @$pb.TagNumber(2)
1481 + $core.List<$core.int> get privKey => $_getN(1);
1482 + @$pb.TagNumber(2)
1483 + set privKey($core.List<$core.int> v) { $_setBytes(1, v); }
1484 + @$pb.TagNumber(2)
1485 + $core.bool hasPrivKey() => $_has(1);
1486 + @$pb.TagNumber(2)
1487 + void clearPrivKey() => clearField(2);
1488 +
1489 + /// The index of the input to sign.
1490 + @$pb.TagNumber(3)
1491 + $core.int get index => $_getIZ(2);
1492 + @$pb.TagNumber(3)
1493 + set index($core.int v) { $_setUnsignedInt32(2, v); }
1494 + @$pb.TagNumber(3)
1495 + $core.bool hasIndex() => $_has(2);
1496 + @$pb.TagNumber(3)
1497 + void clearIndex() => clearField(3);
1498 +}
1499 +
1500 +class PsbtExtractRequest extends $pb.GeneratedMessage {
1501 + factory PsbtExtractRequest({
1502 + $core.String? psbtB64,
1503 + $core.bool? unsigned,
1504 + }) {
1505 + final $result = create();
1506 + if (psbtB64 != null) {
1507 + $result.psbtB64 = psbtB64;
1508 + }
1509 + if (unsigned != null) {
1510 + $result.unsigned = unsigned;
1511 + }
1512 + return $result;
1513 + }
1514 + PsbtExtractRequest._() : super();
1515 + factory PsbtExtractRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
1516 + factory PsbtExtractRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
1517 +
1518 + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'PsbtExtractRequest', createEmptyInstance: create)
1519 + ..aOS(1, _omitFieldNames ? '' : 'psbtB64')
1520 + ..aOB(2, _omitFieldNames ? '' : 'unsigned')
1521 + ..hasRequiredFields = false
1522 + ;
1523 +
1524 + @$core.Deprecated(
1525 + 'Using this can add significant overhead to your binary. '
1526 + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
1527 + 'Will be removed in next major version')
1528 + PsbtExtractRequest clone() => PsbtExtractRequest()..mergeFromMessage(this);
1529 + @$core.Deprecated(
1530 + 'Using this can add significant overhead to your binary. '
1531 + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
1532 + 'Will be removed in next major version')
1533 + PsbtExtractRequest copyWith(void Function(PsbtExtractRequest) updates) => super.copyWith((message) => updates(message as PsbtExtractRequest)) as PsbtExtractRequest;
1534 +
1535 + $pb.BuilderInfo get info_ => _i;
1536 +
1537 + @$core.pragma('dart2js:noInline')
1538 + static PsbtExtractRequest create() => PsbtExtractRequest._();
1539 + PsbtExtractRequest createEmptyInstance() => create();
1540 + static $pb.PbList<PsbtExtractRequest> createRepeated() => $pb.PbList<PsbtExtractRequest>();
1541 + @$core.pragma('dart2js:noInline')
1542 + static PsbtExtractRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<PsbtExtractRequest>(create);
1543 + static PsbtExtractRequest? _defaultInstance;
1544 +
1545 + /// The PSBT in base64 encoding.
1546 + @$pb.TagNumber(1)
1547 + $core.String get psbtB64 => $_getSZ(0);
1548 + @$pb.TagNumber(1)
1549 + set psbtB64($core.String v) { $_setString(0, v); }
1550 + @$pb.TagNumber(1)
1551 + $core.bool hasPsbtB64() => $_has(0);
1552 + @$pb.TagNumber(1)
1553 + void clearPsbtB64() => clearField(1);
1554 +
1555 + /// Extract the unsigned transaction.
1556 + @$pb.TagNumber(2)
1557 + $core.bool get unsigned => $_getBF(1);
1558 + @$pb.TagNumber(2)
1559 + set unsigned($core.bool v) { $_setBool(1, v); }
1560 + @$pb.TagNumber(2)
1561 + $core.bool hasUnsigned() => $_has(1);
1562 + @$pb.TagNumber(2)
1563 + void clearUnsigned() => clearField(2);
1564 +}
1565 +
1566 +class BroadcastRequest extends $pb.GeneratedMessage {
1567 + factory BroadcastRequest({
1568 + $core.List<$core.int>? rawTx,
1569 + }) {
1570 + final $result = create();
1571 + if (rawTx != null) {
1572 + $result.rawTx = rawTx;
1573 + }
1574 + return $result;
1575 + }
1576 + BroadcastRequest._() : super();
1577 + factory BroadcastRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
1578 + factory BroadcastRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
1579 +
1580 + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'BroadcastRequest', createEmptyInstance: create)
1581 + ..a<$core.List<$core.int>>(1, _omitFieldNames ? '' : 'rawTx', $pb.PbFieldType.OY)
1582 + ..hasRequiredFields = false
1583 + ;
1584 +
1585 + @$core.Deprecated(
1586 + 'Using this can add significant overhead to your binary. '
1587 + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
1588 + 'Will be removed in next major version')
1589 + BroadcastRequest clone() => BroadcastRequest()..mergeFromMessage(this);
1590 + @$core.Deprecated(
1591 + 'Using this can add significant overhead to your binary. '
1592 + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
1593 + 'Will be removed in next major version')
1594 + BroadcastRequest copyWith(void Function(BroadcastRequest) updates) => super.copyWith((message) => updates(message as BroadcastRequest)) as BroadcastRequest;
1595 +
1596 + $pb.BuilderInfo get info_ => _i;
1597 +
1598 + @$core.pragma('dart2js:noInline')
1599 + static BroadcastRequest create() => BroadcastRequest._();
1600 + BroadcastRequest createEmptyInstance() => create();
1601 + static $pb.PbList<BroadcastRequest> createRepeated() => $pb.PbList<BroadcastRequest>();
1602 + @$core.pragma('dart2js:noInline')
1603 + static BroadcastRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<BroadcastRequest>(create);
1604 + static BroadcastRequest? _defaultInstance;
1605 +
1606 + /// The raw bytes of the serialized transaction.
1607 + @$pb.TagNumber(1)
1608 + $core.List<$core.int> get rawTx => $_getN(0);
1609 + @$pb.TagNumber(1)
1610 + set rawTx($core.List<$core.int> v) { $_setBytes(0, v); }
1611 + @$pb.TagNumber(1)
1612 + $core.bool hasRawTx() => $_has(0);
1613 + @$pb.TagNumber(1)
1614 + void clearRawTx() => clearField(1);
1615 +}
1616 +
1617 +class BroadcastResponse extends $pb.GeneratedMessage {
1618 + factory BroadcastResponse({
1619 + $core.String? txid,
1620 + }) {
1621 + final $result = create();
1622 + if (txid != null) {
1623 + $result.txid = txid;
1624 + }
1625 + return $result;
1626 + }
1627 + BroadcastResponse._() : super();
1628 + factory BroadcastResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
1629 + factory BroadcastResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
1630 +
1631 + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'BroadcastResponse', createEmptyInstance: create)
1632 + ..aOS(1, _omitFieldNames ? '' : 'txid')
1633 + ..hasRequiredFields = false
1634 + ;
1635 +
1636 + @$core.Deprecated(
1637 + 'Using this can add significant overhead to your binary. '
1638 + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
1639 + 'Will be removed in next major version')
1640 + BroadcastResponse clone() => BroadcastResponse()..mergeFromMessage(this);
1641 + @$core.Deprecated(
1642 + 'Using this can add significant overhead to your binary. '
1643 + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
1644 + 'Will be removed in next major version')
1645 + BroadcastResponse copyWith(void Function(BroadcastResponse) updates) => super.copyWith((message) => updates(message as BroadcastResponse)) as BroadcastResponse;
1646 +
1647 + $pb.BuilderInfo get info_ => _i;
1648 +
1649 + @$core.pragma('dart2js:noInline')
1650 + static BroadcastResponse create() => BroadcastResponse._();
1651 + BroadcastResponse createEmptyInstance() => create();
1652 + static $pb.PbList<BroadcastResponse> createRepeated() => $pb.PbList<BroadcastResponse>();
1653 + @$core.pragma('dart2js:noInline')
1654 + static BroadcastResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<BroadcastResponse>(create);
1655 + static BroadcastResponse? _defaultInstance;
1656 +
1657 + /// The transaction ID.
1658 + @$pb.TagNumber(1)
1659 + $core.String get txid => $_getSZ(0);
1660 + @$pb.TagNumber(1)
1661 + set txid($core.String v) { $_setString(0, v); }
1662 + @$pb.TagNumber(1)
1663 + $core.bool hasTxid() => $_has(0);
1664 + @$pb.TagNumber(1)
1665 + void clearTxid() => clearField(1);
1666 +}
1667 +
1668 +class CoinswapRequest extends $pb.GeneratedMessage {
1669 + factory CoinswapRequest({
1670 + $core.List<$core.int>? scanSecret,
1671 + $core.List<$core.int>? spendSecret,
1672 + $core.String? outputId,
1673 + $core.int? addrIndex,
1674 + }) {
1675 + final $result = create();
1676 + if (scanSecret != null) {
1677 + $result.scanSecret = scanSecret;
1678 + }
1679 + if (spendSecret != null) {
1680 + $result.spendSecret = spendSecret;
1681 + }
1682 + if (outputId != null) {
1683 + $result.outputId = outputId;
1684 + }
1685 + if (addrIndex != null) {
1686 + $result.addrIndex = addrIndex;
1687 + }
1688 + return $result;
1689 + }
1690 + CoinswapRequest._() : super();
1691 + factory CoinswapRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
1692 + factory CoinswapRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
1693 +
1694 + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'CoinswapRequest', createEmptyInstance: create)
1695 + ..a<$core.List<$core.int>>(1, _omitFieldNames ? '' : 'scanSecret', $pb.PbFieldType.OY)
1696 + ..a<$core.List<$core.int>>(2, _omitFieldNames ? '' : 'spendSecret', $pb.PbFieldType.OY)
1697 + ..aOS(3, _omitFieldNames ? '' : 'outputId')
1698 + ..a<$core.int>(4, _omitFieldNames ? '' : 'addrIndex', $pb.PbFieldType.OU3)
1699 + ..hasRequiredFields = false
1700 + ;
1701 +
1702 + @$core.Deprecated(
1703 + 'Using this can add significant overhead to your binary. '
1704 + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
1705 + 'Will be removed in next major version')
1706 + CoinswapRequest clone() => CoinswapRequest()..mergeFromMessage(this);
1707 + @$core.Deprecated(
1708 + 'Using this can add significant overhead to your binary. '
1709 + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
1710 + 'Will be removed in next major version')
1711 + CoinswapRequest copyWith(void Function(CoinswapRequest) updates) => super.copyWith((message) => updates(message as CoinswapRequest)) as CoinswapRequest;
1712 +
1713 + $pb.BuilderInfo get info_ => _i;
1714 +
1715 + @$core.pragma('dart2js:noInline')
1716 + static CoinswapRequest create() => CoinswapRequest._();
1717 + CoinswapRequest createEmptyInstance() => create();
1718 + static $pb.PbList<CoinswapRequest> createRepeated() => $pb.PbList<CoinswapRequest>();
1719 + @$core.pragma('dart2js:noInline')
1720 + static CoinswapRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<CoinswapRequest>(create);
1721 + static CoinswapRequest? _defaultInstance;
1722 +
1723 + /// The scan secret or view key represents the account that
1724 + /// the utxo belongs to.
1725 + @$pb.TagNumber(1)
1726 + $core.List<$core.int> get scanSecret => $_getN(0);
1727 + @$pb.TagNumber(1)
1728 + set scanSecret($core.List<$core.int> v) { $_setBytes(0, v); }
1729 + @$pb.TagNumber(1)
1730 + $core.bool hasScanSecret() => $_has(0);
1731 + @$pb.TagNumber(1)
1732 + void clearScanSecret() => clearField(1);
1733 +
1734 + /// The spend secret is the private key necessary for spending
1735 + /// the utxos belonging to the account.
1736 + @$pb.TagNumber(2)
1737 + $core.List<$core.int> get spendSecret => $_getN(1);
1738 + @$pb.TagNumber(2)
1739 + set spendSecret($core.List<$core.int> v) { $_setBytes(1, v); }
1740 + @$pb.TagNumber(2)
1741 + $core.bool hasSpendSecret() => $_has(1);
1742 + @$pb.TagNumber(2)
1743 + void clearSpendSecret() => clearField(2);
1744 +
1745 + /// Output ID of the utxo to request a coinswap for.
1746 + @$pb.TagNumber(3)
1747 + $core.String get outputId => $_getSZ(2);
1748 + @$pb.TagNumber(3)
1749 + set outputId($core.String v) { $_setString(2, v); }
1750 + @$pb.TagNumber(3)
1751 + $core.bool hasOutputId() => $_has(2);
1752 + @$pb.TagNumber(3)
1753 + void clearOutputId() => clearField(3);
1754 +
1755 + /// Address index of the utxo.
1756 + @$pb.TagNumber(4)
1757 + $core.int get addrIndex => $_getIZ(3);
1758 + @$pb.TagNumber(4)
1759 + set addrIndex($core.int v) { $_setUnsignedInt32(3, v); }
1760 + @$pb.TagNumber(4)
1761 + $core.bool hasAddrIndex() => $_has(3);
1762 + @$pb.TagNumber(4)
1763 + void clearAddrIndex() => clearField(4);
1764 +}
1765 +
1766 +class CoinswapResponse extends $pb.GeneratedMessage {
1767 + factory CoinswapResponse({
1768 + $core.String? outputId,
1769 + }) {
1770 + final $result = create();
1771 + if (outputId != null) {
1772 + $result.outputId = outputId;
1773 + }
1774 + return $result;
1775 + }
1776 + CoinswapResponse._() : super();
1777 + factory CoinswapResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
1778 + factory CoinswapResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
1779 +
1780 + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'CoinswapResponse', createEmptyInstance: create)
1781 + ..aOS(1, _omitFieldNames ? '' : 'outputId')
1782 + ..hasRequiredFields = false
1783 + ;
1784 +
1785 + @$core.Deprecated(
1786 + 'Using this can add significant overhead to your binary. '
1787 + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
1788 + 'Will be removed in next major version')
1789 + CoinswapResponse clone() => CoinswapResponse()..mergeFromMessage(this);
1790 + @$core.Deprecated(
1791 + 'Using this can add significant overhead to your binary. '
1792 + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
1793 + 'Will be removed in next major version')
1794 + CoinswapResponse copyWith(void Function(CoinswapResponse) updates) => super.copyWith((message) => updates(message as CoinswapResponse)) as CoinswapResponse;
1795 +
1796 + $pb.BuilderInfo get info_ => _i;
1797 +
1798 + @$core.pragma('dart2js:noInline')
1799 + static CoinswapResponse create() => CoinswapResponse._();
1800 + CoinswapResponse createEmptyInstance() => create();
1801 + static $pb.PbList<CoinswapResponse> createRepeated() => $pb.PbList<CoinswapResponse>();
1802 + @$core.pragma('dart2js:noInline')
1803 + static CoinswapResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<CoinswapResponse>(create);
1804 + static CoinswapResponse? _defaultInstance;
1805 +
1806 + /// Output ID of the utxo created by the transaction.
1807 + @$pb.TagNumber(1)
1808 + $core.String get outputId => $_getSZ(0);
1809 + @$pb.TagNumber(1)
1810 + set outputId($core.String v) { $_setString(0, v); }
1811 + @$pb.TagNumber(1)
1812 + $core.bool hasOutputId() => $_has(0);
1813 + @$pb.TagNumber(1)
1814 + void clearOutputId() => clearField(1);
1815 }
1816
1817
1818 const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names');
801 -const _omitMessageNames = $core.bool.fromEnvironment('protobuf.omit_message_names');
1819 +const _omitMessageNames = $core.bool.fromEnvironment('protobuf.omit_message_names');
\ No newline at end of file
cw_mweb/lib/mwebd.pbgrpc.dart
+181 -1
@@ -41,10 +41,46 @@ class RpcClient extends $grpc.Client {
41 '/Rpc/Create',
42 ($0.CreateRequest value) => value.writeToBuffer(),
43 ($core.List<$core.int> value) => $0.CreateResponse.fromBuffer(value));
44 + static final _$psbtCreate = $grpc.ClientMethod<$0.PsbtCreateRequest, $0.PsbtResponse>(
45 + '/Rpc/PsbtCreate',
46 + ($0.PsbtCreateRequest value) => value.writeToBuffer(),
47 + ($core.List<$core.int> value) => $0.PsbtResponse.fromBuffer(value));
48 + static final _$psbtAddInput = $grpc.ClientMethod<$0.PsbtAddInputRequest, $0.PsbtResponse>(
49 + '/Rpc/PsbtAddInput',
50 + ($0.PsbtAddInputRequest value) => value.writeToBuffer(),
51 + ($core.List<$core.int> value) => $0.PsbtResponse.fromBuffer(value));
52 + static final _$psbtAddRecipient = $grpc.ClientMethod<$0.PsbtAddRecipientRequest, $0.PsbtResponse>(
53 + '/Rpc/PsbtAddRecipient',
54 + ($0.PsbtAddRecipientRequest value) => value.writeToBuffer(),
55 + ($core.List<$core.int> value) => $0.PsbtResponse.fromBuffer(value));
56 + static final _$psbtGetRecipients = $grpc.ClientMethod<$0.PsbtGetRecipientsRequest, $0.PsbtGetRecipientsResponse>(
57 + '/Rpc/PsbtGetRecipients',
58 + ($0.PsbtGetRecipientsRequest value) => value.writeToBuffer(),
59 + ($core.List<$core.int> value) => $0.PsbtGetRecipientsResponse.fromBuffer(value));
60 + static final _$psbtSign = $grpc.ClientMethod<$0.PsbtSignRequest, $0.PsbtResponse>(
61 + '/Rpc/PsbtSign',
62 + ($0.PsbtSignRequest value) => value.writeToBuffer(),
63 + ($core.List<$core.int> value) => $0.PsbtResponse.fromBuffer(value));
64 + static final _$psbtSignNonMweb = $grpc.ClientMethod<$0.PsbtSignNonMwebRequest, $0.PsbtResponse>(
65 + '/Rpc/PsbtSignNonMweb',
66 + ($0.PsbtSignNonMwebRequest value) => value.writeToBuffer(),
67 + ($core.List<$core.int> value) => $0.PsbtResponse.fromBuffer(value));
68 + static final _$psbtExtract = $grpc.ClientMethod<$0.PsbtExtractRequest, $0.CreateResponse>(
69 + '/Rpc/PsbtExtract',
70 + ($0.PsbtExtractRequest value) => value.writeToBuffer(),
71 + ($core.List<$core.int> value) => $0.CreateResponse.fromBuffer(value));
72 + static final _$ledgerExchange = $grpc.ClientMethod<$0.LedgerApdu, $0.LedgerApdu>(
73 + '/Rpc/LedgerExchange',
74 + ($0.LedgerApdu value) => value.writeToBuffer(),
75 + ($core.List<$core.int> value) => $0.LedgerApdu.fromBuffer(value));
76 static final _$broadcast = $grpc.ClientMethod<$0.BroadcastRequest, $0.BroadcastResponse>(
77 '/Rpc/Broadcast',
78 ($0.BroadcastRequest value) => value.writeToBuffer(),
79 ($core.List<$core.int> value) => $0.BroadcastResponse.fromBuffer(value));
80 + static final _$coinswap = $grpc.ClientMethod<$0.CoinswapRequest, $0.CoinswapResponse>(
81 + '/Rpc/Coinswap',
82 + ($0.CoinswapRequest value) => value.writeToBuffer(),
83 + ($core.List<$core.int> value) => $0.CoinswapResponse.fromBuffer(value));
84
85 RpcClient($grpc.ClientChannel channel,
86 {$grpc.CallOptions? options,
@@ -72,9 +108,45 @@ class RpcClient extends $grpc.Client {
108 return $createUnaryCall(_$create, request, options: options);
109 }
110
111 + $grpc.ResponseFuture<$0.PsbtResponse> psbtCreate($0.PsbtCreateRequest request, {$grpc.CallOptions? options}) {
112 + return $createUnaryCall(_$psbtCreate, request, options: options);
113 + }
114 +
115 + $grpc.ResponseFuture<$0.PsbtResponse> psbtAddInput($0.PsbtAddInputRequest request, {$grpc.CallOptions? options}) {
116 + return $createUnaryCall(_$psbtAddInput, request, options: options);
117 + }
118 +
119 + $grpc.ResponseFuture<$0.PsbtResponse> psbtAddRecipient($0.PsbtAddRecipientRequest request, {$grpc.CallOptions? options}) {
120 + return $createUnaryCall(_$psbtAddRecipient, request, options: options);
121 + }
122 +
123 + $grpc.ResponseFuture<$0.PsbtGetRecipientsResponse> psbtGetRecipients($0.PsbtGetRecipientsRequest request, {$grpc.CallOptions? options}) {
124 + return $createUnaryCall(_$psbtGetRecipients, request, options: options);
125 + }
126 +
127 + $grpc.ResponseFuture<$0.PsbtResponse> psbtSign($0.PsbtSignRequest request, {$grpc.CallOptions? options}) {
128 + return $createUnaryCall(_$psbtSign, request, options: options);
129 + }
130 +
131 + $grpc.ResponseFuture<$0.PsbtResponse> psbtSignNonMweb($0.PsbtSignNonMwebRequest request, {$grpc.CallOptions? options}) {
132 + return $createUnaryCall(_$psbtSignNonMweb, request, options: options);
133 + }
134 +
135 + $grpc.ResponseFuture<$0.CreateResponse> psbtExtract($0.PsbtExtractRequest request, {$grpc.CallOptions? options}) {
136 + return $createUnaryCall(_$psbtExtract, request, options: options);
137 + }
138 +
139 + $grpc.ResponseFuture<$0.LedgerApdu> ledgerExchange($0.LedgerApdu request, {$grpc.CallOptions? options}) {
140 + return $createUnaryCall(_$ledgerExchange, request, options: options);
141 + }
142 +
143 $grpc.ResponseFuture<$0.BroadcastResponse> broadcast($0.BroadcastRequest request, {$grpc.CallOptions? options}) {
144 return $createUnaryCall(_$broadcast, request, options: options);
145 }
146 +
147 + $grpc.ResponseFuture<$0.CoinswapResponse> coinswap($0.CoinswapRequest request, {$grpc.CallOptions? options}) {
148 + return $createUnaryCall(_$coinswap, request, options: options);
149 + }
150 }
151
152 @$pb.GrpcServiceName('Rpc')
@@ -117,6 +189,62 @@ abstract class RpcServiceBase extends $grpc.Service {
189 false,
190 ($core.List<$core.int> value) => $0.CreateRequest.fromBuffer(value),
191 ($0.CreateResponse value) => value.writeToBuffer()));
192 + $addMethod($grpc.ServiceMethod<$0.PsbtCreateRequest, $0.PsbtResponse>(
193 + 'PsbtCreate',
194 + psbtCreate_Pre,
195 + false,
196 + false,
197 + ($core.List<$core.int> value) => $0.PsbtCreateRequest.fromBuffer(value),
198 + ($0.PsbtResponse value) => value.writeToBuffer()));
199 + $addMethod($grpc.ServiceMethod<$0.PsbtAddInputRequest, $0.PsbtResponse>(
200 + 'PsbtAddInput',
201 + psbtAddInput_Pre,
202 + false,
203 + false,
204 + ($core.List<$core.int> value) => $0.PsbtAddInputRequest.fromBuffer(value),
205 + ($0.PsbtResponse value) => value.writeToBuffer()));
206 + $addMethod($grpc.ServiceMethod<$0.PsbtAddRecipientRequest, $0.PsbtResponse>(
207 + 'PsbtAddRecipient',
208 + psbtAddRecipient_Pre,
209 + false,
210 + false,
211 + ($core.List<$core.int> value) => $0.PsbtAddRecipientRequest.fromBuffer(value),
212 + ($0.PsbtResponse value) => value.writeToBuffer()));
213 + $addMethod($grpc.ServiceMethod<$0.PsbtGetRecipientsRequest, $0.PsbtGetRecipientsResponse>(
214 + 'PsbtGetRecipients',
215 + psbtGetRecipients_Pre,
216 + false,
217 + false,
218 + ($core.List<$core.int> value) => $0.PsbtGetRecipientsRequest.fromBuffer(value),
219 + ($0.PsbtGetRecipientsResponse value) => value.writeToBuffer()));
220 + $addMethod($grpc.ServiceMethod<$0.PsbtSignRequest, $0.PsbtResponse>(
221 + 'PsbtSign',
222 + psbtSign_Pre,
223 + false,
224 + false,
225 + ($core.List<$core.int> value) => $0.PsbtSignRequest.fromBuffer(value),
226 + ($0.PsbtResponse value) => value.writeToBuffer()));
227 + $addMethod($grpc.ServiceMethod<$0.PsbtSignNonMwebRequest, $0.PsbtResponse>(
228 + 'PsbtSignNonMweb',
229 + psbtSignNonMweb_Pre,
230 + false,
231 + false,
232 + ($core.List<$core.int> value) => $0.PsbtSignNonMwebRequest.fromBuffer(value),
233 + ($0.PsbtResponse value) => value.writeToBuffer()));
234 + $addMethod($grpc.ServiceMethod<$0.PsbtExtractRequest, $0.CreateResponse>(
235 + 'PsbtExtract',
236 + psbtExtract_Pre,
237 + false,
238 + false,
239 + ($core.List<$core.int> value) => $0.PsbtExtractRequest.fromBuffer(value),
240 + ($0.CreateResponse value) => value.writeToBuffer()));
241 + $addMethod($grpc.ServiceMethod<$0.LedgerApdu, $0.LedgerApdu>(
242 + 'LedgerExchange',
243 + ledgerExchange_Pre,
244 + false,
245 + false,
246 + ($core.List<$core.int> value) => $0.LedgerApdu.fromBuffer(value),
247 + ($0.LedgerApdu value) => value.writeToBuffer()));
248 $addMethod($grpc.ServiceMethod<$0.BroadcastRequest, $0.BroadcastResponse>(
249 'Broadcast',
250 broadcast_Pre,
@@ -124,6 +252,13 @@ abstract class RpcServiceBase extends $grpc.Service {
252 false,
253 ($core.List<$core.int> value) => $0.BroadcastRequest.fromBuffer(value),
254 ($0.BroadcastResponse value) => value.writeToBuffer()));
255 + $addMethod($grpc.ServiceMethod<$0.CoinswapRequest, $0.CoinswapResponse>(
256 + 'Coinswap',
257 + coinswap_Pre,
258 + false,
259 + false,
260 + ($core.List<$core.int> value) => $0.CoinswapRequest.fromBuffer(value),
261 + ($0.CoinswapResponse value) => value.writeToBuffer()));
262 }
263
264 $async.Future<$0.StatusResponse> status_Pre($grpc.ServiceCall call, $async.Future<$0.StatusRequest> request) async {
@@ -146,14 +281,59 @@ abstract class RpcServiceBase extends $grpc.Service {
281 return create(call, await request);
282 }
283
284 + $async.Future<$0.PsbtResponse> psbtCreate_Pre($grpc.ServiceCall call, $async.Future<$0.PsbtCreateRequest> request) async {
285 + return psbtCreate(call, await request);
286 + }
287 +
288 + $async.Future<$0.PsbtResponse> psbtAddInput_Pre($grpc.ServiceCall call, $async.Future<$0.PsbtAddInputRequest> request) async {
289 + return psbtAddInput(call, await request);
290 + }
291 +
292 + $async.Future<$0.PsbtResponse> psbtAddRecipient_Pre($grpc.ServiceCall call, $async.Future<$0.PsbtAddRecipientRequest> request) async {
293 + return psbtAddRecipient(call, await request);
294 + }
295 +
296 + $async.Future<$0.PsbtGetRecipientsResponse> psbtGetRecipients_Pre($grpc.ServiceCall call, $async.Future<$0.PsbtGetRecipientsRequest> request) async {
297 + return psbtGetRecipients(call, await request);
298 + }
299 +
300 + $async.Future<$0.PsbtResponse> psbtSign_Pre($grpc.ServiceCall call, $async.Future<$0.PsbtSignRequest> request) async {
301 + return psbtSign(call, await request);
302 + }
303 +
304 + $async.Future<$0.PsbtResponse> psbtSignNonMweb_Pre($grpc.ServiceCall call, $async.Future<$0.PsbtSignNonMwebRequest> request) async {
305 + return psbtSignNonMweb(call, await request);
306 + }
307 +
308 + $async.Future<$0.CreateResponse> psbtExtract_Pre($grpc.ServiceCall call, $async.Future<$0.PsbtExtractRequest> request) async {
309 + return psbtExtract(call, await request);
310 + }
311 +
312 + $async.Future<$0.LedgerApdu> ledgerExchange_Pre($grpc.ServiceCall call, $async.Future<$0.LedgerApdu> request) async {
313 + return ledgerExchange(call, await request);
314 + }
315 +
316 $async.Future<$0.BroadcastResponse> broadcast_Pre($grpc.ServiceCall call, $async.Future<$0.BroadcastRequest> request) async {
317 return broadcast(call, await request);
318 }
319
320 + $async.Future<$0.CoinswapResponse> coinswap_Pre($grpc.ServiceCall call, $async.Future<$0.CoinswapRequest> request) async {
321 + return coinswap(call, await request);
322 + }
323 +
324 $async.Future<$0.StatusResponse> status($grpc.ServiceCall call, $0.StatusRequest request);
325 $async.Stream<$0.Utxo> utxos($grpc.ServiceCall call, $0.UtxosRequest request);
326 $async.Future<$0.AddressResponse> addresses($grpc.ServiceCall call, $0.AddressRequest request);
327 $async.Future<$0.SpentResponse> spent($grpc.ServiceCall call, $0.SpentRequest request);
328 $async.Future<$0.CreateResponse> create($grpc.ServiceCall call, $0.CreateRequest request);
329 + $async.Future<$0.PsbtResponse> psbtCreate($grpc.ServiceCall call, $0.PsbtCreateRequest request);
330 + $async.Future<$0.PsbtResponse> psbtAddInput($grpc.ServiceCall call, $0.PsbtAddInputRequest request);
331 + $async.Future<$0.PsbtResponse> psbtAddRecipient($grpc.ServiceCall call, $0.PsbtAddRecipientRequest request);
332 + $async.Future<$0.PsbtGetRecipientsResponse> psbtGetRecipients($grpc.ServiceCall call, $0.PsbtGetRecipientsRequest request);
333 + $async.Future<$0.PsbtResponse> psbtSign($grpc.ServiceCall call, $0.PsbtSignRequest request);
334 + $async.Future<$0.PsbtResponse> psbtSignNonMweb($grpc.ServiceCall call, $0.PsbtSignNonMwebRequest request);
335 + $async.Future<$0.CreateResponse> psbtExtract($grpc.ServiceCall call, $0.PsbtExtractRequest request);
336 + $async.Future<$0.LedgerApdu> ledgerExchange($grpc.ServiceCall call, $0.LedgerApdu request);
337 $async.Future<$0.BroadcastResponse> broadcast($grpc.ServiceCall call, $0.BroadcastRequest request);
159 -}
338 + $async.Future<$0.CoinswapResponse> coinswap($grpc.ServiceCall call, $0.CoinswapRequest request);
339 +}
\ No newline at end of file
cw_mweb/lib/print_verbose.dart new
+107
@@ -0,0 +1,107 @@
1 +import 'dart:io';
2 +import 'dart:math';
3 +import 'package:flutter/foundation.dart';
4 +
5 +enum LogLevel { info, debug, warn, error }
6 +
7 +/// Pass an optional [file] to also write the log to a file.
8 +void printV(
9 + dynamic content, {
10 + String? file,
11 + LogLevel level = LogLevel.info,
12 +}) {
13 + final programInfo = CustomTrace(StackTrace.current);
14 + final logLine =
15 + "[${level.name.toUpperCase()}] ${programInfo.fileName}#${programInfo.lineNumber}:${programInfo.columnNumber} ${programInfo.callerFunctionName}: $content";
16 +
17 + print(logLine);
18 +
19 + if (file != null) {
20 + final logFile = File(file);
21 + if (!logFile.existsSync()) {
22 + logFile.createSync(recursive: true);
23 + }
24 + logFile.writeAsStringSync("$logLine\n", mode: FileMode.append, flush: true);
25 + }
26 +}
27 +
28 +// https://stackoverflow.com/a/59386101
29 +
30 +class CustomTrace {
31 + final StackTrace _trace;
32 +
33 + String? fileName;
34 + String? functionName;
35 + String? callerFunctionName;
36 + int? lineNumber;
37 + int? columnNumber;
38 +
39 + CustomTrace(this._trace) {
40 + try {
41 + _parseTrace();
42 + } catch (e) {
43 + if (kDebugMode) print("Unable to parse trace (printV): $e");
44 + }
45 + }
46 +
47 + String _getFunctionNameFromFrame(String frame) {
48 + /* Just giving another nickname to the frame */
49 + var currentTrace = frame;
50 + /* To get rid off the #number thing, get the index of the first whitespace */
51 + var indexOfWhiteSpace = currentTrace.indexOf(' ');
52 +
53 + /* Create a substring from the first whitespace index till the end of the string */
54 + var subStr = currentTrace.substring(max(0, indexOfWhiteSpace));
55 +
56 + /* Grab the function name using reg expr */
57 + var indexOfFunction = subStr.indexOf(RegExp(r'[A-Za-z0-9_]'));
58 +
59 + /* Create a new substring from the function name index till the end of string */
60 + subStr = subStr.substring(indexOfFunction);
61 +
62 + indexOfWhiteSpace = subStr.indexOf(RegExp(r'[ .]'));
63 +
64 + /* Create a new substring from start to the first index of a whitespace. This substring gives us the function name */
65 + subStr = subStr.substring(0, max(0, indexOfWhiteSpace));
66 +
67 + return subStr;
68 + }
69 +
70 + void _parseTrace() {
71 + /* The trace comes with multiple lines of strings, (each line is also known as a frame), so split the trace's string by lines to get all the frames */
72 + var frames = this._trace.toString().split("\n");
73 +
74 + /* The first frame is the current function */
75 + this.functionName = _getFunctionNameFromFrame(frames[0]);
76 +
77 + /* The second frame is the caller function */
78 + this.callerFunctionName = _getFunctionNameFromFrame(frames[1]);
79 +
80 + /* The first frame has all the information we need */
81 + var traceString = frames[1];
82 +
83 + /* Search through the string and find the index of the file name by looking for the '.dart' regex */
84 + var indexOfFileName = traceString.indexOf(
85 + RegExp(r'[/A-Za-z_]+.dart'), 1); // 1 to offest and not print the printV function name
86 +
87 + var fileInfo = traceString.substring(max(0, indexOfFileName));
88 +
89 + var listOfInfos = fileInfo.split(":");
90 +
91 + /* Splitting fileInfo by the character ":" separates the file name, the line number and the column counter nicely.
92 + Example: main.dart:5:12
93 + To get the file name, we split with ":" and get the first index
94 + To get the line number, we would have to get the second index
95 + To get the column number, we would have to get the third index
96 + */
97 + try {
98 + this.fileName = listOfInfos[0];
99 + this.lineNumber = int.tryParse(listOfInfos[1]);
100 + var columnStr = listOfInfos[2];
101 + columnStr = columnStr.replaceFirst(")", "");
102 + this.columnNumber = int.tryParse(columnStr);
103 + } catch (e) {
104 + if (kDebugMode) print("Unable to parse trace (printV): $e");
105 + }
106 + }
107 +}
cw_mweb/pubspec.yaml
-2
@@ -13,8 +13,6 @@ dependencies:
13 grpc: 4.0.1
14 path_provider: ^2.1.2
15 plugin_platform_interface: ^2.0.2
16 - cw_core:
17 - path: ../cw_core
16 ffi: ^2.1.0
17
18 dev_dependencies:
lib/bitcoin/cw_bitcoin.dart
+17
@@ -28,6 +28,22 @@ class CWBitcoin extends Bitcoin {
28 BitcoinWalletFromKeysCredentials(
29 name: name, password: password, xpub: xpub, hardwareWalletType: hardwareWalletType);
30
31 + @override
32 + WalletCredentials createLitecoinWalletFromKeys({
33 + required String name,
34 + required String password,
35 + required String xpub,
36 + required String scanSecret,
37 + required String spendPubkey,
38 + }) =>
39 + LitecoinWalletFromKeysCredentials(
40 + name: name,
41 + password: password,
42 + xpub: xpub,
43 + scanSecret: scanSecret,
44 + spendPubkey: spendPubkey,
45 + );
46 +
47 @override
48 WalletCredentials createBitcoinRestoreWalletFromWIFCredentials(
49 {required String name,
@@ -766,6 +782,7 @@ class CWBitcoin extends Bitcoin {
782
783 @override
784 Future<void> commitPsbtUR(Object wallet, List<String> urCodes) {
785 + if (wallet is LitecoinWallet) return wallet.commitPsbtUR(urCodes);
786 final _wallet = wallet as BitcoinWalletBase;
787 return _wallet.commitPsbtUR(urCodes);
788 }
lib/src/screens/restore/wallet_restore_from_keys_form.dart
+26
@@ -56,6 +56,12 @@ class WalletRestoreFromKeysFormState extends State<WalletRestoreFromKeysForm> {
56 spendKeyController = restoredWallet != null
57 ? TextEditingController(text: restoredWallet.spendKey)
58 : TextEditingController(),
59 + scanSecretController = restoredWallet != null
60 + ? TextEditingController(text: restoredWallet.scanSecret)
61 + : TextEditingController(),
62 + spendPubkeyController = restoredWallet != null
63 + ? TextEditingController(text: restoredWallet.spendPubkey)
64 + : TextEditingController(),
65 privateKeyController = restoredWallet != null
66 ? TextEditingController(text: restoredWallet.privateKey)
67 : TextEditingController(),
@@ -72,6 +78,8 @@ class WalletRestoreFromKeysFormState extends State<WalletRestoreFromKeysForm> {
78 final TextEditingController addressController;
79 final TextEditingController viewKeyController;
80 final TextEditingController spendKeyController;
81 + final TextEditingController scanSecretController;
82 + final TextEditingController spendPubkeyController;
83 final TextEditingController nameTextEditingController;
84 final TextEditingController privateKeyController;
85 final TextEditingController? passwordTextEditingController;
@@ -119,6 +127,8 @@ class WalletRestoreFromKeysFormState extends State<WalletRestoreFromKeysForm> {
127 viewKeyController.dispose();
128 privateKeyController.dispose();
129 spendKeyController.dispose();
130 + scanSecretController.dispose();
131 + spendPubkeyController.dispose();
132 passwordTextEditingController?.dispose();
133 if (passwordListener != null) {
134 passwordTextEditingController?.removeListener(passwordListener!);
@@ -257,6 +267,22 @@ class WalletRestoreFromKeysFormState extends State<WalletRestoreFromKeysForm> {
267 maxLines: null,
268 ),
269 ),
270 + Container(
271 + padding: EdgeInsets.only(top: 20.0),
272 + child: BaseTextFormField(
273 + controller: scanSecretController,
274 + hintText: "Scan secret",
275 + maxLines: null,
276 + ),
277 + ),
278 + Container(
279 + padding: EdgeInsets.only(top: 20.0),
280 + child: BaseTextFormField(
281 + controller: spendPubkeyController,
282 + hintText: "Spend public key",
283 + maxLines: null,
284 + ),
285 + ),
286 if (widget.walletRestoreViewModel.hasBlockchainHeightSelector)
287 BlockchainHeightWidget(
288 key: blockchainHeightKey,
lib/src/screens/restore/wallet_restore_page.dart
+7 -2
@@ -222,8 +222,12 @@ class WalletRestorePage extends BasePage {
222 walletRestoreFromKeysFormKey.currentState!.addressController.text;
223 credentials['spendKey'] =
224 walletRestoreFromKeysFormKey.currentState!.spendKeyController.text;
225 + credentials['scanSecret'] =
226 + walletRestoreFromKeysFormKey.currentState!.scanSecretController.text;
227 + credentials['spendPubkey'] =
228 + walletRestoreFromKeysFormKey.currentState!.spendPubkeyController.text;
229 credentials['height'] =
226 - walletRestoreFromKeysFormKey.currentState!.blockchainHeightKey.currentState!.height;
230 + walletRestoreFromKeysFormKey.currentState!.blockchainHeightKey.currentState?.height;
231 }
232 }
233 }
@@ -517,7 +521,8 @@ class _WalletRestorePageBodyState extends State<_WalletRestorePageBody>
521 }
522 },
523 onViewKeyEntered: (bool entered) {
520 - if (widget.walletRestoreViewModel.onlyViewKeyRestore) {
524 + if (widget.walletRestoreViewModel.onlyViewKeyRestore ||
525 + walletRestoreViewModel.type == WalletType.litecoin) {
526 walletRestoreViewModel.isButtonEnabled = entered;
527 }
528 },
lib/view_model/restore/restore_wallet.dart
+10
@@ -13,6 +13,8 @@ class RestoredWallet {
13 this.txId,
14 this.spendKey,
15 this.viewKey,
16 + this.scanSecret,
17 + this.spendPubkey,
18 this.mnemonicSeed,
19 this.passphrase,
20 this.txAmount,
@@ -28,6 +30,8 @@ class RestoredWallet {
30 final String? txId;
31 final String? spendKey;
32 final String? viewKey;
33 + final String? scanSecret;
34 + final String? spendPubkey;
35 final String? mnemonicSeed;
36 final String? passphrase;
37 final String? txAmount;
@@ -48,9 +52,13 @@ class RestoredWallet {
52 } catch (e) {
53 // fine, we don't care, it is only for monero anyway
54 }
55 + if (json['ltub'] != null) {
56 + json['xpub'] = convertLtubToXpub(json['ltub'] as String);
57 + }
58 if (json['zpub'] != null) {
59 json['xpub'] = convertZpubToXpub(json['zpub'] as String);
60 }
61 + json['xpub'] = convertAnyToXpub(json['xpub'] as String);
62 json['view_key'] ??= json['xpub'];
63 final height = json['height'] as String?;
64 return RestoredWallet(
@@ -60,6 +68,8 @@ class RestoredWallet {
68 address: json['address'] as String?,
69 spendKey: json['spend_key'] as String?,
70 viewKey: json['view_key'] as String?,
71 + scanSecret: json['scan_secret'] as String?,
72 + spendPubkey: json['spend_pubkey'] as String?,
73 height: height != null ? int.tryParse(height) ?? 0 : 0,
74 privateKey: json['private_key'] as String?,
75 );
lib/view_model/wallet_restore_view_model.dart
+12 -1
@@ -56,9 +56,9 @@ abstract class WalletRestoreViewModelBase extends WalletCreationVM with Store {
56 case WalletType.arbitrum:
57 case WalletType.decred:
58 case WalletType.bitcoin:
59 + case WalletType.litecoin:
60 availableModes = [WalletRestoreMode.seed, WalletRestoreMode.keys];
61 break;
61 - case WalletType.litecoin:
62 case WalletType.bitcoinCash:
63 case WalletType.zano:
64 case WalletType.none:
@@ -238,6 +238,8 @@ abstract class WalletRestoreViewModelBase extends WalletCreationVM with Store {
238 if (mode == WalletRestoreMode.keys) {
239 final viewKey = options['viewKey'] as String?;
240 final spendKey = options['spendKey'] as String?;
241 + final scanSecret = options['scanSecret'] as String?;
242 + final spendPubkey = options['spendPubkey'] as String?;
243 final address = options['address'] as String?;
244
245 switch (type) {
@@ -249,6 +251,15 @@ abstract class WalletRestoreViewModelBase extends WalletCreationVM with Store {
251 hardwareWalletType: hardwareWalletType,
252 );
253
254 + case WalletType.litecoin:
255 + return bitcoin!.createLitecoinWalletFromKeys(
256 + name: name,
257 + password: password,
258 + xpub: viewKey!,
259 + scanSecret: scanSecret!,
260 + spendPubkey: spendPubkey!,
261 + );
262 +
263 case WalletType.monero:
264 return monero!.createMoneroRestoreWalletFromKeysCredentials(
265 name: name,
scripts/android/build_mwebd.sh
+1 -1
@@ -47,4 +47,4 @@ GOARCH=arm \
47 CC=${NDK_BIN}/armv7a-linux-androideabi21-clang \
48 go build -v -buildmode=c-shared -o ${ANDROID_OUT}/armeabi-v7a/libmweb.so .
49 cd ../
50 -dart run ffigen --config ffigen_config.yaml
50 +dart run ffigen --config ffigen_config.yaml
\ No newline at end of file
scripts/android/build_torch.sh
+1 -1
@@ -6,4 +6,4 @@ cd "$(dirname "$0")"
6
7 cd ../torch_dart
8
9 -./build.sh aarch64-linux-android armv7a-linux-androideabi x86_64-linux-android
\ No newline at end of file
9 +./build.sh aarch64-linux-android armv7a-linux-androideabi x86_64-linux-android
tool/configure.dart
+1
@@ -184,6 +184,7 @@ abstract class Bitcoin {
184 });
185 WalletCredentials createBitcoinRestoreWalletFromWIFCredentials({required String name, required String password, required String wif, WalletInfo? walletInfo});
186 WalletCredentials createBitcoinWalletFromKeys({required String name, required String password, required String xpub, HardwareWalletType? hardwareWalletType});
187 + WalletCredentials createLitecoinWalletFromKeys({required String name, required String password, required String xpub, required String scanSecret, required String spendPubkey});
188 WalletCredentials createBitcoinNewWalletCredentials({required String name, WalletInfo? walletInfo, String? password, String? passphrase, String? mnemonic});
189 WalletCredentials createBitcoinHardwareWalletCredentials({required String name, required HardwareAccountData accountData, WalletInfo? walletInfo});
190 List<String> getWordList();