From e7432baebaab6945bca76ef7b626a26435a676ff Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Tue, 4 Feb 2025 10:25:13 -0300 Subject: [PATCH] nip60: fix a bunch of stupid bugs. --- nip60/history.go | 6 ++--- nip60/wallet.go | 5 ++-- nip60/wallet_test.go | 64 ++++++++++++++------------------------------ 3 files changed, 26 insertions(+), 49 deletions(-) diff --git a/nip60/history.go b/nip60/history.go index 2d78c2e..b1e17d3 100644 --- a/nip60/history.go +++ b/nip60/history.go @@ -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) } } diff --git a/nip60/wallet.go b/nip60/wallet.go index 8152cf8..57660cb 100644 --- a/nip60/wallet.go +++ b/nip60/wallet.go @@ -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() diff --git a/nip60/wallet_test.go b/nip60/wallet_test.go index 58d2552..6977852 100644 --- a/nip60/wallet_test.go +++ b/nip60/wallet_test.go @@ -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()) }) } }