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

View File

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

View File

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

View File

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