nip60: fix a bunch of stupid bugs.

This commit is contained in:
fiatjaf 2025-02-04 10:25:13 -03:00
parent 3c0f4a723a
commit e7432baeba
3 changed files with 26 additions and 49 deletions

@ -80,6 +80,7 @@ func (h HistoryEntry) toEvent(ctx context.Context, kr nostr.Keyer, evt *nostr.Ev
func (h *HistoryEntry) parse(ctx context.Context, kr nostr.Keyer, evt *nostr.Event) error {
h.event = evt
h.createdAt = evt.CreatedAt
h.TokenReferences = make([]TokenRef, 0, 3)
pk, err := kr.GetPublicKey(ctx)
if err != nil {
@ -132,10 +133,7 @@ func (h *HistoryEntry) parse(ctx context.Context, kr nostr.Keyer, evt *nostr.Eve
return fmt.Errorf("'e' tag has invalid event id %s", tag[1])
}
h.TokenReferences = append(h.TokenReferences)
tf := TokenRef{EventID: tag[1]}
switch tag[3] {
case "created":
tf.Created = true
@ -143,9 +141,11 @@ func (h *HistoryEntry) parse(ctx context.Context, kr nostr.Keyer, evt *nostr.Eve
tf.Created = false
case "redeemed":
tf.IsNutzap = true
tf.Created = true
default:
return fmt.Errorf("unsupported 'e' token marker: %s", tag[3])
}
h.TokenReferences = append(h.TokenReferences, tf)
}
}

@ -76,7 +76,7 @@ func loadWalletFromPool(
return nil
}
kinds := []int{37375, 7375}
kinds := []int{17375, 7375}
if withHistory {
kinds = append(kinds, 7375)
}
@ -231,7 +231,7 @@ func (w *Wallet) Balance() uint64 {
func (w *Wallet) toEvent(ctx context.Context, kr nostr.Keyer, evt *nostr.Event) error {
evt.CreatedAt = nostr.Now()
evt.Kind = 37375
evt.Kind = 17375
evt.Tags = nostr.Tags{}
pk, err := kr.GetPublicKey(ctx)
@ -307,6 +307,7 @@ func (w *Wallet) parse(ctx context.Context, kr nostr.Keyer, evt *nostr.Event) er
// finally set these things when we know nothing will fail
w.Mints = mints
fmt.Println("mints", mints)
w.PrivateKey = privateKey
w.PublicKey = w.PrivateKey.PubKey()

@ -1,6 +1,7 @@
package nip60
import (
"cmp"
"context"
"fmt"
"slices"
@ -11,6 +12,7 @@ import (
"github.com/elnosh/gonuts/cashu"
"github.com/nbd-wtf/go-nostr"
"github.com/nbd-wtf/go-nostr/keyer"
"github.com/stretchr/testify/require"
"golang.org/x/exp/rand"
)
@ -82,18 +84,16 @@ func TestWallet(t *testing.T) {
// wallet metadata event
metaEvent := &nostr.Event{}
if err := w.toEvent(ctx, kr, metaEvent); err != nil {
t.Fatal(err)
}
err = w.toEvent(ctx, kr, metaEvent)
require.NoError(t, err)
events = append(events, metaEvent)
// token events
for i := range w.Tokens {
evt := &nostr.Event{}
evt.Tags = nostr.Tags{}
if err := w.Tokens[i].toEvent(ctx, kr, evt); err != nil {
t.Fatal(err)
}
err := w.Tokens[i].toEvent(ctx, kr, evt)
require.NoError(t, err)
w.Tokens[i].event = evt
events = append(events, evt)
}
@ -102,9 +102,8 @@ func TestWallet(t *testing.T) {
for i := range w.History {
evt := &nostr.Event{}
evt.Tags = nostr.Tags{}
if err := w.History[i].toEvent(ctx, kr, evt); err != nil {
t.Fatal(err)
}
err := w.History[i].toEvent(ctx, kr, evt)
require.NoError(t, err)
w.History[i].event = evt
events = append(events, evt)
}
@ -164,46 +163,23 @@ func TestWallet(t *testing.T) {
// load wallet from events
loaded := loadWallet(ctx, kr, evtChan, eoseChan)
loaded.Processed = func(evt *nostr.Event, err error) {
fmt.Println("processed", evt, err)
fmt.Println("processed", evt.Kind, err)
}
<-loaded.Stable
// check if loaded wallet matches original
if len(loaded.Tokens) != len(w.Tokens) {
t.Errorf("token count mismatch: %d != %d", len(loaded.Tokens), len(w.Tokens))
}
if len(loaded.History) != len(w.History) {
t.Errorf("history count mismatch: %d != %d", len(loaded.History), len(w.History))
}
// check tokens are equal regardless of order
for _, ta := range loaded.Tokens {
found := false
for _, tb := range w.Tokens {
if ta.Mint == tb.Mint && ta.Proofs[0].Amount == tb.Proofs[0].Amount {
found = true
break
}
}
if !found {
t.Errorf("token not found in loaded wallet: %v", ta)
}
}
// check history entries are equal regardless of order
for _, ha := range loaded.History {
found := false
for _, hb := range w.History {
if ha.In == hb.In && ha.Amount == hb.Amount {
found = true
break
}
}
if !found {
t.Errorf("history entry not found in loaded wallet: %v", ha)
}
require.Len(t, loaded.Tokens, len(w.Tokens))
require.ElementsMatch(t, loaded.Tokens, w.Tokens)
require.Len(t, loaded.History, len(w.History))
slices.SortFunc(loaded.History, func(a, b HistoryEntry) int { return cmp.Compare(a.createdAt, b.createdAt) })
slices.SortFunc(w.History, func(a, b HistoryEntry) int { return cmp.Compare(a.createdAt, b.createdAt) })
for i := range w.History {
slices.SortFunc(loaded.History[i].TokenReferences, func(a, b TokenRef) int { return cmp.Compare(a.EventID, b.EventID) })
slices.SortFunc(w.History[i].TokenReferences, func(a, b TokenRef) int { return cmp.Compare(a.EventID, b.EventID) })
require.Equal(t, loaded.History[i], w.History[i])
}
require.ElementsMatch(t, loaded.Mints, w.Mints)
require.Equal(t, loaded.PublicKey.SerializeCompressed(), w.PublicKey.SerializeCompressed())
})
}
}