diff --git a/Makefile b/Makefile index 395c22086..de0062f9f 100644 --- a/Makefile +++ b/Makefile @@ -160,7 +160,7 @@ test: @go test -v ./... -short e2e: - @cd e2e && go test -v ./... -timeout 20m + @cd e2e && go test -v -race ./... -timeout 20m .PHONY: test e2e ############################################################################### diff --git a/app/app.go b/app/app.go index cfbe3dbb3..916c2f386 100644 --- a/app/app.go +++ b/app/app.go @@ -14,6 +14,9 @@ import ( tmos "github.com/cometbft/cometbft/libs/os" dbm "github.com/cosmos/cosmos-db" "github.com/cosmos/gogoproto/proto" + icq "github.com/cosmos/ibc-apps/modules/async-icq/v8" + icqkeeper "github.com/cosmos/ibc-apps/modules/async-icq/v8/keeper" + icqtypes "github.com/cosmos/ibc-apps/modules/async-icq/v8/types" "github.com/cosmos/ibc-go/modules/capability" capabilitykeeper "github.com/cosmos/ibc-go/modules/capability/keeper" capabilitytypes "github.com/cosmos/ibc-go/modules/capability/types" @@ -174,6 +177,7 @@ var ( stakingtypes.NotBondedPoolName: {authtypes.Burner, authtypes.Staking}, govtypes.ModuleName: {authtypes.Burner}, ibctransfertypes.ModuleName: {authtypes.Minter, authtypes.Burner}, + icqtypes.ModuleName: nil, oraclemoduletypes.ModuleName: {authtypes.Minter, authtypes.Burner, authtypes.Staking}, disputemoduletypes.ModuleName: {authtypes.Minter, authtypes.Burner, authtypes.Staking}, bridgemoduletypes.ModuleName: {authtypes.Minter, authtypes.Burner}, @@ -227,6 +231,7 @@ type App struct { GovKeeper govkeeper.Keeper UpgradeKeeper *upgradekeeper.Keeper IBCKeeper *ibckeeper.Keeper // IBC Keeper must be a pointer in the app, so we can SetRouter on it correctly + ICQKeeper icqkeeper.Keeper EvidenceKeeper evidencekeeper.Keeper TransferKeeper ibctransferkeeper.Keeper ICAHostKeeper icahostkeeper.Keeper @@ -238,6 +243,7 @@ type App struct { ScopedIBCKeeper capabilitykeeper.ScopedKeeper ScopedTransferKeeper capabilitykeeper.ScopedKeeper ScopedICAHostKeeper capabilitykeeper.ScopedKeeper + ScopedICQKeeper capabilitykeeper.ScopedKeeper OracleKeeper oraclemodulekeeper.Keeper @@ -319,6 +325,7 @@ func New( bridgemoduletypes.StoreKey, reportermoduletypes.StoreKey, globalfeetypes.StoreKey, + icqtypes.StoreKey, // this line is used by starport scaffolding # stargate/app/storeKey ) @@ -357,6 +364,7 @@ func New( scopedICAControllerKeeper := app.CapabilityKeeper.ScopeToModule(icacontrollertypes.SubModuleName) scopedTransferKeeper := app.CapabilityKeeper.ScopeToModule(ibctransfertypes.ModuleName) scopedICAHostKeeper := app.CapabilityKeeper.ScopeToModule(icahosttypes.SubModuleName) + scopedICQKeeper := app.CapabilityKeeper.ScopeToModule(icqtypes.ModuleName) // this line is used by starport scaffolding # stargate/app/scopedKeeper // add keepers @@ -522,7 +530,18 @@ func New( ) icaHostIBCModule := icahost.NewIBCModule(app.ICAHostKeeper) - + // ICQ Keeper + app.ICQKeeper = icqkeeper.NewKeeper( + appCodec, + app.keys[icqtypes.StoreKey], + app.IBCKeeper.ChannelKeeper, // may be replaced with middleware + app.IBCKeeper.ChannelKeeper, + app.IBCKeeper.PortKeeper, + scopedICQKeeper, + bApp.GRPCQueryRouter(), + authtypes.NewModuleAddress(govtypes.ModuleName).String(), + ) + icqModule := icq.NewIBCModule(app.ICQKeeper) // Create evidence Keeper for to register the IBC light client misbehavior evidence route evidenceKeeper := evidencekeeper.NewKeeper( appCodec, @@ -719,6 +738,7 @@ func New( ibcRouter := ibcporttypes.NewRouter() ibcRouter.AddRoute(icahosttypes.SubModuleName, icaHostIBCModule) ibcRouter.AddRoute(ibctransfertypes.ModuleName, transferIBCModule) + ibcRouter.AddRoute(icqtypes.ModuleName, icqModule) app.IBCKeeper.SetRouter(ibcRouter) /**** Module Hooks ****/ @@ -789,6 +809,7 @@ func New( ibc.NewAppModule(app.IBCKeeper), transfer.NewAppModule(app.TransferKeeper), ica.NewAppModule(&icaControllerKeeper, &app.ICAHostKeeper), + icqcustomModule{icq.NewAppModule(app.ICQKeeper, nil)}, // this line is used by starport scaffolding # stargate/app/appModule ) @@ -842,6 +863,7 @@ func New( govtypes.ModuleName, stakingtypes.ModuleName, ibctransfertypes.ModuleName, + icqtypes.ModuleName, ibcexported.ModuleName, icatypes.ModuleName, capabilitytypes.ModuleName, @@ -882,6 +904,7 @@ func New( minttypes.ModuleName, genutiltypes.ModuleName, ibctransfertypes.ModuleName, + icqtypes.ModuleName, ibcexported.ModuleName, icatypes.ModuleName, evidencetypes.ModuleName, @@ -946,6 +969,7 @@ func New( app.ScopedIBCKeeper = scopedIBCKeeper app.ScopedTransferKeeper = scopedTransferKeeper + app.ScopedICQKeeper = scopedICQKeeper // this line is used by starport scaffolding # stargate/app/beforeInitReturn return app diff --git a/app/default_overrides.go b/app/default_overrides.go index d27c70e37..8d7b1b652 100644 --- a/app/default_overrides.go +++ b/app/default_overrides.go @@ -3,6 +3,8 @@ package app import ( "encoding/json" + icq "github.com/cosmos/ibc-apps/modules/async-icq/v8" + icqtypes "github.com/cosmos/ibc-apps/modules/async-icq/v8/types" "github.com/strangelove-ventures/globalfee/x/globalfee" globalfeetypes "github.com/strangelove-ventures/globalfee/x/globalfee/types" @@ -103,3 +105,15 @@ func (globalFeeModule) DefaultGenesis(cdc codec.JSONCodec) json.RawMessage { return cdc.MustMarshalJSON(genState) } + +type icqcustomModule struct { + icq.AppModule +} + +// DefaultGenesis returns custom x/globalfee module genesis state. +func (icqcustomModule) DefaultGenesis(cdc codec.JSONCodec) json.RawMessage { + genState := icqtypes.DefaultGenesis() + genState.Params.AllowQueries = []string{"/layer.oracle.Query/GetCurrentAggregateReport"} + + return cdc.MustMarshalJSON(genState) +} diff --git a/e2e/icq_test.go b/e2e/icq_test.go new file mode 100644 index 000000000..6e36300c3 --- /dev/null +++ b/e2e/icq_test.go @@ -0,0 +1,232 @@ +package e2e_test + +import ( + "context" + "encoding/hex" + "encoding/json" + "fmt" + "testing" + + "github.com/strangelove-ventures/interchaintest/v8" + "github.com/strangelove-ventures/interchaintest/v8/chain/cosmos" + "github.com/strangelove-ventures/interchaintest/v8/ibc" + "github.com/strangelove-ventures/interchaintest/v8/relayer" + "github.com/strangelove-ventures/interchaintest/v8/testreporter" + "github.com/strangelove-ventures/interchaintest/v8/testutil" + "github.com/stretchr/testify/require" + "github.com/tellor-io/layer/e2e" + "github.com/tellor-io/layer/utils" + "go.uber.org/zap/zaptest" + + "cosmossdk.io/math" + + "github.com/cosmos/cosmos-sdk/crypto/keyring" + sdk "github.com/cosmos/cosmos-sdk/types" +) + +func TestIbcInterchainQuery(t *testing.T) { + if testing.Short() { + t.Skip("skipping in short mode") + } + + cosmos.SetSDKConfig("tellor") + + rep := testreporter.NewNopReporter() + eRep := rep.RelayerExecReporter(t) + + ctx := context.Background() + + client, network := interchaintest.DockerSetup(t) + + modifyGenesis := []cosmos.GenesisKV{ + cosmos.NewGenesisKV("app_state.dispute.params.team_address", sdk.MustAccAddressFromBech32("tellor14ncp4jg0d087l54pwnp8p036s0dc580xy4gavf").Bytes()), + cosmos.NewGenesisKV("consensus.params.abci.vote_extensions_enable_height", "1"), + cosmos.NewGenesisKV("app_state.gov.params.voting_period", "15s"), + cosmos.NewGenesisKV("app_state.gov.params.max_deposit_period", "10s"), + cosmos.NewGenesisKV("app_state.gov.params.min_deposit.0.denom", "loya"), + cosmos.NewGenesisKV("app_state.gov.params.min_deposit.0.amount", "1"), + cosmos.NewGenesisKV("app_state.globalfee.params.minimum_gas_prices.0.amount", "0.0"), + } + nv := 1 + nf := 0 + cf := interchaintest.NewBuiltinChainFactory(zaptest.NewLogger(t), []*interchaintest.ChainSpec{ + { + NumValidators: &nv, + NumFullNodes: &nf, + ChainConfig: ibc.ChainConfig{ + Type: "cosmos", + Name: "layer", + ChainID: "layer", + Bin: "layerd", + Denom: "loya", + Bech32Prefix: "tellor", + CoinType: "118", + GasPrices: "0.0loya", + GasAdjustment: 1.1, + TrustingPeriod: "504h", + NoHostMount: false, + Images: []ibc.DockerImage{ + { + Repository: "ghcr.io/akremstudy/layer-icq", // source code ibc branch + Version: "latest", + UidGid: "1025:1025", + }, + }, + EncodingConfig: e2e.LayerEncoding(), + ModifyGenesis: cosmos.ModifyGenesis(modifyGenesis), + AdditionalStartArgs: []string{"--key-name", "validator", "--price-daemon-enabled=false"}, + }, + }, + { + NumValidators: &nv, + NumFullNodes: &nf, + ChainConfig: ibc.ChainConfig{ + Type: "cosmos", + Name: "layer", + ChainID: "layer-receiver", + Bin: "layerd", + Denom: "loya", + Bech32Prefix: "tellor", + CoinType: "118", + GasPrices: "0.0loya", + GasAdjustment: 1.1, + TrustingPeriod: "504h", + NoHostMount: false, + Images: []ibc.DockerImage{ + { + Repository: "layer", + Version: "local", + UidGid: "1025:1025", + }, + }, + EncodingConfig: e2e.LayerEncoding(), + ModifyGenesis: cosmos.ModifyGenesis(modifyGenesis), + AdditionalStartArgs: []string{"--key-name", "validator", "--price-daemon-enabled=false"}, + }, + }, + }) + + chains, err := cf.Chains(t.Name()) + require.NoError(t, err) + + layer1, layer2 := chains[0].(*cosmos.CosmosChain), chains[1].(*cosmos.CosmosChain) + + r := interchaintest.NewBuiltinRelayerFactory( + ibc.CosmosRly, + zaptest.NewLogger(t), + relayer.StartupFlags("-b", "100"), + ).Build(t, client, network) + + const pathName = "layer1-layer2" + const relayerName = "relayer" + + ic := interchaintest.NewInterchain(). + AddChain(layer1). + AddChain(layer2). + AddRelayer(r, relayerName). + AddLink(interchaintest.InterchainLink{ + Chain1: layer1, + Chain2: layer2, + Relayer: r, + Path: pathName, + CreateClientOpts: ibc.CreateClientOptions{}, + CreateChannelOpts: ibc.CreateChannelOptions{ + SourcePortName: "oracle", + DestPortName: "icqhost", + Order: ibc.Unordered, + Version: "icq-1", + }, + }) + + require.NoError(t, ic.Build(ctx, eRep, interchaintest.InterchainBuildOptions{ + TestName: t.Name(), + Client: client, + NetworkID: network, + + SkipPathCreation: false, + })) + + t.Cleanup(func() { + _ = ic.Close() + }) + + layer2validator := layer2.Validators[0] + + valAddress, err := layer2validator.AccountKeyBech32(ctx, "validator") + require.NoError(t, err) + + // create reporter + _, err = layer2.GetNode().ExecTx(ctx, "validator", "reporter", "create-reporter", math.NewUint(0).String(), math.NewUint(1_000_000).String(), "--keyring-dir", layer2.HomeDir()) + require.NoError(t, err) + + // tip query + _, err = layer2validator.ExecTx(ctx, "validator", "oracle", "tip", valAddress, qData, "1000000loya", "--keyring-dir", layer2.HomeDir()) + require.NoError(t, err) + + // submit value + _, err = layer2validator.ExecTx(ctx, "validator", "oracle", "submit-value", valAddress, qData, value, "--keyring-dir", layer2.HomeDir()) + require.NoError(t, err) + + // Query for the recently created channel-id. + channels, err := r.GetChannels(ctx, eRep, layer1.Config().ChainID) + require.NoError(t, err) + + // Start the relayer and set the cleanup function. + err = r.StartRelayer(ctx, eRep, pathName) + require.NoError(t, err) + + t.Cleanup(func() { + err := r.StopRelayer(ctx, eRep) + if err != nil { + t.Logf("an error occurred while stopping the relayer: %s", err) + } + }) + + err = testutil.WaitForBlocks(ctx, 5, layer1, layer2) + require.NoError(t, err) + + chanID := channels[0].Counterparty.ChannelID + require.NotEmpty(t, chanID) + + // get aggreate report + qidbz, err := utils.QueryIDFromDataString(qData) + require.NoError(t, err) + + cmd := []string{ + "layerd", "tx", "oracle", "send-query-get-current-aggregated-report", chanID, hex.EncodeToString(qidbz), + "--node", layer1.GetRPCAddress(), + "--home", layer1.HomeDir(), + "--chain-id", layer1.Config().ChainID, + "--from", "validator", + "--gas", "1000000", + "--fees", "1000000loya", + "--keyring-dir", layer1.HomeDir(), + "--keyring-backend", keyring.BackendTest, + "-y", + } + + // Execute interchain query + stdout, _, err := layer1.Exec(ctx, cmd, nil) + require.NoError(t, err) + fmt.Println(string(stdout)) + + err = testutil.WaitForBlocks(ctx, 10, layer1, layer2) + require.NoError(t, err) + cmd = []string{ + "layerd", "query", "oracle", "query-state", "--sequence", "1", + "--node", layer1.GetRPCAddress(), + "--home", layer1.HomeDir(), + "--chain-id", layer1.Config().ChainID, + "--output", "json", + } + + response, _, err := layer1.Exec(ctx, cmd, nil) + fmt.Println(string(response), "response") + require.NoError(t, err) + // Validate response + var aggReport AggregateReport + err = json.Unmarshal(response, &aggReport) + require.NoError(t, err) + fmt.Println("Aggregate report: ", aggReport) + require.Equal(t, aggReport.Aggregate.AggregateReporter, valAddress) +} diff --git a/e2e/spinup_test.go b/e2e/spinup_test.go index a5aafb49b..93f8320e0 100644 --- a/e2e/spinup_test.go +++ b/e2e/spinup_test.go @@ -117,7 +117,7 @@ func TestLearn(t *testing.T) { require.NoError(t, err) for _, v := range layer.Validators { - _, err = v.ExecTx(ctx, "validator", "gov", "vote", "1", "yes", "--gas", "1000000", "--fees", "1000000loya", "--keyring-dir", "/var/cosmos-chain/layer-1") + _, err = v.ExecTx(ctx, "validator", "gov", "vote", "1", "yes", "--gas", "1000000", "--fees", "1000000loya", "--keyring-dir", layer.HomeDir()) require.NoError(t, err) } err = testutil.WaitForBlocks(ctx, 3, validatorI) @@ -127,16 +127,16 @@ func TestLearn(t *testing.T) { require.NoError(t, err) fmt.Println("Proposal result: ", result) // create reporter - txHash, err := validatorI.ExecTx(ctx, "validator", "reporter", "create-reporter", math.NewUint(0).String(), math.NewUint(1_000_000).String(), "--keyring-dir", "/var/cosmos-chain/layer-1") + txHash, err := validatorI.ExecTx(ctx, "validator", "reporter", "create-reporter", math.NewUint(0).String(), math.NewUint(1_000_000).String(), "--keyring-dir", layer.HomeDir()) require.NoError(t, err) fmt.Println("Tx hash: ", txHash) - _, _, err = validatorI.Exec(ctx, validatorI.TxCommand("validator", "oracle", "tip", valAddress, qData, "1000000loya", "--keyring-dir", "/var/cosmos-chain/layer-1"), validatorI.Chain.Config().Env) + _, _, err = validatorI.Exec(ctx, validatorI.TxCommand("validator", "oracle", "tip", valAddress, qData, "1000000loya", "--keyring-dir", layer.HomeDir()), validatorI.Chain.Config().Env) require.NoError(t, err) err = testutil.WaitForBlocks(ctx, 1, validatorI) require.NoError(t, err) - txHash, err = validatorI.ExecTx(ctx, "validator", "oracle", "submit-value", valAddress, qData, value, "--keyring-dir", "/var/cosmos-chain/layer-1") + txHash, err = validatorI.ExecTx(ctx, "validator", "oracle", "submit-value", valAddress, qData, value, "--keyring-dir", layer.HomeDir()) require.NoError(t, err) fmt.Println("Tx hash: ", txHash) @@ -168,7 +168,7 @@ func TestLearn(t *testing.T) { // dispute report bz, err := json.Marshal(microReports.MicroReports[0]) require.NoError(t, err) - txHash, err = validatorI.ExecTx(ctx, "validator", "dispute", "propose-dispute", string(bz), "warning", "500000000000loya", "true", "--keyring-dir", "/var/cosmos-chain/layer-1", "--gas", "1000000", "--fees", "1000000loya") + txHash, err = validatorI.ExecTx(ctx, "validator", "dispute", "propose-dispute", string(bz), "warning", "500000000000loya", "true", "--keyring-dir", layer.HomeDir(), "--gas", "1000000", "--fees", "1000000loya") require.NoError(t, err) fmt.Println("Tx hash: ", txHash) var disputes e2e.Disputes @@ -188,10 +188,10 @@ func TestLearn(t *testing.T) { fmt.Println("Reporter: ", string(res3)) // vote on dispute for _, v := range layer.Validators { - _, err = v.ExecTx(ctx, "validator", "dispute", "vote", "1", "vote-support", "--keyring-dir", "/var/cosmos-chain/layer-1") + _, err = v.ExecTx(ctx, "validator", "dispute", "vote", "1", "vote-support", "--keyring-dir", layer.HomeDir()) require.NoError(t, err) } - _, err = validatorI.ExecTx(ctx, "team", "dispute", "vote", "1", "vote-support", "--keyring-dir", "/var/cosmos-chain/layer-1") + _, err = validatorI.ExecTx(ctx, "team", "dispute", "vote", "1", "vote-support", "--keyring-dir", layer.HomeDir()) require.NoError(t, err) res3, _, err = validatorI.ExecQuery(ctx, "dispute", "team-vote", "1") diff --git a/go.mod b/go.mod index c843c6630..13d6be7b8 100644 --- a/go.mod +++ b/go.mod @@ -25,11 +25,12 @@ require ( github.com/cosmos/cosmos-proto v1.0.0-beta.5 github.com/cosmos/cosmos-sdk v0.50.9 github.com/cosmos/gogoproto v1.5.0 + github.com/cosmos/ibc-apps/modules/async-icq/v8 v8.0.0 github.com/cosmos/ibc-go/modules/capability v1.0.0 github.com/cosmos/ibc-go/v8 v8.0.0 github.com/ethereum/go-ethereum v1.10.22 github.com/go-playground/validator/v10 v10.12.0 - github.com/gogo/protobuf v1.3.2 + github.com/gogo/protobuf v1.3.3 github.com/golang/mock v1.6.0 github.com/golang/protobuf v1.5.4 github.com/gorilla/mux v1.8.1 @@ -276,5 +277,6 @@ replace ( cosmossdk.io/core => cosmossdk.io/core v0.11.0 github.com/99designs/keyring => github.com/cosmos/keyring v1.2.0 github.com/cosmos/iavl => github.com/cosmos/iavl v1.2.0 + github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 ) diff --git a/go.sum b/go.sum index c6a084858..ebfc4cdd7 100644 --- a/go.sum +++ b/go.sum @@ -396,6 +396,8 @@ github.com/cosmos/gogoproto v1.5.0 h1:SDVwzEqZDDBoslaeZg+dGE55hdzHfgUA40pEanMh52 github.com/cosmos/gogoproto v1.5.0/go.mod h1:iUM31aofn3ymidYG6bUR5ZFrk+Om8p5s754eMUcyp8I= github.com/cosmos/iavl v1.2.0 h1:kVxTmjTh4k0Dh1VNL046v6BXqKziqMDzxo93oh3kOfM= github.com/cosmos/iavl v1.2.0/go.mod h1:HidWWLVAtODJqFD6Hbne2Y0q3SdxByJepHUOeoH4LiI= +github.com/cosmos/ibc-apps/modules/async-icq/v8 v8.0.0 h1:nKP2+Rzlz2iyvTosY5mvP+aEBPe06oaDl3G7xLGBpNI= +github.com/cosmos/ibc-apps/modules/async-icq/v8 v8.0.0/go.mod h1:D3Q380FpWRFtmUQWLosPxachi6w24Og2t5u/Tww5wtY= github.com/cosmos/ibc-go/modules/capability v1.0.0 h1:r/l++byFtn7jHYa09zlAdSeevo8ci1mVZNO9+V0xsLE= github.com/cosmos/ibc-go/modules/capability v1.0.0/go.mod h1:D81ZxzjZAe0ZO5ambnvn1qedsFQ8lOwtqicG6liLBco= github.com/cosmos/ibc-go/v8 v8.0.0 h1:QKipnr/NGwc+9L7NZipURvmSIu+nw9jOIWTJuDBqOhg= @@ -568,12 +570,6 @@ github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFG github.com/gogo/googleapis v1.4.1-0.20201022092350-68b0159b7869/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt/v4 v4.3.0 h1:kHL1vqdqWNfATmA0FNMdmZNMyZI1U6O31X4rlIPoBog= github.com/golang-jwt/jwt/v4 v4.3.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= @@ -829,8 +825,6 @@ github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/X github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= @@ -1040,6 +1034,8 @@ github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40T github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/regen-network/protobuf v1.3.3-alpha.regen.1 h1:OHEc+q5iIAXpqiqFKeLpu5NwTIkVXUs48vFMwzqpqY4= +github.com/regen-network/protobuf v1.3.3-alpha.regen.1/go.mod h1:2DjTFR1HhMQhiWC5sZ4OhQ3+NtdbZ6oBDKQwq5Ou+FI= github.com/rjeczalik/notify v0.9.1 h1:CLCKso/QK1snAlnhNR/CNvNiFU2saUtjV0bx3EwNeCE= github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= @@ -1521,10 +1517,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.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -1678,6 +1672,7 @@ google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200324203455-a04cca1dde73/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=