From 0f5042a5e61d6334aeca19b5f9d961b77b351aa9 Mon Sep 17 00:00:00 2001 From: Asara Date: Mon, 23 Sep 2024 19:50:50 -0400 Subject: [PATCH] upgrades, add some policies --- go.mod | 8 +-- go.sum | 15 +++--- nostr/relay.go | 2 + .../github.com/fiatjaf/eventstore/.gitignore | 2 - .../fiatjaf/eventstore/postgresql/query.go | 2 +- .../github.com/mattn/go-isatty/isatty_bsd.go | 3 +- .../mattn/go-isatty/isatty_others.go | 5 +- .../mattn/go-isatty/isatty_tcgets.go | 3 +- vendor/github.com/nbd-wtf/go-nostr/event.go | 21 ++++++++ vendor/github.com/nbd-wtf/go-nostr/kinds.go | 2 +- vendor/github.com/nbd-wtf/go-nostr/pool.go | 53 ++++++++++--------- vendor/github.com/nbd-wtf/go-nostr/relay.go | 7 +++ vendor/modules.txt | 8 +-- 13 files changed, 84 insertions(+), 47 deletions(-) diff --git a/go.mod b/go.mod index 3904a81..495d980 100644 --- a/go.mod +++ b/go.mod @@ -4,11 +4,11 @@ go 1.23.1 require ( git.devvul.com/asara/gologger v0.8.0 - github.com/fiatjaf/eventstore v0.9.0 + github.com/fiatjaf/eventstore v0.9.1 github.com/fiatjaf/khatru v0.8.1 github.com/jmoiron/sqlx v1.4.0 github.com/lib/pq v1.10.9 - github.com/nbd-wtf/go-nostr v0.36.1 + github.com/nbd-wtf/go-nostr v0.37.2 ) require ( @@ -25,7 +25,7 @@ require ( github.com/klauspost/compress v1.17.8 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.19 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect github.com/puzpuzpuz/xsync/v3 v3.4.0 // indirect github.com/rs/cors v1.7.0 // indirect github.com/rs/zerolog v1.33.0 // indirect @@ -36,6 +36,6 @@ require ( github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasthttp v1.51.0 // indirect golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 // indirect - golang.org/x/net v0.18.0 // indirect + golang.org/x/net v0.21.0 // indirect golang.org/x/sys v0.25.0 // indirect ) diff --git a/go.sum b/go.sum index 5ab4889..123a85a 100644 --- a/go.sum +++ b/go.sum @@ -17,8 +17,8 @@ github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 h1:rpfIENRNNilwHwZeG5+P150SMrnN github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= github.com/fasthttp/websocket v1.5.7 h1:0a6o2OfeATvtGgoMKleURhLT6JqWPg7fYfWnH4KHau4= github.com/fasthttp/websocket v1.5.7/go.mod h1:bC4fxSono9czeXHQUVKxsC0sNjbm7lPJR04GDFqClfU= -github.com/fiatjaf/eventstore v0.9.0 h1:WsGDVAaRaVaV/J8PdrQDGfzChrL13q+lTO4C44rhu3E= -github.com/fiatjaf/eventstore v0.9.0/go.mod h1:JrAce5h0wi79+Sw4gsEq5kz0NtUxbVkOZ7lAo7ay6R8= +github.com/fiatjaf/eventstore v0.9.1 h1:dLum4W6NOkDXMgckjj5lLfKrRVW8oN3zS7tfbXzGxJg= +github.com/fiatjaf/eventstore v0.9.1/go.mod h1:h5CdLSF7mEQ7/rWpEABTRIrNuFoSwdQDi/nZkW/vVFU= github.com/fiatjaf/khatru v0.8.1 h1:BWAZqwuT0272ZlyzPkuqAA0eGBOs5G3u0Dn1tlWrm6Q= github.com/fiatjaf/khatru v0.8.1/go.mod h1:jRmqbbIbEH+y0unt3wMUBwqY/btVussqx5SmBoGhXtg= github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= @@ -43,12 +43,13 @@ github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJ github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= -github.com/nbd-wtf/go-nostr v0.36.1 h1:FdLjHpgXhLfhIjVFpYlQ2AVDUJkpOpXRs3LrkpUh32c= -github.com/nbd-wtf/go-nostr v0.36.1/go.mod h1:g21TyEpFBmbP7fb8Mc99R1oD76hsyVcQ1rMYCasgU6A= +github.com/nbd-wtf/go-nostr v0.37.2 h1:42rriFqqz07EdydERwYeQnewl+Rah1Gq46I+Wh0KYYg= +github.com/nbd-wtf/go-nostr v0.37.2/go.mod h1:TGKGj00BmJRXvRe0LlpDN3KKbELhhPXgBwUEhzu3Oq0= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -76,8 +77,8 @@ github.com/valyala/fasthttp v1.51.0 h1:8b30A5JlZ6C7AS81RsWjYMQmrZG6feChmgAolCl1S github.com/valyala/fasthttp v1.51.0/go.mod h1:oI2XroL+lI7vdXyYoQk03bXBThfFl2cVdIA3Xl7cH8g= golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 h1:e66Fs6Z+fZTbFBAxKfP3PALWBtpfqks2bwGcexMxgtk= golang.org/x/exp v0.0.0-20240909161429-701f63a606c0/go.mod h1:2TbTHSBQa924w8M6Xs1QcRcFwyucIwBGpK1p2f1YFFY= -golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg= -golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= +golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= diff --git a/nostr/relay.go b/nostr/relay.go index 1ade0af..f679258 100644 --- a/nostr/relay.go +++ b/nostr/relay.go @@ -67,6 +67,8 @@ func NewRelay(version string) *khatru.Relay { relay.RejectFilter = append( relay.RejectFilter, policies.RejectKind04Snoopers, + policies.NoEmptyFilters, + policies.NoComplexFilters, ) return relay diff --git a/vendor/github.com/fiatjaf/eventstore/.gitignore b/vendor/github.com/fiatjaf/eventstore/.gitignore index 89f530b..e69de29 100644 --- a/vendor/github.com/fiatjaf/eventstore/.gitignore +++ b/vendor/github.com/fiatjaf/eventstore/.gitignore @@ -1,2 +0,0 @@ -cmd/eventstore/eventstore -eventstore diff --git a/vendor/github.com/fiatjaf/eventstore/postgresql/query.go b/vendor/github.com/fiatjaf/eventstore/postgresql/query.go index fa4fe06..9bcf145 100644 --- a/vendor/github.com/fiatjaf/eventstore/postgresql/query.go +++ b/vendor/github.com/fiatjaf/eventstore/postgresql/query.go @@ -132,7 +132,7 @@ func (b PostgresBackend) queryEventsSql(filter nostr.Filter, doCount bool) (stri params = append(params, tagValue) } - conditions = append(conditions, `tagvalues <@ ARRAY[`+makePlaceHolders(len(tagQuery))+`]`) + conditions = append(conditions, `tagvalues && ARRAY[`+makePlaceHolders(len(tagQuery))+`]`) } if filter.Since != nil { diff --git a/vendor/github.com/mattn/go-isatty/isatty_bsd.go b/vendor/github.com/mattn/go-isatty/isatty_bsd.go index d569c0c..d0ea68f 100644 --- a/vendor/github.com/mattn/go-isatty/isatty_bsd.go +++ b/vendor/github.com/mattn/go-isatty/isatty_bsd.go @@ -1,6 +1,7 @@ -//go:build (darwin || freebsd || openbsd || netbsd || dragonfly || hurd) && !appengine +//go:build (darwin || freebsd || openbsd || netbsd || dragonfly || hurd) && !appengine && !tinygo // +build darwin freebsd openbsd netbsd dragonfly hurd // +build !appengine +// +build !tinygo package isatty diff --git a/vendor/github.com/mattn/go-isatty/isatty_others.go b/vendor/github.com/mattn/go-isatty/isatty_others.go index 3150322..7402e06 100644 --- a/vendor/github.com/mattn/go-isatty/isatty_others.go +++ b/vendor/github.com/mattn/go-isatty/isatty_others.go @@ -1,5 +1,6 @@ -//go:build appengine || js || nacl || wasm -// +build appengine js nacl wasm +//go:build (appengine || js || nacl || tinygo || wasm) && !windows +// +build appengine js nacl tinygo wasm +// +build !windows package isatty diff --git a/vendor/github.com/mattn/go-isatty/isatty_tcgets.go b/vendor/github.com/mattn/go-isatty/isatty_tcgets.go index 6778765..0337d8c 100644 --- a/vendor/github.com/mattn/go-isatty/isatty_tcgets.go +++ b/vendor/github.com/mattn/go-isatty/isatty_tcgets.go @@ -1,6 +1,7 @@ -//go:build (linux || aix || zos) && !appengine +//go:build (linux || aix || zos) && !appengine && !tinygo // +build linux aix zos // +build !appengine +// +build !tinygo package isatty diff --git a/vendor/github.com/nbd-wtf/go-nostr/event.go b/vendor/github.com/nbd-wtf/go-nostr/event.go index 37bc20d..de7f9cb 100644 --- a/vendor/github.com/nbd-wtf/go-nostr/event.go +++ b/vendor/github.com/nbd-wtf/go-nostr/event.go @@ -141,3 +141,24 @@ func (evt *Event) Sign(privateKey string, signOpts ...schnorr.SignOption) error return nil } + +// IsRegular checks if the given kind is in Regular range. +func (evt *Event) IsRegular() bool { + return evt.Kind < 10000 && evt.Kind != 0 && evt.Kind != 3 +} + +// IsReplaceable checks if the given kind is in Replaceable range. +func (evt *Event) IsReplaceable() bool { + return evt.Kind == 0 || evt.Kind == 3 || + (10000 <= evt.Kind && evt.Kind < 20000) +} + +// IsEphemeral checks if the given kind is in Ephemeral range. +func (evt *Event) IsEphemeral() bool { + return 20000 <= evt.Kind && evt.Kind < 30000 +} + +// IsAddressable checks if the given kind is in Addressable range. +func (evt *Event) IsAddressable() bool { + return 30000 <= evt.Kind && evt.Kind < 40000 +} diff --git a/vendor/github.com/nbd-wtf/go-nostr/kinds.go b/vendor/github.com/nbd-wtf/go-nostr/kinds.go index ef40e9d..2523570 100644 --- a/vendor/github.com/nbd-wtf/go-nostr/kinds.go +++ b/vendor/github.com/nbd-wtf/go-nostr/kinds.go @@ -4,7 +4,7 @@ const ( KindProfileMetadata int = 0 KindTextNote int = 1 KindRecommendServer int = 2 - KindContactList int = 3 + KindFollowList int = 3 KindEncryptedDirectMessage int = 4 KindDeletion int = 5 KindRepost int = 6 diff --git a/vendor/github.com/nbd-wtf/go-nostr/pool.go b/vendor/github.com/nbd-wtf/go-nostr/pool.go index 846d176..d91954c 100644 --- a/vendor/github.com/nbd-wtf/go-nostr/pool.go +++ b/vendor/github.com/nbd-wtf/go-nostr/pool.go @@ -21,10 +21,10 @@ type SimplePool struct { Relays *xsync.MapOf[string, *Relay] Context context.Context - authHandler func(*Event) error + authHandler func(context.Context, RelayEvent) error cancel context.CancelFunc - eventMiddleware []func(IncomingEvent) + eventMiddleware []func(RelayEvent) // custom things not often used signatureChecker func(Event) bool @@ -37,12 +37,12 @@ type DirectedFilters struct { Relay string } -type IncomingEvent struct { +type RelayEvent struct { *Event Relay *Relay } -func (ie IncomingEvent) String() string { +func (ie RelayEvent) String() string { return fmt.Sprintf("[%s] >> %s", ie.Relay.URL, ie.Event) } @@ -70,7 +70,7 @@ func NewSimplePool(ctx context.Context, opts ...PoolOption) *SimplePool { // WithAuthHandler must be a function that signs the auth event when called. // it will be called whenever any relay in the pool returns a `CLOSED` message // with the "auth-required:" prefix, only once for each relay -type WithAuthHandler func(authEvent *Event) error +type WithAuthHandler func(ctx context.Context, authEvent RelayEvent) error func (h WithAuthHandler) ApplyPoolOption(pool *SimplePool) { pool.authHandler = h @@ -114,7 +114,7 @@ func (h withPenaltyBoxOpt) ApplyPoolOption(pool *SimplePool) { // WithEventMiddleware is a function that will be called with all events received. // more than one can be passed at a time. -type WithEventMiddleware func(IncomingEvent) +type WithEventMiddleware func(RelayEvent) func (h WithEventMiddleware) ApplyPoolOption(pool *SimplePool) { pool.eventMiddleware = append(pool.eventMiddleware, h) @@ -173,19 +173,19 @@ func (pool *SimplePool) EnsureRelay(url string) (*Relay, error) { // SubMany opens a subscription with the given filters to multiple relays // the subscriptions only end when the context is canceled -func (pool *SimplePool) SubMany(ctx context.Context, urls []string, filters Filters) chan IncomingEvent { +func (pool *SimplePool) SubMany(ctx context.Context, urls []string, filters Filters) chan RelayEvent { return pool.subMany(ctx, urls, filters, true) } // SubManyNonUnique is like SubMany, but returns duplicate events if they come from different relays -func (pool *SimplePool) SubManyNonUnique(ctx context.Context, urls []string, filters Filters) chan IncomingEvent { +func (pool *SimplePool) SubManyNonUnique(ctx context.Context, urls []string, filters Filters) chan RelayEvent { return pool.subMany(ctx, urls, filters, false) } -func (pool *SimplePool) subMany(ctx context.Context, urls []string, filters Filters, unique bool) chan IncomingEvent { +func (pool *SimplePool) subMany(ctx context.Context, urls []string, filters Filters, unique bool) chan RelayEvent { ctx, cancel := context.WithCancel(ctx) _ = cancel // do this so `go vet` will stop complaining - events := make(chan IncomingEvent) + events := make(chan RelayEvent) seenAlready := xsync.NewMapOf[string, Timestamp]() ticker := time.NewTicker(seenAlreadyDropTick) @@ -255,7 +255,7 @@ func (pool *SimplePool) subMany(ctx context.Context, urls []string, filters Filt goto reconnect } - ie := IncomingEvent{Event: evt, Relay: relay} + ie := RelayEvent{Event: evt, Relay: relay} for _, mh := range pool.eventMiddleware { mh(ie) } @@ -284,7 +284,10 @@ func (pool *SimplePool) subMany(ctx context.Context, urls []string, filters Filt case reason := <-sub.ClosedReason: if strings.HasPrefix(reason, "auth-required:") && pool.authHandler != nil && !hasAuthed { // relay is requesting auth. if we can we will perform auth and try again - if err := relay.Auth(ctx, pool.authHandler); err == nil { + err := relay.Auth(ctx, func(event *Event) error { + return pool.authHandler(ctx, RelayEvent{Event: event, Relay: relay}) + }) + if err == nil { hasAuthed = true // so we don't keep doing AUTH again and again goto subscribe } @@ -310,19 +313,19 @@ func (pool *SimplePool) subMany(ctx context.Context, urls []string, filters Filt } // SubManyEose is like SubMany, but it stops subscriptions and closes the channel when gets a EOSE -func (pool *SimplePool) SubManyEose(ctx context.Context, urls []string, filters Filters) chan IncomingEvent { +func (pool *SimplePool) SubManyEose(ctx context.Context, urls []string, filters Filters) chan RelayEvent { return pool.subManyEose(ctx, urls, filters, true) } // SubManyEoseNonUnique is like SubManyEose, but returns duplicate events if they come from different relays -func (pool *SimplePool) SubManyEoseNonUnique(ctx context.Context, urls []string, filters Filters) chan IncomingEvent { +func (pool *SimplePool) SubManyEoseNonUnique(ctx context.Context, urls []string, filters Filters) chan RelayEvent { return pool.subManyEose(ctx, urls, filters, false) } -func (pool *SimplePool) subManyEose(ctx context.Context, urls []string, filters Filters, unique bool) chan IncomingEvent { +func (pool *SimplePool) subManyEose(ctx context.Context, urls []string, filters Filters, unique bool) chan RelayEvent { ctx, cancel := context.WithCancel(ctx) - events := make(chan IncomingEvent) + events := make(chan RelayEvent) seenAlready := xsync.NewMapOf[string, bool]() wg := sync.WaitGroup{} wg.Add(len(urls)) @@ -361,7 +364,9 @@ func (pool *SimplePool) subManyEose(ctx context.Context, urls []string, filters case reason := <-sub.ClosedReason: if strings.HasPrefix(reason, "auth-required:") && pool.authHandler != nil && !hasAuthed { // relay is requesting auth. if we can we will perform auth and try again - err := relay.Auth(ctx, pool.authHandler) + err := relay.Auth(ctx, func(event *Event) error { + return pool.authHandler(ctx, RelayEvent{Event: event, Relay: relay}) + }) if err == nil { hasAuthed = true // so we don't keep doing AUTH again and again goto subscribe @@ -374,7 +379,7 @@ func (pool *SimplePool) subManyEose(ctx context.Context, urls []string, filters return } - ie := IncomingEvent{Event: evt, Relay: relay} + ie := RelayEvent{Event: evt, Relay: relay} for _, mh := range pool.eventMiddleware { mh(ie) } @@ -399,7 +404,7 @@ func (pool *SimplePool) subManyEose(ctx context.Context, urls []string, filters } // QuerySingle returns the first event returned by the first relay, cancels everything else. -func (pool *SimplePool) QuerySingle(ctx context.Context, urls []string, filter Filter) *IncomingEvent { +func (pool *SimplePool) QuerySingle(ctx context.Context, urls []string, filter Filter) *RelayEvent { ctx, cancel := context.WithCancel(ctx) defer cancel() for ievt := range pool.SubManyEose(ctx, urls, Filters{filter}) { @@ -411,9 +416,9 @@ func (pool *SimplePool) QuerySingle(ctx context.Context, urls []string, filter F func (pool *SimplePool) batchedSubMany( ctx context.Context, dfs []DirectedFilters, - subFn func(context.Context, []string, Filters, bool) chan IncomingEvent, -) chan IncomingEvent { - res := make(chan IncomingEvent) + subFn func(context.Context, []string, Filters, bool) chan RelayEvent, +) chan RelayEvent { + res := make(chan RelayEvent) for _, df := range dfs { go func(df DirectedFilters) { @@ -427,11 +432,11 @@ func (pool *SimplePool) batchedSubMany( } // BatchedSubMany fires subscriptions only to specific relays, but batches them when they are the same. -func (pool *SimplePool) BatchedSubMany(ctx context.Context, dfs []DirectedFilters) chan IncomingEvent { +func (pool *SimplePool) BatchedSubMany(ctx context.Context, dfs []DirectedFilters) chan RelayEvent { return pool.batchedSubMany(ctx, dfs, pool.subMany) } // BatchedSubManyEose is like BatchedSubMany, but ends upon receiving EOSE from all relays. -func (pool *SimplePool) BatchedSubManyEose(ctx context.Context, dfs []DirectedFilters) chan IncomingEvent { +func (pool *SimplePool) BatchedSubManyEose(ctx context.Context, dfs []DirectedFilters) chan RelayEvent { return pool.batchedSubMany(ctx, dfs, pool.subManyEose) } diff --git a/vendor/github.com/nbd-wtf/go-nostr/relay.go b/vendor/github.com/nbd-wtf/go-nostr/relay.go index ce44268..ca86a1c 100644 --- a/vendor/github.com/nbd-wtf/go-nostr/relay.go +++ b/vendor/github.com/nbd-wtf/go-nostr/relay.go @@ -160,6 +160,13 @@ func (r *Relay) ConnectWithTLS(ctx context.Context, tlsConfig *tls.Config) error defer cancel() } + if r.RequestHeader == nil { + r.RequestHeader = make(http.Header, 1) + } + if r.RequestHeader.Get("User-Agent") == "" { + r.RequestHeader.Set("User-Agent", "github.com/nbd-wtf/go-nostr") + } + conn, err := NewConnection(ctx, r.URL, r.RequestHeader, tlsConfig) if err != nil { return fmt.Errorf("error opening websocket to '%s': %w", r.URL, err) diff --git a/vendor/modules.txt b/vendor/modules.txt index 5a726f7..be44734 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -22,7 +22,7 @@ github.com/decred/dcrd/dcrec/secp256k1/v4/schnorr # github.com/fasthttp/websocket v1.5.7 ## explicit; go 1.18 github.com/fasthttp/websocket -# github.com/fiatjaf/eventstore v0.9.0 +# github.com/fiatjaf/eventstore v0.9.1 ## explicit; go 1.23.0 github.com/fiatjaf/eventstore github.com/fiatjaf/eventstore/postgresql @@ -70,10 +70,10 @@ github.com/mailru/easyjson/jwriter # github.com/mattn/go-colorable v0.1.13 ## explicit; go 1.15 github.com/mattn/go-colorable -# github.com/mattn/go-isatty v0.0.19 +# github.com/mattn/go-isatty v0.0.20 ## explicit; go 1.15 github.com/mattn/go-isatty -# github.com/nbd-wtf/go-nostr v0.36.1 +# github.com/nbd-wtf/go-nostr v0.37.2 ## explicit; go 1.23.0 github.com/nbd-wtf/go-nostr github.com/nbd-wtf/go-nostr/nip11 @@ -113,7 +113,7 @@ github.com/valyala/fasthttp/stackless # golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 ## explicit; go 1.22.0 golang.org/x/exp/constraints -# golang.org/x/net v0.18.0 +# golang.org/x/net v0.21.0 ## explicit; go 1.18 golang.org/x/net/internal/socks golang.org/x/net/proxy