Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
97 commits
Select commit Hold shift + click to select a range
470a8ac
init mwc
vekamo Oct 26, 2024
9d04e47
continuous integration mwc v2
vekamo Oct 27, 2024
68a6769
disable PingCheck
vekamo Oct 27, 2024
7537105
few fixes and remove mwc-wallet logs
vekamo Nov 12, 2024
0accfff
last fixes mwc and clean up
vekamo Nov 17, 2024
356c640
init mwc
vekamo Oct 26, 2024
652c141
continuous integration mwc v2
vekamo Oct 27, 2024
8610a72
disable PingCheck
vekamo Oct 27, 2024
1bd8efe
few fixes and remove mwc-wallet logs
vekamo Nov 12, 2024
adb6531
last fixes mwc and clean up
vekamo Nov 17, 2024
626efb7
rebase v2
vekamo Dec 15, 2024
ab525e8
tor enabled & minCoinbaseConfirms
vekamo Dec 15, 2024
e225b4c
submodule repo update
vekamo Dec 20, 2024
f05631a
receive slatepack ui
vekamo Dec 21, 2024
e60b360
aligment receive ui
vekamo Dec 21, 2024
1466110
send ui slatepack
vekamo Dec 21, 2024
041ce04
finalize ui slatepack
vekamo Dec 21, 2024
d8eb90d
fix: revert mwc db migration code
sneurlax Sep 3, 2025
62f111e
fix: revert mwc db migration code
sneurlax Sep 3, 2025
e6035e1
fix: ignore generating and updating the isar schema for this value
sneurlax Sep 3, 2025
ccfdb66
fix: revert mwc tx migration scaffolding
sneurlax Sep 3, 2025
3442aab
fix: revert legacy theme mwc changes
sneurlax Sep 3, 2025
aaba3cf
fix: deduplicate cases
sneurlax Sep 3, 2025
5bd8175
feat: latest flutter_libmwc
sneurlax Sep 3, 2025
052fd15
Merge remote-tracking branch 'origin/staging' into mwc
sneurlax Sep 3, 2025
1e356aa
feat: Merge branch 'mwc-integration' into mwc (WIP)
sneurlax Sep 3, 2025
05592cc
fix(epic): fix sqlite column name errors in database queries
sneurlax Sep 5, 2025
84073b6
fix(mwc): fix rust versions script
sneurlax Sep 4, 2025
c87506f
fix(mwc): initialize isMimblewimblecoin
sneurlax Sep 5, 2025
aac8a64
fix(mwc): resolve some merge conflicts (wip)
sneurlax Sep 4, 2025
7cbb227
fix(mwc): resolve some more merge conflicts (wip)
sneurlax Sep 4, 2025
b6e0796
fix(mwc): revert transaction details view changes
sneurlax Sep 5, 2025
574e24c
feat(mwc): MWCMQS, Slatepack txs. WIP UI
sneurlax Sep 12, 2025
0f367d2
fix(mwc): fix logic error and remove slatepack validation hack
sneurlax Sep 12, 2025
e47c838
chore: fix typo, replace debug print w log, add logging
sneurlax Sep 12, 2025
97bca34
chore: user friendly error msg
sneurlax Sep 12, 2025
4af4522
feat: MWCMQS config
sneurlax Sep 12, 2025
62e159a
fix: fix inverted mwc txs method toggle logic, allow address w slatep…
sneurlax Sep 12, 2025
305a257
fix: allow onion addresses for mwc
sneurlax Sep 12, 2025
c891afc
feat: collapse mwc slatepack service into mwc wallet
sneurlax Sep 12, 2025
00ae9a9
fix: remove unnecessary assertion
sneurlax Sep 12, 2025
7eb2561
fix: unify txs selected method
sneurlax Sep 12, 2025
0360146
fix: "Preview send" -> "Create slatepack"
sneurlax Sep 12, 2025
d5d6cf7
Merge remote-tracking branch 'origin/staging' into feat/mwc
julian-CStack Sep 16, 2025
cf9cecd
pubspec lock
julian-CStack Sep 16, 2025
eccd9b6
remove duplicate desktop receive qr create button
julian-CStack Sep 16, 2025
2f6d2a9
no need for extra string variables when there is an enum already...
julian-CStack Sep 16, 2025
3849f8a
fix scripts
julian-CStack Sep 16, 2025
acbce8a
fix: prevent UI crash on MWC error (hack)
sneurlax Sep 16, 2025
da33a5d
fix: prevent UI crash on MWC error with no hack
sneurlax Sep 16, 2025
7ef8320
fix slatepack/auto type toggle on desktop
julian-CStack Sep 16, 2025
e85accb
WIP partial refactor
julian-CStack Sep 16, 2025
8dec49d
fix(mwc): hide "Send to" field when Slatepack tx method selected
sneurlax Sep 16, 2025
c7cfe6b
clean up bad copy pasted code
julian-CStack Sep 16, 2025
6ce1841
add detail divider widget
julian-CStack Sep 17, 2025
a57a72c
add toString functions to mwc slate response objects
julian-CStack Sep 17, 2025
63b1ac7
desktop receive slatepack ui updates
julian-CStack Sep 17, 2025
382f6b5
desktop finalize slatepack ui updates and garbage clean up
julian-CStack Sep 17, 2025
4e96433
Merge remote-tracking branch 'origin/staging' into feat/mwc
julian-CStack Sep 17, 2025
faa7b70
fix cancelling progress dialog width on desktop
julian-CStack Sep 17, 2025
8a9816a
add border styling for desktop
julian-CStack Sep 17, 2025
23cbfb3
selectable message text
julian-CStack Sep 17, 2025
63509e6
refactor desktop send slate creation
julian-CStack Sep 17, 2025
16afdfc
fix ok dialog width on desktop
julian-CStack Sep 17, 2025
8ea3e6c
clean up slatepack dialog a bit
julian-CStack Sep 17, 2025
5efc4e9
WIP starting mobile mwc...
julian-CStack Sep 17, 2025
31184a2
fix my refactoring mistake
julian-CStack Sep 17, 2025
0b80d51
fix missing android mwc build calls
julian-CStack Sep 18, 2025
69ac018
mwc send view tweaks
julian-CStack Sep 18, 2025
c26fe0d
rename file appropriately
julian-CStack Sep 18, 2025
480619c
remove unused functions
julian-CStack Sep 18, 2025
408fac3
validateAddress is reserved for spending to. A slatepack cannot be sp…
julian-CStack Sep 18, 2025
33961b6
MWC does not do http sends
julian-CStack Sep 18, 2025
ae89d1f
share finalize view base with desktop
julian-CStack Sep 18, 2025
2004da1
fix hidden slate id on tx details view when cancel button is visible
julian-CStack Sep 18, 2025
cc581fc
update mwc lib
julian-CStack Sep 18, 2025
c3ed449
fix address validation
julian-CStack Sep 18, 2025
fa45fcb
fix ref access issue
julian-CStack Sep 18, 2025
45e677f
mobile slatepack creation
julian-CStack Sep 19, 2025
084a622
update libmwc
julian-CStack Sep 19, 2025
88add78
dart format
julian-CStack Sep 19, 2025
cdcdafe
bare minimum but functional slatepack ui in both desktop and mobile UIs
julian-CStack Sep 19, 2025
f4e5e81
update libmwc
julian-CStack Sep 19, 2025
71d937b
fix(mwc): update flutter_libmwc macOS deployment target to 10.14
sneurlax Sep 22, 2025
12a895c
fix: textfield hint text
julian-CStack Sep 22, 2025
f10021d
use minimal libmwc changes branch
julian-CStack Sep 22, 2025
eaf3af9
clean up import receive mwc slatepack info dialog
julian-CStack Sep 22, 2025
905031c
clean up import receive mwc slatepack response dialog
julian-CStack Sep 22, 2025
691cb6f
Merge remote-tracking branch 'origin/feat/mwc' into feat/mwc
julian-CStack Sep 22, 2025
072f6ae
fix(mwc): post (broadcast) finalized tx
sneurlax Sep 23, 2025
6bc4734
disable mwc on macos
julian-CStack Sep 23, 2025
9dcb9ca
update libmwc with openWallet error checking
julian-CStack Sep 24, 2025
62c28ca
clear finalize field on success
julian-CStack Sep 24, 2025
8930f37
mwc ui tweaks
julian-CStack Sep 24, 2025
515ca7c
chore: silence print
sneurlax Sep 24, 2025
ccbab5b
chore(mwc): ndk 27b->28
sneurlax Sep 25, 2025
1a7c801
fix(mwc): silence seed/mnemonic print
sneurlax Oct 1, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,6 @@
[submodule "crypto_plugins/frostdart"]
path = crypto_plugins/frostdart
url = https://github.com/cypherstack/frostdart
[submodule "crypto_plugins/flutter_libmwc"]
path = crypto_plugins/flutter_libmwc
url = https://github.com/cypherstack/flutter_libmwc
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ Highlights include:
- [Bitcoin Cash](https://bch.info/en/)
- [Dogecoin](https://dogecoin.com/)
- [Epic Cash](https://linktr.ee/epiccash)
- [MimbleWimbleCoin](https://mwc.mw)
- [Ethereum](https://ethereum.org/en/)
- [Firo](https://firo.org/)
- [Litecoin](https://litecoin.org/)
Expand Down
1 change: 1 addition & 0 deletions crypto_plugins/flutter_libmwc
Submodule flutter_libmwc added at a692b7
3 changes: 3 additions & 0 deletions lib/app_config.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
// ignore: unused_import
import 'dart:io';

import 'wallets/crypto_currency/crypto_currency.dart';
import 'wallets/crypto_currency/intermediate/frost_currency.dart';

Expand Down
74 changes: 74 additions & 0 deletions lib/models/isar/models/blockchain_data/v2/transaction_v2.dart
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,11 @@ class TransactionV2 {

bool get isEpiccashTransaction =>
_getFromOtherData(key: TxV2OdKeys.isEpiccashTransaction) == true;

@ignore
bool get isMimblewimblecoinTransaction =>
_getFromOtherData(key: TxV2OdKeys.isMimblewimblecoinTransaction) == true;

int? get numberOfMessages =>
_getFromOtherData(key: TxV2OdKeys.numberOfMessages) as int?;
String? get slateId => _getFromOtherData(key: TxV2OdKeys.slateId) as String?;
Expand Down Expand Up @@ -292,6 +297,74 @@ class TransactionV2 {
}
}

if (isMimblewimblecoinTransaction) {
if (slateId == null) {
return "Restored Funds";
}

if (isCancelled) {
return "Cancelled";
} else if (type == TransactionType.incoming) {
if (isConfirmed(currentChainHeight, minConfirms, minCoinbaseConfirms)) {
return "Received";
} else {
if (numberOfMessages == 1) {
return "Receiving (waiting for sender)";
} else if ((numberOfMessages ?? 0) > 1) {
return "Receiving (waiting for confirmations)"; // TODO test if the sender still has to open again after the receiver has 2 messages present, ie. sender->receiver->sender->node (yes) vs. sender->receiver->node (no)
} else {
return "Receiving ${prettyConfirms()}";
}
}
} else if (type == TransactionType.outgoing) {
if (isConfirmed(currentChainHeight, minConfirms, minCoinbaseConfirms)) {
return "Sent (confirmed)";
} else {
if (numberOfMessages == 1) {
return "Sending (waiting for receiver)";
} else if ((numberOfMessages ?? 0) > 1) {
return "Sending (waiting for confirmations)";
} else {
return "Sending ${prettyConfirms()}";
}
}
}
}

if (isMimblewimblecoinTransaction) {
if (slateId == null) {
return "Restored Funds";
}

if (isCancelled) {
return "Cancelled";
} else if (type == TransactionType.incoming) {
if (isConfirmed(currentChainHeight, minConfirms, minCoinbaseConfirms)) {
return "Received";
} else {
if (numberOfMessages == 1) {
return "Receiving (waiting for sender)";
} else if ((numberOfMessages ?? 0) > 1) {
return "Receiving (waiting for confirmations)"; // TODO test if the sender still has to open again after the receiver has 2 messages present, ie. sender->receiver->sender->node (yes) vs. sender->receiver->node (no)
} else {
return "Receiving ${prettyConfirms()}";
}
}
} else if (type == TransactionType.outgoing) {
if (isConfirmed(currentChainHeight, minConfirms, minCoinbaseConfirms)) {
return "Sent (confirmed)";
} else {
if (numberOfMessages == 1) {
return "Sending (waiting for receiver)";
} else if ((numberOfMessages ?? 0) > 1) {
return "Sending (waiting for confirmations)";
} else {
return "Sending ${prettyConfirms()}";
}
}
}
}

if (type == TransactionType.incoming) {
// if (_transaction.isMinting) {
// return "Minting";
Expand Down Expand Up @@ -356,6 +429,7 @@ abstract final class TxV2OdKeys {
static const size = "size";
static const vSize = "vSize";
static const isEpiccashTransaction = "isEpiccashTransaction";
static const isMimblewimblecoinTransaction = "isMimblewimblecoinTransaction";
static const numberOfMessages = "numberOfMessages";
static const slateId = "slateId";
static const onChainNote = "onChainNote";
Expand Down
1 change: 1 addition & 0 deletions lib/models/isar/stack_theme.dart
Original file line number Diff line number Diff line change
Expand Up @@ -1943,6 +1943,7 @@ class ThemeAssets implements IThemeAssets {
late final String wownero;
late final String namecoin;
late final String particl;
late final String mimblewimblecoin;
late final String bitcoinImage;
late final String bitcoincashImage;
late final String dogecoinImage;
Expand Down
116 changes: 116 additions & 0 deletions lib/models/mwc_slatepack_models.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
class SlatepackResult {
final bool success;
final String? error;
final String? slatepack;
final String? slateJson;
final bool? wasEncrypted;
final String? recipientAddress;

SlatepackResult({
required this.success,
this.error,
this.slatepack,
this.slateJson,
this.wasEncrypted,
this.recipientAddress,
});

@override
String toString() {
return "SlatepackResult("
"success: $success, "
"error: $error, "
"slatepack: $slatepack, "
"slateJson: $slateJson, "
"wasEncrypted: $wasEncrypted, "
"recipientAddress: $recipientAddress"
")";
}
}

class SlatepackDecodeResult {
final bool success;
final String? error;
final String? slateJson;
final bool? wasEncrypted;
final String? senderAddress;
final String? recipientAddress;

SlatepackDecodeResult({
required this.success,
this.error,
this.slateJson,
this.wasEncrypted,
this.senderAddress,
this.recipientAddress,
});

@override
String toString() {
return "SlatepackDecodeResult("
"success: $success, "
"error: $error, "
"slateJson: $slateJson, "
"wasEncrypted: $wasEncrypted, "
"senderAddress: $senderAddress, "
"recipientAddress: $recipientAddress"
")";
}
}

class ReceiveResult {
final bool success;
final String? error;
final String? slateId;
final String? commitId;
final String? responseSlatepack;
final bool? wasEncrypted;
final String? recipientAddress;

ReceiveResult({
required this.success,
this.error,
this.slateId,
this.commitId,
this.responseSlatepack,
this.wasEncrypted,
this.recipientAddress,
});

@override
String toString() {
return "ReceiveResult("
"success: $success, "
"error: $error, "
"slateId: $slateId, "
"commitId: $commitId, "
"responseSlatepack: $responseSlatepack, "
"wasEncrypted: $wasEncrypted, "
"recipientAddress: $recipientAddress"
")";
}
}

class FinalizeResult {
final bool success;
final String? error;
final String? slateId;
final String? commitId;

FinalizeResult({
required this.success,
this.error,
this.slateId,
this.commitId,
});

@override
String toString() {
return "FinalizeResult("
"success: $success, "
"error: $error, "
"slateId: $slateId, "
"commitId: $commitId"
")";
}
}
89 changes: 89 additions & 0 deletions lib/models/mwcmqs_config_model.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
/*
* This file is part of Stack Wallet.
*
* Copyright (c) 2023 Cypher Stack
* All Rights Reserved.
* The code is distributed under GPLv3 license, see LICENSE file for details.
* Generated by Cypher Stack on 2023-05-26
*
*/

import 'dart:convert';

import 'package:hive/hive.dart';

import 'mwcmqs_server_model.dart';

part 'type_adaptors/mwcmqs_config_model.g.dart';

@HiveType(typeId: 82)
class MwcMqsConfigModel {
@HiveField(1)
final String host;
@HiveField(2)
final int? port;

MwcMqsConfigModel({
required this.host,
this.port
});

MwcMqsConfigModel copyWith({
int? port,
bool? protocolInsecure,
}) {
return MwcMqsConfigModel(
host: host,
port: this.port ?? 443,
);
}

Map<String, dynamic> toMap() {
final Map<String, dynamic> map = {};
map['mwcmqs_domain'] = host;
map['mwcmqs_port'] = port;
return map;
}

Map<String, dynamic> toJson() {
return {
'mwcmqs_domain': host,
'mwcmqs_port': port,
};
}

@override
String toString() {
return json.encode(toJson());
}

static MwcMqsConfigModel fromString(String MwcMqsConfigString) {
final dynamic _mwcmqs = json.decode(MwcMqsConfigString);

final oldDomain = _mwcmqs["domain"] ?? "empty";
if (oldDomain != "empty") {
_mwcmqs['mwcmqs_domain'] = _mwcmqs['domain'];
}
final oldPort = _mwcmqs["port"] ?? "empty";
if (oldPort != "empty") {
_mwcmqs['mwcmqs_port'] = _mwcmqs['port'];
}


return MwcMqsConfigModel(
host: _mwcmqs['mwcmqs_domain'] as String,
port: _mwcmqs['mwcmqs_port'] as int
);
}

static MwcMqsConfigModel fromServer(
MwcMqsServerModel server, {
bool? protocolInsecure,
int? addressIndex,
}) {
return MwcMqsConfigModel(
host: server.host,
port: server.port ?? 443
);
}
}
Loading
Loading