diff --git a/sdk/system.go b/sdk/system.go index 291398c..0aebfb9 100644 --- a/sdk/system.go +++ b/sdk/system.go @@ -14,6 +14,7 @@ import ( "fiatjaf.com/nostr/sdk/hints/memoryh" "fiatjaf.com/nostr/sdk/kvstore" kvstore_memory "fiatjaf.com/nostr/sdk/kvstore/memory" + "github.com/btcsuite/btcd/btcec/v2" ) // System represents the core functionality of the SDK, providing access to @@ -41,6 +42,7 @@ type System struct { FollowSetsCache cache.Cache32[GenericSets[nostr.PubKey, ProfileRef]] TopicSetsCache cache.Cache32[GenericSets[string, Topic]] ZapProviderCache cache.Cache32[nostr.PubKey] + MintKeysCache cache.Cache32[map[uint64]*btcec.PublicKey] Hints hints.HintsDB Pool *nostr.Pool RelayListRelays *RelayStream @@ -135,6 +137,9 @@ func NewSystem() *System { if sys.ZapProviderCache == nil { sys.ZapProviderCache = cache_memory.New[nostr.PubKey](8000) } + if sys.MintKeysCache == nil { + sys.MintKeysCache = cache_memory.New[map[uint64]*btcec.PublicKey](8000) + } if sys.Store == nil { sys.Store = &nullstore.NullStore{} diff --git a/sdk/zap.go b/sdk/zap.go index d9d2dd6..614860b 100644 --- a/sdk/zap.go +++ b/sdk/zap.go @@ -2,12 +2,16 @@ package sdk import ( "context" + "crypto/sha256" "io" "net/http" "strings" "time" "fiatjaf.com/nostr" + "fiatjaf.com/nostr/nip60" + "fiatjaf.com/nostr/nip60/client" + "github.com/btcsuite/btcd/btcec/v2" "github.com/tidwall/gjson" ) @@ -47,3 +51,25 @@ func (sys *System) FetchZapProvider(ctx context.Context, pk nostr.PubKey) nostr. sys.ZapProviderCache.SetWithTTL(pk, nostr.ZeroPK, time.Hour*2) return nostr.ZeroPK } + +// FetchMintKeys fetches the active keyset from the given mint URL and parses the keys. +// It uses a cache to avoid repeated fetches. +func (sys *System) FetchMintKeys(ctx context.Context, mintURL string) (map[uint64]*btcec.PublicKey, error) { + hash := sha256.Sum256([]byte(mintURL)) + if v, ok := sys.MintKeysCache.Get(hash); ok { + return v, nil + } + + keyset, err := client.GetActiveKeyset(ctx, mintURL) + if err != nil { + return nil, err + } + + ksKeys, err := nip60.ParseKeysetKeys(keyset.Keys) + if err != nil { + return nil, err + } + + sys.MintKeysCache.SetWithTTL(hash, ksKeys, time.Hour*6) + return ksKeys, nil +}