Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Cw 453 #1306

Merged
merged 103 commits into from
May 29, 2024
Merged

Cw 453 #1306

Show file tree
Hide file tree
Changes from 95 commits
Commits
Show all changes
103 commits
Select commit Hold shift + click to select a range
6b795b5
feat: rebase btc-addr-types, migrate to bitcoin_base
rafael-xmr Feb 26, 2024
2cbf1dc
feat: allow scanning elect-rs using get_tweaks
rafael-xmr Feb 26, 2024
3c88146
feat: scanning and adding addresses working with getTweaks, add btc S…
rafael-xmr Feb 27, 2024
a5bc338
chore: pubspec.lock
rafael-xmr Feb 27, 2024
2967809
chore: pubspec.lock
rafael-xmr Feb 27, 2024
a44bd6b
fix: scan when switching, fix multiple unspents in same tx
rafael-xmr Feb 27, 2024
477aff0
fix: initial scan
rafael-xmr Feb 28, 2024
f58fca3
fix: initial scan
rafael-xmr Feb 28, 2024
c5bd0d2
Merge remote-tracking branch 'origin/main' into CW-453-silent-payments
rafael-xmr Feb 28, 2024
0016d43
fix: scanning issues
rafael-xmr Feb 28, 2024
18697fb
fix: sync, storing silent unspents
rafael-xmr Mar 1, 2024
9faba04
Merge remote-tracking branch 'origin/main' into CW-453-silent-payments
rafael-xmr Mar 1, 2024
2db156e
chore: deps
rafael-xmr Mar 1, 2024
23a3683
fix: label issues, clear spent utxo
rafael-xmr Mar 5, 2024
1d8ca1d
Merge remote-tracking branch 'origin/main' into CW-453-silent-payment…
rafael-xmr Mar 5, 2024
0832e21
chore: deps
rafael-xmr Mar 5, 2024
e8abd86
fix: build
rafael-xmr Mar 5, 2024
4308e3e
fix: missing types
rafael-xmr Mar 5, 2024
dd532b4
feat: new electrs API & changes, fixes for last block scanning
rafael-xmr Mar 11, 2024
ce864d1
Merge remote-tracking branch 'origin/main' into CW-453-silent-payments
rafael-xmr Mar 11, 2024
7197a7b
Merge remote-tracking branch 'origin/main' into CW-453-silent-payments
rafael-xmr Apr 1, 2024
8ed3e41
feat: Scan Silent Payments homepage toggle
rafael-xmr Apr 1, 2024
d6de17c
chore: build configure
rafael-xmr Apr 1, 2024
226c47c
feat: generic fixes, testnet UI improvements, useSSL on bitcoin nodes
rafael-xmr Apr 5, 2024
b47b1d5
Merge remote-tracking branch 'origin/main' into CW-453-silent-payments
rafael-xmr Apr 5, 2024
2b23ab1
fix: invalid Object in sendData
rafael-xmr Apr 5, 2024
dd803ed
Merge remote-tracking branch 'origin/main' into CW-453-silent-payments
rafael-xmr Apr 8, 2024
487be52
feat: improve addresses page & address book displays
rafael-xmr Apr 8, 2024
36c6436
feat: silent payments labeled addresses disclaimer
rafael-xmr Apr 8, 2024
6ee57a7
fix: missing i18n
rafael-xmr Apr 8, 2024
058ff6a
chore: print
rafael-xmr Apr 9, 2024
8ea2e6e
feat: single block scan, rescan by date working for btc mainnet
rafael-xmr Apr 9, 2024
ddbb63a
feat: new cake features page replace market page, move sp scan toggle…
rafael-xmr Apr 9, 2024
fa5effd
feat: delete silent addresses
rafael-xmr Apr 9, 2024
0777db8
fix: red dot in non ssl nodes
rafael-xmr Apr 9, 2024
65d6a89
fix: inconsistent connection states, fix tx history
rafael-xmr Apr 9, 2024
465c7ef
fix: tx & balance displays, cpfp sending
rafael-xmr Apr 10, 2024
a4f8cdf
feat: new rust lib
rafael-xmr Apr 12, 2024
551c457
Merge remote-tracking branch 'origin/main' into CW-453-silent-payments
rafael-xmr Apr 12, 2024
7f792fc
chore: node path
rafael-xmr Apr 12, 2024
2df4a17
fix: check node based on network
rafael-xmr Apr 12, 2024
2b42b55
fix: missing txcount from addresses
rafael-xmr Apr 12, 2024
021347a
style: padding in feature page cards
rafael-xmr Apr 12, 2024
23d6221
fix: restore not getting all wallet addresses by type
rafael-xmr Apr 12, 2024
615db5a
fix: auto switch node broken
rafael-xmr Apr 12, 2024
a887ea7
fix: silent payment txs not being restored
rafael-xmr Apr 15, 2024
e4156ba
feat: change scanning to subscription model, sync improvements
rafael-xmr Apr 17, 2024
53fe2b0
Merge remote-tracking branch 'origin/main' into CW-453-silent-payments
rafael-xmr Apr 17, 2024
eb64a75
fix: scan re-subscription
rafael-xmr Apr 18, 2024
5b3128f
fix: default nodes
rafael-xmr Apr 18, 2024
ca81d44
fix: improve scanning by date, fix single block scan
rafael-xmr Apr 18, 2024
67256d3
refactor: common function for input tx selection
rafael-xmr Apr 18, 2024
39845d6
fix: nodes & build
rafael-xmr Apr 22, 2024
4a7d8ca
fix: send all with multiple outs
rafael-xmr Apr 30, 2024
0a57de0
Merge remote-tracking branch 'origin/main' into CW-453-silent-payments
rafael-xmr May 6, 2024
242e92b
Merge remote-tracking branch 'origin/main' into CW-453-silent-payments
rafael-xmr May 6, 2024
d49b1be
Merge remote-tracking branch 'origin/CW-453-silent-payments' into CW-…
rafael-xmr May 6, 2024
781cbc2
refactor: unchanged file
rafael-xmr May 6, 2024
657e9ac
Merge remote-tracking branch 'origin/main' into CW-453-silent-payments
rafael-xmr May 6, 2024
69dd7a5
Update pr_test_build.yml
OmarHatem28 May 8, 2024
15ca7d6
chore: upgrade
rafael-xmr May 8, 2024
05a23a9
Merge remote-tracking branch 'origin/main' into CW-453-silent-payments
rafael-xmr May 8, 2024
1ebd19f
chore: merge changes
rafael-xmr May 8, 2024
61d7051
Merge remote-tracking branch 'origin/CW-453-silent-payments' into CW-…
rafael-xmr May 8, 2024
f090d09
refactor: unchanged files [skip ci]
rafael-xmr May 8, 2024
b7c942a
Merge remote-tracking branch 'origin/main' into CW-453-silent-payments
rafael-xmr May 9, 2024
8e5d997
fix: scan fixes, add date, allow sending while scanning
rafael-xmr May 9, 2024
8b5ab79
Merge remote-tracking branch 'origin/main' into CW-453-silent-payments
rafael-xmr May 9, 2024
e72ed49
feat: sync fixes, sp settings
rafael-xmr May 10, 2024
4ac357f
Merge remote-tracking branch 'origin/main' into CW-453-silent-payments
rafael-xmr May 10, 2024
3c041ee
feat: fix resyncing
rafael-xmr May 11, 2024
e1acef2
fix: date from height logic, status disconnected & chain tip get
rafael-xmr May 14, 2024
ec6225b
fix: params
rafael-xmr May 14, 2024
2c9558d
Merge remote-tracking branch 'origin/main' into CW-453-silent-payments
rafael-xmr May 14, 2024
8f8ee34
Merge branch 'main' of https://github.com/cake-tech/cake_wallet into …
OmarHatem28 May 14, 2024
290bdf3
feat: electrum migration if using cake electrum
rafael-xmr May 14, 2024
20b0f24
Merge remote-tracking branch 'origin/CW-453-silent-payments' into CW-…
rafael-xmr May 14, 2024
78a6015
fix nodes
OmarHatem28 May 14, 2024
7783875
Merge branch 'main' of https://github.com/cake-tech/cake_wallet into …
OmarHatem28 May 14, 2024
081de3f
re-enable tron
OmarHatem28 May 15, 2024
f61e9b2
update sp_scanner to work on iOS [skip ci]
OmarHatem28 May 15, 2024
015bb1f
fix: wrong socket for old electrum nodes
rafael-xmr May 16, 2024
57e7314
Fix unchecked wallet type call
OmarHatem28 May 18, 2024
6eb8f35
Merge branch 'main' into CW-453-silent-payments
OmarHatem28 May 18, 2024
00ceb93
fix: double balance
rafael-xmr May 22, 2024
932161a
feat: node domain
rafael-xmr May 22, 2024
dc86968
Merge remote-tracking branch 'origin/main' into CW-453-silent-payments
rafael-xmr May 22, 2024
d230904
fix: menu name
rafael-xmr May 23, 2024
bcb2240
Merge branch 'main' of https://github.com/cake-tech/cake_wallet into …
OmarHatem28 May 23, 2024
fb3c816
fix: update tip on set scanning
rafael-xmr May 24, 2024
da59860
fix: connection switching back and forth
rafael-xmr May 24, 2024
cfa4515
feat: check if node is electrs, and supports sp
rafael-xmr May 24, 2024
7650393
chore: fix build
rafael-xmr May 24, 2024
c71318c
Merge remote-tracking branch 'origin/CW-453-silent-payments' into CW-…
OmarHatem28 May 25, 2024
c4b4d4e
minor enhancements
OmarHatem28 May 25, 2024
ce2a9cd
fixes and enhancements
OmarHatem28 May 28, 2024
6d7ba21
Merge branch 'main' of https://github.com/cake-tech/cake_wallet into …
OmarHatem28 May 28, 2024
aee365c
solve conflicts with main
OmarHatem28 May 28, 2024
802935d
fix: status toggle
rafael-xmr May 28, 2024
1786474
Merge branch 'main' of https://github.com/cake-tech/cake_wallet into …
OmarHatem28 May 28, 2024
bac9093
minor enhancement
OmarHatem28 May 28, 2024
17eddde
Monero.com fixes
OmarHatem28 May 29, 2024
fb6be41
update sp_scanner to include windows and linux
OmarHatem28 May 29, 2024
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
2 changes: 1 addition & 1 deletion .github/workflows/pr_test_build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ jobs:
- name: Flutter action
uses: subosito/flutter-action@v1
with:
flutter-version: "3.19.5"
flutter-version: "3.19.6"
channel: stable

