Skip to content

Commit

Permalink
chore: rm spenOutputs logic
Browse files Browse the repository at this point in the history
  • Loading branch information
jackstar12 committed Jan 22, 2025
1 parent 197ad18 commit f760e88
Show file tree
Hide file tree
Showing 3 changed files with 9 additions and 104 deletions.
31 changes: 1 addition & 30 deletions internal/nursery/nursery.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,8 @@ import (

"github.com/BoltzExchange/boltz-client/v2/internal/onchain/wallet"

"github.com/BoltzExchange/boltz-client/v2/pkg/boltzrpc"
"github.com/btcsuite/btcd/chaincfg/chainhash"

"github.com/BoltzExchange/boltz-client/v2/internal/utils"
"github.com/BoltzExchange/boltz-client/v2/pkg/boltzrpc"

"github.com/BoltzExchange/boltz-client/v2/internal/lightning"
"github.com/BoltzExchange/boltz-client/v2/internal/onchain"
Expand Down Expand Up @@ -173,15 +171,9 @@ func (nursery *Nursery) recoverSwaps() error {
return err
}

var lockupTxs []string
var spentTxs []string

var swapIds []string
for _, swap := range swaps {
swapIds = append(swapIds, swap.Id)
if swap.Pair.From == boltz.CurrencyLiquid {
lockupTxs = append(lockupTxs, swap.LockupTransactionId)
}
}
for _, reverseSwap := range reverseSwaps {
if err := nursery.payReverseSwap(reverseSwap); err != nil {
Expand All @@ -192,27 +184,6 @@ func (nursery *Nursery) recoverSwaps() error {
}
for _, chainSwap := range chainSwaps {
swapIds = append(swapIds, chainSwap.Id)
if chainSwap.Pair.From == boltz.CurrencyLiquid {
lockupTxs = append(lockupTxs, chainSwap.FromData.LockupTransactionId)
}
}

for _, lockupTx := range lockupTxs {
if lockupTx != "" {
tx, err := nursery.onchain.GetTransaction(boltz.CurrencyLiquid, lockupTx, nil)
if err != nil {
return fmt.Errorf("could not get lockup transaction: %w", err)
}
for _, input := range tx.(*boltz.LiquidTransaction).Inputs {
spentTxs = append(spentTxs, chainhash.Hash(input.Hash).String())
}
}
}

for _, anyWallet := range nursery.onchain.Wallets {
if ownWallet, ok := anyWallet.(*wallet.Wallet); ok {
ownWallet.SetSpentOutputs(spentTxs)
}
}

return nursery.registerSwaps(swapIds)
Expand Down
62 changes: 8 additions & 54 deletions internal/onchain/wallet/wallet.go
Original file line number Diff line number Diff line change
Expand Up @@ -111,13 +111,11 @@ type Subaccount struct {

type Wallet struct {
onchain.WalletInfo
subaccount *uint64
session Session
connected bool
syncedAccounts []uint64
spentOutputs map[string]bool
spentOutputsLock sync.RWMutex
txNotifier <-chan TransactionNotification
subaccount *uint64
session Session
connected bool
syncedAccounts []uint64
txNotifier <-chan TransactionNotification
}

type Config struct {
Expand Down Expand Up @@ -490,7 +488,7 @@ func Login(credentials *Credentials) (*Wallet, error) {
if credentials.Encrypted() {
return nil, errors.New("credentials are encrypted")
}
wallet := &Wallet{WalletInfo: credentials.WalletInfo, spentOutputs: make(map[string]bool)}
wallet := &Wallet{WalletInfo: credentials.WalletInfo}
login := make(map[string]any)

if credentials.Mnemonic != "" {
Expand Down Expand Up @@ -676,25 +674,6 @@ func (wallet *Wallet) getUnspentOutputs(subaccount uint64, includeUnconfirmed bo
if err := withAuthHandler(C.GA_get_unspent_outputs(wallet.session, params, handler), handler, result); err != nil {
return nil, err
}
wallet.spentOutputsLock.Lock()
defer wallet.spentOutputsLock.Unlock()
for spent := range wallet.spentOutputs {
found := false
for key, outputs := range result.Unspent {
for i, output := range outputs {
if output["txhash"] == spent {
logger.Debugf("Ignoring output for tx %s since it is marked as spent", spent)
result.Unspent[key] = append(outputs[:i], outputs[i+1:]...)
found = true
break
}
}
}
if !found {
delete(wallet.spentOutputs, spent)
}
}

return result, nil
}

Expand Down Expand Up @@ -785,8 +764,6 @@ func (wallet *Wallet) SendToAddress(address string, amount uint64, satPerVbyte f
return "", err
}

wallet.spentOutputsLock.Lock()
defer wallet.spentOutputsLock.Unlock()
handler := new(AuthHandler)
params, free := toJson(result)
if err := withAuthHandler(C.GA_blind_transaction(wallet.session, params, handler), handler, &result); err != nil {
Expand All @@ -800,18 +777,8 @@ func (wallet *Wallet) SendToAddress(address string, amount uint64, satPerVbyte f
}
free()

var signedTx struct {
Transaction string `mapstructure:"transaction"`
Error string `mapstructure:"error"`
TransactionInputs []struct {
TxId string `mapstructure:"txhash"`
} `mapstructure:"transaction_inputs"`
}
if err := mapstructure.Decode(result, &signedTx); err != nil {
return "", err
}
if signedTx.Error != "" {
return "", fmt.Errorf("could not sign: %s", signedTx.Error)
if errMsg, ok := result["error"].(string); ok && errMsg != "" {
return "", fmt.Errorf("could not sign: %s", errMsg)
}

params, free = toJson(result)
Expand All @@ -828,22 +795,9 @@ func (wallet *Wallet) SendToAddress(address string, amount uint64, satPerVbyte f
return "", fmt.Errorf("failed to broadcast: %s", sendTx.Error)
}

for _, input := range signedTx.TransactionInputs {
wallet.spentOutputs[input.TxId] = true
}

return sendTx.TxHash, nil
}

func (wallet *Wallet) SetSpentOutputs(outputs []string) {
wallet.spentOutputsLock.Lock()
defer wallet.spentOutputsLock.Unlock()
wallet.spentOutputs = make(map[string]bool)
for _, output := range outputs {
wallet.spentOutputs[output] = true
}
}

func (wallet *Wallet) GetTransactions(limit, offset uint64) ([]*onchain.WalletTransaction, error) {
if wallet.subaccount == nil {
return nil, ErrSubAccountNotSet
Expand Down
20 changes: 0 additions & 20 deletions internal/onchain/wallet/wallet_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,26 +57,6 @@ func TestSend(t *testing.T) {
require.NoError(t, err)
require.Equal(t, balance.Confirmed, amount+fee)
})

t.Run("SpentOutputs", func(t *testing.T) {
t.Cleanup(func() {
wallet.SetSpentOutputs(nil)
})

txes, err := wallet.GetTransactions(0, 0)
require.NoError(t, err)
require.NotEmpty(t, txes)
var spent []string
for _, tx := range txes {
spent = append(spent, tx.Id)
}
wallet.SetSpentOutputs(spent)

// all outputs will now be marked as spent internally, so no funds should be available
balance, err := wallet.GetBalance()
require.NoError(t, err)
require.Zero(t, balance.Confirmed)
})
}

func TestReal(t *testing.T) {
Expand Down

0 comments on commit f760e88

Please sign in to comment.