65 lines
1.8 KiB
Go
65 lines
1.8 KiB
Go
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
|
|
}
|