nip60: fix spending conditions over SendExternal() and SendInternal()
This commit is contained in:
64
nip60/send-internal.go
Normal file
64
nip60/send-internal.go
Normal file
@@ -0,0 +1,64 @@
|
||||
package nip60
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
|
||||
"fiatjaf.com/nostr"
|
||||
"fiatjaf.com/nostr/nip60/client"
|
||||
"github.com/elnosh/gonuts/cashu"
|
||||
)
|
||||
|
||||
func (w *Wallet) SendInternal(ctx context.Context, amount uint64, opts SendOptions) (cashu.Proofs, string, error) {
|
||||
if w.PublishUpdate == nil {
|
||||
return nil, "", fmt.Errorf("can't do write operations: missing PublishUpdate function")
|
||||
}
|
||||
|
||||
w.tokensMu.Lock()
|
||||
defer w.tokensMu.Unlock()
|
||||
|
||||
chosen, _, err := w.getProofsForSending(ctx, amount, opts.SpecificSourceMint, nil)
|
||||
if err != nil {
|
||||
return nil, "", err
|
||||
}
|
||||
|
||||
if opts.Hashlock != [32]byte{} {
|
||||
if info, err := client.GetMintInfo(ctx, chosen.mint); err != nil || !info.Nuts.Nut14.Supported {
|
||||
return nil, chosen.mint, fmt.Errorf("mint doesn't support htlc: %w", err)
|
||||
}
|
||||
} else if opts.P2PK != nil {
|
||||
if info, err := client.GetMintInfo(ctx, chosen.mint); err != nil || !info.Nuts.Nut11.Supported {
|
||||
return nil, chosen.mint, fmt.Errorf("mint doesn't support p2pk: %w", err)
|
||||
}
|
||||
}
|
||||
|
||||
swapSettings := swapSettings{
|
||||
spendingCondition: opts.asSpendingCondition(w.PublicKey),
|
||||
}
|
||||
|
||||
// get new proofs
|
||||
proofsToSend, changeProofs, err := w.swapProofs(ctx, chosen.mint, chosen.proofs, amount, swapSettings)
|
||||
if err != nil {
|
||||
return nil, chosen.mint, err
|
||||
}
|
||||
|
||||
he := HistoryEntry{
|
||||
event: &nostr.Event{},
|
||||
TokenReferences: make([]TokenRef, 0, 5),
|
||||
createdAt: nostr.Now(),
|
||||
In: false,
|
||||
Amount: chosen.proofs.Amount() - changeProofs.Amount(),
|
||||
}
|
||||
|
||||
if err := w.saveChangeAndDeleteUsedTokens(ctx, chosen.mint, changeProofs, chosen.tokenIndexes, &he); err != nil {
|
||||
return nil, chosen.mint, err
|
||||
}
|
||||
|
||||
w.Lock()
|
||||
if err := he.toEvent(ctx, w.kr, he.event); err == nil {
|
||||
w.PublishUpdate(*he.event, nil, nil, nil, true)
|
||||
}
|
||||
w.Unlock()
|
||||
|
||||
return proofsToSend, chosen.mint, nil
|
||||
}
|
||||
Reference in New Issue
Block a user