From e2b6dc191a83f2db94544653605bf202ca363b60 Mon Sep 17 00:00:00 2001 From: Anh Minh <1phamminh0811@gmail.com> Date: Wed, 17 Jul 2024 12:43:28 +0700 Subject: [PATCH 1/3] lint --- app/upgrades/v8_1/constants.go | 2 +- app/upgrades/v8_1/upgrades.go | 2 +- custom/auth/post/post.go | 17 ++++++++--------- custom/wasm/keeper/handler_plugin.go | 2 +- forwarder.wasm | Bin 161073 -> 0 bytes scripts/run-node.sh | 6 +++--- x/tax2gas/ante/ante.go | 7 +++---- x/tax2gas/ante/fee_test.go | 1 - x/tax2gas/module.go | 6 +++--- x/tax2gas/post/post.go | 16 ++++++++-------- x/tax2gas/types/expected_keeper.go | 2 +- x/tax2gas/utils/fee_tax.go | 19 +++++++++---------- 12 files changed, 38 insertions(+), 42 deletions(-) delete mode 100644 forwarder.wasm diff --git a/app/upgrades/v8_1/constants.go b/app/upgrades/v8_1/constants.go index f970040c8..b664957c9 100644 --- a/app/upgrades/v8_1/constants.go +++ b/app/upgrades/v8_1/constants.go @@ -1,4 +1,4 @@ -package v8_1 +package v81 import ( "github.com/classic-terra/core/v3/app/upgrades" diff --git a/app/upgrades/v8_1/upgrades.go b/app/upgrades/v8_1/upgrades.go index 3ca0dee33..12c59f5e9 100644 --- a/app/upgrades/v8_1/upgrades.go +++ b/app/upgrades/v8_1/upgrades.go @@ -1,4 +1,4 @@ -package v8_1 +package v81 import ( "github.com/classic-terra/core/v3/app/keepers" diff --git a/custom/auth/post/post.go b/custom/auth/post/post.go index 19c4eda9a..bb737fc07 100644 --- a/custom/auth/post/post.go +++ b/custom/auth/post/post.go @@ -3,10 +3,9 @@ package post import ( dyncommkeeper "github.com/classic-terra/core/v3/x/dyncomm/keeper" dyncommpost "github.com/classic-terra/core/v3/x/dyncomm/post" - tax2gasKeeper "github.com/classic-terra/core/v3/x/tax2gas/keeper" - tax2gasPost "github.com/classic-terra/core/v3/x/tax2gas/post" - "github.com/classic-terra/core/v3/x/tax2gas/types" - tax2gasTypes "github.com/classic-terra/core/v3/x/tax2gas/types" + tax2gaskeeper "github.com/classic-terra/core/v3/x/tax2gas/keeper" + tax2gaspost "github.com/classic-terra/core/v3/x/tax2gas/post" + tax2gastypes "github.com/classic-terra/core/v3/x/tax2gas/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/auth/ante" ) @@ -14,11 +13,11 @@ import ( // HandlerOptions are the options required for constructing a default SDK AnteHandler. type HandlerOptions struct { AccountKeeper ante.AccountKeeper - BankKeeper types.BankKeeper - FeegrantKeeper types.FeegrantKeeper + BankKeeper tax2gastypes.BankKeeper + FeegrantKeeper tax2gastypes.FeegrantKeeper DyncommKeeper dyncommkeeper.Keeper - TreasuryKeeper tax2gasTypes.TreasuryKeeper - Tax2Gaskeeper tax2gasKeeper.Keeper + TreasuryKeeper tax2gastypes.TreasuryKeeper + Tax2Gaskeeper tax2gaskeeper.Keeper } // NewPostHandler returns an PostHandler that checks and set target @@ -26,6 +25,6 @@ type HandlerOptions struct { func NewPostHandler(options HandlerOptions) (sdk.PostHandler, error) { return sdk.ChainPostDecorators( dyncommpost.NewDyncommPostDecorator(options.DyncommKeeper), - tax2gasPost.NewTax2GasPostDecorator(options.AccountKeeper, options.BankKeeper, options.FeegrantKeeper, options.TreasuryKeeper, options.Tax2Gaskeeper), + tax2gaspost.NewTax2GasPostDecorator(options.AccountKeeper, options.BankKeeper, options.FeegrantKeeper, options.TreasuryKeeper, options.Tax2Gaskeeper), ), nil } diff --git a/custom/wasm/keeper/handler_plugin.go b/custom/wasm/keeper/handler_plugin.go index 49cea8f54..55943fa05 100644 --- a/custom/wasm/keeper/handler_plugin.go +++ b/custom/wasm/keeper/handler_plugin.go @@ -92,7 +92,7 @@ func (h SDKMessageHandler) DispatchMsg(ctx sdk.Context, contractAddr sdk.AccAddr if !taxes.IsZero() { eventManager := sdk.NewEventManager() - gas, err := tax2gasutils.ComputeGas(ctx, h.tax2gaskeeper.GetGasPrices(ctx), taxes) + gas, err := tax2gasutils.ComputeGas(h.tax2gaskeeper.GetGasPrices(ctx), taxes) if err != nil { return nil, nil, err } diff --git a/forwarder.wasm b/forwarder.wasm deleted file mode 100644 index 53b24d72c46052f621a5ebd4e97f40d785955a6a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 161073 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 0 { return ctx, errorsmod.Wrapf(sdkerrors.ErrInsufficientFee, "fees are not enough to pay for gas") diff --git a/x/tax2gas/types/expected_keeper.go b/x/tax2gas/types/expected_keeper.go index 9281fec9c..b807a722d 100644 --- a/x/tax2gas/types/expected_keeper.go +++ b/x/tax2gas/types/expected_keeper.go @@ -2,8 +2,8 @@ package types import ( "cosmossdk.io/math" - "github.com/cosmos/cosmos-sdk/x/feegrant" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/feegrant" ) // TreasuryKeeper for tax charging & recording diff --git a/x/tax2gas/utils/fee_tax.go b/x/tax2gas/utils/fee_tax.go index a8d48b8ff..fd00be723 100644 --- a/x/tax2gas/utils/fee_tax.go +++ b/x/tax2gas/utils/fee_tax.go @@ -115,21 +115,20 @@ func computeTax(ctx sdk.Context, tk types.TreasuryKeeper, principal sdk.Coins) s return taxes } -func ComputeGas(ctx sdk.Context, gasPrices sdk.DecCoins, taxes sdk.Coins) (uint64, error) { +func ComputeGas(gasPrices sdk.DecCoins, taxes sdk.Coins) (uint64, error) { taxes = taxes.Sort() - - var tax2gas sdkmath.Int = sdkmath.ZeroInt() - + tax2gas := sdkmath.ZeroInt() // Convert to gas - var i, j int = 0, 0 + i, j := 0, 0 for i < len(gasPrices) && j < len(taxes) { - if gasPrices[i].Denom == taxes[j].Denom { - tax2gas = tax2gas.Add(sdkmath.Int(sdk.NewDec(taxes[j].Amount.Int64()).Quo((gasPrices[i].Amount)).Ceil().RoundInt())) + switch { + case gasPrices[i].Denom == taxes[j].Denom: + tax2gas = tax2gas.Add(sdk.NewDec(taxes[j].Amount.Int64()).Quo((gasPrices[i].Amount)).Ceil().RoundInt()) i++ j++ - } else if gasPrices[i].Denom < taxes[j].Denom { + case gasPrices[i].Denom < taxes[j].Denom: i++ - } else { + default: j++ } } @@ -137,7 +136,7 @@ func ComputeGas(ctx sdk.Context, gasPrices sdk.DecCoins, taxes sdk.Coins) (uint6 return tax2gas.Uint64(), nil } -func ComputeFeesOnGasConsumed(ctx sdk.Context, tx sdk.Tx, gasPrices sdk.DecCoins, gas uint64) (sdk.Coins, error) { +func ComputeFeesOnGasConsumed(tx sdk.Tx, gasPrices sdk.DecCoins, gas uint64) (sdk.Coins, error) { feeTx, ok := tx.(sdk.FeeTx) if !ok { return nil, errorsmod.Wrap(sdkerrors.ErrTxDecode, "Tx must be a FeeTx") From 2f779bfe952a7f30e20490b44747e80712b50746 Mon Sep 17 00:00:00 2001 From: Anh Minh <1phamminh0811@gmail.com> Date: Wed, 17 Jul 2024 12:45:35 +0700 Subject: [PATCH 2/3] lint --- x/tax2gas/ante/fee_test.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/x/tax2gas/ante/fee_test.go b/x/tax2gas/ante/fee_test.go index 44952bf70..c13f89f70 100644 --- a/x/tax2gas/ante/fee_test.go +++ b/x/tax2gas/ante/fee_test.go @@ -11,9 +11,7 @@ import ( "github.com/classic-terra/core/v3/x/tax2gas/ante" ) -var ( - sendCoins = sdk.NewCoins(sdk.NewInt64Coin(core.MicroLunaDenom, int64(1000000))) -) +var sendCoins = sdk.NewCoins(sdk.NewInt64Coin(core.MicroLunaDenom, int64(1000000))) func (s *AnteTestSuite) TestDeductFeeDecorator() { s.SetupTest(true) // setup From 8ecad7eb4d3bff1a0c7273201a026dd55cb74311 Mon Sep 17 00:00:00 2001 From: Anh Minh <1phamminh0811@gmail.com> Date: Wed, 17 Jul 2024 14:20:14 +0700 Subject: [PATCH 3/3] fix interchain test --- custom/wasm/keeper/handler_plugin.go | 20 +++--- proto/terra/tax2gas/v1beta1/genesis.proto | 2 + tests/interchaintest/setup.go | 4 ++ x/tax2gas/ante/ante.go | 2 +- x/tax2gas/keeper/keeper.go | 4 ++ x/tax2gas/keeper/msg_server.go | 4 +- x/tax2gas/post/post.go | 22 +++--- x/tax2gas/types/genesis.pb.go | 88 +++++++++++++++++------ x/tax2gas/types/params.go | 10 ++- 9 files changed, 108 insertions(+), 48 deletions(-) diff --git a/custom/wasm/keeper/handler_plugin.go b/custom/wasm/keeper/handler_plugin.go index 55943fa05..2f8fe2c6b 100644 --- a/custom/wasm/keeper/handler_plugin.go +++ b/custom/wasm/keeper/handler_plugin.go @@ -88,17 +88,19 @@ func (h SDKMessageHandler) DispatchMsg(ctx sdk.Context, contractAddr sdk.AccAddr } for _, sdkMsg := range sdkMsgs { - taxes := FilterMsgAndComputeTax(ctx, h.treasuryKeeper, sdkMsg) - if !taxes.IsZero() { - eventManager := sdk.NewEventManager() + if h.tax2gaskeeper.IsEnabled(ctx) { + taxes := FilterMsgAndComputeTax(ctx, h.treasuryKeeper, sdkMsg) + if !taxes.IsZero() { + eventManager := sdk.NewEventManager() + + gas, err := tax2gasutils.ComputeGas(h.tax2gaskeeper.GetGasPrices(ctx), taxes) + if err != nil { + return nil, nil, err + } + ctx.GasMeter().ConsumeGas(gas, "tax gas") - gas, err := tax2gasutils.ComputeGas(h.tax2gaskeeper.GetGasPrices(ctx), taxes) - if err != nil { - return nil, nil, err + events = eventManager.Events() } - ctx.GasMeter().ConsumeGas(gas, "tax gas") - - events = eventManager.Events() } res, err := h.handleSdkMessage(ctx, contractAddr, sdkMsg) diff --git a/proto/terra/tax2gas/v1beta1/genesis.proto b/proto/terra/tax2gas/v1beta1/genesis.proto index 7299cad79..7c63e7be2 100644 --- a/proto/terra/tax2gas/v1beta1/genesis.proto +++ b/proto/terra/tax2gas/v1beta1/genesis.proto @@ -17,6 +17,8 @@ message Params { (gogoproto.nullable) = false, (amino.dont_omitempty) = true ]; + + bool enabled = 2; } // GenesisState defines the tax2gas module's genesis state. diff --git a/tests/interchaintest/setup.go b/tests/interchaintest/setup.go index 336c0b389..00b826307 100644 --- a/tests/interchaintest/setup.go +++ b/tests/interchaintest/setup.go @@ -81,6 +81,10 @@ func ModifyGenesis() func(ibc.ChainConfig, []byte) ([]byte, error) { if err := dyno.Set(g, chainConfig.Denom, "app_state", "gov", "params", "min_deposit", 0, "denom"); err != nil { return nil, fmt.Errorf("failed to set voting period in genesis json: %w", err) } + // Disable tax2gas params to disable + if err := dyno.Set(g, false, "app_state", "tax2gas", "params", "enabled"); err != nil { + return nil, fmt.Errorf("failed to set tax2gas params in genesis json: %w", err) + } // Modify signed blocks window if err := dyno.Set(g, signedBlocksWindow, "app_state", "slashing", "params", "signed_blocks_window"); err != nil { return nil, fmt.Errorf("failed to set signed blocks window in genesis json: %w", err) diff --git a/x/tax2gas/ante/ante.go b/x/tax2gas/ante/ante.go index 91c060c2a..d022caf58 100644 --- a/x/tax2gas/ante/ante.go +++ b/x/tax2gas/ante/ante.go @@ -53,7 +53,7 @@ func (fd FeeDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, nex ) msgs := feeTx.GetMsgs() - if tax2gasutils.IsOracleTx(msgs) || simulate { + if tax2gasutils.IsOracleTx(msgs) || simulate || !fd.tax2gasKeeper.IsEnabled(ctx) { return next(ctx, tx, simulate) } diff --git a/x/tax2gas/keeper/keeper.go b/x/tax2gas/keeper/keeper.go index 799363108..c312b5c84 100644 --- a/x/tax2gas/keeper/keeper.go +++ b/x/tax2gas/keeper/keeper.go @@ -60,6 +60,10 @@ func (k Keeper) GetAuthority() string { return k.authority } +func (k Keeper) IsEnabled(ctx sdk.Context) bool { + return k.GetParams(ctx).Enabled +} + func (k Keeper) GetGasPrices(ctx sdk.Context) sdk.DecCoins { return k.GetParams(ctx).GasPrices.Sort() } diff --git a/x/tax2gas/keeper/msg_server.go b/x/tax2gas/keeper/msg_server.go index dec91e807..2bfff7a50 100644 --- a/x/tax2gas/keeper/msg_server.go +++ b/x/tax2gas/keeper/msg_server.go @@ -3,8 +3,8 @@ package keeper import ( "context" + errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" "github.com/classic-terra/core/v3/x/tax2gas/types" @@ -24,7 +24,7 @@ func NewMsgServerImpl(keeper Keeper) types.MsgServer { func (k msgServer) UpdateParams(goCtx context.Context, req *types.MsgUpdateParams) (*types.MsgUpdateParamsResponse, error) { if k.GetAuthority() != req.Authority { - return nil, sdkerrors.Wrapf(govtypes.ErrInvalidSigner, "invalid authority; expected %s, got %s", k.GetAuthority(), req.Authority) + return nil, errorsmod.Wrapf(govtypes.ErrInvalidSigner, "invalid authority; expected %s, got %s", k.GetAuthority(), req.Authority) } ctx := sdk.UnwrapSDKContext(goCtx) diff --git a/x/tax2gas/post/post.go b/x/tax2gas/post/post.go index bb89b6e03..9682c52c1 100644 --- a/x/tax2gas/post/post.go +++ b/x/tax2gas/post/post.go @@ -31,7 +31,7 @@ func NewTax2GasPostDecorator(accountKeeper ante.AccountKeeper, bankKeeper types. } // TODO: handle fail tx -func (dd Tax2gasPostDecorator) PostHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, success bool, next sdk.PostHandler) (sdk.Context, error) { +func (tgd Tax2gasPostDecorator) PostHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, success bool, next sdk.PostHandler) (sdk.Context, error) { feeTx, ok := tx.(sdk.FeeTx) if !ok { return ctx, errorsmod.Wrap(sdkerrors.ErrTxDecode, "Tx must be a FeeTx") @@ -41,7 +41,7 @@ func (dd Tax2gasPostDecorator) PostHandle(ctx sdk.Context, tx sdk.Tx, simulate b return ctx, errorsmod.Wrap(sdkerrors.ErrInvalidGasLimit, "must provide positive gas") } msgs := feeTx.GetMsgs() - if tax2gasutils.IsOracleTx(msgs) || simulate { + if tax2gasutils.IsOracleTx(msgs) || simulate || !tgd.tax2gasKeeper.IsEnabled(ctx) { return next(ctx, tx, simulate, success) } @@ -59,7 +59,7 @@ func (dd Tax2gasPostDecorator) PostHandle(ctx sdk.Context, tx sdk.Tx, simulate b return next(ctx, tx, simulate, success) } - gasPrices := dd.tax2gasKeeper.GetGasPrices(ctx) + gasPrices := tgd.tax2gasKeeper.GetGasPrices(ctx) found, paidDenomGasPrice := tax2gasutils.GetGasPriceByDenom(gasPrices, paidDenom) if !found { return ctx, types.ErrDenomNotFound @@ -85,10 +85,10 @@ func (dd Tax2gasPostDecorator) PostHandle(ctx sdk.Context, tx sdk.Tx, simulate b // if feegranter set deduct fee from feegranter account. // this works with only when feegrant enabled. if feeGranter != nil { - if dd.feegrantKeeper == nil { + if tgd.feegrantKeeper == nil { return ctx, sdkerrors.ErrInvalidRequest.Wrap("fee grants are not enabled") } else if !feeGranter.Equals(feePayer) { - allowance, err := dd.feegrantKeeper.GetAllowance(ctx, feeGranter, feePayer) + allowance, err := tgd.feegrantKeeper.GetAllowance(ctx, feeGranter, feePayer) if err != nil { return ctx, errorsmod.Wrapf(err, "fee-grant not found with granter %s and grantee %s", feeGranter, feePayer) } @@ -102,12 +102,12 @@ func (dd Tax2gasPostDecorator) PostHandle(ctx sdk.Context, tx sdk.Tx, simulate b for _, feeRequired := range gasRemainingFees { _, err := allowance.Accept(ctx, sdk.NewCoins(feeRequired), feeTx.GetMsgs()) if err == nil { - err = dd.feegrantKeeper.UseGrantedFees(ctx, feeGranter, feePayer, sdk.NewCoins(feeRequired), feeTx.GetMsgs()) + err = tgd.feegrantKeeper.UseGrantedFees(ctx, feeGranter, feePayer, sdk.NewCoins(feeRequired), feeTx.GetMsgs()) if err != nil { return ctx, errorsmod.Wrapf(err, "%s does not allow to pay fees for %s", feeGranter, feePayer) } - feeGranter := dd.accountKeeper.GetAccount(ctx, feeGranter) - err = dd.bankKeeper.SendCoinsFromAccountToModule(ctx, feeGranter.GetAddress(), authtypes.FeeCollectorName, sdk.NewCoins(feeRequired)) + feeGranter := tgd.accountKeeper.GetAccount(ctx, feeGranter) + err = tgd.bankKeeper.SendCoinsFromAccountToModule(ctx, feeGranter.GetAddress(), authtypes.FeeCollectorName, sdk.NewCoins(feeRequired)) if err != nil { return ctx, errorsmod.Wrapf(sdkerrors.ErrInsufficientFunds, err.Error()) } @@ -119,7 +119,7 @@ func (dd Tax2gasPostDecorator) PostHandle(ctx sdk.Context, tx sdk.Tx, simulate b } for _, feeCoin := range feeCoins { - feePayer := dd.accountKeeper.GetAccount(ctx, feePayer) + feePayer := tgd.accountKeeper.GetAccount(ctx, feePayer) found, gasPrice := tax2gasutils.GetGasPriceByDenom(gasPrices, feeCoin.Denom) if !found { continue @@ -127,7 +127,7 @@ func (dd Tax2gasPostDecorator) PostHandle(ctx sdk.Context, tx sdk.Tx, simulate b feeRequired := sdk.NewCoin(feeCoin.Denom, gasPrice.MulInt64(int64(gasRemaining)).Ceil().RoundInt()) if feeCoin.IsGTE(feeRequired) { - err := dd.bankKeeper.SendCoinsFromAccountToModule(ctx, feePayer.GetAddress(), authtypes.FeeCollectorName, sdk.NewCoins(feeRequired)) + err := tgd.bankKeeper.SendCoinsFromAccountToModule(ctx, feePayer.GetAddress(), authtypes.FeeCollectorName, sdk.NewCoins(feeRequired)) if err != nil { return ctx, errorsmod.Wrapf(sdkerrors.ErrInsufficientFunds, err.Error()) } @@ -135,7 +135,7 @@ func (dd Tax2gasPostDecorator) PostHandle(ctx sdk.Context, tx sdk.Tx, simulate b break } - err := dd.bankKeeper.SendCoinsFromAccountToModule(ctx, feePayer.GetAddress(), authtypes.FeeCollectorName, sdk.NewCoins(feeCoin)) + err := tgd.bankKeeper.SendCoinsFromAccountToModule(ctx, feePayer.GetAddress(), authtypes.FeeCollectorName, sdk.NewCoins(feeCoin)) if err != nil { return ctx, errorsmod.Wrapf(sdkerrors.ErrInsufficientFunds, err.Error()) } diff --git a/x/tax2gas/types/genesis.pb.go b/x/tax2gas/types/genesis.pb.go index 7872c590c..33a27210d 100644 --- a/x/tax2gas/types/genesis.pb.go +++ b/x/tax2gas/types/genesis.pb.go @@ -28,6 +28,7 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package type Params struct { GasPrices github_com_cosmos_cosmos_sdk_types.DecCoins `protobuf:"bytes,1,rep,name=gas_prices,json=gasPrices,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.DecCoins" json:"gas_prices" yaml:"gas_prices"` + Enabled bool `protobuf:"varint,2,opt,name=enabled,proto3" json:"enabled,omitempty"` } func (m *Params) Reset() { *m = Params{} } @@ -70,6 +71,13 @@ func (m *Params) GetGasPrices() github_com_cosmos_cosmos_sdk_types.DecCoins { return nil } +func (m *Params) GetEnabled() bool { + if m != nil { + return m.Enabled + } + return false +} + // GenesisState defines the tax2gas module's genesis state. type GenesisState struct { // params is the container of tax2gas parameters. @@ -126,29 +134,30 @@ func init() { } var fileDescriptor_589c4ef0e5113034 = []byte{ - // 350 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x2e, 0x49, 0x2d, 0x2a, - 0x4a, 0xd4, 0x2f, 0x49, 0xac, 0x30, 0x4a, 0x4f, 0x2c, 0xd6, 0x2f, 0x33, 0x4c, 0x4a, 0x2d, 0x49, - 0x34, 0xd4, 0x4f, 0x4f, 0xcd, 0x4b, 0x2d, 0xce, 0x2c, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, - 0x12, 0x05, 0x2b, 0xd2, 0x83, 0x2a, 0xd2, 0x83, 0x2a, 0x92, 0x12, 0x49, 0xcf, 0x4f, 0xcf, 0x07, - 0xab, 0xd0, 0x07, 0xb1, 0x20, 0x8a, 0xa5, 0xe4, 0x92, 0xf3, 0x8b, 0x73, 0xf3, 0x8b, 0xf5, 0x93, - 0x12, 0x8b, 0x53, 0xe1, 0xe6, 0x25, 0xe7, 0x67, 0xe6, 0x41, 0xe5, 0x05, 0x13, 0x73, 0x33, 0xf3, - 0xf2, 0xf5, 0xc1, 0x24, 0x44, 0x48, 0x69, 0x1b, 0x23, 0x17, 0x5b, 0x40, 0x62, 0x51, 0x62, 0x6e, - 0xb1, 0x50, 0x17, 0x23, 0x17, 0x57, 0x7a, 0x62, 0x71, 0x7c, 0x41, 0x51, 0x66, 0x72, 0x6a, 0xb1, - 0x04, 0xa3, 0x02, 0xb3, 0x06, 0xb7, 0x91, 0x8c, 0x1e, 0xc4, 0x4c, 0x3d, 0x90, 0x99, 0x30, 0xeb, - 0xf5, 0x5c, 0x52, 0x93, 0x9d, 0xf3, 0x33, 0xf3, 0x9c, 0x7c, 0x4f, 0xdc, 0x93, 0x67, 0xf8, 0x74, - 0x4f, 0x5e, 0xb0, 0x32, 0x31, 0x37, 0xc7, 0x4a, 0x09, 0xa1, 0x5b, 0x69, 0xd5, 0x7d, 0x79, 0xed, - 0xf4, 0xcc, 0x92, 0x8c, 0xd2, 0x24, 0xbd, 0xe4, 0xfc, 0x5c, 0x7d, 0xa8, 0xc3, 0x20, 0x94, 0x6e, - 0x71, 0x4a, 0xb6, 0x7e, 0x49, 0x65, 0x41, 0x6a, 0x31, 0xcc, 0xa0, 0xe2, 0x15, 0xcf, 0x37, 0x68, - 0x31, 0x06, 0x71, 0xa6, 0x27, 0x16, 0x07, 0x80, 0xf5, 0x5b, 0xc9, 0xcf, 0x58, 0x20, 0xcf, 0xd8, - 0xf5, 0x7c, 0x83, 0x96, 0x18, 0x24, 0x94, 0x2a, 0xe0, 0xe1, 0x04, 0x71, 0xad, 0x92, 0x37, 0x17, - 0x8f, 0x3b, 0x24, 0xa4, 0x82, 0x4b, 0x12, 0x4b, 0x52, 0x85, 0xac, 0xb9, 0xd8, 0x0a, 0xc0, 0x32, - 0x12, 0x8c, 0x0a, 0x8c, 0x1a, 0xdc, 0x46, 0xb2, 0x7a, 0x58, 0x43, 0x4e, 0x0f, 0xa2, 0xdd, 0x89, - 0x05, 0xe4, 0xf2, 0x20, 0xa8, 0x16, 0x27, 0xaf, 0x13, 0x8f, 0xe4, 0x18, 0x2f, 0x3c, 0x92, 0x63, - 0x7c, 0xf0, 0x48, 0x8e, 0x71, 0xc2, 0x63, 0x39, 0x86, 0x0b, 0x8f, 0xe5, 0x18, 0x6e, 0x3c, 0x96, - 0x63, 0x88, 0x32, 0x40, 0xf6, 0x44, 0x4e, 0x62, 0x71, 0x71, 0x66, 0xb2, 0x2e, 0xc4, 0x45, 0xc9, - 0xf9, 0x45, 0xa9, 0xfa, 0x65, 0xc6, 0x48, 0x2e, 0x03, 0x7b, 0x29, 0x89, 0x0d, 0x1c, 0xb0, 0xc6, - 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0xa9, 0x45, 0xad, 0x9c, 0xdf, 0x01, 0x00, 0x00, + // 362 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x50, 0x3f, 0x4f, 0xc2, 0x40, + 0x1c, 0xed, 0xa9, 0x41, 0x2d, 0x2e, 0x34, 0x6a, 0x1a, 0xa2, 0x2d, 0xa9, 0x0b, 0xc1, 0x70, 0x27, + 0xb0, 0xe1, 0x86, 0x26, 0x26, 0x1a, 0x13, 0x82, 0x9b, 0x8b, 0xb9, 0x96, 0x4b, 0x6d, 0xa4, 0xbd, + 0xa6, 0xbf, 0x93, 0xc0, 0x57, 0x60, 0x72, 0x74, 0x74, 0x34, 0x4e, 0x7c, 0x0c, 0x46, 0x46, 0x27, + 0x34, 0x30, 0xb0, 0xfb, 0x09, 0x0c, 0x77, 0x05, 0x19, 0x5c, 0xee, 0xdf, 0xef, 0xbd, 0x77, 0xef, + 0x3d, 0xfd, 0x44, 0xb0, 0x24, 0xa1, 0x44, 0xd0, 0x5e, 0xd5, 0xa7, 0x40, 0xba, 0x15, 0x97, 0x09, + 0x5a, 0x21, 0x3e, 0x8b, 0x18, 0x04, 0x80, 0xe3, 0x84, 0x0b, 0x6e, 0x1c, 0x48, 0x10, 0x4e, 0x41, + 0x38, 0x05, 0xe5, 0xf7, 0x7d, 0xee, 0x73, 0x89, 0x20, 0x8b, 0x93, 0x02, 0xe7, 0x2d, 0x8f, 0x43, + 0xc8, 0x81, 0xb8, 0x14, 0xd8, 0x4a, 0xcf, 0xe3, 0x41, 0x94, 0xce, 0x73, 0x34, 0x0c, 0x22, 0x4e, + 0xe4, 0xaa, 0x9e, 0x9c, 0x31, 0xd2, 0x33, 0x4d, 0x9a, 0xd0, 0x10, 0x8c, 0x01, 0xd2, 0x75, 0x9f, + 0xc2, 0x43, 0x9c, 0x04, 0x1e, 0x03, 0x13, 0x15, 0x36, 0x8b, 0xd9, 0xea, 0x11, 0x56, 0x9a, 0x78, + 0xa1, 0xb9, 0xfc, 0x1e, 0x5f, 0x32, 0xef, 0x82, 0x07, 0x51, 0xe3, 0x76, 0x34, 0xb1, 0xb5, 0x9f, + 0x89, 0x9d, 0xeb, 0xd3, 0xb0, 0x53, 0x77, 0xfe, 0xd8, 0xce, 0xc7, 0x97, 0x7d, 0xea, 0x07, 0xe2, + 0xf1, 0xd9, 0xc5, 0x1e, 0x0f, 0x49, 0x6a, 0x4c, 0x6d, 0x65, 0x68, 0x3f, 0x11, 0xd1, 0x8f, 0x19, + 0x2c, 0x85, 0xe0, 0x7d, 0x3e, 0x2c, 0xa1, 0xd6, 0xae, 0x4f, 0xa1, 0x29, 0xf9, 0x86, 0xa9, 0x6f, + 0xb3, 0x88, 0xba, 0x1d, 0xd6, 0x36, 0x37, 0x0a, 0xa8, 0xb8, 0xd3, 0x5a, 0x5e, 0xeb, 0xf6, 0xeb, + 0x9b, 0x8d, 0x06, 0xf3, 0x61, 0xe9, 0x50, 0xf5, 0xd7, 0x5b, 0x35, 0xa8, 0x72, 0x38, 0x37, 0xfa, + 0xde, 0x95, 0xea, 0xf0, 0x4e, 0x50, 0xc1, 0x8c, 0x73, 0x3d, 0x13, 0xcb, 0x89, 0x89, 0x0a, 0xa8, + 0x98, 0xad, 0x1e, 0xe3, 0x7f, 0x3b, 0xc5, 0x8a, 0xde, 0xd8, 0x5a, 0x64, 0x6a, 0xa5, 0x94, 0xc6, + 0xf5, 0x68, 0x6a, 0xa1, 0xf1, 0xd4, 0x42, 0xdf, 0x53, 0x0b, 0xbd, 0xcc, 0x2c, 0x6d, 0x3c, 0xb3, + 0xb4, 0xcf, 0x99, 0xa5, 0xdd, 0x9f, 0xad, 0xc7, 0xeb, 0x50, 0x80, 0xc0, 0x2b, 0x2b, 0x47, 0x1e, + 0x4f, 0x18, 0xe9, 0xd6, 0xd6, 0x9c, 0xc9, 0xb0, 0x6e, 0x46, 0x56, 0x5e, 0xfb, 0x0d, 0x00, 0x00, + 0xff, 0xff, 0x88, 0xc0, 0xca, 0x42, 0xf9, 0x01, 0x00, 0x00, } func (m *Params) Marshal() (dAtA []byte, err error) { @@ -171,6 +180,16 @@ func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.Enabled { + i-- + if m.Enabled { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x10 + } if len(m.GasPrices) > 0 { for iNdEx := len(m.GasPrices) - 1; iNdEx >= 0; iNdEx-- { { @@ -244,6 +263,9 @@ func (m *Params) Size() (n int) { n += 1 + l + sovGenesis(uint64(l)) } } + if m.Enabled { + n += 2 + } return n } @@ -327,6 +349,26 @@ func (m *Params) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Enabled", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Enabled = bool(v != 0) default: iNdEx = preIndex skippy, err := skipGenesis(dAtA[iNdEx:]) diff --git a/x/tax2gas/types/params.go b/x/tax2gas/types/params.go index 1ced415fd..c1de909bf 100644 --- a/x/tax2gas/types/params.go +++ b/x/tax2gas/types/params.go @@ -38,13 +38,19 @@ func DefaultParams() Params { sdk.NewDecCoinFromDec("umyr", sdk.NewDecWithPrec(3, 0)), sdk.NewDecCoinFromDec("utwd", sdk.NewDecWithPrec(20, 0)), ), + Enabled: true, } } // Validate validates params. func (p Params) Validate() error { - if len(p.GasPrices) == 0 { - return fmt.Errorf("must provide at least 1 gas prices") + if p.Enabled { + if len(p.GasPrices) == 0 { + return fmt.Errorf("must provide at least 1 gas prices") + } + if !p.GasPrices.IsAllPositive() { + return fmt.Errorf("gas prices must be positive") + } } return nil }