2018-05-25 13:46:33 +00:00
package main
import (
"encoding/json"
2020-12-02 17:37:11 +00:00
"fmt"
2018-08-14 22:13:54 +00:00
"io"
2018-05-25 13:46:33 +00:00
"github.com/spf13/cobra"
2018-08-14 22:13:54 +00:00
"github.com/spf13/viper"
2018-05-25 13:46:33 +00:00
2020-04-30 14:23:41 +00:00
dbm "github.com/tendermint/tm-db"
2018-08-14 22:13:54 +00:00
abci "github.com/tendermint/tendermint/abci/types"
"github.com/tendermint/tendermint/libs/cli"
"github.com/tendermint/tendermint/libs/log"
2018-06-16 21:34:07 +00:00
tmtypes "github.com/tendermint/tendermint/types"
2018-05-25 13:46:33 +00:00
2019-06-20 13:37:57 +00:00
"github.com/cosmos/cosmos-sdk/baseapp"
2020-04-23 16:35:58 +00:00
"github.com/cosmos/cosmos-sdk/client/flags"
2019-06-20 13:37:57 +00:00
"github.com/cosmos/cosmos-sdk/server"
"github.com/cosmos/cosmos-sdk/store"
sdk "github.com/cosmos/cosmos-sdk/types"
2020-02-13 00:49:32 +00:00
"github.com/cosmos/cosmos-sdk/x/auth"
2019-07-18 18:05:26 +00:00
genutilcli "github.com/cosmos/cosmos-sdk/x/genutil/client/cli"
"github.com/cosmos/cosmos-sdk/x/staking"
2019-06-20 17:08:58 +00:00
"github.com/kava-labs/kava/app"
2020-06-03 19:35:00 +00:00
"github.com/kava-labs/kava/migrate"
2018-05-25 13:46:33 +00:00
)
2019-06-20 17:08:58 +00:00
// kvd custom flags
2020-12-02 17:37:11 +00:00
const (
flagInvCheckPeriod = "inv-check-period"
flagMempoolEnableAuth = "mempool.enable-authentication"
flagMempoolAuthAddresses = "mempool.authorized-addresses"
)
2019-06-07 11:59:19 +00:00
var invCheckPeriod uint
2018-05-25 13:46:33 +00:00
func main ( ) {
2019-06-07 11:59:19 +00:00
cdc := app . MakeCodec ( )
2018-08-14 22:13:54 +00:00
2019-06-07 11:59:19 +00:00
config := sdk . GetConfig ( )
2019-06-25 13:29:56 +00:00
app . SetBech32AddressPrefixes ( config )
2020-02-13 00:49:32 +00:00
app . SetBip44CoinType ( config )
2019-06-07 11:59:19 +00:00
config . Seal ( )
2018-05-25 13:46:33 +00:00
2019-06-07 11:59:19 +00:00
ctx := server . NewDefaultContext ( )
2018-08-14 22:13:54 +00:00
cobra . EnableCommandSorting = false
2018-05-25 13:46:33 +00:00
rootCmd := & cobra . Command {
2019-06-20 17:08:58 +00:00
Use : "kvd" ,
2019-06-20 17:28:21 +00:00
Short : "Kava Daemon (server)" ,
2020-09-16 19:16:14 +00:00
PersistentPreRunE : server . PersistentPreRunEFn ( ctx ) ,
2018-05-25 13:46:33 +00:00
}
2020-05-07 20:34:05 +00:00
rootCmd . AddCommand (
genutilcli . InitCmd ( ctx , cdc , app . ModuleBasics , app . DefaultNodeHome ) ,
genutilcli . CollectGenTxsCmd ( ctx , cdc , auth . GenesisAccountIterator { } , app . DefaultNodeHome ) ,
2020-06-03 19:35:00 +00:00
migrate . MigrateGenesisCmd ( ctx , cdc ) ,
2020-05-07 20:34:05 +00:00
genutilcli . GenTxCmd (
ctx ,
cdc ,
app . ModuleBasics ,
staking . AppModuleBasic { } ,
auth . GenesisAccountIterator { } ,
app . DefaultNodeHome ,
app . DefaultCLIHome ) ,
genutilcli . ValidateGenesisCmd ( ctx , cdc , app . ModuleBasics ) ,
AddGenesisAccountCmd ( ctx , cdc , app . DefaultNodeHome , app . DefaultCLIHome ) ,
2020-06-12 01:40:46 +00:00
testnetCmd ( ctx , cdc , app . ModuleBasics , auth . GenesisAccountIterator { } ) ,
2020-05-07 20:34:05 +00:00
flags . NewCompletionCmd ( rootCmd , true ) ,
)
2019-06-07 11:59:19 +00:00
server . AddCommands ( ctx , cdc , rootCmd , newApp , exportAppStateAndTMValidators )
// prepare and add flags
2019-07-18 18:05:26 +00:00
executor := cli . PrepareBaseCmd ( rootCmd , "KA" , app . DefaultNodeHome )
2019-06-07 11:59:19 +00:00
rootCmd . PersistentFlags ( ) . UintVar ( & invCheckPeriod , flagInvCheckPeriod ,
0 , "Assert registered invariants every N blocks" )
2020-12-02 17:37:11 +00:00
startCmd , _ , err := rootCmd . Find ( [ ] string { "start" } )
if err != nil {
panic ( fmt . Sprintf ( "could not find 'start' command on root command: %s" , err ) )
}
startCmd . Flags ( ) . Bool ( flagMempoolEnableAuth , false , "Configure the mempool to only accept transactions from authorized addresses" )
err = viper . BindPFlag ( flagMempoolEnableAuth , startCmd . Flags ( ) . Lookup ( flagMempoolEnableAuth ) )
if err != nil {
panic ( fmt . Sprintf ( "failed to bind flag: %s" , err ) )
}
startCmd . Flags ( ) . StringSlice ( flagMempoolAuthAddresses , [ ] string { } , "Additional addresses to accept transactions from when the mempool is running in authorized mode (comma separated kava addresses)" )
err = viper . BindPFlag ( flagMempoolAuthAddresses , startCmd . Flags ( ) . Lookup ( flagMempoolAuthAddresses ) )
if err != nil {
panic ( fmt . Sprintf ( "failed to bind flag: %s" , err ) )
}
// run main command
err = executor . Execute ( )
2018-08-14 22:13:54 +00:00
if err != nil {
panic ( err )
}
2018-05-25 13:46:33 +00:00
}
2018-08-14 22:13:54 +00:00
func newApp ( logger log . Logger , db dbm . DB , traceStore io . Writer ) abci . Application {
2019-09-11 22:42:35 +00:00
var cache sdk . MultiStorePersistentCache
if viper . GetBool ( server . FlagInterBlockCache ) {
cache = store . NewCommitKVStoreCacheManager ( )
}
2020-05-07 20:34:05 +00:00
skipUpgradeHeights := make ( map [ int64 ] bool )
for _ , h := range viper . GetIntSlice ( server . FlagUnsafeSkipUpgrades ) {
skipUpgradeHeights [ int64 ( h ) ] = true
}
2020-09-16 19:16:14 +00:00
pruningOpts , err := server . GetPruningOptionsFromFlags ( )
if err != nil {
panic ( err )
}
2020-12-02 17:37:11 +00:00
mempoolEnableAuth := viper . GetBool ( flagMempoolEnableAuth )
mempoolAuthAddresses , err := accAddressesFromBech32 ( viper . GetStringSlice ( flagMempoolAuthAddresses ) ... )
if err != nil {
panic ( fmt . Sprintf ( "could not get authorized address from config: %v" , err ) )
}
2019-06-20 17:02:29 +00:00
return app . NewApp (
2020-12-02 17:37:11 +00:00
logger , db , traceStore ,
app . AppOptions {
SkipLoadLatest : false ,
SkipUpgradeHeights : skipUpgradeHeights ,
InvariantCheckPeriod : invCheckPeriod ,
MempoolEnableAuth : mempoolEnableAuth ,
MempoolAuthAddresses : mempoolAuthAddresses ,
} ,
2020-09-16 19:16:14 +00:00
baseapp . SetPruning ( pruningOpts ) ,
2019-06-07 11:59:19 +00:00
baseapp . SetMinGasPrices ( viper . GetString ( server . FlagMinGasPrices ) ) ,
2019-09-11 22:42:35 +00:00
baseapp . SetHaltHeight ( viper . GetUint64 ( server . FlagHaltHeight ) ) ,
baseapp . SetHaltTime ( viper . GetUint64 ( server . FlagHaltTime ) ) ,
baseapp . SetInterBlockCache ( cache ) ,
2019-06-07 11:59:19 +00:00
)
2018-10-02 22:50:49 +00:00
}
2019-06-07 11:59:19 +00:00
func exportAppStateAndTMValidators (
logger log . Logger , db dbm . DB , traceStore io . Writer , height int64 , forZeroHeight bool , jailWhiteList [ ] string ,
) ( json . RawMessage , [ ] tmtypes . GenesisValidator , error ) {
2018-10-02 22:50:49 +00:00
2019-06-07 11:59:19 +00:00
if height != - 1 {
2020-12-02 17:37:11 +00:00
opts := app . AppOptions {
SkipLoadLatest : true ,
InvariantCheckPeriod : uint ( 1 ) ,
}
tempApp := app . NewApp ( logger , db , traceStore , opts )
2019-07-18 18:05:26 +00:00
err := tempApp . LoadHeight ( height )
2019-06-07 11:59:19 +00:00
if err != nil {
return nil , nil , err
2018-10-02 22:50:49 +00:00
}
2019-07-18 18:05:26 +00:00
return tempApp . ExportAppStateAndValidators ( forZeroHeight , jailWhiteList )
2018-10-03 17:11:13 +00:00
}
2020-12-02 17:37:11 +00:00
opts := app . AppOptions {
SkipLoadLatest : false ,
InvariantCheckPeriod : uint ( 1 ) ,
}
tempApp := app . NewApp ( logger , db , traceStore , opts )
2019-07-18 18:05:26 +00:00
return tempApp . ExportAppStateAndValidators ( forZeroHeight , jailWhiteList )
2018-10-03 17:11:13 +00:00
}
2020-12-02 17:37:11 +00:00
func accAddressesFromBech32 ( addresses ... string ) ( [ ] sdk . AccAddress , error ) {
var decodedAddresses [ ] sdk . AccAddress
for _ , s := range addresses {
a , err := sdk . AccAddressFromBech32 ( s )
if err != nil {
return nil , err
}
decodedAddresses = append ( decodedAddresses , a )
}
return decodedAddresses , nil
}