Skip to content

Commit

Permalink
consume tax gas in wasm plugin
Browse files Browse the repository at this point in the history
  • Loading branch information
expertdicer committed Jul 16, 2024
1 parent ed0ad82 commit d57e4ce
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 32 deletions.
1 change: 1 addition & 0 deletions app/keepers/keepers.go
Original file line number Diff line number Diff line change
Expand Up @@ -399,6 +399,7 @@ func NewAppKeepers(
appKeepers.BankKeeper,
appKeepers.TreasuryKeeper,
appKeepers.AccountKeeper,
appKeepers.Tax2gasKeeper,
appCodec,
appKeepers.TransferKeeper,
)
Expand Down
22 changes: 11 additions & 11 deletions custom/wasm/keeper/handler_plugin.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import (
codectypes "github.com/cosmos/cosmos-sdk/codec/types"
sdk "github.com/cosmos/cosmos-sdk/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
cosmosante "github.com/cosmos/cosmos-sdk/x/auth/ante"
authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper"
authz "github.com/cosmos/cosmos-sdk/x/authz"
bankKeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper"
Expand All @@ -20,7 +19,9 @@ import (
wasmvmtypes "github.com/CosmWasm/wasmvm/types"

marketexported "github.com/classic-terra/core/v3/x/market/exported"
tax2gaskeeper "github.com/classic-terra/core/v3/x/tax2gas/keeper"
"github.com/classic-terra/core/v3/x/tax2gas/types"
tax2gasutils "github.com/classic-terra/core/v3/x/tax2gas/utils"
treasurykeeper "github.com/classic-terra/core/v3/x/treasury/keeper"
)

Expand All @@ -42,6 +43,7 @@ type SDKMessageHandler struct {
treasuryKeeper treasurykeeper.Keeper
accountKeeper authkeeper.AccountKeeper
bankKeeper bankKeeper.Keeper
tax2gaskeeper tax2gaskeeper.Keeper
}

func NewMessageHandler(
Expand All @@ -52,6 +54,7 @@ func NewMessageHandler(
bankKeeper bankKeeper.Keeper,
treasuryKeeper treasurykeeper.Keeper,
accountKeeper authkeeper.AccountKeeper,
tax2gaskeeper tax2gaskeeper.Keeper,
unpacker codectypes.AnyUnpacker,
portSource wasmtypes.ICS20TransferPortSource,
customEncoders ...*wasmkeeper.MessageEncoders,
Expand All @@ -61,19 +64,20 @@ func NewMessageHandler(
encoders = encoders.Merge(e)
}
return wasmkeeper.NewMessageHandlerChain(
NewSDKMessageHandler(router, encoders, treasuryKeeper, accountKeeper, bankKeeper),
NewSDKMessageHandler(router, encoders, treasuryKeeper, accountKeeper, bankKeeper, tax2gaskeeper),
wasmkeeper.NewIBCRawPacketHandler(ics4Wrapper, channelKeeper, capabilityKeeper),
wasmkeeper.NewBurnCoinMessageHandler(bankKeeper),
)
}

func NewSDKMessageHandler(router MessageRouter, encoders msgEncoder, treasuryKeeper treasurykeeper.Keeper, accountKeeper authkeeper.AccountKeeper, bankKeeper bankKeeper.Keeper) SDKMessageHandler {
func NewSDKMessageHandler(router MessageRouter, encoders msgEncoder, treasuryKeeper treasurykeeper.Keeper, accountKeeper authkeeper.AccountKeeper, bankKeeper bankKeeper.Keeper, tax2gaskeeper tax2gaskeeper.Keeper) SDKMessageHandler {
return SDKMessageHandler{
router: router,
encoders: encoders,
treasuryKeeper: treasuryKeeper,
accountKeeper: accountKeeper,
bankKeeper: bankKeeper,
tax2gaskeeper: tax2gaskeeper,
}
}

Expand All @@ -83,20 +87,16 @@ func (h SDKMessageHandler) DispatchMsg(ctx sdk.Context, contractAddr sdk.AccAddr
return nil, nil, err
}

txOrigin := ctx.Value(wasmtypes.TxOrigin)
feePayer, ok := txOrigin.(sdk.AccAddress)
if !ok {
return nil, nil, errorsmod.Wrap(sdkerrors.ErrTxDecode, "tx_origin is not valid")
}
for _, sdkMsg := range sdkMsgs {
taxes := FilterMsgAndComputeTax(ctx, h.treasuryKeeper, sdkMsg)
if !taxes.IsZero() {
eventManager := sdk.NewEventManager()
feePayer := h.accountKeeper.GetAccount(ctx, feePayer)
// Deduct from tx_origin
if err := cosmosante.DeductFees(h.bankKeeper, ctx.WithEventManager(eventManager), feePayer, taxes); err != nil {

gas, err := tax2gasutils.ComputeGas(ctx, h.tax2gaskeeper.GetGasPrices(ctx), taxes)
if err != nil {
return nil, nil, err
}
ctx.GasMeter().ConsumeGas(gas, "tax gas")

events = eventManager.Events()
}
Expand Down
2 changes: 1 addition & 1 deletion x/tax2gas/ante/ante.go
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ func (fd FeeDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, nex
// Compute taxes based on sent amount
taxes := tax2gasutils.FilterMsgAndComputeTax(ctx, fd.treasuryKeeper, msgs...)
// Convert taxes to gas
taxGas, err := tax2gasutils.ComputeGas(ctx, tx, gasPrices, taxes)
taxGas, err := tax2gasutils.ComputeGas(ctx, gasPrices, taxes)
if err != nil {
return ctx, err
}
Expand Down
33 changes: 13 additions & 20 deletions x/tax2gas/utils/fee_tax.go
Original file line number Diff line number Diff line change
Expand Up @@ -115,29 +115,22 @@ func computeTax(ctx sdk.Context, tk types.TreasuryKeeper, principal sdk.Coins) s
return taxes
}

func ComputeGas(ctx sdk.Context, tx sdk.Tx, gasPrices sdk.DecCoins, taxes sdk.Coins) (uint64, error) {
feeTx, ok := tx.(sdk.FeeTx)
if !ok {
return 0, errorsmod.Wrap(sdkerrors.ErrTxDecode, "Tx must be a FeeTx")
}

isOracleTx := IsOracleTx(feeTx.GetMsgs())
func ComputeGas(ctx sdk.Context, gasPrices sdk.DecCoins, taxes sdk.Coins) (uint64, error) {
taxes = taxes.Sort()

var tax2gas sdkmath.Int = sdkmath.ZeroInt()

Check failure on line 121 in x/tax2gas/utils/fee_tax.go

View workflow job for this annotation

GitHub Actions / golangci-lint

ST1023: should omit type sdkmath.Int from declaration; it will be inferred from the right-hand side (stylecheck)
if ctx.IsCheckTx() && !isOracleTx {
// Convert to gas
var i, j int = 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()))
i++
j++
} else if gasPrices[i].Denom < taxes[j].Denom {
i++
} else {
j++
}

// Convert to gas
var i, j int = 0, 0

Check failure on line 124 in x/tax2gas/utils/fee_tax.go

View workflow job for this annotation

GitHub Actions / golangci-lint

ST1023: should omit type int from declaration; it will be inferred from the right-hand side (stylecheck)
for i < len(gasPrices) && j < len(taxes) {
if gasPrices[i].Denom == taxes[j].Denom {

Check failure on line 126 in x/tax2gas/utils/fee_tax.go

View workflow job for this annotation

GitHub Actions / golangci-lint

ifElseChain: rewrite if-else to switch statement (gocritic)
tax2gas = tax2gas.Add(sdkmath.Int(sdk.NewDec(taxes[j].Amount.Int64()).Quo((gasPrices[i].Amount)).Ceil().RoundInt()))

Check failure on line 127 in x/tax2gas/utils/fee_tax.go

View workflow job for this annotation

GitHub Actions / golangci-lint

unnecessary conversion (unconvert)
i++
j++
} else if gasPrices[i].Denom < taxes[j].Denom {
i++
} else {
j++
}
}

Expand Down

0 comments on commit d57e4ce

Please sign in to comment.