- name: Install package dependencies
Expand Down
65 changes: 65 additions & 0 deletions assets/images/cards.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/images/tbtc.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
5 changes: 2 additions & 3 deletions assets/text/Release_Notes.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,2 @@
Add Tron wallet
Hardware wallets enhancements
Bug fixes
Bitcoin Silent Payments
Bug fixes and generic enhancements
132 changes: 102 additions & 30 deletions cw_bitcoin/lib/bitcoin_address_record.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ import 'dart:convert';
import 'package:bitcoin_base/bitcoin_base.dart';
import 'package:cw_bitcoin/script_hash.dart' as sh;

class BitcoinAddressRecord {
BitcoinAddressRecord(
abstract class BaseBitcoinAddressRecord {
BaseBitcoinAddressRecord(
this.address, {
required this.index,
this.isHidden = false,
Expand All @@ -13,36 +13,14 @@ class BitcoinAddressRecord {
String name = '',
bool isUsed = false,
required this.type,
String? scriptHash,
required this.network,
}) : _txCount = txCount,
_balance = balance,
_name = name,
_isUsed = isUsed,
scriptHash = scriptHash ?? sh.scriptHash(address, network: network);

factory BitcoinAddressRecord.fromJSON(String jsonSource, BasedUtxoNetwork network) {
final decoded = json.decode(jsonSource) as Map;

return BitcoinAddressRecord(
decoded['address'] as String,
index: decoded['index'] as int,
isHidden: decoded['isHidden'] as bool? ?? false,
isUsed: decoded['isUsed'] as bool? ?? false,
txCount: decoded['txCount'] as int? ?? 0,
name: decoded['name'] as String? ?? '',
balance: decoded['balance'] as int? ?? 0,
type: decoded['type'] != null && decoded['type'] != ''
? BitcoinAddressType.values
.firstWhere((type) => type.toString() == decoded['type'] as String)
: SegwitAddresType.p2wpkh,
scriptHash: decoded['scriptHash'] as String?,
network: network,
);
}
_isUsed = isUsed;

@override
bool operator ==(Object o) => o is BitcoinAddressRecord && address == o.address;
bool operator ==(Object o) => o is BaseBitcoinAddressRecord && address == o.address;

final String address;
bool isHidden;
Expand All @@ -51,8 +29,7 @@ class BitcoinAddressRecord {
int _balance;
String _name;
bool _isUsed;
String? scriptHash;
BasedUtxoNetwork network;
BasedUtxoNetwork? network;

int get txCount => _txCount;

Expand All @@ -69,16 +46,57 @@ class BitcoinAddressRecord {
void setAsUsed() => _isUsed = true;
void setNewName(String label) => _name = label;

@override
int get hashCode => address.hashCode;

BitcoinAddressType type;

String updateScriptHash(BasedUtxoNetwork network) {
String toJSON();
}

class BitcoinAddressRecord extends BaseBitcoinAddressRecord {
BitcoinAddressRecord(
super.address, {
required super.index,
super.isHidden = false,
super.txCount = 0,
super.balance = 0,
super.name = '',
super.isUsed = false,
required super.type,
String? scriptHash,
required super.network,
}) : scriptHash =
scriptHash ?? (network != null ? sh.scriptHash(address, network: network) : null);

factory BitcoinAddressRecord.fromJSON(String jsonSource, {BasedUtxoNetwork? network}) {
final decoded = json.decode(jsonSource) as Map;

return BitcoinAddressRecord(
decoded['address'] as String,
index: decoded['index'] as int,
isHidden: decoded['isHidden'] as bool? ?? false,
isUsed: decoded['isUsed'] as bool? ?? false,
txCount: decoded['txCount'] as int? ?? 0,
name: decoded['name'] as String? ?? '',
balance: decoded['balance'] as int? ?? 0,
type: decoded['type'] != null && decoded['type'] != ''
? BitcoinAddressType.values
.firstWhere((type) => type.toString() == decoded['type'] as String)
: SegwitAddresType.p2wpkh,
scriptHash: decoded['scriptHash'] as String?,
network: network,
);
}

String? scriptHash;

String getScriptHash(BasedUtxoNetwork network) {
if (scriptHash != null) return scriptHash!;
scriptHash = sh.scriptHash(address, network: network);
return scriptHash!;
}

@override
String toJSON() => json.encode({
'address': address,
'index': index,
Expand All @@ -91,3 +109,57 @@ class BitcoinAddressRecord {
'scriptHash': scriptHash,
});
}

class BitcoinSilentPaymentAddressRecord extends BaseBitcoinAddressRecord {
BitcoinSilentPaymentAddressRecord(
super.address, {
required super.index,
super.isHidden = false,
super.txCount = 0,
super.balance = 0,
super.name = '',
super.isUsed = false,
required this.silentPaymentTweak,
required super.network,
required super.type,
}) : super();

factory BitcoinSilentPaymentAddressRecord.fromJSON(String jsonSource,
{BasedUtxoNetwork? network}) {
final decoded = json.decode(jsonSource) as Map;

return BitcoinSilentPaymentAddressRecord(
decoded['address'] as String,
index: decoded['index'] as int,
isHidden: decoded['isHidden'] as bool? ?? false,
isUsed: decoded['isUsed'] as bool? ?? false,
txCount: decoded['txCount'] as int? ?? 0,
name: decoded['name'] as String? ?? '',
balance: decoded['balance'] as int? ?? 0,
network: (decoded['network'] as String?) == null
? network
: BasedUtxoNetwork.fromName(decoded['network'] as String),
silentPaymentTweak: decoded['silent_payment_tweak'] as String?,
type: decoded['type'] != null && decoded['type'] != ''
? BitcoinAddressType.values
.firstWhere((type) => type.toString() == decoded['type'] as String)
: SilentPaymentsAddresType.p2sp,
);
}

final String? silentPaymentTweak;

@override
String toJSON() => json.encode({
'address': address,
'index': index,
'isHidden': isHidden,
'isUsed': isUsed,
'txCount': txCount,
'name': name,
'balance': balance,
'type': type.toString(),
'network': network?.value,
'silent_payment_tweak': silentPaymentTweak,
});
}
23 changes: 23 additions & 0 deletions cw_bitcoin/lib/bitcoin_receive_page_option.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ class BitcoinReceivePageOption implements ReceivePageOption {
static const p2wsh = BitcoinReceivePageOption._('Segwit (P2WSH)');
static const p2pkh = BitcoinReceivePageOption._('Legacy (P2PKH)');

static const silent_payments = BitcoinReceivePageOption._('Silent Payments');

const BitcoinReceivePageOption._(this.value);

final String value;
Expand All @@ -17,13 +19,32 @@ class BitcoinReceivePageOption implements ReceivePageOption {
}

static const all = [
BitcoinReceivePageOption.silent_payments,
BitcoinReceivePageOption.p2wpkh,
BitcoinReceivePageOption.p2tr,
BitcoinReceivePageOption.p2wsh,
BitcoinReceivePageOption.p2sh,
BitcoinReceivePageOption.p2pkh
];

BitcoinAddressType toType() {
switch (this) {
case BitcoinReceivePageOption.p2tr:
return SegwitAddresType.p2tr;
case BitcoinReceivePageOption.p2wsh:
return SegwitAddresType.p2wsh;
case BitcoinReceivePageOption.p2pkh:
return P2pkhAddressType.p2pkh;
case BitcoinReceivePageOption.p2sh:
return P2shAddressType.p2wpkhInP2sh;
case BitcoinReceivePageOption.silent_payments:
return SilentPaymentsAddresType.p2sp;
case BitcoinReceivePageOption.p2wpkh:
default:
return SegwitAddresType.p2wpkh;
}
}

factory BitcoinReceivePageOption.fromType(BitcoinAddressType type) {
switch (type) {
case SegwitAddresType.p2tr:
Expand All @@ -34,6 +55,8 @@ class BitcoinReceivePageOption implements ReceivePageOption {
return BitcoinReceivePageOption.p2pkh;
case P2shAddressType.p2wpkhInP2sh:
return BitcoinReceivePageOption.p2sh;
case SilentPaymentsAddresType.p2sp:
return BitcoinReceivePageOption.silent_payments;
case SegwitAddresType.p2wpkh:
default:
return BitcoinReceivePageOption.p2wpkh;
Expand Down
61 changes: 57 additions & 4 deletions cw_bitcoin/lib/bitcoin_unspent.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,66 @@ import 'package:cw_bitcoin/bitcoin_address_record.dart';
import 'package:cw_core/unspent_transaction_output.dart';

class BitcoinUnspent extends Unspent {
BitcoinUnspent(BitcoinAddressRecord addressRecord, String hash, int value, int vout)
BitcoinUnspent(BaseBitcoinAddressRecord addressRecord, String hash, int value, int vout)
: bitcoinAddressRecord = addressRecord,
super(addressRecord.address, hash, value, vout, null);

factory BitcoinUnspent.fromJSON(BitcoinAddressRecord address, Map<String, dynamic> json) =>
factory BitcoinUnspent.fromJSON(BaseBitcoinAddressRecord? address, Map<String, dynamic> json) =>
BitcoinUnspent(
address, json['tx_hash'] as String, json['value'] as int, json['tx_pos'] as int);
address ?? BitcoinAddressRecord.fromJSON(json['address_record'].toString()),
json['tx_hash'] as String,
json['value'] as int,
json['tx_pos'] as int,
);

final BitcoinAddressRecord bitcoinAddressRecord;
Map<String, dynamic> toJson() {
final json = <String, dynamic>{
'address_record': bitcoinAddressRecord.toJSON(),
'tx_hash': hash,
'value': value,
'tx_pos': vout,
};
return json;
}

final BaseBitcoinAddressRecord bitcoinAddressRecord;
}

class BitcoinSilentPaymentsUnspent extends BitcoinUnspent {
BitcoinSilentPaymentsUnspent(
BitcoinSilentPaymentAddressRecord addressRecord,
String hash,
int value,
int vout, {
required this.silentPaymentTweak,
required this.silentPaymentLabel,
}) : super(addressRecord, hash, value, vout);

@override
factory BitcoinSilentPaymentsUnspent.fromJSON(
BitcoinSilentPaymentAddressRecord? address, Map<String, dynamic> json) =>
BitcoinSilentPaymentsUnspent(
address ?? BitcoinSilentPaymentAddressRecord.fromJSON(json['address_record'].toString()),
json['tx_hash'] as String,
json['value'] as int,
json['tx_pos'] as int,
silentPaymentTweak: json['silent_payment_tweak'] as String?,
silentPaymentLabel: json['silent_payment_label'] as String?,
);

@override
Map<String, dynamic> toJson() {
final json = <String, dynamic>{
'address_record': bitcoinAddressRecord.toJSON(),
'tx_hash': hash,
'value': value,
'tx_pos': vout,
'silent_payment_tweak': silentPaymentTweak,
'silent_payment_label': silentPaymentLabel,
};
return json;
}

String? silentPaymentTweak;
String? silentPaymentLabel;
}
Loading
Loading