import 'package:cw_bitcoin/bitcoin_mnemonic.dart'; import 'package:cw_bitcoin/electrum_transaction_history.dart'; import 'package:cw_core/crypto_currency.dart'; import 'package:cw_core/unspent_coins_info.dart'; import 'package:hive/hive.dart'; import 'package:mobx/mobx.dart'; import 'package:flutter/foundation.dart'; import 'package:bitcoin_flutter/bitcoin_flutter.dart' as bitcoin; import 'package:cw_bitcoin/electrum_wallet_snapshot.dart'; import 'package:cw_bitcoin/electrum_wallet.dart'; import 'package:cw_core/wallet_info.dart'; import 'package:cw_bitcoin/bitcoin_address_record.dart'; import 'package:cw_bitcoin/electrum_balance.dart'; import 'package:cw_bitcoin/bitcoin_wallet_addresses.dart'; part 'bitcoin_wallet.g.dart'; class BitcoinWallet = BitcoinWalletBase with _$BitcoinWallet; abstract class BitcoinWalletBase extends ElectrumWallet with Store { BitcoinWalletBase( {required super.mnemonic, required super.password, required super.walletInfo, required super.unspentCoinsInfo, bitcoin.NetworkType? networkType, required Uint8List seedBytes, List? initialAddresses, List? initialSilentAddresses, ElectrumBalance? initialBalance, int initialRegularAddressIndex = 0, int initialChangeAddressIndex = 0, int initialSilentAddressIndex = 0, bitcoin.SilentPaymentReceiver? silentAddress}) : super( networkType: networkType ?? bitcoin.bitcoin, initialAddresses: initialAddresses, initialBalance: initialBalance, seedBytes: seedBytes, currency: CryptoCurrency.btc, transactionHistory: ElectrumTransactionHistory(walletInfo: walletInfo, password: password)) { walletAddresses = BitcoinWalletAddresses(walletInfo, transactionHistory: super.transactionHistory, initialAddresses: initialAddresses, initialSilentAddresses: initialSilentAddresses, initialRegularAddressIndex: initialRegularAddressIndex, initialChangeAddressIndex: initialChangeAddressIndex, initialSilentAddressIndex: initialSilentAddressIndex, mainHd: hd, sideHd: bitcoin.HDWallet.fromSeed(seedBytes, network: networkType).derivePath("m/0'/1"), networkType: networkType ?? bitcoin.bitcoin, silentAddress: silentAddress); } static Future create({ required String mnemonic, required String password, required WalletInfo walletInfo, required Box unspentCoinsInfo, bitcoin.NetworkType? networkType, List? initialAddresses, List? initialSilentAddresses, ElectrumBalance? initialBalance, int initialRegularAddressIndex = 0, int initialChangeAddressIndex = 0, int initialSilentAddressIndex = 0, }) async { return BitcoinWallet( mnemonic: mnemonic, password: password, walletInfo: walletInfo, unspentCoinsInfo: unspentCoinsInfo, networkType: networkType, initialAddresses: initialAddresses, initialSilentAddresses: initialSilentAddresses, initialBalance: initialBalance, seedBytes: await mnemonicToSeedBytes(mnemonic), initialRegularAddressIndex: initialRegularAddressIndex, initialChangeAddressIndex: initialChangeAddressIndex, initialSilentAddressIndex: initialSilentAddressIndex, silentAddress: await bitcoin.SilentPaymentReceiver.fromMnemonic(mnemonic, hrp: networkType == bitcoin.bitcoin ? 'sp' : 'tsp')); } static Future open({ required String name, required WalletInfo walletInfo, required Box unspentCoinsInfo, required String password, }) async { final snp = await ElectrumWalletSnapshot.load(name, walletInfo.type, password); return BitcoinWallet( mnemonic: snp.mnemonic, password: password, walletInfo: walletInfo, unspentCoinsInfo: unspentCoinsInfo, networkType: snp.networkType, initialAddresses: snp.addresses, initialSilentAddresses: snp.silentAddresses, initialBalance: snp.balance, seedBytes: await mnemonicToSeedBytes(snp.mnemonic), initialRegularAddressIndex: snp.regularAddressIndex, initialChangeAddressIndex: snp.changeAddressIndex, initialSilentAddressIndex: snp.silentAddressIndex, silentAddress: await bitcoin.SilentPaymentReceiver.fromMnemonic(snp.mnemonic, hrp: snp.networkType == bitcoin.bitcoin ? 'sp' : 'tsp')); } }