diff --git a/blockchain/blockchain.go b/blockchain/blockchain.go index f9a8a0f..f2e39cf 100644 --- a/blockchain/blockchain.go +++ b/blockchain/blockchain.go @@ -20,6 +20,8 @@ import ( "github.com/functionland/go-fula/common" "github.com/functionland/go-fula/ping" wifi "github.com/functionland/go-fula/wap/pkg/wifi" + ipfsClusterClientApi "github.com/ipfs-cluster/ipfs-cluster/api" + "github.com/ipfs/go-cid" logging "github.com/ipfs/go-log/v2" gostream "github.com/libp2p/go-libp2p-gostream" "github.com/libp2p/go-libp2p/core/host" @@ -408,6 +410,9 @@ func (bl *FxBlockchain) serve(w http.ResponseWriter, r *http.Request) { actionManifestRemoveStored: func(from peer.ID, w http.ResponseWriter, r *http.Request) { bl.handleAction(http.MethodPost, actionManifestRemoveStored, from, w, r) }, + actionReplicateInPool: func(from peer.ID, w http.ResponseWriter, r *http.Request) { + bl.handleReplicateInPool(http.MethodPost, actionReplicateInPool, from, w, r) + }, actionAuth: func(from peer.ID, w http.ResponseWriter, r *http.Request) { bl.handleAuthorization(from, w, r) }, @@ -518,6 +523,99 @@ func (bl *FxBlockchain) handleAction(method string, action string, from peer.ID, } } +func (bl *FxBlockchain) handleReplicateInPool(method string, action string, from peer.ID, w http.ResponseWriter, r *http.Request) { + log := log.With("action", action, "from", from) + var req ReplicateRequest + var res ReplicateResponse + var poolRes []string + + defer r.Body.Close() + + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + log.Debug("cannot parse request body: %v", err) + http.Error(w, "", http.StatusBadRequest) + return + } + + //TODO: Ensure it is optimized for long-running calls + ctx, cancel := context.WithTimeout(r.Context(), time.Second*time.Duration(bl.timeout)) + defer cancel() + response, statusCode, err := bl.callBlockchain(ctx, method, actionManifestAvailableBatch, req) + if err != nil { + log.Error("failed to call blockchain: %v", err) + w.WriteHeader(statusCode) + // Try to parse the error and format it as JSON + var errMsg map[string]interface{} + if jsonErr := json.Unmarshal(response, &errMsg); jsonErr != nil { + // If the response isn't JSON or can't be parsed, use a generic message + errMsg = map[string]interface{}{ + "message": "An error occurred", + "description": err.Error(), + } + } + json.NewEncoder(w).Encode(errMsg) + return + } + // If status code is not 200, attempt to format the response as JSON + if statusCode != http.StatusOK { + w.WriteHeader(statusCode) + var errMsg map[string]interface{} + if jsonErr := json.Unmarshal(response, &errMsg); jsonErr == nil { + // If it's already a JSON, write it as is + w.Write(response) + } else { + // If it's not JSON, wrap the response in the expected format + errMsg = map[string]interface{}{ + "message": "Error", + "description": string(response), + } + json.NewEncoder(w).Encode(errMsg) + } + return + } + + if jsonErr := json.Unmarshal(response, &res); jsonErr != nil { + // If the response isn't JSON or can't be parsed, use a generic message + w.WriteHeader(http.StatusFailedDependency) + errMsg := map[string]interface{}{ + "message": "An error occurred", + "description": jsonErr.Error(), + } + json.NewEncoder(w).Encode(errMsg) + return + } + + if bl.ipfsClusterApi == nil { + w.WriteHeader(http.StatusFailedDependency) + errMsg := map[string]interface{}{ + "message": "An error occurred", + "description": "iipfs cluster API is nil", + } + json.NewEncoder(w).Encode(errMsg) + return + } + pCtx, pCancel := context.WithTimeout(r.Context(), time.Second*time.Duration(bl.timeout)) + defer pCancel() + for i := 0; i < len(res.Manifests); i++ { + c, err := cid.Decode(res.Manifests[i].Cid) + if err != nil { + log.Errorw("Error decoding CID:", "err", err) + continue // Or handle the error appropriately + } + replicationRes, err := bl.ipfsClusterApi.Pin(pCtx, ipfsClusterClientApi.NewCid(c), ipfsClusterClientApi.PinOptions{}) + if err != nil { + log.Errorw("Error pinning CID:", "err", err) + continue + } + poolRes = append(poolRes, replicationRes.Cid.Cid.String()) + } + + w.WriteHeader(http.StatusAccepted) + if err := json.NewEncoder(w).Encode(poolRes); err != nil { + log.Error("failed to write response: %v", err) + } +} + func (bl *FxBlockchain) handleAuthorization(from peer.ID, w http.ResponseWriter, r *http.Request) { log := log.With("action", actionAuth, "from", from) defer r.Body.Close() @@ -1244,13 +1342,13 @@ func (bl *FxBlockchain) getClusterEndpoint(ctx context.Context, poolID int) (str creatorClusterPeerID := poolDetails.Creator // 4. Fetch user details - userDetails, err := bl.fetchUserDetails(ctx, poolID, creatorClusterPeerID) + userDetails, err := bl.fetchUserDetails(ctx, poolID) if err != nil { return "", err } // 5. Find the peer_id - peerID := findPeerID(creatorClusterPeerID, userDetails) + peerID := bl.findPeerID(creatorClusterPeerID, userDetails) // 6. Save creator peer ID err = saveCreatorPeerID(poolID, peerID) @@ -1310,10 +1408,9 @@ func fetchPoolDetails(ctx context.Context, bl *FxBlockchain, poolID int) (*Pool, return nil, fmt.Errorf("pool with ID %d not found", poolID) } -func (bl *FxBlockchain) fetchUserDetails(ctx context.Context, poolID int, creatorClusterPeerID string) (*PoolUserListResponse, error) { +func (bl *FxBlockchain) fetchUserDetails(ctx context.Context, poolID int) (*PoolUserListResponse, error) { req := PoolUserListRequest{ - PoolID: poolID, - RequestPoolID: poolID, + PoolID: poolID, } action := "actionPoolUserList" @@ -1340,7 +1437,7 @@ func (bl *FxBlockchain) fetchUserDetails(ctx context.Context, poolID int, creato return &response, nil } -func findPeerID(creatorClusterPeerID string, userDetails *PoolUserListResponse) string { +func (bl *FxBlockchain) findPeerID(creatorClusterPeerID string, userDetails *PoolUserListResponse) string { for _, user := range userDetails.Users { if user.Account == creatorClusterPeerID { return user.PeerID diff --git a/blockchain/interface.go b/blockchain/interface.go index 20952f3..1eea042 100644 --- a/blockchain/interface.go +++ b/blockchain/interface.go @@ -10,30 +10,31 @@ import ( ) const ( - actionSeeded = "account-seeded" - actionAccountExists = "account-exists" - actionAccountCreate = "account-create" - actionAccountFund = "account-fund" - actionAccountBalance = "account-balance" - actionAssetsBalance = "asset-balance" - actionTransferToMumbai = "fula-mumbai-convert_tokens" - actionTransferToGoerli = "fula-goerli-convert_tokens" - actionPoolCreate = "fula-pool-create" - actionPoolJoin = "fula-pool-join" - actionPoolCancelJoin = "fula-pool-cancel_join" - actionPoolRequests = "fula-pool-poolrequests" - actionPoolList = "fula-pool" - actionPoolUserList = "fula-pool-users" - actionPoolVote = "fula-pool-vote" - actionPoolLeave = "fula-pool-leave" - actionManifestUpload = "fula-manifest-upload" - actionManifestStore = "fula-manifest-storage" - actionManifestBatchStore = "fula-manifest-batch_storage" - actionManifestBatchUpload = "fula-manifest-batch_upload" - actionManifestAvailable = "fula-manifest-available" - actionManifestRemove = "fula-manifest-remove" - actionManifestRemoveStorer = "fula-manifest-remove_storer" - actionManifestRemoveStored = "fula-manifest-remove_storing_manifest" + actionSeeded = "account-seeded" + actionAccountExists = "account-exists" + actionAccountCreate = "account-create" + actionAccountFund = "account-fund" + actionAccountBalance = "account-balance" + actionAssetsBalance = "asset-balance" + actionTransferToMumbai = "fula-mumbai-convert_tokens" + actionTransferToGoerli = "fula-goerli-convert_tokens" + actionPoolCreate = "fula-pool-create" + actionPoolJoin = "fula-pool-join" + actionPoolCancelJoin = "fula-pool-cancel_join" + actionPoolRequests = "fula-pool-poolrequests" + actionPoolList = "fula-pool" + actionPoolUserList = "fula-pool-users" + actionPoolVote = "fula-pool-vote" + actionPoolLeave = "fula-pool-leave" + actionManifestUpload = "fula-manifest-upload" + actionManifestStore = "fula-manifest-storage" + actionManifestBatchStore = "fula-manifest-batch_storage" + actionManifestBatchUpload = "fula-manifest-batch_upload" + actionManifestAvailable = "fula-manifest-available" + actionManifestRemove = "fula-manifest-remove" + actionManifestRemoveStorer = "fula-manifest-remove_storer" + actionManifestRemoveStored = "fula-manifest-remove_storing_manifest" + actionManifestAvailableBatch = "fula-manifest-available_batch" //Hardware actionBloxFreeSpace = "blox-free-space" @@ -48,8 +49,26 @@ const ( actionFetchContainerLogs = "fetch-container-logs" actionGetFolderSize = "get-folder-size" actionGetDatastoreSize = "get-datastore-size" + + // Cluster + actionReplicateInPool = "replicate" ) +type ReplicateRequest struct { + Cids []string `json:"cids"` + Account string `json:"uploader"` + PoolID int `json:"pool_id"` +} + +type ReplicateResponse struct { + Manifests []BatchManifest `json:"manifests"` +} + +type BatchManifest struct { + Cid string `json:"cid"` + ReplicationAvailable int `json:"replication_available"` +} + type LinkWithLimit struct { Link ipld.Link Limit int diff --git a/blockchain/options.go b/blockchain/options.go index 2917001..af8a647 100644 --- a/blockchain/options.go +++ b/blockchain/options.go @@ -4,6 +4,7 @@ import ( "sync" "time" + ipfsCluster "github.com/ipfs-cluster/ipfs-cluster/api/rest/client" "github.com/ipfs/kubo/client/rpc" "github.com/libp2p/go-libp2p/core/peer" ) @@ -25,6 +26,7 @@ type ( updatePoolName func(string) error fetchFrequency time.Duration //Hours that it should update the list of pool users and pool requests if not called through pubsub rpc *rpc.HttpApi + ipfsClusterApi ipfsCluster.Client } ) @@ -47,6 +49,7 @@ func newOptions(o ...Option) (*options, error) { updatePoolName: defaultUpdatePoolName, // set a default function or leave nil fetchFrequency: time.Hour * 1, // default frequency, e.g., 1 hour rpc: nil, + ipfsClusterApi: nil, } for _, apply := range o { if err := apply(&opts); err != nil { @@ -115,6 +118,13 @@ func WithMinSuccessPingCount(sr int) Option { } } +func WithIpfsClusterAPI(n ipfsCluster.Client) Option { + return func(o *options) error { + o.ipfsClusterApi = n + return nil + } +} + func WithMaxPingTime(t int) Option { return func(o *options) error { o.maxPingTime = t diff --git a/blox/blox.go b/blox/blox.go index 666933d..b928956 100644 --- a/blox/blox.go +++ b/blox/blox.go @@ -106,6 +106,7 @@ func New(o ...Option) (*Blox, error) { blockchain.WithMaxPingTime(p.maxPingTime), blockchain.WithIpfsClient(p.rpc), blockchain.WithMinSuccessPingCount(p.minSuccessRate*p.pingCount/100), + blockchain.WithIpfsClusterAPI(p.ipfsClusterApi), ) if err != nil { return nil, err diff --git a/blox/options.go b/blox/options.go index a3214ab..e709bce 100644 --- a/blox/options.go +++ b/blox/options.go @@ -10,6 +10,7 @@ import ( "time" "github.com/functionland/go-fula/exchange" + ipfsCluster "github.com/ipfs-cluster/ipfs-cluster/api/rest/client" "github.com/ipfs/go-datastore" dssync "github.com/ipfs/go-datastore/sync" "github.com/ipfs/kubo/client/rpc" @@ -41,10 +42,12 @@ type ( minSuccessRate int blockchainEndpoint string secretsPath string + poolHostMode bool IPFShttpServer *http.Server DefaultIPFShttpServer string wg *sync.WaitGroup rpc *rpc.HttpApi + ipfsClusterApi ipfsCluster.Client } ) @@ -173,6 +176,20 @@ func WithIpfsClient(n *rpc.HttpApi) Option { } } +func WithPoolHostMode(n bool) Option { + return func(o *options) error { + o.poolHostMode = n + return nil + } +} + +func WithIpfsClusterAPI(n ipfsCluster.Client) Option { + return func(o *options) error { + o.ipfsClusterApi = n + return nil + } +} + func WithLinkSystem(ls *ipld.LinkSystem) Option { return func(o *options) error { o.ls = ls diff --git a/cmd/blox/main.go b/cmd/blox/main.go index 129e2ff..f172efd 100644 --- a/cmd/blox/main.go +++ b/cmd/blox/main.go @@ -25,6 +25,7 @@ import ( "github.com/functionland/go-fula/blox" "github.com/functionland/go-fula/exchange" + ipfsCluster "github.com/ipfs-cluster/ipfs-cluster/api/rest/client" ipfsPath "github.com/ipfs/boxo/path" blockformat "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" @@ -91,6 +92,7 @@ var ( app struct { cli.App initOnly bool + poolHost bool blockchainEndpoint string secretsPath string generateNodeKey bool @@ -394,6 +396,12 @@ func init() { Destination: &app.initOnly, Value: false, }, + &cli.BoolFlag{ + Name: "poolHost", + Usage: "Weather to run the blox as a pool host (needs public IP)", + Destination: &app.poolHost, + Value: false, + }, &cli.BoolFlag{ Name: "generateNodeKey", Usage: "Generate node key from identity", @@ -737,8 +745,11 @@ func CustomStorageWriteOpenerNone(lctx linking.LinkContext) (io.Writer, ipld.Blo cidCodec := c.Type() mhType := c.Prefix().MhType + pin := !app.poolHost + pinValue := strconv.FormatBool(pin) + // Dynamically construct the URL with the cid-codec and mhtype - url := fmt.Sprintf("%s/api/v0/block/put?cid-codec=%s&mhtype=%s&mhlen=-1&pin=true&allow-big-block=false", baseURL, multicodec.Code(cidCodec), multicodec.Code(mhType)) + url := fmt.Sprintf("%s/api/v0/block/put?cid-codec=%s&mhtype=%s&mhlen=-1&pin=%s&allow-big-block=false", baseURL, multicodec.Code(cidCodec), multicodec.Code(mhType), pinValue) formData := &bytes.Buffer{} writer := multipart.NewWriter(formData) @@ -970,6 +981,9 @@ func action(ctx *cli.Context) error { if err != nil { return err } + if app.poolHost { + authorizer = "" + } // Decode the authorized peers from strings to peer.IDs authorizedPeers := make([]peer.ID, len(app.config.AuthorizedPeers)) for i, authorizedPeer := range app.config.AuthorizedPeers { @@ -1168,7 +1182,7 @@ func action(ctx *cli.Context) error { ipfsNode.Process.AddChild(goprocess.WithTeardown(cctx.Plugins.Close)) _, err := serveHTTPApi(&cctx) if err != nil { - fmt.Println("Error setting up HTTP API server:", err) + logger.Errorw("Error setting up HTTP API server:", "err", err) } } select {} @@ -1179,6 +1193,12 @@ func action(ctx *cli.Context) error { // linkSystem.StorageWriteOpener = CustomStorageWriteOpenerInternal } + ipfsClusterConfig := ipfsCluster.Config{} + ipfsClusterApi, err := ipfsCluster.NewDefaultClient(&ipfsClusterConfig) + if err != nil { + logger.Errorw("Error in setting ipfs cluster api", "err", err) + } + bb, err := blox.New( blox.WithHost(h), blox.WithWg(&wg), @@ -1194,6 +1214,8 @@ func action(ctx *cli.Context) error { blox.WithPingCount(5), blox.WithDefaultIPFShttpServer(useIPFSServer), blox.WithIpfsClient(node), + blox.WithPoolHostMode(app.poolHost), + blox.WithIpfsClusterAPI(ipfsClusterApi), blox.WithExchangeOpts( exchange.WithUpdateConfig(updateConfig), exchange.WithWg(&wg), @@ -1205,6 +1227,7 @@ func action(ctx *cli.Context) error { exchange.WithIpniPublishDisabled(app.config.IpniPublishDisabled), exchange.WithIpniPublishInterval(app.config.IpniPublishInterval), exchange.WithIpniGetEndPoint("https://cid.contact/cid/"), + exchange.WithPoolHostMode(app.poolHost), exchange.WithIpniProviderEngineOptions( engine.WithHost(ipnih), engine.WithDatastore(namespace.Wrap(ds, datastore.NewKey("ipni/ads"))), diff --git a/exchange/fx_exchange.go b/exchange/fx_exchange.go index 2974638..787fb99 100644 --- a/exchange/fx_exchange.go +++ b/exchange/fx_exchange.go @@ -699,9 +699,11 @@ func (e *FxExchange) SetAuth(ctx context.Context, on peer.ID, subject peer.ID, a func (e *FxExchange) authorized(pid peer.ID, action string, cid string) bool { log.Debugw("checking authorization", "pid", pid, "action", action, "cid", cid) - if e.authorizer == "" { + if e.authorizer == "" && action != actionAuth { // If no authorizer is set allow all. return true + } else if e.authorizer == "" && action == actionAuth { + return false } switch action { case actionPush: diff --git a/exchange/options.go b/exchange/options.go index 2366c1c..1bb699b 100644 --- a/exchange/options.go +++ b/exchange/options.go @@ -20,6 +20,7 @@ type ( authorizedPeers []peer.ID allowTransientConnection bool ipniPublishDisabled bool + poolHostMode bool ipniPublishTicker *time.Ticker ipniPublishChanBuffer int ipniPublishMaxBatchSize int @@ -109,6 +110,13 @@ func WithIpniGetEndPoint(l string) Option { } } +func WithPoolHostMode(n bool) Option { + return func(o *options) error { + o.poolHostMode = n + return nil + } +} + func WithIpniPublishChanBuffer(s int) Option { return func(o *options) error { o.ipniPublishChanBuffer = s diff --git a/go.mod b/go.mod index 31d21dc..bfcf1c5 100644 --- a/go.mod +++ b/go.mod @@ -5,6 +5,7 @@ go 1.21 require ( github.com/docker/docker v24.0.7+incompatible github.com/grandcat/zeroconf v1.0.0 + github.com/ipfs-cluster/ipfs-cluster v1.0.8 github.com/ipfs/boxo v0.17.0 github.com/ipfs/go-block-format v0.2.0 github.com/ipfs/go-cid v0.4.1 @@ -26,12 +27,12 @@ require ( github.com/libp2p/go-socket-activation v0.1.0 github.com/mdp/qrterminal v1.0.1 github.com/mr-tron/base58 v1.2.0 - github.com/multiformats/go-multiaddr v0.12.1 + github.com/multiformats/go-multiaddr v0.12.2 github.com/multiformats/go-multicodec v0.9.0 github.com/multiformats/go-multihash v0.2.3 github.com/multiformats/go-varint v0.0.7 github.com/tyler-smith/go-bip39 v1.1.0 - github.com/urfave/cli/v2 v2.26.0 + github.com/urfave/cli/v2 v2.27.1 go.uber.org/ratelimit v0.3.0 golang.org/x/crypto v0.19.0 golang.org/x/sync v0.6.0 @@ -109,7 +110,7 @@ require ( github.com/golang/snappy v0.0.4 // indirect github.com/google/gopacket v1.1.19 // indirect github.com/google/pprof v0.0.0-20231229205709-960ae82b1e42 // indirect - github.com/google/uuid v1.5.0 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/gorilla/mux v1.8.1 // indirect github.com/gorilla/websocket v1.5.1 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 // indirect @@ -133,7 +134,8 @@ require ( github.com/ipfs/go-ds-measure v0.2.0 // indirect github.com/ipfs/go-fs-lock v0.0.7 // indirect github.com/ipfs/go-graphsync v0.16.0 // indirect - github.com/ipfs/go-ipfs-blockstore v1.3.0 // indirect + github.com/ipfs/go-ipfs-api v0.7.0 // indirect + github.com/ipfs/go-ipfs-blockstore v1.3.1 // indirect github.com/ipfs/go-ipfs-cmds v0.10.0 // indirect github.com/ipfs/go-ipfs-delay v0.0.1 // indirect github.com/ipfs/go-ipfs-ds-help v1.1.1 // indirect @@ -150,7 +152,7 @@ require ( github.com/ipfs/go-peertaskqueue v0.8.1 // indirect github.com/ipfs/go-unixfsnode v1.9.0 // indirect github.com/ipfs/go-verifcid v0.0.2 // indirect - github.com/ipld/go-car v0.5.0 // 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-adl-hamt v0.0.0-20230814133645-9c9b7f7d771d // indirect @@ -177,7 +179,7 @@ require ( github.com/libp2p/go-yamux/v4 v4.0.1 // indirect github.com/libp2p/zeroconf/v2 v2.2.0 // indirect github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect - github.com/mattn/go-colorable v0.1.6 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.4 // indirect github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect @@ -228,12 +230,13 @@ require ( github.com/quic-go/quic-go v0.40.1 // indirect github.com/quic-go/webtransport-go v0.6.0 // indirect github.com/raulk/go-watchdog v1.3.0 // indirect - github.com/rs/cors v1.7.0 // indirect + github.com/rs/cors v1.10.1 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/samber/lo v1.39.0 // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect github.com/stretchr/testify v1.8.4 // indirect github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 // indirect + github.com/tv42/httpunix v0.0.0-20191220191345-2ba4b9c3382c // indirect github.com/twmb/murmur3 v1.1.8 // indirect github.com/ucarion/urlpath v0.0.0-20200424170820-7ccc79b76bbb // indirect github.com/whyrusleeping/base32 v0.0.0-20170828182744-c30ac30633cc // indirect @@ -274,7 +277,7 @@ require ( google.golang.org/appengine v1.6.8 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20240108191215-35c7eff3a6b1 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240108191215-35c7eff3a6b1 // indirect - google.golang.org/grpc v1.60.1 // indirect + google.golang.org/grpc v1.61.0 // indirect google.golang.org/protobuf v1.32.0 // indirect gopkg.in/square/go-jose.v2 v2.6.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/go.sum b/go.sum index 9abb689..e9b233d 100644 --- a/go.sum +++ b/go.sum @@ -34,6 +34,8 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +contrib.go.opencensus.io/exporter/jaeger v0.2.1 h1:yGBYzYMewVL0yO9qqJv3Z5+IRhPdU7e9o/2oKpX4YvI= +contrib.go.opencensus.io/exporter/jaeger v0.2.1/go.mod h1:Y8IsLgdxqh1QxYxPC5IgXVmBaeLUeQFfBeBi9PbeZd0= contrib.go.opencensus.io/exporter/prometheus v0.4.2 h1:sqfsYl5GIY/L570iT+l93ehxaWJs2/OwXtiWwew3oAg= contrib.go.opencensus.io/exporter/prometheus v0.4.2/go.mod h1:dvEHbiKmgvbr5pjaF9fpw1KeYcjrnC1J8B+JKjsZyRQ= dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU= @@ -104,6 +106,8 @@ github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927 h1:SKI1/fuSdodxmNNyVBR8d7X/HuLnRpvvFO0AgyQk764= +github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927/go.mod h1:h/aW8ynjgkuj+NQRlZcDbAbM1ORAbXjXX77sX7T289U= github.com/cheggaaa/pb v1.0.29 h1:FckUN5ngEk2LpvuG0fw1GEFx6LtyY2pWI/Z2QgCnEYo= github.com/cheggaaa/pb v1.0.29/go.mod h1:W40334L7FMC5JKWldsTWbdGjLo0RxUKK73K+TuPxX30= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= @@ -177,8 +181,9 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5 h1:BBso6MBKW8ncyZLv37o+KNyy0HrrHgfnOaGQC2qvN+A= github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5/go.mod h1:JpoxHjuQauoxiFMl1ie8Xc/7TfLuMZ5eOCONd1sUBHg= -github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/filecoin-project/go-address v1.1.0 h1:ofdtUtEsNxkIxkDw67ecSmvtzaVSdcea4boAmLbnHfE= @@ -261,6 +266,8 @@ github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXP github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= +github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v1.2.0 h1:uCdmnmatrKCgMBlM4rMuJZWOkPDqdbZPnrMXDY4gI68= github.com/golang/glog v1.2.0/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= @@ -335,8 +342,8 @@ github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm4 github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU= -github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +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/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= @@ -345,6 +352,8 @@ github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORR github.com/gopherjs/gopherjs v0.0.0-20190812055157-5d271430af9f/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v1.17.2 h1:fQnZVsXk8uxXIStYb0N4bGk7jeyTalG/wsZjQ25dO0g= github.com/gopherjs/gopherjs v1.17.2/go.mod h1:pRRIvn/QzFLrKfvEz3qUuEhtE/zLCWfreZ6J5gM2i+k= +github.com/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyEE= +github.com/gorilla/handlers v1.5.2/go.mod h1:dX+xVpaxdSw+q0Qek8SSsl3dfMk3jNddUkMzo0GtH0w= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= @@ -366,8 +375,9 @@ 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-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 h1:CG6TE5H9/JXsFWJCfoIVpKFIkFe6ysEuHirp4DxCsHI= github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= +github.com/hashicorp/go-hclog v1.3.0 h1:G0ACM8Z2WilWgPv3Vdzwm3V0BQu/kSmrkVtpe1fy9do= +github.com/hashicorp/go-hclog v1.3.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= @@ -384,6 +394,8 @@ github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/ipfs-cluster/ipfs-cluster v1.0.8 h1:Nh83rYMofyLOxHaRS9gEOWnaTyYRcGhCTWXLrQLqeEo= +github.com/ipfs-cluster/ipfs-cluster v1.0.8/go.mod h1:3Y8b45WoZmQXFRoN0MProvnbpZzVMNvHT2keXkvxP9Q= github.com/ipfs-shipyard/nopfs v0.0.12-0.20231027223058-cde3b5ba964c h1:17FO7HnKiFhO7iadu3zCgII+EblpdRmJt5qg9FqQo8Y= github.com/ipfs-shipyard/nopfs v0.0.12-0.20231027223058-cde3b5ba964c/go.mod h1:1oj4+g/mN6JRuZiXHt5iFRG02e62wp5AKcB3gdgknbk= github.com/ipfs-shipyard/nopfs/ipfs v0.13.2-0.20231027223058-cde3b5ba964c h1:7UynTbtdlt+w08ggb1UGLGaGjp1mMaZhoTZSctpn5Ak= @@ -435,8 +447,10 @@ github.com/ipfs/go-fs-lock v0.0.7 h1:6BR3dajORFrFTkb5EpCUFIAypsoxpGpDSVUdFwzgL9U github.com/ipfs/go-fs-lock v0.0.7/go.mod h1:Js8ka+FNYmgQRLrRXzU3CB/+Csr1BwrRilEcvYrHhhc= github.com/ipfs/go-graphsync v0.16.0 h1:0BX7whXlV13Y9FZ/jRg+xaGHaGYbtGxGppKD6tncw6k= github.com/ipfs/go-graphsync v0.16.0/go.mod h1:WfbMW3hhmX5GQEQ+KJxsFzVJVBKgC5szfrYK7Zc7xIM= -github.com/ipfs/go-ipfs-blockstore v1.3.0 h1:m2EXaWgwTzAfsmt5UdJ7Is6l4gJcaM/A12XwJyvYvMM= -github.com/ipfs/go-ipfs-blockstore v1.3.0/go.mod h1:KgtZyc9fq+P2xJUiCAzbRdhhqJHvsw8u2Dlqy2MyRTE= +github.com/ipfs/go-ipfs-api v0.7.0 h1:CMBNCUl0b45coC+lQCXEVpMhwoqjiaCwUIrM+coYW2Q= +github.com/ipfs/go-ipfs-api v0.7.0/go.mod h1:AIxsTNB0+ZhkqIfTZpdZ0VR/cpX5zrXjATa3prSay3g= +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= @@ -506,8 +520,8 @@ github.com/ipfs/go-verifcid v0.0.2 h1:XPnUv0XmdH+ZIhLGKg6U2vaPaRDXb9urMyNVCE7uvT github.com/ipfs/go-verifcid v0.0.2/go.mod h1:40cD9x1y4OWnFXbLNJYRe7MpNvWlMn3LZAG5Wb4xnPU= github.com/ipfs/kubo v0.26.0 h1:10BLJF84Nhxq+KEgrZyGwAVlV6DqTdxskK3sOIIxHlU= github.com/ipfs/kubo v0.26.0/go.mod h1:w5uuvq07ObeBotAPZnzf5k1coOd+5uiqHg2Ux/twKJc= -github.com/ipld/go-car v0.5.0 h1:kcCEa3CvYMs0iE5BzD5sV7O2EwMiCIp3uF8tA6APQT8= -github.com/ipld/go-car v0.5.0/go.mod h1:ppiN5GWpjOZU9PgpAZ9HbZd9ZgSpwPMr48fGRJOWmvE= +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= @@ -556,6 +570,8 @@ github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfV github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/kami-zh/go-capturer v0.0.0-20171211120116-e492ea43421d/go.mod h1:P2viExyCEfeWGU259JnaQ34Inuec4R38JCyBx2edgD0= +github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8= +github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= @@ -583,6 +599,8 @@ github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lanzafame/go-libp2p-ocgorpc v0.1.1 h1:yDXjQYel7WVC/oozZoJIUzHg3DMfBGVtBr+TXtM/RMs= +github.com/lanzafame/go-libp2p-ocgorpc v0.1.1/go.mod h1:Naz1HcGy8RHTQtXtr2s8xDGreZRETtpOlVJqRx4ucuo= github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= @@ -601,6 +619,8 @@ github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl9 github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8= github.com/libp2p/go-libp2p-core v0.2.4/go.mod h1:STh4fdfa5vDYr0/SzYYeqnt+E6KfEV5VxfIrm0bcI0g= github.com/libp2p/go-libp2p-core v0.3.0/go.mod h1:ACp3DmS3/N64c2jDzcV429ukDpicbL6+TrrxANBjPGw= +github.com/libp2p/go-libp2p-gorpc v0.6.0 h1:Z3ODCzbKe+2lUtEjRc+W+l8Olj63r68G5w1wrQ9ZsOw= +github.com/libp2p/go-libp2p-gorpc v0.6.0/go.mod h1:jGTsI/yn1xL/9VupJ+DIXo8ExobWDKjwVdjNAfhFKxk= github.com/libp2p/go-libp2p-gostream v0.6.0 h1:QfAiWeQRce6pqnYfmIVWJFXNdDyfiR/qkCnjyaZUPYU= github.com/libp2p/go-libp2p-gostream v0.6.0/go.mod h1:Nywu0gYZwfj7Jc91PQvbGU8dIpqbQQkjWgDuOrFaRdA= github.com/libp2p/go-libp2p-http v0.5.0 h1:+x0AbLaUuLBArHubbbNRTsgWz0RjNTy6DJLOxQ3/QBc= @@ -649,15 +669,15 @@ github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd/go.mod h1:QuCEs github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.6 h1:6Su7aK7lXmJ/U79bYtBjLNaha4Fs1Rg9plHpcH+vvnE= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +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.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= 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.4 h1:2BvfKmzob6Bmd4YsL0zygOqfdFnK7GR4QL06Do4/p7Y= @@ -716,8 +736,8 @@ github.com/multiformats/go-multiaddr v0.1.0/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lg github.com/multiformats/go-multiaddr v0.1.1/go.mod h1:aMKBKNEYmzmDmxfX88/vz+J5IU55txyt0p4aiWVohjo= github.com/multiformats/go-multiaddr v0.2.0/go.mod h1:0nO36NvPpyV4QzvTLi/lafl2y95ncPj0vFwVF6k6wJ4= github.com/multiformats/go-multiaddr v0.4.0/go.mod h1:YcpyLH8ZPudLxQlemYBPhSm0/oCXAT8Z4mzFpyoPyRc= -github.com/multiformats/go-multiaddr v0.12.1 h1:vm+BA/WZA8QZDp1pF1FWhi5CT3g1tbi5GJmqpb6wnlk= -github.com/multiformats/go-multiaddr v0.12.1/go.mod h1:7mPkiBMmLeFipt+nNSq9pHZUeJSt8lHBgH6yhj0YQzE= +github.com/multiformats/go-multiaddr v0.12.2 h1:9G9sTY/wCYajKa9lyfWPmpZAwe6oV+Wb1zcmMS1HG24= +github.com/multiformats/go-multiaddr v0.12.2/go.mod h1:GKyaTYjZRdcUhyOetrxTk9z0cW+jA/YrnqTOvKgi44M= github.com/multiformats/go-multiaddr-dns v0.3.0/go.mod h1:mNzQ4eTGDg0ll1N9jKPOUogZPoJ30W8a7zk66FQPpdQ= 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= @@ -897,8 +917,8 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -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/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= +github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= 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= @@ -989,14 +1009,18 @@ github.com/twmb/murmur3 v1.1.8 h1:8Yt9taO/WN3l08xErzjeschgZU2QSrwm1kclYq+0aRg= github.com/twmb/murmur3 v1.1.8/go.mod h1:Qq/R7NUyOfr65zD+6Q5IHKsJLwP7exErjN6lyyq3OSQ= 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/uber/jaeger-client-go v2.25.0+incompatible h1:IxcNZ7WRY1Y3G4poYlx24szfsn/3LvK9QHCq9oQw8+U= +github.com/uber/jaeger-client-go v2.25.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/ucarion/urlpath v0.0.0-20200424170820-7ccc79b76bbb h1:Ywfo8sUltxogBpFuMOFRrrSifO788kAFxmvVw31PtQQ= github.com/ucarion/urlpath v0.0.0-20200424170820-7ccc79b76bbb/go.mod h1:ikPs9bRWicNw3S7XpJ8sK/smGwU9WcSVU3dy9qahYBM= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE= +github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli v1.22.10/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli/v2 v2.0.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= -github.com/urfave/cli/v2 v2.26.0 h1:3f3AMg3HpThFNT4I++TKOejZO8yU55t3JnnSr4S4QEI= -github.com/urfave/cli/v2 v2.26.0/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= +github.com/urfave/cli/v2 v2.27.1 h1:8xSQ6szndafKVRmfyeUMxkNUJQMjL1F2zmsZ+qHpfho= +github.com/urfave/cli/v2 v2.27.1/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU= github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM= github.com/wangjia184/sortedset v0.0.0-20160527075905-f5d03557ba30/go.mod h1:YkocrP2K2tcw938x9gCOmT5G5eCD6jsTz0SZuyAqwIE= @@ -1322,6 +1346,7 @@ golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220708085239-5a0f0661e09d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1452,6 +1477,7 @@ google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/ google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0 h1:yfrXXP61wVuLb0vBcG6qaOoIoqYEzOQS8jum51jkv2w= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1518,8 +1544,8 @@ google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3Iji google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.60.1 h1:26+wFr+cNqSGFcOXcabYC0lUVJVRa2Sb2ortSK7VrEU= -google.golang.org/grpc v1.60.1/go.mod h1:OlCHIeLYqSSsLi6i49B5QGdzaMZK9+M7LXN2FKz4eGM= +google.golang.org/grpc v1.61.0 h1:TOvOcuXn30kRao+gfcvsebNEa5iZIiLkisYEkf7R7o0= +google.golang.org/grpc v1.61.0/go.mod h1:VUbo7IFqmF1QtCAstipjG0GIoq49KvMe9+h1jFLBNJs= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=