From 0e2da7b31e94417cf19af6e0b118fd7ca0a75e55 Mon Sep 17 00:00:00 2001 From: polebug Date: Sat, 2 Nov 2024 11:32:35 +0800 Subject: [PATCH 01/31] feat: support atproto client --- go.mod | 26 +++++- go.sum | 80 +++++++++++++++++++ .../engine/protocol/atproto/data_source.go | 37 +++++++++ internal/engine/protocol/atproto/state.go | 6 ++ provider/atproto/bluesky/client.go | 49 ++++++++++++ 5 files changed, 196 insertions(+), 2 deletions(-) create mode 100644 internal/engine/protocol/atproto/data_source.go create mode 100644 internal/engine/protocol/atproto/state.go create mode 100644 provider/atproto/bluesky/client.go diff --git a/go.mod b/go.mod index c88c93d24..a6b264d21 100644 --- a/go.mod +++ b/go.mod @@ -81,8 +81,10 @@ require ( github.com/andybalholm/cascadia v1.3.2 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bits-and-blooms/bitset v1.10.0 // indirect + github.com/bluesky-social/indigo v0.0.0-20241031232035-1a73c3fb6841 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/btcsuite/btcd/chaincfg/chainhash v1.0.2 // indirect + github.com/carlmjohnson/versioninfo v0.22.5 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/consensys/bavard v0.1.13 // indirect github.com/consensys/gnark-crypto v0.12.1 // indirect @@ -111,23 +113,38 @@ require ( github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect github.com/google/uuid v1.6.0 // indirect - github.com/gorilla/websocket v1.5.0 // indirect + github.com/gorilla/websocket v1.5.1 // indirect github.com/grafana/pyroscope-go/godeltaprof v0.1.8 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/hashicorp/go-retryablehttp v0.7.5 // indirect + github.com/hashicorp/golang-lru v1.0.2 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/holiman/uint256 v1.2.4 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/ipfs/bbloom v0.0.4 // indirect + github.com/ipfs/go-block-format v0.2.0 // indirect + github.com/ipfs/go-datastore v0.6.0 // indirect + github.com/ipfs/go-ipfs-blockstore v1.3.1 // indirect + github.com/ipfs/go-ipfs-ds-help v1.1.1 // indirect + github.com/ipfs/go-ipfs-util v0.0.3 // indirect + github.com/ipfs/go-ipld-cbor v0.1.0 // indirect + github.com/ipfs/go-ipld-format v0.6.0 // indirect + github.com/ipfs/go-log v1.0.5 // indirect + github.com/ipfs/go-log/v2 v2.5.1 // indirect + github.com/ipfs/go-metrics-interface v0.0.1 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect github.com/jackc/pgx/v5 v5.7.1 // indirect github.com/jackc/puddle/v2 v2.2.2 // indirect + github.com/jbenet/goprocess v0.1.4 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/compress v1.17.9 // indirect - github.com/klauspost/cpuid/v2 v2.2.5 // indirect + github.com/klauspost/cpuid/v2 v2.2.7 // indirect github.com/labstack/gommon v0.4.2 // indirect github.com/leodido/go-urn v1.4.0 // indirect github.com/magiconair/properties v1.8.7 // indirect @@ -152,11 +169,13 @@ require ( github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0 // indirect github.com/opencontainers/runc v1.1.12 // indirect + github.com/opentracing/opentracing-go v1.2.0 // indirect github.com/ory/dockertest/v3 v3.10.0 // indirect github.com/pelletier/go-toml/v2 v2.2.2 // indirect github.com/pierrec/lz4/v4 v4.1.21 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/polydawn/refmt v0.89.1-0.20221221234430-40501e09de1f // indirect github.com/prometheus/client_model v0.6.1 // indirect github.com/prometheus/common v0.60.0 // indirect github.com/prometheus/procfs v0.15.1 // indirect @@ -180,18 +199,21 @@ require ( github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasttemplate v1.2.2 // indirect github.com/vektah/gqlparser/v2 v2.5.11 // indirect + github.com/whyrusleeping/cbor-gen v0.1.3-0.20240904181319-8dc02b38228c // indirect github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect github.com/xeipuuv/gojsonschema v1.2.0 // indirect github.com/yusufpapurcu/wmi v1.2.3 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.50.0 // indirect go.opentelemetry.io/proto/otlp v1.3.1 // indirect + go.uber.org/atomic v1.11.0 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/crypto v0.28.0 // indirect golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect golang.org/x/sys v0.26.0 // indirect golang.org/x/text v0.19.0 // indirect golang.org/x/time v0.5.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20241007155032-5fefd90f89a9 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9 // indirect google.golang.org/grpc v1.67.1 // indirect diff --git a/go.sum b/go.sum index 505a7aa40..3da21098c 100644 --- a/go.sum +++ b/go.sum @@ -4,6 +4,7 @@ filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/DataDog/zstd v1.5.0 h1:+K/VEwIAaPcHiMtQvpLD4lqW7f0Gk3xdYZmI1hD+CXo= github.com/DataDog/zstd v1.5.0/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= github.com/JohannesKaufmann/html-to-markdown v1.6.0 h1:04VXMiE50YYfCfLboJCLcgqF5x+rHJnb1ssNmqpLH/k= @@ -32,10 +33,14 @@ github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88= github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/bluesky-social/indigo v0.0.0-20241031232035-1a73c3fb6841 h1:HCj4iBoAV59Fn1vsEhbeEMOExR4vOrUgz+sxUoV+F6s= +github.com/bluesky-social/indigo v0.0.0-20241031232035-1a73c3fb6841/go.mod h1:Zx9nSWgd/FxMenkJW07VKnzspxpHBdPrPmS+Fspl2I0= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.2 h1:KdUfX2zKommPRa+PD0sWZUyXe9w277ABlgELO7H04IM= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.2/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/carlmjohnson/versioninfo v0.22.5 h1:O00sjOLUAFxYQjlN/bzYTuZiS0y6fWDQjMRvwtKgwwc= +github.com/carlmjohnson/versioninfo v0.22.5/go.mod h1:QT9mph3wcVfISUKd0i9sZfVrPviHuSF+cUtLjm2WSf8= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= @@ -62,6 +67,7 @@ github.com/containerd/continuity v0.4.3 h1:6HVkalIp+2u1ZLH1J/pYX2oBVXlJZvh1X1A7b github.com/containerd/continuity v0.4.3/go.mod h1:F6PTNCKepoxEaXLQp3wDAjygEnImnZ/7o4JzpodfroQ= github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.4 h1:wfIWP927BUkWJb2NmU/kNDYIBTh/ziUX91+lVfRxZq4= github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 h1:d28BXYi+wUpz1KBmiF9bWrjEMacUEREV6MBi2ODnrfQ= @@ -154,6 +160,7 @@ github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpv github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= +github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= @@ -188,13 +195,16 @@ github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k= github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= github.com/grafana/pyroscope-go v1.2.0 h1:aILLKjTj8CS8f/24OPMGPewQSYlhmdQMBmol1d3KGj8= github.com/grafana/pyroscope-go v1.2.0/go.mod h1:2GHr28Nr05bg2pElS+dDsc98f3JTUh2f6Fz1hWXrqwk= github.com/grafana/pyroscope-go/godeltaprof v0.1.8 h1:iwOtYXeeVSAeYefJNaxDytgjKtUuKQbJqgAIjlnicKg= @@ -208,9 +218,16 @@ github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE= github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= +github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/hashicorp/go-retryablehttp v0.7.5 h1:bJj+Pj19UZMIweq/iie+1u5YCdGrnxCT9yvm0e+Nd5M= +github.com/hashicorp/go-retryablehttp v0.7.5/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8= github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= +github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= +github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= @@ -226,8 +243,31 @@ github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs= +github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0= +github.com/ipfs/go-block-format v0.2.0 h1:ZqrkxBA2ICbDRbK8KJs/u0O3dlp6gmAuuXUJNiW1Ycs= +github.com/ipfs/go-block-format v0.2.0/go.mod h1:+jpL11nFx5A/SPpsoBn6Bzkra/zaArfSmsknbPMYgzM= github.com/ipfs/go-cid v0.4.1 h1:A/T3qGvxi4kpKWWcPC/PgbvDA2bjVLO7n4UeVwnbs/s= github.com/ipfs/go-cid v0.4.1/go.mod h1:uQHwDeX4c6CtyrFwdqyhpNcxVewur1M7l7fNU7LKwZk= +github.com/ipfs/go-datastore v0.6.0 h1:JKyz+Gvz1QEZw0LsX1IBn+JFCJQH4SJVFtM4uWU0Myk= +github.com/ipfs/go-datastore v0.6.0/go.mod h1:rt5M3nNbSO/8q1t4LNkLyUwRs8HupMeN/8O4Vn9YAT8= +github.com/ipfs/go-ipfs-blockstore v1.3.1 h1:cEI9ci7V0sRNivqaOr0elDsamxXFxJMMMy7PTTDQNsQ= +github.com/ipfs/go-ipfs-blockstore v1.3.1/go.mod h1:KgtZyc9fq+P2xJUiCAzbRdhhqJHvsw8u2Dlqy2MyRTE= +github.com/ipfs/go-ipfs-ds-help v1.1.1 h1:B5UJOH52IbcfS56+Ul+sv8jnIV10lbjLF5eOO0C66Nw= +github.com/ipfs/go-ipfs-ds-help v1.1.1/go.mod h1:75vrVCkSdSFidJscs8n4W+77AtTpCIAdDGAwjitJMIo= +github.com/ipfs/go-ipfs-util v0.0.3 h1:2RFdGez6bu2ZlZdI+rWfIdbQb1KudQp3VGwPtdNCmE0= +github.com/ipfs/go-ipfs-util v0.0.3/go.mod h1:LHzG1a0Ig4G+iZ26UUOMjHd+lfM84LZCrn17xAKWBvs= +github.com/ipfs/go-ipld-cbor v0.1.0 h1:dx0nS0kILVivGhfWuB6dUpMa/LAwElHPw1yOGYopoYs= +github.com/ipfs/go-ipld-cbor v0.1.0/go.mod h1:U2aYlmVrJr2wsUBU67K4KgepApSZddGRDWBYR0H4sCk= +github.com/ipfs/go-ipld-format v0.6.0 h1:VEJlA2kQ3LqFSIm5Vu6eIlSxD/Ze90xtc4Meten1F5U= +github.com/ipfs/go-ipld-format v0.6.0/go.mod h1:g4QVMTn3marU3qXchwjpKPKgJv+zF+OlaKMyhJ4LHPg= +github.com/ipfs/go-log v1.0.5 h1:2dOuUCB1Z7uoczMWgAyDck5JLb72zHzrMnGnCNNbvY8= +github.com/ipfs/go-log v1.0.5/go.mod h1:j0b8ZoR+7+R99LD9jZ6+AJsrzkPbSXbZfGakb5JPtIo= +github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Axpmri6g= +github.com/ipfs/go-log/v2 v2.5.1 h1:1XdUzF7048prq4aBjDQQ4SL5RxftpRGdXhNRwKSAlcY= +github.com/ipfs/go-log/v2 v2.5.1/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI= +github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fGD6n0jO4kdg= +github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= @@ -240,6 +280,9 @@ github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7Bd github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jaytaylor/html2text v0.0.0-20230321000545-74c2419ad056 h1:iCHtR9CQyktQ5+f3dMVZfwD2KWJUgm7M0gdL9NGr8KA= github.com/jaytaylor/html2text v0.0.0-20230321000545-74c2419ad056/go.mod h1:CVKlgaMiht+LXvHG173ujK6JUhZXKb2u/BQtjPDIvyk= +github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= +github.com/jbenet/goprocess v0.1.4 h1:DRGOFReOMqqDNXwW70QkacFW0YN9QnwLV0Vqk+3oU0o= +github.com/jbenet/goprocess v0.1.4/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= @@ -247,12 +290,15 @@ github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg= github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= +github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= @@ -278,6 +324,7 @@ github.com/matryer/is v1.4.1 h1:55ehd8zaGABKLXQUe2awZ99BD/PTc2ls+KV/dXphgEQ= github.com/matryer/is v1.4.1/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= 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.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= 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= @@ -348,6 +395,8 @@ github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQ github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= github.com/opencontainers/runc v1.1.12 h1:BOIssBaW1La0/qbNZHXOOa71dZfZEQOzW7dqQf3phss= github.com/opencontainers/runc v1.1.12/go.mod h1:S+lQwSfncpBha7XTy/5lBwWgm5+y5Ma/O44Ekby9FK8= +github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= +github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= github.com/orlangure/gnomock v0.31.0 h1:dgjlQ8DYUPMyNwMZJuYBH+/GF+e7h3sloldPzIJF4k4= github.com/orlangure/gnomock v0.31.0/go.mod h1:RagxeYv3bKi+li9Lio2Faw5t6Mcy4akkeqXzkgAS3w0= github.com/ory/dockertest/v3 v3.10.0 h1:4K3z2VMe8Woe++invjaTB7VRyQXQy5UY+loujO4aNE4= @@ -362,6 +411,8 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/polydawn/refmt v0.89.1-0.20221221234430-40501e09de1f h1:VXTQfuJj9vKR4TCkEuWIckKvdHFeJH/huIFJ9/cXOB0= +github.com/polydawn/refmt v0.89.1-0.20221221234430-40501e09de1f/go.mod h1:/zvteZs/GwLtCgZ4BL6CBsk9IKIlexP43ObX9AxTqTw= github.com/pressly/goose/v3 v3.22.1 h1:2zICEfr1O3yTP9BRZMGPj7qFxQ+ik6yeo+z1LMuioLc= github.com/pressly/goose/v3 v3.22.1/go.mod h1:xtMpbstWyCpyH+0cxLTMCENWBG+0CSxvTsXhW95d5eo= github.com/prometheus/client_golang v1.20.4 h1:Tgh3Yr67PaOv/uTqloMsCEdeuFTatm5zIq5+qNN23vI= @@ -386,6 +437,7 @@ github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= @@ -393,6 +445,7 @@ github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rss3-network/protocol-go v0.5.14 h1:gd6ciwXb5e4xx1dmAOAIKWbpami2QbARqE61zbwT6KE= github.com/rss3-network/protocol-go v0.5.14/go.mod h1:npcyduWt86uVbIi77xQaYk8eqltI9XNjk1FMGpjyIq0= github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= @@ -412,8 +465,11 @@ github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKl github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k= github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/smartystreets/assertions v1.2.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo= +github.com/smartystreets/goconvey v1.7.2/go.mod h1:Vw0tHAZW6lzCRk3xgdin6fKYcG+G3Pg9vgXWeJpQFMM= github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= @@ -437,6 +493,7 @@ github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSS github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= @@ -484,6 +541,7 @@ github.com/twmb/franz-go/pkg/kmsg v1.9.0/go.mod h1:CMbfazviCyY6HM0SXuG5t9vOwYDHR github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= github.com/urfave/cli v1.22.1 h1:+mkCCcOFKPnCmVYVcURKps1Xe+3zP90gSYGNfRkjoIY= +github.com/urfave/cli v1.22.10/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= @@ -494,6 +552,9 @@ github.com/vektah/gqlparser/v2 v2.5.11 h1:JJxLtXIoN7+3x6MBdtIP59TP1RANnY7pXOaDnA github.com/vektah/gqlparser/v2 v2.5.11/go.mod h1:1rCcfwB2ekJofmluGWXMSEnPMZgbxzwj6FaZ/4OT8Cc= github.com/vincent-petithory/dataurl v1.0.0 h1:cXw+kPto8NLuJtlMsI152irrVw9fRDX8AbShPRpg2CI= github.com/vincent-petithory/dataurl v1.0.0/go.mod h1:FHafX5vmDzyP+1CQATJn7WFKc9CvnvxyvZy6I1MrG/U= +github.com/warpfork/go-wish v0.0.0-20220906213052-39a1cc7a02d0/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= +github.com/whyrusleeping/cbor-gen v0.1.3-0.20240904181319-8dc02b38228c h1:UsxJNcLPfyLyVaA4iusIrsLAqJn/xh36Qgb8emqtXzk= +github.com/whyrusleeping/cbor-gen v0.1.3-0.20240904181319-8dc02b38228c/go.mod h1:pM99HXyEbSQHcosHc0iW7YFmwnscr+t9Te4ibko05so= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= @@ -533,20 +594,29 @@ go.opentelemetry.io/otel/trace v1.31.0 h1:ffjsj1aRouKewfr85U2aGagJ46+MvodynlQ1HY go.opentelemetry.io/otel/trace v1.31.0/go.mod h1:TXZkRk7SM2ZQLtR6eoAWQFIHPvzQ06FJAsO1tJg480A= go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= +go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU= go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= +go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= +go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= @@ -558,6 +628,7 @@ golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7 golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8= golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= @@ -612,6 +683,7 @@ golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -651,6 +723,10 @@ golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= @@ -663,6 +739,8 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= google.golang.org/genproto/googleapis/api v0.0.0-20241007155032-5fefd90f89a9 h1:T6rh4haD3GVYsgEfWExoCZA2o2FmbNyKpTuAxbEFPTg= google.golang.org/genproto/googleapis/api v0.0.0-20241007155032-5fefd90f89a9/go.mod h1:wp2WsuBYj6j8wUdo3ToZsdxxixbvQNAHqVJrTgi5E5M= google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9 h1:QCqS/PdaHTSWGvupk2F/ehwHtGc0/GYkT+3GAcR1CCc= @@ -682,6 +760,7 @@ gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= @@ -707,6 +786,7 @@ gorm.io/gorm v1.25.11 h1:/Wfyg1B/je1hnDx3sMkX+gAlxrlZpn6X0BXRlwXlvHg= gorm.io/gorm v1.25.11/go.mod h1:xh7N7RHfYlNc5EmcI/El95gXusucDrQnHXe0+CgWcLQ= gotest.tools/v3 v3.3.0 h1:MfDY1b1/0xN1CyMlQDac0ziEy9zJQd9CXBRRDHw2jJo= gotest.tools/v3 v3.3.0/go.mod h1:Mcr9QNxkg0uMvy/YElmo4SpXgJKWgQvYrT7Kw5RzJ1A= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= lukechampine.com/blake3 v1.2.1 h1:YuqqRuaqsGV71BV/nm9xlI0MKUv4QC54jQnBChWbGnI= lukechampine.com/blake3 v1.2.1/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k= modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 h1:5D53IMaUuA5InSeMu9eJtlQXS2NxAhyWQvkKEgXZhHI= diff --git a/internal/engine/protocol/atproto/data_source.go b/internal/engine/protocol/atproto/data_source.go new file mode 100644 index 000000000..5baa7febf --- /dev/null +++ b/internal/engine/protocol/atproto/data_source.go @@ -0,0 +1,37 @@ +package atproto + +import ( + "context" + "encoding/json" + "github.com/rss3-network/node/config" + "github.com/rss3-network/node/internal/database" + "github.com/rss3-network/node/internal/engine" + "github.com/rss3-network/protocol-go/schema/network" + "github.com/samber/lo" +) + +var _ engine.DataSource = (*dataSource)(nil) + +type dataSource struct { + config *config.Module + state State + databaseClient database.Client +} + +func (s *dataSource) Network() network.Network { + return s.config.Network +} + +func (s *dataSource) State() json.RawMessage { + return lo.Must(json.Marshal(s.state)) +} + +func (s *dataSource) Start(ctx context.Context, tasksChan chan<- *engine.Tasks, errorChan chan<- error) { + //TODO implement me + panic("implement me") +} + +func (s *dataSource) initialize() error { + // TODO implement me + panic("implement me") +} diff --git a/internal/engine/protocol/atproto/state.go b/internal/engine/protocol/atproto/state.go new file mode 100644 index 000000000..3d9bc9c9e --- /dev/null +++ b/internal/engine/protocol/atproto/state.go @@ -0,0 +1,6 @@ +package atproto + +type State struct { + Cursor string `json:"cursor,omitempty"` + Timestamp uint64 `json:"timestamp,omitempty"` +} diff --git a/provider/atproto/bluesky/client.go b/provider/atproto/bluesky/client.go new file mode 100644 index 000000000..409cbe3d4 --- /dev/null +++ b/provider/atproto/bluesky/client.go @@ -0,0 +1,49 @@ +package bluesky + +import ( + "context" + "github.com/bluesky-social/indigo/api/atproto" + "github.com/bluesky-social/indigo/xrpc" + "go.uber.org/zap" + "net/http" +) + +const ( + BskyEndpoint = "https://bsky.social" +) + +type Client struct { + xrpcClient *xrpc.Client +} + +func (c *Client) GetEvents(ctx context.Context) { + +} + +func NewClient(ctx context.Context, username string, password string) (*Client, error) { + xrpcClient := &xrpc.Client{ + Host: BskyEndpoint, + Client: http.DefaultClient, + } + + auth, err := atproto.ServerCreateSession(ctx, xrpcClient, &atproto.ServerCreateSession_Input{ + Identifier: username, + Password: password, + }) + if err != nil { + zap.L().Error("create session failed", zap.Error(err), zap.String("username", username)) + + return nil, err + } + + xrpcClient.Auth = &xrpc.AuthInfo{ + AccessJwt: auth.AccessJwt, + RefreshJwt: auth.RefreshJwt, + Handle: auth.Handle, + Did: auth.Did, + } + + return &Client{ + xrpcClient: xrpcClient, + }, nil +} From d850757eea02fc91db05b78a38c285636606d776 Mon Sep 17 00:00:00 2001 From: polebug Date: Wed, 27 Nov 2024 22:32:13 +0800 Subject: [PATCH 02/31] feat: support atproto source and bluesky worker --- cmd/main.go | 6 + config/config.go | 11 + deploy/config.example.yaml | 9 + go.mod | 47 +- go.sum | 188 +++++- .../engine/protocol/atproto/data_source.go | 194 ++++++- internal/engine/protocol/atproto/filter.go | 5 + internal/engine/protocol/atproto/option.go | 29 + internal/engine/protocol/atproto/state.go | 5 +- internal/engine/protocol/atproto/task.go | 55 ++ internal/engine/protocol/factory.go | 3 + internal/engine/worker/atproto/core/worker.go | 281 +++++++++ internal/engine/worker/atproto/factory.go | 20 + internal/node/indexer/server.go | 37 +- provider/atproto/bluesky/client.go | 545 +++++++++++++++++- provider/atproto/model.go | 21 + schema/worker/atproto/platform.go | 29 + schema/worker/atproto/platform_string.go | 148 +++++ schema/worker/atproto/worker.go | 43 ++ schema/worker/atproto/worker_string.go | 145 +++++ 20 files changed, 1763 insertions(+), 58 deletions(-) create mode 100644 internal/engine/protocol/atproto/filter.go create mode 100644 internal/engine/protocol/atproto/option.go create mode 100644 internal/engine/protocol/atproto/task.go create mode 100644 internal/engine/worker/atproto/core/worker.go create mode 100644 internal/engine/worker/atproto/factory.go create mode 100644 provider/atproto/model.go create mode 100644 schema/worker/atproto/platform.go create mode 100644 schema/worker/atproto/platform_string.go create mode 100644 schema/worker/atproto/worker.go create mode 100644 schema/worker/atproto/worker_string.go diff --git a/cmd/main.go b/cmd/main.go index b8b1d8467..097c98826 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -279,10 +279,16 @@ func findModuleByID(configFile *config.File, workerID string) (*config.Module, e return module, nil } + // Search in RSS components if module, found := findInComponent([]*config.Module{configFile.Component.RSS}); found { return module, nil } + // Search in atproto components + if module, found := findInComponent(configFile.Component.Atproto); found { + return module, nil + } + return nil, fmt.Errorf("undefined module %s", workerID) } diff --git a/config/config.go b/config/config.go index 95d65f875..7131e0320 100644 --- a/config/config.go +++ b/config/config.go @@ -16,6 +16,7 @@ import ( "github.com/rss3-network/node/internal/stream" "github.com/rss3-network/node/provider/ethereum" "github.com/rss3-network/node/schema/worker" + "github.com/rss3-network/node/schema/worker/atproto" "github.com/rss3-network/node/schema/worker/federated" "github.com/rss3-network/node/schema/worker/rss" "github.com/rss3-network/protocol-go/schema/network" @@ -91,6 +92,7 @@ type Server struct { type Component struct { RSS *Module `mapstructure:"rss"` Federated []*Module `mapstructure:"federated" validate:"dive"` + Atproto []*Module `mapstructure:"atproto" validate:"dive"` Decentralized []*Module `mapstructure:"decentralized" validate:"dive"` } @@ -277,6 +279,15 @@ func _Setup(configName, configType string, v *viper.Viper) (*File, error) { } } + // Add extra logic to convert atproto worker string to correct worker type. + if configFile.Component.Atproto != nil { + for _, module := range configFile.Component.Atproto { + if atprotoWorker := atproto.GetValueByWorkerStr(module.Worker.Name()); atprotoWorker != 0 { + module.Worker = atprotoWorker + } + } + } + // Use a function to load the endpoint for each module, because mapstructure doesn't support the use of custom unmarshaler. // Reference https://github.com/mitchellh/mapstructure/issues/115. if err := configFile.LoadModulesEndpoint(); err != nil { diff --git a/deploy/config.example.yaml b/deploy/config.example.yaml index 373d2b175..c5bab087d 100644 --- a/deploy/config.example.yaml +++ b/deploy/config.example.yaml @@ -98,3 +98,12 @@ component: endpoint: mastodon parameters: kafka_topic: activitypub_events + atproto: + # bluesky + - id: bluesky-core + network: bluesky + worker: core + endpoint: + parameters: + username: + password: diff --git a/go.mod b/go.mod index a6b264d21..70e35605a 100644 --- a/go.mod +++ b/go.mod @@ -1,8 +1,8 @@ module github.com/rss3-network/node -go 1.22 +go 1.22.4 -toolchain go1.22.1 +toolchain go1.22.9 require ( github.com/JohannesKaufmann/html-to-markdown v1.6.0 @@ -46,7 +46,7 @@ require ( go.opentelemetry.io/otel/sdk/metric v1.31.0 go.opentelemetry.io/otel/trace v1.31.0 go.uber.org/zap v1.27.0 - golang.org/x/sync v0.8.0 + golang.org/x/sync v0.9.0 gopkg.in/yaml.v3 v3.0.1 // indirect gorm.io/driver/postgres v1.5.9 gorm.io/gorm v1.25.11 @@ -55,20 +55,25 @@ require ( require ( github.com/adrianbrad/psqldocker v1.2.1 + github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de + github.com/bluesky-social/indigo v0.0.0-20241031232035-1a73c3fb6841 github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 github.com/emirpasic/gods v1.18.1 github.com/go-redsync/redsync/v4 v4.13.0 + github.com/gorilla/websocket v1.5.3 github.com/grafana/pyroscope-go v1.2.0 github.com/jaytaylor/html2text v0.0.0-20230321000545-74c2419ad056 github.com/mitchellh/mapstructure v1.5.0 github.com/redis/rueidis v1.0.45 github.com/redis/rueidis/rueidiscompat v1.0.45 - github.com/rss3-network/protocol-go v0.5.14 + github.com/reiver/go-bsky v0.0.0-20240906205655-8c7fadb4f3bb + github.com/rss3-network/protocol-go v0.5.16 github.com/spf13/afero v1.11.0 github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 github.com/tidwall/sjson v1.2.5 github.com/vincent-petithory/dataurl v1.0.0 - golang.org/x/net v0.30.0 + github.com/whyrusleeping/cbor-gen v0.1.3-0.20240904181319-8dc02b38228c + golang.org/x/net v0.31.0 ) require ( @@ -78,10 +83,10 @@ require ( github.com/Microsoft/go-winio v0.6.2 // indirect github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 // indirect github.com/PuerkitoBio/goquery v1.9.2 // indirect + github.com/RussellLuo/slidingwindow v0.0.0-20200528002341-535bb99d338b // indirect github.com/andybalholm/cascadia v1.3.2 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bits-and-blooms/bitset v1.10.0 // indirect - github.com/bluesky-social/indigo v0.0.0-20241031232035-1a73c3fb6841 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/btcsuite/btcd/chaincfg/chainhash v1.0.2 // indirect github.com/carlmjohnson/versioninfo v0.22.5 // indirect @@ -113,7 +118,6 @@ require ( github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect github.com/google/uuid v1.6.0 // indirect - github.com/gorilla/websocket v1.5.1 // indirect github.com/grafana/pyroscope-go/godeltaprof v0.1.8 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect @@ -121,20 +125,32 @@ require ( github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/hashicorp/go-retryablehttp v0.7.5 // indirect github.com/hashicorp/golang-lru v1.0.2 // indirect + github.com/hashicorp/golang-lru/arc/v2 v2.0.6 // indirect + github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/holiman/uint256 v1.2.4 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/ipfs/bbloom v0.0.4 // indirect github.com/ipfs/go-block-format v0.2.0 // indirect + github.com/ipfs/go-blockservice v0.5.2 // indirect github.com/ipfs/go-datastore v0.6.0 // indirect github.com/ipfs/go-ipfs-blockstore v1.3.1 // indirect github.com/ipfs/go-ipfs-ds-help v1.1.1 // indirect + github.com/ipfs/go-ipfs-exchange-interface v0.2.1 // indirect github.com/ipfs/go-ipfs-util v0.0.3 // indirect github.com/ipfs/go-ipld-cbor v0.1.0 // indirect github.com/ipfs/go-ipld-format v0.6.0 // indirect + github.com/ipfs/go-ipld-legacy v0.2.1 // indirect + github.com/ipfs/go-libipfs v0.7.0 // indirect github.com/ipfs/go-log v1.0.5 // indirect github.com/ipfs/go-log/v2 v2.5.1 // indirect + github.com/ipfs/go-merkledag v0.11.0 // indirect github.com/ipfs/go-metrics-interface v0.0.1 // indirect + github.com/ipfs/go-verifcid v0.0.3 // indirect + github.com/ipld/go-car v0.6.2 // indirect + github.com/ipld/go-car/v2 v2.13.1 // indirect + github.com/ipld/go-codec-dagpb v1.6.0 // indirect + github.com/ipld/go-ipld-prime v0.21.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect github.com/jackc/pgx/v5 v5.7.1 // indirect @@ -172,6 +188,7 @@ require ( github.com/opentracing/opentracing-go v1.2.0 // indirect github.com/ory/dockertest/v3 v3.10.0 // indirect github.com/pelletier/go-toml/v2 v2.2.2 // indirect + github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 // indirect github.com/pierrec/lz4/v4 v4.1.21 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect @@ -179,6 +196,12 @@ require ( github.com/prometheus/client_model v0.6.1 // indirect github.com/prometheus/common v0.60.0 // indirect github.com/prometheus/procfs v0.15.1 // indirect + github.com/reiver/go-atproto v0.0.0-20240909141243-3aa4e1dc83b2 // indirect + github.com/reiver/go-cast v0.0.0-20240904124821-be0103637c3f // indirect + github.com/reiver/go-erorr v0.0.0-20240801233437-8cbde6d1fa3f // indirect + github.com/reiver/go-fallback v0.0.0-20240906145154-1ce9eadf06a8 // indirect + github.com/reiver/go-maps v0.0.0-20240906190342-93be57f28be1 // indirect + github.com/reiver/go-reg v0.0.0-20240906195701-6e62f43c2835 // indirect github.com/rivo/uniseg v0.2.0 // indirect github.com/sagikazarmark/locafero v0.4.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect @@ -199,19 +222,21 @@ require ( github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasttemplate v1.2.2 // indirect github.com/vektah/gqlparser/v2 v2.5.11 // indirect - github.com/whyrusleeping/cbor-gen v0.1.3-0.20240904181319-8dc02b38228c // indirect + github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11 // indirect github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect github.com/xeipuuv/gojsonschema v1.2.0 // indirect github.com/yusufpapurcu/wmi v1.2.3 // indirect + gitlab.com/yawning/secp256k1-voi v0.0.0-20230925100816-f2616030848b // indirect + gitlab.com/yawning/tuplehash v0.0.0-20230713102510-df83abbf9a02 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.50.0 // indirect go.opentelemetry.io/proto/otlp v1.3.1 // indirect go.uber.org/atomic v1.11.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/crypto v0.28.0 // indirect + golang.org/x/crypto v0.29.0 // indirect golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect - golang.org/x/sys v0.26.0 // indirect - golang.org/x/text v0.19.0 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/text v0.20.0 // indirect golang.org/x/time v0.5.0 // indirect golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20241007155032-5fefd90f89a9 // indirect diff --git a/go.sum b/go.sum index 3da21098c..6dd87c166 100644 --- a/go.sum +++ b/go.sum @@ -17,18 +17,26 @@ github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEV github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= github.com/PuerkitoBio/goquery v1.9.2 h1:4/wZksC3KgkQw7SQgkKotmKljk0M6V8TUvA8Wb4yPeE= github.com/PuerkitoBio/goquery v1.9.2/go.mod h1:GHPCaP0ODyyxqcNoFGYlAprUFH81NuRPd0GX3Zu2Mvk= +github.com/RussellLuo/slidingwindow v0.0.0-20200528002341-535bb99d338b h1:5/++qT1/z812ZqBvqQt6ToRswSuPZ/B33m6xVHRzADU= +github.com/RussellLuo/slidingwindow v0.0.0-20200528002341-535bb99d338b/go.mod h1:4+EPqMRApwwE/6yo6CxiHoSnBzjRr3jsqer7frxP8y4= github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= github.com/adrianbrad/psqldocker v1.2.1 h1:bvsRmbotpA89ruqGGzzaAZUBtDaIk98gO+JMBNVSZlI= github.com/adrianbrad/psqldocker v1.2.1/go.mod h1:LbCnIy60YO6IRJYrF1r+eafKUgU9UnkSFx0gT8UiaUs= +github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5 h1:iW0a5ljuFxkLGPNem5Ui+KBjFJzKg4Fv2fnxe4dvzpM= +github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5/go.mod h1:Y2QMoi1vgtOIfc+6DhrMOGkLoGzqSV2rKp4Sm+opsyA= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= github.com/andybalholm/cascadia v1.2.0/go.mod h1:YCyR8vOZT9aZ1CHEd8ap0gMVm2aFgxBp0T0eFw1RUQY= github.com/andybalholm/cascadia v1.3.2 h1:3Xi6Dw5lHF15JtdcmAHD3i1+T8plmv7BQ/nsViSLyss= github.com/andybalholm/cascadia v1.3.2/go.mod h1:7gtRlve5FxPPgIgX36uWBX58OdBsSS6lUvCFb+h7KvU= +github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de h1:FxWPpzIjnTlhPwqqXc4/vE0f7GvRjuAsbW+HOIe8KnA= +github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de/go.mod h1:DCaWoUhZrYW9p1lxo/cm8EmUOOzAPSEZNGF2DK1dJgw= github.com/avast/retry-go/v4 v4.6.0 h1:K9xNA+KeB8HHc2aWFuLb25Offp+0iVRXEvFx8IinRJA= github.com/avast/retry-go/v4 v4.6.0/go.mod h1:gvWlPhBVsvBbLkVGDg/KwvBv0bEkCOLRRSHKIr2PyOE= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= +github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88= @@ -78,6 +86,8 @@ github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/creasty/defaults v1.8.0 h1:z27FJxCAa0JKt3utc0sCImAEb+spPucmKoOdLHvHYKk= github.com/creasty/defaults v1.8.0/go.mod h1:iGzKe6pbEHnpMPtfDXZEr0NVxWnPTjb1bbDy08fPzYM= +github.com/cskr/pubsub v1.0.2 h1:vlOzMhl6PFn60gRlTQQsIfVwaPB/B/8MziK8FhEPt/0= +github.com/cskr/pubsub v1.0.2/go.mod h1:/8MzYXk/NJAz782G8RPkFzXTZVu63VotefPnR9TIRis= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= @@ -108,6 +118,8 @@ github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/ethereum/go-ethereum v1.13.15 h1:U7sSGYGo4SPjP6iNIifNoyIAiNjrmQkz6EwQG+/EZWo= github.com/ethereum/go-ethereum v1.13.15/go.mod h1:TN8ZiHrdJwSe8Cb6x+p0hs5CxhJZPbqB7hHkaUXcmIU= +github.com/fatih/color v1.14.1 h1:qfhVLaG5s+nCROl1zJsZRxFeYrHLqWroPOQ8BWiNb4w= +github.com/fatih/color v1.14.1/go.mod h1:2oHN61fhTpgcxD3TSWCgKDiH1+x4OiDVVGH8WlgGZGg= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fjl/memsize v0.0.2 h1:27txuSD9or+NZlnOWdKUxeBzTAUkWCVh+4Gf2dWFOzA= @@ -161,6 +173,8 @@ github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqw github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0= +github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= +github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= @@ -193,6 +207,8 @@ github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= +github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k= github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= @@ -201,10 +217,10 @@ github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3 github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grafana/pyroscope-go v1.2.0 h1:aILLKjTj8CS8f/24OPMGPewQSYlhmdQMBmol1d3KGj8= github.com/grafana/pyroscope-go v1.2.0/go.mod h1:2GHr28Nr05bg2pElS+dDsc98f3JTUh2f6Fz1hWXrqwk= github.com/grafana/pyroscope-go/godeltaprof v0.1.8 h1:iwOtYXeeVSAeYefJNaxDytgjKtUuKQbJqgAIjlnicKg= @@ -221,13 +237,16 @@ github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= +github.com/hashicorp/go-hclog v1.5.0 h1:bI2ocEMgcVlz55Oj1xZNBsVi900c7II+fWDyV9o+13c= +github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/go-retryablehttp v0.7.5 h1:bJj+Pj19UZMIweq/iie+1u5YCdGrnxCT9yvm0e+Nd5M= github.com/hashicorp/go-retryablehttp v0.7.5/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8= -github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru/arc/v2 v2.0.6 h1:4NU7uP5vSoK6TbaMj3NtY478TTAWLso/vL1gpNrInHg= +github.com/hashicorp/golang-lru/arc/v2 v2.0.6/go.mod h1:cfdDIX05DWvYV6/shsxDfa/OVcRieOt+q4FnM8x+Xno= github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= @@ -245,29 +264,77 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2 github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs= github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0= +github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA= +github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU= +github.com/ipfs/go-bitswap v0.11.0 h1:j1WVvhDX1yhG32NTC9xfxnqycqYIlhzEzLXG/cU1HyQ= +github.com/ipfs/go-bitswap v0.11.0/go.mod h1:05aE8H3XOU+LXpTedeAS0OZpcO1WFsj5niYQH9a1Tmk= github.com/ipfs/go-block-format v0.2.0 h1:ZqrkxBA2ICbDRbK8KJs/u0O3dlp6gmAuuXUJNiW1Ycs= github.com/ipfs/go-block-format v0.2.0/go.mod h1:+jpL11nFx5A/SPpsoBn6Bzkra/zaArfSmsknbPMYgzM= +github.com/ipfs/go-blockservice v0.5.2 h1:in9Bc+QcXwd1apOVM7Un9t8tixPKdaHQFdLSUM1Xgk8= +github.com/ipfs/go-blockservice v0.5.2/go.mod h1:VpMblFEqG67A/H2sHKAemeH9vlURVavlysbdUI632yk= +github.com/ipfs/go-bs-sqlite3 v0.0.0-20221122195556-bfcee1be620d h1:9V+GGXCuOfDiFpdAHz58q9mKLg447xp0cQKvqQrAwYE= +github.com/ipfs/go-bs-sqlite3 v0.0.0-20221122195556-bfcee1be620d/go.mod h1:pMbnFyNAGjryYCLCe59YDLRv/ujdN+zGJBT1umlvYRM= github.com/ipfs/go-cid v0.4.1 h1:A/T3qGvxi4kpKWWcPC/PgbvDA2bjVLO7n4UeVwnbs/s= github.com/ipfs/go-cid v0.4.1/go.mod h1:uQHwDeX4c6CtyrFwdqyhpNcxVewur1M7l7fNU7LKwZk= github.com/ipfs/go-datastore v0.6.0 h1:JKyz+Gvz1QEZw0LsX1IBn+JFCJQH4SJVFtM4uWU0Myk= github.com/ipfs/go-datastore v0.6.0/go.mod h1:rt5M3nNbSO/8q1t4LNkLyUwRs8HupMeN/8O4Vn9YAT8= +github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= +github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= +github.com/ipfs/go-ds-flatfs v0.5.1 h1:ZCIO/kQOS/PSh3vcF1H6a8fkRGS7pOfwfPdx4n/KJH4= +github.com/ipfs/go-ds-flatfs v0.5.1/go.mod h1:RWTV7oZD/yZYBKdbVIFXTX2fdY2Tbvl94NsWqmoyAX4= github.com/ipfs/go-ipfs-blockstore v1.3.1 h1:cEI9ci7V0sRNivqaOr0elDsamxXFxJMMMy7PTTDQNsQ= github.com/ipfs/go-ipfs-blockstore v1.3.1/go.mod h1:KgtZyc9fq+P2xJUiCAzbRdhhqJHvsw8u2Dlqy2MyRTE= +github.com/ipfs/go-ipfs-blocksutil v0.0.1 h1:Eh/H4pc1hsvhzsQoMEP3Bke/aW5P5rVM1IWFJMcGIPQ= +github.com/ipfs/go-ipfs-blocksutil v0.0.1/go.mod h1:Yq4M86uIOmxmGPUHv/uI7uKqZNtLb449gwKqXjIsnRk= +github.com/ipfs/go-ipfs-chunker v0.0.5 h1:ojCf7HV/m+uS2vhUGWcogIIxiO5ubl5O57Q7NapWLY8= +github.com/ipfs/go-ipfs-chunker v0.0.5/go.mod h1:jhgdF8vxRHycr00k13FM8Y0E+6BoalYeobXmUyTreP8= +github.com/ipfs/go-ipfs-delay v0.0.1 h1:r/UXYyRcddO6thwOnhiznIAiSvxMECGgtv35Xs1IeRQ= +github.com/ipfs/go-ipfs-delay v0.0.1/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= github.com/ipfs/go-ipfs-ds-help v1.1.1 h1:B5UJOH52IbcfS56+Ul+sv8jnIV10lbjLF5eOO0C66Nw= github.com/ipfs/go-ipfs-ds-help v1.1.1/go.mod h1:75vrVCkSdSFidJscs8n4W+77AtTpCIAdDGAwjitJMIo= +github.com/ipfs/go-ipfs-exchange-interface v0.2.1 h1:jMzo2VhLKSHbVe+mHNzYgs95n0+t0Q69GQ5WhRDZV/s= +github.com/ipfs/go-ipfs-exchange-interface v0.2.1/go.mod h1:MUsYn6rKbG6CTtsDp+lKJPmVt3ZrCViNyH3rfPGsZ2E= +github.com/ipfs/go-ipfs-exchange-offline v0.3.0 h1:c/Dg8GDPzixGd0MC8Jh6mjOwU57uYokgWRFidfvEkuA= +github.com/ipfs/go-ipfs-exchange-offline v0.3.0/go.mod h1:MOdJ9DChbb5u37M1IcbrRB02e++Z7521fMxqCNRrz9s= +github.com/ipfs/go-ipfs-pq v0.0.3 h1:YpoHVJB+jzK15mr/xsWC574tyDLkezVrDNeaalQBsTE= +github.com/ipfs/go-ipfs-pq v0.0.3/go.mod h1:btNw5hsHBpRcSSgZtiNm/SLj5gYIZ18AKtv3kERkRb4= +github.com/ipfs/go-ipfs-routing v0.3.0 h1:9W/W3N+g+y4ZDeffSgqhgo7BsBSJwPMcyssET9OWevc= +github.com/ipfs/go-ipfs-routing v0.3.0/go.mod h1:dKqtTFIql7e1zYsEuWLyuOU+E0WJWW8JjbTPLParDWo= github.com/ipfs/go-ipfs-util v0.0.3 h1:2RFdGez6bu2ZlZdI+rWfIdbQb1KudQp3VGwPtdNCmE0= github.com/ipfs/go-ipfs-util v0.0.3/go.mod h1:LHzG1a0Ig4G+iZ26UUOMjHd+lfM84LZCrn17xAKWBvs= github.com/ipfs/go-ipld-cbor v0.1.0 h1:dx0nS0kILVivGhfWuB6dUpMa/LAwElHPw1yOGYopoYs= github.com/ipfs/go-ipld-cbor v0.1.0/go.mod h1:U2aYlmVrJr2wsUBU67K4KgepApSZddGRDWBYR0H4sCk= github.com/ipfs/go-ipld-format v0.6.0 h1:VEJlA2kQ3LqFSIm5Vu6eIlSxD/Ze90xtc4Meten1F5U= github.com/ipfs/go-ipld-format v0.6.0/go.mod h1:g4QVMTn3marU3qXchwjpKPKgJv+zF+OlaKMyhJ4LHPg= +github.com/ipfs/go-ipld-legacy v0.2.1 h1:mDFtrBpmU7b//LzLSypVrXsD8QxkEWxu5qVxN99/+tk= +github.com/ipfs/go-ipld-legacy v0.2.1/go.mod h1:782MOUghNzMO2DER0FlBR94mllfdCJCkTtDtPM51otM= +github.com/ipfs/go-libipfs v0.7.0 h1:Mi54WJTODaOL2/ZSm5loi3SwI3jI2OuFWUrQIkJ5cpM= +github.com/ipfs/go-libipfs v0.7.0/go.mod h1:KsIf/03CqhICzyRGyGo68tooiBE2iFbI/rXW7FhAYr0= github.com/ipfs/go-log v1.0.5 h1:2dOuUCB1Z7uoczMWgAyDck5JLb72zHzrMnGnCNNbvY8= github.com/ipfs/go-log v1.0.5/go.mod h1:j0b8ZoR+7+R99LD9jZ6+AJsrzkPbSXbZfGakb5JPtIo= github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Axpmri6g= github.com/ipfs/go-log/v2 v2.5.1 h1:1XdUzF7048prq4aBjDQQ4SL5RxftpRGdXhNRwKSAlcY= github.com/ipfs/go-log/v2 v2.5.1/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI= +github.com/ipfs/go-merkledag v0.11.0 h1:DgzwK5hprESOzS4O1t/wi6JDpyVQdvm9Bs59N/jqfBY= +github.com/ipfs/go-merkledag v0.11.0/go.mod h1:Q4f/1ezvBiJV0YCIXvt51W/9/kqJGH4I1LsA7+djsM4= github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fGD6n0jO4kdg= github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY= +github.com/ipfs/go-peertaskqueue v0.8.1 h1:YhxAs1+wxb5jk7RvS0LHdyiILpNmRIRnZVztekOF0pg= +github.com/ipfs/go-peertaskqueue v0.8.1/go.mod h1:Oxxd3eaK279FxeydSPPVGHzbwVeHjatZ2GA8XD+KbPU= +github.com/ipfs/go-unixfsnode v1.8.0 h1:yCkakzuE365glu+YkgzZt6p38CSVEBPgngL9ZkfnyQU= +github.com/ipfs/go-unixfsnode v1.8.0/go.mod h1:HxRu9HYHOjK6HUqFBAi++7DVoWAHn0o4v/nZ/VA+0g8= +github.com/ipfs/go-verifcid v0.0.3 h1:gmRKccqhWDocCRkC+a59g5QW7uJw5bpX9HWBevXa0zs= +github.com/ipfs/go-verifcid v0.0.3/go.mod h1:gcCtGniVzelKrbk9ooUSX/pM3xlH73fZZJDzQJRvOUw= +github.com/ipld/go-car v0.6.2 h1:Hlnl3Awgnq8icK+ze3iRghk805lu8YNq3wlREDTF2qc= +github.com/ipld/go-car v0.6.2/go.mod h1:oEGXdwp6bmxJCZ+rARSkDliTeYnVzv3++eXajZ+Bmr8= +github.com/ipld/go-car/v2 v2.13.1 h1:KnlrKvEPEzr5IZHKTXLAEub+tPrzeAFQVRlSQvuxBO4= +github.com/ipld/go-car/v2 v2.13.1/go.mod h1:QkdjjFNGit2GIkpQ953KBwowuoukoM75nP/JI1iDJdo= +github.com/ipld/go-codec-dagpb v1.6.0 h1:9nYazfyu9B1p3NAgfVdpRco3Fs2nFC72DqVsMj6rOcc= +github.com/ipld/go-codec-dagpb v1.6.0/go.mod h1:ANzFhfP2uMJxRBr8CE+WQWs5UsNa0pYtmKZ+agnUw9s= +github.com/ipld/go-ipld-prime v0.21.0 h1:n4JmcpOlPDIxBcY037SVfpd1G+Sj1nKZah0m6QH9C2E= +github.com/ipld/go-ipld-prime v0.21.0/go.mod h1:3RLqy//ERg/y5oShXXdx5YIp50cFGOanyMctpPjsvxQ= +github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20230102063945-1a409dc236dd h1:gMlw/MhNr2Wtp5RwGdsW23cs+yCuj9k2ON7i9MiJlRo= +github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20230102063945-1a409dc236dd/go.mod h1:wZ8hH8UxeryOs4kJEJaiui/s00hDSbE37OKsL47g+Sw= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= @@ -290,15 +357,16 @@ github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= -github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg= -github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/koron/go-ssdp v0.0.3 h1:JivLMY45N76b4p/vsWGOKewBQu6uf39y8l+AQ7sDKx8= +github.com/koron/go-ssdp v0.0.3/go.mod h1:b2MxI6yh02pKrsyNoQUsk4+YNikaGhe4894J+Q5lDvA= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= @@ -316,8 +384,38 @@ github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7 github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= +github.com/lestrrat-go/blackmagic v1.0.1 h1:lS5Zts+5HIC/8og6cGHb0uCcNCa3OUt1ygh3Qz2Fe80= +github.com/lestrrat-go/blackmagic v1.0.1/go.mod h1:UrEqBzIR2U6CnzVyUtfM6oZNMt/7O7Vohk2J0OGSAtU= +github.com/lestrrat-go/httpcc v1.0.1 h1:ydWCStUeJLkpYyjLDHihupbn2tYmZ7m22BGkcvZZrIE= +github.com/lestrrat-go/httpcc v1.0.1/go.mod h1:qiltp3Mt56+55GPVCbTdM9MlqhvzyuL6W/NMDA8vA5E= +github.com/lestrrat-go/httprc v1.0.4 h1:bAZymwoZQb+Oq8MEbyipag7iSq6YIga8Wj6GOiJGdI8= +github.com/lestrrat-go/httprc v1.0.4/go.mod h1:mwwz3JMTPBjHUkkDv/IGJ39aALInZLrhBp0X7KGUZlo= +github.com/lestrrat-go/iter v1.0.2 h1:gMXo1q4c2pHmC3dn8LzRhJfP1ceCbgSiT9lUydIzltI= +github.com/lestrrat-go/iter v1.0.2/go.mod h1:Momfcq3AnRlRjI5b5O8/G5/BvpzrhoFTZcn06fEOPt4= +github.com/lestrrat-go/jwx/v2 v2.0.12 h1:3d589+5w/b9b7S3DneICPW16AqTyYXB7VRjgluSDWeA= +github.com/lestrrat-go/jwx/v2 v2.0.12/go.mod h1:Mq4KN1mM7bp+5z/W5HS8aCNs5RKZ911G/0y2qUjAQuQ= +github.com/lestrrat-go/option v1.0.1 h1:oAzP2fvZGQKWkvHa1/SAcFolBEca1oN+mQ7eooNBEYU= +github.com/lestrrat-go/option v1.0.1/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= +github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= +github.com/libp2p/go-cidranger v1.1.0 h1:ewPN8EZ0dd1LSnrtuwd4709PXVcITVeuwbag38yPW7c= +github.com/libp2p/go-cidranger v1.1.0/go.mod h1:KWZTfSr+r9qEo9OkI9/SIEeAtw+NNoU0dXIXt15Okic= +github.com/libp2p/go-libp2p v0.25.1 h1:YK+YDCHpYyTvitKWVxa5PfElgIpOONU01X5UcLEwJGA= +github.com/libp2p/go-libp2p v0.25.1/go.mod h1:xnK9/1d9+jeQCVvi/f1g12KqtVi/jP/SijtKV1hML3g= +github.com/libp2p/go-libp2p-asn-util v0.2.0 h1:rg3+Os8jbnO5DxkC7K/Utdi+DkY3q/d1/1q+8WeNAsw= +github.com/libp2p/go-libp2p-asn-util v0.2.0/go.mod h1:WoaWxbHKBymSN41hWSq/lGKJEca7TNm58+gGJi2WsLI= +github.com/libp2p/go-libp2p-record v0.2.0 h1:oiNUOCWno2BFuxt3my4i1frNrt7PerzB3queqa1NkQ0= +github.com/libp2p/go-libp2p-record v0.2.0/go.mod h1:I+3zMkvvg5m2OcSdoL0KPljyJyvNDFGKX7QdlpYUcwk= +github.com/libp2p/go-libp2p-testing v0.12.0 h1:EPvBb4kKMWO29qP4mZGyhVzUyR25dvfUIK5WDu6iPUA= +github.com/libp2p/go-libp2p-testing v0.12.0/go.mod h1:KcGDRXyN7sQCllucn1cOOS+Dmm7ujhfEyXQL5lvkcPg= +github.com/libp2p/go-msgio v0.3.0 h1:mf3Z8B1xcFN314sWX+2vOTShIE0Mmn2TXn3YCUQGNj0= +github.com/libp2p/go-msgio v0.3.0/go.mod h1:nyRM819GmVaF9LX3l03RMh10QdOroF++NBbxAb0mmDM= +github.com/libp2p/go-nat v0.1.0 h1:MfVsH6DLcpa04Xr+p8hmVRG4juse0s3J8HyNWYHffXg= +github.com/libp2p/go-nat v0.1.0/go.mod h1:X7teVkwRHNInVNWQiO/tAiAVRwSr5zoRz4YSTC3uRBM= +github.com/libp2p/go-netroute v0.2.1 h1:V8kVrpD8GK0Riv15/7VN6RbUQ3URNZVosw7H2v9tksU= +github.com/libp2p/go-netroute v0.2.1/go.mod h1:hraioZr0fhBjG0ZRXJJ6Zj2IVEVNx6tDTFQfSmcq7mQ= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/matryer/is v1.4.1 h1:55ehd8zaGABKLXQUe2awZ99BD/PTc2ls+KV/dXphgEQ= @@ -329,10 +427,15 @@ github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/ 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-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +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/mfridman/interpolate v0.0.2 h1:pnuTK7MQIxxFz1Gr+rjSIx9u7qVjf5VOoM/u6BbAxPY= github.com/mfridman/interpolate v0.0.2/go.mod h1:p+7uk6oE07mpE/Ik1b8EckO0O4ZXiGAfshKBWLUM9Xg= +github.com/miekg/dns v1.1.50 h1:DQUfb9uc6smULcREF09Uc+/Gd46YWqJd5DbpPE9xkcA= +github.com/miekg/dns v1.1.50/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME= github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM= github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= @@ -359,12 +462,20 @@ github.com/multiformats/go-base32 v0.1.0 h1:pVx9xoSPqEIQG8o+UbAe7DNi51oej1NtK+aG github.com/multiformats/go-base32 v0.1.0/go.mod h1:Kj3tFY6zNr+ABYMqeUNeGvkIC/UYgtWibDcT0rExnbI= github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9rQyccr0= github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4= +github.com/multiformats/go-multiaddr v0.8.0 h1:aqjksEcqK+iD/Foe1RRFsGZh8+XFiGo7FgUCZlpv3LU= +github.com/multiformats/go-multiaddr v0.8.0/go.mod h1:Fs50eBDWvZu+l3/9S6xAE7ZYj6yhxlvaVZjakWN7xRs= +github.com/multiformats/go-multiaddr-dns v0.3.1 h1:QgQgR+LQVt3NPTjbrLLpsaT2ufAA2y0Mkk+QRVJbW3A= +github.com/multiformats/go-multiaddr-dns v0.3.1/go.mod h1:G/245BRQ6FJGmryJCrOuTdB37AMA5AMOVuO6NY3JwTk= +github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E= +github.com/multiformats/go-multiaddr-fmt v0.1.0/go.mod h1:hGtDIW4PU4BqJ50gW2quDuPVjyWNZxToGUh/HwTZYJo= github.com/multiformats/go-multibase v0.2.0 h1:isdYCVLvksgWlMW9OZRYJEa9pZETFivncJHmHnnd87g= github.com/multiformats/go-multibase v0.2.0/go.mod h1:bFBZX4lKCA/2lyOFSAoKH5SS6oPyjtnzK/XTFDPkNuk= github.com/multiformats/go-multicodec v0.9.0 h1:pb/dlPnzee/Sxv/j4PmkDRxCOi3hXTz3IbPKOXWJkmg= github.com/multiformats/go-multicodec v0.9.0/go.mod h1:L3QTQvMIaVBkXOXXtVmYE+LI16i14xuaojr/H7Ai54k= github.com/multiformats/go-multihash v0.2.3 h1:7Lyc8XfX/IY2jWb/gI7JP+o7JEq9hOa7BFvVU9RSh+U= github.com/multiformats/go-multihash v0.2.3/go.mod h1:dXgKXCXjBzdscBLk9JkjINiEsCKRVch90MdaGiKsvSM= +github.com/multiformats/go-multistream v0.4.1 h1:rFy0Iiyn3YT0asivDUIR05leAdwZq3de4741sbiSdfo= +github.com/multiformats/go-multistream v0.4.1/go.mod h1:Mz5eykRVAjJWckE2U78c6xqdtyNUEhKSM0Lwar2p77Q= github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/nEGOHFS8= github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= @@ -403,6 +514,8 @@ github.com/ory/dockertest/v3 v3.10.0 h1:4K3z2VMe8Woe++invjaTB7VRyQXQy5UY+loujO4a github.com/ory/dockertest/v3 v3.10.0/go.mod h1:nr57ZbRWMqfsdGdFNLHz5jjNdDb7VVFnzAeW1n5N1Lg= github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= +github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 h1:1/WtZae0yGtPq+TI6+Tv1WTxkukpXeMlviSxvL7SRgk= +github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9/go.mod h1:x3N5drFsm2uilKKuuYo6LdyD8vZAW55sH/9w+pbo1sw= github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -431,8 +544,23 @@ github.com/redis/rueidis/mock v1.0.45 h1:r2LRiwOtFib8+NAuVxNmcdxL7IMUk3as9IGPzx2 github.com/redis/rueidis/mock v1.0.45/go.mod h1:bjpk7ox5jwue03L8NpjgPBE91tLkm9Amla+XFYhaezc= github.com/redis/rueidis/rueidiscompat v1.0.45 h1:G+3HIaETgtwr6aL6BOTFCa2DfpPDhxqcoiDn8cvd5Ps= github.com/redis/rueidis/rueidiscompat v1.0.45/go.mod h1:JMw3cktmwNqsSl2npjcxrOfLa1L3rmj1Ox5aPHiDjOU= +github.com/reiver/go-atproto v0.0.0-20240909141243-3aa4e1dc83b2 h1:2iUU2TWlGPHJFEJtyFcWhz0O5sCw8nPjJeABAfW/CCY= +github.com/reiver/go-atproto v0.0.0-20240909141243-3aa4e1dc83b2/go.mod h1:S/pf34se76GMYmdBXumZLenxGYgunVNLJkW6OQEXt9w= +github.com/reiver/go-bsky v0.0.0-20240906205655-8c7fadb4f3bb h1:ZgOhXYuF5y3Hzhm9I5vc+LNd0um1Lz4v9fn64mt9PJA= +github.com/reiver/go-bsky v0.0.0-20240906205655-8c7fadb4f3bb/go.mod h1:KEO2yVqtN2ZQQ7AgncGVyKZpa9jXEmNOuYXzbz564f0= +github.com/reiver/go-cast v0.0.0-20240904124821-be0103637c3f h1:+xhln673LL2XG1qhsUG1e+HHdXm/lTWihmr5G815dMc= +github.com/reiver/go-cast v0.0.0-20240904124821-be0103637c3f/go.mod h1:baMIic1VWx4m5MRviwSyHFx1Z6POGMRrnVgsMvsLlAA= +github.com/reiver/go-erorr v0.0.0-20240801233437-8cbde6d1fa3f h1:D1QSxKHm8U73XhjsW3SFLkT0zT5pKJi+1KGboMhY1Rk= +github.com/reiver/go-erorr v0.0.0-20240801233437-8cbde6d1fa3f/go.mod h1:F0HbBf+Ak2ZlE8YkDW4Y+KxaUmT0KaaIJK6CXY3cJxE= +github.com/reiver/go-fallback v0.0.0-20240906145154-1ce9eadf06a8 h1:JKZHV9WPzSfaPhJswlyQk45hmxbPwKmBximAyysPKbs= +github.com/reiver/go-fallback v0.0.0-20240906145154-1ce9eadf06a8/go.mod h1:IAg7rGvnbzlTrK4W+pBJcq2XEhrWf+DxYl/fGN/qbj4= +github.com/reiver/go-maps v0.0.0-20240906190342-93be57f28be1 h1:5fRVUeCqPN8G8phNmd1G0Pu7g35sojAQBnIvZ8C+s8c= +github.com/reiver/go-maps v0.0.0-20240906190342-93be57f28be1/go.mod h1:dMbnpn0BuIGwSFlCUSTYPDP3nDt2pSe6qP5vfbV1kBE= +github.com/reiver/go-reg v0.0.0-20240906195701-6e62f43c2835 h1:i2IO8hx0TbgPeZ5Gcu+Prkzkm6T+cBxd1lnALdCoM/c= +github.com/reiver/go-reg v0.0.0-20240906195701-6e62f43c2835/go.mod h1:P4MhBoVQLOdhisU6M3f2DvbbNBueHw3Y+n4V/Q7xX9Q= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= @@ -442,8 +570,8 @@ github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= -github.com/rss3-network/protocol-go v0.5.14 h1:gd6ciwXb5e4xx1dmAOAIKWbpami2QbARqE61zbwT6KE= -github.com/rss3-network/protocol-go v0.5.14/go.mod h1:npcyduWt86uVbIi77xQaYk8eqltI9XNjk1FMGpjyIq0= +github.com/rss3-network/protocol-go v0.5.16 h1:14AOjsHMnuEqEHPmBo4A8sdGXPbwMNGKKJoGk1fXunk= +github.com/rss3-network/protocol-go v0.5.16/go.mod h1:AOVaY0++55lryy3GeQG//EkPuVFqxNQoPa0VdGbmtx0= github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= @@ -454,8 +582,11 @@ github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6g github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= github.com/samber/lo v1.47.0 h1:z7RynLwP5nbyRscyvcD043DWYoOcYRv3mV8lBeqOCLc= github.com/samber/lo v1.47.0/go.mod h1:RmDH9Ct32Qy3gduHQuKJ3gW1fMHAnE/fAzQuf6He5cU= +github.com/scylladb/termtables v0.0.0-20191203121021-c4c0b6d42ff4/go.mod h1:C1a7PQSMz9NShzorzCiG2fk9+xuCgLkPeCvMHYR2OWg= github.com/sebdah/goldie/v2 v2.5.3 h1:9ES/mNN+HNUbNWpVAlrzuZ7jE+Nrczbj8uFRjM7624Y= github.com/sebdah/goldie/v2 v2.5.3/go.mod h1:oZ9fp0+se1eapSRjfYbsV/0Hqhbuu3bJVvKI/NNtssI= +github.com/segmentio/asm v1.2.0 h1:9BQrFxC+YOHJlTlHGkTrFWf59nbL3XnCoFLTwDCI7ys= +github.com/segmentio/asm v1.2.0/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr5aAcs= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= @@ -468,7 +599,9 @@ github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+D github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/smartystreets/assertions v1.2.0 h1:42S6lae5dvLc7BrLu/0ugRtcFVjoJNMC/N3yZFZkDFs= github.com/smartystreets/assertions v1.2.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo= +github.com/smartystreets/goconvey v1.7.2 h1:9RBaZCeXEQ3UselpuwUQHltGVXvdwm6cv1hgR6gDIPg= github.com/smartystreets/goconvey v1.7.2/go.mod h1:Vw0tHAZW6lzCRk3xgdin6fKYcG+G3Pg9vgXWeJpQFMM= github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= @@ -540,7 +673,7 @@ github.com/twmb/franz-go/pkg/kmsg v1.9.0 h1:JojYUph2TKAau6SBtErXpXGC7E3gg4vGZMv9 github.com/twmb/franz-go/pkg/kmsg v1.9.0/go.mod h1:CMbfazviCyY6HM0SXuG5t9vOwYDHRCSrJJyBAe5paqg= github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= -github.com/urfave/cli v1.22.1 h1:+mkCCcOFKPnCmVYVcURKps1Xe+3zP90gSYGNfRkjoIY= +github.com/urfave/cli v1.22.10 h1:p8Fspmz3iTctJstry1PYS3HVdllxnEzTEsgIgtxTrCk= github.com/urfave/cli v1.22.10/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= @@ -552,9 +685,18 @@ github.com/vektah/gqlparser/v2 v2.5.11 h1:JJxLtXIoN7+3x6MBdtIP59TP1RANnY7pXOaDnA github.com/vektah/gqlparser/v2 v2.5.11/go.mod h1:1rCcfwB2ekJofmluGWXMSEnPMZgbxzwj6FaZ/4OT8Cc= github.com/vincent-petithory/dataurl v1.0.0 h1:cXw+kPto8NLuJtlMsI152irrVw9fRDX8AbShPRpg2CI= github.com/vincent-petithory/dataurl v1.0.0/go.mod h1:FHafX5vmDzyP+1CQATJn7WFKc9CvnvxyvZy6I1MrG/U= +github.com/warpfork/go-testmark v0.12.1 h1:rMgCpJfwy1sJ50x0M0NgyphxYYPMOODIJHhsXyEHU0s= +github.com/warpfork/go-testmark v0.12.1/go.mod h1:kHwy7wfvGSPh1rQJYKayD4AbtNaeyZdcGi9tNJTaa5Y= +github.com/warpfork/go-wish v0.0.0-20220906213052-39a1cc7a02d0 h1:GDDkbFiaK8jsSDJfjId/PEGEShv6ugrt4kYsC5UIDaQ= github.com/warpfork/go-wish v0.0.0-20220906213052-39a1cc7a02d0/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= +github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11 h1:5HZfQkwe0mIfyDmc1Em5GqlNRzcdtlv4HTNmdpt7XH0= +github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11/go.mod h1:Wlo/SzPmxVp6vXpGt/zaXhHH0fn4IxgqZc82aKg6bpQ= github.com/whyrusleeping/cbor-gen v0.1.3-0.20240904181319-8dc02b38228c h1:UsxJNcLPfyLyVaA4iusIrsLAqJn/xh36Qgb8emqtXzk= github.com/whyrusleeping/cbor-gen v0.1.3-0.20240904181319-8dc02b38228c/go.mod h1:pM99HXyEbSQHcosHc0iW7YFmwnscr+t9Te4ibko05so= +github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f h1:jQa4QT2UP9WYv2nzyawpKMOCl+Z/jW7djv2/J50lj9E= +github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f/go.mod h1:p9UJB6dDgdPgMJZs7UjUOdulKyRr9fqkS+6JKAInPy8= +github.com/whyrusleeping/go-did v0.0.0-20230824162731-404d1707d5d6 h1:yJ9/LwIGIk/c0CdoavpC9RNSGSruIspSZtxG3Nnldic= +github.com/whyrusleeping/go-did v0.0.0-20230824162731-404d1707d5d6/go.mod h1:39U9RRVr4CKbXpXYopWn+FSH5s+vWu6+RmguSPWAq5s= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= @@ -572,6 +714,10 @@ github.com/yuin/goldmark v1.7.1 h1:3bajkSilaCbjdKVsKdZjZCLBNPL9pYzrCakKaf4U49U= github.com/yuin/goldmark v1.7.1/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +gitlab.com/yawning/secp256k1-voi v0.0.0-20230925100816-f2616030848b h1:CzigHMRySiX3drau9C6Q5CAbNIApmLdat5jPMqChvDA= +gitlab.com/yawning/secp256k1-voi v0.0.0-20230925100816-f2616030848b/go.mod h1:/y/V339mxv2sZmYYR64O07VuCpdNZqCTwO8ZcouTMI8= +gitlab.com/yawning/tuplehash v0.0.0-20230713102510-df83abbf9a02 h1:qwDnMxjkyLmAFgcfgTnfJrmYKWhHnci3GjDqcZp1M3Q= +gitlab.com/yawning/tuplehash v0.0.0-20230713102510-df83abbf9a02/go.mod h1:JTnUj0mpYiAsuZLmKjTx/ex3AtMowcCgnE7YNyCEP0I= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.50.0 h1:cEPbyTSEHlQR89XVlyo78gqluF8Y3oMeBkXGWzQsfXY= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.50.0/go.mod h1:DKdbWcT4GH1D0Y3Sqt/PFXt2naRKDWtU+eE6oLdFNA8= go.opentelemetry.io/otel v1.31.0 h1:NsJcKPIW0D0H3NgzPDHmo0WW6SptzPdqg/L1zsIm2hY= @@ -623,8 +769,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= -golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw= -golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U= +golang.org/x/crypto v0.29.0 h1:L5SG1JTTXupVV3n6sUqMTeWbjAyfPwoda2DLX8J8FrQ= +golang.org/x/crypto v0.29.0/go.mod h1:+F4F4N5hv6v38hfeYwTdx20oUvLLc+QfrE9Ax9HtgRg= golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8= golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -634,6 +780,8 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.19.0 h1:fEdghXQSo20giMthA7cd28ZC+jts4amQ3YMXiP5oMQ8= +golang.org/x/mod v0.19.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -654,8 +802,8 @@ golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= -golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= -golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= +golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo= +golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -663,8 +811,8 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= -golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.9.0 h1:fEo0HyrW1GIgZdpbhCRO0PkJajUS5H9IFUztCgEo2jQ= +golang.org/x/sync v0.9.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -698,8 +846,8 @@ golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= -golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= @@ -717,8 +865,8 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= -golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug= +golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4= golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -781,6 +929,8 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gorm.io/driver/postgres v1.5.9 h1:DkegyItji119OlcaLjqN11kHoUgZ/j13E0jkJZgD6A8= gorm.io/driver/postgres v1.5.9/go.mod h1:DX3GReXH+3FPWGrrgffdvCk3DQ1dwDPdmbenSkweRGI= +gorm.io/driver/sqlite v1.5.5 h1:7MDMtUZhV065SilG62E0MquljeArQZNfJnjd9i9gx3E= +gorm.io/driver/sqlite v1.5.5/go.mod h1:6NgQ7sQWAIFsPrJJl1lSNSu2TABh0ZZ/zm5fosATavE= gorm.io/gorm v1.23.6/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= gorm.io/gorm v1.25.11 h1:/Wfyg1B/je1hnDx3sMkX+gAlxrlZpn6X0BXRlwXlvHg= gorm.io/gorm v1.25.11/go.mod h1:xh7N7RHfYlNc5EmcI/El95gXusucDrQnHXe0+CgWcLQ= diff --git a/internal/engine/protocol/atproto/data_source.go b/internal/engine/protocol/atproto/data_source.go index 5baa7febf..42474359e 100644 --- a/internal/engine/protocol/atproto/data_source.go +++ b/internal/engine/protocol/atproto/data_source.go @@ -3,18 +3,30 @@ package atproto import ( "context" "encoding/json" + "fmt" + + "github.com/bluesky-social/indigo/api/atproto" + "github.com/bluesky-social/indigo/events" + "github.com/bluesky-social/indigo/events/schedulers/sequential" + "github.com/gorilla/websocket" "github.com/rss3-network/node/config" "github.com/rss3-network/node/internal/database" "github.com/rss3-network/node/internal/engine" + at "github.com/rss3-network/node/provider/atproto" + "github.com/rss3-network/node/provider/atproto/bluesky" "github.com/rss3-network/protocol-go/schema/network" "github.com/samber/lo" + "go.uber.org/zap" ) var _ engine.DataSource = (*dataSource)(nil) type dataSource struct { config *config.Module + filter *Filter state State + option *Option + client *bluesky.Client databaseClient database.Client } @@ -26,12 +38,186 @@ func (s *dataSource) State() json.RawMessage { return lo.Must(json.Marshal(s.state)) } +// Start initializes the data source and starts polling for events and historical repos. func (s *dataSource) Start(ctx context.Context, tasksChan chan<- *engine.Tasks, errorChan chan<- error) { - //TODO implement me - panic("implement me") + if err := s.initialize(); err != nil { + errorChan <- fmt.Errorf("initialize dataSource failed: %w", err) + + return + } + + // Get latest events + go func() { + if err := s.pollSubscribeRepos(ctx, tasksChan); err != nil { + zap.L().Error("poll subscribe repos failed", zap.Error(err)) + + errorChan <- fmt.Errorf("poll subscribe repos failed: %w", err) + } + }() + + // Get historical repos + go func() { + if err := s.pollListRepos(ctx, tasksChan); err != nil { + zap.L().Error("poll list repos failed", zap.Error(err)) + + errorChan <- fmt.Errorf("poll list repos failed: %w", err) + } + }() } +// pollSubscribeRepos subscribes to repository events and processes them. +func (s *dataSource) pollSubscribeRepos(ctx context.Context, tasksChan chan<- *engine.Tasks) error { + uri := bluesky.BskySubscribeURI + + if s.state.SubscribeCursor != "" { + uri = fmt.Sprintf("%s?cursor=%s", uri, s.state.SubscribeCursor) + } + + conn, _, err := websocket.DefaultDialer.Dial(uri, nil) + if err != nil { + zap.L().Error("dial websocket failed", zap.Error(err)) + + return fmt.Errorf("dial websocket failed: %w", err) + } + + defer func() { + zap.L().Info("close websocket connection") + + _ = conn.Close() + }() + + rsc := &events.RepoStreamCallbacks{ + RepoCommit: func(evt *atproto.SyncSubscribeRepos_Commit) error { + messages := make([]*at.Message, 0) + + for _, op := range evt.Ops { + if op.Cid == nil { + continue + } + + // Parse the operation + message, err := s.client.GetRepoRecord(ctx, evt.Repo, op.Path) + if err != nil { + zap.L().Error("get subscribe repo record failed", zap.Error(err), zap.String("repo", evt.Repo), zap.Any("op", op)) + + return fmt.Errorf("get subscribe repo record failed: %w", err) + } + + if message != nil { + messages = append(messages, message) + } + } + + if len(messages) > 0 { + tasksChan <- s.buildTasks(ctx, messages) + } + + return nil + }, + } + + sched := sequential.NewScheduler("myfirehose", rsc.EventHandler) + + if err = events.HandleRepoStream(context.Background(), conn, sched); err != nil { + zap.L().Error("handle repo stream failed", zap.Error(err)) + + return fmt.Errorf("handle repo stream failed: %w", err) + } + + return nil +} + +// pollListRepos polls the list of repositories and processes them. +func (s *dataSource) pollListRepos(ctx context.Context, tasksChan chan<- *engine.Tasks) error { + for { + var cursor string + + if lo.IsNotEmpty(s.state.ListReposCursor) { + cursor = s.state.ListReposCursor + } + + repos, next, err := s.client.SyncListRepos(ctx, cursor, bluesky.SyncListReposLimit) + if err != nil { + zap.L().Error("sync list repos failed", zap.Error(err)) + + return fmt.Errorf("sync list repos failed: %w", err) + } + + if len(repos) > 0 { + tasksChan <- s.buildTasks(ctx, repos) + } + + s.state.ListReposCursor = lo.FromPtr(next) + } +} + +// buildTasks constructs tasks from the given messages. +func (s *dataSource) buildTasks(_ context.Context, messages []*at.Message) *engine.Tasks { + var tasks engine.Tasks + + if len(messages) == 0 { + return &tasks + } + + for _, message := range messages { + task := &Task{ + Network: s.config.Network, + Message: lo.FromPtr(message), + } + + tasks.Tasks = append(tasks.Tasks, task) + } + + zap.L().Debug("build event tasks", zap.Any("tasks", tasks)) + + return &tasks +} + +// initialize creates a new Bluesky client and assigns it to the data source. func (s *dataSource) initialize() error { - // TODO implement me - panic("implement me") + client, err := bluesky.NewClient(context.Background(), s.filter.Type, s.option.Username, s.option.Password) + if err != nil { + zap.L().Error("create bluesky client failed", zap.Error(err)) + + return fmt.Errorf("create bluesky client failed: %w", err) + } + + s.client = client + + return nil +} + +// NewSource creates a new data source instance with the given configuration, filter, checkpoint, and database client. +func NewSource(config *config.Module, sourceFilter engine.DataSourceFilter, checkpoint *engine.Checkpoint, databaseClient database.Client) (engine.DataSource, error) { + var ( + state State + err error + ) + + if checkpoint != nil { + if err := json.Unmarshal(checkpoint.State, &state); err != nil { + return nil, fmt.Errorf("unmarshal checkpoint state failed: %w", err) + } + } + + instance := dataSource{ + config: config, + state: state, + filter: new(Filter), + databaseClient: databaseClient, + } + + if instance.option, err = NewOption(config.Parameters); err != nil { + return nil, fmt.Errorf("create option failed: %w", err) + } + + if sourceFilter != nil { + var ok bool + + if instance.filter, ok = sourceFilter.(*Filter); !ok { + return nil, fmt.Errorf("invalid filter type") + } + } + + return &instance, nil } diff --git a/internal/engine/protocol/atproto/filter.go b/internal/engine/protocol/atproto/filter.go new file mode 100644 index 000000000..47b9a155d --- /dev/null +++ b/internal/engine/protocol/atproto/filter.go @@ -0,0 +1,5 @@ +package atproto + +type Filter struct { + Type []string `json:"type"` +} diff --git a/internal/engine/protocol/atproto/option.go b/internal/engine/protocol/atproto/option.go new file mode 100644 index 000000000..8d106b418 --- /dev/null +++ b/internal/engine/protocol/atproto/option.go @@ -0,0 +1,29 @@ +package atproto + +import ( + "fmt" + + "github.com/rss3-network/node/config" + "go.uber.org/zap" +) + +type Option struct { + Username string `json:"username" mapstructure:"username"` + Password string `json:"password" mapstructure:"password"` +} + +func NewOption(parameters *config.Parameters) (*Option, error) { + var option Option + + if parameters == nil { + return &Option{}, nil + } + + if err := parameters.Decode(&option); err != nil { + zap.L().Error("decode parameters failed", zap.Error(err)) + + return nil, fmt.Errorf("decode parameters failed: %w", err) + } + + return &option, nil +} diff --git a/internal/engine/protocol/atproto/state.go b/internal/engine/protocol/atproto/state.go index 3d9bc9c9e..6047bf9a5 100644 --- a/internal/engine/protocol/atproto/state.go +++ b/internal/engine/protocol/atproto/state.go @@ -1,6 +1,7 @@ package atproto type State struct { - Cursor string `json:"cursor,omitempty"` - Timestamp uint64 `json:"timestamp,omitempty"` + SubscribeCursor string `json:"subscribe_cursor,omitempty"` + SubscribeTimestamp uint64 `json:"subscribe_timestamp,omitempty"` + ListReposCursor string `json:"list_repos_cursor,omitempty"` } diff --git a/internal/engine/protocol/atproto/task.go b/internal/engine/protocol/atproto/task.go new file mode 100644 index 000000000..5f1f72af6 --- /dev/null +++ b/internal/engine/protocol/atproto/task.go @@ -0,0 +1,55 @@ +package atproto + +import ( + "fmt" + "strings" + + "github.com/rss3-network/node/internal/engine" + "github.com/rss3-network/node/provider/atproto" + activityx "github.com/rss3-network/protocol-go/schema/activity" + "github.com/rss3-network/protocol-go/schema/network" + "github.com/rss3-network/protocol-go/schema/typex" +) + +var _ engine.Task = (*Task)(nil) + +type Task struct { + Network network.Network + Message atproto.Message +} + +func (t Task) ID() string { + return strings.TrimPrefix(t.Message.URI, "at://") +} + +func (t Task) GetNetwork() network.Network { + return t.Network +} + +func (t Task) GetTimestamp() uint64 { + return uint64(t.Message.CreatedAt.Unix()) +} + +func (t Task) Validate() error { + return nil +} + +func (t Task) BuildActivity(options ...activityx.Option) (*activityx.Activity, error) { + activity := activityx.Activity{ + ID: t.ID(), + Network: t.Network, + Type: typex.Unknown, + Status: true, + Actions: make([]*activityx.Action, 0), + Timestamp: t.GetTimestamp(), + } + + // Apply activity options. + for _, option := range options { + if err := option(&activity); err != nil { + return nil, fmt.Errorf("apply option: %w", err) + } + } + + return &activity, nil +} diff --git a/internal/engine/protocol/factory.go b/internal/engine/protocol/factory.go index 2c1d3ccf3..2da3e3c0f 100644 --- a/internal/engine/protocol/factory.go +++ b/internal/engine/protocol/factory.go @@ -9,6 +9,7 @@ import ( "github.com/rss3-network/node/internal/engine" "github.com/rss3-network/node/internal/engine/protocol/activitypub" "github.com/rss3-network/node/internal/engine/protocol/arweave" + "github.com/rss3-network/node/internal/engine/protocol/atproto" "github.com/rss3-network/node/internal/engine/protocol/ethereum" "github.com/rss3-network/node/internal/engine/protocol/farcaster" "github.com/rss3-network/node/internal/engine/protocol/near" @@ -28,6 +29,8 @@ func New(config *config.Module, sourceFilter engine.DataSourceFilter, checkpoint return activitypub.NewSource(config, checkpoint, databaseClient) case network.NearProtocol: return near.NewSource(config, sourceFilter, checkpoint, redisClient) + case network.ATProtocol: + return atproto.NewSource(config, sourceFilter, checkpoint, databaseClient) default: return nil, fmt.Errorf("unsupported network protocol %s", config.Network) } diff --git a/internal/engine/worker/atproto/core/worker.go b/internal/engine/worker/atproto/core/worker.go new file mode 100644 index 000000000..e81a08ba3 --- /dev/null +++ b/internal/engine/worker/atproto/core/worker.go @@ -0,0 +1,281 @@ +package core + +import ( + "context" + "fmt" + + "github.com/bluesky-social/indigo/api/bsky" + "github.com/reiver/go-bsky/app/bsky/feed" + "github.com/rss3-network/node/internal/database" + "github.com/rss3-network/node/internal/engine" + source "github.com/rss3-network/node/internal/engine/protocol/atproto" + at "github.com/rss3-network/node/provider/atproto" + "github.com/rss3-network/node/schema/worker/atproto" + "github.com/rss3-network/protocol-go/schema" + activityx "github.com/rss3-network/protocol-go/schema/activity" + "github.com/rss3-network/protocol-go/schema/metadata" + "github.com/rss3-network/protocol-go/schema/network" + "github.com/rss3-network/protocol-go/schema/tag" + "github.com/rss3-network/protocol-go/schema/typex" + "github.com/samber/lo" + "go.uber.org/zap" +) + +var _ engine.Worker = (*worker)(nil) + +const ( + ActorProfile = "app.bsky.actor.profile" +) + +type worker struct { + databaseClient database.Client +} + +func (w *worker) Name() string { + return atproto.Core.String() +} + +func (w *worker) Platform() string { + return atproto.PlatformBluesky.String() +} + +func (w *worker) Network() []network.Network { + return []network.Network{ + network.Bluesky, + } +} + +func (w *worker) Tags() []tag.Tag { + return []tag.Tag{ + tag.Social, + } +} + +func (w *worker) Types() []schema.Type { + return []schema.Type{ + typex.SocialComment, + typex.SocialPost, + typex.SocialShare, + typex.SocialProfile, + } +} + +// Filter returns the data source filter for the worker. +func (w *worker) Filter() engine.DataSourceFilter { + return &source.Filter{ + Type: []string{ + feed.PostTypeValue, + feed.RepostTypeValue, + feed.LikeTypeValue, + ActorProfile, + }, + } +} + +// Transform processes the task and transforms it into an activity. +func (w *worker) Transform(ctx context.Context, task engine.Task) (*activityx.Activity, error) { + atprotoTask, ok := task.(*source.Task) + if !ok { + return nil, fmt.Errorf("invalid task type: %T", task) + } + + activity, err := task.BuildActivity(activityx.WithActivityPlatform(w.Platform())) + if err != nil { + return nil, fmt.Errorf("build activity: %w", err) + } + + // Handle atproto message. + switch atprotoTask.Message.Collection { + case feed.PostTypeValue: + if atprotoTask.Message.RefMessage == nil { + w.transformPost(ctx, atprotoTask.Message, activity) + } else { + w.transformComment(ctx, atprotoTask.Message, activity) + } + case feed.RepostTypeValue: + if atprotoTask.Message.RefMessage == nil { + return nil, nil + } + + w.transformRepost(ctx, atprotoTask.Message, activity) + case feed.LikeTypeValue: + w.transformLike(ctx, atprotoTask.Message, activity) + case ActorProfile: + w.transformProfile(ctx, atprotoTask.Message, activity) + default: + zap.L().Warn("unsupported type", zap.String("type", atprotoTask.Message.Collection)) + + return nil, nil + } + + if len(activity.Actions) == 0 { + return nil, nil + } + + return activity, nil +} + +// transformPost transforms a post message into an activity. +func (w *worker) transformPost(_ context.Context, message at.Message, activity *activityx.Activity) { + activity.Type = typex.SocialPost + activity.From = message.Did.String() + activity.To = message.Did.String() + + activity.Actions = []*activityx.Action{ + w.buildPostAction(activity.From, activity.To, activity.Type, w.buildPostMetadata(message)), + } +} + +// transformComment transforms a comment message into an activity. +func (w *worker) transformComment(_ context.Context, message at.Message, activity *activityx.Activity) { + activity.Type = typex.SocialComment + activity.From = message.Did.String() + activity.To = message.RefMessage.Did.String() + + post := w.buildPostMetadata(message) + + post.Target = w.buildPostMetadata(lo.FromPtr(message.RefMessage)) + + activity.Actions = []*activityx.Action{ + w.buildPostAction(activity.From, activity.To, activity.Type, post), + } +} + +// transformRepost transforms a repost message into an activity. +func (w *worker) transformRepost(_ context.Context, message at.Message, activity *activityx.Activity) { + activity.Type = typex.SocialShare + activity.From = message.Did.String() + activity.To = message.RefMessage.Did.String() + + activity.Actions = []*activityx.Action{ + w.buildPostAction(activity.From, activity.To, activity.Type, w.buildPostMetadata(lo.FromPtr(message.RefMessage))), + } +} + +// transformLike transforms a like message into an activity. +func (w *worker) transformLike(_ context.Context, message at.Message, activity *activityx.Activity) { + activity.Type = typex.SocialLike + activity.From = message.Did.String() + activity.To = message.RefMessage.Did.String() + + activity.Actions = []*activityx.Action{ + w.buildPostAction(activity.From, activity.To, activity.Type, w.buildPostMetadata(lo.FromPtr(message.RefMessage))), + } +} + +// transformProfile transforms a profile message into an activity. +func (w *worker) transformProfile(_ context.Context, message at.Message, activity *activityx.Activity) { + activity.Type = typex.SocialProfile + activity.From = message.Did.String() + activity.To = message.Did.String() + + activity.Actions = []*activityx.Action{ + { + Tag: activity.Type.Tag(), + Type: activity.Type, + Platform: w.Platform(), + From: activity.From, + To: activity.To, + Metadata: w.buildProfileMetadata(message), + }, + } +} + +// buildPostMetadata constructs metadata for a post message. +func (w *worker) buildPostMetadata(message at.Message) *metadata.SocialPost { + return &metadata.SocialPost{ + Handle: message.Handle, + Body: message.Feed.Text, + Media: w.buildPostMedia(message.Feed.Embed), + ProfileID: message.Did.String(), + PublicationID: message.Rkey, + ContentURI: message.URI, + Tags: message.Feed.Tags, + Timestamp: uint64(message.CreatedAt.Unix()), + } +} + +// buildProfileMetadata constructs metadata for a profile message. +func (w *worker) buildProfileMetadata(message at.Message) *metadata.SocialProfile { + if message.Profile == nil { + return nil + } + + profile := &metadata.SocialProfile{ + Action: metadata.ActionSocialProfileCreate, + Handle: message.Handle, + } + + if message.Profile.Description != nil { + profile.Bio = *message.Profile.Description + } + + if message.Profile.Avatar != nil { + profile.ImageURI = message.Profile.Avatar.Ref.String() + } + + if message.Profile.DisplayName != nil { + profile.Name = *message.Profile.DisplayName + } + + return profile +} + +// buildPostAction constructs an action for a post message. +func (w *worker) buildPostAction(from string, to string, typex schema.Type, post *metadata.SocialPost) *activityx.Action { + return &activityx.Action{ + Tag: typex.Tag(), + Type: typex, + Platform: atproto.PlatformBluesky.String(), + From: from, + To: to, + Metadata: post, + } +} + +// buildPostMedia will build post media from embeds. +func (w *worker) buildPostMedia(embed *bsky.FeedPost_Embed) []metadata.Media { + if embed == nil { + return nil + } + + media := make([]metadata.Media, 0) + + if embed.EmbedImages != nil && embed.EmbedImages.Images != nil { + for _, image := range embed.EmbedImages.Images { + media = append(media, metadata.Media{ + Address: image.Image.Ref.String(), + MimeType: image.Image.MimeType, + }) + } + } + + if embed.EmbedRecord != nil && embed.EmbedRecord.Record != nil { + media = append(media, metadata.Media{ + Address: embed.EmbedRecord.Record.Uri, + MimeType: "media/mp4", + }) + } + + if embed.EmbedVideo != nil && embed.EmbedVideo.Video != nil { + media = append(media, metadata.Media{ + Address: embed.EmbedVideo.Video.Ref.String(), + MimeType: embed.EmbedVideo.Video.MimeType, + }) + } + + if embed.EmbedExternal != nil && embed.EmbedExternal.External != nil && embed.EmbedExternal.External.Thumb != nil { + media = append(media, metadata.Media{ + Address: embed.EmbedExternal.External.Thumb.Ref.String(), + MimeType: embed.EmbedExternal.External.Thumb.MimeType, + }) + } + + return media +} + +func NewWorker(databaseClient database.Client) (engine.Worker, error) { + return &worker{ + databaseClient: databaseClient, + }, nil +} diff --git a/internal/engine/worker/atproto/factory.go b/internal/engine/worker/atproto/factory.go new file mode 100644 index 000000000..ca28f902b --- /dev/null +++ b/internal/engine/worker/atproto/factory.go @@ -0,0 +1,20 @@ +package atproto + +import ( + "fmt" + + "github.com/rss3-network/node/config" + "github.com/rss3-network/node/internal/database" + "github.com/rss3-network/node/internal/engine" + "github.com/rss3-network/node/internal/engine/worker/atproto/core" + "github.com/rss3-network/node/schema/worker/atproto" +) + +func New(config *config.Module, databaseClient database.Client) (engine.Worker, error) { + switch config.Worker { + case atproto.Core: + return core.NewWorker(databaseClient) + default: + return nil, fmt.Errorf("unsupported worker %s", config.Worker) + } +} diff --git a/internal/node/indexer/server.go b/internal/node/indexer/server.go index 9ab1cba7c..780660268 100644 --- a/internal/node/indexer/server.go +++ b/internal/node/indexer/server.go @@ -14,6 +14,7 @@ import ( "github.com/rss3-network/node/internal/database" "github.com/rss3-network/node/internal/engine" "github.com/rss3-network/node/internal/engine/protocol" + atprotoWorker "github.com/rss3-network/node/internal/engine/worker/atproto" decentralizedWorker "github.com/rss3-network/node/internal/engine/worker/decentralized" federatedWorker "github.com/rss3-network/node/internal/engine/worker/federated" "github.com/rss3-network/node/internal/node/monitor" @@ -133,29 +134,47 @@ func (s *Server) handleTasks(ctx context.Context, tasks *engine.Tasks) error { return nil } - resultPool := pool.NewWithResults[*activityx.Activity]().WithMaxGoroutines(lo.Ternary(tasks.Len() < 20*runtime.NumCPU(), tasks.Len(), 20*runtime.NumCPU())) + resultPool := pool.NewWithResults[*activityx.Activity](). + WithMaxGoroutines(lo.Ternary(tasks.Len() < 20*runtime.NumCPU(), tasks.Len(), 20*runtime.NumCPU())). + WithContext(ctx).WithFirstError().WithCancelOnError() for _, task := range tasks.Tasks { task := task - resultPool.Go(func() *activityx.Activity { + resultPool.Go(func(ctx context.Context) (*activityx.Activity, error) { zap.L().Debug("start transform task", zap.String("task.id", task.ID())) activity, err := s.worker.Transform(ctx, task) if err != nil { zap.L().Error("transform task", zap.String("task.id", task.ID()), zap.Error(err)) - return nil + return nil, fmt.Errorf("transform task %s: %w", task.ID(), err) + } + + // Filter out activities that failed to transform or contain no actions + if len(activity.Actions) == 0 { + zap.L().Debug("skip empty activity", zap.String("task.id", task.ID())) + + return nil, nil } - return activity + return activity, nil }) } + results, err := resultPool.Wait() + if err != nil { + return fmt.Errorf("wait transform results: %w", err) + } + // Filter out activities that failed to transform or contain no actions - activities := lo.Filter(resultPool.Wait(), func(activity *activityx.Activity, _ int) bool { - return activity != nil && len(activity.Actions) > 0 - }) + activities := make([]*activityx.Activity, 0, len(results)) + + for _, result := range results { + if result != nil { + activities = append(activities, result) + } + } // Deprecated: use meterTasksHistogram instead. s.meterTasksCounter.Add(ctx, int64(tasks.Len()), meterTasksCounterAttributes) @@ -296,6 +315,10 @@ func NewServer(ctx context.Context, config *config.Module, databaseClient databa if instance.worker, err = federatedWorker.New(instance.config, databaseClient, instance.redisClient); err != nil { return nil, fmt.Errorf("new federated worker: %w", err) } + case network.ATProtocol: + if instance.worker, err = atprotoWorker.New(instance.config, databaseClient); err != nil { + return nil, fmt.Errorf("new atproto worker: %w", err) + } default: return nil, fmt.Errorf("unknown worker protocol: %s", config.Network.Protocol()) } diff --git a/provider/atproto/bluesky/client.go b/provider/atproto/bluesky/client.go index 409cbe3d4..676ae7b78 100644 --- a/provider/atproto/bluesky/client.go +++ b/provider/atproto/bluesky/client.go @@ -1,49 +1,564 @@ package bluesky import ( + "bytes" "context" + "fmt" + "net" + "net/http" + "strings" + "sync" + "time" + + "github.com/araddon/dateparse" "github.com/bluesky-social/indigo/api/atproto" + "github.com/bluesky-social/indigo/api/bsky" + "github.com/bluesky-social/indigo/atproto/identity" + "github.com/bluesky-social/indigo/atproto/syntax" + "github.com/bluesky-social/indigo/repo" "github.com/bluesky-social/indigo/xrpc" + "github.com/go-playground/form/v4" + "github.com/ipfs/go-cid" + at "github.com/rss3-network/node/provider/atproto" + "github.com/samber/lo" + cbg "github.com/whyrusleeping/cbor-gen" "go.uber.org/zap" - "net/http" ) const ( - BskyEndpoint = "https://bsky.social" + BskyEndpoint = "https://bsky.social" + BskySubscribeURI = "wss://bsky.network/xrpc/com.atproto.sync.subscribeRepos" + + SyncListReposLimit = 50 ) type Client struct { - xrpcClient *xrpc.Client + username string + password string + filter []string + mutex sync.RWMutex + defaultClient *XrpcClient + cacheClient map[string]*XrpcClient + encoder *form.Encoder + httpClient *http.Client +} + +type XrpcClient struct { + *xrpc.Client + createdAt time.Time } -func (c *Client) GetEvents(ctx context.Context) { +// SyncListRepos fetches a paginated list of repository updates. +// Parameters: +// - cursor: Pagination token, empty for first page +// - limit: Maximum number of repos to fetch +// Returns list of messages and the next cursor for pagination. +func (c *Client) SyncListRepos(ctx context.Context, cursor string, limit int64) ([]*at.Message, *string, error) { + // Get default client for bsky.social endpoint + client, err := c.GetXrpcClient(ctx, BskyEndpoint) + if err != nil { + zap.L().Error("get xrpc client failed", zap.Error(err)) + + return nil, nil, fmt.Errorf("get xrpc client failed: %w", err) + } + // Fetch the list of repos + results, err := atproto.SyncListRepos(ctx, client.Client, cursor, limit) + if err != nil { + zap.L().Error("sync list repos failed", zap.Error(err)) + + return nil, nil, fmt.Errorf("sync list repos failed: %w", err) + } + + data := make([]*at.Message, 0) + + // Process each repository to extract its records + for _, rep := range results.Repos { + feed, err := c.SyncGetRepo(ctx, rep) + if err != nil { + zap.L().Error("sync get repo failed", zap.Error(err)) + + return nil, nil, fmt.Errorf("sync get repo failed: %w", err) + } + + if len(feed) == 0 { + continue + } + + data = append(data, feed...) + } + + return data, results.Cursor, nil } -func NewClient(ctx context.Context, username string, password string) (*Client, error) { - xrpcClient := &xrpc.Client{ - Host: BskyEndpoint, - Client: http.DefaultClient, +// SyncGetRepo retrieves all records from a repository snapshot. +// Parameters: +// - repoData: Repository metadata including DID and status +// Returns list of messages containing the repository records. +func (c *Client) SyncGetRepo(ctx context.Context, repoData *atproto.SyncListRepos_Repo) ([]*at.Message, error) { + if repoData.Active != nil && !lo.FromPtr(repoData.Active) { + return nil, nil + } + + // Parse the repository DID + did, err := syntax.ParseDID(repoData.Did) + if err != nil { + zap.L().Error("parse DID failed", zap.Error(err)) + + return nil, fmt.Errorf("parse DID: %w", err) + } + + // Get authenticated client for the endpoint + client, err := c.GetXrpcClient(ctx, c.LookupDIDEdnpoint(ctx, did)) + if err != nil { + zap.L().Error("create xrpc client failed", zap.Error(err)) + + return nil, fmt.Errorf("create xrpc client: %w", err) + } + + // Get user handle from profile + handle, err := c.GetHandle(ctx, did) + if err != nil { + zap.L().Error("get profile failed", zap.Error(err)) + + return nil, fmt.Errorf("get profile: %w", err) + } + + // Fetch repo data + repoBytes, err := atproto.SyncGetRepo(ctx, client.Client, did.String(), "") + if err != nil { + zap.L().Error("get repo failed", zap.Error(err)) + + return nil, fmt.Errorf("get repo: %w", err) + } + + // Parse repo data in CAR format + feedList, err := c.ParseCARList(ctx, did, handle, repoBytes) + if err != nil { + zap.L().Error("parse car list failed", zap.Error(err)) + + return nil, fmt.Errorf("parse car list: %w", err) + } + + return feedList, nil +} + +// ParseCARList processes repository data in CAR format and extracts messages. +// Parameters: +// - did: Repository owner's DID +// - handle: User's handle +// - repoBytes: Raw CAR format repository data +// Returns list of processed messages from the repository. +func (c *Client) ParseCARList(ctx context.Context, did syntax.DID, handle string, repoBytes []byte) ([]*at.Message, error) { + r, err := repo.ReadRepoFromCar(ctx, bytes.NewReader(repoBytes)) + if err != nil { + zap.L().Error("read repo from car failed", zap.Error(err)) + + return nil, fmt.Errorf("read repo from car: %w", err) } - auth, err := atproto.ServerCreateSession(ctx, xrpcClient, &atproto.ServerCreateSession_Input{ - Identifier: username, - Password: password, + recList := make([]*at.Message, 0) + + // Iterate over all records + err = r.ForEach(ctx, "", func(path string, _ cid.Cid) error { + // Parse path to get collection and rkey + collection, rkey := c.ParsePath(path) + + if !lo.Contains(c.filter, collection) { + return nil + } + + // Get record from repo + _, rec, err := r.GetRecord(ctx, path) + if err != nil { + zap.L().Error("get record failed", zap.Error(err)) + + return fmt.Errorf("get record: %w", err) + } + + message := &at.Message{ + URI: c.BuildURI(did, collection, rkey), + Did: did, + Handle: handle, + Collection: collection, + Rkey: rkey, + } + + // Parse record and update message + if err = c.ParseRecord(ctx, rec, message); err != nil { + zap.L().Error("parse record failed", zap.Error(err)) + + return nil + } + + recList = append(recList, message) + + return nil }) + if err != nil { - zap.L().Error("create session failed", zap.Error(err), zap.String("username", username)) + zap.L().Error("iterate over all records failed", zap.Error(err)) return nil, err } - xrpcClient.Auth = &xrpc.AuthInfo{ + return recList, nil +} + +// GetRepoRecord retrieves a specific record from a repository. +// Parameters: +// - repo: The DID of the repository +// - path: The path in format "collection/rkey" +// Returns the message containing the record data or an error. +func (c *Client) GetRepoRecord(ctx context.Context, repo string, path string) (*at.Message, error) { + message, rec, err := c.GetRecord(ctx, repo, path) + if err != nil { + zap.L().Error("get record failed", zap.Error(err)) + + return nil, fmt.Errorf("get record: %w", err) + } + + err = c.ParseRecord(ctx, rec, message) + if err != nil { + zap.L().Error("parse record failed", zap.Error(err)) + + return nil, nil + } + + return message, nil +} + +func (c *Client) GetRecord(ctx context.Context, repo string, path string) (*at.Message, cbg.CBORMarshaler, error) { + // Parse the path into collection and rkey components + collection, rkey := c.ParsePath(path) + + if !lo.Contains(c.filter, collection) { + return nil, nil, nil + } + + // Parse and validate the DID + did, err := syntax.ParseDID(repo) + if err != nil { + zap.L().Error("parse DID failed", zap.Error(err), zap.String("repo", repo)) + + return nil, nil, fmt.Errorf("parse DID: %w", err) + } + + // Get authenticated client + client, err := c.GetXrpcClient(ctx, c.LookupDIDEdnpoint(ctx, did)) + if err != nil { + zap.L().Error("create xrpc client failed", zap.Error(err)) + + return nil, nil, fmt.Errorf("create xrpc client: %w", err) + } + + // Fetch the handle associated with the DID + handle, err := c.GetHandle(ctx, did) + if err != nil { + zap.L().Error("get profile failed", zap.Error(err)) + + return nil, nil, fmt.Errorf("get profile: %w", err) + } + + message := &at.Message{ + URI: c.BuildURI(did, collection, rkey), + Did: did, + Handle: handle, + Collection: collection, + Rkey: rkey, + } + + // Retrieve the record + resp, err := atproto.RepoGetRecord(ctx, client.Client, "", collection, repo, rkey) + if err != nil { + // Handle CID too short error gracefully + if strings.Contains(err.Error(), cid.ErrCidTooShort.Error()) || strings.Contains(err.Error(), "XRPC ERROR 400") { + return message, nil, nil + } + + return nil, nil, fmt.Errorf("repo get record: %w", err) + } + + if resp != nil && resp.Value != nil { + return message, resp.Value.Val, nil + } + + return message, nil, nil +} + +// GetHandle retrieves the handle (username) for a given DID. +// Parameters: +// - did: User's decentralized identifier +// Returns the user's handle or an error. +func (c *Client) GetHandle(ctx context.Context, did syntax.DID) (string, error) { + client, err := c.GetXrpcClient(ctx, c.LookupDIDEdnpoint(ctx, did)) + if err != nil { + return "", fmt.Errorf("get xrpc client: %w", err) + } + + resp, err := bsky.ActorGetProfile(ctx, client.Client, did.String()) + if err != nil { + if strings.Contains(err.Error(), "XRPC ERROR 400") { + return "", nil + } + + return "", fmt.Errorf("profile get: %w", err) + } + + if resp == nil { + return "", nil + } + + return resp.Handle, nil +} + +// ParseRecord processes different types of records and updates the message. +// Parameters: +// - rec: CBOR marshaled record to parse +// - message: Message struct to be updated with record data +// Returns error if record parsing fails. +func (c *Client) ParseRecord(ctx context.Context, rec cbg.CBORMarshaler, message *at.Message) error { + var ( + err error + createdAt string + ) + + switch rec := rec.(type) { + case *bsky.FeedPost: + message.Feed = rec + createdAt = rec.CreatedAt + + if rec.Reply != nil && rec.Reply.Parent != nil { + message.RefMessage, err = c.ParseRepoStrongRef(ctx, rec.Reply.Parent) + if err != nil { + zap.L().Error("parse repo strong ref failed", zap.Error(err)) + + return fmt.Errorf("parse repo strong ref: %w", err) + } + } + case *bsky.ActorProfile: + message.Profile = rec + + if rec.CreatedAt != nil { + createdAt = *rec.CreatedAt + } + case *bsky.FeedRepost: + message.RefMessage, err = c.ParseRepoStrongRef(ctx, rec.Subject) + if err != nil { + zap.L().Error("parse repo strong ref failed", zap.Error(err)) + + return fmt.Errorf("parse repo strong ref: %w", err) + } + + createdAt = rec.CreatedAt + case *bsky.FeedLike: + message.RefMessage, err = c.ParseRepoStrongRef(ctx, rec.Subject) + if err != nil { + zap.L().Error("parse repo strong ref failed", zap.Error(err)) + + return fmt.Errorf("parse repo strong ref: %w", err) + } + + createdAt = rec.CreatedAt + } + + timestamp, err := dateparse.ParseAny(createdAt) + if err != nil { + return fmt.Errorf("parse timestamp: %w", err) + } + + message.CreatedAt = timestamp + + return nil +} + +func (c *Client) ParseRepoStrongRef(ctx context.Context, ref *atproto.RepoStrongRef) (*at.Message, error) { + if ref == nil { + return nil, fmt.Errorf("repo strong ref is nil") + } + + repo, path := c.ParseURI(ref.Uri) + + target, rec, err := c.GetRecord(ctx, repo, path) + if err != nil { + zap.L().Error("get record failed", zap.Error(err)) + + return nil, fmt.Errorf("get record: %w", err) + } + + if rec == nil { + return nil, nil + } + + switch rec := rec.(type) { + case *bsky.FeedPost: + target.Feed = rec + default: + return nil, fmt.Errorf("unsupported record type: %T", rec) + } + + return target, nil +} + +// ParseURI splits an AT Protocol URI into components. +// Parameters: +// - uri: Complete AT Protocol URI (format: at://did/collection/rkey) +// Returns the repository DID and the path. +func (c *Client) ParseURI(uri string) (string, string) { + // Remove "at://" prefix + uri = strings.TrimPrefix(uri, "at://") + + // Split into DID and collection/rkey parts + parts := strings.SplitN(uri, "/", 2) + if len(parts) != 2 { + return "", "" + } + + return parts[0], parts[1] +} + +// ParsePath splits a path string into collection and rkey components. +// Parameters: +// - path: String in format "collection/rkey" +// Returns collection and rkey as separate strings. +func (c *Client) ParsePath(path string) (string, string) { + parts := strings.Split(path, "/") + + if len(parts) < 2 { + return "", "" + } + + return parts[0], parts[1] +} + +// BuildURI constructs an AT Protocol URI from its components. +// Parameters: +// - did: Repository owner's DID +// - collection: Record collection identifier +// - rkey: Record key +// Returns complete URI in format "at://did/collection/rkey". +func (c *Client) BuildURI(did syntax.DID, collection string, rkey string) string { + return fmt.Sprintf("at://%s/%s/%s", did, collection, rkey) +} + +// GetXrpcClient returns a cached or new authenticated XRPC client. +// Parameters: +// - endpoint: API endpoint URL to connect to +// Returns authenticated client or error if authentication fails. +func (c *Client) GetXrpcClient(ctx context.Context, endpoint string) (*XrpcClient, error) { + if endpoint == BskyEndpoint { + if c.defaultClient != nil && time.Since(c.defaultClient.createdAt) < time.Hour*2 { + return c.defaultClient, nil + } + + client, err := c.createAndAuthenticateClient(ctx, BskyEndpoint) + if err != nil { + zap.L().Error("server create session failed", zap.Error(err)) + return nil, err + } + + c.defaultClient = client + + return c.defaultClient, nil + } + + c.mutex.RLock() + cacheClient, ok := c.cacheClient[endpoint] + c.mutex.RUnlock() + + if ok && time.Since(cacheClient.createdAt) < time.Hour*2 { + return cacheClient, nil + } + + client, err := c.createAndAuthenticateClient(ctx, endpoint) + if err != nil { + return c.GetXrpcClient(ctx, BskyEndpoint) + } + + c.mutex.Lock() + c.cacheClient[endpoint] = client + c.mutex.Unlock() + + return client, nil +} + +func (c *Client) createAndAuthenticateClient(ctx context.Context, endpoint string) (*XrpcClient, error) { + client := &xrpc.Client{ + Host: endpoint, + Client: http.DefaultClient, + } + + // Create context with 5 second timeout + timeoutCtx, cancel := context.WithTimeout(ctx, 5*time.Second) + defer cancel() + + // Authenticate the client + auth, err := atproto.ServerCreateSession(timeoutCtx, client, &atproto.ServerCreateSession_Input{ + Identifier: c.username, + Password: c.password, + }) + if err != nil { + return nil, fmt.Errorf("server create session: %w", err) + } + + // Update client with authentication info + client.Auth = &xrpc.AuthInfo{ AccessJwt: auth.AccessJwt, RefreshJwt: auth.RefreshJwt, Handle: auth.Handle, Did: auth.Did, } - return &Client{ - xrpcClient: xrpcClient, + return &XrpcClient{ + Client: client, + createdAt: time.Now(), }, nil } + +func (c *Client) LookupDIDEdnpoint(ctx context.Context, did syntax.DID) string { + // Creates a new BaseDirectory with default settings. + baseDirectory := &identity.BaseDirectory{ + PLCURL: identity.DefaultPLCURL, + HTTPClient: http.Client{ + Timeout: time.Second * 15, + }, + Resolver: net.Resolver{ + Dial: func(ctx context.Context, network, address string) (net.Conn, error) { + d := net.Dialer{Timeout: time.Second * 5} + return d.DialContext(ctx, network, address) + }, + }, + TryAuthoritativeDNS: true, + SkipDNSDomainSuffixes: []string{".bsky.social"}, + } + + timeoutCtx, cancel := context.WithTimeout(ctx, 5*time.Second) + defer cancel() + + identity, err := baseDirectory.LookupDID(timeoutCtx, did) + if err == nil { + return identity.PDSEndpoint() + } + + return BskyEndpoint +} + +func NewClient(_ context.Context, filter []string, username string, password string) (*Client, error) { + client := &Client{ + username: username, + password: password, + filter: filter, + cacheClient: make(map[string]*XrpcClient), + encoder: form.NewEncoder(), + httpClient: http.DefaultClient, + } + + defaultXrpcClient, err := client.createAndAuthenticateClient(context.Background(), BskyEndpoint) + if err != nil { + return nil, fmt.Errorf("create and authenticate client: %w", err) + } + + client.defaultClient = defaultXrpcClient + + return client, nil +} diff --git a/provider/atproto/model.go b/provider/atproto/model.go new file mode 100644 index 000000000..c19ab43ef --- /dev/null +++ b/provider/atproto/model.go @@ -0,0 +1,21 @@ +package atproto + +import ( + "time" + + "github.com/bluesky-social/indigo/api/bsky" + "github.com/bluesky-social/indigo/atproto/syntax" +) + +type Message struct { + URI string + Did syntax.DID + Handle string + Collection string + Rkey string + CreatedAt time.Time + + Feed *bsky.FeedPost + Profile *bsky.ActorProfile + RefMessage *Message +} diff --git a/schema/worker/atproto/platform.go b/schema/worker/atproto/platform.go new file mode 100644 index 000000000..8b5015b47 --- /dev/null +++ b/schema/worker/atproto/platform.go @@ -0,0 +1,29 @@ +package atproto + +import "github.com/labstack/echo/v4" + +//go:generate go run --mod=mod github.com/dmarkham/enumer@v1.5.9 --values --type=Platform --linecomment --output platform_string.go --json --yaml --sql +type Platform uint64 + +const ( + PlatformUnknown Platform = iota // Unknown + PlatformBluesky // Bluesky +) + +var _ echo.BindUnmarshaler = (*Platform)(nil) + +func (p *Platform) UnmarshalParam(param string) error { + platform, err := PlatformString(param) + if err != nil { + return err + } + + *p = platform + + return nil +} + +// ToPlatformMap is a map of worker to platform +var ToPlatformMap = map[Worker]Platform{ + Core: PlatformBluesky, +} diff --git a/schema/worker/atproto/platform_string.go b/schema/worker/atproto/platform_string.go new file mode 100644 index 000000000..15bcb0f16 --- /dev/null +++ b/schema/worker/atproto/platform_string.go @@ -0,0 +1,148 @@ +// Code generated by "enumer --values --type=Platform --linecomment --output platform_string.go --json --yaml --sql"; DO NOT EDIT. + +package atproto + +import ( + "database/sql/driver" + "encoding/json" + "fmt" + "strings" +) + +const _PlatformName = "UnknownBluesky" + +var _PlatformIndex = [...]uint8{0, 7, 14} + +const _PlatformLowerName = "unknownbluesky" + +func (i Platform) String() string { + if i >= Platform(len(_PlatformIndex)-1) { + return fmt.Sprintf("Platform(%d)", i) + } + return _PlatformName[_PlatformIndex[i]:_PlatformIndex[i+1]] +} + +func (Platform) Values() []string { + return PlatformStrings() +} + +// An "invalid array index" compiler error signifies that the constant values have changed. +// Re-run the stringer command to generate them again. +func _PlatformNoOp() { + var x [1]struct{} + _ = x[PlatformUnknown-(0)] + _ = x[PlatformBluesky-(1)] +} + +var _PlatformValues = []Platform{PlatformUnknown, PlatformBluesky} + +var _PlatformNameToValueMap = map[string]Platform{ + _PlatformName[0:7]: PlatformUnknown, + _PlatformLowerName[0:7]: PlatformUnknown, + _PlatformName[7:14]: PlatformBluesky, + _PlatformLowerName[7:14]: PlatformBluesky, +} + +var _PlatformNames = []string{ + _PlatformName[0:7], + _PlatformName[7:14], +} + +// PlatformString retrieves an enum value from the enum constants string name. +// Throws an error if the param is not part of the enum. +func PlatformString(s string) (Platform, error) { + if val, ok := _PlatformNameToValueMap[s]; ok { + return val, nil + } + + if val, ok := _PlatformNameToValueMap[strings.ToLower(s)]; ok { + return val, nil + } + return 0, fmt.Errorf("%s does not belong to Platform values", s) +} + +// PlatformValues returns all values of the enum +func PlatformValues() []Platform { + return _PlatformValues +} + +// PlatformStrings returns a slice of all String values of the enum +func PlatformStrings() []string { + strs := make([]string, len(_PlatformNames)) + copy(strs, _PlatformNames) + return strs +} + +// IsAPlatform returns "true" if the value is listed in the enum definition. "false" otherwise +func (i Platform) IsAPlatform() bool { + for _, v := range _PlatformValues { + if i == v { + return true + } + } + return false +} + +// MarshalJSON implements the json.Marshaler interface for Platform +func (i Platform) MarshalJSON() ([]byte, error) { + return json.Marshal(i.String()) +} + +// UnmarshalJSON implements the json.Unmarshaler interface for Platform +func (i *Platform) UnmarshalJSON(data []byte) error { + var s string + if err := json.Unmarshal(data, &s); err != nil { + return fmt.Errorf("Platform should be a string, got %s", data) + } + + var err error + *i, err = PlatformString(s) + return err +} + +// MarshalYAML implements a YAML Marshaler for Platform +func (i Platform) MarshalYAML() (interface{}, error) { + return i.String(), nil +} + +// UnmarshalYAML implements a YAML Unmarshaler for Platform +func (i *Platform) UnmarshalYAML(unmarshal func(interface{}) error) error { + var s string + if err := unmarshal(&s); err != nil { + return err + } + + var err error + *i, err = PlatformString(s) + return err +} + +func (i Platform) Value() (driver.Value, error) { + return i.String(), nil +} + +func (i *Platform) Scan(value interface{}) error { + if value == nil { + return nil + } + + var str string + switch v := value.(type) { + case []byte: + str = string(v) + case string: + str = v + case fmt.Stringer: + str = v.String() + default: + return fmt.Errorf("invalid value of Platform: %[1]T(%[1]v)", value) + } + + val, err := PlatformString(str) + if err != nil { + return err + } + + *i = val + return nil +} diff --git a/schema/worker/atproto/worker.go b/schema/worker/atproto/worker.go new file mode 100644 index 000000000..7c19533ec --- /dev/null +++ b/schema/worker/atproto/worker.go @@ -0,0 +1,43 @@ +package atproto + +import ( + "github.com/labstack/echo/v4" + "github.com/rss3-network/protocol-go/schema/tag" +) + +//go:generate go run --mod=mod github.com/dmarkham/enumer@v1.5.9 --values --type=Worker --linecomment --output worker_string.go --json --yaml --sql +type Worker int + +const ( + Core Worker = iota + 1 // core +) + +func (w Worker) Component() string { + return "atproto" +} + +func (w Worker) Name() string { + return w.String() +} + +var _ echo.BindUnmarshaler = (*Worker)(nil) + +func (w *Worker) UnmarshalParam(param string) error { + worker, err := WorkerString(param) + if err != nil { + return err + } + + *w = worker + + return nil +} + +func GetValueByWorkerStr(workerStr string) Worker { + return _WorkerNameToValueMap[workerStr] +} + +// ToTagsMap is a map of worker to tags +var ToTagsMap = map[Worker][]tag.Tag{ + Core: {tag.Social}, +} diff --git a/schema/worker/atproto/worker_string.go b/schema/worker/atproto/worker_string.go new file mode 100644 index 000000000..91e1bd249 --- /dev/null +++ b/schema/worker/atproto/worker_string.go @@ -0,0 +1,145 @@ +// Code generated by "enumer --values --type=Worker --linecomment --output worker_string.go --json --yaml --sql"; DO NOT EDIT. + +package atproto + +import ( + "database/sql/driver" + "encoding/json" + "fmt" + "strings" +) + +const _WorkerName = "core" + +var _WorkerIndex = [...]uint8{0, 4} + +const _WorkerLowerName = "core" + +func (i Worker) String() string { + i -= 1 + if i < 0 || i >= Worker(len(_WorkerIndex)-1) { + return fmt.Sprintf("Worker(%d)", i+1) + } + return _WorkerName[_WorkerIndex[i]:_WorkerIndex[i+1]] +} + +func (Worker) Values() []string { + return WorkerStrings() +} + +// An "invalid array index" compiler error signifies that the constant values have changed. +// Re-run the stringer command to generate them again. +func _WorkerNoOp() { + var x [1]struct{} + _ = x[Core-(1)] +} + +var _WorkerValues = []Worker{Core} + +var _WorkerNameToValueMap = map[string]Worker{ + _WorkerName[0:4]: Core, + _WorkerLowerName[0:4]: Core, +} + +var _WorkerNames = []string{ + _WorkerName[0:4], +} + +// WorkerString retrieves an enum value from the enum constants string name. +// Throws an error if the param is not part of the enum. +func WorkerString(s string) (Worker, error) { + if val, ok := _WorkerNameToValueMap[s]; ok { + return val, nil + } + + if val, ok := _WorkerNameToValueMap[strings.ToLower(s)]; ok { + return val, nil + } + return 0, fmt.Errorf("%s does not belong to Worker values", s) +} + +// WorkerValues returns all values of the enum +func WorkerValues() []Worker { + return _WorkerValues +} + +// WorkerStrings returns a slice of all String values of the enum +func WorkerStrings() []string { + strs := make([]string, len(_WorkerNames)) + copy(strs, _WorkerNames) + return strs +} + +// IsAWorker returns "true" if the value is listed in the enum definition. "false" otherwise +func (i Worker) IsAWorker() bool { + for _, v := range _WorkerValues { + if i == v { + return true + } + } + return false +} + +// MarshalJSON implements the json.Marshaler interface for Worker +func (i Worker) MarshalJSON() ([]byte, error) { + return json.Marshal(i.String()) +} + +// UnmarshalJSON implements the json.Unmarshaler interface for Worker +func (i *Worker) UnmarshalJSON(data []byte) error { + var s string + if err := json.Unmarshal(data, &s); err != nil { + return fmt.Errorf("Worker should be a string, got %s", data) + } + + var err error + *i, err = WorkerString(s) + return err +} + +// MarshalYAML implements a YAML Marshaler for Worker +func (i Worker) MarshalYAML() (interface{}, error) { + return i.String(), nil +} + +// UnmarshalYAML implements a YAML Unmarshaler for Worker +func (i *Worker) UnmarshalYAML(unmarshal func(interface{}) error) error { + var s string + if err := unmarshal(&s); err != nil { + return err + } + + var err error + *i, err = WorkerString(s) + return err +} + +func (i Worker) Value() (driver.Value, error) { + return i.String(), nil +} + +func (i *Worker) Scan(value interface{}) error { + if value == nil { + return nil + } + + var str string + switch v := value.(type) { + case []byte: + str = string(v) + case string: + str = v + case fmt.Stringer: + str = v.String() + default: + return fmt.Errorf("invalid value of Worker: %[1]T(%[1]v)", value) + } + + val, err := WorkerString(str) + if err != nil { + return err + } + + *i = val + return nil +} From 73d50d8f0cb101f4757e67a5cbf25cd894b4e9d5 Mon Sep 17 00:00:00 2001 From: polebug Date: Wed, 27 Nov 2024 22:56:49 +0800 Subject: [PATCH 03/31] go mod tidy --- go.mod | 3 ++- go.sum | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 70e35605a..f8ecc17ef 100644 --- a/go.mod +++ b/go.mod @@ -59,7 +59,9 @@ require ( github.com/bluesky-social/indigo v0.0.0-20241031232035-1a73c3fb6841 github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 github.com/emirpasic/gods v1.18.1 + github.com/go-fed/httpsig v1.1.0 github.com/go-redsync/redsync/v4 v4.13.0 + github.com/google/uuid v1.6.0 github.com/gorilla/websocket v1.5.3 github.com/grafana/pyroscope-go v1.2.0 github.com/jaytaylor/html2text v0.0.0-20230321000545-74c2419ad056 @@ -117,7 +119,6 @@ require ( github.com/golang-jwt/jwt v3.2.2+incompatible // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect - github.com/google/uuid v1.6.0 // indirect github.com/grafana/pyroscope-go/godeltaprof v0.1.8 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect diff --git a/go.sum b/go.sum index 6dd87c166..b07749eed 100644 --- a/go.sum +++ b/go.sum @@ -137,6 +137,8 @@ github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqG github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 h1:BAIP2GihuqhwdILrV+7GJel5lyPV3u1+PgzrWLc0TkE= github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46/go.mod h1:QNpY22eby74jVhqH4WhDLDwxc/vqsern6pW+u2kbkpc= +github.com/go-fed/httpsig v1.1.0 h1:9M+hb0jkEICD8/cAiNqEB66R87tTINszBRTjwjQzWcI= +github.com/go-fed/httpsig v1.1.0/go.mod h1:RCMrTZvN1bJYtofsG4rd5NaO5obxQ5xBkdiS7xsT7bM= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= @@ -856,6 +858,8 @@ golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= +golang.org/x/term v0.26.0 h1:WEQa6V3Gja/BhNxg540hBip/kkaYtRg3cxg4oXSw4AU= +golang.org/x/term v0.26.0/go.mod h1:Si5m1o57C5nBNQo5z1iq+XDijt21BDBDp2bK0QI8e3E= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= From e5d85b9982df0885c6164f67f4c52d97fc03cac7 Mon Sep 17 00:00:00 2001 From: polebug Date: Mon, 2 Dec 2024 11:51:57 +0800 Subject: [PATCH 04/31] feat(source): add filtering timestamp for AT data --- .../engine/protocol/atproto/data_source.go | 2 +- internal/engine/protocol/atproto/option.go | 17 ++++++++ provider/atproto/bluesky/client.go | 42 +++++++++++-------- 3 files changed, 43 insertions(+), 18 deletions(-) diff --git a/internal/engine/protocol/atproto/data_source.go b/internal/engine/protocol/atproto/data_source.go index 42474359e..a5786cc1b 100644 --- a/internal/engine/protocol/atproto/data_source.go +++ b/internal/engine/protocol/atproto/data_source.go @@ -175,7 +175,7 @@ func (s *dataSource) buildTasks(_ context.Context, messages []*at.Message) *engi // initialize creates a new Bluesky client and assigns it to the data source. func (s *dataSource) initialize() error { - client, err := bluesky.NewClient(context.Background(), s.filter.Type, s.option.Username, s.option.Password) + client, err := bluesky.NewClient(context.Background(), s.filter.Type, s.option.Username, s.option.Password, s.option.TimestampStart) if err != nil { zap.L().Error("create bluesky client failed", zap.Error(err)) diff --git a/internal/engine/protocol/atproto/option.go b/internal/engine/protocol/atproto/option.go index 8d106b418..7bdb8b1fa 100644 --- a/internal/engine/protocol/atproto/option.go +++ b/internal/engine/protocol/atproto/option.go @@ -2,14 +2,20 @@ package atproto import ( "fmt" + "time" "github.com/rss3-network/node/config" + "github.com/rss3-network/node/config/parameter" + "github.com/rss3-network/protocol-go/schema/network" + "github.com/samber/lo" "go.uber.org/zap" ) type Option struct { Username string `json:"username" mapstructure:"username"` Password string `json:"password" mapstructure:"password"` + + TimestampStart int64 `json:"timestamp_start" mapstructure:"timestamp_start"` } func NewOption(parameters *config.Parameters) (*Option, error) { @@ -25,5 +31,16 @@ func NewOption(parameters *config.Parameters) (*Option, error) { return nil, fmt.Errorf("decode parameters failed: %w", err) } + if lo.IsEmpty(option.TimestampStart) { + if parameter.CurrentNetworkStartBlock[network.Bluesky] == nil { + // Default to 90 days ago + option.TimestampStart = time.Now().Add(-time.Hour * 24 * 90).Unix() + + return &option, nil + } + + option.TimestampStart = parameter.CurrentNetworkStartBlock[network.Bluesky].Timestamp + } + return &option, nil } diff --git a/provider/atproto/bluesky/client.go b/provider/atproto/bluesky/client.go index 676ae7b78..333c76449 100644 --- a/provider/atproto/bluesky/client.go +++ b/provider/atproto/bluesky/client.go @@ -33,14 +33,15 @@ const ( ) type Client struct { - username string - password string - filter []string - mutex sync.RWMutex - defaultClient *XrpcClient - cacheClient map[string]*XrpcClient - encoder *form.Encoder - httpClient *http.Client + username string + password string + filter []string + timestampStart int64 + mutex sync.RWMutex + defaultClient *XrpcClient + cacheClient map[string]*XrpcClient + encoder *form.Encoder + httpClient *http.Client } type XrpcClient struct { @@ -191,7 +192,9 @@ func (c *Client) ParseCARList(ctx context.Context, did syntax.DID, handle string return nil } - recList = append(recList, message) + if message.CreatedAt.Unix() >= c.timestampStart { + recList = append(recList, message) + } return nil }) @@ -225,7 +228,11 @@ func (c *Client) GetRepoRecord(ctx context.Context, repo string, path string) (* return nil, nil } - return message, nil + if message.CreatedAt.Unix() >= c.timestampStart { + return message, nil + } + + return nil, nil } func (c *Client) GetRecord(ctx context.Context, repo string, path string) (*at.Message, cbg.CBORMarshaler, error) { @@ -543,14 +550,15 @@ func (c *Client) LookupDIDEdnpoint(ctx context.Context, did syntax.DID) string { return BskyEndpoint } -func NewClient(_ context.Context, filter []string, username string, password string) (*Client, error) { +func NewClient(_ context.Context, filter []string, username string, password string, timestamp int64) (*Client, error) { client := &Client{ - username: username, - password: password, - filter: filter, - cacheClient: make(map[string]*XrpcClient), - encoder: form.NewEncoder(), - httpClient: http.DefaultClient, + username: username, + password: password, + filter: filter, + timestampStart: timestamp, + cacheClient: make(map[string]*XrpcClient), + encoder: form.NewEncoder(), + httpClient: http.DefaultClient, } defaultXrpcClient, err := client.createAndAuthenticateClient(context.Background(), BskyEndpoint) From 7890523dbb848fe91738f9fd4801d3280ad081c1 Mon Sep 17 00:00:00 2001 From: polebug Date: Mon, 2 Dec 2024 22:12:18 +0800 Subject: [PATCH 05/31] feat(source): add retry logic --- .../engine/protocol/atproto/data_source.go | 31 ++++++-- internal/engine/protocol/atproto/state.go | 4 +- internal/engine/worker/atproto/core/worker.go | 17 ++--- provider/atproto/bluesky/client.go | 72 ++++++++++++------- 4 files changed, 84 insertions(+), 40 deletions(-) diff --git a/internal/engine/protocol/atproto/data_source.go b/internal/engine/protocol/atproto/data_source.go index a5786cc1b..56800afa4 100644 --- a/internal/engine/protocol/atproto/data_source.go +++ b/internal/engine/protocol/atproto/data_source.go @@ -4,7 +4,9 @@ import ( "context" "encoding/json" "fmt" + "time" + "github.com/avast/retry-go/v4" "github.com/bluesky-social/indigo/api/atproto" "github.com/bluesky-social/indigo/events" "github.com/bluesky-social/indigo/events/schedulers/sequential" @@ -48,7 +50,7 @@ func (s *dataSource) Start(ctx context.Context, tasksChan chan<- *engine.Tasks, // Get latest events go func() { - if err := s.pollSubscribeRepos(ctx, tasksChan); err != nil { + if err := s.retrySource(ctx, tasksChan, s.pollSubscribeRepos); err != nil { zap.L().Error("poll subscribe repos failed", zap.Error(err)) errorChan <- fmt.Errorf("poll subscribe repos failed: %w", err) @@ -57,7 +59,7 @@ func (s *dataSource) Start(ctx context.Context, tasksChan chan<- *engine.Tasks, // Get historical repos go func() { - if err := s.pollListRepos(ctx, tasksChan); err != nil { + if err := s.retrySource(ctx, tasksChan, s.pollListRepos); err != nil { zap.L().Error("poll list repos failed", zap.Error(err)) errorChan <- fmt.Errorf("poll list repos failed: %w", err) @@ -69,8 +71,8 @@ func (s *dataSource) Start(ctx context.Context, tasksChan chan<- *engine.Tasks, func (s *dataSource) pollSubscribeRepos(ctx context.Context, tasksChan chan<- *engine.Tasks) error { uri := bluesky.BskySubscribeURI - if s.state.SubscribeCursor != "" { - uri = fmt.Sprintf("%s?cursor=%s", uri, s.state.SubscribeCursor) + if lo.IsEmpty(s.state.SubscribeCursor) { + uri = fmt.Sprintf("%s?cursor=%d", uri, s.state.SubscribeCursor) } conn, _, err := websocket.DefaultDialer.Dial(uri, nil) @@ -110,6 +112,9 @@ func (s *dataSource) pollSubscribeRepos(ctx context.Context, tasksChan chan<- *e if len(messages) > 0 { tasksChan <- s.buildTasks(ctx, messages) + + s.state.SubscribeCursor = evt.Seq + s.state.SubscribeTimestamp = messages[len(messages)-1].CreatedAt.Unix() } return nil @@ -145,9 +150,9 @@ func (s *dataSource) pollListRepos(ctx context.Context, tasksChan chan<- *engine if len(repos) > 0 { tasksChan <- s.buildTasks(ctx, repos) - } - s.state.ListReposCursor = lo.FromPtr(next) + s.state.ListReposCursor = lo.FromPtr(next) + } } } @@ -173,6 +178,20 @@ func (s *dataSource) buildTasks(_ context.Context, messages []*at.Message) *engi return &tasks } +func (s *dataSource) retrySource(ctx context.Context, tasksChan chan<- *engine.Tasks, sourceFunc func(ctx context.Context, tasksChan chan<- *engine.Tasks) error) error { + return retry.Do( + func() error { + return sourceFunc(ctx, tasksChan) + }, + retry.Attempts(0), + retry.Delay(5*time.Second), + retry.DelayType(retry.BackOffDelay), + retry.OnRetry(func(n uint, err error) { + zap.L().Warn("retry bluesky source", zap.Uint("retry", n), zap.Error(err)) + }), + ) +} + // initialize creates a new Bluesky client and assigns it to the data source. func (s *dataSource) initialize() error { client, err := bluesky.NewClient(context.Background(), s.filter.Type, s.option.Username, s.option.Password, s.option.TimestampStart) diff --git a/internal/engine/protocol/atproto/state.go b/internal/engine/protocol/atproto/state.go index 6047bf9a5..f87dcb3ed 100644 --- a/internal/engine/protocol/atproto/state.go +++ b/internal/engine/protocol/atproto/state.go @@ -1,7 +1,7 @@ package atproto type State struct { - SubscribeCursor string `json:"subscribe_cursor,omitempty"` - SubscribeTimestamp uint64 `json:"subscribe_timestamp,omitempty"` + SubscribeCursor int64 `json:"subscribe_cursor,omitempty"` + SubscribeTimestamp int64 `json:"subscribe_timestamp,omitempty"` ListReposCursor string `json:"list_repos_cursor,omitempty"` } diff --git a/internal/engine/worker/atproto/core/worker.go b/internal/engine/worker/atproto/core/worker.go index e81a08ba3..7400bb22d 100644 --- a/internal/engine/worker/atproto/core/worker.go +++ b/internal/engine/worker/atproto/core/worker.go @@ -93,13 +93,13 @@ func (w *worker) Transform(ctx context.Context, task engine.Task) (*activityx.Ac w.transformComment(ctx, atprotoTask.Message, activity) } case feed.RepostTypeValue: - if atprotoTask.Message.RefMessage == nil { - return nil, nil + if atprotoTask.Message.RefMessage != nil { + w.transformRepost(ctx, atprotoTask.Message, activity) } - - w.transformRepost(ctx, atprotoTask.Message, activity) case feed.LikeTypeValue: - w.transformLike(ctx, atprotoTask.Message, activity) + if atprotoTask.Message.RefMessage != nil { + w.transformLike(ctx, atprotoTask.Message, activity) + } case ActorProfile: w.transformProfile(ctx, atprotoTask.Message, activity) default: @@ -186,7 +186,7 @@ func (w *worker) buildPostMetadata(message at.Message) *metadata.SocialPost { return &metadata.SocialPost{ Handle: message.Handle, Body: message.Feed.Text, - Media: w.buildPostMedia(message.Feed.Embed), + Media: w.buildPostMedia(message.Feed), ProfileID: message.Did.String(), PublicationID: message.Rkey, ContentURI: message.URI, @@ -234,11 +234,12 @@ func (w *worker) buildPostAction(from string, to string, typex schema.Type, post } // buildPostMedia will build post media from embeds. -func (w *worker) buildPostMedia(embed *bsky.FeedPost_Embed) []metadata.Media { - if embed == nil { +func (w *worker) buildPostMedia(post *bsky.FeedPost) []metadata.Media { + if post == nil || post.Embed == nil { return nil } + embed := post.Embed media := make([]metadata.Media, 0) if embed.EmbedImages != nil && embed.EmbedImages.Images != nil { diff --git a/provider/atproto/bluesky/client.go b/provider/atproto/bluesky/client.go index 333c76449..7f41aec37 100644 --- a/provider/atproto/bluesky/client.go +++ b/provider/atproto/bluesky/client.go @@ -29,7 +29,7 @@ const ( BskyEndpoint = "https://bsky.social" BskySubscribeURI = "wss://bsky.network/xrpc/com.atproto.sync.subscribeRepos" - SyncListReposLimit = 50 + SyncListReposLimit = 10 ) type Client struct { @@ -162,6 +162,8 @@ func (c *Client) ParseCARList(ctx context.Context, did syntax.DID, handle string // Iterate over all records err = r.ForEach(ctx, "", func(path string, _ cid.Cid) error { + zap.L().Debug("processing record", zap.String("path", path)) + // Parse path to get collection and rkey collection, rkey := c.ParsePath(path) @@ -186,13 +188,14 @@ func (c *Client) ParseCARList(ctx context.Context, did syntax.DID, handle string } // Parse record and update message - if err = c.ParseRecord(ctx, rec, message); err != nil { + isInvalid, err := c.ParseRecord(ctx, rec, message) + if err != nil { zap.L().Error("parse record failed", zap.Error(err)) return nil } - if message.CreatedAt.Unix() >= c.timestampStart { + if isInvalid { recList = append(recList, message) } @@ -221,14 +224,14 @@ func (c *Client) GetRepoRecord(ctx context.Context, repo string, path string) (* return nil, fmt.Errorf("get record: %w", err) } - err = c.ParseRecord(ctx, rec, message) + isInvalid, err := c.ParseRecord(ctx, rec, message) if err != nil { zap.L().Error("parse record failed", zap.Error(err)) return nil, nil } - if message.CreatedAt.Unix() >= c.timestampStart { + if isInvalid { return message, nil } @@ -324,59 +327,80 @@ func (c *Client) GetHandle(ctx context.Context, did syntax.DID) (string, error) // - rec: CBOR marshaled record to parse // - message: Message struct to be updated with record data // Returns error if record parsing fails. -func (c *Client) ParseRecord(ctx context.Context, rec cbg.CBORMarshaler, message *at.Message) error { - var ( - err error - createdAt string - ) +func (c *Client) ParseRecord(ctx context.Context, rec cbg.CBORMarshaler, message *at.Message) (bool, error) { + var err error switch rec := rec.(type) { case *bsky.FeedPost: - message.Feed = rec - createdAt = rec.CreatedAt + createdAt, isInvalid := c.ParseCreatedAt(ctx, rec.CreatedAt) + if !isInvalid { + return false, nil + } if rec.Reply != nil && rec.Reply.Parent != nil { message.RefMessage, err = c.ParseRepoStrongRef(ctx, rec.Reply.Parent) if err != nil { zap.L().Error("parse repo strong ref failed", zap.Error(err)) - return fmt.Errorf("parse repo strong ref: %w", err) + return false, fmt.Errorf("parse repo strong ref: %w", err) } } - case *bsky.ActorProfile: - message.Profile = rec + message.Feed = rec + message.CreatedAt = createdAt + case *bsky.ActorProfile: if rec.CreatedAt != nil { - createdAt = *rec.CreatedAt + createdAt, isInvalid := c.ParseCreatedAt(ctx, lo.FromPtr(rec.CreatedAt)) + if !isInvalid { + return false, nil + } + + message.CreatedAt = createdAt } + + message.Profile = rec case *bsky.FeedRepost: + createdAt, isInvalid := c.ParseCreatedAt(ctx, rec.CreatedAt) + if !isInvalid { + return false, nil + } + message.RefMessage, err = c.ParseRepoStrongRef(ctx, rec.Subject) if err != nil { zap.L().Error("parse repo strong ref failed", zap.Error(err)) - return fmt.Errorf("parse repo strong ref: %w", err) + return false, fmt.Errorf("parse repo strong ref: %w", err) } - createdAt = rec.CreatedAt + message.CreatedAt = createdAt case *bsky.FeedLike: + createdAt, isInvalid := c.ParseCreatedAt(ctx, rec.CreatedAt) + if !isInvalid { + return false, nil + } + message.RefMessage, err = c.ParseRepoStrongRef(ctx, rec.Subject) if err != nil { zap.L().Error("parse repo strong ref failed", zap.Error(err)) - return fmt.Errorf("parse repo strong ref: %w", err) + return false, fmt.Errorf("parse repo strong ref: %w", err) } - createdAt = rec.CreatedAt + message.CreatedAt = createdAt } + return true, nil +} + +func (c *Client) ParseCreatedAt(_ context.Context, createdAt string) (time.Time, bool) { timestamp, err := dateparse.ParseAny(createdAt) if err != nil { - return fmt.Errorf("parse timestamp: %w", err) - } + zap.L().Warn("parse timestamp failed", zap.Error(err)) - message.CreatedAt = timestamp + return time.Time{}, false + } - return nil + return timestamp, timestamp.Unix() >= c.timestampStart } func (c *Client) ParseRepoStrongRef(ctx context.Context, ref *atproto.RepoStrongRef) (*at.Message, error) { From b9f0bd1e730d06a2d7820129960064f68ee5df0b Mon Sep 17 00:00:00 2001 From: polebug Date: Mon, 2 Dec 2024 22:14:05 +0800 Subject: [PATCH 06/31] go mod tidy --- go.mod | 65 ++++++++++++++- go.sum | 253 +++++++++++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 298 insertions(+), 20 deletions(-) diff --git a/go.mod b/go.mod index e1111d87e..8a4008ab4 100644 --- a/go.mod +++ b/go.mod @@ -1,8 +1,8 @@ module github.com/rss3-network/node -go 1.22 +go 1.22.4 -toolchain go1.22.1 +toolchain go1.22.9 require ( github.com/JohannesKaufmann/html-to-markdown v1.6.0 @@ -55,12 +55,15 @@ require ( require ( github.com/adrianbrad/psqldocker v1.2.1 + github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de + github.com/bluesky-social/indigo v0.0.0-20241130171257-9bb22ba9e9cd github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 github.com/emirpasic/gods v1.18.1 github.com/getkin/kin-openapi v0.127.0 github.com/go-fed/httpsig v1.1.0 github.com/go-redsync/redsync/v4 v4.13.0 github.com/google/uuid v1.6.0 + github.com/gorilla/websocket v1.5.3 github.com/grafana/pyroscope-go v1.2.0 github.com/jaytaylor/html2text v0.0.0-20230321000545-74c2419ad056 github.com/mitchellh/mapstructure v1.5.0 @@ -68,10 +71,12 @@ require ( github.com/oapi-codegen/runtime v1.1.1 github.com/redis/rueidis v1.0.50 github.com/redis/rueidis/rueidiscompat v1.0.50 + github.com/reiver/go-bsky v0.0.0-20240906205655-8c7fadb4f3bb github.com/rss3-network/protocol-go v0.5.14 github.com/spf13/afero v1.11.0 github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 github.com/vincent-petithory/dataurl v1.0.0 + github.com/whyrusleeping/cbor-gen v0.2.1-0.20241030202151-b7a6831be65e golang.org/x/net v0.31.0 ) @@ -82,13 +87,21 @@ require ( github.com/Microsoft/go-winio v0.6.2 // indirect github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 // indirect github.com/PuerkitoBio/goquery v1.9.2 // indirect + github.com/RussellLuo/slidingwindow v0.0.0-20200528002341-535bb99d338b // indirect github.com/andybalholm/cascadia v1.3.2 // indirect github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bits-and-blooms/bitset v1.10.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/btcsuite/btcd/chaincfg/chainhash v1.0.2 // indirect + github.com/carlmjohnson/versioninfo v0.22.5 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cockroachdb/errors v1.11.3 // indirect + github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce // indirect + github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect + github.com/cockroachdb/pebble v1.1.2 // indirect + github.com/cockroachdb/redact v1.1.5 // indirect + github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect github.com/consensys/bavard v0.1.13 // indirect github.com/consensys/gnark-crypto v0.12.1 // indirect github.com/containerd/continuity v0.4.3 // indirect @@ -104,6 +117,7 @@ require ( github.com/ethereum/c-kzg-4844 v0.4.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/getsentry/sentry-go v0.27.0 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.3.0 // indirect @@ -118,25 +132,53 @@ require ( github.com/golang-jwt/jwt v3.2.2+incompatible // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect - github.com/gorilla/websocket v1.5.0 // indirect github.com/grafana/pyroscope-go/godeltaprof v0.1.8 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/hashicorp/go-retryablehttp v0.7.5 // indirect + github.com/hashicorp/golang-lru v1.0.2 // indirect + github.com/hashicorp/golang-lru/arc/v2 v2.0.6 // indirect + github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/holiman/uint256 v1.2.4 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/invopop/yaml v0.3.1 // indirect + github.com/ipfs/bbloom v0.0.4 // indirect + github.com/ipfs/go-block-format v0.2.0 // indirect + github.com/ipfs/go-blockservice v0.5.2 // indirect + github.com/ipfs/go-datastore v0.6.0 // indirect + github.com/ipfs/go-ipfs-blockstore v1.3.1 // indirect + github.com/ipfs/go-ipfs-ds-help v1.1.1 // indirect + github.com/ipfs/go-ipfs-exchange-interface v0.2.1 // indirect + github.com/ipfs/go-ipfs-util v0.0.3 // indirect + github.com/ipfs/go-ipld-cbor v0.1.0 // indirect + github.com/ipfs/go-ipld-format v0.6.0 // indirect + github.com/ipfs/go-ipld-legacy v0.2.1 // indirect + github.com/ipfs/go-libipfs v0.7.0 // indirect + github.com/ipfs/go-log v1.0.5 // indirect + github.com/ipfs/go-log/v2 v2.5.1 // indirect + github.com/ipfs/go-merkledag v0.11.0 // indirect + github.com/ipfs/go-metrics-interface v0.0.1 // indirect + github.com/ipfs/go-verifcid v0.0.3 // indirect + github.com/ipld/go-car v0.6.2 // indirect + github.com/ipld/go-car/v2 v2.13.1 // indirect + github.com/ipld/go-codec-dagpb v1.6.0 // indirect + github.com/ipld/go-ipld-prime v0.21.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect github.com/jackc/pgx/v5 v5.7.1 // indirect github.com/jackc/puddle/v2 v2.2.2 // indirect + github.com/jbenet/goprocess v0.1.4 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/compress v1.17.11 // indirect - github.com/klauspost/cpuid/v2 v2.2.5 // indirect + github.com/klauspost/cpuid/v2 v2.2.7 // indirect + github.com/kr/pretty v0.3.1 // indirect + github.com/kr/text v0.2.0 // indirect github.com/labstack/gommon v0.4.2 // indirect github.com/leodido/go-urn v1.4.0 // indirect github.com/magiconair/properties v1.8.7 // indirect @@ -163,16 +205,26 @@ require ( github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0 // indirect github.com/opencontainers/runc v1.1.12 // indirect + github.com/opentracing/opentracing-go v1.2.0 // indirect github.com/ory/dockertest/v3 v3.10.0 // indirect github.com/pelletier/go-toml/v2 v2.2.2 // indirect github.com/perimeterx/marshmallow v1.1.5 // indirect + github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 // indirect github.com/pierrec/lz4/v4 v4.1.21 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/polydawn/refmt v0.89.1-0.20221221234430-40501e09de1f // indirect github.com/prometheus/client_model v0.6.1 // indirect github.com/prometheus/common v0.60.1 // indirect github.com/prometheus/procfs v0.15.1 // indirect + github.com/reiver/go-atproto v0.0.0-20240906195827-a1832b0df821 // indirect + github.com/reiver/go-cast v0.0.0-20240904124821-be0103637c3f // indirect + github.com/reiver/go-erorr v0.0.0-20240801233437-8cbde6d1fa3f // indirect + github.com/reiver/go-fallback v0.0.0-20240906145154-1ce9eadf06a8 // indirect + github.com/reiver/go-maps v0.0.0-20240906190342-93be57f28be1 // indirect + github.com/reiver/go-reg v0.0.0-20240906195701-6e62f43c2835 // indirect github.com/rivo/uniseg v0.2.0 // indirect + github.com/rogpeppe/go-internal v1.13.1 // indirect github.com/sagikazarmark/locafero v0.4.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect github.com/sethvargo/go-retry v0.3.0 // indirect @@ -194,12 +246,16 @@ require ( github.com/valyala/fasttemplate v1.2.2 // indirect github.com/vektah/gqlparser/v2 v2.5.11 // indirect github.com/vmware-labs/yaml-jsonpath v0.3.2 // indirect + github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11 // indirect github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect github.com/xeipuuv/gojsonschema v1.2.0 // indirect github.com/yusufpapurcu/wmi v1.2.3 // indirect + gitlab.com/yawning/secp256k1-voi v0.0.0-20230925100816-f2616030848b // indirect + gitlab.com/yawning/tuplehash v0.0.0-20230713102510-df83abbf9a02 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.50.0 // indirect go.opentelemetry.io/proto/otlp v1.3.1 // indirect + go.uber.org/atomic v1.11.0 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/crypto v0.29.0 // indirect golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect @@ -208,6 +264,7 @@ require ( golang.org/x/text v0.20.0 // indirect golang.org/x/time v0.5.0 // indirect golang.org/x/tools v0.24.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 // indirect google.golang.org/grpc v1.67.1 // indirect diff --git a/go.sum b/go.sum index 1b896bfe1..892099cb7 100644 --- a/go.sum +++ b/go.sum @@ -4,6 +4,7 @@ filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/DataDog/zstd v1.5.0 h1:+K/VEwIAaPcHiMtQvpLD4lqW7f0Gk3xdYZmI1hD+CXo= github.com/DataDog/zstd v1.5.0/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= github.com/JohannesKaufmann/html-to-markdown v1.6.0 h1:04VXMiE50YYfCfLboJCLcgqF5x+rHJnb1ssNmqpLH/k= @@ -17,10 +18,14 @@ github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8 github.com/PuerkitoBio/goquery v1.9.2 h1:4/wZksC3KgkQw7SQgkKotmKljk0M6V8TUvA8Wb4yPeE= github.com/PuerkitoBio/goquery v1.9.2/go.mod h1:GHPCaP0ODyyxqcNoFGYlAprUFH81NuRPd0GX3Zu2Mvk= github.com/RaveNoX/go-jsoncommentstrip v1.0.0/go.mod h1:78ihd09MekBnJnxpICcwzCMzGrKSKYe4AqU6PDYYpjk= +github.com/RussellLuo/slidingwindow v0.0.0-20200528002341-535bb99d338b h1:5/++qT1/z812ZqBvqQt6ToRswSuPZ/B33m6xVHRzADU= +github.com/RussellLuo/slidingwindow v0.0.0-20200528002341-535bb99d338b/go.mod h1:4+EPqMRApwwE/6yo6CxiHoSnBzjRr3jsqer7frxP8y4= github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= github.com/adrianbrad/psqldocker v1.2.1 h1:bvsRmbotpA89ruqGGzzaAZUBtDaIk98gO+JMBNVSZlI= github.com/adrianbrad/psqldocker v1.2.1/go.mod h1:LbCnIy60YO6IRJYrF1r+eafKUgU9UnkSFx0gT8UiaUs= +github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5 h1:iW0a5ljuFxkLGPNem5Ui+KBjFJzKg4Fv2fnxe4dvzpM= +github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5/go.mod h1:Y2QMoi1vgtOIfc+6DhrMOGkLoGzqSV2rKp4Sm+opsyA= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= github.com/andybalholm/cascadia v1.2.0/go.mod h1:YCyR8vOZT9aZ1CHEd8ap0gMVm2aFgxBp0T0eFw1RUQY= @@ -28,18 +33,26 @@ github.com/andybalholm/cascadia v1.3.2 h1:3Xi6Dw5lHF15JtdcmAHD3i1+T8plmv7BQ/nsVi github.com/andybalholm/cascadia v1.3.2/go.mod h1:7gtRlve5FxPPgIgX36uWBX58OdBsSS6lUvCFb+h7KvU= github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ= github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk= +github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de h1:FxWPpzIjnTlhPwqqXc4/vE0f7GvRjuAsbW+HOIe8KnA= +github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de/go.mod h1:DCaWoUhZrYW9p1lxo/cm8EmUOOzAPSEZNGF2DK1dJgw= github.com/avast/retry-go/v4 v4.6.0 h1:K9xNA+KeB8HHc2aWFuLb25Offp+0iVRXEvFx8IinRJA= github.com/avast/retry-go/v4 v4.6.0/go.mod h1:gvWlPhBVsvBbLkVGDg/KwvBv0bEkCOLRRSHKIr2PyOE= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= +github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88= github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/bluesky-social/indigo v0.0.0-20241130171257-9bb22ba9e9cd h1:bYgkgDimpUaJEPYulPC/U08nS627JwKD373/aSIFtmI= +github.com/bluesky-social/indigo v0.0.0-20241130171257-9bb22ba9e9cd/go.mod h1:js1fRbLG7qefpSROXq3pyQxf3t72qY8s2amStisJD8U= github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.2 h1:KdUfX2zKommPRa+PD0sWZUyXe9w277ABlgELO7H04IM= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.2/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/carlmjohnson/versioninfo v0.22.5 h1:O00sjOLUAFxYQjlN/bzYTuZiS0y6fWDQjMRvwtKgwwc= +github.com/carlmjohnson/versioninfo v0.22.5/go.mod h1:QT9mph3wcVfISUKd0i9sZfVrPviHuSF+cUtLjm2WSf8= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= @@ -49,16 +62,18 @@ github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/cockroachdb/errors v1.8.1 h1:A5+txlVZfOqFBDa4mGz2bUWSp0aHElvHX2bKkdbQu+Y= -github.com/cockroachdb/errors v1.8.1/go.mod h1:qGwQn6JmZ+oMjuLwjWzUNqblqk0xl4CVV3SQbGwK7Ac= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f h1:o/kfcElHqOiXqcou5a3rIlMc7oJbMQkeLk0VQJ7zgqY= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= -github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 h1:aPEJyR4rPBvDmeyi+l/FS/VtA00IWvjeFvjen1m1l1A= -github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593/go.mod h1:6hk1eMY/u5t+Cf18q5lFMUA1Rc+Sm5I6Ra1QuPyxXCo= -github.com/cockroachdb/redact v1.0.8 h1:8QG/764wK+vmEYoOlfobpe12EQcS81ukx/a4hdVMxNw= -github.com/cockroachdb/redact v1.0.8/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= -github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2 h1:IKgmqgMQlVJIZj19CdocBeSfSaiCbEBZGKODaixqtHM= -github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2/go.mod h1:8BT+cPK6xvFOcRlk0R8eg+OTkcqI6baNH4xAkpiYVvQ= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/errors v1.11.3 h1:5bA+k2Y6r+oz/6Z/RFlNeVCesGARKuC6YymtcDrbC/I= +github.com/cockroachdb/errors v1.11.3/go.mod h1:m4UIW4CDjx+R5cybPsNrRbreomiFqt8o1h1wUVazSd8= +github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce h1:giXvy4KSc/6g/esnpM7Geqxka4WSqI1SZc7sMJFd3y4= +github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce/go.mod h1:9/y3cnZ5GKakj/H4y9r9GTjCvAFta7KLgSHPJJYc52M= +github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= +github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= +github.com/cockroachdb/pebble v1.1.2 h1:CUh2IPtR4swHlEj48Rhfzw6l/d0qA31fItcIszQVIsA= +github.com/cockroachdb/pebble v1.1.2/go.mod h1:4exszw1r40423ZsmkG/09AFEG83I0uDgfujJdbL6kYU= +github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= +github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= @@ -69,16 +84,20 @@ github.com/containerd/continuity v0.4.3 h1:6HVkalIp+2u1ZLH1J/pYX2oBVXlJZvh1X1A7b github.com/containerd/continuity v0.4.3/go.mod h1:F6PTNCKepoxEaXLQp3wDAjygEnImnZ/7o4JzpodfroQ= github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.4 h1:wfIWP927BUkWJb2NmU/kNDYIBTh/ziUX91+lVfRxZq4= github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 h1:d28BXYi+wUpz1KBmiF9bWrjEMacUEREV6MBi2ODnrfQ= github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/creasty/defaults v1.8.0 h1:z27FJxCAa0JKt3utc0sCImAEb+spPucmKoOdLHvHYKk= github.com/creasty/defaults v1.8.0/go.mod h1:iGzKe6pbEHnpMPtfDXZEr0NVxWnPTjb1bbDy08fPzYM= +github.com/cskr/pubsub v1.0.2 h1:vlOzMhl6PFn60gRlTQQsIfVwaPB/B/8MziK8FhEPt/0= +github.com/cskr/pubsub v1.0.2/go.mod h1:/8MzYXk/NJAz782G8RPkFzXTZVu63VotefPnR9TIRis= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= @@ -112,6 +131,8 @@ github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/ethereum/go-ethereum v1.13.15 h1:U7sSGYGo4SPjP6iNIifNoyIAiNjrmQkz6EwQG+/EZWo= github.com/ethereum/go-ethereum v1.13.15/go.mod h1:TN8ZiHrdJwSe8Cb6x+p0hs5CxhJZPbqB7hHkaUXcmIU= +github.com/fatih/color v1.14.1 h1:qfhVLaG5s+nCROl1zJsZRxFeYrHLqWroPOQ8BWiNb4w= +github.com/fatih/color v1.14.1/go.mod h1:2oHN61fhTpgcxD3TSWCgKDiH1+x4OiDVVGH8WlgGZGg= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fjl/memsize v0.0.2 h1:27txuSD9or+NZlnOWdKUxeBzTAUkWCVh+4Gf2dWFOzA= @@ -131,6 +152,10 @@ github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 h1:BAIP2Gihuqh github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46/go.mod h1:QNpY22eby74jVhqH4WhDLDwxc/vqsern6pW+u2kbkpc= github.com/getkin/kin-openapi v0.127.0 h1:Mghqi3Dhryf3F8vR370nN67pAERW+3a95vomb3MAREY= github.com/getkin/kin-openapi v0.127.0/go.mod h1:OZrfXzUfGrNbsKj+xmFBx6E5c6yH3At/tAKSc2UszXM= +github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps= +github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= +github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= +github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-fed/httpsig v1.1.0 h1:9M+hb0jkEICD8/cAiNqEB66R87tTINszBRTjwjQzWcI= github.com/go-fed/httpsig v1.1.0/go.mod h1:RCMrTZvN1bJYtofsG4rd5NaO5obxQ5xBkdiS7xsT7bM= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= @@ -176,6 +201,7 @@ github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1v github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/go-test/deep v1.0.8 h1:TDsG77qcSprGbC6vTN8OuXp5g+J+b5Pcguhf7Zt61VM= github.com/go-test/deep v1.0.8/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= +github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= @@ -211,16 +237,21 @@ github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= +github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k= github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grafana/pyroscope-go v1.2.0 h1:aILLKjTj8CS8f/24OPMGPewQSYlhmdQMBmol1d3KGj8= github.com/grafana/pyroscope-go v1.2.0/go.mod h1:2GHr28Nr05bg2pElS+dDsc98f3JTUh2f6Fz1hWXrqwk= github.com/grafana/pyroscope-go/godeltaprof v0.1.8 h1:iwOtYXeeVSAeYefJNaxDytgjKtUuKQbJqgAIjlnicKg= @@ -234,9 +265,19 @@ github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE= github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= +github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= +github.com/hashicorp/go-hclog v1.5.0 h1:bI2ocEMgcVlz55Oj1xZNBsVi900c7II+fWDyV9o+13c= +github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= +github.com/hashicorp/go-retryablehttp v0.7.5 h1:bJj+Pj19UZMIweq/iie+1u5YCdGrnxCT9yvm0e+Nd5M= +github.com/hashicorp/go-retryablehttp v0.7.5/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8= +github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= +github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru/arc/v2 v2.0.6 h1:4NU7uP5vSoK6TbaMj3NtY478TTAWLso/vL1gpNrInHg= +github.com/hashicorp/golang-lru/arc/v2 v2.0.6/go.mod h1:cfdDIX05DWvYV6/shsxDfa/OVcRieOt+q4FnM8x+Xno= github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= @@ -255,8 +296,79 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2 github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/invopop/yaml v0.3.1 h1:f0+ZpmhfBSS4MhG+4HYseMdJhoeeopbSKbq5Rpeelso= github.com/invopop/yaml v0.3.1/go.mod h1:PMOp3nn4/12yEZUFfmOuNHJsZToEEOwoWsT+D81KkeA= +github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs= +github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0= +github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA= +github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU= +github.com/ipfs/go-bitswap v0.11.0 h1:j1WVvhDX1yhG32NTC9xfxnqycqYIlhzEzLXG/cU1HyQ= +github.com/ipfs/go-bitswap v0.11.0/go.mod h1:05aE8H3XOU+LXpTedeAS0OZpcO1WFsj5niYQH9a1Tmk= +github.com/ipfs/go-block-format v0.2.0 h1:ZqrkxBA2ICbDRbK8KJs/u0O3dlp6gmAuuXUJNiW1Ycs= +github.com/ipfs/go-block-format v0.2.0/go.mod h1:+jpL11nFx5A/SPpsoBn6Bzkra/zaArfSmsknbPMYgzM= +github.com/ipfs/go-blockservice v0.5.2 h1:in9Bc+QcXwd1apOVM7Un9t8tixPKdaHQFdLSUM1Xgk8= +github.com/ipfs/go-blockservice v0.5.2/go.mod h1:VpMblFEqG67A/H2sHKAemeH9vlURVavlysbdUI632yk= +github.com/ipfs/go-bs-sqlite3 v0.0.0-20221122195556-bfcee1be620d h1:9V+GGXCuOfDiFpdAHz58q9mKLg447xp0cQKvqQrAwYE= +github.com/ipfs/go-bs-sqlite3 v0.0.0-20221122195556-bfcee1be620d/go.mod h1:pMbnFyNAGjryYCLCe59YDLRv/ujdN+zGJBT1umlvYRM= github.com/ipfs/go-cid v0.4.1 h1:A/T3qGvxi4kpKWWcPC/PgbvDA2bjVLO7n4UeVwnbs/s= github.com/ipfs/go-cid v0.4.1/go.mod h1:uQHwDeX4c6CtyrFwdqyhpNcxVewur1M7l7fNU7LKwZk= +github.com/ipfs/go-datastore v0.6.0 h1:JKyz+Gvz1QEZw0LsX1IBn+JFCJQH4SJVFtM4uWU0Myk= +github.com/ipfs/go-datastore v0.6.0/go.mod h1:rt5M3nNbSO/8q1t4LNkLyUwRs8HupMeN/8O4Vn9YAT8= +github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= +github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= +github.com/ipfs/go-ds-flatfs v0.5.1 h1:ZCIO/kQOS/PSh3vcF1H6a8fkRGS7pOfwfPdx4n/KJH4= +github.com/ipfs/go-ds-flatfs v0.5.1/go.mod h1:RWTV7oZD/yZYBKdbVIFXTX2fdY2Tbvl94NsWqmoyAX4= +github.com/ipfs/go-ipfs-blockstore v1.3.1 h1:cEI9ci7V0sRNivqaOr0elDsamxXFxJMMMy7PTTDQNsQ= +github.com/ipfs/go-ipfs-blockstore v1.3.1/go.mod h1:KgtZyc9fq+P2xJUiCAzbRdhhqJHvsw8u2Dlqy2MyRTE= +github.com/ipfs/go-ipfs-blocksutil v0.0.1 h1:Eh/H4pc1hsvhzsQoMEP3Bke/aW5P5rVM1IWFJMcGIPQ= +github.com/ipfs/go-ipfs-blocksutil v0.0.1/go.mod h1:Yq4M86uIOmxmGPUHv/uI7uKqZNtLb449gwKqXjIsnRk= +github.com/ipfs/go-ipfs-chunker v0.0.5 h1:ojCf7HV/m+uS2vhUGWcogIIxiO5ubl5O57Q7NapWLY8= +github.com/ipfs/go-ipfs-chunker v0.0.5/go.mod h1:jhgdF8vxRHycr00k13FM8Y0E+6BoalYeobXmUyTreP8= +github.com/ipfs/go-ipfs-delay v0.0.1 h1:r/UXYyRcddO6thwOnhiznIAiSvxMECGgtv35Xs1IeRQ= +github.com/ipfs/go-ipfs-delay v0.0.1/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= +github.com/ipfs/go-ipfs-ds-help v1.1.1 h1:B5UJOH52IbcfS56+Ul+sv8jnIV10lbjLF5eOO0C66Nw= +github.com/ipfs/go-ipfs-ds-help v1.1.1/go.mod h1:75vrVCkSdSFidJscs8n4W+77AtTpCIAdDGAwjitJMIo= +github.com/ipfs/go-ipfs-exchange-interface v0.2.1 h1:jMzo2VhLKSHbVe+mHNzYgs95n0+t0Q69GQ5WhRDZV/s= +github.com/ipfs/go-ipfs-exchange-interface v0.2.1/go.mod h1:MUsYn6rKbG6CTtsDp+lKJPmVt3ZrCViNyH3rfPGsZ2E= +github.com/ipfs/go-ipfs-exchange-offline v0.3.0 h1:c/Dg8GDPzixGd0MC8Jh6mjOwU57uYokgWRFidfvEkuA= +github.com/ipfs/go-ipfs-exchange-offline v0.3.0/go.mod h1:MOdJ9DChbb5u37M1IcbrRB02e++Z7521fMxqCNRrz9s= +github.com/ipfs/go-ipfs-pq v0.0.3 h1:YpoHVJB+jzK15mr/xsWC574tyDLkezVrDNeaalQBsTE= +github.com/ipfs/go-ipfs-pq v0.0.3/go.mod h1:btNw5hsHBpRcSSgZtiNm/SLj5gYIZ18AKtv3kERkRb4= +github.com/ipfs/go-ipfs-routing v0.3.0 h1:9W/W3N+g+y4ZDeffSgqhgo7BsBSJwPMcyssET9OWevc= +github.com/ipfs/go-ipfs-routing v0.3.0/go.mod h1:dKqtTFIql7e1zYsEuWLyuOU+E0WJWW8JjbTPLParDWo= +github.com/ipfs/go-ipfs-util v0.0.3 h1:2RFdGez6bu2ZlZdI+rWfIdbQb1KudQp3VGwPtdNCmE0= +github.com/ipfs/go-ipfs-util v0.0.3/go.mod h1:LHzG1a0Ig4G+iZ26UUOMjHd+lfM84LZCrn17xAKWBvs= +github.com/ipfs/go-ipld-cbor v0.1.0 h1:dx0nS0kILVivGhfWuB6dUpMa/LAwElHPw1yOGYopoYs= +github.com/ipfs/go-ipld-cbor v0.1.0/go.mod h1:U2aYlmVrJr2wsUBU67K4KgepApSZddGRDWBYR0H4sCk= +github.com/ipfs/go-ipld-format v0.6.0 h1:VEJlA2kQ3LqFSIm5Vu6eIlSxD/Ze90xtc4Meten1F5U= +github.com/ipfs/go-ipld-format v0.6.0/go.mod h1:g4QVMTn3marU3qXchwjpKPKgJv+zF+OlaKMyhJ4LHPg= +github.com/ipfs/go-ipld-legacy v0.2.1 h1:mDFtrBpmU7b//LzLSypVrXsD8QxkEWxu5qVxN99/+tk= +github.com/ipfs/go-ipld-legacy v0.2.1/go.mod h1:782MOUghNzMO2DER0FlBR94mllfdCJCkTtDtPM51otM= +github.com/ipfs/go-libipfs v0.7.0 h1:Mi54WJTODaOL2/ZSm5loi3SwI3jI2OuFWUrQIkJ5cpM= +github.com/ipfs/go-libipfs v0.7.0/go.mod h1:KsIf/03CqhICzyRGyGo68tooiBE2iFbI/rXW7FhAYr0= +github.com/ipfs/go-log v1.0.5 h1:2dOuUCB1Z7uoczMWgAyDck5JLb72zHzrMnGnCNNbvY8= +github.com/ipfs/go-log v1.0.5/go.mod h1:j0b8ZoR+7+R99LD9jZ6+AJsrzkPbSXbZfGakb5JPtIo= +github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Axpmri6g= +github.com/ipfs/go-log/v2 v2.5.1 h1:1XdUzF7048prq4aBjDQQ4SL5RxftpRGdXhNRwKSAlcY= +github.com/ipfs/go-log/v2 v2.5.1/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI= +github.com/ipfs/go-merkledag v0.11.0 h1:DgzwK5hprESOzS4O1t/wi6JDpyVQdvm9Bs59N/jqfBY= +github.com/ipfs/go-merkledag v0.11.0/go.mod h1:Q4f/1ezvBiJV0YCIXvt51W/9/kqJGH4I1LsA7+djsM4= +github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fGD6n0jO4kdg= +github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY= +github.com/ipfs/go-peertaskqueue v0.8.1 h1:YhxAs1+wxb5jk7RvS0LHdyiILpNmRIRnZVztekOF0pg= +github.com/ipfs/go-peertaskqueue v0.8.1/go.mod h1:Oxxd3eaK279FxeydSPPVGHzbwVeHjatZ2GA8XD+KbPU= +github.com/ipfs/go-unixfsnode v1.8.0 h1:yCkakzuE365glu+YkgzZt6p38CSVEBPgngL9ZkfnyQU= +github.com/ipfs/go-unixfsnode v1.8.0/go.mod h1:HxRu9HYHOjK6HUqFBAi++7DVoWAHn0o4v/nZ/VA+0g8= +github.com/ipfs/go-verifcid v0.0.3 h1:gmRKccqhWDocCRkC+a59g5QW7uJw5bpX9HWBevXa0zs= +github.com/ipfs/go-verifcid v0.0.3/go.mod h1:gcCtGniVzelKrbk9ooUSX/pM3xlH73fZZJDzQJRvOUw= +github.com/ipld/go-car v0.6.2 h1:Hlnl3Awgnq8icK+ze3iRghk805lu8YNq3wlREDTF2qc= +github.com/ipld/go-car v0.6.2/go.mod h1:oEGXdwp6bmxJCZ+rARSkDliTeYnVzv3++eXajZ+Bmr8= +github.com/ipld/go-car/v2 v2.13.1 h1:KnlrKvEPEzr5IZHKTXLAEub+tPrzeAFQVRlSQvuxBO4= +github.com/ipld/go-car/v2 v2.13.1/go.mod h1:QkdjjFNGit2GIkpQ953KBwowuoukoM75nP/JI1iDJdo= +github.com/ipld/go-codec-dagpb v1.6.0 h1:9nYazfyu9B1p3NAgfVdpRco3Fs2nFC72DqVsMj6rOcc= +github.com/ipld/go-codec-dagpb v1.6.0/go.mod h1:ANzFhfP2uMJxRBr8CE+WQWs5UsNa0pYtmKZ+agnUw9s= +github.com/ipld/go-ipld-prime v0.21.0 h1:n4JmcpOlPDIxBcY037SVfpd1G+Sj1nKZah0m6QH9C2E= +github.com/ipld/go-ipld-prime v0.21.0/go.mod h1:3RLqy//ERg/y5oShXXdx5YIp50cFGOanyMctpPjsvxQ= +github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20230102063945-1a409dc236dd h1:gMlw/MhNr2Wtp5RwGdsW23cs+yCuj9k2ON7i9MiJlRo= +github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20230102063945-1a409dc236dd/go.mod h1:wZ8hH8UxeryOs4kJEJaiui/s00hDSbE37OKsL47g+Sw= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= @@ -269,6 +381,9 @@ github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7Bd github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jaytaylor/html2text v0.0.0-20230321000545-74c2419ad056 h1:iCHtR9CQyktQ5+f3dMVZfwD2KWJUgm7M0gdL9NGr8KA= github.com/jaytaylor/html2text v0.0.0-20230321000545-74c2419ad056/go.mod h1:CVKlgaMiht+LXvHG173ujK6JUhZXKb2u/BQtjPDIvyk= +github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= +github.com/jbenet/goprocess v0.1.4 h1:DRGOFReOMqqDNXwW70QkacFW0YN9QnwLV0Vqk+3oU0o= +github.com/jbenet/goprocess v0.1.4/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= @@ -278,13 +393,17 @@ github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8Hm github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d/go.mod h1:2PavIy+JPciBPrBUjwbNvtwB6RQlve+hkpll6QSNmOE= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= -github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg= -github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= +github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/koron/go-ssdp v0.0.3 h1:JivLMY45N76b4p/vsWGOKewBQu6uf39y8l+AQ7sDKx8= +github.com/koron/go-ssdp v0.0.3/go.mod h1:b2MxI6yh02pKrsyNoQUsk4+YNikaGhe4894J+Q5lDvA= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= @@ -304,6 +423,24 @@ github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= +github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= +github.com/libp2p/go-cidranger v1.1.0 h1:ewPN8EZ0dd1LSnrtuwd4709PXVcITVeuwbag38yPW7c= +github.com/libp2p/go-cidranger v1.1.0/go.mod h1:KWZTfSr+r9qEo9OkI9/SIEeAtw+NNoU0dXIXt15Okic= +github.com/libp2p/go-libp2p v0.25.1 h1:YK+YDCHpYyTvitKWVxa5PfElgIpOONU01X5UcLEwJGA= +github.com/libp2p/go-libp2p v0.25.1/go.mod h1:xnK9/1d9+jeQCVvi/f1g12KqtVi/jP/SijtKV1hML3g= +github.com/libp2p/go-libp2p-asn-util v0.2.0 h1:rg3+Os8jbnO5DxkC7K/Utdi+DkY3q/d1/1q+8WeNAsw= +github.com/libp2p/go-libp2p-asn-util v0.2.0/go.mod h1:WoaWxbHKBymSN41hWSq/lGKJEca7TNm58+gGJi2WsLI= +github.com/libp2p/go-libp2p-record v0.2.0 h1:oiNUOCWno2BFuxt3my4i1frNrt7PerzB3queqa1NkQ0= +github.com/libp2p/go-libp2p-record v0.2.0/go.mod h1:I+3zMkvvg5m2OcSdoL0KPljyJyvNDFGKX7QdlpYUcwk= +github.com/libp2p/go-libp2p-testing v0.12.0 h1:EPvBb4kKMWO29qP4mZGyhVzUyR25dvfUIK5WDu6iPUA= +github.com/libp2p/go-libp2p-testing v0.12.0/go.mod h1:KcGDRXyN7sQCllucn1cOOS+Dmm7ujhfEyXQL5lvkcPg= +github.com/libp2p/go-msgio v0.3.0 h1:mf3Z8B1xcFN314sWX+2vOTShIE0Mmn2TXn3YCUQGNj0= +github.com/libp2p/go-msgio v0.3.0/go.mod h1:nyRM819GmVaF9LX3l03RMh10QdOroF++NBbxAb0mmDM= +github.com/libp2p/go-nat v0.1.0 h1:MfVsH6DLcpa04Xr+p8hmVRG4juse0s3J8HyNWYHffXg= +github.com/libp2p/go-nat v0.1.0/go.mod h1:X7teVkwRHNInVNWQiO/tAiAVRwSr5zoRz4YSTC3uRBM= +github.com/libp2p/go-netroute v0.2.1 h1:V8kVrpD8GK0Riv15/7VN6RbUQ3URNZVosw7H2v9tksU= +github.com/libp2p/go-netroute v0.2.1/go.mod h1:hraioZr0fhBjG0ZRXJJ6Zj2IVEVNx6tDTFQfSmcq7mQ= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= @@ -312,14 +449,20 @@ github.com/matryer/is v1.4.1 h1:55ehd8zaGABKLXQUe2awZ99BD/PTc2ls+KV/dXphgEQ= github.com/matryer/is v1.4.1/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= 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.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= 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-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +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/mfridman/interpolate v0.0.2 h1:pnuTK7MQIxxFz1Gr+rjSIx9u7qVjf5VOoM/u6BbAxPY= github.com/mfridman/interpolate v0.0.2/go.mod h1:p+7uk6oE07mpE/Ik1b8EckO0O4ZXiGAfshKBWLUM9Xg= +github.com/miekg/dns v1.1.50 h1:DQUfb9uc6smULcREF09Uc+/Gd46YWqJd5DbpPE9xkcA= +github.com/miekg/dns v1.1.50/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME= github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM= github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= @@ -348,12 +491,20 @@ github.com/multiformats/go-base32 v0.1.0 h1:pVx9xoSPqEIQG8o+UbAe7DNi51oej1NtK+aG github.com/multiformats/go-base32 v0.1.0/go.mod h1:Kj3tFY6zNr+ABYMqeUNeGvkIC/UYgtWibDcT0rExnbI= github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9rQyccr0= github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4= +github.com/multiformats/go-multiaddr v0.8.0 h1:aqjksEcqK+iD/Foe1RRFsGZh8+XFiGo7FgUCZlpv3LU= +github.com/multiformats/go-multiaddr v0.8.0/go.mod h1:Fs50eBDWvZu+l3/9S6xAE7ZYj6yhxlvaVZjakWN7xRs= +github.com/multiformats/go-multiaddr-dns v0.3.1 h1:QgQgR+LQVt3NPTjbrLLpsaT2ufAA2y0Mkk+QRVJbW3A= +github.com/multiformats/go-multiaddr-dns v0.3.1/go.mod h1:G/245BRQ6FJGmryJCrOuTdB37AMA5AMOVuO6NY3JwTk= +github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E= +github.com/multiformats/go-multiaddr-fmt v0.1.0/go.mod h1:hGtDIW4PU4BqJ50gW2quDuPVjyWNZxToGUh/HwTZYJo= github.com/multiformats/go-multibase v0.2.0 h1:isdYCVLvksgWlMW9OZRYJEa9pZETFivncJHmHnnd87g= github.com/multiformats/go-multibase v0.2.0/go.mod h1:bFBZX4lKCA/2lyOFSAoKH5SS6oPyjtnzK/XTFDPkNuk= github.com/multiformats/go-multicodec v0.9.0 h1:pb/dlPnzee/Sxv/j4PmkDRxCOi3hXTz3IbPKOXWJkmg= github.com/multiformats/go-multicodec v0.9.0/go.mod h1:L3QTQvMIaVBkXOXXtVmYE+LI16i14xuaojr/H7Ai54k= github.com/multiformats/go-multihash v0.2.3 h1:7Lyc8XfX/IY2jWb/gI7JP+o7JEq9hOa7BFvVU9RSh+U= github.com/multiformats/go-multihash v0.2.3/go.mod h1:dXgKXCXjBzdscBLk9JkjINiEsCKRVch90MdaGiKsvSM= +github.com/multiformats/go-multistream v0.4.1 h1:rFy0Iiyn3YT0asivDUIR05leAdwZq3de4741sbiSdfo= +github.com/multiformats/go-multistream v0.4.1/go.mod h1:Mz5eykRVAjJWckE2U78c6xqdtyNUEhKSM0Lwar2p77Q= github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/nEGOHFS8= github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= @@ -393,6 +544,8 @@ github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQ github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= github.com/opencontainers/runc v1.1.12 h1:BOIssBaW1La0/qbNZHXOOa71dZfZEQOzW7dqQf3phss= github.com/opencontainers/runc v1.1.12/go.mod h1:S+lQwSfncpBha7XTy/5lBwWgm5+y5Ma/O44Ekby9FK8= +github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= +github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= github.com/orlangure/gnomock v0.31.0 h1:dgjlQ8DYUPMyNwMZJuYBH+/GF+e7h3sloldPzIJF4k4= github.com/orlangure/gnomock v0.31.0/go.mod h1:RagxeYv3bKi+li9Lio2Faw5t6Mcy4akkeqXzkgAS3w0= github.com/ory/dockertest/v3 v3.10.0 h1:4K3z2VMe8Woe++invjaTB7VRyQXQy5UY+loujO4aNE4= @@ -401,14 +554,21 @@ github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6 github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= github.com/perimeterx/marshmallow v1.1.5 h1:a2LALqQ1BlHM8PZblsDdidgv1mWi1DgC2UmX50IvK2s= github.com/perimeterx/marshmallow v1.1.5/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0Vchtcl8we9tYaXw= +github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 h1:1/WtZae0yGtPq+TI6+Tv1WTxkukpXeMlviSxvL7SRgk= +github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9/go.mod h1:x3N5drFsm2uilKKuuYo6LdyD8vZAW55sH/9w+pbo1sw= github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= +github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/polydawn/refmt v0.89.1-0.20221221234430-40501e09de1f h1:VXTQfuJj9vKR4TCkEuWIckKvdHFeJH/huIFJ9/cXOB0= +github.com/polydawn/refmt v0.89.1-0.20221221234430-40501e09de1f/go.mod h1:/zvteZs/GwLtCgZ4BL6CBsk9IKIlexP43ObX9AxTqTw= github.com/pressly/goose/v3 v3.23.0 h1:57hqKos8izGek4v6D5+OXBa+Y4Rq8MU//+MmnevdpVA= github.com/pressly/goose/v3 v3.23.0/go.mod h1:rpx+D9GX/+stXmzKa+uh1DkjPnNVMdiOCV9iLdle4N8= github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y= @@ -427,12 +587,29 @@ github.com/redis/rueidis/mock v1.0.49 h1:MfVL45QLAOH+YnxuqxMIOYsfn+/GLyF4XpWwtBh github.com/redis/rueidis/mock v1.0.49/go.mod h1:qVb3NaVgfqh1tMJw3+jmuqCUaMU0wu6NPS72TnuFWTE= github.com/redis/rueidis/rueidiscompat v1.0.50 h1:TGC9qokruP3rglg3NA8vXNdAPjgyQD0CIjL2k4rDLXo= github.com/redis/rueidis/rueidiscompat v1.0.50/go.mod h1:Wepg5l4B2fjGxEiPEg9uzLea+G6D9EGjDSB4/x7VXbw= +github.com/reiver/go-atproto v0.0.0-20240906195827-a1832b0df821 h1:s2ColkXw5LNaS8/eHB7O46NQYyv+DOghr25u3ukEa5g= +github.com/reiver/go-atproto v0.0.0-20240906195827-a1832b0df821/go.mod h1:S/pf34se76GMYmdBXumZLenxGYgunVNLJkW6OQEXt9w= +github.com/reiver/go-bsky v0.0.0-20240906205655-8c7fadb4f3bb h1:ZgOhXYuF5y3Hzhm9I5vc+LNd0um1Lz4v9fn64mt9PJA= +github.com/reiver/go-bsky v0.0.0-20240906205655-8c7fadb4f3bb/go.mod h1:KEO2yVqtN2ZQQ7AgncGVyKZpa9jXEmNOuYXzbz564f0= +github.com/reiver/go-cast v0.0.0-20240904124821-be0103637c3f h1:+xhln673LL2XG1qhsUG1e+HHdXm/lTWihmr5G815dMc= +github.com/reiver/go-cast v0.0.0-20240904124821-be0103637c3f/go.mod h1:baMIic1VWx4m5MRviwSyHFx1Z6POGMRrnVgsMvsLlAA= +github.com/reiver/go-erorr v0.0.0-20240801233437-8cbde6d1fa3f h1:D1QSxKHm8U73XhjsW3SFLkT0zT5pKJi+1KGboMhY1Rk= +github.com/reiver/go-erorr v0.0.0-20240801233437-8cbde6d1fa3f/go.mod h1:F0HbBf+Ak2ZlE8YkDW4Y+KxaUmT0KaaIJK6CXY3cJxE= +github.com/reiver/go-fallback v0.0.0-20240906145154-1ce9eadf06a8 h1:JKZHV9WPzSfaPhJswlyQk45hmxbPwKmBximAyysPKbs= +github.com/reiver/go-fallback v0.0.0-20240906145154-1ce9eadf06a8/go.mod h1:IAg7rGvnbzlTrK4W+pBJcq2XEhrWf+DxYl/fGN/qbj4= +github.com/reiver/go-maps v0.0.0-20240906190342-93be57f28be1 h1:5fRVUeCqPN8G8phNmd1G0Pu7g35sojAQBnIvZ8C+s8c= +github.com/reiver/go-maps v0.0.0-20240906190342-93be57f28be1/go.mod h1:dMbnpn0BuIGwSFlCUSTYPDP3nDt2pSe6qP5vfbV1kBE= +github.com/reiver/go-reg v0.0.0-20240906195701-6e62f43c2835 h1:i2IO8hx0TbgPeZ5Gcu+Prkzkm6T+cBxd1lnALdCoM/c= +github.com/reiver/go-reg v0.0.0-20240906195701-6e62f43c2835/go.mod h1:P4MhBoVQLOdhisU6M3f2DvbbNBueHw3Y+n4V/Q7xX9Q= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= @@ -440,6 +617,7 @@ github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rss3-network/protocol-go v0.5.14 h1:gd6ciwXb5e4xx1dmAOAIKWbpami2QbARqE61zbwT6KE= github.com/rss3-network/protocol-go v0.5.14/go.mod h1:npcyduWt86uVbIi77xQaYk8eqltI9XNjk1FMGpjyIq0= github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= @@ -448,6 +626,7 @@ github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6g github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= github.com/samber/lo v1.47.0 h1:z7RynLwP5nbyRscyvcD043DWYoOcYRv3mV8lBeqOCLc= github.com/samber/lo v1.47.0/go.mod h1:RmDH9Ct32Qy3gduHQuKJ3gW1fMHAnE/fAzQuf6He5cU= +github.com/scylladb/termtables v0.0.0-20191203121021-c4c0b6d42ff4/go.mod h1:C1a7PQSMz9NShzorzCiG2fk9+xuCgLkPeCvMHYR2OWg= github.com/sebdah/goldie/v2 v2.5.3 h1:9ES/mNN+HNUbNWpVAlrzuZ7jE+Nrczbj8uFRjM7624Y= github.com/sebdah/goldie/v2 v2.5.3/go.mod h1:oZ9fp0+se1eapSRjfYbsV/0Hqhbuu3bJVvKI/NNtssI= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= @@ -460,8 +639,13 @@ github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKl github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k= github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/smartystreets/assertions v1.2.0 h1:42S6lae5dvLc7BrLu/0ugRtcFVjoJNMC/N3yZFZkDFs= +github.com/smartystreets/assertions v1.2.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo= +github.com/smartystreets/goconvey v1.7.2 h1:9RBaZCeXEQ3UselpuwUQHltGVXvdwm6cv1hgR6gDIPg= +github.com/smartystreets/goconvey v1.7.2/go.mod h1:Vw0tHAZW6lzCRk3xgdin6fKYcG+G3Pg9vgXWeJpQFMM= github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= @@ -488,6 +672,7 @@ github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSS github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= @@ -535,7 +720,8 @@ github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2n github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= -github.com/urfave/cli v1.22.1 h1:+mkCCcOFKPnCmVYVcURKps1Xe+3zP90gSYGNfRkjoIY= +github.com/urfave/cli v1.22.10 h1:p8Fspmz3iTctJstry1PYS3HVdllxnEzTEsgIgtxTrCk= +github.com/urfave/cli v1.22.10/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= @@ -548,6 +734,16 @@ github.com/vincent-petithory/dataurl v1.0.0 h1:cXw+kPto8NLuJtlMsI152irrVw9fRDX8A github.com/vincent-petithory/dataurl v1.0.0/go.mod h1:FHafX5vmDzyP+1CQATJn7WFKc9CvnvxyvZy6I1MrG/U= github.com/vmware-labs/yaml-jsonpath v0.3.2 h1:/5QKeCBGdsInyDCyVNLbXyilb61MXGi9NP674f9Hobk= github.com/vmware-labs/yaml-jsonpath v0.3.2/go.mod h1:U6whw1z03QyqgWdgXxvVnQ90zN1BWz5V+51Ewf8k+rQ= +github.com/warpfork/go-testmark v0.12.1 h1:rMgCpJfwy1sJ50x0M0NgyphxYYPMOODIJHhsXyEHU0s= +github.com/warpfork/go-testmark v0.12.1/go.mod h1:kHwy7wfvGSPh1rQJYKayD4AbtNaeyZdcGi9tNJTaa5Y= +github.com/warpfork/go-wish v0.0.0-20220906213052-39a1cc7a02d0 h1:GDDkbFiaK8jsSDJfjId/PEGEShv6ugrt4kYsC5UIDaQ= +github.com/warpfork/go-wish v0.0.0-20220906213052-39a1cc7a02d0/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= +github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11 h1:5HZfQkwe0mIfyDmc1Em5GqlNRzcdtlv4HTNmdpt7XH0= +github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11/go.mod h1:Wlo/SzPmxVp6vXpGt/zaXhHH0fn4IxgqZc82aKg6bpQ= +github.com/whyrusleeping/cbor-gen v0.2.1-0.20241030202151-b7a6831be65e h1:28X54ciEwwUxyHn9yrZfl5ojgF4CBNLWX7LR0rvBkf4= +github.com/whyrusleeping/cbor-gen v0.2.1-0.20241030202151-b7a6831be65e/go.mod h1:pM99HXyEbSQHcosHc0iW7YFmwnscr+t9Te4ibko05so= +github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f h1:jQa4QT2UP9WYv2nzyawpKMOCl+Z/jW7djv2/J50lj9E= +github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f/go.mod h1:p9UJB6dDgdPgMJZs7UjUOdulKyRr9fqkS+6JKAInPy8= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= @@ -565,6 +761,10 @@ github.com/yuin/goldmark v1.7.1 h1:3bajkSilaCbjdKVsKdZjZCLBNPL9pYzrCakKaf4U49U= github.com/yuin/goldmark v1.7.1/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +gitlab.com/yawning/secp256k1-voi v0.0.0-20230925100816-f2616030848b h1:CzigHMRySiX3drau9C6Q5CAbNIApmLdat5jPMqChvDA= +gitlab.com/yawning/secp256k1-voi v0.0.0-20230925100816-f2616030848b/go.mod h1:/y/V339mxv2sZmYYR64O07VuCpdNZqCTwO8ZcouTMI8= +gitlab.com/yawning/tuplehash v0.0.0-20230713102510-df83abbf9a02 h1:qwDnMxjkyLmAFgcfgTnfJrmYKWhHnci3GjDqcZp1M3Q= +gitlab.com/yawning/tuplehash v0.0.0-20230713102510-df83abbf9a02/go.mod h1:JTnUj0mpYiAsuZLmKjTx/ex3AtMowcCgnE7YNyCEP0I= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.50.0 h1:cEPbyTSEHlQR89XVlyo78gqluF8Y3oMeBkXGWzQsfXY= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.50.0/go.mod h1:DKdbWcT4GH1D0Y3Sqt/PFXt2naRKDWtU+eE6oLdFNA8= go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= @@ -587,20 +787,29 @@ go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQD go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= +go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU= go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= +go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= +go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= @@ -612,6 +821,7 @@ golang.org/x/crypto v0.29.0/go.mod h1:+F4F4N5hv6v38hfeYwTdx20oUvLLc+QfrE9Ax9HtgR golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8= golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= @@ -672,6 +882,7 @@ golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -714,6 +925,10 @@ golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= @@ -727,6 +942,8 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 h1:M0KvPgPmDZHPlbRbaNU1APr28TvwvvdUPlSv7PUvy8g= google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:dguCy7UOdZhTvLzDyt15+rOrawrpM4q7DD9dQ1P11P4= google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 h1:XVhgTWWV3kGQlwJHR3upFWZeTsei6Oks1apkZSeonIE= @@ -748,6 +965,7 @@ gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= @@ -769,11 +987,14 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gorm.io/driver/postgres v1.5.10 h1:7Lggqempgy496c0WfHXsYWxk3Th+ZcW66/21QhVFdeE= gorm.io/driver/postgres v1.5.10/go.mod h1:DX3GReXH+3FPWGrrgffdvCk3DQ1dwDPdmbenSkweRGI= +gorm.io/driver/sqlite v1.5.5 h1:7MDMtUZhV065SilG62E0MquljeArQZNfJnjd9i9gx3E= +gorm.io/driver/sqlite v1.5.5/go.mod h1:6NgQ7sQWAIFsPrJJl1lSNSu2TABh0ZZ/zm5fosATavE= gorm.io/gorm v1.23.6/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= gorm.io/gorm v1.25.12 h1:I0u8i2hWQItBq1WfE0o2+WuL9+8L21K9e2HHSTE/0f8= gorm.io/gorm v1.25.12/go.mod h1:xh7N7RHfYlNc5EmcI/El95gXusucDrQnHXe0+CgWcLQ= gotest.tools/v3 v3.3.0 h1:MfDY1b1/0xN1CyMlQDac0ziEy9zJQd9CXBRRDHw2jJo= gotest.tools/v3 v3.3.0/go.mod h1:Mcr9QNxkg0uMvy/YElmo4SpXgJKWgQvYrT7Kw5RzJ1A= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= lukechampine.com/blake3 v1.2.1 h1:YuqqRuaqsGV71BV/nm9xlI0MKUv4QC54jQnBChWbGnI= lukechampine.com/blake3 v1.2.1/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k= modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 h1:5D53IMaUuA5InSeMu9eJtlQXS2NxAhyWQvkKEgXZhHI= From 096929ef6426ac918b5a2d7c685eddc7c11b5486 Mon Sep 17 00:00:00 2001 From: polebug Date: Mon, 2 Dec 2024 22:18:52 +0800 Subject: [PATCH 07/31] update protocol-go version --- go.mod | 2 +- go.sum | 2 ++ provider/atproto/bluesky/client.go | 13 +++++++------ 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index 8a4008ab4..4081fb039 100644 --- a/go.mod +++ b/go.mod @@ -72,7 +72,7 @@ require ( github.com/redis/rueidis v1.0.50 github.com/redis/rueidis/rueidiscompat v1.0.50 github.com/reiver/go-bsky v0.0.0-20240906205655-8c7fadb4f3bb - github.com/rss3-network/protocol-go v0.5.14 + github.com/rss3-network/protocol-go v0.5.16 github.com/spf13/afero v1.11.0 github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 github.com/vincent-petithory/dataurl v1.0.0 diff --git a/go.sum b/go.sum index 892099cb7..0455d8019 100644 --- a/go.sum +++ b/go.sum @@ -616,6 +616,8 @@ github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rss3-network/protocol-go v0.5.14 h1:gd6ciwXb5e4xx1dmAOAIKWbpami2QbARqE61zbwT6KE= github.com/rss3-network/protocol-go v0.5.14/go.mod h1:npcyduWt86uVbIi77xQaYk8eqltI9XNjk1FMGpjyIq0= +github.com/rss3-network/protocol-go v0.5.16 h1:14AOjsHMnuEqEHPmBo4A8sdGXPbwMNGKKJoGk1fXunk= +github.com/rss3-network/protocol-go v0.5.16/go.mod h1:AOVaY0++55lryy3GeQG//EkPuVFqxNQoPa0VdGbmtx0= github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= diff --git a/provider/atproto/bluesky/client.go b/provider/atproto/bluesky/client.go index 7f41aec37..1c2d215bd 100644 --- a/provider/atproto/bluesky/client.go +++ b/provider/atproto/bluesky/client.go @@ -349,15 +349,16 @@ func (c *Client) ParseRecord(ctx context.Context, rec cbg.CBORMarshaler, message message.Feed = rec message.CreatedAt = createdAt case *bsky.ActorProfile: - if rec.CreatedAt != nil { - createdAt, isInvalid := c.ParseCreatedAt(ctx, lo.FromPtr(rec.CreatedAt)) - if !isInvalid { - return false, nil - } + if rec.CreatedAt == nil { + return false, nil + } - message.CreatedAt = createdAt + createdAt, isInvalid := c.ParseCreatedAt(ctx, lo.FromPtr(rec.CreatedAt)) + if !isInvalid { + return false, nil } + message.CreatedAt = createdAt message.Profile = rec case *bsky.FeedRepost: createdAt, isInvalid := c.ParseCreatedAt(ctx, rec.CreatedAt) From 71a4ca80b69648e97e045257fa26c441bd7a0d68 Mon Sep 17 00:00:00 2001 From: polebug Date: Mon, 2 Dec 2024 22:32:29 +0800 Subject: [PATCH 08/31] chore(worker): add null pointer judgment --- internal/engine/worker/atproto/core/worker.go | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/internal/engine/worker/atproto/core/worker.go b/internal/engine/worker/atproto/core/worker.go index 7400bb22d..6e3b95a2f 100644 --- a/internal/engine/worker/atproto/core/worker.go +++ b/internal/engine/worker/atproto/core/worker.go @@ -183,16 +183,24 @@ func (w *worker) transformProfile(_ context.Context, message at.Message, activit // buildPostMetadata constructs metadata for a post message. func (w *worker) buildPostMetadata(message at.Message) *metadata.SocialPost { - return &metadata.SocialPost{ + post := &metadata.SocialPost{ Handle: message.Handle, - Body: message.Feed.Text, - Media: w.buildPostMedia(message.Feed), ProfileID: message.Did.String(), PublicationID: message.Rkey, ContentURI: message.URI, - Tags: message.Feed.Tags, Timestamp: uint64(message.CreatedAt.Unix()), } + + if message.Feed != nil { + post.Body = message.Feed.Text + post.Tags = message.Feed.Tags + + if message.Feed.Embed != nil { + post.Media = w.buildPostMedia(message.Feed.Embed) + } + } + + return post } // buildProfileMetadata constructs metadata for a profile message. @@ -234,12 +242,7 @@ func (w *worker) buildPostAction(from string, to string, typex schema.Type, post } // buildPostMedia will build post media from embeds. -func (w *worker) buildPostMedia(post *bsky.FeedPost) []metadata.Media { - if post == nil || post.Embed == nil { - return nil - } - - embed := post.Embed +func (w *worker) buildPostMedia(embed *bsky.FeedPost_Embed) []metadata.Media { media := make([]metadata.Media, 0) if embed.EmbedImages != nil && embed.EmbedImages.Images != nil { From 0086bc2d13d4b858da0e65f8413b3738ae8b2243 Mon Sep 17 00:00:00 2001 From: brucexc Date: Mon, 2 Dec 2024 13:35:01 -0500 Subject: [PATCH 09/31] chore: deps error --- go.mod | 6 ++++-- go.sum | 14 ++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/go.mod b/go.mod index 4081fb039..6b4453602 100644 --- a/go.mod +++ b/go.mod @@ -4,6 +4,8 @@ go 1.22.4 toolchain go1.22.9 +replace github.com/chenzhuoyu/iasm => github.com/cloudwego/iasm v0.2.0 + require ( github.com/JohannesKaufmann/html-to-markdown v1.6.0 github.com/Khan/genqlient v0.7.0 @@ -69,8 +71,8 @@ require ( github.com/mitchellh/mapstructure v1.5.0 github.com/oapi-codegen/oapi-codegen/v2 v2.4.1 github.com/oapi-codegen/runtime v1.1.1 - github.com/redis/rueidis v1.0.50 - github.com/redis/rueidis/rueidiscompat v1.0.50 + github.com/redis/rueidis v1.0.51 + github.com/redis/rueidis/rueidiscompat v1.0.51 github.com/reiver/go-bsky v0.0.0-20240906205655-8c7fadb4f3bb github.com/rss3-network/protocol-go v0.5.16 github.com/spf13/afero v1.11.0 diff --git a/go.sum b/go.sum index 0455d8019..17e765439 100644 --- a/go.sum +++ b/go.sum @@ -581,12 +581,12 @@ github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0leargg github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= github.com/redis/go-redis/v9 v9.5.1 h1:H1X4D3yHPaYrkL5X06Wh6xNVM/pX0Ft4RV0vMGvLBh8= github.com/redis/go-redis/v9 v9.5.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M= -github.com/redis/rueidis v1.0.50 h1:UdsB/2EadJMGFIUuzxqFuWM2BSjXt8jYtml6eXkhJLE= -github.com/redis/rueidis v1.0.50/go.mod h1:by+34b0cFXndxtYmPAHpoTHO5NkosDlBvhexoTURIxM= -github.com/redis/rueidis/mock v1.0.49 h1:MfVL45QLAOH+YnxuqxMIOYsfn+/GLyF4XpWwtBh7IOE= -github.com/redis/rueidis/mock v1.0.49/go.mod h1:qVb3NaVgfqh1tMJw3+jmuqCUaMU0wu6NPS72TnuFWTE= -github.com/redis/rueidis/rueidiscompat v1.0.50 h1:TGC9qokruP3rglg3NA8vXNdAPjgyQD0CIjL2k4rDLXo= -github.com/redis/rueidis/rueidiscompat v1.0.50/go.mod h1:Wepg5l4B2fjGxEiPEg9uzLea+G6D9EGjDSB4/x7VXbw= +github.com/redis/rueidis v1.0.51 h1:NZ1KIncPIQtjrp+GDLynrLKBiPU106EN5cJHOFSqvDM= +github.com/redis/rueidis v1.0.51/go.mod h1:by+34b0cFXndxtYmPAHpoTHO5NkosDlBvhexoTURIxM= +github.com/redis/rueidis/mock v1.0.51 h1:XK9Ud2sgBiex8g3lT1y0PI/NQdzn2uTLRwsJ9ezk2iY= +github.com/redis/rueidis/mock v1.0.51/go.mod h1:6zsMgZ+q1EWPgGOstCtUgll1tcz7Pj6gAvl3/R9mKkU= +github.com/redis/rueidis/rueidiscompat v1.0.51 h1:QGYtutavVacfgyl8/LvcrhKAj+sRRuvE+p634lKdV4I= +github.com/redis/rueidis/rueidiscompat v1.0.51/go.mod h1:MAq/1yVbfrkyCFVSUAZeCK/hjlHZ1aN3oZCAy71AlE8= github.com/reiver/go-atproto v0.0.0-20240906195827-a1832b0df821 h1:s2ColkXw5LNaS8/eHB7O46NQYyv+DOghr25u3ukEa5g= github.com/reiver/go-atproto v0.0.0-20240906195827-a1832b0df821/go.mod h1:S/pf34se76GMYmdBXumZLenxGYgunVNLJkW6OQEXt9w= github.com/reiver/go-bsky v0.0.0-20240906205655-8c7fadb4f3bb h1:ZgOhXYuF5y3Hzhm9I5vc+LNd0um1Lz4v9fn64mt9PJA= @@ -614,8 +614,6 @@ github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= -github.com/rss3-network/protocol-go v0.5.14 h1:gd6ciwXb5e4xx1dmAOAIKWbpami2QbARqE61zbwT6KE= -github.com/rss3-network/protocol-go v0.5.14/go.mod h1:npcyduWt86uVbIi77xQaYk8eqltI9XNjk1FMGpjyIq0= github.com/rss3-network/protocol-go v0.5.16 h1:14AOjsHMnuEqEHPmBo4A8sdGXPbwMNGKKJoGk1fXunk= github.com/rss3-network/protocol-go v0.5.16/go.mod h1:AOVaY0++55lryy3GeQG//EkPuVFqxNQoPa0VdGbmtx0= github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww= From a0777e4cb5416b823399b04a459bae50dd8f7645 Mon Sep 17 00:00:00 2001 From: polebug Date: Wed, 4 Dec 2024 17:08:52 +0800 Subject: [PATCH 10/31] chore(worker): add `social like` type --- internal/engine/worker/atproto/core/worker.go | 1 + 1 file changed, 1 insertion(+) diff --git a/internal/engine/worker/atproto/core/worker.go b/internal/engine/worker/atproto/core/worker.go index 6e3b95a2f..e96016a53 100644 --- a/internal/engine/worker/atproto/core/worker.go +++ b/internal/engine/worker/atproto/core/worker.go @@ -56,6 +56,7 @@ func (w *worker) Types() []schema.Type { typex.SocialComment, typex.SocialPost, typex.SocialShare, + typex.SocialLike, typex.SocialProfile, } } From 66cc9f489a2e83ce958e1fc21100dbd398206f6d Mon Sep 17 00:00:00 2001 From: polebug Date: Wed, 4 Dec 2024 17:31:00 +0800 Subject: [PATCH 11/31] chore(worker): use default http client --- provider/atproto/bluesky/client.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/provider/atproto/bluesky/client.go b/provider/atproto/bluesky/client.go index 1c2d215bd..566cbdc98 100644 --- a/provider/atproto/bluesky/client.go +++ b/provider/atproto/bluesky/client.go @@ -32,6 +32,8 @@ const ( SyncListReposLimit = 10 ) +var HTTPClient = http.DefaultClient + type Client struct { username string password string @@ -517,7 +519,7 @@ func (c *Client) GetXrpcClient(ctx context.Context, endpoint string) (*XrpcClien func (c *Client) createAndAuthenticateClient(ctx context.Context, endpoint string) (*XrpcClient, error) { client := &xrpc.Client{ Host: endpoint, - Client: http.DefaultClient, + Client: HTTPClient, } // Create context with 5 second timeout From 3c8902649a20b22fe48a8df33f6ac756c627a5cd Mon Sep 17 00:00:00 2001 From: polebug Date: Wed, 4 Dec 2024 17:31:41 +0800 Subject: [PATCH 12/31] chore(worker): fix typo --- provider/atproto/bluesky/client.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/provider/atproto/bluesky/client.go b/provider/atproto/bluesky/client.go index 566cbdc98..dbc9d1e57 100644 --- a/provider/atproto/bluesky/client.go +++ b/provider/atproto/bluesky/client.go @@ -112,7 +112,7 @@ func (c *Client) SyncGetRepo(ctx context.Context, repoData *atproto.SyncListRepo } // Get authenticated client for the endpoint - client, err := c.GetXrpcClient(ctx, c.LookupDIDEdnpoint(ctx, did)) + client, err := c.GetXrpcClient(ctx, c.LookupDIDEndpoint(ctx, did)) if err != nil { zap.L().Error("create xrpc client failed", zap.Error(err)) @@ -257,7 +257,7 @@ func (c *Client) GetRecord(ctx context.Context, repo string, path string) (*at.M } // Get authenticated client - client, err := c.GetXrpcClient(ctx, c.LookupDIDEdnpoint(ctx, did)) + client, err := c.GetXrpcClient(ctx, c.LookupDIDEndpoint(ctx, did)) if err != nil { zap.L().Error("create xrpc client failed", zap.Error(err)) @@ -303,7 +303,7 @@ func (c *Client) GetRecord(ctx context.Context, repo string, path string) (*at.M // - did: User's decentralized identifier // Returns the user's handle or an error. func (c *Client) GetHandle(ctx context.Context, did syntax.DID) (string, error) { - client, err := c.GetXrpcClient(ctx, c.LookupDIDEdnpoint(ctx, did)) + client, err := c.GetXrpcClient(ctx, c.LookupDIDEndpoint(ctx, did)) if err != nil { return "", fmt.Errorf("get xrpc client: %w", err) } @@ -549,7 +549,7 @@ func (c *Client) createAndAuthenticateClient(ctx context.Context, endpoint strin }, nil } -func (c *Client) LookupDIDEdnpoint(ctx context.Context, did syntax.DID) string { +func (c *Client) LookupDIDEndpoint(ctx context.Context, did syntax.DID) string { // Creates a new BaseDirectory with default settings. baseDirectory := &identity.BaseDirectory{ PLCURL: identity.DefaultPLCURL, From e56a02d7238d643c299b9230f0b8641c0cbc485e Mon Sep 17 00:00:00 2001 From: polebug Date: Wed, 4 Dec 2024 17:33:28 +0800 Subject: [PATCH 13/31] chore(worker): remove useless logic --- provider/atproto/bluesky/client.go | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/provider/atproto/bluesky/client.go b/provider/atproto/bluesky/client.go index dbc9d1e57..ffe898276 100644 --- a/provider/atproto/bluesky/client.go +++ b/provider/atproto/bluesky/client.go @@ -17,7 +17,6 @@ import ( "github.com/bluesky-social/indigo/atproto/syntax" "github.com/bluesky-social/indigo/repo" "github.com/bluesky-social/indigo/xrpc" - "github.com/go-playground/form/v4" "github.com/ipfs/go-cid" at "github.com/rss3-network/node/provider/atproto" "github.com/samber/lo" @@ -32,8 +31,6 @@ const ( SyncListReposLimit = 10 ) -var HTTPClient = http.DefaultClient - type Client struct { username string password string @@ -42,7 +39,6 @@ type Client struct { mutex sync.RWMutex defaultClient *XrpcClient cacheClient map[string]*XrpcClient - encoder *form.Encoder httpClient *http.Client } @@ -519,7 +515,7 @@ func (c *Client) GetXrpcClient(ctx context.Context, endpoint string) (*XrpcClien func (c *Client) createAndAuthenticateClient(ctx context.Context, endpoint string) (*XrpcClient, error) { client := &xrpc.Client{ Host: endpoint, - Client: HTTPClient, + Client: c.httpClient, } // Create context with 5 second timeout @@ -584,7 +580,6 @@ func NewClient(_ context.Context, filter []string, username string, password str filter: filter, timestampStart: timestamp, cacheClient: make(map[string]*XrpcClient), - encoder: form.NewEncoder(), httpClient: http.DefaultClient, } From e2294bd7e22ecdbe046d92886a31cffcb404a408 Mon Sep 17 00:00:00 2001 From: polebug Date: Thu, 5 Dec 2024 18:09:34 +0800 Subject: [PATCH 14/31] chore(atproto): add `ActorGetProfile` fallback call --- provider/atproto/bluesky/client.go | 73 ++++++++++++++++++------------ 1 file changed, 43 insertions(+), 30 deletions(-) diff --git a/provider/atproto/bluesky/client.go b/provider/atproto/bluesky/client.go index ffe898276..97e08bfad 100644 --- a/provider/atproto/bluesky/client.go +++ b/provider/atproto/bluesky/client.go @@ -22,6 +22,7 @@ import ( "github.com/samber/lo" cbg "github.com/whyrusleeping/cbor-gen" "go.uber.org/zap" + "golang.org/x/sync/errgroup" ) const ( @@ -71,20 +72,30 @@ func (c *Client) SyncListRepos(ctx context.Context, cursor string, limit int64) data := make([]*at.Message, 0) + errorGroup, _ := errgroup.WithContext(ctx) + // Process each repository to extract its records for _, rep := range results.Repos { - feed, err := c.SyncGetRepo(ctx, rep) - if err != nil { - zap.L().Error("sync get repo failed", zap.Error(err)) + rep := rep - return nil, nil, fmt.Errorf("sync get repo failed: %w", err) - } + errorGroup.Go(func() error { + feed, err := c.SyncGetRepo(ctx, rep) + if err != nil { + zap.L().Error("sync get repo failed", zap.Error(err)) - if len(feed) == 0 { - continue - } + return fmt.Errorf("sync get repo failed: %w", err) + } + + if len(feed) > 0 { + data = append(data, feed...) + } - data = append(data, feed...) + return nil + }) + } + + if err := errorGroup.Wait(); err != nil { + return nil, nil, fmt.Errorf("sync get repo failed: %w", err) } return data, results.Cursor, nil @@ -186,14 +197,14 @@ func (c *Client) ParseCARList(ctx context.Context, did syntax.DID, handle string } // Parse record and update message - isInvalid, err := c.ParseRecord(ctx, rec, message) + isValid, err := c.ParseRecord(ctx, rec, message) if err != nil { zap.L().Error("parse record failed", zap.Error(err)) return nil } - if isInvalid { + if isValid { recList = append(recList, message) } @@ -222,14 +233,14 @@ func (c *Client) GetRepoRecord(ctx context.Context, repo string, path string) (* return nil, fmt.Errorf("get record: %w", err) } - isInvalid, err := c.ParseRecord(ctx, rec, message) + isValid, err := c.ParseRecord(ctx, rec, message) if err != nil { zap.L().Error("parse record failed", zap.Error(err)) return nil, nil } - if isInvalid { + if isValid { return message, nil } @@ -304,20 +315,22 @@ func (c *Client) GetHandle(ctx context.Context, did syntax.DID) (string, error) return "", fmt.Errorf("get xrpc client: %w", err) } - resp, err := bsky.ActorGetProfile(ctx, client.Client, did.String()) - if err != nil { - if strings.Contains(err.Error(), "XRPC ERROR 400") { - return "", nil - } + resp, _ := bsky.ActorGetProfile(ctx, client.Client, did.String()) + if resp != nil { + return resp.Handle, nil + } - return "", fmt.Errorf("profile get: %w", err) + defaultClient, err := c.GetXrpcClient(ctx, BskyEndpoint) + if err != nil { + return "", fmt.Errorf("get xrpc client: %w", err) } - if resp == nil { - return "", nil + resp, _ = bsky.ActorGetProfile(ctx, defaultClient.Client, did.String()) + if resp != nil { + return resp.Handle, nil } - return resp.Handle, nil + return "", nil } // ParseRecord processes different types of records and updates the message. @@ -330,8 +343,8 @@ func (c *Client) ParseRecord(ctx context.Context, rec cbg.CBORMarshaler, message switch rec := rec.(type) { case *bsky.FeedPost: - createdAt, isInvalid := c.ParseCreatedAt(ctx, rec.CreatedAt) - if !isInvalid { + createdAt, isValid := c.ParseCreatedAt(ctx, rec.CreatedAt) + if !isValid { return false, nil } @@ -351,16 +364,16 @@ func (c *Client) ParseRecord(ctx context.Context, rec cbg.CBORMarshaler, message return false, nil } - createdAt, isInvalid := c.ParseCreatedAt(ctx, lo.FromPtr(rec.CreatedAt)) - if !isInvalid { + createdAt, isValid := c.ParseCreatedAt(ctx, lo.FromPtr(rec.CreatedAt)) + if !isValid { return false, nil } message.CreatedAt = createdAt message.Profile = rec case *bsky.FeedRepost: - createdAt, isInvalid := c.ParseCreatedAt(ctx, rec.CreatedAt) - if !isInvalid { + createdAt, isValid := c.ParseCreatedAt(ctx, rec.CreatedAt) + if !isValid { return false, nil } @@ -373,8 +386,8 @@ func (c *Client) ParseRecord(ctx context.Context, rec cbg.CBORMarshaler, message message.CreatedAt = createdAt case *bsky.FeedLike: - createdAt, isInvalid := c.ParseCreatedAt(ctx, rec.CreatedAt) - if !isInvalid { + createdAt, isValid := c.ParseCreatedAt(ctx, rec.CreatedAt) + if !isValid { return false, nil } From f1d7115e4ae21bbfa7f6eaea3363efd392df6c47 Mon Sep 17 00:00:00 2001 From: polebug Date: Fri, 6 Dec 2024 17:42:04 +0800 Subject: [PATCH 15/31] chore(source): add fallback logic --- internal/engine/protocol/atproto/option.go | 6 +- provider/atproto/bluesky/client.go | 118 ++++++++++++--------- 2 files changed, 71 insertions(+), 53 deletions(-) diff --git a/internal/engine/protocol/atproto/option.go b/internal/engine/protocol/atproto/option.go index 7bdb8b1fa..31e8ea9af 100644 --- a/internal/engine/protocol/atproto/option.go +++ b/internal/engine/protocol/atproto/option.go @@ -15,7 +15,7 @@ type Option struct { Username string `json:"username" mapstructure:"username"` Password string `json:"password" mapstructure:"password"` - TimestampStart int64 `json:"timestamp_start" mapstructure:"timestamp_start"` + TimestampStart time.Time `json:"timestamp_start" mapstructure:"timestamp_start"` } func NewOption(parameters *config.Parameters) (*Option, error) { @@ -34,12 +34,12 @@ func NewOption(parameters *config.Parameters) (*Option, error) { if lo.IsEmpty(option.TimestampStart) { if parameter.CurrentNetworkStartBlock[network.Bluesky] == nil { // Default to 90 days ago - option.TimestampStart = time.Now().Add(-time.Hour * 24 * 90).Unix() + option.TimestampStart = time.Now().Add(-time.Hour * 24 * 90) return &option, nil } - option.TimestampStart = parameter.CurrentNetworkStartBlock[network.Bluesky].Timestamp + option.TimestampStart = time.Unix(parameter.CurrentNetworkStartBlock[network.Bluesky].Timestamp, 0) } return &option, nil diff --git a/provider/atproto/bluesky/client.go b/provider/atproto/bluesky/client.go index 97e08bfad..305fab6ab 100644 --- a/provider/atproto/bluesky/client.go +++ b/provider/atproto/bluesky/client.go @@ -36,7 +36,7 @@ type Client struct { username string password string filter []string - timestampStart int64 + timestampStart time.Time mutex sync.RWMutex defaultClient *XrpcClient cacheClient map[string]*XrpcClient @@ -70,7 +70,10 @@ func (c *Client) SyncListRepos(ctx context.Context, cursor string, limit int64) return nil, nil, fmt.Errorf("sync list repos failed: %w", err) } - data := make([]*at.Message, 0) + var ( + mu sync.Mutex + data = make([]*at.Message, 0) + ) errorGroup, _ := errgroup.WithContext(ctx) @@ -87,7 +90,9 @@ func (c *Client) SyncListRepos(ctx context.Context, cursor string, limit int64) } if len(feed) > 0 { + mu.Lock() data = append(data, feed...) + mu.Unlock() } return nil @@ -127,7 +132,7 @@ func (c *Client) SyncGetRepo(ctx context.Context, repoData *atproto.SyncListRepo } // Get user handle from profile - handle, err := c.GetHandle(ctx, did) + handle, err := c.GetHandle(ctx, client, did) if err != nil { zap.L().Error("get profile failed", zap.Error(err)) @@ -169,52 +174,56 @@ func (c *Client) ParseCARList(ctx context.Context, did syntax.DID, handle string recList := make([]*at.Message, 0) + errorGroup, _ := errgroup.WithContext(ctx) + // Iterate over all records - err = r.ForEach(ctx, "", func(path string, _ cid.Cid) error { - zap.L().Debug("processing record", zap.String("path", path)) + _ = r.ForEach(ctx, "", func(path string, _ cid.Cid) error { + errorGroup.Go(func() error { + zap.L().Debug("processing record", zap.String("path", path)) - // Parse path to get collection and rkey - collection, rkey := c.ParsePath(path) + // Parse path to get collection and rkey + collection, rkey := c.ParsePath(path) - if !lo.Contains(c.filter, collection) { - return nil - } + if !lo.Contains(c.filter, collection) { + return nil + } - // Get record from repo - _, rec, err := r.GetRecord(ctx, path) - if err != nil { - zap.L().Error("get record failed", zap.Error(err)) + // Get record from repo + _, rec, err := r.GetRecord(ctx, path) + if err != nil { + zap.L().Error("get record failed", zap.Error(err)) - return fmt.Errorf("get record: %w", err) - } + return fmt.Errorf("get record: %w", err) + } - message := &at.Message{ - URI: c.BuildURI(did, collection, rkey), - Did: did, - Handle: handle, - Collection: collection, - Rkey: rkey, - } + message := &at.Message{ + URI: c.BuildURI(did, collection, rkey), + Did: did, + Handle: handle, + Collection: collection, + Rkey: rkey, + } - // Parse record and update message - isValid, err := c.ParseRecord(ctx, rec, message) - if err != nil { - zap.L().Error("parse record failed", zap.Error(err)) + // Parse record and update message + isValid, err := c.ParseRecord(ctx, rec, message) + if err != nil { + zap.L().Error("parse record failed", zap.Error(err)) - return nil - } + return nil + } - if isValid { - recList = append(recList, message) - } + if isValid { + recList = append(recList, message) + } + + return nil + }) return nil }) - if err != nil { - zap.L().Error("iterate over all records failed", zap.Error(err)) - - return nil, err + if err := errorGroup.Wait(); err != nil { + return nil, fmt.Errorf("process record failed: %w", err) } return recList, nil @@ -272,7 +281,7 @@ func (c *Client) GetRecord(ctx context.Context, repo string, path string) (*at.M } // Fetch the handle associated with the DID - handle, err := c.GetHandle(ctx, did) + handle, err := c.GetHandle(ctx, client, did) if err != nil { zap.L().Error("get profile failed", zap.Error(err)) @@ -289,13 +298,24 @@ func (c *Client) GetRecord(ctx context.Context, repo string, path string) (*at.M // Retrieve the record resp, err := atproto.RepoGetRecord(ctx, client.Client, "", collection, repo, rkey) - if err != nil { - // Handle CID too short error gracefully - if strings.Contains(err.Error(), cid.ErrCidTooShort.Error()) || strings.Contains(err.Error(), "XRPC ERROR 400") { - return message, nil, nil + if err != nil || resp == nil { + // fallback to default client + defaultClient, err := c.GetXrpcClient(ctx, BskyEndpoint) + if err != nil { + zap.L().Error("get xrpc client failed", zap.Error(err)) + + return nil, nil, fmt.Errorf("get xrpc client: %w", err) } - return nil, nil, fmt.Errorf("repo get record: %w", err) + resp, err = atproto.RepoGetRecord(ctx, defaultClient.Client, "", collection, repo, rkey) + if err != nil { + // Handle CID too short error gracefully + if strings.Contains(err.Error(), cid.ErrCidTooShort.Error()) || strings.Contains(err.Error(), "XRPC ERROR 400") { + return message, nil, nil + } + + return nil, nil, fmt.Errorf("repo get record: %w", err) + } } if resp != nil && resp.Value != nil { @@ -309,12 +329,7 @@ func (c *Client) GetRecord(ctx context.Context, repo string, path string) (*at.M // Parameters: // - did: User's decentralized identifier // Returns the user's handle or an error. -func (c *Client) GetHandle(ctx context.Context, did syntax.DID) (string, error) { - client, err := c.GetXrpcClient(ctx, c.LookupDIDEndpoint(ctx, did)) - if err != nil { - return "", fmt.Errorf("get xrpc client: %w", err) - } - +func (c *Client) GetHandle(ctx context.Context, client *XrpcClient, did syntax.DID) (string, error) { resp, _ := bsky.ActorGetProfile(ctx, client.Client, did.String()) if resp != nil { return resp.Handle, nil @@ -399,6 +414,8 @@ func (c *Client) ParseRecord(ctx context.Context, rec cbg.CBORMarshaler, message } message.CreatedAt = createdAt + default: + return false, nil } return true, nil @@ -412,7 +429,7 @@ func (c *Client) ParseCreatedAt(_ context.Context, createdAt string) (time.Time, return time.Time{}, false } - return timestamp, timestamp.Unix() >= c.timestampStart + return timestamp, timestamp.After(c.timestampStart) } func (c *Client) ParseRepoStrongRef(ctx context.Context, ref *atproto.RepoStrongRef) (*at.Message, error) { @@ -436,6 +453,7 @@ func (c *Client) ParseRepoStrongRef(ctx context.Context, ref *atproto.RepoStrong switch rec := rec.(type) { case *bsky.FeedPost: target.Feed = rec + target.CreatedAt, _ = c.ParseCreatedAt(ctx, rec.CreatedAt) default: return nil, fmt.Errorf("unsupported record type: %T", rec) } @@ -586,7 +604,7 @@ func (c *Client) LookupDIDEndpoint(ctx context.Context, did syntax.DID) string { return BskyEndpoint } -func NewClient(_ context.Context, filter []string, username string, password string, timestamp int64) (*Client, error) { +func NewClient(_ context.Context, filter []string, username string, password string, timestamp time.Time) (*Client, error) { client := &Client{ username: username, password: password, From b8c9d84349b89d70c42a89b409ff896d18441c4f Mon Sep 17 00:00:00 2001 From: polebug Date: Fri, 6 Dec 2024 17:45:06 +0800 Subject: [PATCH 16/31] go mod tidy --- go.mod | 67 ++++- go.sum | 255 ++++++++++++++++-- .../engine/protocol/atproto/data_source.go | 2 +- 3 files changed, 302 insertions(+), 22 deletions(-) diff --git a/go.mod b/go.mod index f1b2d1641..f05db3e1f 100644 --- a/go.mod +++ b/go.mod @@ -1,8 +1,8 @@ module github.com/rss3-network/node -go 1.22 +go 1.22.4 -toolchain go1.22.1 +toolchain go1.22.10 replace github.com/chenzhuoyu/iasm => github.com/cloudwego/iasm v0.2.0 @@ -57,12 +57,15 @@ require ( require ( github.com/adrianbrad/psqldocker v1.2.1 + github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de + github.com/bluesky-social/indigo v0.0.0-20241206035216-5ee8937072a8 github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 github.com/emirpasic/gods v1.18.1 github.com/getkin/kin-openapi v0.127.0 github.com/go-fed/httpsig v1.1.0 github.com/go-redsync/redsync/v4 v4.13.0 github.com/google/uuid v1.6.0 + github.com/gorilla/websocket v1.5.3 github.com/grafana/pyroscope-go v1.2.0 github.com/jaytaylor/html2text v0.0.0-20230321000545-74c2419ad056 github.com/mitchellh/mapstructure v1.5.0 @@ -70,10 +73,12 @@ require ( github.com/oapi-codegen/runtime v1.1.1 github.com/redis/rueidis v1.0.51 github.com/redis/rueidis/rueidiscompat v1.0.51 - github.com/rss3-network/protocol-go v0.5.14 + github.com/reiver/go-bsky v0.0.0-20240906205655-8c7fadb4f3bb + github.com/rss3-network/protocol-go v0.5.16 github.com/spf13/afero v1.11.0 github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 github.com/vincent-petithory/dataurl v1.0.0 + github.com/whyrusleeping/cbor-gen v0.2.1-0.20241030202151-b7a6831be65e golang.org/x/net v0.31.0 ) @@ -84,13 +89,21 @@ require ( github.com/Microsoft/go-winio v0.6.2 // indirect github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 // indirect github.com/PuerkitoBio/goquery v1.9.2 // indirect + github.com/RussellLuo/slidingwindow v0.0.0-20200528002341-535bb99d338b // indirect github.com/andybalholm/cascadia v1.3.2 // indirect github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bits-and-blooms/bitset v1.10.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/btcsuite/btcd/chaincfg/chainhash v1.0.2 // indirect + github.com/carlmjohnson/versioninfo v0.22.5 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cockroachdb/errors v1.11.3 // indirect + github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce // indirect + github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect + github.com/cockroachdb/pebble v1.1.2 // indirect + github.com/cockroachdb/redact v1.1.5 // indirect + github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect github.com/consensys/bavard v0.1.13 // indirect github.com/consensys/gnark-crypto v0.12.1 // indirect github.com/containerd/continuity v0.4.3 // indirect @@ -106,6 +119,7 @@ require ( github.com/ethereum/c-kzg-4844 v0.4.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/getsentry/sentry-go v0.27.0 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.3.0 // indirect @@ -120,25 +134,53 @@ require ( github.com/golang-jwt/jwt v3.2.2+incompatible // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect - github.com/gorilla/websocket v1.5.0 // indirect github.com/grafana/pyroscope-go/godeltaprof v0.1.8 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/hashicorp/go-retryablehttp v0.7.5 // indirect + github.com/hashicorp/golang-lru v1.0.2 // indirect + github.com/hashicorp/golang-lru/arc/v2 v2.0.6 // indirect + github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/holiman/uint256 v1.2.4 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/invopop/yaml v0.3.1 // indirect + github.com/ipfs/bbloom v0.0.4 // indirect + github.com/ipfs/go-block-format v0.2.0 // indirect + github.com/ipfs/go-blockservice v0.5.2 // indirect + github.com/ipfs/go-datastore v0.6.0 // indirect + github.com/ipfs/go-ipfs-blockstore v1.3.1 // indirect + github.com/ipfs/go-ipfs-ds-help v1.1.1 // indirect + github.com/ipfs/go-ipfs-exchange-interface v0.2.1 // indirect + github.com/ipfs/go-ipfs-util v0.0.3 // indirect + github.com/ipfs/go-ipld-cbor v0.1.0 // indirect + github.com/ipfs/go-ipld-format v0.6.0 // indirect + github.com/ipfs/go-ipld-legacy v0.2.1 // indirect + github.com/ipfs/go-libipfs v0.7.0 // indirect + github.com/ipfs/go-log v1.0.5 // indirect + github.com/ipfs/go-log/v2 v2.5.1 // indirect + github.com/ipfs/go-merkledag v0.11.0 // indirect + github.com/ipfs/go-metrics-interface v0.0.1 // indirect + github.com/ipfs/go-verifcid v0.0.3 // indirect + github.com/ipld/go-car v0.6.2 // indirect + github.com/ipld/go-car/v2 v2.13.1 // indirect + github.com/ipld/go-codec-dagpb v1.6.0 // indirect + github.com/ipld/go-ipld-prime v0.21.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect github.com/jackc/pgx/v5 v5.7.1 // indirect github.com/jackc/puddle/v2 v2.2.2 // indirect + github.com/jbenet/goprocess v0.1.4 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/compress v1.17.11 // indirect - github.com/klauspost/cpuid/v2 v2.2.5 // indirect + github.com/klauspost/cpuid/v2 v2.2.7 // indirect + github.com/kr/pretty v0.3.1 // indirect + github.com/kr/text v0.2.0 // indirect github.com/labstack/gommon v0.4.2 // indirect github.com/leodido/go-urn v1.4.0 // indirect github.com/magiconair/properties v1.8.7 // indirect @@ -165,16 +207,26 @@ require ( github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0 // indirect github.com/opencontainers/runc v1.1.12 // indirect + github.com/opentracing/opentracing-go v1.2.0 // indirect github.com/ory/dockertest/v3 v3.10.0 // indirect github.com/pelletier/go-toml/v2 v2.2.2 // indirect github.com/perimeterx/marshmallow v1.1.5 // indirect + github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 // indirect github.com/pierrec/lz4/v4 v4.1.21 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/polydawn/refmt v0.89.1-0.20221221234430-40501e09de1f // indirect github.com/prometheus/client_model v0.6.1 // indirect github.com/prometheus/common v0.60.1 // indirect github.com/prometheus/procfs v0.15.1 // indirect + github.com/reiver/go-atproto v0.0.0-20240906195827-a1832b0df821 // indirect + github.com/reiver/go-cast v0.0.0-20240904124821-be0103637c3f // indirect + github.com/reiver/go-erorr v0.0.0-20240801233437-8cbde6d1fa3f // indirect + github.com/reiver/go-fallback v0.0.0-20240906145154-1ce9eadf06a8 // indirect + github.com/reiver/go-maps v0.0.0-20240906190342-93be57f28be1 // indirect + github.com/reiver/go-reg v0.0.0-20240906195701-6e62f43c2835 // indirect github.com/rivo/uniseg v0.2.0 // indirect + github.com/rogpeppe/go-internal v1.13.1 // indirect github.com/sagikazarmark/locafero v0.4.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect github.com/sethvargo/go-retry v0.3.0 // indirect @@ -196,12 +248,16 @@ require ( github.com/valyala/fasttemplate v1.2.2 // indirect github.com/vektah/gqlparser/v2 v2.5.11 // indirect github.com/vmware-labs/yaml-jsonpath v0.3.2 // indirect + github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11 // indirect github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect github.com/xeipuuv/gojsonschema v1.2.0 // indirect github.com/yusufpapurcu/wmi v1.2.3 // indirect + gitlab.com/yawning/secp256k1-voi v0.0.0-20230925100816-f2616030848b // indirect + gitlab.com/yawning/tuplehash v0.0.0-20230713102510-df83abbf9a02 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.50.0 // indirect go.opentelemetry.io/proto/otlp v1.3.1 // indirect + go.uber.org/atomic v1.11.0 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/crypto v0.29.0 // indirect golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect @@ -210,6 +266,7 @@ require ( golang.org/x/text v0.20.0 // indirect golang.org/x/time v0.5.0 // indirect golang.org/x/tools v0.24.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 // indirect google.golang.org/grpc v1.67.1 // indirect diff --git a/go.sum b/go.sum index 539db3060..a47a189d5 100644 --- a/go.sum +++ b/go.sum @@ -4,6 +4,7 @@ filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/DataDog/zstd v1.5.0 h1:+K/VEwIAaPcHiMtQvpLD4lqW7f0Gk3xdYZmI1hD+CXo= github.com/DataDog/zstd v1.5.0/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= github.com/JohannesKaufmann/html-to-markdown v1.6.0 h1:04VXMiE50YYfCfLboJCLcgqF5x+rHJnb1ssNmqpLH/k= @@ -17,10 +18,14 @@ github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8 github.com/PuerkitoBio/goquery v1.9.2 h1:4/wZksC3KgkQw7SQgkKotmKljk0M6V8TUvA8Wb4yPeE= github.com/PuerkitoBio/goquery v1.9.2/go.mod h1:GHPCaP0ODyyxqcNoFGYlAprUFH81NuRPd0GX3Zu2Mvk= github.com/RaveNoX/go-jsoncommentstrip v1.0.0/go.mod h1:78ihd09MekBnJnxpICcwzCMzGrKSKYe4AqU6PDYYpjk= +github.com/RussellLuo/slidingwindow v0.0.0-20200528002341-535bb99d338b h1:5/++qT1/z812ZqBvqQt6ToRswSuPZ/B33m6xVHRzADU= +github.com/RussellLuo/slidingwindow v0.0.0-20200528002341-535bb99d338b/go.mod h1:4+EPqMRApwwE/6yo6CxiHoSnBzjRr3jsqer7frxP8y4= github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= github.com/adrianbrad/psqldocker v1.2.1 h1:bvsRmbotpA89ruqGGzzaAZUBtDaIk98gO+JMBNVSZlI= github.com/adrianbrad/psqldocker v1.2.1/go.mod h1:LbCnIy60YO6IRJYrF1r+eafKUgU9UnkSFx0gT8UiaUs= +github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5 h1:iW0a5ljuFxkLGPNem5Ui+KBjFJzKg4Fv2fnxe4dvzpM= +github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5/go.mod h1:Y2QMoi1vgtOIfc+6DhrMOGkLoGzqSV2rKp4Sm+opsyA= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= github.com/andybalholm/cascadia v1.2.0/go.mod h1:YCyR8vOZT9aZ1CHEd8ap0gMVm2aFgxBp0T0eFw1RUQY= @@ -28,18 +33,26 @@ github.com/andybalholm/cascadia v1.3.2 h1:3Xi6Dw5lHF15JtdcmAHD3i1+T8plmv7BQ/nsVi github.com/andybalholm/cascadia v1.3.2/go.mod h1:7gtRlve5FxPPgIgX36uWBX58OdBsSS6lUvCFb+h7KvU= github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ= github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk= +github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de h1:FxWPpzIjnTlhPwqqXc4/vE0f7GvRjuAsbW+HOIe8KnA= +github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de/go.mod h1:DCaWoUhZrYW9p1lxo/cm8EmUOOzAPSEZNGF2DK1dJgw= github.com/avast/retry-go/v4 v4.6.0 h1:K9xNA+KeB8HHc2aWFuLb25Offp+0iVRXEvFx8IinRJA= github.com/avast/retry-go/v4 v4.6.0/go.mod h1:gvWlPhBVsvBbLkVGDg/KwvBv0bEkCOLRRSHKIr2PyOE= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= +github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88= github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/bluesky-social/indigo v0.0.0-20241206035216-5ee8937072a8 h1:RZRm7C0DSjI7oLolHXWoGFNxUnA4T9bl6ZTAnIXKdSg= +github.com/bluesky-social/indigo v0.0.0-20241206035216-5ee8937072a8/go.mod h1:SNFzA8zY8amwZzBvPfctX5DOpAG0OHan9qfbqCSTe2w= github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.2 h1:KdUfX2zKommPRa+PD0sWZUyXe9w277ABlgELO7H04IM= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.2/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/carlmjohnson/versioninfo v0.22.5 h1:O00sjOLUAFxYQjlN/bzYTuZiS0y6fWDQjMRvwtKgwwc= +github.com/carlmjohnson/versioninfo v0.22.5/go.mod h1:QT9mph3wcVfISUKd0i9sZfVrPviHuSF+cUtLjm2WSf8= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= @@ -49,16 +62,18 @@ github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/cockroachdb/errors v1.8.1 h1:A5+txlVZfOqFBDa4mGz2bUWSp0aHElvHX2bKkdbQu+Y= -github.com/cockroachdb/errors v1.8.1/go.mod h1:qGwQn6JmZ+oMjuLwjWzUNqblqk0xl4CVV3SQbGwK7Ac= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f h1:o/kfcElHqOiXqcou5a3rIlMc7oJbMQkeLk0VQJ7zgqY= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= -github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 h1:aPEJyR4rPBvDmeyi+l/FS/VtA00IWvjeFvjen1m1l1A= -github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593/go.mod h1:6hk1eMY/u5t+Cf18q5lFMUA1Rc+Sm5I6Ra1QuPyxXCo= -github.com/cockroachdb/redact v1.0.8 h1:8QG/764wK+vmEYoOlfobpe12EQcS81ukx/a4hdVMxNw= -github.com/cockroachdb/redact v1.0.8/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= -github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2 h1:IKgmqgMQlVJIZj19CdocBeSfSaiCbEBZGKODaixqtHM= -github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2/go.mod h1:8BT+cPK6xvFOcRlk0R8eg+OTkcqI6baNH4xAkpiYVvQ= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/errors v1.11.3 h1:5bA+k2Y6r+oz/6Z/RFlNeVCesGARKuC6YymtcDrbC/I= +github.com/cockroachdb/errors v1.11.3/go.mod h1:m4UIW4CDjx+R5cybPsNrRbreomiFqt8o1h1wUVazSd8= +github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce h1:giXvy4KSc/6g/esnpM7Geqxka4WSqI1SZc7sMJFd3y4= +github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce/go.mod h1:9/y3cnZ5GKakj/H4y9r9GTjCvAFta7KLgSHPJJYc52M= +github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= +github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= +github.com/cockroachdb/pebble v1.1.2 h1:CUh2IPtR4swHlEj48Rhfzw6l/d0qA31fItcIszQVIsA= +github.com/cockroachdb/pebble v1.1.2/go.mod h1:4exszw1r40423ZsmkG/09AFEG83I0uDgfujJdbL6kYU= +github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= +github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= @@ -69,16 +84,20 @@ github.com/containerd/continuity v0.4.3 h1:6HVkalIp+2u1ZLH1J/pYX2oBVXlJZvh1X1A7b github.com/containerd/continuity v0.4.3/go.mod h1:F6PTNCKepoxEaXLQp3wDAjygEnImnZ/7o4JzpodfroQ= github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.4 h1:wfIWP927BUkWJb2NmU/kNDYIBTh/ziUX91+lVfRxZq4= github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 h1:d28BXYi+wUpz1KBmiF9bWrjEMacUEREV6MBi2ODnrfQ= github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/creasty/defaults v1.8.0 h1:z27FJxCAa0JKt3utc0sCImAEb+spPucmKoOdLHvHYKk= github.com/creasty/defaults v1.8.0/go.mod h1:iGzKe6pbEHnpMPtfDXZEr0NVxWnPTjb1bbDy08fPzYM= +github.com/cskr/pubsub v1.0.2 h1:vlOzMhl6PFn60gRlTQQsIfVwaPB/B/8MziK8FhEPt/0= +github.com/cskr/pubsub v1.0.2/go.mod h1:/8MzYXk/NJAz782G8RPkFzXTZVu63VotefPnR9TIRis= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= @@ -112,6 +131,8 @@ github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/ethereum/go-ethereum v1.13.15 h1:U7sSGYGo4SPjP6iNIifNoyIAiNjrmQkz6EwQG+/EZWo= github.com/ethereum/go-ethereum v1.13.15/go.mod h1:TN8ZiHrdJwSe8Cb6x+p0hs5CxhJZPbqB7hHkaUXcmIU= +github.com/fatih/color v1.14.1 h1:qfhVLaG5s+nCROl1zJsZRxFeYrHLqWroPOQ8BWiNb4w= +github.com/fatih/color v1.14.1/go.mod h1:2oHN61fhTpgcxD3TSWCgKDiH1+x4OiDVVGH8WlgGZGg= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fjl/memsize v0.0.2 h1:27txuSD9or+NZlnOWdKUxeBzTAUkWCVh+4Gf2dWFOzA= @@ -131,6 +152,10 @@ github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 h1:BAIP2Gihuqh github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46/go.mod h1:QNpY22eby74jVhqH4WhDLDwxc/vqsern6pW+u2kbkpc= github.com/getkin/kin-openapi v0.127.0 h1:Mghqi3Dhryf3F8vR370nN67pAERW+3a95vomb3MAREY= github.com/getkin/kin-openapi v0.127.0/go.mod h1:OZrfXzUfGrNbsKj+xmFBx6E5c6yH3At/tAKSc2UszXM= +github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps= +github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= +github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= +github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-fed/httpsig v1.1.0 h1:9M+hb0jkEICD8/cAiNqEB66R87tTINszBRTjwjQzWcI= github.com/go-fed/httpsig v1.1.0/go.mod h1:RCMrTZvN1bJYtofsG4rd5NaO5obxQ5xBkdiS7xsT7bM= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= @@ -176,6 +201,7 @@ github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1v github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/go-test/deep v1.0.8 h1:TDsG77qcSprGbC6vTN8OuXp5g+J+b5Pcguhf7Zt61VM= github.com/go-test/deep v1.0.8/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= +github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= @@ -211,16 +237,21 @@ github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= +github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k= github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grafana/pyroscope-go v1.2.0 h1:aILLKjTj8CS8f/24OPMGPewQSYlhmdQMBmol1d3KGj8= github.com/grafana/pyroscope-go v1.2.0/go.mod h1:2GHr28Nr05bg2pElS+dDsc98f3JTUh2f6Fz1hWXrqwk= github.com/grafana/pyroscope-go/godeltaprof v0.1.8 h1:iwOtYXeeVSAeYefJNaxDytgjKtUuKQbJqgAIjlnicKg= @@ -234,9 +265,19 @@ github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE= github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= +github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= +github.com/hashicorp/go-hclog v1.5.0 h1:bI2ocEMgcVlz55Oj1xZNBsVi900c7II+fWDyV9o+13c= +github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= +github.com/hashicorp/go-retryablehttp v0.7.5 h1:bJj+Pj19UZMIweq/iie+1u5YCdGrnxCT9yvm0e+Nd5M= +github.com/hashicorp/go-retryablehttp v0.7.5/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8= +github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= +github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru/arc/v2 v2.0.6 h1:4NU7uP5vSoK6TbaMj3NtY478TTAWLso/vL1gpNrInHg= +github.com/hashicorp/golang-lru/arc/v2 v2.0.6/go.mod h1:cfdDIX05DWvYV6/shsxDfa/OVcRieOt+q4FnM8x+Xno= github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= @@ -255,8 +296,79 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2 github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/invopop/yaml v0.3.1 h1:f0+ZpmhfBSS4MhG+4HYseMdJhoeeopbSKbq5Rpeelso= github.com/invopop/yaml v0.3.1/go.mod h1:PMOp3nn4/12yEZUFfmOuNHJsZToEEOwoWsT+D81KkeA= +github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs= +github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0= +github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA= +github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU= +github.com/ipfs/go-bitswap v0.11.0 h1:j1WVvhDX1yhG32NTC9xfxnqycqYIlhzEzLXG/cU1HyQ= +github.com/ipfs/go-bitswap v0.11.0/go.mod h1:05aE8H3XOU+LXpTedeAS0OZpcO1WFsj5niYQH9a1Tmk= +github.com/ipfs/go-block-format v0.2.0 h1:ZqrkxBA2ICbDRbK8KJs/u0O3dlp6gmAuuXUJNiW1Ycs= +github.com/ipfs/go-block-format v0.2.0/go.mod h1:+jpL11nFx5A/SPpsoBn6Bzkra/zaArfSmsknbPMYgzM= +github.com/ipfs/go-blockservice v0.5.2 h1:in9Bc+QcXwd1apOVM7Un9t8tixPKdaHQFdLSUM1Xgk8= +github.com/ipfs/go-blockservice v0.5.2/go.mod h1:VpMblFEqG67A/H2sHKAemeH9vlURVavlysbdUI632yk= +github.com/ipfs/go-bs-sqlite3 v0.0.0-20221122195556-bfcee1be620d h1:9V+GGXCuOfDiFpdAHz58q9mKLg447xp0cQKvqQrAwYE= +github.com/ipfs/go-bs-sqlite3 v0.0.0-20221122195556-bfcee1be620d/go.mod h1:pMbnFyNAGjryYCLCe59YDLRv/ujdN+zGJBT1umlvYRM= github.com/ipfs/go-cid v0.4.1 h1:A/T3qGvxi4kpKWWcPC/PgbvDA2bjVLO7n4UeVwnbs/s= github.com/ipfs/go-cid v0.4.1/go.mod h1:uQHwDeX4c6CtyrFwdqyhpNcxVewur1M7l7fNU7LKwZk= +github.com/ipfs/go-datastore v0.6.0 h1:JKyz+Gvz1QEZw0LsX1IBn+JFCJQH4SJVFtM4uWU0Myk= +github.com/ipfs/go-datastore v0.6.0/go.mod h1:rt5M3nNbSO/8q1t4LNkLyUwRs8HupMeN/8O4Vn9YAT8= +github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= +github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= +github.com/ipfs/go-ds-flatfs v0.5.1 h1:ZCIO/kQOS/PSh3vcF1H6a8fkRGS7pOfwfPdx4n/KJH4= +github.com/ipfs/go-ds-flatfs v0.5.1/go.mod h1:RWTV7oZD/yZYBKdbVIFXTX2fdY2Tbvl94NsWqmoyAX4= +github.com/ipfs/go-ipfs-blockstore v1.3.1 h1:cEI9ci7V0sRNivqaOr0elDsamxXFxJMMMy7PTTDQNsQ= +github.com/ipfs/go-ipfs-blockstore v1.3.1/go.mod h1:KgtZyc9fq+P2xJUiCAzbRdhhqJHvsw8u2Dlqy2MyRTE= +github.com/ipfs/go-ipfs-blocksutil v0.0.1 h1:Eh/H4pc1hsvhzsQoMEP3Bke/aW5P5rVM1IWFJMcGIPQ= +github.com/ipfs/go-ipfs-blocksutil v0.0.1/go.mod h1:Yq4M86uIOmxmGPUHv/uI7uKqZNtLb449gwKqXjIsnRk= +github.com/ipfs/go-ipfs-chunker v0.0.5 h1:ojCf7HV/m+uS2vhUGWcogIIxiO5ubl5O57Q7NapWLY8= +github.com/ipfs/go-ipfs-chunker v0.0.5/go.mod h1:jhgdF8vxRHycr00k13FM8Y0E+6BoalYeobXmUyTreP8= +github.com/ipfs/go-ipfs-delay v0.0.1 h1:r/UXYyRcddO6thwOnhiznIAiSvxMECGgtv35Xs1IeRQ= +github.com/ipfs/go-ipfs-delay v0.0.1/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= +github.com/ipfs/go-ipfs-ds-help v1.1.1 h1:B5UJOH52IbcfS56+Ul+sv8jnIV10lbjLF5eOO0C66Nw= +github.com/ipfs/go-ipfs-ds-help v1.1.1/go.mod h1:75vrVCkSdSFidJscs8n4W+77AtTpCIAdDGAwjitJMIo= +github.com/ipfs/go-ipfs-exchange-interface v0.2.1 h1:jMzo2VhLKSHbVe+mHNzYgs95n0+t0Q69GQ5WhRDZV/s= +github.com/ipfs/go-ipfs-exchange-interface v0.2.1/go.mod h1:MUsYn6rKbG6CTtsDp+lKJPmVt3ZrCViNyH3rfPGsZ2E= +github.com/ipfs/go-ipfs-exchange-offline v0.3.0 h1:c/Dg8GDPzixGd0MC8Jh6mjOwU57uYokgWRFidfvEkuA= +github.com/ipfs/go-ipfs-exchange-offline v0.3.0/go.mod h1:MOdJ9DChbb5u37M1IcbrRB02e++Z7521fMxqCNRrz9s= +github.com/ipfs/go-ipfs-pq v0.0.3 h1:YpoHVJB+jzK15mr/xsWC574tyDLkezVrDNeaalQBsTE= +github.com/ipfs/go-ipfs-pq v0.0.3/go.mod h1:btNw5hsHBpRcSSgZtiNm/SLj5gYIZ18AKtv3kERkRb4= +github.com/ipfs/go-ipfs-routing v0.3.0 h1:9W/W3N+g+y4ZDeffSgqhgo7BsBSJwPMcyssET9OWevc= +github.com/ipfs/go-ipfs-routing v0.3.0/go.mod h1:dKqtTFIql7e1zYsEuWLyuOU+E0WJWW8JjbTPLParDWo= +github.com/ipfs/go-ipfs-util v0.0.3 h1:2RFdGez6bu2ZlZdI+rWfIdbQb1KudQp3VGwPtdNCmE0= +github.com/ipfs/go-ipfs-util v0.0.3/go.mod h1:LHzG1a0Ig4G+iZ26UUOMjHd+lfM84LZCrn17xAKWBvs= +github.com/ipfs/go-ipld-cbor v0.1.0 h1:dx0nS0kILVivGhfWuB6dUpMa/LAwElHPw1yOGYopoYs= +github.com/ipfs/go-ipld-cbor v0.1.0/go.mod h1:U2aYlmVrJr2wsUBU67K4KgepApSZddGRDWBYR0H4sCk= +github.com/ipfs/go-ipld-format v0.6.0 h1:VEJlA2kQ3LqFSIm5Vu6eIlSxD/Ze90xtc4Meten1F5U= +github.com/ipfs/go-ipld-format v0.6.0/go.mod h1:g4QVMTn3marU3qXchwjpKPKgJv+zF+OlaKMyhJ4LHPg= +github.com/ipfs/go-ipld-legacy v0.2.1 h1:mDFtrBpmU7b//LzLSypVrXsD8QxkEWxu5qVxN99/+tk= +github.com/ipfs/go-ipld-legacy v0.2.1/go.mod h1:782MOUghNzMO2DER0FlBR94mllfdCJCkTtDtPM51otM= +github.com/ipfs/go-libipfs v0.7.0 h1:Mi54WJTODaOL2/ZSm5loi3SwI3jI2OuFWUrQIkJ5cpM= +github.com/ipfs/go-libipfs v0.7.0/go.mod h1:KsIf/03CqhICzyRGyGo68tooiBE2iFbI/rXW7FhAYr0= +github.com/ipfs/go-log v1.0.5 h1:2dOuUCB1Z7uoczMWgAyDck5JLb72zHzrMnGnCNNbvY8= +github.com/ipfs/go-log v1.0.5/go.mod h1:j0b8ZoR+7+R99LD9jZ6+AJsrzkPbSXbZfGakb5JPtIo= +github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Axpmri6g= +github.com/ipfs/go-log/v2 v2.5.1 h1:1XdUzF7048prq4aBjDQQ4SL5RxftpRGdXhNRwKSAlcY= +github.com/ipfs/go-log/v2 v2.5.1/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI= +github.com/ipfs/go-merkledag v0.11.0 h1:DgzwK5hprESOzS4O1t/wi6JDpyVQdvm9Bs59N/jqfBY= +github.com/ipfs/go-merkledag v0.11.0/go.mod h1:Q4f/1ezvBiJV0YCIXvt51W/9/kqJGH4I1LsA7+djsM4= +github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fGD6n0jO4kdg= +github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY= +github.com/ipfs/go-peertaskqueue v0.8.1 h1:YhxAs1+wxb5jk7RvS0LHdyiILpNmRIRnZVztekOF0pg= +github.com/ipfs/go-peertaskqueue v0.8.1/go.mod h1:Oxxd3eaK279FxeydSPPVGHzbwVeHjatZ2GA8XD+KbPU= +github.com/ipfs/go-unixfsnode v1.8.0 h1:yCkakzuE365glu+YkgzZt6p38CSVEBPgngL9ZkfnyQU= +github.com/ipfs/go-unixfsnode v1.8.0/go.mod h1:HxRu9HYHOjK6HUqFBAi++7DVoWAHn0o4v/nZ/VA+0g8= +github.com/ipfs/go-verifcid v0.0.3 h1:gmRKccqhWDocCRkC+a59g5QW7uJw5bpX9HWBevXa0zs= +github.com/ipfs/go-verifcid v0.0.3/go.mod h1:gcCtGniVzelKrbk9ooUSX/pM3xlH73fZZJDzQJRvOUw= +github.com/ipld/go-car v0.6.2 h1:Hlnl3Awgnq8icK+ze3iRghk805lu8YNq3wlREDTF2qc= +github.com/ipld/go-car v0.6.2/go.mod h1:oEGXdwp6bmxJCZ+rARSkDliTeYnVzv3++eXajZ+Bmr8= +github.com/ipld/go-car/v2 v2.13.1 h1:KnlrKvEPEzr5IZHKTXLAEub+tPrzeAFQVRlSQvuxBO4= +github.com/ipld/go-car/v2 v2.13.1/go.mod h1:QkdjjFNGit2GIkpQ953KBwowuoukoM75nP/JI1iDJdo= +github.com/ipld/go-codec-dagpb v1.6.0 h1:9nYazfyu9B1p3NAgfVdpRco3Fs2nFC72DqVsMj6rOcc= +github.com/ipld/go-codec-dagpb v1.6.0/go.mod h1:ANzFhfP2uMJxRBr8CE+WQWs5UsNa0pYtmKZ+agnUw9s= +github.com/ipld/go-ipld-prime v0.21.0 h1:n4JmcpOlPDIxBcY037SVfpd1G+Sj1nKZah0m6QH9C2E= +github.com/ipld/go-ipld-prime v0.21.0/go.mod h1:3RLqy//ERg/y5oShXXdx5YIp50cFGOanyMctpPjsvxQ= +github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20230102063945-1a409dc236dd h1:gMlw/MhNr2Wtp5RwGdsW23cs+yCuj9k2ON7i9MiJlRo= +github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20230102063945-1a409dc236dd/go.mod h1:wZ8hH8UxeryOs4kJEJaiui/s00hDSbE37OKsL47g+Sw= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= @@ -269,6 +381,9 @@ github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7Bd github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jaytaylor/html2text v0.0.0-20230321000545-74c2419ad056 h1:iCHtR9CQyktQ5+f3dMVZfwD2KWJUgm7M0gdL9NGr8KA= github.com/jaytaylor/html2text v0.0.0-20230321000545-74c2419ad056/go.mod h1:CVKlgaMiht+LXvHG173ujK6JUhZXKb2u/BQtjPDIvyk= +github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= +github.com/jbenet/goprocess v0.1.4 h1:DRGOFReOMqqDNXwW70QkacFW0YN9QnwLV0Vqk+3oU0o= +github.com/jbenet/goprocess v0.1.4/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= @@ -278,13 +393,17 @@ github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8Hm github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d/go.mod h1:2PavIy+JPciBPrBUjwbNvtwB6RQlve+hkpll6QSNmOE= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= -github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg= -github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= +github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/koron/go-ssdp v0.0.3 h1:JivLMY45N76b4p/vsWGOKewBQu6uf39y8l+AQ7sDKx8= +github.com/koron/go-ssdp v0.0.3/go.mod h1:b2MxI6yh02pKrsyNoQUsk4+YNikaGhe4894J+Q5lDvA= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= @@ -304,6 +423,24 @@ github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= +github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= +github.com/libp2p/go-cidranger v1.1.0 h1:ewPN8EZ0dd1LSnrtuwd4709PXVcITVeuwbag38yPW7c= +github.com/libp2p/go-cidranger v1.1.0/go.mod h1:KWZTfSr+r9qEo9OkI9/SIEeAtw+NNoU0dXIXt15Okic= +github.com/libp2p/go-libp2p v0.25.1 h1:YK+YDCHpYyTvitKWVxa5PfElgIpOONU01X5UcLEwJGA= +github.com/libp2p/go-libp2p v0.25.1/go.mod h1:xnK9/1d9+jeQCVvi/f1g12KqtVi/jP/SijtKV1hML3g= +github.com/libp2p/go-libp2p-asn-util v0.2.0 h1:rg3+Os8jbnO5DxkC7K/Utdi+DkY3q/d1/1q+8WeNAsw= +github.com/libp2p/go-libp2p-asn-util v0.2.0/go.mod h1:WoaWxbHKBymSN41hWSq/lGKJEca7TNm58+gGJi2WsLI= +github.com/libp2p/go-libp2p-record v0.2.0 h1:oiNUOCWno2BFuxt3my4i1frNrt7PerzB3queqa1NkQ0= +github.com/libp2p/go-libp2p-record v0.2.0/go.mod h1:I+3zMkvvg5m2OcSdoL0KPljyJyvNDFGKX7QdlpYUcwk= +github.com/libp2p/go-libp2p-testing v0.12.0 h1:EPvBb4kKMWO29qP4mZGyhVzUyR25dvfUIK5WDu6iPUA= +github.com/libp2p/go-libp2p-testing v0.12.0/go.mod h1:KcGDRXyN7sQCllucn1cOOS+Dmm7ujhfEyXQL5lvkcPg= +github.com/libp2p/go-msgio v0.3.0 h1:mf3Z8B1xcFN314sWX+2vOTShIE0Mmn2TXn3YCUQGNj0= +github.com/libp2p/go-msgio v0.3.0/go.mod h1:nyRM819GmVaF9LX3l03RMh10QdOroF++NBbxAb0mmDM= +github.com/libp2p/go-nat v0.1.0 h1:MfVsH6DLcpa04Xr+p8hmVRG4juse0s3J8HyNWYHffXg= +github.com/libp2p/go-nat v0.1.0/go.mod h1:X7teVkwRHNInVNWQiO/tAiAVRwSr5zoRz4YSTC3uRBM= +github.com/libp2p/go-netroute v0.2.1 h1:V8kVrpD8GK0Riv15/7VN6RbUQ3URNZVosw7H2v9tksU= +github.com/libp2p/go-netroute v0.2.1/go.mod h1:hraioZr0fhBjG0ZRXJJ6Zj2IVEVNx6tDTFQfSmcq7mQ= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= @@ -312,14 +449,20 @@ github.com/matryer/is v1.4.1 h1:55ehd8zaGABKLXQUe2awZ99BD/PTc2ls+KV/dXphgEQ= github.com/matryer/is v1.4.1/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= 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.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= 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-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +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/mfridman/interpolate v0.0.2 h1:pnuTK7MQIxxFz1Gr+rjSIx9u7qVjf5VOoM/u6BbAxPY= github.com/mfridman/interpolate v0.0.2/go.mod h1:p+7uk6oE07mpE/Ik1b8EckO0O4ZXiGAfshKBWLUM9Xg= +github.com/miekg/dns v1.1.50 h1:DQUfb9uc6smULcREF09Uc+/Gd46YWqJd5DbpPE9xkcA= +github.com/miekg/dns v1.1.50/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME= github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM= github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= @@ -348,12 +491,20 @@ github.com/multiformats/go-base32 v0.1.0 h1:pVx9xoSPqEIQG8o+UbAe7DNi51oej1NtK+aG github.com/multiformats/go-base32 v0.1.0/go.mod h1:Kj3tFY6zNr+ABYMqeUNeGvkIC/UYgtWibDcT0rExnbI= github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9rQyccr0= github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4= +github.com/multiformats/go-multiaddr v0.8.0 h1:aqjksEcqK+iD/Foe1RRFsGZh8+XFiGo7FgUCZlpv3LU= +github.com/multiformats/go-multiaddr v0.8.0/go.mod h1:Fs50eBDWvZu+l3/9S6xAE7ZYj6yhxlvaVZjakWN7xRs= +github.com/multiformats/go-multiaddr-dns v0.3.1 h1:QgQgR+LQVt3NPTjbrLLpsaT2ufAA2y0Mkk+QRVJbW3A= +github.com/multiformats/go-multiaddr-dns v0.3.1/go.mod h1:G/245BRQ6FJGmryJCrOuTdB37AMA5AMOVuO6NY3JwTk= +github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E= +github.com/multiformats/go-multiaddr-fmt v0.1.0/go.mod h1:hGtDIW4PU4BqJ50gW2quDuPVjyWNZxToGUh/HwTZYJo= github.com/multiformats/go-multibase v0.2.0 h1:isdYCVLvksgWlMW9OZRYJEa9pZETFivncJHmHnnd87g= github.com/multiformats/go-multibase v0.2.0/go.mod h1:bFBZX4lKCA/2lyOFSAoKH5SS6oPyjtnzK/XTFDPkNuk= github.com/multiformats/go-multicodec v0.9.0 h1:pb/dlPnzee/Sxv/j4PmkDRxCOi3hXTz3IbPKOXWJkmg= github.com/multiformats/go-multicodec v0.9.0/go.mod h1:L3QTQvMIaVBkXOXXtVmYE+LI16i14xuaojr/H7Ai54k= github.com/multiformats/go-multihash v0.2.3 h1:7Lyc8XfX/IY2jWb/gI7JP+o7JEq9hOa7BFvVU9RSh+U= github.com/multiformats/go-multihash v0.2.3/go.mod h1:dXgKXCXjBzdscBLk9JkjINiEsCKRVch90MdaGiKsvSM= +github.com/multiformats/go-multistream v0.4.1 h1:rFy0Iiyn3YT0asivDUIR05leAdwZq3de4741sbiSdfo= +github.com/multiformats/go-multistream v0.4.1/go.mod h1:Mz5eykRVAjJWckE2U78c6xqdtyNUEhKSM0Lwar2p77Q= github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/nEGOHFS8= github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= @@ -393,6 +544,8 @@ github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQ github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= github.com/opencontainers/runc v1.1.12 h1:BOIssBaW1La0/qbNZHXOOa71dZfZEQOzW7dqQf3phss= github.com/opencontainers/runc v1.1.12/go.mod h1:S+lQwSfncpBha7XTy/5lBwWgm5+y5Ma/O44Ekby9FK8= +github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= +github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= github.com/orlangure/gnomock v0.31.0 h1:dgjlQ8DYUPMyNwMZJuYBH+/GF+e7h3sloldPzIJF4k4= github.com/orlangure/gnomock v0.31.0/go.mod h1:RagxeYv3bKi+li9Lio2Faw5t6Mcy4akkeqXzkgAS3w0= github.com/ory/dockertest/v3 v3.10.0 h1:4K3z2VMe8Woe++invjaTB7VRyQXQy5UY+loujO4aNE4= @@ -401,14 +554,21 @@ github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6 github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= github.com/perimeterx/marshmallow v1.1.5 h1:a2LALqQ1BlHM8PZblsDdidgv1mWi1DgC2UmX50IvK2s= github.com/perimeterx/marshmallow v1.1.5/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0Vchtcl8we9tYaXw= +github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 h1:1/WtZae0yGtPq+TI6+Tv1WTxkukpXeMlviSxvL7SRgk= +github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9/go.mod h1:x3N5drFsm2uilKKuuYo6LdyD8vZAW55sH/9w+pbo1sw= github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= +github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/polydawn/refmt v0.89.1-0.20221221234430-40501e09de1f h1:VXTQfuJj9vKR4TCkEuWIckKvdHFeJH/huIFJ9/cXOB0= +github.com/polydawn/refmt v0.89.1-0.20221221234430-40501e09de1f/go.mod h1:/zvteZs/GwLtCgZ4BL6CBsk9IKIlexP43ObX9AxTqTw= github.com/pressly/goose/v3 v3.23.0 h1:57hqKos8izGek4v6D5+OXBa+Y4Rq8MU//+MmnevdpVA= github.com/pressly/goose/v3 v3.23.0/go.mod h1:rpx+D9GX/+stXmzKa+uh1DkjPnNVMdiOCV9iLdle4N8= github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y= @@ -427,19 +587,39 @@ github.com/redis/rueidis/mock v1.0.51 h1:XK9Ud2sgBiex8g3lT1y0PI/NQdzn2uTLRwsJ9ez github.com/redis/rueidis/mock v1.0.51/go.mod h1:6zsMgZ+q1EWPgGOstCtUgll1tcz7Pj6gAvl3/R9mKkU= github.com/redis/rueidis/rueidiscompat v1.0.51 h1:QGYtutavVacfgyl8/LvcrhKAj+sRRuvE+p634lKdV4I= github.com/redis/rueidis/rueidiscompat v1.0.51/go.mod h1:MAq/1yVbfrkyCFVSUAZeCK/hjlHZ1aN3oZCAy71AlE8= +github.com/reiver/go-atproto v0.0.0-20240906195827-a1832b0df821 h1:s2ColkXw5LNaS8/eHB7O46NQYyv+DOghr25u3ukEa5g= +github.com/reiver/go-atproto v0.0.0-20240906195827-a1832b0df821/go.mod h1:S/pf34se76GMYmdBXumZLenxGYgunVNLJkW6OQEXt9w= +github.com/reiver/go-bsky v0.0.0-20240906205655-8c7fadb4f3bb h1:ZgOhXYuF5y3Hzhm9I5vc+LNd0um1Lz4v9fn64mt9PJA= +github.com/reiver/go-bsky v0.0.0-20240906205655-8c7fadb4f3bb/go.mod h1:KEO2yVqtN2ZQQ7AgncGVyKZpa9jXEmNOuYXzbz564f0= +github.com/reiver/go-cast v0.0.0-20240904124821-be0103637c3f h1:+xhln673LL2XG1qhsUG1e+HHdXm/lTWihmr5G815dMc= +github.com/reiver/go-cast v0.0.0-20240904124821-be0103637c3f/go.mod h1:baMIic1VWx4m5MRviwSyHFx1Z6POGMRrnVgsMvsLlAA= +github.com/reiver/go-erorr v0.0.0-20240801233437-8cbde6d1fa3f h1:D1QSxKHm8U73XhjsW3SFLkT0zT5pKJi+1KGboMhY1Rk= +github.com/reiver/go-erorr v0.0.0-20240801233437-8cbde6d1fa3f/go.mod h1:F0HbBf+Ak2ZlE8YkDW4Y+KxaUmT0KaaIJK6CXY3cJxE= +github.com/reiver/go-fallback v0.0.0-20240906145154-1ce9eadf06a8 h1:JKZHV9WPzSfaPhJswlyQk45hmxbPwKmBximAyysPKbs= +github.com/reiver/go-fallback v0.0.0-20240906145154-1ce9eadf06a8/go.mod h1:IAg7rGvnbzlTrK4W+pBJcq2XEhrWf+DxYl/fGN/qbj4= +github.com/reiver/go-maps v0.0.0-20240906190342-93be57f28be1 h1:5fRVUeCqPN8G8phNmd1G0Pu7g35sojAQBnIvZ8C+s8c= +github.com/reiver/go-maps v0.0.0-20240906190342-93be57f28be1/go.mod h1:dMbnpn0BuIGwSFlCUSTYPDP3nDt2pSe6qP5vfbV1kBE= +github.com/reiver/go-reg v0.0.0-20240906195701-6e62f43c2835 h1:i2IO8hx0TbgPeZ5Gcu+Prkzkm6T+cBxd1lnALdCoM/c= +github.com/reiver/go-reg v0.0.0-20240906195701-6e62f43c2835/go.mod h1:P4MhBoVQLOdhisU6M3f2DvbbNBueHw3Y+n4V/Q7xX9Q= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rss3-network/protocol-go v0.5.14 h1:gd6ciwXb5e4xx1dmAOAIKWbpami2QbARqE61zbwT6KE= github.com/rss3-network/protocol-go v0.5.14/go.mod h1:npcyduWt86uVbIi77xQaYk8eqltI9XNjk1FMGpjyIq0= +github.com/rss3-network/protocol-go v0.5.16 h1:14AOjsHMnuEqEHPmBo4A8sdGXPbwMNGKKJoGk1fXunk= +github.com/rss3-network/protocol-go v0.5.16/go.mod h1:AOVaY0++55lryy3GeQG//EkPuVFqxNQoPa0VdGbmtx0= github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= @@ -448,6 +628,7 @@ github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6g github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= github.com/samber/lo v1.47.0 h1:z7RynLwP5nbyRscyvcD043DWYoOcYRv3mV8lBeqOCLc= github.com/samber/lo v1.47.0/go.mod h1:RmDH9Ct32Qy3gduHQuKJ3gW1fMHAnE/fAzQuf6He5cU= +github.com/scylladb/termtables v0.0.0-20191203121021-c4c0b6d42ff4/go.mod h1:C1a7PQSMz9NShzorzCiG2fk9+xuCgLkPeCvMHYR2OWg= github.com/sebdah/goldie/v2 v2.5.3 h1:9ES/mNN+HNUbNWpVAlrzuZ7jE+Nrczbj8uFRjM7624Y= github.com/sebdah/goldie/v2 v2.5.3/go.mod h1:oZ9fp0+se1eapSRjfYbsV/0Hqhbuu3bJVvKI/NNtssI= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= @@ -460,8 +641,13 @@ github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKl github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k= github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/smartystreets/assertions v1.2.0 h1:42S6lae5dvLc7BrLu/0ugRtcFVjoJNMC/N3yZFZkDFs= +github.com/smartystreets/assertions v1.2.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo= +github.com/smartystreets/goconvey v1.7.2 h1:9RBaZCeXEQ3UselpuwUQHltGVXvdwm6cv1hgR6gDIPg= +github.com/smartystreets/goconvey v1.7.2/go.mod h1:Vw0tHAZW6lzCRk3xgdin6fKYcG+G3Pg9vgXWeJpQFMM= github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= @@ -488,6 +674,7 @@ github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSS github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= @@ -535,7 +722,8 @@ github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2n github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= -github.com/urfave/cli v1.22.1 h1:+mkCCcOFKPnCmVYVcURKps1Xe+3zP90gSYGNfRkjoIY= +github.com/urfave/cli v1.22.10 h1:p8Fspmz3iTctJstry1PYS3HVdllxnEzTEsgIgtxTrCk= +github.com/urfave/cli v1.22.10/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= @@ -548,6 +736,16 @@ github.com/vincent-petithory/dataurl v1.0.0 h1:cXw+kPto8NLuJtlMsI152irrVw9fRDX8A github.com/vincent-petithory/dataurl v1.0.0/go.mod h1:FHafX5vmDzyP+1CQATJn7WFKc9CvnvxyvZy6I1MrG/U= github.com/vmware-labs/yaml-jsonpath v0.3.2 h1:/5QKeCBGdsInyDCyVNLbXyilb61MXGi9NP674f9Hobk= github.com/vmware-labs/yaml-jsonpath v0.3.2/go.mod h1:U6whw1z03QyqgWdgXxvVnQ90zN1BWz5V+51Ewf8k+rQ= +github.com/warpfork/go-testmark v0.12.1 h1:rMgCpJfwy1sJ50x0M0NgyphxYYPMOODIJHhsXyEHU0s= +github.com/warpfork/go-testmark v0.12.1/go.mod h1:kHwy7wfvGSPh1rQJYKayD4AbtNaeyZdcGi9tNJTaa5Y= +github.com/warpfork/go-wish v0.0.0-20220906213052-39a1cc7a02d0 h1:GDDkbFiaK8jsSDJfjId/PEGEShv6ugrt4kYsC5UIDaQ= +github.com/warpfork/go-wish v0.0.0-20220906213052-39a1cc7a02d0/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= +github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11 h1:5HZfQkwe0mIfyDmc1Em5GqlNRzcdtlv4HTNmdpt7XH0= +github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11/go.mod h1:Wlo/SzPmxVp6vXpGt/zaXhHH0fn4IxgqZc82aKg6bpQ= +github.com/whyrusleeping/cbor-gen v0.2.1-0.20241030202151-b7a6831be65e h1:28X54ciEwwUxyHn9yrZfl5ojgF4CBNLWX7LR0rvBkf4= +github.com/whyrusleeping/cbor-gen v0.2.1-0.20241030202151-b7a6831be65e/go.mod h1:pM99HXyEbSQHcosHc0iW7YFmwnscr+t9Te4ibko05so= +github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f h1:jQa4QT2UP9WYv2nzyawpKMOCl+Z/jW7djv2/J50lj9E= +github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f/go.mod h1:p9UJB6dDgdPgMJZs7UjUOdulKyRr9fqkS+6JKAInPy8= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= @@ -565,6 +763,10 @@ github.com/yuin/goldmark v1.7.1 h1:3bajkSilaCbjdKVsKdZjZCLBNPL9pYzrCakKaf4U49U= github.com/yuin/goldmark v1.7.1/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +gitlab.com/yawning/secp256k1-voi v0.0.0-20230925100816-f2616030848b h1:CzigHMRySiX3drau9C6Q5CAbNIApmLdat5jPMqChvDA= +gitlab.com/yawning/secp256k1-voi v0.0.0-20230925100816-f2616030848b/go.mod h1:/y/V339mxv2sZmYYR64O07VuCpdNZqCTwO8ZcouTMI8= +gitlab.com/yawning/tuplehash v0.0.0-20230713102510-df83abbf9a02 h1:qwDnMxjkyLmAFgcfgTnfJrmYKWhHnci3GjDqcZp1M3Q= +gitlab.com/yawning/tuplehash v0.0.0-20230713102510-df83abbf9a02/go.mod h1:JTnUj0mpYiAsuZLmKjTx/ex3AtMowcCgnE7YNyCEP0I= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.50.0 h1:cEPbyTSEHlQR89XVlyo78gqluF8Y3oMeBkXGWzQsfXY= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.50.0/go.mod h1:DKdbWcT4GH1D0Y3Sqt/PFXt2naRKDWtU+eE6oLdFNA8= go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= @@ -587,20 +789,29 @@ go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQD go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= +go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU= go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= +go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= +go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= @@ -612,6 +823,7 @@ golang.org/x/crypto v0.29.0/go.mod h1:+F4F4N5hv6v38hfeYwTdx20oUvLLc+QfrE9Ax9HtgR golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8= golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= @@ -672,6 +884,7 @@ golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -714,6 +927,10 @@ golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= @@ -727,6 +944,8 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 h1:M0KvPgPmDZHPlbRbaNU1APr28TvwvvdUPlSv7PUvy8g= google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:dguCy7UOdZhTvLzDyt15+rOrawrpM4q7DD9dQ1P11P4= google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 h1:XVhgTWWV3kGQlwJHR3upFWZeTsei6Oks1apkZSeonIE= @@ -748,6 +967,7 @@ gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= @@ -769,11 +989,14 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gorm.io/driver/postgres v1.5.10 h1:7Lggqempgy496c0WfHXsYWxk3Th+ZcW66/21QhVFdeE= gorm.io/driver/postgres v1.5.10/go.mod h1:DX3GReXH+3FPWGrrgffdvCk3DQ1dwDPdmbenSkweRGI= +gorm.io/driver/sqlite v1.5.5 h1:7MDMtUZhV065SilG62E0MquljeArQZNfJnjd9i9gx3E= +gorm.io/driver/sqlite v1.5.5/go.mod h1:6NgQ7sQWAIFsPrJJl1lSNSu2TABh0ZZ/zm5fosATavE= gorm.io/gorm v1.23.6/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= gorm.io/gorm v1.25.12 h1:I0u8i2hWQItBq1WfE0o2+WuL9+8L21K9e2HHSTE/0f8= gorm.io/gorm v1.25.12/go.mod h1:xh7N7RHfYlNc5EmcI/El95gXusucDrQnHXe0+CgWcLQ= gotest.tools/v3 v3.3.0 h1:MfDY1b1/0xN1CyMlQDac0ziEy9zJQd9CXBRRDHw2jJo= gotest.tools/v3 v3.3.0/go.mod h1:Mcr9QNxkg0uMvy/YElmo4SpXgJKWgQvYrT7Kw5RzJ1A= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= lukechampine.com/blake3 v1.2.1 h1:YuqqRuaqsGV71BV/nm9xlI0MKUv4QC54jQnBChWbGnI= lukechampine.com/blake3 v1.2.1/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k= modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 h1:5D53IMaUuA5InSeMu9eJtlQXS2NxAhyWQvkKEgXZhHI= diff --git a/internal/engine/protocol/atproto/data_source.go b/internal/engine/protocol/atproto/data_source.go index 56800afa4..336f270b0 100644 --- a/internal/engine/protocol/atproto/data_source.go +++ b/internal/engine/protocol/atproto/data_source.go @@ -123,7 +123,7 @@ func (s *dataSource) pollSubscribeRepos(ctx context.Context, tasksChan chan<- *e sched := sequential.NewScheduler("myfirehose", rsc.EventHandler) - if err = events.HandleRepoStream(context.Background(), conn, sched); err != nil { + if err = events.HandleRepoStream(context.Background(), conn, sched, nil); err != nil { zap.L().Error("handle repo stream failed", zap.Error(err)) return fmt.Errorf("handle repo stream failed: %w", err) From 8c85d8857a76942643e05a97448cb91e80ac3e0b Mon Sep 17 00:00:00 2001 From: polebug Date: Fri, 6 Dec 2024 18:28:59 +0800 Subject: [PATCH 17/31] chore: handle error --- provider/atproto/bluesky/client.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/provider/atproto/bluesky/client.go b/provider/atproto/bluesky/client.go index 305fab6ab..522eddd2e 100644 --- a/provider/atproto/bluesky/client.go +++ b/provider/atproto/bluesky/client.go @@ -174,10 +174,10 @@ func (c *Client) ParseCARList(ctx context.Context, did syntax.DID, handle string recList := make([]*at.Message, 0) - errorGroup, _ := errgroup.WithContext(ctx) + errorGroup, errorCtx := errgroup.WithContext(ctx) // Iterate over all records - _ = r.ForEach(ctx, "", func(path string, _ cid.Cid) error { + _ = r.ForEach(errorCtx, "", func(path string, _ cid.Cid) error { errorGroup.Go(func() error { zap.L().Debug("processing record", zap.String("path", path)) @@ -209,7 +209,7 @@ func (c *Client) ParseCARList(ctx context.Context, did syntax.DID, handle string if err != nil { zap.L().Error("parse record failed", zap.Error(err)) - return nil + return err } if isValid { From cf9e0cdd8bf21fc6b4fef56f5b05532f233f0538 Mon Sep 17 00:00:00 2001 From: polebug Date: Tue, 10 Dec 2024 09:14:31 +0800 Subject: [PATCH 18/31] feat(component): add atproto handler and docs --- docs/api.yaml | 7 +- docs/generated.go | 403 ++++++++++-------- docs/parameters/path_account_atproto.yaml | 9 + docs/parameters/query_platform_atproto.yaml | 9 + docs/path/atproto/account.yaml | 30 ++ docs/responses/AtprotoActivitiesResponse.yaml | 16 + docs/responses/AtprotoActivityResponse.yaml | 10 + docs/schemas/AtprotoAccount.yaml | 3 + docs/schemas/AtprotoAction.yaml | 21 + docs/schemas/AtprotoActivity.yaml | 60 +++ docs/schemas/AtprotoPlatform.yaml | 8 + internal/database/client.go | 1 - internal/database/dialer/postgres/client.go | 8 - .../dialer/postgres/client_partitioned.go | 229 ---------- internal/database/model/activity.go | 23 +- .../engine/protocol/atproto/data_source.go | 2 +- .../node/component/aggregator/compoent.go | 8 + internal/node/component/atproto/component.go | 124 ++++++ internal/node/component/atproto/data.go | 71 +++ .../component/atproto/handler_activity.go | 121 ++++++ .../component/atproto/transformer_activity.go | 39 ++ .../atproto/transformer_social_type.go | 82 ++++ .../decentralized/handler_activity.go | 8 +- .../decentralized/handler_network_activity.go | 5 +- .../handler_platform_activity.go | 2 +- internal/node/component/federated/data.go | 4 +- .../component/federated/handler_activity.go | 13 +- .../federated/handler_network_activity.go | 7 +- .../federated/handler_platform_activity.go | 4 +- internal/node/node.go | 13 + provider/atproto/bluesky/client.go | 36 +- 31 files changed, 927 insertions(+), 449 deletions(-) create mode 100644 docs/parameters/path_account_atproto.yaml create mode 100644 docs/parameters/query_platform_atproto.yaml create mode 100644 docs/path/atproto/account.yaml create mode 100644 docs/responses/AtprotoActivitiesResponse.yaml create mode 100644 docs/responses/AtprotoActivityResponse.yaml create mode 100644 docs/schemas/AtprotoAccount.yaml create mode 100644 docs/schemas/AtprotoAction.yaml create mode 100644 docs/schemas/AtprotoActivity.yaml create mode 100644 docs/schemas/AtprotoPlatform.yaml create mode 100644 internal/node/component/atproto/component.go create mode 100644 internal/node/component/atproto/data.go create mode 100644 internal/node/component/atproto/handler_activity.go create mode 100644 internal/node/component/atproto/transformer_activity.go create mode 100644 internal/node/component/atproto/transformer_social_type.go diff --git a/docs/api.yaml b/docs/api.yaml index c8cfcde20..49fbe1e43 100644 --- a/docs/api.yaml +++ b/docs/api.yaml @@ -7,7 +7,7 @@ info: name: MIT url: https://opensource.org/licenses/MIT servers: - - url: http://localhost:8080 + - url: http://localhost description: Local development server tags: - name: RSS @@ -16,6 +16,8 @@ tags: description: Retrieve the details of decentralized activities. - name: Federated description: Retrieve the details of federated activities. + - name: Atproto + description: Retrieve the details of atproto activities. paths: /decentralized/tx/{id}: $ref: "./path/decentralized/tx.yaml" @@ -39,6 +41,9 @@ paths: /federated/platform/{platform}: $ref: "./path/federated/platform.yaml" + /atproto/{account}: + $ref: "./path/atproto/account.yaml" + # Rss route /rss/{path}: $ref: "./path/rss.yaml" diff --git a/docs/generated.go b/docs/generated.go index 945c1dc41..078d613ed 100644 --- a/docs/generated.go +++ b/docs/generated.go @@ -16,6 +16,7 @@ import ( "github.com/getkin/kin-openapi/openapi3" "github.com/labstack/echo/v4" "github.com/oapi-codegen/runtime" + "github.com/rss3-network/node/schema/worker/atproto" "github.com/rss3-network/node/schema/worker/decentralized" "github.com/rss3-network/node/schema/worker/federated" "github.com/rss3-network/protocol-go/schema" @@ -28,6 +29,42 @@ const ( BearerAuthScopes = "bearerAuth.Scopes" ) +// GetAtprotoAccountParams defines parameters for GetAtprotoAccount. +type GetAtprotoAccountParams struct { + // Limit Specify the number of activities to retrieve. + Limit int `query:"limit,omitempty" default:"20" json:"limit,omitempty"` + + // ActionLimit Specify the number of actions within the activity to retrieve. + ActionLimit int `query:"action_limit,omitempty" default:"10" json:"action_limit,omitempty"` + + // Cursor Specify the cursor used for pagination. + Cursor *string `query:"cursor,omitempty" json:"cursor,omitempty"` + + // SinceTimestamp Retrieve activities starting from this timestamp. + SinceTimestamp *uint64 `query:"since_timestamp,omitempty" json:"since_timestamp,omitempty"` + + // UntilTimestamp Retrieve activities up to this timestamp. + UntilTimestamp *uint64 `query:"until_timestamp,omitempty" json:"until_timestamp,omitempty"` + + // Status Retrieve activities based on success status. + Status *bool `query:"success,omitempty" json:"success,omitempty"` + + // Direction Retrieve activities based on direction. + Direction *activityx.Direction `query:"direction,omitempty" json:"direction,omitempty"` + + // Network Retrieve activities from the specified network(s). + Network []network.Network `query:"network,omitempty" json:"network,omitempty"` + + // Tag Retrieve activities for the specified tag(s). + Tag []tag.Tag `query:"tag,omitempty" json:"tag,omitempty"` + + // Type Retrieve activities for the specified type(s). + Type []schema.Type `query:"type,omitempty" json:"type,omitempty"` + + // Platform Retrieve activities from the specified platform(s). + Platform []atproto.Platform `query:"platform,omitempty" json:"platform,omitempty"` +} + // PostDecentralizedAccountsJSONBody defines parameters for PostDecentralizedAccounts. type PostDecentralizedAccountsJSONBody struct { Accounts []string `json:"accounts,omitempty"` @@ -328,6 +365,9 @@ type ServerInterface interface { // Get Node Activity Count // (GET /activity_count) GetActivityCount(ctx echo.Context) error + // Get Account Activities + // (GET /atproto/{account}) + GetAtprotoAccount(ctx echo.Context, account string, params GetAtprotoAccountParams) error // Batch Get Accounts Activities // (POST /decentralized/accounts) PostDecentralizedAccounts(ctx echo.Context) error @@ -395,6 +435,30 @@ func (w *ServerInterfaceWrapper) GetActivityCount(ctx echo.Context) error { return err } +// GetAtprotoAccount converts echo context to params. +func (w *ServerInterfaceWrapper) GetAtprotoAccount(ctx echo.Context) error { + var err error + // ------------- Path parameter "account" ------------- + var account string + + err = runtime.BindStyledParameterWithOptions("simple", "account", ctx.Param("account"), &account, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter account: %s", err)) + } + + ctx.Set(BearerAuthScopes, []string{}) + + var params GetAtprotoAccountParams + + if err := ctx.Bind(¶ms); err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter: %s", err)) + } + + // Invoke the callback with all the unmarshaled arguments + err = w.Handler.GetAtprotoAccount(ctx, account, params) + return err +} + // PostDecentralizedAccounts converts echo context to params. func (w *ServerInterfaceWrapper) PostDecentralizedAccounts(ctx echo.Context) error { var err error @@ -1114,6 +1178,7 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL router.GET(baseURL+"/", wrapper.GetNodeOperatorInfo) router.GET(baseURL+"/activity_count", wrapper.GetActivityCount) + router.GET(baseURL+"/atproto/:account", wrapper.GetAtprotoAccount) router.POST(baseURL+"/decentralized/accounts", wrapper.PostDecentralizedAccounts) router.GET(baseURL+"/decentralized/network/:network", wrapper.GetDecentralizedNetwork) router.GET(baseURL+"/decentralized/platform/:platform", wrapper.GetDecentralizedPlatform) @@ -1134,172 +1199,178 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/docs/parameters/path_account_atproto.yaml b/docs/parameters/path_account_atproto.yaml new file mode 100644 index 000000000..25e701af7 --- /dev/null +++ b/docs/parameters/path_account_atproto.yaml @@ -0,0 +1,9 @@ +description: Retrieve activities from the specified account. +in: path +name: account +required: true +schema: + $ref: "../schemas/AtprotoAccount.yaml" +examples: + did: + value: "did:plc:wpyn57cwhtrq2oln7w5mylsb" diff --git a/docs/parameters/query_platform_atproto.yaml b/docs/parameters/query_platform_atproto.yaml new file mode 100644 index 000000000..4876d87a5 --- /dev/null +++ b/docs/parameters/query_platform_atproto.yaml @@ -0,0 +1,9 @@ +description: Retrieve activities from the specified platform(s). +in: query +name: platform +required: false +schema: + items: + $ref: "../schemas/AtprotoPlatform.yaml" + type: array + x-go-type-skip-optional-pointer: true diff --git a/docs/path/atproto/account.yaml b/docs/path/atproto/account.yaml new file mode 100644 index 000000000..bd0b299d9 --- /dev/null +++ b/docs/path/atproto/account.yaml @@ -0,0 +1,30 @@ +get: + operationId: GetAtprotoAccount + summary: Get Account Activities + description: This endpoint retrieves the activities associated with a specified account in the atprotocol system. You can use various query parameters to filter and paginate the results, including limits on the number of activities and actions, timestamps, success status, direction, and more. + tags: + - Atproto + security: + - bearerAuth: [] + parameters: + - $ref: "../../parameters/path_account_atproto.yaml" + - $ref: "../../parameters/query_limit.yaml" + - $ref: "../../parameters/query_action_limit.yaml" + - $ref: "../../parameters/query_cursor.yaml" + - $ref: "../../parameters/query_since_timestamp.yaml" + - $ref: "../../parameters/query_until_timestamp.yaml" + - $ref: "../../parameters/query_success.yaml" + - $ref: "../../parameters/query_direction.yaml" + - $ref: "../../parameters/query_network.yaml" + - $ref: "../../parameters/query_tag.yaml" + - $ref: "../../parameters/query_type.yaml" + - $ref: "../../parameters/query_platform_atproto.yaml" + responses: + '200': + $ref: "../../responses/AtprotoActivitiesResponse.yaml" + '400': + $ref: "../../responses/BadRequest.yaml" + '404': + $ref: "../../responses/NotFound.yaml" + '500': + $ref: "../../responses/InternalError.yaml" diff --git a/docs/responses/AtprotoActivitiesResponse.yaml b/docs/responses/AtprotoActivitiesResponse.yaml new file mode 100644 index 000000000..bc268deb6 --- /dev/null +++ b/docs/responses/AtprotoActivitiesResponse.yaml @@ -0,0 +1,16 @@ +content: + application/json: + schema: + description: The response structure for a list of activities. + properties: + data: + description: The list of activities. + items: + $ref: "../schemas/AtprotoActivity.yaml" + type: array + meta: + $ref: "../schemas/MetaCursor.yaml" + type: object + required: + - data +description: The request was successful. diff --git a/docs/responses/AtprotoActivityResponse.yaml b/docs/responses/AtprotoActivityResponse.yaml new file mode 100644 index 000000000..671fd1805 --- /dev/null +++ b/docs/responses/AtprotoActivityResponse.yaml @@ -0,0 +1,10 @@ +content: + application/json: + schema: + properties: + data: + $ref: '../schemas/AtprotoActivity.yaml' + meta: + $ref: '../schemas/MetaTotalPages.yaml' + type: object +description: The request was successful. diff --git a/docs/schemas/AtprotoAccount.yaml b/docs/schemas/AtprotoAccount.yaml new file mode 100644 index 000000000..03bd939f2 --- /dev/null +++ b/docs/schemas/AtprotoAccount.yaml @@ -0,0 +1,3 @@ +description: The owner of the atproto activity. +type: string +pattern: ^(did:plc:[0-9a-zA-Z]+)$ diff --git a/docs/schemas/AtprotoAction.yaml b/docs/schemas/AtprotoAction.yaml new file mode 100644 index 000000000..9620362be --- /dev/null +++ b/docs/schemas/AtprotoAction.yaml @@ -0,0 +1,21 @@ +description: Represents an individual action within an activity. +properties: + from: + $ref: './AtprotoAccount.yaml' + metadata: + $ref: "./ProtocolMetadata.yaml" + platform: + $ref: "./AtprotoPlatform.yaml" + related_urls: + description: A list of URLs related to the action. + items: + type: string + format: uri + type: array + tag: + $ref: "./ProtocolTag.yaml" + to: + $ref: "./AtprotoAccount.yaml" + type: + $ref: "./ProtocolType.yaml" +type: object diff --git a/docs/schemas/AtprotoActivity.yaml b/docs/schemas/AtprotoActivity.yaml new file mode 100644 index 000000000..68bc588ca --- /dev/null +++ b/docs/schemas/AtprotoActivity.yaml @@ -0,0 +1,60 @@ +properties: + id: + description: The unique identifier for the activity. + type: string + format: uri + owner: + $ref: "./AtprotoAccount.yaml" + network: + allOf: + - enum: + - bluesky + index: + description: The index of the activity in the list. + type: integer + from: + $ref: "./AtprotoAccount.yaml" + to: + $ref: "./AtprotoAccount.yaml" + tag: + allOf: + - $ref: "./ProtocolTag.yaml" + - example: social + type: + $ref: "https://raw.githubusercontent.com/RSS3-Network/Protocol-Go/refs/heads/main/openapi/type/Social.yaml" + platform: + $ref: "./AtprotoPlatform.yaml" + total_actions: + description: The total number of actions within the activity. + type: integer + actions: + description: The list of actions within the activity. + items: + $ref: "./AtprotoAction.yaml" + type: array + calldata: + $ref: "./Calldata.yaml" + fee: + $ref: "./Fee.yaml" + direction: + $ref: "./ProtocolDirection.yaml" + success: + $ref: "./Success.yaml" + timestamp: + $ref: "./Timestamp.yaml" + + + +type: object +required: + - id + - network + - index + - from + - to + - tag + - type + - total_actions + - actions + - success + - timestamp diff --git a/docs/schemas/AtprotoPlatform.yaml b/docs/schemas/AtprotoPlatform.yaml new file mode 100644 index 000000000..5bd3be963 --- /dev/null +++ b/docs/schemas/AtprotoPlatform.yaml @@ -0,0 +1,8 @@ +type: string +enum: + - Unknown + - Bluesky +x-go-type: atproto.Platform +x-go-type-skip-optional-pointer: true +x-go-type-import: + path: github.com/rss3-network/node/schema/worker/atproto diff --git a/internal/database/client.go b/internal/database/client.go index daddb1d9f..2374de0c3 100644 --- a/internal/database/client.go +++ b/internal/database/client.go @@ -30,7 +30,6 @@ type Client interface { SaveActivities(ctx context.Context, activities []*activityx.Activity, lowPriority bool) error FindActivity(ctx context.Context, query model.ActivityQuery) (*activityx.Activity, *int, error) FindActivities(ctx context.Context, query model.ActivitiesQuery) ([]*activityx.Activity, error) - FindFederatedActivities(ctx context.Context, query model.FederatedActivitiesQuery) ([]*activityx.Activity, error) DeleteExpiredActivities(ctx context.Context, network network.Network, timestamp time.Time) error } diff --git a/internal/database/dialer/postgres/client.go b/internal/database/dialer/postgres/client.go index 120a740ff..6b282d780 100644 --- a/internal/database/dialer/postgres/client.go +++ b/internal/database/dialer/postgres/client.go @@ -331,14 +331,6 @@ func (c *client) FindActivities(ctx context.Context, query model.ActivitiesQuery return nil, fmt.Errorf("not implemented") } -func (c *client) FindFederatedActivities(ctx context.Context, query model.FederatedActivitiesQuery) ([]*activityx.Activity, error) { - if c.partition { - return c.findFederatedActivitiesPartitioned(ctx, query) - } - - return nil, fmt.Errorf("not implemented") -} - // DeleteExpiredActivities deletes expired activities. func (c *client) DeleteExpiredActivities(ctx context.Context, network networkx.Network, timestamp time.Time) error { if c.partition { diff --git a/internal/database/dialer/postgres/client_partitioned.go b/internal/database/dialer/postgres/client_partitioned.go index bdfea5210..b81b1df75 100644 --- a/internal/database/dialer/postgres/client_partitioned.go +++ b/internal/database/dialer/postgres/client_partitioned.go @@ -341,73 +341,6 @@ func (c *client) findActivitiesPartitioned(ctx context.Context, query model.Acti return result, nil } -// findActivitiesPartitioned finds activities. -func (c *client) findFederatedActivitiesPartitioned(ctx context.Context, query model.FederatedActivitiesQuery) ([]*activityx.Activity, error) { - indexes, err := c.findFederatedIndexesPartitioned(ctx, query) - if err != nil { - return nil, fmt.Errorf("find indexes: %w", err) - } - - partition := lo.GroupBy(indexes, func(query *table.Index) string { - activity := table.Activity{ - ID: query.ID, - Network: query.Network, - Timestamp: query.Timestamp, - } - - return activity.PartitionName(nil) - }) - - var ( - result = make([]*activityx.Activity, 0) - locker sync.Mutex - ) - - errorGroup, errorCtx := errgroup.WithContext(ctx) - - for tableName, index := range partition { - tableName, index := tableName, index - - ids := lo.Map(index, func(index *table.Index, _ int) string { - return index.ID - }) - - errorGroup.Go(func() error { - tableActivities := make(table.Activities, 0) - - if err := c.database.WithContext(errorCtx).Table(tableName).Where("id IN ?", lo.Uniq(ids)).Find(&tableActivities).Error; err != nil { - return err - } - - locker.Lock() - defer locker.Unlock() - - activities, err := tableActivities.ExportByIndexes(index) - if err != nil { - return err - } - - result = append(result, activities...) - - return nil - }) - } - - if err := errorGroup.Wait(); err != nil { - return nil, err - } - - lo.ForEach(result, func(activity *activityx.Activity, i int) { - result[i].Actions = lo.Slice(activity.Actions, 0, query.ActionLimit) - }) - - sort.SliceStable(result, func(i, j int) bool { - return result[i].Timestamp > result[j].Timestamp - }) - - return result, nil -} - // saveIndexesPartitioned saves indexes in partitioned tables. func (c *client) saveIndexesPartitioned(ctx context.Context, activities []*activityx.Activity) error { zap.L().Debug("starting to save indexes in partitioned tables", @@ -698,109 +631,6 @@ func (c *client) findIndexesPartitioned(ctx context.Context, query model.Activit } } -//nolint:gocognit -func (c *client) findFederatedIndexesPartitioned(ctx context.Context, query model.FederatedActivitiesQuery) ([]*table.Index, error) { - index := table.Index{ - Timestamp: time.Now(), - } - - if query.EndTimestamp != nil && *query.EndTimestamp > 0 && *query.EndTimestamp < uint64(index.Timestamp.Unix()) { - index.Timestamp = time.Unix(int64(lo.FromPtr(query.EndTimestamp)), 0) - } - - if query.Cursor != nil && query.Cursor.Timestamp < uint64(index.Timestamp.Unix()) { - index.Timestamp = time.Unix(int64(query.Cursor.Timestamp), 0) - } - - partitionedNames := c.findIndexesPartitionTables(ctx, index) - - if len(partitionedNames) == 0 { - return nil, nil - } - - ctx, cancel := context.WithCancel(ctx) - errorGroup, errorContext := errgroup.WithContext(ctx) - indexes := make([][]*table.Index, len(partitionedNames)) - resultChan := make(chan int, len(partitionedNames)) - errorChan := make(chan error) - stopChan := make(chan struct{}) - - var mutex sync.RWMutex - - for partitionedIndex, partitionedName := range partitionedNames { - partitionedIndex, partitionedName := partitionedIndex, partitionedName - - errorGroup.Go(func() error { - var result []*table.Index - - databaseStatement := c.buildFederatedFindIndexesStatement(errorContext, partitionedName, query) - - if err := databaseStatement.Find(&result).Error; err != nil { - return fmt.Errorf("failed to find indexes: %w", err) - } - - mutex.Lock() - indexes[partitionedIndex] = result - mutex.Unlock() - - select { - case <-stopChan: - return nil - case resultChan <- partitionedIndex: - return nil - } - }) - } - - go func() { - defer close(errorChan) - - errorChan <- errorGroup.Wait() - }() - - defer func() { - cancel() - }() - - for { - select { - case err := <-errorChan: - if err != nil { - return nil, fmt.Errorf("failed to wait result: %w", err) - } - case <-resultChan: - result := make([]*table.Index, 0, query.Limit) - flag := true - - mutex.RLock() - - for _, data := range indexes { - data := data - - if data == nil { - flag = false - break - } - - result = append(result, data...) - - if len(result) >= query.Limit { - close(stopChan) - mutex.RUnlock() - - return result[:query.Limit], nil - } - } - - mutex.RUnlock() - - if flag { - return result, nil - } - } - } -} - // deleteExpiredActivitiesPartitioned deletes expired activities. func (c *client) deleteExpiredActivitiesPartitioned(ctx context.Context, network network.Network, timestamp time.Time) error { var ( @@ -1014,65 +844,6 @@ func (c *client) buildFindIndexesStatement(ctx context.Context, partition string return databaseStatement.Order("timestamp DESC, index DESC").Limit(query.Limit) } -// buildFindIndexesStatement builds the query indexes statement. -func (c *client) buildFederatedFindIndexesStatement(ctx context.Context, partition string, query model.FederatedActivitiesQuery) *gorm.DB { - databaseStatement := c.database.WithContext(ctx).Table(partition) - - if query.Distinct != nil && lo.FromPtr(query.Distinct) { - databaseStatement = databaseStatement.Select("DISTINCT (id) id, timestamp, index, network") - } - - if query.Owner != nil { - databaseStatement = databaseStatement.Where("owner = ?", query.Owner) - } - - if len(query.Owners) > 0 { - databaseStatement = databaseStatement.Where("owner IN ?", query.Owners) - } - - if query.Status != nil { - databaseStatement = databaseStatement.Where("status = ?", query.Status) - } - - if query.Direction != nil { - databaseStatement = databaseStatement.Where("direction = ?", query.Direction) - } - - if query.StartTimestamp != nil && *query.StartTimestamp > 0 { - databaseStatement = databaseStatement.Where("timestamp >= ?", time.Unix(int64(*query.StartTimestamp), 0)) - } - - if query.EndTimestamp != nil && *query.EndTimestamp > 0 { - databaseStatement = databaseStatement.Where("timestamp <= ?", time.Unix(int64(*query.EndTimestamp), 0)) - } - - if query.Platform != "" { - databaseStatement = databaseStatement.Where("platform = ?", query.Platform) - } - - if len(query.Platforms) > 0 { - databaseStatement = databaseStatement.Where("platform IN ?", query.Platforms) - } - - if len(query.Tags) > 0 { - databaseStatement = databaseStatement.Where("tag IN ?", query.Tags) - } - - if len(query.Types) > 0 { - databaseStatement = databaseStatement.Where("type IN ?", query.Types) - } - - if len(query.Network) > 0 { - databaseStatement = databaseStatement.Where("network IN ?", query.Network) - } - - if query.Cursor != nil && query.Cursor.Timestamp > 0 { - databaseStatement = databaseStatement.Where("timestamp < ? OR (timestamp = ? AND index < ?)", time.Unix(int64(query.Cursor.Timestamp), 0), time.Unix(int64(query.Cursor.Timestamp), 0), query.Cursor.Index) - } - - return databaseStatement.Order("timestamp DESC, index DESC").Limit(query.Limit) -} - // buildActivitiesTableNames builds the activities table names. func (c *client) buildActivitiesTableNames(network network.Network, timestamp time.Time) string { return fmt.Sprintf("%s_%s_%d_q%d", (*table.Activity).TableName(nil), network, timestamp.Year(), int(timestamp.Month()-1)/3+1) diff --git a/internal/database/model/activity.go b/internal/database/model/activity.go index 3804df373..df87f55f3 100644 --- a/internal/database/model/activity.go +++ b/internal/database/model/activity.go @@ -1,8 +1,6 @@ package model import ( - "github.com/rss3-network/node/schema/worker/decentralized" - "github.com/rss3-network/node/schema/worker/federated" "github.com/rss3-network/protocol-go/schema" activityx "github.com/rss3-network/protocol-go/schema/activity" "github.com/rss3-network/protocol-go/schema/network" @@ -29,26 +27,7 @@ type ActivitiesQuery struct { Network []network.Network Tags []tag.Tag Types []schema.Type - Platforms []decentralized.Platform - Distinct *bool - RelatedActions *bool - Limit int - ActionLimit int -} - -type FederatedActivitiesQuery struct { - Owner *string - Cursor *activityx.Activity - Status *bool - Direction *activityx.Direction - StartTimestamp *uint64 - EndTimestamp *uint64 - Platform string - Owners []string - Network []network.Network - Tags []tag.Tag - Types []schema.Type - Platforms []federated.Platform + Platforms []string Distinct *bool RelatedActions *bool Limit int diff --git a/internal/engine/protocol/atproto/data_source.go b/internal/engine/protocol/atproto/data_source.go index 336f270b0..d17b5d711 100644 --- a/internal/engine/protocol/atproto/data_source.go +++ b/internal/engine/protocol/atproto/data_source.go @@ -194,7 +194,7 @@ func (s *dataSource) retrySource(ctx context.Context, tasksChan chan<- *engine.T // initialize creates a new Bluesky client and assigns it to the data source. func (s *dataSource) initialize() error { - client, err := bluesky.NewClient(context.Background(), s.filter.Type, s.option.Username, s.option.Password, s.option.TimestampStart) + client, err := bluesky.NewClient(context.Background(), s.option.Username, s.option.Password, bluesky.WithFilter(s.filter.Type), bluesky.WithTimestampStart(s.option.TimestampStart)) if err != nil { zap.L().Error("create bluesky client failed", zap.Error(err)) diff --git a/internal/node/component/aggregator/compoent.go b/internal/node/component/aggregator/compoent.go index ba53930bb..b7a997093 100644 --- a/internal/node/component/aggregator/compoent.go +++ b/internal/node/component/aggregator/compoent.go @@ -3,6 +3,7 @@ package aggregator import ( "github.com/labstack/echo/v4" "github.com/rss3-network/node/docs" + "github.com/rss3-network/node/internal/node/component/atproto" "github.com/rss3-network/node/internal/node/component/decentralized" "github.com/rss3-network/node/internal/node/component/federated" "github.com/rss3-network/node/internal/node/component/info" @@ -16,6 +17,7 @@ type Component struct { Info *info.Component Decentralized *decentralized.Component Federated *federated.Component + Atproto *atproto.Component RSS *rss.Component } @@ -65,6 +67,12 @@ func (c Component) GetFederatedAccount(ctx echo.Context, account string, params return c.Federated.GetAccountActivities(ctx, account, params) } +// Atproto Interface + +func (c Component) GetAtprotoAccount(ctx echo.Context, account string, params docs.GetAtprotoAccountParams) error { + return c.Atproto.GetAccountActivities(ctx, account, params) +} + // RSS Interface // GetRSS ignore the second parameter diff --git a/internal/node/component/atproto/component.go b/internal/node/component/atproto/component.go new file mode 100644 index 000000000..020169b27 --- /dev/null +++ b/internal/node/component/atproto/component.go @@ -0,0 +1,124 @@ +package atproto + +import ( + "context" + "fmt" + "sync" + + cb "github.com/emirpasic/gods/queues/circularbuffer" + "github.com/labstack/echo/v4" + "github.com/redis/rueidis" + "github.com/rss3-network/node/config" + "github.com/rss3-network/node/internal/constant" + "github.com/rss3-network/node/internal/database" + "github.com/rss3-network/node/internal/engine/protocol/atproto" + "github.com/rss3-network/node/internal/node/component" + "github.com/rss3-network/node/internal/node/component/middleware" + "github.com/rss3-network/node/provider/atproto/bluesky" + "github.com/samber/lo" + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/metric" + "go.opentelemetry.io/otel/trace" +) + +type Component struct { + config *config.File + counter metric.Int64Counter + databaseClient database.Client + redisClient rueidis.Client + blueskyClient *bluesky.Client +} + +const Name = "atproto" + +var ( + RecentRequests *cb.Queue + recentRequestsMutex sync.RWMutex +) + +func (c *Component) Name() string { + return Name +} + +var _ component.Component = (*Component)(nil) + +func NewComponent(ctx context.Context, apiServer *echo.Echo, config *config.File, databaseClient database.Client, redisClient rueidis.Client) (*Component, error) { + option, err := atproto.NewOption(config.Component.Atproto[0].Parameters) + if err != nil { + return nil, fmt.Errorf("create option failed: %w", err) + } + + blueskyClient, err := bluesky.NewClient(ctx, option.Username, option.Password) + if err != nil { + return nil, fmt.Errorf("create bluesky client failed: %w", err) + } + + c := &Component{ + config: config, + databaseClient: databaseClient, + redisClient: redisClient, + blueskyClient: blueskyClient, + } + + group := apiServer.Group(fmt.Sprintf("/%s", Name)) + + // Add middleware for bearer token authentication + group.Use(middleware.BearerAuth(config.Discovery.Server.AccessToken)) + + if err := c.InitMeter(); err != nil { + panic(err) + } + + return c, nil +} + +func (c *Component) InitMeter() (err error) { + meter := otel.GetMeterProvider().Meter(constant.Name) + + if c.counter, err = meter.Int64Counter(c.Name()); err != nil { + return fmt.Errorf("failed to init meter for component %s: %w", c.Name(), err) + } + + return nil +} + +func (c *Component) CollectMetric(ctx context.Context, path, value string) { + measurementOption := metric.WithAttributes( + attribute.String("component", c.Name()), + attribute.String("path", path), + attribute.String("value", value), + ) + + c.counter.Add(ctx, int64(1), measurementOption) +} + +func (c *Component) CollectTrace(ctx context.Context, path, value string) { + spanStartOptions := []trace.SpanStartOption{ + trace.WithSpanKind(trace.SpanKindServer), + trace.WithAttributes( + attribute.String("path", path), + attribute.String("value", value), + ), + } + + _, span := otel.Tracer("").Start(ctx, "atproto API Query", spanStartOptions...) + defer span.End() +} + +// GetRecentRequest returns the filtered recent requests. +func GetRecentRequest() []string { + recentRequestsMutex.RLock() + defer recentRequestsMutex.RUnlock() + + // Convert queue to slice + values := RecentRequests.Values() + + // Filter out empty strings and convert to []string + filteredRequests := lo.FilterMap(values, func(item interface{}, _ int) (string, bool) { + str, ok := item.(string) + return str, ok && str != "" + }) + + return filteredRequests +} diff --git a/internal/node/component/atproto/data.go b/internal/node/component/atproto/data.go new file mode 100644 index 000000000..1dc336a55 --- /dev/null +++ b/internal/node/component/atproto/data.go @@ -0,0 +1,71 @@ +package atproto + +import ( + "context" + "fmt" + "strings" + + "github.com/rss3-network/node/internal/database/model" + activityx "github.com/rss3-network/protocol-go/schema/activity" + networkx "github.com/rss3-network/protocol-go/schema/network" + "github.com/samber/lo" +) + +func (c *Component) getActivity(ctx context.Context, request model.ActivityQuery) (*activityx.Activity, *int, error) { + return c.databaseClient.FindActivity(ctx, request) +} + +func (c *Component) getActivities(ctx context.Context, request model.ActivitiesQuery) ([]*activityx.Activity, string, error) { + activities, err := c.databaseClient.FindActivities(ctx, request) + if err != nil { + return nil, "", fmt.Errorf("failed to find activities: %w", err) + } + + last, exist := lo.Last(activities) + if exist { + return activities, c.transformCursor(ctx, last), nil + } + + return nil, "", nil +} + +func (c *Component) getCursor(ctx context.Context, cursor *string) (*activityx.Activity, error) { + if cursor == nil { + return nil, nil + } + + cleanedCursor := *cursor + prefix := "https://" + + if strings.HasPrefix(cleanedCursor, "https://") { + cleanedCursor = cleanedCursor[8:] + } else if strings.HasPrefix(cleanedCursor, "http://") { + cleanedCursor = cleanedCursor[7:] + prefix = "http://" + } + + id, networkStr, found := strings.Cut(cleanedCursor, ":") + if !found { + return nil, fmt.Errorf("invalid cursor: missing network") + } + + network, err := networkx.NetworkString(networkStr) + if err != nil { + return nil, fmt.Errorf("invalid cursor: %w", err) + } + + data, _, err := c.getActivity(ctx, model.ActivityQuery{ID: lo.ToPtr(prefix + id), Network: lo.ToPtr(network)}) + if err != nil { + return nil, fmt.Errorf("failed to get cursor: %w", err) + } + + return data, nil +} + +func (c *Component) transformCursor(_ context.Context, activity *activityx.Activity) string { + if activity == nil { + return "" + } + + return fmt.Sprintf("%s:%s", activity.ID, activity.Network) +} diff --git a/internal/node/component/atproto/handler_activity.go b/internal/node/component/atproto/handler_activity.go new file mode 100644 index 000000000..558f1a825 --- /dev/null +++ b/internal/node/component/atproto/handler_activity.go @@ -0,0 +1,121 @@ +package atproto + +import ( + "context" + "net/http" + + "github.com/creasty/defaults" + "github.com/labstack/echo/v4" + "github.com/rss3-network/node/common/http/response" + "github.com/rss3-network/node/docs" + "github.com/rss3-network/node/internal/database/model" + "github.com/rss3-network/node/schema/worker/atproto" + activityx "github.com/rss3-network/protocol-go/schema/activity" + "github.com/samber/lo" + lop "github.com/samber/lo/parallel" + "go.uber.org/zap" +) + +func (c *Component) GetAccountActivities(ctx echo.Context, account string, request docs.GetAtprotoAccountParams) (err error) { + if err = defaults.Set(&request); err != nil { + return response.BadRequestError(ctx, err) + } + + if err = ctx.Validate(&request); err != nil { + return response.ValidationFailedError(ctx, err) + } + + go c.CollectTrace(ctx.Request().Context(), ctx.Request().RequestURI, account) + + go c.CollectMetric(ctx.Request().Context(), ctx.Request().RequestURI, account) + + zap.L().Debug("processing atproto account activities request", + zap.Any("request", request)) + + cursor, err := c.getCursor(ctx.Request().Context(), request.Cursor) + if err != nil { + zap.L().Error("failed to get atproto account activities cursor", + zap.String("account", account), + zap.String("cursor", lo.FromPtr(request.Cursor)), + zap.Error(err)) + + return response.InternalError(ctx) + } + + databaseRequest := model.ActivitiesQuery{ + Cursor: cursor, + StartTimestamp: request.SinceTimestamp, + EndTimestamp: request.UntilTimestamp, + Owner: lo.ToPtr(account), + Limit: request.Limit, + ActionLimit: request.ActionLimit, + Status: request.Status, + Direction: request.Direction, + Network: lo.Uniq(request.Network), + Tags: lo.Uniq(request.Tag), + Types: lo.Uniq(request.Type), + Platforms: lo.Uniq(lo.Map(request.Platform, func(platform atproto.Platform, _ int) string { + return platform.String() + })), + } + + activities, last, err := c.getActivities(ctx.Request().Context(), databaseRequest) + if err != nil { + zap.L().Error("failed to get atproto account activities", + zap.String("account", account), + zap.Error(err)) + + return response.InternalError(ctx) + } + + zap.L().Info("successfully retrieved atproto account activities", + zap.String("account", account), + zap.Int("count", len(activities))) + + return ctx.JSON(http.StatusOK, ActivitiesResponse{ + Data: c.TransformActivities(ctx.Request().Context(), activities), + Meta: lo.Ternary(len(activities) < databaseRequest.Limit, nil, &MetaCursor{ + Cursor: last, + }), + }) +} + +func (c *Component) TransformActivities(ctx context.Context, activities []*activityx.Activity) []*activityx.Activity { + results := make([]*activityx.Activity, len(activities)) + + // iterate over the activities + // 1. transform the activity such as adding related urls and filling the author url + // 2. query etherface for the transaction to get parsed function name + lop.ForEach(activities, func(_ *activityx.Activity, index int) { + result, err := c.TransformActivity(ctx, activities[index]) + if err != nil { + zap.L().Error("failed to transform atproto activity", + zap.String("ID", activities[index].ID), + zap.Error(err)) + + return + } + + results[index] = result + }) + + return results +} + +type ActivityResponse struct { + Data *activityx.Activity `json:"data"` + Meta *MetaTotalPages `json:"meta"` +} + +type ActivitiesResponse struct { + Data []*activityx.Activity `json:"data"` + Meta *MetaCursor `json:"meta,omitempty"` +} + +type MetaTotalPages struct { + TotalPages int `json:"totalPages"` +} + +type MetaCursor struct { + Cursor string `json:"cursor"` +} diff --git a/internal/node/component/atproto/transformer_activity.go b/internal/node/component/atproto/transformer_activity.go new file mode 100644 index 000000000..e2bf1c26e --- /dev/null +++ b/internal/node/component/atproto/transformer_activity.go @@ -0,0 +1,39 @@ +package atproto + +import ( + "context" + + activityx "github.com/rss3-network/protocol-go/schema/activity" + "github.com/rss3-network/protocol-go/schema/tag" + lop "github.com/samber/lo/parallel" + "go.uber.org/zap" +) + +// TransformActivity should add related URLs to the activity based on action tag, network and platform +func (c *Component) TransformActivity(ctx context.Context, activity *activityx.Activity) (*activityx.Activity, error) { + if activity == nil { + return nil, nil + } + + // iterate over actions and transform them based on tag, network and platform + lop.ForEach(activity.Actions, func(actionPtr *activityx.Action, index int) { + action := *actionPtr + + var err error + + switch action.Tag { + case tag.Social: + *activity.Actions[index], err = c.TransformSocialType(ctx, activity.Network, activity.Platform, *actionPtr) + default: + activity.Actions[index] = actionPtr + } + + if err != nil { + zap.L().Error("failed to transform federated activity action", + zap.Error(err), + zap.String("id", activity.ID)) + } + }) + + return activity, nil +} diff --git a/internal/node/component/atproto/transformer_social_type.go b/internal/node/component/atproto/transformer_social_type.go new file mode 100644 index 000000000..deffceda9 --- /dev/null +++ b/internal/node/component/atproto/transformer_social_type.go @@ -0,0 +1,82 @@ +package atproto + +import ( + "context" + "fmt" + "strings" + + "github.com/rss3-network/protocol-go/schema/activity" + "github.com/rss3-network/protocol-go/schema/metadata" + "github.com/rss3-network/protocol-go/schema/network" + "github.com/rss3-network/protocol-go/schema/typex" + "github.com/samber/lo" +) + +// TransformSocialType adds author url and note url to social actions based on type, network and platform +func (c *Component) TransformSocialType(ctx context.Context, network network.Network, platform string, action activity.Action) (activity.Action, error) { + switch action.Type { + case typex.SocialPost, typex.SocialComment, typex.SocialShare: + return c.TransformSocialPost(ctx, network, platform, action) + } + + return action, nil +} + +// TransformSocialPost adds author url and note url to social post action +func (c *Component) TransformSocialPost(ctx context.Context, network network.Network, platform string, action activity.Action) (activity.Action, error) { + post, ok := action.Metadata.(*metadata.SocialPost) + if !ok { + return activity.Action{}, fmt.Errorf("invalid post metadata type: %T", action.Metadata) + } + + if lo.IsEmpty(post.Handle) { + post.Handle = action.From + } + + post.AuthorURL = c.buildSocialAuthorURL(ctx, platform, post.Handle) + + if post.Target != nil && platform != "" { + post.Target.AuthorURL = c.buildSocialAuthorURL(ctx, platform, post.Target.Handle) + post.TargetURL = c.buildSocialNoteURL(ctx, network, platform, post.Target.Handle, post.Target.PublicationID) + } + + action.Metadata = post + + if noteURL := c.buildSocialNoteURL(ctx, network, platform, post.Handle, post.PublicationID); noteURL != "" { + action.RelatedURLs = append(action.RelatedURLs, noteURL) + } + + return action, nil +} + +// buildSocialAuthorURL returns author url based on domain and handle +func (c *Component) buildSocialAuthorURL(_ context.Context, platform, handle string) string { + if lo.IsEmpty(handle) || lo.IsEmpty(platform) { + return "" + } + + parts := strings.SplitN(handle, "@", 3) + if len(parts) != 3 { + return "" + } + + username, domain := parts[1], parts[2] + + return fmt.Sprintf("https://%s/users/%s", domain, username) +} + +// buildSocialNoteURL returns note url based on domain, handle, profileID and pubID +func (c *Component) buildSocialNoteURL(_ context.Context, _ network.Network, platform, handle, pubID string) string { + if lo.IsEmpty(platform) || lo.IsEmpty(handle) || lo.IsEmpty(pubID) { + return "" + } + + parts := strings.SplitN(handle, "@", 3) + if len(parts) != 3 { + return "" + } + + username, domain := parts[1], parts[2] + + return fmt.Sprintf("https://%s/users/%s/statuses/%s", domain, username, pubID) +} diff --git a/internal/node/component/decentralized/handler_activity.go b/internal/node/component/decentralized/handler_activity.go index a60df008f..289333503 100644 --- a/internal/node/component/decentralized/handler_activity.go +++ b/internal/node/component/decentralized/handler_activity.go @@ -123,7 +123,9 @@ func (c *Component) GetAccountActivities(ctx echo.Context, account string, reque Network: lo.Uniq(request.Network), Tags: lo.Uniq(request.Tag), Types: lo.Uniq(request.Type), - Platforms: lo.Uniq(request.Platform), + Platforms: lo.Uniq(lo.Map(request.Platform, func(platform decentralized.Platform, _ int) string { + return platform.String() + })), } activities, last, err := c.getActivities(ctx.Request().Context(), databaseRequest) @@ -199,7 +201,9 @@ func (c *Component) BatchGetAccountsActivities(ctx echo.Context) (err error) { Network: lo.Uniq(request.Network), Tags: lo.Uniq(request.Tag), Types: lo.Uniq(request.Type), - Platforms: lo.Uniq(request.Platform), + Platforms: lo.Uniq(lo.Map(request.Platform, func(platform decentralized.Platform, _ int) string { + return platform.String() + })), } activities, last, err := c.getActivities(ctx.Request().Context(), databaseRequest) diff --git a/internal/node/component/decentralized/handler_network_activity.go b/internal/node/component/decentralized/handler_network_activity.go index 31d85344b..ac4233a05 100644 --- a/internal/node/component/decentralized/handler_network_activity.go +++ b/internal/node/component/decentralized/handler_network_activity.go @@ -8,6 +8,7 @@ import ( "github.com/rss3-network/node/common/http/response" "github.com/rss3-network/node/docs" "github.com/rss3-network/node/internal/database/model" + "github.com/rss3-network/node/schema/worker/decentralized" "github.com/rss3-network/protocol-go/schema/network" "github.com/samber/lo" "go.uber.org/zap" @@ -54,7 +55,9 @@ func (c *Component) GetNetworkActivities(ctx echo.Context, net network.Network, Network: []network.Network{net}, Tags: lo.Uniq(request.Tag), Types: lo.Uniq(request.Type), - Platforms: lo.Uniq(request.Platform), + Platforms: lo.Uniq(lo.Map(request.Platform, func(platform decentralized.Platform, _ int) string { + return platform.String() + })), } activities, last, err := c.getActivities(ctx.Request().Context(), databaseRequest) diff --git a/internal/node/component/decentralized/handler_platform_activity.go b/internal/node/component/decentralized/handler_platform_activity.go index b7971c206..7d5b922e6 100644 --- a/internal/node/component/decentralized/handler_platform_activity.go +++ b/internal/node/component/decentralized/handler_platform_activity.go @@ -58,7 +58,7 @@ func (c *Component) GetPlatformActivities(ctx echo.Context, plat decentralized.P Network: lo.Uniq(request.Network), Tags: lo.Uniq(request.Tag), Types: lo.Uniq(request.Type), - Platforms: []decentralized.Platform{plat}, + Platforms: []string{plat.String()}, } activities, last, err := c.getActivities(ctx.Request().Context(), databaseRequest) diff --git a/internal/node/component/federated/data.go b/internal/node/component/federated/data.go index 78f765139..e296e087b 100644 --- a/internal/node/component/federated/data.go +++ b/internal/node/component/federated/data.go @@ -15,8 +15,8 @@ func (c *Component) getActivity(ctx context.Context, request model.ActivityQuery return c.databaseClient.FindActivity(ctx, request) } -func (c *Component) getActivities(ctx context.Context, request model.FederatedActivitiesQuery) ([]*activityx.Activity, string, error) { - activities, err := c.databaseClient.FindFederatedActivities(ctx, request) +func (c *Component) getActivities(ctx context.Context, request model.ActivitiesQuery) ([]*activityx.Activity, string, error) { + activities, err := c.databaseClient.FindActivities(ctx, request) if err != nil { return nil, "", fmt.Errorf("failed to find activities: %w", err) } diff --git a/internal/node/component/federated/handler_activity.go b/internal/node/component/federated/handler_activity.go index ba27c1111..28e623a88 100644 --- a/internal/node/component/federated/handler_activity.go +++ b/internal/node/component/federated/handler_activity.go @@ -10,6 +10,7 @@ import ( "github.com/rss3-network/node/common/http/response" "github.com/rss3-network/node/docs" "github.com/rss3-network/node/internal/database/model" + "github.com/rss3-network/node/schema/worker/federated" activityx "github.com/rss3-network/protocol-go/schema/activity" "github.com/samber/lo" lop "github.com/samber/lo/parallel" @@ -98,7 +99,7 @@ func (c *Component) GetAccountActivities(ctx echo.Context, account string, reque return response.InternalError(ctx) } - databaseRequest := model.FederatedActivitiesQuery{ + databaseRequest := model.ActivitiesQuery{ Cursor: cursor, StartTimestamp: request.SinceTimestamp, EndTimestamp: request.UntilTimestamp, @@ -110,7 +111,9 @@ func (c *Component) GetAccountActivities(ctx echo.Context, account string, reque Network: lo.Uniq(request.Network), Tags: lo.Uniq(request.Tag), Types: lo.Uniq(request.Type), - Platforms: lo.Uniq(request.Platform), + Platforms: lo.Uniq(lo.Map(request.Platform, func(platform federated.Platform, _ int) string { + return platform.String() + })), } activities, last, err := c.getActivities(ctx.Request().Context(), databaseRequest) @@ -170,7 +173,7 @@ func (c *Component) BatchGetAccountsActivities(ctx echo.Context) (err error) { return response.InternalError(ctx) } - databaseRequest := model.FederatedActivitiesQuery{ + databaseRequest := model.ActivitiesQuery{ Cursor: cursor, StartTimestamp: request.SinceTimestamp, EndTimestamp: request.UntilTimestamp, @@ -184,7 +187,9 @@ func (c *Component) BatchGetAccountsActivities(ctx echo.Context) (err error) { Network: lo.Uniq(request.Network), Tags: lo.Uniq(request.Tag), Types: lo.Uniq(request.Type), - Platforms: lo.Uniq(request.Platform), + Platforms: lo.Uniq(lo.Map(request.Platform, func(platform federated.Platform, _ int) string { + return platform.String() + })), } activities, last, err := c.getActivities(ctx.Request().Context(), databaseRequest) diff --git a/internal/node/component/federated/handler_network_activity.go b/internal/node/component/federated/handler_network_activity.go index ea210972b..49019384a 100644 --- a/internal/node/component/federated/handler_network_activity.go +++ b/internal/node/component/federated/handler_network_activity.go @@ -8,6 +8,7 @@ import ( "github.com/rss3-network/node/common/http/response" "github.com/rss3-network/node/docs" "github.com/rss3-network/node/internal/database/model" + "github.com/rss3-network/node/schema/worker/federated" "github.com/rss3-network/protocol-go/schema/network" "github.com/samber/lo" "go.uber.org/zap" @@ -43,7 +44,7 @@ func (c *Component) GetNetworkActivities(ctx echo.Context, net network.Network, return response.InternalError(ctx) } - databaseRequest := model.FederatedActivitiesQuery{ + databaseRequest := model.ActivitiesQuery{ Cursor: cursor, StartTimestamp: request.SinceTimestamp, EndTimestamp: request.UntilTimestamp, @@ -54,7 +55,9 @@ func (c *Component) GetNetworkActivities(ctx echo.Context, net network.Network, Network: []network.Network{net}, Tags: lo.Uniq(request.Tag), Types: lo.Uniq(request.Type), - Platforms: lo.Uniq(request.Platform), + Platforms: lo.Uniq(lo.Map(request.Platform, func(platform federated.Platform, _ int) string { + return platform.String() + })), } activities, last, err := c.getActivities(ctx.Request().Context(), databaseRequest) diff --git a/internal/node/component/federated/handler_platform_activity.go b/internal/node/component/federated/handler_platform_activity.go index f2fb8aa49..1ab579c5a 100644 --- a/internal/node/component/federated/handler_platform_activity.go +++ b/internal/node/component/federated/handler_platform_activity.go @@ -43,7 +43,7 @@ func (c *Component) GetPlatformActivities(ctx echo.Context, plat federated.Platf return response.InternalError(ctx) } - databaseRequest := model.FederatedActivitiesQuery{ + databaseRequest := model.ActivitiesQuery{ Cursor: cursor, StartTimestamp: request.SinceTimestamp, EndTimestamp: request.UntilTimestamp, @@ -54,7 +54,7 @@ func (c *Component) GetPlatformActivities(ctx echo.Context, plat federated.Platf Network: lo.Uniq(request.Network), Tags: lo.Uniq(request.Tag), Types: lo.Uniq(request.Type), - Platforms: []federated.Platform{plat}, + Platforms: []string{plat.String()}, } activities, last, err := c.getActivities(ctx.Request().Context(), databaseRequest) diff --git a/internal/node/node.go b/internal/node/node.go index 2a0827d34..0f27f13ef 100644 --- a/internal/node/node.go +++ b/internal/node/node.go @@ -18,6 +18,7 @@ import ( "github.com/rss3-network/node/internal/database" "github.com/rss3-network/node/internal/node/component" "github.com/rss3-network/node/internal/node/component/aggregator" + "github.com/rss3-network/node/internal/node/component/atproto" "github.com/rss3-network/node/internal/node/component/decentralized" "github.com/rss3-network/node/internal/node/component/federated" "github.com/rss3-network/node/internal/node/component/info" @@ -110,6 +111,18 @@ func NewCoreService(ctx context.Context, config *config.File, databaseClient dat } } + if len(config.Component.Atproto) > 0 { + atprotoComponent, err := atproto.NewComponent(ctx, apiServer, config, databaseClient, redisClient) + if err != nil { + zap.L().Fatal("Failed to create atproto component", zap.Error(err)) + } else { + var comp component.Component = atprotoComponent + + node.components = append(node.components, &comp) + aggComp.Atproto = atprotoComponent + } + } + docs.RegisterHandlers(apiServer, aggComp) // Generate openapi.json diff --git a/provider/atproto/bluesky/client.go b/provider/atproto/bluesky/client.go index 522eddd2e..c3e2b052e 100644 --- a/provider/atproto/bluesky/client.go +++ b/provider/atproto/bluesky/client.go @@ -604,14 +604,30 @@ func (c *Client) LookupDIDEndpoint(ctx context.Context, did syntax.DID) string { return BskyEndpoint } -func NewClient(_ context.Context, filter []string, username string, password string, timestamp time.Time) (*Client, error) { +type Option func(client *Client) error + +func WithFilter(filter []string) Option { + return func(client *Client) error { + client.filter = filter + + return nil + } +} + +func WithTimestampStart(timestamp time.Time) Option { + return func(client *Client) error { + client.timestampStart = timestamp + + return nil + } +} + +func NewClient(_ context.Context, username string, password string, options ...Option) (*Client, error) { client := &Client{ - username: username, - password: password, - filter: filter, - timestampStart: timestamp, - cacheClient: make(map[string]*XrpcClient), - httpClient: http.DefaultClient, + username: username, + password: password, + cacheClient: make(map[string]*XrpcClient), + httpClient: http.DefaultClient, } defaultXrpcClient, err := client.createAndAuthenticateClient(context.Background(), BskyEndpoint) @@ -621,5 +637,11 @@ func NewClient(_ context.Context, filter []string, username string, password str client.defaultClient = defaultXrpcClient + for _, option := range options { + if err := option(client); err != nil { + return nil, fmt.Errorf("apply option: %w", err) + } + } + return client, nil } From a723faeaaa237798045e26beebb2054115d5f4b1 Mon Sep 17 00:00:00 2001 From: polebug Date: Tue, 10 Dec 2024 18:14:43 +0800 Subject: [PATCH 19/31] feat(database): support for saving bluesky profiles --- internal/database/client.go | 6 ++ internal/database/dialer/postgres/client.go | 69 +++++++++++++++++++ .../20241210031220_add_bluesky_profiles.sql | 17 +++++ .../dialer/postgres/table/checkpoint.go | 2 - .../postgres/table/dataset_bluesky_profile.go | 38 ++++++++++ .../postgres/table/dataset_ens_namehash.go | 2 - .../table/dataset_farcaster_profile.go | 2 - .../table/dataset_mastodon_update_handle.go | 2 - .../postgres/table/dataset_mirror_post.go | 2 - .../database/model/dataset_bluesky_profile.go | 16 +++++ .../database/model/dataset_ens_namehash.go | 5 -- .../model/dataset_farcaster_profile.go | 5 -- .../database/model/dataset_mastodon_handle.go | 5 -- internal/engine/checkpoint.go | 5 -- internal/engine/worker/atproto/core/worker.go | 23 +++++++ .../mirror/model/dataset_mirror_post.go | 6 -- 16 files changed, 169 insertions(+), 36 deletions(-) create mode 100644 internal/database/dialer/postgres/migration/20241210031220_add_bluesky_profiles.sql create mode 100644 internal/database/dialer/postgres/table/dataset_bluesky_profile.go create mode 100644 internal/database/model/dataset_bluesky_profile.go diff --git a/internal/database/client.go b/internal/database/client.go index 2374de0c3..e5b5fe78e 100644 --- a/internal/database/client.go +++ b/internal/database/client.go @@ -22,6 +22,7 @@ type Client interface { DatasetFarcasterProfile DatasetENSNamehash DatasetMastodonHandle + DatasetBlueskyProfile LoadCheckpoint(ctx context.Context, id string, network network.Network, worker string) (*engine.Checkpoint, error) LoadCheckpoints(ctx context.Context, id string, network network.Network, worker string) ([]*engine.Checkpoint, error) @@ -64,6 +65,11 @@ type DatasetMastodonHandle interface { GetUpdatedMastodonHandles(ctx context.Context, query model.QueryMastodonHandles) ([]*model.MastodonHandle, error) } +type DatasetBlueskyProfile interface { + LoadDatasetBlueskyProfiles(ctx context.Context, query model.QueryBlueskyProfiles) ([]*model.BlueskyProfile, error) + SaveDatasetBlueskyProfiles(ctx context.Context, profiles []*model.BlueskyProfile) error +} + var _ goose.Logger = (*SugaredLogger)(nil) type SugaredLogger struct { diff --git a/internal/database/dialer/postgres/client.go b/internal/database/dialer/postgres/client.go index 6b282d780..f66591520 100644 --- a/internal/database/dialer/postgres/client.go +++ b/internal/database/dialer/postgres/client.go @@ -479,6 +479,75 @@ func (c *client) GetUpdatedMastodonHandles(ctx context.Context, query model.Quer return result, nil } +func (c *client) SaveDatasetBlueskyProfiles(ctx context.Context, profiles []*model.BlueskyProfile) error { + // build the mastodon update handle table + values := make([]table.DatasetBlueskyProfile, 0, len(profiles)) + + // Iterate through the handles and import them into the values slice + for _, profile := range profiles { + var value table.DatasetBlueskyProfile + if err := value.Import(profile); err != nil { + return err + } + + values = append(values, value) + } + + onConflictClause := clause.OnConflict{ + Columns: []clause.Column{{Name: "did"}}, + UpdateAll: true, + } + + return c.database.WithContext(ctx).Clauses(onConflictClause).CreateInBatches(&values, math.MaxUint8).Error +} + +func (c *client) LoadDatasetBlueskyProfiles(ctx context.Context, query model.QueryBlueskyProfiles) ([]*model.BlueskyProfile, error) { + databaseStatement := c.database.WithContext(ctx).Table(table.DatasetBlueskyProfile{}.TableName()) + + if query.Cursor != nil { + var cursor *table.DatasetBlueskyProfile + + if err := c.database.WithContext(ctx).First(&cursor, "did = ?", query.Cursor).Error; err != nil { + return nil, fmt.Errorf("get handle cursor: %w", err) + } + + databaseStatement = databaseStatement.Where("updated_at < ? OR (updated_at = ? AND created_at < ?)", cursor.UpdatedAt, cursor.UpdatedAt, cursor.CreatedAt) + } + + if query.Since != nil { + databaseStatement = databaseStatement.Where("updated_at > ?", time.UnixMilli(int64(*query.Since))) + } + + if query.Limit != nil { + databaseStatement = databaseStatement.Limit(*query.Limit) + } + + databaseStatement = databaseStatement.Order("updated_at DESC, created_at DESC") + + var profiles []*table.DatasetBlueskyProfile + + if err := databaseStatement.Find(&profiles).Error; err != nil { + return nil, err + } + + result := make([]*model.BlueskyProfile, 0, len(profiles)) + + for _, profile := range profiles { + var ( + value *model.BlueskyProfile + err error + ) + + if value, err = profile.Export(); err != nil { + return nil, err + } + + result = append(result, value) + } + + return result, nil +} + // Dial dials a database. func Dial(ctx context.Context, dataSourceName string, partition bool) (database.Client, error) { var err error diff --git a/internal/database/dialer/postgres/migration/20241210031220_add_bluesky_profiles.sql b/internal/database/dialer/postgres/migration/20241210031220_add_bluesky_profiles.sql new file mode 100644 index 000000000..10ece4b80 --- /dev/null +++ b/internal/database/dialer/postgres/migration/20241210031220_add_bluesky_profiles.sql @@ -0,0 +1,17 @@ +-- +goose Up +-- +goose StatementBegin +CREATE TABLE IF NOT EXISTS dataset_bluesky_profiles +( + "did" text PRIMARY KEY, + "handle" text, + "created_at" timestamptz NOT NULL DEFAULT now(), + "updated_at" timestamptz NOT NULL DEFAULT now() +); + +CREATE INDEX idx_dataset_bluesky_profiles ON dataset_bluesky_profiles (updated_at DESC, created_at DESC); +-- +goose StatementEnd + +-- +goose Down +-- +goose StatementBegin +DROP TABLE IF EXISTS dataset_bluesky_profiles; +-- +goose StatementEnd diff --git a/internal/database/dialer/postgres/table/checkpoint.go b/internal/database/dialer/postgres/table/checkpoint.go index 86aa8c1e1..6699e53c4 100644 --- a/internal/database/dialer/postgres/table/checkpoint.go +++ b/internal/database/dialer/postgres/table/checkpoint.go @@ -8,8 +8,6 @@ import ( "github.com/rss3-network/protocol-go/schema/network" ) -var _ engine.CheckpointTransformer = (*Checkpoint)(nil) - type Checkpoint struct { ID string `gorm:"column:id"` Network network.Network `gorm:"column:network"` diff --git a/internal/database/dialer/postgres/table/dataset_bluesky_profile.go b/internal/database/dialer/postgres/table/dataset_bluesky_profile.go new file mode 100644 index 000000000..d7ee36662 --- /dev/null +++ b/internal/database/dialer/postgres/table/dataset_bluesky_profile.go @@ -0,0 +1,38 @@ +package table + +import ( + "time" + + "github.com/rss3-network/node/internal/database/model" +) + +type DatasetBlueskyProfile struct { + DID string `gorm:"column:did;primaryKey"` + Handle string `gorm:"column:handle"` + CreatedAt time.Time `gorm:"column:created_at;autoCreateTime"` + UpdatedAt time.Time `gorm:"column:updated_at;autoUpdateTime"` +} + +func (DatasetBlueskyProfile) TableName() string { + return "dataset_bluesky_profiles" +} + +func (d *DatasetBlueskyProfile) Import(profile *model.BlueskyProfile) error { + d.DID = profile.DID + d.Handle = profile.Handle + d.CreatedAt = profile.CreatedAt + d.UpdatedAt = profile.UpdatedAt + + return nil +} + +func (d *DatasetBlueskyProfile) Export() (*model.BlueskyProfile, error) { + profile := model.BlueskyProfile{ + DID: d.DID, + Handle: d.Handle, + CreatedAt: d.CreatedAt, + UpdatedAt: d.UpdatedAt, + } + + return &profile, nil +} diff --git a/internal/database/dialer/postgres/table/dataset_ens_namehash.go b/internal/database/dialer/postgres/table/dataset_ens_namehash.go index 5fac72f6c..d5bd25a84 100644 --- a/internal/database/dialer/postgres/table/dataset_ens_namehash.go +++ b/internal/database/dialer/postgres/table/dataset_ens_namehash.go @@ -5,8 +5,6 @@ import ( "github.com/rss3-network/node/internal/database/model" ) -var _ model.ENSNamehashTransformer = (*DatasetENSNamehash)(nil) - type DatasetENSNamehash struct { Hash common.Hash `gorm:"column:hash;primary_key"` Name string `gorm:"column:name;index:idx_ensnamehash_name"` diff --git a/internal/database/dialer/postgres/table/dataset_farcaster_profile.go b/internal/database/dialer/postgres/table/dataset_farcaster_profile.go index 961a2110a..d017badea 100644 --- a/internal/database/dialer/postgres/table/dataset_farcaster_profile.go +++ b/internal/database/dialer/postgres/table/dataset_farcaster_profile.go @@ -5,8 +5,6 @@ import ( "github.com/rss3-network/node/internal/database/model" ) -var _ model.ProfileTransformer = (*DatasetFarcasterProfile)(nil) - type DatasetFarcasterProfile struct { Fid int64 `gorm:"column:fid"` Username string `gorm:"column:username"` diff --git a/internal/database/dialer/postgres/table/dataset_mastodon_update_handle.go b/internal/database/dialer/postgres/table/dataset_mastodon_update_handle.go index 09ee5070a..2de460c4c 100644 --- a/internal/database/dialer/postgres/table/dataset_mastodon_update_handle.go +++ b/internal/database/dialer/postgres/table/dataset_mastodon_update_handle.go @@ -6,8 +6,6 @@ import ( "github.com/rss3-network/node/internal/database/model" ) -var _ model.MastodonHandleTransformer = (*DatasetMastodonUpdateHandle)(nil) - type DatasetMastodonUpdateHandle struct { Handle string `gorm:"column:handle;primaryKey"` CreatedAt time.Time `gorm:"column:created_at;autoCreateTime"` diff --git a/internal/database/dialer/postgres/table/dataset_mirror_post.go b/internal/database/dialer/postgres/table/dataset_mirror_post.go index 655c429ca..b3635b161 100644 --- a/internal/database/dialer/postgres/table/dataset_mirror_post.go +++ b/internal/database/dialer/postgres/table/dataset_mirror_post.go @@ -4,8 +4,6 @@ import ( "github.com/rss3-network/node/internal/engine/worker/decentralized/contract/mirror/model" ) -var _ model.DatasetMirrorPostTransformer = (*DatasetMirrorPost)(nil) - // DatasetMirrorPost represents a mirror post for revise logic check. type DatasetMirrorPost struct { ID string `gorm:"column:id;primary_key"` diff --git a/internal/database/model/dataset_bluesky_profile.go b/internal/database/model/dataset_bluesky_profile.go new file mode 100644 index 000000000..46156c123 --- /dev/null +++ b/internal/database/model/dataset_bluesky_profile.go @@ -0,0 +1,16 @@ +package model + +import "time" + +type BlueskyProfile struct { + DID string `json:"did"` + Handle string `json:"handle"` + CreatedAt time.Time `json:"created_at"` + UpdatedAt time.Time `json:"updated_at"` +} + +type QueryBlueskyProfiles struct { + Since *uint64 + Limit *int + Cursor *string +} diff --git a/internal/database/model/dataset_ens_namehash.go b/internal/database/model/dataset_ens_namehash.go index db8f80b9b..bc76914db 100644 --- a/internal/database/model/dataset_ens_namehash.go +++ b/internal/database/model/dataset_ens_namehash.go @@ -2,11 +2,6 @@ package model import "github.com/ethereum/go-ethereum/common" -type ENSNamehashTransformer interface { - Import(namehash *ENSNamehash) error - Export() (*ENSNamehash, error) -} - type ENSNamehash struct { Hash common.Hash `json:"hash"` // Hexadecimal hash bytes Name string `json:"name"` // ENS name, *.eth diff --git a/internal/database/model/dataset_farcaster_profile.go b/internal/database/model/dataset_farcaster_profile.go index 9e921cf01..4a92959d5 100644 --- a/internal/database/model/dataset_farcaster_profile.go +++ b/internal/database/model/dataset_farcaster_profile.go @@ -1,10 +1,5 @@ package model -type ProfileTransformer interface { - Import(profile *Profile) error - Export() (*Profile, error) -} - type Profile struct { Fid int64 `json:"fid"` // Farcaster ID Username string `json:"username"` // Farcaster username diff --git a/internal/database/model/dataset_mastodon_handle.go b/internal/database/model/dataset_mastodon_handle.go index 7bc59aa03..11ef971ab 100644 --- a/internal/database/model/dataset_mastodon_handle.go +++ b/internal/database/model/dataset_mastodon_handle.go @@ -2,11 +2,6 @@ package model import "time" -type MastodonHandleTransformer interface { - Import(handle *MastodonHandle) error - Export() (*MastodonHandle, error) -} - type MastodonHandle struct { Handle string `json:"handle"` CreatedAt time.Time `json:"created_at"` diff --git a/internal/engine/checkpoint.go b/internal/engine/checkpoint.go index 2042c9d28..86739cafa 100644 --- a/internal/engine/checkpoint.go +++ b/internal/engine/checkpoint.go @@ -7,11 +7,6 @@ import ( "github.com/rss3-network/protocol-go/schema/network" ) -type CheckpointTransformer interface { - Import(checkpoint *Checkpoint) error - Export() (*Checkpoint, error) -} - type Checkpoint struct { ID string `json:"id"` Network network.Network `json:"network"` diff --git a/internal/engine/worker/atproto/core/worker.go b/internal/engine/worker/atproto/core/worker.go index e96016a53..e9e8aa319 100644 --- a/internal/engine/worker/atproto/core/worker.go +++ b/internal/engine/worker/atproto/core/worker.go @@ -7,6 +7,7 @@ import ( "github.com/bluesky-social/indigo/api/bsky" "github.com/reiver/go-bsky/app/bsky/feed" "github.com/rss3-network/node/internal/database" + "github.com/rss3-network/node/internal/database/model" "github.com/rss3-network/node/internal/engine" source "github.com/rss3-network/node/internal/engine/protocol/atproto" at "github.com/rss3-network/node/provider/atproto" @@ -113,6 +114,8 @@ func (w *worker) Transform(ctx context.Context, task engine.Task) (*activityx.Ac return nil, nil } + w.saveProfiles(ctx, atprotoTask) + return activity, nil } @@ -279,6 +282,26 @@ func (w *worker) buildPostMedia(embed *bsky.FeedPost_Embed) []metadata.Media { return media } +// saveProfiles saves the profiles to the database. +func (w *worker) saveProfiles(ctx context.Context, task *source.Task) { + // Save profiles to the database. + profiles := []*model.BlueskyProfile{{ + DID: task.Message.Did.String(), + Handle: task.Message.Handle, + }} + + if task.Message.RefMessage != nil { + profiles = append(profiles, &model.BlueskyProfile{ + DID: task.Message.RefMessage.Did.String(), + Handle: task.Message.RefMessage.Handle, + }) + } + + if err := w.databaseClient.SaveDatasetBlueskyProfiles(ctx, profiles); err != nil { + zap.L().Error("save profiles", zap.Error(err)) + } +} + func NewWorker(databaseClient database.Client) (engine.Worker, error) { return &worker{ databaseClient: databaseClient, diff --git a/internal/engine/worker/decentralized/contract/mirror/model/dataset_mirror_post.go b/internal/engine/worker/decentralized/contract/mirror/model/dataset_mirror_post.go index ad84248b5..144661f7f 100644 --- a/internal/engine/worker/decentralized/contract/mirror/model/dataset_mirror_post.go +++ b/internal/engine/worker/decentralized/contract/mirror/model/dataset_mirror_post.go @@ -1,11 +1,5 @@ package model -// DatasetMirrorPostTransformer interface that wraps the basic Import and Export methods. -type DatasetMirrorPostTransformer interface { - Import(post *DatasetMirrorPost) error - Export() (*DatasetMirrorPost, error) -} - // DatasetMirrorPost represents a mirror post for revise logic check. type DatasetMirrorPost struct { TransactionID string From a95731811db7c0998d2e88ded5988212d52734f8 Mon Sep 17 00:00:00 2001 From: polebug Date: Tue, 10 Dec 2024 20:42:06 +0800 Subject: [PATCH 20/31] chore: update docs --- docs/api.yaml | 5 - docs/parameters/path_account_atproto.yaml | 9 -- docs/parameters/query_platform_atproto.yaml | 9 -- docs/path/atproto/account.yaml | 30 ----- docs/responses/AtprotoActivitiesResponse.yaml | 16 --- docs/responses/AtprotoActivityResponse.yaml | 10 -- docs/schemas/AtprotoAccount.yaml | 3 - docs/schemas/AtprotoAction.yaml | 21 --- docs/schemas/AtprotoActivity.yaml | 60 --------- docs/schemas/AtprotoPlatform.yaml | 8 -- go.mod | 2 - go.sum | 10 -- internal/engine/worker/atproto/core/worker.go | 1 - .../node/component/aggregator/compoent.go | 8 -- internal/node/component/atproto/component.go | 124 ------------------ internal/node/component/atproto/data.go | 71 ---------- .../component/atproto/handler_activity.go | 121 ----------------- .../component/atproto/transformer_activity.go | 39 ------ .../atproto/transformer_social_type.go | 82 ------------ .../decentralized/handler_activity.go | 9 +- .../decentralized/handler_network_activity.go | 5 +- .../component/federated/handler_activity.go | 13 +- .../federated/handler_network_activity.go | 7 +- internal/node/node.go | 13 -- .../ethereum/contract/iqwiki/operation.go | 22 ++-- 25 files changed, 36 insertions(+), 662 deletions(-) delete mode 100644 docs/parameters/path_account_atproto.yaml delete mode 100644 docs/parameters/query_platform_atproto.yaml delete mode 100644 docs/path/atproto/account.yaml delete mode 100644 docs/responses/AtprotoActivitiesResponse.yaml delete mode 100644 docs/responses/AtprotoActivityResponse.yaml delete mode 100644 docs/schemas/AtprotoAccount.yaml delete mode 100644 docs/schemas/AtprotoAction.yaml delete mode 100644 docs/schemas/AtprotoActivity.yaml delete mode 100644 docs/schemas/AtprotoPlatform.yaml delete mode 100644 internal/node/component/atproto/component.go delete mode 100644 internal/node/component/atproto/data.go delete mode 100644 internal/node/component/atproto/handler_activity.go delete mode 100644 internal/node/component/atproto/transformer_activity.go delete mode 100644 internal/node/component/atproto/transformer_social_type.go diff --git a/docs/api.yaml b/docs/api.yaml index 49fbe1e43..47f9935a5 100644 --- a/docs/api.yaml +++ b/docs/api.yaml @@ -16,8 +16,6 @@ tags: description: Retrieve the details of decentralized activities. - name: Federated description: Retrieve the details of federated activities. - - name: Atproto - description: Retrieve the details of atproto activities. paths: /decentralized/tx/{id}: $ref: "./path/decentralized/tx.yaml" @@ -41,9 +39,6 @@ paths: /federated/platform/{platform}: $ref: "./path/federated/platform.yaml" - /atproto/{account}: - $ref: "./path/atproto/account.yaml" - # Rss route /rss/{path}: $ref: "./path/rss.yaml" diff --git a/docs/parameters/path_account_atproto.yaml b/docs/parameters/path_account_atproto.yaml deleted file mode 100644 index 25e701af7..000000000 --- a/docs/parameters/path_account_atproto.yaml +++ /dev/null @@ -1,9 +0,0 @@ -description: Retrieve activities from the specified account. -in: path -name: account -required: true -schema: - $ref: "../schemas/AtprotoAccount.yaml" -examples: - did: - value: "did:plc:wpyn57cwhtrq2oln7w5mylsb" diff --git a/docs/parameters/query_platform_atproto.yaml b/docs/parameters/query_platform_atproto.yaml deleted file mode 100644 index 4876d87a5..000000000 --- a/docs/parameters/query_platform_atproto.yaml +++ /dev/null @@ -1,9 +0,0 @@ -description: Retrieve activities from the specified platform(s). -in: query -name: platform -required: false -schema: - items: - $ref: "../schemas/AtprotoPlatform.yaml" - type: array - x-go-type-skip-optional-pointer: true diff --git a/docs/path/atproto/account.yaml b/docs/path/atproto/account.yaml deleted file mode 100644 index bd0b299d9..000000000 --- a/docs/path/atproto/account.yaml +++ /dev/null @@ -1,30 +0,0 @@ -get: - operationId: GetAtprotoAccount - summary: Get Account Activities - description: This endpoint retrieves the activities associated with a specified account in the atprotocol system. You can use various query parameters to filter and paginate the results, including limits on the number of activities and actions, timestamps, success status, direction, and more. - tags: - - Atproto - security: - - bearerAuth: [] - parameters: - - $ref: "../../parameters/path_account_atproto.yaml" - - $ref: "../../parameters/query_limit.yaml" - - $ref: "../../parameters/query_action_limit.yaml" - - $ref: "../../parameters/query_cursor.yaml" - - $ref: "../../parameters/query_since_timestamp.yaml" - - $ref: "../../parameters/query_until_timestamp.yaml" - - $ref: "../../parameters/query_success.yaml" - - $ref: "../../parameters/query_direction.yaml" - - $ref: "../../parameters/query_network.yaml" - - $ref: "../../parameters/query_tag.yaml" - - $ref: "../../parameters/query_type.yaml" - - $ref: "../../parameters/query_platform_atproto.yaml" - responses: - '200': - $ref: "../../responses/AtprotoActivitiesResponse.yaml" - '400': - $ref: "../../responses/BadRequest.yaml" - '404': - $ref: "../../responses/NotFound.yaml" - '500': - $ref: "../../responses/InternalError.yaml" diff --git a/docs/responses/AtprotoActivitiesResponse.yaml b/docs/responses/AtprotoActivitiesResponse.yaml deleted file mode 100644 index bc268deb6..000000000 --- a/docs/responses/AtprotoActivitiesResponse.yaml +++ /dev/null @@ -1,16 +0,0 @@ -content: - application/json: - schema: - description: The response structure for a list of activities. - properties: - data: - description: The list of activities. - items: - $ref: "../schemas/AtprotoActivity.yaml" - type: array - meta: - $ref: "../schemas/MetaCursor.yaml" - type: object - required: - - data -description: The request was successful. diff --git a/docs/responses/AtprotoActivityResponse.yaml b/docs/responses/AtprotoActivityResponse.yaml deleted file mode 100644 index 671fd1805..000000000 --- a/docs/responses/AtprotoActivityResponse.yaml +++ /dev/null @@ -1,10 +0,0 @@ -content: - application/json: - schema: - properties: - data: - $ref: '../schemas/AtprotoActivity.yaml' - meta: - $ref: '../schemas/MetaTotalPages.yaml' - type: object -description: The request was successful. diff --git a/docs/schemas/AtprotoAccount.yaml b/docs/schemas/AtprotoAccount.yaml deleted file mode 100644 index 03bd939f2..000000000 --- a/docs/schemas/AtprotoAccount.yaml +++ /dev/null @@ -1,3 +0,0 @@ -description: The owner of the atproto activity. -type: string -pattern: ^(did:plc:[0-9a-zA-Z]+)$ diff --git a/docs/schemas/AtprotoAction.yaml b/docs/schemas/AtprotoAction.yaml deleted file mode 100644 index 9620362be..000000000 --- a/docs/schemas/AtprotoAction.yaml +++ /dev/null @@ -1,21 +0,0 @@ -description: Represents an individual action within an activity. -properties: - from: - $ref: './AtprotoAccount.yaml' - metadata: - $ref: "./ProtocolMetadata.yaml" - platform: - $ref: "./AtprotoPlatform.yaml" - related_urls: - description: A list of URLs related to the action. - items: - type: string - format: uri - type: array - tag: - $ref: "./ProtocolTag.yaml" - to: - $ref: "./AtprotoAccount.yaml" - type: - $ref: "./ProtocolType.yaml" -type: object diff --git a/docs/schemas/AtprotoActivity.yaml b/docs/schemas/AtprotoActivity.yaml deleted file mode 100644 index 68bc588ca..000000000 --- a/docs/schemas/AtprotoActivity.yaml +++ /dev/null @@ -1,60 +0,0 @@ -properties: - id: - description: The unique identifier for the activity. - type: string - format: uri - owner: - $ref: "./AtprotoAccount.yaml" - network: - allOf: - - enum: - - bluesky - index: - description: The index of the activity in the list. - type: integer - from: - $ref: "./AtprotoAccount.yaml" - to: - $ref: "./AtprotoAccount.yaml" - tag: - allOf: - - $ref: "./ProtocolTag.yaml" - - example: social - type: - $ref: "https://raw.githubusercontent.com/RSS3-Network/Protocol-Go/refs/heads/main/openapi/type/Social.yaml" - platform: - $ref: "./AtprotoPlatform.yaml" - total_actions: - description: The total number of actions within the activity. - type: integer - actions: - description: The list of actions within the activity. - items: - $ref: "./AtprotoAction.yaml" - type: array - calldata: - $ref: "./Calldata.yaml" - fee: - $ref: "./Fee.yaml" - direction: - $ref: "./ProtocolDirection.yaml" - success: - $ref: "./Success.yaml" - timestamp: - $ref: "./Timestamp.yaml" - - - -type: object -required: - - id - - network - - index - - from - - to - - tag - - type - - total_actions - - actions - - success - - timestamp diff --git a/docs/schemas/AtprotoPlatform.yaml b/docs/schemas/AtprotoPlatform.yaml deleted file mode 100644 index 5bd3be963..000000000 --- a/docs/schemas/AtprotoPlatform.yaml +++ /dev/null @@ -1,8 +0,0 @@ -type: string -enum: - - Unknown - - Bluesky -x-go-type: atproto.Platform -x-go-type-skip-optional-pointer: true -x-go-type-import: - path: github.com/rss3-network/node/schema/worker/atproto diff --git a/go.mod b/go.mod index f05db3e1f..792395109 100644 --- a/go.mod +++ b/go.mod @@ -70,7 +70,6 @@ require ( github.com/jaytaylor/html2text v0.0.0-20230321000545-74c2419ad056 github.com/mitchellh/mapstructure v1.5.0 github.com/oapi-codegen/oapi-codegen/v2 v2.4.1 - github.com/oapi-codegen/runtime v1.1.1 github.com/redis/rueidis v1.0.51 github.com/redis/rueidis/rueidiscompat v1.0.51 github.com/reiver/go-bsky v0.0.0-20240906205655-8c7fadb4f3bb @@ -91,7 +90,6 @@ require ( github.com/PuerkitoBio/goquery v1.9.2 // indirect github.com/RussellLuo/slidingwindow v0.0.0-20200528002341-535bb99d338b // indirect github.com/andybalholm/cascadia v1.3.2 // indirect - github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bits-and-blooms/bitset v1.10.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect diff --git a/go.sum b/go.sum index a47a189d5..1586b8e38 100644 --- a/go.sum +++ b/go.sum @@ -17,7 +17,6 @@ github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEV github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= github.com/PuerkitoBio/goquery v1.9.2 h1:4/wZksC3KgkQw7SQgkKotmKljk0M6V8TUvA8Wb4yPeE= github.com/PuerkitoBio/goquery v1.9.2/go.mod h1:GHPCaP0ODyyxqcNoFGYlAprUFH81NuRPd0GX3Zu2Mvk= -github.com/RaveNoX/go-jsoncommentstrip v1.0.0/go.mod h1:78ihd09MekBnJnxpICcwzCMzGrKSKYe4AqU6PDYYpjk= github.com/RussellLuo/slidingwindow v0.0.0-20200528002341-535bb99d338b h1:5/++qT1/z812ZqBvqQt6ToRswSuPZ/B33m6xVHRzADU= github.com/RussellLuo/slidingwindow v0.0.0-20200528002341-535bb99d338b/go.mod h1:4+EPqMRApwwE/6yo6CxiHoSnBzjRr3jsqer7frxP8y4= github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= @@ -31,8 +30,6 @@ github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo github.com/andybalholm/cascadia v1.2.0/go.mod h1:YCyR8vOZT9aZ1CHEd8ap0gMVm2aFgxBp0T0eFw1RUQY= github.com/andybalholm/cascadia v1.3.2 h1:3Xi6Dw5lHF15JtdcmAHD3i1+T8plmv7BQ/nsViSLyss= github.com/andybalholm/cascadia v1.3.2/go.mod h1:7gtRlve5FxPPgIgX36uWBX58OdBsSS6lUvCFb+h7KvU= -github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ= -github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk= github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de h1:FxWPpzIjnTlhPwqqXc4/vE0f7GvRjuAsbW+HOIe8KnA= github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de/go.mod h1:DCaWoUhZrYW9p1lxo/cm8EmUOOzAPSEZNGF2DK1dJgw= github.com/avast/retry-go/v4 v4.6.0 h1:K9xNA+KeB8HHc2aWFuLb25Offp+0iVRXEvFx8IinRJA= @@ -46,7 +43,6 @@ github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsy github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/bluesky-social/indigo v0.0.0-20241206035216-5ee8937072a8 h1:RZRm7C0DSjI7oLolHXWoGFNxUnA4T9bl6ZTAnIXKdSg= github.com/bluesky-social/indigo v0.0.0-20241206035216-5ee8937072a8/go.mod h1:SNFzA8zY8amwZzBvPfctX5DOpAG0OHan9qfbqCSTe2w= -github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.2 h1:KdUfX2zKommPRa+PD0sWZUyXe9w277ABlgELO7H04IM= @@ -395,7 +391,6 @@ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnr github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d/go.mod h1:2PavIy+JPciBPrBUjwbNvtwB6RQlve+hkpll6QSNmOE= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= @@ -517,8 +512,6 @@ github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY= github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc= github.com/oapi-codegen/oapi-codegen/v2 v2.4.1 h1:ykgG34472DWey7TSjd8vIfNykXgjOgYJZoQbKfEeY/Q= github.com/oapi-codegen/oapi-codegen/v2 v2.4.1/go.mod h1:N5+lY1tiTDV3V1BeHtOxeWXHoPVeApvsvjJqegfoaz8= -github.com/oapi-codegen/runtime v1.1.1 h1:EXLHh0DXIJnWhdRPN2w4MXAzFyE4CskzhNLUmtpMYro= -github.com/oapi-codegen/runtime v1.1.1/go.mod h1:SK9X900oXmPWilYR5/WKPzt3Kqxn/uS/+lbpREv+eCg= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -614,8 +607,6 @@ github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= -github.com/rss3-network/protocol-go v0.5.14 h1:gd6ciwXb5e4xx1dmAOAIKWbpami2QbARqE61zbwT6KE= -github.com/rss3-network/protocol-go v0.5.14/go.mod h1:npcyduWt86uVbIi77xQaYk8eqltI9XNjk1FMGpjyIq0= github.com/rss3-network/protocol-go v0.5.16 h1:14AOjsHMnuEqEHPmBo4A8sdGXPbwMNGKKJoGk1fXunk= github.com/rss3-network/protocol-go v0.5.16/go.mod h1:AOVaY0++55lryy3GeQG//EkPuVFqxNQoPa0VdGbmtx0= github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww= @@ -664,7 +655,6 @@ github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg= -github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad/go.mod h1:qLr4V1qq6nMqFKkMo8ZTx3f+BZEkzsRUY10Xsm2mwU0= github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf h1:pvbZ0lM0XWPBqUKqFU8cmavspvIl9nulOYwdy6IFRRo= github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf/go.mod h1:RJID2RhlZKId02nZ62WenDCkgHFerpIOmW0iT7GKmXM= github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= diff --git a/internal/engine/worker/atproto/core/worker.go b/internal/engine/worker/atproto/core/worker.go index e9e8aa319..974e32c0a 100644 --- a/internal/engine/worker/atproto/core/worker.go +++ b/internal/engine/worker/atproto/core/worker.go @@ -284,7 +284,6 @@ func (w *worker) buildPostMedia(embed *bsky.FeedPost_Embed) []metadata.Media { // saveProfiles saves the profiles to the database. func (w *worker) saveProfiles(ctx context.Context, task *source.Task) { - // Save profiles to the database. profiles := []*model.BlueskyProfile{{ DID: task.Message.Did.String(), Handle: task.Message.Handle, diff --git a/internal/node/component/aggregator/compoent.go b/internal/node/component/aggregator/compoent.go index b7a997093..ba53930bb 100644 --- a/internal/node/component/aggregator/compoent.go +++ b/internal/node/component/aggregator/compoent.go @@ -3,7 +3,6 @@ package aggregator import ( "github.com/labstack/echo/v4" "github.com/rss3-network/node/docs" - "github.com/rss3-network/node/internal/node/component/atproto" "github.com/rss3-network/node/internal/node/component/decentralized" "github.com/rss3-network/node/internal/node/component/federated" "github.com/rss3-network/node/internal/node/component/info" @@ -17,7 +16,6 @@ type Component struct { Info *info.Component Decentralized *decentralized.Component Federated *federated.Component - Atproto *atproto.Component RSS *rss.Component } @@ -67,12 +65,6 @@ func (c Component) GetFederatedAccount(ctx echo.Context, account string, params return c.Federated.GetAccountActivities(ctx, account, params) } -// Atproto Interface - -func (c Component) GetAtprotoAccount(ctx echo.Context, account string, params docs.GetAtprotoAccountParams) error { - return c.Atproto.GetAccountActivities(ctx, account, params) -} - // RSS Interface // GetRSS ignore the second parameter diff --git a/internal/node/component/atproto/component.go b/internal/node/component/atproto/component.go deleted file mode 100644 index 020169b27..000000000 --- a/internal/node/component/atproto/component.go +++ /dev/null @@ -1,124 +0,0 @@ -package atproto - -import ( - "context" - "fmt" - "sync" - - cb "github.com/emirpasic/gods/queues/circularbuffer" - "github.com/labstack/echo/v4" - "github.com/redis/rueidis" - "github.com/rss3-network/node/config" - "github.com/rss3-network/node/internal/constant" - "github.com/rss3-network/node/internal/database" - "github.com/rss3-network/node/internal/engine/protocol/atproto" - "github.com/rss3-network/node/internal/node/component" - "github.com/rss3-network/node/internal/node/component/middleware" - "github.com/rss3-network/node/provider/atproto/bluesky" - "github.com/samber/lo" - "go.opentelemetry.io/otel" - "go.opentelemetry.io/otel/attribute" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -type Component struct { - config *config.File - counter metric.Int64Counter - databaseClient database.Client - redisClient rueidis.Client - blueskyClient *bluesky.Client -} - -const Name = "atproto" - -var ( - RecentRequests *cb.Queue - recentRequestsMutex sync.RWMutex -) - -func (c *Component) Name() string { - return Name -} - -var _ component.Component = (*Component)(nil) - -func NewComponent(ctx context.Context, apiServer *echo.Echo, config *config.File, databaseClient database.Client, redisClient rueidis.Client) (*Component, error) { - option, err := atproto.NewOption(config.Component.Atproto[0].Parameters) - if err != nil { - return nil, fmt.Errorf("create option failed: %w", err) - } - - blueskyClient, err := bluesky.NewClient(ctx, option.Username, option.Password) - if err != nil { - return nil, fmt.Errorf("create bluesky client failed: %w", err) - } - - c := &Component{ - config: config, - databaseClient: databaseClient, - redisClient: redisClient, - blueskyClient: blueskyClient, - } - - group := apiServer.Group(fmt.Sprintf("/%s", Name)) - - // Add middleware for bearer token authentication - group.Use(middleware.BearerAuth(config.Discovery.Server.AccessToken)) - - if err := c.InitMeter(); err != nil { - panic(err) - } - - return c, nil -} - -func (c *Component) InitMeter() (err error) { - meter := otel.GetMeterProvider().Meter(constant.Name) - - if c.counter, err = meter.Int64Counter(c.Name()); err != nil { - return fmt.Errorf("failed to init meter for component %s: %w", c.Name(), err) - } - - return nil -} - -func (c *Component) CollectMetric(ctx context.Context, path, value string) { - measurementOption := metric.WithAttributes( - attribute.String("component", c.Name()), - attribute.String("path", path), - attribute.String("value", value), - ) - - c.counter.Add(ctx, int64(1), measurementOption) -} - -func (c *Component) CollectTrace(ctx context.Context, path, value string) { - spanStartOptions := []trace.SpanStartOption{ - trace.WithSpanKind(trace.SpanKindServer), - trace.WithAttributes( - attribute.String("path", path), - attribute.String("value", value), - ), - } - - _, span := otel.Tracer("").Start(ctx, "atproto API Query", spanStartOptions...) - defer span.End() -} - -// GetRecentRequest returns the filtered recent requests. -func GetRecentRequest() []string { - recentRequestsMutex.RLock() - defer recentRequestsMutex.RUnlock() - - // Convert queue to slice - values := RecentRequests.Values() - - // Filter out empty strings and convert to []string - filteredRequests := lo.FilterMap(values, func(item interface{}, _ int) (string, bool) { - str, ok := item.(string) - return str, ok && str != "" - }) - - return filteredRequests -} diff --git a/internal/node/component/atproto/data.go b/internal/node/component/atproto/data.go deleted file mode 100644 index 1dc336a55..000000000 --- a/internal/node/component/atproto/data.go +++ /dev/null @@ -1,71 +0,0 @@ -package atproto - -import ( - "context" - "fmt" - "strings" - - "github.com/rss3-network/node/internal/database/model" - activityx "github.com/rss3-network/protocol-go/schema/activity" - networkx "github.com/rss3-network/protocol-go/schema/network" - "github.com/samber/lo" -) - -func (c *Component) getActivity(ctx context.Context, request model.ActivityQuery) (*activityx.Activity, *int, error) { - return c.databaseClient.FindActivity(ctx, request) -} - -func (c *Component) getActivities(ctx context.Context, request model.ActivitiesQuery) ([]*activityx.Activity, string, error) { - activities, err := c.databaseClient.FindActivities(ctx, request) - if err != nil { - return nil, "", fmt.Errorf("failed to find activities: %w", err) - } - - last, exist := lo.Last(activities) - if exist { - return activities, c.transformCursor(ctx, last), nil - } - - return nil, "", nil -} - -func (c *Component) getCursor(ctx context.Context, cursor *string) (*activityx.Activity, error) { - if cursor == nil { - return nil, nil - } - - cleanedCursor := *cursor - prefix := "https://" - - if strings.HasPrefix(cleanedCursor, "https://") { - cleanedCursor = cleanedCursor[8:] - } else if strings.HasPrefix(cleanedCursor, "http://") { - cleanedCursor = cleanedCursor[7:] - prefix = "http://" - } - - id, networkStr, found := strings.Cut(cleanedCursor, ":") - if !found { - return nil, fmt.Errorf("invalid cursor: missing network") - } - - network, err := networkx.NetworkString(networkStr) - if err != nil { - return nil, fmt.Errorf("invalid cursor: %w", err) - } - - data, _, err := c.getActivity(ctx, model.ActivityQuery{ID: lo.ToPtr(prefix + id), Network: lo.ToPtr(network)}) - if err != nil { - return nil, fmt.Errorf("failed to get cursor: %w", err) - } - - return data, nil -} - -func (c *Component) transformCursor(_ context.Context, activity *activityx.Activity) string { - if activity == nil { - return "" - } - - return fmt.Sprintf("%s:%s", activity.ID, activity.Network) -} diff --git a/internal/node/component/atproto/handler_activity.go b/internal/node/component/atproto/handler_activity.go deleted file mode 100644 index 558f1a825..000000000 --- a/internal/node/component/atproto/handler_activity.go +++ /dev/null @@ -1,121 +0,0 @@ -package atproto - -import ( - "context" - "net/http" - - "github.com/creasty/defaults" - "github.com/labstack/echo/v4" - "github.com/rss3-network/node/common/http/response" - "github.com/rss3-network/node/docs" - "github.com/rss3-network/node/internal/database/model" - "github.com/rss3-network/node/schema/worker/atproto" - activityx "github.com/rss3-network/protocol-go/schema/activity" - "github.com/samber/lo" - lop "github.com/samber/lo/parallel" - "go.uber.org/zap" -) - -func (c *Component) GetAccountActivities(ctx echo.Context, account string, request docs.GetAtprotoAccountParams) (err error) { - if err = defaults.Set(&request); err != nil { - return response.BadRequestError(ctx, err) - } - - if err = ctx.Validate(&request); err != nil { - return response.ValidationFailedError(ctx, err) - } - - go c.CollectTrace(ctx.Request().Context(), ctx.Request().RequestURI, account) - - go c.CollectMetric(ctx.Request().Context(), ctx.Request().RequestURI, account) - - zap.L().Debug("processing atproto account activities request", - zap.Any("request", request)) - - cursor, err := c.getCursor(ctx.Request().Context(), request.Cursor) - if err != nil { - zap.L().Error("failed to get atproto account activities cursor", - zap.String("account", account), - zap.String("cursor", lo.FromPtr(request.Cursor)), - zap.Error(err)) - - return response.InternalError(ctx) - } - - databaseRequest := model.ActivitiesQuery{ - Cursor: cursor, - StartTimestamp: request.SinceTimestamp, - EndTimestamp: request.UntilTimestamp, - Owner: lo.ToPtr(account), - Limit: request.Limit, - ActionLimit: request.ActionLimit, - Status: request.Status, - Direction: request.Direction, - Network: lo.Uniq(request.Network), - Tags: lo.Uniq(request.Tag), - Types: lo.Uniq(request.Type), - Platforms: lo.Uniq(lo.Map(request.Platform, func(platform atproto.Platform, _ int) string { - return platform.String() - })), - } - - activities, last, err := c.getActivities(ctx.Request().Context(), databaseRequest) - if err != nil { - zap.L().Error("failed to get atproto account activities", - zap.String("account", account), - zap.Error(err)) - - return response.InternalError(ctx) - } - - zap.L().Info("successfully retrieved atproto account activities", - zap.String("account", account), - zap.Int("count", len(activities))) - - return ctx.JSON(http.StatusOK, ActivitiesResponse{ - Data: c.TransformActivities(ctx.Request().Context(), activities), - Meta: lo.Ternary(len(activities) < databaseRequest.Limit, nil, &MetaCursor{ - Cursor: last, - }), - }) -} - -func (c *Component) TransformActivities(ctx context.Context, activities []*activityx.Activity) []*activityx.Activity { - results := make([]*activityx.Activity, len(activities)) - - // iterate over the activities - // 1. transform the activity such as adding related urls and filling the author url - // 2. query etherface for the transaction to get parsed function name - lop.ForEach(activities, func(_ *activityx.Activity, index int) { - result, err := c.TransformActivity(ctx, activities[index]) - if err != nil { - zap.L().Error("failed to transform atproto activity", - zap.String("ID", activities[index].ID), - zap.Error(err)) - - return - } - - results[index] = result - }) - - return results -} - -type ActivityResponse struct { - Data *activityx.Activity `json:"data"` - Meta *MetaTotalPages `json:"meta"` -} - -type ActivitiesResponse struct { - Data []*activityx.Activity `json:"data"` - Meta *MetaCursor `json:"meta,omitempty"` -} - -type MetaTotalPages struct { - TotalPages int `json:"totalPages"` -} - -type MetaCursor struct { - Cursor string `json:"cursor"` -} diff --git a/internal/node/component/atproto/transformer_activity.go b/internal/node/component/atproto/transformer_activity.go deleted file mode 100644 index e2bf1c26e..000000000 --- a/internal/node/component/atproto/transformer_activity.go +++ /dev/null @@ -1,39 +0,0 @@ -package atproto - -import ( - "context" - - activityx "github.com/rss3-network/protocol-go/schema/activity" - "github.com/rss3-network/protocol-go/schema/tag" - lop "github.com/samber/lo/parallel" - "go.uber.org/zap" -) - -// TransformActivity should add related URLs to the activity based on action tag, network and platform -func (c *Component) TransformActivity(ctx context.Context, activity *activityx.Activity) (*activityx.Activity, error) { - if activity == nil { - return nil, nil - } - - // iterate over actions and transform them based on tag, network and platform - lop.ForEach(activity.Actions, func(actionPtr *activityx.Action, index int) { - action := *actionPtr - - var err error - - switch action.Tag { - case tag.Social: - *activity.Actions[index], err = c.TransformSocialType(ctx, activity.Network, activity.Platform, *actionPtr) - default: - activity.Actions[index] = actionPtr - } - - if err != nil { - zap.L().Error("failed to transform federated activity action", - zap.Error(err), - zap.String("id", activity.ID)) - } - }) - - return activity, nil -} diff --git a/internal/node/component/atproto/transformer_social_type.go b/internal/node/component/atproto/transformer_social_type.go deleted file mode 100644 index deffceda9..000000000 --- a/internal/node/component/atproto/transformer_social_type.go +++ /dev/null @@ -1,82 +0,0 @@ -package atproto - -import ( - "context" - "fmt" - "strings" - - "github.com/rss3-network/protocol-go/schema/activity" - "github.com/rss3-network/protocol-go/schema/metadata" - "github.com/rss3-network/protocol-go/schema/network" - "github.com/rss3-network/protocol-go/schema/typex" - "github.com/samber/lo" -) - -// TransformSocialType adds author url and note url to social actions based on type, network and platform -func (c *Component) TransformSocialType(ctx context.Context, network network.Network, platform string, action activity.Action) (activity.Action, error) { - switch action.Type { - case typex.SocialPost, typex.SocialComment, typex.SocialShare: - return c.TransformSocialPost(ctx, network, platform, action) - } - - return action, nil -} - -// TransformSocialPost adds author url and note url to social post action -func (c *Component) TransformSocialPost(ctx context.Context, network network.Network, platform string, action activity.Action) (activity.Action, error) { - post, ok := action.Metadata.(*metadata.SocialPost) - if !ok { - return activity.Action{}, fmt.Errorf("invalid post metadata type: %T", action.Metadata) - } - - if lo.IsEmpty(post.Handle) { - post.Handle = action.From - } - - post.AuthorURL = c.buildSocialAuthorURL(ctx, platform, post.Handle) - - if post.Target != nil && platform != "" { - post.Target.AuthorURL = c.buildSocialAuthorURL(ctx, platform, post.Target.Handle) - post.TargetURL = c.buildSocialNoteURL(ctx, network, platform, post.Target.Handle, post.Target.PublicationID) - } - - action.Metadata = post - - if noteURL := c.buildSocialNoteURL(ctx, network, platform, post.Handle, post.PublicationID); noteURL != "" { - action.RelatedURLs = append(action.RelatedURLs, noteURL) - } - - return action, nil -} - -// buildSocialAuthorURL returns author url based on domain and handle -func (c *Component) buildSocialAuthorURL(_ context.Context, platform, handle string) string { - if lo.IsEmpty(handle) || lo.IsEmpty(platform) { - return "" - } - - parts := strings.SplitN(handle, "@", 3) - if len(parts) != 3 { - return "" - } - - username, domain := parts[1], parts[2] - - return fmt.Sprintf("https://%s/users/%s", domain, username) -} - -// buildSocialNoteURL returns note url based on domain, handle, profileID and pubID -func (c *Component) buildSocialNoteURL(_ context.Context, _ network.Network, platform, handle, pubID string) string { - if lo.IsEmpty(platform) || lo.IsEmpty(handle) || lo.IsEmpty(pubID) { - return "" - } - - parts := strings.SplitN(handle, "@", 3) - if len(parts) != 3 { - return "" - } - - username, domain := parts[1], parts[2] - - return fmt.Sprintf("https://%s/users/%s/statuses/%s", domain, username, pubID) -} diff --git a/internal/node/component/decentralized/handler_activity.go b/internal/node/component/decentralized/handler_activity.go index bc35d280b..1a70899ec 100644 --- a/internal/node/component/decentralized/handler_activity.go +++ b/internal/node/component/decentralized/handler_activity.go @@ -12,6 +12,7 @@ import ( "github.com/rss3-network/node/docs" "github.com/rss3-network/node/internal/database/model" "github.com/rss3-network/node/internal/utils" + "github.com/rss3-network/node/schema/worker/decentralized" activityx "github.com/rss3-network/protocol-go/schema/activity" "github.com/rss3-network/protocol-go/schema/typex" "github.com/samber/lo" @@ -124,7 +125,9 @@ func (c *Component) GetAccountActivities(ctx echo.Context, account string, reque Network: lo.Uniq(request.Network), Tags: lo.Uniq(request.Tag), Types: lo.Uniq(request.Type), - Platforms: lo.Uniq(request.Platform), + Platforms: lo.Uniq(lo.Map(request.Platform, func(platform decentralized.Platform, _ int) string { + return platform.String() + })), } activities, last, err := c.getActivities(ctx.Request().Context(), databaseRequest) @@ -205,7 +208,9 @@ func (c *Component) BatchGetAccountsActivities(ctx echo.Context) (err error) { Network: lo.Uniq(request.Network), Tags: lo.Uniq(request.Tag), Types: lo.Uniq(types), - Platforms: lo.Uniq(request.Platform), + Platforms: lo.Uniq(lo.Map(request.Platform, func(platform decentralized.Platform, _ int) string { + return platform.String() + })), } activities, last, err := c.getActivities(ctx.Request().Context(), databaseRequest) diff --git a/internal/node/component/decentralized/handler_network_activity.go b/internal/node/component/decentralized/handler_network_activity.go index f811a65bb..293341c28 100644 --- a/internal/node/component/decentralized/handler_network_activity.go +++ b/internal/node/component/decentralized/handler_network_activity.go @@ -9,6 +9,7 @@ import ( "github.com/rss3-network/node/docs" "github.com/rss3-network/node/internal/database/model" "github.com/rss3-network/node/internal/utils" + "github.com/rss3-network/node/schema/worker/decentralized" "github.com/rss3-network/protocol-go/schema/network" "github.com/samber/lo" "go.uber.org/zap" @@ -59,7 +60,9 @@ func (c *Component) GetNetworkActivities(ctx echo.Context, net network.Network, Network: []network.Network{net}, Tags: lo.Uniq(request.Tag), Types: lo.Uniq(request.Type), - Platforms: lo.Uniq(request.Platform), + Platforms: lo.Uniq(lo.Map(request.Platform, func(platform decentralized.Platform, _ int) string { + return platform.String() + })), } activities, last, err := c.getActivities(ctx.Request().Context(), databaseRequest) diff --git a/internal/node/component/federated/handler_activity.go b/internal/node/component/federated/handler_activity.go index 7c2e0d8b3..a097d447b 100644 --- a/internal/node/component/federated/handler_activity.go +++ b/internal/node/component/federated/handler_activity.go @@ -11,6 +11,7 @@ import ( "github.com/rss3-network/node/docs" "github.com/rss3-network/node/internal/database/model" "github.com/rss3-network/node/internal/utils" + "github.com/rss3-network/node/schema/worker/federated" activityx "github.com/rss3-network/protocol-go/schema/activity" "github.com/samber/lo" lop "github.com/samber/lo/parallel" @@ -103,7 +104,7 @@ func (c *Component) GetAccountActivities(ctx echo.Context, account string, reque return response.InternalError(ctx) } - databaseRequest := model.FederatedActivitiesQuery{ + databaseRequest := model.ActivitiesQuery{ Cursor: cursor, StartTimestamp: request.SinceTimestamp, EndTimestamp: request.UntilTimestamp, @@ -115,7 +116,9 @@ func (c *Component) GetAccountActivities(ctx echo.Context, account string, reque Network: lo.Uniq(request.Network), Tags: lo.Uniq(request.Tag), Types: lo.Uniq(request.Type), - Platforms: lo.Uniq(request.Platform), + Platforms: lo.Uniq(lo.Map(request.Platform, func(platform federated.Platform, _ int) string { + return platform.String() + })), } activities, last, err := c.getActivities(ctx.Request().Context(), databaseRequest) @@ -180,7 +183,7 @@ func (c *Component) BatchGetAccountsActivities(ctx echo.Context) (err error) { return response.InternalError(ctx) } - databaseRequest := model.FederatedActivitiesQuery{ + databaseRequest := model.ActivitiesQuery{ Cursor: cursor, StartTimestamp: request.SinceTimestamp, EndTimestamp: request.UntilTimestamp, @@ -194,7 +197,9 @@ func (c *Component) BatchGetAccountsActivities(ctx echo.Context) (err error) { Network: lo.Uniq(request.Network), Tags: lo.Uniq(request.Tag), Types: lo.Uniq(types), - Platforms: lo.Uniq(request.Platform), + Platforms: lo.Uniq(lo.Map(request.Platform, func(platform federated.Platform, _ int) string { + return platform.String() + })), } activities, last, err := c.getActivities(ctx.Request().Context(), databaseRequest) diff --git a/internal/node/component/federated/handler_network_activity.go b/internal/node/component/federated/handler_network_activity.go index c15542fb6..245847dc3 100644 --- a/internal/node/component/federated/handler_network_activity.go +++ b/internal/node/component/federated/handler_network_activity.go @@ -9,6 +9,7 @@ import ( "github.com/rss3-network/node/docs" "github.com/rss3-network/node/internal/database/model" "github.com/rss3-network/node/internal/utils" + "github.com/rss3-network/node/schema/worker/federated" "github.com/rss3-network/protocol-go/schema/network" "github.com/samber/lo" "go.uber.org/zap" @@ -48,7 +49,7 @@ func (c *Component) GetNetworkActivities(ctx echo.Context, net network.Network, return response.InternalError(ctx) } - databaseRequest := model.FederatedActivitiesQuery{ + databaseRequest := model.ActivitiesQuery{ Cursor: cursor, StartTimestamp: request.SinceTimestamp, EndTimestamp: request.UntilTimestamp, @@ -59,7 +60,9 @@ func (c *Component) GetNetworkActivities(ctx echo.Context, net network.Network, Network: []network.Network{net}, Tags: lo.Uniq(request.Tag), Types: lo.Uniq(request.Type), - Platforms: lo.Uniq(request.Platform), + Platforms: lo.Uniq(lo.Map(request.Platform, func(platform federated.Platform, _ int) string { + return platform.String() + })), } activities, last, err := c.getActivities(ctx.Request().Context(), databaseRequest) diff --git a/internal/node/node.go b/internal/node/node.go index 0f27f13ef..2a0827d34 100644 --- a/internal/node/node.go +++ b/internal/node/node.go @@ -18,7 +18,6 @@ import ( "github.com/rss3-network/node/internal/database" "github.com/rss3-network/node/internal/node/component" "github.com/rss3-network/node/internal/node/component/aggregator" - "github.com/rss3-network/node/internal/node/component/atproto" "github.com/rss3-network/node/internal/node/component/decentralized" "github.com/rss3-network/node/internal/node/component/federated" "github.com/rss3-network/node/internal/node/component/info" @@ -111,18 +110,6 @@ func NewCoreService(ctx context.Context, config *config.File, databaseClient dat } } - if len(config.Component.Atproto) > 0 { - atprotoComponent, err := atproto.NewComponent(ctx, apiServer, config, databaseClient, redisClient) - if err != nil { - zap.L().Fatal("Failed to create atproto component", zap.Error(err)) - } else { - var comp component.Component = atprotoComponent - - node.components = append(node.components, &comp) - aggComp.Atproto = atprotoComponent - } - } - docs.RegisterHandlers(apiServer, aggComp) // Generate openapi.json diff --git a/provider/ethereum/contract/iqwiki/operation.go b/provider/ethereum/contract/iqwiki/operation.go index 3ef30f6f2..0ec824d67 100644 --- a/provider/ethereum/contract/iqwiki/operation.go +++ b/provider/ethereum/contract/iqwiki/operation.go @@ -228,12 +228,12 @@ query ActivityByWikiIdAndBlock ($block: Int!, $wikiId: String) { ` func ActivityByWikiIdAndBlock( - ctx context.Context, - client graphql.Client, + ctx_ context.Context, + client_ graphql.Client, block int, wikiId string, ) (*ActivityByWikiIdAndBlockResponse, error) { - req := &graphql.Request{ + req_ := &graphql.Request{ OpName: "ActivityByWikiIdAndBlock", Query: ActivityByWikiIdAndBlock_Operation, Variables: &__ActivityByWikiIdAndBlockInput{ @@ -241,16 +241,16 @@ func ActivityByWikiIdAndBlock( WikiId: wikiId, }, } - var err error + var err_ error - var data ActivityByWikiIdAndBlockResponse - resp := &graphql.Response{Data: &data} + var data_ ActivityByWikiIdAndBlockResponse + resp_ := &graphql.Response{Data: &data_} - err = client.MakeRequest( - ctx, - req, - resp, + err_ = client_.MakeRequest( + ctx_, + req_, + resp_, ) - return &data, err + return &data_, err_ } From 5b83fb36bd698fc22119a7eb7fa1cfa518ed7e82 Mon Sep 17 00:00:00 2001 From: polebug Date: Thu, 12 Dec 2024 20:51:45 +0800 Subject: [PATCH 21/31] chore(worker): move bluesky worker into federated --- config/config_test.go | 2 +- deploy/config.example.yaml | 4 ++-- docs/schemas/FederatedPlatform.yaml | 1 + docs/schemas/FederatedWorker.yaml | 3 ++- internal/engine/worker/atproto/factory.go | 20 ------------------- .../core => federated/bluesky}/worker.go | 2 +- internal/engine/worker/federated/factory.go | 7 +++++-- .../federated/{core => }/mastodon/worker.go | 2 +- .../{core => }/mastodon/worker_test.go | 0 internal/engine/worker/rss/factory.go | 2 +- .../node/component/info/network_config.go | 4 ++-- internal/node/indexer/server.go | 9 +-------- internal/node/monitor/monitor_test.go | 4 ++-- schema/worker/federated/platform.go | 4 +++- schema/worker/federated/platform_string.go | 20 +++++++++++-------- schema/worker/federated/worker.go | 6 ++++-- schema/worker/federated/worker_string.go | 20 +++++++++++-------- 17 files changed, 50 insertions(+), 60 deletions(-) delete mode 100644 internal/engine/worker/atproto/factory.go rename internal/engine/worker/{atproto/core => federated/bluesky}/worker.go (99%) rename internal/engine/worker/federated/{core => }/mastodon/worker.go (99%) rename internal/engine/worker/federated/{core => }/mastodon/worker_test.go (100%) diff --git a/config/config_test.go b/config/config_test.go index ea19963d5..bb4fc49c2 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -323,7 +323,7 @@ var configFileExpected = &File{ Federated: []*Module{ { Network: network.Mastodon, - Worker: federated.Core, + Worker: federated.Mastodon, EndpointID: "mastodon", Endpoint: Endpoint{ URL: "https://newdomain.ngrok.app", diff --git a/deploy/config.example.yaml b/deploy/config.example.yaml index e1f426ca4..2dc259f03 100644 --- a/deploy/config.example.yaml +++ b/deploy/config.example.yaml @@ -90,7 +90,7 @@ component: # mastodon - id: mastodon-core network: mastodon - worker: core + worker: mastodon endpoint: mastodon parameters: relay_url_list: [ "https://relay.fedi.buzz/instance/mastodon.social"] @@ -99,7 +99,7 @@ component: # bluesky - id: bluesky-core network: bluesky - worker: core + worker: bluesky endpoint: parameters: username: diff --git a/docs/schemas/FederatedPlatform.yaml b/docs/schemas/FederatedPlatform.yaml index ed8b91f85..9f47208fa 100644 --- a/docs/schemas/FederatedPlatform.yaml +++ b/docs/schemas/FederatedPlatform.yaml @@ -2,6 +2,7 @@ type: string enum: - Unknown - Mastodon + - Bluesky x-go-type: federated.Platform x-go-type-skip-optional-pointer: true x-go-type-import: diff --git a/docs/schemas/FederatedWorker.yaml b/docs/schemas/FederatedWorker.yaml index 78d37b66e..bbbd6bf3d 100644 --- a/docs/schemas/FederatedWorker.yaml +++ b/docs/schemas/FederatedWorker.yaml @@ -1,6 +1,7 @@ type: string enum: - - core + - mastodon + - bluesky x-go-type: federated.Worker x-go-type-skip-optional-pointer: true x-go-type-import: diff --git a/internal/engine/worker/atproto/factory.go b/internal/engine/worker/atproto/factory.go deleted file mode 100644 index ca28f902b..000000000 --- a/internal/engine/worker/atproto/factory.go +++ /dev/null @@ -1,20 +0,0 @@ -package atproto - -import ( - "fmt" - - "github.com/rss3-network/node/config" - "github.com/rss3-network/node/internal/database" - "github.com/rss3-network/node/internal/engine" - "github.com/rss3-network/node/internal/engine/worker/atproto/core" - "github.com/rss3-network/node/schema/worker/atproto" -) - -func New(config *config.Module, databaseClient database.Client) (engine.Worker, error) { - switch config.Worker { - case atproto.Core: - return core.NewWorker(databaseClient) - default: - return nil, fmt.Errorf("unsupported worker %s", config.Worker) - } -} diff --git a/internal/engine/worker/atproto/core/worker.go b/internal/engine/worker/federated/bluesky/worker.go similarity index 99% rename from internal/engine/worker/atproto/core/worker.go rename to internal/engine/worker/federated/bluesky/worker.go index 974e32c0a..821021a35 100644 --- a/internal/engine/worker/atproto/core/worker.go +++ b/internal/engine/worker/federated/bluesky/worker.go @@ -1,4 +1,4 @@ -package core +package bluesky import ( "context" diff --git a/internal/engine/worker/federated/factory.go b/internal/engine/worker/federated/factory.go index 746136c7d..a4c2d6296 100644 --- a/internal/engine/worker/federated/factory.go +++ b/internal/engine/worker/federated/factory.go @@ -7,14 +7,17 @@ import ( "github.com/rss3-network/node/config" "github.com/rss3-network/node/internal/database" "github.com/rss3-network/node/internal/engine" - "github.com/rss3-network/node/internal/engine/worker/federated/core/mastodon" + "github.com/rss3-network/node/internal/engine/worker/federated/bluesky" + "github.com/rss3-network/node/internal/engine/worker/federated/mastodon" "github.com/rss3-network/node/schema/worker/federated" ) func New(config *config.Module, databaseClient database.Client, redisClient rueidis.Client) (engine.Worker, error) { switch config.Worker.(federated.Worker) { - case federated.Core: + case federated.Mastodon: return mastodon.NewWorker(databaseClient, redisClient) + case federated.Bluesky: + return bluesky.NewWorker(databaseClient) default: return nil, fmt.Errorf("[federated/factory.go] unsupported worker %s", config.Worker) } diff --git a/internal/engine/worker/federated/core/mastodon/worker.go b/internal/engine/worker/federated/mastodon/worker.go similarity index 99% rename from internal/engine/worker/federated/core/mastodon/worker.go rename to internal/engine/worker/federated/mastodon/worker.go index f1a4873df..eeadcc149 100644 --- a/internal/engine/worker/federated/core/mastodon/worker.go +++ b/internal/engine/worker/federated/mastodon/worker.go @@ -39,7 +39,7 @@ type worker struct { } func (w *worker) Name() string { - return federated.Core.String() + return federated.Mastodon.String() } func (w *worker) Platform() string { diff --git a/internal/engine/worker/federated/core/mastodon/worker_test.go b/internal/engine/worker/federated/mastodon/worker_test.go similarity index 100% rename from internal/engine/worker/federated/core/mastodon/worker_test.go rename to internal/engine/worker/federated/mastodon/worker_test.go diff --git a/internal/engine/worker/rss/factory.go b/internal/engine/worker/rss/factory.go index e0d1cbbe1..7f49b5a2c 100644 --- a/internal/engine/worker/rss/factory.go +++ b/internal/engine/worker/rss/factory.go @@ -7,7 +7,7 @@ import ( "github.com/rss3-network/node/config" "github.com/rss3-network/node/internal/database" "github.com/rss3-network/node/internal/engine" - "github.com/rss3-network/node/internal/engine/worker/federated/core/mastodon" + "github.com/rss3-network/node/internal/engine/worker/federated/mastodon" "github.com/rss3-network/node/schema/worker/rss" ) diff --git a/internal/node/component/info/network_config.go b/internal/node/component/info/network_config.go index bbef2450c..1f75a8e24 100644 --- a/internal/node/component/info/network_config.go +++ b/internal/node/component/info/network_config.go @@ -399,7 +399,7 @@ var NetworkToWorkersMap = map[network.Network][]worker.Worker{ decentralized.Zerion, }, network.Mastodon: { - federated.Core, + federated.Mastodon, }, network.Near: { decentralized.Core, @@ -451,7 +451,7 @@ var NetworkToWorkersMap = map[network.Network][]worker.Worker{ // WorkerToConfigMap is a map of worker to config. var WorkerToConfigMap = map[network.Protocol]map[worker.Worker]workerConfig{ network.ActivityPubProtocol: { - federated.Core: customWorkerConfig(federated.Core, network.ActivityPubProtocol, &Parameters{ + federated.Mastodon: customWorkerConfig(federated.Mastodon, network.ActivityPubProtocol, &Parameters{ RelayURLList: &ConfigDetail{ IsRequired: false, Type: URLArrayType, diff --git a/internal/node/indexer/server.go b/internal/node/indexer/server.go index 5893b641d..ac30d1d53 100644 --- a/internal/node/indexer/server.go +++ b/internal/node/indexer/server.go @@ -14,7 +14,6 @@ import ( "github.com/rss3-network/node/internal/database" "github.com/rss3-network/node/internal/engine" "github.com/rss3-network/node/internal/engine/protocol" - atprotoWorker "github.com/rss3-network/node/internal/engine/worker/atproto" decentralizedWorker "github.com/rss3-network/node/internal/engine/worker/decentralized" federatedWorker "github.com/rss3-network/node/internal/engine/worker/federated" "github.com/rss3-network/node/internal/node/monitor" @@ -343,18 +342,12 @@ func NewServer(ctx context.Context, config *config.Module, databaseClient databa zap.L().Debug("created decentralized worker", zap.String("protocol", string(config.Network.Protocol()))) - case network.ActivityPubProtocol: + case network.ActivityPubProtocol, network.ATProtocol: if instance.worker, err = federatedWorker.New(instance.config, databaseClient, instance.redisClient); err != nil { return nil, fmt.Errorf("new federated worker: %w", err) } zap.L().Debug("created federated worker") - case network.ATProtocol: - if instance.worker, err = atprotoWorker.New(instance.config, databaseClient); err != nil { - return nil, fmt.Errorf("new atproto worker: %w", err) - } - - zap.L().Debug("create atproto worker") default: return nil, fmt.Errorf("unknown worker protocol: %s", config.Network.Protocol()) } diff --git a/internal/node/monitor/monitor_test.go b/internal/node/monitor/monitor_test.go index 3cea36373..2190a40ec 100644 --- a/internal/node/monitor/monitor_test.go +++ b/internal/node/monitor/monitor_test.go @@ -944,7 +944,7 @@ func TestMonitor(t *testing.T) { { ID: "mastodon-core", Network: network.Mastodon, - Worker: federated.Core, + Worker: federated.Mastodon, Parameters: &config.Parameters{ "relay_url_list": []string{ "https://relay.fedi.buzz/instance/mastodon.social", @@ -972,7 +972,7 @@ func TestMonitor(t *testing.T) { { ID: "mastodon-core", Network: network.Mastodon, - Worker: federated.Core, + Worker: federated.Mastodon, Parameters: &config.Parameters{ "relay_url_list": []string{ "https://relay.wszz/instance/mast.ocial", diff --git a/schema/worker/federated/platform.go b/schema/worker/federated/platform.go index 0a7bc4b88..e038fde0f 100644 --- a/schema/worker/federated/platform.go +++ b/schema/worker/federated/platform.go @@ -9,6 +9,7 @@ type Platform uint64 const ( PlatformUnknown Platform = iota // Unknown PlatformMastodon // Mastodon + PlatformBluesky // Bluesky ) var _ echo.BindUnmarshaler = (*Platform)(nil) @@ -26,5 +27,6 @@ func (p *Platform) UnmarshalParam(param string) error { // ToPlatformMap is a map of worker to platform var ToPlatformMap = map[Worker]Platform{ - Core: PlatformMastodon, + Mastodon: PlatformMastodon, + Bluesky: PlatformBluesky, } diff --git a/schema/worker/federated/platform_string.go b/schema/worker/federated/platform_string.go index 876948720..572b6e441 100644 --- a/schema/worker/federated/platform_string.go +++ b/schema/worker/federated/platform_string.go @@ -9,11 +9,11 @@ import ( "strings" ) -const _PlatformName = "UnknownMastodon" +const _PlatformName = "UnknownMastodonBluesky" -var _PlatformIndex = [...]uint8{0, 7, 15} +var _PlatformIndex = [...]uint8{0, 7, 15, 22} -const _PlatformLowerName = "unknownmastodon" +const _PlatformLowerName = "unknownmastodonbluesky" func (i Platform) String() string { if i >= Platform(len(_PlatformIndex)-1) { @@ -32,20 +32,24 @@ func _PlatformNoOp() { var x [1]struct{} _ = x[PlatformUnknown-(0)] _ = x[PlatformMastodon-(1)] + _ = x[PlatformBluesky-(2)] } -var _PlatformValues = []Platform{PlatformUnknown, PlatformMastodon} +var _PlatformValues = []Platform{PlatformUnknown, PlatformMastodon, PlatformBluesky} var _PlatformNameToValueMap = map[string]Platform{ - _PlatformName[0:7]: PlatformUnknown, - _PlatformLowerName[0:7]: PlatformUnknown, - _PlatformName[7:15]: PlatformMastodon, - _PlatformLowerName[7:15]: PlatformMastodon, + _PlatformName[0:7]: PlatformUnknown, + _PlatformLowerName[0:7]: PlatformUnknown, + _PlatformName[7:15]: PlatformMastodon, + _PlatformLowerName[7:15]: PlatformMastodon, + _PlatformName[15:22]: PlatformBluesky, + _PlatformLowerName[15:22]: PlatformBluesky, } var _PlatformNames = []string{ _PlatformName[0:7], _PlatformName[7:15], + _PlatformName[15:22], } // PlatformString retrieves an enum value from the enum constants string name. diff --git a/schema/worker/federated/worker.go b/schema/worker/federated/worker.go index 55d250908..6c0f7070d 100644 --- a/schema/worker/federated/worker.go +++ b/schema/worker/federated/worker.go @@ -10,7 +10,8 @@ import ( type Worker int const ( - Core Worker = iota + 1 // core + Mastodon Worker = iota + 1 // mastodon + Bluesky // bluesky ) func (w Worker) Component() string { @@ -40,5 +41,6 @@ func GetValueByWorkerStr(workerStr string) Worker { // ToTagsMap is a map of worker to tags var ToTagsMap = map[Worker][]tag.Tag{ - Core: {tag.Social}, + Mastodon: {tag.Social}, + Bluesky: {tag.Social}, } diff --git a/schema/worker/federated/worker_string.go b/schema/worker/federated/worker_string.go index c30139607..d8c8002b0 100644 --- a/schema/worker/federated/worker_string.go +++ b/schema/worker/federated/worker_string.go @@ -9,11 +9,11 @@ import ( "strings" ) -const _WorkerName = "core" +const _WorkerName = "mastodonbluesky" -var _WorkerIndex = [...]uint8{0, 4} +var _WorkerIndex = [...]uint8{0, 8, 15} -const _WorkerLowerName = "core" +const _WorkerLowerName = "mastodonbluesky" func (i Worker) String() string { i -= 1 @@ -31,18 +31,22 @@ func (Worker) Values() []string { // Re-run the stringer command to generate them again. func _WorkerNoOp() { var x [1]struct{} - _ = x[Core-(1)] + _ = x[Mastodon-(1)] + _ = x[Bluesky-(2)] } -var _WorkerValues = []Worker{Core} +var _WorkerValues = []Worker{Mastodon, Bluesky} var _WorkerNameToValueMap = map[string]Worker{ - _WorkerName[0:4]: Core, - _WorkerLowerName[0:4]: Core, + _WorkerName[0:8]: Mastodon, + _WorkerLowerName[0:8]: Mastodon, + _WorkerName[8:15]: Bluesky, + _WorkerLowerName[8:15]: Bluesky, } var _WorkerNames = []string{ - _WorkerName[0:4], + _WorkerName[0:8], + _WorkerName[8:15], } // WorkerString retrieves an enum value from the enum constants string name. From 2fee615f581a2daf6a2cfc087d0f96a09f5ec3ab Mon Sep 17 00:00:00 2001 From: polebug Date: Thu, 12 Dec 2024 21:34:22 +0800 Subject: [PATCH 22/31] chore: update config --- deploy/config.example.yaml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/deploy/config.example.yaml b/deploy/config.example.yaml index 2dc259f03..ff007a7a3 100644 --- a/deploy/config.example.yaml +++ b/deploy/config.example.yaml @@ -85,7 +85,7 @@ component: parameters: # `concurrent_block_requests` is used to specify the number of concurrent block requests. concurrent_block_requests: 2 - # `federated` network type includes workers indexing data from federated networks such as ActivityPub. + # `federated` network type includes workers indexing data from federated networks such as ActivityPub, Atprotocol. federated: # mastodon - id: mastodon-core @@ -95,7 +95,6 @@ component: parameters: relay_url_list: [ "https://relay.fedi.buzz/instance/mastodon.social"] port: 8181 - atproto: # bluesky - id: bluesky-core network: bluesky From 3fbad13255930b128449f747fe9e31ba360fced6 Mon Sep 17 00:00:00 2001 From: polebug Date: Fri, 13 Dec 2024 16:01:05 +0800 Subject: [PATCH 23/31] chore(core): update federated handlers API --- config/config.go | 10 -- .../engine/worker/federated/bluesky/worker.go | 8 +- .../worker/federated/mastodon/worker_test.go | 1 + internal/node/component/federated/data.go | 9 +- .../component/federated/handler_handles.go | 106 +++++++++---- schema/worker/atproto/platform.go | 29 ---- schema/worker/atproto/platform_string.go | 148 ------------------ schema/worker/atproto/worker.go | 43 ----- schema/worker/atproto/worker_string.go | 145 ----------------- 9 files changed, 85 insertions(+), 414 deletions(-) delete mode 100644 schema/worker/atproto/platform.go delete mode 100644 schema/worker/atproto/platform_string.go delete mode 100644 schema/worker/atproto/worker.go delete mode 100644 schema/worker/atproto/worker_string.go diff --git a/config/config.go b/config/config.go index 5135be174..72d60139c 100644 --- a/config/config.go +++ b/config/config.go @@ -14,7 +14,6 @@ import ( "github.com/mitchellh/mapstructure" "github.com/rss3-network/node/provider/ethereum" "github.com/rss3-network/node/schema/worker" - "github.com/rss3-network/node/schema/worker/atproto" "github.com/rss3-network/node/schema/worker/federated" "github.com/rss3-network/node/schema/worker/rss" "github.com/rss3-network/protocol-go/schema/network" @@ -287,15 +286,6 @@ func _Setup(configName, configType string, v *viper.Viper) (*File, error) { } } - // Add extra logic to convert atproto worker string to correct worker type. - if configFile.Component.Atproto != nil { - for _, module := range configFile.Component.Atproto { - if atprotoWorker := atproto.GetValueByWorkerStr(module.Worker.Name()); atprotoWorker != 0 { - module.Worker = atprotoWorker - } - } - } - // Use a function to load the endpoint for each module, because mapstructure doesn't support the use of custom unmarshaler. // Reference https://github.com/mitchellh/mapstructure/issues/115. if err := configFile.LoadModulesEndpoint(); err != nil { diff --git a/internal/engine/worker/federated/bluesky/worker.go b/internal/engine/worker/federated/bluesky/worker.go index 821021a35..8d6b2a6aa 100644 --- a/internal/engine/worker/federated/bluesky/worker.go +++ b/internal/engine/worker/federated/bluesky/worker.go @@ -11,7 +11,7 @@ import ( "github.com/rss3-network/node/internal/engine" source "github.com/rss3-network/node/internal/engine/protocol/atproto" at "github.com/rss3-network/node/provider/atproto" - "github.com/rss3-network/node/schema/worker/atproto" + "github.com/rss3-network/node/schema/worker/federated" "github.com/rss3-network/protocol-go/schema" activityx "github.com/rss3-network/protocol-go/schema/activity" "github.com/rss3-network/protocol-go/schema/metadata" @@ -33,11 +33,11 @@ type worker struct { } func (w *worker) Name() string { - return atproto.Core.String() + return federated.Bluesky.String() } func (w *worker) Platform() string { - return atproto.PlatformBluesky.String() + return federated.PlatformBluesky.String() } func (w *worker) Network() []network.Network { @@ -238,7 +238,7 @@ func (w *worker) buildPostAction(from string, to string, typex schema.Type, post return &activityx.Action{ Tag: typex.Tag(), Type: typex, - Platform: atproto.PlatformBluesky.String(), + Platform: federated.PlatformBluesky.String(), From: from, To: to, Metadata: post, diff --git a/internal/engine/worker/federated/mastodon/worker_test.go b/internal/engine/worker/federated/mastodon/worker_test.go index 7568a3d84..6a3477998 100644 --- a/internal/engine/worker/federated/mastodon/worker_test.go +++ b/internal/engine/worker/federated/mastodon/worker_test.go @@ -56,6 +56,7 @@ func setup(t *testing.T) { // If starting fails, wait a bit and try again time.Sleep(time.Second * 2) } + require.NoError(t, err, "Failed to start Redis container after multiple attempts") t.Cleanup(func() { diff --git a/internal/node/component/federated/data.go b/internal/node/component/federated/data.go index e296e087b..0ea024f9f 100644 --- a/internal/node/component/federated/data.go +++ b/internal/node/component/federated/data.go @@ -70,7 +70,12 @@ func (c *Component) transformCursor(_ context.Context, activity *activityx.Activ return fmt.Sprintf("%s:%s", activity.ID, activity.Network) } -// getUpdatedHandles retrieves the updated Mastodon handles from the database. -func (c *Component) getUpdatedHandles(ctx context.Context, query model.QueryMastodonHandles) ([]*model.MastodonHandle, error) { +// loadMastodonHandles retrieves the updated Mastodon handles from the database. +func (c *Component) loadMastodonHandles(ctx context.Context, query model.QueryMastodonHandles) ([]*model.MastodonHandle, error) { return c.databaseClient.GetUpdatedMastodonHandles(ctx, query) } + +// loadBlueskyProfiles retrieves the Bluesky profiles from the database. +func (c *Component) loadBlueskyProfiles(ctx context.Context, query model.QueryBlueskyProfiles) ([]*model.BlueskyProfile, error) { + return c.databaseClient.LoadDatasetBlueskyProfiles(ctx, query) +} diff --git a/internal/node/component/federated/handler_handles.go b/internal/node/component/federated/handler_handles.go index 58b790abc..5901ec676 100644 --- a/internal/node/component/federated/handler_handles.go +++ b/internal/node/component/federated/handler_handles.go @@ -1,17 +1,18 @@ package federated import ( + "context" "net/http" + "github.com/creasty/defaults" "github.com/labstack/echo/v4" "github.com/rss3-network/node/common/http/response" "github.com/rss3-network/node/internal/database/model" + "github.com/rss3-network/node/schema/worker/federated" "github.com/samber/lo" "go.uber.org/zap" ) -var defaultLimit = 100 - // GetHandles retrieves all active handles or updated handles based on the 'since' parameter func (c *Component) GetHandles(ctx echo.Context) error { var request HandleRequest @@ -19,66 +20,105 @@ func (c *Component) GetHandles(ctx echo.Context) error { return response.BadRequestError(ctx, err) } - if request.Limit == 0 { - request.Limit = defaultLimit + if err := defaults.Set(&request); err != nil { + return response.BadRequestError(ctx, err) } - zap.L().Debug("processing get handles request", - zap.Uint64("since", request.Since), - zap.Int("limit", request.Limit), - zap.String("cursor", request.Cursor)) + zap.L().Debug("processing get handles request", zap.Any("request", request)) // Validate request if err := ctx.Validate(&request); err != nil { return response.ValidationFailedError(ctx, err) } + var ( + handles = make([]string, 0) + err error + cursor string + ) + + if request.Platform == federated.PlatformMastodon { + handles, err = c.getMastodonHandles(ctx.Request().Context(), request) + } + + if err != nil { + zap.L().Error("failed to get handles", zap.Error(err)) + + return response.InternalError(ctx) + } + + if len(handles) > 0 && len(handles) == request.Limit { + cursor = handles[len(handles)-1] + } + + return ctx.JSON(http.StatusOK, PaginatedHandlesResponse{ + Platform: request.Platform, + Handles: handles, + Cursor: cursor, + TotalCount: int64(len(handles)), + }) +} + +func (c *Component) getMastodonHandles(ctx context.Context, request HandleRequest) ([]string, error) { query := model.QueryMastodonHandles{ Limit: lo.ToPtr(request.Limit), - Since: lo.Ternary(request.Since > 0, lo.ToPtr(request.Since), nil), - Cursor: lo.Ternary(request.Cursor != "", lo.ToPtr(request.Cursor), nil), + Since: request.Since, + Cursor: request.Cursor, } - res, err := c.getUpdatedHandles(ctx.Request().Context(), query) + res, err := c.loadMastodonHandles(ctx, query) if err != nil { - zap.L().Error("failed to get updated handles", + zap.L().Error("failed to get mastodon handles", zap.Error(err), zap.Any("query", query)) - return response.InternalError(ctx) + return nil, err } handles := make([]string, 0, len(res)) - var cursor string - - for i, handle := range res { + for _, handle := range res { handles = append(handles, handle.Handle) + } - if i == len(res)-1 && len(res) == request.Limit { - cursor = handle.Handle - } + return handles, nil +} + +func (c *Component) getBlueskyHandles(ctx context.Context, request HandleRequest) ([]string, error) { + query := model.QueryBlueskyProfiles{ + Limit: lo.ToPtr(request.Limit), + Since: request.Since, + Cursor: request.Cursor, } - zap.L().Info("successfully retrieved handles", - zap.Int("count", len(handles)), - zap.String("cursor", cursor)) + res, err := c.loadBlueskyProfiles(ctx, query) + if err != nil { + zap.L().Error("failed to get bluesky profiles", + zap.Error(err), + zap.Any("query", query)) - return ctx.JSON(http.StatusOK, PaginatedHandlesResponse{ - Handles: handles, - Cursor: cursor, - TotalCount: int64(len(handles)), - }) + return nil, err + } + + handles := make([]string, 0, len(res)) + + for _, handle := range res { + handles = append(handles, handle.Handle) + } + + return handles, nil } type HandleRequest struct { - Since uint64 `query:"since"` - Limit int `query:"limit" validate:"omitempty,min=1,max=500"` - Cursor string `query:"cursor"` + Since *uint64 `query:"since"` + Limit int `query:"limit" default:"100" validate:"omitempty,min=1,max=500"` + Cursor *string `query:"cursor"` + Platform federated.Platform `query:"platform" default:"1" validate:"required"` } type PaginatedHandlesResponse struct { - Handles []string `json:"handles"` - Cursor string `json:"cursor,omitempty"` - TotalCount int64 `json:"total_count"` + Platform federated.Platform `json:"platform"` + Handles []string `json:"handles"` + Cursor string `json:"cursor,omitempty"` + TotalCount int64 `json:"total_count"` } diff --git a/schema/worker/atproto/platform.go b/schema/worker/atproto/platform.go deleted file mode 100644 index 8b5015b47..000000000 --- a/schema/worker/atproto/platform.go +++ /dev/null @@ -1,29 +0,0 @@ -package atproto - -import "github.com/labstack/echo/v4" - -//go:generate go run --mod=mod github.com/dmarkham/enumer@v1.5.9 --values --type=Platform --linecomment --output platform_string.go --json --yaml --sql -type Platform uint64 - -const ( - PlatformUnknown Platform = iota // Unknown - PlatformBluesky // Bluesky -) - -var _ echo.BindUnmarshaler = (*Platform)(nil) - -func (p *Platform) UnmarshalParam(param string) error { - platform, err := PlatformString(param) - if err != nil { - return err - } - - *p = platform - - return nil -} - -// ToPlatformMap is a map of worker to platform -var ToPlatformMap = map[Worker]Platform{ - Core: PlatformBluesky, -} diff --git a/schema/worker/atproto/platform_string.go b/schema/worker/atproto/platform_string.go deleted file mode 100644 index 15bcb0f16..000000000 --- a/schema/worker/atproto/platform_string.go +++ /dev/null @@ -1,148 +0,0 @@ -// Code generated by "enumer --values --type=Platform --linecomment --output platform_string.go --json --yaml --sql"; DO NOT EDIT. - -package atproto - -import ( - "database/sql/driver" - "encoding/json" - "fmt" - "strings" -) - -const _PlatformName = "UnknownBluesky" - -var _PlatformIndex = [...]uint8{0, 7, 14} - -const _PlatformLowerName = "unknownbluesky" - -func (i Platform) String() string { - if i >= Platform(len(_PlatformIndex)-1) { - return fmt.Sprintf("Platform(%d)", i) - } - return _PlatformName[_PlatformIndex[i]:_PlatformIndex[i+1]] -} - -func (Platform) Values() []string { - return PlatformStrings() -} - -// An "invalid array index" compiler error signifies that the constant values have changed. -// Re-run the stringer command to generate them again. -func _PlatformNoOp() { - var x [1]struct{} - _ = x[PlatformUnknown-(0)] - _ = x[PlatformBluesky-(1)] -} - -var _PlatformValues = []Platform{PlatformUnknown, PlatformBluesky} - -var _PlatformNameToValueMap = map[string]Platform{ - _PlatformName[0:7]: PlatformUnknown, - _PlatformLowerName[0:7]: PlatformUnknown, - _PlatformName[7:14]: PlatformBluesky, - _PlatformLowerName[7:14]: PlatformBluesky, -} - -var _PlatformNames = []string{ - _PlatformName[0:7], - _PlatformName[7:14], -} - -// PlatformString retrieves an enum value from the enum constants string name. -// Throws an error if the param is not part of the enum. -func PlatformString(s string) (Platform, error) { - if val, ok := _PlatformNameToValueMap[s]; ok { - return val, nil - } - - if val, ok := _PlatformNameToValueMap[strings.ToLower(s)]; ok { - return val, nil - } - return 0, fmt.Errorf("%s does not belong to Platform values", s) -} - -// PlatformValues returns all values of the enum -func PlatformValues() []Platform { - return _PlatformValues -} - -// PlatformStrings returns a slice of all String values of the enum -func PlatformStrings() []string { - strs := make([]string, len(_PlatformNames)) - copy(strs, _PlatformNames) - return strs -} - -// IsAPlatform returns "true" if the value is listed in the enum definition. "false" otherwise -func (i Platform) IsAPlatform() bool { - for _, v := range _PlatformValues { - if i == v { - return true - } - } - return false -} - -// MarshalJSON implements the json.Marshaler interface for Platform -func (i Platform) MarshalJSON() ([]byte, error) { - return json.Marshal(i.String()) -} - -// UnmarshalJSON implements the json.Unmarshaler interface for Platform -func (i *Platform) UnmarshalJSON(data []byte) error { - var s string - if err := json.Unmarshal(data, &s); err != nil { - return fmt.Errorf("Platform should be a string, got %s", data) - } - - var err error - *i, err = PlatformString(s) - return err -} - -// MarshalYAML implements a YAML Marshaler for Platform -func (i Platform) MarshalYAML() (interface{}, error) { - return i.String(), nil -} - -// UnmarshalYAML implements a YAML Unmarshaler for Platform -func (i *Platform) UnmarshalYAML(unmarshal func(interface{}) error) error { - var s string - if err := unmarshal(&s); err != nil { - return err - } - - var err error - *i, err = PlatformString(s) - return err -} - -func (i Platform) Value() (driver.Value, error) { - return i.String(), nil -} - -func (i *Platform) Scan(value interface{}) error { - if value == nil { - return nil - } - - var str string - switch v := value.(type) { - case []byte: - str = string(v) - case string: - str = v - case fmt.Stringer: - str = v.String() - default: - return fmt.Errorf("invalid value of Platform: %[1]T(%[1]v)", value) - } - - val, err := PlatformString(str) - if err != nil { - return err - } - - *i = val - return nil -} diff --git a/schema/worker/atproto/worker.go b/schema/worker/atproto/worker.go deleted file mode 100644 index 7c19533ec..000000000 --- a/schema/worker/atproto/worker.go +++ /dev/null @@ -1,43 +0,0 @@ -package atproto - -import ( - "github.com/labstack/echo/v4" - "github.com/rss3-network/protocol-go/schema/tag" -) - -//go:generate go run --mod=mod github.com/dmarkham/enumer@v1.5.9 --values --type=Worker --linecomment --output worker_string.go --json --yaml --sql -type Worker int - -const ( - Core Worker = iota + 1 // core -) - -func (w Worker) Component() string { - return "atproto" -} - -func (w Worker) Name() string { - return w.String() -} - -var _ echo.BindUnmarshaler = (*Worker)(nil) - -func (w *Worker) UnmarshalParam(param string) error { - worker, err := WorkerString(param) - if err != nil { - return err - } - - *w = worker - - return nil -} - -func GetValueByWorkerStr(workerStr string) Worker { - return _WorkerNameToValueMap[workerStr] -} - -// ToTagsMap is a map of worker to tags -var ToTagsMap = map[Worker][]tag.Tag{ - Core: {tag.Social}, -} diff --git a/schema/worker/atproto/worker_string.go b/schema/worker/atproto/worker_string.go deleted file mode 100644 index 91e1bd249..000000000 --- a/schema/worker/atproto/worker_string.go +++ /dev/null @@ -1,145 +0,0 @@ -// Code generated by "enumer --values --type=Worker --linecomment --output worker_string.go --json --yaml --sql"; DO NOT EDIT. - -package atproto - -import ( - "database/sql/driver" - "encoding/json" - "fmt" - "strings" -) - -const _WorkerName = "core" - -var _WorkerIndex = [...]uint8{0, 4} - -const _WorkerLowerName = "core" - -func (i Worker) String() string { - i -= 1 - if i < 0 || i >= Worker(len(_WorkerIndex)-1) { - return fmt.Sprintf("Worker(%d)", i+1) - } - return _WorkerName[_WorkerIndex[i]:_WorkerIndex[i+1]] -} - -func (Worker) Values() []string { - return WorkerStrings() -} - -// An "invalid array index" compiler error signifies that the constant values have changed. -// Re-run the stringer command to generate them again. -func _WorkerNoOp() { - var x [1]struct{} - _ = x[Core-(1)] -} - -var _WorkerValues = []Worker{Core} - -var _WorkerNameToValueMap = map[string]Worker{ - _WorkerName[0:4]: Core, - _WorkerLowerName[0:4]: Core, -} - -var _WorkerNames = []string{ - _WorkerName[0:4], -} - -// WorkerString retrieves an enum value from the enum constants string name. -// Throws an error if the param is not part of the enum. -func WorkerString(s string) (Worker, error) { - if val, ok := _WorkerNameToValueMap[s]; ok { - return val, nil - } - - if val, ok := _WorkerNameToValueMap[strings.ToLower(s)]; ok { - return val, nil - } - return 0, fmt.Errorf("%s does not belong to Worker values", s) -} - -// WorkerValues returns all values of the enum -func WorkerValues() []Worker { - return _WorkerValues -} - -// WorkerStrings returns a slice of all String values of the enum -func WorkerStrings() []string { - strs := make([]string, len(_WorkerNames)) - copy(strs, _WorkerNames) - return strs -} - -// IsAWorker returns "true" if the value is listed in the enum definition. "false" otherwise -func (i Worker) IsAWorker() bool { - for _, v := range _WorkerValues { - if i == v { - return true - } - } - return false -} - -// MarshalJSON implements the json.Marshaler interface for Worker -func (i Worker) MarshalJSON() ([]byte, error) { - return json.Marshal(i.String()) -} - -// UnmarshalJSON implements the json.Unmarshaler interface for Worker -func (i *Worker) UnmarshalJSON(data []byte) error { - var s string - if err := json.Unmarshal(data, &s); err != nil { - return fmt.Errorf("Worker should be a string, got %s", data) - } - - var err error - *i, err = WorkerString(s) - return err -} - -// MarshalYAML implements a YAML Marshaler for Worker -func (i Worker) MarshalYAML() (interface{}, error) { - return i.String(), nil -} - -// UnmarshalYAML implements a YAML Unmarshaler for Worker -func (i *Worker) UnmarshalYAML(unmarshal func(interface{}) error) error { - var s string - if err := unmarshal(&s); err != nil { - return err - } - - var err error - *i, err = WorkerString(s) - return err -} - -func (i Worker) Value() (driver.Value, error) { - return i.String(), nil -} - -func (i *Worker) Scan(value interface{}) error { - if value == nil { - return nil - } - - var str string - switch v := value.(type) { - case []byte: - str = string(v) - case string: - str = v - case fmt.Stringer: - str = v.String() - default: - return fmt.Errorf("invalid value of Worker: %[1]T(%[1]v)", value) - } - - val, err := WorkerString(str) - if err != nil { - return err - } - - *i = val - return nil -} From bc65a7b37ac4af642b91a8a5e3f10c47040c9d81 Mon Sep 17 00:00:00 2001 From: polebug Date: Fri, 13 Dec 2024 17:24:36 +0800 Subject: [PATCH 24/31] feat(core): transform bluesky handle into did --- internal/database/dialer/postgres/client.go | 4 ++ .../20241210031220_add_bluesky_profiles.sql | 4 +- .../database/model/dataset_bluesky_profile.go | 7 ++- internal/node/component/federated/data.go | 57 +++++++++++++++++++ 4 files changed, 68 insertions(+), 4 deletions(-) diff --git a/internal/database/dialer/postgres/client.go b/internal/database/dialer/postgres/client.go index f66591520..83f138bdb 100644 --- a/internal/database/dialer/postgres/client.go +++ b/internal/database/dialer/postgres/client.go @@ -522,6 +522,10 @@ func (c *client) LoadDatasetBlueskyProfiles(ctx context.Context, query model.Que databaseStatement = databaseStatement.Limit(*query.Limit) } + if query.Handles != nil { + databaseStatement = databaseStatement.Where("handle IN ?", query.Handles) + } + databaseStatement = databaseStatement.Order("updated_at DESC, created_at DESC") var profiles []*table.DatasetBlueskyProfile diff --git a/internal/database/dialer/postgres/migration/20241210031220_add_bluesky_profiles.sql b/internal/database/dialer/postgres/migration/20241210031220_add_bluesky_profiles.sql index 10ece4b80..bab236af2 100644 --- a/internal/database/dialer/postgres/migration/20241210031220_add_bluesky_profiles.sql +++ b/internal/database/dialer/postgres/migration/20241210031220_add_bluesky_profiles.sql @@ -8,7 +8,9 @@ CREATE TABLE IF NOT EXISTS dataset_bluesky_profiles "updated_at" timestamptz NOT NULL DEFAULT now() ); -CREATE INDEX idx_dataset_bluesky_profiles ON dataset_bluesky_profiles (updated_at DESC, created_at DESC); +CREATE INDEX idx_dataset_bluesky_profiles_cursor ON dataset_bluesky_profiles (updated_at DESC, created_at DESC); + +CREATE INDEX idx_dataset_bluesky_profiles_handle ON dataset_bluesky_profiles (handle); -- +goose StatementEnd -- +goose Down diff --git a/internal/database/model/dataset_bluesky_profile.go b/internal/database/model/dataset_bluesky_profile.go index 46156c123..dbcec12ce 100644 --- a/internal/database/model/dataset_bluesky_profile.go +++ b/internal/database/model/dataset_bluesky_profile.go @@ -10,7 +10,8 @@ type BlueskyProfile struct { } type QueryBlueskyProfiles struct { - Since *uint64 - Limit *int - Cursor *string + Since *uint64 + Limit *int + Cursor *string + Handles []string } diff --git a/internal/node/component/federated/data.go b/internal/node/component/federated/data.go index 0ea024f9f..1c9c9858d 100644 --- a/internal/node/component/federated/data.go +++ b/internal/node/component/federated/data.go @@ -3,6 +3,7 @@ package federated import ( "context" "fmt" + "go.uber.org/zap" "strings" "github.com/rss3-network/node/internal/database/model" @@ -12,10 +13,38 @@ import ( ) func (c *Component) getActivity(ctx context.Context, request model.ActivityQuery) (*activityx.Activity, *int, error) { + if request.Owner != nil { + owner := c.transformHandler(ctx, []string{lo.FromPtr(request.Owner)}) + + if len(owner) == 0 { + return nil, nil, nil + } + + request.Owner = lo.ToPtr(owner[0]) + } + return c.databaseClient.FindActivity(ctx, request) } func (c *Component) getActivities(ctx context.Context, request model.ActivitiesQuery) ([]*activityx.Activity, string, error) { + if request.Owner != nil { + owner := c.transformHandler(ctx, []string{lo.FromPtr(request.Owner)}) + + if len(owner) == 0 { + return nil, "", nil + } + + request.Owner = lo.ToPtr(owner[0]) + } + + if len(request.Owners) > 0 { + request.Owners = c.transformHandler(ctx, request.Owners) + + if len(request.Owners) == 0 { + return nil, "", nil + } + } + activities, err := c.databaseClient.FindActivities(ctx, request) if err != nil { return nil, "", fmt.Errorf("failed to find activities: %w", err) @@ -70,6 +99,34 @@ func (c *Component) transformCursor(_ context.Context, activity *activityx.Activ return fmt.Sprintf("%s:%s", activity.ID, activity.Network) } +func (c *Component) transformHandler(ctx context.Context, owners []string) []string { + var ( + blueskyHandlers = make([]string, 0, len(owners)) + results = make([]string, 0, len(owners)) + ) + + for _, owner := range owners { + if strings.Contains(owner, ".bsky.social") { + blueskyHandlers = append(blueskyHandlers, owner) + } else { + results = append(results, owner) + } + } + + blueskyProfiles, err := c.loadBlueskyProfiles(ctx, model.QueryBlueskyProfiles{Handles: blueskyHandlers}) + if err != nil { + zap.L().Error("failed to load bluesky profiles", zap.Error(err)) + } + + if len(blueskyProfiles) > 0 { + for _, profile := range blueskyProfiles { + results = append(results, profile.Handle) + } + } + + return results +} + // loadMastodonHandles retrieves the updated Mastodon handles from the database. func (c *Component) loadMastodonHandles(ctx context.Context, query model.QueryMastodonHandles) ([]*model.MastodonHandle, error) { return c.databaseClient.GetUpdatedMastodonHandles(ctx, query) From 7163ef202a4d0d65ea0f40d017d6d8b93f8cdcf9 Mon Sep 17 00:00:00 2001 From: polebug Date: Fri, 13 Dec 2024 17:58:03 +0800 Subject: [PATCH 25/31] chore: add retry logic for bluesky client --- internal/node/component/federated/data.go | 2 +- .../component/federated/handler_handles.go | 8 +- provider/atproto/bluesky/client.go | 84 ++++++++++++++----- 3 files changed, 70 insertions(+), 24 deletions(-) diff --git a/internal/node/component/federated/data.go b/internal/node/component/federated/data.go index 1c9c9858d..05f635e36 100644 --- a/internal/node/component/federated/data.go +++ b/internal/node/component/federated/data.go @@ -120,7 +120,7 @@ func (c *Component) transformHandler(ctx context.Context, owners []string) []str if len(blueskyProfiles) > 0 { for _, profile := range blueskyProfiles { - results = append(results, profile.Handle) + results = append(results, profile.DID) } } diff --git a/internal/node/component/federated/handler_handles.go b/internal/node/component/federated/handler_handles.go index 5901ec676..d47ec35c7 100644 --- a/internal/node/component/federated/handler_handles.go +++ b/internal/node/component/federated/handler_handles.go @@ -2,6 +2,7 @@ package federated import ( "context" + "fmt" "net/http" "github.com/creasty/defaults" @@ -37,8 +38,13 @@ func (c *Component) GetHandles(ctx echo.Context) error { cursor string ) - if request.Platform == federated.PlatformMastodon { + switch request.Platform { + case federated.PlatformMastodon: handles, err = c.getMastodonHandles(ctx.Request().Context(), request) + case federated.PlatformBluesky: + handles, err = c.getBlueskyHandles(ctx.Request().Context(), request) + default: + return response.BadRequestError(ctx, fmt.Errorf("unsupported platform")) } if err != nil { diff --git a/provider/atproto/bluesky/client.go b/provider/atproto/bluesky/client.go index c3e2b052e..a82c5c022 100644 --- a/provider/atproto/bluesky/client.go +++ b/provider/atproto/bluesky/client.go @@ -4,6 +4,7 @@ import ( "bytes" "context" "fmt" + "github.com/avast/retry-go/v4" "net" "net/http" "strings" @@ -63,8 +64,13 @@ func (c *Client) SyncListRepos(ctx context.Context, cursor string, limit int64) } // Fetch the list of repos - results, err := atproto.SyncListRepos(ctx, client.Client, cursor, limit) - if err != nil { + var results *atproto.SyncListRepos_Output + + if err := c.retrySource(ctx, func(ctx context.Context) error { + results, err = atproto.SyncListRepos(ctx, client.Client, cursor, limit) + + return err + }); err != nil { zap.L().Error("sync list repos failed", zap.Error(err)) return nil, nil, fmt.Errorf("sync list repos failed: %w", err) @@ -131,17 +137,27 @@ func (c *Client) SyncGetRepo(ctx context.Context, repoData *atproto.SyncListRepo return nil, fmt.Errorf("create xrpc client: %w", err) } + var handle string + // Get user handle from profile - handle, err := c.GetHandle(ctx, client, did) - if err != nil { + if err := c.retrySource(ctx, func(ctx context.Context) error { + handle, err = c.GetHandle(ctx, client, did) + + return err + }); err != nil { zap.L().Error("get profile failed", zap.Error(err)) return nil, fmt.Errorf("get profile: %w", err) } + var repoBytes []byte + // Fetch repo data - repoBytes, err := atproto.SyncGetRepo(ctx, client.Client, did.String(), "") - if err != nil { + if err := c.retrySource(ctx, func(ctx context.Context) error { + repoBytes, err = atproto.SyncGetRepo(ctx, client.Client, did.String(), "") + + return err + }); err != nil { zap.L().Error("get repo failed", zap.Error(err)) return nil, fmt.Errorf("get repo: %w", err) @@ -296,26 +312,36 @@ func (c *Client) GetRecord(ctx context.Context, repo string, path string) (*at.M Rkey: rkey, } - // Retrieve the record - resp, err := atproto.RepoGetRecord(ctx, client.Client, "", collection, repo, rkey) - if err != nil || resp == nil { - // fallback to default client - defaultClient, err := c.GetXrpcClient(ctx, BskyEndpoint) - if err != nil { - zap.L().Error("get xrpc client failed", zap.Error(err)) + var resp *atproto.RepoGetRecord_Output - return nil, nil, fmt.Errorf("get xrpc client: %w", err) - } + // Retrieve the record + if err := c.retrySource(ctx, func(ctx context.Context) error { + resp, err = atproto.RepoGetRecord(ctx, client.Client, "", collection, repo, rkey) + if err != nil || resp == nil { + // fallback to default client + defaultClient, err := c.GetXrpcClient(ctx, BskyEndpoint) + if err != nil { + zap.L().Error("get xrpc client failed", zap.Error(err)) - resp, err = atproto.RepoGetRecord(ctx, defaultClient.Client, "", collection, repo, rkey) - if err != nil { - // Handle CID too short error gracefully - if strings.Contains(err.Error(), cid.ErrCidTooShort.Error()) || strings.Contains(err.Error(), "XRPC ERROR 400") { - return message, nil, nil + return fmt.Errorf("get xrpc client: %w", err) } - return nil, nil, fmt.Errorf("repo get record: %w", err) + resp, err = atproto.RepoGetRecord(ctx, defaultClient.Client, "", collection, repo, rkey) + if err != nil { + // Handle CID too short error gracefully + if strings.Contains(err.Error(), cid.ErrCidTooShort.Error()) || strings.Contains(err.Error(), "XRPC ERROR 400") { + return nil + } + + return fmt.Errorf("repo get record: %w", err) + } } + + return nil + }); err != nil { + zap.L().Error("repo get record failed", zap.Error(err)) + + return nil, nil, fmt.Errorf("repo get record: %w", err) } if resp != nil && resp.Value != nil { @@ -345,7 +371,7 @@ func (c *Client) GetHandle(ctx context.Context, client *XrpcClient, did syntax.D return resp.Handle, nil } - return "", nil + return "", fmt.Errorf("handle not found for DID: %s", did) } // ParseRecord processes different types of records and updates the message. @@ -604,6 +630,20 @@ func (c *Client) LookupDIDEndpoint(ctx context.Context, did syntax.DID) string { return BskyEndpoint } +func (c *Client) retrySource(ctx context.Context, Func func(ctx context.Context) error) error { + return retry.Do( + func() error { + return Func(ctx) + }, + retry.Attempts(0), + retry.Delay(5*time.Second), + retry.DelayType(retry.BackOffDelay), + retry.OnRetry(func(n uint, err error) { + zap.L().Warn("retry bluesky source", zap.Uint("retry", n), zap.Error(err)) + }), + ) +} + type Option func(client *Client) error func WithFilter(filter []string) Option { From a87caa187695d132a7a7be2621882690c09b6751 Mon Sep 17 00:00:00 2001 From: polebug Date: Mon, 16 Dec 2024 16:35:17 +0800 Subject: [PATCH 26/31] chore --- cmd/main.go | 5 ----- config/config.go | 1 - deploy/config.example.yaml | 4 ++-- internal/database/dialer/postgres/client.go | 2 +- internal/node/component/federated/data.go | 2 +- internal/node/component/federated/handler_handles.go | 2 +- internal/node/component/info/network_config.go | 1 + provider/atproto/bluesky/client.go | 6 +++--- 8 files changed, 9 insertions(+), 14 deletions(-) diff --git a/cmd/main.go b/cmd/main.go index 0bd7299bc..3d1f219ce 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -329,11 +329,6 @@ func findModuleByID(configFile *config.File, workerID string) (*config.Module, e return module, nil } - // Search in atproto components - if module, found := findInComponent(configFile.Component.Atproto); found { - return module, nil - } - return nil, fmt.Errorf("undefined module %s", workerID) } diff --git a/config/config.go b/config/config.go index 72d60139c..ed5f33e82 100644 --- a/config/config.go +++ b/config/config.go @@ -90,7 +90,6 @@ type Server struct { type Component struct { RSS *Module `mapstructure:"rss"` Federated []*Module `mapstructure:"federated" validate:"dive"` - Atproto []*Module `mapstructure:"atproto" validate:"dive"` Decentralized []*Module `mapstructure:"decentralized" validate:"dive"` } diff --git a/deploy/config.example.yaml b/deploy/config.example.yaml index ff007a7a3..637c6429c 100644 --- a/deploy/config.example.yaml +++ b/deploy/config.example.yaml @@ -88,7 +88,7 @@ component: # `federated` network type includes workers indexing data from federated networks such as ActivityPub, Atprotocol. federated: # mastodon - - id: mastodon-core + - id: mastodon-mastodon network: mastodon worker: mastodon endpoint: mastodon @@ -96,7 +96,7 @@ component: relay_url_list: [ "https://relay.fedi.buzz/instance/mastodon.social"] port: 8181 # bluesky - - id: bluesky-core + - id: bluesky-bluesky network: bluesky worker: bluesky endpoint: diff --git a/internal/database/dialer/postgres/client.go b/internal/database/dialer/postgres/client.go index 83f138bdb..8a7e78f96 100644 --- a/internal/database/dialer/postgres/client.go +++ b/internal/database/dialer/postgres/client.go @@ -507,7 +507,7 @@ func (c *client) LoadDatasetBlueskyProfiles(ctx context.Context, query model.Que if query.Cursor != nil { var cursor *table.DatasetBlueskyProfile - if err := c.database.WithContext(ctx).First(&cursor, "did = ?", query.Cursor).Error; err != nil { + if err := c.database.WithContext(ctx).First(&cursor, "handle = ?", query.Cursor).Error; err != nil { return nil, fmt.Errorf("get handle cursor: %w", err) } diff --git a/internal/node/component/federated/data.go b/internal/node/component/federated/data.go index 05f635e36..e369795fb 100644 --- a/internal/node/component/federated/data.go +++ b/internal/node/component/federated/data.go @@ -3,13 +3,13 @@ package federated import ( "context" "fmt" - "go.uber.org/zap" "strings" "github.com/rss3-network/node/internal/database/model" activityx "github.com/rss3-network/protocol-go/schema/activity" networkx "github.com/rss3-network/protocol-go/schema/network" "github.com/samber/lo" + "go.uber.org/zap" ) func (c *Component) getActivity(ctx context.Context, request model.ActivityQuery) (*activityx.Activity, *int, error) { diff --git a/internal/node/component/federated/handler_handles.go b/internal/node/component/federated/handler_handles.go index d47ec35c7..5fc3331f8 100644 --- a/internal/node/component/federated/handler_handles.go +++ b/internal/node/component/federated/handler_handles.go @@ -33,7 +33,7 @@ func (c *Component) GetHandles(ctx echo.Context) error { } var ( - handles = make([]string, 0) + handles []string err error cursor string ) diff --git a/internal/node/component/info/network_config.go b/internal/node/component/info/network_config.go index 1f75a8e24..775afe878 100644 --- a/internal/node/component/info/network_config.go +++ b/internal/node/component/info/network_config.go @@ -467,6 +467,7 @@ var WorkerToConfigMap = map[network.Protocol]map[worker.Worker]workerConfig{ Key: "parameters.port", }, }, mastodonInstanceEndpointDescription), + federated.Bluesky: customWorkerConfigWithoutEndpoint(federated.Bluesky, network.ActivityPubProtocol, nil, false), }, network.ArweaveProtocol: { decentralized.Mirror: customWorkerConfigWithoutEndpoint(decentralized.Mirror, network.ArweaveProtocol, nil, true), diff --git a/provider/atproto/bluesky/client.go b/provider/atproto/bluesky/client.go index a82c5c022..eeda7e312 100644 --- a/provider/atproto/bluesky/client.go +++ b/provider/atproto/bluesky/client.go @@ -4,7 +4,6 @@ import ( "bytes" "context" "fmt" - "github.com/avast/retry-go/v4" "net" "net/http" "strings" @@ -12,6 +11,7 @@ import ( "time" "github.com/araddon/dateparse" + "github.com/avast/retry-go/v4" "github.com/bluesky-social/indigo/api/atproto" "github.com/bluesky-social/indigo/api/bsky" "github.com/bluesky-social/indigo/atproto/identity" @@ -630,10 +630,10 @@ func (c *Client) LookupDIDEndpoint(ctx context.Context, did syntax.DID) string { return BskyEndpoint } -func (c *Client) retrySource(ctx context.Context, Func func(ctx context.Context) error) error { +func (c *Client) retrySource(ctx context.Context, f func(ctx context.Context) error) error { return retry.Do( func() error { - return Func(ctx) + return f(ctx) }, retry.Attempts(0), retry.Delay(5*time.Second), From 8eb0d112240c46849bec2e27beb6cd9cb9ab68c3 Mon Sep 17 00:00:00 2001 From: polebug Date: Mon, 16 Dec 2024 18:20:49 +0800 Subject: [PATCH 27/31] go mod --- go.mod | 67 +++++++++++++-- go.sum | 258 +++++++++++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 302 insertions(+), 23 deletions(-) diff --git a/go.mod b/go.mod index fb73a7876..72851e815 100644 --- a/go.mod +++ b/go.mod @@ -1,8 +1,8 @@ module github.com/rss3-network/node -go 1.22 +go 1.22.4 -toolchain go1.22.1 +toolchain go1.22.10 replace github.com/chenzhuoyu/iasm => github.com/cloudwego/iasm v0.2.0 @@ -57,22 +57,27 @@ require ( require ( github.com/adrianbrad/psqldocker v1.2.1 + github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de + github.com/bluesky-social/indigo v0.0.0-20241212185500-749cc07bf4eb github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 github.com/emirpasic/gods v1.18.1 github.com/getkin/kin-openapi v0.128.0 github.com/go-fed/httpsig v1.1.0 github.com/go-redsync/redsync/v4 v4.13.0 github.com/google/uuid v1.6.0 + github.com/gorilla/websocket v1.5.3 github.com/grafana/pyroscope-go v1.2.0 github.com/jaytaylor/html2text v0.0.0-20230321000545-74c2419ad056 github.com/mitchellh/mapstructure v1.5.0 github.com/oapi-codegen/oapi-codegen/v2 v2.4.1 github.com/redis/rueidis v1.0.51 github.com/redis/rueidis/rueidiscompat v1.0.51 - github.com/rss3-network/protocol-go v0.5.14 + github.com/reiver/go-bsky v0.0.0-20240906205655-8c7fadb4f3bb + github.com/rss3-network/protocol-go v0.5.16 github.com/spf13/afero v1.11.0 github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 github.com/vincent-petithory/dataurl v1.0.0 + github.com/whyrusleeping/cbor-gen v0.2.1-0.20241030202151-b7a6831be65e golang.org/x/net v0.32.0 ) @@ -83,12 +88,20 @@ require ( github.com/Microsoft/go-winio v0.6.2 // indirect github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 // indirect github.com/PuerkitoBio/goquery v1.9.2 // indirect + github.com/RussellLuo/slidingwindow v0.0.0-20200528002341-535bb99d338b // indirect github.com/andybalholm/cascadia v1.3.2 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bits-and-blooms/bitset v1.10.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/btcsuite/btcd/chaincfg/chainhash v1.0.2 // indirect + github.com/carlmjohnson/versioninfo v0.22.5 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cockroachdb/errors v1.11.3 // indirect + github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce // indirect + github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect + github.com/cockroachdb/pebble v1.1.2 // indirect + github.com/cockroachdb/redact v1.1.5 // indirect + github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect github.com/consensys/bavard v0.1.13 // indirect github.com/consensys/gnark-crypto v0.12.1 // indirect github.com/containerd/continuity v0.4.3 // indirect @@ -104,6 +117,7 @@ require ( github.com/ethereum/c-kzg-4844 v0.4.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/getsentry/sentry-go v0.27.0 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.3.0 // indirect @@ -117,25 +131,53 @@ require ( github.com/gogs/chardet v0.0.0-20211120154057-b7413eaefb8f // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect - github.com/gorilla/websocket v1.5.0 // indirect github.com/grafana/pyroscope-go/godeltaprof v0.1.8 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/hashicorp/go-retryablehttp v0.7.5 // indirect + github.com/hashicorp/golang-lru v1.0.2 // indirect + github.com/hashicorp/golang-lru/arc/v2 v2.0.6 // indirect + github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/holiman/uint256 v1.2.4 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/invopop/yaml v0.3.1 // indirect + github.com/ipfs/bbloom v0.0.4 // indirect + github.com/ipfs/go-block-format v0.2.0 // indirect + github.com/ipfs/go-blockservice v0.5.2 // indirect + github.com/ipfs/go-datastore v0.6.0 // indirect + github.com/ipfs/go-ipfs-blockstore v1.3.1 // indirect + github.com/ipfs/go-ipfs-ds-help v1.1.1 // indirect + github.com/ipfs/go-ipfs-exchange-interface v0.2.1 // indirect + github.com/ipfs/go-ipfs-util v0.0.3 // indirect + github.com/ipfs/go-ipld-cbor v0.1.0 // indirect + github.com/ipfs/go-ipld-format v0.6.0 // indirect + github.com/ipfs/go-ipld-legacy v0.2.1 // indirect + github.com/ipfs/go-libipfs v0.7.0 // indirect + github.com/ipfs/go-log v1.0.5 // indirect + github.com/ipfs/go-log/v2 v2.5.1 // indirect + github.com/ipfs/go-merkledag v0.11.0 // indirect + github.com/ipfs/go-metrics-interface v0.0.1 // indirect + github.com/ipfs/go-verifcid v0.0.3 // indirect + github.com/ipld/go-car v0.6.2 // indirect + github.com/ipld/go-car/v2 v2.13.1 // indirect + github.com/ipld/go-codec-dagpb v1.6.0 // indirect + github.com/ipld/go-ipld-prime v0.21.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect github.com/jackc/pgx/v5 v5.7.1 // indirect github.com/jackc/puddle/v2 v2.2.2 // indirect + github.com/jbenet/goprocess v0.1.4 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/compress v1.17.11 // indirect - github.com/klauspost/cpuid/v2 v2.2.5 // indirect + github.com/klauspost/cpuid/v2 v2.2.7 // indirect + github.com/kr/pretty v0.3.1 // indirect + github.com/kr/text v0.2.0 // indirect github.com/labstack/gommon v0.4.2 // indirect github.com/leodido/go-urn v1.4.0 // indirect github.com/magiconair/properties v1.8.7 // indirect @@ -162,16 +204,26 @@ require ( github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0 // indirect github.com/opencontainers/runc v1.1.12 // indirect + github.com/opentracing/opentracing-go v1.2.0 // indirect github.com/ory/dockertest/v3 v3.10.0 // indirect github.com/pelletier/go-toml/v2 v2.2.2 // indirect github.com/perimeterx/marshmallow v1.1.5 // indirect + github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 // indirect github.com/pierrec/lz4/v4 v4.1.21 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/polydawn/refmt v0.89.1-0.20221221234430-40501e09de1f // indirect github.com/prometheus/client_model v0.6.1 // indirect github.com/prometheus/common v0.60.1 // indirect github.com/prometheus/procfs v0.15.1 // indirect + github.com/reiver/go-atproto v0.0.0-20240906195827-a1832b0df821 // indirect + github.com/reiver/go-cast v0.0.0-20240904124821-be0103637c3f // indirect + github.com/reiver/go-erorr v0.0.0-20240801233437-8cbde6d1fa3f // indirect + github.com/reiver/go-fallback v0.0.0-20240906145154-1ce9eadf06a8 // indirect + github.com/reiver/go-maps v0.0.0-20240906190342-93be57f28be1 // indirect + github.com/reiver/go-reg v0.0.0-20240906195701-6e62f43c2835 // indirect github.com/rivo/uniseg v0.2.0 // indirect + github.com/rogpeppe/go-internal v1.13.1 // indirect github.com/sagikazarmark/locafero v0.4.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect github.com/sethvargo/go-retry v0.3.0 // indirect @@ -193,12 +245,16 @@ require ( github.com/valyala/fasttemplate v1.2.2 // indirect github.com/vektah/gqlparser/v2 v2.5.11 // indirect github.com/vmware-labs/yaml-jsonpath v0.3.2 // indirect + github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11 // indirect github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect github.com/xeipuuv/gojsonschema v1.2.0 // indirect github.com/yusufpapurcu/wmi v1.2.3 // indirect + gitlab.com/yawning/secp256k1-voi v0.0.0-20230925100816-f2616030848b // indirect + gitlab.com/yawning/tuplehash v0.0.0-20230713102510-df83abbf9a02 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.50.0 // indirect go.opentelemetry.io/proto/otlp v1.3.1 // indirect + go.uber.org/atomic v1.11.0 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/crypto v0.30.0 // indirect golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect @@ -207,6 +263,7 @@ require ( golang.org/x/text v0.21.0 // indirect golang.org/x/time v0.5.0 // indirect golang.org/x/tools v0.24.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 // indirect google.golang.org/grpc v1.67.1 // indirect diff --git a/go.sum b/go.sum index 9914ae84a..fdd789fad 100644 --- a/go.sum +++ b/go.sum @@ -4,6 +4,7 @@ filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/DataDog/zstd v1.5.0 h1:+K/VEwIAaPcHiMtQvpLD4lqW7f0Gk3xdYZmI1hD+CXo= github.com/DataDog/zstd v1.5.0/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= github.com/JohannesKaufmann/html-to-markdown v1.6.0 h1:04VXMiE50YYfCfLboJCLcgqF5x+rHJnb1ssNmqpLH/k= @@ -16,26 +17,38 @@ github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEV github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= github.com/PuerkitoBio/goquery v1.9.2 h1:4/wZksC3KgkQw7SQgkKotmKljk0M6V8TUvA8Wb4yPeE= github.com/PuerkitoBio/goquery v1.9.2/go.mod h1:GHPCaP0ODyyxqcNoFGYlAprUFH81NuRPd0GX3Zu2Mvk= +github.com/RussellLuo/slidingwindow v0.0.0-20200528002341-535bb99d338b h1:5/++qT1/z812ZqBvqQt6ToRswSuPZ/B33m6xVHRzADU= +github.com/RussellLuo/slidingwindow v0.0.0-20200528002341-535bb99d338b/go.mod h1:4+EPqMRApwwE/6yo6CxiHoSnBzjRr3jsqer7frxP8y4= github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= github.com/adrianbrad/psqldocker v1.2.1 h1:bvsRmbotpA89ruqGGzzaAZUBtDaIk98gO+JMBNVSZlI= github.com/adrianbrad/psqldocker v1.2.1/go.mod h1:LbCnIy60YO6IRJYrF1r+eafKUgU9UnkSFx0gT8UiaUs= +github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5 h1:iW0a5ljuFxkLGPNem5Ui+KBjFJzKg4Fv2fnxe4dvzpM= +github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5/go.mod h1:Y2QMoi1vgtOIfc+6DhrMOGkLoGzqSV2rKp4Sm+opsyA= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= github.com/andybalholm/cascadia v1.2.0/go.mod h1:YCyR8vOZT9aZ1CHEd8ap0gMVm2aFgxBp0T0eFw1RUQY= github.com/andybalholm/cascadia v1.3.2 h1:3Xi6Dw5lHF15JtdcmAHD3i1+T8plmv7BQ/nsViSLyss= github.com/andybalholm/cascadia v1.3.2/go.mod h1:7gtRlve5FxPPgIgX36uWBX58OdBsSS6lUvCFb+h7KvU= +github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de h1:FxWPpzIjnTlhPwqqXc4/vE0f7GvRjuAsbW+HOIe8KnA= +github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de/go.mod h1:DCaWoUhZrYW9p1lxo/cm8EmUOOzAPSEZNGF2DK1dJgw= github.com/avast/retry-go/v4 v4.6.0 h1:K9xNA+KeB8HHc2aWFuLb25Offp+0iVRXEvFx8IinRJA= github.com/avast/retry-go/v4 v4.6.0/go.mod h1:gvWlPhBVsvBbLkVGDg/KwvBv0bEkCOLRRSHKIr2PyOE= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= +github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88= github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/bluesky-social/indigo v0.0.0-20241212185500-749cc07bf4eb h1:clDqHPLM8pMJfH5jgcIhdMibJeWPOQ/f6obSaD+Xvv4= +github.com/bluesky-social/indigo v0.0.0-20241212185500-749cc07bf4eb/go.mod h1:SNFzA8zY8amwZzBvPfctX5DOpAG0OHan9qfbqCSTe2w= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.2 h1:KdUfX2zKommPRa+PD0sWZUyXe9w277ABlgELO7H04IM= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.2/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/carlmjohnson/versioninfo v0.22.5 h1:O00sjOLUAFxYQjlN/bzYTuZiS0y6fWDQjMRvwtKgwwc= +github.com/carlmjohnson/versioninfo v0.22.5/go.mod h1:QT9mph3wcVfISUKd0i9sZfVrPviHuSF+cUtLjm2WSf8= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= @@ -45,16 +58,18 @@ github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/cockroachdb/errors v1.8.1 h1:A5+txlVZfOqFBDa4mGz2bUWSp0aHElvHX2bKkdbQu+Y= -github.com/cockroachdb/errors v1.8.1/go.mod h1:qGwQn6JmZ+oMjuLwjWzUNqblqk0xl4CVV3SQbGwK7Ac= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f h1:o/kfcElHqOiXqcou5a3rIlMc7oJbMQkeLk0VQJ7zgqY= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= -github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 h1:aPEJyR4rPBvDmeyi+l/FS/VtA00IWvjeFvjen1m1l1A= -github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593/go.mod h1:6hk1eMY/u5t+Cf18q5lFMUA1Rc+Sm5I6Ra1QuPyxXCo= -github.com/cockroachdb/redact v1.0.8 h1:8QG/764wK+vmEYoOlfobpe12EQcS81ukx/a4hdVMxNw= -github.com/cockroachdb/redact v1.0.8/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= -github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2 h1:IKgmqgMQlVJIZj19CdocBeSfSaiCbEBZGKODaixqtHM= -github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2/go.mod h1:8BT+cPK6xvFOcRlk0R8eg+OTkcqI6baNH4xAkpiYVvQ= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/errors v1.11.3 h1:5bA+k2Y6r+oz/6Z/RFlNeVCesGARKuC6YymtcDrbC/I= +github.com/cockroachdb/errors v1.11.3/go.mod h1:m4UIW4CDjx+R5cybPsNrRbreomiFqt8o1h1wUVazSd8= +github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce h1:giXvy4KSc/6g/esnpM7Geqxka4WSqI1SZc7sMJFd3y4= +github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce/go.mod h1:9/y3cnZ5GKakj/H4y9r9GTjCvAFta7KLgSHPJJYc52M= +github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= +github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= +github.com/cockroachdb/pebble v1.1.2 h1:CUh2IPtR4swHlEj48Rhfzw6l/d0qA31fItcIszQVIsA= +github.com/cockroachdb/pebble v1.1.2/go.mod h1:4exszw1r40423ZsmkG/09AFEG83I0uDgfujJdbL6kYU= +github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= +github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= @@ -65,16 +80,20 @@ github.com/containerd/continuity v0.4.3 h1:6HVkalIp+2u1ZLH1J/pYX2oBVXlJZvh1X1A7b github.com/containerd/continuity v0.4.3/go.mod h1:F6PTNCKepoxEaXLQp3wDAjygEnImnZ/7o4JzpodfroQ= github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.4 h1:wfIWP927BUkWJb2NmU/kNDYIBTh/ziUX91+lVfRxZq4= github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 h1:d28BXYi+wUpz1KBmiF9bWrjEMacUEREV6MBi2ODnrfQ= github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/creasty/defaults v1.8.0 h1:z27FJxCAa0JKt3utc0sCImAEb+spPucmKoOdLHvHYKk= github.com/creasty/defaults v1.8.0/go.mod h1:iGzKe6pbEHnpMPtfDXZEr0NVxWnPTjb1bbDy08fPzYM= +github.com/cskr/pubsub v1.0.2 h1:vlOzMhl6PFn60gRlTQQsIfVwaPB/B/8MziK8FhEPt/0= +github.com/cskr/pubsub v1.0.2/go.mod h1:/8MzYXk/NJAz782G8RPkFzXTZVu63VotefPnR9TIRis= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= @@ -108,6 +127,8 @@ github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/ethereum/go-ethereum v1.13.15 h1:U7sSGYGo4SPjP6iNIifNoyIAiNjrmQkz6EwQG+/EZWo= github.com/ethereum/go-ethereum v1.13.15/go.mod h1:TN8ZiHrdJwSe8Cb6x+p0hs5CxhJZPbqB7hHkaUXcmIU= +github.com/fatih/color v1.14.1 h1:qfhVLaG5s+nCROl1zJsZRxFeYrHLqWroPOQ8BWiNb4w= +github.com/fatih/color v1.14.1/go.mod h1:2oHN61fhTpgcxD3TSWCgKDiH1+x4OiDVVGH8WlgGZGg= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fjl/memsize v0.0.2 h1:27txuSD9or+NZlnOWdKUxeBzTAUkWCVh+4Gf2dWFOzA= @@ -127,6 +148,10 @@ github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 h1:BAIP2Gihuqh github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46/go.mod h1:QNpY22eby74jVhqH4WhDLDwxc/vqsern6pW+u2kbkpc= github.com/getkin/kin-openapi v0.128.0 h1:jqq3D9vC9pPq1dGcOCv7yOp1DaEe7c/T1vzcLbITSp4= github.com/getkin/kin-openapi v0.128.0/go.mod h1:OZrfXzUfGrNbsKj+xmFBx6E5c6yH3At/tAKSc2UszXM= +github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps= +github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= +github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= +github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-fed/httpsig v1.1.0 h1:9M+hb0jkEICD8/cAiNqEB66R87tTINszBRTjwjQzWcI= github.com/go-fed/httpsig v1.1.0/go.mod h1:RCMrTZvN1bJYtofsG4rd5NaO5obxQ5xBkdiS7xsT7bM= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= @@ -172,6 +197,7 @@ github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1v github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/go-test/deep v1.0.8 h1:TDsG77qcSprGbC6vTN8OuXp5g+J+b5Pcguhf7Zt61VM= github.com/go-test/deep v1.0.8/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= +github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= @@ -179,6 +205,7 @@ github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69 github.com/gogs/chardet v0.0.0-20191104214054-4b6791f73a28/go.mod h1:Pcatq5tYkCW2Q6yrR2VRHlbHpZ/R4/7qyL1TCF7vl14= github.com/gogs/chardet v0.0.0-20211120154057-b7413eaefb8f h1:3BSP1Tbs2djlpprl7wCLuiqMaUh5SJkkzI2gDs+FgLs= github.com/gogs/chardet v0.0.0-20211120154057-b7413eaefb8f/go.mod h1:Pcatq5tYkCW2Q6yrR2VRHlbHpZ/R4/7qyL1TCF7vl14= +github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= github.com/golang-jwt/jwt/v4 v4.5.1 h1:JdqV9zKUdtaa9gdPlywC3aeoEsR681PlKC+4F5gQgeo= github.com/golang-jwt/jwt/v4 v4.5.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -205,16 +232,21 @@ github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= +github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k= github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grafana/pyroscope-go v1.2.0 h1:aILLKjTj8CS8f/24OPMGPewQSYlhmdQMBmol1d3KGj8= github.com/grafana/pyroscope-go v1.2.0/go.mod h1:2GHr28Nr05bg2pElS+dDsc98f3JTUh2f6Fz1hWXrqwk= github.com/grafana/pyroscope-go/godeltaprof v0.1.8 h1:iwOtYXeeVSAeYefJNaxDytgjKtUuKQbJqgAIjlnicKg= @@ -228,9 +260,19 @@ github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE= github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= +github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= +github.com/hashicorp/go-hclog v1.5.0 h1:bI2ocEMgcVlz55Oj1xZNBsVi900c7II+fWDyV9o+13c= +github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= +github.com/hashicorp/go-retryablehttp v0.7.5 h1:bJj+Pj19UZMIweq/iie+1u5YCdGrnxCT9yvm0e+Nd5M= +github.com/hashicorp/go-retryablehttp v0.7.5/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8= +github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= +github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru/arc/v2 v2.0.6 h1:4NU7uP5vSoK6TbaMj3NtY478TTAWLso/vL1gpNrInHg= +github.com/hashicorp/golang-lru/arc/v2 v2.0.6/go.mod h1:cfdDIX05DWvYV6/shsxDfa/OVcRieOt+q4FnM8x+Xno= github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= @@ -249,8 +291,79 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2 github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/invopop/yaml v0.3.1 h1:f0+ZpmhfBSS4MhG+4HYseMdJhoeeopbSKbq5Rpeelso= github.com/invopop/yaml v0.3.1/go.mod h1:PMOp3nn4/12yEZUFfmOuNHJsZToEEOwoWsT+D81KkeA= +github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs= +github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0= +github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA= +github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU= +github.com/ipfs/go-bitswap v0.11.0 h1:j1WVvhDX1yhG32NTC9xfxnqycqYIlhzEzLXG/cU1HyQ= +github.com/ipfs/go-bitswap v0.11.0/go.mod h1:05aE8H3XOU+LXpTedeAS0OZpcO1WFsj5niYQH9a1Tmk= +github.com/ipfs/go-block-format v0.2.0 h1:ZqrkxBA2ICbDRbK8KJs/u0O3dlp6gmAuuXUJNiW1Ycs= +github.com/ipfs/go-block-format v0.2.0/go.mod h1:+jpL11nFx5A/SPpsoBn6Bzkra/zaArfSmsknbPMYgzM= +github.com/ipfs/go-blockservice v0.5.2 h1:in9Bc+QcXwd1apOVM7Un9t8tixPKdaHQFdLSUM1Xgk8= +github.com/ipfs/go-blockservice v0.5.2/go.mod h1:VpMblFEqG67A/H2sHKAemeH9vlURVavlysbdUI632yk= +github.com/ipfs/go-bs-sqlite3 v0.0.0-20221122195556-bfcee1be620d h1:9V+GGXCuOfDiFpdAHz58q9mKLg447xp0cQKvqQrAwYE= +github.com/ipfs/go-bs-sqlite3 v0.0.0-20221122195556-bfcee1be620d/go.mod h1:pMbnFyNAGjryYCLCe59YDLRv/ujdN+zGJBT1umlvYRM= github.com/ipfs/go-cid v0.4.1 h1:A/T3qGvxi4kpKWWcPC/PgbvDA2bjVLO7n4UeVwnbs/s= github.com/ipfs/go-cid v0.4.1/go.mod h1:uQHwDeX4c6CtyrFwdqyhpNcxVewur1M7l7fNU7LKwZk= +github.com/ipfs/go-datastore v0.6.0 h1:JKyz+Gvz1QEZw0LsX1IBn+JFCJQH4SJVFtM4uWU0Myk= +github.com/ipfs/go-datastore v0.6.0/go.mod h1:rt5M3nNbSO/8q1t4LNkLyUwRs8HupMeN/8O4Vn9YAT8= +github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= +github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= +github.com/ipfs/go-ds-flatfs v0.5.1 h1:ZCIO/kQOS/PSh3vcF1H6a8fkRGS7pOfwfPdx4n/KJH4= +github.com/ipfs/go-ds-flatfs v0.5.1/go.mod h1:RWTV7oZD/yZYBKdbVIFXTX2fdY2Tbvl94NsWqmoyAX4= +github.com/ipfs/go-ipfs-blockstore v1.3.1 h1:cEI9ci7V0sRNivqaOr0elDsamxXFxJMMMy7PTTDQNsQ= +github.com/ipfs/go-ipfs-blockstore v1.3.1/go.mod h1:KgtZyc9fq+P2xJUiCAzbRdhhqJHvsw8u2Dlqy2MyRTE= +github.com/ipfs/go-ipfs-blocksutil v0.0.1 h1:Eh/H4pc1hsvhzsQoMEP3Bke/aW5P5rVM1IWFJMcGIPQ= +github.com/ipfs/go-ipfs-blocksutil v0.0.1/go.mod h1:Yq4M86uIOmxmGPUHv/uI7uKqZNtLb449gwKqXjIsnRk= +github.com/ipfs/go-ipfs-chunker v0.0.5 h1:ojCf7HV/m+uS2vhUGWcogIIxiO5ubl5O57Q7NapWLY8= +github.com/ipfs/go-ipfs-chunker v0.0.5/go.mod h1:jhgdF8vxRHycr00k13FM8Y0E+6BoalYeobXmUyTreP8= +github.com/ipfs/go-ipfs-delay v0.0.1 h1:r/UXYyRcddO6thwOnhiznIAiSvxMECGgtv35Xs1IeRQ= +github.com/ipfs/go-ipfs-delay v0.0.1/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= +github.com/ipfs/go-ipfs-ds-help v1.1.1 h1:B5UJOH52IbcfS56+Ul+sv8jnIV10lbjLF5eOO0C66Nw= +github.com/ipfs/go-ipfs-ds-help v1.1.1/go.mod h1:75vrVCkSdSFidJscs8n4W+77AtTpCIAdDGAwjitJMIo= +github.com/ipfs/go-ipfs-exchange-interface v0.2.1 h1:jMzo2VhLKSHbVe+mHNzYgs95n0+t0Q69GQ5WhRDZV/s= +github.com/ipfs/go-ipfs-exchange-interface v0.2.1/go.mod h1:MUsYn6rKbG6CTtsDp+lKJPmVt3ZrCViNyH3rfPGsZ2E= +github.com/ipfs/go-ipfs-exchange-offline v0.3.0 h1:c/Dg8GDPzixGd0MC8Jh6mjOwU57uYokgWRFidfvEkuA= +github.com/ipfs/go-ipfs-exchange-offline v0.3.0/go.mod h1:MOdJ9DChbb5u37M1IcbrRB02e++Z7521fMxqCNRrz9s= +github.com/ipfs/go-ipfs-pq v0.0.3 h1:YpoHVJB+jzK15mr/xsWC574tyDLkezVrDNeaalQBsTE= +github.com/ipfs/go-ipfs-pq v0.0.3/go.mod h1:btNw5hsHBpRcSSgZtiNm/SLj5gYIZ18AKtv3kERkRb4= +github.com/ipfs/go-ipfs-routing v0.3.0 h1:9W/W3N+g+y4ZDeffSgqhgo7BsBSJwPMcyssET9OWevc= +github.com/ipfs/go-ipfs-routing v0.3.0/go.mod h1:dKqtTFIql7e1zYsEuWLyuOU+E0WJWW8JjbTPLParDWo= +github.com/ipfs/go-ipfs-util v0.0.3 h1:2RFdGez6bu2ZlZdI+rWfIdbQb1KudQp3VGwPtdNCmE0= +github.com/ipfs/go-ipfs-util v0.0.3/go.mod h1:LHzG1a0Ig4G+iZ26UUOMjHd+lfM84LZCrn17xAKWBvs= +github.com/ipfs/go-ipld-cbor v0.1.0 h1:dx0nS0kILVivGhfWuB6dUpMa/LAwElHPw1yOGYopoYs= +github.com/ipfs/go-ipld-cbor v0.1.0/go.mod h1:U2aYlmVrJr2wsUBU67K4KgepApSZddGRDWBYR0H4sCk= +github.com/ipfs/go-ipld-format v0.6.0 h1:VEJlA2kQ3LqFSIm5Vu6eIlSxD/Ze90xtc4Meten1F5U= +github.com/ipfs/go-ipld-format v0.6.0/go.mod h1:g4QVMTn3marU3qXchwjpKPKgJv+zF+OlaKMyhJ4LHPg= +github.com/ipfs/go-ipld-legacy v0.2.1 h1:mDFtrBpmU7b//LzLSypVrXsD8QxkEWxu5qVxN99/+tk= +github.com/ipfs/go-ipld-legacy v0.2.1/go.mod h1:782MOUghNzMO2DER0FlBR94mllfdCJCkTtDtPM51otM= +github.com/ipfs/go-libipfs v0.7.0 h1:Mi54WJTODaOL2/ZSm5loi3SwI3jI2OuFWUrQIkJ5cpM= +github.com/ipfs/go-libipfs v0.7.0/go.mod h1:KsIf/03CqhICzyRGyGo68tooiBE2iFbI/rXW7FhAYr0= +github.com/ipfs/go-log v1.0.5 h1:2dOuUCB1Z7uoczMWgAyDck5JLb72zHzrMnGnCNNbvY8= +github.com/ipfs/go-log v1.0.5/go.mod h1:j0b8ZoR+7+R99LD9jZ6+AJsrzkPbSXbZfGakb5JPtIo= +github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Axpmri6g= +github.com/ipfs/go-log/v2 v2.5.1 h1:1XdUzF7048prq4aBjDQQ4SL5RxftpRGdXhNRwKSAlcY= +github.com/ipfs/go-log/v2 v2.5.1/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI= +github.com/ipfs/go-merkledag v0.11.0 h1:DgzwK5hprESOzS4O1t/wi6JDpyVQdvm9Bs59N/jqfBY= +github.com/ipfs/go-merkledag v0.11.0/go.mod h1:Q4f/1ezvBiJV0YCIXvt51W/9/kqJGH4I1LsA7+djsM4= +github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fGD6n0jO4kdg= +github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY= +github.com/ipfs/go-peertaskqueue v0.8.1 h1:YhxAs1+wxb5jk7RvS0LHdyiILpNmRIRnZVztekOF0pg= +github.com/ipfs/go-peertaskqueue v0.8.1/go.mod h1:Oxxd3eaK279FxeydSPPVGHzbwVeHjatZ2GA8XD+KbPU= +github.com/ipfs/go-unixfsnode v1.8.0 h1:yCkakzuE365glu+YkgzZt6p38CSVEBPgngL9ZkfnyQU= +github.com/ipfs/go-unixfsnode v1.8.0/go.mod h1:HxRu9HYHOjK6HUqFBAi++7DVoWAHn0o4v/nZ/VA+0g8= +github.com/ipfs/go-verifcid v0.0.3 h1:gmRKccqhWDocCRkC+a59g5QW7uJw5bpX9HWBevXa0zs= +github.com/ipfs/go-verifcid v0.0.3/go.mod h1:gcCtGniVzelKrbk9ooUSX/pM3xlH73fZZJDzQJRvOUw= +github.com/ipld/go-car v0.6.2 h1:Hlnl3Awgnq8icK+ze3iRghk805lu8YNq3wlREDTF2qc= +github.com/ipld/go-car v0.6.2/go.mod h1:oEGXdwp6bmxJCZ+rARSkDliTeYnVzv3++eXajZ+Bmr8= +github.com/ipld/go-car/v2 v2.13.1 h1:KnlrKvEPEzr5IZHKTXLAEub+tPrzeAFQVRlSQvuxBO4= +github.com/ipld/go-car/v2 v2.13.1/go.mod h1:QkdjjFNGit2GIkpQ953KBwowuoukoM75nP/JI1iDJdo= +github.com/ipld/go-codec-dagpb v1.6.0 h1:9nYazfyu9B1p3NAgfVdpRco3Fs2nFC72DqVsMj6rOcc= +github.com/ipld/go-codec-dagpb v1.6.0/go.mod h1:ANzFhfP2uMJxRBr8CE+WQWs5UsNa0pYtmKZ+agnUw9s= +github.com/ipld/go-ipld-prime v0.21.0 h1:n4JmcpOlPDIxBcY037SVfpd1G+Sj1nKZah0m6QH9C2E= +github.com/ipld/go-ipld-prime v0.21.0/go.mod h1:3RLqy//ERg/y5oShXXdx5YIp50cFGOanyMctpPjsvxQ= +github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20230102063945-1a409dc236dd h1:gMlw/MhNr2Wtp5RwGdsW23cs+yCuj9k2ON7i9MiJlRo= +github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20230102063945-1a409dc236dd/go.mod h1:wZ8hH8UxeryOs4kJEJaiui/s00hDSbE37OKsL47g+Sw= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= @@ -263,6 +376,9 @@ github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7Bd github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jaytaylor/html2text v0.0.0-20230321000545-74c2419ad056 h1:iCHtR9CQyktQ5+f3dMVZfwD2KWJUgm7M0gdL9NGr8KA= github.com/jaytaylor/html2text v0.0.0-20230321000545-74c2419ad056/go.mod h1:CVKlgaMiht+LXvHG173ujK6JUhZXKb2u/BQtjPDIvyk= +github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= +github.com/jbenet/goprocess v0.1.4 h1:DRGOFReOMqqDNXwW70QkacFW0YN9QnwLV0Vqk+3oU0o= +github.com/jbenet/goprocess v0.1.4/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= @@ -272,12 +388,16 @@ github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8Hm github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= -github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg= -github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= +github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/koron/go-ssdp v0.0.3 h1:JivLMY45N76b4p/vsWGOKewBQu6uf39y8l+AQ7sDKx8= +github.com/koron/go-ssdp v0.0.3/go.mod h1:b2MxI6yh02pKrsyNoQUsk4+YNikaGhe4894J+Q5lDvA= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= @@ -297,6 +417,24 @@ github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= +github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= +github.com/libp2p/go-cidranger v1.1.0 h1:ewPN8EZ0dd1LSnrtuwd4709PXVcITVeuwbag38yPW7c= +github.com/libp2p/go-cidranger v1.1.0/go.mod h1:KWZTfSr+r9qEo9OkI9/SIEeAtw+NNoU0dXIXt15Okic= +github.com/libp2p/go-libp2p v0.25.1 h1:YK+YDCHpYyTvitKWVxa5PfElgIpOONU01X5UcLEwJGA= +github.com/libp2p/go-libp2p v0.25.1/go.mod h1:xnK9/1d9+jeQCVvi/f1g12KqtVi/jP/SijtKV1hML3g= +github.com/libp2p/go-libp2p-asn-util v0.2.0 h1:rg3+Os8jbnO5DxkC7K/Utdi+DkY3q/d1/1q+8WeNAsw= +github.com/libp2p/go-libp2p-asn-util v0.2.0/go.mod h1:WoaWxbHKBymSN41hWSq/lGKJEca7TNm58+gGJi2WsLI= +github.com/libp2p/go-libp2p-record v0.2.0 h1:oiNUOCWno2BFuxt3my4i1frNrt7PerzB3queqa1NkQ0= +github.com/libp2p/go-libp2p-record v0.2.0/go.mod h1:I+3zMkvvg5m2OcSdoL0KPljyJyvNDFGKX7QdlpYUcwk= +github.com/libp2p/go-libp2p-testing v0.12.0 h1:EPvBb4kKMWO29qP4mZGyhVzUyR25dvfUIK5WDu6iPUA= +github.com/libp2p/go-libp2p-testing v0.12.0/go.mod h1:KcGDRXyN7sQCllucn1cOOS+Dmm7ujhfEyXQL5lvkcPg= +github.com/libp2p/go-msgio v0.3.0 h1:mf3Z8B1xcFN314sWX+2vOTShIE0Mmn2TXn3YCUQGNj0= +github.com/libp2p/go-msgio v0.3.0/go.mod h1:nyRM819GmVaF9LX3l03RMh10QdOroF++NBbxAb0mmDM= +github.com/libp2p/go-nat v0.1.0 h1:MfVsH6DLcpa04Xr+p8hmVRG4juse0s3J8HyNWYHffXg= +github.com/libp2p/go-nat v0.1.0/go.mod h1:X7teVkwRHNInVNWQiO/tAiAVRwSr5zoRz4YSTC3uRBM= +github.com/libp2p/go-netroute v0.2.1 h1:V8kVrpD8GK0Riv15/7VN6RbUQ3URNZVosw7H2v9tksU= +github.com/libp2p/go-netroute v0.2.1/go.mod h1:hraioZr0fhBjG0ZRXJJ6Zj2IVEVNx6tDTFQfSmcq7mQ= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= @@ -305,14 +443,20 @@ github.com/matryer/is v1.4.1 h1:55ehd8zaGABKLXQUe2awZ99BD/PTc2ls+KV/dXphgEQ= github.com/matryer/is v1.4.1/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= 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.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= 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-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +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/mfridman/interpolate v0.0.2 h1:pnuTK7MQIxxFz1Gr+rjSIx9u7qVjf5VOoM/u6BbAxPY= github.com/mfridman/interpolate v0.0.2/go.mod h1:p+7uk6oE07mpE/Ik1b8EckO0O4ZXiGAfshKBWLUM9Xg= +github.com/miekg/dns v1.1.50 h1:DQUfb9uc6smULcREF09Uc+/Gd46YWqJd5DbpPE9xkcA= +github.com/miekg/dns v1.1.50/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME= github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM= github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= @@ -341,12 +485,20 @@ github.com/multiformats/go-base32 v0.1.0 h1:pVx9xoSPqEIQG8o+UbAe7DNi51oej1NtK+aG github.com/multiformats/go-base32 v0.1.0/go.mod h1:Kj3tFY6zNr+ABYMqeUNeGvkIC/UYgtWibDcT0rExnbI= github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9rQyccr0= github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4= +github.com/multiformats/go-multiaddr v0.8.0 h1:aqjksEcqK+iD/Foe1RRFsGZh8+XFiGo7FgUCZlpv3LU= +github.com/multiformats/go-multiaddr v0.8.0/go.mod h1:Fs50eBDWvZu+l3/9S6xAE7ZYj6yhxlvaVZjakWN7xRs= +github.com/multiformats/go-multiaddr-dns v0.3.1 h1:QgQgR+LQVt3NPTjbrLLpsaT2ufAA2y0Mkk+QRVJbW3A= +github.com/multiformats/go-multiaddr-dns v0.3.1/go.mod h1:G/245BRQ6FJGmryJCrOuTdB37AMA5AMOVuO6NY3JwTk= +github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E= +github.com/multiformats/go-multiaddr-fmt v0.1.0/go.mod h1:hGtDIW4PU4BqJ50gW2quDuPVjyWNZxToGUh/HwTZYJo= github.com/multiformats/go-multibase v0.2.0 h1:isdYCVLvksgWlMW9OZRYJEa9pZETFivncJHmHnnd87g= github.com/multiformats/go-multibase v0.2.0/go.mod h1:bFBZX4lKCA/2lyOFSAoKH5SS6oPyjtnzK/XTFDPkNuk= github.com/multiformats/go-multicodec v0.9.0 h1:pb/dlPnzee/Sxv/j4PmkDRxCOi3hXTz3IbPKOXWJkmg= github.com/multiformats/go-multicodec v0.9.0/go.mod h1:L3QTQvMIaVBkXOXXtVmYE+LI16i14xuaojr/H7Ai54k= github.com/multiformats/go-multihash v0.2.3 h1:7Lyc8XfX/IY2jWb/gI7JP+o7JEq9hOa7BFvVU9RSh+U= github.com/multiformats/go-multihash v0.2.3/go.mod h1:dXgKXCXjBzdscBLk9JkjINiEsCKRVch90MdaGiKsvSM= +github.com/multiformats/go-multistream v0.4.1 h1:rFy0Iiyn3YT0asivDUIR05leAdwZq3de4741sbiSdfo= +github.com/multiformats/go-multistream v0.4.1/go.mod h1:Mz5eykRVAjJWckE2U78c6xqdtyNUEhKSM0Lwar2p77Q= github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/nEGOHFS8= github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= @@ -384,6 +536,8 @@ github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQ github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= github.com/opencontainers/runc v1.1.12 h1:BOIssBaW1La0/qbNZHXOOa71dZfZEQOzW7dqQf3phss= github.com/opencontainers/runc v1.1.12/go.mod h1:S+lQwSfncpBha7XTy/5lBwWgm5+y5Ma/O44Ekby9FK8= +github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= +github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= github.com/orlangure/gnomock v0.31.0 h1:dgjlQ8DYUPMyNwMZJuYBH+/GF+e7h3sloldPzIJF4k4= github.com/orlangure/gnomock v0.31.0/go.mod h1:RagxeYv3bKi+li9Lio2Faw5t6Mcy4akkeqXzkgAS3w0= github.com/ory/dockertest/v3 v3.10.0 h1:4K3z2VMe8Woe++invjaTB7VRyQXQy5UY+loujO4aNE4= @@ -392,14 +546,21 @@ github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6 github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= github.com/perimeterx/marshmallow v1.1.5 h1:a2LALqQ1BlHM8PZblsDdidgv1mWi1DgC2UmX50IvK2s= github.com/perimeterx/marshmallow v1.1.5/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0Vchtcl8we9tYaXw= +github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 h1:1/WtZae0yGtPq+TI6+Tv1WTxkukpXeMlviSxvL7SRgk= +github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9/go.mod h1:x3N5drFsm2uilKKuuYo6LdyD8vZAW55sH/9w+pbo1sw= github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= +github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/polydawn/refmt v0.89.1-0.20221221234430-40501e09de1f h1:VXTQfuJj9vKR4TCkEuWIckKvdHFeJH/huIFJ9/cXOB0= +github.com/polydawn/refmt v0.89.1-0.20221221234430-40501e09de1f/go.mod h1:/zvteZs/GwLtCgZ4BL6CBsk9IKIlexP43ObX9AxTqTw= github.com/pressly/goose/v3 v3.23.0 h1:57hqKos8izGek4v6D5+OXBa+Y4Rq8MU//+MmnevdpVA= github.com/pressly/goose/v3 v3.23.0/go.mod h1:rpx+D9GX/+stXmzKa+uh1DkjPnNVMdiOCV9iLdle4N8= github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y= @@ -418,19 +579,37 @@ github.com/redis/rueidis/mock v1.0.51 h1:XK9Ud2sgBiex8g3lT1y0PI/NQdzn2uTLRwsJ9ez github.com/redis/rueidis/mock v1.0.51/go.mod h1:6zsMgZ+q1EWPgGOstCtUgll1tcz7Pj6gAvl3/R9mKkU= github.com/redis/rueidis/rueidiscompat v1.0.51 h1:QGYtutavVacfgyl8/LvcrhKAj+sRRuvE+p634lKdV4I= github.com/redis/rueidis/rueidiscompat v1.0.51/go.mod h1:MAq/1yVbfrkyCFVSUAZeCK/hjlHZ1aN3oZCAy71AlE8= +github.com/reiver/go-atproto v0.0.0-20240906195827-a1832b0df821 h1:s2ColkXw5LNaS8/eHB7O46NQYyv+DOghr25u3ukEa5g= +github.com/reiver/go-atproto v0.0.0-20240906195827-a1832b0df821/go.mod h1:S/pf34se76GMYmdBXumZLenxGYgunVNLJkW6OQEXt9w= +github.com/reiver/go-bsky v0.0.0-20240906205655-8c7fadb4f3bb h1:ZgOhXYuF5y3Hzhm9I5vc+LNd0um1Lz4v9fn64mt9PJA= +github.com/reiver/go-bsky v0.0.0-20240906205655-8c7fadb4f3bb/go.mod h1:KEO2yVqtN2ZQQ7AgncGVyKZpa9jXEmNOuYXzbz564f0= +github.com/reiver/go-cast v0.0.0-20240904124821-be0103637c3f h1:+xhln673LL2XG1qhsUG1e+HHdXm/lTWihmr5G815dMc= +github.com/reiver/go-cast v0.0.0-20240904124821-be0103637c3f/go.mod h1:baMIic1VWx4m5MRviwSyHFx1Z6POGMRrnVgsMvsLlAA= +github.com/reiver/go-erorr v0.0.0-20240801233437-8cbde6d1fa3f h1:D1QSxKHm8U73XhjsW3SFLkT0zT5pKJi+1KGboMhY1Rk= +github.com/reiver/go-erorr v0.0.0-20240801233437-8cbde6d1fa3f/go.mod h1:F0HbBf+Ak2ZlE8YkDW4Y+KxaUmT0KaaIJK6CXY3cJxE= +github.com/reiver/go-fallback v0.0.0-20240906145154-1ce9eadf06a8 h1:JKZHV9WPzSfaPhJswlyQk45hmxbPwKmBximAyysPKbs= +github.com/reiver/go-fallback v0.0.0-20240906145154-1ce9eadf06a8/go.mod h1:IAg7rGvnbzlTrK4W+pBJcq2XEhrWf+DxYl/fGN/qbj4= +github.com/reiver/go-maps v0.0.0-20240906190342-93be57f28be1 h1:5fRVUeCqPN8G8phNmd1G0Pu7g35sojAQBnIvZ8C+s8c= +github.com/reiver/go-maps v0.0.0-20240906190342-93be57f28be1/go.mod h1:dMbnpn0BuIGwSFlCUSTYPDP3nDt2pSe6qP5vfbV1kBE= +github.com/reiver/go-reg v0.0.0-20240906195701-6e62f43c2835 h1:i2IO8hx0TbgPeZ5Gcu+Prkzkm6T+cBxd1lnALdCoM/c= +github.com/reiver/go-reg v0.0.0-20240906195701-6e62f43c2835/go.mod h1:P4MhBoVQLOdhisU6M3f2DvbbNBueHw3Y+n4V/Q7xX9Q= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= -github.com/rss3-network/protocol-go v0.5.14 h1:gd6ciwXb5e4xx1dmAOAIKWbpami2QbARqE61zbwT6KE= -github.com/rss3-network/protocol-go v0.5.14/go.mod h1:npcyduWt86uVbIi77xQaYk8eqltI9XNjk1FMGpjyIq0= +github.com/rss3-network/protocol-go v0.5.16 h1:14AOjsHMnuEqEHPmBo4A8sdGXPbwMNGKKJoGk1fXunk= +github.com/rss3-network/protocol-go v0.5.16/go.mod h1:AOVaY0++55lryy3GeQG//EkPuVFqxNQoPa0VdGbmtx0= github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= @@ -439,6 +618,7 @@ github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6g github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= github.com/samber/lo v1.47.0 h1:z7RynLwP5nbyRscyvcD043DWYoOcYRv3mV8lBeqOCLc= github.com/samber/lo v1.47.0/go.mod h1:RmDH9Ct32Qy3gduHQuKJ3gW1fMHAnE/fAzQuf6He5cU= +github.com/scylladb/termtables v0.0.0-20191203121021-c4c0b6d42ff4/go.mod h1:C1a7PQSMz9NShzorzCiG2fk9+xuCgLkPeCvMHYR2OWg= github.com/sebdah/goldie/v2 v2.5.3 h1:9ES/mNN+HNUbNWpVAlrzuZ7jE+Nrczbj8uFRjM7624Y= github.com/sebdah/goldie/v2 v2.5.3/go.mod h1:oZ9fp0+se1eapSRjfYbsV/0Hqhbuu3bJVvKI/NNtssI= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= @@ -451,8 +631,13 @@ github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKl github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k= github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/smartystreets/assertions v1.2.0 h1:42S6lae5dvLc7BrLu/0ugRtcFVjoJNMC/N3yZFZkDFs= +github.com/smartystreets/assertions v1.2.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo= +github.com/smartystreets/goconvey v1.7.2 h1:9RBaZCeXEQ3UselpuwUQHltGVXvdwm6cv1hgR6gDIPg= +github.com/smartystreets/goconvey v1.7.2/go.mod h1:Vw0tHAZW6lzCRk3xgdin6fKYcG+G3Pg9vgXWeJpQFMM= github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= @@ -478,6 +663,7 @@ github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSS github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= @@ -525,7 +711,8 @@ github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2n github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= -github.com/urfave/cli v1.22.1 h1:+mkCCcOFKPnCmVYVcURKps1Xe+3zP90gSYGNfRkjoIY= +github.com/urfave/cli v1.22.10 h1:p8Fspmz3iTctJstry1PYS3HVdllxnEzTEsgIgtxTrCk= +github.com/urfave/cli v1.22.10/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= @@ -538,6 +725,16 @@ github.com/vincent-petithory/dataurl v1.0.0 h1:cXw+kPto8NLuJtlMsI152irrVw9fRDX8A github.com/vincent-petithory/dataurl v1.0.0/go.mod h1:FHafX5vmDzyP+1CQATJn7WFKc9CvnvxyvZy6I1MrG/U= github.com/vmware-labs/yaml-jsonpath v0.3.2 h1:/5QKeCBGdsInyDCyVNLbXyilb61MXGi9NP674f9Hobk= github.com/vmware-labs/yaml-jsonpath v0.3.2/go.mod h1:U6whw1z03QyqgWdgXxvVnQ90zN1BWz5V+51Ewf8k+rQ= +github.com/warpfork/go-testmark v0.12.1 h1:rMgCpJfwy1sJ50x0M0NgyphxYYPMOODIJHhsXyEHU0s= +github.com/warpfork/go-testmark v0.12.1/go.mod h1:kHwy7wfvGSPh1rQJYKayD4AbtNaeyZdcGi9tNJTaa5Y= +github.com/warpfork/go-wish v0.0.0-20220906213052-39a1cc7a02d0 h1:GDDkbFiaK8jsSDJfjId/PEGEShv6ugrt4kYsC5UIDaQ= +github.com/warpfork/go-wish v0.0.0-20220906213052-39a1cc7a02d0/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= +github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11 h1:5HZfQkwe0mIfyDmc1Em5GqlNRzcdtlv4HTNmdpt7XH0= +github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11/go.mod h1:Wlo/SzPmxVp6vXpGt/zaXhHH0fn4IxgqZc82aKg6bpQ= +github.com/whyrusleeping/cbor-gen v0.2.1-0.20241030202151-b7a6831be65e h1:28X54ciEwwUxyHn9yrZfl5ojgF4CBNLWX7LR0rvBkf4= +github.com/whyrusleeping/cbor-gen v0.2.1-0.20241030202151-b7a6831be65e/go.mod h1:pM99HXyEbSQHcosHc0iW7YFmwnscr+t9Te4ibko05so= +github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f h1:jQa4QT2UP9WYv2nzyawpKMOCl+Z/jW7djv2/J50lj9E= +github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f/go.mod h1:p9UJB6dDgdPgMJZs7UjUOdulKyRr9fqkS+6JKAInPy8= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= @@ -555,6 +752,10 @@ github.com/yuin/goldmark v1.7.1 h1:3bajkSilaCbjdKVsKdZjZCLBNPL9pYzrCakKaf4U49U= github.com/yuin/goldmark v1.7.1/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +gitlab.com/yawning/secp256k1-voi v0.0.0-20230925100816-f2616030848b h1:CzigHMRySiX3drau9C6Q5CAbNIApmLdat5jPMqChvDA= +gitlab.com/yawning/secp256k1-voi v0.0.0-20230925100816-f2616030848b/go.mod h1:/y/V339mxv2sZmYYR64O07VuCpdNZqCTwO8ZcouTMI8= +gitlab.com/yawning/tuplehash v0.0.0-20230713102510-df83abbf9a02 h1:qwDnMxjkyLmAFgcfgTnfJrmYKWhHnci3GjDqcZp1M3Q= +gitlab.com/yawning/tuplehash v0.0.0-20230713102510-df83abbf9a02/go.mod h1:JTnUj0mpYiAsuZLmKjTx/ex3AtMowcCgnE7YNyCEP0I= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.50.0 h1:cEPbyTSEHlQR89XVlyo78gqluF8Y3oMeBkXGWzQsfXY= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.50.0/go.mod h1:DKdbWcT4GH1D0Y3Sqt/PFXt2naRKDWtU+eE6oLdFNA8= go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= @@ -577,20 +778,29 @@ go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQD go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= +go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU= go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= +go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= +go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= @@ -602,6 +812,7 @@ golang.org/x/crypto v0.30.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ss golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8= golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= @@ -662,6 +873,7 @@ golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -704,6 +916,10 @@ golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= @@ -717,6 +933,8 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 h1:M0KvPgPmDZHPlbRbaNU1APr28TvwvvdUPlSv7PUvy8g= google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:dguCy7UOdZhTvLzDyt15+rOrawrpM4q7DD9dQ1P11P4= google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 h1:XVhgTWWV3kGQlwJHR3upFWZeTsei6Oks1apkZSeonIE= @@ -738,6 +956,7 @@ gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= @@ -759,11 +978,14 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gorm.io/driver/postgres v1.5.11 h1:ubBVAfbKEUld/twyKZ0IYn9rSQh448EdelLYk9Mv314= gorm.io/driver/postgres v1.5.11/go.mod h1:DX3GReXH+3FPWGrrgffdvCk3DQ1dwDPdmbenSkweRGI= +gorm.io/driver/sqlite v1.5.5 h1:7MDMtUZhV065SilG62E0MquljeArQZNfJnjd9i9gx3E= +gorm.io/driver/sqlite v1.5.5/go.mod h1:6NgQ7sQWAIFsPrJJl1lSNSu2TABh0ZZ/zm5fosATavE= gorm.io/gorm v1.23.6/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= gorm.io/gorm v1.25.12 h1:I0u8i2hWQItBq1WfE0o2+WuL9+8L21K9e2HHSTE/0f8= gorm.io/gorm v1.25.12/go.mod h1:xh7N7RHfYlNc5EmcI/El95gXusucDrQnHXe0+CgWcLQ= gotest.tools/v3 v3.3.0 h1:MfDY1b1/0xN1CyMlQDac0ziEy9zJQd9CXBRRDHw2jJo= gotest.tools/v3 v3.3.0/go.mod h1:Mcr9QNxkg0uMvy/YElmo4SpXgJKWgQvYrT7Kw5RzJ1A= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= lukechampine.com/blake3 v1.2.1 h1:YuqqRuaqsGV71BV/nm9xlI0MKUv4QC54jQnBChWbGnI= lukechampine.com/blake3 v1.2.1/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k= modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 h1:5D53IMaUuA5InSeMu9eJtlQXS2NxAhyWQvkKEgXZhHI= From 5150e12a5e5e91b74eb645177aeb084619152fee Mon Sep 17 00:00:00 2001 From: polebug Date: Mon, 16 Dec 2024 21:18:23 +0800 Subject: [PATCH 28/31] fix: test --- config/config_test.go | 52 ++++++++++++++++++++++++++++++++++++------- 1 file changed, 44 insertions(+), 8 deletions(-) diff --git a/config/config_test.go b/config/config_test.go index bb4fc49c2..44f2c9767 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -70,11 +70,17 @@ component: access_key: abc access_code: def federated: - network: mastodon - worker: core + - network: mastodon + worker: mastodon endpoint: mastodon parameters: relay_url_list: ["https://relay.fedi.buzz/instance/mastodon.social"] + - network: bluesky + worker: bluesky + endpoint: bluesky + parameters: + username: user + password: pass decentralized: - network: ethereum @@ -118,7 +124,7 @@ component: } }, "database": { - "coverage_period": 3, + "coverage_period": 3, "uri": "postgres://postgres@localhost:5432/postgres" }, "stream": { @@ -160,12 +166,21 @@ component: "federated": [ { "network": "mastodon", - "worker": "core", + "worker": "mastodon", "endpoint": "mastodon", "parameters": { - "relay_url_list": [ - "https://relay.fedi.buzz/instance/mastodon.social" - ] + "relay_url_list": [ + "https://relay.fedi.buzz/instance/mastodon.social" + ] + } + }, + { + "network": "bluesky", + "worker": "bluesky", + "endpoint": "bluesky", + "parameters": { + "username": "user", + "password": "pass" } } ], @@ -249,12 +264,21 @@ access_code = "def" [[component.federated]] network = "mastodon" -worker = "core" +worker = "mastodon" endpoint = "mastodon" [component.federated.parameters] relay_url_list = ["https://relay.fedi.buzz/instance/mastodon.social"] +[[component.federated]] +network = "bluesky" +worker = "bluesky" +endpoint = "bluesky" + +[component.federated.parameters] +username = "user" +password = "pass" + [[component.decentralized]] network = "ethereum" worker = "core" @@ -336,6 +360,18 @@ var configFileExpected = &File{ // "port": 8181, //ToDo: add port here and other places }, }, + { + Network: network.Bluesky, + Worker: federated.Bluesky, + EndpointID: "bluesky", + Endpoint: Endpoint{ + URL: "bluesky", + }, + Parameters: &Parameters{ + "username": "user", + "password": "pass", + }, + }, }, Decentralized: []*Module{ { From cc0a88bbc6aa1e91b1b3d837217b96b7458712ec Mon Sep 17 00:00:00 2001 From: polebug Date: Tue, 17 Dec 2024 00:07:52 +0800 Subject: [PATCH 29/31] chore: add related urls --- .../federated/transformer_social_type.go | 41 +++++++++++++------ 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/internal/node/component/federated/transformer_social_type.go b/internal/node/component/federated/transformer_social_type.go index 68ae0b0e7..a73ec4699 100644 --- a/internal/node/component/federated/transformer_social_type.go +++ b/internal/node/component/federated/transformer_social_type.go @@ -5,6 +5,7 @@ import ( "fmt" "strings" + "github.com/rss3-network/node/schema/worker/federated" "github.com/rss3-network/protocol-go/schema/activity" "github.com/rss3-network/protocol-go/schema/metadata" "github.com/rss3-network/protocol-go/schema/network" @@ -15,7 +16,7 @@ import ( // TransformSocialType adds author url and note url to social actions based on type, network and platform func (c *Component) TransformSocialType(ctx context.Context, network network.Network, platform string, action activity.Action) (activity.Action, error) { switch action.Type { - case typex.SocialPost, typex.SocialComment, typex.SocialShare: + case typex.SocialPost, typex.SocialComment, typex.SocialShare, typex.SocialLike: return c.TransformSocialPost(ctx, network, platform, action) } @@ -55,14 +56,21 @@ func (c *Component) buildSocialAuthorURL(_ context.Context, platform, handle str return "" } - parts := strings.SplitN(handle, "@", 3) - if len(parts) != 3 { - return "" - } + switch platform { + case federated.PlatformMastodon.String(): + parts := strings.SplitN(handle, "@", 3) + if len(parts) != 3 { + return "" + } - username, domain := parts[1], parts[2] + username, domain := parts[1], parts[2] - return fmt.Sprintf("https://%s/users/%s", domain, username) + return fmt.Sprintf("https://%s/users/%s", domain, username) + case federated.PlatformBluesky.String(): + return fmt.Sprintf("https://bsky.app/profile/%s", handle) + default: + return "" + } } // buildSocialNoteURL returns note url based on domain, handle, profileID and pubID @@ -71,12 +79,19 @@ func (c *Component) buildSocialNoteURL(_ context.Context, _ network.Network, pla return "" } - parts := strings.SplitN(handle, "@", 3) - if len(parts) != 3 { - return "" - } + switch platform { + case federated.PlatformMastodon.String(): + parts := strings.SplitN(handle, "@", 3) + if len(parts) != 3 { + return "" + } - username, domain := parts[1], parts[2] + username, domain := parts[1], parts[2] - return fmt.Sprintf("https://%s/users/%s/statuses/%s", domain, username, pubID) + return fmt.Sprintf("https://%s/users/%s/statuses/%s", domain, username, pubID) + case federated.PlatformBluesky.String(): + return fmt.Sprintf("https://bsky.app/profile/%s/post/%s", handle, pubID) + default: + return "" + } } From 581a14d2e0a24da8362df00a0c52ce3b2338c2f2 Mon Sep 17 00:00:00 2001 From: polebug Date: Tue, 17 Dec 2024 15:16:54 +0800 Subject: [PATCH 30/31] chore: lock pkg version --- docs/api.yaml | 2 +- docs/generated.go | 338 +++++++++--------- go.mod | 10 +- go.sum | 36 +- .../contract/kiwistand/contract_kiwi.go | 8 +- .../contract/rss3/contract_staking_vsl.go | 2 +- 6 files changed, 213 insertions(+), 183 deletions(-) diff --git a/docs/api.yaml b/docs/api.yaml index d3fb95e99..ce9c05b42 100644 --- a/docs/api.yaml +++ b/docs/api.yaml @@ -7,7 +7,7 @@ info: name: MIT url: https://opensource.org/licenses/MIT servers: - - url: http://localhost + - url: http://localhost:80 description: Local development server tags: - name: RSS diff --git a/docs/generated.go b/docs/generated.go index 25a97126f..cf18a90a6 100644 --- a/docs/generated.go +++ b/docs/generated.go @@ -736,175 +736,175 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/go.mod b/go.mod index 72851e815..1a02b8351 100644 --- a/go.mod +++ b/go.mod @@ -2,9 +2,10 @@ module github.com/rss3-network/node go 1.22.4 -toolchain go1.22.10 - -replace github.com/chenzhuoyu/iasm => github.com/cloudwego/iasm v0.2.0 +replace ( + github.com/chenzhuoyu/iasm => github.com/cloudwego/iasm v0.2.0 + github.com/cockroachdb/pebble => github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 +) require ( github.com/JohannesKaufmann/html-to-markdown v1.6.0 @@ -97,7 +98,6 @@ require ( github.com/carlmjohnson/versioninfo v0.22.5 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/cockroachdb/errors v1.11.3 // indirect - github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect github.com/cockroachdb/pebble v1.1.2 // indirect github.com/cockroachdb/redact v1.1.5 // indirect @@ -109,6 +109,7 @@ require ( github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/deckarep/golang-set/v2 v2.3.1 // indirect github.com/distribution/reference v0.6.0 // indirect + github.com/dmarkham/enumer v1.5.10 // indirect github.com/docker/cli v26.1.1+incompatible // indirect github.com/docker/docker v26.1.3+incompatible // indirect github.com/docker/go-connections v0.5.0 // indirect @@ -116,6 +117,7 @@ require ( github.com/dprotaso/go-yit v0.0.0-20220510233725-9ba8df137936 // indirect github.com/ethereum/c-kzg-4844 v0.4.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/fjl/gencodec v0.0.0-20230517082657-f9840df7b83e // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/getsentry/sentry-go v0.27.0 // indirect github.com/go-logr/logr v1.4.2 // indirect diff --git a/go.sum b/go.sum index fdd789fad..ea4a8e4a8 100644 --- a/go.sum +++ b/go.sum @@ -23,13 +23,21 @@ github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bw github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= github.com/adrianbrad/psqldocker v1.2.1 h1:bvsRmbotpA89ruqGGzzaAZUBtDaIk98gO+JMBNVSZlI= github.com/adrianbrad/psqldocker v1.2.1/go.mod h1:LbCnIy60YO6IRJYrF1r+eafKUgU9UnkSFx0gT8UiaUs= +github.com/agnivade/levenshtein v1.1.1 h1:QY8M92nrzkmr798gCo3kmMyqXFzdQVpxLlGPRBij0P8= +github.com/agnivade/levenshtein v1.1.1/go.mod h1:veldBMzWxcCG2ZvUTKD2kJNRdCk5hVbJomOvKkmgYbo= github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5 h1:iW0a5ljuFxkLGPNem5Ui+KBjFJzKg4Fv2fnxe4dvzpM= github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5/go.mod h1:Y2QMoi1vgtOIfc+6DhrMOGkLoGzqSV2rKp4Sm+opsyA= +github.com/alexflint/go-arg v1.4.2 h1:lDWZAXxpAnZUq4qwb86p/3rIJJ2Li81EoMbTMujhVa0= +github.com/alexflint/go-arg v1.4.2/go.mod h1:9iRbDxne7LcR/GSvEr7ma++GLpdIU1zrghf2y2768kM= +github.com/alexflint/go-scalar v1.0.0 h1:NGupf1XV/Xb04wXskDFzS0KWOLH632W/EO4fAFi+A70= +github.com/alexflint/go-scalar v1.0.0/go.mod h1:GpHzbCOZXEKMEcygYQ5n/aa4Aq84zbxjy3MxYW0gjYw= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= github.com/andybalholm/cascadia v1.2.0/go.mod h1:YCyR8vOZT9aZ1CHEd8ap0gMVm2aFgxBp0T0eFw1RUQY= github.com/andybalholm/cascadia v1.3.2 h1:3Xi6Dw5lHF15JtdcmAHD3i1+T8plmv7BQ/nsViSLyss= github.com/andybalholm/cascadia v1.3.2/go.mod h1:7gtRlve5FxPPgIgX36uWBX58OdBsSS6lUvCFb+h7KvU= +github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ= +github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk= github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de h1:FxWPpzIjnTlhPwqqXc4/vE0f7GvRjuAsbW+HOIe8KnA= github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de/go.mod h1:DCaWoUhZrYW9p1lxo/cm8EmUOOzAPSEZNGF2DK1dJgw= github.com/avast/retry-go/v4 v4.6.0 h1:K9xNA+KeB8HHc2aWFuLb25Offp+0iVRXEvFx8IinRJA= @@ -62,12 +70,10 @@ github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaY github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/errors v1.11.3 h1:5bA+k2Y6r+oz/6Z/RFlNeVCesGARKuC6YymtcDrbC/I= github.com/cockroachdb/errors v1.11.3/go.mod h1:m4UIW4CDjx+R5cybPsNrRbreomiFqt8o1h1wUVazSd8= -github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce h1:giXvy4KSc/6g/esnpM7Geqxka4WSqI1SZc7sMJFd3y4= -github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce/go.mod h1:9/y3cnZ5GKakj/H4y9r9GTjCvAFta7KLgSHPJJYc52M= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v1.1.2 h1:CUh2IPtR4swHlEj48Rhfzw6l/d0qA31fItcIszQVIsA= -github.com/cockroachdb/pebble v1.1.2/go.mod h1:4exszw1r40423ZsmkG/09AFEG83I0uDgfujJdbL6kYU= +github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 h1:aPEJyR4rPBvDmeyi+l/FS/VtA00IWvjeFvjen1m1l1A= +github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593/go.mod h1:6hk1eMY/u5t+Cf18q5lFMUA1Rc+Sm5I6Ra1QuPyxXCo= github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= @@ -108,6 +114,8 @@ github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/r github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= +github.com/dmarkham/enumer v1.5.10 h1:ygL0L6quiTiH1jpp68DyvsWaea6MaZLZrTTkIS++R0M= +github.com/dmarkham/enumer v1.5.10/go.mod h1:e4VILe2b1nYK3JKJpRmNdl5xbDQvELc6tQ8b+GsGk6E= github.com/docker/cli v26.1.1+incompatible h1:bE1/uE2tCa08fMv+7ikLR/RDPoCqytwrLtkIkSzxLvw= github.com/docker/cli v26.1.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/docker v26.1.3+incompatible h1:lLCzRbrVZrljpVNobJu1J2FHk8V0s4BawoZippkc+xo= @@ -131,6 +139,10 @@ github.com/fatih/color v1.14.1 h1:qfhVLaG5s+nCROl1zJsZRxFeYrHLqWroPOQ8BWiNb4w= github.com/fatih/color v1.14.1/go.mod h1:2oHN61fhTpgcxD3TSWCgKDiH1+x4OiDVVGH8WlgGZGg= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/ferranbt/fastssz v0.1.2 h1:Dky6dXlngF6Qjc+EfDipAkE83N5I5DE68bY6O0VLNPk= +github.com/ferranbt/fastssz v0.1.2/go.mod h1:X5UPrE2u1UJjxHA8X54u04SBwdAQjG2sFtWs39YxyWs= +github.com/fjl/gencodec v0.0.0-20230517082657-f9840df7b83e h1:bBLctRc7kr01YGvaDfgLbTwjFNW5jdp5y5rj8XXBHfY= +github.com/fjl/gencodec v0.0.0-20230517082657-f9840df7b83e/go.mod h1:AzA8Lj6YtixmJWL+wkKoBGsLWy9gFrAzi4g+5bCKwpY= github.com/fjl/memsize v0.0.2 h1:27txuSD9or+NZlnOWdKUxeBzTAUkWCVh+4Gf2dWFOzA= github.com/fjl/memsize v0.0.2/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= @@ -142,6 +154,8 @@ github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nos github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/gabriel-vasile/mimetype v1.4.7 h1:SKFKl7kD0RiPdbht0s7hFtjl489WcQ1VyPW8ZzUMYCA= github.com/gabriel-vasile/mimetype v1.4.7/go.mod h1:GDlAgAyIRT27BhFl53XNAFtfjzOkLaF35JdEG0P7LtU= +github.com/garslo/gogen v0.0.0-20170306192744-1d203ffc1f61 h1:IZqZOB2fydHte3kUgxrzK5E1fW7RQGeDwE8F/ZZnUYc= +github.com/garslo/gogen v0.0.0-20170306192744-1d203ffc1f61/go.mod h1:Q0X6pkwTILDlzrGEckF6HKjXe48EgsY/l7K7vhY4MW8= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 h1:BAIP2GihuqhwdILrV+7GJel5lyPV3u1+PgzrWLc0TkE= @@ -251,6 +265,8 @@ github.com/grafana/pyroscope-go v1.2.0 h1:aILLKjTj8CS8f/24OPMGPewQSYlhmdQMBmol1d github.com/grafana/pyroscope-go v1.2.0/go.mod h1:2GHr28Nr05bg2pElS+dDsc98f3JTUh2f6Fz1hWXrqwk= github.com/grafana/pyroscope-go/godeltaprof v0.1.8 h1:iwOtYXeeVSAeYefJNaxDytgjKtUuKQbJqgAIjlnicKg= github.com/grafana/pyroscope-go/godeltaprof v0.1.8/go.mod h1:2+l7K7twW49Ct4wFluZD3tZ6e0SjanjcUUBPVD/UuGU= +github.com/graph-gophers/graphql-go v1.3.0 h1:Eb9x/q6MFpCLz7jBCiP/WTxjSDrYLR1QY41SORZyNJ0= +github.com/graph-gophers/graphql-go v1.3.0/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 h1:ad0vkEBuk23VJzZR9nkLVG0YAoN9coASF1GusYX6AlU= github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0/go.mod h1:igFoXX2ELCW06bol23DWPB5BEWfZISOzSP5K2sbLea0= github.com/hamba/avro v1.8.0 h1:eCVrLX7UYThA3R3yBZ+rpmafA5qTc3ZjpTz6gYJoVGU= @@ -289,6 +305,12 @@ github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFck github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/influxdata/influxdb-client-go/v2 v2.13.0 h1:ioBbLmR5NMbAjP4UVA5r9b5xGjpABD7j65pI8kFphDM= +github.com/influxdata/influxdb-client-go/v2 v2.13.0/go.mod h1:k+spCbt9hcvqvUiz0sr5D8LolXHqAAOfPw9v/RIRHl4= +github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c h1:qSHzRbhzK8RdXOsAdfDgO49TtqC1oZ+acxPrkfTxcCs= +github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/influxdata/line-protocol v0.0.0-20210922203350-b1ad95c89adf h1:7JTmneyiNEwVBOHSjoMxiWAqB992atOeepeFYegn5RU= +github.com/influxdata/line-protocol v0.0.0-20210922203350-b1ad95c89adf/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= github.com/invopop/yaml v0.3.1 h1:f0+ZpmhfBSS4MhG+4HYseMdJhoeeopbSKbq5Rpeelso= github.com/invopop/yaml v0.3.1/go.mod h1:PMOp3nn4/12yEZUFfmOuNHJsZToEEOwoWsT+D81KkeA= github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs= @@ -511,6 +533,8 @@ github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY= github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc= github.com/oapi-codegen/oapi-codegen/v2 v2.4.1 h1:ykgG34472DWey7TSjd8vIfNykXgjOgYJZoQbKfEeY/Q= github.com/oapi-codegen/oapi-codegen/v2 v2.4.1/go.mod h1:N5+lY1tiTDV3V1BeHtOxeWXHoPVeApvsvjJqegfoaz8= +github.com/oapi-codegen/runtime v1.0.0 h1:P4rqFX5fMFWqRzY9M/3YF9+aPSPPB06IzP2P7oOxrWo= +github.com/oapi-codegen/runtime v1.0.0/go.mod h1:LmCUMQuPB4M/nLXilQXhHw+BLZdDb18B34OO356yJ/A= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -542,12 +566,16 @@ github.com/orlangure/gnomock v0.31.0 h1:dgjlQ8DYUPMyNwMZJuYBH+/GF+e7h3sloldPzIJF github.com/orlangure/gnomock v0.31.0/go.mod h1:RagxeYv3bKi+li9Lio2Faw5t6Mcy4akkeqXzkgAS3w0= github.com/ory/dockertest/v3 v3.10.0 h1:4K3z2VMe8Woe++invjaTB7VRyQXQy5UY+loujO4aNE4= github.com/ory/dockertest/v3 v3.10.0/go.mod h1:nr57ZbRWMqfsdGdFNLHz5jjNdDb7VVFnzAeW1n5N1Lg= +github.com/pascaldekloe/name v1.0.0 h1:n7LKFgHixETzxpRv2R77YgPUFo85QHGZKrdaYm7eY5U= +github.com/pascaldekloe/name v1.0.0/go.mod h1:Z//MfYJnH4jVpQ9wkclwu2I2MkHmXTlT9wR5UZScttM= github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= github.com/perimeterx/marshmallow v1.1.5 h1:a2LALqQ1BlHM8PZblsDdidgv1mWi1DgC2UmX50IvK2s= github.com/perimeterx/marshmallow v1.1.5/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0Vchtcl8we9tYaXw= github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 h1:1/WtZae0yGtPq+TI6+Tv1WTxkukpXeMlviSxvL7SRgk= github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9/go.mod h1:x3N5drFsm2uilKKuuYo6LdyD8vZAW55sH/9w+pbo1sw= +github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7 h1:oYW+YCJ1pachXTQmzR3rNLYGGz4g/UgFcjb28p/viDM= +github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= diff --git a/provider/ethereum/contract/kiwistand/contract_kiwi.go b/provider/ethereum/contract/kiwistand/contract_kiwi.go index cf7d99826..a783a0e7c 100644 --- a/provider/ethereum/contract/kiwistand/contract_kiwi.go +++ b/provider/ethereum/contract/kiwistand/contract_kiwi.go @@ -62,7 +62,7 @@ type RewardsSettings struct { // KiwiMetaData contains all meta data concerning the Kiwi contract. var KiwiMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_zoraERC721TransferHelper\",\"type\":\"address\"},{\"internalType\":\"contractIFactoryUpgradeGate\",\"name\":\"_factoryUpgradeGate\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_marketFilterDAOAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_mintFeeAmount\",\"type\":\"uint256\"},{\"internalType\":\"addresspayable\",\"name\":\"_mintFeeRecipient\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_protocolRewards\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"Access_MissingRoleOrAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Access_OnlyAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Access_WithdrawNotAllowed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"proposedAddress\",\"type\":\"address\"}],\"name\":\"Admin_InvalidUpgradeAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Admin_UnableToFinalizeNotOpenEdition\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ApprovalCallerNotOwnerNorApproved\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ApprovalQueryForNonexistentToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ApprovalToCurrentOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ApproveToCaller\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BalanceQueryForZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CREATOR_FUNDS_RECIPIENT_NOT_SET\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExternalMetadataRenderer_CallFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"INVALID_ADDRESS_ZERO\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"INVALID_ETH_AMOUNT\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidMintSchedule\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MarketFilterDAOAddressNotSupportedForChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MintFee_FundsSendFailure\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MintToZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MintZeroQuantity\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Mint_SoldOut\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ONLY_CREATE_REFERRAL\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ONLY_OWNER\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ONLY_PENDING_OWNER\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"OperatorNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OwnerQueryForNonexistentToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Presale_Inactive\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Presale_MerkleNotApproved\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Presale_TooManyForAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ProtocolRewards_WithdrawSendFailure\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Purchase_TooManyForAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"correctPrice\",\"type\":\"uint256\"}],\"name\":\"Purchase_WrongPrice\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RemoteOperatorFilterRegistryCallFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Sale_Inactive\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"maxRoyaltyBPS\",\"type\":\"uint16\"}],\"name\":\"Setup_RoyaltyPercentageTooHigh\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferCallerNotOwnerNorApproved\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferFromIncorrectOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferToNonERC721ReceiverImplementer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferToZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"URIQueryForNonexistentToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Withdraw_FundsSendFailure\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"previousAdmin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_fromTokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_toTokenId\",\"type\":\"uint256\"}],\"name\":\"BatchMetadataUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"protocol\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"FundsReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newAddress\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"changedBy\",\"type\":\"address\"}],\"name\":\"FundsRecipientChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"withdrawnBy\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"withdrawnTo\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"feeRecipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"feeAmount\",\"type\":\"uint256\"}],\"name\":\"FundsWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"MetadataUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"quantity\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"comment\",\"type\":\"string\"}],\"name\":\"MintComment\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"mintFeeAmount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"mintFeeRecipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"name\":\"MintFeePayout\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"numberOfMints\",\"type\":\"uint256\"}],\"name\":\"OpenMintFinalized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"potentialNewOwner\",\"type\":\"address\"}],\"name\":\"OwnerCanceled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"potentialNewOwner\",\"type\":\"address\"}],\"name\":\"OwnerPending\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"quantity\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"pricePerToken\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"firstPurchasedTokenId\",\"type\":\"uint256\"}],\"name\":\"Sale\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"changedBy\",\"type\":\"address\"}],\"name\":\"SalesConfigChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"contractIMetadataRenderer\",\"name\":\"renderer\",\"type\":\"address\"}],\"name\":\"UpdatedMetadataRenderer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MINTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SALES_MANAGER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"quantity\",\"type\":\"uint256\"}],\"name\":\"adminMint\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"}],\"name\":\"adminMintAirdrop\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"callMetadataRenderer\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"numTokens\",\"type\":\"uint256\"}],\"name\":\"computeFreeMintRewards\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"creatorReward\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"createReferralReward\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"mintReferralReward\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"firstMinterReward\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"zoraReward\",\"type\":\"uint256\"}],\"internalType\":\"structRewardsSettings\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"numTokens\",\"type\":\"uint256\"}],\"name\":\"computePaidMintRewards\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"creatorReward\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"createReferralReward\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"mintReferralReward\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"firstMinterReward\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"zoraReward\",\"type\":\"uint256\"}],\"internalType\":\"structRewardsSettings\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"numTokens\",\"type\":\"uint256\"}],\"name\":\"computeTotalReward\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"config\",\"outputs\":[{\"internalType\":\"contractIMetadataRenderer\",\"name\":\"metadataRenderer\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"editionSize\",\"type\":\"uint64\"},{\"internalType\":\"uint16\",\"name\":\"royaltyBPS\",\"type\":\"uint16\"},{\"internalType\":\"addresspayable\",\"name\":\"fundsRecipient\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"contractURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"contractVersion\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"createReferral\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"factoryUpgradeGate\",\"outputs\":[{\"internalType\":\"contractIFactoryUpgradeGate\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"finalizeOpenEdition\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_contractName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_contractSymbol\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"_initialOwner\",\"type\":\"address\"},{\"internalType\":\"addresspayable\",\"name\":\"_fundsRecipient\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"_editionSize\",\"type\":\"uint64\"},{\"internalType\":\"uint16\",\"name\":\"_royaltyBPS\",\"type\":\"uint16\"},{\"internalType\":\"bytes[]\",\"name\":\"_setupCalls\",\"type\":\"bytes[]\"},{\"internalType\":\"contractIMetadataRenderer\",\"name\":\"_metadataRenderer\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_metadataRendererInit\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"_createReferral\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"}],\"name\":\"isAdmin\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nftOwner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"enable\",\"type\":\"bool\"}],\"name\":\"manageMarketFilterDAOSubscription\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"marketFilterDAOAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"metadataRenderer\",\"outputs\":[{\"internalType\":\"contractIMetadataRenderer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"quantity\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"comment\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"mintReferral\",\"type\":\"address\"}],\"name\":\"mintWithRewards\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"mintedPerAddress\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"totalMints\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"presaleMints\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"publicMints\",\"type\":\"uint256\"}],\"internalType\":\"structIERC721Drop.AddressMintDetails\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"data\",\"type\":\"bytes[]\"}],\"name\":\"multicall\",\"outputs\":[{\"internalType\":\"bytes[]\",\"name\":\"results\",\"type\":\"bytes[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"presaleMintsByAddress\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proxiableUUID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"quantity\",\"type\":\"uint256\"}],\"name\":\"purchase\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"quantity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxQuantity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"pricePerToken\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"merkleProof\",\"type\":\"bytes32[]\"}],\"name\":\"purchasePresale\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"quantity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxQuantity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"pricePerToken\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"merkleProof\",\"type\":\"bytes32[]\"},{\"internalType\":\"string\",\"name\":\"comment\",\"type\":\"string\"}],\"name\":\"purchasePresaleWithComment\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"quantity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxQuantity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"pricePerToken\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"merkleProof\",\"type\":\"bytes32[]\"},{\"internalType\":\"string\",\"name\":\"comment\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"mintReferral\",\"type\":\"address\"}],\"name\":\"purchasePresaleWithRewards\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"quantity\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"comment\",\"type\":\"string\"}],\"name\":\"purchaseWithComment\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"quantity\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"comment\",\"type\":\"string\"}],\"name\":\"purchaseWithRecipient\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_salePrice\",\"type\":\"uint256\"}],\"name\":\"royaltyInfo\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"royaltyAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"royaltyMintSchedule\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"saleDetails\",\"outputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"publicSaleActive\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"presaleActive\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"publicSalePrice\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"publicSaleStart\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"publicSaleEnd\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"presaleStart\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"presaleEnd\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"presaleMerkleRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"maxSalePurchasePerAddress\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"totalMinted\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxSupply\",\"type\":\"uint256\"}],\"internalType\":\"structIERC721Drop.SaleDetails\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"salesConfig\",\"outputs\":[{\"internalType\":\"uint104\",\"name\":\"publicSalePrice\",\"type\":\"uint104\"},{\"internalType\":\"uint32\",\"name\":\"maxSalePurchasePerAddress\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"publicSaleStart\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"publicSaleEnd\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"presaleStart\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"presaleEnd\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"presaleMerkleRoot\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"newRecipientAddress\",\"type\":\"address\"}],\"name\":\"setFundsRecipient\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contractIMetadataRenderer\",\"name\":\"newRenderer\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"setupRenderer\",\"type\":\"bytes\"}],\"name\":\"setMetadataRenderer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"setOwner\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint104\",\"name\":\"publicSalePrice\",\"type\":\"uint104\"},{\"internalType\":\"uint32\",\"name\":\"maxSalePurchasePerAddress\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"publicSaleStart\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"publicSaleEnd\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"presaleStart\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"presaleEnd\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"presaleMerkleRoot\",\"type\":\"bytes32\"}],\"name\":\"setSaleConfiguration\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"updateCreateReferral\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"args\",\"type\":\"bytes\"}],\"name\":\"updateMarketFilterSettings\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"newSchedule\",\"type\":\"uint32\"}],\"name\":\"updateRoyaltyMintSchedule\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawRewards\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"zoraERC721TransferHelper\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"quantity\",\"type\":\"uint256\"}],\"name\":\"zoraFeeForAmount\",\"outputs\":[{\"internalType\":\"addresspayable\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"fee\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_zoraERC721TransferHelper\",\"type\":\"address\"},{\"internalType\":\"contractIFactoryUpgradeGate\",\"name\":\"_factoryUpgradeGate\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_marketFilterDAOAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_mintFeeAmount\",\"type\":\"uint256\"},{\"internalType\":\"addresspayable\",\"name\":\"_mintFeeRecipient\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_protocolRewards\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"Access_MissingRoleOrAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Access_OnlyAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Access_WithdrawNotAllowed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"proposedAddress\",\"type\":\"address\"}],\"name\":\"Admin_InvalidUpgradeAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Admin_UnableToFinalizeNotOpenEdition\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ApprovalCallerNotOwnerNorApproved\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ApprovalQueryForNonexistentToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ApprovalToCurrentOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ApproveToCaller\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BalanceQueryForZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CREATOR_FUNDS_RECIPIENT_NOT_SET\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExternalMetadataRenderer_CallFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"INVALID_ADDRESS_ZERO\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"INVALID_ETH_AMOUNT\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidMintSchedule\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MarketFilterDAOAddressNotSupportedForChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MintFee_FundsSendFailure\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MintToZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MintZeroQuantity\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Mint_SoldOut\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ONLY_CREATE_REFERRAL\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ONLY_OWNER\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ONLY_PENDING_OWNER\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"OperatorNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OwnerQueryForNonexistentToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Presale_Inactive\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Presale_MerkleNotApproved\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Presale_TooManyForAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ProtocolRewards_WithdrawSendFailure\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Purchase_TooManyForAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"correctPrice\",\"type\":\"uint256\"}],\"name\":\"Purchase_WrongPrice\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RemoteOperatorFilterRegistryCallFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Sale_Inactive\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"maxRoyaltyBPS\",\"type\":\"uint16\"}],\"name\":\"Setup_RoyaltyPercentageTooHigh\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferCallerNotOwnerNorApproved\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferFromIncorrectOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferToNonERC721ReceiverImplementer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferToZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"URIQueryForNonexistentToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Withdraw_FundsSendFailure\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"previousAdmin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_fromTokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_toTokenId\",\"type\":\"uint256\"}],\"name\":\"BatchMetadataUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"source\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"FundsReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newAddress\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"changedBy\",\"type\":\"address\"}],\"name\":\"FundsRecipientChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"withdrawnBy\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"withdrawnTo\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"feeRecipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"feeAmount\",\"type\":\"uint256\"}],\"name\":\"FundsWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"MetadataUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"quantity\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"comment\",\"type\":\"string\"}],\"name\":\"MintComment\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"mintFeeAmount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"mintFeeRecipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"name\":\"MintFeePayout\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"numberOfMints\",\"type\":\"uint256\"}],\"name\":\"OpenMintFinalized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"potentialNewOwner\",\"type\":\"address\"}],\"name\":\"OwnerCanceled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"potentialNewOwner\",\"type\":\"address\"}],\"name\":\"OwnerPending\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"quantity\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"pricePerToken\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"firstPurchasedTokenId\",\"type\":\"uint256\"}],\"name\":\"Sale\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"changedBy\",\"type\":\"address\"}],\"name\":\"SalesConfigChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"contractIMetadataRenderer\",\"name\":\"renderer\",\"type\":\"address\"}],\"name\":\"UpdatedMetadataRenderer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MINTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SALES_MANAGER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"quantity\",\"type\":\"uint256\"}],\"name\":\"adminMint\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"}],\"name\":\"adminMintAirdrop\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"callMetadataRenderer\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"numTokens\",\"type\":\"uint256\"}],\"name\":\"computeFreeMintRewards\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"creatorReward\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"createReferralReward\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"mintReferralReward\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"firstMinterReward\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"zoraReward\",\"type\":\"uint256\"}],\"internalType\":\"structRewardsSettings\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"numTokens\",\"type\":\"uint256\"}],\"name\":\"computePaidMintRewards\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"creatorReward\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"createReferralReward\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"mintReferralReward\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"firstMinterReward\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"zoraReward\",\"type\":\"uint256\"}],\"internalType\":\"structRewardsSettings\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"numTokens\",\"type\":\"uint256\"}],\"name\":\"computeTotalReward\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"config\",\"outputs\":[{\"internalType\":\"contractIMetadataRenderer\",\"name\":\"metadataRenderer\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"editionSize\",\"type\":\"uint64\"},{\"internalType\":\"uint16\",\"name\":\"royaltyBPS\",\"type\":\"uint16\"},{\"internalType\":\"addresspayable\",\"name\":\"fundsRecipient\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"contractURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"contractVersion\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"createReferral\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"factoryUpgradeGate\",\"outputs\":[{\"internalType\":\"contractIFactoryUpgradeGate\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"finalizeOpenEdition\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_contractName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_contractSymbol\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"_initialOwner\",\"type\":\"address\"},{\"internalType\":\"addresspayable\",\"name\":\"_fundsRecipient\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"_editionSize\",\"type\":\"uint64\"},{\"internalType\":\"uint16\",\"name\":\"_royaltyBPS\",\"type\":\"uint16\"},{\"internalType\":\"bytes[]\",\"name\":\"_setupCalls\",\"type\":\"bytes[]\"},{\"internalType\":\"contractIMetadataRenderer\",\"name\":\"_metadataRenderer\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_metadataRendererInit\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"_createReferral\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"}],\"name\":\"isAdmin\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nftOwner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"enable\",\"type\":\"bool\"}],\"name\":\"manageMarketFilterDAOSubscription\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"marketFilterDAOAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"metadataRenderer\",\"outputs\":[{\"internalType\":\"contractIMetadataRenderer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"quantity\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"comment\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"mintReferral\",\"type\":\"address\"}],\"name\":\"mintWithRewards\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"mintedPerAddress\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"totalMints\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"presaleMints\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"publicMints\",\"type\":\"uint256\"}],\"internalType\":\"structIERC721Drop.AddressMintDetails\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"data\",\"type\":\"bytes[]\"}],\"name\":\"multicall\",\"outputs\":[{\"internalType\":\"bytes[]\",\"name\":\"results\",\"type\":\"bytes[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"presaleMintsByAddress\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proxiableUUID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"quantity\",\"type\":\"uint256\"}],\"name\":\"purchase\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"quantity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxQuantity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"pricePerToken\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"merkleProof\",\"type\":\"bytes32[]\"}],\"name\":\"purchasePresale\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"quantity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxQuantity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"pricePerToken\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"merkleProof\",\"type\":\"bytes32[]\"},{\"internalType\":\"string\",\"name\":\"comment\",\"type\":\"string\"}],\"name\":\"purchasePresaleWithComment\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"quantity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxQuantity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"pricePerToken\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"merkleProof\",\"type\":\"bytes32[]\"},{\"internalType\":\"string\",\"name\":\"comment\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"mintReferral\",\"type\":\"address\"}],\"name\":\"purchasePresaleWithRewards\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"quantity\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"comment\",\"type\":\"string\"}],\"name\":\"purchaseWithComment\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"quantity\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"comment\",\"type\":\"string\"}],\"name\":\"purchaseWithRecipient\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_salePrice\",\"type\":\"uint256\"}],\"name\":\"royaltyInfo\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"royaltyAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"royaltyMintSchedule\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"saleDetails\",\"outputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"publicSaleActive\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"presaleActive\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"publicSalePrice\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"publicSaleStart\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"publicSaleEnd\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"presaleStart\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"presaleEnd\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"presaleMerkleRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"maxSalePurchasePerAddress\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"totalMinted\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxSupply\",\"type\":\"uint256\"}],\"internalType\":\"structIERC721Drop.SaleDetails\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"salesConfig\",\"outputs\":[{\"internalType\":\"uint104\",\"name\":\"publicSalePrice\",\"type\":\"uint104\"},{\"internalType\":\"uint32\",\"name\":\"maxSalePurchasePerAddress\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"publicSaleStart\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"publicSaleEnd\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"presaleStart\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"presaleEnd\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"presaleMerkleRoot\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"newRecipientAddress\",\"type\":\"address\"}],\"name\":\"setFundsRecipient\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contractIMetadataRenderer\",\"name\":\"newRenderer\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"setupRenderer\",\"type\":\"bytes\"}],\"name\":\"setMetadataRenderer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"setOwner\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint104\",\"name\":\"publicSalePrice\",\"type\":\"uint104\"},{\"internalType\":\"uint32\",\"name\":\"maxSalePurchasePerAddress\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"publicSaleStart\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"publicSaleEnd\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"presaleStart\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"presaleEnd\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"presaleMerkleRoot\",\"type\":\"bytes32\"}],\"name\":\"setSaleConfiguration\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"updateCreateReferral\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"args\",\"type\":\"bytes\"}],\"name\":\"updateMarketFilterSettings\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"newSchedule\",\"type\":\"uint32\"}],\"name\":\"updateRoyaltyMintSchedule\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawRewards\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"zoraERC721TransferHelper\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"quantity\",\"type\":\"uint256\"}],\"name\":\"zoraFeeForAmount\",\"outputs\":[{\"internalType\":\"addresspayable\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"fee\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", } // KiwiABI is the input ABI used to generate the binding from. @@ -2928,7 +2928,7 @@ type KiwiFundsReceived struct { // FilterFundsReceived is a free log retrieval operation binding the contract event 0x8e47b87b0ef542cdfa1659c551d88bad38aa7f452d2bbb349ab7530dfec8be8f. // -// Solidity: event FundsReceived(address indexed protocol, uint256 amount) +// Solidity: event FundsReceived(address indexed source, uint256 amount) func (_Kiwi *KiwiFilterer) FilterFundsReceived(opts *bind.FilterOpts, source []common.Address) (*KiwiFundsReceivedIterator, error) { var sourceRule []interface{} @@ -2945,7 +2945,7 @@ func (_Kiwi *KiwiFilterer) FilterFundsReceived(opts *bind.FilterOpts, source []c // WatchFundsReceived is a free log subscription operation binding the contract event 0x8e47b87b0ef542cdfa1659c551d88bad38aa7f452d2bbb349ab7530dfec8be8f. // -// Solidity: event FundsReceived(address indexed protocol, uint256 amount) +// Solidity: event FundsReceived(address indexed source, uint256 amount) func (_Kiwi *KiwiFilterer) WatchFundsReceived(opts *bind.WatchOpts, sink chan<- *KiwiFundsReceived, source []common.Address) (event.Subscription, error) { var sourceRule []interface{} @@ -2987,7 +2987,7 @@ func (_Kiwi *KiwiFilterer) WatchFundsReceived(opts *bind.WatchOpts, sink chan<- // ParseFundsReceived is a log parse operation binding the contract event 0x8e47b87b0ef542cdfa1659c551d88bad38aa7f452d2bbb349ab7530dfec8be8f. // -// Solidity: event FundsReceived(address indexed protocol, uint256 amount) +// Solidity: event FundsReceived(address indexed source, uint256 amount) func (_Kiwi *KiwiFilterer) ParseFundsReceived(log types.Log) (*KiwiFundsReceived, error) { event := new(KiwiFundsReceived) if err := _Kiwi.contract.UnpackLog(event, "FundsReceived", log); err != nil { diff --git a/provider/ethereum/contract/rss3/contract_staking_vsl.go b/provider/ethereum/contract/rss3/contract_staking_vsl.go index e60e2d106..52141a8b2 100644 --- a/provider/ethereum/contract/rss3/contract_staking_vsl.go +++ b/provider/ethereum/contract/rss3/contract_staking_vsl.go @@ -61,7 +61,7 @@ type DataTypesWithdrawalRequest struct { // StakingVSLMetaData contains all meta data concerning the StakingVSL contract. var StakingVSLMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"treasury\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"stakeRatio\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"stakeUnbondingPeriod\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"depositUnbondingPeriod\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"nodeSlashRateBasisPoints\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"userSlashRateBasisPoints\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minDeposit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minTaxRateBasisPoints\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AccessControlBadConfirmation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"neededRole\",\"type\":\"bytes32\"}],\"name\":\"AccessControlUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AlphaWithdrawNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AlreadyClaimed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"AmountTooSmall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BatchSizeZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CallerNotStaking\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CheckpointUnorderedInsertion\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ChipNotAuthorized\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ChipNotPublicGood\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"nodeAddr\",\"type\":\"address\"}],\"name\":\"ChipNotValid\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ChipsIdOverflow\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ChipsNotSameOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"claimId\",\"type\":\"uint256\"}],\"name\":\"ClaimIdNotExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ClaimTimeNotReady\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CreateNodeToZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyChipsIds\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyNodeList\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EnforcedPause\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExcessWithdrawalAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExpectedPause\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidArrayLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"InvalidEpoch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"current\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"got\",\"type\":\"uint256\"}],\"name\":\"InvalidEpochNumber\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"traitId\",\"type\":\"uint256\"}],\"name\":\"InvalidTraitId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nodeAddr\",\"type\":\"address\"}],\"name\":\"NodeAlreadyPublicGood\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NodeExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NodeNotExists\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nodeAddr\",\"type\":\"address\"}],\"name\":\"NodeNotPublicGood\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NodeStakedOrDeposited\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OperationRewardsExceed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PublicGoodNodeNotDeposited\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PublicGoodNodeNotInAlphaPhase\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrancyGuardReentrantCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nodeAddr\",\"type\":\"address\"}],\"name\":\"RewardsAlreadyDistributed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"bits\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"SafeCastOverflowedUintDowncast\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SettlementPhase\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nodeAddr\",\"type\":\"address\"}],\"name\":\"StakeToPublicGoodNode\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"StakingRewardsExceed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SubmissionIntervalNotElapsed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TaxRateBasisPointsTooLarge\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TaxRateBasisPointsTooSmall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferFailed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nodeAddr\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Deposited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"nodeId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nodeAddr\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"taxRateBasisPoints\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"publicGood\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"alpha\",\"type\":\"bool\"}],\"name\":\"NodeCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nodeAddr\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"slashedOperationPool\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"slashedStakingPool\",\"type\":\"uint256\"}],\"name\":\"NodeSlashed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nodeAddr\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"taxRateBasisPoints\",\"type\":\"uint64\"}],\"name\":\"NodeTaxRateBasisPointsSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nodeAddr\",\"type\":\"address\"}],\"name\":\"NodeUpdated2PublicGood\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"epoch\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"startTimestamp\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"endTimestamp\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"publicPoolRewards\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"publicPoolTax\",\"type\":\"uint256\"}],\"name\":\"PublicGoodRewardDistributed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"taxRateBasisPoints\",\"type\":\"uint64\"}],\"name\":\"PublicPoolTaxRateBasisPointsSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"epoch\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"startTimestamp\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"endTimestamp\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"nodeAddrs\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"operationRewards\",\"type\":\"uint256[]\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"stakingRewards\",\"type\":\"uint256[]\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"taxAmounts\",\"type\":\"uint256[]\"}],\"name\":\"RewardDistributed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nodeAddr\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"startTokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"endTokenId\",\"type\":\"uint256\"}],\"name\":\"Staked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nodeAddr\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"unstakeAmount\",\"type\":\"uint256\"}],\"name\":\"UnstakeClaimed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nodeAddr\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"unstakeAmount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"chipsIds\",\"type\":\"uint256[]\"}],\"name\":\"UnstakeRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nodeAddr\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"}],\"name\":\"WithdrawRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"}],\"name\":\"WithdrawalClaimed\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DEPOSIT_UNBONDING_PERIOD\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MIN_DEPOSIT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MIN_TAX_RATE_BASIS_POINTS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"NODE_SLASH_RATE_BASIS_POINTS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ORACLE_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PAUSE_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SHARES_PER_CHIP\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"STAKE_RATIO\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"STAKE_UNBONDING_PERIOD\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TREASURY\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"USER_SLASH_RATE_BASIS_POINTS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"chipsContract\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"requestIds\",\"type\":\"uint256[]\"}],\"name\":\"claimUnstake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"requestIds\",\"type\":\"uint256[]\"}],\"name\":\"claimWithdrawal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"taxRateBasisPoints\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"publicGood\",\"type\":\"bool\"}],\"name\":\"createNode\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"disableAlphaPhase\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[3]\",\"name\":\"epochInfo\",\"type\":\"uint256[3]\"},{\"internalType\":\"address[]\",\"name\":\"nodeAddrs\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"operationRewards\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"stakingRewards\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256\",\"name\":\"publicPoolRewards\",\"type\":\"uint256\"}],\"name\":\"distributeRewards\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getChipsInfo\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"nodeAddr\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nodeAddr\",\"type\":\"address\"}],\"name\":\"getNode\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"nodeId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"taxRateBasisPoints\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"publicGood\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"alpha\",\"type\":\"bool\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"operationPoolTokens\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"stakingPoolTokens\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"totalShares\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"slashedTokens\",\"type\":\"uint256\"}],\"internalType\":\"structDataTypes.Component\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nodeAddr\",\"type\":\"address\"}],\"name\":\"getNodeAvatar\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNodeCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"nodeAddrs\",\"type\":\"address[]\"}],\"name\":\"getNodes\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"nodeId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"taxRateBasisPoints\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"publicGood\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"alpha\",\"type\":\"bool\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"operationPoolTokens\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"stakingPoolTokens\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"totalShares\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"slashedTokens\",\"type\":\"uint256\"}],\"internalType\":\"structDataTypes.Component[]\",\"name\":\"nodes\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"offset\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"limit\",\"type\":\"uint256\"}],\"name\":\"getNodesWithPagination\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"nodeId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"taxRateBasisPoints\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"publicGood\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"alpha\",\"type\":\"bool\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"operationPoolTokens\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"stakingPoolTokens\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"totalShares\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"slashedTokens\",\"type\":\"uint256\"}],\"internalType\":\"structDataTypes.Component[]\",\"name\":\"nodes\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"}],\"name\":\"getPendingUnstake\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nodeAddr\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeAmount\",\"type\":\"uint256\"}],\"internalType\":\"structDataTypes.UnstakeRequest\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"}],\"name\":\"getPendingWithdrawal\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint40\",\"name\":\"timestamp\",\"type\":\"uint40\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structDataTypes.WithdrawalRequest\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getPoolInfo\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"totalOperationPoolTokens\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"totalStakingPoolTokens\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getPublicPool\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"nodeId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"taxRateBasisPoints\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"publicGood\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"alpha\",\"type\":\"bool\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"operationPoolTokens\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"stakingPoolTokens\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"totalShares\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"slashedTokens\",\"type\":\"uint256\"}],\"internalType\":\"structDataTypes.Component\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"getRoleMember\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleMemberCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"chips\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"pauseAccount\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"oracleAccount\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isAlphaPhase\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isSettlementPhase\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nodeAddr\",\"type\":\"address\"}],\"name\":\"minTokensToStake\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"callerConfirmation\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nodeAddr\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"chipsIds\",\"type\":\"uint256[]\"}],\"name\":\"requestUnstake\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"requestWithdrawal\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"name\":\"setSettlementPhase\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"taxRateBasisPoints\",\"type\":\"uint64\"}],\"name\":\"setTaxRateBasisPoints4Node\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"taxRateBasisPoints\",\"type\":\"uint64\"}],\"name\":\"setTaxRateBasisPoints4PublicPool\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"nodeAddrs\",\"type\":\"address[]\"}],\"name\":\"slashNodes\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nodeAddr\",\"type\":\"address\"}],\"name\":\"stake\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"startTokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"endTokenId\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nodeAddr\",\"type\":\"address\"}],\"name\":\"stakeToPublicPool\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"startTokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"endTokenId\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"updateToPublicGood\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdraw2Treasury\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"treasury\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"stakeRatio\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"stakeUnbondingPeriod\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"depositUnbondingPeriod\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"nodeSlashRateBasisPoints\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"userSlashRateBasisPoints\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minDeposit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minTaxRateBasisPoints\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AccessControlBadConfirmation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"neededRole\",\"type\":\"bytes32\"}],\"name\":\"AccessControlUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AlphaWithdrawNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AlreadyClaimed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"AmountTooSmall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BatchSizeZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CallerNotStaking\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CheckpointUnorderedInsertion\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ChipNotAuthorized\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ChipNotPublicGood\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"nodeAddr\",\"type\":\"address\"}],\"name\":\"ChipNotValid\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ChipsIdOverflow\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ChipsNotSameOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"claimId\",\"type\":\"uint256\"}],\"name\":\"ClaimIdNotExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ClaimTimeNotReady\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CreateNodeToZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyChipsIds\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyNodeList\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EnforcedPause\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExcessWithdrawalAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExpectedPause\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidArrayLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"InvalidEpoch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"current\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"got\",\"type\":\"uint256\"}],\"name\":\"InvalidEpochNumber\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"traitId\",\"type\":\"uint256\"}],\"name\":\"InvalidTraitId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nodeAddr\",\"type\":\"address\"}],\"name\":\"NodeAlreadyPublicGood\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NodeExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NodeNotExists\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nodeAddr\",\"type\":\"address\"}],\"name\":\"NodeNotPublicGood\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NodeStakedOrDeposited\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OperationRewardsExceed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PublicGoodNodeNotDeposited\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PublicGoodNodeNotInAlphaPhase\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrancyGuardReentrantCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nodeAddr\",\"type\":\"address\"}],\"name\":\"RewardsAlreadyDistributed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"bits\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"SafeCastOverflowedUintDowncast\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SettlementPhase\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nodeAddr\",\"type\":\"address\"}],\"name\":\"StakeToPublicGoodNode\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"StakingRewardsExceed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SubmissionIntervalNotElapsed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TaxRateBasisPointsTooLarge\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TaxRateBasisPointsTooSmall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferFailed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nodeAddr\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Deposited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"nodeId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nodeAddr\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"taxRateBasisPoints\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"publicGood\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"alpha\",\"type\":\"bool\"}],\"name\":\"NodeCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nodeAddr\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"slashedOperationPool\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"slashedStakingPool\",\"type\":\"uint256\"}],\"name\":\"NodeSlashed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nodeAddr\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"taxRateBasisPoints\",\"type\":\"uint64\"}],\"name\":\"NodeTaxRateBasisPointsSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nodeAddr\",\"type\":\"address\"}],\"name\":\"NodeUpdated2PublicGood\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"epoch\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"startTimestamp\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"endTimestamp\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"publicPoolRewards\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"publicPoolTax\",\"type\":\"uint256\"}],\"name\":\"PublicGoodRewardDistributed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"taxRateBasisPoints\",\"type\":\"uint64\"}],\"name\":\"PublicPoolTaxRateBasisPointsSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"epoch\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"startTimestamp\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"endTimestamp\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"nodeAddrs\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"operationRewards\",\"type\":\"uint256[]\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"stakingRewards\",\"type\":\"uint256[]\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"taxAmounts\",\"type\":\"uint256[]\"}],\"name\":\"RewardDistributed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nodeAddr\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"startTokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"endTokenId\",\"type\":\"uint256\"}],\"name\":\"Staked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nodeAddr\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"unstakeAmount\",\"type\":\"uint256\"}],\"name\":\"UnstakeClaimed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nodeAddr\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"unstakeAmount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"chipsIds\",\"type\":\"uint256[]\"}],\"name\":\"UnstakeRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nodeAddr\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"}],\"name\":\"WithdrawRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"}],\"name\":\"WithdrawalClaimed\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DEPOSIT_UNBONDING_PERIOD\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MIN_DEPOSIT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MIN_TAX_RATE_BASIS_POINTS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"NODE_SLASH_RATE_BASIS_POINTS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ORACLE_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PAUSE_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SHARES_PER_CHIP\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"STAKE_RATIO\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"STAKE_UNBONDING_PERIOD\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TREASURY\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"USER_SLASH_RATE_BASIS_POINTS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"chipsContract\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"requestIds\",\"type\":\"uint256[]\"}],\"name\":\"claimUnstake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"requestIds\",\"type\":\"uint256[]\"}],\"name\":\"claimWithdrawal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"taxRateBasisPoints\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"publicGood\",\"type\":\"bool\"}],\"name\":\"createNode\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"disableAlphaPhase\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[3]\",\"name\":\"epochInfo\",\"type\":\"uint256[3]\"},{\"internalType\":\"address[]\",\"name\":\"nodeAddrs\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"operationRewards\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"stakingRewards\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256\",\"name\":\"publicPoolRewards\",\"type\":\"uint256\"}],\"name\":\"distributeRewards\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getChipsInfo\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"nodeAddr\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nodeAddr\",\"type\":\"address\"}],\"name\":\"getNode\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"nodeId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"taxRateBasisPoints\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"publicGood\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"alpha\",\"type\":\"bool\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"operationPoolTokens\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"stakingPoolTokens\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"totalShares\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"slashedTokens\",\"type\":\"uint256\"}],\"internalType\":\"structDataTypes.Node\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nodeAddr\",\"type\":\"address\"}],\"name\":\"getNodeAvatar\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNodeCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"nodeAddrs\",\"type\":\"address[]\"}],\"name\":\"getNodes\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"nodeId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"taxRateBasisPoints\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"publicGood\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"alpha\",\"type\":\"bool\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"operationPoolTokens\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"stakingPoolTokens\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"totalShares\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"slashedTokens\",\"type\":\"uint256\"}],\"internalType\":\"structDataTypes.Node[]\",\"name\":\"nodes\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"offset\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"limit\",\"type\":\"uint256\"}],\"name\":\"getNodesWithPagination\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"nodeId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"taxRateBasisPoints\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"publicGood\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"alpha\",\"type\":\"bool\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"operationPoolTokens\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"stakingPoolTokens\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"totalShares\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"slashedTokens\",\"type\":\"uint256\"}],\"internalType\":\"structDataTypes.Node[]\",\"name\":\"nodes\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"}],\"name\":\"getPendingUnstake\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nodeAddr\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeAmount\",\"type\":\"uint256\"}],\"internalType\":\"structDataTypes.UnstakeRequest\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"}],\"name\":\"getPendingWithdrawal\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint40\",\"name\":\"timestamp\",\"type\":\"uint40\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structDataTypes.WithdrawalRequest\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getPoolInfo\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"totalOperationPoolTokens\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"totalStakingPoolTokens\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getPublicPool\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"nodeId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"taxRateBasisPoints\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"publicGood\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"alpha\",\"type\":\"bool\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"operationPoolTokens\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"stakingPoolTokens\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"totalShares\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"slashedTokens\",\"type\":\"uint256\"}],\"internalType\":\"structDataTypes.Node\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"getRoleMember\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleMemberCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"chips\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"pauseAccount\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"oracleAccount\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isAlphaPhase\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isSettlementPhase\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nodeAddr\",\"type\":\"address\"}],\"name\":\"minTokensToStake\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"callerConfirmation\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nodeAddr\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"chipsIds\",\"type\":\"uint256[]\"}],\"name\":\"requestUnstake\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"requestWithdrawal\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"name\":\"setSettlementPhase\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"taxRateBasisPoints\",\"type\":\"uint64\"}],\"name\":\"setTaxRateBasisPoints4Node\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"taxRateBasisPoints\",\"type\":\"uint64\"}],\"name\":\"setTaxRateBasisPoints4PublicPool\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"nodeAddrs\",\"type\":\"address[]\"}],\"name\":\"slashNodes\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nodeAddr\",\"type\":\"address\"}],\"name\":\"stake\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"startTokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"endTokenId\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nodeAddr\",\"type\":\"address\"}],\"name\":\"stakeToPublicPool\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"startTokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"endTokenId\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"updateToPublicGood\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdraw2Treasury\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", } // StakingVSLABI is the input ABI used to generate the binding from. From 7b9d328462732fbc85c228d466f125dda78cf1d7 Mon Sep 17 00:00:00 2001 From: polebug Date: Tue, 17 Dec 2024 17:08:33 +0800 Subject: [PATCH 31/31] chore: update bluesky client logic --- go.mod | 2 - go.sum | 30 -------------- provider/atproto/bluesky/client.go | 63 ++++++++++++++++++++---------- 3 files changed, 43 insertions(+), 52 deletions(-) diff --git a/go.mod b/go.mod index 1a02b8351..d42c04544 100644 --- a/go.mod +++ b/go.mod @@ -109,7 +109,6 @@ require ( github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/deckarep/golang-set/v2 v2.3.1 // indirect github.com/distribution/reference v0.6.0 // indirect - github.com/dmarkham/enumer v1.5.10 // indirect github.com/docker/cli v26.1.1+incompatible // indirect github.com/docker/docker v26.1.3+incompatible // indirect github.com/docker/go-connections v0.5.0 // indirect @@ -117,7 +116,6 @@ require ( github.com/dprotaso/go-yit v0.0.0-20220510233725-9ba8df137936 // indirect github.com/ethereum/c-kzg-4844 v0.4.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fjl/gencodec v0.0.0-20230517082657-f9840df7b83e // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/getsentry/sentry-go v0.27.0 // indirect github.com/go-logr/logr v1.4.2 // indirect diff --git a/go.sum b/go.sum index ea4a8e4a8..6a25a6a86 100644 --- a/go.sum +++ b/go.sum @@ -23,21 +23,13 @@ github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bw github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= github.com/adrianbrad/psqldocker v1.2.1 h1:bvsRmbotpA89ruqGGzzaAZUBtDaIk98gO+JMBNVSZlI= github.com/adrianbrad/psqldocker v1.2.1/go.mod h1:LbCnIy60YO6IRJYrF1r+eafKUgU9UnkSFx0gT8UiaUs= -github.com/agnivade/levenshtein v1.1.1 h1:QY8M92nrzkmr798gCo3kmMyqXFzdQVpxLlGPRBij0P8= -github.com/agnivade/levenshtein v1.1.1/go.mod h1:veldBMzWxcCG2ZvUTKD2kJNRdCk5hVbJomOvKkmgYbo= github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5 h1:iW0a5ljuFxkLGPNem5Ui+KBjFJzKg4Fv2fnxe4dvzpM= github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5/go.mod h1:Y2QMoi1vgtOIfc+6DhrMOGkLoGzqSV2rKp4Sm+opsyA= -github.com/alexflint/go-arg v1.4.2 h1:lDWZAXxpAnZUq4qwb86p/3rIJJ2Li81EoMbTMujhVa0= -github.com/alexflint/go-arg v1.4.2/go.mod h1:9iRbDxne7LcR/GSvEr7ma++GLpdIU1zrghf2y2768kM= -github.com/alexflint/go-scalar v1.0.0 h1:NGupf1XV/Xb04wXskDFzS0KWOLH632W/EO4fAFi+A70= -github.com/alexflint/go-scalar v1.0.0/go.mod h1:GpHzbCOZXEKMEcygYQ5n/aa4Aq84zbxjy3MxYW0gjYw= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= github.com/andybalholm/cascadia v1.2.0/go.mod h1:YCyR8vOZT9aZ1CHEd8ap0gMVm2aFgxBp0T0eFw1RUQY= github.com/andybalholm/cascadia v1.3.2 h1:3Xi6Dw5lHF15JtdcmAHD3i1+T8plmv7BQ/nsViSLyss= github.com/andybalholm/cascadia v1.3.2/go.mod h1:7gtRlve5FxPPgIgX36uWBX58OdBsSS6lUvCFb+h7KvU= -github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ= -github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk= github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de h1:FxWPpzIjnTlhPwqqXc4/vE0f7GvRjuAsbW+HOIe8KnA= github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de/go.mod h1:DCaWoUhZrYW9p1lxo/cm8EmUOOzAPSEZNGF2DK1dJgw= github.com/avast/retry-go/v4 v4.6.0 h1:K9xNA+KeB8HHc2aWFuLb25Offp+0iVRXEvFx8IinRJA= @@ -114,8 +106,6 @@ github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/r github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= -github.com/dmarkham/enumer v1.5.10 h1:ygL0L6quiTiH1jpp68DyvsWaea6MaZLZrTTkIS++R0M= -github.com/dmarkham/enumer v1.5.10/go.mod h1:e4VILe2b1nYK3JKJpRmNdl5xbDQvELc6tQ8b+GsGk6E= github.com/docker/cli v26.1.1+incompatible h1:bE1/uE2tCa08fMv+7ikLR/RDPoCqytwrLtkIkSzxLvw= github.com/docker/cli v26.1.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/docker v26.1.3+incompatible h1:lLCzRbrVZrljpVNobJu1J2FHk8V0s4BawoZippkc+xo= @@ -139,10 +129,6 @@ github.com/fatih/color v1.14.1 h1:qfhVLaG5s+nCROl1zJsZRxFeYrHLqWroPOQ8BWiNb4w= github.com/fatih/color v1.14.1/go.mod h1:2oHN61fhTpgcxD3TSWCgKDiH1+x4OiDVVGH8WlgGZGg= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/ferranbt/fastssz v0.1.2 h1:Dky6dXlngF6Qjc+EfDipAkE83N5I5DE68bY6O0VLNPk= -github.com/ferranbt/fastssz v0.1.2/go.mod h1:X5UPrE2u1UJjxHA8X54u04SBwdAQjG2sFtWs39YxyWs= -github.com/fjl/gencodec v0.0.0-20230517082657-f9840df7b83e h1:bBLctRc7kr01YGvaDfgLbTwjFNW5jdp5y5rj8XXBHfY= -github.com/fjl/gencodec v0.0.0-20230517082657-f9840df7b83e/go.mod h1:AzA8Lj6YtixmJWL+wkKoBGsLWy9gFrAzi4g+5bCKwpY= github.com/fjl/memsize v0.0.2 h1:27txuSD9or+NZlnOWdKUxeBzTAUkWCVh+4Gf2dWFOzA= github.com/fjl/memsize v0.0.2/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= @@ -154,8 +140,6 @@ github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nos github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/gabriel-vasile/mimetype v1.4.7 h1:SKFKl7kD0RiPdbht0s7hFtjl489WcQ1VyPW8ZzUMYCA= github.com/gabriel-vasile/mimetype v1.4.7/go.mod h1:GDlAgAyIRT27BhFl53XNAFtfjzOkLaF35JdEG0P7LtU= -github.com/garslo/gogen v0.0.0-20170306192744-1d203ffc1f61 h1:IZqZOB2fydHte3kUgxrzK5E1fW7RQGeDwE8F/ZZnUYc= -github.com/garslo/gogen v0.0.0-20170306192744-1d203ffc1f61/go.mod h1:Q0X6pkwTILDlzrGEckF6HKjXe48EgsY/l7K7vhY4MW8= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 h1:BAIP2GihuqhwdILrV+7GJel5lyPV3u1+PgzrWLc0TkE= @@ -265,8 +249,6 @@ github.com/grafana/pyroscope-go v1.2.0 h1:aILLKjTj8CS8f/24OPMGPewQSYlhmdQMBmol1d github.com/grafana/pyroscope-go v1.2.0/go.mod h1:2GHr28Nr05bg2pElS+dDsc98f3JTUh2f6Fz1hWXrqwk= github.com/grafana/pyroscope-go/godeltaprof v0.1.8 h1:iwOtYXeeVSAeYefJNaxDytgjKtUuKQbJqgAIjlnicKg= github.com/grafana/pyroscope-go/godeltaprof v0.1.8/go.mod h1:2+l7K7twW49Ct4wFluZD3tZ6e0SjanjcUUBPVD/UuGU= -github.com/graph-gophers/graphql-go v1.3.0 h1:Eb9x/q6MFpCLz7jBCiP/WTxjSDrYLR1QY41SORZyNJ0= -github.com/graph-gophers/graphql-go v1.3.0/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 h1:ad0vkEBuk23VJzZR9nkLVG0YAoN9coASF1GusYX6AlU= github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0/go.mod h1:igFoXX2ELCW06bol23DWPB5BEWfZISOzSP5K2sbLea0= github.com/hamba/avro v1.8.0 h1:eCVrLX7UYThA3R3yBZ+rpmafA5qTc3ZjpTz6gYJoVGU= @@ -305,12 +287,6 @@ github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFck github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/influxdata/influxdb-client-go/v2 v2.13.0 h1:ioBbLmR5NMbAjP4UVA5r9b5xGjpABD7j65pI8kFphDM= -github.com/influxdata/influxdb-client-go/v2 v2.13.0/go.mod h1:k+spCbt9hcvqvUiz0sr5D8LolXHqAAOfPw9v/RIRHl4= -github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c h1:qSHzRbhzK8RdXOsAdfDgO49TtqC1oZ+acxPrkfTxcCs= -github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= -github.com/influxdata/line-protocol v0.0.0-20210922203350-b1ad95c89adf h1:7JTmneyiNEwVBOHSjoMxiWAqB992atOeepeFYegn5RU= -github.com/influxdata/line-protocol v0.0.0-20210922203350-b1ad95c89adf/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= github.com/invopop/yaml v0.3.1 h1:f0+ZpmhfBSS4MhG+4HYseMdJhoeeopbSKbq5Rpeelso= github.com/invopop/yaml v0.3.1/go.mod h1:PMOp3nn4/12yEZUFfmOuNHJsZToEEOwoWsT+D81KkeA= github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs= @@ -533,8 +509,6 @@ github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY= github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc= github.com/oapi-codegen/oapi-codegen/v2 v2.4.1 h1:ykgG34472DWey7TSjd8vIfNykXgjOgYJZoQbKfEeY/Q= github.com/oapi-codegen/oapi-codegen/v2 v2.4.1/go.mod h1:N5+lY1tiTDV3V1BeHtOxeWXHoPVeApvsvjJqegfoaz8= -github.com/oapi-codegen/runtime v1.0.0 h1:P4rqFX5fMFWqRzY9M/3YF9+aPSPPB06IzP2P7oOxrWo= -github.com/oapi-codegen/runtime v1.0.0/go.mod h1:LmCUMQuPB4M/nLXilQXhHw+BLZdDb18B34OO356yJ/A= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -566,16 +540,12 @@ github.com/orlangure/gnomock v0.31.0 h1:dgjlQ8DYUPMyNwMZJuYBH+/GF+e7h3sloldPzIJF github.com/orlangure/gnomock v0.31.0/go.mod h1:RagxeYv3bKi+li9Lio2Faw5t6Mcy4akkeqXzkgAS3w0= github.com/ory/dockertest/v3 v3.10.0 h1:4K3z2VMe8Woe++invjaTB7VRyQXQy5UY+loujO4aNE4= github.com/ory/dockertest/v3 v3.10.0/go.mod h1:nr57ZbRWMqfsdGdFNLHz5jjNdDb7VVFnzAeW1n5N1Lg= -github.com/pascaldekloe/name v1.0.0 h1:n7LKFgHixETzxpRv2R77YgPUFo85QHGZKrdaYm7eY5U= -github.com/pascaldekloe/name v1.0.0/go.mod h1:Z//MfYJnH4jVpQ9wkclwu2I2MkHmXTlT9wR5UZScttM= github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= github.com/perimeterx/marshmallow v1.1.5 h1:a2LALqQ1BlHM8PZblsDdidgv1mWi1DgC2UmX50IvK2s= github.com/perimeterx/marshmallow v1.1.5/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0Vchtcl8we9tYaXw= github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 h1:1/WtZae0yGtPq+TI6+Tv1WTxkukpXeMlviSxvL7SRgk= github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9/go.mod h1:x3N5drFsm2uilKKuuYo6LdyD8vZAW55sH/9w+pbo1sw= -github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7 h1:oYW+YCJ1pachXTQmzR3rNLYGGz4g/UgFcjb28p/viDM= -github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= diff --git a/provider/atproto/bluesky/client.go b/provider/atproto/bluesky/client.go index eeda7e312..0318030b4 100644 --- a/provider/atproto/bluesky/client.go +++ b/provider/atproto/bluesky/client.go @@ -137,14 +137,9 @@ func (c *Client) SyncGetRepo(ctx context.Context, repoData *atproto.SyncListRepo return nil, fmt.Errorf("create xrpc client: %w", err) } - var handle string - // Get user handle from profile - if err := c.retrySource(ctx, func(ctx context.Context) error { - handle, err = c.GetHandle(ctx, client, did) - - return err - }); err != nil { + handle, err := c.GetHandle(ctx, client, did) + if err != nil { zap.L().Error("get profile failed", zap.Error(err)) return nil, fmt.Errorf("get profile: %w", err) @@ -356,22 +351,50 @@ func (c *Client) GetRecord(ctx context.Context, repo string, path string) (*at.M // - did: User's decentralized identifier // Returns the user's handle or an error. func (c *Client) GetHandle(ctx context.Context, client *XrpcClient, did syntax.DID) (string, error) { - resp, _ := bsky.ActorGetProfile(ctx, client.Client, did.String()) - if resp != nil { - return resp.Handle, nil - } + var handle string - defaultClient, err := c.GetXrpcClient(ctx, BskyEndpoint) - if err != nil { - return "", fmt.Errorf("get xrpc client: %w", err) - } + if err := c.retrySource(ctx, func(ctx context.Context) error { + resp, err := bsky.ActorGetProfile(ctx, client.Client, did.String()) + if resp != nil { + handle = resp.Handle + + return nil + } + + if err != nil { + zap.L().Debug("get profile failed", zap.String("client", client.Host), zap.Error(err)) + + defaultClient, err := c.GetXrpcClient(ctx, BskyEndpoint) + if err != nil { + return fmt.Errorf("get xrpc client: %w", err) + } + + resp, err = bsky.ActorGetProfile(ctx, defaultClient.Client, did.String()) + if resp != nil { + handle = resp.Handle + + return nil + } + + if err != nil { + if strings.Contains(err.Error(), "XRPC ERROR 400") { + return nil + } + + zap.L().Error("get profile failed", zap.String("client", defaultClient.Host), zap.Error(err)) + + return fmt.Errorf("get profile: %w", err) + } + } + + return nil + }); err != nil { + zap.L().Error("get profile failed", zap.Error(err)) - resp, _ = bsky.ActorGetProfile(ctx, defaultClient.Client, did.String()) - if resp != nil { - return resp.Handle, nil + return "", fmt.Errorf("get profile: %w", err) } - return "", fmt.Errorf("handle not found for DID: %s", did) + return handle, nil } // ParseRecord processes different types of records and updates the message. @@ -639,7 +662,7 @@ func (c *Client) retrySource(ctx context.Context, f func(ctx context.Context) er retry.Delay(5*time.Second), retry.DelayType(retry.BackOffDelay), retry.OnRetry(func(n uint, err error) { - zap.L().Warn("retry bluesky source", zap.Uint("retry", n), zap.Error(err)) + zap.L().Warn("retry bluesky client", zap.Uint("retry", n), zap.Error(err)) }), ) }