Skip to content

Commit 498a095

Browse files
yihuangmmsqe
andauthored
Problem: ibc incentivization is not integrated (#647)
* support hermes 1.x * Problem: ibc incentivization is not integrated Closes: #642 Solution: - integration ibcfee middleware * fix build * point back pystarport * fix ibc config * add ibcfee store to upgrade handler * update chain-main to fix integration test * Update app/app.go * Update CHANGELOG.md * ibc incentivized integration test * fix fee middleware wiring * run test cases for both incentivized and non-incentivized channels Co-authored-by: mmsqe <mavis@crypto.com>
1 parent 29c4fec commit 498a095

12 files changed

Lines changed: 228 additions & 36 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
- [cronos#600](https://github.com/crypto-org-chain/cronos/pull/600) Implement bidirectional token mapping.
99
- [cronos#611](https://github.com/crypto-org-chain/cronos/pull/611) Fix mistake on acknowledgement error in ibc middleware.
1010
- [cronos#627](https://github.com/crypto-org-chain/cronos/pull/627) Upgrade gravity bridge module with security enhancements
11+
- [cronos#647](https://github.com/crypto-org-chain/cronos/pull/647) Integrate ibc fee middleware.
1112

1213
### Bug Fixes
1314

app/app.go

Lines changed: 38 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,9 @@ import (
9090
icacontrollerkeeper "github.com/cosmos/ibc-go/v5/modules/apps/27-interchain-accounts/controller/keeper"
9191
icacontrollertypes "github.com/cosmos/ibc-go/v5/modules/apps/27-interchain-accounts/controller/types"
9292
icatypes "github.com/cosmos/ibc-go/v5/modules/apps/27-interchain-accounts/types"
93+
ibcfee "github.com/cosmos/ibc-go/v5/modules/apps/29-fee"
94+
ibcfeekeeper "github.com/cosmos/ibc-go/v5/modules/apps/29-fee/keeper"
95+
ibcfeetypes "github.com/cosmos/ibc-go/v5/modules/apps/29-fee/types"
9396

9497
appparams "github.com/cosmos/cosmos-sdk/simapp/params"
9598
"github.com/cosmos/ibc-go/v5/modules/apps/transfer"
@@ -186,6 +189,7 @@ var (
186189
stakingtypes.NotBondedPoolName: {authtypes.Burner, authtypes.Staking},
187190
govtypes.ModuleName: {authtypes.Burner},
188191
ibctransfertypes.ModuleName: {authtypes.Minter, authtypes.Burner},
192+
ibcfeetypes.ModuleName: nil,
189193
icatypes.ModuleName: nil,
190194
evmtypes.ModuleName: {authtypes.Minter, authtypes.Burner}, // used for secure addition and subtraction of balance using module account
191195
gravitytypes.ModuleName: {authtypes.Minter, authtypes.Burner},
@@ -229,6 +233,7 @@ func GenModuleBasics(experimental bool) module.BasicManager {
229233
vesting.AppModuleBasic{},
230234
ica.AppModuleBasic{},
231235
icactlmodule.AppModuleBasic{},
236+
ibcfee.AppModuleBasic{},
232237
evm.AppModuleBasic{},
233238
feemarket.AppModuleBasic{},
234239
// this line is used by starport scaffolding # stargate/app/moduleBasic
@@ -270,6 +275,7 @@ type App struct {
270275
UpgradeKeeper upgradekeeper.Keeper
271276
ParamsKeeper paramskeeper.Keeper
272277
IBCKeeper *ibckeeper.Keeper // IBC Keeper must be a pointer in the app, so we can SetRouter on it correctly
278+
IBCFeeKeeper ibcfeekeeper.Keeper
273279
ICAControllerKeeper icacontrollerkeeper.Keeper
274280
ICAAuthKeeper icactlmodulekeeper.Keeper
275281
EvidenceKeeper evidencekeeper.Keeper
@@ -335,6 +341,7 @@ func New(
335341
// ibc keys
336342
ibchost.StoreKey, ibctransfertypes.StoreKey,
337343
icacontrollertypes.StoreKey,
344+
ibcfeetypes.StoreKey,
338345
// ethermint keys
339346
evmtypes.StoreKey, feemarkettypes.StoreKey,
340347
// this line is used by starport scaffolding # stargate/app/storeKey
@@ -416,10 +423,18 @@ func New(
416423
appCodec, keys[ibchost.StoreKey], app.GetSubspace(ibchost.ModuleName), stakingKeeper, app.UpgradeKeeper, scopedIBCKeeper,
417424
)
418425

426+
// IBC Fee Module keeper
427+
app.IBCFeeKeeper = ibcfeekeeper.NewKeeper(
428+
appCodec, keys[ibcfeetypes.StoreKey], app.GetSubspace(ibcfeetypes.ModuleName),
429+
app.IBCKeeper.ChannelKeeper, // more middlewares can be added in future
430+
app.IBCKeeper.ChannelKeeper,
431+
&app.IBCKeeper.PortKeeper, app.AccountKeeper, app.BankKeeper,
432+
)
433+
419434
// Create Transfer Keepers
420435
app.TransferKeeper = ibctransferkeeper.NewKeeper(
421436
appCodec, keys[ibctransfertypes.StoreKey], app.GetSubspace(ibctransfertypes.ModuleName),
422-
app.IBCKeeper.ChannelKeeper, app.IBCKeeper.ChannelKeeper, &app.IBCKeeper.PortKeeper,
437+
app.IBCFeeKeeper, app.IBCKeeper.ChannelKeeper, &app.IBCKeeper.PortKeeper,
423438
app.AccountKeeper, app.BankKeeper, scopedTransferKeeper,
424439
)
425440

@@ -494,21 +509,28 @@ func New(
494509

495510
// set the middleware
496511
transferModule := transfer.NewAppModule(app.TransferKeeper)
497-
transferIBCModule := transfer.NewIBCModule(app.TransferKeeper)
498-
transferWithConversionIBCModule := middleware.NewIBCConversionModule(transferIBCModule, app.CronosKeeper)
512+
feeModule := ibcfee.NewAppModule(app.IBCFeeKeeper)
513+
514+
var transferStack porttypes.IBCModule
515+
transferStack = transfer.NewIBCModule(app.TransferKeeper)
516+
transferStack = middleware.NewIBCConversionModule(transferStack, app.CronosKeeper)
517+
transferStack = ibcfee.NewIBCMiddleware(transferStack, app.IBCFeeKeeper)
518+
499519
app.ICAControllerKeeper = icacontrollerkeeper.NewKeeper(
500520
appCodec, keys[icacontrollertypes.StoreKey], app.GetSubspace(icacontrollertypes.SubModuleName),
501-
app.IBCKeeper.ChannelKeeper, // may be replaced with middleware such as ics29 fee
502-
app.IBCKeeper.ChannelKeeper, &app.IBCKeeper.PortKeeper,
521+
app.IBCFeeKeeper, app.IBCKeeper.ChannelKeeper, &app.IBCKeeper.PortKeeper,
503522
scopedICAControllerKeeper, app.MsgServiceRouter(),
504523
)
505524
icaModule := ica.NewAppModule(&app.ICAControllerKeeper, nil)
506525

507526
app.ICAAuthKeeper = *icactlmodulekeeper.NewKeeper(appCodec,
508527
app.GetSubspace(icactlmoduletypes.ModuleName), app.ICAControllerKeeper, scopedICAAuthKeeper)
509-
icaAuthModule := icactlmodule.NewAppModule(appCodec, app.ICAAuthKeeper)
510-
icaAuthIBCModule := icactlmodule.NewIBCModule(app.ICAAuthKeeper)
511-
icaControllerIBCModule := icacontroller.NewIBCMiddleware(icaAuthIBCModule, app.ICAControllerKeeper)
528+
icaCtlModule := icactlmodule.NewAppModule(appCodec, app.ICAAuthKeeper)
529+
530+
var icaControllerStack porttypes.IBCModule
531+
icaControllerStack = icactlmodule.NewIBCModule(app.ICAAuthKeeper)
532+
icaControllerStack = icacontroller.NewIBCMiddleware(icaControllerStack, app.ICAControllerKeeper)
533+
icaControllerStack = ibcfee.NewIBCMiddleware(icaControllerStack, app.IBCFeeKeeper)
512534

513535
app.GovKeeper = govkeeper.NewKeeper(
514536
appCodec, keys[govtypes.StoreKey], app.GetSubspace(govtypes.ModuleName), app.AccountKeeper, app.BankKeeper,
@@ -550,9 +572,9 @@ func New(
550572

551573
// Create static IBC router, add transfer route, then set and seal it
552574
ibcRouter := porttypes.NewRouter()
553-
ibcRouter.AddRoute(ibctransfertypes.ModuleName, transferWithConversionIBCModule)
554-
ibcRouter.AddRoute(icacontrollertypes.SubModuleName, icaControllerIBCModule)
555-
ibcRouter.AddRoute(icactlmoduletypes.ModuleName, icaControllerIBCModule)
575+
ibcRouter.AddRoute(ibctransfertypes.ModuleName, transferStack)
576+
ibcRouter.AddRoute(icacontrollertypes.SubModuleName, icaControllerStack)
577+
ibcRouter.AddRoute(icactlmoduletypes.ModuleName, icaControllerStack)
556578
// this line is used by starport scaffolding # ibc/app/router
557579
app.IBCKeeper.SetRouter(ibcRouter)
558580

@@ -588,7 +610,8 @@ func New(
588610
ibc.NewAppModule(app.IBCKeeper),
589611
transferModule,
590612
icaModule,
591-
icaAuthModule,
613+
icaCtlModule,
614+
feeModule,
592615
evm.NewAppModule(app.EvmKeeper, app.AccountKeeper),
593616
feemarket.NewAppModule(app.FeeMarketKeeper),
594617
cronosModule,
@@ -607,6 +630,7 @@ func New(
607630
ibctransfertypes.ModuleName,
608631
icatypes.ModuleName,
609632
icactlmoduletypes.ModuleName,
633+
ibcfeetypes.ModuleName,
610634
authtypes.ModuleName,
611635
banktypes.ModuleName,
612636
govtypes.ModuleName,
@@ -626,6 +650,7 @@ func New(
626650
ibctransfertypes.ModuleName,
627651
icatypes.ModuleName,
628652
icactlmoduletypes.ModuleName,
653+
ibcfeetypes.ModuleName,
629654
capabilitytypes.ModuleName,
630655
authtypes.ModuleName,
631656
banktypes.ModuleName,
@@ -667,6 +692,7 @@ func New(
667692
ibctransfertypes.ModuleName,
668693
icatypes.ModuleName,
669694
icactlmoduletypes.ModuleName,
695+
ibcfeetypes.ModuleName,
670696
authz.ModuleName,
671697
feegrant.ModuleName,
672698
paramstypes.ModuleName,

app/upgrades.go

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"github.com/cosmos/cosmos-sdk/types/module"
99
upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types"
1010
icacontrollertypes "github.com/cosmos/ibc-go/v5/modules/apps/27-interchain-accounts/controller/types"
11+
ibcfeetypes "github.com/cosmos/ibc-go/v5/modules/apps/29-fee/types"
1112
gravitytypes "github.com/peggyjv/gravity-bridge/module/v2/x/gravity/types"
1213
)
1314

@@ -50,13 +51,22 @@ func (app *App) RegisterUpgradeHandlers(experimental bool) {
5051
panic(fmt.Sprintf("failed to read upgrade info from disk %s", err))
5152
}
5253

53-
if (upgradeInfo.Name == planName || (experimental && upgradeInfo.Name == gravityPlanName)) &&
54-
!app.UpgradeKeeper.IsSkipHeight(upgradeInfo.Height) {
55-
storeUpgrades := storetypes.StoreUpgrades{
56-
Added: []string{icacontrollertypes.StoreKey},
54+
if !app.UpgradeKeeper.IsSkipHeight(upgradeInfo.Height) {
55+
if upgradeInfo.Name == planName {
56+
storeUpgrades := storetypes.StoreUpgrades{
57+
Added: []string{icacontrollertypes.StoreKey, ibcfeetypes.StoreKey},
58+
}
59+
60+
// configure store loader that checks if version == upgradeHeight and applies store upgrades
61+
app.SetStoreLoader(upgradetypes.UpgradeStoreLoader(upgradeInfo.Height, &storeUpgrades))
5762
}
63+
if experimental && upgradeInfo.Name == gravityPlanName {
64+
storeUpgrades := storetypes.StoreUpgrades{
65+
Added: []string{icacontrollertypes.StoreKey},
66+
}
5867

59-
// configure store loader that checks if version == upgradeHeight and applies store upgrades
60-
app.SetStoreLoader(upgradetypes.UpgradeStoreLoader(upgradeInfo.Height, &storeUpgrades))
68+
// configure store loader that checks if version == upgradeHeight and applies store upgrades
69+
app.SetStoreLoader(upgradetypes.UpgradeStoreLoader(upgradeInfo.Height, &storeUpgrades))
70+
}
6171
}
6272
}

integration_tests/configs/ibc.jsonnet

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ config {
55
'account-prefix': 'crc',
66
'coin-type': 60,
77
key_name: 'signer1',
8+
accounts: super.accounts[:std.length(super.accounts) - 1] + [super.accounts[std.length(super.accounts) - 1] {
9+
coins: super.coins + ',100000000000ibcfee',
10+
}],
811
'app-config'+: {
912
'index-events': super['index-events'] + ['message.action'],
1013
},

integration_tests/cosmoscli.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1308,3 +1308,58 @@ def create_vesting_account(self, to_address, amount, end_time, **kwargs):
13081308
**(default_kwargs | kwargs),
13091309
)
13101310
)
1311+
1312+
def register_counterparty_payee(
1313+
self, port_id, channel_id, relayer, counterparty_payee, **kwargs
1314+
):
1315+
default_kwargs = {
1316+
"home": self.data_dir,
1317+
}
1318+
return json.loads(
1319+
self.raw(
1320+
"tx",
1321+
"ibc-fee",
1322+
"register-counterparty-payee",
1323+
port_id,
1324+
channel_id,
1325+
relayer,
1326+
counterparty_payee,
1327+
"-y",
1328+
**(default_kwargs | kwargs),
1329+
)
1330+
)
1331+
1332+
def register_payee(self, port_id, channel_id, relayer, payee, **kwargs):
1333+
default_kwargs = {
1334+
"home": self.data_dir,
1335+
}
1336+
return json.loads(
1337+
self.raw(
1338+
"tx",
1339+
"ibc-fee",
1340+
"register-payee",
1341+
port_id,
1342+
channel_id,
1343+
relayer,
1344+
payee,
1345+
"-y",
1346+
**(default_kwargs | kwargs),
1347+
)
1348+
)
1349+
1350+
def pay_packet_fee(self, port_id, channel_id, packet_seq, **kwargs):
1351+
default_kwargs = {
1352+
"home": self.data_dir,
1353+
}
1354+
return json.loads(
1355+
self.raw(
1356+
"tx",
1357+
"ibc-fee",
1358+
"pay-packet-fee",
1359+
port_id,
1360+
channel_id,
1361+
str(packet_seq),
1362+
"-y",
1363+
**(default_kwargs | kwargs),
1364+
)
1365+
)

integration_tests/ibc_utils.py

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,10 @@ class IBCNetwork(NamedTuple):
1515
cronos: Cronos
1616
chainmain: Chainmain
1717
hermes: Hermes
18+
incentivized: bool
1819

1920

20-
def prepare_network(tmp_path, file):
21+
def prepare_network(tmp_path, file, incentivized=True):
2122
file = f"configs/{file}.jsonnet"
2223
gen = setup_custom_cronos(tmp_path, 26700, Path(__file__).parent / file)
2324
cronos = next(gen)
@@ -26,6 +27,17 @@ def prepare_network(tmp_path, file):
2627
# wait for grpc ready
2728
wait_for_port(ports.grpc_port(chainmain.base_port(0))) # chainmain grpc
2829
wait_for_port(ports.grpc_port(cronos.base_port(0))) # cronos grpc
30+
31+
version = {"fee_version": "ics29-1", "app_version": "ics20-1"}
32+
incentivized_args = (
33+
[
34+
"--channel-version",
35+
json.dumps(version),
36+
]
37+
if incentivized
38+
else []
39+
)
40+
2941
subprocess.check_call(
3042
[
3143
"hermes",
@@ -44,10 +56,26 @@ def prepare_network(tmp_path, file):
4456
"--new-client-connection",
4557
"--yes",
4658
]
59+
+ incentivized_args
4760
)
61+
62+
if incentivized:
63+
# register fee payee
64+
src_chain = cronos.cosmos_cli()
65+
dst_chain = chainmain.cosmos_cli()
66+
rsp = dst_chain.register_counterparty_payee(
67+
"transfer",
68+
"channel-0",
69+
dst_chain.address("relayer"),
70+
src_chain.address("signer1"),
71+
from_="relayer",
72+
fees="100000000basecro",
73+
)
74+
assert rsp["code"] == 0, rsp["raw_log"]
75+
4876
supervisorctl(cronos.base_dir / "../tasks.ini", "start", "relayer-demo")
4977
wait_for_port(hermes.port)
50-
yield IBCNetwork(cronos, chainmain, hermes)
78+
yield IBCNetwork(cronos, chainmain, hermes, incentivized)
5179

5280

5381
def assert_ready(ibc):
@@ -58,7 +86,7 @@ def assert_ready(ibc):
5886
assert json.loads(output)["status"] == "success"
5987

6088

61-
def prepare(ibc):
89+
def hermes_transfer(ibc):
6290
assert_ready(ibc)
6391
# chainmain-1 -> cronos_777-1
6492
my_ibc0 = "chainmain-1"

integration_tests/shell.nix

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,7 @@ pkgs.mkShell {
1717
pkgs.test-env
1818
pkgs.nixpkgs-fmt
1919
pkgs.rocksdb
20-
(import ../nix/testenv.nix { inherit pkgs; })
21-
(import ../nix/chainmain.nix { inherit pkgs; })
20+
pkgs.chain-maind
2221
pkgs.hermes
2322
];
2423
}

0 commit comments

Comments
 (0)