From a59d83518d547ff2bf9a425591c09d6ed6635046 Mon Sep 17 00:00:00 2001 From: Phi Date: Wed, 10 Aug 2022 14:44:14 +0200 Subject: [PATCH 01/43] Update release_issue_template Update release_issue_template. - Changed some wrong links (links pointed to version.go in IPFS-repo) - Removed `Create a discussion for this release` - Removed "Prep the changelog using `scripts/mkreleaselog`, and add it to `CHANGELOG.md`" since this already has been captured in the first pre-release step. Left that you should make sure that the CHANGELOG is up to date. --- documentation/misc/RELEASE_ISSUE_TEMPLATE.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/documentation/misc/RELEASE_ISSUE_TEMPLATE.md b/documentation/misc/RELEASE_ISSUE_TEMPLATE.md index 5a4884669..35b334c98 100644 --- a/documentation/misc/RELEASE_ISSUE_TEMPLATE.md +++ b/documentation/misc/RELEASE_ISSUE_TEMPLATE.md @@ -66,14 +66,13 @@ Testing an RC: - [ ] Update the [CHANGELOG.md](https://github.com/filecoin-project/lotus/blob/master/CHANGELOG.md) to the state that can be used as release note. - [ ] Invite the wider community through (link to the release issue) -- [ ] **Stage 4 - Release** +- [ ] **Stage 4 - Stable Release** - [ ] Final preparation - - [ ] Verify that version string in [`version.go`](https://github.com/ipfs/go-ipfs/tree/master/version.go) has been updated. - - [ ] Prep the changelog using `scripts/mkreleaselog`, and add it to `CHANGELOG.md`. Ensure that [CHANGELOG.md](https://github.com/filecoin-project/lotus/blob/master/CHANGELOG.md) is up to date + - [ ] Verify that version string in [`version.go`](https://github.com/filecoin-project/lotus/blob/master/build/version.go) has been updated. + - [ ] Ensure that [CHANGELOG.md](https://github.com/filecoin-project/lotus/blob/master/CHANGELOG.md) is up to date - [ ] Merge `release-vX.Y.Z` into the `releases` branch. - [ ] Tag this merge commit (on the `releases` branch) with `vX.Y.Z` - - [ ] Cut the release [here](https://github.com/filecoin-project/lotus/releases/new?prerelease=true&target=releases). - - [ ] Check `Create a discussion for this release` + - [ ] Cut the release [here](https://github.com/filecoin-project/lotus/releases/new?prerelease=false&target=releases). - [ ] **Post-Release** From 3ffedead7a50c30ecf1ce00e03c1348d1d658057 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 20 Sep 2022 18:31:06 +0200 Subject: [PATCH 02/43] v1.17.2-rc1 --- build/openrpc/full.json.gz | Bin 28424 -> 28425 bytes build/openrpc/gateway.json.gz | Bin 5080 -> 5079 bytes build/openrpc/miner.json.gz | Bin 16025 -> 16025 bytes build/openrpc/worker.json.gz | Bin 5260 -> 5260 bytes build/version.go | 2 +- documentation/en/cli-lotus-miner.md | 2 +- documentation/en/cli-lotus-worker.md | 2 +- documentation/en/cli-lotus.md | 2 +- 8 files changed, 4 insertions(+), 4 deletions(-) diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index a8f16011a9c1b9424393842c633d5ddaabae5853..5ba5c948256e8f7c3469cffb5749e43332b4aaf3 100644 GIT binary patch literal 28425 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 un|4BC Date: Fri, 23 Sep 2022 11:20:02 -0400 Subject: [PATCH 03/43] fix: miner: init: only get sector-size once --- cmd/lotus-miner/init.go | 11 +++-------- documentation/en/cli-lotus-miner.md | 2 +- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/cmd/lotus-miner/init.go b/cmd/lotus-miner/init.go index ce69fad5b..ee458f686 100644 --- a/cmd/lotus-miner/init.go +++ b/cmd/lotus-miner/init.go @@ -541,7 +541,7 @@ func storageMinerInit(ctx context.Context, cctx *cli.Context, api v1api.FullNode addr = a } else { - a, err := createStorageMiner(ctx, api, peerid, gasPrice, cctx) + a, err := createStorageMiner(ctx, api, ssize, peerid, gasPrice, cctx) if err != nil { return xerrors.Errorf("creating miner failed: %w", err) } @@ -621,7 +621,7 @@ func configureStorageMiner(ctx context.Context, api v1api.FullNode, addr address return nil } -func createStorageMiner(ctx context.Context, api v1api.FullNode, peerid peer.ID, gasPrice types.BigInt, cctx *cli.Context) (address.Address, error) { +func createStorageMiner(ctx context.Context, api v1api.FullNode, ssize abi.SectorSize, peerid peer.ID, gasPrice types.BigInt, cctx *cli.Context) (address.Address, error) { var err error var owner address.Address if cctx.String("owner") != "" { @@ -633,11 +633,6 @@ func createStorageMiner(ctx context.Context, api v1api.FullNode, peerid peer.ID, return address.Undef, err } - ssize, err := units.RAMInBytes(cctx.String("sector-size")) - if err != nil { - return address.Undef, fmt.Errorf("failed to parse sector size: %w", err) - } - worker := owner if cctx.String("worker") != "" { worker, err = address.NewFromString(cctx.String("worker")) @@ -712,7 +707,7 @@ func createStorageMiner(ctx context.Context, api v1api.FullNode, peerid peer.ID, } // Note: the correct thing to do would be to call SealProofTypeFromSectorSize if actors version is v3 or later, but this still works - spt, err := miner.WindowPoStProofTypeFromSectorSize(abi.SectorSize(ssize)) + spt, err := miner.WindowPoStProofTypeFromSectorSize(ssize) if err != nil { return address.Undef, xerrors.Errorf("getting post proof type: %w", err) } diff --git a/documentation/en/cli-lotus-miner.md b/documentation/en/cli-lotus-miner.md index e8b568948..9f27d7327 100644 --- a/documentation/en/cli-lotus-miner.md +++ b/documentation/en/cli-lotus-miner.md @@ -71,7 +71,7 @@ OPTIONS: --create-worker-key create separate worker key (default: false) --worker value, -w value worker key to use (overrides --create-worker-key) --owner value, -o value owner key to use - --sector-size value specify sector size to use (default: "2KiB") + --sector-size value specify sector size to use --pre-sealed-sectors value specify set of presealed sectors for starting as a genesis miner (accepts multiple inputs) --pre-sealed-metadata value specify the metadata file for the presealed sectors --nosync don't check full-node sync status (default: false) From 27030aa1e8bba3949dc5ca7315e97ab20976cd45 Mon Sep 17 00:00:00 2001 From: Aayush Date: Fri, 23 Sep 2022 10:53:17 -0400 Subject: [PATCH 04/43] fix: miner: init miner's with 32GiB sectors by default --- cmd/lotus-miner/init.go | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/cmd/lotus-miner/init.go b/cmd/lotus-miner/init.go index ee458f686..f0f84eb67 100644 --- a/cmd/lotus-miner/init.go +++ b/cmd/lotus-miner/init.go @@ -90,7 +90,6 @@ var initCmd = &cli.Command{ &cli.StringFlag{ Name: "sector-size", Usage: "specify sector size to use", - Value: units.BytesSize(float64(abi.SectorSize(2048))), }, &cli.StringSliceFlag{ Name: "pre-sealed-sectors", @@ -129,11 +128,18 @@ var initCmd = &cli.Command{ Action: func(cctx *cli.Context) error { log.Info("Initializing lotus miner") - sectorSizeInt, err := units.RAMInBytes(cctx.String("sector-size")) + ssize, err := abi.RegisteredSealProof_StackedDrg32GiBV1.SectorSize() if err != nil { - return err + return xerrors.Errorf("failed to calculate default sector size: %w", err) + } + + if cctx.IsSet("sector-size") { + sectorSizeInt, err := units.RAMInBytes(cctx.String("sector-size")) + if err != nil { + return err + } + ssize = abi.SectorSize(sectorSizeInt) } - ssize := abi.SectorSize(sectorSizeInt) gasPrice, err := types.BigFromString(cctx.String("gas-premium")) if err != nil { From b4ec045bc0f5c4f6b6346c1d1b5a306766f128b8 Mon Sep 17 00:00:00 2001 From: Aayush Date: Thu, 22 Sep 2022 11:42:06 -0400 Subject: [PATCH 05/43] fix: build: set PropagationDelaySecs correctly --- build/params_calibnet.go | 9 ++++++--- build/params_mainnet.go | 4 ++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/build/params_calibnet.go b/build/params_calibnet.go index cdf8dc6e9..faedd3ea8 100644 --- a/build/params_calibnet.go +++ b/build/params_calibnet.go @@ -89,13 +89,16 @@ func init() { Devnet = true + // NOTE: DO NOT change this unless you REALLY know what you're doing. This is not consensus critical, however, + //set this value too high may impacts your block submission; set this value too low may cause you miss + //parent tipsets for blocking forming and mining. if len(os.Getenv("PROPAGATION_DELAY_SECS")) != 0 { - PropagationDelaySecs, err := strconv.ParseUint(os.Getenv("PROPAGATION_DELAY_SECS"), 10, 64) + pds, err := strconv.ParseUint(os.Getenv("PROPAGATION_DELAY_SECS"), 10, 64) if err != nil { - PropagationDelaySecs = uint64(10) log.Warnw("Error setting PROPAGATION_DELAY_SECS, %v, proceed with default value %s", err, PropagationDelaySecs) } else { + PropagationDelaySecs = pds log.Warnw(" !!WARNING!! propagation delay is set to be %s second, "+ "this value impacts your message republish interval and block forming - monitor with caution!!", PropagationDelaySecs) } @@ -107,7 +110,7 @@ func init() { const BlockDelaySecs = uint64(builtin2.EpochDurationSeconds) -const PropagationDelaySecs = uint64(10) +var PropagationDelaySecs = uint64(10) // BootstrapPeerThreshold is the minimum number peers we need to track for a sync worker to start const BootstrapPeerThreshold = 4 diff --git a/build/params_mainnet.go b/build/params_mainnet.go index 45ceb89bd..c3864ffd2 100644 --- a/build/params_mainnet.go +++ b/build/params_mainnet.go @@ -103,12 +103,12 @@ func init() { //set this value too high may impacts your block submission; set this value too low may cause you miss //parent tipsets for blocking forming and mining. if len(os.Getenv("PROPAGATION_DELAY_SECS")) != 0 { - PropagationDelaySecs, err := strconv.ParseUint(os.Getenv("PROPAGATION_DELAY_SECS"), 10, 64) + pds, err := strconv.ParseUint(os.Getenv("PROPAGATION_DELAY_SECS"), 10, 64) if err != nil { - PropagationDelaySecs = uint64(10) log.Warnw("Error setting PROPAGATION_DELAY_SECS, %v, proceed with default value %s", err, PropagationDelaySecs) } else { + PropagationDelaySecs = pds log.Warnw(" !!WARNING!! propagation delay is set to be %s second, "+ "this value impacts your message republish interval and block forming - monitor with caution!!", PropagationDelaySecs) } From f228bf484ee57b0e74f61321f7beec445d969230 Mon Sep 17 00:00:00 2001 From: Ian Davis Date: Wed, 21 Sep 2022 12:20:26 -0400 Subject: [PATCH 06/43] Don't publish new homebrew releases for RC builds --- .circleci/config.yml | 7 +++++-- .circleci/template.yml | 7 +++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 7fcd20677..66f30e7d5 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1129,12 +1129,15 @@ workflows: - /.*/ tags: only: - - /^v\d+\.\d+\.\d+(-rc\d+)?$/ + - /^v\d+\.\d+\.\d+$/ - build-macos: filters: branches: only: - /^release\/v\d+\.\d+\.\d+(-rc\d+)?$/ + tags: + only: + - /^v\d+\.\d+\.\d+-rc\d+$/ - build-appimage: filters: branches: @@ -1265,4 +1268,4 @@ workflows: only: - master jobs: - - publish-packer-snap \ No newline at end of file + - publish-packer-snap diff --git a/.circleci/template.yml b/.circleci/template.yml index 9843463df..6e7a44364 100644 --- a/.circleci/template.yml +++ b/.circleci/template.yml @@ -854,12 +854,15 @@ workflows: - /.*/ tags: only: - - /^v\d+\.\d+\.\d+(-rc\d+)?$/ + - /^v\d+\.\d+\.\d+$/ - build-macos: filters: branches: only: - /^release\/v\d+\.\d+\.\d+(-rc\d+)?$/ + tags: + only: + - /^v\d+\.\d+\.\d+-rc\d+$/ - build-appimage: filters: branches: @@ -990,4 +993,4 @@ workflows: only: - master jobs: - - publish-packer-snap \ No newline at end of file + - publish-packer-snap From 1a3cf0c7fe2328a68523ccc90c868408f86f408a Mon Sep 17 00:00:00 2001 From: Ian Davis Date: Tue, 27 Sep 2022 20:59:11 +0100 Subject: [PATCH 07/43] Use golang 1.18.1 to build appimage --- .circleci/config.yml | 8 +++++++- .circleci/template.yml | 8 +++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 53ac6bce0..71bccdce5 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -424,6 +424,12 @@ jobs: - checkout - attach_workspace: at: "." + - run: + name: Update Go + command: | + curl -L https://golang.org/dl/go1.18.1.linux-amd64.tar.gz -o /tmp/go.tar.gz && \ + sudo tar -C /usr/local -xvf /tmp/go.tar.gz + - run: go version - run: name: install appimage-builder command: | @@ -1250,4 +1256,4 @@ workflows: only: - master jobs: - - publish-packer-snap \ No newline at end of file + - publish-packer-snap diff --git a/.circleci/template.yml b/.circleci/template.yml index 9843463df..ff469ccf2 100644 --- a/.circleci/template.yml +++ b/.circleci/template.yml @@ -424,6 +424,12 @@ jobs: - checkout - attach_workspace: at: "." + - run: + name: Update Go + command: | + curl -L https://golang.org/dl/go1.18.1.linux-amd64.tar.gz -o /tmp/go.tar.gz && \ + sudo tar -C /usr/local -xvf /tmp/go.tar.gz + - run: go version - run: name: install appimage-builder command: | @@ -990,4 +996,4 @@ workflows: only: - master jobs: - - publish-packer-snap \ No newline at end of file + - publish-packer-snap From e88c2061f1e99483210934b003c253b2d98f3a79 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Thu, 22 Sep 2022 23:28:46 -0400 Subject: [PATCH 08/43] add token holder group --- cmd/lotus-shed/fip-0036.go | 287 +++++++++++++++++++++++++++++++++++++ cmd/lotus-shed/main.go | 1 + cmd/lotus-shed/msig.go | 2 +- 3 files changed, 289 insertions(+), 1 deletion(-) create mode 100644 cmd/lotus-shed/fip-0036.go diff --git a/cmd/lotus-shed/fip-0036.go b/cmd/lotus-shed/fip-0036.go new file mode 100644 index 000000000..4e53f7666 --- /dev/null +++ b/cmd/lotus-shed/fip-0036.go @@ -0,0 +1,287 @@ +package main + +import ( + "context" + "encoding/json" + "fmt" + "io" + "io/ioutil" + + "github.com/filecoin-project/go-state-types/abi" + + "github.com/filecoin-project/lotus/chain/consensus/filcns" + "github.com/filecoin-project/lotus/chain/store" + cbor "github.com/ipfs/go-ipld-cbor" + + "github.com/filecoin-project/lotus/node/repo" + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/lotus/chain/actors/adt" + + "github.com/filecoin-project/lotus/chain/state" + + "github.com/filecoin-project/lotus/chain/actors/builtin" + "github.com/filecoin-project/lotus/chain/actors/builtin/multisig" + "github.com/filecoin-project/lotus/chain/types" + + "github.com/mitchellh/go-homedir" + + "golang.org/x/xerrors" + + "github.com/urfave/cli/v2" + + "github.com/filecoin-project/go-address" +) + +const APPROVE = 49 + +type Vote struct { + OptionID uint64 `json: "optionId"` + SignerAddress address.Address `json: "signerAddress"` +} + +type msigVote struct { + Multisig msigBriefInfo + AcceptanceSingers []address.Address + RejectionSigners []address.Address +} + +// https://filpoll.io/poll/16 +// snapshot height: 2162760 +// state root: bafy2bzacebdnzh43hw66bmvguk65wiwr5ssaejlq44fpdei2ysfh3eefpdlqs +var fip0036PollResultcmd = &cli.Command{ + Name: "fip0036poll", + Usage: "Process the FIP0036 FilPoll result", + ArgsUsage: "[state root, votes]", + Flags: []cli.Flag{ + &cli.StringFlag{ + Name: "repo", + Value: "~/.lotus", + }, + }, + Subcommands: []*cli.Command{ + //spRBPCmd, + //spDealByteCmd, + //clientCmd, + tokenHolderCmd, + //coreDevCmd, + //finalResultCmd, + }, +} + +func getVoters(file string) ([]Vote, error) { + + var votes []Vote + vb, err := ioutil.ReadFile(file) + if err != nil { + return nil, xerrors.Errorf("read vote: %w", err) + } + + if err := json.Unmarshal(vb, &votes); err != nil { + return nil, xerrors.Errorf("unmarshal vote: %w", err) + } + return votes, nil +} + +func getAllMsig(st *state.StateTree, store adt.Store) ([]msigBriefInfo, error) { + + var msigActorsInfo []msigBriefInfo + err := st.ForEach(func(addr address.Address, act *types.Actor) error { + if builtin.IsMultisigActor(act.Code) { + ms, err := multisig.Load(store, act) + if err != nil { + return fmt.Errorf("load msig failed %v", err) + + } + + signers, _ := ms.Signers() + threshold, _ := ms.Threshold() + info := msigBriefInfo{ + ID: addr, + Signer: signers, + Balance: act.Balance, + Threshold: threshold, + } + msigActorsInfo = append(msigActorsInfo, info) + + } + return nil + }) + if err != nil { + return nil, err + } + return msigActorsInfo, nil +} + +var tokenHolderCmd = &cli.Command{ + Name: "token-holder", + Usage: "get poll result for token holder group", + ArgsUsage: "[state root]", + Flags: []cli.Flag{ + &cli.StringFlag{ + Name: "repo", + Value: "~/.lotus", + }, + }, + Action: func(cctx *cli.Context) error { + if cctx.NArg() != 2 { + return xerrors.New("filpoll0036 token-holder [state root] [votes.json]") + } + + ctx := context.TODO() + if !cctx.Args().Present() { + return fmt.Errorf("must pass state root") + } + + sroot, err := cid.Decode(cctx.Args().First()) + if err != nil { + return fmt.Errorf("failed to parse input: %w", err) + } + + fsrepo, err := repo.NewFS(cctx.String("repo")) + if err != nil { + return err + } + + lkrepo, err := fsrepo.Lock(repo.FullNode) + if err != nil { + return err + } + + defer lkrepo.Close() //nolint:errcheck + + bs, err := lkrepo.Blockstore(ctx, repo.UniversalBlockstore) + if err != nil { + return fmt.Errorf("failed to open blockstore: %w", err) + } + + defer func() { + if c, ok := bs.(io.Closer); ok { + if err := c.Close(); err != nil { + log.Warnf("failed to close blockstore: %s", err) + } + } + }() + + mds, err := lkrepo.Datastore(context.Background(), "/metadata") + if err != nil { + return err + } + + cs := store.NewChainStore(bs, bs, mds, filcns.Weight, nil) + defer cs.Close() //nolint:errcheck + + cst := cbor.NewCborStore(bs) + store := adt.WrapStore(ctx, cst) + + tree, err := state.LoadStateTree(cst, sroot) + if err != nil { + return err + } + + //get all the votes' singer address && their vote + vj, err := homedir.Expand(cctx.Args().Get(1)) + if err != nil { + return xerrors.Errorf("fail to get votes json") + } + votes, err := getVoters(vj) + if err != nil { + return xerrors.Errorf("fail to get votesrs: ", err) + } + //get all the msig + msigs, err := getAllMsig(tree, store) + + var acceptanceVote []Vote + var rejectionVote []Vote + acceptanceBalance := abi.NewTokenAmount(0) + rejectionBalance := abi.NewTokenAmount(0) + msigPendingVotes := make(map[address.Address]msigVote) + msigFinalVotes := make(map[address.Address]msigVote) + + for _, v := range votes { + a, err := tree.GetActor(v.SignerAddress) + if err != nil { + return xerrors.Errorf("fail to get account account for signer: ", v.SignerAddress) + } + //regular account + if v.OptionID == APPROVE { + acceptanceVote = append(acceptanceVote, v) + acceptanceBalance = types.BigAdd(acceptanceBalance, a.Balance) + } else { + rejectionVote = append(rejectionVote, v) + rejectionBalance = types.BigAdd(rejectionBalance, a.Balance) + } + + //msig + si, err := tree.LookupID(v.SignerAddress) + if err != nil { + return xerrors.Errorf("cannot resolve singer: ", si) + } + for _, m := range msigs { + + for _, ms := range m.Signer { + if ms == si { + if mv, found := msigPendingVotes[m.ID]; found { //other singer has voted + + if v.OptionID == APPROVE { + mv.AcceptanceSingers = append(mv.AcceptanceSingers, v.SignerAddress) + } else { + mv.RejectionSigners = append(mv.RejectionSigners, v.SignerAddress) + } + + //check if threshold meet + if uint64(len(mv.AcceptanceSingers)) == m.Threshold { + delete(msigPendingVotes, m.ID) + msigFinalVotes[m.ID] = mv + acceptanceBalance = types.BigAdd(acceptanceBalance, m.Balance) + } else if uint64(len(mv.RejectionSigners)) == m.Threshold { + delete(msigPendingVotes, m.ID) + msigFinalVotes[m.ID] = mv + rejectionBalance = types.BigAdd(rejectionBalance, m.Balance) + } else { + msigPendingVotes[m.ID] = mv + } + } else { + + n := msigVote{ + Multisig: m, + } + if v.OptionID == APPROVE { + n.AcceptanceSingers = append(n.AcceptanceSingers, v.SignerAddress) + } else { + n.RejectionSigners = append(n.RejectionSigners, v.SignerAddress) + } + + //check if threshold meet + if uint64(len(mv.AcceptanceSingers)) == m.Threshold { + delete(msigPendingVotes, m.ID) + msigFinalVotes[m.ID] = mv + acceptanceBalance = types.BigAdd(acceptanceBalance, m.Balance) + } else if uint64(len(mv.RejectionSigners)) == m.Threshold { + delete(msigPendingVotes, m.ID) + msigFinalVotes[m.ID] = mv + rejectionBalance = types.BigAdd(rejectionBalance, m.Balance) + } else { + msigPendingVotes[m.ID] = mv + } + } + } + } + } + } + + fmt.Printf("\nTotoal amount of singers: %v\n ", len(votes)) + fmt.Printf("Totoal amount of valid multisig vote: %v\n ", len(msigFinalVotes)) + fmt.Printf("Total balance: %v\n", types.BigAdd(acceptanceBalance, rejectionBalance).String()) + fmt.Printf("Approve: %v\n", acceptanceBalance.String()) + fmt.Printf("Reject: %v\n", rejectionBalance.String()) + av := types.BigDivFloat(acceptanceBalance, types.BigAdd(acceptanceBalance, rejectionBalance)) + rv := types.BigDivFloat(rejectionBalance, types.BigAdd(rejectionBalance, acceptanceBalance)) + if av > 0.05 { + fmt.Printf("Token Holder Group Result: Pass. approve: %.5f, reject: %.5f\n", av, rv) + } else { + fmt.Printf("Token Holder Group Result: Not Pass. approve: %.5f, reject: %.5f\n", av, rv) + } + return nil + }, +} diff --git a/cmd/lotus-shed/main.go b/cmd/lotus-shed/main.go index 792d72968..19549c36e 100644 --- a/cmd/lotus-shed/main.go +++ b/cmd/lotus-shed/main.go @@ -74,6 +74,7 @@ func main() { diffCmd, itestdCmd, msigCmd, + fip0036PollResultcmd, } app := &cli.App{ diff --git a/cmd/lotus-shed/msig.go b/cmd/lotus-shed/msig.go index 66e4885c3..7d37d3d2d 100644 --- a/cmd/lotus-shed/msig.go +++ b/cmd/lotus-shed/msig.go @@ -25,7 +25,7 @@ import ( type msigBriefInfo struct { ID address.Address - Signer interface{} + Signer []address.Address Balance abi.TokenAmount Threshold uint64 } From 0addc7207e6fa5f06acfb9dfd45491337888c6f6 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Fri, 23 Sep 2022 16:00:22 -0400 Subject: [PATCH 09/43] add client --- cmd/lotus-shed/fip-0036.go | 156 ++++++++++++++++++++++++++++++++++--- 1 file changed, 146 insertions(+), 10 deletions(-) diff --git a/cmd/lotus-shed/fip-0036.go b/cmd/lotus-shed/fip-0036.go index 4e53f7666..fa48c47c7 100644 --- a/cmd/lotus-shed/fip-0036.go +++ b/cmd/lotus-shed/fip-0036.go @@ -7,6 +7,8 @@ import ( "io" "io/ioutil" + "github.com/filecoin-project/lotus/chain/actors/builtin/market" + "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/lotus/chain/consensus/filcns" @@ -62,7 +64,7 @@ var fip0036PollResultcmd = &cli.Command{ Subcommands: []*cli.Command{ //spRBPCmd, //spDealByteCmd, - //clientCmd, + clientCmd, tokenHolderCmd, //coreDevCmd, //finalResultCmd, @@ -191,8 +193,8 @@ var tokenHolderCmd = &cli.Command{ //get all the msig msigs, err := getAllMsig(tree, store) - var acceptanceVote []Vote - var rejectionVote []Vote + acceptanceVote := 0 + rejectionVote := 0 acceptanceBalance := abi.NewTokenAmount(0) rejectionBalance := abi.NewTokenAmount(0) msigPendingVotes := make(map[address.Address]msigVote) @@ -205,10 +207,10 @@ var tokenHolderCmd = &cli.Command{ } //regular account if v.OptionID == APPROVE { - acceptanceVote = append(acceptanceVote, v) + acceptanceVote += 1 acceptanceBalance = types.BigAdd(acceptanceBalance, a.Balance) } else { - rejectionVote = append(rejectionVote, v) + rejectionVote += 1 rejectionBalance = types.BigAdd(rejectionBalance, a.Balance) } @@ -218,7 +220,6 @@ var tokenHolderCmd = &cli.Command{ return xerrors.Errorf("cannot resolve singer: ", si) } for _, m := range msigs { - for _, ms := range m.Signer { if ms == si { if mv, found := msigPendingVotes[m.ID]; found { //other singer has voted @@ -270,11 +271,13 @@ var tokenHolderCmd = &cli.Command{ } } - fmt.Printf("\nTotoal amount of singers: %v\n ", len(votes)) - fmt.Printf("Totoal amount of valid multisig vote: %v\n ", len(msigFinalVotes)) + fmt.Printf("\nTotal amount of singers: %v\n ", len(votes)) + fmt.Printf("Total amount of valid multisig vote: %v\n ", len(msigFinalVotes)) fmt.Printf("Total balance: %v\n", types.BigAdd(acceptanceBalance, rejectionBalance).String()) - fmt.Printf("Approve: %v\n", acceptanceBalance.String()) - fmt.Printf("Reject: %v\n", rejectionBalance.String()) + fmt.Printf("Approve (#): %v\n", acceptanceVote) + fmt.Printf("Reject (#): %v\n", rejectionVote) + fmt.Printf("Approve (FIL): %v\n", acceptanceBalance.String()) + fmt.Printf("Reject (FIL): %v\n", rejectionBalance.String()) av := types.BigDivFloat(acceptanceBalance, types.BigAdd(acceptanceBalance, rejectionBalance)) rv := types.BigDivFloat(rejectionBalance, types.BigAdd(rejectionBalance, acceptanceBalance)) if av > 0.05 { @@ -285,3 +288,136 @@ var tokenHolderCmd = &cli.Command{ return nil }, } + +var clientCmd = &cli.Command{ + Name: "client", + Usage: "get poll result for client", + ArgsUsage: "[state root]", + Flags: []cli.Flag{ + &cli.StringFlag{ + Name: "repo", + Value: "~/.lotus", + }, + }, + Action: func(cctx *cli.Context) error { + if cctx.NArg() != 2 { + return xerrors.New("filpoll0036 token-holder [state root] [votes.json]") + } + + ctx := context.TODO() + if !cctx.Args().Present() { + return fmt.Errorf("must pass state root") + } + + sroot, err := cid.Decode(cctx.Args().First()) + if err != nil { + return fmt.Errorf("failed to parse input: %w", err) + } + + fsrepo, err := repo.NewFS(cctx.String("repo")) + if err != nil { + return err + } + + lkrepo, err := fsrepo.Lock(repo.FullNode) + if err != nil { + return err + } + + defer lkrepo.Close() //nolint:errcheck + + bs, err := lkrepo.Blockstore(ctx, repo.UniversalBlockstore) + if err != nil { + return fmt.Errorf("failed to open blockstore: %w", err) + } + + defer func() { + if c, ok := bs.(io.Closer); ok { + if err := c.Close(); err != nil { + log.Warnf("failed to close blockstore: %s", err) + } + } + }() + + mds, err := lkrepo.Datastore(context.Background(), "/metadata") + if err != nil { + return err + } + + cs := store.NewChainStore(bs, bs, mds, filcns.Weight, nil) + defer cs.Close() //nolint:errcheck + + cst := cbor.NewCborStore(bs) + store := adt.WrapStore(ctx, cst) + + tree, err := state.LoadStateTree(cst, sroot) + if err != nil { + return err + } + + //get all the votes' singer address && their vote + vj, err := homedir.Expand(cctx.Args().Get(1)) + if err != nil { + return xerrors.Errorf("fail to get votes json") + } + votes, err := getVoters(vj) + if err != nil { + return xerrors.Errorf("fail to get votesrs: ", err) + } + + //market actor + ma, err := tree.GetActor(market.Address) + if err != nil { + return xerrors.Errorf("fail to get market actor: ", err) + } + + ms, err := market.Load(store, ma) + if err != nil { + return xerrors.Errorf("fail to load market actor: ", err) + } + + dps, _ := ms.Proposals() + acceptanceBytes := abi.PaddedPieceSize(0) + rejectionBytes := abi.PaddedPieceSize(0) + acceptanceCount := 0 + rejectionCount := 0 + for _, v := range votes { + if err != nil { + return xerrors.Errorf("fail to get account account for signer: ", v.SignerAddress) + } + ai, err := tree.LookupID(v.SignerAddress) + if err != nil { + return xerrors.Errorf("cannot resolve singer: ", ai) + } + if err := dps.ForEach(func(dealID abi.DealID, d market.DealProposal) error { + p, found, _ := dps.Get(dealID) + if found && p.Client == ai { + if v.OptionID == APPROVE { + acceptanceBytes += p.PieceSize + acceptanceCount += 1 + } else { + rejectionBytes += p.PieceSize + rejectionCount += 1 + } + } + return xerrors.Errorf("cant get deal ", err) + }); err != nil { + return err + } + } + fmt.Printf("\nTotal amount of clients: %v\n", acceptanceCount+rejectionCount) + fmt.Printf("Total deal bytes: %v\n", acceptanceBytes+rejectionBytes) + fmt.Printf("Approve (#): %v\n", acceptanceCount) + fmt.Printf("Reject (#): %v\n", rejectionCount) + fmt.Printf("Approve (byte): %v\n", acceptanceBytes) + fmt.Printf("Reject (byte): %v\n", rejectionBytes) + av := float64(acceptanceBytes) / float64(acceptanceBytes+rejectionBytes) + rv := float64(rejectionBytes) / float64(acceptanceBytes+rejectionBytes) + if av > 0.05 { + fmt.Printf("Deal Client Group Result: Pass. approve: %.5f, reject: %.5f\n", av, rv) + } else { + fmt.Printf("Deal Client Group Result: Not Pass. approve: %.5f, reject: %.5f\n", av, rv) + } + return nil + }, +} From 5f5491a9e57fbfa35b73a1a74eee352bfd56c893 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Fri, 23 Sep 2022 16:04:45 -0400 Subject: [PATCH 10/43] get deal proposal --- cmd/lotus-shed/fip-0036.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/cmd/lotus-shed/fip-0036.go b/cmd/lotus-shed/fip-0036.go index fa48c47c7..f6fc72427 100644 --- a/cmd/lotus-shed/fip-0036.go +++ b/cmd/lotus-shed/fip-0036.go @@ -390,17 +390,17 @@ var clientCmd = &cli.Command{ return xerrors.Errorf("cannot resolve singer: ", ai) } if err := dps.ForEach(func(dealID abi.DealID, d market.DealProposal) error { - p, found, _ := dps.Get(dealID) - if found && p.Client == ai { + + if d.Client == ai { if v.OptionID == APPROVE { - acceptanceBytes += p.PieceSize + acceptanceBytes += d.PieceSize acceptanceCount += 1 } else { - rejectionBytes += p.PieceSize + rejectionBytes += d.PieceSize rejectionCount += 1 } } - return xerrors.Errorf("cant get deal ", err) + return nil }); err != nil { return err } From 3d5ecf25b249974ce337a8a75fbb94b79a788ad5 Mon Sep 17 00:00:00 2001 From: jennijuju Date: Sat, 24 Sep 2022 22:30:00 -0400 Subject: [PATCH 11/43] wip --- cmd/lotus-shed/fip-0036.go | 373 ++++++++++++++++++++++++++++++++++--- 1 file changed, 352 insertions(+), 21 deletions(-) diff --git a/cmd/lotus-shed/fip-0036.go b/cmd/lotus-shed/fip-0036.go index f6fc72427..44f950a88 100644 --- a/cmd/lotus-shed/fip-0036.go +++ b/cmd/lotus-shed/fip-0036.go @@ -7,6 +7,10 @@ import ( "io" "io/ioutil" + "github.com/filecoin-project/lotus/chain/actors/builtin/power" + + "github.com/filecoin-project/lotus/chain/actors/builtin/miner" + "github.com/filecoin-project/lotus/chain/actors/builtin/market" "github.com/filecoin-project/go-state-types/abi" @@ -36,6 +40,7 @@ import ( ) const APPROVE = 49 +const Reject = 50 type Vote struct { OptionID uint64 `json: "optionId"` @@ -62,8 +67,7 @@ var fip0036PollResultcmd = &cli.Command{ }, }, Subcommands: []*cli.Command{ - //spRBPCmd, - //spDealByteCmd, + spRBPAndDealCmd, clientCmd, tokenHolderCmd, //coreDevCmd, @@ -85,6 +89,23 @@ func getVoters(file string) ([]Vote, error) { return votes, nil } +func getVotesMap(file string, st *state.StateTree) (map[address.Address]uint64, error) { + votes, err := getVoters(file) + if err != nil { + return nil, xerrors.Errorf("cant get voters") + } + + vm := make(map[address.Address]uint64) + for _, v := range votes { + si, err := st.LookupID(v.SignerAddress) + if err != nil { + return nil, xerrors.Errorf("fail to lookup address") + } + vm[si] = v.OptionID + } + return vm, nil +} + func getAllMsig(st *state.StateTree, store adt.Store) ([]msigBriefInfo, error) { var msigActorsInfo []msigBriefInfo @@ -115,6 +136,310 @@ func getAllMsig(st *state.StateTree, store adt.Store) ([]msigBriefInfo, error) { return msigActorsInfo, nil } +func getAllMsigMap(st *state.StateTree, store adt.Store) (map[address.Address]msigBriefInfo, error) { + + msigActorsInfo := make(map[address.Address]msigBriefInfo) + err := st.ForEach(func(addr address.Address, act *types.Actor) error { + if builtin.IsMultisigActor(act.Code) { + ms, err := multisig.Load(store, act) + if err != nil { + return fmt.Errorf("load msig failed %v", err) + + } + + signers, _ := ms.Signers() + threshold, _ := ms.Threshold() + info := msigBriefInfo{ + ID: addr, + Signer: signers, + Balance: act.Balance, + Threshold: threshold, + } + msigActorsInfo[addr] = info + } + return nil + }) + if err != nil { + return nil, err + } + return msigActorsInfo, nil +} + +type MinerVoteInfo struct { + AvailableBalance abi.TokenAmount + DealBytes abi.PaddedPieceSize + RBP abi.StoragePower + Option uint64 +} + +func getStorageMinerRBP(miner address.Address, st *state.StateTree, store adt.Store) (abi.StoragePower, error) { + pa, err := st.GetActor(power.Address) + if err != nil { + return types.NewInt(0), xerrors.Errorf("failed to get power actor: \n", err) + } + + ps, err := power.Load(store, pa) + if err != nil { + return types.NewInt(0), xerrors.Errorf("failed to get power state: \n", err) + } + + mp, _, err := ps.MinerPower(miner) + if err != nil { + return types.NewInt(0), xerrors.Errorf("failed to get miner power: \n", err) + } + + return mp.RawBytePower, nil +} + +func getStorageMinerVotes(st *state.StateTree, votes map[address.Address]uint64, store adt.Store) (map[address.Address]MinerVoteInfo /*key: miner actor id*/, error) { + smv := make(map[address.Address]MinerVoteInfo) + msigs, err := getAllMsigMap(st, store) + if err != nil { + xerrors.Errorf("fail to get msigs", err) + } + err = st.ForEach(func(addr address.Address, act *types.Actor) error { + if builtin.IsStorageMinerActor(act.Code) { + m, err := miner.Load(store, act) + if err != nil { + return xerrors.Errorf("fail to load miner actor: \n", err) + } + + info, err := m.Info() + if err != nil { + return xerrors.Errorf("fail to get miner info: \n", err) + } + //check if owner voted + o := info.Owner + if v, found := votes[o]; found { + //check if it is msig + oa, err := st.GetActor(o) + if err != nil { + return xerrors.Errorf("fail to get owner actor: \n", err) + } + if builtin.IsMultisigActor(oa.Code) { + if ms, found := msigs[o]; found { + ac := uint64(0) + rc := uint64(0) + for _, s := range ms.Signer { + if v, found := votes[s]; found { + if v == APPROVE { + ac += 1 + } else { + rc += 1 + } + } + mp, err := getStorageMinerRBP(addr, st, store) + if err != nil { + return xerrors.Errorf("fail to get miner actor rbp", err) + } + m := MinerVoteInfo{ + AvailableBalance: act.Balance, + RBP: mp, + } + if ac == ms.Threshold { + m.Option = APPROVE + smv[addr] = m + } else if rc == ms.Threshold { + m.Option = Reject + smv[addr] = m + } else { + smv[addr] = m + } + } + } + } else { //owner is regular wallet account + mp, err := getStorageMinerRBP(addr, st, store) + if err != nil { + return xerrors.Errorf("fail to get miner actor rbp", err) + } + m := MinerVoteInfo{ + AvailableBalance: act.Balance, + RBP: mp, + Option: v, + } + smv[addr] = m + } + } + + //check if owner not voted but worker voted + if _, found := smv[addr]; !found { + w := info.Worker + if v, found := votes[w]; found { + mp, err := getStorageMinerRBP(addr, st, store) + if err != nil { + return xerrors.Errorf("fail to get miner actor rbp", err) + } + m := MinerVoteInfo{ + AvailableBalance: act.Balance, + RBP: mp, + Option: v, + } + smv[addr] = m + } + } + } + return nil + }) + if err != nil { + return nil, err + } + return smv, nil +} + +var spRBPAndDealCmd = &cli.Command{ + Name: "sp", + Usage: "get poll result for storage group", + ArgsUsage: "[state root]", + Flags: []cli.Flag{ + &cli.StringFlag{ + Name: "repo", + Value: "~/.lotus", + }, + &cli.BoolFlag{ + Name: "rbp-only", + Value: false, + }, + }, + + Action: func(cctx *cli.Context) error { + if cctx.NArg() != 2 { + return xerrors.New("filpoll0036 token-holder [state root] [votes.json]") + } + + ctx := context.TODO() + if !cctx.Args().Present() { + return fmt.Errorf("must pass state root") + } + + sroot, err := cid.Decode(cctx.Args().First()) + if err != nil { + return fmt.Errorf("failed to parse input: %w", err) + } + + fsrepo, err := repo.NewFS(cctx.String("repo")) + if err != nil { + return err + } + + lkrepo, err := fsrepo.Lock(repo.FullNode) + if err != nil { + return err + } + + defer lkrepo.Close() //nolint:errcheck + + bs, err := lkrepo.Blockstore(ctx, repo.UniversalBlockstore) + if err != nil { + return fmt.Errorf("failed to open blockstore: %w", err) + } + + defer func() { + if c, ok := bs.(io.Closer); ok { + if err := c.Close(); err != nil { + log.Warnf("failed to close blockstore: %s", err) + } + } + }() + + mds, err := lkrepo.Datastore(context.Background(), "/metadata") + if err != nil { + return err + } + + cs := store.NewChainStore(bs, bs, mds, filcns.Weight, nil) + defer cs.Close() //nolint:errcheck + + cst := cbor.NewCborStore(bs) + store := adt.WrapStore(ctx, cst) + + tree, err := state.LoadStateTree(cst, sroot) + if err != nil { + return err + } + + //get all the votes' singer address && their vote + vj, err := homedir.Expand(cctx.Args().Get(1)) + if err != nil { + return xerrors.Errorf("fail to get votes json") + } + votes, err := getVotesMap(vj, tree) + if err != nil { + return xerrors.Errorf("fail to get votesrs: ", err) + } + + //get all storage miner votes + smv, err := getStorageMinerVotes(tree, votes, store) + if err != nil { + return xerrors.Errorf("fail to get storage miner votes", err) + } + acceptanceVote := 0 + rejectionVote := 0 + acceptanceRBP := abi.NewStoragePower(0) + rejectRBP := abi.NewStoragePower(0) + acceptanceDealBytes := abi.PaddedPieceSize(0) + rejectDealBytes := abi.PaddedPieceSize(0) + ownerMsigUnderThreshold := 0 + + //process the votes + //get all market proposals, add load the # of the bytes each provider has made + pds := make(map[address.Address]abi.PaddedPieceSize) + if !cctx.Bool("rbp-only") { + ma, err := tree.GetActor(market.Address) + if err != nil { + return xerrors.Errorf("fail to get market actor: ", err) + } + + ms, err := market.Load(store, ma) + if err != nil { + return xerrors.Errorf("fail to load market actor: ", err) + } + dps, _ := ms.Proposals() + if err := dps.ForEach(func(dealID abi.DealID, d market.DealProposal) error { + if pd, found := pds[d.Provider]; found { + s := d.PieceSize + pd + pds[d.Provider] = s + } else { + pds[d.Provider] = d.PieceSize + } + return xerrors.Errorf("fail to load deals") + }); err != nil { + return xerrors.Errorf("fail to get deals") + } + } + + //process the vote + for m, mvi := range smv { + if mvi.Option == APPROVE { + acceptanceVote += 1 + acceptanceRBP = types.BigAdd(acceptanceRBP, mvi.RBP) + if d, found := pds[m]; found { + acceptanceDealBytes += d + } + } else if mvi.Option == Reject { + rejectionVote += 1 + rejectRBP = types.BigAdd(rejectRBP, mvi.RBP) + if d, found := pds[m]; found { + rejectDealBytes += d + } + } else { //owner is msig and didnt reach threshold + ownerMsigUnderThreshold += 1 + } + } + fmt.Printf("\nTotal amount of storage provider: %v\n", len(smv)) + fmt.Printf("Accept (#): %v\n", acceptanceVote) + fmt.Printf("Reject (#): %v\n", rejectionVote) + fmt.Printf("Total RPB voted: %v\n", types.BigAdd(acceptanceRBP, rejectRBP)) + fmt.Printf("Accept (rbp): %v\n", acceptanceRBP) + fmt.Printf("Reject (rbp): %v\n", rejectRBP) + + if !cctx.Bool("rbp-only") { + fmt.Printf("Total deal bytes: %v\n", acceptanceDealBytes+rejectDealBytes) + fmt.Printf("Accept (deal bytes): %v\n", acceptanceDealBytes) + fmt.Printf("Reject (byte): %v\n", rejectDealBytes) + } + return nil + }, +} var tokenHolderCmd = &cli.Command{ Name: "token-holder", Usage: "get poll result for token holder group", @@ -223,13 +548,11 @@ var tokenHolderCmd = &cli.Command{ for _, ms := range m.Signer { if ms == si { if mv, found := msigPendingVotes[m.ID]; found { //other singer has voted - if v.OptionID == APPROVE { mv.AcceptanceSingers = append(mv.AcceptanceSingers, v.SignerAddress) } else { mv.RejectionSigners = append(mv.RejectionSigners, v.SignerAddress) } - //check if threshold meet if uint64(len(mv.AcceptanceSingers)) == m.Threshold { delete(msigPendingVotes, m.ID) @@ -243,7 +566,6 @@ var tokenHolderCmd = &cli.Command{ msigPendingVotes[m.ID] = mv } } else { - n := msigVote{ Multisig: m, } @@ -274,9 +596,9 @@ var tokenHolderCmd = &cli.Command{ fmt.Printf("\nTotal amount of singers: %v\n ", len(votes)) fmt.Printf("Total amount of valid multisig vote: %v\n ", len(msigFinalVotes)) fmt.Printf("Total balance: %v\n", types.BigAdd(acceptanceBalance, rejectionBalance).String()) - fmt.Printf("Approve (#): %v\n", acceptanceVote) + fmt.Printf("Option (#): %v\n", acceptanceVote) fmt.Printf("Reject (#): %v\n", rejectionVote) - fmt.Printf("Approve (FIL): %v\n", acceptanceBalance.String()) + fmt.Printf("Option (FIL): %v\n", acceptanceBalance.String()) fmt.Printf("Reject (FIL): %v\n", rejectionBalance.String()) av := types.BigDivFloat(acceptanceBalance, types.BigAdd(acceptanceBalance, rejectionBalance)) rv := types.BigDivFloat(rejectionBalance, types.BigAdd(rejectionBalance, acceptanceBalance)) @@ -376,7 +698,21 @@ var clientCmd = &cli.Command{ return xerrors.Errorf("fail to load market actor: ", err) } + //get all market proposals, add load the # of the bytes each client has made dps, _ := ms.Proposals() + cds := make(map[address.Address]abi.PaddedPieceSize) + if err := dps.ForEach(func(dealID abi.DealID, d market.DealProposal) error { + if cd, found := cds[d.Client]; found { + s := d.PieceSize + cd + cds[d.Client] = s + } else { + cds[d.Client] = d.PieceSize + } + return xerrors.Errorf("fail to load deals") + }); err != nil { + return xerrors.Errorf("fail to get deals") + } + acceptanceBytes := abi.PaddedPieceSize(0) rejectionBytes := abi.PaddedPieceSize(0) acceptanceCount := 0 @@ -389,27 +725,22 @@ var clientCmd = &cli.Command{ if err != nil { return xerrors.Errorf("cannot resolve singer: ", ai) } - if err := dps.ForEach(func(dealID abi.DealID, d market.DealProposal) error { - if d.Client == ai { - if v.OptionID == APPROVE { - acceptanceBytes += d.PieceSize - acceptanceCount += 1 - } else { - rejectionBytes += d.PieceSize - rejectionCount += 1 - } + if ds, found := cds[ai]; found { + if v.OptionID == APPROVE { + acceptanceBytes += ds + acceptanceCount += 1 + } else { + rejectionBytes += ds + rejectionCount += 1 } - return nil - }); err != nil { - return err } } fmt.Printf("\nTotal amount of clients: %v\n", acceptanceCount+rejectionCount) fmt.Printf("Total deal bytes: %v\n", acceptanceBytes+rejectionBytes) - fmt.Printf("Approve (#): %v\n", acceptanceCount) + fmt.Printf("Accept (#): %v\n", acceptanceCount) fmt.Printf("Reject (#): %v\n", rejectionCount) - fmt.Printf("Approve (byte): %v\n", acceptanceBytes) + fmt.Printf("Accept (byte): %v\n", acceptanceBytes) fmt.Printf("Reject (byte): %v\n", rejectionBytes) av := float64(acceptanceBytes) / float64(acceptanceBytes+rejectionBytes) rv := float64(rejectionBytes) / float64(acceptanceBytes+rejectionBytes) From 9dfd60472444bb42a2ec8a5818da7e33ab23e1b3 Mon Sep 17 00:00:00 2001 From: jennijuju Date: Mon, 26 Sep 2022 08:13:00 -0400 Subject: [PATCH 12/43] refactors refactors refactors --- cmd/lotus-shed/fip-0036.go | 395 ++++++++++++++++++++----------------- cmd/lotus-shed/main.go | 2 +- 2 files changed, 216 insertions(+), 181 deletions(-) diff --git a/cmd/lotus-shed/fip-0036.go b/cmd/lotus-shed/fip-0036.go index 44f950a88..f5d4e66fa 100644 --- a/cmd/lotus-shed/fip-0036.go +++ b/cmd/lotus-shed/fip-0036.go @@ -7,6 +7,11 @@ import ( "io" "io/ioutil" + "github.com/urfave/cli/v2" + + "github.com/filecoin-project/go-address" + "github.com/mitchellh/go-homedir" + "github.com/filecoin-project/lotus/chain/actors/builtin/power" "github.com/filecoin-project/lotus/chain/actors/builtin/miner" @@ -17,12 +22,11 @@ import ( "github.com/filecoin-project/lotus/chain/consensus/filcns" "github.com/filecoin-project/lotus/chain/store" + "github.com/ipfs/go-cid" cbor "github.com/ipfs/go-ipld-cbor" - "github.com/filecoin-project/lotus/node/repo" - "github.com/ipfs/go-cid" - "github.com/filecoin-project/lotus/chain/actors/adt" + "github.com/filecoin-project/lotus/node/repo" "github.com/filecoin-project/lotus/chain/state" @@ -30,13 +34,7 @@ import ( "github.com/filecoin-project/lotus/chain/actors/builtin/multisig" "github.com/filecoin-project/lotus/chain/types" - "github.com/mitchellh/go-homedir" - "golang.org/x/xerrors" - - "github.com/urfave/cli/v2" - - "github.com/filecoin-project/go-address" ) const APPROVE = 49 @@ -48,16 +46,16 @@ type Vote struct { } type msigVote struct { - Multisig msigBriefInfo - AcceptanceSingers []address.Address - RejectionSigners []address.Address + Multisig msigBriefInfo + ApproveCount uint64 + RejectCount uint64 } // https://filpoll.io/poll/16 // snapshot height: 2162760 // state root: bafy2bzacebdnzh43hw66bmvguk65wiwr5ssaejlq44fpdei2ysfh3eefpdlqs -var fip0036PollResultcmd = &cli.Command{ - Name: "fip0036poll", +var fip36PollCmd = &cli.Command{ + Name: "fip36poll", Usage: "Process the FIP0036 FilPoll result", ArgsUsage: "[state root, votes]", Flags: []cli.Flag{ @@ -75,8 +73,7 @@ var fip0036PollResultcmd = &cli.Command{ }, } -func getVoters(file string) ([]Vote, error) { - +func getVotesMap(file string, st *state.StateTree) (map[address.Address]uint64 /*map[Signer ID address]Option*/, error) { var votes []Vote vb, err := ioutil.ReadFile(file) if err != nil { @@ -86,29 +83,20 @@ func getVoters(file string) ([]Vote, error) { if err := json.Unmarshal(vb, &votes); err != nil { return nil, xerrors.Errorf("unmarshal vote: %w", err) } - return votes, nil -} - -func getVotesMap(file string, st *state.StateTree) (map[address.Address]uint64, error) { - votes, err := getVoters(file) - if err != nil { - return nil, xerrors.Errorf("cant get voters") - } vm := make(map[address.Address]uint64) for _, v := range votes { si, err := st.LookupID(v.SignerAddress) if err != nil { - return nil, xerrors.Errorf("fail to lookup address") + return nil, xerrors.Errorf("fail to lookup address", err) } vm[si] = v.OptionID } return vm, nil } -func getAllMsig(st *state.StateTree, store adt.Store) ([]msigBriefInfo, error) { - - var msigActorsInfo []msigBriefInfo +func getAllMsigSingerMap(st *state.StateTree, store adt.Store) (map[address.Address][]address.Address /*map[Singer ID address]msigActorId[]*/, error) { + sm := make(map[address.Address][]address.Address) err := st.ForEach(func(addr address.Address, act *types.Actor) error { if builtin.IsMultisigActor(act.Code) { ms, err := multisig.Load(store, act) @@ -117,26 +105,29 @@ func getAllMsig(st *state.StateTree, store adt.Store) ([]msigBriefInfo, error) { } - signers, _ := ms.Signers() - threshold, _ := ms.Threshold() - info := msigBriefInfo{ - ID: addr, - Signer: signers, - Balance: act.Balance, - Threshold: threshold, + ss, err := ms.Signers() + if err != nil { + return xerrors.Errorf("fail to get msig signers", err) + } + for _, s := range ss { + if m, found := sm[s]; found { //add msig id to signer's collection + m = append(m, addr) + sm[s] = m + } else { + n := []address.Address{addr} + sm[s] = n + } } - msigActorsInfo = append(msigActorsInfo, info) - } return nil }) if err != nil { return nil, err } - return msigActorsInfo, nil + return sm, nil } -func getAllMsigMap(st *state.StateTree, store adt.Store) (map[address.Address]msigBriefInfo, error) { +func getAllMsigIDMap(st *state.StateTree, store adt.Store) (map[address.Address]msigBriefInfo /*map[Multisig Actor ID]msigBriefInfo*/, error) { msigActorsInfo := make(map[address.Address]msigBriefInfo) err := st.ForEach(func(addr address.Address, act *types.Actor) error { @@ -191,9 +182,9 @@ func getStorageMinerRBP(miner address.Address, st *state.StateTree, store adt.St return mp.RawBytePower, nil } -func getStorageMinerVotes(st *state.StateTree, votes map[address.Address]uint64, store adt.Store) (map[address.Address]MinerVoteInfo /*key: miner actor id*/, error) { +func getStorageMinerVotes(st *state.StateTree, votes map[address.Address]uint64, store adt.Store) (map[address.Address]MinerVoteInfo /*map[Storage Miner Actor]Option*/, error) { smv := make(map[address.Address]MinerVoteInfo) - msigs, err := getAllMsigMap(st, store) + msigs, err := getAllMsigIDMap(st, store) if err != nil { xerrors.Errorf("fail to get msigs", err) } @@ -211,43 +202,39 @@ func getStorageMinerVotes(st *state.StateTree, votes map[address.Address]uint64, //check if owner voted o := info.Owner if v, found := votes[o]; found { - //check if it is msig - oa, err := st.GetActor(o) - if err != nil { - return xerrors.Errorf("fail to get owner actor: \n", err) - } - if builtin.IsMultisigActor(oa.Code) { - if ms, found := msigs[o]; found { - ac := uint64(0) - rc := uint64(0) - for _, s := range ms.Signer { - if v, found := votes[s]; found { - if v == APPROVE { - ac += 1 - } else { - rc += 1 - } - } - mp, err := getStorageMinerRBP(addr, st, store) - if err != nil { - return xerrors.Errorf("fail to get miner actor rbp", err) - } - m := MinerVoteInfo{ - AvailableBalance: act.Balance, - RBP: mp, - } - if ac == ms.Threshold { - m.Option = APPROVE - smv[addr] = m - } else if rc == ms.Threshold { - m.Option = Reject - smv[addr] = m + //check if owner is msig + if ms, found := msigs[o]; found { //owner is a msig + ac := uint64(0) + rc := uint64(0) + for _, s := range ms.Signer { + if v, found := votes[s]; found { + if v == APPROVE { + ac += 1 } else { - smv[addr] = m + rc += 1 } } + mp, err := getStorageMinerRBP(addr, st, store) + if err != nil { + return xerrors.Errorf("fail to get miner actor rbp", err) + } + m := MinerVoteInfo{ + AvailableBalance: act.Balance, + RBP: mp, + } + + //check if msig threshold is met for casting the vote + if ac == ms.Threshold { + m.Option = APPROVE + smv[addr] = m + } else if rc == ms.Threshold { + m.Option = Reject + smv[addr] = m + } else { + smv[addr] = m //no valid vote yet, option value should be 0 + } } - } else { //owner is regular wallet account + } else { //owner is a regular wallet account mp, err := getStorageMinerRBP(addr, st, store) if err != nil { return xerrors.Errorf("fail to get miner actor rbp", err) @@ -261,7 +248,7 @@ func getStorageMinerVotes(st *state.StateTree, votes map[address.Address]uint64, } } - //check if owner not voted but worker voted + //check if owner has not voted but worker voted if _, found := smv[addr]; !found { w := info.Worker if v, found := votes[w]; found { @@ -287,8 +274,9 @@ func getStorageMinerVotes(st *state.StateTree, votes map[address.Address]uint64, } var spRBPAndDealCmd = &cli.Command{ - Name: "sp", - Usage: "get poll result for storage group", + Name: "sp", + Usage: "get poll result for storage group. Weighted by RBP(raw byte power) and deal bytes stored in valid deals." + + "\nNote that: if both owner key and worker key has voted, the vote made by owner key will be casted the storage provider actor.", ArgsUsage: "[state root]", Flags: []cli.Flag{ &cli.StringFlag{ @@ -357,7 +345,7 @@ var spRBPAndDealCmd = &cli.Command{ return err } - //get all the votes' singer address && their vote + //get all the votes' singer ID address && their vote vj, err := homedir.Expand(cctx.Args().Get(1)) if err != nil { return xerrors.Errorf("fail to get votes json") @@ -372,15 +360,14 @@ var spRBPAndDealCmd = &cli.Command{ if err != nil { return xerrors.Errorf("fail to get storage miner votes", err) } - acceptanceVote := 0 + approveVote := 0 rejectionVote := 0 - acceptanceRBP := abi.NewStoragePower(0) + approveRBP := abi.NewStoragePower(0) rejectRBP := abi.NewStoragePower(0) - acceptanceDealBytes := abi.PaddedPieceSize(0) + approveDealBytes := abi.PaddedPieceSize(0) rejectDealBytes := abi.PaddedPieceSize(0) ownerMsigUnderThreshold := 0 - //process the votes //get all market proposals, add load the # of the bytes each provider has made pds := make(map[address.Address]abi.PaddedPieceSize) if !cctx.Bool("rbp-only") { @@ -410,15 +397,15 @@ var spRBPAndDealCmd = &cli.Command{ //process the vote for m, mvi := range smv { if mvi.Option == APPROVE { - acceptanceVote += 1 - acceptanceRBP = types.BigAdd(acceptanceRBP, mvi.RBP) - if d, found := pds[m]; found { - acceptanceDealBytes += d + approveVote += 1 + approveRBP = types.BigAdd(approveRBP, mvi.RBP) + if d, found := pds[m]; !cctx.Bool("rbp-only") && found { + approveDealBytes += d } } else if mvi.Option == Reject { rejectionVote += 1 rejectRBP = types.BigAdd(rejectRBP, mvi.RBP) - if d, found := pds[m]; found { + if d, found := pds[m]; !cctx.Bool("rbp-only") && found { rejectDealBytes += d } } else { //owner is msig and didnt reach threshold @@ -426,23 +413,39 @@ var spRBPAndDealCmd = &cli.Command{ } } fmt.Printf("\nTotal amount of storage provider: %v\n", len(smv)) - fmt.Printf("Accept (#): %v\n", acceptanceVote) + fmt.Printf("Approve (#): %v\n", approveVote) fmt.Printf("Reject (#): %v\n", rejectionVote) - fmt.Printf("Total RPB voted: %v\n", types.BigAdd(acceptanceRBP, rejectRBP)) - fmt.Printf("Accept (rbp): %v\n", acceptanceRBP) + fmt.Printf("SP owner is multisig and the vote is invalid due to under threshold: %v\n", ownerMsigUnderThreshold) + fmt.Printf("Total RPB voted: %v\n", types.BigAdd(approveRBP, rejectRBP)) + fmt.Printf("Approve (rbp): %v\n", approveRBP) fmt.Printf("Reject (rbp): %v\n", rejectRBP) + av := types.BigDivFloat(approveRBP, types.BigAdd(approveRBP, rejectRBP)) + rv := types.BigDivFloat(rejectRBP, types.BigAdd(approveRBP, rejectRBP)) + if av > 0.05 { + fmt.Printf("Storage Miner Group By RBP Result: Pass. approve: %.5f, reject: %.5f\n", av, rv) + } else { + fmt.Printf("Storage Miner Group By RBP Result: Not Pass. approve: %.5f, reject: %.5f\n", av, rv) + } if !cctx.Bool("rbp-only") { - fmt.Printf("Total deal bytes: %v\n", acceptanceDealBytes+rejectDealBytes) - fmt.Printf("Accept (deal bytes): %v\n", acceptanceDealBytes) + fmt.Printf("Total deal bytes: %v\n", approveDealBytes+rejectDealBytes) + fmt.Printf("Approve (deal bytes): %v\n", approveDealBytes) fmt.Printf("Reject (byte): %v\n", rejectDealBytes) + av := float64(approveDealBytes) / float64(approveDealBytes+rejectDealBytes) + rv := float64(rejectDealBytes) / float64(approveDealBytes+rejectDealBytes) + if av > 0.05 { + fmt.Printf("Storage Miner Group By Deal Bytes Result: Pass. approve: %.5f, reject: %.5f\n", av, rv) + } else { + fmt.Printf("Storage Miner Group By Deal Bytes: Not Pass. approve: %.5f, reject: %.5f\n", av, rv) + } } + return nil }, } var tokenHolderCmd = &cli.Command{ Name: "token-holder", - Usage: "get poll result for token holder group", + Usage: "get poll result for token holder group. balance includes, regular wallet accounts, multisig wallet that has valid vote that meets threshold, and the available balance of the storage miner actors that voted", ArgsUsage: "[state root]", Flags: []cli.Flag{ &cli.StringFlag{ @@ -511,81 +514,97 @@ var tokenHolderCmd = &cli.Command{ if err != nil { return xerrors.Errorf("fail to get votes json") } - votes, err := getVoters(vj) + vm, err := getVotesMap(vj, tree) if err != nil { - return xerrors.Errorf("fail to get votesrs: ", err) + return xerrors.Errorf("fail to get voter map ", err) } - //get all the msig - msigs, err := getAllMsig(tree, store) - acceptanceVote := 0 + //get all the msig singers & their msigs + msigs, err := getAllMsigSingerMap(tree, store) + + approveVote := 0 rejectionVote := 0 - acceptanceBalance := abi.NewTokenAmount(0) + approveBalance := abi.NewTokenAmount(0) rejectionBalance := abi.NewTokenAmount(0) - msigPendingVotes := make(map[address.Address]msigVote) - msigFinalVotes := make(map[address.Address]msigVote) + msigPendingVotes := make(map[address.Address]msigVote) //map[msig ID]msigVote + msigFinalVotes := 0 - for _, v := range votes { - a, err := tree.GetActor(v.SignerAddress) + for s, v := range vm { + //process votes for regular accounts + a, err := tree.GetActor(s) if err != nil { - return xerrors.Errorf("fail to get account account for signer: ", v.SignerAddress) + return xerrors.Errorf("fail to get account account for signer: ", err) } - //regular account - if v.OptionID == APPROVE { - acceptanceVote += 1 - acceptanceBalance = types.BigAdd(acceptanceBalance, a.Balance) + if v == APPROVE { + approveVote += 1 + approveBalance = types.BigAdd(approveBalance, a.Balance) } else { rejectionVote += 1 rejectionBalance = types.BigAdd(rejectionBalance, a.Balance) } - //msig - si, err := tree.LookupID(v.SignerAddress) - if err != nil { - return xerrors.Errorf("cannot resolve singer: ", si) - } - for _, m := range msigs { - for _, ms := range m.Signer { - if ms == si { - if mv, found := msigPendingVotes[m.ID]; found { //other singer has voted - if v.OptionID == APPROVE { - mv.AcceptanceSingers = append(mv.AcceptanceSingers, v.SignerAddress) + //process msigs + if mss, found := msigs[s]; found { + for _, ms := range mss { //get all the msig singer has + if mpv, found := msigPendingVotes[ms]; found { //other signers of the multisig have voted, yet the threshold has not met + if v == APPROVE { + if mpv.ApproveCount+1 == mpv.Multisig.Threshold { //met threshold + approveVote += 1 + approveBalance = types.BigAdd(approveBalance, mpv.Multisig.Balance) + msigFinalVotes += 1 + delete(msigPendingVotes, ms) //threshold, can skip later signer votes } else { - mv.RejectionSigners = append(mv.RejectionSigners, v.SignerAddress) - } - //check if threshold meet - if uint64(len(mv.AcceptanceSingers)) == m.Threshold { - delete(msigPendingVotes, m.ID) - msigFinalVotes[m.ID] = mv - acceptanceBalance = types.BigAdd(acceptanceBalance, m.Balance) - } else if uint64(len(mv.RejectionSigners)) == m.Threshold { - delete(msigPendingVotes, m.ID) - msigFinalVotes[m.ID] = mv - rejectionBalance = types.BigAdd(rejectionBalance, m.Balance) - } else { - msigPendingVotes[m.ID] = mv + mpv.ApproveCount += 1 + msigPendingVotes[ms] = mpv } } else { - n := msigVote{ - Multisig: m, - } - if v.OptionID == APPROVE { - n.AcceptanceSingers = append(n.AcceptanceSingers, v.SignerAddress) + if mpv.RejectCount+1 == mpv.Multisig.Threshold { //met threshold + rejectionVote += 1 + rejectionBalance = types.BigAdd(rejectionBalance, mpv.Multisig.Balance) + msigFinalVotes += 1 + delete(msigPendingVotes, ms) //threshold, can skip later signer votes } else { - n.RejectionSigners = append(n.RejectionSigners, v.SignerAddress) + mpv.RejectCount += 1 + msigPendingVotes[ms] = mpv } + } + } else { //first vote received from one of the signers of the msig + msa, err := tree.GetActor(ms) + if err != nil { + return fmt.Errorf("load msig actor failed %v", err) + } + msas, err := multisig.Load(store, msa) + if err != nil { + return fmt.Errorf("load msig failed %v", err) - //check if threshold meet - if uint64(len(mv.AcceptanceSingers)) == m.Threshold { - delete(msigPendingVotes, m.ID) - msigFinalVotes[m.ID] = mv - acceptanceBalance = types.BigAdd(acceptanceBalance, m.Balance) - } else if uint64(len(mv.RejectionSigners)) == m.Threshold { - delete(msigPendingVotes, m.ID) - msigFinalVotes[m.ID] = mv - rejectionBalance = types.BigAdd(rejectionBalance, m.Balance) + } + t, _ := msas.Threshold() + if t == 1 { //met threshold with this signer's single vote + if v == APPROVE { + approveVote += 1 + approveBalance = types.BigAdd(approveBalance, msa.Balance) } else { - msigPendingVotes[m.ID] = mv + rejectionVote += 1 + rejectionBalance = types.BigAdd(rejectionBalance, msa.Balance) + } + msigFinalVotes += 1 + } else { //threshold not met, add to pending vote + if v == APPROVE { + msigPendingVotes[ms] = msigVote{ + Multisig: msigBriefInfo{ + Balance: msa.Balance, + Threshold: t, + }, + ApproveCount: 1, + } + } else { + msigPendingVotes[ms] = msigVote{ + Multisig: msigBriefInfo{ + Balance: msa.Balance, + Threshold: t, + }, + RejectCount: 1, + } } } } @@ -593,17 +612,41 @@ var tokenHolderCmd = &cli.Command{ } } - fmt.Printf("\nTotal amount of singers: %v\n ", len(votes)) - fmt.Printf("Total amount of valid multisig vote: %v\n ", len(msigFinalVotes)) - fmt.Printf("Total balance: %v\n", types.BigAdd(acceptanceBalance, rejectionBalance).String()) - fmt.Printf("Option (#): %v\n", acceptanceVote) + // add miner available balance + mvs, err := getStorageMinerVotes(tree, vm, store) + if err != nil { + return xerrors.Errorf("fail to get storage miner vote ", err) + } + + spApproveAvailableBalance := abi.NewTokenAmount(0) + spRejectionAvailableBalance := abi.NewTokenAmount(0) + for _, mv := range mvs { + if mv.Option == APPROVE { + approveVote += 1 + approveBalance = types.BigAdd(approveBalance, mv.AvailableBalance) + spApproveAvailableBalance = types.BigAdd(approveBalance, spApproveAvailableBalance) + } else if mv.Option == Reject { + rejectionVote += 1 + rejectionBalance = types.BigAdd(rejectionBalance, mv.AvailableBalance) + spRejectionAvailableBalance = types.BigAdd(rejectionBalance, spRejectionAvailableBalance) + } else { + continue + } + } + + fmt.Printf("\nTotal amount of singers: %v\n ", len(vm)) + fmt.Printf("Total amount of valid multisig vote: %v\n ", msigFinalVotes) + fmt.Printf("Total balance: %v\n", types.BigAdd(approveBalance, rejectionBalance).String()) + fmt.Printf("Approve (#): %v\n", approveVote) fmt.Printf("Reject (#): %v\n", rejectionVote) - fmt.Printf("Option (FIL): %v\n", acceptanceBalance.String()) + fmt.Printf("Approve (FIL): %v\n", approveBalance.String()) fmt.Printf("Reject (FIL): %v\n", rejectionBalance.String()) - av := types.BigDivFloat(acceptanceBalance, types.BigAdd(acceptanceBalance, rejectionBalance)) - rv := types.BigDivFloat(rejectionBalance, types.BigAdd(rejectionBalance, acceptanceBalance)) + fmt.Printf("Approve - Storage Miner Portion (FIL in account): %v\n", spApproveAvailableBalance.String()) + fmt.Printf("Reject - Storage Miner Portion (FIL in account): %v\n", spRejectionAvailableBalance.String()) + av := types.BigDivFloat(approveBalance, types.BigAdd(approveBalance, rejectionBalance)) + rv := types.BigDivFloat(rejectionBalance, types.BigAdd(rejectionBalance, approveBalance)) if av > 0.05 { - fmt.Printf("Token Holder Group Result: Pass. approve: %.5f, reject: %.5f\n", av, rv) + fmt.Printf("Token Holder Group Result: Pass. approve: %.5f, reject: %.5f,\n", av, rv) } else { fmt.Printf("Token Holder Group Result: Not Pass. approve: %.5f, reject: %.5f\n", av, rv) } @@ -613,7 +656,7 @@ var tokenHolderCmd = &cli.Command{ var clientCmd = &cli.Command{ Name: "client", - Usage: "get poll result for client", + Usage: "get poll result for client, weighted by deal bytes that are in valid deals in the storage market.", ArgsUsage: "[state root]", Flags: []cli.Flag{ &cli.StringFlag{ @@ -677,12 +720,12 @@ var clientCmd = &cli.Command{ return err } - //get all the votes' singer address && their vote + //get all the votes' singer ID address && their voted option vj, err := homedir.Expand(cctx.Args().Get(1)) if err != nil { return xerrors.Errorf("fail to get votes json") } - votes, err := getVoters(vj) + vm, err := getVotesMap(vj, tree) if err != nil { return xerrors.Errorf("fail to get votesrs: ", err) } @@ -713,37 +756,29 @@ var clientCmd = &cli.Command{ return xerrors.Errorf("fail to get deals") } - acceptanceBytes := abi.PaddedPieceSize(0) + approveBytes := abi.PaddedPieceSize(0) rejectionBytes := abi.PaddedPieceSize(0) - acceptanceCount := 0 + approveCount := 0 rejectionCount := 0 - for _, v := range votes { - if err != nil { - return xerrors.Errorf("fail to get account account for signer: ", v.SignerAddress) - } - ai, err := tree.LookupID(v.SignerAddress) - if err != nil { - return xerrors.Errorf("cannot resolve singer: ", ai) - } - - if ds, found := cds[ai]; found { - if v.OptionID == APPROVE { - acceptanceBytes += ds - acceptanceCount += 1 + for s, o := range vm { + if ds, found := cds[s]; found { + if o == APPROVE { + approveBytes += ds + approveCount += 1 } else { rejectionBytes += ds rejectionCount += 1 } } } - fmt.Printf("\nTotal amount of clients: %v\n", acceptanceCount+rejectionCount) - fmt.Printf("Total deal bytes: %v\n", acceptanceBytes+rejectionBytes) - fmt.Printf("Accept (#): %v\n", acceptanceCount) + fmt.Printf("\nTotal amount of clients: %v\n", approveCount+rejectionCount) + fmt.Printf("Total deal bytes: %v\n", approveBytes+rejectionBytes) + fmt.Printf("Approve (#): %v\n", approveCount) fmt.Printf("Reject (#): %v\n", rejectionCount) - fmt.Printf("Accept (byte): %v\n", acceptanceBytes) + fmt.Printf("Approve (byte): %v\n", approveBytes) fmt.Printf("Reject (byte): %v\n", rejectionBytes) - av := float64(acceptanceBytes) / float64(acceptanceBytes+rejectionBytes) - rv := float64(rejectionBytes) / float64(acceptanceBytes+rejectionBytes) + av := float64(approveBytes) / float64(approveBytes+rejectionBytes) + rv := float64(rejectionBytes) / float64(approveBytes+rejectionBytes) if av > 0.05 { fmt.Printf("Deal Client Group Result: Pass. approve: %.5f, reject: %.5f\n", av, rv) } else { diff --git a/cmd/lotus-shed/main.go b/cmd/lotus-shed/main.go index 19549c36e..cb521440b 100644 --- a/cmd/lotus-shed/main.go +++ b/cmd/lotus-shed/main.go @@ -74,7 +74,7 @@ func main() { diffCmd, itestdCmd, msigCmd, - fip0036PollResultcmd, + fip36PollCmd, } app := &cli.App{ From 9535009e4660e0031c27ba5863bd8a4443893e7a Mon Sep 17 00:00:00 2001 From: Aayush Date: Tue, 27 Sep 2022 16:58:25 -0400 Subject: [PATCH 13/43] fix: singer -> signer --- cmd/lotus-shed/fip-0036.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/cmd/lotus-shed/fip-0036.go b/cmd/lotus-shed/fip-0036.go index f5d4e66fa..874309693 100644 --- a/cmd/lotus-shed/fip-0036.go +++ b/cmd/lotus-shed/fip-0036.go @@ -95,7 +95,7 @@ func getVotesMap(file string, st *state.StateTree) (map[address.Address]uint64 / return vm, nil } -func getAllMsigSingerMap(st *state.StateTree, store adt.Store) (map[address.Address][]address.Address /*map[Singer ID address]msigActorId[]*/, error) { +func getAllMsigSignerMap(st *state.StateTree, store adt.Store) (map[address.Address][]address.Address /*map[Signer ID address]msigActorId[]*/, error) { sm := make(map[address.Address][]address.Address) err := st.ForEach(func(addr address.Address, act *types.Actor) error { if builtin.IsMultisigActor(act.Code) { @@ -345,7 +345,7 @@ var spRBPAndDealCmd = &cli.Command{ return err } - //get all the votes' singer ID address && their vote + //get all the votes' signer ID address && their vote vj, err := homedir.Expand(cctx.Args().Get(1)) if err != nil { return xerrors.Errorf("fail to get votes json") @@ -509,7 +509,7 @@ var tokenHolderCmd = &cli.Command{ return err } - //get all the votes' singer address && their vote + //get all the votes' signer address && their vote vj, err := homedir.Expand(cctx.Args().Get(1)) if err != nil { return xerrors.Errorf("fail to get votes json") @@ -519,8 +519,8 @@ var tokenHolderCmd = &cli.Command{ return xerrors.Errorf("fail to get voter map ", err) } - //get all the msig singers & their msigs - msigs, err := getAllMsigSingerMap(tree, store) + //get all the msig signers & their msigs + msigs, err := getAllMsigSignerMap(tree, store) approveVote := 0 rejectionVote := 0 @@ -545,7 +545,7 @@ var tokenHolderCmd = &cli.Command{ //process msigs if mss, found := msigs[s]; found { - for _, ms := range mss { //get all the msig singer has + for _, ms := range mss { //get all the msig signer has if mpv, found := msigPendingVotes[ms]; found { //other signers of the multisig have voted, yet the threshold has not met if v == APPROVE { if mpv.ApproveCount+1 == mpv.Multisig.Threshold { //met threshold @@ -634,7 +634,7 @@ var tokenHolderCmd = &cli.Command{ } } - fmt.Printf("\nTotal amount of singers: %v\n ", len(vm)) + fmt.Printf("\nTotal amount of signer: %v\n ", len(vm)) fmt.Printf("Total amount of valid multisig vote: %v\n ", msigFinalVotes) fmt.Printf("Total balance: %v\n", types.BigAdd(approveBalance, rejectionBalance).String()) fmt.Printf("Approve (#): %v\n", approveVote) @@ -720,7 +720,7 @@ var clientCmd = &cli.Command{ return err } - //get all the votes' singer ID address && their voted option + //get all the votes' signer ID address && their voted option vj, err := homedir.Expand(cctx.Args().Get(1)) if err != nil { return xerrors.Errorf("fail to get votes json") From 87597cbc33690b567fb4de04f87cfec852386b68 Mon Sep 17 00:00:00 2001 From: Aayush Date: Tue, 27 Sep 2022 20:48:30 -0400 Subject: [PATCH 14/43] unify fip0036 shed commands for speed --- cmd/lotus-shed/fip-0036.go | 1218 +++++++++++++++--------------------- 1 file changed, 497 insertions(+), 721 deletions(-) diff --git a/cmd/lotus-shed/fip-0036.go b/cmd/lotus-shed/fip-0036.go index 874309693..dc5bdef97 100644 --- a/cmd/lotus-shed/fip-0036.go +++ b/cmd/lotus-shed/fip-0036.go @@ -6,43 +6,39 @@ import ( "fmt" "io" "io/ioutil" + "strconv" - "github.com/urfave/cli/v2" - - "github.com/filecoin-project/go-address" - "github.com/mitchellh/go-homedir" - - "github.com/filecoin-project/lotus/chain/actors/builtin/power" - - "github.com/filecoin-project/lotus/chain/actors/builtin/miner" - - "github.com/filecoin-project/lotus/chain/actors/builtin/market" - - "github.com/filecoin-project/go-state-types/abi" - - "github.com/filecoin-project/lotus/chain/consensus/filcns" - "github.com/filecoin-project/lotus/chain/store" "github.com/ipfs/go-cid" cbor "github.com/ipfs/go-ipld-cbor" + "github.com/mitchellh/go-homedir" + "github.com/urfave/cli/v2" + cbg "github.com/whyrusleeping/cbor-gen" + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/lotus/chain/actors/adt" - "github.com/filecoin-project/lotus/node/repo" - - "github.com/filecoin-project/lotus/chain/state" - "github.com/filecoin-project/lotus/chain/actors/builtin" + _init "github.com/filecoin-project/lotus/chain/actors/builtin/init" + "github.com/filecoin-project/lotus/chain/actors/builtin/market" + "github.com/filecoin-project/lotus/chain/actors/builtin/miner" "github.com/filecoin-project/lotus/chain/actors/builtin/multisig" + "github.com/filecoin-project/lotus/chain/actors/builtin/power" + "github.com/filecoin-project/lotus/chain/consensus/filcns" + "github.com/filecoin-project/lotus/chain/state" + "github.com/filecoin-project/lotus/chain/store" "github.com/filecoin-project/lotus/chain/types" - - "golang.org/x/xerrors" + "github.com/filecoin-project/lotus/node/repo" ) const APPROVE = 49 const Reject = 50 type Vote struct { - OptionID uint64 `json: "optionId"` - SignerAddress address.Address `json: "signerAddress"` + OptionID uint64 + SignerAddress address.Address } type msigVote struct { @@ -65,11 +61,484 @@ var fip36PollCmd = &cli.Command{ }, }, Subcommands: []*cli.Command{ - spRBPAndDealCmd, - clientCmd, - tokenHolderCmd, - //coreDevCmd, - //finalResultCmd, + finalResultCmd, + }, +} + +var finalResultCmd = &cli.Command{ + Name: "results", + Usage: "get poll results", + ArgsUsage: "[state root] [height] [votes json]", + Flags: []cli.Flag{ + &cli.StringFlag{ + Name: "repo", + Value: "~/.lotus", + }, + }, + + Action: func(cctx *cli.Context) error { + if cctx.NArg() != 3 { + return xerrors.New("filpoll0036 results [state root] [height] [votes.json]") + } + + ctx := context.TODO() + if !cctx.Args().Present() { + return fmt.Errorf("must pass state root") + } + + sroot, err := cid.Decode(cctx.Args().First()) + if err != nil { + return fmt.Errorf("failed to parse input: %w", err) + } + + fsrepo, err := repo.NewFS(cctx.String("repo")) + if err != nil { + return err + } + + lkrepo, err := fsrepo.Lock(repo.FullNode) + if err != nil { + return err + } + + defer lkrepo.Close() //nolint:errcheck + + bs, err := lkrepo.Blockstore(ctx, repo.UniversalBlockstore) + if err != nil { + return fmt.Errorf("failed to open blockstore: %w", err) + } + + defer func() { + if c, ok := bs.(io.Closer); ok { + if err := c.Close(); err != nil { + log.Warnf("failed to close blockstore: %s", err) + } + } + }() + + mds, err := lkrepo.Datastore(context.Background(), "/metadata") + if err != nil { + return err + } + + cs := store.NewChainStore(bs, bs, mds, filcns.Weight, nil) + defer cs.Close() //nolint:errcheck + + cst := cbor.NewCborStore(bs) + store := adt.WrapStore(ctx, cst) + + st, err := state.LoadStateTree(cst, sroot) + if err != nil { + return err + } + + height, err := strconv.Atoi(cctx.Args().Get(1)) + if err != nil { + return err + } + + //get all the votes' signer ID address && their vote + vj, err := homedir.Expand(cctx.Args().Get(2)) + if err != nil { + return xerrors.Errorf("fail to get votes json") + } + votes, err := getVotesMap(vj, st) + if err != nil { + return xerrors.Errorf("failed to get voters: ", err) + } + + type minerBriefInfo struct { + rawBytePower abi.StoragePower + dealPower abi.StoragePower + balance abi.TokenAmount + } + + // power actor + pa, err := st.GetActor(power.Address) + if err != nil { + return xerrors.Errorf("failed to get power actor: \n", err) + } + + powerState, err := power.Load(store, pa) + if err != nil { + return xerrors.Errorf("failed to get power state: \n", err) + } + + //market actor + ma, err := st.GetActor(market.Address) + if err != nil { + return xerrors.Errorf("fail to get market actor: ", err) + } + + marketState, err := market.Load(store, ma) + if err != nil { + return xerrors.Errorf("fail to load market state: ", err) + } + + //init actor + ia, err := st.GetActor(_init.Address) + if err != nil { + return xerrors.Errorf("fail to get init actor: ", err) + } + + initState, err := _init.Load(store, ia) + if err != nil { + return xerrors.Errorf("fail to load init state: ", err) + } + + initMap, err := initState.AddressMap() + if err != nil { + return xerrors.Errorf("fail to load init map: ", err) + } + + lookupId := func(addr address.Address) address.Address { + if addr.Protocol() == address.ID { + return addr + } + + var actorID cbg.CborInt + if found, err := initMap.Get(abi.AddrKey(addr), &actorID); err != nil { + panic(err) + } else if found { + // Reconstruct address from the ActorID. + idAddr, err := address.NewIDAddress(uint64(actorID)) + if err != nil { + panic(err) + } + return idAddr + } + + panic("didn't find addr") + } + + // we need to build several pieces of information, as we traverse the state tree: + // a map of accounts to every msig that they are a signer of + accountsToMultisigs := make(map[address.Address][]address.Address) + // a map of multisigs to some info about them for quick lookup + msigActorsInfo := make(map[address.Address]msigBriefInfo) + // a map of accounts to every miner that they are an owner of + ownerMap := make(map[address.Address][]address.Address) + // a map of accounts to every miner that they are a worker of + workerMap := make(map[address.Address][]address.Address) + // a map of miners to some info aboout them for quick lookup + minerActorsInfo := make(map[address.Address]minerBriefInfo) + // a map of client addresses to deal data stored in proposals + clientToDealStorage := make(map[address.Address]abi.StoragePower) + + fmt.Println("iterating over all actors") + count := 0 + err = st.ForEach(func(addr address.Address, act *types.Actor) error { + if count%200000 == 0 { + fmt.Println("processed ", count, " actors building maps") + } + count++ + if builtin.IsMultisigActor(act.Code) { + ms, err := multisig.Load(store, act) + if err != nil { + return fmt.Errorf("load msig failed %v", err) + + } + + // TODO: Confirm that these are always ID addresses + signers, err := ms.Signers() + if err != nil { + return xerrors.Errorf("fail to get msig signers", err) + } + for _, s := range signers { + signerId := lookupId(s) + if m, found := accountsToMultisigs[signerId]; found { //add msig id to signer's collection + m = append(m, addr) + accountsToMultisigs[signerId] = m + } else { + n := []address.Address{addr} + accountsToMultisigs[signerId] = n + } + } + + locked, err := ms.LockedBalance(abi.ChainEpoch(height)) + if err != nil { + return xerrors.Errorf("failed to compute locked multisig balance: %w", err) + } + + threshold, _ := ms.Threshold() + info := msigBriefInfo{ + ID: addr, + Signer: signers, + Balance: big.Min(big.Zero(), types.BigSub(act.Balance, locked)), + Threshold: threshold, + } + msigActorsInfo[addr] = info + } + + if builtin.IsStorageMinerActor(act.Code) { + m, err := miner.Load(store, act) + if err != nil { + return xerrors.Errorf("fail to load miner actor: \n", err) + } + + info, err := m.Info() + if err != nil { + return xerrors.Errorf("fail to get miner info: \n", err) + } + + ownerId := lookupId(info.Owner) + if m, found := ownerMap[ownerId]; found { //add miner id to owner list + m = append(m, addr) + ownerMap[ownerId] = m + } else { + n := []address.Address{addr} + ownerMap[ownerId] = n + } + + workerId := lookupId(info.Worker) + if m, found := workerMap[workerId]; found { //add miner id to worker list + m = append(m, addr) + workerMap[workerId] = m + } else { + n := []address.Address{addr} + workerMap[workerId] = n + } + + bal, err := m.AvailableBalance(act.Balance) + if err != nil { + return err + } + + pow, ok, err := powerState.MinerPower(addr) + if err != nil { + return err + } + + if !ok { + pow.RawBytePower = big.Zero() + } + + minerActorsInfo[addr] = minerBriefInfo{ + rawBytePower: pow.RawBytePower, + // gets added up outside this loop + dealPower: big.Zero(), + balance: bal, + } + } + + return nil + }) + + if err != nil { + return err + } + + fmt.Println("iterating over proposals") + dps, _ := marketState.Proposals() + if err := dps.ForEach(func(dealID abi.DealID, d market.DealProposal) error { + clientId := lookupId(d.Client) + if cd, found := clientToDealStorage[clientId]; found { + clientToDealStorage[clientId] = big.Add(cd, big.NewInt(int64(d.PieceSize))) + } else { + clientToDealStorage[clientId] = big.NewInt(int64(d.PieceSize)) + } + + providerId := lookupId(d.Provider) + mai, found := minerActorsInfo[providerId] + + if !found { + return xerrors.Errorf("didn't find miner %s", providerId) + } + + mai.dealPower = big.Add(mai.dealPower, big.NewInt(int64(d.PieceSize))) + minerActorsInfo[providerId] = mai + return nil + }); err != nil { + return xerrors.Errorf("fail to get deals") + } + + // now tabulate votes + + approveBalance := abi.NewTokenAmount(0) + rejectionBalance := abi.NewTokenAmount(0) + clientApproveBytes := big.Zero() + clientRejectBytes := big.Zero() + msigPendingVotes := make(map[address.Address]msigVote) //map[msig ID]msigVote + votedMsigs := make(map[address.Address]struct{}) + votesIncludingMsigs := make(map[address.Address]uint64) + fmt.Println("counting account and multisig votes") + for signer, v := range votes { + signerId := lookupId(signer) + //process votes for regular accounts + accountActor, err := st.GetActor(signerId) + if err != nil { + return xerrors.Errorf("fail to get account account for signer: ", err) + } + + clientBytes, ok := clientToDealStorage[signerId] + if !ok { + clientBytes = big.Zero() + } + + if v == APPROVE { + approveBalance = types.BigAdd(approveBalance, accountActor.Balance) + votesIncludingMsigs[signerId] = APPROVE + clientApproveBytes = big.Add(clientApproveBytes, clientBytes) + } else { + rejectionBalance = types.BigAdd(rejectionBalance, accountActor.Balance) + votesIncludingMsigs[signerId] = Reject + clientRejectBytes = big.Add(clientRejectBytes, clientBytes) + } + + //process msigs + // TODO: Oh god, oh god, there's a possibility that a multisig has voted in both directions + // and we'll pick a winner non-deterministically as we iterate... + // We need to factor in vote time if that happens and pick whoever went first + if mss, found := accountsToMultisigs[signerId]; found { + for _, ms := range mss { //get all the msig signer has + if _, ok := votedMsigs[ms]; ok { + // msig has already voted, skip + continue + } + if mpv, found := msigPendingVotes[ms]; found { //other signers of the multisig have voted, yet the threshold has not met + if v == APPROVE { + if mpv.ApproveCount+1 == mpv.Multisig.Threshold { //met threshold + approveBalance = types.BigAdd(approveBalance, mpv.Multisig.Balance) + delete(msigPendingVotes, ms) //threshold, can skip later signer votes + votedMsigs[ms] = struct{}{} + votesIncludingMsigs[ms] = APPROVE + + } else { + mpv.ApproveCount++ + msigPendingVotes[ms] = mpv + } + } else { + if mpv.RejectCount+1 == mpv.Multisig.Threshold { //met threshold + rejectionBalance = types.BigAdd(rejectionBalance, mpv.Multisig.Balance) + delete(msigPendingVotes, ms) //threshold, can skip later signer votes + votedMsigs[ms] = struct{}{} + votesIncludingMsigs[ms] = Reject + + } else { + mpv.RejectCount++ + msigPendingVotes[ms] = mpv + } + } + } else { //first vote received from one of the signers of the msig + msi, ok := msigActorsInfo[ms] + if !ok { + return xerrors.Errorf("didn't find msig %s in msig map", ms) + } + + if msi.Threshold == 1 { //met threshold with this signer's single vote + if v == APPROVE { + approveBalance = types.BigAdd(approveBalance, msi.Balance) + votesIncludingMsigs[ms] = APPROVE + + } else { + rejectionBalance = types.BigAdd(rejectionBalance, msi.Balance) + votesIncludingMsigs[ms] = Reject + } + votedMsigs[ms] = struct{}{} + } else { //threshold not met, add to pending vote + if v == APPROVE { + msigPendingVotes[ms] = msigVote{ + Multisig: msi, + ApproveCount: 1, + } + } else { + msigPendingVotes[ms] = msigVote{ + Multisig: msi, + RejectCount: 1, + } + } + } + } + } + } + } + + // time to process miners based on what we know about votesIncludingMsigs + minerVotes := make(map[address.Address]uint64) + fmt.Println("counting miner votes") + for s, v := range votes { + if minerInfos, found := ownerMap[s]; found { + for _, minerInfo := range minerInfos { + minerVotes[minerInfo] = v + } + } + if minerInfos, found := workerMap[s]; found { + for _, minerInfo := range minerInfos { + if _, ok := minerVotes[minerInfo]; !ok { + minerVotes[minerInfo] = v + } + } + } + } + + approveRBP := big.Zero() + approveDealPower := big.Zero() + rejectionRBP := big.Zero() + rejectionDealPower := big.Zero() + fmt.Println("adding up miner votes") + for minerAddr, vote := range minerVotes { + mbi, ok := minerActorsInfo[minerAddr] + if !ok { + return xerrors.Errorf("failed to find miner info for %s", minerAddr) + } + + if vote == APPROVE { + approveBalance = big.Add(approveBalance, mbi.balance) + approveRBP = big.Add(approveRBP, mbi.rawBytePower) + approveDealPower = big.Add(approveDealPower, mbi.dealPower) + } else { + rejectionBalance = big.Add(rejectionBalance, mbi.balance) + rejectionRBP = big.Add(rejectionRBP, mbi.rawBytePower) + rejectionDealPower = big.Add(rejectionDealPower, mbi.dealPower) + } + } + + fmt.Println("Total acceptance token: ", approveBalance) + fmt.Println("Total rejection token: ", rejectionBalance) + + fmt.Println("Total acceptance SP deal power: ", approveDealPower) + fmt.Println("Total rejection SP deal power: ", rejectionDealPower) + + fmt.Println("Total acceptance SP rb power: ", approveRBP) + fmt.Println("Total rejection SP rb power: ", rejectionRBP) + + fmt.Println("Total acceptance Client rb power: ", clientApproveBytes) + fmt.Println("Total rejection Client rb power: ", clientRejectBytes) + + fmt.Println("\n\nFinal results **drumroll**") + if rejectionBalance.GreaterThanEqual(big.Mul(approveBalance, big.NewInt(2))) { + fmt.Println("token holders VETO FIP-0036!!!") + } else if approveBalance.LessThanEqual(rejectionBalance) { + fmt.Println("token holders REJECT FIP-0036 :(") + } else { + fmt.Println("token holders ACCEPT FIP-0036 :)") + } + + if rejectionDealPower.GreaterThanEqual(big.Mul(approveDealPower, big.NewInt(2))) { + fmt.Println("SPs by deall data stored VETO FIP-0036!!!") + } else if approveDealPower.LessThanEqual(rejectionDealPower) { + fmt.Println("SPs by deal data stored REJECT FIP-0036 :(") + } else { + fmt.Println("SPs by deal data stored ACCEPT FIP-0036 :)") + } + + if rejectionRBP.GreaterThanEqual(big.Mul(approveRBP, big.NewInt(2))) { + fmt.Println("SPs by total raw byte power VETO FIP-0036!!!") + } else if approveRBP.LessThanEqual(rejectionRBP) { + fmt.Println("SPs by total raw byte power REJECT FIP-0036 :(") + } else { + fmt.Println("SPs by total raw byte power ACCEPT FIP-0036 :)") + } + + if clientRejectBytes.GreaterThanEqual(big.Mul(clientApproveBytes, big.NewInt(2))) { + fmt.Println("Storage Clients VETO FIP-0036!!!") + } else if clientApproveBytes.LessThanEqual(clientRejectBytes) { + fmt.Println("Storage Clients REJECT FIP-0036 :(") + } else { + fmt.Println("Storage Clients ACCEPT FIP-0036 :)") + } + + return nil }, } @@ -94,696 +563,3 @@ func getVotesMap(file string, st *state.StateTree) (map[address.Address]uint64 / } return vm, nil } - -func getAllMsigSignerMap(st *state.StateTree, store adt.Store) (map[address.Address][]address.Address /*map[Signer ID address]msigActorId[]*/, error) { - sm := make(map[address.Address][]address.Address) - err := st.ForEach(func(addr address.Address, act *types.Actor) error { - if builtin.IsMultisigActor(act.Code) { - ms, err := multisig.Load(store, act) - if err != nil { - return fmt.Errorf("load msig failed %v", err) - - } - - ss, err := ms.Signers() - if err != nil { - return xerrors.Errorf("fail to get msig signers", err) - } - for _, s := range ss { - if m, found := sm[s]; found { //add msig id to signer's collection - m = append(m, addr) - sm[s] = m - } else { - n := []address.Address{addr} - sm[s] = n - } - } - } - return nil - }) - if err != nil { - return nil, err - } - return sm, nil -} - -func getAllMsigIDMap(st *state.StateTree, store adt.Store) (map[address.Address]msigBriefInfo /*map[Multisig Actor ID]msigBriefInfo*/, error) { - - msigActorsInfo := make(map[address.Address]msigBriefInfo) - err := st.ForEach(func(addr address.Address, act *types.Actor) error { - if builtin.IsMultisigActor(act.Code) { - ms, err := multisig.Load(store, act) - if err != nil { - return fmt.Errorf("load msig failed %v", err) - - } - - signers, _ := ms.Signers() - threshold, _ := ms.Threshold() - info := msigBriefInfo{ - ID: addr, - Signer: signers, - Balance: act.Balance, - Threshold: threshold, - } - msigActorsInfo[addr] = info - } - return nil - }) - if err != nil { - return nil, err - } - return msigActorsInfo, nil -} - -type MinerVoteInfo struct { - AvailableBalance abi.TokenAmount - DealBytes abi.PaddedPieceSize - RBP abi.StoragePower - Option uint64 -} - -func getStorageMinerRBP(miner address.Address, st *state.StateTree, store adt.Store) (abi.StoragePower, error) { - pa, err := st.GetActor(power.Address) - if err != nil { - return types.NewInt(0), xerrors.Errorf("failed to get power actor: \n", err) - } - - ps, err := power.Load(store, pa) - if err != nil { - return types.NewInt(0), xerrors.Errorf("failed to get power state: \n", err) - } - - mp, _, err := ps.MinerPower(miner) - if err != nil { - return types.NewInt(0), xerrors.Errorf("failed to get miner power: \n", err) - } - - return mp.RawBytePower, nil -} - -func getStorageMinerVotes(st *state.StateTree, votes map[address.Address]uint64, store adt.Store) (map[address.Address]MinerVoteInfo /*map[Storage Miner Actor]Option*/, error) { - smv := make(map[address.Address]MinerVoteInfo) - msigs, err := getAllMsigIDMap(st, store) - if err != nil { - xerrors.Errorf("fail to get msigs", err) - } - err = st.ForEach(func(addr address.Address, act *types.Actor) error { - if builtin.IsStorageMinerActor(act.Code) { - m, err := miner.Load(store, act) - if err != nil { - return xerrors.Errorf("fail to load miner actor: \n", err) - } - - info, err := m.Info() - if err != nil { - return xerrors.Errorf("fail to get miner info: \n", err) - } - //check if owner voted - o := info.Owner - if v, found := votes[o]; found { - //check if owner is msig - if ms, found := msigs[o]; found { //owner is a msig - ac := uint64(0) - rc := uint64(0) - for _, s := range ms.Signer { - if v, found := votes[s]; found { - if v == APPROVE { - ac += 1 - } else { - rc += 1 - } - } - mp, err := getStorageMinerRBP(addr, st, store) - if err != nil { - return xerrors.Errorf("fail to get miner actor rbp", err) - } - m := MinerVoteInfo{ - AvailableBalance: act.Balance, - RBP: mp, - } - - //check if msig threshold is met for casting the vote - if ac == ms.Threshold { - m.Option = APPROVE - smv[addr] = m - } else if rc == ms.Threshold { - m.Option = Reject - smv[addr] = m - } else { - smv[addr] = m //no valid vote yet, option value should be 0 - } - } - } else { //owner is a regular wallet account - mp, err := getStorageMinerRBP(addr, st, store) - if err != nil { - return xerrors.Errorf("fail to get miner actor rbp", err) - } - m := MinerVoteInfo{ - AvailableBalance: act.Balance, - RBP: mp, - Option: v, - } - smv[addr] = m - } - } - - //check if owner has not voted but worker voted - if _, found := smv[addr]; !found { - w := info.Worker - if v, found := votes[w]; found { - mp, err := getStorageMinerRBP(addr, st, store) - if err != nil { - return xerrors.Errorf("fail to get miner actor rbp", err) - } - m := MinerVoteInfo{ - AvailableBalance: act.Balance, - RBP: mp, - Option: v, - } - smv[addr] = m - } - } - } - return nil - }) - if err != nil { - return nil, err - } - return smv, nil -} - -var spRBPAndDealCmd = &cli.Command{ - Name: "sp", - Usage: "get poll result for storage group. Weighted by RBP(raw byte power) and deal bytes stored in valid deals." + - "\nNote that: if both owner key and worker key has voted, the vote made by owner key will be casted the storage provider actor.", - ArgsUsage: "[state root]", - Flags: []cli.Flag{ - &cli.StringFlag{ - Name: "repo", - Value: "~/.lotus", - }, - &cli.BoolFlag{ - Name: "rbp-only", - Value: false, - }, - }, - - Action: func(cctx *cli.Context) error { - if cctx.NArg() != 2 { - return xerrors.New("filpoll0036 token-holder [state root] [votes.json]") - } - - ctx := context.TODO() - if !cctx.Args().Present() { - return fmt.Errorf("must pass state root") - } - - sroot, err := cid.Decode(cctx.Args().First()) - if err != nil { - return fmt.Errorf("failed to parse input: %w", err) - } - - fsrepo, err := repo.NewFS(cctx.String("repo")) - if err != nil { - return err - } - - lkrepo, err := fsrepo.Lock(repo.FullNode) - if err != nil { - return err - } - - defer lkrepo.Close() //nolint:errcheck - - bs, err := lkrepo.Blockstore(ctx, repo.UniversalBlockstore) - if err != nil { - return fmt.Errorf("failed to open blockstore: %w", err) - } - - defer func() { - if c, ok := bs.(io.Closer); ok { - if err := c.Close(); err != nil { - log.Warnf("failed to close blockstore: %s", err) - } - } - }() - - mds, err := lkrepo.Datastore(context.Background(), "/metadata") - if err != nil { - return err - } - - cs := store.NewChainStore(bs, bs, mds, filcns.Weight, nil) - defer cs.Close() //nolint:errcheck - - cst := cbor.NewCborStore(bs) - store := adt.WrapStore(ctx, cst) - - tree, err := state.LoadStateTree(cst, sroot) - if err != nil { - return err - } - - //get all the votes' signer ID address && their vote - vj, err := homedir.Expand(cctx.Args().Get(1)) - if err != nil { - return xerrors.Errorf("fail to get votes json") - } - votes, err := getVotesMap(vj, tree) - if err != nil { - return xerrors.Errorf("fail to get votesrs: ", err) - } - - //get all storage miner votes - smv, err := getStorageMinerVotes(tree, votes, store) - if err != nil { - return xerrors.Errorf("fail to get storage miner votes", err) - } - approveVote := 0 - rejectionVote := 0 - approveRBP := abi.NewStoragePower(0) - rejectRBP := abi.NewStoragePower(0) - approveDealBytes := abi.PaddedPieceSize(0) - rejectDealBytes := abi.PaddedPieceSize(0) - ownerMsigUnderThreshold := 0 - - //get all market proposals, add load the # of the bytes each provider has made - pds := make(map[address.Address]abi.PaddedPieceSize) - if !cctx.Bool("rbp-only") { - ma, err := tree.GetActor(market.Address) - if err != nil { - return xerrors.Errorf("fail to get market actor: ", err) - } - - ms, err := market.Load(store, ma) - if err != nil { - return xerrors.Errorf("fail to load market actor: ", err) - } - dps, _ := ms.Proposals() - if err := dps.ForEach(func(dealID abi.DealID, d market.DealProposal) error { - if pd, found := pds[d.Provider]; found { - s := d.PieceSize + pd - pds[d.Provider] = s - } else { - pds[d.Provider] = d.PieceSize - } - return xerrors.Errorf("fail to load deals") - }); err != nil { - return xerrors.Errorf("fail to get deals") - } - } - - //process the vote - for m, mvi := range smv { - if mvi.Option == APPROVE { - approveVote += 1 - approveRBP = types.BigAdd(approveRBP, mvi.RBP) - if d, found := pds[m]; !cctx.Bool("rbp-only") && found { - approveDealBytes += d - } - } else if mvi.Option == Reject { - rejectionVote += 1 - rejectRBP = types.BigAdd(rejectRBP, mvi.RBP) - if d, found := pds[m]; !cctx.Bool("rbp-only") && found { - rejectDealBytes += d - } - } else { //owner is msig and didnt reach threshold - ownerMsigUnderThreshold += 1 - } - } - fmt.Printf("\nTotal amount of storage provider: %v\n", len(smv)) - fmt.Printf("Approve (#): %v\n", approveVote) - fmt.Printf("Reject (#): %v\n", rejectionVote) - fmt.Printf("SP owner is multisig and the vote is invalid due to under threshold: %v\n", ownerMsigUnderThreshold) - fmt.Printf("Total RPB voted: %v\n", types.BigAdd(approveRBP, rejectRBP)) - fmt.Printf("Approve (rbp): %v\n", approveRBP) - fmt.Printf("Reject (rbp): %v\n", rejectRBP) - av := types.BigDivFloat(approveRBP, types.BigAdd(approveRBP, rejectRBP)) - rv := types.BigDivFloat(rejectRBP, types.BigAdd(approveRBP, rejectRBP)) - if av > 0.05 { - fmt.Printf("Storage Miner Group By RBP Result: Pass. approve: %.5f, reject: %.5f\n", av, rv) - } else { - fmt.Printf("Storage Miner Group By RBP Result: Not Pass. approve: %.5f, reject: %.5f\n", av, rv) - } - - if !cctx.Bool("rbp-only") { - fmt.Printf("Total deal bytes: %v\n", approveDealBytes+rejectDealBytes) - fmt.Printf("Approve (deal bytes): %v\n", approveDealBytes) - fmt.Printf("Reject (byte): %v\n", rejectDealBytes) - av := float64(approveDealBytes) / float64(approveDealBytes+rejectDealBytes) - rv := float64(rejectDealBytes) / float64(approveDealBytes+rejectDealBytes) - if av > 0.05 { - fmt.Printf("Storage Miner Group By Deal Bytes Result: Pass. approve: %.5f, reject: %.5f\n", av, rv) - } else { - fmt.Printf("Storage Miner Group By Deal Bytes: Not Pass. approve: %.5f, reject: %.5f\n", av, rv) - } - } - - return nil - }, -} -var tokenHolderCmd = &cli.Command{ - Name: "token-holder", - Usage: "get poll result for token holder group. balance includes, regular wallet accounts, multisig wallet that has valid vote that meets threshold, and the available balance of the storage miner actors that voted", - ArgsUsage: "[state root]", - Flags: []cli.Flag{ - &cli.StringFlag{ - Name: "repo", - Value: "~/.lotus", - }, - }, - Action: func(cctx *cli.Context) error { - if cctx.NArg() != 2 { - return xerrors.New("filpoll0036 token-holder [state root] [votes.json]") - } - - ctx := context.TODO() - if !cctx.Args().Present() { - return fmt.Errorf("must pass state root") - } - - sroot, err := cid.Decode(cctx.Args().First()) - if err != nil { - return fmt.Errorf("failed to parse input: %w", err) - } - - fsrepo, err := repo.NewFS(cctx.String("repo")) - if err != nil { - return err - } - - lkrepo, err := fsrepo.Lock(repo.FullNode) - if err != nil { - return err - } - - defer lkrepo.Close() //nolint:errcheck - - bs, err := lkrepo.Blockstore(ctx, repo.UniversalBlockstore) - if err != nil { - return fmt.Errorf("failed to open blockstore: %w", err) - } - - defer func() { - if c, ok := bs.(io.Closer); ok { - if err := c.Close(); err != nil { - log.Warnf("failed to close blockstore: %s", err) - } - } - }() - - mds, err := lkrepo.Datastore(context.Background(), "/metadata") - if err != nil { - return err - } - - cs := store.NewChainStore(bs, bs, mds, filcns.Weight, nil) - defer cs.Close() //nolint:errcheck - - cst := cbor.NewCborStore(bs) - store := adt.WrapStore(ctx, cst) - - tree, err := state.LoadStateTree(cst, sroot) - if err != nil { - return err - } - - //get all the votes' signer address && their vote - vj, err := homedir.Expand(cctx.Args().Get(1)) - if err != nil { - return xerrors.Errorf("fail to get votes json") - } - vm, err := getVotesMap(vj, tree) - if err != nil { - return xerrors.Errorf("fail to get voter map ", err) - } - - //get all the msig signers & their msigs - msigs, err := getAllMsigSignerMap(tree, store) - - approveVote := 0 - rejectionVote := 0 - approveBalance := abi.NewTokenAmount(0) - rejectionBalance := abi.NewTokenAmount(0) - msigPendingVotes := make(map[address.Address]msigVote) //map[msig ID]msigVote - msigFinalVotes := 0 - - for s, v := range vm { - //process votes for regular accounts - a, err := tree.GetActor(s) - if err != nil { - return xerrors.Errorf("fail to get account account for signer: ", err) - } - if v == APPROVE { - approveVote += 1 - approveBalance = types.BigAdd(approveBalance, a.Balance) - } else { - rejectionVote += 1 - rejectionBalance = types.BigAdd(rejectionBalance, a.Balance) - } - - //process msigs - if mss, found := msigs[s]; found { - for _, ms := range mss { //get all the msig signer has - if mpv, found := msigPendingVotes[ms]; found { //other signers of the multisig have voted, yet the threshold has not met - if v == APPROVE { - if mpv.ApproveCount+1 == mpv.Multisig.Threshold { //met threshold - approveVote += 1 - approveBalance = types.BigAdd(approveBalance, mpv.Multisig.Balance) - msigFinalVotes += 1 - delete(msigPendingVotes, ms) //threshold, can skip later signer votes - } else { - mpv.ApproveCount += 1 - msigPendingVotes[ms] = mpv - } - } else { - if mpv.RejectCount+1 == mpv.Multisig.Threshold { //met threshold - rejectionVote += 1 - rejectionBalance = types.BigAdd(rejectionBalance, mpv.Multisig.Balance) - msigFinalVotes += 1 - delete(msigPendingVotes, ms) //threshold, can skip later signer votes - } else { - mpv.RejectCount += 1 - msigPendingVotes[ms] = mpv - } - } - } else { //first vote received from one of the signers of the msig - msa, err := tree.GetActor(ms) - if err != nil { - return fmt.Errorf("load msig actor failed %v", err) - } - msas, err := multisig.Load(store, msa) - if err != nil { - return fmt.Errorf("load msig failed %v", err) - - } - t, _ := msas.Threshold() - if t == 1 { //met threshold with this signer's single vote - if v == APPROVE { - approveVote += 1 - approveBalance = types.BigAdd(approveBalance, msa.Balance) - } else { - rejectionVote += 1 - rejectionBalance = types.BigAdd(rejectionBalance, msa.Balance) - } - msigFinalVotes += 1 - } else { //threshold not met, add to pending vote - if v == APPROVE { - msigPendingVotes[ms] = msigVote{ - Multisig: msigBriefInfo{ - Balance: msa.Balance, - Threshold: t, - }, - ApproveCount: 1, - } - } else { - msigPendingVotes[ms] = msigVote{ - Multisig: msigBriefInfo{ - Balance: msa.Balance, - Threshold: t, - }, - RejectCount: 1, - } - } - } - } - } - } - } - - // add miner available balance - mvs, err := getStorageMinerVotes(tree, vm, store) - if err != nil { - return xerrors.Errorf("fail to get storage miner vote ", err) - } - - spApproveAvailableBalance := abi.NewTokenAmount(0) - spRejectionAvailableBalance := abi.NewTokenAmount(0) - for _, mv := range mvs { - if mv.Option == APPROVE { - approveVote += 1 - approveBalance = types.BigAdd(approveBalance, mv.AvailableBalance) - spApproveAvailableBalance = types.BigAdd(approveBalance, spApproveAvailableBalance) - } else if mv.Option == Reject { - rejectionVote += 1 - rejectionBalance = types.BigAdd(rejectionBalance, mv.AvailableBalance) - spRejectionAvailableBalance = types.BigAdd(rejectionBalance, spRejectionAvailableBalance) - } else { - continue - } - } - - fmt.Printf("\nTotal amount of signer: %v\n ", len(vm)) - fmt.Printf("Total amount of valid multisig vote: %v\n ", msigFinalVotes) - fmt.Printf("Total balance: %v\n", types.BigAdd(approveBalance, rejectionBalance).String()) - fmt.Printf("Approve (#): %v\n", approveVote) - fmt.Printf("Reject (#): %v\n", rejectionVote) - fmt.Printf("Approve (FIL): %v\n", approveBalance.String()) - fmt.Printf("Reject (FIL): %v\n", rejectionBalance.String()) - fmt.Printf("Approve - Storage Miner Portion (FIL in account): %v\n", spApproveAvailableBalance.String()) - fmt.Printf("Reject - Storage Miner Portion (FIL in account): %v\n", spRejectionAvailableBalance.String()) - av := types.BigDivFloat(approveBalance, types.BigAdd(approveBalance, rejectionBalance)) - rv := types.BigDivFloat(rejectionBalance, types.BigAdd(rejectionBalance, approveBalance)) - if av > 0.05 { - fmt.Printf("Token Holder Group Result: Pass. approve: %.5f, reject: %.5f,\n", av, rv) - } else { - fmt.Printf("Token Holder Group Result: Not Pass. approve: %.5f, reject: %.5f\n", av, rv) - } - return nil - }, -} - -var clientCmd = &cli.Command{ - Name: "client", - Usage: "get poll result for client, weighted by deal bytes that are in valid deals in the storage market.", - ArgsUsage: "[state root]", - Flags: []cli.Flag{ - &cli.StringFlag{ - Name: "repo", - Value: "~/.lotus", - }, - }, - Action: func(cctx *cli.Context) error { - if cctx.NArg() != 2 { - return xerrors.New("filpoll0036 token-holder [state root] [votes.json]") - } - - ctx := context.TODO() - if !cctx.Args().Present() { - return fmt.Errorf("must pass state root") - } - - sroot, err := cid.Decode(cctx.Args().First()) - if err != nil { - return fmt.Errorf("failed to parse input: %w", err) - } - - fsrepo, err := repo.NewFS(cctx.String("repo")) - if err != nil { - return err - } - - lkrepo, err := fsrepo.Lock(repo.FullNode) - if err != nil { - return err - } - - defer lkrepo.Close() //nolint:errcheck - - bs, err := lkrepo.Blockstore(ctx, repo.UniversalBlockstore) - if err != nil { - return fmt.Errorf("failed to open blockstore: %w", err) - } - - defer func() { - if c, ok := bs.(io.Closer); ok { - if err := c.Close(); err != nil { - log.Warnf("failed to close blockstore: %s", err) - } - } - }() - - mds, err := lkrepo.Datastore(context.Background(), "/metadata") - if err != nil { - return err - } - - cs := store.NewChainStore(bs, bs, mds, filcns.Weight, nil) - defer cs.Close() //nolint:errcheck - - cst := cbor.NewCborStore(bs) - store := adt.WrapStore(ctx, cst) - - tree, err := state.LoadStateTree(cst, sroot) - if err != nil { - return err - } - - //get all the votes' signer ID address && their voted option - vj, err := homedir.Expand(cctx.Args().Get(1)) - if err != nil { - return xerrors.Errorf("fail to get votes json") - } - vm, err := getVotesMap(vj, tree) - if err != nil { - return xerrors.Errorf("fail to get votesrs: ", err) - } - - //market actor - ma, err := tree.GetActor(market.Address) - if err != nil { - return xerrors.Errorf("fail to get market actor: ", err) - } - - ms, err := market.Load(store, ma) - if err != nil { - return xerrors.Errorf("fail to load market actor: ", err) - } - - //get all market proposals, add load the # of the bytes each client has made - dps, _ := ms.Proposals() - cds := make(map[address.Address]abi.PaddedPieceSize) - if err := dps.ForEach(func(dealID abi.DealID, d market.DealProposal) error { - if cd, found := cds[d.Client]; found { - s := d.PieceSize + cd - cds[d.Client] = s - } else { - cds[d.Client] = d.PieceSize - } - return xerrors.Errorf("fail to load deals") - }); err != nil { - return xerrors.Errorf("fail to get deals") - } - - approveBytes := abi.PaddedPieceSize(0) - rejectionBytes := abi.PaddedPieceSize(0) - approveCount := 0 - rejectionCount := 0 - for s, o := range vm { - if ds, found := cds[s]; found { - if o == APPROVE { - approveBytes += ds - approveCount += 1 - } else { - rejectionBytes += ds - rejectionCount += 1 - } - } - } - fmt.Printf("\nTotal amount of clients: %v\n", approveCount+rejectionCount) - fmt.Printf("Total deal bytes: %v\n", approveBytes+rejectionBytes) - fmt.Printf("Approve (#): %v\n", approveCount) - fmt.Printf("Reject (#): %v\n", rejectionCount) - fmt.Printf("Approve (byte): %v\n", approveBytes) - fmt.Printf("Reject (byte): %v\n", rejectionBytes) - av := float64(approveBytes) / float64(approveBytes+rejectionBytes) - rv := float64(rejectionBytes) / float64(approveBytes+rejectionBytes) - if av > 0.05 { - fmt.Printf("Deal Client Group Result: Pass. approve: %.5f, reject: %.5f\n", av, rv) - } else { - fmt.Printf("Deal Client Group Result: Not Pass. approve: %.5f, reject: %.5f\n", av, rv) - } - return nil - }, -} From bb8c3bad86c4d3f7e8a80cb5a88fd41853635afe Mon Sep 17 00:00:00 2001 From: Ian Davis Date: Tue, 27 Sep 2022 20:59:11 +0100 Subject: [PATCH 15/43] Use golang 1.18.1 to build appimage --- .circleci/config.yml | 6 ++++++ .circleci/template.yml | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 66f30e7d5..fdfcafe7c 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -424,6 +424,12 @@ jobs: - checkout - attach_workspace: at: "." + - run: + name: Update Go + command: | + curl -L https://golang.org/dl/go1.18.1.linux-amd64.tar.gz -o /tmp/go.tar.gz && \ + sudo tar -C /usr/local -xvf /tmp/go.tar.gz + - run: go version - run: name: install appimage-builder command: | diff --git a/.circleci/template.yml b/.circleci/template.yml index 6e7a44364..4fe4e4bd3 100644 --- a/.circleci/template.yml +++ b/.circleci/template.yml @@ -424,6 +424,12 @@ jobs: - checkout - attach_workspace: at: "." + - run: + name: Update Go + command: | + curl -L https://golang.org/dl/go1.18.1.linux-amd64.tar.gz -o /tmp/go.tar.gz && \ + sudo tar -C /usr/local -xvf /tmp/go.tar.gz + - run: go version - run: name: install appimage-builder command: | From 9928c1ac185be0ecd15f5faec18fc5772e47f904 Mon Sep 17 00:00:00 2001 From: Aayush Date: Wed, 28 Sep 2022 15:51:59 -0400 Subject: [PATCH 16/43] address review --- cmd/lotus-shed/fip-0036.go | 172 +++++++++++++++---------------------- 1 file changed, 71 insertions(+), 101 deletions(-) diff --git a/cmd/lotus-shed/fip-0036.go b/cmd/lotus-shed/fip-0036.go index dc5bdef97..51e7165e1 100644 --- a/cmd/lotus-shed/fip-0036.go +++ b/cmd/lotus-shed/fip-0036.go @@ -6,13 +6,13 @@ import ( "fmt" "io" "io/ioutil" + "sort" "strconv" "github.com/ipfs/go-cid" cbor "github.com/ipfs/go-ipld-cbor" "github.com/mitchellh/go-homedir" "github.com/urfave/cli/v2" - cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" "github.com/filecoin-project/go-address" @@ -21,7 +21,6 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" - _init "github.com/filecoin-project/lotus/chain/actors/builtin/init" "github.com/filecoin-project/lotus/chain/actors/builtin/market" "github.com/filecoin-project/lotus/chain/actors/builtin/miner" "github.com/filecoin-project/lotus/chain/actors/builtin/multisig" @@ -33,11 +32,16 @@ import ( "github.com/filecoin-project/lotus/node/repo" ) -const APPROVE = 49 -const Reject = 50 +type Option uint64 + +const ( + Approve Option = 49 + Reject = 50 +) type Vote struct { - OptionID uint64 + ID uint64 + OptionID Option SignerAddress address.Address } @@ -142,7 +146,7 @@ var finalResultCmd = &cli.Command{ if err != nil { return xerrors.Errorf("fail to get votes json") } - votes, err := getVotesMap(vj, st) + votes, err := getVotesMap(vj) if err != nil { return xerrors.Errorf("failed to get voters: ", err) } @@ -175,40 +179,13 @@ var finalResultCmd = &cli.Command{ return xerrors.Errorf("fail to load market state: ", err) } - //init actor - ia, err := st.GetActor(_init.Address) - if err != nil { - return xerrors.Errorf("fail to get init actor: ", err) - } - - initState, err := _init.Load(store, ia) - if err != nil { - return xerrors.Errorf("fail to load init state: ", err) - } - - initMap, err := initState.AddressMap() - if err != nil { - return xerrors.Errorf("fail to load init map: ", err) - } - lookupId := func(addr address.Address) address.Address { - if addr.Protocol() == address.ID { - return addr - } - - var actorID cbg.CborInt - if found, err := initMap.Get(abi.AddrKey(addr), &actorID); err != nil { + ret, err := st.LookupID(addr) + if err != nil { panic(err) - } else if found { - // Reconstruct address from the ActorID. - idAddr, err := address.NewIDAddress(uint64(actorID)) - if err != nil { - panic(err) - } - return idAddr } - panic("didn't find addr") + return ret } // we need to build several pieces of information, as we traverse the state tree: @@ -216,11 +193,11 @@ var finalResultCmd = &cli.Command{ accountsToMultisigs := make(map[address.Address][]address.Address) // a map of multisigs to some info about them for quick lookup msigActorsInfo := make(map[address.Address]msigBriefInfo) - // a map of accounts to every miner that they are an owner of + // a map of actors (accounts+multisigs) to every miner that they are an owner of ownerMap := make(map[address.Address][]address.Address) // a map of accounts to every miner that they are a worker of workerMap := make(map[address.Address][]address.Address) - // a map of miners to some info aboout them for quick lookup + // a map of miners to some info about them for quick lookup minerActorsInfo := make(map[address.Address]minerBriefInfo) // a map of client addresses to deal data stored in proposals clientToDealStorage := make(map[address.Address]abi.StoragePower) @@ -246,13 +223,7 @@ var finalResultCmd = &cli.Command{ } for _, s := range signers { signerId := lookupId(s) - if m, found := accountsToMultisigs[signerId]; found { //add msig id to signer's collection - m = append(m, addr) - accountsToMultisigs[signerId] = m - } else { - n := []address.Address{addr} - accountsToMultisigs[signerId] = n - } + accountsToMultisigs[signerId] = append(accountsToMultisigs[signerId], addr) } locked, err := ms.LockedBalance(abi.ChainEpoch(height)) @@ -264,7 +235,7 @@ var finalResultCmd = &cli.Command{ info := msigBriefInfo{ ID: addr, Signer: signers, - Balance: big.Min(big.Zero(), types.BigSub(act.Balance, locked)), + Balance: big.Max(big.Zero(), types.BigSub(act.Balance, locked)), Threshold: threshold, } msigActorsInfo[addr] = info @@ -282,28 +253,19 @@ var finalResultCmd = &cli.Command{ } ownerId := lookupId(info.Owner) - if m, found := ownerMap[ownerId]; found { //add miner id to owner list - m = append(m, addr) - ownerMap[ownerId] = m - } else { - n := []address.Address{addr} - ownerMap[ownerId] = n - } + ownerMap[ownerId] = append(ownerMap[ownerId], addr) workerId := lookupId(info.Worker) - if m, found := workerMap[workerId]; found { //add miner id to worker list - m = append(m, addr) - workerMap[workerId] = m - } else { - n := []address.Address{addr} - workerMap[workerId] = n - } + workerMap[workerId] = append(workerMap[workerId], addr) - bal, err := m.AvailableBalance(act.Balance) + lockedFunds, err := m.LockedFunds() if err != nil { return err } + bal := big.Sub(act.Balance, lockedFunds.TotalLockedFunds()) + bal = big.Max(big.Zero(), bal) + pow, ok, err := powerState.MinerPower(addr) if err != nil { return err @@ -359,11 +321,16 @@ var finalResultCmd = &cli.Command{ clientApproveBytes := big.Zero() clientRejectBytes := big.Zero() msigPendingVotes := make(map[address.Address]msigVote) //map[msig ID]msigVote - votedMsigs := make(map[address.Address]struct{}) - votesIncludingMsigs := make(map[address.Address]uint64) + msigVotes := make(map[address.Address]Option) + minerVotes := make(map[address.Address]Option) fmt.Println("counting account and multisig votes") - for signer, v := range votes { - signerId := lookupId(signer) + for _, vote := range votes { + signerId, err := st.LookupID(vote.SignerAddress) + if err != nil { + fmt.Println("voter ", vote.SignerAddress, " not found in state tree, skipping") + continue + } + //process votes for regular accounts accountActor, err := st.GetActor(signerId) if err != nil { @@ -375,33 +342,44 @@ var finalResultCmd = &cli.Command{ clientBytes = big.Zero() } - if v == APPROVE { + if vote.OptionID == Approve { approveBalance = types.BigAdd(approveBalance, accountActor.Balance) - votesIncludingMsigs[signerId] = APPROVE clientApproveBytes = big.Add(clientApproveBytes, clientBytes) } else { rejectionBalance = types.BigAdd(rejectionBalance, accountActor.Balance) - votesIncludingMsigs[signerId] = Reject clientRejectBytes = big.Add(clientRejectBytes, clientBytes) } + if minerInfos, found := ownerMap[signerId]; found { + for _, minerInfo := range minerInfos { + minerVotes[minerInfo] = vote.OptionID + } + } + if minerInfos, found := workerMap[signerId]; found { + for _, minerInfo := range minerInfos { + if _, ok := minerVotes[minerInfo]; !ok { + minerVotes[minerInfo] = vote.OptionID + } + } + } + //process msigs - // TODO: Oh god, oh god, there's a possibility that a multisig has voted in both directions - // and we'll pick a winner non-deterministically as we iterate... - // We need to factor in vote time if that happens and pick whoever went first + // There is a possibilty that enough signers have voted for BOTH options in the poll to be above the threshold + // Because we are iterating over votes in order they arrived, the first option to go over the threshold will win + // This is in line with onchain behaviour (consider a case where signers are competing to withdraw all the funds + // in an msig into 2 different accounts) if mss, found := accountsToMultisigs[signerId]; found { for _, ms := range mss { //get all the msig signer has - if _, ok := votedMsigs[ms]; ok { + if _, ok := msigVotes[ms]; ok { // msig has already voted, skip continue } if mpv, found := msigPendingVotes[ms]; found { //other signers of the multisig have voted, yet the threshold has not met - if v == APPROVE { + if vote.OptionID == Approve { if mpv.ApproveCount+1 == mpv.Multisig.Threshold { //met threshold approveBalance = types.BigAdd(approveBalance, mpv.Multisig.Balance) delete(msigPendingVotes, ms) //threshold, can skip later signer votes - votedMsigs[ms] = struct{}{} - votesIncludingMsigs[ms] = APPROVE + msigVotes[ms] = vote.OptionID } else { mpv.ApproveCount++ @@ -411,8 +389,7 @@ var finalResultCmd = &cli.Command{ if mpv.RejectCount+1 == mpv.Multisig.Threshold { //met threshold rejectionBalance = types.BigAdd(rejectionBalance, mpv.Multisig.Balance) delete(msigPendingVotes, ms) //threshold, can skip later signer votes - votedMsigs[ms] = struct{}{} - votesIncludingMsigs[ms] = Reject + msigVotes[ms] = vote.OptionID } else { mpv.RejectCount++ @@ -426,17 +403,16 @@ var finalResultCmd = &cli.Command{ } if msi.Threshold == 1 { //met threshold with this signer's single vote - if v == APPROVE { + if vote.OptionID == Approve { approveBalance = types.BigAdd(approveBalance, msi.Balance) - votesIncludingMsigs[ms] = APPROVE + msigVotes[ms] = Approve } else { rejectionBalance = types.BigAdd(rejectionBalance, msi.Balance) - votesIncludingMsigs[ms] = Reject + msigVotes[ms] = Reject } - votedMsigs[ms] = struct{}{} } else { //threshold not met, add to pending vote - if v == APPROVE { + if vote.OptionID == Approve { msigPendingVotes[ms] = msigVote{ Multisig: msi, ApproveCount: 1, @@ -453,10 +429,7 @@ var finalResultCmd = &cli.Command{ } } - // time to process miners based on what we know about votesIncludingMsigs - minerVotes := make(map[address.Address]uint64) - fmt.Println("counting miner votes") - for s, v := range votes { + for s, v := range msigVotes { if minerInfos, found := ownerMap[s]; found { for _, minerInfo := range minerInfos { minerVotes[minerInfo] = v @@ -482,7 +455,7 @@ var finalResultCmd = &cli.Command{ return xerrors.Errorf("failed to find miner info for %s", minerAddr) } - if vote == APPROVE { + if vote == Approve { approveBalance = big.Add(approveBalance, mbi.balance) approveRBP = big.Add(approveRBP, mbi.rawBytePower) approveDealPower = big.Add(approveDealPower, mbi.dealPower) @@ -506,7 +479,7 @@ var finalResultCmd = &cli.Command{ fmt.Println("Total rejection Client rb power: ", clientRejectBytes) fmt.Println("\n\nFinal results **drumroll**") - if rejectionBalance.GreaterThanEqual(big.Mul(approveBalance, big.NewInt(2))) { + if rejectionBalance.GreaterThanEqual(big.Mul(approveBalance, big.NewInt(3))) { fmt.Println("token holders VETO FIP-0036!!!") } else if approveBalance.LessThanEqual(rejectionBalance) { fmt.Println("token holders REJECT FIP-0036 :(") @@ -514,7 +487,7 @@ var finalResultCmd = &cli.Command{ fmt.Println("token holders ACCEPT FIP-0036 :)") } - if rejectionDealPower.GreaterThanEqual(big.Mul(approveDealPower, big.NewInt(2))) { + if rejectionDealPower.GreaterThanEqual(big.Mul(approveDealPower, big.NewInt(3))) { fmt.Println("SPs by deall data stored VETO FIP-0036!!!") } else if approveDealPower.LessThanEqual(rejectionDealPower) { fmt.Println("SPs by deal data stored REJECT FIP-0036 :(") @@ -522,7 +495,7 @@ var finalResultCmd = &cli.Command{ fmt.Println("SPs by deal data stored ACCEPT FIP-0036 :)") } - if rejectionRBP.GreaterThanEqual(big.Mul(approveRBP, big.NewInt(2))) { + if rejectionRBP.GreaterThanEqual(big.Mul(approveRBP, big.NewInt(3))) { fmt.Println("SPs by total raw byte power VETO FIP-0036!!!") } else if approveRBP.LessThanEqual(rejectionRBP) { fmt.Println("SPs by total raw byte power REJECT FIP-0036 :(") @@ -530,7 +503,7 @@ var finalResultCmd = &cli.Command{ fmt.Println("SPs by total raw byte power ACCEPT FIP-0036 :)") } - if clientRejectBytes.GreaterThanEqual(big.Mul(clientApproveBytes, big.NewInt(2))) { + if clientRejectBytes.GreaterThanEqual(big.Mul(clientApproveBytes, big.NewInt(3))) { fmt.Println("Storage Clients VETO FIP-0036!!!") } else if clientApproveBytes.LessThanEqual(clientRejectBytes) { fmt.Println("Storage Clients REJECT FIP-0036 :(") @@ -542,7 +515,8 @@ var finalResultCmd = &cli.Command{ }, } -func getVotesMap(file string, st *state.StateTree) (map[address.Address]uint64 /*map[Signer ID address]Option*/, error) { +// Returns voted sorted by votes from earliest to latest +func getVotesMap(file string) ([]Vote, error) { var votes []Vote vb, err := ioutil.ReadFile(file) if err != nil { @@ -553,13 +527,9 @@ func getVotesMap(file string, st *state.StateTree) (map[address.Address]uint64 / return nil, xerrors.Errorf("unmarshal vote: %w", err) } - vm := make(map[address.Address]uint64) - for _, v := range votes { - si, err := st.LookupID(v.SignerAddress) - if err != nil { - return nil, xerrors.Errorf("fail to lookup address", err) - } - vm[si] = v.OptionID - } - return vm, nil + sort.SliceStable(votes, func(i, j int) bool { + return votes[i].ID < votes[j].ID + }) + + return votes, nil } From d240b1219637ad4d3fd3f6218d12b07e994c97b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 29 Sep 2022 12:08:05 +0000 Subject: [PATCH 17/43] feat: miner paramfetch: Don't fetch param files when not needed --- node/builder_miner.go | 7 ++++--- node/modules/storageminer.go | 37 +++++++++++++++++++++--------------- 2 files changed, 26 insertions(+), 18 deletions(-) diff --git a/node/builder_miner.go b/node/builder_miner.go index a3eb9a7ec..cd7b4ec8d 100644 --- a/node/builder_miner.go +++ b/node/builder_miner.go @@ -94,6 +94,10 @@ func ConfigStorageMiner(c interface{}) Option { Override(new(paths.Store), From(new(*paths.Remote))), Override(new(dtypes.RetrievalPricingFunc), modules.RetrievalPricingFunc(cfg.Dealmaking)), + If(cfg.Subsystems.EnableMining || cfg.Subsystems.EnableSealing, + Override(GetParamsKey, modules.GetParams(!cfg.Proving.DisableBuiltinWindowPoSt || !cfg.Proving.DisableBuiltinWinningPoSt || cfg.Storage.AllowCommit || cfg.Storage.AllowProveReplicaUpdate2)), + ), + If(!cfg.Subsystems.EnableMining, If(cfg.Subsystems.EnableSealing, Error(xerrors.Errorf("sealing can only be enabled on a mining node"))), If(cfg.Subsystems.EnableSectorStorage, Error(xerrors.Errorf("sealing can only be enabled on a mining node"))), @@ -107,9 +111,6 @@ func ConfigStorageMiner(c interface{}) Option { Override(new(storiface.Prover), ffiwrapper.ProofProver), Override(new(storiface.ProverPoSt), From(new(sectorstorage.SectorManager))), - // Sealing (todo should be under EnableSealing, but storagefsm is currently bundled with storage.Miner) - Override(GetParamsKey, modules.GetParams), - Override(new(dtypes.SetSealingConfigFunc), modules.NewSetSealConfigFunc), Override(new(dtypes.GetSealingConfigFunc), modules.NewGetSealConfigFunc), diff --git a/node/modules/storageminer.go b/node/modules/storageminer.go index 0d85cd168..4497271ed 100644 --- a/node/modules/storageminer.go +++ b/node/modules/storageminer.go @@ -110,24 +110,31 @@ func minerAddrFromDS(ds dtypes.MetadataDS) (address.Address, error) { return address.NewFromBytes(maddrb) } -func GetParams(spt abi.RegisteredSealProof) error { - ssize, err := spt.SectorSize() - if err != nil { - return err - } +func GetParams(prover bool) func(spt abi.RegisteredSealProof) error { + return func(spt abi.RegisteredSealProof) error { + ssize, err := spt.SectorSize() + if err != nil { + return err + } + + // If built-in assets are disabled, we expect the user to have placed the right + // parameters in the right location on the filesystem (/var/tmp/filecoin-proof-parameters). + if build.DisableBuiltinAssets { + return nil + } + + var provingSize uint64 + if prover { + provingSize = uint64(ssize) + } + + // TODO: We should fetch the params for the actual proof type, not just based on the size. + if err := paramfetch.GetParams(context.TODO(), build.ParametersJSON(), build.SrsJSON(), provingSize); err != nil { + return xerrors.Errorf("fetching proof parameters: %w", err) + } - // If built-in assets are disabled, we expect the user to have placed the right - // parameters in the right location on the filesystem (/var/tmp/filecoin-proof-parameters). - if build.DisableBuiltinAssets { return nil } - - // TODO: We should fetch the params for the actual proof type, not just based on the size. - if err := paramfetch.GetParams(context.TODO(), build.ParametersJSON(), build.SrsJSON(), uint64(ssize)); err != nil { - return xerrors.Errorf("fetching proof parameters: %w", err) - } - - return nil } func MinerAddress(ds dtypes.MetadataDS) (dtypes.MinerAddress, error) { From 310f20e81badfff12bd0287733109d157dfa24e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 29 Sep 2022 15:08:09 +0000 Subject: [PATCH 18/43] v1.17.2-rc2 --- build/openrpc/full.json.gz | Bin 28425 -> 28425 bytes build/openrpc/gateway.json.gz | Bin 5079 -> 5079 bytes build/openrpc/miner.json.gz | Bin 16025 -> 16025 bytes build/openrpc/worker.json.gz | Bin 5260 -> 5260 bytes build/version.go | 2 +- documentation/en/cli-lotus-miner.md | 2 +- documentation/en/cli-lotus-worker.md | 2 +- documentation/en/cli-lotus.md | 2 +- 8 files changed, 4 insertions(+), 4 deletions(-) diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 5ba5c948256e8f7c3469cffb5749e43332b4aaf3..4ab58f84d2bf4c7dd535bb661aa09aaee3da7ac6 100644 GIT binary patch delta 23 fcmeCY$Jlv~aY8R6`^LWFJdTZT))!7`Wn};WeEtdf delta 23 fcmeCY$Jlv~aY8R6+s3})JdVf*$;+m+vN8Ywc^wIT diff --git a/build/openrpc/gateway.json.gz b/build/openrpc/gateway.json.gz index 953cd71f6b51a62da16ba4acd8ffb8a710af5811..4c5fadbebbb9bcbaf8b0af025d39bd9c14124729 100644 GIT binary patch delta 21 dcmcbveqDV+6XWfT%|5~$ma%V~CVgdK003y`2+;rl delta 21 dcmcbveqDV+6XWTP%|5~$*Jk~$pY)Z10RV6%3FiO+ diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 292409bb6e65f5d9d4ff50882275b11a18fc453c..0c0e13c9adc063e3cbefcd8dee1781f40b661ed8 100644 GIT binary patch delta 21 ccmbPPJF|8|7h~_nZZx+Af|# z19h*EL2dUEO=aMy;N}iaaQB)x&@@p{#1;ODWZ-BZ?~NWQ?SC_*@I839dvFFV>-@6} zkn7s+d+>BiZYiDuuX|1?atXAyEd(Dv0D`R`$t`seUAhGPLeOKXxc4&n)pdWf>DAJ4 zY?mUFiuU*okbUAVSA{bS`I>2$QdlO<@HzF^S0aBT;<6ti-s(DINhIgv-3k~uPjLhN*! z1cJyC^#$1cz21qqKka(^#Gd?(3@XJN#Zkb`ri8n-EPuJ^KTGT)Q#z&Y60zZMTx3AX zp7@Ph%e(PXQ{$DR`lZI~rl+X--JL99ibBOmwIN3(Sl8oN|_xZ!JuOQZn7KMBdV(tn5&_q#oIh z>spTMwjYUQLo*nQ(9F2Jc&Y&2spQ1AEq~s)fX+=a5fhZL{k!CgueJf1fV}QMC2nI# zkbl)N(TSy)RJO#{+c2qQMo?;iSm_b4W%&>!bK|#PcikPQ1=k>8V<$r)qj%lBItlXd>5>PRY`;)=U>2NSX0n#FVJ} z3#Zm?%Z*?oNA`cAm9IsC(sT z)lyX&^s`mzABY-rPDS$b@UrJT#P%8W?&Srf^YC$W8|I_ocloW;3~jXfU5x484%$Q3v=gM6U@{8~j!*zi(?y<#On|qgb-_7hZhdOI3uJ=H3PA8@@CB0$ zAULy4WPo>%b8O53CMIT0WOXc-7R3g8+i{?AkIZc?th3$&NK631HA|M-uyT-gif@5y3{R#Q!%Vr{t^ESE@E zA9QIg)~N-e3qVOd{;nG%>N~tVJ0IoSxVo}`Z&(sePr6e zfZNexQ|Sxaqk*cN&7ox>G7C1kF=6HQ{k*KSOGr$6L6GOg=)g{}OMl;}%MgQIo>Gh; zSw$so5bMC?-Z*P$qXZ#ma2nfg9X0YzK}3xj{2)S68rdt}qw{4a;8)1^qV`le9c_H< z7EWaUH8Rfv-(LsH%F<56(;HpAlcjLCEBGj*^1MG%Y~3i8Mxt$>m0D$p_F*9tO9hI? z$D>STo6bzfht{}=QGXaOfC+8RnpCX@W9nymf;cFY3vl@K_~C=pnooF(nP?Jr3OH#- z(lYFHivzyt?NEVv7XR0$6=g}K{~?z0zgM5;2Knzf`uB$qzN+72$6;-`$tAaUoQyRt zPnC@2Y%bciCuxC9?Dx$C6X>pfC5CM>b7sENLjyhHQHtWew}1UnE%f}^X1{Ug_}YlD zs_Z4g1e4ieOn6hmb5Y?;3Vd_tutK|$;!82#jqnB3H&t|1#vAFVXAK7xbXU+_L3ah+ z&7!-nmpZ20c7{==QQpp1`Sjr+c z!rqr#dD|Ap#eYCTNgMf&DoePcnOQVZnK{`%ZI5oNVrmK={Ets%>3l|P7hNLHUb@ES zPz+g$Jb046p~b~~_lu1p<)KiAq zQ16XYJtkIf&{GCIb*K$$m26j=k|~{*kWN$8o~risp{m5iQ#55bR(t)PqL&h|lP%#O zC84Hk{eSUL8)<{={?ii@4s>1B`^s3?6B4SUkv>*>qtQsISHi()*c4G6876; z0D~49z_8T@FlxO4j9YF1YdMMx1e2M7hHB8zeE0CeL7uHf9v>46o>@Er1hoRe@zp)) z{9C5(NzdOZbzjT=N6pObL(_Ep)2yqze5GwJ|9=31>X;1_4Cw)qC2HH}{dIM$j|W3_ zJctPwef)gFC4K*>KN^oUy+2mt0~&e!e8N@q{7q>6L7u-MtuH$TIEvOML7-JypM-!G zX?+9$412M_^rTlW0Hhur8vx1*^!xx&Rx(ZiXq9j^kpJd{s}BGU*7~{upbo8X1^{Xr zyMG#H0nG_l!yKR~;nD!0ibbEdvLCP&PpNsav9A39Rne86GS&zEf!GgdlL5Sv{eYtx zK-v9(V;MjM7EDN?fz2#bXw@t$i4(07E(sW|67EGU8MR8dBucbOxFl}0O1LC|v`V-a zwVKo-;UcIp^-p8Yz>J=vkNU$wV&W4%tABCUlg$j0AaPu2($k1zN|RnVI;J$~m7-%x zlXUdQl_u%gk1I`jE^tg~(hEVylqS9Mb3ADx-q~?cGt2#NV!wB!^fhI$nc7ucy(|9rty$r^lz^vAJITvXyk;s-pJC%1Bp7iH_5Tx;7g3HGNq3&R2nWVt==n zYk{XVI-m6KtYrl#EmQv_D6~ucW2j(1AUC+>Vd;PIE24pF z1P2ifB%*=Z0SY1-=$OL2jA)RcBSCyP_AF6AE&7B;Y$b>f$DS$Fr$t&HgMr8-L7;#@0f7Pn1q2GbF%(!5_Di^b zZuj4s$O;inB%+B#G*OFmzTMG8>ow;+5xX-|pVDVir;bTYA2ppg$&}|5Z-4(})G~(? ze+g4=kNQptnmo2Uc6Mu-Dz?YDawHCpdo7uveB$`Yu#i&Zl8ac+b${9OienTKx>a&G zVygU<(crjZmg=LO<&;bwGamjtzIBz##?w6o_v2N2@=7if(beq3v%lF7=!)7d^zSj? zIYT>=llLy%EPC_-n$pqDA?i#tWOT-Gpbn?{1oq)blBK^8o`210aI?c#+klo| zQR;e$Gf1xdb+Z?yS9bf$K+iFB z*EW#nT_Mj4behZJW0|u}f4RhF_xie+ipC2nu=;Ije0H9cGuz;Uj11Xa|3)alDgyQt zJo>E$UXWh~v+!O!Gk;8It-#|PkucpYaf14QN1;o-TXLW$*)}>gJkd8LF0LxY78<$O zYCrzJ4l^6}bIt4lT?U)l!Nq6knaf^VOP0VpZ#1ykJ;SDd+2roGzWL2LeasN3scB?( z+n@CwNinT_S<}i;r}xhyGp{#{mvx3s;IisHL@0B09Ya**-v9u^Q*xQZ+jeBHn zYoY#94p;cGv}0t__hE{WIpWBO)g`gI^x9UJ zMuW0!I1S*uY=2m-nGMUp=|}R0b^Qqmwk+uL8}DGktUe!MRx=1QYoZ{{EwOz;n%_79 z5TyA9jEo@7Z5^3@0s3Ttce(wQ^quzc?T?hyHD2N`*uP-^FPZ(1huQ4^5?Kg(=-LnN zMQ? zKT+_z`tJUw#4_C;)c36W@&aH5z`ino9V(+dfL+)Ryz$6EraU->6C6Uq`RDfmJZ7UK zDtiI7gb&6y(Qy zOYATU@Gk`aw1t$5T>td=;X^Z#>6N0-i?(VDt^I|!Hog5R*xa$$T*UICPdGzeHXs5Kkc9YeT$#&N)%ctzWpP`ij&pb4`mMb!+)GJ@v0q$clarIO&x!?@7%ku_#P$B@{_@2 zNx}9&JQ9X{M^3q8R$yWePApcpIN|P%oNzZB<(zPLh3K!u*9LC8*<{Qkj1$|o3O+j6 z6>#W>2Qg6!K0er0xPb1x2k0DatO9xf1@BHa*3kvO*%Z(@WdC3fc!*L=X18PkSAT%Q zdjueuqDSB%!zQK&s12BVhcieK`-4L79x!z`msX9RI3qt<{vXUrIcE4vvYdIMDCijIVw#fr^~-N?NM{S$BT9N0d6r;z@eToQdF(#B>dy6 z)^I)VQ4#c;W9;}(1Nv!oRaxgF5>bx;(tkVD*tqEVv}Erm*9-8bd!XbTrV2OJpL$g6<(!5icXp>HiWP zbAO*|-*QA&={4a%O5|tRc8YaDIaKIr<1vJa-cbi?zoYAuUS|SLy)!YD;iNyFsH&k? zMvKBd7qP7IY&JT`33mGfdVlwygT*gS%Z%jAC1D6!6ngibUrliBVXiGk$~)8o<|qf=0r)bF$tD{D=2u7u{QkRzv?V!<++hmPxqn?MiiSXN+uXrx z-FsS*Ju4|pUuJf)u`8yf8`C;{TJM>H6h<+=Enj3iZ_BqTF_M7UA&XTaT6i{uVesT$}sjH z*v=CX61`tq(G_i^SAV@_dhgj1DMN0sC2AebNFN&U>b}-UAHX241rT>>iC|R`tXdc0 z94k37M4>HnlFcwz_C# `dPPn52N_g(HLM^cc=p4BSKoGbAFB5=X7{sUXcurcX=G|dZ)3?#{ti9Ex_ z4h@R<{{8#Rz9rKoF~Bl3VH`x^xNng`me&aqngDtLy$|)2pT9 z*e*pT%d=+xgxNC6f9EKy>8zQoIZW{Pw`6@wzJLEN$&$BRETFrRP9;f}9O%MD(3eY> zjmKowacmF!eSaUmj*XYoOASy)7bmOnj5%6BrZVUUTsRgA$~^zf9(}_ExzcG*Q50GF zZMm4Rzs74>x^QiK`p3#a(&=b@Cri*YeZio0;o1&zDQ4wNq2(c2aw3m5C39p5h1lsd z2?UWP>I<;>d%Y8Jf7o!3d zKM?qhLVsVt3|dl#!GE2Me>VR~l{`hL&QGP3cdv(7z#r#9fxUq&Eij4v6($a}d@V=X z-aca%TR^z;`@=gSFj(ZZ$(SeV>Pvb1z9=~S9i>UgIoCo?}u*RU5S z(~vcE9M@)Yomh;4oJ=fxaw-NJPX*IkS2 z*0mhhZ9fvrhGsApp_y@c@l*l4Q^|>KTmHOp0iByX`3UGQW~arLre1kF_1@>&veZ4;QBP zU7UxYg~`lA?gKW^iRV}7op_z8(o?lgPu29kBuoE9&_u2$osy+xt(h)5kTT=Dh$&I` z7f!9)mK(uFj_m(JD_@HOrSYhX$&BgPpMTI=qKr3L`j|w@u;;dUH>17|yRk%}Rkc=- zAwh;-8yV{B*<|Qf0w)&YoyUf`GHB0x@Gc-X`FteIoJ~T49^>E~J5dfM7g=^6g49uv ztEH+m=x3|aKM*zMoQmY<;bqTxi0w1#-OCF|=i%e%Hq1xE@Az-Fi8zV0FKkoXd4JOr zVjo6O<`Szzam{aTovVgLt~BjV+h{4RlR}m(MT833U#*)a5f4#Lu7&-8DhnmpreK?| zjcpDGITQgCXyKpe5;+z&;I(5y${W6sSq6VB$L`G~Br|R*kR?Q8)F7wD#oH}{BD_h8 zkkagOK^jle@6)M=C>tqNmnDDq%zyvAj>m3r^!ld6GTk23SFO(~MuG_76~O!2fOj-3 z2HtQisv&NW`B+dJl-e}LZrdopwPmI%z*T^&09OI7#{<{#C>vbAAc9;-L+tn$TK&Vd z7Zu`4a?9a`TmzfkGi-7KZEp2VVQx`-1^l+mnA-rqpj?P;hP{LVxiTXRLgm zVH3EldJhrG9JGh5X(vcC!DJQ~9H9W3ri(lenE-D~>w34G5$$9 zVR{ayD|PY{8VG8So;e?^G=HcK=tT4G(Zc!L{_!7Yxw03|-;>1@t)`kj#oBT;ST2#S zKIqa~tWyg_7l`g7`al^MBl=&MnD*m^eMKum`L2MXnEy*O!%RkGvXs7`^>LiN`^dC` z0k@;YrqUO-M*~$kn?uV&WEO06W5UYq`*~SumynqDf*{X}(Se;{mw&!dmmvnbJf#>x zvWiOFAl8A&y>ZsiMhQaB;54?~I%?#bf`}S5_(6oCG_qH`N9W5Fn=lS^*zI2mhP zo+=s3*<7@3PtpRJ*zcPOCeU5|N(|d%=FEJjhX#7YqZGw`Z-4uvTIl(+&3@y~@wE|Q zRoP2~2`00{nDC~A=c2-y6!_-OVTE=h#g}5f8{rG6Z>s33j5pFz&l(OY=&qom-jU0`})u3`MyMu zp%}6hdGI8CLyL>~%ESIAr@AV$2iG1`$?%V>N9e@<*u6cwxb}iyU;JM;aRKfURXMgt zPac$$M}O|=Y|K^(Co|vB!e&iX6@4U2-{6nQEchD%q|!B~v;rA)ThGJyq@NLsf~3r)bJ>toHgnMK2{_CtJcn zNb{o!kD8g=hoTOZxs%e>5IzdVj3O2Q>2d`Gl+J`J2%CgFJsjT3>bwa1^aifKE-V_o|Js-i1BWvmbS1F;{_CIfgS`vFHY zfU^4m$1;EjESQi&1Djc>(5hKh5+_Yv7(ff+qTAN7ZW#Kb3jR)6EHCz}~0LE^a5q^A+blqS7!bWCZ|D@DhY zCh6#pD^1d~A6J_6T;Q0}q!)sYDNTCi=XlaYytCt?W|sTk#D4Ec>1)bhGqtO@dRHEB zcN(+LV-J*`I_~RgPmfQ-V{^UwWh?2xRYmQOm65KF5*?=vb!{~6Yx=P6ov#A%#D8ut z*8)##bUx|dTcz_Uci$$R&-DL?toCP!nX~+KL;xr)QN!!~hls|zb0Df?CwShSmNC)j!4fTc-X=P-vI>$56q3KyGl$!_xoaS40EV z2o53|NJIm*0~ACw&@qL38PPx)V1FPYgPvukAR>cW92g-YgG6MIhztrK!bLMgg1h4H zgDcp@MuPZo>{+6KTJ#Bx*h&x|jy+STPm8oZ1_O~vf;AIm6~`zfbgSfW z#8mkyqrq{-EY(Ll%PE;WW<30PeCsNeji-AG?#HY4&U(Km5x!xqmLljY!bcb-3|HiVJXCcLmV#FTl-H=H~7>sd~wYxGh%P z7W>+8t*>R{+6AO@j}y`SJlWSmM6Un}@qnc+LMOkp!keiwi{yf*jl_*y50N8a;q^%I zbfxZN@!i01Fzt;;qe%x%HKn7QL)4jQ$mopWKpjr?3GBm>BujrGJb#u!NIvp=cr9)9o9rr4}$*shYSx8aRM$$3+x4H<7Yt*r)Zuk7}hfu3XN zu5BRCyF#89=rotb$1-P|{&I=U?)7ys6^$2EVD;P5`0P9>XSTry85y#<{*6$8RRruQ zc=THhydb{}X5qbdW`CH_T7kzoB4N5);so^pk3yGvx8y)ivTbx~c%pAgTwGO(Ei`hm z)qebc9cDJ{=bG6Ax(qh8gNx77Gnc)#mMnpH-e_R6dxlN_vdP_Vee;`h`j{b5Q`5-o zwm<7Vl44rz{=af0fsqHS12_`E5!Jo(tfCPdw+e8L<_c+JK9AIK%)9wsc zjRs}ea2mjQ*?+KFGaHtH(~sm0>-rNCY+2CfH{QX7S$#gjtY#2q)ZYrMo?uz$h+Uo!h253||-C9)9o(6t}j zk4#SHpUBP2`lGw8mypbOgQgPIH$~vntrWpiEi>0P5P$ZRHkXYW_aui& zf1==b_1*nViDkMysP9?#2GEC*XHFM=n>0MG*i-+gZ}ub8MW?Y@4+JPJPevmA@@5D=|=?<lDaeoa zme^qy;9m&-X$vVAx&G<#!-r-f(7tu(@NgxsrRIJMbv!7`OW} zH4O*jLv@zN>5X@l^Nnb<8+dZox#%Luxgh5+nVjpredL@s?lY3J`l%TqU;TYaEA#2b zB7ZmI4HOG#Ewj)zaOf;Weu=zNAf7TfcBo^%bdI=9(6z4%<$Oi_|0- z#u^@7UlN$u5*uyX_RR!Q5k#dPqB6)i_$vmvRc7bA%+)98JIt>(N8ict zEX+jA)LUq%E6?}BC zE8x%%4`QMee0;F0Z~@(W570TtG|<)t+r0f4F!yLoV>bga@O;Tho`3lJn(s_|?-# z)AUb1=2e?`?)>Swi^;4=k>ceXtbb1_vGP4{ZS!bJp!r!0XE9H85ITKyipTR`V#w@i2b`7Ri@!exp`p#^IdIVJP0T*T#X#DA0K$eHTt z{B&j3G)vvkaVnjdkiruO(z(BIS#U{SO<~7vHHLm(=xCr3m&inh1>HleB3?$G)Bhzp z=Kem_zU7Fl(rdzjl*rGr?G)>Ra;VVL#$yN-y`v7)en;0Qz0L%hdS_xP!%2TUQB^~) zj24A^E@D~Z*=%%>6YTZ}^ndO@2a8{vmKn*JOTrMeDD>_T|H>P#^wB9oXDU48f-LV6san3eq@Y$#z-pXk`k(|{d=dOtZ zO%s`)Rur8R6aCm8K(Tq_S8#=YBLCot%#Q>56>kKKw4kZDyLcyw<0eD^UdaHwlws^Y zu$?C&BznKJqAS`+uYY>W^xm^2Qij}MOVm1=kv=ry)qSmzK7c`73n1>&62Yn>ShX&~ zIaYFFh(cTDB%5Kb?1|deJ>*lpFi8Q;3sZ2hyPZ^x?DXVy)$VyiII8tVx>6ZQTdI(~ zoFJvYAg2FbVnjJra+{AYfMc8O&=s&~{n_fbt7>A|#=QrYge_tV&^dAufGz?g2-fs~ iyClR9@f1-Wd`hK`r1ko4{r>>~0RR8V|3AuaF#!O%K_%D# diff --git a/build/version.go b/build/version.go index 578358b43..f262ab849 100644 --- a/build/version.go +++ b/build/version.go @@ -37,7 +37,7 @@ func BuildTypeString() string { } // BuildVersion is the local build version -const BuildVersion = "1.17.2-rc1" +const BuildVersion = "1.17.2-rc2" func UserVersion() string { if os.Getenv("LOTUS_VERSION_IGNORE_COMMIT") == "1" { diff --git a/documentation/en/cli-lotus-miner.md b/documentation/en/cli-lotus-miner.md index 9f27d7327..316cf96c5 100644 --- a/documentation/en/cli-lotus-miner.md +++ b/documentation/en/cli-lotus-miner.md @@ -7,7 +7,7 @@ USAGE: lotus-miner [global options] command [command options] [arguments...] VERSION: - 1.17.2-rc1 + 1.17.2-rc2 COMMANDS: init Initialize a lotus miner repo diff --git a/documentation/en/cli-lotus-worker.md b/documentation/en/cli-lotus-worker.md index 77dde5a36..ebc865dac 100644 --- a/documentation/en/cli-lotus-worker.md +++ b/documentation/en/cli-lotus-worker.md @@ -7,7 +7,7 @@ USAGE: lotus-worker [global options] command [command options] [arguments...] VERSION: - 1.17.2-rc1 + 1.17.2-rc2 COMMANDS: run Start lotus worker diff --git a/documentation/en/cli-lotus.md b/documentation/en/cli-lotus.md index 0d511e656..e0aecbf90 100644 --- a/documentation/en/cli-lotus.md +++ b/documentation/en/cli-lotus.md @@ -7,7 +7,7 @@ USAGE: lotus [global options] command [command options] [arguments...] VERSION: - 1.17.2-rc1 + 1.17.2-rc2 COMMANDS: daemon Start a lotus daemon process From 258001c6aaa57f3ea6c68870e107c20bd6044196 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 29 Sep 2022 15:16:57 +0000 Subject: [PATCH 19/43] changelog: Add v1.17.2-rc2 entry --- CHANGELOG.md | 109 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1e84bb02b..5e21f3ddd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,114 @@ # Lotus changelog +# v1.17.2-rc2 / 2022-09-29 + +This is the second release candidate of the upcoming OPTIONAL release Lotus v1.17.2 + +## New features +- feat: sealing: Partially sealed sector import ([filecoin-project/lotus#9210](https://github.com/filecoin-project/lotus/pull/9210)) + - feat: sealing: Use bitfields to manage sector numbers ([filecoin-project/lotus#9183](https://github.com/filecoin-project/lotus/pull/9183)) +- feat: env: propagation delay ([filecoin-project/lotus#9290](https://github.com/filecoin-project/lotus/pull/9290)) +- feat: cli: lotus info cmd ([filecoin-project/lotus#9233](https://github.com/filecoin-project/lotus/pull/9233)) +- feat: proving: Introduce manual sector fault recovery (#9144) ([filecoin-project/lotus#9144](https://github.com/filecoin-project/lotus/pull/9144)) +- feat: cli: print beneficiary info in state miner-info ([filecoin-project/lotus#9308](https://github.com/filecoin-project/lotus/pull/9308)) +- feat: api/cli: change beneficiary propose and confirm for actors and multisigs. ([filecoin-project/lotus#9307](https://github.com/filecoin-project/lotus/pull/9307)) +- feat: api/cli: beneficiary withdraw api and cli ([filecoin-project/lotus#9296](https://github.com/filecoin-project/lotus/pull/9296)) +- feat: network: add nv17 and integrate the corresponding go state type ([filecoin-project/lotus#9267](https://github.com/filecoin-project/lotus/pull/9267)) +- feat: api: Reintroduce StateActorManifestCID ([filecoin-project/lotus#9201](https://github.com/filecoin-project/lotus/pull/9201)) +- feat: message: Add retries to mpool push message from lotus miner ([filecoin-project/lotus#9177](https://github.com/filecoin-project/lotus/pull/9177)) +- feat: message: Add uuid to mpool message sent to chain node from miner ([filecoin-project/lotus#9174](https://github.com/filecoin-project/lotus/pull/9174)) + +## Enhancements +- feat: sectors renew --only-cc ([filecoin-project/lotus#9184](https://github.com/filecoin-project/lotus/pull/9184)) +- feat: miner: display updated & update-cache for storage list ([filecoin-project/lotus#9323](https://github.com/filecoin-project/lotus/pull/9323)) +- feat: add descriptive errors to markets event handler ([filecoin-project/lotus#9326](https://github.com/filecoin-project/lotus/pull/9326)) +- feat: cli: Add option to terminate sectors from worker address ([filecoin-project/lotus#9291](https://github.com/filecoin-project/lotus/pull/9291)) +- fix: sealing: Make DataCid resource env vars make more sense ([filecoin-project/lotus#9231](https://github.com/filecoin-project/lotus/pull/9231)) +- fix: cli: actor-cids cli command now defaults to current network ([filecoin-project/lotus#9321](https://github.com/filecoin-project/lotus/pull/9321)) +- fix: worker: Close all storage paths on worker shutdown ([filecoin-project/lotus#9153](https://github.com/filecoin-project/lotus/pull/9153)) +- fix: ux: Output bytes in `lotus client commP` cmd ([filecoin-project/lotus#9189](https://github.com/filecoin-project/lotus/pull/9189)) +- fix: ux: exclude negative available balance from spendable amount ([filecoin-project/lotus#9182](https://github.com/filecoin-project/lotus/pull/9182)) +- fix: sealing: Add information on what worker a job was assigned to in logs ([filecoin-project/lotus#9151](https://github.com/filecoin-project/lotus/pull/9151)) +- refactor: sealing pipeline: Remove useless storage adapter code ([filecoin-project/lotus#9142](https://github.com/filecoin-project/lotus/pull/9142) + +## Bug fixes +- fix: ffiwrapper: Close readers in AddPiece ([filecoin-project/lotus#9328](https://github.com/filecoin-project/lotus/pull/9328)) +- fix: sealing: Drop unused PreCommitInfo from pipeline.SectorInfo ([filecoin-project/lotus#9325](https://github.com/filecoin-project/lotus/pull/9325)) +- fix: cli: fix panic in `lotus-miner actor control list` ([filecoin-project/lotus#9241](https://github.com/filecoin-project/lotus/pull/9241)) +- fix: sealing: Abort upgrades in sectors with no deals ([filecoin-project/lotus#9310](https://github.com/filecoin-project/lotus/pull/9310)) +- fix: cli: Option to specify --from msg sender ([filecoin-project/lotus#9237](https://github.com/filecoin-project/lotus/pull/9237)) +- fix: ux: better ledger rejection error ([filecoin-project/lotus#9242](https://github.com/filecoin-project/lotus/pull/9242)) +- fix: ux: msg receipt for actor withdrawal ([filecoin-project/lotus#9155](https://github.com/filecoin-project/lotus/pull/9155)) +- fix: sealing: Avoid panicking in handleUpdateActivating on startup ([filecoin-project/lotus#9331](https://github.com/filecoin-project/lotus/pull/9331)) +- fix: api: DataCid - ensure reader is closed ([filecoin-project/lotus#9230](https://github.com/filecoin-project/lotus/pull/9230)) +- fix: verifreg: serialize RmDcProposalID as int, not tuple ([filecoin-project/lotus#9206](https://github.com/filecoin-project/lotus/pull/9206)) +- fix: api: Ignore uuid check for messages with uuid not set ([filecoin-project/lotus#9303](https://github.com/filecoin-project/lotus/pull/9303)) +- fix: cgroupV1: memory.memsw.usage_in_bytes: no such file or directory ([filecoin-project/lotus#9202](https://github.com/filecoin-project/lotus/pull/9202)) +- fix: miner: init miner's with 32GiB sectors by default ([filecoin-project/lotus#9364](https://github.com/filecoin-project/lotus/pull/9364)) +- fix: build: set PropagationDelaySecs correctly ([filecoin-project/lotus#9358](https://github.com/filecoin-project/lotus/pull/9358)) + +## Dependency updates +- github.com/filecoin-project/go-fil-markets (v1.23.1 -> v1.24.0) +- github.com/filecoin-project/go-jsonrpc (v0.1.5 -> v0.1.7) +- github.com/filecoin-project/go-state-types (v0.1.10 -> v0.1.12-beta) +- github.com/filecoin-project/go-commp-utils/nonffi (null -> v0.0.0-20220905160352-62059082a837) +- deps: go-libp2p-pubsub v0.8.0 ([filecoin-project/lotus#9229](https://github.com/filecoin-project/lotus/pull/9229)) +- deps: libp2p v0.22 ([filecoin-project/lotus#9216](https://github.com/filecoin-project/lotus/pull/9216)) +- deps: Use latest cbor-gen ([filecoin-project/lotus#9335](https://github.com/filecoin-project/lotus/pull/9335)) +- chore: update bitswap and some libp2p packages ([filecoin-project/lotus#9279](https://github.com/filecoin-project/lotus/pull/9279)) + +## Others +- chore: merge releases into master after v1.17.1 release ([filecoin-project/lotus#9283](https://github.com/filecoin-project/lotus/pull/9283)) +- chore: docs: Fix dead links to docs.filecoin.io ([filecoin-project/lotus#9304](https://github.com/filecoin-project/lotus/pull/9304)) +- chore: deps: update FFI ([filecoin-project/lotus#9330](https://github.com/filecoin-project/lotus/pull/9330)) +- chore: seed: add cmd for adding signers to rkh to genesis ([filecoin-project/lotus#9198](https://github.com/filecoin-project/lotus/pull/9198)) +- chore: fix typo in comment ([filecoin-project/lotus#9161](https://github.com/filecoin-project/lotus/pull/9161)) +- chore: cli: cleanup and standardize cli ([filecoin-project/lotus#9317](https://github.com/filecoin-project/lotus/pull/9317)) +- chore: versioning: Bump version to v1.17.2-dev ([filecoin-project/lotus#9147](https://github.com/filecoin-project/lotus/pull/9147)) +- chore: release: v1.17.2-rc1 ([filecoin-project/lotus#9339](https://github.com/filecoin-project/lotus/pull/9339)) +- feat: shed: add a --max-size flag to vlog2car ([filecoin-project/lotus#9212](https://github.com/filecoin-project/lotus/pull/9212)) +- fix: docsgen: revert rename of API Name to Num ([filecoin-project/lotus#9315](https://github.com/filecoin-project/lotus/pull/9315)) +- fix: ffi: Revert accidental filecoin-ffi downgrade from #9144 ([filecoin-project/lotus#9277](https://github.com/filecoin-project/lotus/pull/9277)) +- fix: miner: Call SyncBasefeeCheck from `lotus info` ([filecoin-project/lotus#9281](https://github.com/filecoin-project/lotus/pull/9281)) +- fix: mock sealer: grab lock in ReadPiece ([filecoin-project/lotus#9207](https://github.com/filecoin-project/lotus/pull/9207)) +- refactor: use `os.ReadDir` for lightweight directory reading ([filecoin-project/lotus#9282](https://github.com/filecoin-project/lotus/pull/9282)) +- tests: cli: Don't panic with no providers in client retrieve ([filecoin-project/lotus#9232](https://github.com/filecoin-project/lotus/pull/9232)) +- build: artifacts: butterfly ([filecoin-project/lotus#9027](https://github.com/filecoin-project/lotus/pull/9027)) +- build: Use lotus snap (and fix typo) for packer builds ([filecoin-project/lotus#9152](https://github.com/filecoin-project/lotus/pull/9152)) +- build: Update xcode version for macos builds ([filecoin-project/lotus#9170](https://github.com/filecoin-project/lotus/pull/9170)) +- ci: build: Snap daemon autorun disable ([filecoin-project/lotus#9167](https://github.com/filecoin-project/lotus/pull/9167)) +- ci: Use golang 1.18.1 to build appimage ([filecoin-project/lotus#9389](https://github.com/filecoin-project/lotus/pull/9389)) +- ci: Don't publish new homebrew releases for RC builds ([filecoin-project/lotus#9350](https://github.com/filecoin-project/lotus/pull/9350)) +- Merge branch 'deps/go-libp2p-v0.21' + +Contributors + +| Contributor | Commits | Lines ± | Files Changed | +|-------------|---------|---------|---------------| +| Aayush Rajasekaran | 8 | +23010/-2122 | 109 | +| Aayush | 15 | +6168/-2679 | 360 | +| Łukasz Magiera | 69 | +6462/-2137 | 606 | +| Geoff Stuart | 19 | +3080/-1177 | 342 | +| Marco Munizaga | 16 | +543/-424 | 41 | +| Shrenuj Bansal | 30 | +485/-419 | 88 | +| LexLuthr | 3 | +498/-12 | 19 | +| Phi | 15 | +330/-70 | 17 | +| Jennifer Wang | 7 | +132/-12 | 11 | +| TippyFlitsUK | 1 | +43/-45 | 12 | +| Steven Allen | 1 | +18/-28 | 2 | +| Frrist | 1 | +19/-11 | 2 | +| Eng Zer Jun | 1 | +14/-11 | 6 | +| Dirk McCormick | 2 | +23/-1 | 3 | +| Ian Davis | 3 | +7/-9 | 3 | +| Masih H. Derkani | 1 | +11/-0 | 1 | +| Anton Evangelatov | 1 | +11/-0 | 1 | +| Yu | 2 | +4/-4 | 5 | +| Hannah Howard | 1 | +4/-4 | 1 | +| Phi-rjan | 1 | +1/-2 | 1 | +| Jiaying Wang | 1 | +3/-0 | 1 | +| nujz | 1 | +1/-1 | 1 | +| Rob Quist | 1 | +1/-1 | 1 | + # v1.17.1 / 2022-09-06 This is an optional release of Lotus. This release introduces the [Splitstore v2 - beta](https://github.com/filecoin-project/lotus/blob/master/blockstore/splitstore/README.md)(beta). Splitstore aims to reduce the node performance impact that's caused by the Filecoin's very large, and continuously growing datastore. Splitstore v2 introduces the coldstore auto prune/GC feature & some improvements for the hotstore. We welcome all lotus users to join the early testers and try the new Splitstore out, you can leave any feedback or report issues in [this discussion](https://github.com/filecoin-project/lotus/discussions/9179) or create an issue. As always, multiple small bug fixes, new features & improvements are also included in this release. From 2b08ed95367c7b9d12f4396755355c113d681aab Mon Sep 17 00:00:00 2001 From: Aayush Date: Thu, 29 Sep 2022 11:21:36 -0400 Subject: [PATCH 20/43] address review --- cmd/lotus-shed/fip-0036.go | 49 ++++++++++++++++++++++++++------------ 1 file changed, 34 insertions(+), 15 deletions(-) diff --git a/cmd/lotus-shed/fip-0036.go b/cmd/lotus-shed/fip-0036.go index 51e7165e1..2725f205f 100644 --- a/cmd/lotus-shed/fip-0036.go +++ b/cmd/lotus-shed/fip-0036.go @@ -291,8 +291,27 @@ var finalResultCmd = &cli.Command{ } fmt.Println("iterating over proposals") - dps, _ := marketState.Proposals() - if err := dps.ForEach(func(dealID abi.DealID, d market.DealProposal) error { + dealProposals, err := marketState.Proposals() + if err != nil { + return err + } + + dealStates, err := marketState.States() + if err != nil { + return err + } + + if err := dealProposals.ForEach(func(dealID abi.DealID, d market.DealProposal) error { + + dealState, ok, err := dealStates.Get(dealID) + if err != nil { + return err + } + if !ok || dealState.SectorStartEpoch == -1 { + // effectively a continue + return nil + } + clientId := lookupId(d.Client) if cd, found := clientToDealStorage[clientId]; found { clientToDealStorage[clientId] = big.Add(cd, big.NewInt(int64(d.PieceSize))) @@ -364,7 +383,7 @@ var finalResultCmd = &cli.Command{ } //process msigs - // There is a possibilty that enough signers have voted for BOTH options in the poll to be above the threshold + // There is a possibility that enough signers have voted for BOTH options in the poll to be above the threshold // Because we are iterating over votes in order they arrived, the first option to go over the threshold will win // This is in line with onchain behaviour (consider a case where signers are competing to withdraw all the funds // in an msig into 2 different accounts) @@ -480,35 +499,35 @@ var finalResultCmd = &cli.Command{ fmt.Println("\n\nFinal results **drumroll**") if rejectionBalance.GreaterThanEqual(big.Mul(approveBalance, big.NewInt(3))) { - fmt.Println("token holders VETO FIP-0036!!!") + fmt.Println("token holders VETO FIP-0036!") } else if approveBalance.LessThanEqual(rejectionBalance) { - fmt.Println("token holders REJECT FIP-0036 :(") + fmt.Println("token holders REJECT FIP-0036") } else { - fmt.Println("token holders ACCEPT FIP-0036 :)") + fmt.Println("token holders ACCEPT FIP-0036") } if rejectionDealPower.GreaterThanEqual(big.Mul(approveDealPower, big.NewInt(3))) { - fmt.Println("SPs by deall data stored VETO FIP-0036!!!") + fmt.Println("SPs by deal data stored VETO FIP-0036!") } else if approveDealPower.LessThanEqual(rejectionDealPower) { - fmt.Println("SPs by deal data stored REJECT FIP-0036 :(") + fmt.Println("SPs by deal data stored REJECT FIP-0036") } else { - fmt.Println("SPs by deal data stored ACCEPT FIP-0036 :)") + fmt.Println("SPs by deal data stored ACCEPT FIP-0036") } if rejectionRBP.GreaterThanEqual(big.Mul(approveRBP, big.NewInt(3))) { - fmt.Println("SPs by total raw byte power VETO FIP-0036!!!") + fmt.Println("SPs by total raw byte power VETO FIP-0036!") } else if approveRBP.LessThanEqual(rejectionRBP) { - fmt.Println("SPs by total raw byte power REJECT FIP-0036 :(") + fmt.Println("SPs by total raw byte power REJECT FIP-0036") } else { - fmt.Println("SPs by total raw byte power ACCEPT FIP-0036 :)") + fmt.Println("SPs by total raw byte power ACCEPT FIP-0036") } if clientRejectBytes.GreaterThanEqual(big.Mul(clientApproveBytes, big.NewInt(3))) { - fmt.Println("Storage Clients VETO FIP-0036!!!") + fmt.Println("Storage Clients VETO FIP-0036!") } else if clientApproveBytes.LessThanEqual(clientRejectBytes) { - fmt.Println("Storage Clients REJECT FIP-0036 :(") + fmt.Println("Storage Clients REJECT FIP-0036") } else { - fmt.Println("Storage Clients ACCEPT FIP-0036 :)") + fmt.Println("Storage Clients ACCEPT FIP-0036") } return nil From 66b77be2d0e7e20aa689f61fa897999ce2a950df Mon Sep 17 00:00:00 2001 From: Rob Quist Date: Fri, 30 Sep 2022 02:43:01 +0200 Subject: [PATCH 21/43] Add retrieval deal ID and bytes transferred to retrieval output --- cli/client_retr.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cli/client_retr.go b/cli/client_retr.go index 3fe656f15..23acf1f08 100644 --- a/cli/client_retr.go +++ b/cli/client_retr.go @@ -181,12 +181,14 @@ func retrieve(ctx context.Context, cctx *cli.Context, fapi lapi.FullNode, sel *l event = retrievalmarket.ClientEvents[*evt.Event] } - printf("Recv %s, Paid %s, %s (%s), %s\n", + printf("Recv %s, Paid %s, %s (%s), %s [%d|%d]\n", types.SizeStr(types.NewInt(evt.BytesReceived)), types.FIL(evt.TotalPaid), strings.TrimPrefix(event, "ClientEvent"), strings.TrimPrefix(retrievalmarket.DealStatuses[evt.Status], "DealStatus"), time.Now().Sub(start).Truncate(time.Millisecond), + evt.ID, + types.NewInt(evt.BytesReceived), ) switch evt.Status { From 70bb865f814be48d2d116fbc825c9bf93d54e5d9 Mon Sep 17 00:00:00 2001 From: Phi Date: Fri, 30 Sep 2022 10:39:41 +0200 Subject: [PATCH 22/43] fix: renew --only-cc with sectorfile Add the ability to extend/renew only CC-sectors with the `--only-cc` when using a sector-file. --- cmd/lotus-miner/sectors.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cmd/lotus-miner/sectors.go b/cmd/lotus-miner/sectors.go index bcd60acf2..44bce55bc 100644 --- a/cmd/lotus-miner/sectors.go +++ b/cmd/lotus-miner/sectors.go @@ -918,6 +918,9 @@ var sectorsRenewCmd = &cli.Command{ } si, found := activeSectorsInfo[abi.SectorNumber(id)] + if len(si.DealIDs) > 0 && cctx.Bool("only-cc") { + continue + } if !found { return xerrors.Errorf("sector %d is not active", id) } From 44b7584c58b3613f6fb7e640ed61ab1596aa6e2e Mon Sep 17 00:00:00 2001 From: Ian Davis Date: Mon, 3 Oct 2022 13:37:50 +0100 Subject: [PATCH 23/43] Upgrade to zondax/hid to fix kIOMasterPortDefault issue This issue has been fixed in the upstream repository for months, but no release has been issued despite repeated requests. So instead just rely on the specific commit hash until a release is cut. --- go.mod | 2 +- go.sum | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 9b89fba0f..ab778cb4f 100644 --- a/go.mod +++ b/go.mod @@ -313,7 +313,7 @@ require ( github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 // indirect github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee // indirect github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect - github.com/zondax/hid v0.9.0 // indirect + github.com/zondax/hid v0.9.1-0.20220302062450-5552068d2266 // indirect github.com/zondax/ledger-go v0.12.1 // indirect go.opentelemetry.io/otel/metric v0.25.0 // indirect go.opentelemetry.io/otel/sdk/export/metric v0.25.0 // indirect diff --git a/go.sum b/go.sum index 79f7c7319..d0b3daca2 100644 --- a/go.sum +++ b/go.sum @@ -1779,8 +1779,9 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/zondax/hid v0.9.0 h1:eiT3P6vNxAEVxXMw66eZUAAnU2zD33JBkfG/EnfAKl8= github.com/zondax/hid v0.9.0/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= +github.com/zondax/hid v0.9.1-0.20220302062450-5552068d2266 h1:O9XLFXGkVswDFmH9LaYpqu+r/AAFWqr0DL6V00KEVFg= +github.com/zondax/hid v0.9.1-0.20220302062450-5552068d2266/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= github.com/zondax/ledger-go v0.12.1 h1:hYRcyznPRJp+5mzF2sazTLP2nGvGjYDD2VzhHhFomLU= github.com/zondax/ledger-go v0.12.1/go.mod h1:KatxXrVDzgWwbssUWsF5+cOJHXPvzQ09YSlzGNuhOEo= go.dedis.ch/fixbuf v1.0.3 h1:hGcV9Cd/znUxlusJ64eAlExS+5cJDIyTyEG+otu5wQs= From 99919a8b08a763da729ea0810d45934809d16ad4 Mon Sep 17 00:00:00 2001 From: Ian Davis Date: Mon, 3 Oct 2022 13:54:23 +0100 Subject: [PATCH 24/43] cd testplans/lotus-soup/ && go mod tidy --- testplans/lotus-soup/go.mod | 54 ++-- testplans/lotus-soup/go.sum | 553 ++++-------------------------------- 2 files changed, 82 insertions(+), 525 deletions(-) diff --git a/testplans/lotus-soup/go.mod b/testplans/lotus-soup/go.mod index d983de1b6..d0e1f9be7 100644 --- a/testplans/lotus-soup/go.mod +++ b/testplans/lotus-soup/go.mod @@ -10,8 +10,8 @@ require ( github.com/filecoin-project/go-address v1.0.0 github.com/filecoin-project/go-data-transfer v1.15.2 github.com/filecoin-project/go-fil-markets v1.24.0 - github.com/filecoin-project/go-jsonrpc v0.1.5 - github.com/filecoin-project/go-state-types v0.1.11-0.20220823184028-73c63d4127a4 + github.com/filecoin-project/go-jsonrpc v0.1.7 + github.com/filecoin-project/go-state-types v0.1.11 github.com/filecoin-project/go-storedcounter v0.1.0 github.com/filecoin-project/lotus v0.0.0-00010101000000-000000000000 github.com/filecoin-project/specs-actors v0.9.15 @@ -27,13 +27,12 @@ require ( github.com/ipfs/go-unixfs v0.3.1 github.com/ipld/go-car v0.4.0 github.com/kpacha/opencensus-influxdb v0.0.0-20181102202715-663e2683a27c - github.com/libp2p/go-libp2p v0.21.0 - github.com/libp2p/go-libp2p-core v0.19.1 + github.com/libp2p/go-libp2p v0.22.0 github.com/libp2p/go-libp2p-pubsub-tracer v0.0.0-20200626141350-e730b32bf1e6 github.com/multiformats/go-multiaddr v0.6.0 github.com/testground/sdk-go v0.2.6 go.opencensus.io v0.23.0 - golang.org/x/sync v0.0.0-20210220032951-036812b2e83c + golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 ) require ( @@ -52,7 +51,6 @@ require ( github.com/benbjohnson/clock v1.3.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bep/debounce v1.2.0 // indirect - github.com/btcsuite/btcd/btcec/v2 v2.2.0 // indirect github.com/buger/goterm v1.0.3 // indirect github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash/v2 v2.1.2 // indirect @@ -67,7 +65,7 @@ require ( github.com/cskr/pubsub v1.0.2 // indirect github.com/daaku/go.zipexe v1.0.0 // indirect github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect - github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect github.com/detailyang/go-fallocate v0.0.0-20180908115635-432fa640bd2e // indirect github.com/dgraph-io/badger/v2 v2.2007.3 // indirect github.com/dgraph-io/ristretto v0.1.0 // indirect @@ -173,7 +171,7 @@ require ( github.com/ipfs/go-ipfs-util v0.0.2 // indirect github.com/ipfs/go-ipld-cbor v0.0.6 // indirect github.com/ipfs/go-ipld-legacy v0.1.1 // indirect - github.com/ipfs/go-ipns v0.1.2 // indirect + github.com/ipfs/go-ipns v0.1.3-0.20220819140646-0d8e99ba180a // indirect github.com/ipfs/go-log v1.0.5 // indirect github.com/ipfs/go-metrics-interface v0.0.1 // indirect github.com/ipfs/go-path v0.3.0 // indirect @@ -196,43 +194,43 @@ require ( github.com/kelseyhightower/envconfig v1.4.0 // indirect github.com/kilic/bls12-381 v0.0.0-20200820230200-6b2c19996391 // indirect github.com/klauspost/compress v1.15.1 // indirect - github.com/klauspost/cpuid/v2 v2.0.14 // indirect + github.com/klauspost/cpuid/v2 v2.1.0 // indirect github.com/koron/go-ssdp v0.0.3 // indirect github.com/libp2p/go-buffer-pool v0.1.0 // indirect github.com/libp2p/go-cidranger v1.1.0 // indirect - github.com/libp2p/go-eventbus v0.2.1 // indirect - github.com/libp2p/go-flow-metrics v0.0.3 // indirect + github.com/libp2p/go-eventbus v0.3.0 // indirect + github.com/libp2p/go-flow-metrics v0.1.0 // indirect github.com/libp2p/go-libp2p-asn-util v0.2.0 // indirect github.com/libp2p/go-libp2p-connmgr v0.4.0 // indirect - github.com/libp2p/go-libp2p-discovery v0.7.0 // indirect + github.com/libp2p/go-libp2p-core v0.20.0 // indirect github.com/libp2p/go-libp2p-gostream v0.4.0 // indirect github.com/libp2p/go-libp2p-kad-dht v0.17.0 // indirect github.com/libp2p/go-libp2p-kbucket v0.4.7 // indirect github.com/libp2p/go-libp2p-loggables v0.1.0 // indirect github.com/libp2p/go-libp2p-noise v0.5.0 // indirect github.com/libp2p/go-libp2p-peerstore v0.7.1 // indirect - github.com/libp2p/go-libp2p-pubsub v0.7.1 // indirect + github.com/libp2p/go-libp2p-pubsub v0.8.0 // indirect github.com/libp2p/go-libp2p-record v0.1.3 // indirect - github.com/libp2p/go-libp2p-resource-manager v0.5.3 // indirect github.com/libp2p/go-libp2p-routing-helpers v0.2.3 // indirect github.com/libp2p/go-libp2p-tls v0.5.0 // indirect github.com/libp2p/go-maddr-filter v0.1.0 // indirect github.com/libp2p/go-msgio v0.2.0 // indirect github.com/libp2p/go-nat v0.1.0 // indirect github.com/libp2p/go-netroute v0.2.0 // indirect - github.com/libp2p/go-openssl v0.0.7 // indirect + github.com/libp2p/go-openssl v0.1.0 // indirect github.com/libp2p/go-reuseport v0.2.0 // indirect github.com/libp2p/go-yamux/v3 v3.1.2 // indirect - github.com/lucas-clemente/quic-go v0.28.0 // indirect + github.com/lucas-clemente/quic-go v0.28.1 // indirect github.com/lucasb-eyer/go-colorful v1.0.3 // indirect github.com/magefile/mage v1.9.0 // indirect github.com/marten-seemann/qtls-go1-16 v0.1.5 // indirect github.com/marten-seemann/qtls-go1-17 v0.1.2 // indirect github.com/marten-seemann/qtls-go1-18 v0.1.2 // indirect - github.com/marten-seemann/qtls-go1-19 v0.1.0-beta.1 // indirect + github.com/marten-seemann/qtls-go1-19 v0.1.0 // indirect github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect github.com/mattn/go-colorable v0.1.9 // indirect - github.com/mattn/go-isatty v0.0.14 // indirect + github.com/mattn/go-isatty v0.0.16 // indirect + github.com/mattn/go-pointer v0.0.1 // indirect github.com/mattn/go-runewidth v0.0.10 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect github.com/miekg/dns v1.1.50 // indirect @@ -248,7 +246,7 @@ require ( github.com/multiformats/go-multiaddr-fmt v0.1.0 // indirect github.com/multiformats/go-multibase v0.1.1 // indirect github.com/multiformats/go-multicodec v0.5.0 // indirect - github.com/multiformats/go-multihash v0.2.0 // indirect + github.com/multiformats/go-multihash v0.2.1 // indirect github.com/multiformats/go-multistream v0.3.3 // indirect github.com/multiformats/go-varint v0.0.6 // indirect github.com/nikkolasg/hexjson v0.0.0-20181101101858-78e39397e00c // indirect @@ -266,8 +264,8 @@ require ( github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e // indirect github.com/prometheus/client_golang v1.12.1 // indirect github.com/prometheus/client_model v0.2.0 // indirect - github.com/prometheus/common v0.35.0 // indirect - github.com/prometheus/procfs v0.7.3 // indirect + github.com/prometheus/common v0.37.0 // indirect + github.com/prometheus/procfs v0.8.0 // indirect github.com/prometheus/statsd_exporter v0.21.0 // indirect github.com/raulk/clock v1.1.0 // indirect github.com/raulk/go-watchdog v1.3.0 // indirect @@ -298,32 +296,32 @@ require ( github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 // indirect github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee // indirect github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect - github.com/zondax/hid v0.9.0 // indirect + github.com/zondax/hid v0.9.1-0.20220302062450-5552068d2266 // indirect github.com/zondax/ledger-go v0.12.1 // indirect go.dedis.ch/fixbuf v1.0.3 // indirect go.dedis.ch/protobuf v1.0.11 // indirect go.etcd.io/bbolt v1.3.4 // indirect go.opentelemetry.io/otel v1.7.0 // indirect go.opentelemetry.io/otel/trace v1.7.0 // indirect - go.uber.org/atomic v1.9.0 // indirect + go.uber.org/atomic v1.10.0 // indirect go.uber.org/dig v1.12.0 // indirect go.uber.org/fx v1.15.0 // indirect go.uber.org/multierr v1.8.0 // indirect - go.uber.org/zap v1.21.0 // indirect + go.uber.org/zap v1.22.0 // indirect go4.org v0.0.0-20200411211856-f5505b9728dd // indirect golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e // indirect golang.org/x/exp v0.0.0-20220426173459-3bcf042a4bf5 // indirect golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect - golang.org/x/net v0.0.0-20220630215102-69896b714898 // indirect - golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a // indirect + golang.org/x/net v0.0.0-20220812174116-3211cb980234 // indirect + golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab // indirect golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect golang.org/x/text v0.3.7 // indirect golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac // indirect - golang.org/x/tools v0.1.11 // indirect + golang.org/x/tools v0.1.12 // indirect golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f // indirect google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4 // indirect google.golang.org/grpc v1.45.0 // indirect - google.golang.org/protobuf v1.28.0 // indirect + google.golang.org/protobuf v1.28.1 // indirect gopkg.in/cheggaaa/pb.v1 v1.0.28 // indirect gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/testplans/lotus-soup/go.sum b/testplans/lotus-soup/go.sum index 65ab63f1d..a581c88c2 100644 --- a/testplans/lotus-soup/go.sum +++ b/testplans/lotus-soup/go.sum @@ -1,4 +1,3 @@ -bazil.org/fuse v0.0.0-20200117225306-7b5117fecadc/go.mod h1:FbcW6z/2VytnFDhZfumh8Ss8zxHE6qpMP5sHTRe0EaM= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.31.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= @@ -95,15 +94,12 @@ github.com/Gurpartap/async v0.0.0-20180927173644-4f7f499dd9ee h1:8doiS7ib3zi6/K1 github.com/Gurpartap/async v0.0.0-20180927173644-4f7f499dd9ee/go.mod h1:W0GbEAA4uFNYOGG2cJpmFJ04E6SD1NLELPYZB57/7AY= github.com/HdrHistogram/hdrhistogram-go v1.1.0/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM= -github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y= github.com/Kubuxu/imtui v0.0.0-20210401140320-41663d68d0fa h1:1PPxEyGdIGVkX/kqMvLJ95a1dGS1Sz7tpNEgehEYYt0= github.com/Kubuxu/imtui v0.0.0-20210401140320-41663d68d0fa/go.mod h1:WUmMvh9wMtqj1Xhf1hf3kp9RvL+y6odtdYxpyZjb90U= -github.com/Masterminds/glide v0.13.2/go.mod h1:STyF5vcenH/rUqTEv+/hBXlSTo7KYwg2oc2f4tzPWic= github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= github.com/Masterminds/sprig v2.16.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= -github.com/Masterminds/vcs v1.13.0/go.mod h1:N09YCmOQr6RLxC6UNHzuVwAdodYbbnycGHSmwVJjcKA= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= @@ -128,8 +124,6 @@ github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4Rq github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/akavel/rsrc v0.8.0 h1:zjWn7ukO9Kc5Q62DOJCcxGpXC18RawVtYAGdz2aLlfw= github.com/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c= -github.com/akrylysov/pogreb v0.10.1/go.mod h1:pNs6QmpQ1UlTJKDezuRWmaqkgUE2TuU0YTWyqJZ7+lI= -github.com/alecthomas/jsonschema v0.0.0-20200530073317-71f438968921/go.mod h1:/n6+1/DWPltRLWL/VKyUxg6tzsl5kHUCcraimt4vr60= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= @@ -137,7 +131,6 @@ github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/alecthomas/units v0.0.0-20210927113745-59d0afb8317a h1:E/8AP5dFtMhl5KPJz66Kt9G0n+7Sn41Fy1wv9/jHOrc= github.com/alecthomas/units v0.0.0-20210927113745-59d0afb8317a/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= -github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5/go.mod h1:Y2QMoi1vgtOIfc+6DhrMOGkLoGzqSV2rKp4Sm+opsyA= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= @@ -152,9 +145,7 @@ github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hC github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-metrics v0.3.3/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= -github.com/armon/go-metrics v0.3.9/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= @@ -167,15 +158,12 @@ github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN github.com/aws/aws-sdk-go v1.29.16/go.mod h1:1KvfttTE3SPKMpo8g2c6jL3ZKfXtFvKscTgahTma5Xg= github.com/aws/aws-sdk-go v1.30.12/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= github.com/aws/aws-sdk-go v1.32.11/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= -github.com/aws/aws-sdk-go v1.40.45/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= github.com/aws/aws-sdk-go-v2 v1.3.2/go.mod h1:7OaACgj2SX3XGWnrIjGlJM22h6yD6MEWKvm7levnnM8= -github.com/aws/aws-sdk-go-v2 v1.9.1/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4= github.com/aws/aws-sdk-go-v2/config v1.1.5/go.mod h1:P3F1hku7qzC81txjwXnwOM6Ex6ezkU6+/557Teyb64E= github.com/aws/aws-sdk-go-v2/credentials v1.1.5/go.mod h1:Ir1R6tPiR1/2y1hes8yOijFMz54hzSmgcmCDo6F45Qc= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.0.6/go.mod h1:0+fWMitrmIpENiY8/1DyhdYPUCAPvd9UNz9mtCsEoLQ= github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.1.2/go.mod h1:Azf567f5wBUfUbwpyJJnLM/geFFIzEulGR30L+nQZOE= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.8.1/go.mod h1:CM+19rL1+4dFWnOQKwDc7H1KwXTz+h61oUSHyhV0b3o= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.0.4/go.mod h1:BCfU3Uo2fhKcMZFp9zU5QQGQxqWCOYmZ/27Dju3S/do= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.6/go.mod h1:L0KWr0ASo83PRZu9NaZaDsw3koS6PspKv137DMDZjHo= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.2.2/go.mod h1:nnutjMLuna0s3GVY/MAkpLX03thyNER06gXvnMAPj5g= @@ -183,12 +171,10 @@ github.com/aws/aws-sdk-go-v2/service/s3 v1.5.0/go.mod h1:uwA7gs93Qcss43astPUb1eq github.com/aws/aws-sdk-go-v2/service/sso v1.1.5/go.mod h1:bpGz0tidC4y39sZkQSkpO/J0tzWCMXHbw6FZ0j1GkWM= github.com/aws/aws-sdk-go-v2/service/sts v1.2.2/go.mod h1:ssRzzJ2RZOVuKj2Vx1YE7ypfil/BIlgmQnCSW4DistU= github.com/aws/smithy-go v1.3.1/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= -github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= github.com/benbjohnson/clock v1.0.2/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/benbjohnson/clock v1.2.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/benbjohnson/immutable v0.2.1/go.mod h1:uc6OHo6PN2++n98KHLxW8ef4W42ylHiQSENghE1ezxI= @@ -200,7 +186,6 @@ github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6r github.com/bep/debounce v1.2.0 h1:wXds8Kq8qRfwAOpAxHrJDbCXgC5aHSzgQb/0gKsHQqo= github.com/bep/debounce v1.2.0/go.mod h1:H8yggRPQKLUhUoqrJC1bO2xNya7vanpDl7xR3ISbCJ0= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40/go.mod h1:8rLXio+WjiTceGBHIoTvn60HIbs7Hm7bcHjyrSqYB9c= github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= github.com/bonitoo-io/go-sql-bigquery v0.3.4-1.4.0/go.mod h1:J4Y6YJm0qTWB9aFziB7cPeSyc6dOZFyJdteSeybVpXQ= @@ -214,13 +199,6 @@ github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13P github.com/btcsuite/btcd v0.21.0-beta/go.mod h1:ZSWyehm27aAuS9bvkATT+Xte3hjHZ+MRgMY/8NJ7K94= github.com/btcsuite/btcd v0.22.0-beta/go.mod h1:9n5ntfhhHQBIhUvlhDvD3Qg6fRUj4jkN0VB8L8svzOA= github.com/btcsuite/btcd v0.22.1 h1:CnwP9LM/M9xuRrGSCGeMVs9iv09uMqwsVX7EeIpgV2c= -github.com/btcsuite/btcd v0.22.1/go.mod h1:wqgTSL29+50LRkmOVknEdmt8ZojIzhuWvgu/iptuN7Y= -github.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= -github.com/btcsuite/btcd/btcec/v2 v2.2.0 h1:fzn1qaOt32TuLjFlkzYSsBC35Q3KUjT1SwPxiMSCF5k= -github.com/btcsuite/btcd/btcec/v2 v2.2.0/go.mod h1:U7MHm051Al6XmscBQ0BoNydpOTsFAn707034b5nY8zU= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= @@ -239,12 +217,9 @@ github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7 github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34= github.com/cactus/go-statsd-client/statsd v0.0.0-20191106001114-12b4e2b38748/go.mod h1:l/bIBLeOl9eX+wxJAzxS4TveKRtAqlyDpHjhkfO0MEI= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= -github.com/casbin/casbin/v2 v2.37.0/go.mod h1:vByNa/Fchek0KZUgG5wEsl7iFsiviAYKRtgrQfcJqHg= github.com/cenkalti/backoff v0.0.0-20181003080854-62661b46c409/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= -github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/ceramicnetwork/go-dag-jose v0.1.0/go.mod h1:qYA1nYt0X8u4XoMAVoOV3upUVKtrxy/I670Dg5F0wjI= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.0/go.mod h1:dgIUBU3pDso/gPgZ1osOZ0iQf77oPR28Tjxl5dIMyVM= @@ -253,7 +228,6 @@ github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cb github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cheekybits/genny v1.0.0 h1:uGGa4nei+j20rOSeDeP5Of12XVm7TGUd4dJA9RDitfE= github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= -github.com/cheggaaa/pb v1.0.29/go.mod h1:W40334L7FMC5JKWldsTWbdGjLo0RxUKK73K+TuPxX30= github.com/chzyer/logex v1.1.10 h1:Swpa1K6QvQznwJRcfTfQJmTE72DqScAa40E+fbHEXEE= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e h1:fY5BOSpyZCqRo5OhCuC+XN+r/bBCmeuuJtjz+bCNIf8= @@ -265,7 +239,6 @@ github.com/cilium/ebpf v0.4.0 h1:QlHdikaxALkqWasW8hAC1mfR0jdmvbfaBdBPFmRSglA= github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= -github.com/clbanning/mxj v1.8.4/go.mod h1:BVjHeAH+rl9rs6f+QIpeRl0tfu10SXn1pUSa5PVGJng= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= @@ -277,33 +250,25 @@ github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= -github.com/codegangsta/cli v1.20.0/go.mod h1:/qJNoX69yVSKu5o4jLyXAENLRyk1uhi7zkbQ3slBdOA= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0 h1:sDMmm+q/3+BukdIpxwO365v/Rbspp2Nt5XntgQRXq8Q= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= github.com/codeskyblue/go-sh v0.0.0-20200712050446-30169cf553fe h1:69JI97HlzP+PH5Mi1thcGlDoBr6PS2Oe+l3mNmAkbs4= github.com/codeskyblue/go-sh v0.0.0-20200712050446-30169cf553fe/go.mod h1:VQx0hjo2oUeQkQUET7wRwradO6f+fN5jzXgB/zROxxE= github.com/containerd/cgroups v0.0.0-20201119153540-4cbc285b3327/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= -github.com/containerd/cgroups v1.0.3/go.mod h1:/ofk34relqNjSGyqPrmEULrO4Sc8LJhvJmWbUCUKqj8= github.com/containerd/cgroups v1.0.4 h1:jN/mbWBEaz+T1pi5OFtnkQ+8qnmEbAr1Oo1FRm5B0dA= github.com/containerd/cgroups v1.0.4/go.mod h1:nLNQtsF7Sl2HxNebu77i1R0oDlhiTG+kO4JTrUzo6IA= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.2.1-0.20180108230905-e214231b295a/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf h1:iW4rZ826su+pqaw19uhpSCzhj44qo35pNgKFGqzDKkU= github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/corpix/uarand v0.1.1/go.mod h1:SFKZvkcRoLqVRFZ4u25xPmp6m9ktANfbpXZ7SJ0/FNU= -github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= 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.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= @@ -328,9 +293,8 @@ github.com/davidlazar/go-crypto v0.0.0-20190912175916-7055855a373f/go.mod h1:rQY github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c h1:pFUpOrbxDR6AkioZ1ySsx5yxlDQZ8stG2b88gTPxgJU= github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c/go.mod h1:6UhI8N9EjYm1c2odKpFpAYeR8dsBeM7PtzQhRgxRr9U= github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= -github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= github.com/deepmap/oapi-codegen v1.6.0/go.mod h1:ryDa9AgbELGeB+YEXE1dR53yAjHwFvE9iAUlWl9Al3M= github.com/denisenkom/go-mssqldb v0.10.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= @@ -387,7 +351,6 @@ github.com/elastic/gosigar v0.12.0/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0 github.com/elastic/gosigar v0.14.2 h1:Dg80n8cr90OZ7x+bAax/QjoW/XqTI11RmA79ZwIm9/4= github.com/elastic/gosigar v0.14.2/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/elgris/jsondiff v0.0.0-20160530203242-765b5c24c302/go.mod h1:qBlWZqWeVx9BjvqBsnC/8RUlAYpIFmPvgROcw0n1scE= github.com/ema/qdisc v0.0.0-20190904071900-b82c76788043/go.mod h1:ix4kG2zvdUd8kEKSW0ZTr1XLks0epFpI4j745DXxlNE= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= @@ -395,22 +358,16 @@ github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymF github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/etclabscore/go-jsonschema-walk v0.0.6/go.mod h1:VdfDY72AFAiUhy0ZXEaWSpveGjMT5JcDIm903NGqFwQ= -github.com/etclabscore/go-openrpc-reflect v0.0.36/go.mod h1:0404Ky3igAasAOpyj1eESjstTyneBAIk5PgJFbK4s5E= github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= 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.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.8.0/go.mod h1:3l45GVGkyrnYNl9HoIjnp2NnNWvh6hLAqD8yTfGjnw8= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= 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.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/filecoin-project/dagstore v0.5.2 h1:Nd6oXdnolbbVhpMpkYT5PJHOjQp4OBSntHpMV5pxj3c= github.com/filecoin-project/dagstore v0.5.2/go.mod h1:mdqKzYrRBHf1pRMthYfMv3n37oOw0Tkx7+TxPt240M0= github.com/filecoin-project/go-address v0.0.3/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= @@ -437,11 +394,8 @@ github.com/filecoin-project/go-commp-utils v0.1.3/go.mod h1:3ENlD1pZySaUout0p9AN github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= github.com/filecoin-project/go-crypto v0.0.1 h1:AcvpSGGCgjaY8y1az6AMfKQWreF/pWO2JJGLl6gCq6o= github.com/filecoin-project/go-crypto v0.0.1/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= -github.com/filecoin-project/go-dagaggregator-unixfs v0.2.0/go.mod h1:WTuJWgBQY0omnQqa8kRPT9O0Uj5wQOgslVMUuTeHdJ8= -github.com/filecoin-project/go-data-transfer v1.15.1/go.mod h1:dXsUoDjR9tKN7aV6R0BBDNNBPzbNvrrNuWt9MUn3yYc= github.com/filecoin-project/go-data-transfer v1.15.2 h1:PzqsFr2Q/onMGKrGh7TtRT0dKsJcVJrioJJnjnKmxlk= github.com/filecoin-project/go-data-transfer v1.15.2/go.mod h1:qXOJ3IF5dEJQHykXXTwcaRxu17bXAxr+LglXzkL6bZQ= -github.com/filecoin-project/go-ds-versioning v0.0.0-20211206185234-508abd7c2aff/go.mod h1:C9/l9PnB1+mwPa26BBVpCjG/XQCB0yj/q5CK2J8X1I4= github.com/filecoin-project/go-ds-versioning v0.1.1 h1:JiyBqaQlwC+UM0WhcBtVEeT3XrX59mQhT8U3p7nu86o= github.com/filecoin-project/go-ds-versioning v0.1.1/go.mod h1:C9/l9PnB1+mwPa26BBVpCjG/XQCB0yj/q5CK2J8X1I4= github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= @@ -456,9 +410,8 @@ github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0/go.mod h1:7aWZdaQ1b16BVoQUYR+ github.com/filecoin-project/go-hamt-ipld/v3 v3.0.1/go.mod h1:gXpNmr3oQx8l3o7qkGyDjJjYSRX7hp/FGOStdqrWyDI= github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0 h1:rVVNq0x6RGQIzCo1iiJlGFm9AGIZzeifggxtKMU7zmI= github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0/go.mod h1:bxmzgT8tmeVQA1/gvBwFmYdT8SOFUwB3ovSUfG1Ux0g= -github.com/filecoin-project/go-indexer-core v0.2.16/go.mod h1:5kCKyhtT9k1vephr9l9SFGX8B/HowXIvOhGCkmbxwbY= -github.com/filecoin-project/go-jsonrpc v0.1.5 h1:ckxqZ09ivBAVf5CSmxxrqqNHC7PJm3GYGtYKiNQ+vGk= -github.com/filecoin-project/go-jsonrpc v0.1.5/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= +github.com/filecoin-project/go-jsonrpc v0.1.7 h1:Ti/QkQLI31v+6hvidA+i9Wv/NrS4CfHk0yXLntHX3Uk= +github.com/filecoin-project/go-jsonrpc v0.1.7/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= github.com/filecoin-project/go-legs v0.4.4 h1:mpMmAOOnamaz0CV9rgeKhEWA8j9kMC+f+UGCGrxKaZo= github.com/filecoin-project/go-legs v0.4.4/go.mod h1:JQ3hA6xpJdbR8euZ2rO0jkxaMxeidXf0LDnVuqPAe9s= github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.mod h1:mPn+LRRd5gEKNAtc+r3ScpW2JRU/pj4NBKdADYWHiak= @@ -470,16 +423,11 @@ github.com/filecoin-project/go-state-types v0.0.0-20200903145444-247639ffa6ad/go github.com/filecoin-project/go-state-types v0.0.0-20200928172055-2df22083d8ab/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.0.0-20201102161440-c8033295a1fc/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.0/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= -github.com/filecoin-project/go-state-types v0.1.1-0.20210810190654-139e0e79e69e/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= -github.com/filecoin-project/go-state-types v0.1.3/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= -github.com/filecoin-project/go-state-types v0.1.5/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= github.com/filecoin-project/go-state-types v0.1.6/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= github.com/filecoin-project/go-state-types v0.1.8/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= -github.com/filecoin-project/go-state-types v0.1.10/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= -github.com/filecoin-project/go-state-types v0.1.11-0.20220823184028-73c63d4127a4 h1:ptwW6pe1SDnDGpKzxoLGfwPFsJ3remMP5KKfjbkGFBU= -github.com/filecoin-project/go-state-types v0.1.11-0.20220823184028-73c63d4127a4/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= +github.com/filecoin-project/go-state-types v0.1.11 h1:QzKUILRGa9gjJKPCiFlvCfcDGK2IqtJ6CpRQULvZZpA= +github.com/filecoin-project/go-state-types v0.1.11/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= -github.com/filecoin-project/go-statemachine v1.0.2-0.20220322104818-27f8fbb86dfd/go.mod h1:jZdXXiHa61n4NmgWFG4w8tnqgvZVHYbJ3yW7+y8bF54= github.com/filecoin-project/go-statemachine v1.0.2 h1:421SSWBk8GIoCoWYYTE/d+qCWccgmRH0uXotXRDjUbc= github.com/filecoin-project/go-statemachine v1.0.2/go.mod h1:jZdXXiHa61n4NmgWFG4w8tnqgvZVHYbJ3yW7+y8bF54= github.com/filecoin-project/go-statestore v0.1.0/go.mod h1:LFc9hD+fRxPqiHiaqUEZOinUJB4WARkRfNl10O7kTnI= @@ -495,33 +443,23 @@ github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK github.com/filecoin-project/specs-actors v0.9.15-0.20220514164640-94e0d5e123bd/go.mod h1:pjGEe3QlWtK20ju/aFRsiArbMX6Cn8rqEhhsiCM9xYE= github.com/filecoin-project/specs-actors v0.9.15 h1:3VpKP5/KaDUHQKAMOg4s35g/syDaEBueKLws0vbsjMc= github.com/filecoin-project/specs-actors v0.9.15/go.mod h1:pjGEe3QlWtK20ju/aFRsiArbMX6Cn8rqEhhsiCM9xYE= -github.com/filecoin-project/specs-actors/v2 v2.3.5-0.20210114162132-5b58b773f4fb/go.mod h1:LljnY2Mn2homxZsmokJZCpRuhOPxfXhvcek5gWkmqAc= github.com/filecoin-project/specs-actors/v2 v2.3.6 h1:UxnWTfQd7JsOae39/aHCK0m1IBjdcyymCJfqxuSkn+g= github.com/filecoin-project/specs-actors/v2 v2.3.6/go.mod h1:DJMpxVRXvev9t8P0XWA26RmTzN+MHiL9IlItVLT0zUc= -github.com/filecoin-project/specs-actors/v3 v3.1.0/go.mod h1:mpynccOLlIRy0QnR008BwYBwT9fen+sPR13MA1VmMww= github.com/filecoin-project/specs-actors/v3 v3.1.2 h1:Gq3gAbvdGLA/D0GKz1IJfewt9Fh7gA32TPt46Xv+1Cw= github.com/filecoin-project/specs-actors/v3 v3.1.2/go.mod h1:uOJn+m6W8OW/1mdWMEvxeM1cjQPxmps7s1Z4bJ9V4kY= -github.com/filecoin-project/specs-actors/v4 v4.0.0/go.mod h1:TkHXf/l7Wyw4ZejyXIPS2rK8bBO0rdwhTZyQQgaglng= github.com/filecoin-project/specs-actors/v4 v4.0.2 h1:VTsv30kIf1Keo8Jlu6Omco+2Ud0pG4EN5UAzyYCibh8= github.com/filecoin-project/specs-actors/v4 v4.0.2/go.mod h1:zT0GVFxwFS93prGK0b/rMd1sePjRQKfAuodQ9DFAd6Y= -github.com/filecoin-project/specs-actors/v5 v5.0.4/go.mod h1:5BAKRAMsOOlD8+qCw4UvT/lTLInCJ3JwOWZbX8Ipwq4= -github.com/filecoin-project/specs-actors/v5 v5.0.5/go.mod h1:dnfda2U+0ZidVnZJ44fnLMa3Mbyzwx51iW/brSsS+nc= github.com/filecoin-project/specs-actors/v5 v5.0.6 h1:TLtA9hT3pHQF5vB83GmB+m6anw9u6MjdT+VVn/lyC+c= github.com/filecoin-project/specs-actors/v5 v5.0.6/go.mod h1:myb/UGwESp0V1f1BACXSUrFgTWLvGUoG0ZZH7eqriFM= -github.com/filecoin-project/specs-actors/v6 v6.0.0/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= -github.com/filecoin-project/specs-actors/v6 v6.0.1/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= github.com/filecoin-project/specs-actors/v6 v6.0.2 h1:K1xPRJoW5PBvb08QF9+4w1AjcnqwR6BjTmeltQFCvWo= github.com/filecoin-project/specs-actors/v6 v6.0.2/go.mod h1:wnfVvPnYmzPZilNvSqCSSA/ZQX3rdV/U/Vf9EIoQhrI= -github.com/filecoin-project/specs-actors/v7 v7.0.0/go.mod h1:TA5FwCna+Yi36POaT7SLKXsgEDvJwc0V/L6ZsO19B9M= github.com/filecoin-project/specs-actors/v7 v7.0.1 h1:w72xCxijK7xs1qzmJiw+WYJaVt2EPHN8oiwpA1Ay3/4= github.com/filecoin-project/specs-actors/v7 v7.0.1/go.mod h1:tPLEYXoXhcpyLh69Ccq91SOuLXsPWjHiY27CzawjUEk= github.com/filecoin-project/specs-actors/v8 v8.0.1 h1:4u0tIRJeT5G7F05lwLRIsDnsrN+bJ5Ixj6h49Q7uE2Y= github.com/filecoin-project/specs-actors/v8 v8.0.1/go.mod h1:UYIPg65iPWoFw5NEftREdJwv9b/5yaLKdCgTvNI/2FA= github.com/filecoin-project/storetheindex v0.4.17 h1:w0dVc954TGPukoVbidlYvn9Xt+wVhk5vBvrqeJiRo8I= github.com/filecoin-project/storetheindex v0.4.17/go.mod h1:y2dL8C5D3PXi183hdxgGtM8vVYOZ1lg515tpl/D3tN8= -github.com/filecoin-project/test-vectors/schema v0.0.5/go.mod h1:iQ9QXLpYWL3m7warwvK1JC/pTri8mnfEmKygNDqqY6E= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= -github.com/flynn/noise v0.0.0-20180327030543-2492fe189ae6/go.mod h1:1i71OnUq3iUe1ma7Lr6yG6/rjvM3emb6yoL7xLFzcVQ= github.com/flynn/noise v1.0.0 h1:DlTHqmzmvcEiKj+4RYo/imoswx/4r6iBlCMfVtrMXpQ= github.com/flynn/noise v1.0.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= @@ -530,21 +468,15 @@ github.com/foxcpp/go-mockdns v0.0.0-20201212160233-ede2f9158d15/go.mod h1:tPg4cp github.com/francoispqt/gojay v1.2.13 h1:d2m3sFjloqoIUQU3TsHBgj6qg/BVGlTBeHDUmyJnXKk= github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiDsoyrBGkyDY= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= -github.com/franela/goblin v0.0.0-20210519012713-85d372ac71e2/go.mod h1:VzmDKDJVZI3aJmnRI9VjAn9nJ8qPPsN1fqzr9dqInIo= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09mUdL/ijj8og= github.com/frankban/quicktest v1.14.2/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= -github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/gabriel-vasile/mimetype v1.4.0/go.mod h1:fA8fi6KUiG7MgQQ+mEWotXoEOvmxRtOJlERCzSmRvr8= -github.com/gammazero/keymutex v0.0.2/go.mod h1:qtzWCCLMisQUmVa4dvqHVgwfh4BP2YB7JxNDGXnsKrs= -github.com/gammazero/radixtree v0.2.5/go.mod h1:VPqqCDZ3YZZxAzUUsIF/ytFBigVWV7JIV1Stld8hri0= github.com/gbrlsnchs/jwt/v3 v3.0.1 h1:lbUmgAKpxnClrKloyIwpxm4OuWeDl5wLk52G91ODPw4= github.com/gbrlsnchs/jwt/v3 v3.0.1/go.mod h1:AncDcjXz18xetI3A6STfXq2w+LuTx8pQ8bGEwRN8zVM= github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko= @@ -559,7 +491,6 @@ github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0 github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= -github.com/go-bindata/go-bindata/v3 v3.1.3/go.mod h1:1/zrpXsLD8YDIbhZRqXzm1Ghc7NhEvIN9+Z6R5/xH4I= github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= github.com/go-chi/chi v4.1.0+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ= github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= @@ -582,12 +513,9 @@ github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNV github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.1/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/stdr v1.2.0/go.mod h1:YkVgnZu1ZjjL7xTxrfm/LLZBfkhTqSR1ydtm6jTKKwI= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.5 h1:t4MGB5xEDZvXI+0rMjjsfBsD7yAgp/s9ZDkL1JndXwY= @@ -615,7 +543,6 @@ github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3Hfo github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/jsonreference v0.19.4/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= @@ -634,7 +561,6 @@ github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcs github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= github.com/go-openapi/spec v0.19.6/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= github.com/go-openapi/spec v0.19.7/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= -github.com/go-openapi/spec v0.19.11/go.mod h1:vqK/dIdLGCosfvYsQV3WfC7N3TiZSnGY2RZKoFK7X28= github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY= @@ -648,9 +574,7 @@ github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/ github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.7/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= -github.com/go-openapi/swag v0.19.8/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= github.com/go-openapi/swag v0.19.9/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= -github.com/go-openapi/swag v0.19.11/go.mod h1:Uc0gKkdR+ojzsEpjh39QChyu92vPgIr72POcgHMAgSY= github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= github.com/go-openapi/validate v0.19.3/go.mod h1:90Vh6jjkTn+OT1Eefm0ZixWNFjhtOH7vS9k0lo6zwJo= @@ -663,7 +587,6 @@ github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LB github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/go-zookeeper/zk v1.0.2/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY= github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg= @@ -688,7 +611,6 @@ github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWe github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0= github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= -github.com/godbus/dbus v0.0.0-20190402143921-271e53dc4968 h1:s+PDl6lozQ+dEUtUtQnO7+A2iPG3sK1pI4liU+jxn90= github.com/godbus/dbus v0.0.0-20190402143921-271e53dc4968/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= @@ -712,7 +634,6 @@ github.com/gogo/status v1.0.3/go.mod h1:SavQ51ycCLnc7dGyJxp8YAmudx8xqiVrRf+6IXRs github.com/gogo/status v1.1.0 h1:+eIkrewn5q6b30y+g/BJINVVdi2xH7je5MPJ3ZPK3JA= github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= -github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= @@ -757,7 +678,6 @@ github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= @@ -779,7 +699,6 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -817,7 +736,6 @@ github.com/gopherjs/gopherjs v0.0.0-20190812055157-5d271430af9f h1:KMlcu9X58lhTA github.com/gopherjs/gopherjs v0.0.0-20190812055157-5d271430af9f/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/handlers v1.4.2/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= -github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= @@ -842,7 +760,6 @@ github.com/grpc-ecosystem/grpc-gateway v1.14.4/go.mod h1:6CwZWGDSPRJidgKAtJVvND6 github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= -github.com/gxed/go-shellwords v1.0.3/go.mod h1:N7paucT91ByIjmVJHhvoarjoQnmsi3Jd3vH7VqgtMxQ= github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= github.com/hako/durafmt v0.0.0-20200710122514-c0fb7b4da026 h1:BpJ2o0OR5FV7vrkDYfXYVJQeMNWa8RhklZOpW2ITAIQ= @@ -853,30 +770,23 @@ github.com/hannahhoward/go-pubsub v0.0.0-20200423002714-8d62886cc36e h1:3YKHER4n github.com/hannahhoward/go-pubsub v0.0.0-20200423002714-8d62886cc36e/go.mod h1:I8h3MITA53gN9OnWGCgaMa0JWVRdXthWw4M3CPM54OY= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= github.com/hashicorp/consul/api v1.4.0/go.mod h1:xc8u05kyMa3Wjr9eEAsIAo3dg8+LywT5E/Cl7cNS5nU= -github.com/hashicorp/consul/api v1.10.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/consul/sdk v0.4.0/go.mod h1:fY08Y9z5SvJqevyZNy6WWPXiG3KwBPAvlcdx16zZ0fM= -github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -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 v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-hclog v0.12.2/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-hclog v0.16.2/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.2.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= 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.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= -github.com/hashicorp/go-retryablehttp v0.7.1/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= @@ -888,7 +798,6 @@ github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09 github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= @@ -898,24 +807,18 @@ github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/memberlist v0.1.4/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/memberlist v0.2.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= -github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hashicorp/serf v0.9.0/go.mod h1:YL0HO+FifKOW2u1ke99DGVu1zhcpZzNwrLIqBC7vbYU= -github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= github.com/hodgesds/perf-utils v0.0.8/go.mod h1:F6TfvsbtrF88i++hou29dTXlI2sfsJv+gRZDtmTJkAs= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= -github.com/hudl/fargo v1.4.0/go.mod h1:9Ai6uvFy5fQNq6VPKtg+Ceq1+eTY4nKUlR2JElEOcDo= github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc= github.com/huin/goupnp v1.0.2/go.mod h1:0dxJBVBHqTMjIUMkESDTNgOOx/Mw5wYIfyFmdzSamkM= github.com/huin/goupnp v1.0.3 h1:N8No57ls+MnjlB+JPiCVSOyy/ot7MJTqlo7rn+NYSqQ= github.com/huin/goupnp v1.0.3/go.mod h1:ZxNlw5WqJj6wSsRK5+YfflQGXYfccj5VgQsMNixHM7Y= github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= -github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0/go.mod h1:N0Wam8K1arqPXNWjMo21EXnBPOPp36vB07FNRdD2geA= -github.com/iancoleman/orderedmap v0.1.0/go.mod h1:N0Wam8K1arqPXNWjMo21EXnBPOPp36vB07FNRdD2geA= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/icrowley/fake v0.0.0-20180203215853-4178557ae428/go.mod h1:uhpZMVGznybq1itEKXj6RYw9I71qK4kH+OGMjRC4KEo= github.com/icza/backscanner v0.0.0-20210726202459-ac2ffc679f94 h1:9tcYMdi+7Rb1y0E9Del1DRHui7Ne3za5lLw6CjMJv/M= github.com/icza/backscanner v0.0.0-20210726202459-ac2ffc679f94/go.mod h1:GYeBD1CF7AqnKZK+UCytLcY3G+UKo0ByXX/3xfdNyqQ= github.com/icza/mighty v0.0.0-20180919140131-cfd07d671de6 h1:8UsGZ2rr2ksmEru6lToqnXgA8Mz1DP11X4zSJ159C3k= @@ -949,11 +852,8 @@ 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.0.0 h1:y/XHm2GEmD9wKngheWNNCNL0pzrWXZwCdQGv1ikXknQ= github.com/ipfs/go-bitfield v1.0.0/go.mod h1:N/UiujQy+K+ceU1EF5EkVd1TNqevLrCQMIcAEPrdtus= -github.com/ipfs/go-bitswap v0.0.9/go.mod h1:kAPf5qgn2W2DrgAcscZ3HrM9qh4pH+X8Fkk3UPrwvis= github.com/ipfs/go-bitswap v0.1.0/go.mod h1:FFJEf18E9izuCqUtHxbWEvq+reg7o4CW5wSAE1wsxj0= github.com/ipfs/go-bitswap v0.1.2/go.mod h1:qxSWS4NXGs7jQ6zQvoPY3+NmOfHHG47mhkiLzBpJQIs= -github.com/ipfs/go-bitswap v0.1.8/go.mod h1:TOWoxllhccevbWFUR2N7B1MTSVVge1s6XSMiCSA4MzM= -github.com/ipfs/go-bitswap v0.3.4/go.mod h1:4T7fvNv/LmOys+21tnLzGKncMeeXUYUd1nUiJ2teMvI= github.com/ipfs/go-bitswap v0.5.1/go.mod h1:P+ckC87ri1xFLvk74NlXdP0Kj9RmWAh4+H78sC6Qopo= github.com/ipfs/go-bitswap v0.6.0/go.mod h1:Hj3ZXdOC5wBJvENtdqsixmzzRukqd8EHLxZLZc3mzRA= github.com/ipfs/go-bitswap v0.8.0 h1:UEV7kogQu2iGggkE9GhLykDrRCUpsNnpu2NODww/srw= @@ -962,10 +862,7 @@ github.com/ipfs/go-block-format v0.0.1/go.mod h1:DK/YYcsSUIVAFNwo/KZCdIIbpN0ROH/ github.com/ipfs/go-block-format v0.0.2/go.mod h1:AWR46JfpcObNfg3ok2JHDUfdiHRgWhJgCQF+KIgOPJY= github.com/ipfs/go-block-format v0.0.3 h1:r8t66QstRp/pd/or4dpnbVfXT5Gt7lOqRvC+/dDTpMc= github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk= -github.com/ipfs/go-blockservice v0.0.7/go.mod h1:EOfb9k/Y878ZTRY/CH0x5+ATtaipfbRhbvNSdgc/7So= github.com/ipfs/go-blockservice v0.1.0/go.mod h1:hzmMScl1kXHg3M2BjTymbVPjv627N7sYcvYaKbop39M= -github.com/ipfs/go-blockservice v0.1.4/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU= -github.com/ipfs/go-blockservice v0.1.7/go.mod h1:GmS+BAt4hrwBKkzE11AFDQUrnvqjwFatGS2MY7wOjEM= github.com/ipfs/go-blockservice v0.2.1/go.mod h1:k6SiwmgyYgs4M/qt+ww6amPeUH9EISLRBnvUurKJhi8= github.com/ipfs/go-blockservice v0.3.0/go.mod h1:P5ppi8IHDC7O+pA0AlGTF09jruB2h+oP3wVVaZl8sfk= github.com/ipfs/go-blockservice v0.4.0 h1:7MUijAW5SqdsqEW/EhnNFRJXVF8mGU5aGhZ3CQaCWbY= @@ -982,7 +879,6 @@ github.com/ipfs/go-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqg github.com/ipfs/go-cid v0.1.0/go.mod h1:rH5/Xv83Rfy8Rw6xG+id3DYAMUVmem1MowoKwdXmN2o= github.com/ipfs/go-cid v0.2.0 h1:01JTiihFq9en9Vz0lc0VDWvZe/uBonGpzo4THP0vcQ0= github.com/ipfs/go-cid v0.2.0/go.mod h1:P+HXFDF4CVhaVayiEb4wkAy7zBHxBwsJyt0Y5U6MLro= -github.com/ipfs/go-cidutil v0.0.2/go.mod h1:ewllrvrxG6AMYStla3GD7Cqn+XYSLqjK0vc+086tB6s= github.com/ipfs/go-cidutil v0.1.0 h1:RW5hO7Vcf16dplUU60Hs0AKDkQAVPVplr7lk97CFL+Q= github.com/ipfs/go-cidutil v0.1.0/go.mod h1:e7OEVBMIv9JaOxt9zaGEmAoSlXW9jdFZ5lP/0PwcfpA= github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= @@ -992,54 +888,39 @@ github.com/ipfs/go-datastore v0.1.1/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRV github.com/ipfs/go-datastore v0.3.1/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw= github.com/ipfs/go-datastore v0.4.0/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= github.com/ipfs/go-datastore v0.4.1/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= -github.com/ipfs/go-datastore v0.4.2/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= github.com/ipfs/go-datastore v0.4.4/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= github.com/ipfs/go-datastore v0.4.5/go.mod h1:eXTcaaiN6uOlVCLS9GjJUJtlvJfM3xk23w3fyfrmmJs= github.com/ipfs/go-datastore v0.5.0/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= github.com/ipfs/go-datastore v0.5.1 h1:WkRhLuISI+XPD0uk3OskB0fYFSyqK8Ob5ZYew9Qa1nQ= github.com/ipfs/go-datastore v0.5.1/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= -github.com/ipfs/go-delegated-routing v0.2.2/go.mod h1:T8wrRhlXBHLPUR3bZQgArHPfdi7nBfOsZ1m5fr9tAp4= 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-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8= github.com/ipfs/go-ds-badger v0.0.5/go.mod h1:g5AuuCGmr7efyzQhLL8MzwqcauPojGPUaHzfGTzuE3s= -github.com/ipfs/go-ds-badger v0.0.7/go.mod h1:qt0/fWzZDoPW6jpQeqUjR5kBfhDNB65jd9YlmAvpQBk= github.com/ipfs/go-ds-badger v0.2.1/go.mod h1:Tx7l3aTph3FMFrRS838dcSJh+jjA7cX9DrGVwx/NOwE= github.com/ipfs/go-ds-badger v0.2.3/go.mod h1:pEYw0rgg3FIrywKKnL+Snr+w/LjJZVMTBRn4FS6UHUk= -github.com/ipfs/go-ds-badger v0.2.7/go.mod h1:02rnztVKA4aZwDuaRPTf8mpqcKmXP7mLl6JPxd14JHA= github.com/ipfs/go-ds-badger v0.3.0 h1:xREL3V0EH9S219kFFueOYJJTcjgNSZ2HY1iSvN7U1Ro= github.com/ipfs/go-ds-badger v0.3.0/go.mod h1:1ke6mXNqeV8K3y5Ak2bAA0osoTfmxUdupVCGm4QUIek= github.com/ipfs/go-ds-badger2 v0.1.2 h1:sQc2q1gaXrv8YFNeUtxil0neuyDf9hnVHfLsi7lpXfE= github.com/ipfs/go-ds-badger2 v0.1.2/go.mod h1:3FtQmDv6fMubygEfU43bsFelYpIiXX/XEYA54l9eCwg= -github.com/ipfs/go-ds-flatfs v0.5.1/go.mod h1:RWTV7oZD/yZYBKdbVIFXTX2fdY2Tbvl94NsWqmoyAX4= github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= -github.com/ipfs/go-ds-leveldb v0.1.0/go.mod h1:hqAW8y4bwX5LWcCtku2rFNX3vjDZCy5LZCg+cSZvYb8= github.com/ipfs/go-ds-leveldb v0.4.1/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1Ii2r79Hh9s= github.com/ipfs/go-ds-leveldb v0.4.2/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1Ii2r79Hh9s= github.com/ipfs/go-ds-leveldb v0.5.0 h1:s++MEBbD3ZKc9/8/njrn4flZLnCuY9I79v94gBUNumo= github.com/ipfs/go-ds-leveldb v0.5.0/go.mod h1:d3XG9RUDzQ6V4SHi8+Xgj9j1XuEk1z82lquxrVbml/Q= github.com/ipfs/go-ds-measure v0.2.0 h1:sG4goQe0KDTccHMyT45CY1XyUbxe5VwTKpg2LjApYyQ= github.com/ipfs/go-ds-measure v0.2.0/go.mod h1:SEUD/rE2PwRa4IQEC5FuNAmjJCyYObZr9UvVh8V3JxE= -github.com/ipfs/go-fetcher v1.5.0/go.mod h1:5pDZ0393oRF/fHiLmtFZtpMNBQfHOYNPtryWedVuSWE= github.com/ipfs/go-fetcher v1.6.1/go.mod h1:27d/xMV8bodjVs9pugh/RCjjK2OZ68UgAMspMdingNo= -github.com/ipfs/go-filestore v1.1.0/go.mod h1:6e1/5Y6NvLuCRdmda/KA4GUhXJQ3Uat6vcWm2DJfxc8= github.com/ipfs/go-filestore v1.2.0 h1:O2wg7wdibwxkEDcl7xkuQsPvJFRBVgVSsOJ/GP6z3yU= github.com/ipfs/go-filestore v1.2.0/go.mod h1:HLJrCxRXquTeEEpde4lTLMaE/MYJZD7WHLkp9z6+FF8= github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28L7zESmM= 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.11.0/go.mod h1:wC+c8vGVjAHthsVIl8LKr37cUra2GOaMYcQNNmMxDqE= github.com/ipfs/go-graphsync v0.13.1 h1:lWiP/WLycoPUYyj3IDEi1GJNP30kFuYOvimcfeuZyQs= github.com/ipfs/go-graphsync v0.13.1/go.mod h1:y8e8G6CmZeL9Srvx1l15CtGiRdf3h5JdQuqPz/iYL0A= -github.com/ipfs/go-ipfs v0.12.1/go.mod h1:Sbei4ScHevs2v47nUgONQMtHlUfaJjjTNDbhUU1OzOM= github.com/ipfs/go-ipfs-blockstore v0.0.1/go.mod h1:d3WClOmRQKFnJ0Jz/jj/zmksX0ma1gROTlovZKBmN08= github.com/ipfs/go-ipfs-blockstore v0.1.0/go.mod h1:5aD0AvHPi7mZc6Ci1WCAhiBQu2IsfTduLl+422H6Rqw= -github.com/ipfs/go-ipfs-blockstore v0.1.4/go.mod h1:Jxm3XMVjh6R17WvxFEiyKBLUGr86HgIYJW/D/MwqeYQ= -github.com/ipfs/go-ipfs-blockstore v0.1.6/go.mod h1:Jxm3XMVjh6R17WvxFEiyKBLUGr86HgIYJW/D/MwqeYQ= github.com/ipfs/go-ipfs-blockstore v0.2.1/go.mod h1:jGesd8EtCM3/zPgx+qr0/feTXGUeRai6adgwC+Q+JvE= -github.com/ipfs/go-ipfs-blockstore v1.0.4-0.20210205083733-fb07d7bc5aec/go.mod h1:feuklK+m9POeWJzYQO7l05yNEgUiX5oELBNA8/Be33E= -github.com/ipfs/go-ipfs-blockstore v1.0.4/go.mod h1:uL7/gTJ8QIZ3MtA3dWf+s1a0U3fJy2fcEZAsovpRp+w= -github.com/ipfs/go-ipfs-blockstore v1.1.1/go.mod h1:w51tNR9y5+QXB0wkNcHt4O2aSZjTdqaEWaQdSxEyUOY= github.com/ipfs/go-ipfs-blockstore v1.1.2/go.mod h1:w51tNR9y5+QXB0wkNcHt4O2aSZjTdqaEWaQdSxEyUOY= github.com/ipfs/go-ipfs-blockstore v1.2.0 h1:n3WTeJ4LdICWs/0VSfjHrlqpPpl6MZ+ySd3j8qz0ykw= github.com/ipfs/go-ipfs-blockstore v1.2.0/go.mod h1:eh8eTFLiINYNSNawfZOC7HOxNTxpB1PFuA5E1m/7exE= @@ -1048,18 +929,14 @@ github.com/ipfs/go-ipfs-blocksutil v0.0.1/go.mod h1:Yq4M86uIOmxmGPUHv/uI7uKqZNtL github.com/ipfs/go-ipfs-chunker v0.0.1/go.mod h1:tWewYK0we3+rMbOh7pPFGDyypCtvGcBFymgY4rSDLAw= 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-cmds v0.6.0/go.mod h1:ZgYiWVnCk43ChwoH8hAmI1IRbuVtq3GSTHwtRB/Kqhk= github.com/ipfs/go-ipfs-cmds v0.7.0 h1:0lEldmB7C83RxIOer38Sv1ob6wIoCAIEOaxiYgcv7wA= github.com/ipfs/go-ipfs-cmds v0.7.0/go.mod h1:y0bflH6m4g6ary4HniYt98UqbrVnRxmRarzeMdLIUn0= -github.com/ipfs/go-ipfs-config v0.5.3/go.mod h1:nSLCFtlaL+2rbl3F+9D4gQZQbT1LjRKx7TJg/IHz6oM= github.com/ipfs/go-ipfs-config v0.18.0 h1:Ta1aNGNEq6RIvzbw7dqzCVZJKb7j+Dd35JFnAOCpT8g= -github.com/ipfs/go-ipfs-config v0.18.0/go.mod h1:wz2lKzOjgJeYJa6zx8W9VT7mz+iSd0laBMqS/9wmX6A= github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= 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 v0.0.1/go.mod h1:gtP9xRaZXqIQRh1HRpp595KbBEdgqWFxefeVKOV8sxo= github.com/ipfs/go-ipfs-ds-help v0.1.1/go.mod h1:SbBafGJuGsPI/QL3j9Fc5YPLeAu+SzOkI0gFwAg+mOs= -github.com/ipfs/go-ipfs-ds-help v1.0.0/go.mod h1:ujAbkeIgkKAWtxxNkoZHWLCyk5JpPoKnGyCcsoF6ueE= github.com/ipfs/go-ipfs-ds-help v1.1.0 h1:yLE2w9RAsl31LtfMt91tRZcrx+e61O5mDxFRR994w4Q= github.com/ipfs/go-ipfs-ds-help v1.1.0/go.mod h1:YR5+6EaebOhfcqVCyqemItCLthrpVNot+rsOU/5IatU= github.com/ipfs/go-ipfs-exchange-interface v0.0.1/go.mod h1:c8MwfHjtQjPoDyiy9cFquVtVHkO9b9Ob3FG91qJnWCM= @@ -1074,20 +951,15 @@ github.com/ipfs/go-ipfs-exchange-offline v0.3.0/go.mod h1:MOdJ9DChbb5u37M1IcbrRB github.com/ipfs/go-ipfs-files v0.0.3/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4= github.com/ipfs/go-ipfs-files v0.0.4/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4= github.com/ipfs/go-ipfs-files v0.0.8/go.mod h1:wiN/jSG8FKyk7N0WyctKSvq3ljIa2NNTiZB55kpTdOs= -github.com/ipfs/go-ipfs-files v0.0.9/go.mod h1:aFv2uQ/qxWpL/6lidWvnSQmaVqCrf0TBGoUr+C1Fo84= github.com/ipfs/go-ipfs-files v0.1.1 h1:/MbEowmpLo9PJTEQk16m9rKzUHjeP4KRU9nWJyJO324= github.com/ipfs/go-ipfs-files v0.1.1/go.mod h1:8xkIrMWH+Y5P7HvJ4Yc5XWwIW2e52dyXUiC0tZyjDbM= github.com/ipfs/go-ipfs-http-client v0.4.0 h1:LNuVbFoKfCohCmcNImml3byM3PpTxTT7RPrv/UoDFkI= github.com/ipfs/go-ipfs-http-client v0.4.0/go.mod h1:NXzPUKt/QVCuR74a8angJCGOSLPImNi5LqaTxIep/70= -github.com/ipfs/go-ipfs-keystore v0.0.2/go.mod h1:H49tRmibOEs7gLMgbOsjC4dqh1u5e0R/SWuc2ScfgSo= -github.com/ipfs/go-ipfs-pinner v0.2.1/go.mod h1:l1AtLL5bovb7opnG77sh4Y10waINz3Y1ni6CvTzx7oo= github.com/ipfs/go-ipfs-posinfo v0.0.1 h1:Esoxj+1JgSjX0+ylc0hUmJCOv6V2vFoZiETLR6OtpRs= github.com/ipfs/go-ipfs-posinfo v0.0.1/go.mod h1:SwyeVP+jCwiDu0C313l/8jg6ZxM0qqtlt2a0vILTc1A= github.com/ipfs/go-ipfs-pq v0.0.1/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7BgUmUfY= github.com/ipfs/go-ipfs-pq v0.0.2 h1:e1vOOW6MuOwG2lqxcLA+wEn93i/9laCY8sXAw76jFOY= github.com/ipfs/go-ipfs-pq v0.0.2/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7BgUmUfY= -github.com/ipfs/go-ipfs-provider v0.7.1/go.mod h1:QwdDYRYnC5sYGLlOwVDY/0ZB6T3zcMtu+5+GdGeUuw8= -github.com/ipfs/go-ipfs-routing v0.0.1/go.mod h1:k76lf20iKFxQTjcJokbPM9iBXVXVZhcOwc360N4nuKs= github.com/ipfs/go-ipfs-routing v0.1.0/go.mod h1:hYoUkJLyAUKhF58tysKpids8RNDPO42BVMgK5dNsoqY= github.com/ipfs/go-ipfs-routing v0.2.1 h1:E+whHWhJkdN9YeoHZNj5itzc+OR292AJ2uE9FFiW0BY= github.com/ipfs/go-ipfs-routing v0.2.1/go.mod h1:xiNNiwgjmLqPS1cimvAw6EyB9rkVDbiocA4yY+wRNLM= @@ -1107,12 +979,11 @@ github.com/ipfs/go-ipld-format v0.2.0/go.mod h1:3l3C1uKoadTPbeNfrDi+xMInYKlx2Cvg github.com/ipfs/go-ipld-format v0.3.0/go.mod h1:co/SdBE8h99968X0hViiw1MNlh6fvxxnHpvVLnH7jSM= github.com/ipfs/go-ipld-format v0.4.0 h1:yqJSaJftjmjc9jEOFYlpkwOLVKv68OD27jFLlSghBlQ= github.com/ipfs/go-ipld-format v0.4.0/go.mod h1:co/SdBE8h99968X0hViiw1MNlh6fvxxnHpvVLnH7jSM= -github.com/ipfs/go-ipld-git v0.1.1/go.mod h1:+VyMqF5lMcJh4rwEppV0e6g4nCCHXThLYYDpKUkJubI= github.com/ipfs/go-ipld-legacy v0.1.0/go.mod h1:86f5P/srAmh9GcIcWQR9lfFLZPrIyyXQeVlOWeeWEuI= github.com/ipfs/go-ipld-legacy v0.1.1 h1:BvD8PEuqwBHLTKqlGFTHSwrwFOMkVESEvwIYwR2cdcc= github.com/ipfs/go-ipld-legacy v0.1.1/go.mod h1:8AyKFCjgRPsQFf15ZQgDB8Din4DML/fOmKZkkFkrIEg= -github.com/ipfs/go-ipns v0.1.2 h1:O/s/0ht+4Jl9+VoxoUo0zaHjnZUS+aBQIKTuzdZ/ucI= -github.com/ipfs/go-ipns v0.1.2/go.mod h1:ioQ0j02o6jdIVW+bmi18f4k2gRf0AV3kZ9KeHYHICnQ= +github.com/ipfs/go-ipns v0.1.3-0.20220819140646-0d8e99ba180a h1:5UPw4plVUYhbZjY9ZWSLVEWUyYWQIM3WYumZQfBlPXI= +github.com/ipfs/go-ipns v0.1.3-0.20220819140646-0d8e99ba180a/go.mod h1:VHLj6/KLxdj+a5BTwpKRoHhtw+TP+hcb0ZUpQSqW4fI= github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= github.com/ipfs/go-log v1.0.0/go.mod h1:JO7RzlMK6rA+CIxFMLOuB6Wf5b81GDiKElL7UPSIKjA= github.com/ipfs/go-log v1.0.1/go.mod h1:HuWlQttfN6FWNHRhlY5yMk/lW7evQC0HHGOxEwMRR8I= @@ -1132,60 +1003,36 @@ github.com/ipfs/go-log/v2 v2.1.2/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHn github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Axpmri6g= github.com/ipfs/go-log/v2 v2.3.0/go.mod h1:QqGoj30OTpnKaG/LKTGTxoP2mmQtjVMEnK72gynbe/g= github.com/ipfs/go-log/v2 v2.4.0/go.mod h1:nPZnh7Cj7lwS3LpRU5Mwr2ol1c2gXIEXuF6aywqrtmo= -github.com/ipfs/go-log/v2 v2.5.0/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI= 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.0.6/go.mod h1:QYPdnlvkOg7GnQRofu9XZimC5ZW5Wi3bKys/4GQQfto= github.com/ipfs/go-merkledag v0.2.3/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= github.com/ipfs/go-merkledag v0.2.4/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= github.com/ipfs/go-merkledag v0.3.2/go.mod h1:fvkZNNZixVW6cKSZ/JfLlON5OlgTXNdRLz0p6QG/I2M= -github.com/ipfs/go-merkledag v0.4.0/go.mod h1:XshXBkhyeS63YNGisLL1uDSfuTyrQIxVUOg3ojR5MOE= github.com/ipfs/go-merkledag v0.5.1/go.mod h1:cLMZXx8J08idkp5+id62iVftUQV+HlYJ3PIhDfZsjA4= github.com/ipfs/go-merkledag v0.6.0 h1:oV5WT2321tS4YQVOPgIrWHvJ0lJobRTerU+i9nmUCuA= github.com/ipfs/go-merkledag v0.6.0/go.mod h1:9HSEwRd5sV+lbykiYP+2NC/3o6MZbKNaa4hfNcH5iH0= 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-metrics-prometheus v0.0.2/go.mod h1:ELLU99AQQNi+zX6GCGm2lAgnzdSH3u5UVlCdqSXnEks= -github.com/ipfs/go-mfs v0.2.1/go.mod h1:Woj80iuw4ajDnIP6+seRaoHpPsc9hmL0pk/nDNDWP88= -github.com/ipfs/go-namesys v0.4.0/go.mod h1:jpJwzodyP8DZdWN6DShRjVZw6gaqMr4nQLBSxU5cR6E= -github.com/ipfs/go-path v0.0.7/go.mod h1:6KTKmeRnBXgqrTvzFrPV3CamxcgvXX/4z79tfAd2Sno= -github.com/ipfs/go-path v0.0.9/go.mod h1:VpDkSBKQ9EFQOUgi54Tq/O/tGi8n1RfYNks13M3DEs8= -github.com/ipfs/go-path v0.1.1/go.mod h1:vC8q4AKOtrjJz2NnllIrmr2ZbGlF5fW2OKKyhV9ggb0= -github.com/ipfs/go-path v0.2.1/go.mod h1:NOScsVgxfC/eIw4nz6OiGwK42PjaSJ4Y/ZFPn1Xe07I= github.com/ipfs/go-path v0.3.0 h1:tkjga3MtpXyM5v+3EbRvOHEoo+frwi4oumw5K+KYWyA= github.com/ipfs/go-path v0.3.0/go.mod h1:NOScsVgxfC/eIw4nz6OiGwK42PjaSJ4Y/ZFPn1Xe07I= -github.com/ipfs/go-peertaskqueue v0.0.4/go.mod h1:03H8fhyeMfKNFWqzYEVyMbcPUeYrqP1MX6Kd+aN+rMQ= github.com/ipfs/go-peertaskqueue v0.1.0/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= -github.com/ipfs/go-peertaskqueue v0.1.1/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= -github.com/ipfs/go-peertaskqueue v0.2.0/go.mod h1:5/eNrBEbtSKWCG+kQK8K8fGNixoYUnr+P7jivavs9lY= github.com/ipfs/go-peertaskqueue v0.7.0/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68ow0Rrb04donIU= github.com/ipfs/go-peertaskqueue v0.7.1 h1:7PLjon3RZwRQMgOTvYccZ+mjzkmds/7YzSWKFlBAypE= github.com/ipfs/go-peertaskqueue v0.7.1/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68ow0Rrb04donIU= -github.com/ipfs/go-pinning-service-http-client v0.1.0/go.mod h1:tcCKmlkWWH9JUUkKs8CrOZBanacNc1dmKLfjlyXAMu4= -github.com/ipfs/go-todocounter v0.0.1/go.mod h1:l5aErvQc8qKE2r7NDMjmq5UNAvuZy0rC8BHOplkWvZ4= github.com/ipfs/go-unixfs v0.2.2-0.20190827150610-868af2e9e5cb/go.mod h1:IwAAgul1UQIcNZzKPYZWOCijryFBeCV79cNubPzol+k= github.com/ipfs/go-unixfs v0.2.4/go.mod h1:SUdisfUjNoSDzzhGVxvCL9QO/nKdwXdr+gbMUdqcbYw= -github.com/ipfs/go-unixfs v0.2.6/go.mod h1:GTTzQvaZsTZARdNkkdjDKFFnBhmO3e5mIM1PkH/x4p0= github.com/ipfs/go-unixfs v0.3.1 h1:LrfED0OGfG98ZEegO4/xiprx2O+yS+krCMQSp7zLVv8= github.com/ipfs/go-unixfs v0.3.1/go.mod h1:h4qfQYzghiIc8ZNFKiLMFWOTzrWIAtzYQ59W/pCFf1o= github.com/ipfs/go-unixfsnode v1.1.2/go.mod h1:5dcE2x03pyjHk4JjamXmunTMzz+VUtqvPwZjIEkfV6s= -github.com/ipfs/go-unixfsnode v1.1.3/go.mod h1:ZZxUM5wXBC+G0Co9FjrYTOm+UlhZTjxLfRYdWY9veZ4= github.com/ipfs/go-unixfsnode v1.4.0 h1:9BUxHBXrbNi8mWHc6j+5C580WJqtVw9uoeEKn4tMhwA= github.com/ipfs/go-unixfsnode v1.4.0/go.mod h1:qc7YFFZ8tABc58p62HnIYbUMwj9chhUuFWmxSokfePo= github.com/ipfs/go-verifcid v0.0.1 h1:m2HI7zIuR5TFyQ1b79Da5N9dnnCP1vcu2QqawmWlK2E= github.com/ipfs/go-verifcid v0.0.1/go.mod h1:5Hrva5KBeIog4A+UpqlaIU+DEstipcJYQQZc0g37pY0= -github.com/ipfs/interface-go-ipfs-core v0.4.0/go.mod h1:UJBcU6iNennuI05amq3FQ7g0JHUkibHFAfhfUIy927o= -github.com/ipfs/interface-go-ipfs-core v0.5.2/go.mod h1:lNBJrdXHtWS46evMPBdWtDQMDsrKcGbxCOGoKLkztOE= github.com/ipfs/interface-go-ipfs-core v0.7.0 h1:7tb+2upz8oCcjIyjo1atdMk+P+u7wPmI+GksBlLE8js= github.com/ipfs/interface-go-ipfs-core v0.7.0/go.mod h1:lF27E/nnSPbylPqKVXGZghal2hzifs3MmjyiEjnc9FY= github.com/ipfs/iptb v1.4.0 h1:YFYTrCkLMRwk/35IMyC6+yjoQSHTEcNcefBStLJzgvo= -github.com/ipfs/iptb v1.4.0/go.mod h1:1rzHpCYtNp87/+hTxG5TfCVn/yMY3dKnLn8tBiMfdmg= github.com/ipfs/iptb-plugins v0.3.0 h1:C1rpq1o5lUZtaAOkLIox5akh6ba4uk/3RwWc6ttVxw0= -github.com/ipfs/iptb-plugins v0.3.0/go.mod h1:5QtOvckeIw4bY86gSH4fgh3p3gCSMn3FmIKr4gaBncA= -github.com/ipfs/tar-utils v0.0.2/go.mod h1:4qlnRWgTVljIMhSG2SqRYn66NT+3wrv/kZt9V+eqxDM= -github.com/ipld/edelweiss v0.1.2/go.mod h1:14NnBVHgrPO8cqDnKg7vc69LGI0aCAcax6mj21+99ec= github.com/ipld/go-car v0.1.0/go.mod h1:RCWzaUh2i4mOEkB3W45Vc+9jnS/M6Qay5ooytiBHl3g= -github.com/ipld/go-car v0.3.2/go.mod h1:WEjynkVt04dr0GwJhry0KlaTeSDEiEYyMPOxDBQ17KE= github.com/ipld/go-car v0.4.0 h1:U6W7F1aKF/OJMHovnOVdst2cpQE5GhmHibQkAixgNcQ= github.com/ipld/go-car v0.4.0/go.mod h1:Uslcn4O9cBKK9wqHm/cLTFacg6RAPv6LZx2mxd2Ypl4= github.com/ipld/go-car/v2 v2.1.1/go.mod h1:+2Yvf0Z3wzkv7NeI69i8tuZ+ft7jyjPYIWZzeVNeFcI= @@ -1201,11 +1048,7 @@ github.com/ipld/go-ipld-prime v0.9.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/j github.com/ipld/go-ipld-prime v0.9.1-0.20210324083106-dc342a9917db/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= github.com/ipld/go-ipld-prime v0.10.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= github.com/ipld/go-ipld-prime v0.11.0/go.mod h1:+WIAkokurHmZ/KwzDOMUuoeJgaRQktHtEaLglS3ZeV8= -github.com/ipld/go-ipld-prime v0.12.3/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= github.com/ipld/go-ipld-prime v0.14.0/go.mod h1:9ASQLwUFLptCov6lIYc70GRB4V7UTyLD0IJtrDJe6ZM= -github.com/ipld/go-ipld-prime v0.14.1/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= -github.com/ipld/go-ipld-prime v0.14.2/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= -github.com/ipld/go-ipld-prime v0.14.4-0.20211217152141-008fd70fc96f/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= github.com/ipld/go-ipld-prime v0.16.0/go.mod h1:axSCuOCBPqrH+gvXr2w9uAOulJqBPhHPT2PjoiiU1qA= github.com/ipld/go-ipld-prime v0.17.0 h1:+U2peiA3aQsE7mrXjD2nYZaZrCcakoz2Wge8K42Ld8g= github.com/ipld/go-ipld-prime v0.17.0/go.mod h1:aYcKm5TIvGfY8P3QBKz/2gKcLxzJ1zDaD+o0bOowhgs= @@ -1214,7 +1057,6 @@ github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd73/go.mod h1:2PJ0JgxyB08t0b2WKrcuqI3di0V+5n6RS/LTUJhkoxY= github.com/ipld/go-ipld-selector-text-lite v0.0.1 h1:lNqFsQpBHc3p5xHob2KvEg/iM5dIFn6iw4L/Hh+kS1Y= github.com/ipld/go-ipld-selector-text-lite v0.0.1/go.mod h1:U2CQmFb+uWzfIEF3I1arrDa5rwtj00PrpiwwCO+k1RM= -github.com/ipld/go-storethehash v0.1.7/go.mod h1:O2CgbSwJfXCrYsjA1g1M7zJmVzzg71BM00ds6pyMLAQ= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52 h1:QG4CGBqCeuBo6aZlGAamSkxWdgWfZGeE49eUOWJPA4c= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52/go.mod h1:fdg+/X9Gg4AsAIzWpEHwnqd+QY3b7lajxyjE1m4hkq4= github.com/jackpal/gateway v1.0.5/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= @@ -1247,7 +1089,6 @@ github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22 github.com/jonboulle/clockwork v0.1.1-0.20190114141812-62fb9bc030d1/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/jonboulle/clockwork v0.2.2 h1:UOGuzwb1PwsrDAObMuhUnj0p5ULPj8V/xJ7Kx9qUBdQ= github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= -github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= @@ -1291,21 +1132,16 @@ github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6 github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/compress v1.15.1 h1:y9FcTHGyrebwfP0ZZqFiaxTaiDnUrGkJkI+f583BL1A= github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5 h1:2U0HzY8BJ8hVwDKIzp7y4voR9CX/nvcfymLmg2UiOio= github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.6/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.0.12/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c= -github.com/klauspost/cpuid/v2 v2.0.14 h1:QRqdp6bb9M9S5yyKeYteXKuoKE4p0tGlra81fKOpWH8= -github.com/klauspost/cpuid/v2 v2.0.14/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c= +github.com/klauspost/cpuid/v2 v2.1.0 h1:eyi1Ad2aNJMW95zcSbmGg7Cg6cq3ADwLpMAP96d8rF0= +github.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg= github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= -github.com/koalacxr/quantile v0.0.1/go.mod h1:bGN/mCZLZ4lrSDHRQ6Lglj9chowGux8sGUIND+DQeD0= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -1341,80 +1177,56 @@ github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6 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-conn-security v0.0.1/go.mod h1:bGmu51N0KU9IEjX7kl2PQjgZa40JQWnayTvNMgD/vyk= -github.com/libp2p/go-conn-security-multistream v0.0.2/go.mod h1:nc9vud7inQ+d6SO0I/6dSWrdMnHnzZNHeyUQqrAJulE= github.com/libp2p/go-conn-security-multistream v0.1.0/go.mod h1:aw6eD7LOsHEX7+2hJkDxw1MteijaVcI+/eP2/x3J1xc= github.com/libp2p/go-conn-security-multistream v0.2.0/go.mod h1:hZN4MjlNetKD3Rq5Jb/P5ohUnFLNzEAR4DLSzpn2QLU= github.com/libp2p/go-conn-security-multistream v0.2.1/go.mod h1:cR1d8gA0Hr59Fj6NhaTpFhJZrjSYuNmhpT2r25zYR70= github.com/libp2p/go-conn-security-multistream v0.3.0/go.mod h1:EEP47t4fw/bTelVmEzIDqSe69hO/ip52xBEhZMLWAHM= -github.com/libp2p/go-doh-resolver v0.3.1/go.mod h1:y5go1ZppAq9N2eppbX0xON01CyPBeUg2yS6BTssssog= -github.com/libp2p/go-eventbus v0.0.2/go.mod h1:Hr/yGlwxA/stuLnpMiu82lpNKpvRy3EaJxPu40XYOwk= github.com/libp2p/go-eventbus v0.1.0/go.mod h1:vROgu5cs5T7cv7POWlWxBaVLxfSegC5UGQf8A2eEmx4= -github.com/libp2p/go-eventbus v0.2.1 h1:VanAdErQnpTioN2TowqNcOijf6YwhuODe4pPKSDpxGc= github.com/libp2p/go-eventbus v0.2.1/go.mod h1:jc2S4SoEVPP48H9Wpzm5aiGwUCBMfGhVhhBjyhhCJs8= +github.com/libp2p/go-eventbus v0.3.0 h1:FCHfSpM469NSXipOoX3npAP7bJHSAmUIxj1qe8AtT5k= +github.com/libp2p/go-eventbus v0.3.0/go.mod h1:d+p2Q4lgRHTBLwOXdzX0hOl8D4hiHHNgcoy1MuomBHU= github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= github.com/libp2p/go-flow-metrics v0.0.2/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs= -github.com/libp2p/go-flow-metrics v0.0.3 h1:8tAs/hSdNvUiLgtlSy3mxwxWP4I9y/jlkPFT7epKdeM= github.com/libp2p/go-flow-metrics v0.0.3/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs= -github.com/libp2p/go-libp2p v0.0.30/go.mod h1:XWT8FGHlhptAv1+3V/+J5mEpzyui/5bvFsNuWYs611A= +github.com/libp2p/go-flow-metrics v0.1.0 h1:0iPhMI8PskQwzh57jB9WxIuIOQ0r+15PChFGkx3Q3WM= +github.com/libp2p/go-flow-metrics v0.1.0/go.mod h1:4Xi8MX8wj5aWNDAZttg6UPmc0ZrnFNsMtpsYUClFtro= github.com/libp2p/go-libp2p v0.1.0/go.mod h1:6D/2OBauqLUoqcADOJpn9WbKqvaM07tDw68qHM0BxUM= github.com/libp2p/go-libp2p v0.1.1/go.mod h1:I00BRo1UuUSdpuc8Q2mN7yDF/oTUTRAX6JWpTiK9Rp8= -github.com/libp2p/go-libp2p v0.3.1/go.mod h1:e6bwxbdYH1HqWTz8faTChKGR0BjPc8p+6SyP8GTTR7Y= -github.com/libp2p/go-libp2p v0.4.0/go.mod h1:9EsEIf9p2UDuwtPd0DwJsAl0qXVxgAnuDGRvHbfATfI= github.com/libp2p/go-libp2p v0.6.1/go.mod h1:CTFnWXogryAHjXAKEbOf1OWY+VeAP3lDMZkfEI5sT54= github.com/libp2p/go-libp2p v0.7.0/go.mod h1:hZJf8txWeCduQRDC/WSqBGMxaTHCOYHt2xSU1ivxn0k= github.com/libp2p/go-libp2p v0.7.4/go.mod h1:oXsBlTLF1q7pxr+9w6lqzS1ILpyHsaBPniVO7zIHGMw= github.com/libp2p/go-libp2p v0.8.1/go.mod h1:QRNH9pwdbEBpx5DTJYg+qxcVaDMAz3Ee/qDKwXujH5o= github.com/libp2p/go-libp2p v0.8.3/go.mod h1:EsH1A+8yoWK+L4iKcbPYu6MPluZ+CHWI9El8cTaefiM= github.com/libp2p/go-libp2p v0.10.0/go.mod h1:yBJNpb+mGJdgrwbKAKrhPU0u3ogyNFTfjJ6bdM+Q/G8= -github.com/libp2p/go-libp2p v0.12.0/go.mod h1:FpHZrfC1q7nA8jitvdjKBDF31hguaC676g/nT9PgQM0= -github.com/libp2p/go-libp2p v0.13.0/go.mod h1:pM0beYdACRfHO1WcJlp65WXyG2A6NqYM+t2DTVAJxMo= -github.com/libp2p/go-libp2p v0.14.0/go.mod h1:dsQrWLAoIn+GkHPN/U+yypizkHiB9tnv79Os+kSgQ4Q= github.com/libp2p/go-libp2p v0.14.3/go.mod h1:d12V4PdKbpL0T1/gsUNN8DfgMuRPDX8bS2QxCZlwRH0= -github.com/libp2p/go-libp2p v0.14.4/go.mod h1:EIRU0Of4J5S8rkockZM7eJp2S0UrCyi55m2kJVru3rM= github.com/libp2p/go-libp2p v0.16.0/go.mod h1:ump42BsirwAWxKzsCiFnTtN1Yc+DuPu76fyMX364/O4= github.com/libp2p/go-libp2p v0.17.0/go.mod h1:Fkin50rsGdv5mm5BshBUtPRZknt9esfmYXBOYcwOTgw= -github.com/libp2p/go-libp2p v0.18.0/go.mod h1:+veaZ9z1SZQhmc5PW78jvnnxZ89Mgvmh4cggO11ETmw= -github.com/libp2p/go-libp2p v0.19.4/go.mod h1:MIt8y481VDhUe4ErWi1a4bvt/CjjFfOq6kZTothWIXY= -github.com/libp2p/go-libp2p v0.20.0/go.mod h1:g0C5Fu+aXXbCXkusCzLycuBowEih3ElmDqtbo61Em7k= -github.com/libp2p/go-libp2p v0.20.1/go.mod h1:XgJHsOhEBVBXp/2Sj9bm/yEyD94uunAaP6oaegdcKks= -github.com/libp2p/go-libp2p v0.21.0 h1:s9yYScuIFY33FOOzwTXbc8QqbvsRyKIWFf0FCSJKrfM= -github.com/libp2p/go-libp2p v0.21.0/go.mod h1:zvcA6/C4mr5/XQarRICh+L1SN9dAHHlSWDq4x5VYxg4= +github.com/libp2p/go-libp2p v0.22.0 h1:2Tce0kHOp5zASFKJbNzRElvh0iZwdtG5uZheNW8chIw= +github.com/libp2p/go-libp2p v0.22.0/go.mod h1:UDolmweypBSjQb2f7xutPnwZ/fxioLbMBxSjRksxxU4= github.com/libp2p/go-libp2p-asn-util v0.0.0-20200825225859-85005c6cf052/go.mod h1:nRMRTab+kZuk0LnKZpxhOVH/ndsdr2Nr//Zltc/vwgo= github.com/libp2p/go-libp2p-asn-util v0.1.0/go.mod h1:wu+AnM9Ii2KgO5jMmS1rz9dvzTdj8BXqsPR9HR0XB7I= 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-autonat v0.0.6/go.mod h1:uZneLdOkZHro35xIhpbtTzLlgYturpu4J5+0cZK3MqE= github.com/libp2p/go-libp2p-autonat v0.1.0/go.mod h1:1tLf2yXxiE/oKGtDwPYWTSYG3PtvYlJmg7NeVtPRqH8= github.com/libp2p/go-libp2p-autonat v0.1.1/go.mod h1:OXqkeGOY2xJVWKAGV2inNF5aKN/djNA3fdpCWloIudE= github.com/libp2p/go-libp2p-autonat v0.2.0/go.mod h1:DX+9teU4pEEoZUqR1PiMlqliONQdNbfzE1C718tcViI= github.com/libp2p/go-libp2p-autonat v0.2.1/go.mod h1:MWtAhV5Ko1l6QBsHQNSuM6b1sRkXrpk0/LqCr+vCVxI= github.com/libp2p/go-libp2p-autonat v0.2.2/go.mod h1:HsM62HkqZmHR2k1xgX34WuWDzk/nBwNHoeyyT4IWV6A= github.com/libp2p/go-libp2p-autonat v0.2.3/go.mod h1:2U6bNWCNsAG9LEbwccBDQbjzQ8Krdjge1jLTE9rdoMM= -github.com/libp2p/go-libp2p-autonat v0.4.0/go.mod h1:YxaJlpr81FhdOv3W3BTconZPfhaYivRdf53g+S2wobk= github.com/libp2p/go-libp2p-autonat v0.4.2/go.mod h1:YxaJlpr81FhdOv3W3BTconZPfhaYivRdf53g+S2wobk= github.com/libp2p/go-libp2p-autonat v0.6.0/go.mod h1:bFC6kY8jwzNNWoqc8iGE57vsfwyJ/lP4O4DOV1e0B2o= github.com/libp2p/go-libp2p-autonat v0.7.0/go.mod h1:uPvPn6J7cN+LCfFwW5tpOYvAz5NvPTc4iBamTV/WDMg= -github.com/libp2p/go-libp2p-autonat-svc v0.1.0/go.mod h1:fqi8Obl/z3R4PFVLm8xFtZ6PBL9MlV/xumymRFkKq5A= -github.com/libp2p/go-libp2p-blankhost v0.0.1/go.mod h1:Ibpbw/7cPPYwFb7PACIWdvxxv0t0XCCI10t7czjAjTc= github.com/libp2p/go-libp2p-blankhost v0.1.1/go.mod h1:pf2fvdLJPsC1FsVrNP3DUUvMzUts2dsLLBEpo1vW1ro= -github.com/libp2p/go-libp2p-blankhost v0.1.3/go.mod h1:KML1//wiKR8vuuJO0y3LUd1uLv+tlkGTAr3jC0S5cLg= github.com/libp2p/go-libp2p-blankhost v0.1.4/go.mod h1:oJF0saYsAXQCSfDq254GMNmLNz6ZTHTOvtF4ZydUvwU= github.com/libp2p/go-libp2p-blankhost v0.1.6/go.mod h1:jONCAJqEP+Z8T6EQviGL4JsQcLx1LgTGtVqFNY8EMfQ= github.com/libp2p/go-libp2p-blankhost v0.2.0/go.mod h1:eduNKXGTioTuQAUcZ5epXi9vMl+t4d8ugUBRQ4SqaNQ= -github.com/libp2p/go-libp2p-blankhost v0.3.0 h1:kTnLArltMabZlzY63pgGDA4kkUcLkBFSM98zBssn/IY= github.com/libp2p/go-libp2p-blankhost v0.3.0/go.mod h1:urPC+7U01nCGgJ3ZsV8jdwTp6Ji9ID0dMTvq+aJ+nZU= -github.com/libp2p/go-libp2p-circuit v0.0.9/go.mod h1:uU+IBvEQzCu953/ps7bYzC/D/R0Ho2A9LfKVVCatlqU= github.com/libp2p/go-libp2p-circuit v0.1.0/go.mod h1:Ahq4cY3V9VJcHcn1SBXjr78AbFkZeIRmfunbA7pmFh8= -github.com/libp2p/go-libp2p-circuit v0.1.1/go.mod h1:Ahq4cY3V9VJcHcn1SBXjr78AbFkZeIRmfunbA7pmFh8= -github.com/libp2p/go-libp2p-circuit v0.1.3/go.mod h1:Xqh2TjSy8DD5iV2cCOMzdynd6h8OTBGoV1AWbWor3qM= github.com/libp2p/go-libp2p-circuit v0.1.4/go.mod h1:CY67BrEjKNDhdTk8UgBX1Y/H5c3xkAcs3gnksxY7osU= github.com/libp2p/go-libp2p-circuit v0.2.1/go.mod h1:BXPwYDN5A8z4OEY9sOfr2DUQMLQvKt/6oku45YUmjIo= github.com/libp2p/go-libp2p-circuit v0.2.2/go.mod h1:nkG3iE01tR3FoQ2nMm06IUrCpCyJp1Eo4A1xYdpjfs4= github.com/libp2p/go-libp2p-circuit v0.2.3/go.mod h1:nkG3iE01tR3FoQ2nMm06IUrCpCyJp1Eo4A1xYdpjfs4= github.com/libp2p/go-libp2p-circuit v0.4.0/go.mod h1:t/ktoFIUzM6uLQ+o1G6NuBl2ANhBKN9Bc8jRIk31MoA= -github.com/libp2p/go-libp2p-circuit v0.6.0/go.mod h1:kB8hY+zCpMeScyvFrKrGicRdid6vNXbunKE4rXATZ0M= -github.com/libp2p/go-libp2p-connmgr v0.1.1/go.mod h1:wZxh8veAmU5qdrfJ0ZBLcU8oJe9L82ciVP/fl1VHjXk= github.com/libp2p/go-libp2p-connmgr v0.2.4/go.mod h1:YV0b/RIm8NGPnnNWM7hG9Q38OeQiQfKhHCCs1++ufn0= github.com/libp2p/go-libp2p-connmgr v0.3.0/go.mod h1:RVoyPjJm0J9Vd1m6qUN2Tn7kJm4rL1Ml20pFsFgPGik= github.com/libp2p/go-libp2p-connmgr v0.4.0 h1:q/KZUS1iMDIQckMZarMYwhQisJqiFPHAVC1c4DR3hDE= @@ -1423,10 +1235,8 @@ github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGc github.com/libp2p/go-libp2p-core v0.0.2/go.mod h1:9dAcntw/n46XycV4RnlBq3BpgrmyUi9LuoTNdPrbUco= github.com/libp2p/go-libp2p-core v0.0.3/go.mod h1:j+YQMNz9WNSkNezXOsahp9kwZBKBvxLpKD316QWSJXE= github.com/libp2p/go-libp2p-core v0.0.4/go.mod h1:jyuCQP356gzfCFtRKyvAbNkyeuxb7OlyhWZ3nls5d2I= -github.com/libp2p/go-libp2p-core v0.0.6/go.mod h1:0d9xmaYAVY5qmbp/fcgxHT3ZJsLjYeYPMJAUKpaCHrE= github.com/libp2p/go-libp2p-core v0.2.0/go.mod h1:X0eyB0Gy93v0DZtSYbEM7RnMChm9Uv3j7yRXjO77xSI= github.com/libp2p/go-libp2p-core v0.2.2/go.mod h1:8fcwTbsG2B+lTgRJ1ICZtiM5GWCWZVoVrLaDRvIRng0= -github.com/libp2p/go-libp2p-core v0.2.3/go.mod h1:GqhyQqyIAPsxFYXHMjfXgMv03lxsvM0mFzuYA9Ib42A= github.com/libp2p/go-libp2p-core v0.2.4/go.mod h1:STh4fdfa5vDYr0/SzYYeqnt+E6KfEV5VxfIrm0bcI0g= github.com/libp2p/go-libp2p-core v0.2.5/go.mod h1:6+5zJmKhsf7yHn1RbmYDu08qDUpIUxGdqHuEZckmZOA= github.com/libp2p/go-libp2p-core v0.3.0/go.mod h1:ACp3DmS3/N64c2jDzcV429ukDpicbL6+TrrxANBjPGw= @@ -1453,81 +1263,42 @@ github.com/libp2p/go-libp2p-core v0.10.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQR github.com/libp2p/go-libp2p-core v0.11.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= github.com/libp2p/go-libp2p-core v0.12.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= github.com/libp2p/go-libp2p-core v0.13.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= -github.com/libp2p/go-libp2p-core v0.14.0/go.mod h1:tLasfcVdTXnixsLB0QYaT1syJOhsbrhG7q6pGrHtBg8= -github.com/libp2p/go-libp2p-core v0.15.1/go.mod h1:agSaboYM4hzB1cWekgVReqV5M4g5M+2eNNejV+1EEhs= -github.com/libp2p/go-libp2p-core v0.16.1/go.mod h1:O3i/7y+LqUb0N+qhzXjBjjpchgptWAVMG1Voegk7b4c= -github.com/libp2p/go-libp2p-core v0.19.0/go.mod h1:AkA+FUKQfYt1FLNef5fOPlo/naAWjKy/RCjkcPjqzYg= -github.com/libp2p/go-libp2p-core v0.19.1 h1:zaZQQCeCrFMtxFa1wHy6AhsVynyNmZAvwgWqSSPT3WE= -github.com/libp2p/go-libp2p-core v0.19.1/go.mod h1:2uLhmmqDiFY+dw+70KkBLeKvvsJHGWUINRDdeV1ip7k= -github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= -github.com/libp2p/go-libp2p-crypto v0.0.2/go.mod h1:eETI5OUfBnvARGOHrJz2eWNyTUxEGZnBxMcbUjfIj4I= +github.com/libp2p/go-libp2p-core v0.20.0 h1:PGKM74+T+O/FaZNARNW32i90RMBHCcgd/hkum2UQ5eY= +github.com/libp2p/go-libp2p-core v0.20.0/go.mod h1:6zR8H7CvQWgYLsbG4on6oLNSGcyKaYFSEYyDt51+bIY= github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI= -github.com/libp2p/go-libp2p-daemon v0.2.2/go.mod h1:kyrpsLB2JeNYR2rvXSVWyY0iZuRIMhqzWR3im9BV6NQ= -github.com/libp2p/go-libp2p-discovery v0.0.5/go.mod h1:YtF20GUxjgoKZ4zmXj8j3Nb2TUSBHFlOCetzYdbZL5I= github.com/libp2p/go-libp2p-discovery v0.1.0/go.mod h1:4F/x+aldVHjHDHuX85x1zWoFTGElt8HnoDzwkFZm29g= github.com/libp2p/go-libp2p-discovery v0.2.0/go.mod h1:s4VGaxYMbw4+4+tsoQTqh7wfxg97AEdo4GYBt6BadWg= github.com/libp2p/go-libp2p-discovery v0.3.0/go.mod h1:o03drFnz9BVAZdzC/QUQ+NeQOu38Fu7LJGEOK2gQltw= github.com/libp2p/go-libp2p-discovery v0.4.0/go.mod h1:bZ0aJSrFc/eX2llP0ryhb1kpgkPyTo23SJ5b7UQCMh4= github.com/libp2p/go-libp2p-discovery v0.5.0/go.mod h1:+srtPIU9gDaBNu//UHvcdliKBIcr4SfDcm0/PfPJLug= github.com/libp2p/go-libp2p-discovery v0.6.0/go.mod h1:/u1voHt0tKIe5oIA1RHBKQLVCWPna2dXmPNHc2zR9S8= -github.com/libp2p/go-libp2p-discovery v0.7.0 h1:6Iu3NyningTb/BmUnEhcTwzwbs4zcywwbfTulM9LHuc= -github.com/libp2p/go-libp2p-discovery v0.7.0/go.mod h1:zPug0Rxib1aQG9iIdwOpRpBf18cAfZgzicO826UQP4I= -github.com/libp2p/go-libp2p-gostream v0.3.0/go.mod h1:pLBQu8db7vBMNINGsAwLL/ZCE8wng5V1FThoaE5rNjc= -github.com/libp2p/go-libp2p-gostream v0.3.1/go.mod h1:1V3b+u4Zhaq407UUY9JLCpboaeufAeVQbnvAt12LRsI= github.com/libp2p/go-libp2p-gostream v0.4.0 h1:heduMMEB78yBqeEQv+P7Fn5X926MHC2jDIC7/7yLpYA= github.com/libp2p/go-libp2p-gostream v0.4.0/go.mod h1:21DVGBcCQwRfEXZpCnZ2kG24QiEkBpEQvG53gYXE4u0= -github.com/libp2p/go-libp2p-host v0.0.1/go.mod h1:qWd+H1yuU0m5CwzAkvbSjqKairayEHdR5MMl7Cwa7Go= -github.com/libp2p/go-libp2p-host v0.0.3/go.mod h1:Y/qPyA6C8j2coYyos1dfRm0I8+nvd4TGrDGt4tA7JR8= -github.com/libp2p/go-libp2p-http v0.2.1/go.mod h1:9KdioZ7XqNH0eZkZG9bulZLzHv11A7/12fT97agqWhg= -github.com/libp2p/go-libp2p-interface-connmgr v0.0.1/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= -github.com/libp2p/go-libp2p-interface-connmgr v0.0.4/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= -github.com/libp2p/go-libp2p-interface-connmgr v0.0.5/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= -github.com/libp2p/go-libp2p-interface-pnet v0.0.1/go.mod h1:el9jHpQAXK5dnTpKA4yfCNBZXvrzdOU75zz+C6ryp3k= -github.com/libp2p/go-libp2p-kad-dht v0.2.1/go.mod h1:k7ONOlup7HKzQ68dE6lSnp07cdxdkmnRa+6B4Fh9/w0= -github.com/libp2p/go-libp2p-kad-dht v0.15.0/go.mod h1:rZtPxYu1TnHHz6n1RggdGrxUX/tA1C2/Wiw3ZMUDrU0= github.com/libp2p/go-libp2p-kad-dht v0.17.0 h1:HWEjqjNVDuf8yuccuswGy1vYGzB0v4Z+yQ4DMDMSIqk= github.com/libp2p/go-libp2p-kad-dht v0.17.0/go.mod h1:zeE26Xo+PY7sS2AgkBQQcBnJEazMT26KGZLUFttl+rk= -github.com/libp2p/go-libp2p-kbucket v0.2.1/go.mod h1:/Rtu8tqbJ4WQ2KTCOMJhggMukOLNLNPY1EtEWWLxUvc= -github.com/libp2p/go-libp2p-kbucket v0.3.1/go.mod h1:oyjT5O7tS9CQurok++ERgc46YLwEpuGoFq9ubvoUOio= github.com/libp2p/go-libp2p-kbucket v0.4.7 h1:spZAcgxifvFZHBD8tErvppbnNiKA5uokDu3CV7axu70= github.com/libp2p/go-libp2p-kbucket v0.4.7/go.mod h1:XyVo99AfQH0foSf176k4jY1xUJ2+jUJIZCSDm7r2YKk= -github.com/libp2p/go-libp2p-loggables v0.0.1/go.mod h1:lDipDlBNYbpyqyPX/KcoO+eq0sJYEVR2JgOexcivchg= github.com/libp2p/go-libp2p-loggables v0.1.0 h1:h3w8QFfCt2UJl/0/NW4K829HX/0S4KD31PQ7m8UXXO8= github.com/libp2p/go-libp2p-loggables v0.1.0/go.mod h1:EyumB2Y6PrYjr55Q3/tiJ/o3xoDasoRYM7nOzEpoa90= -github.com/libp2p/go-libp2p-metrics v0.0.1/go.mod h1:jQJ95SXXA/K1VZi13h52WZMa9ja78zjyy5rspMsC/08= -github.com/libp2p/go-libp2p-mplex v0.1.1/go.mod h1:KUQWpGkCzfV7UIpi8SKsAVxyBgz1c9R5EvxgnwLsb/I= github.com/libp2p/go-libp2p-mplex v0.2.0/go.mod h1:Ejl9IyjvXJ0T9iqUTE1jpYATQ9NM3g+OtR+EMMODbKo= github.com/libp2p/go-libp2p-mplex v0.2.1/go.mod h1:SC99Rxs8Vuzrf/6WhmH41kNn13TiYdAWNYHrwImKLnE= github.com/libp2p/go-libp2p-mplex v0.2.2/go.mod h1:74S9eum0tVQdAfFiKxAyKzNdSuLqw5oadDq7+L/FELo= github.com/libp2p/go-libp2p-mplex v0.2.3/go.mod h1:CK3p2+9qH9x+7ER/gWWDYJ3QW5ZxWDkm+dVvjfuG3ek= -github.com/libp2p/go-libp2p-mplex v0.3.0/go.mod h1:l9QWxRbbb5/hQMECEb908GbS9Sm2UAR2KFZKUJEynEs= github.com/libp2p/go-libp2p-mplex v0.4.0/go.mod h1:yCyWJE2sc6TBTnFpjvLuEJgTSw/u+MamvzILKdX7asw= github.com/libp2p/go-libp2p-mplex v0.4.1/go.mod h1:cmy+3GfqfM1PceHTLL7zQzAAYaryDu6iPSC+CIb094g= -github.com/libp2p/go-libp2p-mplex v0.5.0/go.mod h1:eLImPJLkj3iG5t5lq68w3Vm5NAQ5BcKwrrb2VmOYb3M= -github.com/libp2p/go-libp2p-mplex v0.6.0/go.mod h1:i3usuPrBbh9FD2fLZjGpotyNkwr42KStYZQY7BeTiu4= github.com/libp2p/go-libp2p-nat v0.0.4/go.mod h1:N9Js/zVtAXqaeT99cXgTV9e75KpnWCvVOiGzlcHmBbY= github.com/libp2p/go-libp2p-nat v0.0.5/go.mod h1:1qubaE5bTZMJE+E/uu2URroMbzdubFz1ChgiN79yKPE= github.com/libp2p/go-libp2p-nat v0.0.6/go.mod h1:iV59LVhB3IkFvS6S6sauVTSOrNEANnINbI/fkaLimiw= github.com/libp2p/go-libp2p-nat v0.1.0/go.mod h1:DQzAG+QbDYjN1/C3B6vXucLtz3u9rEonLVPtZVzQqks= -github.com/libp2p/go-libp2p-net v0.0.1/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= -github.com/libp2p/go-libp2p-net v0.0.2/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= -github.com/libp2p/go-libp2p-netutil v0.0.1/go.mod h1:GdusFvujWZI9Vt0X5BKqwWWmZFxecf9Gt03cKxm2f/Q= -github.com/libp2p/go-libp2p-netutil v0.1.0 h1:zscYDNVEcGxyUpMd0JReUZTrpMfia8PmLKcKF72EAMQ= github.com/libp2p/go-libp2p-netutil v0.1.0/go.mod h1:3Qv/aDqtMLTUyQeundkKsA+YCThNdbQD54k3TqjpbFU= -github.com/libp2p/go-libp2p-noise v0.1.1/go.mod h1:QDFLdKX7nluB7DEnlVPbz7xlLHdwHFA9HiohJRr3vwM= +github.com/libp2p/go-libp2p-netutil v0.2.0 h1:DecSQ5nRnE5RfOmlNx+qubPL+rX8NSC6vyPRCiJXzg4= github.com/libp2p/go-libp2p-noise v0.2.0/go.mod h1:IEbYhBBzGyvdLBoxxULL/SGbJARhUeqlO8lVSREYu2Q= github.com/libp2p/go-libp2p-noise v0.3.0/go.mod h1:JNjHbociDJKHD64KTkzGnzqJ0FEV5gHJa6AB00kbCNQ= -github.com/libp2p/go-libp2p-noise v0.4.0/go.mod h1:BzzY5pyzCYSyJbQy9oD8z5oP2idsafjt4/X42h9DjZU= github.com/libp2p/go-libp2p-noise v0.5.0 h1:gwJZ/3iH3MRnBrLIyr/YLdCOnmqfJMptlsFFUIc3j0Y= github.com/libp2p/go-libp2p-noise v0.5.0/go.mod h1:CYYpJ+T4pox1d1J/hhUVxuMf6b2s3c41hFUgS8/yFQw= -github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= -github.com/libp2p/go-libp2p-peer v0.1.1/go.mod h1:jkF12jGB4Gk/IOo+yomm+7oLWxF278F7UnrYUQ1Q8es= github.com/libp2p/go-libp2p-peer v0.2.0/go.mod h1:RCffaCvUyW2CJmG2gAWVqwePwW7JMgxjsHm7+J5kjWY= -github.com/libp2p/go-libp2p-peerstore v0.0.1/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4Ti6k/HtZJ7YKgtSq+20= -github.com/libp2p/go-libp2p-peerstore v0.0.6/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4Ti6k/HtZJ7YKgtSq+20= github.com/libp2p/go-libp2p-peerstore v0.1.0/go.mod h1:2CeHkQsr8svp4fZ+Oi9ykN1HBb6u0MOvdJ7YIsmcwtY= github.com/libp2p/go-libp2p-peerstore v0.1.3/go.mod h1:BJ9sHlm59/80oSkpWgr1MyY1ciXAXV397W6h1GH/uKI= -github.com/libp2p/go-libp2p-peerstore v0.1.4/go.mod h1:+4BDbDiiKf4PzpANZDAT+knVdLxvqh7hXOujessqdzs= github.com/libp2p/go-libp2p-peerstore v0.2.0/go.mod h1:N2l3eVIeAitSg3Pi2ipSrJYnqhVnMNQZo9nkSCuAbnQ= github.com/libp2p/go-libp2p-peerstore v0.2.1/go.mod h1:NQxhNjWxf1d4w6PihR8btWIRjwRLBr4TYKfNgrUkOPA= github.com/libp2p/go-libp2p-peerstore v0.2.2/go.mod h1:NQxhNjWxf1d4w6PihR8btWIRjwRLBr4TYKfNgrUkOPA= @@ -1535,75 +1306,42 @@ github.com/libp2p/go-libp2p-peerstore v0.2.3/go.mod h1:K8ljLdFn590GMttg/luh4caB/ github.com/libp2p/go-libp2p-peerstore v0.2.4/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= github.com/libp2p/go-libp2p-peerstore v0.2.6/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= github.com/libp2p/go-libp2p-peerstore v0.2.7/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= -github.com/libp2p/go-libp2p-peerstore v0.2.8/go.mod h1:gGiPlXdz7mIHd2vfAsHzBNAMqSDkt2UBFwgcITgw1lA= github.com/libp2p/go-libp2p-peerstore v0.4.0/go.mod h1:rDJUFyzEWPpXpEwywkcTYYzDHlwza8riYMaUzaN6hX0= github.com/libp2p/go-libp2p-peerstore v0.6.0/go.mod h1:DGEmKdXrcYpK9Jha3sS7MhqYdInxJy84bIPtSu65bKc= -github.com/libp2p/go-libp2p-peerstore v0.7.0/go.mod h1:cdUWTHro83vpg6unCpGUr8qJoX3e93Vy8o97u5ppIM0= github.com/libp2p/go-libp2p-peerstore v0.7.1 h1:7FpALlqR+3+oOBXdzm3AVt0vjMYLW1b7jM03E4iEHlw= github.com/libp2p/go-libp2p-peerstore v0.7.1/go.mod h1:cdUWTHro83vpg6unCpGUr8qJoX3e93Vy8o97u5ppIM0= github.com/libp2p/go-libp2p-pnet v0.2.0/go.mod h1:Qqvq6JH/oMZGwqs3N1Fqhv8NVhrdYcO0BW4wssv21LA= -github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= -github.com/libp2p/go-libp2p-protocol v0.1.0/go.mod h1:KQPHpAabB57XQxGrXCNvbL6UEXfQqUgC/1adR2Xtflk= -github.com/libp2p/go-libp2p-pubsub v0.1.1/go.mod h1:ZwlKzRSe1eGvSIdU5bD7+8RZN/Uzw0t1Bp9R1znpR/Q= github.com/libp2p/go-libp2p-pubsub v0.3.2/go.mod h1:Uss7/Cfz872KggNb+doCVPHeCDmXB7z500m/R8DaAUk= github.com/libp2p/go-libp2p-pubsub v0.6.0/go.mod h1:nJv87QM2cU0w45KPR1rZicq+FmFIOD16zmT+ep1nOmg= -github.com/libp2p/go-libp2p-pubsub v0.7.0/go.mod h1:EuyBJFtF8qF67IEA98biwK8Xnw5MNJpJ/Z+8iWCMFwc= -github.com/libp2p/go-libp2p-pubsub v0.7.1 h1:e2CPBP5uxvDkE0FiS0obZGZPzt+xuBOc6PpG+50pIAo= -github.com/libp2p/go-libp2p-pubsub v0.7.1/go.mod h1:EuyBJFtF8qF67IEA98biwK8Xnw5MNJpJ/Z+8iWCMFwc= -github.com/libp2p/go-libp2p-pubsub-router v0.5.0/go.mod h1:TRJKskSem3C0aSb3CmRgPwq6IleVFzds6hS09fmZbGM= +github.com/libp2p/go-libp2p-pubsub v0.8.0 h1:KygfDpaa9AeUPGCVcpVenpXNFauDn+5kBYu3EjcL3Tg= +github.com/libp2p/go-libp2p-pubsub v0.8.0/go.mod h1:e4kT+DYjzPUYGZeWk4I+oxCSYTXizzXii5LDRRhjKSw= github.com/libp2p/go-libp2p-pubsub-tracer v0.0.0-20200626141350-e730b32bf1e6 h1:2lH7rMlvDPSvXeOR+g7FE6aqiEwxtpxWKQL8uigk5fQ= github.com/libp2p/go-libp2p-pubsub-tracer v0.0.0-20200626141350-e730b32bf1e6/go.mod h1:8ZodgKS4qRLayfw9FDKDd9DX4C16/GMofDxSldG8QPI= -github.com/libp2p/go-libp2p-quic-transport v0.1.1/go.mod h1:wqG/jzhF3Pu2NrhJEvE+IE0NTHNXslOPn9JQzyCAxzU= github.com/libp2p/go-libp2p-quic-transport v0.5.0/go.mod h1:IEcuC5MLxvZ5KuHKjRu+dr3LjCT1Be3rcD/4d8JrX8M= github.com/libp2p/go-libp2p-quic-transport v0.10.0/go.mod h1:RfJbZ8IqXIhxBRm5hqUEJqjiiY8xmEuq3HUDS993MkA= -github.com/libp2p/go-libp2p-quic-transport v0.11.2/go.mod h1:wlanzKtIh6pHrq+0U3p3DY9PJfGqxMgPaGKaK5LifwQ= github.com/libp2p/go-libp2p-quic-transport v0.13.0/go.mod h1:39/ZWJ1TW/jx1iFkKzzUg00W6tDJh73FC0xYudjr7Hc= github.com/libp2p/go-libp2p-quic-transport v0.15.0/go.mod h1:wv4uGwjcqe8Mhjj7N/Ic0aKjA+/10UnMlSzLO0yRpYQ= github.com/libp2p/go-libp2p-quic-transport v0.15.2/go.mod h1:wv4uGwjcqe8Mhjj7N/Ic0aKjA+/10UnMlSzLO0yRpYQ= -github.com/libp2p/go-libp2p-quic-transport v0.16.0/go.mod h1:1BXjVMzr+w7EkPfiHkKnwsWjPjtfaNT0q8RS3tGDvEQ= -github.com/libp2p/go-libp2p-quic-transport v0.16.1/go.mod h1:1BXjVMzr+w7EkPfiHkKnwsWjPjtfaNT0q8RS3tGDvEQ= -github.com/libp2p/go-libp2p-quic-transport v0.17.0/go.mod h1:x4pw61P3/GRCcSLypcQJE/Q2+E9f4X+5aRcZLXf20LM= -github.com/libp2p/go-libp2p-record v0.0.1/go.mod h1:grzqg263Rug/sRex85QrDOLntdFAymLDLm7lxMgU79Q= github.com/libp2p/go-libp2p-record v0.1.0/go.mod h1:ujNc8iuE5dlKWVy6wuL6dd58t0n7xI4hAIl8pE6wu5Q= -github.com/libp2p/go-libp2p-record v0.1.1/go.mod h1:VRgKajOyMVgP/F0L5g3kH7SVskp17vFi2xheb5uMJtg= github.com/libp2p/go-libp2p-record v0.1.2/go.mod h1:pal0eNcT5nqZaTV7UGhqeGqxFgGdsU/9W//C8dqjQDk= github.com/libp2p/go-libp2p-record v0.1.3 h1:R27hoScIhQf/A8XJZ8lYpnqh9LatJ5YbHs28kCIfql0= github.com/libp2p/go-libp2p-record v0.1.3/go.mod h1:yNUff/adKIfPnYQXgp6FQmNu3gLJ6EMg7+/vv2+9pY4= -github.com/libp2p/go-libp2p-resource-manager v0.1.5/go.mod h1:wJPNjeE4XQlxeidwqVY5G6DLOKqFK33u2n8blpl0I6Y= -github.com/libp2p/go-libp2p-resource-manager v0.2.1/go.mod h1:K+eCkiapf+ey/LADO4TaMpMTP9/Qde/uLlrnRqV4PLQ= -github.com/libp2p/go-libp2p-resource-manager v0.3.0/go.mod h1:K+eCkiapf+ey/LADO4TaMpMTP9/Qde/uLlrnRqV4PLQ= -github.com/libp2p/go-libp2p-resource-manager v0.5.1/go.mod h1:CggtV6EZb+Y0dGh41q5ezO4udcVKyhcEFpydHD8EMe0= -github.com/libp2p/go-libp2p-resource-manager v0.5.3 h1:W8rG2abNBO52SRQYj24AvKmutTJZfoc1OrgzGQPwcRU= -github.com/libp2p/go-libp2p-resource-manager v0.5.3/go.mod h1:CggtV6EZb+Y0dGh41q5ezO4udcVKyhcEFpydHD8EMe0= -github.com/libp2p/go-libp2p-routing v0.0.1/go.mod h1:N51q3yTr4Zdr7V8Jt2JIktVU+3xBBylx1MZeVA6t1Ys= -github.com/libp2p/go-libp2p-routing v0.1.0/go.mod h1:zfLhI1RI8RLEzmEaaPwzonRvXeeSHddONWkcTcB54nE= github.com/libp2p/go-libp2p-routing-helpers v0.2.3 h1:xY61alxJ6PurSi+MXbywZpelvuU4U4p/gPTxjqCqTzY= github.com/libp2p/go-libp2p-routing-helpers v0.2.3/go.mod h1:795bh+9YeoFl99rMASoiVgHdi5bjack0N1+AFAdbvBw= -github.com/libp2p/go-libp2p-secio v0.0.3/go.mod h1:hS7HQ00MgLhRO/Wyu1bTX6ctJKhVpm+j2/S2A5UqYb0= github.com/libp2p/go-libp2p-secio v0.1.0/go.mod h1:tMJo2w7h3+wN4pgU2LSYeiKPrfqBgkOsdiKK77hE7c8= github.com/libp2p/go-libp2p-secio v0.2.0/go.mod h1:2JdZepB8J5V9mBp79BmwsaPQhRPNN2NrnB2lKQcdy6g= github.com/libp2p/go-libp2p-secio v0.2.1/go.mod h1:cWtZpILJqkqrSkiYcDBh5lA3wbT2Q+hz3rJQq3iftD8= github.com/libp2p/go-libp2p-secio v0.2.2/go.mod h1:wP3bS+m5AUnFA+OFO7Er03uO1mncHG0uVwGrwvjYlNY= -github.com/libp2p/go-libp2p-swarm v0.0.6/go.mod h1:s5GZvzg9xXe8sbeESuFpjt8CJPTCa8mhEusweJqyFy8= github.com/libp2p/go-libp2p-swarm v0.1.0/go.mod h1:wQVsCdjsuZoc730CgOvh5ox6K8evllckjebkdiY5ta4= -github.com/libp2p/go-libp2p-swarm v0.2.1/go.mod h1:x07b4zkMFo2EvgPV2bMTlNmdQc8i+74Jjio7xGvsTgU= github.com/libp2p/go-libp2p-swarm v0.2.2/go.mod h1:fvmtQ0T1nErXym1/aa1uJEyN7JzaTNyBcHImCxRpPKU= github.com/libp2p/go-libp2p-swarm v0.2.3/go.mod h1:P2VO/EpxRyDxtChXz/VPVXyTnszHvokHKRhfkEgFKNM= github.com/libp2p/go-libp2p-swarm v0.2.4/go.mod h1:/xIpHFPPh3wmSthtxdGbkHZ0OET1h/GGZes8Wku/M5Y= github.com/libp2p/go-libp2p-swarm v0.2.7/go.mod h1:ZSJ0Q+oq/B1JgfPHJAT2HTall+xYRNYp1xs4S2FBWKA= github.com/libp2p/go-libp2p-swarm v0.2.8/go.mod h1:JQKMGSth4SMqonruY0a8yjlPVIkb0mdNSwckW7OYziM= github.com/libp2p/go-libp2p-swarm v0.3.0/go.mod h1:hdv95GWCTmzkgeJpP+GK/9D9puJegb7H57B5hWQR5Kk= -github.com/libp2p/go-libp2p-swarm v0.3.1/go.mod h1:hdv95GWCTmzkgeJpP+GK/9D9puJegb7H57B5hWQR5Kk= -github.com/libp2p/go-libp2p-swarm v0.4.0/go.mod h1:XVFcO52VoLoo0eitSxNQWYq4D6sydGOweTOAjJNraCw= github.com/libp2p/go-libp2p-swarm v0.5.0/go.mod h1:sU9i6BoHE0Ve5SKz3y9WfKrh8dUat6JknzUehFx8xW4= -github.com/libp2p/go-libp2p-swarm v0.5.3/go.mod h1:NBn7eNW2lu568L7Ns9wdFrOhgRlkRnIDg0FLKbuu3i8= github.com/libp2p/go-libp2p-swarm v0.8.0/go.mod h1:sOMp6dPuqco0r0GHTzfVheVBh6UEL0L1lXUZ5ot2Fvc= github.com/libp2p/go-libp2p-swarm v0.9.0/go.mod h1:2f8d8uxTJmpeqHF/1ujjdXZp+98nNIbujVOMEZxCbZ8= -github.com/libp2p/go-libp2p-swarm v0.10.0/go.mod h1:71ceMcV6Rg/0rIQ97rsZWMzto1l9LnNquef+efcRbmA= -github.com/libp2p/go-libp2p-swarm v0.10.2/go.mod h1:Pdkq0QU5a+qu+oyqIV3bknMsnzk9lnNyKvB9acJ5aZs= -github.com/libp2p/go-libp2p-swarm v0.11.0 h1:ITgsTEY2tA4OxFJGcWeugiMh2x5+VOEnI2JStT1EWxI= -github.com/libp2p/go-libp2p-swarm v0.11.0/go.mod h1:sumjVYrC84gPSZOFKL8hNcnN6HZvJSwJ8ymaXeko4Lk= -github.com/libp2p/go-libp2p-testing v0.0.1/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= github.com/libp2p/go-libp2p-testing v0.0.2/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= github.com/libp2p/go-libp2p-testing v0.0.3/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= github.com/libp2p/go-libp2p-testing v0.0.4/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= @@ -1615,36 +1353,19 @@ github.com/libp2p/go-libp2p-testing v0.4.0/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotl github.com/libp2p/go-libp2p-testing v0.4.2/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0= github.com/libp2p/go-libp2p-testing v0.5.0/go.mod h1:QBk8fqIL1XNcno/l3/hhaIEn4aLRijpYOR+zVjjlh+A= github.com/libp2p/go-libp2p-testing v0.6.0/go.mod h1:QBk8fqIL1XNcno/l3/hhaIEn4aLRijpYOR+zVjjlh+A= -github.com/libp2p/go-libp2p-testing v0.7.0/go.mod h1:OLbdn9DbgdMwv00v+tlp1l3oe2Cl+FAjoWIA2pa0X6E= -github.com/libp2p/go-libp2p-testing v0.8.0/go.mod h1:gRdsNxQSxAZowTgcLY7CC33xPmleZzoBpqSYbWenqPc= -github.com/libp2p/go-libp2p-testing v0.9.0/go.mod h1:Td7kbdkWqYTJYQGTwzlgXwaqldraIanyjuRiAbK/XQU= -github.com/libp2p/go-libp2p-testing v0.9.2/go.mod h1:Td7kbdkWqYTJYQGTwzlgXwaqldraIanyjuRiAbK/XQU= -github.com/libp2p/go-libp2p-testing v0.11.0 h1:+R7FRl/U3Y00neyBSM2qgDzqz3HkWH24U9nMlascHL4= -github.com/libp2p/go-libp2p-testing v0.11.0/go.mod h1:qG4sF27dfKFoK9KlVzK2y52LQKhp0VEmLjV5aDqr1Hg= +github.com/libp2p/go-libp2p-testing v0.12.0 h1:EPvBb4kKMWO29qP4mZGyhVzUyR25dvfUIK5WDu6iPUA= github.com/libp2p/go-libp2p-tls v0.1.3/go.mod h1:wZfuewxOndz5RTnCAxFliGjvYSDA40sKitV4c50uI1M= github.com/libp2p/go-libp2p-tls v0.3.0/go.mod h1:fwF5X6PWGxm6IDRwF3V8AVCCj/hOd5oFlg+wo2FxJDY= github.com/libp2p/go-libp2p-tls v0.3.1/go.mod h1:fwF5X6PWGxm6IDRwF3V8AVCCj/hOd5oFlg+wo2FxJDY= -github.com/libp2p/go-libp2p-tls v0.4.1/go.mod h1:EKCixHEysLNDlLUoKxv+3f/Lp90O2EXNjTr0UQDnrIw= github.com/libp2p/go-libp2p-tls v0.5.0 h1:aRNTeOI8Ljm1r4L2uMGxkMsVnyZoPwaqQqMw23qAsQs= github.com/libp2p/go-libp2p-tls v0.5.0/go.mod h1:1a4tq0xQSZ0kAkDkZVAppuP3SAIUHcnzi2djJ/2EN4I= -github.com/libp2p/go-libp2p-transport v0.0.1/go.mod h1:UzbUs9X+PHOSw7S3ZmeOxfnwaQY5vGDzZmKPod3N3tk= -github.com/libp2p/go-libp2p-transport v0.0.5/go.mod h1:StoY3sx6IqsP6XKoabsPnHCwqKXWUMWU7Rfcsubee/A= -github.com/libp2p/go-libp2p-transport-upgrader v0.0.4/go.mod h1:RGq+tupk+oj7PzL2kn/m1w6YXxcIAYJYeI90h6BGgUc= github.com/libp2p/go-libp2p-transport-upgrader v0.1.1/go.mod h1:IEtA6or8JUbsV07qPW4r01GnTenLW4oi3lOPbUMGJJA= github.com/libp2p/go-libp2p-transport-upgrader v0.2.0/go.mod h1:mQcrHj4asu6ArfSoMuyojOdjx73Q47cYD7s5+gZOlns= github.com/libp2p/go-libp2p-transport-upgrader v0.3.0/go.mod h1:i+SKzbRnvXdVbU3D1dwydnTmKRPXiAR/fyvi1dXuL4o= -github.com/libp2p/go-libp2p-transport-upgrader v0.4.0/go.mod h1:J4ko0ObtZSmgn5BX5AmegP+dK3CSnU2lMCKsSq/EY0s= github.com/libp2p/go-libp2p-transport-upgrader v0.4.2/go.mod h1:NR8ne1VwfreD5VIWIU62Agt/J18ekORFU/j1i2y8zvk= github.com/libp2p/go-libp2p-transport-upgrader v0.4.3/go.mod h1:bpkldbOWXMrXhpZbSV1mQxTrefOg2Fi+k1ClDSA4ppw= -github.com/libp2p/go-libp2p-transport-upgrader v0.4.6/go.mod h1:JE0WQuQdy+uLZ5zOaI3Nw9dWGYJIA7mywEtP2lMvnyk= github.com/libp2p/go-libp2p-transport-upgrader v0.5.0/go.mod h1:Rc+XODlB3yce7dvFV4q/RmyJGsFcCZRkeZMu/Zdg0mo= github.com/libp2p/go-libp2p-transport-upgrader v0.6.0/go.mod h1:1e07y1ZSZdHo9HPbuU8IztM1Cj+DR5twgycb4pnRzRo= -github.com/libp2p/go-libp2p-transport-upgrader v0.7.0/go.mod h1:GIR2aTRp1J5yjVlkUoFqMkdobfob6RnAwYg/RZPhrzg= -github.com/libp2p/go-libp2p-transport-upgrader v0.7.1/go.mod h1:GIR2aTRp1J5yjVlkUoFqMkdobfob6RnAwYg/RZPhrzg= -github.com/libp2p/go-libp2p-xor v0.0.0-20210714161855-5c005aca55db/go.mod h1:LSTM5yRnjGZbWNTA/hRwq2gGFrvRIbQJscoIL/u6InY= -github.com/libp2p/go-libp2p-xor v0.1.0/go.mod h1:LSTM5yRnjGZbWNTA/hRwq2gGFrvRIbQJscoIL/u6InY= -github.com/libp2p/go-libp2p-yamux v0.1.2/go.mod h1:xUoV/RmYkg6BW/qGxA9XJyg+HzXFYkeXbnhjmnYzKp8= -github.com/libp2p/go-libp2p-yamux v0.1.3/go.mod h1:VGSQVrqkh6y4nm0189qqxMtvyBft44MOYYPpYKXiVt4= github.com/libp2p/go-libp2p-yamux v0.2.0/go.mod h1:Db2gU+XfLpm6E4rG5uGCFX6uXA8MEXOxFcRoXUODaK8= github.com/libp2p/go-libp2p-yamux v0.2.1/go.mod h1:1FBXiHDk1VyRM1C0aez2bCfHQ4vMZKkAQzZbkSQt5fI= github.com/libp2p/go-libp2p-yamux v0.2.2/go.mod h1:lIohaR0pT6mOt0AZ0L2dFze9hds9Req3OfS+B+dv4qw= @@ -1653,30 +1374,19 @@ github.com/libp2p/go-libp2p-yamux v0.2.7/go.mod h1:X28ENrBMU/nm4I3Nx4sZ4dgjZ6VhL github.com/libp2p/go-libp2p-yamux v0.2.8/go.mod h1:/t6tDqeuZf0INZMTgd0WxIRbtK2EzI2h7HbFm9eAKI4= github.com/libp2p/go-libp2p-yamux v0.4.0/go.mod h1:+DWDjtFMzoAwYLVkNZftoucn7PelNoy5nm3tZ3/Zw30= github.com/libp2p/go-libp2p-yamux v0.5.0/go.mod h1:AyR8k5EzyM2QN9Bbdg6X1SkVVuqLwTGf0L4DFq9g6po= -github.com/libp2p/go-libp2p-yamux v0.5.1/go.mod h1:dowuvDu8CRWmr0iqySMiSxK+W0iL5cMVO9S94Y6gkv4= -github.com/libp2p/go-libp2p-yamux v0.5.3/go.mod h1:Vy3TMonBAfTMXHWopsMc8iX/XGRYrRlpUaMzaeuHV/s= github.com/libp2p/go-libp2p-yamux v0.5.4/go.mod h1:tfrXbyaTqqSU654GTvK3ocnSZL3BuHoeTSqhcel1wsE= github.com/libp2p/go-libp2p-yamux v0.6.0/go.mod h1:MRhd6mAYnFRnSISp4M8i0ClV/j+mWHo2mYLifWGw33k= github.com/libp2p/go-libp2p-yamux v0.7.0/go.mod h1:fMyA0CsPfHkIuBU0wjRGrCjTBFiXTXxG0k5M4ETv+08= -github.com/libp2p/go-libp2p-yamux v0.8.0/go.mod h1:yTkPgN2ib8FHyU1ZcVD7aelzyAqXXwEPbyx+aSKm9h8= -github.com/libp2p/go-libp2p-yamux v0.8.1/go.mod h1:rUozF8Jah2dL9LLGyBaBeTQeARdwhefMCTQVQt6QobE= -github.com/libp2p/go-libp2p-yamux v0.8.2/go.mod h1:rUozF8Jah2dL9LLGyBaBeTQeARdwhefMCTQVQt6QobE= -github.com/libp2p/go-libp2p-yamux v0.9.1/go.mod h1:wRc6wvyxQINFcKe7daL4BeQ02Iyp+wxyC8WCNfngBrA= -github.com/libp2p/go-maddr-filter v0.0.1/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= github.com/libp2p/go-maddr-filter v0.0.4/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= github.com/libp2p/go-maddr-filter v0.0.5/go.mod h1:Jk+36PMfIqCJhAnaASRH83bdAvfDRp/w6ENFaC9bG+M= github.com/libp2p/go-maddr-filter v0.1.0 h1:4ACqZKw8AqiuJfwFGq1CYDFugfXTOos+qQ3DETkhtCE= github.com/libp2p/go-maddr-filter v0.1.0/go.mod h1:VzZhTXkMucEGGEOSKddrwGiOv0tUhgnKqNEmIAz/bPU= github.com/libp2p/go-mplex v0.0.3/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= -github.com/libp2p/go-mplex v0.0.4/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= github.com/libp2p/go-mplex v0.1.0/go.mod h1:SXgmdki2kwCUlCCbfGLEgHjC4pFqhTp0ZoV6aiKgxDU= github.com/libp2p/go-mplex v0.1.1/go.mod h1:Xgz2RDCi3co0LeZfgjm4OgUF15+sVR8SRcu3SFXI1lk= github.com/libp2p/go-mplex v0.1.2/go.mod h1:Xgz2RDCi3co0LeZfgjm4OgUF15+sVR8SRcu3SFXI1lk= github.com/libp2p/go-mplex v0.2.0/go.mod h1:0Oy/A9PQlwBytDRp4wSkFnzHYDKcpLot35JQ6msjvYQ= github.com/libp2p/go-mplex v0.3.0/go.mod h1:0Oy/A9PQlwBytDRp4wSkFnzHYDKcpLot35JQ6msjvYQ= -github.com/libp2p/go-mplex v0.4.0/go.mod h1:y26Lx+wNVtMYMaPu300Cbot5LkEZ4tJaNYeHeT9dh6E= -github.com/libp2p/go-mplex v0.6.0/go.mod h1:y26Lx+wNVtMYMaPu300Cbot5LkEZ4tJaNYeHeT9dh6E= -github.com/libp2p/go-mplex v0.7.0/go.mod h1:rW8ThnRcYWft/Jb2jeORBmPd6xuG3dGxWN/W168L9EU= github.com/libp2p/go-msgio v0.0.2/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= github.com/libp2p/go-msgio v0.0.3/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= github.com/libp2p/go-msgio v0.0.4/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= @@ -1699,8 +1409,9 @@ github.com/libp2p/go-openssl v0.0.2/go.mod h1:v8Zw2ijCSWBQi8Pq5GAixw6DbFfa9u6VIY github.com/libp2p/go-openssl v0.0.3/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= github.com/libp2p/go-openssl v0.0.4/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= github.com/libp2p/go-openssl v0.0.5/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= -github.com/libp2p/go-openssl v0.0.7 h1:eCAzdLejcNVBzP/iZM9vqHnQm+XyCEbSSIheIPRGNsw= github.com/libp2p/go-openssl v0.0.7/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= +github.com/libp2p/go-openssl v0.1.0 h1:LBkKEcUv6vtZIQLVTegAil8jbNpJErQ9AnT+bWV+Ooo= +github.com/libp2p/go-openssl v0.1.0/go.mod h1:OiOxwPpL3n4xlenjx2h7AwSGaFSC/KZvf6gNdOBQMtc= github.com/libp2p/go-reuseport v0.0.1/go.mod h1:jn6RmB1ufnQwl0Q1f+YxAj8isJgDCQzaaxIFYDhcYEA= github.com/libp2p/go-reuseport v0.0.2/go.mod h1:SPD+5RwGC7rcnzngoYC86GjPzjSywuQyMVAheVBD9nQ= github.com/libp2p/go-reuseport v0.1.0/go.mod h1:bQVn9hmfcTaoo0c9v5pBhOarsU1eNOBZdaAd2hzXRKU= @@ -1709,41 +1420,25 @@ github.com/libp2p/go-reuseport v0.2.0/go.mod h1:bvVho6eLMm6Bz5hmU0LYN3ixd3nPPvtI github.com/libp2p/go-reuseport-transport v0.0.2/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= github.com/libp2p/go-reuseport-transport v0.0.3/go.mod h1:Spv+MPft1exxARzP2Sruj2Wb5JSyHNncjf1Oi2dEbzM= github.com/libp2p/go-reuseport-transport v0.0.4/go.mod h1:trPa7r/7TJK/d+0hdBLOCGvpQQVOU74OXbNCIMkufGw= -github.com/libp2p/go-reuseport-transport v0.0.5/go.mod h1:TC62hhPc8qs5c/RoXDZG6YmjK+/YWUPC0yYmeUecbjc= github.com/libp2p/go-reuseport-transport v0.1.0/go.mod h1:vev0C0uMkzriDY59yFHD9v+ujJvYmDQVLowvAjEOmfw= github.com/libp2p/go-sockaddr v0.0.2/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= github.com/libp2p/go-sockaddr v0.1.0/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= github.com/libp2p/go-sockaddr v0.1.1/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= -github.com/libp2p/go-socket-activation v0.1.0/go.mod h1:gzda2dNkMG5Ti2OfWNNwW0FDIbj0g/aJJU320FcLfhk= github.com/libp2p/go-stream-muxer v0.0.1/go.mod h1:bAo8x7YkSpadMTbtTaxGVHWUQsR/l5MEaHbKaliuT14= -github.com/libp2p/go-stream-muxer v0.1.0/go.mod h1:8JAVsjeRBCWwPoZeH0W1imLOcriqXJyFvB0mR4A04sQ= -github.com/libp2p/go-stream-muxer-multistream v0.1.1/go.mod h1:zmGdfkQ1AzOECIAcccoL8L//laqawOsO03zX8Sa+eGw= github.com/libp2p/go-stream-muxer-multistream v0.2.0/go.mod h1:j9eyPol/LLRqT+GPLSxvimPhNph4sfYfMoDPd7HkzIc= github.com/libp2p/go-stream-muxer-multistream v0.3.0/go.mod h1:yDh8abSIzmZtqtOt64gFJUXEryejzNb0lisTt+fAMJA= -github.com/libp2p/go-stream-muxer-multistream v0.4.0/go.mod h1:nb+dGViZleRP4XcyHuZSVrJCBl55nRBOMmiSL/dyziw= -github.com/libp2p/go-tcp-transport v0.0.4/go.mod h1:+E8HvC8ezEVOxIo3V5vCK9l1y/19K427vCzQ+xHKH/o= github.com/libp2p/go-tcp-transport v0.1.0/go.mod h1:oJ8I5VXryj493DEJ7OsBieu8fcg2nHGctwtInJVpipc= github.com/libp2p/go-tcp-transport v0.1.1/go.mod h1:3HzGvLbx6etZjnFlERyakbaYPdfjg2pWP97dFZworkY= github.com/libp2p/go-tcp-transport v0.2.0/go.mod h1:vX2U0CnWimU4h0SGSEsg++AzvBcroCGYw28kh94oLe0= -github.com/libp2p/go-tcp-transport v0.2.1/go.mod h1:zskiJ70MEfWz2MKxvFB/Pv+tPIB1PpPUrHIWQ8aFw7M= github.com/libp2p/go-tcp-transport v0.2.3/go.mod h1:9dvr03yqrPyYGIEN6Dy5UvdJZjyPFvl1S/igQ5QD1SU= -github.com/libp2p/go-tcp-transport v0.2.4/go.mod h1:9dvr03yqrPyYGIEN6Dy5UvdJZjyPFvl1S/igQ5QD1SU= -github.com/libp2p/go-tcp-transport v0.2.7/go.mod h1:lue9p1b3VmZj1MhhEGB/etmvF/nBQ0X9CW2DutBT3MM= github.com/libp2p/go-tcp-transport v0.4.0/go.mod h1:0y52Rwrn4076xdJYu/51/qJIdxz+EWDAOG2S45sV3VI= -github.com/libp2p/go-tcp-transport v0.5.0/go.mod h1:UPPL0DIjQqiWRwVAb+CEQlaAG0rp/mCqJfIhFcLHc4Y= -github.com/libp2p/go-tcp-transport v0.5.1/go.mod h1:UPPL0DIjQqiWRwVAb+CEQlaAG0rp/mCqJfIhFcLHc4Y= -github.com/libp2p/go-testutil v0.0.1/go.mod h1:iAcJc/DKJQanJ5ws2V+u5ywdL2n12X1WbbEG+Jjy69I= github.com/libp2p/go-testutil v0.1.0/go.mod h1:81b2n5HypcVyrCg/MJx4Wgfp/VHojytjVe/gLzZ2Ehc= -github.com/libp2p/go-ws-transport v0.0.5/go.mod h1:Qbl4BxPfXXhhd/o0wcrgoaItHqA9tnZjoFZnxykuaXU= github.com/libp2p/go-ws-transport v0.1.0/go.mod h1:rjw1MG1LU9YDC6gzmwObkPd/Sqwhw7yT74kj3raBFuo= -github.com/libp2p/go-ws-transport v0.1.2/go.mod h1:dsh2Ld8F+XNmzpkaAijmg5Is+e9l6/1tK/6VFOdN69Y= github.com/libp2p/go-ws-transport v0.2.0/go.mod h1:9BHJz/4Q5A9ludYWKoGCFC5gUElzlHoKzu0yY9p/klM= github.com/libp2p/go-ws-transport v0.3.0/go.mod h1:bpgTJmRZAvVHrgHybCVyqoBmyLQ1fiZuEaBYusP5zsk= github.com/libp2p/go-ws-transport v0.3.1/go.mod h1:bpgTJmRZAvVHrgHybCVyqoBmyLQ1fiZuEaBYusP5zsk= github.com/libp2p/go-ws-transport v0.4.0/go.mod h1:EcIEKqf/7GDjth6ksuS/6p7R49V4CBY6/E7R/iyhYUA= github.com/libp2p/go-ws-transport v0.5.0/go.mod h1:I2juo1dNTbl8BKSBYo98XY85kU2xds1iamArLvl8kNg= -github.com/libp2p/go-ws-transport v0.6.0/go.mod h1:dXqtI9e2JV9FtF1NOtWVZSKXh5zXvnuwPXfj8GPBbYU= -github.com/libp2p/go-yamux v1.2.1/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/libp2p/go-yamux v1.2.2/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/libp2p/go-yamux v1.2.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/libp2p/go-yamux v1.3.0/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= @@ -1751,31 +1446,20 @@ github.com/libp2p/go-yamux v1.3.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZ github.com/libp2p/go-yamux v1.3.5/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/libp2p/go-yamux v1.3.7/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= github.com/libp2p/go-yamux v1.4.0/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= -github.com/libp2p/go-yamux v1.4.1 h1:P1Fe9vF4th5JOxxgQvfbOHkrGqIZniTLf+ddhZp8YTI= github.com/libp2p/go-yamux v1.4.1/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= -github.com/libp2p/go-yamux/v2 v2.0.0/go.mod h1:NVWira5+sVUIU6tu1JWvaRn1dRnG+cawOJiflsAM+7U= -github.com/libp2p/go-yamux/v2 v2.1.1/go.mod h1:3So6P6TV6r75R9jiBpiIKgU/66lOarCZjqROGxzPpPQ= github.com/libp2p/go-yamux/v2 v2.2.0/go.mod h1:3So6P6TV6r75R9jiBpiIKgU/66lOarCZjqROGxzPpPQ= github.com/libp2p/go-yamux/v2 v2.3.0/go.mod h1:iTU+lOIn/2h0AgKcL49clNTwfEw+WSfDYrXe05EyKIs= -github.com/libp2p/go-yamux/v3 v3.0.1/go.mod h1:s2LsDhHbh+RfCsQoICSYt58U2f8ijtPANFD8BmE74Bo= -github.com/libp2p/go-yamux/v3 v3.0.2/go.mod h1:s2LsDhHbh+RfCsQoICSYt58U2f8ijtPANFD8BmE74Bo= -github.com/libp2p/go-yamux/v3 v3.1.1/go.mod h1:jeLEQgLXqE2YqX1ilAClIfCMDY+0uXQUKmmb/qp0gT4= github.com/libp2p/go-yamux/v3 v3.1.2 h1:lNEy28MBk1HavUAlzKgShp+F6mn/ea1nDYWftZhFW9Q= github.com/libp2p/go-yamux/v3 v3.1.2/go.mod h1:jeLEQgLXqE2YqX1ilAClIfCMDY+0uXQUKmmb/qp0gT4= github.com/libp2p/zeroconf/v2 v2.1.1/go.mod h1:fuJqLnUwZTshS3U/bMRJ3+ow/v9oid1n0DmyYyNO1Xs= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= -github.com/lucas-clemente/quic-go v0.11.2/go.mod h1:PpMmPfPKO9nKJ/psF49ESTAGQSdfXxlg1otPbEB2nOw= github.com/lucas-clemente/quic-go v0.16.0/go.mod h1:I0+fcNTdb9eS1ZcjQZbDVPGchJ86chcIxPALn9lEJqE= github.com/lucas-clemente/quic-go v0.19.3/go.mod h1:ADXpNbTQjq1hIzCpB+y/k5iz4n4z4IwqoLb94Kh5Hu8= -github.com/lucas-clemente/quic-go v0.21.2/go.mod h1:vF5M1XqhBAHgbjKcJOXY3JZz3GP0T3FQhz/uyOUS38Q= github.com/lucas-clemente/quic-go v0.23.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2AsqtJ6bDhjEfxx0= github.com/lucas-clemente/quic-go v0.24.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2AsqtJ6bDhjEfxx0= -github.com/lucas-clemente/quic-go v0.25.0/go.mod h1:YtzP8bxRVCBlO77yRanE264+fY/T2U9ZlW1AaHOsMOg= -github.com/lucas-clemente/quic-go v0.27.0/go.mod h1:AzgQoPda7N+3IqMMMkywBKggIFo2KT6pfnlrQ2QieeI= -github.com/lucas-clemente/quic-go v0.27.1/go.mod h1:AzgQoPda7N+3IqMMMkywBKggIFo2KT6pfnlrQ2QieeI= -github.com/lucas-clemente/quic-go v0.28.0 h1:9eXVRgIkMQQyiyorz/dAaOYIx3TFzXsIFkNFz4cxuJM= -github.com/lucas-clemente/quic-go v0.28.0/go.mod h1:oGz5DKK41cJt5+773+BSO9BXDsREY4HLf7+0odGAPO0= +github.com/lucas-clemente/quic-go v0.28.1 h1:Uo0lvVxWg5la9gflIF9lwa39ONq85Xq2D91YNEIslzU= +github.com/lucas-clemente/quic-go v0.28.1/go.mod h1:oGz5DKK41cJt5+773+BSO9BXDsREY4HLf7+0odGAPO0= github.com/lucasb-eyer/go-colorful v1.0.3 h1:QIbQXiugsb+q10B+MI+7DI1oQLdmnep86tWFlaaUAac= github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/lufia/iostat v1.1.0/go.mod h1:rEPNA0xXgjHQjuI5Cy05sLlS2oRcSlWHRLrvh/AQ+Pg= @@ -1791,33 +1475,27 @@ github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= -github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/marcopolo/go-fil-markets v1.23.1-0.20220811180806-b8e84162b48e h1:eItqdWJLVVGhsEuAFcYYaOHVsVd2Fdy5D/tn91nHlaE= github.com/marcopolo/go-fil-markets v1.23.1-0.20220811180806-b8e84162b48e/go.mod h1:ZOPAjEUia7H60F7p0kEupi0FR7Hy4Zfz90BpR1TMBwI= github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= github.com/marten-seemann/qpack v0.1.0/go.mod h1:LFt1NU/Ptjip0C2CPkhimBz5CGE3WGDAUWqna+CNTrI= github.com/marten-seemann/qpack v0.2.1/go.mod h1:F7Gl5L1jIgN1D11ucXefiuJS9UMVP2opoCp2jDKb7wc= -github.com/marten-seemann/qtls v0.2.3/go.mod h1:xzjG7avBwGGbdZ8dTGxlBnLArsVKLvwmjgmPuiQEcYk= github.com/marten-seemann/qtls v0.9.1/go.mod h1:T1MmAdDPyISzxlK6kjRr0pcZFBVd1OZbBb/j3cvzHhk= github.com/marten-seemann/qtls v0.10.0/go.mod h1:UvMd1oaYDACI99/oZUYLzMCkBXQVT0aGm99sJhbT8hs= github.com/marten-seemann/qtls-go1-15 v0.1.1/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= github.com/marten-seemann/qtls-go1-15 v0.1.4/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= -github.com/marten-seemann/qtls-go1-15 v0.1.5/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= github.com/marten-seemann/qtls-go1-16 v0.1.4/go.mod h1:gNpI2Ol+lRS3WwSOtIUUtRwZEQMXjYK+dQSBFbethAk= github.com/marten-seemann/qtls-go1-16 v0.1.5 h1:o9JrYPPco/Nukd/HpOHMHZoBDXQqoNtUCmny98/1uqQ= github.com/marten-seemann/qtls-go1-16 v0.1.5/go.mod h1:gNpI2Ol+lRS3WwSOtIUUtRwZEQMXjYK+dQSBFbethAk= -github.com/marten-seemann/qtls-go1-17 v0.1.0-rc.1/go.mod h1:fz4HIxByo+LlWcreM4CZOYNuz3taBQ8rN2X6FqvaWo8= github.com/marten-seemann/qtls-go1-17 v0.1.0/go.mod h1:fz4HIxByo+LlWcreM4CZOYNuz3taBQ8rN2X6FqvaWo8= -github.com/marten-seemann/qtls-go1-17 v0.1.1/go.mod h1:C2ekUKcDdz9SDWxec1N/MvcXBpaX9l3Nx67XaR84L5s= github.com/marten-seemann/qtls-go1-17 v0.1.2 h1:JADBlm0LYiVbuSySCHeY863dNkcpMmDR7s0bLKJeYlQ= github.com/marten-seemann/qtls-go1-17 v0.1.2/go.mod h1:C2ekUKcDdz9SDWxec1N/MvcXBpaX9l3Nx67XaR84L5s= -github.com/marten-seemann/qtls-go1-18 v0.1.0-beta.1/go.mod h1:PUhIQk19LoFt2174H4+an8TYvWOGjb/hHwphBeaDHwI= -github.com/marten-seemann/qtls-go1-18 v0.1.1/go.mod h1:mJttiymBAByA49mhlNZZGrH5u1uXYZJ+RW28Py7f4m4= github.com/marten-seemann/qtls-go1-18 v0.1.2 h1:JH6jmzbduz0ITVQ7ShevK10Av5+jBEKAHMntXmIV7kM= github.com/marten-seemann/qtls-go1-18 v0.1.2/go.mod h1:mJttiymBAByA49mhlNZZGrH5u1uXYZJ+RW28Py7f4m4= -github.com/marten-seemann/qtls-go1-19 v0.1.0-beta.1 h1:7m/WlWcSROrcK5NxuXaxYD32BZqe/LEEnBrWcH/cOqQ= github.com/marten-seemann/qtls-go1-19 v0.1.0-beta.1/go.mod h1:5HTDWtVudo/WFsHKRNuOhWlbdjrfs5JHrYb0wIJqGpI= +github.com/marten-seemann/qtls-go1-19 v0.1.0 h1:rLFKD/9mp/uq1SYGYuVZhm83wkmU95pK5df3GufyYYU= +github.com/marten-seemann/qtls-go1-19 v0.1.0/go.mod h1:5HTDWtVudo/WFsHKRNuOhWlbdjrfs5JHrYb0wIJqGpI= github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd h1:br0buuQ854V8u83wA0rVZ8ttrq5CpaPZdvrK0LP2lOk= github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd/go.mod h1:QuCEs1Nt24+FYQEqAAncTDPJIuGs+LxK1MCiFL25pMU= github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= @@ -1840,11 +1518,13 @@ github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcME 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 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-pointer v0.0.1 h1:n+XhsuGeVO6MEAp7xyEukFINEa+Quek5psIR/ylA6o0= +github.com/mattn/go-pointer v0.0.1/go.mod h1:2zXcozF6qYGgmsG+SeTZz3oAbFLdD3OWqnUbNvJZAlc= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.10 h1:CoZ3S2P7pvtP45xOtBw+/mDL2z0RKI576gSkzRRpdGg= github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= @@ -1867,10 +1547,8 @@ github.com/miekg/dns v1.1.22/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKju github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/miekg/dns v1.1.28/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.29/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= -github.com/miekg/dns v1.1.31/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= -github.com/miekg/dns v1.1.48/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME= 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/mikioh/tcp v0.0.0-20190314235350-803a9b46060c h1:bzE/A84HN25pxAuk9Eej1Kz9OUelF97nAc82bDquQI8= @@ -1882,8 +1560,6 @@ github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc/go.mod h1:cGKTAVKx4S github.com/mileusna/useragent v0.0.0-20190129205925-3e331f0949a5/go.mod h1:JWhYAp2EXqUtsxTKdeGlY8Wp44M7VxThC9FEoNGi2IE= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= -github.com/minio/highwayhash v1.0.1/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= -github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= github.com/minio/sha256-simd v0.1.0/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= @@ -1892,7 +1568,6 @@ github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= @@ -1903,14 +1578,12 @@ github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0Qu github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.2.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= -github.com/montanaflynn/stats v0.6.6/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= @@ -1935,16 +1608,11 @@ github.com/multiformats/go-multiaddr v0.3.0/go.mod h1:dF9kph9wfJ+3VLAaeBqo9Of8x4 github.com/multiformats/go-multiaddr v0.3.1/go.mod h1:uPbspcUPd5AfaP6ql3ujFY+QWzmBD8uLLL4bXW0XfGc= github.com/multiformats/go-multiaddr v0.3.3/go.mod h1:lCKNGP1EQ1eZ35Za2wlqnabm9xQkib3fyB+nZXHLag0= github.com/multiformats/go-multiaddr v0.4.0/go.mod h1:YcpyLH8ZPudLxQlemYBPhSm0/oCXAT8Z4mzFpyoPyRc= -github.com/multiformats/go-multiaddr v0.4.1/go.mod h1:3afI9HfVW8csiF8UZqtpYRiDyew8pRX7qLIGHu9FLuM= -github.com/multiformats/go-multiaddr v0.5.0/go.mod h1:3KAxNkUqLTJ20AAwN4XVX4kZar+bR+gh4zgbfr3SNug= github.com/multiformats/go-multiaddr v0.6.0 h1:qMnoOPj2s8xxPU5kZ57Cqdr0hHhARz7mFsPMIiYNqzg= github.com/multiformats/go-multiaddr v0.6.0/go.mod h1:F4IpaKZuPP360tOMn2Tpyu0At8w23aRyVqeK0DbFeGM= github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= -github.com/multiformats/go-multiaddr-dns v0.0.3/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= -github.com/multiformats/go-multiaddr-dns v0.1.0/go.mod h1:01k2RAqtoXIuPa3DCavAE9/6jc6nM0H3EgZyfUhN2oY= github.com/multiformats/go-multiaddr-dns v0.2.0/go.mod h1:TJ5pr5bBO7Y1B18djPuRsVkduhQH2YqYSbxWJzYGdK0= -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= github.com/multiformats/go-multiaddr-fmt v0.0.1/go.mod h1:aBYjqL4T/7j4Qx+R73XSv/8JsgnRFlf0w2KGLCmXl3Q= @@ -1963,11 +1631,9 @@ github.com/multiformats/go-multibase v0.0.2/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/g github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc= github.com/multiformats/go-multibase v0.1.1 h1:3ASCDsuLX8+j4kx58qnJ4YFq/JWTJpCyDW27ztsVTOI= github.com/multiformats/go-multibase v0.1.1/go.mod h1:ZEjHE+IsUrgp5mhlEAYjMtZwK1k4haNkcaPg9aoe1a8= -github.com/multiformats/go-multicodec v0.2.0/go.mod h1:/y4YVwkfMyry5kFbMTbLJKErhycTIftytRV+llXdyS4= github.com/multiformats/go-multicodec v0.3.0/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ= github.com/multiformats/go-multicodec v0.3.1-0.20210902112759-1539a079fd61/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ= github.com/multiformats/go-multicodec v0.3.1-0.20211210143421-a526f306ed2c/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ= -github.com/multiformats/go-multicodec v0.4.1/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ= github.com/multiformats/go-multicodec v0.5.0 h1:EgU6cBe/D7WRwQb1KmnBvU7lrcFGMggZVTPtOW9dDHs= github.com/multiformats/go-multicodec v0.5.0/go.mod h1:DiY2HFaEp5EhEXb/iYzVAunmyX/aSFMxq2KMKfWEues= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= @@ -1978,19 +1644,13 @@ github.com/multiformats/go-multihash v0.0.10/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpK github.com/multiformats/go-multihash v0.0.13/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= github.com/multiformats/go-multihash v0.0.14/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= github.com/multiformats/go-multihash v0.0.15/go.mod h1:D6aZrWNLFTV/ynMpKsNtB40mJzmCl4jb1alC0OvHiHg= -github.com/multiformats/go-multihash v0.0.16/go.mod h1:zhfEIgVnB/rPMfxgFw15ZmGoNaKyNUIE4IWHG/kC+Ag= github.com/multiformats/go-multihash v0.1.0/go.mod h1:RJlXsxt6vHGaia+S8We0ErjhojtKzPP2AH4+kYM7k84= -github.com/multiformats/go-multihash v0.2.0 h1:oytJb9ZA1OUW0r0f9ea18GiaPOo4SXyc7p2movyUuo4= -github.com/multiformats/go-multihash v0.2.0/go.mod h1:WxoMcYG85AZVQUyRyo9s4wULvW5qrI9vb2Lt6evduFc= -github.com/multiformats/go-multistream v0.0.1/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= -github.com/multiformats/go-multistream v0.0.4/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= +github.com/multiformats/go-multihash v0.2.1 h1:aem8ZT0VA2nCHHk7bPJ1BjUbHNciqZC/d16Vve9l108= +github.com/multiformats/go-multihash v0.2.1/go.mod h1:WxoMcYG85AZVQUyRyo9s4wULvW5qrI9vb2Lt6evduFc= github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= github.com/multiformats/go-multistream v0.1.1/go.mod h1:KmHZ40hzVxiaiwlj3MEbYgK9JFk2/9UktWZAF54Du38= -github.com/multiformats/go-multistream v0.2.0/go.mod h1:5GZPQZbkWOLOn3J2y4Y99vVW7vOfsAflxARk3x14o6k= github.com/multiformats/go-multistream v0.2.1/go.mod h1:5GZPQZbkWOLOn3J2y4Y99vVW7vOfsAflxARk3x14o6k= github.com/multiformats/go-multistream v0.2.2/go.mod h1:UIcnm7Zuo8HKG+HkWgfQsGL+/MIEhyTqbODbIUwSXKs= -github.com/multiformats/go-multistream v0.3.0/go.mod h1:ODRoqamLUsETKS9BNcII4gcRsJBU5VAwRIv7O39cEXg= -github.com/multiformats/go-multistream v0.3.1/go.mod h1:ODRoqamLUsETKS9BNcII4gcRsJBU5VAwRIv7O39cEXg= github.com/multiformats/go-multistream v0.3.3 h1:d5PZpjwRgVlbwfdTDjife7XszfZd8KYWfROYFlGcR8o= github.com/multiformats/go-multistream v0.3.3/go.mod h1:ODRoqamLUsETKS9BNcII4gcRsJBU5VAwRIv7O39cEXg= github.com/multiformats/go-varint v0.0.1/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= @@ -2004,20 +1664,13 @@ github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRW github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= -github.com/nats-io/jwt v1.2.2/go.mod h1:/xX356yQA6LuXI9xWW7mZNpxgF2mBmGecH+Fj34sP5Q= -github.com/nats-io/jwt/v2 v2.0.3/go.mod h1:VRP+deawSXyhNjXmxPCHskrR6Mq50BqpEI5SEcNiGlY= github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= -github.com/nats-io/nats-server/v2 v2.5.0/go.mod h1:Kj86UtrXAL6LwYRA6H4RqzkHhK0Vcv2ZnKD5WbQ1t3g= github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= -github.com/nats-io/nats.go v1.12.1/go.mod h1:BPko4oXsySz4aSWeFgOHLZs3G4Jq4ZAyE6/zMCxRT6w= github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nkeys v0.2.0/go.mod h1:XdZpAbhgyyODYqjTawOnIOI7VlbKSarI9Gfy1tqEu/s= -github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= -github.com/ngdinhtoan/glide-cleanup v0.2.0/go.mod h1:UQzsmiDOb8YV3nOsCxK/c9zPpCZVNoHScRE3EO9pVMM= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nikkolasg/hexjson v0.0.0-20181101101858-78e39397e00c h1:5bFTChQxSKNwy8ALwOebjekYExl9HTT9urdawqC95tA= github.com/nikkolasg/hexjson v0.0.0-20181101101858-78e39397e00c/go.mod h1:7qN3Y0BvzRUf4LofcoJplQL10lsFDb4PYlePTVwrP28= @@ -2055,8 +1708,7 @@ github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoT github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.13.0 h1:7lLHu94wT9Ij0o6EWWclhu0aOh32VxhkwEJvzuWPeak= github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= -github.com/Op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= -github.com/open-rpc/meta-schema v0.0.0-20201029221707-1b72ef2ea333/go.mod h1:Ag6rSXkHIckQmjFBCweJEEt1mrTPBv8b9W4aU/NQWfI= +github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opencontainers/runtime-spec v1.0.2 h1:UfAcuLBJB9Coz72x1hgl8O5RVzTdNiaglX6v2DM6FI0= github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opentracing-contrib/go-grpc v0.0.0-20180928155321-4b5a12d3ff02/go.mod h1:JNdpVEzCpXBgIiv4ds+TzhN1hrtxq6ClLrTlT9OQRSc= @@ -2077,7 +1729,6 @@ github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTm github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= -github.com/openzipkin/zipkin-go v0.2.5/go.mod h1:KpXfKdgRDnnhsxw4pNIH9Md5lyFqKUa4YDFlwRYAMyE= github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= @@ -2088,7 +1739,6 @@ github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtP github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= -github.com/performancecopilot/speed/v4 v4.0.0/go.mod h1:qxrSyuDGrTOWfV+uKRFhfxw6h/4HXRGUiZiufxo49BM= 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/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= @@ -2097,7 +1747,6 @@ github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -2113,14 +1762,11 @@ github.com/polydawn/refmt v0.0.0-20190809202753-05966cbd336a/go.mod h1:uIp+gprXx github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e h1:ZOcivgkkFRnjfoTcGsDq3UQYiBmekwLA+qg0OjyB/ls= github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/prometheus/alertmanager v0.20.0/go.mod h1:9g2i48FAyZW6BtbsnvHtMHQXl2aVtrORKwKVCQ+nbrg= github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= github.com/prometheus/client_golang v1.2.1/go.mod h1:XMU6Z2MjaRKVu/dC1qupJI9SiNkDYzz3xecMgSW/F+U= github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= @@ -2140,7 +1786,6 @@ github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6T github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= @@ -2153,25 +1798,23 @@ github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9 github.com/prometheus/common v0.28.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.33.0/go.mod h1:gB3sOl7P0TvJabZpLY5uQMpUqRCPPCyRLCZYc7JZTNE= -github.com/prometheus/common v0.35.0 h1:Eyr+Pw2VymWejHqCugNaQXkAi6KayVNxaHeu6khmFBE= -github.com/prometheus/common v0.35.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= +github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE= +github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= github.com/prometheus/node_exporter v1.0.0-rc.0.0.20200428091818-01054558c289/go.mod h1:FGbBv5OPKjch+jNUJmEQpMZytIdyW0NdBtWFcfSKusc= github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190425082905-87a4384529e0/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.0.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= +github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= github.com/prometheus/prometheus v0.0.0-20200609090129-a6600f564e3c/go.mod h1:S5n0C6tSgdnwWshBUceRx5G1OsjLv/EeZ9t3wIfEtsY= github.com/prometheus/statsd_exporter v0.21.0 h1:hA05Q5RFeIjgwKIYEdFd59xu5Wwaznf33yKI+pyX6T8= github.com/prometheus/statsd_exporter v0.21.0/go.mod h1:rbT83sZq2V+p73lHhPZfMc3MLCHmSHelCh9hSGYNLTQ= @@ -2183,7 +1826,6 @@ github.com/raulk/go-watchdog v1.3.0/go.mod h1:fIvOnLbF0b0ZwkB9YU4mOW9Did//4vPZtD github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0 h1:MkV+77GLUNo5oJ0jf870itWm3D0Sjh7+Za9gazKc5LQ= github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/retailnext/hllpp v1.0.1-0.20180308014038-101a6d2f8b52/go.mod h1:RDpi1RftBQPUCDRw6SmxeaREsAaRKnOclghuzp/WRzc= github.com/rivo/uniseg v0.1.0 h1:+2KBaVoUmb9XzDsrx/Ct0W/EYOSFf/nWTauy++DprtY= github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= @@ -2194,13 +1836,11 @@ github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.8.1 h1:geMPLpDpQOgVyCg5z5GoRwLHepNdb71NXb67XFkP+Eg= -github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= github.com/rs/cors v1.6.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= 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/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/zerolog v1.21.0/go.mod h1:ZPhntP/xmq1nnND05hhpAh2QMhSsA4UN3MGZ6O2J3hM= -github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= 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= @@ -2290,9 +1930,7 @@ github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DM github.com/src-d/envconfig v1.0.0/go.mod h1:Q9YQZ7BKITldTBnoxsE5gOeB5y66RyPXeue/R4aaNBc= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/amqp v1.0.0/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= -github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= @@ -2301,7 +1939,6 @@ github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSS github.com/stretchr/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= 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.3.1-0.20190311161405-34c6fa2dc709/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= github.com/stretchr/testify v1.6.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= @@ -2317,21 +1954,16 @@ github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cb github.com/testground/sdk-go v0.2.6 h1:sMwv0/caNNODKfdPigNqmSSIZLcse7pZX6fgrjCGBIs= github.com/testground/sdk-go v0.2.6/go.mod h1:Q4dnWsUBH+dZ1u7aEGDBHWGUaLfhitjUq3UJQqxeTmk= github.com/texttheater/golang-levenshtein v0.0.0-20180516184445-d188e65d659e/go.mod h1:XDKHRm5ThF8YJjx001LtgelzsoaEcvnA7lVWz9EeX3g= -github.com/tidwall/gjson v1.6.0/go.mod h1:P256ACg0Mn+j1RXIDXoss50DeIABTYK1PULOJHhxOls= -github.com/tidwall/match v1.0.1/go.mod h1:LujAq0jyVjBy028G1WhWfIzbpQfMO8bBZ6Tyb0+pL9E= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= github.com/tinylib/msgp v1.1.0/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= -github.com/tj/go-spin v1.1.0/go.mod h1:Mg1mzmePZm4dva8Qz60H2lHwmJ2loum4VIrLgVnKwh4= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= -github.com/tv42/httpunix v0.0.0-20191220191345-2ba4b9c3382c/go.mod h1:hzIxponao9Kjc7aWznkXaL4U4TWaDSs8zcsY4Ka08nM= github.com/uber-go/tally v3.3.15+incompatible/go.mod h1:YDTIBxdXyOU/sCWilKB4bgyufu1cEi0jdVnRdxvjnmU= github.com/uber/athenadriver v1.1.4/go.mod h1:tQjho4NzXw55LGfSZEcETuYydpY1vtmixUabHkC1K/E= github.com/uber/jaeger-client-go v2.15.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-client-go v2.23.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-client-go v2.23.1+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= -github.com/uber/jaeger-client-go v2.25.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-client-go v2.28.0+incompatible h1:G4QSBfvPKvg5ZM2j9MrJFdfI5iSljY/WnJqOGFao6HI= github.com/uber/jaeger-client-go v2.28.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-lib v1.5.1-0.20181102163054-1fc5c315e03c/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= @@ -2341,7 +1973,6 @@ github.com/uber/jaeger-lib v2.4.1+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6 github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli v1.22.2 h1:gsqYFH8bb9ekPA12kRo0hfjngWQjkJPlN9R0N78BoUo= github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli/v2 v2.0.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= github.com/urfave/cli/v2 v2.2.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= @@ -2355,11 +1986,8 @@ github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+ github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= 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= github.com/warpfork/go-testmark v0.3.0/go.mod h1:jhEf8FVxd+F17juRubpmut64NEG6I2rgkUhlcqqXwE0= -github.com/warpfork/go-testmark v0.9.0/go.mod h1:jhEf8FVxd+F17juRubpmut64NEG6I2rgkUhlcqqXwE0= github.com/warpfork/go-testmark v0.10.0 h1:E86YlUMYfwIacEsQGlnTvjk1IgYkyTGjPhF0RnwTCmw= -github.com/warpfork/go-testmark v0.10.0/go.mod h1:jhEf8FVxd+F17juRubpmut64NEG6I2rgkUhlcqqXwE0= github.com/warpfork/go-wish v0.0.0-20180510122957-5ad1f5abf436/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= github.com/warpfork/go-wish v0.0.0-20190328234359-8b3e70f8e830/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= github.com/warpfork/go-wish v0.0.0-20200122115046-b9ea61034e4a h1:G++j5e0OC488te356JvdhaM8YS6nMsjLAYF7JxCv07w= @@ -2368,7 +1996,6 @@ github.com/weaveworks/common v0.0.0-20200512154658-384f10054ec5 h1:EYxr08r8x6r/5 github.com/weaveworks/common v0.0.0-20200512154658-384f10054ec5/go.mod h1:c98fKi5B9u8OsKGiWHLRKus6ToQ1Tubeow44ECO1uxY= github.com/weaveworks/promrus v1.2.0 h1:jOLf6pe6/vss4qGHjXmGz4oDJQA+AOCqEL3FvvZGz7M= github.com/weaveworks/promrus v1.2.0/go.mod h1:SaE82+OJ91yqjrE1rsvBWVzNZKcHYFtMUyS1+Ogs/KA= -github.com/whyrusleeping/base32 v0.0.0-20170828182744-c30ac30633cc/go.mod h1:r45hJU7yEoA81k6MWNhpMj/kms0n14dkzkxYHoB96UM= github.com/whyrusleeping/bencher v0.0.0-20190829221104-bb6607aa8bba h1:X4n8JG2e2biEZZXdBKt9HX7DN3bYGFUqljqqy0DqgnY= github.com/whyrusleeping/bencher v0.0.0-20190829221104-bb6607aa8bba/go.mod h1:CHQnYnQUEPydYCwuy8lmTHfGmdw9TKrhWV0xLx8l0oM= github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11 h1:5HZfQkwe0mIfyDmc1Em5GqlNRzcdtlv4HTNmdpt7XH0= @@ -2385,20 +2012,16 @@ github.com/whyrusleeping/cbor-gen v0.0.0-20200810223238-211df3b9e24c/go.mod h1:f github.com/whyrusleeping/cbor-gen v0.0.0-20200812213548-958ddffe352c/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20200826160007-0b9f6c5fb163/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20210118024343-169e9d70c0c2/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= -github.com/whyrusleeping/cbor-gen v0.0.0-20210219115102-f37d292932f2/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20210303213153-67a261a1d291/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= -github.com/whyrusleeping/cbor-gen v0.0.0-20220302191723-37c43cae8e14/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20220323183124-98fa8256a799 h1:DOOT2B85S0tHoLGTzV+FakaSSihgRCVwZkjqKQP5L/w= github.com/whyrusleeping/cbor-gen v0.0.0-20220323183124-98fa8256a799/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= 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-ctrlnet v0.0.0-20180313164037-f564fbbdaa95/go.mod h1:SJqKCCPXRfBFCwXjfNT/skfsceF7+MBFLI2OrvuRA7g= github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 h1:EKhdznlJHPMoKr0XTrX+IlJs1LH3lyx2nfr1dOlZ79k= github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1/go.mod h1:8UvriyWtv5Q5EOgjHaSseUEdkQfvwFv1I/In/O2M9gc= github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= github.com/whyrusleeping/go-logging v0.0.1/go.mod h1:lDPYj54zutzG1XYfHAhcc7oNXEburHQBn+Iqd4yS4vE= github.com/whyrusleeping/go-notifier v0.0.0-20170827234753-097c5d47330f/go.mod h1:cZNvX9cFybI01GriPRMXDtczuvUhgbcYr9iCGaNlRv8= -github.com/whyrusleeping/go-sysinfo v0.0.0-20190219211824-4a357d4b90b1/go.mod h1:tKH72zYNt/exx6/5IQO6L9LoQ0rEjd5SbbWaDTs9Zso= github.com/whyrusleeping/ledger-filecoin-go v0.9.1-0.20201010031517-c3dcc1bddce4 h1:NwiwjQDB3CzQ5XH0rdMh1oQqzJH7O2PSLWxif/w3zsY= github.com/whyrusleeping/ledger-filecoin-go v0.9.1-0.20201010031517-c3dcc1bddce4/go.mod h1:K+EVq8d5QcQ2At5VECsA+SNZvWefyBXh8TnIsxo1OvQ= github.com/whyrusleeping/mafmt v1.2.8/go.mod h1:faQJFPbLSxzD9xpA02ttW/tS9vZykNvXwGvqIpk20FA= @@ -2414,24 +2037,20 @@ github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7V github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xlab/c-for-go v0.0.0-20201112171043-ea6dce5809cb/go.mod h1:pbNsDSxn1ICiNn9Ct4ZGNrwzfkkwYbx/lw8VuyutFIg= -github.com/xlab/pkgconfig v0.0.0-20170226114623-cea12a0fd245/go.mod h1:C+diUUz7pxhNY6KAoLgrTYARGWnt82zWTylZlxT92vk= github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= github.com/xorcare/golden v0.6.0/go.mod h1:7T39/ZMvaSEZlBPoYfVFmsBLmUl3uz9IuzWj/U6FtvQ= github.com/xorcare/golden v0.6.1-0.20191112154924-b87f686d7542 h1:oWgZJmC1DorFZDpfMfWg7xk29yEOZiXmo/wZl+utTI8= -github.com/xorcare/golden v0.6.1-0.20191112154924-b87f686d7542/go.mod h1:7T39/ZMvaSEZlBPoYfVFmsBLmUl3uz9IuzWj/U6FtvQ= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= -github.com/ybbus/jsonrpc/v2 v2.1.6/go.mod h1:rIuG1+ORoiqocf9xs/v+ecaAVeo3zcZHQgInyKFMeg0= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/zondax/hid v0.9.0 h1:eiT3P6vNxAEVxXMw66eZUAAnU2zD33JBkfG/EnfAKl8= github.com/zondax/hid v0.9.0/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= +github.com/zondax/hid v0.9.1-0.20220302062450-5552068d2266 h1:O9XLFXGkVswDFmH9LaYpqu+r/AAFWqr0DL6V00KEVFg= +github.com/zondax/hid v0.9.1-0.20220302062450-5552068d2266/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= github.com/zondax/ledger-go v0.12.1 h1:hYRcyznPRJp+5mzF2sazTLP2nGvGjYDD2VzhHhFomLU= github.com/zondax/ledger-go v0.12.1/go.mod h1:KatxXrVDzgWwbssUWsF5+cOJHXPvzQ09YSlzGNuhOEo= go.dedis.ch/fixbuf v1.0.3 h1:hGcV9Cd/znUxlusJ64eAlExS+5cJDIyTyEG+otu5wQs= @@ -2447,10 +2066,6 @@ go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.4 h1:hi1bXHMVrlQh6WwxAy+qZCV/SYIlqo+Ushwdpa4tAKg= go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.mongodb.org/mongo-driver v1.1.2/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= @@ -2465,28 +2080,19 @@ go.opencensus.io v0.22.1/go.mod h1:Ap50jQcDJrx6rB6VgeeFPtuPIf3wMRvRfrfYDO6+BmA= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.6-0.20201102222123-380f4078db9f/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= go.opentelemetry.io/otel v1.2.0/go.mod h1:aT17Fk0Z1Nor9e0uisf98LrntPGMnk4frBO9+dkf69I= -go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs= go.opentelemetry.io/otel v1.7.0 h1:Z2lA3Tdch0iDcrhJXDIlC94XE+bxok1F9B+4Lz/lGsM= go.opentelemetry.io/otel v1.7.0/go.mod h1:5BdUoMIz5WEs0vt0CUEMtSSaTSHBBVwrhnz7+nrD5xk= -go.opentelemetry.io/otel/bridge/opencensus v0.25.0/go.mod h1:dkZDdaNwLlIutxK2Kc2m3jwW2M1ISaNf8/rOYVwuVHs= -go.opentelemetry.io/otel/exporters/jaeger v1.2.0/go.mod h1:KJLFbEMKTNPIfOxcg/WikIozEoKcPgJRz3Ce1vLlM8E= -go.opentelemetry.io/otel/internal/metric v0.25.0/go.mod h1:Nhuw26QSX7d6n4duoqAFi5KOQR4AuzyMcl5eXOgwxtc= go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= -go.opentelemetry.io/otel/metric v0.25.0/go.mod h1:E884FSpQfnJOMMUaq+05IWlJ4rjZpk2s/F1Ju+TEEm8= go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= go.opentelemetry.io/otel/sdk v1.2.0 h1:wKN260u4DesJYhyjxDa7LRFkuhH7ncEVKU37LWcyNIo= go.opentelemetry.io/otel/sdk v1.2.0/go.mod h1:jNN8QtpvbsKhgaC6V5lHiejMoKD+V8uadoSafgHPx1U= -go.opentelemetry.io/otel/sdk/export/metric v0.25.0/go.mod h1:Ej7NOa+WpN49EIcr1HMUYRvxXXCCnQCg2+ovdt2z8Pk= -go.opentelemetry.io/otel/sdk/metric v0.25.0/go.mod h1:G4xzj4LvC6xDDSsVXpvRVclQCbofGGg4ZU2VKKtDRfg= go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= go.opentelemetry.io/otel/trace v1.2.0/go.mod h1:N5FLswTubnxKxOJHM7XZC074qpeEdLy3CgAVsdMucK0= -go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk= go.opentelemetry.io/otel/trace v1.7.0 h1:O37Iogk1lEkMRXewVtZ1BBTVn5JEp8GrJvP92bJqC6o= go.opentelemetry.io/otel/trace v1.7.0/go.mod h1:fzLSB9nqR2eXzxPXb2JW9IKE+ScyXA48yyE4TNvoHqU= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= @@ -2496,8 +2102,9 @@ go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.5.1/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= 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.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= +go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/dig v1.12.0 h1:l1GQeZpEbss0/M4l/ZotuBndCrkMdjnygzgcuOjAdaY= go.uber.org/dig v1.12.0/go.mod h1:X34SnWGr8Fyla9zQNO2GSO2D+TIuqB14OS8JhYocIyw= go.uber.org/fx v1.15.0 h1:kcfBpAm98n0ksanyyZLFE/Q3T7yPi13Ge2liu3TxR+A= @@ -2507,7 +2114,6 @@ go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A 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.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= -go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= @@ -2524,12 +2130,10 @@ go.uber.org/zap v1.14.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= -go.uber.org/zap v1.21.0 h1:WefMeulhovoZ2sYXz7st6K0sLj7bBhpiFaud4r4zST8= -go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= +go.uber.org/zap v1.22.0 h1:Zcye5DUgBloQ9BaT4qc9BnjOFog5TvBSAGkJ3Nf70c0= +go.uber.org/zap v1.22.0/go.mod h1:H4siCOZOrAolnUPJEkfaSjDqyP+BDS0DdDWzwcgt3+U= go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= go4.org v0.0.0-20200411211856-f5505b9728dd h1:BNJlw5kRTzdmyfh5U8F93HA2OwkP7ZGwA51eJ/0wKOU= go4.org v0.0.0-20200411211856-f5505b9728dd/go.mod h1:CIiUVy99QCPfoE13bO4EZaz5GZMZXMSBGhxRdsvzbkg= @@ -2543,7 +2147,6 @@ golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20190123085648-057139ce5d2b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -2567,7 +2170,6 @@ golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200128174031-69ecbb4d6d5d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200422194213-44a606286825/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200423211502-4bdfaf469ed5/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -2579,23 +2181,16 @@ golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= -golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210813211128-0a44fdfbc16e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210915214749-c084706c2272/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211117183948-ae814b36b871/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20211209193657-4570a0811e8b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e h1:T8NU3HyQ8ClP4SEE+KbFlg6n0NhuTsN4MyznaarGsZM= golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20181106170214-d68db9428509/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -2639,9 +2234,6 @@ golang.org/x/mod v0.1.1-0.20191209134235-331c550502dd/go.mod h1:s0Qsj1ACt9ePp/hM 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= -golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.6.0-dev.0.20211013180041-c96bc1413d57/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -2703,7 +2295,6 @@ golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201022231255-08b38378de70/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= @@ -2711,21 +2302,15 @@ golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLd golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210423184538-5f58ad60dda6/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220418201149-a630d4f3e7a2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220630215102-69896b714898 h1:K7wO6V1IrczY9QOQ2WkVpw4JQSwCd52UsxVEirZUfiw= -golang.org/x/net v0.0.0-20220630215102-69896b714898/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220812174116-3211cb980234 h1:RDqmgfe7SvlMWoqC3xwQ2blLO3fcWcxMa3eBLRdRW7E= +golang.org/x/net v0.0.0-20220812174116-3211cb980234/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -2747,8 +2332,9 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 h1:uVc8UZUe6tr40fFVnUP5Oj+veunVezqYl9z7DYw9xzw= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180202135801-37707fdb30a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -2763,7 +2349,6 @@ golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190124100055-b90733256f2e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190130150945-aca44879d564/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190209173611-3b5209105503/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-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -2782,7 +2367,6 @@ golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190524122548-abf6ff778158/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190524152521-dbbf3f1254d4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190526052359-791d8a0f4d09/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2791,7 +2375,6 @@ golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190902133755-9109b7679e13/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2811,7 +2394,6 @@ golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191128015809-6d18c012aee9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191206220618-eeba5f6aabab/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2855,7 +2437,6 @@ golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210317225723-c4fcb01b228e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210331175145-43e1dd70ce54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210426080607-c94f62235c83/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2868,16 +2449,14 @@ golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210903071746-97244b99971b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211025112917-711f33c9992c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211209171907-798191bca915/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-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a h1:dGzPydgVsqGcTRVwiLJ1jVbufYwmzD3LfVPLKsKg+0k= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab h1:2QkjZIsXupsJbJIdSjjUOgWK3aEtzyuh2mPt3l/CkeU= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -2971,7 +2550,6 @@ golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200711155855-7342f9734a7d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200721032237-77f530d86f9a/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= @@ -2980,18 +2558,14 @@ golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.8-0.20211029000441-d6a9af8af023/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= -golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= -golang.org/x/tools v0.1.11 h1:loJ25fNOEhSXfHrpoGj91eCUThwdNX6u24rO1xnNteY= -golang.org/x/tools v0.1.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4= +golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 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-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f h1:uF6paiQQebLeSXkrTqHqz0MXhXXS1KgF41eUdBNvxK0= golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= @@ -3069,7 +2643,6 @@ google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7Fc google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4 h1:ysnBoUyeL/H6RCvNRhWHjKoDEmguI+mPU+qHgK8qv/w= google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= @@ -3099,7 +2672,6 @@ google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.45.0 h1:NEpgUqV3Z+ZjkqMsxMg11IaDrXY4RY6CQukSGK0uI1M= google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= @@ -3116,8 +2688,8 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -3134,7 +2706,6 @@ gopkg.in/fsnotify/fsnotify.v1 v1.4.7/go.mod h1:Fyux9zXlo4rWoMSIzpn9fDAYjalPqJ/K1 gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/src-d/go-cli.v0 v0.0.0-20181105080154-d492247bbc0d/go.mod h1:z+K8VcOYVYcSwSjGebuDL6176A1XskgbtNl64NSg+n8= gopkg.in/src-d/go-log.v1 v1.0.1/go.mod h1:GN34hKP0g305ysm2/hctJ0Y8nWP3zxXXJ8GFabTyABE= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= @@ -3153,7 +2724,6 @@ gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= @@ -3184,23 +2754,12 @@ k8s.io/utils v0.0.0-20200414100711-2df71ebbae66/go.mod h1:jPW/WVKK9YHAvNhRxK0md/ lukechampine.com/blake3 v1.1.6/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= lukechampine.com/blake3 v1.1.7 h1:GgRMhmdsuK8+ii6UZFDL8Nb+VyMwadAgcJyfYHxG6n0= lukechampine.com/blake3 v1.1.7/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= -modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= -modernc.org/fileutil v1.0.0/go.mod h1:JHsWpkrk/CnVV1H/eGlFf85BEpfkrp56ro8nojIq9Q8= -modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk= -modernc.org/golex v1.0.1/go.mod h1:QCA53QtsT1NdGkaZZkF5ezFwk4IXh4BGNafAARTC254= -modernc.org/lex v1.0.0/go.mod h1:G6rxMTy3cH2iA0iXL/HRRv4Znu8MK4higxph/lE7ypk= -modernc.org/lexer v1.0.0/go.mod h1:F/Dld0YKYdZCLQ7bD0USbWL4YKCyTDRDHiDTOs0q0vk= -modernc.org/mathutil v1.1.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/strutil v1.1.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= -modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I= -pgregory.net/rapid v0.4.7/go.mod h1:UYpPVyjFHzYBGHIxLFoupi8vwk6rXNzRY9OMvVxFIOU= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/structured-merge-diff/v2 v2.0.1/go.mod h1:Wb7vfKAodbKgf6tn1Kl0VvGj7mRH6DGaRcixXEJXTsE= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= sourcegraph.com/sourcegraph/go-diff v0.5.0/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck= sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= From dc247cc57d0ac7ea11a1be145040288cdd7736dc Mon Sep 17 00:00:00 2001 From: Shrenuj Bansal Date: Tue, 4 Oct 2022 18:33:18 +0000 Subject: [PATCH 25/43] Add ability to only have single partition per msg for partitions with recovery sectors --- node/config/types.go | 16 +++++-- storage/wdpost/wdpost_run.go | 44 +++++++++++++------- storage/wdpost/wdpost_run_test.go | 69 +++++++++++++++++++++++++++++++ storage/wdpost/wdpost_sched.go | 50 +++++++++++----------- 4 files changed, 136 insertions(+), 43 deletions(-) diff --git a/node/config/types.go b/node/config/types.go index 1f55da1c6..52b5e6554 100644 --- a/node/config/types.go +++ b/node/config/types.go @@ -276,11 +276,9 @@ type ProvingConfig struct { // A single partition may contain up to 2349 32GiB sectors, or 2300 64GiB sectors. // // The maximum number of sectors which can be proven in a single PoSt message is 25000 in network version 16, which - // means that a single message can prove at most 10 partinions + // means that a single message can prove at most 10 partitions // - // In some cases when submitting PoSt messages which are recovering sectors, the default network limit may still be - // too high to fit in the block gas limit; In those cases it may be necessary to set this value to something lower - // than 10; Note that setting this value lower may result in less efficient gas use - more messages will be sent, + // Note that setting this value lower may result in less efficient gas use - more messages will be sent, // to prove each deadline, resulting in more total gas use (but each message will have lower gas limit) // // Setting this value above the network limit has no effect @@ -294,6 +292,16 @@ type ProvingConfig struct { // Note that setting this value lower may result in less efficient gas use - more messages will be sent than needed, // resulting in more total gas use (but each message will have lower gas limit) MaxPartitionsPerRecoveryMessage int + + // Enable single partition per Post Message for partitions containing recovery sectors + // + // In cases when submitting PoSt messages which contain recovering sectors, the default network limit may still be + // too high to fit in the block gas limit. In those cases, it becomes useful to only house the single partition + // with recovery sectors in the post message + // + // Note that setting this value lower may result in less efficient gas use - more messages will be sent, + // to prove each deadline, resulting in more total gas use (but each message will have lower gas limit) + SingleRecoveringPartitionPerPostMessage bool } type SealingConfig struct { diff --git a/storage/wdpost/wdpost_run.go b/storage/wdpost/wdpost_run.go index 3640eafe5..f34cf7c0c 100644 --- a/storage/wdpost/wdpost_run.go +++ b/storage/wdpost/wdpost_run.go @@ -286,7 +286,7 @@ func (s *WindowPoStScheduler) runPoStCycle(ctx context.Context, manual bool, di // Split partitions into batches, so as not to exceed the number of sectors // allowed in a single message - partitionBatches, err := s.batchPartitions(partitions, nv) + partitionBatches, err := s.BatchPartitions(partitions, nv) if err != nil { return nil, err } @@ -492,7 +492,9 @@ func (s *WindowPoStScheduler) runPoStCycle(ctx context.Context, manual bool, di return posts, nil } -func (s *WindowPoStScheduler) batchPartitions(partitions []api.Partition, nv network.Version) ([][]api.Partition, error) { +// Note: Partition order within batches must match original partition order in order +// for code following the user code to work +func (s *WindowPoStScheduler) BatchPartitions(partitions []api.Partition, nv network.Version) ([][]api.Partition, error) { // We don't want to exceed the number of sectors allowed in a message. // So given the number of sectors in a partition, work out the number of // partitions that can be in a message without exceeding sectors per @@ -524,21 +526,33 @@ func (s *WindowPoStScheduler) batchPartitions(partitions []api.Partition, nv net } } - // The number of messages will be: - // ceiling(number of partitions / partitions per message) - batchCount := len(partitions) / partitionsPerMsg - if len(partitions)%partitionsPerMsg != 0 { - batchCount++ - } + batches := [][]api.Partition{} - // Split the partitions into batches - batches := make([][]api.Partition, 0, batchCount) - for i := 0; i < len(partitions); i += partitionsPerMsg { - end := i + partitionsPerMsg - if end > len(partitions) { - end = len(partitions) + currBatch := []api.Partition{} + for i := 0; i < len(partitions); i++ { + recSectors, err := partitions[i].RecoveringSectors.Count() + if err != nil { + return nil, err } - batches = append(batches, partitions[i:end]) + + // Only add single partition to a batch if it contains recovery sectors + // and has the below user config set + if s.singleRecoveringPartitionPerPostMessage && recSectors > 0 { + if len(currBatch) > 0 { + batches = append(batches, currBatch) + currBatch = []api.Partition{} + } + batches = append(batches, []api.Partition{partitions[i]}) + } else { + if len(currBatch) >= partitionsPerMsg { + batches = append(batches, currBatch) + currBatch = []api.Partition{} + } + currBatch = append(currBatch, partitions[i]) + } + } + if len(currBatch) > 0 { + batches = append(batches, currBatch) } return batches, nil diff --git a/storage/wdpost/wdpost_run_test.go b/storage/wdpost/wdpost_run_test.go index cb110cc0d..f5578d1ba 100644 --- a/storage/wdpost/wdpost_run_test.go +++ b/storage/wdpost/wdpost_run_test.go @@ -177,6 +177,26 @@ func (m mockFaultTracker) CheckProvable(ctx context.Context, pp abi.RegisteredPo return map[abi.SectorID]string{}, nil } +func generatePartition(sectorCount uint64, recoverySectorCount uint64) api.Partition { + var partition api.Partition + sectors := bitfield.New() + recoverySectors := bitfield.New() + for s := uint64(0); s < sectorCount; s++ { + sectors.Set(s) + } + for s := uint64(0); s < recoverySectorCount; s++ { + recoverySectors.Set(s) + } + partition = api.Partition{ + AllSectors: sectors, + FaultySectors: bitfield.New(), + RecoveringSectors: recoverySectors, + LiveSectors: sectors, + ActiveSectors: sectors, + } + return partition +} + // TestWDPostDoPost verifies that doPost will send the correct number of window // PoST messages for a given number of partitions func TestWDPostDoPost(t *testing.T) { @@ -368,6 +388,55 @@ func TestWDPostDoPostPartLimitConfig(t *testing.T) { } } +// TestBatchPartitionsRecoverySectors tests if the batches with recovery sectors +// contain only single partitions while keeping all the partitions in order +func TestBatchPartitionsRecoverySectors(t *testing.T) { + + proofType := abi.RegisteredPoStProof_StackedDrgWindow2KiBV1 + postAct := tutils.NewIDAddr(t, 100) + + mockStgMinerAPI := newMockStorageMinerAPI() + + userPartLimit := 4 + + scheduler := &WindowPoStScheduler{ + api: mockStgMinerAPI, + prover: &mockProver{}, + verifier: &mockVerif{}, + faultTracker: &mockFaultTracker{}, + proofType: proofType, + actor: postAct, + journal: journal.NilJournal(), + addrSel: &ctladdr.AddressSelector{}, + + maxPartitionsPerPostMessage: userPartLimit, + singleRecoveringPartitionPerPostMessage: true, + } + + var partitions []api.Partition + for p := 0; p < 4; p++ { + partitions = append(partitions, generatePartition(100, 0)) + } + for p := 0; p < 2; p++ { + partitions = append(partitions, generatePartition(100, 10)) + } + for p := 0; p < 6; p++ { + partitions = append(partitions, generatePartition(100, 0)) + } + partitions = append(partitions, generatePartition(100, 10)) + + expectedBatchLens := []int{4, 1, 1, 4, 2, 1} + + batches, err := scheduler.BatchPartitions(partitions, network.Version16) + require.NoError(t, err) + + require.Equal(t, len(batches), 6) + + for i, batch := range batches { + require.Equal(t, len(batch), expectedBatchLens[i]) + } +} + // TestWDPostDeclareRecoveriesPartLimitConfig verifies that declareRecoveries will send the correct number of // DeclareFaultsRecovered messages for a given number of partitions based on user config func TestWDPostDeclareRecoveriesPartLimitConfig(t *testing.T) { diff --git a/storage/wdpost/wdpost_sched.go b/storage/wdpost/wdpost_sched.go index 21dfecb60..29c39ad9e 100644 --- a/storage/wdpost/wdpost_sched.go +++ b/storage/wdpost/wdpost_sched.go @@ -64,18 +64,19 @@ type NodeAPI interface { // WindowPoStScheduler watches the chain though the changeHandler, which in turn // turn calls the scheduler when the time arrives to do work. type WindowPoStScheduler struct { - api NodeAPI - feeCfg config.MinerFeeConfig - addrSel *ctladdr.AddressSelector - prover storiface.ProverPoSt - verifier storiface.Verifier - faultTracker sealer.FaultTracker - proofType abi.RegisteredPoStProof - partitionSectors uint64 - disablePreChecks bool - maxPartitionsPerPostMessage int - maxPartitionsPerRecoveryMessage int - ch *changeHandler + api NodeAPI + feeCfg config.MinerFeeConfig + addrSel *ctladdr.AddressSelector + prover storiface.ProverPoSt + verifier storiface.Verifier + faultTracker sealer.FaultTracker + proofType abi.RegisteredPoStProof + partitionSectors uint64 + disablePreChecks bool + maxPartitionsPerPostMessage int + maxPartitionsPerRecoveryMessage int + singleRecoveringPartitionPerPostMessage bool + ch *changeHandler actor address.Address @@ -102,18 +103,19 @@ func NewWindowedPoStScheduler(api NodeAPI, } return &WindowPoStScheduler{ - api: api, - feeCfg: cfg, - addrSel: as, - prover: sp, - verifier: verif, - faultTracker: ft, - proofType: mi.WindowPoStProofType, - partitionSectors: mi.WindowPoStPartitionSectors, - disablePreChecks: pcfg.DisableWDPoStPreChecks, - maxPartitionsPerPostMessage: pcfg.MaxPartitionsPerPoStMessage, - maxPartitionsPerRecoveryMessage: pcfg.MaxPartitionsPerRecoveryMessage, - actor: actor, + api: api, + feeCfg: cfg, + addrSel: as, + prover: sp, + verifier: verif, + faultTracker: ft, + proofType: mi.WindowPoStProofType, + partitionSectors: mi.WindowPoStPartitionSectors, + disablePreChecks: pcfg.DisableWDPoStPreChecks, + maxPartitionsPerPostMessage: pcfg.MaxPartitionsPerPoStMessage, + maxPartitionsPerRecoveryMessage: pcfg.MaxPartitionsPerRecoveryMessage, + singleRecoveringPartitionPerPostMessage: pcfg.SingleRecoveringPartitionPerPostMessage, + actor: actor, evtTypes: [...]journal.EventType{ evtTypeWdPoStScheduler: j.RegisterEventType("wdpost", "scheduler"), evtTypeWdPoStProofs: j.RegisterEventType("wdpost", "proofs_processed"), From 96ddd756f81a9879af51175d5c04c2309205cd39 Mon Sep 17 00:00:00 2001 From: Shrenuj Bansal Date: Tue, 4 Oct 2022 18:44:00 +0000 Subject: [PATCH 26/43] doc gen --- .../en/default-lotus-miner-config.toml | 19 +++++++++++++++---- node/config/doc_gen.go | 19 +++++++++++++++---- 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/documentation/en/default-lotus-miner-config.toml b/documentation/en/default-lotus-miner-config.toml index 0147f979e..b16c0e8fd 100644 --- a/documentation/en/default-lotus-miner-config.toml +++ b/documentation/en/default-lotus-miner-config.toml @@ -380,11 +380,9 @@ # A single partition may contain up to 2349 32GiB sectors, or 2300 64GiB sectors. # # The maximum number of sectors which can be proven in a single PoSt message is 25000 in network version 16, which - # means that a single message can prove at most 10 partinions + # means that a single message can prove at most 10 partitions # - # In some cases when submitting PoSt messages which are recovering sectors, the default network limit may still be - # too high to fit in the block gas limit; In those cases it may be necessary to set this value to something lower - # than 10; Note that setting this value lower may result in less efficient gas use - more messages will be sent, + # Note that setting this value lower may result in less efficient gas use - more messages will be sent, # to prove each deadline, resulting in more total gas use (but each message will have lower gas limit) # # Setting this value above the network limit has no effect @@ -403,6 +401,19 @@ # env var: LOTUS_PROVING_MAXPARTITIONSPERRECOVERYMESSAGE #MaxPartitionsPerRecoveryMessage = 0 + # Enable single partition per Post Message for partitions containing recovery sectors + # + # In cases when submitting PoSt messages which contain recovering sectors, the default network limit may still be + # too high to fit in the block gas limit. In those cases, it becomes useful to only house the single partition + # with recovery sectors in the post message + # + # Note that setting this value lower may result in less efficient gas use - more messages will be sent, + # to prove each deadline, resulting in more total gas use (but each message will have lower gas limit) + # + # type: bool + # env var: LOTUS_PROVING_SINGLERECOVERINGPARTITIONPERPOSTMESSAGE + #SingleRecoveringPartitionPerPostMessage = false + [Sealing] # Upper bound on how many sectors can be waiting for more deals to be packed in it before it begins sealing at any given time. diff --git a/node/config/doc_gen.go b/node/config/doc_gen.go index 20b175ccb..fe805407a 100644 --- a/node/config/doc_gen.go +++ b/node/config/doc_gen.go @@ -698,11 +698,9 @@ After changing this option, confirm that the new value works in your setup by in A single partition may contain up to 2349 32GiB sectors, or 2300 64GiB sectors. The maximum number of sectors which can be proven in a single PoSt message is 25000 in network version 16, which -means that a single message can prove at most 10 partinions +means that a single message can prove at most 10 partitions -In some cases when submitting PoSt messages which are recovering sectors, the default network limit may still be -too high to fit in the block gas limit; In those cases it may be necessary to set this value to something lower -than 10; Note that setting this value lower may result in less efficient gas use - more messages will be sent, +Note that setting this value lower may result in less efficient gas use - more messages will be sent, to prove each deadline, resulting in more total gas use (but each message will have lower gas limit) Setting this value above the network limit has no effect`, @@ -717,6 +715,19 @@ In those cases it may be necessary to set this value to something low (eg 1); Note that setting this value lower may result in less efficient gas use - more messages will be sent than needed, resulting in more total gas use (but each message will have lower gas limit)`, }, + { + Name: "SingleRecoveringPartitionPerPostMessage", + Type: "bool", + + Comment: `Enable single partition per Post Message for partitions containing recovery sectors + +In cases when submitting PoSt messages which contain recovering sectors, the default network limit may still be +too high to fit in the block gas limit. In those cases, it becomes useful to only house the single partition +with recovery sectors in the post message + +Note that setting this value lower may result in less efficient gas use - more messages will be sent, +to prove each deadline, resulting in more total gas use (but each message will have lower gas limit)`, + }, }, "Pubsub": []DocField{ { From 9653584d73c35e0f41657c3ba3111598dd3b6dbc Mon Sep 17 00:00:00 2001 From: Shrenuj Bansal Date: Tue, 4 Oct 2022 19:21:55 +0000 Subject: [PATCH 27/43] Address comments --- documentation/en/default-lotus-miner-config.toml | 4 ++-- node/config/doc_gen.go | 4 ++-- node/config/types.go | 4 ++-- storage/wdpost/wdpost_run.go | 8 ++++---- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/documentation/en/default-lotus-miner-config.toml b/documentation/en/default-lotus-miner-config.toml index b16c0e8fd..b51e325e8 100644 --- a/documentation/en/default-lotus-miner-config.toml +++ b/documentation/en/default-lotus-miner-config.toml @@ -401,11 +401,11 @@ # env var: LOTUS_PROVING_MAXPARTITIONSPERRECOVERYMESSAGE #MaxPartitionsPerRecoveryMessage = 0 - # Enable single partition per Post Message for partitions containing recovery sectors + # Enable single partition per PoSt Message for partitions containing recovery sectors # # In cases when submitting PoSt messages which contain recovering sectors, the default network limit may still be # too high to fit in the block gas limit. In those cases, it becomes useful to only house the single partition - # with recovery sectors in the post message + # with recovering sectors in the post message # # Note that setting this value lower may result in less efficient gas use - more messages will be sent, # to prove each deadline, resulting in more total gas use (but each message will have lower gas limit) diff --git a/node/config/doc_gen.go b/node/config/doc_gen.go index fe805407a..80538c70e 100644 --- a/node/config/doc_gen.go +++ b/node/config/doc_gen.go @@ -719,11 +719,11 @@ resulting in more total gas use (but each message will have lower gas limit)`, Name: "SingleRecoveringPartitionPerPostMessage", Type: "bool", - Comment: `Enable single partition per Post Message for partitions containing recovery sectors + Comment: `Enable single partition per PoSt Message for partitions containing recovery sectors In cases when submitting PoSt messages which contain recovering sectors, the default network limit may still be too high to fit in the block gas limit. In those cases, it becomes useful to only house the single partition -with recovery sectors in the post message +with recovering sectors in the post message Note that setting this value lower may result in less efficient gas use - more messages will be sent, to prove each deadline, resulting in more total gas use (but each message will have lower gas limit)`, diff --git a/node/config/types.go b/node/config/types.go index 52b5e6554..df5f018e3 100644 --- a/node/config/types.go +++ b/node/config/types.go @@ -293,11 +293,11 @@ type ProvingConfig struct { // resulting in more total gas use (but each message will have lower gas limit) MaxPartitionsPerRecoveryMessage int - // Enable single partition per Post Message for partitions containing recovery sectors + // Enable single partition per PoSt Message for partitions containing recovery sectors // // In cases when submitting PoSt messages which contain recovering sectors, the default network limit may still be // too high to fit in the block gas limit. In those cases, it becomes useful to only house the single partition - // with recovery sectors in the post message + // with recovering sectors in the post message // // Note that setting this value lower may result in less efficient gas use - more messages will be sent, // to prove each deadline, resulting in more total gas use (but each message will have lower gas limit) diff --git a/storage/wdpost/wdpost_run.go b/storage/wdpost/wdpost_run.go index f34cf7c0c..53b7d55c9 100644 --- a/storage/wdpost/wdpost_run.go +++ b/storage/wdpost/wdpost_run.go @@ -529,8 +529,8 @@ func (s *WindowPoStScheduler) BatchPartitions(partitions []api.Partition, nv net batches := [][]api.Partition{} currBatch := []api.Partition{} - for i := 0; i < len(partitions); i++ { - recSectors, err := partitions[i].RecoveringSectors.Count() + for _, partition := range partitions { + recSectors, err := partition.RecoveringSectors.Count() if err != nil { return nil, err } @@ -542,13 +542,13 @@ func (s *WindowPoStScheduler) BatchPartitions(partitions []api.Partition, nv net batches = append(batches, currBatch) currBatch = []api.Partition{} } - batches = append(batches, []api.Partition{partitions[i]}) + batches = append(batches, []api.Partition{partition}) } else { if len(currBatch) >= partitionsPerMsg { batches = append(batches, currBatch) currBatch = []api.Partition{} } - currBatch = append(currBatch, partitions[i]) + currBatch = append(currBatch, partition) } } if len(currBatch) > 0 { From d8b69044923fbfe46e1d9d6d3a9537064b912259 Mon Sep 17 00:00:00 2001 From: Phi Date: Wed, 5 Oct 2022 09:47:31 +0200 Subject: [PATCH 28/43] fix: ux: Add cmd outputs Adding command outputs to `lotus wallet set-default` and `lotus wallet delete` --- cli/wallet.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cli/wallet.go b/cli/wallet.go index 56c1532f4..3a21cdaba 100644 --- a/cli/wallet.go +++ b/cli/wallet.go @@ -260,6 +260,7 @@ var walletSetDefault = &cli.Command{ return err } + fmt.Println("Default address set to:", addr) return api.WalletSetDefault(ctx, addr) }, } @@ -517,6 +518,8 @@ var walletDelete = &cli.Command{ return err } + fmt.Println("Soft deleting address:", addr) + fmt.Println("Hard deletion of the address in `~/.lotus/keystore` is needed for permanent removal") return api.WalletDelete(ctx, addr) }, } From 1d1f55125a67a67c85ccd8a6d6ea09ef9787d74b Mon Sep 17 00:00:00 2001 From: Ian Davis Date: Mon, 3 Oct 2022 23:42:16 +0100 Subject: [PATCH 29/43] Fix issue with snap renaming in packer script --- tools/packer/setup-snap.sh | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tools/packer/setup-snap.sh b/tools/packer/setup-snap.sh index 3db06e5b4..2b8d69cae 100644 --- a/tools/packer/setup-snap.sh +++ b/tools/packer/setup-snap.sh @@ -23,12 +23,11 @@ MANAGED_FILES=( ) # this is required on digitalocean, which does not have snap seeded correctly at this phase. -apt update -apt reinstall snapd +apt-get update +apt-get reinstall snapd snap install lotus -snap alias lotus.lotus lotus snap alias lotus.lotus-daemon lotus-daemon snap alias lotus.lotus-miner lotus-miner snap alias lotus.lotus-worker lotus-worker From 80dc0ce879c06b332081d0cbc9937ecde4c35874 Mon Sep 17 00:00:00 2001 From: Ian Davis Date: Tue, 4 Oct 2022 00:02:51 +0100 Subject: [PATCH 30/43] Don't alias the lotus-daemon --- tools/packer/setup-snap.sh | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tools/packer/setup-snap.sh b/tools/packer/setup-snap.sh index 2b8d69cae..c6050eaf4 100644 --- a/tools/packer/setup-snap.sh +++ b/tools/packer/setup-snap.sh @@ -23,12 +23,10 @@ MANAGED_FILES=( ) # this is required on digitalocean, which does not have snap seeded correctly at this phase. -apt-get update -apt-get reinstall snapd +apt-get -y update && apt-get -y reinstall snapd snap install lotus -snap alias lotus.lotus-daemon lotus-daemon snap alias lotus.lotus-miner lotus-miner snap alias lotus.lotus-worker lotus-worker From d1981ef34e87682df712eb5ba8817ef5bd051380 Mon Sep 17 00:00:00 2001 From: Ian Davis Date: Tue, 4 Oct 2022 01:22:13 +0100 Subject: [PATCH 31/43] Increase aws_polling / no_output_timeout to 1h --- .circleci/config.yml | 2 +- .circleci/template.yml | 2 +- tools/packer/lotus-snap.pkr.hcl | 6 ++++++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index fdfcafe7c..1262afe9f 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -140,7 +140,7 @@ commands: - run: name: "Run a packer build" command: packer build << parameters.args >> << parameters.template >> - no_output_timeout: 30m + no_output_timeout: 1h jobs: mod-tidy-check: diff --git a/.circleci/template.yml b/.circleci/template.yml index 4fe4e4bd3..6b4392493 100644 --- a/.circleci/template.yml +++ b/.circleci/template.yml @@ -140,7 +140,7 @@ commands: - run: name: "Run a packer build" command: packer build << parameters.args >> << parameters.template >> - no_output_timeout: 30m + no_output_timeout: 1h jobs: mod-tidy-check: diff --git a/tools/packer/lotus-snap.pkr.hcl b/tools/packer/lotus-snap.pkr.hcl index 8ceb743d0..b42272c20 100644 --- a/tools/packer/lotus-snap.pkr.hcl +++ b/tools/packer/lotus-snap.pkr.hcl @@ -56,6 +56,11 @@ source "amazon-ebs" "lotus" { owners = ["099720109477"] } ssh_username = "ubuntu" + + aws_polling { + delay_seconds = 60 + max_attempts = 60 + } } source "digitalocean" "lotus" { @@ -82,3 +87,4 @@ build { script = "./tools/packer/setup-snap.sh" } } + From 284bfc9a57573167afdc69ad8eb7ee27eadcd973 Mon Sep 17 00:00:00 2001 From: Ian Davis Date: Wed, 5 Oct 2022 13:05:36 +0100 Subject: [PATCH 32/43] Run packer build biweekly This runs the build more often so we can continue to debug any remaining issues, and ensures that we release a new image on the 15th of this month (since it was broken on the 1st) --- .circleci/config.yml | 4 ++-- .circleci/template.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 1262afe9f..02c75c962 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1265,10 +1265,10 @@ workflows: - publish-dockerhub: name: publish-dockerhub-nightly tag: nightly - monthly: + biweekly: triggers: - schedule: - cron: "0 0 1 * *" + cron: "0 0 1,15 * *" filters: branches: only: diff --git a/.circleci/template.yml b/.circleci/template.yml index 6b4392493..d7bba709d 100644 --- a/.circleci/template.yml +++ b/.circleci/template.yml @@ -990,10 +990,10 @@ workflows: - publish-dockerhub: name: publish-dockerhub-nightly tag: nightly - monthly: + biweekly: triggers: - schedule: - cron: "0 0 1 * *" + cron: "0 0 1,15 * *" filters: branches: only: From 396f5d610e17e664c8c1a484a30a6065886f163b Mon Sep 17 00:00:00 2001 From: Phi Date: Fri, 30 Sep 2022 10:39:41 +0200 Subject: [PATCH 33/43] fix: renew --only-cc with sectorfile Add the ability to extend/renew only CC-sectors with the `--only-cc` when using a sector-file. --- cmd/lotus-miner/sectors.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cmd/lotus-miner/sectors.go b/cmd/lotus-miner/sectors.go index bcd60acf2..44bce55bc 100644 --- a/cmd/lotus-miner/sectors.go +++ b/cmd/lotus-miner/sectors.go @@ -918,6 +918,9 @@ var sectorsRenewCmd = &cli.Command{ } si, found := activeSectorsInfo[abi.SectorNumber(id)] + if len(si.DealIDs) > 0 && cctx.Bool("only-cc") { + continue + } if !found { return xerrors.Errorf("sector %d is not active", id) } From f4ed8476ef6cf9f04ee578de4ebb42f9add9fdd7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 5 Oct 2022 16:29:30 +0000 Subject: [PATCH 34/43] docs: release template: Mention codegen in release prep --- documentation/misc/RELEASE_ISSUE_TEMPLATE.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/documentation/misc/RELEASE_ISSUE_TEMPLATE.md b/documentation/misc/RELEASE_ISSUE_TEMPLATE.md index 6e1834ea8..8c3cce944 100644 --- a/documentation/misc/RELEASE_ISSUE_TEMPLATE.md +++ b/documentation/misc/RELEASE_ISSUE_TEMPLATE.md @@ -26,6 +26,7 @@ First steps: Prepping an RC: - [ ] version string in `build/version.go` has been updated (in the `release/vX.Y.Z` branch). +- [ ] run `make gen && make docsgen-cli` - [ ] tag commit with `vX.Y.Z-rcN` - [ ] cut a pre-release [here](https://github.com/filecoin-project/lotus/releases/new?prerelease=true) @@ -69,6 +70,7 @@ Testing an RC: - [ ] **Stage 4 - Stable Release** - [ ] Final preparation - [ ] Verify that version string in [`version.go`](https://github.com/filecoin-project/lotus/blob/master/build/version.go) has been updated. + - [ ] Verify that codegen is up to date (`make gen && make docsgen-cli`) - [ ] Ensure that [CHANGELOG.md](https://github.com/filecoin-project/lotus/blob/master/CHANGELOG.md) is up to date - [ ] Merge `release-vX.Y.Z` into the `releases` branch. - [ ] Tag this merge commit (on the `releases` branch) with `vX.Y.Z` From d468c36216c19b748082b94a5c89cabe9bb5f93a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 5 Oct 2022 16:56:23 +0000 Subject: [PATCH 35/43] release v1.17.2 --- CHANGELOG.md | 49 +++++++++++++++++++++------ build/openrpc/full.json.gz | Bin 28425 -> 28421 bytes build/openrpc/gateway.json.gz | Bin 5079 -> 5076 bytes build/openrpc/miner.json.gz | Bin 16025 -> 16021 bytes build/openrpc/worker.json.gz | Bin 5260 -> 5256 bytes build/version.go | 2 +- documentation/en/cli-lotus-miner.md | 2 +- documentation/en/cli-lotus-worker.md | 2 +- documentation/en/cli-lotus.md | 2 +- 9 files changed, 43 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5e21f3ddd..a690f3bad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,51 +1,80 @@ # Lotus changelog -# v1.17.2-rc2 / 2022-09-29 +# v1.17.2 / 2022-10-05 -This is the second release candidate of the upcoming OPTIONAL release Lotus v1.17.2 +This is an OPTIONAL release of Lotus. This feature release introduces new sector number management APIs in Lotus that enables all the Sealing-as-a-Service and Lotus interactions needed to function. The default propagation delay setting for storage providers has also been changed, as well as numerous other features and enhancements. Check out the sub-bullet points in the feature and enhancement section to get a short description about each feature and enhancements. + +### Highlights + +🦭 **SaaS** 🦭 +New sector management APIs makes it possible to import partially sealed sectors into Lotus. This release implements all SaaS<->Lotus interactions needed for such services to work. Deep dive into the new APIs here: https://github.com/filecoin-project/lotus/discussions/9079#discussioncomment-3652044 + +⏳ **Propagation delay** ⌛️ +In v1.17.2 the default PropagationDelay has been raised from 6 seconds -> 10 seconds, and you can tune this yourself with the `PROPAGATION_DELAY_SECS` environment variable. This means you will now wait for 10 seconds for other blocks to arrive from the network before computing a winningPoSt (if eligible). In your `lotus-miner` logs that means you will see this "baseDeltaSeconds": 10 as default. + +⚠️ **Please note that Lotus v1.17.2 will require a Go-version of v1.18.1 or higher!** ## New features - feat: sealing: Partially sealed sector import ([filecoin-project/lotus#9210](https://github.com/filecoin-project/lotus/pull/9210)) - - feat: sealing: Use bitfields to manage sector numbers ([filecoin-project/lotus#9183](https://github.com/filecoin-project/lotus/pull/9183)) + - Implements support for importing (partially) sealed sectors which is needed for enabling external sealing services. +- feat: sealing: Use bitfields to manage sector numbers ([filecoin-project/lotus#9183](https://github.com/filecoin-project/lotus/pull/9183)) + - Needed for Sealing-as-a-Service. Move sector number assigning logic to use stored bitfields instead of stored counters. Makes it possible to reserve ranges of sector numbers, see the sector assigner state and view sector number reservations. - feat: env: propagation delay ([filecoin-project/lotus#9290](https://github.com/filecoin-project/lotus/pull/9290)) + - The default propagation delay is raised to 10 seconds from 6 seconds. Ability to set it yourself with the `PROPAGATION_DELAY_SECS` environment variable. - feat: cli: lotus info cmd ([filecoin-project/lotus#9233](https://github.com/filecoin-project/lotus/pull/9233)) + - A new `lotus info` command that prints useful node information in one place. - feat: proving: Introduce manual sector fault recovery (#9144) ([filecoin-project/lotus#9144](https://github.com/filecoin-project/lotus/pull/9144)) + - Allow users to declare fault recovery messages manually with the `lotus-miner proving recover-faults` command, rather than waiting for it to happen automatically before windowPost. +- feat: api: Reintroduce StateActorManifestCID ([filecoin-project/lotus#9201](https://github.com/filecoin-project/lotus/pull/9201)) + - Adds ability to retrieve the Actor Manifest CID through the api. +- feat: message: Add uuid to mpool message sent to chain node from miner ([filecoin-project/lotus#9174](https://github.com/filecoin-project/lotus/pull/9174)) + - Adds a UUID to each message sent by the `lotus-miner` to the daemon. A requirement needed for https://github.com/filecoin-project/lotus/issues/9130 +- feat: message: Add retries to mpool push message from lotus-miner ([filecoin-project/lotus#9177](https://github.com/filecoin-project/lotus/pull/9177)) + - Retries to mpool push message API in case of unavailability of the lotus chain node. + +**Network 17 related features :** +- feat: network: add nv17 and integrate the corresponding go state type ([filecoin-project/lotus#9267](https://github.com/filecoin-project/lotus/pull/9267)) - feat: cli: print beneficiary info in state miner-info ([filecoin-project/lotus#9308](https://github.com/filecoin-project/lotus/pull/9308)) - feat: api/cli: change beneficiary propose and confirm for actors and multisigs. ([filecoin-project/lotus#9307](https://github.com/filecoin-project/lotus/pull/9307)) - feat: api/cli: beneficiary withdraw api and cli ([filecoin-project/lotus#9296](https://github.com/filecoin-project/lotus/pull/9296)) -- feat: network: add nv17 and integrate the corresponding go state type ([filecoin-project/lotus#9267](https://github.com/filecoin-project/lotus/pull/9267)) -- feat: api: Reintroduce StateActorManifestCID ([filecoin-project/lotus#9201](https://github.com/filecoin-project/lotus/pull/9201)) -- feat: message: Add retries to mpool push message from lotus miner ([filecoin-project/lotus#9177](https://github.com/filecoin-project/lotus/pull/9177)) -- feat: message: Add uuid to mpool message sent to chain node from miner ([filecoin-project/lotus#9174](https://github.com/filecoin-project/lotus/pull/9174)) ## Enhancements - feat: sectors renew --only-cc ([filecoin-project/lotus#9184](https://github.com/filecoin-project/lotus/pull/9184)) + - Exlude extending deal-related sectors with the `--only-cc` option when using the `lotus-miner sectors renew` - feat: miner: display updated & update-cache for storage list ([filecoin-project/lotus#9323](https://github.com/filecoin-project/lotus/pull/9323)) + - Show amount of `updated` & `update-cache` sectors in each storage path in the `lotus-miner storage list` output - feat: add descriptive errors to markets event handler ([filecoin-project/lotus#9326](https://github.com/filecoin-project/lotus/pull/9326)) + - More descriptive market error logs - feat: cli: Add option to terminate sectors from worker address ([filecoin-project/lotus#9291](https://github.com/filecoin-project/lotus/pull/9291)) -- fix: sealing: Make DataCid resource env vars make more sense ([filecoin-project/lotus#9231](https://github.com/filecoin-project/lotus/pull/9231)) + - Adds a flag to allow either owner address or worker address to send terminate sectors message. - fix: cli: actor-cids cli command now defaults to current network ([filecoin-project/lotus#9321](https://github.com/filecoin-project/lotus/pull/9321)) -- fix: worker: Close all storage paths on worker shutdown ([filecoin-project/lotus#9153](https://github.com/filecoin-project/lotus/pull/9153)) + - Makes the command defaults to the current network. - fix: ux: Output bytes in `lotus client commP` cmd ([filecoin-project/lotus#9189](https://github.com/filecoin-project/lotus/pull/9189)) -- fix: ux: exclude negative available balance from spendable amount ([filecoin-project/lotus#9182](https://github.com/filecoin-project/lotus/pull/9182)) + - Adds an additional line that outputs bytes in the `lotus client commP` command. - fix: sealing: Add information on what worker a job was assigned to in logs ([filecoin-project/lotus#9151](https://github.com/filecoin-project/lotus/pull/9151)) + - Adds the worker hostname into the assignment logs. - refactor: sealing pipeline: Remove useless storage adapter code ([filecoin-project/lotus#9142](https://github.com/filecoin-project/lotus/pull/9142) + - Remove proxy code in `storage/miner.go` / `storage/miner_sealing.go`, call the pipeline directly instead. ## Bug fixes - fix: ffiwrapper: Close readers in AddPiece ([filecoin-project/lotus#9328](https://github.com/filecoin-project/lotus/pull/9328)) - fix: sealing: Drop unused PreCommitInfo from pipeline.SectorInfo ([filecoin-project/lotus#9325](https://github.com/filecoin-project/lotus/pull/9325)) - fix: cli: fix panic in `lotus-miner actor control list` ([filecoin-project/lotus#9241](https://github.com/filecoin-project/lotus/pull/9241)) - fix: sealing: Abort upgrades in sectors with no deals ([filecoin-project/lotus#9310](https://github.com/filecoin-project/lotus/pull/9310)) +- fix: sealing: Make DataCid resource env vars make more sense ([filecoin-project/lotus#9231](https://github.com/filecoin-project/lotus/pull/9231)) - fix: cli: Option to specify --from msg sender ([filecoin-project/lotus#9237](https://github.com/filecoin-project/lotus/pull/9237)) - fix: ux: better ledger rejection error ([filecoin-project/lotus#9242](https://github.com/filecoin-project/lotus/pull/9242)) - fix: ux: msg receipt for actor withdrawal ([filecoin-project/lotus#9155](https://github.com/filecoin-project/lotus/pull/9155)) +- fix: ux: exclude negative available balance from spendable amount ([filecoin-project/lotus#9182](https://github.com/filecoin-project/lotus/pull/9182)) - fix: sealing: Avoid panicking in handleUpdateActivating on startup ([filecoin-project/lotus#9331](https://github.com/filecoin-project/lotus/pull/9331)) - fix: api: DataCid - ensure reader is closed ([filecoin-project/lotus#9230](https://github.com/filecoin-project/lotus/pull/9230)) - fix: verifreg: serialize RmDcProposalID as int, not tuple ([filecoin-project/lotus#9206](https://github.com/filecoin-project/lotus/pull/9206)) - fix: api: Ignore uuid check for messages with uuid not set ([filecoin-project/lotus#9303](https://github.com/filecoin-project/lotus/pull/9303)) - fix: cgroupV1: memory.memsw.usage_in_bytes: no such file or directory ([filecoin-project/lotus#9202](https://github.com/filecoin-project/lotus/pull/9202)) - fix: miner: init miner's with 32GiB sectors by default ([filecoin-project/lotus#9364](https://github.com/filecoin-project/lotus/pull/9364)) +- fix: worker: Close all storage paths on worker shutdown ([filecoin-project/lotus#9153](https://github.com/filecoin-project/lotus/pull/9153)) - fix: build: set PropagationDelaySecs correctly ([filecoin-project/lotus#9358](https://github.com/filecoin-project/lotus/pull/9358)) +- fix: renew --only-cc with sectorfile ([filecoin-project/lotus#9428](https://github.com/filecoin-project/lotus/pull/9428)) ## Dependency updates - github.com/filecoin-project/go-fil-markets (v1.23.1 -> v1.24.0) diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 4ab58f84d2bf4c7dd535bb661aa09aaee3da7ac6..e714ebdecbbc8e32091c10962e48ab44427abb6b 100644 GIT binary patch literal 28421 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 diff --git a/build/openrpc/gateway.json.gz b/build/openrpc/gateway.json.gz index 4c5fadbebbb9bcbaf8b0af025d39bd9c14124729..902567d5209887489455a12285a7fcf28cc9191c 100644 GIT binary patch delta 4994 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 M|CJRO(2n&00A0V+i~s-t delta 4997 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 P00960IbG~RlJx)pl*_jH diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 0c0e13c9adc063e3cbefcd8dee1781f40b661ed8..4ed31a8bb2a3c39086b12a66d8e124971e3f81b3 100644 GIT binary patch delta 16019 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

k3nLh{l<65 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 N|Nqa&3S1`^0|0>+I&J^} delta 16023 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 z zL1e?Po9k%aL%3_NCqZ}sx=4hc#uo>##CCuod&4n>cNAOKy^(z9zzgntx;0V*m<~gREqf?40uHi_b_v7$RI(f}L%yiTs>n zfSFj$IMOb%5%gdB@UaKh9-6Oh5v~i}6<9mcU^Jn*L?F5BoP5yVYrZ(CwdW0eib4_D zAWslZND)i43TeXLsHkBMvF!mok7%2tC|3dq2D;*y{D$s<$N$*BCT9%HY=3IrdSFc$ zw$l?d#{_#zL3^Fm`5mjHQBJm1AZO39#{_}YD}s;(qh*Dbg%4%H>f54~1BsMlDArCf zyn;x4Oy<;GN#=nwx@G{{b|4pT3B4zr*@cXVtX1$ku{QwTL2QdHBqd^R8|_3nKd+#B ziM zpEfu+2B`%WjzMdWhm$DkFmW7>tgCDV$r{@BM*6EP|10@Rnput?_uui+cg;r!Imrm8 z2-@BWB_6hr`}=%uV}F7!1J|B-S&yko!K%G0GfM5k9Zo4+HLuBqsKRnO1K3KvK0lN4 zInpb4m3WVGB2`t3hkwnDxts4Wn$3hXvWHwXQWaG!>7$9XXsd>zhK zd@cQ|95u-_f>Cl<>Q{Lw^Uftpl3Oa!XqJEU>K3KhQR}N1OV%m+`SK%mhSR)A9j@Rc!(r>KP0d@okw(ve z%2V$e#ed(`01Neeozm~QcyCGJ=hYgIzj?9}9XHDIRxfC0ld=0>7-JvgMeuN{zCvtE z!3SlK^ZW_240*8!p$v8_eg%yIZ2g|A=d0@c!);;@ivo1Aw9t+hxEOA`EK=?YZpO+Nk#~Lq(HHJkYO))}fJ4mDybW1E!C03+9o8%6mW0jY~Dx;!csu(e}8;()}xFt5x zk4mY}Bsu7JEb?+#WLy-kb%j`q-f9)J{3}1g!U3fmq3N`)&IT%Mw@&+=V|tez)1AyX zAAgS~IgxUr!ZLE-5JK0)L~rZ{E{hyk$^))k36TS&seH)CO)VMn(2!L^yjY1b*Do|A zYKB1Dmetr0uz36C1%`e&N}c9JQ>9i!84gr~N;#a;LO8nA%7L{^sXl)BI!uK^K&43v z6@_ddAn0BYC%A_maFL1d9kP1Y#1loeHh;i`1X%Q**c4g-GcTyX*hPNW8g%>~zFT9F8HV|NQXv;p?ye{=Yl)%l|Ux!}N{ke*V{6^UsH0-oC#Y{^Gr(A3i;} zAJ6Z8{a-e(9Vot|mpA`#vhOe_8pe;Jjxpych6_SHhRu4rfkKFRQqU*hpTMi16<-y_ z!WDL>mVN}=Rl?xP29$5272_6^Er0fag=Xu;Lexjj6eBd(uFGwVgrM|*sD!m}p|kWh z#B5C*?yewFaj}Y4GDFH~q;n1Or7)5)Sp*=0$A7Pp$3z_VV=wp_ROCzK*Yu1t??kTP z$r2KRY`=Aw5Fnq*m~L5nor%(YwI-J%<2m9&m--+$E~Cc~wJ^pxrX7z*GJp1Y?HR{| zp79oX?dDRPd9kUG6LscYAvrGj`wzM{mtvTy3IB*Z4=xld@jJI3E>M%H38p|$sk}4V_WS+8p7`fezke+L`M1$C{HXEbM(1=P zu{fuTY(E+x9&a9R9v^!~oPS+1X=9un`FeD`(eXyd8)@FCc*VU+&D6VdF2ONX?%O-n z%O{CZo}%7sjKA`0zQ(hzQcP3<;TTs{ON2^rPd3RX&P%GdApx*z#v4H9h;e%3j51aWkSK;U-NEtuduh&002{IPS!8CyqOD+==5S7ssj` zcX-ep9z5CM!HX^BIiBX^I>r=h?HtDxjE1$jQ-9F5QlUGGaaX6itJB@p>F(-u zcXhhEI^Ex$azDsP50BK`88Io>BCJ7Cpj>Eq3O{*bEMVy?|5P7^WzR$cW$Z~1`%u&Q z5-v#1?|*%@Ax_*l0bD@F=YC&EtQE)Y_1t4CXD}QIHxh#uWU#nZ#`@|R@1Yl+X9mQS z>y#3+c8NUX-f;;n7W@*;jaU}Sr?^=Wet1bKYndbBix=mR;kaj9!h2DSNj?+7C~xi{ zw&Bc1@2Q&^Fy|!BvXe3AFX8XNloY$JQhv!ZL4TjSl_?|*0+|+W93SuKWZdRXVo2R(AM?kq_|u)y(!kNicOrd6f0EZ z?@Y=rRf8Z-O1)*t{jS>}b{oX+V1t-4aVoA!%xn_H9ZKK@ove1P>R38m7w#Do>KvCYznP*BNg}_hl?;<2r&-$65i)+ zy+cF6-(_V(Mym#hs)9^8X(QeXf4#$H7k|WboRK-*j+aNu0lxQ2ZbqfL;lGc1#_#jF zhgjeTI!9!|mh#u*P3$hrnKY;+K;(uR| zoLw)(rOGZpkOw+#14*KPuB3;BPW(*WB~Wjknnd(RQc@LZ71NScDyndWTFaZ%G{Ps; zq*^8+T_6`zOJJRU@{(w498de<|0*V+HPX!A>7hgC z6z`nkJMR?NvLcgGKx^_9Lgt$xtKQ0b+-Q&C6)G@2Uq=4sq+eJFB%G&q?3OIFYS**m zf@vpjQ;pwNOq3rj8*ehqxx!e^{3Y@@6Sj2kfdbl-TzsJDw;jS%4@mdw1Ai4-kTJA! zm;Z z=_rEo0(~_!LJHxn8U+jVmX#{0w>skF1Y2GZswraU!(YE3yjU{hxcqqZMV)aR#QQ?1)bob8S+|b?Xq_;Q|Aez z6ubO^mm9=&l#^vDW$QWi*a@~ctJI6$%7V$uEDa0rm#L9Buz$kL(LiBUS1Bocx0D$g zDUx*lXQ_%wW_h+EkP|s{FHnVL)XmFEADQ-Z(nlhSmVY&5WBFGrOf3J}A`6GOb`0Dx z@Xj;vASayq!ba8tN&BZB^Tq(E85hp*eqdk~@@@=L0pG^KRb$;GrfRnRgjNoK4(2om z81fhnbpXdcI2}frSYPm?5y{5}r|DA=8E~ z0kq1_gtf6ghgw*#Cu{^MnN&Vh6VN^tXi-M5=3V#tH!oV%WAhta~=K&~W0Z&Ys zC*-`u-xFV-oSpK90aVe^k`msOEzvbu!G{azGQmOK1#W?D^-IC%Z!8%fR#Pa)LF9>L zk5L!Tp?`_?PoQo4IXNOcE%H`7Bk*&w-8(6)bAyhOeK(CZ%8aBuC#NM@mYy9=ljbTc zWRYXs$Z9c0|3LnKPw}td|3*biNc!nQ-=&VcEH#-{@Zn4X987!03X|Bcw72l8P7#mo zns3do1ucsEO)!ftfy4?Aw10eBEhMe>X{7FnXMYQ`o{eKx2_)Skb7~<`v@55cR@KvI z0Z!`z^4zLUU9emO9XiQL@sMic6f&r?*Ys7W58*j9sNZ!v3N#u=x&Dlh{gb-4eDlB| zw6;g+^lGP9JH6WJ)lRSOuwI?!cgC5I$v^O0&V;iT_VTECX`p#Hj&*bcuye9Ro%8E+jB7;v`ewNG_I(gp7^G=?3@_&4X5#&PVi?CnO=DkZ-;(CJm zqCFSp_N9Do*X;=WqLFp7zmxr)?C)g%F3J8uPHLf)W*_Mt@}+nKX&-~Kefb{itR0D- z#J-c^oeb|}cqhYmNrn$|vP-4>x^U@T(yg2oIQp_&0j-iuj~@C!{(uDAHoR~toqv1v z15XurwIlx31MU(!I#sYUs-T#s^wRsX*Dj_~_1em7>tZ=Oou;AF#<{8AYN4FviY7X3 z*i5HMAcFnc)M&$PX|!Rd(K?N`(;6+tQF>REyuIftY*#Y#JFVAgJsqt#Da@|FM6hvs zeF&qHhMQ4p*VklWpY7~6>M$kj@z8usf z+dKtn`zJi94%<>H=}~kiJ)K(F3ANJ6^iHPxGX0=1!?~^Oiuzdz7-8-F3XJzA&F zHT3ymVTL;=_!GKXVb&yKBL=0WF89A~q{U-cw4=k5!|F76r@?nngGZdxomzET?4@e4 zqr%+(NKiM4(TG8*sl^(GW5f_>TY+`q7o7szQ3cjTTy(nYCF`!keqk*GE~778)XpX> z0#sXrp|-YS5vcZ*Sz>&hK7Z@<*-q*+)a}VSz4r3;+MuweLqc3P-IhgwYU(v9k4~`F zApa|g$QG1Zw@K@i+Kwu>#QBkoW#D1)a+F9PN?KghIcaDm*JzlnjCAw@Cse6XWqsWtbbEWhNq#Z?|zrx zgpCUCtWHBLxVSn6w%Ya83e0ovug+i;zf9VT9L5)EPnT89|+fKOY}Xb8@wPp1edWQD)=sHS!wC zodlpf`LkYQYyb0S9l?`;*OCBApKVwvv5efzGD)ZC>j;K`Q2!49%9 zL9N~88qSs8`Hz-R+KP5A7coLwE_ccy>hsHErEr+$|=TL+sFkTgRDK4eVWXA6@SE* zD1%kUkt~l+g}zauuaPBuv)N&ccOOJvU|+Odhkr8TLDslDAMrrhztB zkP0-57%hW<34aNg@&DL1vH&H(6K!JqUa{Rpz;UUGJP*)0m?6%MYYD*ui~=aO8<@4m zlIdB^=YTruFvc}UHwx|8sXI+BJj%&1@(In7m2^JQH)PX<4dZZ%`0z7vpk*Q1`U-zV zsZfAZ$e;)U5DiWdw9m+#{sdmhetw_NJ;aK2Wd@%DPk&Y%Y9%+8df4Uh0dFh|IN}_H z^CSV(K>+A%87r%6Yo-ja?CfP}=`v z&-fJ~CyF@`L{QC_6|9wxUnsqjRSu8**)RDhqr_ZcYaqvJ0(!lx6c_DJ5ZZ{T^Z)S>c;+#$Y%yjtvv?AwpAd8*mY{0N-SY&=PME zSeY^uCKJ<=aGO^V`x0CxWJQ6c0~x23i^TW)KNrQj#N@pgLRB*%)_c3>j>)q{m4DoO zS!eo3gPiQVI4fTuV#(NvX2Q^ilP3-%f7jWmt_bu&77D>Q+}eUK!o6Jd1xN+aG!WR> zV}Q!An=k6TX1$>_9paz@gkEV#> z^YC0CCZp(({}yokgiQkjZz7}ORIf2pCq|xG&-B~vxCN*E@PDcL4m23YFWcr z%Z{MPUQ1&Zcr*Onits_?Z3tBJ^w>X zp~kx?P^d-y)YGo1v454YR07THSwT|I#(2$ZtWAqXo>|?J#yWad=+9Aa*c%9^d%=O> zkE?ZdhT72#bT1DruZ`V_rnG;fx(_Q9Xn zw!s`?5o7?#22c?N9BTuX&;us5ZEOjDqlDrC4iK);KDa^*%zvpX1CTil^8eC17i8v^X(~9`}gsw^53}6K$4cWNHgiXgkfmcl|6xmyWh0>~7 z5{|9dudK#VQ-6R8>GhY%Klv-!ip#p$23Tkg*ER!U{bj~P;3NPxy+!Ji_;75A7$3}g$htfj$8BHkB4n$h?Se1JEsqJR6Y(1 zgSW!Ms!c;#lYq*jS;O}F0jgJR&$bUFQk?a^NerOcciTfnz^U%-5^pl!JE#%{GMm(*!?aXCAPf_GrA9sn=yOv1J zW!EQc-Xivgu+xs^y)D7RB*f$`Fkw^v>@-+T{^K(E5q=OXzq}fP(z&3;M2On)QBV%Q z)#c_OFJXEqB++p;;AD5xGu}No*be{=+5|Hd(tqk>Y(S?-aC^9X{^PJJaBBRYuyci& z;JQ|Zl?F3&M&6RSWIVb(Sd7-hMb_7Y`2!g*{yQ0stPvfL*xzL646*a@uypUt<(;gJ ze1(veT6z8`Ia|IlBG=9MKVtX)ef4%}l7B7H|AZ8f8T>h2hynkKiIv_CaQa#ykHM8= z9Dk38J>!!LO_Xg_P}TVqG8j)OKBs2Hzn?G9v%r2q&_b@1eZQhjwm~ovslFa%XID?x z)d@70XzM*m{o`}=J7PH$3z?S!5N|dtYvxxxJEa8WHLYBdTS%9x`#fI`)%h$&$@M<> zIpv!nJPG`d879!(ydx$Rdm+xc9-5A0`+vp=MuGq;OjJk-v7K#&&js-)cG*7tXr+Co zi@5satIGEm#HD$GfJ`qm}wg4*jvA~U&9-L9u!wJEI5g{ggVWl_EL1AmR= z7Fn+nQMlLFZ64dG>wXft3+fyL>AQVX?tm8fE#oq%tRvFSg{oASv;R|=J2_jx+?L8+ zprZ9IU-FP}gy>OY=t|i(EBY>ArC}O#+i97map&K*@s?ib?Ug3$;_J>Q{Yhaqw!A!| z(di8b&|1-O|1yh~&Tf3v%2HoaH-Bh|i?L)_n!G|o4t^h;F0V{feF_h z0+Cb%4kFOzBCy>W!@Hd&-tqJKq<>JDqJ7nR1)v;=c^scCHd4m!Il$ZD|9^bU%LGCm zTHcl_{uHt0cTZpLRZCwgzE8ONhP5g%ooQ|gX1Cuyj>_9)bZp? z;mM=Iv~S^?i*63B&66=Oty#lype?aw63tS!j3bbHg$^d*-O6DbKwa=B#OzdXp}4!s zyCxz-4lfqS4KKJt(6u+6;eYx=vEiU!n13GbjT-P^2%|Ly3?a6|eQ^ZKSTE{2+-oMb zropBYyyDwJvf%2DQ2?WzBqe^B?;N`x`>DsjCf5Y68C^k!IUjGrO)qAN&2Gn>KNfQi z3iHxKT5OtSlmw)X-2d6c*8U0BNU}^qYw12mC7N1{nx8Nfd5cODhJRw*`$Q>2!F*?y zHTI%}WtArsNnj_~0xlGKOT;zGk0yu;wTyI#|`730B*#4T6un)e?Hk{iH zIe{GLGHkAG=!VXpmUfYeNz~(&Fd;6*Eop16CgpdWznh#tDa=;&F44RZ$Mf$?D;jcY zg*LJ-(OiSKIY_+N3aj}2SbtWKuudd>^-CCa1L*4q!|GI>_?~%tS{TaYapkaX#N84?jjJU5E6~r# zoN92q?56ZWb#Z5V4L%P?QCtM<17gyjEU}?;0Ko#^g*T~#*#?}Q{y>i49leAiB8HqR zXe(S?9!a93o}zLUHO-_T`hWy#TM2?M3_}Q@_L+Lzq=&^Thref9B6WEir5Z;&!-z5tWC~6Y$ zMfwxr#WJWo5GS?7i!*{5hW3SxEYUrG_B-K7NARI*Z-QyAc=X105CmBoDjvtW zoquTY)I7wmMB*58^tM`%Rx!t#OeXD*-0HK!p7Bf2R`fJU$U75FmfUOwgW6t2gTf<< z0@~l&VauRD?vD<~EgZRIFJV&h>J~>bY-1SXoP)2pV9~o#MtHw>C*C6(;-rfdZ!uE5 zOFucE4Eu#Cnx5QnH!>*%gi0s-iLkv=<$o{Wx25+3WQz~*yMuWWPgK# zu!Fp0PRW9AEK3%0t;MoQ81=8yPQq!-oEfyXekDYAQTB7t_AoCO(kB4Mpjk5sG7dpw zYb%?}s4`~==H8lNd;h(N@X{cB(M?-qAK+Z9lN`vFUXVh>cOETX#;BN<3j0yxV1GIv z9339c_RxIP-y2&8Xm2(`=H3yU4iDzz8JxgFLsXeo@>Ae89S?iPNBH0)A%CAhaupBm zfrP&f!%aT8bnPgCzOik3|B2?m+BjSn$ApZN=6A!8qZ3I{=-Y7&;r*#5voe#uVbQ(r8phZ8PUdygL zW&>qE%1em$)!v#d#o<}aqo6dDGGq4Dmm9cd%l!-FuCOQF76r#bY4F9lVSh=$)y{H+Fn$d$fX$3=7GB4VQbYjPn0W44sF z{O*M@Bs{O;_y5m(n7fE~0Zjy;i+lhsvi7gZZCfbA-j zysd2Ja_-t&-XCwzTesRsxBY!7+us*vDNXW9SjaUvMWzj1|GMBN)=~mcxy5vLnzE9_ zgHe%9HTIKa%lwrIOj>eVrbm|!qIseK8qI1-dh)t_6!n@S@nN8)59Iq@&{=tCHQWC5% z6b0ZJ5*Q&%-hb**0j~I*P$qB{Ct}EoPQ%KM#ge_GkqdFl0#?EUXLFfy;n?V!0D-AE zFZ9H*Ubs{}fcQ>SoFoQan3Q-}9wB04;X7=t`S^N%j>ei`N<=j~+m?&QI|wi41kg0; zYDGo3z5pKf9rh4gwAN$nJGEJsyteCVvovSzyE`x4C4VPjp>8QYBUQA1vXj!c&_g<> zs3oVS7cQ3g%Ae169$NjNF`9tgJ`l}0+zcmP)m3+r*~r8mR{en3IW=!<7Vb^L zP#4=s%Lvg_!x#>r7MQ|H&~;4U*a)^#pj(M(sTK}e=@=}sZB%8}$SVOb7>+oLi0H@T zFa2J>H-G5$d;Oc9afzU19Df=1M*KmqfAd&1o54q-UOhe8ecQ!*R`B6W0-W@W6(-S- zwA6^^ZD&lpSb+n7!Jcb+ez7VKa5O+{gcE*gTASDPisk(J{I#ZM?Q1gRdRPmPQG?rnKlw zV}FTBak}9-HE$bo#BDn#y7hx#I1Vj^zxcy>vcQ+_RO|;i75jdM(Z$4^Pe#+?)T2ve z$*h{j7DWOpaa$$ur{Wc>?*Hfxk;5{FYE+a!1(Ka@ap*f#2{ zHKtAA-({lY;u>En-8&^26g=2gC8(aExPGsqg_n2jSb%F+Y6>+gHP!fDkWPG`PezBu zxk!E)w%THwf3JDMmni+F;kMz;3cNPSN|iNyH9qRyiC(rUUstp5B?;1(;bQXNnW9NhGd~lr)E>eQNPvJQn4ZA9G2RWH* ze^U1rxhIqm&H!~JZURE>^z{UkrW^S*O8JIivRj61+Y`xJgjxtN%Euz#P;f7rdf@Wn zq{X^_U9$Vr^TIGE#9R`?zv!%9bbopDdH%8YdX269&!1Ca8sV2krbGn3sn58y)Ke%@3`kBRJff9!@8F_m1Xh-k%@#rwF0gC3R)7 z>ixbS!)6>z`-g)W?C(tnGiz@=fs?(N*+1Na^ZsN$Fo#n#v64~T1rR?$?|+s{3k2=g zcm3C#r^Kbkuetqkxh8)?%#7o{f7!HgYz+Iu{@!4)HyD2E9~}>e$NhtU8$II}>M?)X zm(*j%R^oG_P82S+$~W@K54IIVKA6U%$oa4DDau|Iv=mZ<{{7FpIk=FRzZrAtt{^9C z3o^9F@CvCe%9c!$AEff5M1OXTM>&}QQZ`;O$eQRk@x6|MOABT3VYz}6&9pU~vXdGb zE*RAls5m9cB`PlOoAy-PH$w#VC*-$O5ZXmzpNc-Vxt zaXdU2A08YW^`}SUagV=}p043wd@w#7O~;4g;nh8KjN`%Z@Nj(8AAcMk9`?h>+4d(F zpFQJvI_?=C#9vq^-#!U(rhkA@F%6m*KdhY}m;`e>=^%1QopR{3LAOatf z4?bLc{>-qAze2ed1JULJy3n?fjlGrP(T9uALIJ;p9#ZviLW#L{T|~H^e(V{86e@?K z!^3GmiB0&dMTFx0qIf_C3d3}cBA2N zFdR_VI z*yHEa1y77#rwCeA1kX?IY2m+PuYJ z)$48no`veuN`GLds6MR%c8Ka@3cx=%8MLbaGLN2H0q7$1^a?;1vx*8}r;uyG_}?CK z?J0o9RNuA&XoKpvqX1f3yB2l<+e5B}J;1h*%PN3j=k)ne&I3a9`Yk&f+d2;z_Q(A} z|7bj&OuO@dU1ES2avtz(44``+@LUWKQwtVk(8QKXD}U_NE-S4kb_%()!q_R~zAKl} zP9c}p5<7)lT5s$Wa%ly!Q^aow;;u(+8KjlO z^J0_TMm#4rS;x_HVw3e0JtsD4LI1qiq$T_FVw2qqJSR3;N6>R(llA;OA2u=R9HmLL z?C$>|&VPFk`;$?B8f@)qdhhfVZbUI<5_{So438$`;b5HHh9~xV?c=5?z=!?e3_V+hIt?G$y6CS0ufIX%DF|G?jYfrb_zdY6wnT(&~!%$UEW#go%rvfiMnW_PWX4xL@zp;=<(67EbJM_ zWNq6$;~jxBJ1Pt8*Eao#eH{Fs@In0i;H+gO(|*r55r2z6IlvRTCd`NWSWI zP4faH14*)EBF}KKLxb$!zki?Ew`95`26*RzU;eV)d*ohGcWKb~V3X~gqX5Gu6#bx` zv*7(88{lqd!t86`+p26 zd=K939-KkTI{z#KzoscTmr3a3&DpEfM6>~a!XxAmo5Rn5cHTT z?!63tb=}`=dbM;M+oi~4dDiToFk43X?;M3Soi&p+hY9}vmaK2d_wU~&S@M>P1$0-^ zsU*pg16{ZX`f};A@tCYm9NWWw-+za%W8>xYQUjFH#mQ=5Q&77^Q(vC>a_#KncGR|h`1?I(kPC3iUw-zQsDVgqAB5!F? zR(2>|(mfT(x=m2V4+MUr&-9Zg=J<=@|B+I}KUGiR0Q#uCB${ zM|Wb`lkNg~6uDjK;I8A^KUV)YL!>ja|LbeNuc@p}Y3{)c>kONm)FaH5$2{^_gnAf@ z2y1PMMC=;1;Skx}VOL4eDXc2*mefQkUZm?zBdu`V!gUMRU5o41wH()NKN8D^W-u0^ znQ?i4@l*l4Q^|>KTmHOp0iByBP6 zVN%JApws}d(j#EY@*zm-nD13GzmiI&vL`H$wH@l~%dZg+7pC@IoQI%=$;?CU12$0C z^DFea-pN$ysoF_T)%3n3OaDaBM6M^DlBH#Tt(h)5kTT=Dh$&I$7f!9)mK(uFj_m(J zD_@HOrSYhX$&BgPpU_&Oj5k^Om_*93=eBt_qrMKiu|%O&wN{WJL55x%8S3lVWaw7{ zCl=zJ$A-BwXwQ4_E+9Agd?d`AO+tbmkR?Q8)F7wD#oH}{BD_h8kkagOK^jle@6)M= zC>tqNmnDDq%>TWP$8K=+`liG(-5%6etj?P;hP{Lh%%5tbCtg6S%B;4-v{7w1=$e zNswlO$t*B9LIE^Q7kM5s0p6C@0q2yt^{MSHkO?L$0KuQZ*Gn>h;LJ9W0p2~%u`vgj zn3y$@)v;Jw6dUaAi35#$WNvGJVV(6JKw<(2zOhtu=*>Iv#rP+w%k&&hSL);^G!WDt zJ##)-X;2%`iRRs-h4Z)l<3G-FWiOn+CyOasO*MUrwdHECTq0e4(51Clrxu7V5Zy=g zfif;e^uI7M?Z*rIidKa3T>(Wg|CeZnnT*I}DSbcd<2ZZwk!b@1ZbyrMO{Fhvj|Qr8 zHiwpl$Sm0C#)OsI_w%ySE+H}P1woz{qXRp^E`6geLkxC#N-=_D6_vO_tOJvK(=X>7Z7)W|ml5jAS?g9t@wWUqLS&X=8lUm@R%+EeLtwDGZ9IFbF=$UF;te;p_* zOFI!yZ*=uemcrex;G>Lx%Jcq6v2~+V8i}@jR%(?Y+J}WqEEOmkACEGXZ8|d@A6nxg zMq#`FCbT(gQneb4sh{Zy;-FA2z~R&5hYwO~KH)89qDj~(;G`Kz%dpce4)~_GLj~qp z{9m6|lqHq^hgi!0UVWMyjb zvEMfnOrX2^l^C|k%$fO44-NE)M=6T?-u6ee(DP@T{l=Z+Ya_y{vX=-GOlF5M;Y|t8 zMTIjd@XejW3hhLSFU5Q}!WU5ARMAx#Z=|E1H5^pXT|svR-4%2X>rd8Ah2- zQOXRtxM5`*IU0?Bt3l;j%7?UGHXk}CQ=5|ju`JmiN+l1(U@42(2zy^{J` z#{dQ`G=O2N4PexI0~oj50M>F883-mb0S(olq51CNg@Zg>jXXXk7Cf_f0tjjag5#@u z()qVc-IJcbRqDQ${g0ZN+lQvYWMBumt`&-?4@SRW6D z>UayWAC4qh`U~ON zoCY^Le6AT zV0&e^zYO#oLw9WhdEOQByg;Y9EIyVw+w_-9Y<8}%i>YY5paQGkmd0o2NjZPB4L-=o zkj?dPgaWK0U{ArL-)i6m`DHK*@3k|-gw_f?&JhXI-4Z9L4|o*1)Vn1IdXjCUQ^ON| zQ{v*PQf#4-i>>zK|LZWbVL#W*9?)g5sU2K=mY%unwY6jkyz@o_o1HUk`j<`ae(Rgx zoYTh)fts2|X1D!W?~xSK%9npNtqgT~|12`|dc$~GXV?TTtKLI|GFRszYkCr-nK0sH zgk?a}bdl#F6X0!W9dJ&WgPhv#0-0d40ucO(+yF=*II~S;fOn5`Y|H^BCT2}!bu5+^ z#RhwO;y~jbncG^ZztjVX2_X2!Qq7?^@5Cp$^<04&;Xom+s^L0NF*1Mc7@72am||p( zI5J{&Nvtltw$-K4pe!3s12``mR%>R%GI08lykT8`LV_&|`uxT_m@uo)N0`+N!pxc| zNOMbUUy$ZEP5=aHegPvRNON09reARo6e&BQ3JnE zryingq*Ps&uJBJ3{I0&czbUayw+Hn->%P1ISOKuF3}A=KC=Xy4_5*J`a*!zxPT>TH zkZ}I_eE^Ty=*SAm21Oq53q@g7XXD)_Zn+D7r*q_Tg;*2;V6=aoC9OTj#`(;)SqtFQ z_bgxe+tRW!!aw|nk-6?R^uw}VxN-HydBzo4Rpqv^NM3&C%9Qg0BLkh2sm;w>BULxY zTI1~#oV6YH-!je`)8n#?b;D6LRhInBXF(^|vHVn>^+qKrTLDtFoP)n&kXvPTzRO&F zg1*E2YIA?|oea;yOvFsRg$COOR+6L9FOixE3=|mn+AwgKb0%K3!|)D21+S^&@AjR0 z_Z8ox#94kam@FyS9*9T6knhMTcgzY*?7@k}>J}&5y^#~{hNGMl?yeC1mH67gZ8w{Y zd4zFd+g8Cx2fG3e{qP_rO2Nkmy9yW3z4ri}qm6%6Ko6kcU3X(09q^k?0i8qk5B7kE zD8*!UOBQeiD7;4if+>0g9x`lVdVt!1xpz2&6tO=j^zH#ucXMgg_^AWy)lx>qG&I5* zHpjAxZwX4<%sA&9oU8egn)V|%(uCPEp(fuz=o<5qUfATS}+Qf6`PtRRUW<`n=FXv!=N{N;4d25?T`>Tni7)9)C>^cv3 zdvjXd%lTX}RDjQjLSz0hqf<($^)@@FS4`xtNt>h6G;+H9o6{aO=X<bl?Ep&eQ7m;N5=$Iybvzy7SL>!MGJJQ$z|aSgXh>nQ!GH zE`KAQG)K-yJg5Ilbj5nI>YUq{GqHxbeENeWQjSg~x-Tr{y{pVoui_H!K-$8M8sP|Sd zq1|snyGJ?upPMn^y#R2VuVAW?8hC$3qn8GKS{F?@wk7YIZ{!!xHSdVFBxjL3OaV@A zmx`hx5ZpF*@LKntR%Fjg3e%UFoowuiY3ataPM_9$rXYn83a>kMU^LFz1`R$N^}|~^ zttXPRdgRRRV38Iy6?cCZ?<8^D zgb2VZ8Gx5EjQt0;^F)M1@0V6|MH}f=Z<*eEwnWO18*GVMM>EogM!dSOHPQz#h-(4F zU0NboRRpWnML5SwP7G0K%ba90%#}S++q#E*suw0Hpm|{mE_Sz*s*#L2^cTeR-%Cl1D5pwp^YI06Y_lD@0v4@5Tm5!bO)T5E_rQ`+Yymn) rE&|X+fCRys9&ne0_#vJm%7ag-)RDAa->v^Y00960{W#SFYcT-;)&mwf delta 4177 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 b4?d+*N78zIxBmYC00960)^ZE|Z!rM?q;xss diff --git a/build/version.go b/build/version.go index f262ab849..c924a0aa8 100644 --- a/build/version.go +++ b/build/version.go @@ -37,7 +37,7 @@ func BuildTypeString() string { } // BuildVersion is the local build version -const BuildVersion = "1.17.2-rc2" +const BuildVersion = "1.17.2" func UserVersion() string { if os.Getenv("LOTUS_VERSION_IGNORE_COMMIT") == "1" { diff --git a/documentation/en/cli-lotus-miner.md b/documentation/en/cli-lotus-miner.md index 316cf96c5..9921769e0 100644 --- a/documentation/en/cli-lotus-miner.md +++ b/documentation/en/cli-lotus-miner.md @@ -7,7 +7,7 @@ USAGE: lotus-miner [global options] command [command options] [arguments...] VERSION: - 1.17.2-rc2 + 1.17.2 COMMANDS: init Initialize a lotus miner repo diff --git a/documentation/en/cli-lotus-worker.md b/documentation/en/cli-lotus-worker.md index ebc865dac..ffe7acc56 100644 --- a/documentation/en/cli-lotus-worker.md +++ b/documentation/en/cli-lotus-worker.md @@ -7,7 +7,7 @@ USAGE: lotus-worker [global options] command [command options] [arguments...] VERSION: - 1.17.2-rc2 + 1.17.2 COMMANDS: run Start lotus worker diff --git a/documentation/en/cli-lotus.md b/documentation/en/cli-lotus.md index e0aecbf90..066416c83 100644 --- a/documentation/en/cli-lotus.md +++ b/documentation/en/cli-lotus.md @@ -7,7 +7,7 @@ USAGE: lotus [global options] command [command options] [arguments...] VERSION: - 1.17.2-rc2 + 1.17.2 COMMANDS: daemon Start a lotus daemon process From ce65cdd1e5e76cf5070b8db530022e927492f634 Mon Sep 17 00:00:00 2001 From: Peter Rabbitson Date: Wed, 5 Oct 2022 21:10:19 +0200 Subject: [PATCH 36/43] Teach shed/sim to understand --tipset=@nnn notation --- cli/state.go | 23 +++++++++++++++++++++++ cmd/lotus-shed/export.go | 20 +++----------------- cmd/lotus-sim/create.go | 7 +------ 3 files changed, 27 insertions(+), 23 deletions(-) diff --git a/cli/state.go b/cli/state.go index c88df8da2..de358815f 100644 --- a/cli/state.go +++ b/cli/state.go @@ -44,6 +44,7 @@ import ( "github.com/filecoin-project/lotus/chain/consensus/filcns" "github.com/filecoin-project/lotus/chain/state" "github.com/filecoin-project/lotus/chain/stmgr" + "github.com/filecoin-project/lotus/chain/store" "github.com/filecoin-project/lotus/chain/types" ) @@ -294,6 +295,28 @@ func ParseTipSetRef(ctx context.Context, api v0api.FullNode, tss string) (*types return ts, nil } +func ParseTipSetRefOffline(ctx context.Context, cs *store.ChainStore, tss string) (*types.TipSet, error) { + switch { + + case tss == "" || tss == "@head": + return cs.GetHeaviestTipSet(), nil + + case tss[0] != '@': + cids, err := ParseTipSetString(tss) + if err != nil { + return nil, xerrors.Errorf("failed to parse tipset (%q): %w", tss, err) + } + return cs.LoadTipSet(ctx, types.NewTipSetKey(cids...)) + + default: + var h uint64 + if _, err := fmt.Sscanf(tss, "@%d", &h); err != nil { + return nil, xerrors.Errorf("parsing height tipset ref: %w", err) + } + return cs.GetTipsetByHeight(ctx, abi.ChainEpoch(h), cs.GetHeaviestTipSet(), true) + } +} + var StatePowerCmd = &cli.Command{ Name: "power", Usage: "Query network or miner power", diff --git a/cmd/lotus-shed/export.go b/cmd/lotus-shed/export.go index 8de3f48df..459de3383 100644 --- a/cmd/lotus-shed/export.go +++ b/cmd/lotus-shed/export.go @@ -32,7 +32,6 @@ import ( "github.com/filecoin-project/lotus/blockstore" "github.com/filecoin-project/lotus/chain/store" - "github.com/filecoin-project/lotus/chain/types" lcli "github.com/filecoin-project/lotus/cli" "github.com/filecoin-project/lotus/cmd/lotus-shed/shedgen" "github.com/filecoin-project/lotus/node/repo" @@ -125,22 +124,9 @@ var exportChainCmd = &cli.Command{ fullstate := cctx.Bool("full-state") skipoldmsgs := cctx.Bool("skip-old-msgs") - var ts *types.TipSet - if tss := cctx.String("tipset"); tss != "" { - cids, err := lcli.ParseTipSetString(tss) - if err != nil { - return xerrors.Errorf("failed to parse tipset (%q): %w", tss, err) - } - - tsk := types.NewTipSetKey(cids...) - - selts, err := cs.LoadTipSet(context.Background(), tsk) - if err != nil { - return xerrors.Errorf("loading tipset: %w", err) - } - ts = selts - } else { - ts = cs.GetHeaviestTipSet() + ts, err := lcli.ParseTipSetRefOffline(ctx, cs, cctx.String("tipset")) + if err != nil { + return err } if fullstate { diff --git a/cmd/lotus-sim/create.go b/cmd/lotus-sim/create.go index 23ea454a3..bc7f9ade9 100644 --- a/cmd/lotus-sim/create.go +++ b/cmd/lotus-sim/create.go @@ -31,12 +31,7 @@ var createSimCommand = &cli.Command{ } ts = node.Chainstore.GetHeaviestTipSet() case 1: - cids, err := lcli.ParseTipSetString(cctx.Args().Get(1)) - if err != nil { - return err - } - tsk := types.NewTipSetKey(cids...) - ts, err = node.Chainstore.LoadTipSet(cctx.Context, tsk) + ts, err = lcli.ParseTipSetRefOffline(cctx.Context, node.Chainstore, cctx.Args().Get(1)) if err != nil { return err } From 249dfae727e0cb05ab4612639f0583be48233652 Mon Sep 17 00:00:00 2001 From: Rod Vagg Date: Sat, 8 Oct 2022 10:49:46 +1100 Subject: [PATCH 37/43] deps: upgrade go-merkledag to 0.8.0 --- go.mod | 2 +- go.sum | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index dd98c134f..0fe5f1948 100644 --- a/go.mod +++ b/go.mod @@ -95,7 +95,7 @@ require ( github.com/ipfs/go-ipld-cbor v0.0.6 github.com/ipfs/go-ipld-format v0.4.0 github.com/ipfs/go-log/v2 v2.5.1 - github.com/ipfs/go-merkledag v0.6.0 + github.com/ipfs/go-merkledag v0.8.0 github.com/ipfs/go-metrics-interface v0.0.1 github.com/ipfs/go-metrics-prometheus v0.0.2 github.com/ipfs/go-unixfs v0.3.1 diff --git a/go.sum b/go.sum index 5709c1dd2..3fe0cd8d5 100644 --- a/go.sum +++ b/go.sum @@ -804,8 +804,9 @@ github.com/ipfs/go-merkledag v0.2.3/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB github.com/ipfs/go-merkledag v0.2.4/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= github.com/ipfs/go-merkledag v0.3.2/go.mod h1:fvkZNNZixVW6cKSZ/JfLlON5OlgTXNdRLz0p6QG/I2M= github.com/ipfs/go-merkledag v0.5.1/go.mod h1:cLMZXx8J08idkp5+id62iVftUQV+HlYJ3PIhDfZsjA4= -github.com/ipfs/go-merkledag v0.6.0 h1:oV5WT2321tS4YQVOPgIrWHvJ0lJobRTerU+i9nmUCuA= github.com/ipfs/go-merkledag v0.6.0/go.mod h1:9HSEwRd5sV+lbykiYP+2NC/3o6MZbKNaa4hfNcH5iH0= +github.com/ipfs/go-merkledag v0.8.0 h1:ZUda+sh/MGZX4Z13DE/VQT4GmKWm4H95Nje4qcL/yPE= +github.com/ipfs/go-merkledag v0.8.0/go.mod h1:/RmH1kOs7qDMNtGKPh4d/UErNMVuAMpPS/tP57a3aoY= 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-metrics-prometheus v0.0.2 h1:9i2iljLg12S78OhC6UAiXi176xvQGiZaGVF1CUVdE+s= From 0645225801d01a673e9a3efac908aa6d727d7957 Mon Sep 17 00:00:00 2001 From: Phi Date: Mon, 10 Oct 2022 08:31:55 +0200 Subject: [PATCH 38/43] fix: ux: specify arg in `net ping` cmd Specify that you need to ping the `peerMultiaddrs` with the `lotus net ping` and `lotus-miner net ping`. --- cli/net.go | 5 +++-- documentation/en/cli-lotus-miner.md | 2 +- documentation/en/cli-lotus.md | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/cli/net.go b/cli/net.go index b0615e0b1..6b10dbffc 100644 --- a/cli/net.go +++ b/cli/net.go @@ -124,8 +124,9 @@ var NetPeers = &cli.Command{ } var NetPing = &cli.Command{ - Name: "ping", - Usage: "Ping peers", + Name: "ping", + Usage: "Ping peers", + ArgsUsage: "[peerMultiaddr]", Flags: []cli.Flag{ &cli.IntFlag{ Name: "count", diff --git a/documentation/en/cli-lotus-miner.md b/documentation/en/cli-lotus-miner.md index a10cb45ba..ac0c212a5 100644 --- a/documentation/en/cli-lotus-miner.md +++ b/documentation/en/cli-lotus-miner.md @@ -1241,7 +1241,7 @@ NAME: lotus-miner net ping - Ping peers USAGE: - lotus-miner net ping [command options] [arguments...] + lotus-miner net ping [command options] [peerMultiaddr] OPTIONS: --count value, -c value specify the number of times it should ping (default: 10) diff --git a/documentation/en/cli-lotus.md b/documentation/en/cli-lotus.md index eb57455b5..03b626e44 100644 --- a/documentation/en/cli-lotus.md +++ b/documentation/en/cli-lotus.md @@ -2542,7 +2542,7 @@ NAME: lotus net ping - Ping peers USAGE: - lotus net ping [command options] [arguments...] + lotus net ping [command options] [peerMultiaddr] OPTIONS: --count value, -c value specify the number of times it should ping (default: 10) From e69fdaf48bc9cbcc9f9f28462b6816838ba3a9dd Mon Sep 17 00:00:00 2001 From: simlecode <69969590+simlecode@users.noreply.github.com> Date: Mon, 10 Oct 2022 16:18:35 +0800 Subject: [PATCH 39/43] fix: not multiplied by the number of seconds --- chain/messagepool/messagepool.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chain/messagepool/messagepool.go b/chain/messagepool/messagepool.go index def161171..085980f79 100644 --- a/chain/messagepool/messagepool.go +++ b/chain/messagepool/messagepool.go @@ -112,7 +112,7 @@ type MessagePoolEvtMessage struct { func init() { // if the republish interval is too short compared to the pubsub timecache, adjust it - minInterval := pubsub.TimeCacheDuration + time.Duration(build.PropagationDelaySecs) + minInterval := pubsub.TimeCacheDuration + time.Duration(build.PropagationDelaySecs)*time.Second if RepublishInterval < minInterval { RepublishInterval = minInterval } From 2c11f9d2651a802f7aa551a72ee42aeb4d94716d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 5 Oct 2022 19:44:55 +0000 Subject: [PATCH 40/43] feat: Add node uptime rpc / output in info command --- api/api_common.go | 4 ++++ api/mocks/mock_full.go | 15 +++++++++++++++ api/proxy_gen.go | 13 +++++++++++++ api/v0api/v0mocks/mock_full.go | 15 +++++++++++++++ build/openrpc/full.json.gz | Bin 28424 -> 28427 bytes build/openrpc/gateway.json.gz | Bin 5080 -> 5077 bytes build/openrpc/miner.json.gz | Bin 16025 -> 16032 bytes build/openrpc/worker.json.gz | Bin 5260 -> 5259 bytes cli/info.go | 6 ++++++ cmd/lotus-miner/info.go | 6 ++++++ documentation/en/api-v0-methods-miner.md | 14 ++++++++++++++ documentation/en/api-v0-methods.md | 14 ++++++++++++++ documentation/en/api-v1-unstable-methods.md | 14 ++++++++++++++ node/builder.go | 1 + node/impl/common/common.go | 7 +++++++ node/modules/dtypes/api.go | 4 ++++ node/options.go | 6 ++++++ 17 files changed, 119 insertions(+) diff --git a/api/api_common.go b/api/api_common.go index 73a0c984c..2a887a26a 100644 --- a/api/api_common.go +++ b/api/api_common.go @@ -3,6 +3,7 @@ package api import ( "context" "fmt" + "time" "github.com/google/uuid" @@ -49,6 +50,9 @@ type Common interface { // trigger graceful shutdown Shutdown(context.Context) error //perm:admin + // StartTime returns node start time + StartTime(context.Context) (time.Time, error) //perm:read + // Session returns a random UUID of api provider session Session(context.Context) (uuid.UUID, error) //perm:read diff --git a/api/mocks/mock_full.go b/api/mocks/mock_full.go index bfc4fc905..ab86d19cf 100644 --- a/api/mocks/mock_full.go +++ b/api/mocks/mock_full.go @@ -2272,6 +2272,21 @@ func (mr *MockFullNodeMockRecorder) Shutdown(arg0 interface{}) *gomock.Call { return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Shutdown", reflect.TypeOf((*MockFullNode)(nil).Shutdown), arg0) } +// StartTime mocks base method. +func (m *MockFullNode) StartTime(arg0 context.Context) (time.Time, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StartTime", arg0) + ret0, _ := ret[0].(time.Time) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StartTime indicates an expected call of StartTime. +func (mr *MockFullNodeMockRecorder) StartTime(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StartTime", reflect.TypeOf((*MockFullNode)(nil).StartTime), arg0) +} + // StateAccountKey mocks base method. func (m *MockFullNode) StateAccountKey(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (address.Address, error) { m.ctrl.T.Helper() diff --git a/api/proxy_gen.go b/api/proxy_gen.go index 935eaca94..254d1274d 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -79,6 +79,8 @@ type CommonStruct struct { Shutdown func(p0 context.Context) error `perm:"admin"` + StartTime func(p0 context.Context) (time.Time, error) `perm:"read"` + Version func(p0 context.Context) (APIVersion, error) `perm:"read"` } } @@ -1162,6 +1164,17 @@ func (s *CommonStub) Shutdown(p0 context.Context) error { return ErrNotSupported } +func (s *CommonStruct) StartTime(p0 context.Context) (time.Time, error) { + if s.Internal.StartTime == nil { + return *new(time.Time), ErrNotSupported + } + return s.Internal.StartTime(p0) +} + +func (s *CommonStub) StartTime(p0 context.Context) (time.Time, error) { + return *new(time.Time), ErrNotSupported +} + func (s *CommonStruct) Version(p0 context.Context) (APIVersion, error) { if s.Internal.Version == nil { return *new(APIVersion), ErrNotSupported diff --git a/api/v0api/v0mocks/mock_full.go b/api/v0api/v0mocks/mock_full.go index 8df8a89f7..5cbcac8b5 100644 --- a/api/v0api/v0mocks/mock_full.go +++ b/api/v0api/v0mocks/mock_full.go @@ -2157,6 +2157,21 @@ func (mr *MockFullNodeMockRecorder) Shutdown(arg0 interface{}) *gomock.Call { return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Shutdown", reflect.TypeOf((*MockFullNode)(nil).Shutdown), arg0) } +// StartTime mocks base method. +func (m *MockFullNode) StartTime(arg0 context.Context) (time.Time, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StartTime", arg0) + ret0, _ := ret[0].(time.Time) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StartTime indicates an expected call of StartTime. +func (mr *MockFullNodeMockRecorder) StartTime(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StartTime", reflect.TypeOf((*MockFullNode)(nil).StartTime), arg0) +} + // StateAccountKey mocks base method. func (m *MockFullNode) StateAccountKey(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (address.Address, error) { m.ctrl.T.Helper() diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 5e5c0e76275f150057a6da56aa13224ce7191d68..9db0b94b2f219f6439e8271b06bb69ed12cb4951 100644 GIT binary patch delta 23603 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

M_^K>&A2*Sh6vkOjAq=Fda=0c<(<#gTuxpPOlin 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 delta 23560 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 eFY9ZF?Bg<_9)Bk?PmL1F2NKRVP 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%0DCJC2O;%M1(VXcF(O>_noy2LnTEIw*c6IQJ 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 IA8#=M02MySH2?qr diff --git a/cli/info.go b/cli/info.go index 0d036875a..007e3655f 100644 --- a/cli/info.go +++ b/cli/info.go @@ -41,7 +41,13 @@ func infoCmdAct(cctx *cli.Context) error { return err } + start, err := fullapi.StartTime(ctx) + if err != nil { + return err + } + fmt.Printf("Network: %s\n", network.NetworkName) + fmt.Printf("StartTime: %s (started at %s)\n", time.Now().Sub(start).Truncate(time.Second), start.Truncate(time.Second)) fmt.Print("Chain: ") err = SyncBasefeeCheck(ctx, fullapi) if err != nil { diff --git a/cmd/lotus-miner/info.go b/cmd/lotus-miner/info.go index 9065139eb..312d86600 100644 --- a/cmd/lotus-miner/info.go +++ b/cmd/lotus-miner/info.go @@ -92,6 +92,12 @@ func infoCmdAct(cctx *cli.Context) error { fmt.Println("Enabled subsystems (from markets API):", subsystems) + start, err := fullapi.StartTime(ctx) + if err != nil { + return err + } + fmt.Printf("StartTime: %s (started at %s)\n", time.Now().Sub(start).Truncate(time.Second), start.Truncate(time.Second)) + fmt.Print("Chain: ") err = lcli.SyncBasefeeCheck(ctx, fullapi) diff --git a/documentation/en/api-v0-methods-miner.md b/documentation/en/api-v0-methods-miner.md index 848600bc6..d999d7f22 100644 --- a/documentation/en/api-v0-methods-miner.md +++ b/documentation/en/api-v0-methods-miner.md @@ -167,6 +167,8 @@ * [SectorsSummary](#SectorsSummary) * [SectorsUnsealPiece](#SectorsUnsealPiece) * [SectorsUpdate](#SectorsUpdate) +* [Start](#Start) + * [StartTime](#StartTime) * [Storage](#Storage) * [StorageAddLocal](#StorageAddLocal) * [StorageAttach](#StorageAttach) @@ -3621,6 +3623,18 @@ Inputs: Response: `{}` +## Start + + +### StartTime + + +Perms: read + +Inputs: `null` + +Response: `"0001-01-01T00:00:00Z"` + ## Storage diff --git a/documentation/en/api-v0-methods.md b/documentation/en/api-v0-methods.md index 44a8ca554..5bcb25570 100644 --- a/documentation/en/api-v0-methods.md +++ b/documentation/en/api-v0-methods.md @@ -156,6 +156,8 @@ * [PaychVoucherCreate](#PaychVoucherCreate) * [PaychVoucherList](#PaychVoucherList) * [PaychVoucherSubmit](#PaychVoucherSubmit) +* [Start](#Start) + * [StartTime](#StartTime) * [State](#State) * [StateAccountKey](#StateAccountKey) * [StateActorCodeCIDs](#StateActorCodeCIDs) @@ -4615,6 +4617,18 @@ Response: } ``` +## Start + + +### StartTime + + +Perms: read + +Inputs: `null` + +Response: `"0001-01-01T00:00:00Z"` + ## State The State methods are used to query, inspect, and interact with chain state. Most methods take a TipSetKey as a parameter. The state looked up is the parent state of the tipset. diff --git a/documentation/en/api-v1-unstable-methods.md b/documentation/en/api-v1-unstable-methods.md index ff360e16a..feca555a7 100644 --- a/documentation/en/api-v1-unstable-methods.md +++ b/documentation/en/api-v1-unstable-methods.md @@ -164,6 +164,8 @@ * [PaychVoucherCreate](#PaychVoucherCreate) * [PaychVoucherList](#PaychVoucherList) * [PaychVoucherSubmit](#PaychVoucherSubmit) +* [Start](#Start) + * [StartTime](#StartTime) * [State](#State) * [StateAccountKey](#StateAccountKey) * [StateActorCodeCIDs](#StateActorCodeCIDs) @@ -5047,6 +5049,18 @@ Response: } ``` +## Start + + +### StartTime + + +Perms: read + +Inputs: `null` + +Response: `"0001-01-01T00:00:00Z"` + ## State The State methods are used to query, inspect, and interact with chain state. Most methods take a TipSetKey as a parameter. The state looked up is the parent state of the tipset. diff --git a/node/builder.go b/node/builder.go index ca31a2c91..9690b7f7c 100644 --- a/node/builder.go +++ b/node/builder.go @@ -155,6 +155,7 @@ func defaults() []Option { Override(new(journal.DisabledEvents), journal.EnvDisabledEvents), Override(new(journal.Journal), modules.OpenFilesystemJournal), Override(new(*alerting.Alerting), alerting.NewAlertingSystem), + Override(new(dtypes.NodeStartTime), FromVal(dtypes.NodeStartTime(time.Now()))), Override(CheckFDLimit, modules.CheckFdLimit(build.DefaultFDLimit)), diff --git a/node/impl/common/common.go b/node/impl/common/common.go index 182b74989..eff6b58b8 100644 --- a/node/impl/common/common.go +++ b/node/impl/common/common.go @@ -2,6 +2,7 @@ package common import ( "context" + "time" "github.com/gbrlsnchs/jwt/v3" "github.com/google/uuid" @@ -26,6 +27,8 @@ type CommonAPI struct { Alerting *alerting.Alerting APISecret *dtypes.APIAlg ShutdownChan dtypes.ShutdownChan + + Start dtypes.NodeStartTime } type jwtPayload struct { @@ -91,3 +94,7 @@ func (a *CommonAPI) Session(ctx context.Context) (uuid.UUID, error) { func (a *CommonAPI) Closing(ctx context.Context) (<-chan struct{}, error) { return make(chan struct{}), nil // relies on jsonrpc closing } + +func (a *CommonAPI) StartTime(context.Context) (time.Time, error) { + return time.Time(a.Start), nil +} diff --git a/node/modules/dtypes/api.go b/node/modules/dtypes/api.go index d57b05cfa..6de511b9d 100644 --- a/node/modules/dtypes/api.go +++ b/node/modules/dtypes/api.go @@ -1,6 +1,8 @@ package dtypes import ( + "time" + "github.com/gbrlsnchs/jwt/v3" "github.com/multiformats/go-multiaddr" ) @@ -8,3 +10,5 @@ import ( type APIAlg jwt.HMACSHA type APIEndpoint multiaddr.Multiaddr + +type NodeStartTime time.Time diff --git a/node/options.go b/node/options.go index 0793a150f..26c2c247f 100644 --- a/node/options.go +++ b/node/options.go @@ -93,6 +93,12 @@ func From(typ interface{}) interface{} { }).Interface() } +func FromVal[T any](v T) func() T { + return func() T { + return v + } +} + // from go-ipfs // as casts input constructor to a given interface (if a value is given, it // wraps it into a constructor). From 516ad171d2c05b9d52d50c173e41a646941f8c6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 12 Oct 2022 10:03:22 +0200 Subject: [PATCH 41/43] fix: bstore: Handle codecs correctly in membstore Get --- blockstore/mem.go | 3 +++ blockstore/mem_test.go | 45 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 blockstore/mem_test.go diff --git a/blockstore/mem.go b/blockstore/mem.go index 15708dcd4..7cfefafd7 100644 --- a/blockstore/mem.go +++ b/blockstore/mem.go @@ -47,6 +47,9 @@ func (m MemBlockstore) Get(ctx context.Context, k cid.Cid) (blocks.Block, error) if !ok { return nil, ipld.ErrNotFound{Cid: k} } + if b.Cid().Prefix().Codec != k.Prefix().Codec { + return blocks.NewBlockWithCid(b.RawData(), k) + } return b, nil } diff --git a/blockstore/mem_test.go b/blockstore/mem_test.go new file mode 100644 index 000000000..4d4a77624 --- /dev/null +++ b/blockstore/mem_test.go @@ -0,0 +1,45 @@ +package blockstore + +import ( + "context" + "testing" + + blocks "github.com/ipfs/go-block-format" + "github.com/ipfs/go-cid" + mh "github.com/multiformats/go-multihash" + "github.com/stretchr/testify/require" +) + +func TestMemGetCodec(t *testing.T) { + ctx := context.Background() + bs := NewMemory() + + cborArr := []byte{0x82, 1, 2} + + h, err := mh.Sum(cborArr, mh.SHA2_256, -1) + require.NoError(t, err) + + rawCid := cid.NewCidV1(cid.Raw, h) + rawBlk, err := blocks.NewBlockWithCid(cborArr, rawCid) + require.NoError(t, err) + + err = bs.Put(ctx, rawBlk) + require.NoError(t, err) + + cborCid := cid.NewCidV1(cid.DagCBOR, h) + + cborBlk, err := bs.Get(ctx, cborCid) + require.NoError(t, err) + + require.Equal(t, cborCid.Prefix(), cborBlk.Cid().Prefix()) + require.EqualValues(t, cborArr, cborBlk.RawData()) + + // was allocated + require.NotEqual(t, cborBlk, rawBlk) + + gotRawBlk, err := bs.Get(ctx, rawCid) + require.NoError(t, err) + + // not allocated + require.Equal(t, rawBlk, gotRawBlk) +} From 2f046ec8db5b6f2197db624280068b5884ae2062 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 12 Oct 2022 10:30:12 +0200 Subject: [PATCH 42/43] misc: github: Cleanup PR template --- .github/pull_request_template.md | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index c806120b1..b6ef5fa3c 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,21 +1,23 @@ ## Related Issues - + ## Proposed Changes - - + ## Additional Info - + ## Checklist Before you mark the PR ready for review, please make sure that: -- [ ] All commits have a clear commit message. -- [ ] The PR title is in the form of of `: : ` - - example: ` fix: mempool: Introduce a cache for valid signatures` - - `PR type`: _fix_, _feat_, _INTERFACE BREAKING CHANGE_, _CONSENSUS BREAKING_, _build_, _chore_, _ci_, _docs_,_perf_, _refactor_, _revert_, _style_, _test_ - - `area`: _api_, _chain_, _state_, _vm_, _data transfer_, _market_, _mempool_, _message_, _block production_, _multisig_, _networking_, _paychan_, _proving_, _sealing_, _wallet_, _deps_ -- [ ] This PR has tests for new functionality or change in behaviour -- [ ] If new user-facing features are introduced, clear usage guidelines and / or documentation updates should be included in https://lotus.filecoin.io or [Discussion Tutorials.](https://github.com/filecoin-project/lotus/discussions/categories/tutorials) + +- [ ] Commits have a clear commit message. +- [ ] PR title is in the form of of `: : ` + - example: ` fix: mempool: Introduce a cache for valid signatures` + - `PR type`: fix, feat, build, chore, ci, docs, perf, refactor, revert, style, test + - `area`, e.g. api, chain, state, market, mempool, multisig, networking, paych, proving, sealing, wallet, deps +- [ ] New features have usage guidelines and / or documentation updates in + - [ ] [Lotus Documentation](https://lotus.filecoin.io) + - [ ] [Discussion Tutorials](https://github.com/filecoin-project/lotus/discussions/categories/tutorials) +- [ ] Tests exist for new functionality or change in behavior - [ ] CI is green From 32de8712437b8eb3e3273e889fff9d43aa08714e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 14 Oct 2022 15:58:25 +0200 Subject: [PATCH 43/43] fix: post worker sched: Don't check worker session in a busy loop --- storage/sealer/sched_post.go | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/storage/sealer/sched_post.go b/storage/sealer/sched_post.go index 64986726f..1055227d8 100644 --- a/storage/sealer/sched_post.go +++ b/storage/sealer/sched_post.go @@ -169,6 +169,12 @@ func (ps *poStScheduler) watch(wid storiface.WorkerID, worker *WorkerHandle) { }() for { + select { + case <-heartbeatTimer.C: + case <-worker.closingMgr: + return + } + sctx, scancel := context.WithTimeout(ctx, paths.HeartbeatInterval/2) curSes, err := worker.workerRpc.Session(sctx) scancel() @@ -177,12 +183,7 @@ func (ps *poStScheduler) watch(wid storiface.WorkerID, worker *WorkerHandle) { log.Warnw("failed to check worker session", "error", err) ps.disable(wid) - select { - case <-heartbeatTimer.C: - continue - case <-worker.closingMgr: - return - } + continue } if storiface.WorkerID(curSes) != wid {