mirror of
https://github.com/0glabs/0g-chain.git
synced 2024-12-24 15:25:18 +00:00
fix: use correct committee params (#640)
This commit is contained in:
parent
a53fbc354a
commit
dbb8f387f9
@ -17,9 +17,7 @@ import (
|
||||
|
||||
"github.com/cosmos/cosmos-sdk/baseapp"
|
||||
"github.com/cosmos/cosmos-sdk/client/flags"
|
||||
"github.com/cosmos/cosmos-sdk/codec"
|
||||
"github.com/cosmos/cosmos-sdk/server"
|
||||
srvconfig "github.com/cosmos/cosmos-sdk/server/config"
|
||||
"github.com/cosmos/cosmos-sdk/store"
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
"github.com/cosmos/cosmos-sdk/x/auth"
|
||||
@ -27,7 +25,6 @@ import (
|
||||
"github.com/cosmos/cosmos-sdk/x/staking"
|
||||
|
||||
"github.com/kava-labs/kava/app"
|
||||
kava3 "github.com/kava-labs/kava/contrib/kava-3"
|
||||
"github.com/kava-labs/kava/migrate"
|
||||
)
|
||||
|
||||
@ -56,7 +53,6 @@ func main() {
|
||||
genutilcli.InitCmd(ctx, cdc, app.ModuleBasics, app.DefaultNodeHome),
|
||||
genutilcli.CollectGenTxsCmd(ctx, cdc, auth.GenesisAccountIterator{}, app.DefaultNodeHome),
|
||||
migrate.MigrateGenesisCmd(ctx, cdc),
|
||||
writeParamsAndConfigCmd(cdc),
|
||||
genutilcli.GenTxCmd(
|
||||
ctx,
|
||||
cdc,
|
||||
@ -144,33 +140,3 @@ func persistentPreRunEFn(ctx *server.Context) func(*cobra.Command, []string) err
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
// writeParamsAndConfigCmd patches the write-params cmd to additionally update the app pruning config.
|
||||
func writeParamsAndConfigCmd(cdc *codec.Codec) *cobra.Command {
|
||||
cmd := kava3.WriteGenesisParamsCmd(cdc)
|
||||
originalFunc := cmd.RunE
|
||||
|
||||
wrappedFunc := func(cmd *cobra.Command, args []string) error {
|
||||
|
||||
if err := originalFunc(cmd, args); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// fetch the app config from viper
|
||||
cfg, err := srvconfig.ParseConfig()
|
||||
if err != nil {
|
||||
return nil // don't return errors since as failures aren't critical
|
||||
}
|
||||
// don't prune any state, ie store everything
|
||||
cfg.Pruning = store.PruningStrategyNothing
|
||||
// write updated config
|
||||
if viper.ConfigFileUsed() == "" {
|
||||
return nil
|
||||
}
|
||||
srvconfig.WriteConfigFile(viper.ConfigFileUsed(), cfg)
|
||||
return nil
|
||||
}
|
||||
|
||||
cmd.RunE = wrappedFunc
|
||||
return cmd
|
||||
}
|
||||
|
@ -1,77 +0,0 @@
|
||||
package kava3
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/spf13/cobra"
|
||||
tmtypes "github.com/tendermint/tendermint/types"
|
||||
|
||||
"github.com/cosmos/cosmos-sdk/codec"
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
"github.com/cosmos/cosmos-sdk/version"
|
||||
)
|
||||
|
||||
const (
|
||||
defaultChainID = "kava-3"
|
||||
defaultGenesisTime = "2020-06-01T14:00:00Z"
|
||||
flagGenesisTime = "genesis-time"
|
||||
flagChainID = "chain-id"
|
||||
)
|
||||
|
||||
// WriteGenesisParamsCmd returns a command to write suggested kava-3 params to a genesis file.
|
||||
func WriteGenesisParamsCmd(cdc *codec.Codec) *cobra.Command {
|
||||
cmd := &cobra.Command{
|
||||
Use: "write-params [genesis-file]",
|
||||
Short: "Write suggested params to a genesis file",
|
||||
Long: "Write suggested module parameters to a gensis file, sort it, and print to STDOUT.",
|
||||
Example: fmt.Sprintf(`%s write-params /path/to/genesis.json`, version.ServerName),
|
||||
Args: cobra.ExactArgs(1),
|
||||
RunE: func(cmd *cobra.Command, args []string) error {
|
||||
|
||||
// Unmarshal existing genesis.json
|
||||
|
||||
importGenesis := args[0]
|
||||
genDoc, err := tmtypes.GenesisDocFromFile(importGenesis)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to read genesis doc from file %s: %w", importGenesis, err)
|
||||
}
|
||||
|
||||
// Unmarshal flags
|
||||
|
||||
chainID := cmd.Flag(flagChainID).Value.String()
|
||||
genesisTime := cmd.Flag(flagGenesisTime).Value.String()
|
||||
var parsedGenesisTime time.Time
|
||||
if err := parsedGenesisTime.UnmarshalText([]byte(genesisTime)); err != nil {
|
||||
return fmt.Errorf("failed to unmarshal genesis time: %w", err)
|
||||
}
|
||||
|
||||
// Write new params to the genesis file
|
||||
|
||||
newGenDoc, err := AddSuggestedParams(cdc, *genDoc, chainID, parsedGenesisTime)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to write params: %w", err)
|
||||
}
|
||||
|
||||
// Marshal output a new genesis file
|
||||
|
||||
bz, err := cdc.MarshalJSONIndent(newGenDoc, "", " ")
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to marshal genesis doc: %w", err)
|
||||
}
|
||||
sortedBz, err := sdk.SortJSON(bz)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to sort JSON genesis doc: %w", err)
|
||||
}
|
||||
|
||||
fmt.Println(string(sortedBz))
|
||||
|
||||
return nil
|
||||
},
|
||||
}
|
||||
|
||||
cmd.Flags().String(flagGenesisTime, defaultGenesisTime, "override genesis time")
|
||||
cmd.Flags().String(flagChainID, defaultChainID, "override chain-id")
|
||||
|
||||
return cmd
|
||||
}
|
@ -1,168 +0,0 @@
|
||||
# Kava-3 Upgrade Instructions
|
||||
|
||||
## Background
|
||||
|
||||
The version of Kava for kava-3 is __v0.8.x__. Kava-3 is scheduled to launch __June 10, 2020 at 14:00 UTC__
|
||||
|
||||
🚨 Please note that an issue with tendermint v0.33 has been found that affects the stability of nodes running with the default pruning strategy. Please see the [Pruning](#Pruning) section for full details and mitigation 🚨
|
||||
|
||||
Many changes have occurred in both the Kava software and the cosmos-sdk software since the launch of kava-2. The primary changes in Kava are the addition of modules that comprise the [CDP system](https://docs.kava.io/). To review cosmos-sdk changes, see the [changelog](https://github.com/cosmos/cosmos-sdk/blob/v0.38.4/CHANGELOG.md) and note that kava-3 is launching with __v0.38.4__ of the cosmos-sdk.
|
||||
|
||||
If you have technical questions or concerns, ask a developer or community member in the [Kava discord](https://discord.com/invite/kQzh3Uv).
|
||||
|
||||
### Risks
|
||||
|
||||
As a validator, performing the upgrade procedure on your consensus nodes carries a heightened risk of double-signing and being slashed. The most important piece of this procedure is verifying your software version and genesis file hash before starting your validator and signing.
|
||||
|
||||
The riskiest thing a validator can do is discover that they made a mistake and repeat the upgrade procedure again during the network startup. If you discover a mistake in the process, the best thing to do is wait for the network to start before correcting it. If the network is halted and you have started with a different genesis file than the expected one, seek advice from a Kava developer before resetting your validator.
|
||||
|
||||
### Pruning
|
||||
|
||||
kava-3 uses tendermint version 0.33. Recent testing in Game of Zones and Kava has shown that nodes which are running with the default or custom pruning strategy have a [memory leak](https://github.com/tendermint/iavl/issues/256) that can cause nodes to crash and lead to irrecoverable data loss. Until a patch is released, the __ONLY__ pruning strategies that are safe to run are `nothing` (an archival node, where nothing is deleted) or `everything` (only the most recent state is kept).
|
||||
|
||||
The pruning config is set in $HOME/.kvd/config/app.toml. Example safe configurations are:
|
||||
|
||||
```toml
|
||||
pruning = "nothing"
|
||||
```
|
||||
|
||||
and
|
||||
|
||||
```toml
|
||||
pruning = "everything"
|
||||
```
|
||||
|
||||
Exchange operators, data service providers, and other vendors who require access to historical state are recommended to run archival nodes (`pruning = "nothing"`). Other node operators can choose between a fully pruning node and archival node, with the main difference being increased storage required for archival nodes.
|
||||
|
||||
It is expected that a patch to tendermint will be released in a non-breaking manner and that nodes will be able to update seamlessly after the launch of kava-3.
|
||||
|
||||
### Recovery
|
||||
|
||||
Prior to exporting kava-2 state, validators are encouraged to take a full data snapshot at the export height before proceeding. Snapshotting depends heavily on infrastructure, but generally this can be done by backing up the .kvd and .kvcli directories.
|
||||
|
||||
It is critically important to back-up the .kvd/data/priv_validator_state.json file after stopping your kvd process. This file is updated every block as your validator participates in consensus rounds. It is a critical file needed to prevent double-signing, in case the upgrade fails and the previous chain needs to be restarted.
|
||||
|
||||
In the event that the upgrade does not succeed, validators and operators must downgrade back to v0.3.5 of the Kava software and restore to their latest snapshot before restarting their nodes.
|
||||
|
||||
## Upgrade Procedure
|
||||
|
||||
Set your node to produce the final block of kava-2 at __13:00__ UTC June 10th, 2020. To restart your node with that stop time,
|
||||
|
||||
```bash
|
||||
kvd start --halt-time 1591794000
|
||||
```
|
||||
|
||||
Note that the above command will not stop `kvd` from running, it merely stops proposal / validation for blocks after that time.Validators may safely exit by issuing `CTRL+C` if running as a process.
|
||||
|
||||
Kava developers will update this PR with the final block number when it is reached. __Make sure the kvd process is stopped before proceeding and that you have backed up your validator__. Failure to backup your validator could make it impossible to restart your node if the upgrade fails.
|
||||
|
||||
The following up steps assume the directory structure below: change filepaths, directory names as needed
|
||||
|
||||
```bash
|
||||
# Kvcli Folder
|
||||
~/.kvcli
|
||||
# Kvd Folder
|
||||
~/.kvd
|
||||
# Go Path
|
||||
~/go
|
||||
```
|
||||
|
||||
### Pre-Migration
|
||||
|
||||
1. Backup existing kava-2 .kvd and .kvcli
|
||||
```bash
|
||||
cp -R ~/.kvcli ~/.kvcli.bak
|
||||
cp -R ~/.kvd ~/.kvd.bak
|
||||
```
|
||||
|
||||
2. Backup existing kava-2 kvd and kvcli binaries (in case of rollback)
|
||||
```bash
|
||||
cp ~/go/bin/kvcli ~/go/bin/kvcli.bak
|
||||
cp ~/go/bin/kvd ~/go/bin/kvd.bak
|
||||
```
|
||||
|
||||
### Migration
|
||||
|
||||
We denote `(kava-2)kvd` as the previous client (0.3.5) to be used for commands e.g `(kava-2)kvd export` and `(kava-3)kvd` as the new client (0.8.1) to be used for commands.
|
||||
|
||||
1. Export state
|
||||
|
||||
- Ensure that all `kvd` processes have stopped running.
|
||||
|
||||
```bash
|
||||
(kava-2) kvd export --height 2598890 --for-zero-height > kava_2_exported.json
|
||||
# Check ShaSum for later reference
|
||||
$ jq -S -c -M '' kava_2_exported.json | shasum -a 256
|
||||
# Should return
|
||||
> 7b5ec6f003b3aaf0544e7490f2e383a3b0339ec4db372ce84e68992f018e20e6 -
|
||||
```
|
||||
|
||||
2. Update to kava-3
|
||||
|
||||
This will replace the `kvd` and `kvcli` binaries in your GOPATH.
|
||||
|
||||
```bash
|
||||
# in the `kava` folder
|
||||
git pull
|
||||
git checkout v0.8.1
|
||||
make install
|
||||
|
||||
# verify versions
|
||||
kvd version --long
|
||||
# name: kava
|
||||
# server_name: kvd
|
||||
# client_name: kvcli
|
||||
# version: 0.8.1
|
||||
# commit: 869189054d68d6ec3e6446156ea0a91eb45af09c
|
||||
# build_tags: netgo,ledger
|
||||
# go: go version go1.13.7 linux/amd64
|
||||
```
|
||||
|
||||
3. Migrate the kava-2 keys from previous key store to new key store
|
||||
|
||||
This will scan for any keys in `.kvcli` and produce new files ending in `kavaxxx.address` and `key_name.info` for the new keystore to access.
|
||||
|
||||
```bash
|
||||
# Migrate keys
|
||||
(kava-3) kvcli keys migrate
|
||||
```
|
||||
|
||||
4. Migrate the exported genesis state
|
||||
|
||||
```bash
|
||||
# Migrate genesis state
|
||||
(kava-3) kvd migrate kava_2_exported.json > kava_3_migrated.json
|
||||
# Check ShaSum for later reference
|
||||
$ jq -S -c -M '' kava_3_migrated.json | shasum -a 256
|
||||
# Should return
|
||||
> a7dcd440604a150a55a33e8cd22d7d1884d06ed4668e8090f6824755f4099325 -
|
||||
```
|
||||
|
||||
5. Write Params to genesis state and validate
|
||||
|
||||
```bash
|
||||
# Migrate parameters
|
||||
(kava-3) kvd write-params kava_3_migrated.json --chain-id kava-3 --genesis-time 2020-06-10T14:00:00Z > genesis.json
|
||||
# Check ShaSum for later reference
|
||||
# Note: jq must be installed
|
||||
# DO NOT WRITE THE JQ OUTPUT TO FILE. Use only for calculating the hash.
|
||||
$ jq -S -c -M '' genesis.json | shasum -a 256
|
||||
# Should return
|
||||
> f73628abfab82601c9af97a023d357a95507b9c630c5331564f48c4acab97b85 -
|
||||
# Verify output of genesis migration
|
||||
(kava-3) kvd validate-genesis genesis.json # should say it's valid
|
||||
```
|
||||
|
||||
6. Restart node with new kava-3 genesis state
|
||||
|
||||
```bash
|
||||
cp genesis.json ~/.kvd/config/genesis.json
|
||||
# Unsafe Reset All is a irreversible action that wipes on-chain data and prepares the chain for a start from genesis
|
||||
# If you have not backed up your previous kava-2 state, do not proceed.
|
||||
(kava-3) kvd unsafe-reset-all
|
||||
(kava-3) kvd start
|
||||
```
|
||||
|
||||
### Coordination
|
||||
|
||||
If the `kava-3` chain does not launch by June 10, 2020 at 16:00 UTC, the launch should be considered a failure. Validators should restore the state from `kava-2` and coordinate a relaunch. In the event of launch failure, coordination will occur in the [Kava discord](https://discord.com/invite/kQzh3Uv).
|
@ -1,424 +0,0 @@
|
||||
// kava3 contains the suggested genesis parameters for the kava-3 mainnet.
|
||||
package kava3
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
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/auth"
|
||||
"github.com/cosmos/cosmos-sdk/x/genutil"
|
||||
"github.com/cosmos/cosmos-sdk/x/supply"
|
||||
|
||||
"github.com/kava-labs/kava/x/auction"
|
||||
v0_8bep3 "github.com/kava-labs/kava/x/bep3/legacy/v0_9"
|
||||
"github.com/kava-labs/kava/x/cdp"
|
||||
"github.com/kava-labs/kava/x/committee"
|
||||
"github.com/kava-labs/kava/x/incentive"
|
||||
"github.com/kava-labs/kava/x/kavadist"
|
||||
"github.com/kava-labs/kava/x/pricefeed"
|
||||
)
|
||||
|
||||
const (
|
||||
kavaDenom = "ukava"
|
||||
bnbDenom = "bnb"
|
||||
usdxDenom = "usdx"
|
||||
referenceAsset = "usd"
|
||||
bnbSpotMarketID = bnbDenom + ":" + referenceAsset
|
||||
bnbLiquidationMarketID = bnbDenom + ":" + referenceAsset + ":" + "30"
|
||||
debtDenom = "debt"
|
||||
deputyAddressBech32 = "kava1r4v2zdhdalfj2ydazallqvrus9fkphmglhn6u6" // Binance deputy address
|
||||
)
|
||||
|
||||
func AddSuggestedParams(cdc *codec.Codec, genDoc tmtypes.GenesisDoc, chainID string, genesisTime time.Time) (tmtypes.GenesisDoc, error) {
|
||||
|
||||
// Add tendermint params
|
||||
|
||||
genDoc.ChainID = chainID
|
||||
genDoc.GenesisTime = genesisTime
|
||||
|
||||
// Add app params
|
||||
|
||||
var appState genutil.AppMap
|
||||
if err := cdc.UnmarshalJSON(genDoc.AppState, &appState); err != nil {
|
||||
return tmtypes.GenesisDoc{}, err
|
||||
}
|
||||
|
||||
addAuctionState(cdc, appState)
|
||||
addBep3DeputyAccount(cdc, appState)
|
||||
addBep3State(cdc, appState)
|
||||
addCDPState(cdc, appState)
|
||||
addCommitteeState(cdc, appState)
|
||||
addIncentiveState(cdc, appState)
|
||||
addKavaDistState(cdc, appState)
|
||||
addPricefeedState(cdc, appState)
|
||||
|
||||
marshaledAppState, err := cdc.MarshalJSON(appState)
|
||||
if err != nil {
|
||||
return tmtypes.GenesisDoc{}, err
|
||||
}
|
||||
genDoc.AppState = marshaledAppState
|
||||
|
||||
return genDoc, nil
|
||||
}
|
||||
|
||||
func addBep3DeputyAccount(cdc *codec.Codec, appState genutil.AppMap) {
|
||||
deputyCoins := sdk.NewCoins(sdk.NewInt64Coin(bnbDenom, 350_000_000_000_000))
|
||||
|
||||
// 1) Add account
|
||||
var authGenState auth.GenesisState
|
||||
cdc.MustUnmarshalJSON(appState[auth.ModuleName], &authGenState)
|
||||
|
||||
authGenState.Accounts = append(
|
||||
authGenState.Accounts,
|
||||
auth.NewBaseAccount(
|
||||
mustAccAddressFromBech32(deputyAddressBech32),
|
||||
deputyCoins,
|
||||
nil, // pubkey is nil for new accounts, it's set when the account first sends a tx
|
||||
0, // account numbers are reset on auth.InitGenesis, so this value doesn't matter
|
||||
0, // sequence number starts at 0
|
||||
),
|
||||
)
|
||||
appState[auth.ModuleName] = cdc.MustMarshalJSON(authGenState)
|
||||
|
||||
// 2) Update total supply
|
||||
var supplyGenState supply.GenesisState
|
||||
cdc.MustUnmarshalJSON(appState[supply.ModuleName], &supplyGenState)
|
||||
|
||||
supplyGenState.Supply = supplyGenState.Supply.Add(deputyCoins...)
|
||||
|
||||
appState[supply.ModuleName] = cdc.MustMarshalJSON(supplyGenState)
|
||||
}
|
||||
|
||||
func addAuctionState(cdc *codec.Codec, appState genutil.AppMap) {
|
||||
appState[auction.ModuleName] = cdc.MustMarshalJSON(auction.NewGenesisState(
|
||||
auction.DefaultNextAuctionID,
|
||||
auction.NewParams(
|
||||
24*time.Hour,
|
||||
8*time.Hour,
|
||||
sdk.MustNewDecFromStr("0.01"),
|
||||
sdk.MustNewDecFromStr("0.01"),
|
||||
sdk.MustNewDecFromStr("0.01"),
|
||||
),
|
||||
auction.GenesisAuctions{},
|
||||
))
|
||||
}
|
||||
|
||||
func addBep3State(cdc *codec.Codec, appState genutil.AppMap) {
|
||||
appState[v0_8bep3.ModuleName] = cdc.MustMarshalJSON(v0_8bep3.NewGenesisState(
|
||||
v0_8bep3.NewParams(
|
||||
mustAccAddressFromBech32(deputyAddressBech32),
|
||||
v0_8bep3.DefaultBnbDeputyFixedFee,
|
||||
v0_8bep3.DefaultMinAmount,
|
||||
v0_8bep3.DefaultMaxAmount,
|
||||
v0_8bep3.DefaultMinBlockLock,
|
||||
v0_8bep3.DefaultMaxBlockLock,
|
||||
v0_8bep3.AssetParams{{
|
||||
Denom: bnbDenom,
|
||||
CoinID: 714,
|
||||
Limit: sdk.NewInt(4_000_000_000_000),
|
||||
Active: true,
|
||||
}},
|
||||
),
|
||||
v0_8bep3.AtomicSwaps{},
|
||||
v0_8bep3.AssetSupplies{},
|
||||
))
|
||||
}
|
||||
|
||||
func addCDPState(cdc *codec.Codec, appState genutil.AppMap) {
|
||||
appState[cdp.ModuleName] = cdc.MustMarshalJSON(cdp.NewGenesisState(
|
||||
cdp.NewParams(
|
||||
sdk.NewInt64Coin(usdxDenom, 100_000_000_000),
|
||||
cdp.CollateralParams{{
|
||||
Denom: bnbDenom,
|
||||
LiquidationRatio: sdk.MustNewDecFromStr("1.5"),
|
||||
DebtLimit: sdk.NewInt64Coin(usdxDenom, 100_000_000_000),
|
||||
StabilityFee: sdk.MustNewDecFromStr("1.000000001547125958"), // %5 apr
|
||||
LiquidationPenalty: sdk.MustNewDecFromStr("0.075"),
|
||||
AuctionSize: sdk.NewInt(50_000_000_000),
|
||||
Prefix: 0x20,
|
||||
ConversionFactor: sdk.NewInt(8),
|
||||
SpotMarketID: bnbSpotMarketID,
|
||||
LiquidationMarketID: bnbLiquidationMarketID,
|
||||
}},
|
||||
cdp.DebtParam{
|
||||
Denom: usdxDenom,
|
||||
ReferenceAsset: referenceAsset,
|
||||
ConversionFactor: sdk.NewInt(6),
|
||||
DebtFloor: sdk.NewInt(10_000_000),
|
||||
SavingsRate: sdk.MustNewDecFromStr("0.9"),
|
||||
},
|
||||
// below values are usdx coin amounts
|
||||
sdk.NewInt(200_000_000_000), // surplusThreshold
|
||||
sdk.NewInt(10_000_000_000), // surplusLot
|
||||
sdk.NewInt(50_000_000_000), // debtThreshold
|
||||
sdk.NewInt(10_000_000_000), // debtLot
|
||||
24*time.Hour,
|
||||
false,
|
||||
),
|
||||
cdp.CDPs{},
|
||||
cdp.Deposits{},
|
||||
cdp.DefaultCdpStartingID,
|
||||
debtDenom,
|
||||
kavaDenom,
|
||||
cdp.DefaultPreviousDistributionTime,
|
||||
))
|
||||
}
|
||||
|
||||
func addCommitteeState(cdc *codec.Codec, appState genutil.AppMap) {
|
||||
appState[committee.ModuleName] = cdc.MustMarshalJSON(committee.NewGenesisState(
|
||||
committee.DefaultNextProposalID,
|
||||
[]committee.Committee{
|
||||
committee.NewCommittee(
|
||||
1,
|
||||
"Kava Stability Committee",
|
||||
[]sdk.AccAddress{
|
||||
// addresses from governance proposal: https://ipfs.io/ipfs/QmSiQexKNixztPgLCe2cRSJ8ZLRjetRgzHPDTuBRCm9DZb/committee-nominations.pdf
|
||||
mustAccAddressFromBech32("kava1gru35up50ql2wxhegr880qy6ynl63ujlv8gum2"),
|
||||
mustAccAddressFromBech32("kava1sc3mh3pkas5e7xd269am4xm5mp6zweyzmhjagj"),
|
||||
mustAccAddressFromBech32("kava1c9ye54e3pzwm3e0zpdlel6pnavrj9qqv6e8r4h"),
|
||||
mustAccAddressFromBech32("kava1m7p6sjqrz6mylz776ct48wj6lpnpcd0z82209d"),
|
||||
mustAccAddressFromBech32("kava1a9pmkzk570egv3sflu3uwdf3gejl7qfy9hghzl"),
|
||||
},
|
||||
[]committee.Permission{
|
||||
committee.SubParamChangePermission{
|
||||
AllowedParams: committee.AllowedParams{
|
||||
{
|
||||
Subspace: auction.ModuleName,
|
||||
Key: string(auction.KeyBidDuration),
|
||||
},
|
||||
{
|
||||
Subspace: auction.ModuleName,
|
||||
Key: string(auction.KeyIncrementSurplus),
|
||||
},
|
||||
{
|
||||
Subspace: auction.ModuleName,
|
||||
Key: string(auction.KeyIncrementDebt),
|
||||
},
|
||||
{
|
||||
Subspace: auction.ModuleName,
|
||||
Key: string(auction.KeyIncrementCollateral),
|
||||
},
|
||||
{
|
||||
Subspace: v0_8bep3.ModuleName,
|
||||
Key: string(v0_8bep3.KeySupportedAssets),
|
||||
},
|
||||
{
|
||||
Subspace: cdp.ModuleName,
|
||||
Key: string(cdp.KeyGlobalDebtLimit),
|
||||
},
|
||||
{
|
||||
Subspace: cdp.ModuleName,
|
||||
Key: string(cdp.KeySurplusThreshold),
|
||||
},
|
||||
{
|
||||
Subspace: cdp.ModuleName,
|
||||
Key: string(cdp.KeySurplusLot),
|
||||
},
|
||||
{
|
||||
Subspace: cdp.ModuleName,
|
||||
Key: string(cdp.KeyDebtThreshold),
|
||||
},
|
||||
{
|
||||
Subspace: cdp.ModuleName,
|
||||
Key: string(cdp.KeyDebtLot),
|
||||
},
|
||||
{
|
||||
Subspace: cdp.ModuleName,
|
||||
Key: string(cdp.KeyDistributionFrequency),
|
||||
},
|
||||
{
|
||||
Subspace: cdp.ModuleName,
|
||||
Key: string(cdp.KeyCollateralParams),
|
||||
},
|
||||
{
|
||||
Subspace: cdp.ModuleName,
|
||||
Key: string(cdp.KeyDebtParam),
|
||||
},
|
||||
{
|
||||
Subspace: incentive.ModuleName,
|
||||
Key: string(incentive.KeyActive),
|
||||
},
|
||||
{
|
||||
Subspace: kavadist.ModuleName,
|
||||
Key: string(kavadist.KeyActive),
|
||||
},
|
||||
{
|
||||
Subspace: pricefeed.ModuleName,
|
||||
Key: string(pricefeed.KeyMarkets),
|
||||
},
|
||||
},
|
||||
AllowedCollateralParams: committee.AllowedCollateralParams{{
|
||||
Denom: bnbDenom,
|
||||
LiquidationRatio: false,
|
||||
DebtLimit: true,
|
||||
StabilityFee: true,
|
||||
AuctionSize: true,
|
||||
LiquidationPenalty: false,
|
||||
Prefix: false,
|
||||
SpotMarketID: false,
|
||||
LiquidationMarketID: false,
|
||||
ConversionFactor: false,
|
||||
}},
|
||||
AllowedDebtParam: committee.AllowedDebtParam{
|
||||
Denom: false,
|
||||
ReferenceAsset: false,
|
||||
ConversionFactor: false,
|
||||
DebtFloor: true,
|
||||
SavingsRate: true,
|
||||
},
|
||||
AllowedAssetParams: committee.AllowedAssetParams{{
|
||||
Denom: bnbDenom,
|
||||
CoinID: false,
|
||||
Limit: true,
|
||||
Active: true,
|
||||
}},
|
||||
AllowedMarkets: committee.AllowedMarkets{
|
||||
{
|
||||
MarketID: bnbSpotMarketID,
|
||||
BaseAsset: false,
|
||||
QuoteAsset: false,
|
||||
Oracles: false,
|
||||
Active: true,
|
||||
},
|
||||
{
|
||||
MarketID: bnbLiquidationMarketID,
|
||||
BaseAsset: false,
|
||||
QuoteAsset: false,
|
||||
Oracles: false,
|
||||
Active: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
committee.TextPermission{},
|
||||
},
|
||||
sdk.MustNewDecFromStr("0.5"), // 3 of 5
|
||||
7*24*time.Hour,
|
||||
),
|
||||
committee.NewCommittee(
|
||||
2,
|
||||
"Kava Safety Committee",
|
||||
[]sdk.AccAddress{
|
||||
// address from governance proposal: https://ipfs.io/ipfs/QmPqfP1Fa8EyzubmctL5uT5TAcWTB7HBQd8pvrmSTG8yS1/safety-nominations.pdf
|
||||
mustAccAddressFromBech32("kava1e0agyg6eug9r62fly9sls77ycjgw8ax6xk73es"),
|
||||
},
|
||||
[]committee.Permission{committee.SoftwareUpgradePermission{}},
|
||||
sdk.MustNewDecFromStr("0.5"),
|
||||
7*24*time.Hour,
|
||||
),
|
||||
},
|
||||
[]committee.Proposal{},
|
||||
[]committee.Vote{},
|
||||
))
|
||||
}
|
||||
|
||||
func addIncentiveState(cdc *codec.Codec, appState genutil.AppMap) {
|
||||
appState[incentive.ModuleName] = cdc.MustMarshalJSON(incentive.NewGenesisState(
|
||||
incentive.NewParams(
|
||||
true,
|
||||
incentive.Rewards{incentive.NewReward(
|
||||
false,
|
||||
kavaDenom,
|
||||
sdk.NewInt64Coin(kavaDenom, 74_000_000_000),
|
||||
1*7*24*time.Hour,
|
||||
1*365*24*time.Hour,
|
||||
1*7*24*time.Hour,
|
||||
)},
|
||||
),
|
||||
incentive.DefaultPreviousBlockTime,
|
||||
incentive.RewardPeriods{},
|
||||
incentive.ClaimPeriods{},
|
||||
incentive.Claims{},
|
||||
incentive.GenesisClaimPeriodIDs{},
|
||||
))
|
||||
}
|
||||
|
||||
func addKavaDistState(cdc *codec.Codec, appState genutil.AppMap) {
|
||||
appState[kavadist.ModuleName] = cdc.MustMarshalJSON(kavadist.NewGenesisState(
|
||||
kavadist.NewParams(
|
||||
true,
|
||||
kavadist.Periods{
|
||||
{
|
||||
Start: time.Date(2020, 6, 1, 14, 0, 0, 0, time.UTC),
|
||||
End: time.Date(2021, 6, 1, 14, 0, 0, 0, time.UTC),
|
||||
Inflation: sdk.MustNewDecFromStr("1.000000004431822130"), // 15%
|
||||
},
|
||||
{
|
||||
Start: time.Date(2021, 6, 1, 14, 0, 0, 0, time.UTC),
|
||||
End: time.Date(2022, 6, 1, 14, 0, 0, 0, time.UTC),
|
||||
Inflation: sdk.MustNewDecFromStr("1.000000002293273137"), // 7.5%
|
||||
},
|
||||
{
|
||||
Start: time.Date(2022, 6, 1, 14, 0, 0, 0, time.UTC),
|
||||
End: time.Date(2023, 6, 1, 14, 0, 0, 0, time.UTC),
|
||||
Inflation: sdk.MustNewDecFromStr("1.000000001167363430"), // 3.75%
|
||||
},
|
||||
{
|
||||
Start: time.Date(2023, 6, 1, 14, 0, 0, 0, time.UTC),
|
||||
End: time.Date(2024, 6, 1, 14, 0, 0, 0, time.UTC),
|
||||
Inflation: sdk.MustNewDecFromStr("1.000000000782997609"), // 2.5%
|
||||
},
|
||||
},
|
||||
),
|
||||
kavadist.DefaultPreviousBlockTime,
|
||||
))
|
||||
}
|
||||
|
||||
func addPricefeedState(cdc *codec.Codec, appState genutil.AppMap) {
|
||||
appState[pricefeed.ModuleName] = cdc.MustMarshalJSON(pricefeed.NewGenesisState(
|
||||
pricefeed.NewParams(
|
||||
pricefeed.Markets{
|
||||
{
|
||||
MarketID: bnbSpotMarketID,
|
||||
BaseAsset: bnbDenom,
|
||||
QuoteAsset: referenceAsset,
|
||||
Oracles: []sdk.AccAddress{
|
||||
// addresses from governance proposal: https://ipfs.io/ipfs/QmXgSJ4Dcji8msKpDwYHLmfPSLjRxCEGX6egXQU9DzmFMK/oracle-nominations.pdf
|
||||
mustAccAddressFromBech32("kava12dyshua9nkvx9w8ywp72wdnzrc4t4mnnycz0dl"),
|
||||
mustAccAddressFromBech32("kava1tuxyepdrkwraa22k99w04c0wa64tgh70mv87fs"),
|
||||
mustAccAddressFromBech32("kava1ueak7nzesm3pnev6lngp6lgk0ry02djz8pjpcg"),
|
||||
mustAccAddressFromBech32("kava1sl62nqm89c780yxm3m9lp3tacmpnfljq6tytvl"),
|
||||
mustAccAddressFromBech32("kava1ujfrlcd0ted58mzplnyxzklsw0sqevlgxndanp"),
|
||||
mustAccAddressFromBech32("kava17fatl3wzxvk4rwfu3tqsctdp5x9vute67j9ufj"),
|
||||
mustAccAddressFromBech32("kava19rjk5qmmwywnzfccwzyn02jywgpwjqf60afj92"),
|
||||
mustAccAddressFromBech32("kava1xd39avn2f008jmvua0eupg39zsp2xn3wf802vn"),
|
||||
mustAccAddressFromBech32("kava1pt6q4kdmwawr3thm9cd82pq7hml8u84rd0f3jy"),
|
||||
mustAccAddressFromBech32("kava13tpwqygswyzupqfggfgh9dmtgthgucn5wpfksh"),
|
||||
},
|
||||
Active: true,
|
||||
},
|
||||
{
|
||||
MarketID: bnbLiquidationMarketID,
|
||||
BaseAsset: bnbDenom,
|
||||
QuoteAsset: referenceAsset,
|
||||
Oracles: []sdk.AccAddress{
|
||||
// addresses from governance proposal: https://ipfs.io/ipfs/QmXgSJ4Dcji8msKpDwYHLmfPSLjRxCEGX6egXQU9DzmFMK/oracle-nominations.pdf
|
||||
mustAccAddressFromBech32("kava12dyshua9nkvx9w8ywp72wdnzrc4t4mnnycz0dl"),
|
||||
mustAccAddressFromBech32("kava1tuxyepdrkwraa22k99w04c0wa64tgh70mv87fs"),
|
||||
mustAccAddressFromBech32("kava1ueak7nzesm3pnev6lngp6lgk0ry02djz8pjpcg"),
|
||||
mustAccAddressFromBech32("kava1sl62nqm89c780yxm3m9lp3tacmpnfljq6tytvl"),
|
||||
mustAccAddressFromBech32("kava1ujfrlcd0ted58mzplnyxzklsw0sqevlgxndanp"),
|
||||
mustAccAddressFromBech32("kava17fatl3wzxvk4rwfu3tqsctdp5x9vute67j9ufj"),
|
||||
mustAccAddressFromBech32("kava19rjk5qmmwywnzfccwzyn02jywgpwjqf60afj92"),
|
||||
mustAccAddressFromBech32("kava1xd39avn2f008jmvua0eupg39zsp2xn3wf802vn"),
|
||||
mustAccAddressFromBech32("kava1pt6q4kdmwawr3thm9cd82pq7hml8u84rd0f3jy"),
|
||||
mustAccAddressFromBech32("kava13tpwqygswyzupqfggfgh9dmtgthgucn5wpfksh"),
|
||||
},
|
||||
Active: true,
|
||||
},
|
||||
},
|
||||
),
|
||||
pricefeed.PostedPrices{},
|
||||
))
|
||||
}
|
||||
|
||||
func mustAccAddressFromBech32(addrBech32 string) sdk.AccAddress {
|
||||
addr, err := sdk.AccAddressFromBech32(addrBech32)
|
||||
if err != nil {
|
||||
panic(fmt.Errorf("couldn't decode address: %w", err))
|
||||
}
|
||||
return addr
|
||||
}
|
@ -1,42 +0,0 @@
|
||||
package kava3
|
||||
|
||||
import (
|
||||
"path/filepath"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/cosmos/cosmos-sdk/x/genutil"
|
||||
|
||||
"github.com/kava-labs/kava/app"
|
||||
"github.com/kava-labs/kava/migrate/v0_8"
|
||||
v032tendermint "github.com/kava-labs/kava/migrate/v0_8/tendermint/v0_32"
|
||||
)
|
||||
|
||||
func TestAddSuggestedParams(t *testing.T) {
|
||||
tApp := app.NewTestApp() // also sets the bech32 prefix on sdk.Config
|
||||
cdc := app.MakeCodec()
|
||||
|
||||
// 1) load an exported kava-2 state and migrate to kava v0.8 format (avoids storing v0.8 state that can get out of date)
|
||||
oldGenDoc, err := v032tendermint.GenesisDocFromFile(filepath.Join("../../migrate/v0_8/testdata", "kava-2.json"))
|
||||
require.NoError(t, err)
|
||||
genDoc := v0_8.Migrate(*oldGenDoc)
|
||||
|
||||
// 2) add params
|
||||
newGenDoc, err := AddSuggestedParams(cdc, genDoc, "new-chain-id", time.Date(1998, 1, 0, 0, 0, 0, 0, time.UTC))
|
||||
require.NoError(t, err)
|
||||
|
||||
// 3) check new genesis is valid
|
||||
var newAppState genutil.AppMap
|
||||
require.NoError(t,
|
||||
cdc.UnmarshalJSON(newGenDoc.AppState, &newAppState),
|
||||
)
|
||||
require.NoError(t,
|
||||
app.ModuleBasics.ValidateGenesis(newAppState),
|
||||
)
|
||||
require.NotPanics(t, func() {
|
||||
// this runs both InitGenesis for all modules (which panic on errors) and runs all invariants
|
||||
tApp.InitializeFromGenesisStates(app.GenesisState(newAppState))
|
||||
})
|
||||
}
|
@ -171,12 +171,12 @@ func (suite *PermissionTestSuite) TestSubParamChangePermission_Allows() {
|
||||
},
|
||||
AllowedCollateralParams: types.AllowedCollateralParams{
|
||||
{
|
||||
Denom: "bnb",
|
||||
Type: "bnb-a",
|
||||
DebtLimit: true,
|
||||
StabilityFee: true,
|
||||
},
|
||||
{ // TODO currently even if a perm doesn't allow a change in one element it must still be present in list
|
||||
Denom: "btc",
|
||||
Type: "btc-a",
|
||||
},
|
||||
},
|
||||
AllowedDebtParam: types.AllowedDebtParam{
|
||||
|
@ -77,7 +77,7 @@ func (suite *KeeperTestSuite) TestSubmitProposal() {
|
||||
},
|
||||
AllowedCollateralParams: types.AllowedCollateralParams{
|
||||
types.AllowedCollateralParam{
|
||||
Denom: "bnb",
|
||||
Type: "bnb-a",
|
||||
DebtLimit: true,
|
||||
StabilityFee: true,
|
||||
},
|
||||
|
@ -19,6 +19,7 @@ func cs(coins ...sdk.Coin) sdk.Coins { return sdk.NewCoins(coins...) }
|
||||
func (suite *PermissionsTestSuite) TestAllowedCollateralParams_Allows() {
|
||||
testCPs := cdptypes.CollateralParams{
|
||||
{
|
||||
Type: "bnb-a",
|
||||
Denom: "bnb",
|
||||
LiquidationRatio: d("2.0"),
|
||||
DebtLimit: c("usdx", 1000000000000),
|
||||
@ -31,6 +32,7 @@ func (suite *PermissionsTestSuite) TestAllowedCollateralParams_Allows() {
|
||||
LiquidationMarketID: "bnb:usd",
|
||||
},
|
||||
{
|
||||
Type: "btc-a",
|
||||
Denom: "btc",
|
||||
LiquidationRatio: d("1.5"),
|
||||
DebtLimit: c("usdx", 1000000000),
|
||||
@ -43,6 +45,7 @@ func (suite *PermissionsTestSuite) TestAllowedCollateralParams_Allows() {
|
||||
LiquidationMarketID: "btc:usd",
|
||||
},
|
||||
{
|
||||
Type: "atom-a",
|
||||
Denom: "atom",
|
||||
LiquidationRatio: d("2.0"),
|
||||
DebtLimit: c("usdx", 1000000000),
|
||||
@ -76,15 +79,16 @@ func (suite *PermissionsTestSuite) TestAllowedCollateralParams_Allows() {
|
||||
name: "disallowed add",
|
||||
allowed: AllowedCollateralParams{
|
||||
{
|
||||
Denom: "bnb",
|
||||
Type: "bnb-a",
|
||||
AuctionSize: true,
|
||||
},
|
||||
{
|
||||
Denom: "btc",
|
||||
Type: "btc-a",
|
||||
StabilityFee: true,
|
||||
},
|
||||
{ // allow all fields
|
||||
Denom: "atom",
|
||||
Type: "atom-a",
|
||||
Denom: true,
|
||||
LiquidationRatio: true,
|
||||
DebtLimit: true,
|
||||
StabilityFee: true,
|
||||
@ -104,12 +108,13 @@ func (suite *PermissionsTestSuite) TestAllowedCollateralParams_Allows() {
|
||||
name: "disallowed remove",
|
||||
allowed: AllowedCollateralParams{
|
||||
{
|
||||
Denom: "bnb",
|
||||
Type: "bnb-a",
|
||||
AuctionSize: true,
|
||||
},
|
||||
{
|
||||
// allow all fields
|
||||
Denom: "btc",
|
||||
Type: "btc-a",
|
||||
Denom: true,
|
||||
LiquidationRatio: true,
|
||||
DebtLimit: true,
|
||||
StabilityFee: true,
|
||||
@ -129,15 +134,15 @@ func (suite *PermissionsTestSuite) TestAllowedCollateralParams_Allows() {
|
||||
name: "allowed change with different order",
|
||||
allowed: AllowedCollateralParams{
|
||||
{
|
||||
Denom: "bnb",
|
||||
Type: "bnb-a",
|
||||
LiquidationPenalty: true,
|
||||
},
|
||||
{
|
||||
Denom: "btc",
|
||||
Type: "btc-a",
|
||||
DebtLimit: true,
|
||||
},
|
||||
{
|
||||
Denom: "atom",
|
||||
Type: "atom-a",
|
||||
DebtLimit: true,
|
||||
LiquidationPenalty: true,
|
||||
},
|
||||
@ -425,6 +430,7 @@ func (suite *PermissionsTestSuite) TestAllowedMarkets_Allows() {
|
||||
|
||||
func (suite *PermissionsTestSuite) TestAllowedCollateralParam_Allows() {
|
||||
testCP := cdptypes.CollateralParam{
|
||||
Type: "bnb-a",
|
||||
Denom: "bnb",
|
||||
LiquidationRatio: d("1.5"),
|
||||
DebtLimit: c("usdx", 1000000000000),
|
||||
@ -456,7 +462,7 @@ func (suite *PermissionsTestSuite) TestAllowedCollateralParam_Allows() {
|
||||
{
|
||||
name: "allowed change",
|
||||
allowed: AllowedCollateralParam{
|
||||
Denom: "bnb",
|
||||
Type: "bnb-a",
|
||||
DebtLimit: true,
|
||||
StabilityFee: true,
|
||||
AuctionSize: true,
|
||||
@ -468,7 +474,7 @@ func (suite *PermissionsTestSuite) TestAllowedCollateralParam_Allows() {
|
||||
{
|
||||
name: "un-allowed change",
|
||||
allowed: AllowedCollateralParam{
|
||||
Denom: "bnb",
|
||||
Type: "bnb-a",
|
||||
DebtLimit: true,
|
||||
StabilityFee: true,
|
||||
AuctionSize: true,
|
||||
@ -480,7 +486,7 @@ func (suite *PermissionsTestSuite) TestAllowedCollateralParam_Allows() {
|
||||
{
|
||||
name: "un-allowed mismatching denom",
|
||||
allowed: AllowedCollateralParam{
|
||||
Denom: "btc",
|
||||
Type: "btc-a",
|
||||
DebtLimit: true,
|
||||
},
|
||||
current: testCP,
|
||||
@ -491,7 +497,7 @@ func (suite *PermissionsTestSuite) TestAllowedCollateralParam_Allows() {
|
||||
{
|
||||
name: "allowed no change",
|
||||
allowed: AllowedCollateralParam{
|
||||
Denom: "bnb",
|
||||
Type: "bnb-a",
|
||||
DebtLimit: true,
|
||||
},
|
||||
current: testCP,
|
||||
@ -501,7 +507,7 @@ func (suite *PermissionsTestSuite) TestAllowedCollateralParam_Allows() {
|
||||
{
|
||||
name: "un-allowed change with allowed change",
|
||||
allowed: AllowedCollateralParam{
|
||||
Denom: "btc",
|
||||
Type: "btc-a",
|
||||
DebtLimit: true,
|
||||
},
|
||||
current: testCP,
|
||||
|
@ -338,7 +338,7 @@ func (acps AllowedCollateralParams) Allows(current, incoming cdptypes.Collateral
|
||||
var foundAllowedCP bool
|
||||
var allowedCP AllowedCollateralParam
|
||||
for _, p := range acps {
|
||||
if p.Denom != incomingCP.Denom {
|
||||
if p.Type != incomingCP.Type {
|
||||
continue
|
||||
}
|
||||
foundAllowedCP = true
|
||||
@ -372,7 +372,8 @@ func (acps AllowedCollateralParams) Allows(current, incoming cdptypes.Collateral
|
||||
}
|
||||
|
||||
type AllowedCollateralParam struct {
|
||||
Denom string `json:"denom" yaml:"denom"`
|
||||
Type string `json:"type" yaml:"type"`
|
||||
Denom bool `json:"denom" yaml:"denom"`
|
||||
LiquidationRatio bool `json:"liquidation_ratio" yaml:"liquidation_ratio"`
|
||||
DebtLimit bool `json:"debt_limit" yaml:"debt_limit"`
|
||||
StabilityFee bool `json:"stability_fee" yaml:"stability_fee"`
|
||||
@ -385,7 +386,8 @@ type AllowedCollateralParam struct {
|
||||
}
|
||||
|
||||
func (acp AllowedCollateralParam) Allows(current, incoming cdptypes.CollateralParam) bool {
|
||||
allowed := ((acp.Denom == current.Denom) && (acp.Denom == incoming.Denom)) && // require denoms to be all equal
|
||||
allowed := ((acp.Type == current.Type) && (acp.Type == incoming.Type)) && // require collateral types to be all equal
|
||||
(current.Denom == incoming.Denom || acp.Denom) &&
|
||||
(current.LiquidationRatio.Equal(incoming.LiquidationRatio) || acp.LiquidationRatio) &&
|
||||
(current.DebtLimit.IsEqual(incoming.DebtLimit) || acp.DebtLimit) &&
|
||||
(current.StabilityFee.Equal(incoming.StabilityFee) || acp.StabilityFee) &&
|
||||
|
@ -116,7 +116,7 @@ func (AppModule) QuerierRoute() string {
|
||||
|
||||
// NewQuerierHandler returns no sdk.Querier.
|
||||
func (am AppModule) NewQuerierHandler() sdk.Querier {
|
||||
return nil
|
||||
return NewQuerier(am.keeper)
|
||||
}
|
||||
|
||||
// InitGenesis module init-genesis
|
||||
|
Loading…
Reference in New Issue
Block a user