CakeWallet/cw_decred/lib/wallet_addresses.dart
Omar Hatem 0ba54fa602
Add decred (#1938)
* decred: Add decred. (#1322)

* multi: Add initial decred screens. (#1165)

Use a mock libwallet for now.

* cw_decred: add libdcrwallet dependency and link library for android, ios and macos (#1240)

* change cw_decred from package to plugin

* add libdcrwallet dependency and link library for android, ios and macos

* remove spvwallet, make some libdcrwallet fns async, light refactor

* libdcrwallet: use json payload returns

* use specific libwallet commit hash

* decred: fix Rename wallet.

---------

Co-authored-by: JoeGruff <joegruffins@gmail.com>

* decred: Add sync.

* decred: Add send transaction.

* decred: Fix fee estimation.

* decred: List transactions.

* decred: Add rescan.

* decred: Sign message.

* decred: Add new addr and addrs.

* decred: Add change wallet pass.

* decred: Add restore from seed.

* decred: Add watching only wallets.

* decred: Enable mainnet.

* decred: Allow using blank node address.

This allows a persistent peer to be unset, falling back to decred
seeders.

* decred: Rescan from wallet birthday.

* add and update macos build scripts, update build readme, gitignore macos project.pbxproj

Signed-off-by: Philemon Ukane <ukanephilemon@gmail.com>

* multi: hide decred rescan page if it's not ready

-  move hasRescan method to WalletBase and implement for decred

Signed-off-by: Philemon Ukane <ukanephilemon@gmail.com>

* cw_decred: fix bug where decred wallets are not loaded after app restart

Signed-off-by: Philemon Ukane <ukanephilemon@gmail.com>

* add buy and sell for decred via onramp

Signed-off-by: Philemon Ukane <ukanephilemon@gmail.com>

* bug-fix: account for other send outputs that are part of the same tx

Signed-off-by: Philemon Ukane <ukanephilemon@gmail.com>

* decred: Return address with no peers.

* decred: Update pubspec.

* decred: Add verify message.

* upgrade hive_generator dep in cw_decred

* decred: Clean up code.

---------

Signed-off-by: Philemon Ukane <ukanephilemon@gmail.com>
Co-authored-by: Wisdom Arerosuoghene <wisdom.arerosuoghene@gmail.com>
Co-authored-by: Philemon Ukane <ukanephilemon@gmail.com>

* fix extracted addresses not used
fix conflicts with main

* remove print [skip ci]

* minor formatting

* fix initial migration version

* add build decred script to workflow

* install go before build decred
fix switch cases

* trial 2 to fix decred build

* re-install go

* revert build script change

* refactor/clean nodes functions

* Fix address book issue
Fix send ALL (to be continued with the fees point)

* Fix transactions display issues
Add missing file

* Fix unconfirmed balance not displayed
Change Wallet order
Minor cleanup

* Fix workflow

* Fix workflow

* Fix workflow

* test

* hardcode path for now

* fix + cleanup decred build script to work on mac and linux

* Update decred build script

* Run actions on pull requests, extract commit message

* run after checkout

* add safe directory

* Get commit message from base.sha instead of last commit

* base -> head

* Do not merge main branch into pr

* [skip slack] [run tests] clone by sha

* Proper name for decred library in the build script

* Throw an error when ANDROID_HOME or ANDROID_NDK_VERSION is missing

* Fix conflicts with main

* minor code enhancement

* decred: Add used address history.  (#1941)

* decred: Update pubspec.

* decred testnet

* decred: Add used address history.

* decred: Remove default node list.

* populate transaction history before sync begins

* decred: Add some awaits.

* decred: Fix send all.

* decred: Add clang export to build script.

* decred: Update logo colors.

* cleanup cw_decred.dart

* make decred wallet addresses selectable in receive page

* decred: Always set default addr when used.

* decred: Add back default node list.

* decred: Allow creating addresses manually.

---------

Co-authored-by: Wisdom Arerosuoghene <wisdom.arerosuoghene@gmail.com>
Co-authored-by: Omar Hatem <omarh.ismail1@gmail.com>

* minor fixes and cleanup

* minor fix, feel free to test now

* - Fix transaction details
- Fix Nodes
- Add processing sync status

* Add decred info card

* push missing file

* Add missing text for decred info card

* minor: change docs link [skip ci]

* decred: Update derivation info. (#2013)

* decred: Update derivation info.

* decred: Allow unsynced unused addresses.

* decred: Update dcrwallet dep to 4.3.0.

* Merge main and fix conflicts

* Merge main and fix conflicts

* decred: Fix background sync panic. (#2080)

* decred: Run libwallet in isolate. (#2077)

* decred: Fix contact save inquiry. (#2083)

Also fix tx time and the fee shown on pending transactions.

* Disable send button in view only decred wallets

* - Fix frozen coins
- Add URI support
- Fix fees in tx details
- Handle empty coins send
- Handle wallets in address book

* Merge main

* remove print [skip ci]

* Fix restore from QR

* minor improvement for QR restore

* minor fixes [skip ci]

* decred: Get slip44 addrs before sync completes. (#2092)

* - Fix loading wallet more than one time
- Fix minor UI issue

---------

Signed-off-by: Philemon Ukane <ukanephilemon@gmail.com>
Co-authored-by: JoeGruffins <34998433+JoeGruffins@users.noreply.github.com>
Co-authored-by: Wisdom Arerosuoghene <wisdom.arerosuoghene@gmail.com>
Co-authored-by: Philemon Ukane <ukanephilemon@gmail.com>
Co-authored-by: Czarek Nakamoto <cyjan@mrcyjanek.net>
2025-03-21 04:18:47 +02:00

137 lines
3.7 KiB
Dart

import 'dart:convert';
import 'package:mobx/mobx.dart';
import 'package:cw_core/address_info.dart';
import 'package:cw_core/wallet_addresses.dart';
import 'package:cw_core/wallet_info.dart';
import 'package:cw_decred/api/libdcrwallet.dart';
part 'wallet_addresses.g.dart';
class DecredWalletAddresses = DecredWalletAddressesBase with _$DecredWalletAddresses;
abstract class DecredWalletAddressesBase extends WalletAddresses with Store {
DecredWalletAddressesBase(WalletInfo walletInfo, Libwallet libwallet)
: _libwallet = libwallet,
super(walletInfo);
final Libwallet _libwallet;
String currentAddr = '';
@observable
bool isEnabledAutoGenerateSubaddress = true;
@observable
String selectedAddr = '';
@override
@computed
String get address {
return selectedAddr;
}
@override
set address(value) {
selectedAddr = value;
}
@override
Future<void> init() async {
if (walletInfo.addresses != null) {
addressesMap = walletInfo.addresses!;
}
if (walletInfo.addressInfos != null) {
addressInfos = walletInfo.addressInfos!;
}
if (walletInfo.usedAddresses != null) {
usedAddresses = {...walletInfo.usedAddresses!};
}
await updateAddressesInBox();
}
@override
Future<void> updateAddressesInBox() async {
final addrs = await libAddresses();
final allAddrs = new List.from(addrs.usedAddrs)..addAll(addrs.unusedAddrs);
// Add all addresses.
allAddrs.forEach((addr) {
if (addressesMap.containsKey(addr)) {
return;
}
addressesMap[addr] = "";
addressInfos[0] ??= [];
addressInfos[0]?.add(AddressInfo(address: addr, label: "", accountIndex: 0));
});
// Add used addresses.
addrs.usedAddrs.forEach((addr) {
if (!usedAddresses.contains(addr)) {
usedAddresses.add(addr);
}
});
if (addrs.unusedAddrs.length > 0 && addrs.unusedAddrs[0] != currentAddr) {
currentAddr = addrs.unusedAddrs[0];
selectedAddr = currentAddr;
}
await saveAddressesInBox();
}
List<AddressInfo> getAddressInfos() {
if (addressInfos.containsKey(0)) {
return addressInfos[0]!;
}
return <AddressInfo>[];
}
Future<void> updateAddress(String address, String label) async {
if (!addressInfos.containsKey(0)) {
return;
}
addressInfos[0]!.forEach((info) {
if (info.address == address) {
info.label = label;
}
});
await saveAddressesInBox();
}
Future<LibAddresses> libAddresses() async {
final nUsed = "10";
var nUnused = "1";
if (this.isEnabledAutoGenerateSubaddress) {
nUnused = "3";
}
final res = await _libwallet.addresses(walletInfo.name, nUsed, nUnused);
final decoded = json.decode(res);
final usedAddrs = List<String>.from(decoded["used"] ?? []);
final unusedAddrs = List<String>.from(decoded["unused"] ?? []);
// index is the index of the first unused address.
final index = decoded["index"] ?? 0;
return new LibAddresses(usedAddrs, unusedAddrs, index);
}
Future<void> generateNewAddress(String label) async {
// NOTE: This will ignore the gap limit and may cause problems when restoring from seed if too
// many addresses are taken and not used.
final addr = await _libwallet.newExternalAddress(walletInfo.name) ?? '';
if (addr == "") {
return;
}
if (!addressesMap.containsKey(addr)) {
addressesMap[addr] = "";
addressInfos[0] ??= [];
addressInfos[0]?.add(AddressInfo(address: addr, label: label, accountIndex: 0));
}
selectedAddr = addr;
await saveAddressesInBox();
}
}
class LibAddresses {
final List<String> usedAddrs, unusedAddrs;
final int firstUnusedAddrIndex;
LibAddresses(this.usedAddrs, this.unusedAddrs, this.firstUnusedAddrIndex);
}