From 67a1737418672d5357e72731b5e99a4c460c19df Mon Sep 17 00:00:00 2001 From: Riccardo Date: Thu, 29 Jun 2023 02:12:58 -0500 Subject: [PATCH] feat: support gov v1 proposals (#610) ## Description This PR aims at updating the codebase in order to properlty support `x/gov` new `v1` proposal types and inner workings. --- ### Author Checklist *All items are required. Please add a note to the item if the item is not applicable and please add links to any relevant follow up issues.* I have... - [ ] included the correct [type prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title - [ ] added `!` to the type prefix if API or client breaking change - [ ] targeted the correct branch - [ ] provided a link to the relevant issue or specification - [ ] added a changelog entry to `CHANGELOG.md` - [ ] included comments for [documenting Go code](https://blog.golang.org/godoc) - [ ] updated the relevant documentation or specification - [ ] reviewed "Files changed" and left comments if necessary - [ ] confirmed all CI checks have passed ### Reviewers Checklist *All items are required. Please add a note if the item is not applicable and please add your handle next to the items reviewed if you only reviewed selected items.* I have... - [ ] confirmed the correct [type prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title - [ ] confirmed `!` in the type prefix if API or client breaking change - [ ] confirmed all author checklist items have been addressed - [ ] reviewed API design and naming - [ ] reviewed documentation is accurate - [ ] reviewed tests and test coverage - [ ] manually tested (if applicable) --------- Co-authored-by: Magic Cat <37407870+MonikaCat@users.noreply.github.com> Co-authored-by: Magic Cat --- .github/workflows/lint.yml | 3 + .github/workflows/test.yml | 3 + CHANGELOG.md | 4 + cmd/parse/gov/proposal.go | 3 +- database/gov.go | 156 +++------- database/gov_test.go | 293 ++++++++++-------- database/schema/08-gov.sql | 23 +- database/types/gov.go | 58 ++-- database/types/utils.go | 26 ++ go.mod | 4 + go.sum | 255 ++++++++++++++- .../bdjuno/tables/public_gov_params.yaml | 4 +- .../bdjuno/tables/public_proposal.yaml | 3 +- modules/auth/auth_accounts.go | 3 + modules/gov/handle_genesis.go | 38 +-- modules/gov/handle_msg.go | 20 +- modules/gov/source/local/source.go | 62 +--- modules/gov/source/remote/source.go | 58 +--- modules/gov/source/source.go | 7 +- modules/gov/utils_params.go | 21 +- modules/gov/utils_proposal.go | 214 +++++++++---- modules/types/sources.go | 8 +- modules/utils/time.go | 17 + testutils/time.go | 13 + types/gov.go | 164 ++-------- 25 files changed, 811 insertions(+), 649 deletions(-) create mode 100644 modules/utils/time.go create mode 100644 testutils/time.go diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index cb3619ccb..c8453e859 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -5,6 +5,9 @@ name: Lint on: pull_request: push: + branches: + - chains/* + - cosmos/* jobs: GolangCI: diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index f5f50a5ab..ff534bfcb 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -4,6 +4,9 @@ name: Tests on: pull_request: push: + branches: + - chains/* + - cosmos/* jobs: Cleanup-runs: diff --git a/CHANGELOG.md b/CHANGELOG.md index cc68fdc3d..f98328452 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## Unreleased +- ([\#610](https://github.com/forbole/bdjuno/pull/610)) Add support for gov `v1` proposals + + ## Version v4.0.0 ## Notes This version is thought to be used with Cosmos SDK `v0.47.x`. diff --git a/cmd/parse/gov/proposal.go b/cmd/parse/gov/proposal.go index 9129731f8..a53f13411 100644 --- a/cmd/parse/gov/proposal.go +++ b/cmd/parse/gov/proposal.go @@ -11,7 +11,6 @@ import ( modulestypes "github.com/forbole/bdjuno/v4/modules/types" govtypesv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" - govtypesv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" parsecmdtypes "github.com/forbole/juno/v5/cmd/parse/types" "github.com/forbole/juno/v5/parser" "github.com/forbole/juno/v5/types/config" @@ -116,7 +115,7 @@ func refreshProposalDetails(parseCtx *parser.Context, proposalID uint64, govModu // Handle the MsgSubmitProposal messages for index, msg := range tx.GetMsgs() { - if _, ok := msg.(*govtypesv1beta1.MsgSubmitProposal); !ok { + if _, ok := msg.(*govtypesv1.MsgSubmitProposal); !ok { continue } diff --git a/database/gov.go b/database/gov.go index 70313aab7..673a53abe 100644 --- a/database/gov.go +++ b/database/gov.go @@ -3,14 +3,12 @@ package database import ( "encoding/json" "fmt" + "strings" "time" "github.com/cosmos/cosmos-sdk/codec" codectypes "github.com/cosmos/cosmos-sdk/codec/types" govtypesv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" - "github.com/cosmos/gogoproto/proto" - - govtypesv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" "github.com/lib/pq" @@ -20,32 +18,19 @@ import ( // SaveGovParams saves the given x/gov parameters inside the database func (db *Db) SaveGovParams(params *types.GovParams) error { - - depositParamsBz, err := json.Marshal(¶ms.DepositParams) + paramsBz, err := json.Marshal(¶ms.Params) if err != nil { - return fmt.Errorf("error while marshaling deposit params: %s", err) - } - - votingParamsBz, err := json.Marshal(¶ms.VotingParams) - if err != nil { - return fmt.Errorf("error while marshaling voting params: %s", err) - } - - tallyingParams, err := json.Marshal(¶ms.TallyParams) - if err != nil { - return fmt.Errorf("error while marshaling tally params: %s", err) + return fmt.Errorf("error while marshalling gov params: %s", err) } stmt := ` -INSERT INTO gov_params(deposit_params, voting_params, tally_params, height) -VALUES ($1, $2, $3, $4) +INSERT INTO gov_params(params, height) +VALUES ($1, $2) ON CONFLICT (one_row_id) DO UPDATE - SET deposit_params = excluded.deposit_params, - voting_params = excluded.voting_params, - tally_params = excluded.tally_params, + SET params = excluded.params, height = excluded.height WHERE gov_params.height <= excluded.height` - _, err = db.SQL.Exec(stmt, string(depositParamsBz), string(votingParamsBz), string(tallyingParams), params.Height) + _, err = db.SQL.Exec(stmt, string(paramsBz), params.Height) if err != nil { return fmt.Errorf("error while storing gov params: %s", err) } @@ -53,41 +38,6 @@ WHERE gov_params.height <= excluded.height` return nil } -// SaveGenesisGovParams saves the genesis x/gov parameters inside the database -func (db *Db) SaveGenesisGovParams(params *types.GenesisGovParams) error { - - depositParamsBz, err := json.Marshal(¶ms.DepositParams) - if err != nil { - return fmt.Errorf("error while marshaling genesis deposit params: %s", err) - } - - votingParamsBz, err := json.Marshal(¶ms.VotingParams) - if err != nil { - return fmt.Errorf("error while marshaling genesis voting params: %s", err) - } - - tallyingParams, err := json.Marshal(¶ms.TallyParams) - if err != nil { - return fmt.Errorf("error while marshaling genesis tally params: %s", err) - } - - stmt := ` -INSERT INTO gov_params(deposit_params, voting_params, tally_params, height) -VALUES ($1, $2, $3, $4) -ON CONFLICT (one_row_id) DO UPDATE - SET deposit_params = excluded.deposit_params, - voting_params = excluded.voting_params, - tally_params = excluded.tally_params, - height = excluded.height -WHERE gov_params.height <= excluded.height` - _, err = db.SQL.Exec(stmt, string(depositParamsBz), string(votingParamsBz), string(tallyingParams), params.Height) - if err != nil { - return fmt.Errorf("error while storing genesis gov params: %s", err) - } - - return nil -} - // GetGovParams returns the most recent governance parameters func (db *Db) GetGovParams() (*types.GovParams, error) { var rows []dbtypes.GovParamsRow @@ -102,28 +52,13 @@ func (db *Db) GetGovParams() (*types.GovParams, error) { row := rows[0] - var depositParams types.DepositParams - err = json.Unmarshal([]byte(row.DepositParams), &depositParams) - if err != nil { - return nil, err - } - - var votingParams types.VotingParams - err = json.Unmarshal([]byte(row.VotingParams), &votingParams) - if err != nil { - return nil, err - } - - var tallyParams types.TallyParams - err = json.Unmarshal([]byte(row.TallyParams), &tallyParams) + var params govtypesv1.Params + err = json.Unmarshal([]byte(row.Params), ¶ms) if err != nil { return nil, err } - return types.NewGovParams( - votingParams, depositParams, tallyParams, - row.Height, - ), nil + return types.NewGovParams(¶ms, row.Height), nil } // -------------------------------------------------------------------------------------------------------------------- @@ -138,7 +73,7 @@ func (db *Db) SaveProposals(proposals []types.Proposal) error { proposalsQuery := ` INSERT INTO proposal( - id, title, description, content, proposer_address, proposal_route, proposal_type, status, + id, title, description, metadata, content, proposer_address, status, submit_time, deposit_end_time, voting_start_time, voting_end_time ) VALUES` var proposalsParams []interface{} @@ -148,35 +83,27 @@ INSERT INTO proposal( accounts = append(accounts, types.NewAccount(proposal.Proposer)) // Prepare the proposal query - vi := i * 12 - proposalsQuery += fmt.Sprintf("($%d,$%d,$%d,$%d,$%d,$%d,$%d,$%d,$%d,$%d,$%d,$%d),", - vi+1, vi+2, vi+3, vi+4, vi+5, vi+6, vi+7, vi+8, vi+9, vi+10, vi+11, vi+12) - - // Encode the content properly - protoContent, ok := proposal.Content.(proto.Message) - if !ok { - return fmt.Errorf("invalid proposal content types: %T", proposal.Content) - } - - anyContent, err := codectypes.NewAnyWithValue(protoContent) - if err != nil { - return fmt.Errorf("error while wrapping proposal proto content: %s", err) - } + vi := i * 11 + proposalsQuery += fmt.Sprintf("($%d,$%d,$%d,$%d,$%d,$%d,$%d,$%d,$%d,$%d,$%d),", + vi+1, vi+2, vi+3, vi+4, vi+5, vi+6, vi+7, vi+8, vi+9, vi+10, vi+11) + var jsonMessages []string var protoCodec codec.ProtoCodec - contentBz, err := protoCodec.MarshalJSON(anyContent) - if err != nil { - return fmt.Errorf("error while marshaling proposal content: %s", err) + for _, msg := range proposal.Messages { + contentBz, err := protoCodec.MarshalJSON(msg) + if err != nil { + return fmt.Errorf("error while marshalling proposal msg: %s", err) + } + jsonMessages = append(jsonMessages, string(contentBz)) } proposalsParams = append(proposalsParams, - proposal.ProposalID, - proposal.Content.GetTitle(), - proposal.Content.GetDescription(), - string(contentBz), + proposal.ID, + proposal.Title, + proposal.Summary, + proposal.Metadata, + fmt.Sprintf("[%s]", strings.Join(jsonMessages, ",")), proposal.Proposer, - proposal.ProposalRoute, - proposal.ProposalType, proposal.Status, proposal.SubmitTime, proposal.DepositEndTime, @@ -216,28 +143,31 @@ func (db *Db) GetProposal(id uint64) (types.Proposal, error) { row := rows[0] - var contentAny codectypes.Any - err = db.Cdc.UnmarshalJSON([]byte(row.Content), &contentAny) - if err != nil { - return types.Proposal{}, err - } + trimContent := strings.TrimPrefix(row.Content, "{") + trimContent = strings.TrimPrefix(trimContent, "}") + jsonMessages := strings.Split(trimContent, ",") - var content govtypesv1beta1.Content - err = db.Cdc.UnpackAny(&contentAny, &content) - if err != nil { - return types.Proposal{}, err + var messages []*codectypes.Any + for _, jsonMessage := range jsonMessages { + var msg codectypes.Any + err = db.Cdc.UnmarshalJSON([]byte(jsonMessage), &msg) + if err != nil { + return types.Proposal{}, err + } + messages = append(messages, &msg) } proposal := types.NewProposal( row.ProposalID, - row.ProposalRoute, - row.ProposalType, - content, + row.Title, + row.Description, + row.Metadata, + messages, row.Status, row.SubmitTime, row.DepositEndTime, - row.VotingStartTime, - row.VotingEndTime, + dbtypes.NullTimeToTime(row.VotingStartTime), + dbtypes.NullTimeToTime(row.VotingEndTime), row.Proposer, ) return proposal, nil diff --git a/database/gov_test.go b/database/gov_test.go index 7c0957597..907f7f5f8 100644 --- a/database/gov_test.go +++ b/database/gov_test.go @@ -4,29 +4,37 @@ import ( "fmt" "time" - "github.com/cosmos/cosmos-sdk/codec" + gov "github.com/cosmos/cosmos-sdk/x/gov/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" - "github.com/cosmos/gogoproto/proto" codectypes "github.com/cosmos/cosmos-sdk/codec/types" + "github.com/forbole/bdjuno/v4/testutils" "github.com/forbole/bdjuno/v4/types" sdk "github.com/cosmos/cosmos-sdk/types" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" govtypesv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" - govtypesv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" dbtypes "github.com/forbole/bdjuno/v4/database/types" ) func (suite *DbTestSuite) TestBigDipperDb_SaveGovParams() { - votingPeriod := time.Duration(int64(300000)) - maxDepositPeriod := time.Duration(int64(300000000000)) - votingParams := govtypesv1.NewVotingParams(&votingPeriod) - tallyParams := govtypesv1.NewTallyParams("10", "10", "10") - depositParams := govtypesv1.NewDepositParams(sdk.NewCoins(sdk.NewCoin("uatom", sdk.NewInt(10))), &maxDepositPeriod) - original := types.NewGovParams(types.NewVotingParams(&votingParams), types.NewDepositParam(&depositParams), types.NewTallyParams(&tallyParams), 10) + params := govtypesv1.Params{ + MinDeposit: []sdk.Coin{sdk.NewCoin("uatom", sdk.NewInt(1000))}, + MaxDepositPeriod: testutils.NewDurationPointer(time.Duration(int64(300000000000))), + VotingPeriod: testutils.NewDurationPointer(time.Duration(int64(300000))), + Quorum: "0.5", + Threshold: "0.3", + VetoThreshold: "0.15", + MinInitialDepositRatio: "0", + BurnVoteQuorum: false, + BurnProposalDepositPrevote: false, + BurnVoteVeto: false, + } + + original := types.NewGovParams(¶ms, 10) err := suite.database.SaveGovParams(original) suite.Require().NoError(err) @@ -37,8 +45,8 @@ func (suite *DbTestSuite) TestBigDipperDb_SaveGovParams() { // ---------------------------------------------------------------------------------------------------------------- // Try updating with a lower height - depositParams = govtypesv1.NewDepositParams(sdk.NewCoins(sdk.NewCoin("uatom", sdk.NewInt(1000))), &maxDepositPeriod) - updated := types.NewGovParams(types.NewVotingParams(&votingParams), types.NewDepositParam(&depositParams), types.NewTallyParams(&tallyParams), 9) + params.BurnVoteQuorum = false + updated := types.NewGovParams(¶ms, 9) err = suite.database.SaveGovParams(updated) suite.Require().NoError(err) @@ -48,8 +56,9 @@ func (suite *DbTestSuite) TestBigDipperDb_SaveGovParams() { suite.Require().Equal(original, stored) // ---------------------------------------------------------------------------------------------------------------- - // Try updating with the same height depositParams = govtypesv1.NewDepositParams(sdk.NewCoins(sdk.NewCoin("uatom", sdk.NewInt(1000))), time.Minute*5) - updated = types.NewGovParams(types.NewVotingParams(&votingParams), types.NewDepositParam(&depositParams), types.NewTallyParams(&tallyParams), 10) + // Try updating with the same height + params.BurnProposalDepositPrevote = true + updated = types.NewGovParams(¶ms, 10) err = suite.database.SaveGovParams(updated) suite.Require().NoError(err) @@ -60,9 +69,8 @@ func (suite *DbTestSuite) TestBigDipperDb_SaveGovParams() { // ---------------------------------------------------------------------------------------------------------------- // Try updating with a higher height - tallyParams = govtypesv1.NewTallyParams("100", "100", "100") - depositParams = govtypesv1.NewDepositParams(sdk.NewCoins(sdk.NewCoin("udesmos", sdk.NewInt(10000))), &maxDepositPeriod) - updated = types.NewGovParams(types.NewVotingParams(&votingParams), types.NewDepositParam(&depositParams), types.NewTallyParams(&tallyParams), 11) + params.BurnVoteVeto = true + updated = types.NewGovParams(¶ms, 11) err = suite.database.SaveGovParams(updated) suite.Require().NoError(err) @@ -77,80 +85,94 @@ func (suite *DbTestSuite) TestBigDipperDb_SaveGovParams() { func (suite *DbTestSuite) getProposalRow(id int) types.Proposal { proposer := suite.getAccount("cosmos1z4hfrxvlgl4s8u4n5ngjcw8kdqrcv43599amxs") - title := fmt.Sprintf("title%d", id) - description := fmt.Sprintf("description%d", id) - proposalRoute := fmt.Sprintf("proposalRoute%d", id) - proposalType := fmt.Sprintf("proposalType%d", id) + msgAny, err := codectypes.NewAnyWithValue(&govtypesv1.MsgUpdateParams{ + Authority: authtypes.NewModuleAddress(gov.ModuleName).String(), + Params: govtypesv1.Params{ + MinDeposit: []sdk.Coin{sdk.NewCoin("uatom", sdk.NewInt(1000))}, + MaxDepositPeriod: testutils.NewDurationPointer(time.Duration(int64(300000000000))), + VotingPeriod: testutils.NewDurationPointer(time.Duration(int64(300000))), + Quorum: "0.5", + Threshold: "0.3", + VetoThreshold: "0.15", + MinInitialDepositRatio: "0", + BurnVoteQuorum: false, + BurnProposalDepositPrevote: false, + BurnVoteVeto: false, + }, + }) + suite.Require().NoError(err) proposal := types.NewProposal( uint64(id), - proposalRoute, - proposalType, - govtypesv1beta1.NewTextProposal(title, description), - govtypesv1.StatusPassed.String(), + fmt.Sprintf("Proposal %d", id), + fmt.Sprintf("Description of proposal %d", id), + fmt.Sprintf("Metadata of proposal %d", id), + []*codectypes.Any{msgAny}, + govtypesv1.StatusVotingPeriod.String(), time.Date(2020, 1, 1, 00, 00, 00, 000, time.UTC), time.Date(2020, 1, 1, 01, 00, 00, 000, time.UTC), - time.Date(2020, 1, 1, 02, 00, 00, 000, time.UTC), - time.Date(2020, 1, 1, 03, 00, 00, 000, time.UTC), + testutils.NewTimePointer(time.Date(2020, 1, 1, 02, 00, 00, 000, time.UTC)), + testutils.NewTimePointer(time.Date(2020, 1, 1, 03, 00, 00, 000, time.UTC)), proposer.String(), ) - err := suite.database.SaveProposals([]types.Proposal{proposal}) + err = suite.database.SaveProposals([]types.Proposal{proposal}) suite.Require().NoError(err) return proposal } -func (suite *DbTestSuite) encodeProposalContent(content govtypesv1beta1.Content) string { - protoContent, ok := content.(proto.Message) - suite.Require().True(ok) - - anyContent, err := codectypes.NewAnyWithValue(protoContent) - suite.Require().NoError(err) - - // contentBz, err := suite.database.Cdc.MarshalJSON(anyContent) - var protoCodec codec.ProtoCodec - contentBz, err := protoCodec.MarshalJSON(anyContent) - suite.Require().NoError(err) - - return string(contentBz) -} - func (suite *DbTestSuite) TestBigDipperDb_SaveProposals() { proposer1 := suite.getAccount("cosmos1z4hfrxvlgl4s8u4n5ngjcw8kdqrcv43599amxs") - proposer2 := suite.getAccount("cosmos184ma3twcfjqef6k95ne8w2hk80x2kah7vcwy4a") + msgAny, err := codectypes.NewAnyWithValue(&govtypesv1.MsgUpdateParams{ + Authority: authtypes.NewModuleAddress(gov.ModuleName).String(), + Params: govtypesv1.Params{ + MinDeposit: []sdk.Coin{sdk.NewCoin("uatom", sdk.NewInt(1000))}, + MaxDepositPeriod: testutils.NewDurationPointer(time.Duration(int64(300000000000))), + VotingPeriod: testutils.NewDurationPointer(time.Duration(int64(300000))), + Quorum: "0.5", + Threshold: "0.3", + VetoThreshold: "0.15", + MinInitialDepositRatio: "0", + BurnVoteQuorum: false, + BurnProposalDepositPrevote: false, + BurnVoteVeto: false, + }, + }) + suite.Require().NoError(err) - content1 := govtypesv1beta1.NewTextProposal("title", "description") - content2 := govtypesv1beta1.NewTextProposal("title1", "description1") + proposer2 := suite.getAccount("cosmos184ma3twcfjqef6k95ne8w2hk80x2kah7vcwy4a") input := []types.Proposal{ types.NewProposal( 1, - "proposalRoute", - "proposalType", - content1, + "Proposal Title 1", + "Proposal Description 1", + "Proposal Metadata 1", + []*codectypes.Any{msgAny}, govtypesv1.StatusDepositPeriod.String(), time.Date(2020, 1, 1, 00, 00, 00, 000, time.UTC), time.Date(2020, 1, 1, 01, 00, 00, 000, time.UTC), - time.Date(2020, 1, 1, 02, 00, 00, 000, time.UTC), - time.Date(2020, 1, 1, 03, 00, 00, 000, time.UTC), + testutils.NewTimePointer(time.Date(2020, 1, 1, 02, 00, 00, 000, time.UTC)), + testutils.NewTimePointer(time.Date(2020, 1, 1, 03, 00, 00, 000, time.UTC)), proposer1.String(), ), types.NewProposal( 2, - "proposalRoute1", - "proposalType1", - content2, + "Proposal Title 2", + "Proposal Description 2", + "Proposal Metadata 2", + nil, govtypesv1.StatusPassed.String(), time.Date(2020, 1, 2, 00, 00, 00, 000, time.UTC), time.Date(2020, 1, 2, 01, 00, 00, 000, time.UTC), - time.Date(2020, 1, 2, 02, 00, 00, 000, time.UTC), - time.Date(2020, 1, 2, 03, 00, 00, 000, time.UTC), + testutils.NewTimePointer(time.Date(2020, 1, 2, 02, 00, 00, 000, time.UTC)), + testutils.NewTimePointer(time.Date(2020, 1, 2, 03, 00, 00, 000, time.UTC)), proposer2.String(), ), } - err := suite.database.SaveProposals(input) + err = suite.database.SaveProposals(input) suite.Require().NoError(err) var proposalRow []dbtypes.ProposalRow @@ -160,29 +182,27 @@ func (suite *DbTestSuite) TestBigDipperDb_SaveProposals() { expected := []dbtypes.ProposalRow{ dbtypes.NewProposalRow( 1, - "proposalRoute", - "proposalType", - "title", - "description", - suite.encodeProposalContent(content1), + "Proposal Title 1", + "Proposal Description 1", + "Proposal Metadata 1", + "[{\"@type\": \"/cosmos.gov.v1.MsgUpdateParams\", \"params\": {\"quorum\": \"0.5\", \"threshold\": \"0.3\", \"min_deposit\": [{\"denom\": \"uatom\", \"amount\": \"1000\"}], \"voting_period\": \"0.000300s\", \"burn_vote_veto\": false, \"veto_threshold\": \"0.15\", \"burn_vote_quorum\": false, \"max_deposit_period\": \"300s\", \"min_initial_deposit_ratio\": \"0\", \"burn_proposal_deposit_prevote\": false}, \"authority\": \"cosmos10d07y265gmmuvt4z0w9aw880jnsr700j6zn9kn\"}]", time.Date(2020, 1, 1, 00, 00, 00, 000, time.UTC), time.Date(2020, 1, 1, 01, 00, 00, 000, time.UTC), - time.Date(2020, 1, 1, 02, 00, 00, 000, time.UTC), - time.Date(2020, 1, 1, 03, 00, 00, 000, time.UTC), + testutils.NewTimePointer(time.Date(2020, 1, 1, 02, 00, 00, 000, time.UTC)), + testutils.NewTimePointer(time.Date(2020, 1, 1, 03, 00, 00, 000, time.UTC)), proposer1.String(), govtypesv1.StatusDepositPeriod.String(), ), dbtypes.NewProposalRow( 2, - "proposalRoute1", - "proposalType1", - "title1", - "description1", - suite.encodeProposalContent(content2), + "Proposal Title 2", + "Proposal Description 2", + "Proposal Metadata 2", + "[]", time.Date(2020, 1, 2, 00, 00, 00, 000, time.UTC), time.Date(2020, 1, 2, 01, 00, 00, 000, time.UTC), - time.Date(2020, 1, 2, 02, 00, 00, 000, time.UTC), - time.Date(2020, 1, 2, 03, 00, 00, 000, time.UTC), + testutils.NewTimePointer(time.Date(2020, 1, 2, 02, 00, 00, 000, time.UTC)), + testutils.NewTimePointer(time.Date(2020, 1, 2, 03, 00, 00, 000, time.UTC)), proposer2.String(), govtypesv1.StatusPassed.String(), ), @@ -193,99 +213,116 @@ func (suite *DbTestSuite) TestBigDipperDb_SaveProposals() { } func (suite *DbTestSuite) TestBigDipperDb_GetProposal() { - content := govtypesv1beta1.NewTextProposal("title", "description") proposer := suite.getAccount("cosmos1z4hfrxvlgl4s8u4n5ngjcw8kdqrcv43599amxs") + msgAny, err := codectypes.NewAnyWithValue(&govtypesv1.MsgUpdateParams{ + Authority: authtypes.NewModuleAddress(gov.ModuleName).String(), + Params: govtypesv1.Params{ + MinDeposit: []sdk.Coin{sdk.NewCoin("uatom", sdk.NewInt(1000))}, + MaxDepositPeriod: testutils.NewDurationPointer(time.Duration(int64(300000000000))), + VotingPeriod: testutils.NewDurationPointer(time.Duration(int64(300000))), + Quorum: "0.5", + Threshold: "0.3", + VetoThreshold: "0.15", + MinInitialDepositRatio: "0", + BurnVoteQuorum: false, + BurnProposalDepositPrevote: false, + BurnVoteVeto: false, + }, + }) + suite.Require().NoError(err) proposal := types.NewProposal( 1, - "proposalRoute", - "proposalType", - content, + "Proposal Title 1", + "Proposal Description 1", + "Proposal Metadata 1", + []*codectypes.Any{msgAny}, govtypesv1.StatusDepositPeriod.String(), time.Date(2020, 1, 1, 00, 00, 00, 000, time.UTC), time.Date(2020, 1, 1, 01, 00, 00, 000, time.UTC), - time.Date(2020, 1, 1, 02, 00, 00, 000, time.UTC), - time.Date(2020, 1, 1, 03, 00, 00, 000, time.UTC), + testutils.NewTimePointer(time.Date(2020, 1, 1, 02, 00, 00, 000, time.UTC)), + testutils.NewTimePointer(time.Date(2020, 1, 1, 03, 00, 00, 000, time.UTC)), proposer.String(), ) input := []types.Proposal{proposal} - err := suite.database.SaveProposals(input) + err = suite.database.SaveProposals(input) suite.Require().NoError(err) var rows []dbtypes.ProposalRow err = suite.database.Sqlx.Select(&rows, `SELECT * FROM proposal`) suite.Require().NoError(err) suite.Require().Len(rows, 1) - } func (suite *DbTestSuite) TestBigDipperDb_GetOpenProposalsIds() { proposer1 := suite.getAccount("cosmos1z4hfrxvlgl4s8u4n5ngjcw8kdqrcv43599amxs") proposer2 := suite.getAccount("cosmos184ma3twcfjqef6k95ne8w2hk80x2kah7vcwy4a") - content1 := govtypesv1beta1.NewTextProposal("title", "description") - content2 := govtypesv1beta1.NewTextProposal("title1", "description1") - invalidProposal := types.NewProposal( 6, - "proposalRoute1", - "proposalType1", - content2, + "Proposal Title 6", + "Proposal Description 6", + "Proposal Metadata 6", + nil, types.ProposalStatusInvalid, time.Date(2020, 1, 2, 00, 00, 00, 000, time.UTC), time.Date(2020, 1, 2, 01, 00, 00, 000, time.UTC), - time.Date(2020, 1, 2, 02, 00, 00, 000, time.UTC), - time.Date(2020, 1, 2, 03, 00, 00, 000, time.UTC), + testutils.NewTimePointer(time.Date(2020, 1, 2, 02, 00, 00, 000, time.UTC)), + testutils.NewTimePointer(time.Date(2020, 1, 2, 03, 00, 00, 000, time.UTC)), proposer2.String(), ) input := []types.Proposal{ types.NewProposal( 1, - "proposalRoute", - "proposalType", - content1, + "Proposal Title 2", + "Proposal Description 2", + "Proposal Metadata 2", + nil, govtypesv1.StatusVotingPeriod.String(), time.Date(2020, 1, 1, 00, 00, 00, 000, time.UTC), time.Date(2020, 1, 1, 01, 00, 00, 000, time.UTC), - time.Date(2020, 1, 1, 02, 00, 00, 000, time.UTC), - time.Date(2020, 1, 1, 03, 00, 00, 000, time.UTC), + testutils.NewTimePointer(time.Date(2020, 1, 1, 02, 00, 00, 000, time.UTC)), + testutils.NewTimePointer(time.Date(2020, 1, 1, 03, 00, 00, 000, time.UTC)), proposer1.String(), ), types.NewProposal( 2, - "proposalRoute", - "proposalType", - content1, + "Proposal Title 2", + "Proposal Description 2", + "Proposal Metadata 2", + nil, govtypesv1.StatusDepositPeriod.String(), time.Date(2020, 1, 1, 00, 00, 00, 000, time.UTC), time.Date(2020, 1, 1, 01, 00, 00, 000, time.UTC), - time.Date(2020, 1, 1, 02, 00, 00, 000, time.UTC), - time.Date(2020, 1, 1, 03, 00, 00, 000, time.UTC), + testutils.NewTimePointer(time.Date(2020, 1, 1, 02, 00, 00, 000, time.UTC)), + testutils.NewTimePointer(time.Date(2020, 1, 1, 03, 00, 00, 000, time.UTC)), proposer1.String(), ), types.NewProposal( 3, - "proposalRoute1", - "proposalType1", - content2, + "Proposal Title 3", + "Proposal Description 3", + "Proposal Metadata 3", + nil, govtypesv1.StatusPassed.String(), time.Date(2020, 1, 2, 00, 00, 00, 000, time.UTC), time.Date(2020, 1, 2, 01, 00, 00, 000, time.UTC), - time.Date(2020, 1, 2, 02, 00, 00, 000, time.UTC), - time.Date(2020, 1, 2, 03, 00, 00, 000, time.UTC), + testutils.NewTimePointer(time.Date(2020, 1, 2, 02, 00, 00, 000, time.UTC)), + testutils.NewTimePointer(time.Date(2020, 1, 2, 03, 00, 00, 000, time.UTC)), proposer2.String(), ), types.NewProposal( 5, - "proposalRoute1", - "proposalType1", - content2, + "Proposal Title 5", + "Proposal Description 5", + "Proposal Metadata 5", + nil, govtypesv1.StatusRejected.String(), time.Date(2020, 1, 2, 00, 00, 00, 000, time.UTC), time.Date(2020, 1, 2, 01, 00, 00, 000, time.UTC), - time.Date(2020, 1, 2, 02, 00, 00, 000, time.UTC), - time.Date(2020, 1, 2, 03, 00, 00, 000, time.UTC), + testutils.NewTimePointer(time.Date(2020, 1, 2, 02, 00, 00, 000, time.UTC)), + testutils.NewTimePointer(time.Date(2020, 1, 2, 03, 00, 00, 000, time.UTC)), proposer2.String(), ), invalidProposal, @@ -305,11 +342,11 @@ func (suite *DbTestSuite) TestBigDipperDb_UpdateProposal() { proposer, err := sdk.AccAddressFromBech32(proposal.Proposer) suite.Require().NoError(err) - timestamp1 := time.Date(2020, 1, 1, 00, 00, 00, 000, time.UTC) - timestamp2 := time.Date(2020, 1, 1, 01, 00, 00, 000, time.UTC) + timestamp1 := testutils.NewTimePointer(time.Date(2020, 1, 1, 00, 00, 00, 000, time.UTC)) + timestamp2 := testutils.NewTimePointer(time.Date(2020, 1, 1, 01, 00, 00, 000, time.UTC)) update := types.NewProposalUpdate( - proposal.ProposalID, + proposal.ID, govtypesv1.StatusPassed.String(), timestamp1, timestamp2, @@ -319,12 +356,11 @@ func (suite *DbTestSuite) TestBigDipperDb_UpdateProposal() { suite.Require().NoError(err) expected := dbtypes.NewProposalRow( - proposal.ProposalID, - proposal.ProposalRoute, - proposal.ProposalType, - proposal.Content.GetTitle(), - proposal.Content.GetDescription(), - suite.encodeProposalContent(proposal.Content), + proposal.ID, + "Proposal 1", + "Description of proposal 1", + "Metadata of proposal 1", + "[{\"@type\": \"/cosmos.gov.v1.MsgUpdateParams\", \"params\": {\"quorum\": \"0.5\", \"threshold\": \"0.3\", \"min_deposit\": [{\"denom\": \"uatom\", \"amount\": \"1000\"}], \"voting_period\": \"0.000300s\", \"burn_vote_veto\": false, \"veto_threshold\": \"0.15\", \"burn_vote_quorum\": false, \"max_deposit_period\": \"300s\", \"min_initial_deposit_ratio\": \"0\", \"burn_proposal_deposit_prevote\": false}, \"authority\": \"cosmos10d07y265gmmuvt4z0w9aw880jnsr700j6zn9kn\"}]", proposal.SubmitTime, proposal.DepositEndTime, timestamp1, @@ -333,13 +369,10 @@ func (suite *DbTestSuite) TestBigDipperDb_UpdateProposal() { govtypesv1.StatusPassed.String(), ) - var result []dbtypes.ProposalRow - err = suite.database.SQL.Select(&result, `SELECT * FROM proposal`) + var stored dbtypes.ProposalRow + err = suite.database.SQL.Get(&stored, `SELECT * FROM proposal LIMIT 1`) suite.Require().NoError(err) - suite.Require().Len(result, 1) - for _, r := range result { - suite.Require().True(expected.Equals(r)) - } + suite.Require().True(expected.Equals(stored)) } // ------------------------------------------------------------------------------------------------------------------- @@ -365,9 +398,9 @@ func (suite *DbTestSuite) TestBigDipperDb_SaveDeposits() { timestamp3 := time.Date(2020, 1, 1, 17, 00, 00, 000, time.UTC) deposit := []types.Deposit{ - types.NewDeposit(proposal.ProposalID, depositor.String(), amount, timestamp1, 10), - types.NewDeposit(proposal.ProposalID, depositor2.String(), amount2, timestamp2, 10), - types.NewDeposit(proposal.ProposalID, depositor3.String(), amount3, timestamp3, 10), + types.NewDeposit(proposal.ID, depositor.String(), amount, timestamp1, 10), + types.NewDeposit(proposal.ID, depositor2.String(), amount2, timestamp2, 10), + types.NewDeposit(proposal.ID, depositor3.String(), amount3, timestamp3, 10), } err := suite.database.SaveDeposits(deposit) @@ -393,9 +426,9 @@ func (suite *DbTestSuite) TestBigDipperDb_SaveDeposits() { amount3 = sdk.NewCoins(sdk.NewCoin("desmos", sdk.NewInt(30))) deposit = []types.Deposit{ - types.NewDeposit(proposal.ProposalID, depositor.String(), amount, timestamp1, 9), - types.NewDeposit(proposal.ProposalID, depositor2.String(), amount2, timestamp2, 10), - types.NewDeposit(proposal.ProposalID, depositor3.String(), amount3, timestamp3, 11), + types.NewDeposit(proposal.ID, depositor.String(), amount, timestamp1, 9), + types.NewDeposit(proposal.ID, depositor2.String(), amount2, timestamp2, 10), + types.NewDeposit(proposal.ID, depositor3.String(), amount3, timestamp3, 11), } err = suite.database.SaveDeposits(deposit) @@ -432,7 +465,7 @@ func (suite *DbTestSuite) TestBigDipperDb_SaveVote() { err := suite.database.SaveVote(vote) suite.Require().NoError(err) - expected := dbtypes.NewVoteRow(int64(proposal.ProposalID), voter.String(), govtypesv1.OptionYes.String(), timestamp, 1) + expected := dbtypes.NewVoteRow(int64(proposal.ID), voter.String(), govtypesv1.OptionYes.String(), timestamp, 1) var result []dbtypes.VoteRow err = suite.database.SQL.Select(&result, `SELECT * FROM proposal_vote`) @@ -456,7 +489,7 @@ func (suite *DbTestSuite) TestBigDipperDb_SaveVote() { err = suite.database.SaveVote(vote) suite.Require().NoError(err) - expected = dbtypes.NewVoteRow(int64(proposal.ProposalID), voter.String(), govtypesv1.OptionAbstain.String(), timestamp, 1) + expected = dbtypes.NewVoteRow(int64(proposal.ID), voter.String(), govtypesv1.OptionAbstain.String(), timestamp, 1) result = []dbtypes.VoteRow{} err = suite.database.Sqlx.Select(&result, `SELECT * FROM proposal_vote`) @@ -469,7 +502,7 @@ func (suite *DbTestSuite) TestBigDipperDb_SaveVote() { err = suite.database.SaveVote(vote) suite.Require().NoError(err) - expected = dbtypes.NewVoteRow(int64(proposal.ProposalID), voter.String(), govtypesv1.OptionNoWithVeto.String(), timestamp, 2) + expected = dbtypes.NewVoteRow(int64(proposal.ID), voter.String(), govtypesv1.OptionNoWithVeto.String(), timestamp, 2) result = []dbtypes.VoteRow{} err = suite.database.Sqlx.Select(&result, `SELECT * FROM proposal_vote`) diff --git a/database/schema/08-gov.sql b/database/schema/08-gov.sql index 3df6f7598..350ab5b4c 100644 --- a/database/schema/08-gov.sql +++ b/database/schema/08-gov.sql @@ -1,10 +1,8 @@ CREATE TABLE gov_params ( - one_row_id BOOLEAN NOT NULL DEFAULT TRUE PRIMARY KEY, - deposit_params JSONB NOT NULL, - voting_params JSONB NOT NULL, - tally_params JSONB NOT NULL, - height BIGINT NOT NULL, + one_row_id BOOLEAN NOT NULL DEFAULT TRUE PRIMARY KEY, + params JSONB NOT NULL, + height BIGINT NOT NULL, CHECK (one_row_id) ); @@ -13,9 +11,8 @@ CREATE TABLE proposal id INTEGER NOT NULL PRIMARY KEY, title TEXT NOT NULL, description TEXT NOT NULL, - content JSONB NOT NULL, - proposal_route TEXT NOT NULL, - proposal_type TEXT NOT NULL, + metadata TEXT NOT NULL, + content JSONB NOT NULL DEFAULT '[]'::JSONB, submit_time TIMESTAMP NOT NULL, deposit_end_time TIMESTAMP, voting_start_time TIMESTAMP, @@ -28,7 +25,7 @@ CREATE INDEX proposal_proposer_address_index ON proposal (proposer_address); CREATE TABLE proposal_deposit ( proposal_id INTEGER NOT NULL REFERENCES proposal (id), - depositor_address TEXT REFERENCES account (address), + depositor_address TEXT REFERENCES account (address), amount COIN[], timestamp TIMESTAMP, height BIGINT NOT NULL, @@ -54,10 +51,10 @@ CREATE INDEX proposal_vote_height_index ON proposal_vote (height); CREATE TABLE proposal_tally_result ( proposal_id INTEGER REFERENCES proposal (id) PRIMARY KEY, - yes TEXT NOT NULL, - abstain TEXT NOT NULL, - no TEXT NOT NULL, - no_with_veto TEXT NOT NULL, + yes TEXT NOT NULL, + abstain TEXT NOT NULL, + no TEXT NOT NULL, + no_with_veto TEXT NOT NULL, height BIGINT NOT NULL, CONSTRAINT unique_tally_result UNIQUE (proposal_id) ); diff --git a/database/types/gov.go b/database/types/gov.go index 3781e26e9..0d48bd6f8 100644 --- a/database/types/gov.go +++ b/database/types/gov.go @@ -1,64 +1,60 @@ package types import ( + "database/sql" "time" ) // GovParamsRow represents a single row of the "gov_params" table type GovParamsRow struct { - OneRowID bool `db:"one_row_id"` - DepositParams string `db:"deposit_params"` - VotingParams string `db:"voting_params"` - TallyParams string `db:"tally_params"` - Height int64 `db:"height"` + OneRowID bool `db:"one_row_id"` + Params string `db:"params"` + Height int64 `db:"height"` } // -------------------------------------------------------------------------------------------------------------------- // ProposalRow represents a single row inside the proposal table type ProposalRow struct { - Title string `db:"title"` - Description string `db:"description"` - Content string `db:"content"` - ProposalRoute string `db:"proposal_route"` - ProposalType string `db:"proposal_type"` - ProposalID uint64 `db:"id"` - SubmitTime time.Time `db:"submit_time"` - DepositEndTime time.Time `db:"deposit_end_time"` - VotingStartTime time.Time `db:"voting_start_time"` - VotingEndTime time.Time `db:"voting_end_time"` - Proposer string `db:"proposer_address"` - Status string `db:"status"` + Title string `db:"title"` + Description string `db:"description"` + Metadata string `db:"metadata"` + Content string `db:"content"` + ProposalID uint64 `db:"id"` + SubmitTime time.Time `db:"submit_time"` + DepositEndTime time.Time `db:"deposit_end_time"` + VotingStartTime sql.NullTime `db:"voting_start_time"` + VotingEndTime sql.NullTime `db:"voting_end_time"` + Proposer string `db:"proposer_address"` + Status string `db:"status"` } // NewProposalRow allows to easily create a new ProposalRow func NewProposalRow( proposalID uint64, - proposalRoute string, - proposalType string, title string, description string, + metadata string, content string, submitTime time.Time, depositEndTime time.Time, - votingStartTime time.Time, - votingEndTime time.Time, + votingStartTime *time.Time, + votingEndTime *time.Time, proposer string, status string, ) ProposalRow { return ProposalRow{ + ProposalID: proposalID, Title: title, Description: description, + Metadata: metadata, Content: content, - ProposalRoute: proposalRoute, - ProposalType: proposalType, - ProposalID: proposalID, + Status: status, SubmitTime: submitTime, DepositEndTime: depositEndTime, - VotingStartTime: votingStartTime, - VotingEndTime: votingEndTime, + VotingStartTime: TimeToNullTime(votingStartTime), + VotingEndTime: TimeToNullTime(votingEndTime), Proposer: proposer, - Status: status, } } @@ -66,13 +62,13 @@ func NewProposalRow( func (w ProposalRow) Equals(v ProposalRow) bool { return w.Title == v.Title && w.Description == v.Description && - w.ProposalRoute == v.ProposalRoute && - w.ProposalType == v.ProposalType && + w.Metadata == v.Metadata && + w.Content == v.Content && w.ProposalID == v.ProposalID && w.SubmitTime.Equal(v.SubmitTime) && w.DepositEndTime.Equal(v.DepositEndTime) && - w.VotingStartTime.Equal(v.VotingStartTime) && - w.VotingEndTime.Equal(v.VotingEndTime) && + AreNullTimesEqual(w.VotingStartTime, v.VotingStartTime) && + AreNullTimesEqual(w.VotingEndTime, v.VotingEndTime) && w.Proposer == v.Proposer && w.Status == v.Status } diff --git a/database/types/utils.go b/database/types/utils.go index be8d7783d..5be6926f1 100644 --- a/database/types/utils.go +++ b/database/types/utils.go @@ -1,5 +1,10 @@ package types +import ( + "database/sql" + "time" +) + // ModuleRow represents a single row inside the modules table type ModuleRow struct { Module string `db:"module_name"` @@ -39,3 +44,24 @@ func (v ModuleRows) Equal(w *ModuleRows) bool { } return true } + +func TimeToNullTime(t *time.Time) sql.NullTime { + if t == nil { + return sql.NullTime{} + } + return sql.NullTime{ + Time: *t, + Valid: true, + } +} + +func NullTimeToTime(t sql.NullTime) *time.Time { + if !t.Valid { + return nil + } + return &t.Time +} + +func AreNullTimesEqual(first sql.NullTime, second sql.NullTime) bool { + return first.Valid == second.Valid && first.Time.Equal(second.Time) +} diff --git a/go.mod b/go.mod index 693b95de7..0a26aff34 100644 --- a/go.mod +++ b/go.mod @@ -303,3 +303,7 @@ require ( pgregory.net/rapid v0.5.5 // indirect sigs.k8s.io/yaml v1.3.0 // indirect ) + +// This is to avoid warnings while running the binary +// See here: https://github.com/desmos-labs/desmos/pull/1131#discussion_r1194090419 +replace github.com/cosmos/gogoproto => github.com/cosmos/gogoproto v1.4.8 diff --git a/go.sum b/go.sum index 6970e686b..8fe7cf683 100644 --- a/go.sum +++ b/go.sum @@ -36,28 +36,56 @@ cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= cloud.google.com/go v0.98.0/go.mod h1:ua6Ush4NALrHk5QXDWnjvZHN93OuF0HfuEPq9I1X0cM= cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= +cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= +cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= cloud.google.com/go v0.110.0 h1:Zc8gqp3+a9/Eyph2KDmcGaPtbKRIoqq4YTlL4NMD0Ys= cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= +cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4= +cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= +cloud.google.com/go/accesscontextmanager v1.3.0/go.mod h1:TgCBehyr5gNMz7ZaH9xubp+CE8dkrszb4oK9CWyvD4o= +cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE= cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= +cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg= cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= +cloud.google.com/go/apigateway v1.3.0/go.mod h1:89Z8Bhpmxu6AmUxuVRg/ECRGReEdiP3vQtk4Z1J9rJk= +cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc= +cloud.google.com/go/apigeeconnect v1.3.0/go.mod h1:G/AwXFAKo0gIXkPTVfZDd2qA1TxBXJ3MgMRBQkIi9jc= +cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04= +cloud.google.com/go/appengine v1.4.0/go.mod h1:CS2NhuBuDXM9f+qscZ6V86m1MIIqPj3WC/UoEuR1Sno= +cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak= cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= +cloud.google.com/go/artifactregistry v1.8.0/go.mod h1:w3GQXkJX8hiKN0v+at4b0qotwijQbYUqF2GWkZzAhC0= +cloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc= cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= +cloud.google.com/go/asset v1.9.0/go.mod h1:83MOE6jEJBMqFKadM9NLRcs80Gdw76qGuHn8m3h8oHQ= +cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY= cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= +cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo= +cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= +cloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8= +cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM= +cloud.google.com/go/baremetalsolution v0.3.0/go.mod h1:XOrocE+pvK1xFfleEnShBlNAXf+j5blPPxrhjKgnIFc= +cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI= +cloud.google.com/go/batch v0.3.0/go.mod h1:TR18ZoAekj1GuirsUsR1ZTKN3FC/4UDnScjT8NXImFE= +cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE= +cloud.google.com/go/beyondcorp v0.2.0/go.mod h1:TB7Bd+EEtcw9PCPQhCJtJGjk/7TC6ckmnSFS+xwTfm4= +cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= @@ -65,12 +93,28 @@ cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUM cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= +cloud.google.com/go/bigquery v1.43.0/go.mod h1:ZMQcXHsl+xmU1z36G2jNGZmKp9zNY5BUua5wDgmNCfw= +cloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc= cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= +cloud.google.com/go/billing v1.6.0/go.mod h1:WoXzguj+BeHXPbKfNWkqVtDdzORazmCjraY+vrxcyvI= +cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y= cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= +cloud.google.com/go/binaryauthorization v1.3.0/go.mod h1:lRZbKgjDIIQvzYQS1p99A7/U1JqvqeZg0wiI5tp6tg0= +cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk= +cloud.google.com/go/certificatemanager v1.3.0/go.mod h1:n6twGDvcUBFu9uBgt4eYvvf3sQ6My8jADcOVwHmzadg= +cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590= +cloud.google.com/go/channel v1.8.0/go.mod h1:W5SwCXDJsq/rg3tn3oG0LOxpAo6IMxNa09ngphpSlnk= +cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk= +cloud.google.com/go/cloudbuild v1.3.0/go.mod h1:WequR4ULxlqvMsjDEEEFnOG5ZSRSgWOywXYDb1vPE6U= +cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA= +cloud.google.com/go/clouddms v1.3.0/go.mod h1:oK6XsCDdW4Ib3jCCBugx+gVjevp2TMXFtgxvPSee3OM= +cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk= cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= +cloud.google.com/go/cloudtasks v1.7.0/go.mod h1:ImsfdYWwlWNJbdgPIIGJWC+gemEGTBK/SunNQQNCAb4= +cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI= cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= @@ -78,73 +122,168 @@ cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= +cloud.google.com/go/compute v1.12.0/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= +cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= +cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE= +cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= +cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63rR+SXhcpA= cloud.google.com/go/compute v1.19.1 h1:am86mquDUgjGNWxiGn+5PGLbmgiWXlE/yNWpIpNvuXY= cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= +cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU= +cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= +cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= +cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY= +cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= +cloud.google.com/go/container v1.6.0/go.mod h1:Xazp7GjJSeUYo688S+6J5V+n/t+G5sKBTFkKNudGRxg= +cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo= cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= +cloud.google.com/go/datacatalog v1.7.0/go.mod h1:9mEl4AuDYWw81UGc41HonIHH7/sn52H0/tc8f8ZbZIE= +cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM= cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= +cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0= +cloud.google.com/go/datafusion v1.4.0/go.mod h1:1Zb6VN+W6ALo85cXnM1IKiPw+yQMKMhB9TsTSRDo/38= +cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w= cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= +cloud.google.com/go/dataplex v1.3.0/go.mod h1:hQuRtDg+fCiFgC8j0zV222HvzFQdRd+SVX8gdmFcZzA= +cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A= +cloud.google.com/go/dataproc v1.7.0/go.mod h1:CKAlMjII9H90RXaMpSxQ8EU6dQx6iAYNPcYPOkSbi8s= +cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI= cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM= cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= +cloud.google.com/go/datastream v1.4.0/go.mod h1:h9dpzScPhDTs5noEMQVWP8Wx8AFBRyS0s8KWPx/9r0g= +cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4= +cloud.google.com/go/deploy v1.4.0/go.mod h1:5Xghikd4VrmMLNaF6FiRFDlHb59VM59YoDQnOUdsH/c= +cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s= cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= +cloud.google.com/go/dialogflow v1.18.0/go.mod h1:trO7Zu5YdyEuR+BhSNOqJezyFQ3aUzz0njv7sMx/iek= +cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0= +cloud.google.com/go/dlp v1.6.0/go.mod h1:9eyB2xIhpU0sVwUixfBubDoRwP+GjeUoxxeueZmqvmM= +cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q= cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= +cloud.google.com/go/documentai v1.9.0/go.mod h1:FS5485S8R00U10GhgBC0aNGrJxBP8ZVpEeJ7PQDZd6k= +cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4= cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= +cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= +cloud.google.com/go/essentialcontacts v1.3.0/go.mod h1:r+OnHa5jfj90qIfZDO/VztSFqbQan7HV75p8sA+mdGI= +cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8= +cloud.google.com/go/eventarc v1.7.0/go.mod h1:6ctpF3zTnaQCxUjHUdcfgcA1A2T309+omHZth7gDfmc= +cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw= +cloud.google.com/go/filestore v1.3.0/go.mod h1:+qbvHGvXU1HaKX2nD0WEPo92TP/8AQuCVEBXNY9z0+w= +cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI= cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= +cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= +cloud.google.com/go/functions v1.8.0/go.mod h1:RTZ4/HsQjIqIYP9a9YPbU+QFoQsAlYgrwOXJWHn1POY= +cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08= cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= +cloud.google.com/go/gaming v1.7.0/go.mod h1:LrB8U7MHdGgFG851iHAfqUdLcKBdQ55hzXy9xBJz0+w= +cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM= +cloud.google.com/go/gkebackup v0.2.0/go.mod h1:XKvv/4LfG829/B8B7xRkk8zRrOEbKtEam6yNfuQNH60= +cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo= cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= +cloud.google.com/go/gkemulticloud v0.3.0/go.mod h1:7orzy7O0S+5kq95e4Hpn7RysVA7dPs8W/GgfUtsPbrA= +cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI= cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= +cloud.google.com/go/gsuiteaddons v1.3.0/go.mod h1:EUNK/J1lZEZO8yPtykKxLXI6JSVN2rg9bN8SXOa0bgM= +cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o= +cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= +cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc= +cloud.google.com/go/iam v0.7.0/go.mod h1:H5Br8wRaDGNc8XP3keLc4unfUUZeyH3Sfl9XpQEYOeg= +cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= cloud.google.com/go/iam v0.13.0 h1:+CmB+K0J/33d0zSQ9SlFWUeCCEn5XJA0ZMZ3pHE9u8k= cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= +cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc= +cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= +cloud.google.com/go/ids v1.1.0/go.mod h1:WIuwCaYVOzHIj2OhN9HAwvW+DBdmUAdcWlFxRl+KubM= +cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY= +cloud.google.com/go/iot v1.3.0/go.mod h1:r7RGh2B61+B8oz0AGE+J72AhA0G7tdXItODWsaA2oLs= +cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g= +cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= +cloud.google.com/go/kms v1.5.0/go.mod h1:QJS2YY0eJGBg3mnDfuaCyLauWwBJiHRboYxJ++1xJNg= +cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0= cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= +cloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiPzPCJa2MIE= +cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8= cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= +cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw= +cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE= +cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= cloud.google.com/go/longrunning v0.4.1 h1:v+yFJOfKC3yZdY6ZUI933pIYdhyhV8S3NpWrXWmg7jM= +cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE= +cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM= +cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI= cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= +cloud.google.com/go/memcache v1.6.0/go.mod h1:XS5xB0eQZdHtTuTF9Hf8eJkKtR3pVRCcvJwtm68T3rA= +cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY= cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= +cloud.google.com/go/metastore v1.7.0/go.mod h1:s45D0B4IlsINu87/AsWiEVYbLaIMeUSoxlKKDqBGFS8= +cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI= +cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhIsnmlA53dvEk= +cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= +cloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM= +cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8= +cloud.google.com/go/networkmanagement v1.4.0/go.mod h1:Q9mdLLRn60AsOrPc8rs8iNV6OHXaGcDdsIQe1ohekq8= +cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4= cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= +cloud.google.com/go/notebooks v1.4.0/go.mod h1:4QPMngcwmgb6uw7Po99B2xv5ufVoIQ7nOGDyL4P8AgA= +cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0= +cloud.google.com/go/optimization v1.1.0/go.mod h1:5po+wfvX5AQlPznyVEZjGJTMr4+CAkJf2XSTQOOl9l4= +cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs= +cloud.google.com/go/orchestration v1.3.0/go.mod h1:Sj5tq/JpWiB//X/q3Ngwdl5K7B7Y0KZ7bfv0wL6fqVA= +cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk= +cloud.google.com/go/orgpolicy v1.4.0/go.mod h1:xrSLIV4RePWmP9P3tBl8S93lTmlAxjm06NSm2UTmKvE= +cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc= cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= +cloud.google.com/go/osconfig v1.9.0/go.mod h1:Yx+IeIZJ3bdWmzbQU4fxNl8xsZ4amB+dygAwFPlvnNo= +cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw= cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= +cloud.google.com/go/oslogin v1.6.0/go.mod h1:zOJ1O3+dTU8WPlGEkFSh7qeHPPSoxrcMbbK1Nm2iX70= +cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo= cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= +cloud.google.com/go/policytroubleshooter v1.3.0/go.mod h1:qy0+VwANja+kKrjlQuOzmlvscn4RNsAc0e15GGqfMxg= +cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE= cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= @@ -152,31 +291,69 @@ cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+ cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= cloud.google.com/go/pubsub v1.5.0/go.mod h1:ZEwJccE3z93Z2HWvstpri00jOg7oO4UZDtKhwDwqF0w= +cloud.google.com/go/pubsub v1.26.0/go.mod h1:QgBH3U/jdJy/ftjPhTkyXNj543Tin1pRYcdcPRnFIRI= +cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0= +cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg= cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= +cloud.google.com/go/recaptchaenterprise/v2 v2.4.0/go.mod h1:Am3LHfOuBstrLrNCBrlI5sbwx9LBg3te2N6hGvHn2mE= +cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U= cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= +cloud.google.com/go/recommender v1.7.0/go.mod h1:XLHs/W+T8olwlGOgfQenXBTbIseGclClff6lhFVe9Bs= +cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70= cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= +cloud.google.com/go/redis v1.9.0/go.mod h1:HMYQuajvb2D0LvMgZmLDZW8V5aOC/WxstZHiy4g8OiA= +cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM= +cloud.google.com/go/resourcemanager v1.3.0/go.mod h1:bAtrTjZQFJkiWTPDb1WBjzvc6/kifjj4QBYuKCCoqKA= +cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0= +cloud.google.com/go/resourcesettings v1.3.0/go.mod h1:lzew8VfESA5DQ8gdlHwMrqZs1S9V87v3oCnKCWoOuQU= +cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg= cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= +cloud.google.com/go/retail v1.10.0/go.mod h1:2gDk9HsL4HMS4oZwz6daui2/jmKvqShXKQuB2RZ+cCc= +cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y= +cloud.google.com/go/run v0.2.0/go.mod h1:CNtKsTA1sDcnqqIFR3Pb5Tq0usWxJJvsWOCPldRU3Do= +cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo= cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= +cloud.google.com/go/scheduler v1.6.0/go.mod h1:SgeKVM7MIwPn3BqtcBntpLyrIJftQISRrYB5ZtT+KOk= +cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44= cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= +cloud.google.com/go/secretmanager v1.8.0/go.mod h1:hnVgi/bN5MYHd3Gt0SPuTPPp5ENina1/LxM+2W9U9J4= +cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4= cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= +cloud.google.com/go/security v1.9.0/go.mod h1:6Ta1bO8LXI89nZnmnsZGp9lVoVWXqsVbIq/t9dzI+2Q= +cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA= cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= +cloud.google.com/go/securitycenter v1.15.0/go.mod h1:PeKJ0t8MoFmmXLXWm41JidyzI3PJjd8sXWaVqg43WWk= +cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk= +cloud.google.com/go/servicecontrol v1.4.0/go.mod h1:o0hUSJ1TXJAmi/7fLJAedOovnujSEvjKCAFNXPQ1RaU= +cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s= cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= +cloud.google.com/go/servicedirectory v1.6.0/go.mod h1:pUlbnWsLH9c13yGkxCmfumWEPjsRs1RlmJ4pqiNjVL4= +cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U= +cloud.google.com/go/servicemanagement v1.4.0/go.mod h1:d8t8MDbezI7Z2R1O/wu8oTggo3BI2GKYbdG4y/SJTco= +cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo= +cloud.google.com/go/serviceusage v1.3.0/go.mod h1:Hya1cozXM4SeSKTAgGXgj97GlqUvF5JaoXacR1JTP/E= +cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU= +cloud.google.com/go/shell v1.3.0/go.mod h1:VZ9HmRjZBsjLGXusm7K5Q5lzzByZmJHf1d0IWHEN5X4= +cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw= cloud.google.com/go/spanner v1.7.0/go.mod h1:sd3K2gZ9Fd0vMPLXzeCrF6fq4i63Q7aTLW/lBIfBkIk= +cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos= cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= +cloud.google.com/go/speech v1.8.0/go.mod h1:9bYIl1/tjsAnMgKGHKmBZzXKEkGgtU+MpdDPTE9f7y0= +cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= @@ -188,17 +365,46 @@ cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeL cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= cloud.google.com/go/storage v1.29.0 h1:6weCgzRvMg7lzuUurI4697AqIRPU1SvzHhynwpW31jI= cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= +cloud.google.com/go/storagetransfer v1.5.0/go.mod h1:dxNzUopWy7RQevYFHewchb29POFv3/AaBgnhqzqiK0w= +cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I= cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= +cloud.google.com/go/talent v1.3.0/go.mod h1:CmcxwJ/PKfRgd1pBjQgU6W3YBwiewmUzQYH5HHmSCmM= +cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA= +cloud.google.com/go/texttospeech v1.4.0/go.mod h1:FX8HQHA6sEpJ7rCMSfXuzBcysDAuWusNNNvN9FELDd8= +cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4= +cloud.google.com/go/tpu v1.3.0/go.mod h1:aJIManG0o20tfDQlRIej44FcwGGl/cD0oiRyMKG19IQ= +cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg= +cloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg6N0G28= +cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= +cloud.google.com/go/translate v1.3.0/go.mod h1:gzMUwRjvOqj5i69y/LYLd8RrNQk+hOmIXTi9+nb3Djs= +cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= +cloud.google.com/go/video v1.8.0/go.mod h1:sTzKFc0bUSByE8Yoh8X0mn8bMymItVGPfTuUBUyRgxk= +cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw= cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= +cloud.google.com/go/videointelligence v1.8.0/go.mod h1:dIcCn4gVDdS7yte/w+koiXn5dWVplOZkE+xwG9FgK+M= +cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU= cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= +cloud.google.com/go/vision/v2 v2.4.0/go.mod h1:VtI579ll9RpVTrdKdkMzckdnwMyX2JILb+MhPqRbPsY= +cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E= +cloud.google.com/go/vmmigration v1.2.0/go.mod h1:IRf0o7myyWFSmVR1ItrBSFLFD/rJkfDCUTO4vLlJvsE= +cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g= +cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208= +cloud.google.com/go/vpcaccess v1.4.0/go.mod h1:aQHVbTWDYUR1EbTApSVvMq1EnT57ppDmQzZ3imqIk4w= +cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8= cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= +cloud.google.com/go/webrisk v1.6.0/go.mod h1:65sW9V9rOosnc9ZY7A7jsy1zoHS5W9IAXv6dGqhMQMc= +cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A= +cloud.google.com/go/websecurityscanner v1.3.0/go.mod h1:uImdKm2wyeXQevQJXeh8Uun/Ym1VqworNDlBXQevGMo= +cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ= cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= +cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M= +cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA= contrib.go.opencensus.io/exporter/stackdriver v0.13.4/go.mod h1:aXENhDJ1Y4lIg4EUaVTwzvYETVNZk10Pu26tevFKLUc= cosmossdk.io/api v0.3.1 h1:NNiOclKRR0AOlO4KIqeaG6PS6kswOMhHD0ir0SscNXE= cosmossdk.io/api v0.3.1/go.mod h1:DfHfMkiNA2Uhy8fj0JJlOCYOBp4eWUUJ1te5zBGNyIw= @@ -380,6 +586,7 @@ github.com/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8 github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= 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.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -413,12 +620,15 @@ github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGX github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211130200136-a8f946100490/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/apd/v2 v2.0.2 h1:weh8u7Cneje73dDh+2tEVLUvyBc89iwepWCD8b8034E= github.com/cockroachdb/apd/v2 v2.0.2/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw= github.com/cockroachdb/apd/v3 v3.1.0 h1:MK3Ow7LH0W8zkd5GMKA1PvS9qG3bWFI95WaVNfyZJ/w= @@ -457,9 +667,8 @@ github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= github.com/cosmos/gogogateway v1.2.0 h1:Ae/OivNhp8DqBi/sh2A8a1D0y638GpL3tkmLQAiKxTE= github.com/cosmos/gogogateway v1.2.0/go.mod h1:iQpLkGWxYcnCdz5iAdLcRBSw3h7NXeOkZ4GUkT+tbFI= -github.com/cosmos/gogoproto v1.4.2/go.mod h1:cLxOsn1ljAHSV527CHOtaIP91kK6cCrZETRBrkzItWU= -github.com/cosmos/gogoproto v1.4.10 h1:QH/yT8X+c0F4ZDacDv3z+xE3WU1P1Z3wQoLMBRJoKuI= -github.com/cosmos/gogoproto v1.4.10/go.mod h1:3aAZzeRWpAwr+SS/LLkICX2/kDFyaYVzckBDzygIxek= +github.com/cosmos/gogoproto v1.4.8 h1:BrHKc6WFZt8+jRV71vKSQE+JrfF+JAnzrKo2VP7wIZ4= +github.com/cosmos/gogoproto v1.4.8/go.mod h1:hnb0DIEWTv+wdNzNcqus5xCQXq5+CXauq1FJuurRfVY= github.com/cosmos/iavl v0.20.0 h1:fTVznVlepH0KK8NyKq8w+U7c2L6jofa27aFX6YGlm38= github.com/cosmos/iavl v0.20.0/go.mod h1:WO7FyvaZJoH65+HFOsDir7xU9FWk2w9cHXNW1XHcl7A= github.com/cosmos/ibc-go/v7 v7.0.1 h1:NIBNRWjlOoFvFQu1ZlgwkaSeHO5avf4C1YQiWegt8jw= @@ -548,9 +757,12 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.m github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/go-control-plane v0.10.1/go.mod h1:AY7fTTXNdv/aJ2O5jwpxAPOWUZ7hQAEvzN5Pf27BkQQ= github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= +github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34= github.com/envoyproxy/protoc-gen-validate v0.0.14/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.6.2/go.mod h1:2t7qjJNvHPx8IjnBOzl9E9/baC+qXE/TeeyBRzgJDws= +github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo= +github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w= github.com/esimonov/ifshort v1.0.4 h1:6SID4yGWfRae/M7hkVDVVyppy8q/v9OuxNdmjLQStBA= github.com/esimonov/ifshort v1.0.4/go.mod h1:Pe8zjlRrJ80+q2CxHLfEOfTwxCZ4O+MuhcHcfgNWTk0= github.com/ettle/strcase v0.1.1 h1:htFueZyVeE1XNnMEfbqp5r67qAN/4r6ya1ysq8Q+Zcw= @@ -704,6 +916,7 @@ github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2V github.com/golang-sql/sqlexp v0.0.0-20170517235910-f1bb20e5a188/go.mod h1:vXjM/+wXQnTPR4KqTKDgJukSZ6amVRtWMPEjE6sQoK8= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -845,6 +1058,7 @@ github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99 github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= +github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= github.com/googleapis/gax-go/v2 v2.7.1 h1:gF4c0zjUP2H/s/hEGyLA3I0fA2ZWjzYiONAD6cvPr8A= github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= @@ -895,6 +1109,8 @@ github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t github.com/grpc-ecosystem/grpc-gateway v1.12.1/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= 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-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= github.com/gtank/merlin v0.1.1-0.20191105220539-8318aed1a79f/go.mod h1:T86dnYJhcGOh5BjZFCJWTDeTK7XW8uE+E21Cy/bIQ+s= @@ -1109,6 +1325,8 @@ github.com/lufeee/execinquery v1.2.1 h1:hf0Ems4SHcUGBxpGN7Jz78z1ppVkP/837ZlETPCE github.com/lufeee/execinquery v1.2.1/go.mod h1:EC7DrEKView09ocscGHC+apXMIaorh4xqSxS/dy8SbM= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/lyft/protoc-gen-star v0.5.3/go.mod h1:V0xaHgaf5oCCqmcxYcWiDfTiKsZsRc87/1qhoTACD8w= +github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= +github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= @@ -1513,6 +1731,7 @@ github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= +github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= github.com/spf13/afero v1.9.3 h1:41FoI0fD7OR7mGcKE/aOiLkGreyf8ifIOQmJANWogMk= github.com/spf13/afero v1.9.3/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= @@ -1704,6 +1923,7 @@ go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= @@ -1776,6 +1996,7 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= +golang.org/x/exp v0.0.0-20230131160201-f062dba9d201/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= golang.org/x/exp v0.0.0-20230321023759-10a507213a29 h1:ooxPy7fPvB4kwsA2h+iBNHkAbp/4JxTSwCmvdjEYmug= golang.org/x/exp v0.0.0-20230321023759-10a507213a29/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= golang.org/x/exp/typeparams v0.0.0-20220218215828-6cf2b201936e/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= @@ -1890,12 +2111,14 @@ golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM= golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -1922,8 +2145,10 @@ golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7Lm golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.1.0/go.mod h1:G9FE4dLTsbXUu90h/Pf85g4w1D+SSAgR+q46nJZ8M4A= +golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec= golang.org/x/oauth2 v0.7.0 h1:qe6s0zUXlPX80/dITx3440hWZ7GwMwgDDyrSGTPJG/g= golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -2055,7 +2280,6 @@ golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220315194320-039c03cc5b86/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220405210540-1e041c57c461/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -2079,6 +2303,8 @@ golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= @@ -2090,6 +2316,7 @@ golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.7.0 h1:BEvjmm5fURWqcfbSKTdpkDXYBrUS1c0m8agp14W48vQ= golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -2101,10 +2328,12 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -2113,6 +2342,8 @@ golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -2292,7 +2523,10 @@ google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaE google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.99.0/go.mod h1:1YOf74vkVndF7pG6hIHuINsM7eWwpVTAfNMNiL91A08= google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= +google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= +google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0= google.golang.org/api v0.114.0 h1:1xQPji6cO2E2vLiI+C/XiFAnsn1WV3mjaEwGLhi3grE= google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= @@ -2388,8 +2622,8 @@ google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2 google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220314164441-57ef72a4c106/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220329172620-7be39ac1afc7/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= @@ -2423,7 +2657,16 @@ google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53B google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221024153911-1573dae28c9c/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= +google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= google.golang.org/genproto v0.0.0-20221025140454-527a21cfbd71/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= +google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo= +google.golang.org/genproto v0.0.0-20221114212237-e4508ebdbee1/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221117204609-8f9c96812029/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE= +google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 h1:KpwkzHKEF7B9Zxg18WzOa7djJ+Ha5DzthMyZYQfEn2A= google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= google.golang.org/grpc v1.8.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= @@ -2471,6 +2714,8 @@ google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACu google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww= +google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= google.golang.org/grpc v1.56.0 h1:+y7Bs8rtMd07LeXmL3NxcTLn7mUkbKZqEpPhMNkwJEE= google.golang.org/grpc v1.56.0/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= diff --git a/hasura/metadata/databases/bdjuno/tables/public_gov_params.yaml b/hasura/metadata/databases/bdjuno/tables/public_gov_params.yaml index 37de9f06d..00078ded3 100644 --- a/hasura/metadata/databases/bdjuno/tables/public_gov_params.yaml +++ b/hasura/metadata/databases/bdjuno/tables/public_gov_params.yaml @@ -5,9 +5,7 @@ select_permissions: - permission: allow_aggregations: false columns: - - deposit_params - - voting_params - - tally_params + - params - height filter: {} limit: 1 diff --git a/hasura/metadata/databases/bdjuno/tables/public_proposal.yaml b/hasura/metadata/databases/bdjuno/tables/public_proposal.yaml index 491202cce..d7e13dbad 100644 --- a/hasura/metadata/databases/bdjuno/tables/public_proposal.yaml +++ b/hasura/metadata/databases/bdjuno/tables/public_proposal.yaml @@ -58,8 +58,6 @@ select_permissions: columns: - title - description - - proposal_route - - proposal_type - id - submit_time - deposit_end_time @@ -67,6 +65,7 @@ select_permissions: - voting_end_time - proposer_address - status + - metadata - content filter: {} limit: 100 diff --git a/modules/auth/auth_accounts.go b/modules/auth/auth_accounts.go index 63c869f5b..4ad7e7244 100644 --- a/modules/auth/auth_accounts.go +++ b/modules/auth/auth_accounts.go @@ -50,6 +50,9 @@ func GetAccounts(height int64, addresses []string) []types.Account { // RefreshAccounts takes the given addresses and for each one queries the chain // retrieving the account data and stores it inside the database. func (m *Module) RefreshAccounts(height int64, addresses []string) error { + if len(addresses) == 0 { + return nil + } accounts := GetAccounts(height, addresses) return m.db.SaveAccounts(accounts) } diff --git a/modules/gov/handle_genesis.go b/modules/gov/handle_genesis.go index cd600313b..02e986d78 100644 --- a/modules/gov/handle_genesis.go +++ b/modules/gov/handle_genesis.go @@ -9,7 +9,7 @@ import ( "github.com/forbole/bdjuno/v4/types" gov "github.com/cosmos/cosmos-sdk/x/gov/types" - govtypesv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" + govtypesv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" "github.com/rs/zerolog/log" ) @@ -18,7 +18,7 @@ func (m *Module) HandleGenesis(doc *tmtypes.GenesisDoc, appState map[string]json log.Debug().Str("module", "gov").Msg("parsing genesis") // Read the genesis state - var genStatev1beta1 govtypesv1beta1.GenesisState + var genStatev1beta1 govtypesv1.GenesisState err := m.cdc.UnmarshalJSON(appState[gov.ModuleName], &genStatev1beta1) if err != nil { return fmt.Errorf("error while reading gov genesis data: %s", err) @@ -31,12 +31,7 @@ func (m *Module) HandleGenesis(doc *tmtypes.GenesisDoc, appState map[string]json } // Save the params - err = m.db.SaveGenesisGovParams(types.NewGenesisGovParams( - types.NewGenesisVotingParams(&genStatev1beta1.VotingParams), - types.NewGenesisDepositParam(&genStatev1beta1.DepositParams), - types.NewGenesisTallyParams(&genStatev1beta1.TallyParams), - doc.InitialHeight, - )) + err = m.db.SaveGovParams(types.NewGovParams(genStatev1beta1.Params, doc.InitialHeight)) if err != nil { return fmt.Errorf("error while storing genesis governance params: %s", err) } @@ -45,7 +40,7 @@ func (m *Module) HandleGenesis(doc *tmtypes.GenesisDoc, appState map[string]json } // saveGenesisProposals save proposals from genesis file -func (m *Module) saveGenesisProposals(slice govtypesv1beta1.Proposals, genDoc *tmtypes.GenesisDoc) error { +func (m *Module) saveGenesisProposals(slice govtypesv1.Proposals, genDoc *tmtypes.GenesisDoc) error { proposals := make([]types.Proposal, len(slice)) tallyResults := make([]types.TallyResult, len(slice)) deposits := make([]types.Deposit, len(slice)) @@ -53,29 +48,30 @@ func (m *Module) saveGenesisProposals(slice govtypesv1beta1.Proposals, genDoc *t for index, proposal := range slice { // Since it's not possible to get the proposer, set it to nil proposals[index] = types.NewProposal( - proposal.ProposalId, - proposal.ProposalRoute(), - proposal.ProposalType(), - proposal.GetContent(), + proposal.Id, + proposal.Title, + proposal.Summary, + proposal.Metadata, + proposal.Messages, proposal.Status.String(), - proposal.SubmitTime, - proposal.DepositEndTime, + *proposal.SubmitTime, + *proposal.DepositEndTime, proposal.VotingStartTime, proposal.VotingEndTime, "", ) tallyResults[index] = types.NewTallyResult( - proposal.ProposalId, - proposal.FinalTallyResult.Yes.String(), - proposal.FinalTallyResult.Abstain.String(), - proposal.FinalTallyResult.No.String(), - proposal.FinalTallyResult.NoWithVeto.String(), + proposal.Id, + proposal.FinalTallyResult.YesCount, + proposal.FinalTallyResult.AbstainCount, + proposal.FinalTallyResult.NoCount, + proposal.FinalTallyResult.NoWithVetoCount, genDoc.InitialHeight, ) deposits[index] = types.NewDeposit( - proposal.ProposalId, + proposal.Id, "", proposal.TotalDeposit, genDoc.GenesisTime, diff --git a/modules/gov/handle_msg.go b/modules/gov/handle_msg.go index f301f08b6..3df6c9fec 100644 --- a/modules/gov/handle_msg.go +++ b/modules/gov/handle_msg.go @@ -11,7 +11,6 @@ import ( govtypesv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" gov "github.com/cosmos/cosmos-sdk/x/gov/types" - govtypesv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" juno "github.com/forbole/juno/v5/types" ) @@ -22,7 +21,7 @@ func (m *Module) HandleMsg(index int, msg sdk.Msg, tx *juno.Tx) error { } switch cosmosMsg := msg.(type) { - case *govtypesv1beta1.MsgSubmitProposal: + case *govtypesv1.MsgSubmitProposal: return m.handleMsgSubmitProposal(tx, index, cosmosMsg) case *govtypesv1.MsgDeposit: @@ -36,7 +35,7 @@ func (m *Module) HandleMsg(index int, msg sdk.Msg, tx *juno.Tx) error { } // handleMsgSubmitProposal allows to properly handle a handleMsgSubmitProposal -func (m *Module) handleMsgSubmitProposal(tx *juno.Tx, index int, msg *govtypesv1beta1.MsgSubmitProposal) error { +func (m *Module) handleMsgSubmitProposal(tx *juno.Tx, index int, msg *govtypesv1.MsgSubmitProposal) error { // Get the proposal id event, err := tx.FindEventByType(index, gov.EventTypeSubmitProposal) if err != nil { @@ -61,13 +60,14 @@ func (m *Module) handleMsgSubmitProposal(tx *juno.Tx, index int, msg *govtypesv1 // Store the proposal proposalObj := types.NewProposal( - proposal.ProposalId, - msg.GetContent().ProposalRoute(), - msg.GetContent().ProposalType(), - msg.GetContent(), + proposal.Id, + proposal.Title, + proposal.Summary, + proposal.Metadata, + msg.Messages, proposal.Status.String(), - proposal.SubmitTime, - proposal.DepositEndTime, + *proposal.SubmitTime, + *proposal.DepositEndTime, proposal.VotingStartTime, proposal.VotingEndTime, msg.Proposer, @@ -84,7 +84,7 @@ func (m *Module) handleMsgSubmitProposal(tx *juno.Tx, index int, msg *govtypesv1 } // Store the deposit - deposit := types.NewDeposit(proposal.ProposalId, msg.Proposer, msg.InitialDeposit, txTimestamp, tx.Height) + deposit := types.NewDeposit(proposal.Id, msg.Proposer, msg.InitialDeposit, txTimestamp, tx.Height) return m.db.SaveDeposits([]types.Deposit{deposit}) } diff --git a/modules/gov/source/local/source.go b/modules/gov/source/local/source.go index 9cb1d960b..cf04babba 100644 --- a/modules/gov/source/local/source.go +++ b/modules/gov/source/local/source.go @@ -5,8 +5,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" govtypesv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" - govtypesv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" - "github.com/forbole/juno/v5/node/local" govsource "github.com/forbole/bdjuno/v4/modules/gov/source" @@ -19,29 +17,27 @@ var ( // Source implements govsource.Source by using a local node type Source struct { *local.Source - q govtypesv1.QueryServer - qv1beta1 govtypesv1beta1.QueryClient + queryClient govtypesv1.QueryServer } // NewSource returns a new Source instance -func NewSource(source *local.Source, govKeeper govtypesv1.QueryServer, govKeeperv1beta1 govtypesv1beta1.QueryClient) *Source { +func NewSource(source *local.Source, govKeeper govtypesv1.QueryServer) *Source { return &Source{ - Source: source, - q: govKeeper, - qv1beta1: govKeeperv1beta1, + Source: source, + queryClient: govKeeper, } } // Proposal implements govsource.Source -func (s Source) Proposal(height int64, id uint64) (govtypesv1beta1.Proposal, error) { +func (s Source) Proposal(height int64, id uint64) (*govtypesv1.Proposal, error) { ctx, err := s.LoadHeight(height) if err != nil { - return govtypesv1beta1.Proposal{}, fmt.Errorf("error while loading height: %s", err) + return nil, fmt.Errorf("error while loading height: %s", err) } - res, err := s.qv1beta1.Proposal(sdk.WrapSDKContext(ctx), &govtypesv1beta1.QueryProposalRequest{ProposalId: id}) + res, err := s.queryClient.Proposal(sdk.WrapSDKContext(ctx), &govtypesv1.QueryProposalRequest{ProposalId: id}) if err != nil { - return govtypesv1beta1.Proposal{}, err + return nil, err } return res.Proposal, nil @@ -54,7 +50,7 @@ func (s Source) ProposalDeposit(height int64, id uint64, depositor string) (*gov return nil, fmt.Errorf("error while loading height: %s", err) } - res, err := s.q.Deposit(sdk.WrapSDKContext(ctx), &govtypesv1.QueryDepositRequest{ProposalId: id, Depositor: depositor}) + res, err := s.queryClient.Deposit(sdk.WrapSDKContext(ctx), &govtypesv1.QueryDepositRequest{ProposalId: id, Depositor: depositor}) if err != nil { return nil, err } @@ -69,7 +65,7 @@ func (s Source) TallyResult(height int64, proposalID uint64) (*govtypesv1.TallyR return nil, fmt.Errorf("error while loading height: %s", err) } - res, err := s.q.TallyResult(sdk.WrapSDKContext(ctx), &govtypesv1.QueryTallyResultRequest{ProposalId: proposalID}) + res, err := s.queryClient.TallyResult(sdk.WrapSDKContext(ctx), &govtypesv1.QueryTallyResultRequest{ProposalId: proposalID}) if err != nil { return nil, err } @@ -77,47 +73,17 @@ func (s Source) TallyResult(height int64, proposalID uint64) (*govtypesv1.TallyR return res.Tally, nil } -// DepositParams implements govsource.Source -func (s Source) DepositParams(height int64) (*govtypesv1.DepositParams, error) { - ctx, err := s.LoadHeight(height) - if err != nil { - return nil, fmt.Errorf("error while loading height: %s", err) - } - - res, err := s.q.Params(sdk.WrapSDKContext(ctx), &govtypesv1.QueryParamsRequest{ParamsType: govtypesv1.ParamDeposit}) - if err != nil { - return nil, err - } - - return res.DepositParams, nil -} - -// VotingParams implements govsource.Source -func (s Source) VotingParams(height int64) (*govtypesv1.VotingParams, error) { - ctx, err := s.LoadHeight(height) - if err != nil { - return nil, fmt.Errorf("error while loading height: %s", err) - } - - res, err := s.q.Params(sdk.WrapSDKContext(ctx), &govtypesv1.QueryParamsRequest{ParamsType: govtypesv1.ParamVoting}) - if err != nil { - return nil, err - } - - return res.VotingParams, nil -} - -// TallyParams implements govsource.Source -func (s Source) TallyParams(height int64) (*govtypesv1.TallyParams, error) { +// Params implements govsource.Source +func (s Source) Params(height int64) (*govtypesv1.Params, error) { ctx, err := s.LoadHeight(height) if err != nil { return nil, fmt.Errorf("error while loading height: %s", err) } - res, err := s.q.Params(sdk.WrapSDKContext(ctx), &govtypesv1.QueryParamsRequest{ParamsType: govtypesv1.ParamTallying}) + res, err := s.queryClient.Params(sdk.WrapSDKContext(ctx), &govtypesv1.QueryParamsRequest{ParamsType: govtypesv1.ParamDeposit}) if err != nil { return nil, err } - return res.TallyParams, nil + return res.Params, nil } diff --git a/modules/gov/source/remote/source.go b/modules/gov/source/remote/source.go index ca782e042..17b836b5f 100644 --- a/modules/gov/source/remote/source.go +++ b/modules/gov/source/remote/source.go @@ -4,8 +4,6 @@ import ( govtypesv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" "github.com/forbole/juno/v5/node/remote" - govtypesv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" - govsource "github.com/forbole/bdjuno/v4/modules/gov/source" ) @@ -16,27 +14,25 @@ var ( // Source implements govsource.Source using a remote node type Source struct { *remote.Source - govClient govtypesv1.QueryClient - govClientv1beta1 govtypesv1beta1.QueryClient + queryClient govtypesv1.QueryClient } // NewSource returns a new Source implementation -func NewSource(source *remote.Source, govClient govtypesv1.QueryClient, govClientv1beta1 govtypesv1beta1.QueryClient) *Source { +func NewSource(source *remote.Source, queryClient govtypesv1.QueryClient) *Source { return &Source{ - Source: source, - govClient: govClient, - govClientv1beta1: govClientv1beta1, + Source: source, + queryClient: queryClient, } } // Proposal implements govsource.Source -func (s Source) Proposal(height int64, id uint64) (govtypesv1beta1.Proposal, error) { - res, err := s.govClientv1beta1.Proposal( +func (s Source) Proposal(height int64, id uint64) (*govtypesv1.Proposal, error) { + res, err := s.queryClient.Proposal( remote.GetHeightRequestContext(s.Ctx, height), - &govtypesv1beta1.QueryProposalRequest{ProposalId: id}, + &govtypesv1.QueryProposalRequest{ProposalId: id}, ) if err != nil { - return govtypesv1beta1.Proposal{}, err + return nil, err } return res.Proposal, err @@ -44,7 +40,7 @@ func (s Source) Proposal(height int64, id uint64) (govtypesv1beta1.Proposal, err // ProposalDeposit implements govsource.Source func (s Source) ProposalDeposit(height int64, id uint64, depositor string) (*govtypesv1.Deposit, error) { - res, err := s.govClient.Deposit( + res, err := s.queryClient.Deposit( remote.GetHeightRequestContext(s.Ctx, height), &govtypesv1.QueryDepositRequest{ProposalId: id, Depositor: depositor}, ) @@ -57,7 +53,7 @@ func (s Source) ProposalDeposit(height int64, id uint64, depositor string) (*gov // TallyResult implements govsource.Source func (s Source) TallyResult(height int64, proposalID uint64) (*govtypesv1.TallyResult, error) { - res, err := s.govClient.TallyResult( + res, err := s.queryClient.TallyResult( remote.GetHeightRequestContext(s.Ctx, height), &govtypesv1.QueryTallyResultRequest{ProposalId: proposalID}, ) @@ -68,9 +64,9 @@ func (s Source) TallyResult(height int64, proposalID uint64) (*govtypesv1.TallyR return res.Tally, nil } -// DepositParams implements govsource.Source -func (s Source) DepositParams(height int64) (*govtypesv1.DepositParams, error) { - res, err := s.govClient.Params( +// Params implements govsource.Source +func (s Source) Params(height int64) (*govtypesv1.Params, error) { + res, err := s.queryClient.Params( remote.GetHeightRequestContext(s.Ctx, height), &govtypesv1.QueryParamsRequest{ParamsType: govtypesv1.ParamDeposit}, ) @@ -78,31 +74,5 @@ func (s Source) DepositParams(height int64) (*govtypesv1.DepositParams, error) { return nil, err } - return res.DepositParams, nil -} - -// VotingParams implements govsource.Source -func (s Source) VotingParams(height int64) (*govtypesv1.VotingParams, error) { - res, err := s.govClient.Params( - remote.GetHeightRequestContext(s.Ctx, height), - &govtypesv1.QueryParamsRequest{ParamsType: govtypesv1.ParamVoting}, - ) - if err != nil { - return nil, err - } - - return res.VotingParams, nil -} - -// TallyParams implements govsource.Source -func (s Source) TallyParams(height int64) (*govtypesv1.TallyParams, error) { - res, err := s.govClient.Params( - remote.GetHeightRequestContext(s.Ctx, height), - &govtypesv1.QueryParamsRequest{ParamsType: govtypesv1.ParamTallying}, - ) - if err != nil { - return nil, err - } - - return res.TallyParams, nil + return res.Params, nil } diff --git a/modules/gov/source/source.go b/modules/gov/source/source.go index 87761c2a9..b499e6d32 100644 --- a/modules/gov/source/source.go +++ b/modules/gov/source/source.go @@ -2,14 +2,11 @@ package source import ( govtypesv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" - govtypesv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" ) type Source interface { - Proposal(height int64, id uint64) (govtypesv1beta1.Proposal, error) + Proposal(height int64, id uint64) (*govtypesv1.Proposal, error) ProposalDeposit(height int64, id uint64, depositor string) (*govtypesv1.Deposit, error) TallyResult(height int64, proposalID uint64) (*govtypesv1.TallyResult, error) - DepositParams(height int64) (*govtypesv1.DepositParams, error) - VotingParams(height int64) (*govtypesv1.VotingParams, error) - TallyParams(height int64) (*govtypesv1.TallyParams, error) + Params(height int64) (*govtypesv1.Params, error) } diff --git a/modules/gov/utils_params.go b/modules/gov/utils_params.go index 0c82ca53d..03422b61f 100644 --- a/modules/gov/utils_params.go +++ b/modules/gov/utils_params.go @@ -13,25 +13,10 @@ func (m *Module) UpdateParams(height int64) error { log.Debug().Str("module", "gov").Int64("height", height). Msg("updating params") - depositParams, err := m.source.DepositParams(height) + params, err := m.source.Params(height) if err != nil { - return fmt.Errorf("error while getting gov deposit params: %s", err) + return fmt.Errorf("error while getting gov params: %s", err) } - votingParams, err := m.source.VotingParams(height) - if err != nil { - return fmt.Errorf("error while getting gov voting params: %s", err) - } - - tallyParams, err := m.source.TallyParams(height) - if err != nil { - return fmt.Errorf("error while getting gov tally params: %s", err) - } - - return m.db.SaveGovParams(types.NewGovParams( - types.NewVotingParams(votingParams), - types.NewDepositParam(depositParams), - types.NewTallyParams(tallyParams), - height, - )) + return m.db.SaveGovParams(types.NewGovParams(params, height)) } diff --git a/modules/gov/utils_proposal.go b/modules/gov/utils_proposal.go index 177589efa..e5c84e621 100644 --- a/modules/gov/utils_proposal.go +++ b/modules/gov/utils_proposal.go @@ -6,6 +6,9 @@ import ( "time" "github.com/cosmos/cosmos-sdk/codec" + sdk "github.com/cosmos/cosmos-sdk/types" + govtypesv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" + govtypesv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" proposaltypes "github.com/cosmos/cosmos-sdk/x/params/types/proposal" slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" @@ -19,8 +22,6 @@ import ( distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types" - govtypesv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" - gov "github.com/cosmos/cosmos-sdk/x/gov/types" ) @@ -88,7 +89,7 @@ func (m *Module) updateDeletedProposalStatus(id uint64) error { return m.db.UpdateProposal( types.NewProposalUpdate( - stored.ProposalID, + stored.ID, types.ProposalStatusInvalid, stored.VotingStartTime, stored.VotingEndTime, @@ -97,51 +98,49 @@ func (m *Module) updateDeletedProposalStatus(id uint64) error { } // handleParamChangeProposal updates params to the corresponding modules if a ParamChangeProposal has passed -func (m *Module) handleParamChangeProposal(height int64, paramChangeProposal *proposaltypes.ParameterChangeProposal) (err error) { - for _, change := range paramChangeProposal.Changes { - // Update the params for corresponding modules - switch change.Subspace { - case distrtypes.ModuleName: - err = m.distrModule.UpdateParams(height) - if err != nil { - return fmt.Errorf("error while updating ParamChangeProposal %s params : %s", distrtypes.ModuleName, err) - } - case gov.ModuleName: - err = m.UpdateParams(height) - if err != nil { - return fmt.Errorf("error while updating ParamChangeProposal %s params : %s", gov.ModuleName, err) - } - case minttypes.ModuleName: - err = m.mintModule.UpdateParams(height) - if err != nil { - return fmt.Errorf("error while updating ParamChangeProposal %s params : %s", minttypes.ModuleName, err) - } +func (m *Module) handleParamChangeProposal(height int64, moduleName string) (err error) { + switch moduleName { + case distrtypes.ModuleName: + err = m.distrModule.UpdateParams(height) + if err != nil { + return fmt.Errorf("error while updating ParamChangeProposal %s params : %s", distrtypes.ModuleName, err) + } + case gov.ModuleName: + err = m.UpdateParams(height) + if err != nil { + return fmt.Errorf("error while updating ParamChangeProposal %s params : %s", gov.ModuleName, err) + } + case minttypes.ModuleName: + err = m.mintModule.UpdateParams(height) + if err != nil { + return fmt.Errorf("error while updating ParamChangeProposal %s params : %s", minttypes.ModuleName, err) + } - // Update the inflation - err = m.mintModule.UpdateInflation() - if err != nil { - return fmt.Errorf("error while updating inflation with ParamChangeProposal: %s", err) - } - case slashingtypes.ModuleName: - err = m.slashingModule.UpdateParams(height) - if err != nil { - return fmt.Errorf("error while updating ParamChangeProposal %s params : %s", slashingtypes.ModuleName, err) - } - case stakingtypes.ModuleName: - err = m.stakingModule.UpdateParams(height) - if err != nil { - return fmt.Errorf("error while updating ParamChangeProposal %s params : %s", stakingtypes.ModuleName, err) - } + // Update the inflation + err = m.mintModule.UpdateInflation() + if err != nil { + return fmt.Errorf("error while updating inflation with ParamChangeProposal: %s", err) + } + case slashingtypes.ModuleName: + err = m.slashingModule.UpdateParams(height) + if err != nil { + return fmt.Errorf("error while updating ParamChangeProposal %s params : %s", slashingtypes.ModuleName, err) + } + case stakingtypes.ModuleName: + err = m.stakingModule.UpdateParams(height) + if err != nil { + return fmt.Errorf("error while updating ParamChangeProposal %s params : %s", stakingtypes.ModuleName, err) } } + return nil } // updateProposalStatus updates the given proposal status -func (m *Module) updateProposalStatus(proposal govtypesv1beta1.Proposal) error { +func (m *Module) updateProposalStatus(proposal *govtypesv1.Proposal) error { return m.db.UpdateProposal( types.NewProposalUpdate( - proposal.ProposalId, + proposal.Id, proposal.Status.String(), proposal.VotingStartTime, proposal.VotingEndTime, @@ -150,20 +149,20 @@ func (m *Module) updateProposalStatus(proposal govtypesv1beta1.Proposal) error { } // updateProposalTallyResult updates the tally result associated with the given proposal -func (m *Module) updateProposalTallyResult(proposal govtypesv1beta1.Proposal) error { +func (m *Module) updateProposalTallyResult(proposal *govtypesv1.Proposal) error { height, err := m.db.GetLastBlockHeight() if err != nil { return err } - result, err := m.source.TallyResult(height, proposal.ProposalId) + result, err := m.source.TallyResult(height, proposal.Id) if err != nil { return fmt.Errorf("error while getting tally result: %s", err) } return m.db.SaveTallyResults([]types.TallyResult{ types.NewTallyResult( - proposal.ProposalId, + proposal.Id, result.YesCount, result.AbstainCount, result.NoCount, @@ -174,24 +173,32 @@ func (m *Module) updateProposalTallyResult(proposal govtypesv1beta1.Proposal) er } // updateAccounts updates any account that might be involved in the proposal (eg. fund community recipient) -func (m *Module) updateAccounts(proposal govtypesv1beta1.Proposal) error { - content, ok := proposal.Content.GetCachedValue().(*distrtypes.CommunityPoolSpendProposal) - if ok { - height, err := m.db.GetLastBlockHeight() +func (m *Module) updateAccounts(proposal *govtypesv1.Proposal) error { + var addresses []string + for _, msg := range proposal.Messages { + var sdkMsg sdk.Msg + err := m.cdc.UnpackAny(msg, &sdkMsg) if err != nil { - return fmt.Errorf("error while getting last block height: %s", err) + return fmt.Errorf("error while unpacking proposal message: %s", err) } - addresses := []string{content.Recipient} - - err = m.authModule.RefreshAccounts(height, addresses) - if err != nil { - return err + switch msg := sdkMsg.(type) { + case *distrtypes.MsgCommunityPoolSpend: + addresses = append(addresses, msg.Recipient) + case *govtypesv1.MsgExecLegacyContent: + content, ok := msg.Content.GetCachedValue().(*distrtypes.CommunityPoolSpendProposal) + if ok { + addresses = append(addresses, content.Recipient) + } } + } - return nil + height, err := m.db.GetLastBlockHeight() + if err != nil { + return fmt.Errorf("error while getting last block height: %s", err) } - return nil + + return m.authModule.RefreshAccounts(height, addresses) } // updateProposalStakingPoolSnapshot updates the staking pool snapshot associated with the gov @@ -275,16 +282,97 @@ func findStatus(consAddr string, statuses []types.ValidatorStatus) (types.Valida return types.ValidatorStatus{}, fmt.Errorf("cannot find status for validator with consensus address %s", consAddr) } -func (m *Module) handlePassedProposal(proposal govtypesv1beta1.Proposal, height int64) error { - if proposal.Status != govtypesv1beta1.StatusPassed { +// handlePassedProposal handles a passed proposal by updating the proposal status and +// updating any other data that might be involved in the proposal (eg. fund community recipient) +func (m *Module) handlePassedProposal(proposal *govtypesv1.Proposal, height int64) error { + if proposal.Status != govtypesv1.StatusPassed { // If proposal status is not passed, do nothing return nil } + for _, msg := range proposal.Messages { + var sdkMsg sdk.Msg + err := m.cdc.UnpackAny(msg, &sdkMsg) + if err != nil { + return fmt.Errorf("error while unpacking proposal message: %s", err) + } + + switch msg := sdkMsg.(type) { + case *govtypesv1.MsgExecLegacyContent: + err := m.handlePassedV1Beta1Proposal(proposal, msg, height) + if err != nil { + return err + } + + default: + err := m.handlePassedV1Proposal(proposal, msg, height) + if err != nil { + return err + } + } + } + + return nil +} + +// handlePassedV1Proposal handles a passed proposal that contains a v1 message (new version) +func (m *Module) handlePassedV1Proposal(proposal *govtypesv1.Proposal, msg sdk.Msg, height int64) error { + switch msg := msg.(type) { + case *upgradetypes.MsgSoftwareUpgrade: + // Store software upgrade plan while SoftwareUpgradeProposal passed + err := m.db.SaveSoftwareUpgradePlan(proposal.Id, msg.Plan, height) + if err != nil { + return fmt.Errorf("error while storing software upgrade plan: %s", err) + } + + case *upgradetypes.MsgCancelUpgrade: + // Delete software upgrade plan while CancelSoftwareUpgradeProposal passed + err := m.db.DeleteSoftwareUpgradePlan(proposal.Id) + if err != nil { + return fmt.Errorf("error while deleting software upgrade plan: %s", err) + } + + default: + // Try to see if it's a param change proposal. This should be handled as last case + // because it's the most generic one + subspace, ok := getParamChangeSubspace(msg) + if ok { + err := m.handleParamChangeProposal(height, subspace) + if err != nil { + return err + } + } + } + + return nil +} + +// getParamChangeSubspace returns the subspace of the param change proposal, if any. +// If the message is not a param change proposal, it returns false +func getParamChangeSubspace(msg sdk.Msg) (string, bool) { + switch msg.(type) { + case *distrtypes.MsgUpdateParams: + return distrtypes.ModuleName, true + case *govtypesv1.MsgUpdateParams: + return gov.ModuleName, true + case *minttypes.MsgUpdateParams: + return minttypes.ModuleName, true + case *slashingtypes.MsgUpdateParams: + return slashingtypes.ModuleName, true + case *stakingtypes.MsgUpdateParams: + return stakingtypes.ModuleName, true + + default: + return "", false + } +} + +// handlePassedV1Beta1Proposal handles a passed proposal with a v1beta1 message (legacy) +func (m *Module) handlePassedV1Beta1Proposal(proposal *govtypesv1.Proposal, msg *govtypesv1.MsgExecLegacyContent, height int64) error { // Unpack proposal var content govtypesv1beta1.Content var protoCodec codec.ProtoCodec - err := protoCodec.UnpackAny(proposal.Content, &content) + err := protoCodec.UnpackAny(msg.Content, &content) if err != nil { return fmt.Errorf("error while handling ParamChangeProposal: %s", err) } @@ -292,19 +380,21 @@ func (m *Module) handlePassedProposal(proposal govtypesv1beta1.Proposal, height switch p := content.(type) { case *proposaltypes.ParameterChangeProposal: // Update params while ParameterChangeProposal passed - err = m.handleParamChangeProposal(height, p) - if err != nil { - return fmt.Errorf("error while updating params from ParamChangeProposal: %s", err) + for _, change := range p.Changes { + err = m.handleParamChangeProposal(height, change.Subspace) + if err != nil { + return fmt.Errorf("error while updating params from ParamChangeProposal: %s", err) + } } case *upgradetypes.SoftwareUpgradeProposal: // Store software upgrade plan while SoftwareUpgradeProposal passed - err = m.db.SaveSoftwareUpgradePlan(proposal.ProposalId, p.Plan, height) + err = m.db.SaveSoftwareUpgradePlan(proposal.Id, p.Plan, height) if err != nil { return fmt.Errorf("error while storing software upgrade plan: %s", err) } case *upgradetypes.CancelSoftwareUpgradeProposal: // Delete software upgrade plan while CancelSoftwareUpgradeProposal passed - err = m.db.DeleteSoftwareUpgradePlan(proposal.ProposalId) + err = m.db.DeleteSoftwareUpgradePlan(proposal.Id) if err != nil { return fmt.Errorf("error while deleting software upgrade plan: %s", err) } diff --git a/modules/types/sources.go b/modules/types/sources.go index 0a145d10a..1f81e312a 100644 --- a/modules/types/sources.go +++ b/modules/types/sources.go @@ -4,11 +4,9 @@ import ( "fmt" "os" - "github.com/cometbft/cometbft/libs/log" - govtypesv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" - "cosmossdk.io/simapp" "cosmossdk.io/simapp/params" + "github.com/cometbft/cometbft/libs/log" "github.com/forbole/juno/v5/node/remote" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" @@ -75,7 +73,7 @@ func buildLocalSources(cfg *local.Details, encodingConfig *params.EncodingConfig sources := &Sources{ BankSource: localbanksource.NewSource(source, banktypes.QueryServer(app.BankKeeper)), // DistrSource: localdistrsource.NewSource(source, distrtypes.QueryServer(app.DistrKeeper)), - GovSource: localgovsource.NewSource(source, govtypesv1.QueryServer(app.GovKeeper), nil), + GovSource: localgovsource.NewSource(source, govtypesv1.QueryServer(app.GovKeeper)), MintSource: localmintsource.NewSource(source, minttypes.QueryServer(app.MintKeeper)), SlashingSource: localslashingsource.NewSource(source, slashingtypes.QueryServer(app.SlashingKeeper)), StakingSource: localstakingsource.NewSource(source, stakingkeeper.Querier{Keeper: app.StakingKeeper}), @@ -114,7 +112,7 @@ func buildRemoteSources(cfg *remote.Details) (*Sources, error) { return &Sources{ BankSource: remotebanksource.NewSource(source, banktypes.NewQueryClient(source.GrpcConn)), DistrSource: remotedistrsource.NewSource(source, distrtypes.NewQueryClient(source.GrpcConn)), - GovSource: remotegovsource.NewSource(source, govtypesv1.NewQueryClient(source.GrpcConn), govtypesv1beta1.NewQueryClient(source.GrpcConn)), + GovSource: remotegovsource.NewSource(source, govtypesv1.NewQueryClient(source.GrpcConn)), MintSource: remotemintsource.NewSource(source, minttypes.NewQueryClient(source.GrpcConn)), SlashingSource: remoteslashingsource.NewSource(source, slashingtypes.NewQueryClient(source.GrpcConn)), StakingSource: remotestakingsource.NewSource(source, stakingtypes.NewQueryClient(source.GrpcConn)), diff --git a/modules/utils/time.go b/modules/utils/time.go new file mode 100644 index 000000000..e52cfedcd --- /dev/null +++ b/modules/utils/time.go @@ -0,0 +1,17 @@ +package utils + +import ( + "time" +) + +func AreTimesEqual(first *time.Time, second *time.Time) bool { + if first == nil && second == nil { + return true + } + + if first == nil || second == nil { + return false + } + + return first.Equal(*second) +} diff --git a/testutils/time.go b/testutils/time.go new file mode 100644 index 000000000..64bd9d401 --- /dev/null +++ b/testutils/time.go @@ -0,0 +1,13 @@ +package testutils + +import ( + "time" +) + +func NewDurationPointer(duration time.Duration) *time.Duration { + return &duration +} + +func NewTimePointer(time time.Time) *time.Time { + return &time +} diff --git a/types/gov.go b/types/gov.go index c02359cd4..a0ef2d83e 100644 --- a/types/gov.go +++ b/types/gov.go @@ -3,10 +3,9 @@ package types import ( "time" + codectypes "github.com/cosmos/cosmos-sdk/codec/types" sdk "github.com/cosmos/cosmos-sdk/types" - govtypesv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" - govtypesv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" ) @@ -14,112 +13,16 @@ const ( ProposalStatusInvalid = "PROPOSAL_STATUS_INVALID" ) -// DepositParams contains the data of the deposit parameters of the x/gov module -type DepositParams struct { - MinDeposit sdk.Coins `json:"min_deposit,omitempty" yaml:"min_deposit"` - MaxDepositPeriod int64 `json:"max_deposit_period,omitempty" yaml:"max_deposit_period"` -} - -// NewDepositParam allows to build a new DepositParams -func NewDepositParam(d *govtypesv1.DepositParams) DepositParams { - return DepositParams{ - MinDeposit: d.MinDeposit, - MaxDepositPeriod: d.MaxDepositPeriod.Nanoseconds(), - } -} - -// NewGenesisDepositParam allows to build a new DepositParams -func NewGenesisDepositParam(d *govtypesv1beta1.DepositParams) DepositParams { - return DepositParams{ - MinDeposit: d.MinDeposit, - MaxDepositPeriod: d.MaxDepositPeriod.Nanoseconds(), - } -} - -// VotingParams contains the voting parameters of the x/gov module -type VotingParams struct { - VotingPeriod int64 `json:"voting_period,omitempty" yaml:"voting_period"` -} - -// NewVotingParams allows to build a new VotingParams instance -func NewVotingParams(v *govtypesv1.VotingParams) VotingParams { - return VotingParams{ - VotingPeriod: v.VotingPeriod.Nanoseconds(), - } -} - -// NewGenesisVotingParams allows to build a new VotingParams instance -func NewGenesisVotingParams(v *govtypesv1beta1.VotingParams) VotingParams { - return VotingParams{ - VotingPeriod: v.VotingPeriod.Nanoseconds(), - } -} - // GovParams contains the data of the x/gov module parameters type GovParams struct { - DepositParams DepositParams `json:"deposit_params" yaml:"deposit_params"` - VotingParams VotingParams `json:"voting_params" yaml:"voting_params"` - TallyParams TallyParams `json:"tally_params" yaml:"tally_params"` - Height int64 `json:"height" ymal:"height"` -} - -// GenesisGovParams contains the data of the x/gov module parameters -type GenesisGovParams struct { - DepositParams DepositParams `json:"deposit_params" yaml:"deposit_params"` - VotingParams VotingParams `json:"voting_params" yaml:"voting_params"` - TallyParams GenesisTallyParams `json:"tally_params" yaml:"tally_params"` - Height int64 `json:"height" ymal:"height"` -} - -// TallyParams contains the tally parameters of the x/gov module -type TallyParams struct { - Quorum string `json:"quorum,omitempty"` - Threshold string `json:"threshold,omitempty"` - VetoThreshold string `json:"veto_threshold,omitempty" yaml:"veto_threshold"` -} - -// GenesisTallyParams contains genesis tally parameters of the x/gov module -type GenesisTallyParams struct { - Quorum sdk.Dec `json:"quorum,omitempty"` - Threshold sdk.Dec `json:"threshold,omitempty"` - VetoThreshold sdk.Dec `json:"veto_threshold,omitempty" yaml:"veto_threshold"` -} - -// NewTallyParams allows to build a new TallyParams instance -func NewTallyParams(t *govtypesv1.TallyParams) TallyParams { - return TallyParams{ - Quorum: t.Quorum, - Threshold: t.Threshold, - VetoThreshold: t.VetoThreshold, - } -} - -// NewGenesisTallyParams allows to build a new GenesisTallyParams instance -func NewGenesisTallyParams(t *govtypesv1beta1.TallyParams) GenesisTallyParams { - return GenesisTallyParams{ - Quorum: t.Quorum, - Threshold: t.Threshold, - VetoThreshold: t.VetoThreshold, - } + *govtypesv1.Params + Height int64 `json:"height" ymal:"height"` } -// NewGovParams allows to build a new GovParams instance -func NewGovParams(votingParams VotingParams, depositParams DepositParams, tallyParams TallyParams, height int64) *GovParams { +func NewGovParams(params *govtypesv1.Params, height int64) *GovParams { return &GovParams{ - DepositParams: depositParams, - VotingParams: votingParams, - TallyParams: tallyParams, - Height: height, - } -} - -// NewGenesisGovParams allows to build a new GenesisGovParams instance -func NewGenesisGovParams(votingParams VotingParams, depositParams DepositParams, tallyParams GenesisTallyParams, height int64) *GenesisGovParams { - return &GenesisGovParams{ - DepositParams: depositParams, - VotingParams: votingParams, - TallyParams: tallyParams, - Height: height, + Params: params, + Height: height, } } @@ -127,36 +30,39 @@ func NewGenesisGovParams(votingParams VotingParams, depositParams DepositParams, // Proposal represents a single governance proposal type Proposal struct { - ProposalRoute string - ProposalType string - ProposalID uint64 - Content govtypesv1beta1.Content + ID uint64 + Title string + Summary string + Metadata string + Messages []*codectypes.Any Status string SubmitTime time.Time DepositEndTime time.Time - VotingStartTime time.Time - VotingEndTime time.Time + VotingStartTime *time.Time + VotingEndTime *time.Time Proposer string } // NewProposal return a new Proposal instance func NewProposal( proposalID uint64, - proposalRoute string, - proposalType string, - content govtypesv1beta1.Content, + title string, + summary string, + metadata string, + messages []*codectypes.Any, status string, submitTime time.Time, depositEndTime time.Time, - votingStartTime time.Time, - votingEndTime time.Time, + votingStartTime *time.Time, + votingEndTime *time.Time, proposer string, ) Proposal { return Proposal{ - Content: content, - ProposalRoute: proposalRoute, - ProposalType: proposalType, - ProposalID: proposalID, + ID: proposalID, + Title: title, + Summary: summary, + Metadata: metadata, + Messages: messages, Status: status, SubmitTime: submitTime, DepositEndTime: depositEndTime, @@ -166,32 +72,16 @@ func NewProposal( } } -// Equal tells whether p and other contain the same data -func (p Proposal) Equal(other Proposal) bool { - return p.ProposalRoute == other.ProposalRoute && - p.ProposalType == other.ProposalType && - p.ProposalID == other.ProposalID && - p.Content.String() == other.Content.String() && - p.Status == other.Status && - p.SubmitTime.Equal(other.SubmitTime) && - p.DepositEndTime.Equal(other.DepositEndTime) && - p.VotingStartTime.Equal(other.VotingStartTime) && - p.VotingEndTime.Equal(other.VotingEndTime) && - p.Proposer == other.Proposer -} - // ProposalUpdate contains the data that should be used when updating a governance proposal type ProposalUpdate struct { ProposalID uint64 Status string - VotingStartTime time.Time - VotingEndTime time.Time + VotingStartTime *time.Time + VotingEndTime *time.Time } // NewProposalUpdate allows to build a new ProposalUpdate instance -func NewProposalUpdate( - proposalID uint64, status string, votingStartTime, votingEndTime time.Time, -) ProposalUpdate { +func NewProposalUpdate(proposalID uint64, status string, votingStartTime, votingEndTime *time.Time) ProposalUpdate { return ProposalUpdate{ ProposalID: proposalID, Status: status,