Skip to content

Commit c85b060

Browse files
authored
Merge pull request #85 from oraichain/feat/txfees
Feat/txfees
2 parents d28476a + e75a8b4 commit c85b060

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

68 files changed

+7075
-10
lines changed

.github/workflows/interchaintest.yaml

+15
Original file line numberDiff line numberDiff line change
@@ -142,5 +142,20 @@ jobs:
142142
uses: actions/checkout@v4
143143

144144
- run: make ictest-tf-force-transfer-ibc
145+
env:
146+
BRANCH_CI: "latest"
147+
ictest-txfees-add-fee-token:
148+
runs-on: ubuntu-latest
149+
needs: build-and-push-image # This job must run after build and push image
150+
steps:
151+
- name: Set up Go 1.22
152+
uses: actions/setup-go@v4
153+
with:
154+
go-version: '1.22.7'
155+
156+
- name: checkout code
157+
uses: actions/checkout@v4
158+
159+
- run: make ictest-txfees-add-fee-token
145160
env:
146161
BRANCH_CI: "latest"

Makefile

+4
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,10 @@ ictest-tf-force-transfer-ibc:
182182
# Executes wasm gas less tests via interchaintest
183183
ictest-wasm-gasless:
184184
cd tests/interchaintest && go test -race -v -run TestWasmGasLessContract .
185+
186+
# Executes txfees tests via interchaintest
187+
ictest-txfees-add-fee-token:
188+
cd tests/interchaintest && go test -race -v -run TestAddFeeToken .
185189
###############################################################################
186190
### Linting ###
187191
###############################################################################

app/ante.go

