Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions demo-apps/auth-chain/Makefile
Original file line number Diff line number Diff line change
@@ -1,5 +1,18 @@
all: build

init-dev: init-chain init-validator

start-dev:
go run cmd/auth-chaind/main.go cmd/auth-chaind/genaccounts.go start --home ./build/.auth-chaind

init-chain:
go run cmd/auth-chaind/main.go cmd/auth-chaind/genaccounts.go init --chain-id=auth auth --home ./build/.auth-chaind
echo "y" | go run cmd/auth-chaincli/main.go keys add auth-chain1 --home ./build/.auth-chaind

init-validator:
go run cmd/auth-chaind/main.go cmd/auth-chaind/genaccounts.go add-genesis-account $(shell go run cmd/auth-chaincli/main.go keys show auth-chain1 -a --home ./build/.auth-chaind) 1000000000stake --home ./build/.auth-chaind
go run cmd/auth-chaind/main.go cmd/auth-chaind/genaccounts.go gentx --name auth-chain1 --home ./build/.auth-chaind --moniker authchain --website test.com --identity test --security-contact test@test.com --details atest
go run cmd/auth-chaind/main.go cmd/auth-chaind/genaccounts.go collect-gentxs --home ./build/.auth-chaind

build:
@mkdir -p build/
Expand Down
82 changes: 40 additions & 42 deletions demo-apps/auth-chain/app/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,12 @@ import (
tmos "github.com/tendermint/tendermint/libs/os"
dbm "github.com/tendermint/tm-db"

"github.com/allinbits/modules/demo-apps/auth-chain/x/authchain"
authchainkeeper "github.com/allinbits/modules/demo-apps/auth-chain/x/authchain/keeper"
authchaintypes "github.com/allinbits/modules/demo-apps/auth-chain/x/authchain/types"
"github.com/allinbits/modules/x/poa"
poakeeper "github.com/allinbits/modules/x/poa/keeper"
poatypes "github.com/allinbits/modules/x/poa/types"
bam "github.com/cosmos/cosmos-sdk/baseapp"
"github.com/cosmos/cosmos-sdk/codec"
"github.com/cosmos/cosmos-sdk/simapp"
Expand All @@ -20,34 +26,28 @@ import (
"github.com/cosmos/cosmos-sdk/x/bank"
"github.com/cosmos/cosmos-sdk/x/genutil"
"github.com/cosmos/cosmos-sdk/x/params"
"github.com/cosmos/cosmos-sdk/x/staking"
"github.com/cosmos/cosmos-sdk/x/supply"
"github.com/allinbits/modules/demo-apps/auth-chain/x/authchain"
authchainkeeper "github.com/allinbits/modules/demo-apps/auth-chain/x/authchain/keeper"
authchaintypes "github.com/allinbits/modules/demo-apps/auth-chain/x/authchain/types"
// this line is used by starport scaffolding # 1
// this line is used by starport scaffolding # 1
)

const appName = "authchain"

var (
DefaultCLIHome = os.ExpandEnv("$HOME/.authchaincli")
DefaultCLIHome = os.ExpandEnv("$HOME/.authchaincli")
DefaultNodeHome = os.ExpandEnv("$HOME/.authchaind")
ModuleBasics = module.NewBasicManager(
ModuleBasics = module.NewBasicManager(
genutil.AppModuleBasic{},
auth.AppModuleBasic{},
bank.AppModuleBasic{},
staking.AppModuleBasic{},
poa.AppModuleBasic{},
params.AppModuleBasic{},
supply.AppModuleBasic{},
authchain.AppModuleBasic{},
// this line is used by starport scaffolding # 2
// this line is used by starport scaffolding # 2
)

maccPerms = map[string][]string{
auth.FeeCollectorName: nil,
staking.BondedPoolName: {supply.Burner, supply.Staking},
staking.NotBondedPoolName: {supply.Burner, supply.Staking},
auth.FeeCollectorName: nil,
}
)

Expand All @@ -72,13 +72,13 @@ type NewApp struct {

subspaces map[string]params.Subspace

accountKeeper auth.AccountKeeper
bankKeeper bank.Keeper
stakingKeeper staking.Keeper
supplyKeeper supply.Keeper
paramsKeeper params.Keeper
accountKeeper auth.AccountKeeper
bankKeeper bank.Keeper
poaKeeper poakeeper.Keeper
supplyKeeper supply.Keeper
paramsKeeper params.Keeper
authchainKeeper authchainkeeper.Keeper
// this line is used by starport scaffolding # 3
// this line is used by starport scaffolding # 3
mm *module.Manager

sm *module.SimulationManager
Expand All @@ -97,16 +97,16 @@ func NewInitApp(
bApp.SetAppVersion(version.Version)

keys := sdk.NewKVStoreKeys(
bam.MainStoreKey,
auth.StoreKey,
staking.StoreKey,
bam.MainStoreKey,
auth.StoreKey,
poatypes.StoreKey,
supply.StoreKey,
params.StoreKey,
authchaintypes.StoreKey,
// this line is used by starport scaffolding # 5
)
params.StoreKey,
authchaintypes.StoreKey,
// this line is used by starport scaffolding # 5
)

tKeys := sdk.NewTransientStoreKeys(staking.TStoreKey, params.TStoreKey)
tKeys := sdk.NewTransientStoreKeys(params.TStoreKey)

var app = &NewApp{
BaseApp: bApp,
Expand All @@ -120,7 +120,7 @@ func NewInitApp(
app.paramsKeeper = params.NewKeeper(app.cdc, keys[params.StoreKey], tKeys[params.TStoreKey])
app.subspaces[auth.ModuleName] = app.paramsKeeper.Subspace(auth.DefaultParamspace)
app.subspaces[bank.ModuleName] = app.paramsKeeper.Subspace(bank.DefaultParamspace)
app.subspaces[staking.ModuleName] = app.paramsKeeper.Subspace(staking.DefaultParamspace)
app.subspaces[poatypes.ModuleName] = app.paramsKeeper.Subspace(poakeeper.DefaultParamspace)

app.accountKeeper = auth.NewAccountKeeper(
app.cdc,
Expand All @@ -143,15 +143,11 @@ func NewInitApp(
maccPerms,
)

stakingKeeper := staking.NewKeeper(
app.poaKeeper = poakeeper.NewKeeper(
app.bankKeeper,
app.cdc,
keys[staking.StoreKey],
app.supplyKeeper,
app.subspaces[staking.ModuleName],
)

app.stakingKeeper = *stakingKeeper.SetHooks(
staking.NewMultiStakingHooks(),
keys[authchaintypes.StoreKey],
app.subspaces[poatypes.ModuleName],
)

app.authchainKeeper = authchainkeeper.NewKeeper(
Expand All @@ -160,28 +156,30 @@ func NewInitApp(
keys[authchaintypes.StoreKey],
)

// this line is used by starport scaffolding # 4
// this line is used by starport scaffolding # 4

app.mm = module.NewManager(
genutil.NewAppModule(app.accountKeeper, app.stakingKeeper, app.BaseApp.DeliverTx),
genutil.NewAppModule(app.accountKeeper, app.poaKeeper, app.BaseApp.DeliverTx),
auth.NewAppModule(app.accountKeeper),
bank.NewAppModule(app.bankKeeper, app.accountKeeper),
supply.NewAppModule(app.supplyKeeper, app.accountKeeper),
authchain.NewAppModule(app.authchainKeeper, app.bankKeeper),
staking.NewAppModule(app.stakingKeeper, app.accountKeeper, app.supplyKeeper),
// this line is used by starport scaffolding # 6
poa.NewAppModule(app.poaKeeper, app.bankKeeper),
// this line is used by starport scaffolding # 6
)

app.mm.SetOrderEndBlockers(staking.ModuleName)
app.mm.SetOrderEndBlockers(poatypes.ModuleName)

genutil.ModuleCdc = app.cdc

app.mm.SetOrderInitGenesis(
staking.ModuleName,
poatypes.ModuleName,
auth.ModuleName,
bank.ModuleName,
authchaintypes.ModuleName,
supply.ModuleName,
genutil.ModuleName,
// this line is used by starport scaffolding # 7
// this line is used by starport scaffolding # 7
)

app.mm.RegisterRoutes(app.Router(), app.QueryRouter())
Expand Down
78 changes: 1 addition & 77 deletions demo-apps/auth-chain/app/export.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,12 @@ package app

import (
"encoding/json"
"log"

abci "github.com/tendermint/tendermint/abci/types"
tmtypes "github.com/tendermint/tendermint/types"

"github.com/cosmos/cosmos-sdk/codec"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/x/staking"
)

// ExportAppStateAndValidators exports the state of the application for a genesis
Expand All @@ -31,86 +29,12 @@ func (app *NewApp) ExportAppStateAndValidators(
return nil, nil, err
}

validators = staking.WriteValidators(ctx, app.stakingKeeper)
return appState, validators, nil
}

// prepare for fresh start at zero height
// NOTE zero height genesis is a temporary feature which will be deprecated
// in favour of export at a block height
func (app *NewApp) prepForZeroHeightGenesis(ctx sdk.Context, jailWhiteList []string) {
applyWhiteList := false

//Check if there is a whitelist
if len(jailWhiteList) > 0 {
applyWhiteList = true
}

whiteListMap := make(map[string]bool)

for _, addr := range jailWhiteList {
_, err := sdk.ValAddressFromBech32(addr)
if err != nil {
log.Fatal(err)
}
whiteListMap[addr] = true
}

// set context height to zero
height := ctx.BlockHeight()
ctx = ctx.WithBlockHeight(0)

// reinitialize all validators
app.stakingKeeper.IterateValidators(ctx, func(_ int64, val staking.ValidatorI) (stop bool) {
return false
})

// reset context height
ctx = ctx.WithBlockHeight(height)

/* Handle staking state. */

// iterate through redelegations, reset creation height
app.stakingKeeper.IterateRedelegations(ctx, func(_ int64, red staking.Redelegation) (stop bool) {
for i := range red.Entries {
red.Entries[i].CreationHeight = 0
}
app.stakingKeeper.SetRedelegation(ctx, red)
return false
})

// iterate through unbonding delegations, reset creation height
app.stakingKeeper.IterateUnbondingDelegations(ctx, func(_ int64, ubd staking.UnbondingDelegation) (stop bool) {
for i := range ubd.Entries {
ubd.Entries[i].CreationHeight = 0
}
app.stakingKeeper.SetUnbondingDelegation(ctx, ubd)
return false
})

// Iterate through validators by power descending, reset bond heights, and
// update bond intra-tx counters.
store := ctx.KVStore(app.keys[staking.StoreKey])
iter := sdk.KVStoreReversePrefixIterator(store, staking.ValidatorsKey)
counter := int16(0)

for ; iter.Valid(); iter.Next() {
addr := sdk.ValAddress(iter.Key()[1:])
validator, found := app.stakingKeeper.GetValidator(ctx, addr)
if !found {
panic("expected validator, not found")
}

validator.UnbondingHeight = 0
if applyWhiteList && !whiteListMap[addr.String()] {
validator.Jailed = true
}

app.stakingKeeper.SetValidator(ctx, validator)
counter++
}

iter.Close()

_ = app.stakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx)
_ = app.poaKeeper.ApplyAndReturnValidatorSetUpdates(ctx)
}
9 changes: 5 additions & 4 deletions demo-apps/auth-chain/cmd/auth-chaind/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ import (

"github.com/allinbits/modules/demo-apps/auth-chain/app"

"github.com/allinbits/modules/x/poa"
poacli "github.com/allinbits/modules/x/poa/client/cli"
"github.com/cosmos/cosmos-sdk/baseapp"
"github.com/cosmos/cosmos-sdk/client/debug"
"github.com/cosmos/cosmos-sdk/client/flags"
Expand All @@ -23,7 +25,6 @@ import (
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/x/auth"
genutilcli "github.com/cosmos/cosmos-sdk/x/genutil/client/cli"
"github.com/cosmos/cosmos-sdk/x/staking"
)

const flagInvCheckPeriod = "inv-check-period"
Expand All @@ -44,11 +45,11 @@ func main() {
}

rootCmd.AddCommand(genutilcli.InitCmd(ctx, cdc, app.ModuleBasics, app.DefaultNodeHome))
rootCmd.AddCommand(genutilcli.CollectGenTxsCmd(ctx, cdc, auth.GenesisAccountIterator{}, app.DefaultNodeHome))
rootCmd.AddCommand(poacli.CollectGenTxsCmd(ctx, cdc, auth.GenesisAccountIterator{}, app.DefaultNodeHome))
rootCmd.AddCommand(genutilcli.MigrateGenesisCmd(ctx, cdc))
rootCmd.AddCommand(
genutilcli.GenTxCmd(
ctx, cdc, app.ModuleBasics, staking.AppModuleBasic{},
poacli.GenTxCmd(
ctx, cdc, app.ModuleBasics, poa.AppModuleBasic{},
auth.GenesisAccountIterator{}, app.DefaultNodeHome, app.DefaultCLIHome,
),
)
Expand Down
8 changes: 5 additions & 3 deletions demo-apps/auth-chain/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,19 @@ module github.com/allinbits/modules/demo-apps/auth-chain
go 1.15

require (
github.com/allinbits/modules/poa v0.0.0-20201006081502-d144cbfb0613
github.com/allinbits/modules/x/poa v0.0.0-20201009193500-337b33a517b1
github.com/cosmos/cosmos-sdk v0.39.1
github.com/golang/mock v1.4.3 // indirect
github.com/google/uuid v1.0.0
github.com/gorilla/mux v1.7.4
github.com/gorilla/mux v1.8.0
github.com/onsi/ginkgo v1.8.0 // indirect
github.com/onsi/gomega v1.5.0 // indirect
github.com/spf13/afero v1.2.2 // indirect
github.com/spf13/cobra v1.0.0
github.com/spf13/viper v1.7.0
github.com/spf13/viper v1.7.1
github.com/tendermint/go-amino v0.15.1
github.com/tendermint/tendermint v0.33.6
github.com/tendermint/tendermint v0.33.7
github.com/tendermint/tm-db v0.5.1
golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2 // indirect
)
16 changes: 16 additions & 0 deletions demo-apps/auth-chain/go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,12 @@ github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuy
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/allinbits/modules v0.0.0-20201006081502-d144cbfb0613 h1:x4TsoEyAtoL2o9h+RBZILevutOXQT2E0ryKNcWRl3JQ=
github.com/allinbits/modules v0.0.0-20201008171309-338f3edb758b h1:J97r6dFwbW1L1QWxWovBPHd1WTE0Lbgg/x/KZeGCT58=
github.com/allinbits/modules/poa v0.0.0-20201006081502-d144cbfb0613 h1:UNhTZEpGpI1ihFe7ajf5fug08zcOFn6tYMXiEMN/b9g=
github.com/allinbits/modules/poa v0.0.0-20201006081502-d144cbfb0613/go.mod h1:zJs4nxx0cK3cvrVq13lHtmvwCYw8yPPD78io/Pi1+xU=
github.com/allinbits/modules/x/poa v0.0.0-20201009193500-337b33a517b1 h1:t4yY0spGDLQYmgk9FOIDaqU3AiJ7UcXwcfo/vbWnueI=
github.com/allinbits/modules/x/poa v0.0.0-20201009193500-337b33a517b1/go.mod h1:E6F888iR9HZbtMansKFQXAPo9JXz3JcEgSvmaEVZqdM=
github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
Expand Down Expand Up @@ -87,6 +93,8 @@ github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfc
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
github.com/cosmos/cosmos-sdk v0.39.0 h1:lWZQLFxLYQ4ydD01cDZF7tRF8IN2xclDmoNPIJ5Kw44=
github.com/cosmos/cosmos-sdk v0.39.0/go.mod h1:3iKiqnQ48T0UG4IDw9EM8utQSwItutLUkmGkRSWpS5U=
github.com/cosmos/cosmos-sdk v0.39.1 h1:vhjf9PZh9ph8btAj9aBpHoVITgVVjNBpM3x5Gl/Vwac=
github.com/cosmos/cosmos-sdk v0.39.1/go.mod h1:ry2ROl5n+f2/QXpKJo3rdWNJwll00z7KhIVcxNcl16M=
github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d h1:49RLWk1j44Xu4fjHb6JFYmeUnDORVwHNkDxaQ0ctCVU=
github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y=
github.com/cosmos/ledger-cosmos-go v0.11.1 h1:9JIYsGnXP613pb2vPjFeMMjBI5lEDsEaF6oYorTy6J4=
Expand Down Expand Up @@ -196,10 +204,14 @@ github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5m
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
github.com/gorilla/handlers v1.4.2 h1:0QniY0USkHQ1RGCLfKxeNHK9bkDHGRYGNDFBCS+YARg=
github.com/gorilla/handlers v1.4.2/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ=
github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
github.com/gorilla/mux v1.7.4 h1:VuZ8uybHlWmqV03+zRzdwKL4tUnIp1MAQtp1mIFE1bc=
github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=
github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
Expand Down Expand Up @@ -427,6 +439,8 @@ github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/y
github.com/spf13/viper v1.6.3/go.mod h1:jUMtyi0/lB5yZH/FjyGAoH7IMNrIhlBf6pXZmbMDvzw=
github.com/spf13/viper v1.7.0 h1:xVKxvI7ouOI5I+U9s2eeiUfMaWBVoXA3AWskkrqK0VM=
github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
github.com/spf13/viper v1.7.1 h1:pM5oEahlgWv/WnHXpgbKz7iLIxRf65tye2Ci+XFK5sk=
github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI=
Expand Down Expand Up @@ -458,6 +472,8 @@ github.com/tendermint/iavl v0.14.0/go.mod h1:QmfViflFiXzxKLQE4tAUuWQHq+RSuQFxabl
github.com/tendermint/tendermint v0.33.5/go.mod h1:0yUs9eIuuDq07nQql9BmI30FtYGcEC60Tu5JzB5IezM=
github.com/tendermint/tendermint v0.33.6 h1:W4UOsXY4ROJZ3TLLGVVv71VXD4WK2gJRb3gzeced+mg=
github.com/tendermint/tendermint v0.33.6/go.mod h1:0yUs9eIuuDq07nQql9BmI30FtYGcEC60Tu5JzB5IezM=
github.com/tendermint/tendermint v0.33.7 h1:b5CQD8ggDtl4u0EbXzabi0MaOw9NrcXker6ijEkAE74=
github.com/tendermint/tendermint v0.33.7/go.mod h1:0yUs9eIuuDq07nQql9BmI30FtYGcEC60Tu5JzB5IezM=
github.com/tendermint/tm-db v0.5.1 h1:H9HDq8UEA7Eeg13kdYckkgwwkQLBnJGgX4PgLJRhieY=
github.com/tendermint/tm-db v0.5.1/go.mod h1:g92zWjHpCYlEvQXvy9M168Su8V1IBEeawpXVVBaK4f4=
github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
Expand Down