Skip to content

Commit

Permalink
rebase and fix conflict
Browse files Browse the repository at this point in the history
  • Loading branch information
JustinBeBoy committed Jan 16, 2024
2 parents b30fbe8 + 6850bc1 commit ffe0eee
Show file tree
Hide file tree
Showing 56 changed files with 1,727 additions and 552 deletions.
Binary file added appicon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
34 changes: 30 additions & 4 deletions dexc/core.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import (
"decred.org/dcrdex/client/core"
"decred.org/dcrdex/dex"
libutils "github.com/crypto-power/cryptopower/libwallet/utils"
"github.com/crypto-power/cryptopower/ui/values/localizable"
)

const (
Expand All @@ -30,6 +31,9 @@ const (

// DEXClient represents the Decred DEX client and embeds *core.Core.
type DEXClient struct {
ctx context.Context
cancelFn context.CancelFunc
DBPath string
*core.Core

shutdownChan <-chan struct{}
Expand All @@ -50,6 +54,10 @@ func (dc *DEXClient) WaitForShutdown() <-chan struct{} {
return dc.shutdownChan
}

func (dc *DEXClient) Shutdown() {
dc.cancelFn()
}

type valStamp struct {
val uint64
stamp time.Time
Expand Down Expand Up @@ -87,6 +95,10 @@ func (dc *DEXClient) BondsFeeBuffer(assetID uint32) uint64 {
return feeBuffer
}

// Start prepares and starts the DEX client.
//
// NOTE: "lang" will be changed to the default language (en) if the the DEX
// client does not have support for it.
func Start(ctx context.Context, root, lang, logDir, logLvl string, net libutils.NetworkType, maxLogZips int) (*DEXClient, error) {
dexNet, err := parseDEXNet(net)
if err != nil {
Expand All @@ -103,7 +115,7 @@ func Start(ctx context.Context, root, lang, logDir, logLvl string, net libutils.
DBPath: dbPath,
Net: dexNet,
Logger: logger,
Language: lang,
Language: validDEXLang(lang),
UnlockCoinsOnLogin: false, // TODO: Make configurable.
}

Expand All @@ -114,14 +126,16 @@ func Start(ctx context.Context, root, lang, logDir, logLvl string, net libutils.

shutdownChan := make(chan struct{})
dc := &DEXClient{
DBPath: dbPath,
Core: clientCore,
shutdownChan: shutdownChan,
log: logger,
}

dc.ctx, dc.cancelFn = context.WithCancel(ctx)
// Use a goroutine to start dex core as it'll block until dex core exits.
go func() {
dc.Run(ctx)
dc.Run(dc.ctx)
logCloser()
close(shutdownChan)
dc.Core = nil // do this after all shutdownChan listeners must've stopped waiting
Expand All @@ -139,8 +153,9 @@ func (dc *DEXClient) HasWallet(assetID int32) bool {
// AddWallet attempts to connect or create the wallet with the provided details
// to the DEX client.
// NOTE: Before connecting a dcr wallet, dcr ExchangeWallet must have been
// configured to use a custom wallet instead of the default rpc wallet. See
// libwallet.AssetManager.PrepareDexSupportForDcrWallet().
// configured to use a custom wallet. See:
// libwallet.AssetManager.PrepareDexSupportForDcrWallet() and
// libwallet.AssetManager.prepareDexSupportForBTCCloneWallets.
func (dc *DEXClient) AddWallet(assetID uint32, settings map[string]string, appPW, walletPW []byte) error {
assetInfo, err := asset.Info(assetID)
if err != nil {
Expand Down Expand Up @@ -188,3 +203,14 @@ func parseDEXNet(net libutils.NetworkType) (dex.Network, error) {
return 0, fmt.Errorf("unknown network %s", net)
}
}

// validDEXLang checks that the provided lang is supported by the DEX client. An
// empty string is returned for an invalid lang to allow DEX core use it's
// default language.
func validDEXLang(lang string) string {
switch lang {
case localizable.ENGLISH, localizable.CHINESE:
return lang
}
return ""
}
27 changes: 8 additions & 19 deletions libwallet/assets/btc/sync.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package btc

import (
"fmt"
"strings"
"sync"
"sync/atomic"
"time"
Expand Down Expand Up @@ -353,24 +352,14 @@ func (asset *Asset) prepareChain() error {
}

func (asset *Asset) loadChainService() (chainService *neutrino.ChainService, err error) {
// Read config for persistent peers, if set parse and set neutrino's ConnectedPeers
// persistentPeers.
var persistentPeers []string
peerAddresses := asset.ReadStringConfigValueForKey(sharedW.SpvPersistentPeerAddressesConfigKey, "")
if peerAddresses != "" {
addresses := strings.Split(peerAddresses, ";")
for _, address := range addresses {
peerAddress, err := utils.NormalizeAddress(address, asset.chainParams.DefaultPort)
if err != nil {
log.Errorf("SPV peer address(%s) is invalid: %v", peerAddress, err)
} else {
persistentPeers = append(persistentPeers, peerAddress)
}
}
validPeerAddresses, errs := sharedW.ParseWalletPeers(peerAddresses, asset.chainParams.DefaultPort)
for _, err := range errs { // Log errors if any
log.Error(err)
}

if len(persistentPeers) == 0 {
return chainService, errors.New(utils.ErrInvalidPeers)
}
if len(validPeerAddresses) == 0 && len(errs) > 0 {
return chainService, errors.New(utils.ErrInvalidPeers)
}

asset.dailerCtx, asset.dailerCancel = asset.ShutdownContextWithCancel()
Expand All @@ -379,8 +368,8 @@ func (asset *Asset) loadChainService() (chainService *neutrino.ChainService, err
Database: asset.GetWalletDataDb().BTC,
ChainParams: *asset.chainParams,
PersistToDisk: true, // keep cfilter headers on disk for efficient rescanning
ConnectPeers: persistentPeers,
// Dailer function helps to better control the dailer functionality.
ConnectPeers: validPeerAddresses,
// Dialer function helps to better control the dialer functionality.
Dialer: utils.DialerFunc(asset.dailerCtx),
// WARNING: PublishTransaction currently uses the entire duration
// because if an external bug, but even if the resolved, a typical
Expand Down
15 changes: 4 additions & 11 deletions libwallet/assets/btc/transactions.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package btc
import (
"context"
"encoding/json"
"sort"
"strings"
"sync"

Expand Down Expand Up @@ -191,6 +190,7 @@ func (asset *Asset) getTransactionsRaw(offset, limit int32, newestFirst bool) ([
// if empty results were previously cached, check for updates.
if txCacheHeight == asset.GetBestBlockHeight() && len(allTxs) > 0 {
// if the best block hasn't changed return the preset list of txs.
sharedW.SortTxs(allTxs, newestFirst)
return allTxs, nil
}

Expand Down Expand Up @@ -234,15 +234,6 @@ func (asset *Asset) getTransactionsRaw(offset, limit int32, newestFirst bool) ([

minedTxs := asset.extractTxs(txResult.MinedTransactions)

if newestFirst {
sort.Slice(unminedTxs, func(i, j int) bool {
return unminedTxs[i].Timestamp > unminedTxs[j].Timestamp
})
sort.Slice(minedTxs, func(i, j int) bool {
return minedTxs[i].Timestamp > minedTxs[j].Timestamp
})
}

// Cache the recent data.
asset.txs.mu.Lock()
asset.txs.unminedTxs = unminedTxs
Expand All @@ -251,7 +242,9 @@ func (asset *Asset) getTransactionsRaw(offset, limit int32, newestFirst bool) ([
asset.txs.mu.Unlock()

// Return the summation of unmined and the mined txs.
return append(unminedTxs, minedTxs...), nil
allTxs = append(unminedTxs, minedTxs...)
sharedW.SortTxs(allTxs, newestFirst)
return allTxs, nil
}

func (asset *Asset) extractTxs(blocks []wallet.Block) []*sharedW.Transaction {
Expand Down
14 changes: 3 additions & 11 deletions libwallet/assets/btc/wallet.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import (
"context"
"encoding/base64"
"path/filepath"
"strings"
"sync"
"time"

Expand Down Expand Up @@ -476,16 +475,9 @@ func (asset *Asset) RemovePeers() {
}()
}

// SetSpecificPeer sets a specific peer to connect to.
func (asset *Asset) SetSpecificPeer(address string) {
knownAddr := asset.ReadStringConfigValueForKey(sharedW.SpvPersistentPeerAddressesConfigKey, "")

// Prevent setting same address twice
if !strings.Contains(address, ";") && !strings.Contains(knownAddr, address) {
knownAddr += ";" + address
}

asset.SaveUserConfigValue(sharedW.SpvPersistentPeerAddressesConfigKey, knownAddr)
// SetSpecificPeer sets a specific peer or list of peer to connect to.
func (asset *Asset) SetSpecificPeer(addresses string) {
asset.SaveUserConfigValue(sharedW.SpvPersistentPeerAddressesConfigKey, addresses)
go func() {
err := asset.reloadChainService()
if err != nil {
Expand Down
33 changes: 12 additions & 21 deletions libwallet/assets/dcr/sync.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import (
"fmt"
"net"
"sort"
"strings"
"sync"

"decred.org/dcrwallet/v3/errors"
Expand Down Expand Up @@ -227,8 +226,8 @@ func (asset *Asset) SyncInactiveForPeriod(totalInactiveSeconds int64) {
}
}

func (asset *Asset) SetSpecificPeer(address string) {
asset.SaveUserConfigValue(sharedW.SpvPersistentPeerAddressesConfigKey, address)
func (asset *Asset) SetSpecificPeer(addresses string) {
asset.SaveUserConfigValue(sharedW.SpvPersistentPeerAddressesConfigKey, addresses)
asset.RestartSpvSync()
}

Expand All @@ -243,26 +242,14 @@ func (asset *Asset) SpvSync() error {
return errors.New(utils.ErrSyncAlreadyInProgress)
}

addr := &net.TCPAddr{IP: net.ParseIP("::1"), Port: 0}
addrManager := addrmgr.New(asset.DataDir(), net.LookupIP) // TODO: be mindful of tor
lp := p2p.NewLocalPeer(asset.chainParams, addr, addrManager)

var validPeerAddresses []string
peerAddresses := asset.ReadStringConfigValueForKey(sharedW.SpvPersistentPeerAddressesConfigKey, "")
if peerAddresses != "" {
addresses := strings.Split(peerAddresses, ";")
for _, address := range addresses {
peerAddress, err := utils.NormalizeAddress(address, asset.chainParams.DefaultPort)
if err != nil {
log.Errorf("SPV peer address(%s) is invalid: %v", peerAddress, err)
} else {
validPeerAddresses = append(validPeerAddresses, peerAddress)
}
}
validPeerAddresses, errs := sharedW.ParseWalletPeers(peerAddresses, asset.chainParams.DefaultPort)
for _, err := range errs { // Log errors if any
log.Error(err)
}

if len(validPeerAddresses) == 0 {
return errors.New(utils.ErrInvalidPeers)
}
if len(validPeerAddresses) == 0 && len(errs) > 0 {
return errors.New(utils.ErrInvalidPeers)
}

// init activeSyncData to be used to hold data used
Expand All @@ -272,6 +259,10 @@ func (asset *Asset) SpvSync() error {
asset.waitingForHeaders = true
asset.syncing = true

addr := &net.TCPAddr{IP: net.ParseIP("::1"), Port: 0}
addrManager := addrmgr.New(asset.DataDir(), net.LookupIP) // TODO: be mindful of tor
lp := p2p.NewLocalPeer(asset.chainParams, addr, addrManager)

syncer := spv.NewSyncer(asset.Internal().DCR, lp)
syncer.SetNotifications(asset.spvSyncNotificationCallbacks())
if len(validPeerAddresses) > 0 {
Expand Down
Loading

0 comments on commit ffe0eee

Please sign in to comment.