Skip to content

Commit

Permalink
Merge pull request #520 from KiraCore/release/v0.3.20
Browse files Browse the repository at this point in the history
release/v0.3.20 -> master
  • Loading branch information
asmodat authored Jul 22, 2023
2 parents 83d331f + 72587e2 commit 197cdce
Show file tree
Hide file tree
Showing 63 changed files with 491 additions and 325 deletions.
8 changes: 1 addition & 7 deletions RELEASE.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,3 @@
Features:

- Give PermCreatePollProposal when claiming councilor seat
- Remove fees collected query
- Add filter for derivative only basket query
- Support multiple swaps at once
- Add validation for commission range
- Update CLI command for upsert-staking-pool (error logs, and commissio…
- Add filters on multistaking undelegations query
- Configurable bond denom and address prefix
21 changes: 11 additions & 10 deletions app/ante/ante.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import (
"crypto/sha256"
"encoding/hex"
"fmt"
"time"

kiratypes "github.com/KiraCore/sekai/types"
custodykeeper "github.com/KiraCore/sekai/x/custody/keeper"
custodytypes "github.com/KiraCore/sekai/x/custody/types"
Expand All @@ -19,7 +21,6 @@ import (
"github.com/cosmos/cosmos-sdk/x/auth/signing"
"github.com/cosmos/cosmos-sdk/x/auth/types"
bank "github.com/cosmos/cosmos-sdk/x/bank/types"
"time"
)

// NewAnteHandler returns an AnteHandler that checks and increments sequence
Expand Down Expand Up @@ -226,7 +227,7 @@ func (cd CustodyDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool,
return ctx, sdkerrors.Wrap(custodytypes.ErrNotEnoughReward, "to small reward")
}

if msg.Reward[0].Denom != cd.ck.BondDenom(ctx) {
if msg.Reward[0].Denom != cd.ck.DefaultDenom(ctx) {
return ctx, sdkerrors.Wrap(custodytypes.ErrNotEnoughReward, "wrong reward denom")
}
}
Expand Down Expand Up @@ -317,20 +318,20 @@ func (svd ValidateFeeRangeDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simu
}

properties := svd.cgk.GetNetworkProperties(ctx)
bondDenom := svd.sk.BondDenom(ctx)
defaultDenom := svd.sk.DefaultDenom(ctx)

feeAmount := sdk.NewDec(0)
feeCoins := feeTx.GetFee()
tokensBlackWhite := svd.tk.GetTokenBlackWhites(ctx)
for _, feeCoin := range feeCoins {
rate := svd.tk.GetTokenRate(ctx, feeCoin.Denom)
if !properties.EnableForeignFeePayments && feeCoin.Denom != bondDenom {
if !properties.EnableForeignFeePayments && feeCoin.Denom != defaultDenom {
return ctx, sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, fmt.Sprintf("foreign fee payments is disabled by governance"))
}
if rate == nil || !rate.FeePayments {
return ctx, sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, fmt.Sprintf("currency you are trying to use was not whitelisted as fee payment"))
}
if tokensBlackWhite.IsFrozen(feeCoin.Denom, bondDenom, properties.EnableTokenBlacklist, properties.EnableTokenWhitelist) {
if tokensBlackWhite.IsFrozen(feeCoin.Denom, defaultDenom, properties.EnableTokenBlacklist, properties.EnableTokenWhitelist) {
return ctx, sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, fmt.Sprintf("currency you are trying to use as fee is frozen"))
}
feeAmount = feeAmount.Add(feeCoin.Amount.ToDec().Mul(rate.FeeRate))
Expand All @@ -350,11 +351,11 @@ func (svd ValidateFeeRangeDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simu
}

if feeAmount.LT(sdk.NewDec(int64(properties.MinTxFee))) || feeAmount.GT(sdk.NewDec(int64(properties.MaxTxFee))) {
return ctx, sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, fmt.Sprintf("fee %+v(%d) is out of range [%d, %d]%s", feeTx.GetFee(), feeAmount.RoundInt().Int64(), properties.MinTxFee, properties.MaxTxFee, bondDenom))
return ctx, sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, fmt.Sprintf("fee %+v(%d) is out of range [%d, %d]%s", feeTx.GetFee(), feeAmount.RoundInt().Int64(), properties.MinTxFee, properties.MaxTxFee, defaultDenom))
}

