mirror of
https://github.com/nbd-wtf/go-nostr.git
synced 2025-08-05 13:54:12 +02:00
nip60: fix a bunch of stupid bugs.
This commit is contained in:
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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()
|
||||||
|
|
||||||
|
@@ -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())
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user