+7-1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ import (
2525
wasmkeeper "github.com/CosmWasm/wasmd/x/wasm/keeper"
2626
wasmTypes "github.com/CosmWasm/wasmd/x/wasm/types"
2727

28+
txfeesante "github.com/CosmWasm/wasmd/x/txfees/ante"
29+
txfeeskeeper "github.com/CosmWasm/wasmd/x/txfees/keeper"
30+
2831
"github.com/cosmos/cosmos-sdk/types/tx/signing"
2932

3033
storetypes "cosmossdk.io/store/types"
@@ -58,6 +61,7 @@ type HandlerOptions struct {
5861
MaxTxGasWanted uint64
5962
CircuitKeeper *circuitkeeper.Keeper
6063
BankKeeper *bankkeeper.BaseKeeper
64+
TxFeesKeeper txfeeskeeper.Keeper
6165
DisabledAuthzMsgs []string
6266
BypassMinFeeMsgTypes []string
6367
}
@@ -196,7 +200,9 @@ func newCosmosAnteHandler(options HandlerOptions) sdk.AnteHandler {
196200
ante.NewConsumeGasForTxSizeDecorator(options.AccountKeeper),
197201
// nil so that it only checks with the min gas price of the chain, not the custom fee checker. For cosmos messages, the default tx fee checker is enough
198202
globalfeeante.NewFeeDecorator(options.BypassMinFeeMsgTypes, options.GlobalFeeKeeper, options.StakingKeeper, maxBypassMinFeeMsgGasUsage),
199-
ante.NewDeductFeeDecorator(options.AccountKeeper, options.BankKeeper, options.FeegrantKeeper, nil),
203+
// ante.NewDeductFeeDecorator(options.AccountKeeper, options.BankKeeper, options.FeegrantKeeper, nil),
204+
txfeesante.NewMempoolFeeDecorator(options.BypassMinFeeMsgTypes, options.TxFeesKeeper),
205+
txfeesante.NewDeductFeeDecorator(options.AccountKeeper, options.BankKeeper, options.FeegrantKeeper, options.TxFeesKeeper),
200206
// we use evmante.NewSetPubKeyDecorator so that for eth_secp256k1 accs, we can validate the signer using the evm-cosmos mapping logic
201207
evmante.NewSetPubKeyDecorator(options.AccountKeeper, options.EvmKeeper), // SetPubKeyDecorator must be called before all signature verification decorators
202208
ante.NewValidateSigCountDecorator(options.AccountKeeper),

app/app.go

+20-1
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ import (
137137
"github.com/spf13/cast"
138138

139139
"github.com/CosmWasm/wasmd/client/docs"
140+
140141
"github.com/CosmWasm/wasmd/x/wasm"
141142
wasmkeeper "github.com/CosmWasm/wasmd/x/wasm/keeper"
142143
wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types"
@@ -178,6 +179,10 @@ import (
178179
erc20keeper "github.com/evmos/ethermint/x/erc20/keeper"
179180
erc20types "github.com/evmos/ethermint/x/erc20/types"
180181

182+
"github.com/CosmWasm/wasmd/x/txfees"
183+
txfeeskeeper "github.com/CosmWasm/wasmd/x/txfees/keeper"
184+
txfeestypes "github.com/CosmWasm/wasmd/x/txfees/types"
185+
181186
"github.com/CosmosContracts/juno/v18/x/globalfee"
182187
globalfeekeeper "github.com/CosmosContracts/juno/v18/x/globalfee/keeper"
183188
globalfeetypes "github.com/CosmosContracts/juno/v18/x/globalfee/types"
@@ -302,6 +307,7 @@ type WasmApp struct {
302307
Erc20Keeper erc20keeper.Keeper
303308
FeeMarketKeeper feemarketkeeper.Keeper
304309
GlobalFeeKeeper globalfeekeeper.Keeper
310+
TxFeesKeeper txfeeskeeper.Keeper
305311

306312
// Middleware wrapper
307313
Ics20WasmHooks *ibchooks.WasmHooks
@@ -428,7 +434,7 @@ func NewWasmApp(
428434
capabilitytypes.StoreKey, ibcexported.StoreKey, ibctransfertypes.StoreKey, ibcfeetypes.StoreKey,
429435
wasmtypes.StoreKey, icahosttypes.StoreKey,
430436
icacontrollertypes.StoreKey, clocktypes.StoreKey, globalfeetypes.StoreKey, ibchookstypes.StoreKey, packetforwardtypes.StoreKey, tokenfactorytypes.StoreKey,
431-
evmtypes.StoreKey, feemarkettypes.StoreKey, erc20types.StoreKey,
437+
evmtypes.StoreKey, feemarkettypes.StoreKey, erc20types.StoreKey, txfeestypes.StoreKey,
432438
)
433439

434440
tkeys := storetypes.NewTransientStoreKeys(paramstypes.TStoreKey, evmtypes.TransientKey, feemarkettypes.TransientKey)
@@ -822,6 +828,13 @@ func NewWasmApp(
822828
AuthorityAddr,
823829
)
824830

831+
app.TxFeesKeeper = txfeeskeeper.NewKeeper(
832+
appCodec,
833+
runtime.NewKVStoreService(keys[txfeestypes.StoreKey]),
834+
&app.WasmKeeper,
835+
AuthorityAddr,
836+
)
837+
825838
app.TokenFactoryKeeper = tokenfactorykeeper.NewKeeper(
826839
keys[tokenfactorytypes.StoreKey],
827840
app.GetSubspace(tokenfactorytypes.ModuleName),
@@ -924,6 +937,7 @@ func NewWasmApp(
924937
evm.NewAppModule(app.EvmKeeper, app.AccountKeeper, evmSs),
925938
feemarket.NewAppModule(app.FeeMarketKeeper, feeMarketSs),
926939
erc20.NewAppModule(app.Erc20Keeper, app.AccountKeeper, app.GetSubspace(erc20types.ModuleName)),
940+
txfees.NewAppModule(app.TxFeesKeeper),
927941
)
928942

929943
// BasicModuleManager defines the module BasicManager is in charge of setting up basic,
@@ -948,6 +962,7 @@ func NewWasmApp(
948962
feemarkettypes.ModuleName: feemarket.AppModuleBasic{},
949963
erc20types.ModuleName: erc20.AppModuleBasic{},
950964
globalfee.ModuleName: globalfee.AppModuleBasic{},
965+
txfeestypes.ModuleName: txfees.AppModuleBasic{},
951966
})
952967
app.BasicModuleManager.RegisterLegacyAminoCodec(legacyAmino)
953968
app.BasicModuleManager.RegisterInterfaces(interfaceRegistry)
@@ -987,6 +1002,7 @@ func NewWasmApp(
9871002
feemarkettypes.ModuleName,
9881003
evmtypes.ModuleName,
9891004
erc20types.ModuleName,
1005+
txfeestypes.ModuleName,
9901006
)
9911007

9921008
app.ModuleManager.SetOrderEndBlockers(
@@ -1011,6 +1027,7 @@ func NewWasmApp(
10111027
feemarkettypes.ModuleName,
10121028
evmtypes.ModuleName,
10131029
erc20types.ModuleName,
1030+
txfeestypes.ModuleName,
10141031
)
10151032

10161033
// NOTE: The genutils module must occur after staking so that pools are
@@ -1047,6 +1064,7 @@ func NewWasmApp(
10471064
feemarkettypes.ModuleName,
10481065
evmtypes.ModuleName,
10491066
erc20types.ModuleName,
1067+
txfeestypes.ModuleName,
10501068
}
10511069
app.ModuleManager.SetOrderInitGenesis(genesisModuleOrder...)
10521070
app.ModuleManager.SetOrderExportGenesis(genesisModuleOrder...)
@@ -1180,6 +1198,7 @@ func (app *WasmApp) setAnteHandler(txConfig client.TxConfig, wasmConfig wasmtype
11801198
FeeMarketKeeper: app.FeeMarketKeeper,
11811199
WasmConfig: &wasmConfig,
11821200
WasmKeeper: &app.WasmKeeper,
1201+
TxFeesKeeper: app.TxFeesKeeper,
11831202
ContractKeeper: app.ContractKeeper,
11841203
TXCounterStoreService: runtime.NewKVStoreService(txCounterStoreKey),
11851204
CircuitKeeper: &app.CircuitKeeper,

app/upgrades.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,13 @@ import (
3636
v0506 "github.com/CosmWasm/wasmd/app/upgrades/v0506"
3737
v0507 "github.com/CosmWasm/wasmd/app/upgrades/v0507"
3838
v0508 "github.com/CosmWasm/wasmd/app/upgrades/v0508"
39+
v0509 "github.com/CosmWasm/wasmd/app/upgrades/v0509"
3940
v2 "github.com/CosmWasm/wasmd/x/wasm/migrations/v2"
4041
wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types"
4142
)
4243

4344
// Upgrades list of chain upgrades
44-
var Upgrades = []upgrades.Upgrade{v050.Upgrade, v0501.Upgrade, v0502.Upgrade, v0503.Upgrade, v0504.Upgrade, v0505.Upgrade, v0506.Upgrade, v0507.Upgrade, v0508.Upgrade}
45+
var Upgrades = []upgrades.Upgrade{v050.Upgrade, v0501.Upgrade, v0502.Upgrade, v0503.Upgrade, v0504.Upgrade, v0505.Upgrade, v0506.Upgrade, v0507.Upgrade, v0508.Upgrade, v0509.Upgrade}
4546

4647
// RegisterUpgradeHandlers registers the chain upgrade handlers
4748
func (app *WasmApp) RegisterUpgradeHandlers() {
@@ -70,6 +71,7 @@ func (app *WasmApp) RegisterUpgradeHandlers() {
7071
IBCKeeper: app.IBCKeeper,
7172
MintKeeper: &app.MintKeeper,
7273
GovKeeper: &app.GovKeeper,
74+
TxFeesKeeper: app.TxFeesKeeper,
7375
ICAControllerKeeper: app.ICAControllerKeeper,
7476
IBCFeeKeeper: app.IBCFeeKeeper,
7577
Codec: app.appCodec,

app/upgrades/types.go

+2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88

99
storetypes "cosmossdk.io/store/types"
1010
upgradetypes "cosmossdk.io/x/upgrade/types"
11+
txfeeskeeper "github.com/CosmWasm/wasmd/x/txfees/keeper"
1112
govkeeper "github.com/cosmos/cosmos-sdk/x/gov/keeper"
1213
mintkeeper "github.com/cosmos/cosmos-sdk/x/mint/keeper"
1314
icacontrollerkeeper "github.com/cosmos/ibc-go/v8/modules/apps/27-interchain-accounts/controller/keeper"
@@ -31,6 +32,7 @@ type AppKeepers struct {
3132
ScopedIBCKeeper *capabilitykeeper.ScopedKeeper
3233
GovKeeper *govkeeper.Keeper
3334
ICAControllerKeeper icacontrollerkeeper.Keeper
35+
TxFeesKeeper txfeeskeeper.Keeper
3436
IBCFeeKeeper ibcfeekeeper.Keeper
3537
IBCKeeper *ibckeeper.Keeper
3638
MintKeeper *mintkeeper.Keeper

app/upgrades/v0509/upgrades.go

+49
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package v0509
2+
3+
import (
4+
"context"
5+
6+
storetypes "cosmossdk.io/store/types"
7+
upgradetypes "cosmossdk.io/x/upgrade/types"
8+
txfeestypes "github.com/CosmWasm/wasmd/x/txfees/types"
9+
10+
sdk "github.com/cosmos/cosmos-sdk/types"
11+
12+
"github.com/CosmWasm/wasmd/app/upgrades"
13+
"github.com/cosmos/cosmos-sdk/codec"
14+
"github.com/cosmos/cosmos-sdk/types/module"
15+
)
16+
17+
const (
18+
USDAI = "factory/orai1wuvhex9xqs3r539mvc6mtm7n20fcj3qr2m0y9khx6n5vtlngfzes3k0rq9/DYeTA4ZQhEwoJ5imjq1Q3zgwfTgkh4WmdfFHAq3jLrv3"
19+
)
20+
21+
// UpgradeName defines the on-chain upgrade name
22+
const UpgradeName = "v0.50.9"
23+
24+
var Upgrade = upgrades.Upgrade{
25+
UpgradeName: UpgradeName,
26+
CreateUpgradeHandler: CreateUpgradeHandler,
27+
StoreUpgrades: storetypes.StoreUpgrades{
28+
Added: []string{txfeestypes.ModuleName},
29+
Deleted: []string{},
30+
},
31+
}
32+
33+
func CreateUpgradeHandler(
34+
mm upgrades.ModuleManager,
35+
configurator module.Configurator,
36+
ak *upgrades.AppKeepers,
37+
keys map[string]*storetypes.KVStoreKey,
38+
cdc codec.BinaryCodec,
39+
) upgradetypes.UpgradeHandler {
40+
return func(ctx context.Context, plan upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) {
41+
sdkCtx := sdk.UnwrapSDKContext(ctx)
42+
43+
// set params
44+
ak.TxFeesKeeper.SetParams(sdkCtx, txfeestypes.DefaultParams())
45+
ak.TxFeesKeeper.AddAllowedToken(sdkCtx, USDAI)
46+
47+
return mm.RunMigrations(ctx, configurator, fromVM)
48+
}
49+
}

go.mod

+2-1
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ require (
7474
github.com/lib/pq v1.10.9
7575
github.com/ory/dockertest v3.3.5+incompatible
7676
github.com/rs/cors v1.11.1
77+
github.com/test-go/testify v1.1.4
7778
github.com/twmb/franz-go v1.18.0
7879
github.com/twmb/franz-go/pkg/kadm v1.14.0
7980
golang.org/x/sync v0.10.0
@@ -281,7 +282,7 @@ replace (
281282
github.com/99designs/keyring => github.com/cosmos/keyring v1.2.0
282283

283284
github.com/CosmosContracts/juno/v18/x/clock => github.com/oraichain/juno/x/clock v0.0.0-20240911045127-feca1b18c597
284-
github.com/CosmosContracts/juno/v18/x/globalfee => github.com/oraichain/juno/x/globalfee v0.0.0-20240925043856-fe3d1d8b9ad3
285+
github.com/CosmosContracts/juno/v18/x/globalfee => github.com/oraichain/juno/x/globalfee v0.0.0-20250312030216-ffe51b3d33e8
285286

286287
github.com/cometbft/cometbft => github.com/oraichain/cometbft v0.38.6-0.20250207043129-6ccdb4a201d3
287288

go.sum

+4-2
Original file line numberDiff line numberDiff line change
@@ -963,8 +963,8 @@ github.com/oraichain/ibc-go-fork/v8 v8.4.1-0.20241202080239-8bdb6f914705 h1:++dP
963963
github.com/oraichain/ibc-go-fork/v8 v8.4.1-0.20241202080239-8bdb6f914705/go.mod h1:zh6x1osR0hNvEcFrC/lhGD08sMfQmr9wHVvZ/mRWMCs=
964964
github.com/oraichain/juno/x/clock v0.0.0-20240911045127-feca1b18c597 h1:vFCKH25Q+BVNWRImFym0rYzno6BW8+l9GplszOdZ9no=
965965
github.com/oraichain/juno/x/clock v0.0.0-20240911045127-feca1b18c597/go.mod h1:JAaOF+0j23OoyEgd6uhE3cgNDpZcfVZx4/DBbnMjUsc=
966-
github.com/oraichain/juno/x/globalfee v0.0.0-20240925043856-fe3d1d8b9ad3 h1:/Um//l2b6eGaAcVRwkzv2U7xTAqlYfiyaqG71bUyyac=
967-
github.com/oraichain/juno/x/globalfee v0.0.0-20240925043856-fe3d1d8b9ad3/go.mod h1:T9g8covTFLipVYRou8cuvfjg+xtPmQINjxFjzRxEbo8=
966+
github.com/oraichain/juno/x/globalfee v0.0.0-20250312030216-ffe51b3d33e8 h1:ccMFmwQIfCZmKCFtBIeF+9vzJgMY46HxPCB7jQc8i04=
967+
github.com/oraichain/juno/x/globalfee v0.0.0-20250312030216-ffe51b3d33e8/go.mod h1:T9g8covTFLipVYRou8cuvfjg+xtPmQINjxFjzRxEbo8=
968968
github.com/ory/dockertest v3.3.5+incompatible h1:iLLK6SQwIhcbrG783Dghaaa3WPzGc+4Emza6EbVUUGA=
969969
github.com/ory/dockertest v3.3.5+incompatible/go.mod h1:1vX4m9wsvi00u5bseYwXaSnhNrne+V0E6LAcBILJdPs=
970970
github.com/ory/dockertest/v3 v3.9.1 h1:v4dkG+dlu76goxMiTT2j8zV7s4oPPEppKT8K8p2f1kY=
@@ -1128,6 +1128,8 @@ github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70
11281128
github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc=
11291129
github.com/tendermint/go-amino v0.16.0 h1:GyhmgQKvqF82e2oZeuMSp9JTN0N09emoSZlb2lyGa2E=
11301130
github.com/tendermint/go-amino v0.16.0/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME=
1131+
github.com/test-go/testify v1.1.4 h1:Tf9lntrKUMHiXQ07qBScBTSA0dhYQlu83hswqelv1iE=
1132+
github.com/test-go/testify v1.1.4/go.mod h1:rH7cfJo/47vWGdi4GPj16x3/t1xGOj2YxzmNQzk2ghU=
11311133
github.com/tidwall/btree v1.7.0 h1:L1fkJH/AuEh5zBnnBbmTwQ5Lt+bRJ5A8EWecslvo9iI=
11321134
github.com/tidwall/btree v1.7.0/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY=
11331135
github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
syntax = "proto3";
2+
package cosmwasm.txfees.v1;
3+
4+
import "gogoproto/gogo.proto";
5+
import "cosmwasm/txfees/v1/params.proto";
6+
7+
option go_package = "github.com/CosmWasm/wasmd/x/txfees/types";
8+
9+
// GenesisState defines the txfees module's genesis state.
10+
message GenesisState {
11+
// params defines the paramaters of the module.
12+
Params params = 1 [ (gogoproto.nullable) = false ];
13+
}

proto/cosmwasm/txfees/v1/params.proto

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
syntax = "proto3";
2+
package cosmwasm.txfees.v1;
3+
4+
import "gogoproto/gogo.proto";
5+
import "cosmos_proto/cosmos.proto";
6+
import "cosmos/base/v1beta1/coin.proto";
7+
8+
option go_package = "github.com/CosmWasm/wasmd/x/txfees/types";
9+
10+
// Params defines the parameters for the txfees module.
11+
message Params {
12+
string token_base_denom = 1;
13+
string price_contract_address = 2;
14+
}

proto/cosmwasm/txfees/v1/query.proto

+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
syntax = "proto3";
2+
package cosmwasm.txfees.v1;
3+
4+
import "gogoproto/gogo.proto";
5+
import "google/api/annotations.proto";
6+
import "cosmos/base/query/v1beta1/pagination.proto";
7+
import "cosmwasm/txfees/v1/params.proto";
8+
9+
option go_package = "github.com/CosmWasm/wasmd/x/txfees/types";
10+
11+
// Query defines the gRPC querier service.
12+
service Query {
13+
// Params defines a gRPC query method that returns the txfees module's
14+
// parameters.
15+
rpc Params(QueryParamsRequest) returns (QueryParamsResponse) {
16+
option (google.api.http).get = "/cosmwasm/txfees/v1/params";
17+
}
18+
19+
// AllowedTokens defines a gRPC query method that returns the allowed tokens can be charge fees
20+
rpc AllowedTokens(QueryAllowedTokensRequest) returns (QueryAllowedTokensResponse) {
21+
option (google.api.http).get = "/cosmwasm/txfees/v1/allowed_tokens";
22+
}
23+
24+
}
25+
26+
// QueryParamsRequest is the request type for the Query/Params RPC method.
27+
message QueryParamsRequest {}
28+
29+
// QueryParamsResponse is the response type for the Query/Params RPC method.
30+
message QueryParamsResponse {
31+
// params defines the parameters of the module.
32+
Params params = 1 [ (gogoproto.nullable) = false ];
33+
}
34+
35+
// QueryAllowedTokensRequest is the request type for the Query/AllowedTokens RPC method.
36+
message QueryAllowedTokensRequest {}
37+
38+
// QueryAllowedTokensResponse is the response type for the Query/AllowedTokens RPC method.
39+
message QueryAllowedTokensResponse {
40+
// tokens defines the parameters of the module.
41+
repeated string tokens = 1 [ (gogoproto.nullable) = false ];
42+
}

0 commit comments

Comments
 (0)