if feeAmount.LT(sdk.NewDec(int64(executionMaxFee))) {
return ctx, sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, fmt.Sprintf("fee %+v(%d) is less than max execution fee %d%s", feeTx.GetFee(), feeAmount.RoundInt().Int64(), executionMaxFee, bondDenom))
return ctx, sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, fmt.Sprintf("fee %+v(%d) is less than max execution fee %d%s", feeTx.GetFee(), feeAmount.RoundInt().Int64(), executionMaxFee, defaultDenom))
}

return next(ctx, tx, simulate)
Expand Down Expand Up @@ -436,7 +437,7 @@ func (pnmd PoorNetworkManagementDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx
if kiratypes.MsgType(msg) == bank.TypeMsgSend {
// on poor network, we introduce POOR_NETWORK_MAX_BANK_TX_SEND network property to limit transaction send amount
msg := msg.(*bank.MsgSend)
if len(msg.Amount) > 1 || msg.Amount[0].Denom != pnmd.csk.BondDenom(ctx) {
if len(msg.Amount) > 1 || msg.Amount[0].Denom != pnmd.csk.DefaultDenom(ctx) {
return ctx, sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "only bond denom is allowed on poor network")
}
if msg.Amount[0].Amount.Uint64() > pnmd.cgk.GetNetworkProperties(ctx).PoorNetworkMaxBankSend {
Expand Down Expand Up @@ -477,14 +478,14 @@ func (pnmd BlackWhiteTokensCheckDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx
return ctx, sdkerrors.Wrap(sdkerrors.ErrTxDecode, "invalid transaction type")
}

bondDenom := pnmd.csk.BondDenom(ctx)
defaultDenom := pnmd.csk.DefaultDenom(ctx)
tokensBlackWhite := pnmd.tk.GetTokenBlackWhites(ctx)
properties := pnmd.cgk.GetNetworkProperties(ctx)
for _, msg := range sigTx.GetMsgs() {
if kiratypes.MsgType(msg) == bank.TypeMsgSend {
msg := msg.(*bank.MsgSend)
for _, amt := range msg.Amount {
if tokensBlackWhite.IsFrozen(amt.Denom, bondDenom, properties.EnableTokenBlacklist, properties.EnableTokenWhitelist) {
if tokensBlackWhite.IsFrozen(amt.Denom, defaultDenom, properties.EnableTokenBlacklist, properties.EnableTokenWhitelist) {
return ctx, sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "token is frozen")
}
}
Expand Down
4 changes: 4 additions & 0 deletions app/prefix.go → app/params/params.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,10 @@ var (
ConsNodePubKeyPrefix = "kiravalconspub"
)

var (
DefaultDenom = "ukex"
)

func SetConfig() {
config := sdk.GetConfig()
config.SetBech32PrefixForAccount(AccountAddressPrefix, AccountPubKeyPrefix)
Expand Down
10 changes: 4 additions & 6 deletions app/test_helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"testing"
"time"

appparams "github.com/KiraCore/sekai/app/params"
bam "github.com/cosmos/cosmos-sdk/baseapp"
"github.com/cosmos/cosmos-sdk/client"
codectypes "github.com/cosmos/cosmos-sdk/codec/types"
Expand All @@ -30,9 +31,6 @@ import (
dbm "github.com/tendermint/tm-db"
)

// DefaultBondDenom defines default denom for fee
var DefaultBondDenom = "ukex"

// DefaultConsensusParams defines the default Tendermint consensus params used in
// SimApp testing.
var DefaultConsensusParams = &abci.ConsensusParams{
Expand Down Expand Up @@ -129,7 +127,7 @@ func SetupWithGenesisValSet(t *testing.T, valSet *tmtypes.ValidatorSet, genAccs
totalSupply := sdk.NewCoins()
for _, b := range balances {
// add genesis acc tokens and delegated tokens to total supply
totalSupply = totalSupply.Add(b.Coins.Add(sdk.NewCoin(DefaultBondDenom, bondAmt))...)
totalSupply = totalSupply.Add(b.Coins.Add(sdk.NewCoin(appparams.DefaultDenom, bondAmt))...)
}

// update total supply
Expand Down Expand Up @@ -231,7 +229,7 @@ func createIncrementalAccounts(accNum int) []sdk.AccAddress {

// AddTestAddrsFromPubKeys adds the addresses into the SimApp providing only the public keys.
func AddTestAddrsFromPubKeys(app *SekaiApp, ctx sdk.Context, pubKeys []cryptotypes.PubKey, accAmt sdk.Int) {
initCoins := sdk.NewCoins(sdk.NewCoin(app.CustomStakingKeeper.BondDenom(ctx), accAmt))
initCoins := sdk.NewCoins(sdk.NewCoin(app.CustomStakingKeeper.DefaultDenom(ctx), accAmt))

// fill all the addresses with some coins, set the loose pool tokens simultaneously
for _, pubKey := range pubKeys {
Expand All @@ -254,7 +252,7 @@ func AddTestAddrsIncremental(app *SekaiApp, ctx sdk.Context, accNum int, accAmt
func addTestAddrs(app *SekaiApp, ctx sdk.Context, accNum int, accAmt sdk.Int, strategy GenerateAccountStrategy) []sdk.AccAddress {
testAddrs := strategy(accNum)

initCoins := sdk.NewCoins(sdk.NewCoin(app.CustomStakingKeeper.BondDenom(ctx), accAmt))
initCoins := sdk.NewCoins(sdk.NewCoin(app.CustomStakingKeeper.DefaultDenom(ctx), accAmt))

// fill all the addresses with some coins, set the loose pool tokens simultaneously
for _, addr := range testAddrs {
Expand Down
32 changes: 28 additions & 4 deletions cmd/sekaid/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,10 @@ import (
"path/filepath"

"github.com/KiraCore/sekai/app"
appparams "github.com/KiraCore/sekai/app/params"
functionmeta "github.com/KiraCore/sekai/function_meta"
genutilcli "github.com/KiraCore/sekai/x/genutil/client/cli"
genutiltypes "github.com/KiraCore/sekai/x/genutil/types"
govtypes "github.com/KiraCore/sekai/x/gov/types"
customstaking "github.com/KiraCore/sekai/x/staking/client/cli"
"github.com/cosmos/cosmos-sdk/baseapp"
Expand Down Expand Up @@ -77,7 +79,32 @@ func NewRootCmd() (*cobra.Command, params.EncodingConfig) {

customAppTemplate, customAppConfig := initAppConfig()

return server.InterceptConfigsPreRunHandler(cmd, customAppTemplate, customAppConfig)
err = server.InterceptConfigsPreRunHandler(cmd, customAppTemplate, customAppConfig)
{
serverCtx := server.GetServerContextFromCmd(cmd)
config := serverCtx.Config

clientCtx := client.GetClientContextFromCmd(cmd)

config.SetRoot(clientCtx.HomeDir)

appState, _, err := genutiltypes.GenesisStateFromGenFile(config.GenesisFile())
if err == nil {
bech32Prefix, defaultDenom := govtypes.GetBech32PrefixAndDefaultDenomFromAppState(appState)
appparams.DefaultDenom = defaultDenom
appparams.AccountAddressPrefix = bech32Prefix
appparams.AccountPubKeyPrefix = bech32Prefix + "pub"
appparams.ValidatorAddressPrefix = bech32Prefix + "valoper"
appparams.ValidatorPubKeyPrefix = bech32Prefix + "valoperpub"
appparams.ConsNodeAddressPrefix = bech32Prefix + "valcons"
appparams.ConsNodePubKeyPrefix = bech32Prefix + "valconspub"
}

appparams.SetConfig()
cfg := sdk.GetConfig()
cfg.Seal()
}
return err
},
}

Expand Down Expand Up @@ -143,8 +170,6 @@ lru_size = 0`
}

func initRootCmd(rootCmd *cobra.Command, encodingConfig params.EncodingConfig) {
cfg := sdk.GetConfig()
cfg.Seal()

rootCmd.AddCommand(
genutilcli.InitCmd(app.ModuleBasics, app.DefaultNodeHome),
Expand Down Expand Up @@ -179,7 +204,6 @@ func initRootCmd(rootCmd *cobra.Command, encodingConfig params.EncodingConfig) {
}

func main() {
app.SetConfig()
rootCmd, _ := NewRootCmd()

if err := svrcmd.Execute(rootCmd, app.DefaultNodeHome); err != nil {
Expand Down
8 changes: 3 additions & 5 deletions cmd/sekaid/testnet.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import (
"github.com/tendermint/tendermint/types"
tmtime "github.com/tendermint/tendermint/types/time"

appparams "github.com/KiraCore/sekai/app/params"
"github.com/KiraCore/sekai/x/genutil"
genutiltypes "github.com/KiraCore/sekai/x/genutil/types"
stakingtypes "github.com/KiraCore/sekai/x/staking/types"
Expand All @@ -43,9 +44,6 @@ var (
flagStartingIPAddress = "starting-ip-address"
)

// DefaultBondDenom defines default denom for fee
var DefaultBondDenom = "ukex"

// get cmd to initialize all files for tendermint testnet and application
func testnetCmd(mbm module.BasicManager, genBalIterator banktypes.GenesisBalancesIterator) *cobra.Command {
cmd := &cobra.Command{
Expand Down Expand Up @@ -86,7 +84,7 @@ Example:
cmd.Flags().String(flagNodeDaemonHome, "simd", "Home directory of the node's daemon configuration")
cmd.Flags().String(flagStartingIPAddress, "192.168.0.1", "Starting IP address (192.168.0.1 results in persistent peers list [email protected]:46656, [email protected]:46656, ...)")
cmd.Flags().String(flags.FlagChainID, "", "genesis file chain-id, if left blank will be randomly created")
cmd.Flags().String(server.FlagMinGasPrices, fmt.Sprintf("0.000006%s", DefaultBondDenom), "Minimum gas prices to accept for transactions; All fees in a tx must meet this minimum (e.g. 0.01photino,0.001stake)")
cmd.Flags().String(server.FlagMinGasPrices, fmt.Sprintf("0.000006%s", appparams.DefaultDenom), "Minimum gas prices to accept for transactions; All fees in a tx must meet this minimum (e.g. 0.01photino,0.001stake)")
cmd.Flags().String(flags.FlagKeyringBackend, flags.DefaultKeyringBackend, "Select keyring's backend (os|file|test)")
cmd.Flags().String(flags.FlagKeyAlgorithm, string(hd.Secp256k1Type), "Key signing algorithm to generate keys for")

Expand Down Expand Up @@ -199,7 +197,7 @@ func InitTestnet(
accStakingTokens := sdk.TokensFromConsensusPower(500, sdk.DefaultPowerReduction)
coins := sdk.Coins{
sdk.NewCoin(fmt.Sprintf("%stoken", nodeDirName), accTokens),
sdk.NewCoin(DefaultBondDenom, accStakingTokens),
sdk.NewCoin(appparams.DefaultDenom, accStakingTokens),
}

genBalances = append(genBalances, banktypes.Balance{Address: addr.String(), Coins: coins.Sort()})
Expand Down
4 changes: 2 additions & 2 deletions middleware/middleware_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ import (
"os"
"testing"

"github.com/KiraCore/sekai/app"
simapp "github.com/KiraCore/sekai/app"
appparams "github.com/KiraCore/sekai/app/params"
"github.com/KiraCore/sekai/middleware"
"github.com/KiraCore/sekai/types"
kiratypes "github.com/KiraCore/sekai/types"
Expand All @@ -19,7 +19,7 @@ import (
)

func TestMain(m *testing.M) {
app.SetConfig()
appparams.SetConfig()
os.Exit(m.Run())
}

Expand Down
34 changes: 18 additions & 16 deletions proto/kira/gov/genesis.proto
Original file line number Diff line number Diff line change
Expand Up @@ -14,28 +14,30 @@ import "kira/gov/identity_registrar.proto";
option go_package = "github.com/KiraCore/sekai/x/gov/types";

message GenesisState {
string default_denom = 1;
string bech32_prefix = 2;
// starting_proposal_id is the ID of the starting proposal.
uint64 starting_proposal_id = 1;
uint64 next_role_id = 2;
repeated Role roles = 3 [ (gogoproto.nullable) = false ];
uint64 starting_proposal_id = 3;
uint64 next_role_id = 4;
repeated Role roles = 5 [ (gogoproto.nullable) = false ];
// role_permissions is the roles that are active from genesis.
map<uint64, Permissions> role_permissions = 4;
map<uint64, Permissions> role_permissions = 6;
// NetworkActors are the actors that are saved from genesis.
repeated NetworkActor network_actors = 5;
repeated NetworkActor network_actors = 7;

NetworkProperties network_properties = 6;
repeated ExecutionFee execution_fees = 7 [ (gogoproto.nullable) = false ];
AllowedMessages poor_network_messages = 8;
NetworkProperties network_properties = 8;
repeated ExecutionFee execution_fees = 9 [ (gogoproto.nullable) = false ];
AllowedMessages poor_network_messages = 10;

repeated Proposal proposals = 9 [ (gogoproto.nullable) = false ];
repeated Vote votes = 10 [ (gogoproto.nullable) = false ];
map<string, kira.gov.DataRegistryEntry> data_registry = 11;
repeated Proposal proposals = 11 [ (gogoproto.nullable) = false ];
repeated Vote votes = 12 [ (gogoproto.nullable) = false ];
map<string, kira.gov.DataRegistryEntry> data_registry = 13;

repeated kira.gov.IdentityRecord identity_records = 12 [ (gogoproto.nullable) = false ];
uint64 last_identity_record_id = 13;
repeated kira.gov.IdentityRecord identity_records = 14 [ (gogoproto.nullable) = false ];
uint64 last_identity_record_id = 15;

repeated kira.gov.IdentityRecordsVerify id_records_verify_requests = 14 [ (gogoproto.nullable) = false ];
uint64 last_id_record_verify_request_id = 15;
repeated kira.gov.IdentityRecordsVerify id_records_verify_requests = 16 [ (gogoproto.nullable) = false ];
uint64 last_id_record_verify_request_id = 17;

map<string, uint64> proposal_durations = 16;
map<string, uint64> proposal_durations = 18;
}
2 changes: 1 addition & 1 deletion scripts/sekaidtestsetup.sh
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ rm -rf $HOME/.sekaid/

cd $HOME

sekaid init --chain-id=testing testing --home=$HOME/.sekaid
sekaid init --default-denom="ukex" --bech32-prefix="kira" --chain-id=testing testing --home=$HOME/.sekaid
sekaid keys add validator --keyring-backend=test --home=$HOME/.sekaid
sekaid add-genesis-account $(sekaid keys show validator -a --keyring-backend=test --home=$HOME/.sekaid) 1000000000000000ukex,1000000000ubtc,1000000000ueth,1000000000validatortoken,1000000000stake,10000000frozen,10000000samolean --home=$HOME/.sekaid
sekaid gentx-claim validator --keyring-backend=test --moniker="hello" --home=$HOME/.sekaid
Expand Down
12 changes: 5 additions & 7 deletions testutil/network/network.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import (
"time"

"github.com/KiraCore/sekai/app"
appparams "github.com/KiraCore/sekai/app/params"
"github.com/KiraCore/sekai/x/genutil"
"github.com/cosmos/cosmos-sdk/baseapp"
"github.com/cosmos/cosmos-sdk/client"
Expand Down Expand Up @@ -44,9 +45,6 @@ import (
"google.golang.org/grpc"
)

// DefaultBondDenom defines default denom for fee
var DefaultBondDenom = "ukex"

// package-wide network lock to only allow one test network at a time
var lock = new(sync.Mutex)

Expand Down Expand Up @@ -80,7 +78,7 @@ type Config struct {
TimeoutCommit time.Duration // the consensus commitment timeout
ChainID string // the network chain-id
NumValidators int // the total number of validators to create and bond
BondDenom string // the staking bond denomination
DefaultDenom string // the staking bond denomination
MinGasPrices string // the minimum gas prices each validator will accept
AccountTokens sdk.Int // the amount of unique validator tokens (e.g. 1000node0)
StakingTokens sdk.Int // the amount of tokens each validator has available to stake
Expand Down Expand Up @@ -108,8 +106,8 @@ func DefaultConfig() Config {
TimeoutCommit: 2 * time.Second,
ChainID: "chain-" + tmrand.NewRand().Str(6),
NumValidators: 4,
BondDenom: DefaultBondDenom,
MinGasPrices: fmt.Sprintf("0.000006%s", DefaultBondDenom),
DefaultDenom: appparams.DefaultDenom,
MinGasPrices: fmt.Sprintf("0.000006%s", appparams.DefaultDenom),
AccountTokens: sdk.TokensFromConsensusPower(1000, sdk.DefaultPowerReduction),
StakingTokens: sdk.TokensFromConsensusPower(500, sdk.DefaultPowerReduction),
BondedTokens: sdk.TokensFromConsensusPower(100, sdk.DefaultPowerReduction),
Expand Down Expand Up @@ -283,7 +281,7 @@ func New(t *testing.T, cfg Config) *Network {

balances := sdk.NewCoins(
sdk.NewCoin(fmt.Sprintf("%stoken", nodeDirName), cfg.AccountTokens),
sdk.NewCoin(cfg.BondDenom, cfg.StakingTokens),
sdk.NewCoin(cfg.DefaultDenom, cfg.StakingTokens),
)

genFiles = append(genFiles, tmCfg.GenesisFile())
Expand Down
2 changes: 1 addition & 1 deletion types/constants.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,6 @@ package types
const (
// we set page iteration limit for safety
PageIterationLimit = 512
SekaiVersion = "v0.3.18"
SekaiVersion = "v0.3.20"
CosmosVersion = "v0.45.10"
)
5 changes: 0 additions & 5 deletions x/basket/keeper/keeper.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,6 @@ func NewKeeper(storeKey sdk.StoreKey, cdc codec.BinaryCodec, ak types.AccountKee
}
}

// BondDenom returns the denom that is basically used for fee payment
func (k Keeper) BondDenom(ctx sdk.Context) string {
return "ukex"
}

func (k Keeper) CheckIfAllowedPermission(ctx sdk.Context, addr sdk.AccAddress, permValue govtypes.PermValue) bool {
return govkeeper.CheckIfAllowedPermission(ctx, k.gk, addr, govtypes.PermHandleBasketEmergency)
}
Loading

0 comments on commit 197cdce

Please sign in to comment.