Skip to content

Commit abc3297

Browse files
authored
Problem: require gas for ica packet callback is not adjusted with ctx params (#1251)
* Problem: require gas for ica packet callback is not adjusted with ctx params * use sender adr * test ica ctrl with memo * Update x/cronos/keeper/keeper.go Signed-off-by: mmsqe <mavis@crypto.com> --------- Signed-off-by: mmsqe <mavis@crypto.com>
1 parent 5971e6e commit abc3297

File tree

14 files changed

+154
-33
lines changed

14 files changed

+154
-33
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
- [#1209](https://github.com/crypto-org-chain/cronos/pull/1209) Support accurate estimate gas in evm tx from relayer.
1717
- [#1247](https://github.com/crypto-org-chain/cronos/pull/1247) Update ethermint to develop, go-ethereum to `v1.11.2`.
1818
- [#1235](https://github.com/crypto-org-chain/cronos/pull/1235) Add channel detail in ica packet callback.
19+
- [#1251](https://github.com/crypto-org-chain/cronos/pull/1251) Adjust require gas for submitMsgs in ica precompile.
1920

2021
### Improvements
2122

app/app.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -537,11 +537,11 @@ func New(
537537
tracer,
538538
evmS,
539539
[]evmkeeper.CustomContractFn{
540-
func(rules ethparams.Rules) vm.PrecompiledContract {
540+
func(_ sdk.Context, rules ethparams.Rules) vm.PrecompiledContract {
541541
return cronosprecompiles.NewRelayerContract(app.IBCKeeper, appCodec, rules, app.Logger())
542542
},
543-
func(rules ethparams.Rules) vm.PrecompiledContract {
544-
return cronosprecompiles.NewIcaContract(&app.ICAAuthKeeper, &app.CronosKeeper, appCodec, gasConfig)
543+
func(ctx sdk.Context, rules ethparams.Rules) vm.PrecompiledContract {
544+
return cronosprecompiles.NewIcaContract(ctx, &app.ICAAuthKeeper, &app.CronosKeeper, appCodec, gasConfig)
545545
},
546546
},
547547
allKeys,

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ replace (
234234
// TODO: remove it: https://github.com/cosmos/cosmos-sdk/issues/13134
235235
github.com/dgrijalva/jwt-go => github.com/golang-jwt/jwt/v4 v4.4.2
236236
github.com/ethereum/go-ethereum => github.com/crypto-org-chain/go-ethereum v1.10.20-0.20231122021350-f905c2ec3570
237-
github.com/evmos/ethermint => github.com/crypto-org-chain/ethermint v0.6.1-0.20231204041029-ccb83e2e0688
237+
github.com/evmos/ethermint => github.com/crypto-org-chain/ethermint v0.6.1-0.20231205070424-9f62598bff76
238238
// Fix upstream GHSA-h395-qcrw-5vmq and GHSA-3vp4-m3rf-835h vulnerabilities.
239239
// TODO Remove it: https://github.com/cosmos/cosmos-sdk/issues/10409
240240
github.com/gin-gonic/gin => github.com/gin-gonic/gin v1.9.0

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -484,8 +484,8 @@ github.com/crypto-org-chain/cometbft-db v0.0.0-20231011055109-57922ac52a63 h1:R1
484484
github.com/crypto-org-chain/cometbft-db v0.0.0-20231011055109-57922ac52a63/go.mod h1:rocwIfnS+kA060x64gkSIRvWB9StSppIkJuo5MWzL24=
485485
github.com/crypto-org-chain/cosmos-sdk v0.46.0-beta2.0.20231013072415-eec017435467 h1:m0/aHPIJAzi2MSP3TXzzbLTFf+koRFQiaYmerRZUtK4=
486486
github.com/crypto-org-chain/cosmos-sdk v0.46.0-beta2.0.20231013072415-eec017435467/go.mod h1:G384omH7cXgm90xXR7xpHvsKG7vdBaDuz4To6GpTHUU=
487-
github.com/crypto-org-chain/ethermint v0.6.1-0.20231204041029-ccb83e2e0688 h1:6bjEkpymCMWfhUEhTuVj8g46sGuYS1D5I6XPuSuUWm4=
488-
github.com/crypto-org-chain/ethermint v0.6.1-0.20231204041029-ccb83e2e0688/go.mod h1:y8DDupItqxfGglMpak/ow8E7qvqXM2Vb7t6kdb6s96Q=
487+
github.com/crypto-org-chain/ethermint v0.6.1-0.20231205070424-9f62598bff76 h1:mee01qkS0ZTfzOzVdwzKR60Xhixk40FXdjVV1NRems4=
488+
github.com/crypto-org-chain/ethermint v0.6.1-0.20231205070424-9f62598bff76/go.mod h1:y8DDupItqxfGglMpak/ow8E7qvqXM2Vb7t6kdb6s96Q=
489489
github.com/crypto-org-chain/go-ethereum v1.10.20-0.20231122021350-f905c2ec3570 h1:GukXF6eVCJZbK5pgTF+SHJoY9Wr0mPh95/LIOUQNMMM=
490490
github.com/crypto-org-chain/go-ethereum v1.10.20-0.20231122021350-f905c2ec3570/go.mod h1:DuefStAgaxoaYGLR0FueVcVbehmn5n9QUcVrMCuOvuc=
491491
github.com/crypto-org-chain/gravity-bridge/module/v2 v2.0.1-0.20230825054824-75403cd90c6e h1:rSTc35OBjjCBx47rHPWBCIHNGPbMnEj8f7fNcK2TjVI=

gomod2nix.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -216,8 +216,8 @@ schema = 3
216216
hash = "sha256-1LRIM5dPmwjBxd57c9Y+2mZuBrbGWfMvEIlqYpdVBPA="
217217
replaced = "github.com/crypto-org-chain/go-ethereum"
218218
[mod."github.com/evmos/ethermint"]
219-
version = "v0.6.1-0.20231204041029-ccb83e2e0688"
220-
hash = "sha256-JluJj+FrL5gA3twvxt/IwiMxHcTKEs0ciz+MF+bHZFk="
219+
version = "v0.6.1-0.20231205070424-9f62598bff76"
220+
hash = "sha256-xRa8V6b9nVVtTq0L0e/Klz/2VPyNSaB6WvSUbopJlsE="
221221
replaced = "github.com/crypto-org-chain/ethermint"
222222
[mod."github.com/felixge/httpsnoop"]
223223
version = "v1.0.2"

integration_tests/configs/ibc.jsonnet

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,11 @@ config {
1313
},
1414
genesis+: {
1515
app_state+: {
16+
cronos+: {
17+
params+: {
18+
max_callback_gas: 50000,
19+
},
20+
},
1621
feemarket+: {
1722
params+: {
1823
no_base_fee: true,

integration_tests/cosmoscli.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1314,6 +1314,29 @@ def icaauth_submit_tx(self, connid, tx, timeout_duration="1h", **kwargs):
13141314
rsp = self.event_query_tx_for(rsp["txhash"])
13151315
return rsp
13161316

1317+
def ica_ctrl_send_tx(self, connid, tx, **kwargs):
1318+
default_kwargs = {
1319+
"home": self.data_dir,
1320+
"node": self.node_rpc,
1321+
"chain_id": self.chain_id,
1322+
"keyring_backend": "test",
1323+
}
1324+
rsp = json.loads(
1325+
self.raw(
1326+
"tx",
1327+
"ica",
1328+
"controller",
1329+
"send-tx",
1330+
connid,
1331+
tx,
1332+
"-y",
1333+
**(default_kwargs | kwargs),
1334+
)
1335+
)
1336+
if rsp["code"] == 0:
1337+
rsp = self.event_query_tx_for(rsp["txhash"])
1338+
return rsp
1339+
13171340
def ica_query_account(self, connid, owner, **kwargs):
13181341
default_kwargs = {
13191342
"node": self.node_rpc,

integration_tests/ibc_utils.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -622,6 +622,23 @@ def check_tx():
622622
assert raised
623623

624624

625+
def register_acc(cli, connid):
626+
print("register ica account")
627+
rsp = cli.icaauth_register_account(
628+
connid, from_="signer2", gas="400000", fees="100000000basetcro"
629+
)
630+
_, channel_id = assert_channel_open_init(rsp)
631+
wait_for_check_channel_ready(cli, connid, channel_id)
632+
633+
print("query ica account")
634+
ica_address = cli.ica_query_account(
635+
connid,
636+
cli.address("signer2"),
637+
)["interchain_account_address"]
638+
print("ica address", ica_address, "channel_id", channel_id)
639+
return ica_address, channel_id
640+
641+
625642
def funds_ica(cli, adr):
626643
# initial balance of interchain account should be zero
627644
assert cli.balance(adr) == 0

integration_tests/test_ica.py

Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@
44
from pystarport import cluster
55

66
from .ibc_utils import (
7-
assert_channel_open_init,
87
funds_ica,
98
gen_send_msg,
109
prepare_network,
10+
register_acc,
1111
wait_for_check_channel_ready,
1212
wait_for_check_tx,
1313
)
@@ -31,23 +31,7 @@ def test_ica(ibc, tmp_path):
3131
connid = "connection-0"
3232
cli_host = ibc.chainmain.cosmos_cli()
3333
cli_controller = ibc.cronos.cosmos_cli()
34-
35-
def register_acc():
36-
print("register ica account")
37-
rsp = cli_controller.icaauth_register_account(
38-
connid, from_="signer2", gas="400000", fees="100000000basetcro"
39-
)
40-
_, channel_id = assert_channel_open_init(rsp)
41-
wait_for_check_channel_ready(cli_controller, connid, channel_id)
42-
43-
print("query ica account")
44-
ica_address = cli_controller.ica_query_account(
45-
connid, cli_controller.address("signer2")
46-
)["interchain_account_address"]
47-
print("ica address", ica_address, "channel_id", channel_id)
48-
return ica_address, channel_id
49-
50-
ica_address, channel_id = register_acc()
34+
ica_address, channel_id = register_acc(cli_controller, connid)
5135
balance = funds_ica(cli_host, ica_address)
5236
num_txs = len(cli_host.query_all_txs(ica_address)["txs"])
5337
to = cli_host.address("signer2")
@@ -90,7 +74,7 @@ def submit_msgs(msg_num, timeout_in_s=no_timeout, gas="200000"):
9074
assert cli_host.balance(ica_address, denom=denom) == balance
9175
wait_for_check_channel_ready(cli_controller, connid, channel_id, "STATE_CLOSED")
9276
# reopen ica account after channel get closed
93-
ica_address2, channel_id2 = register_acc()
77+
ica_address2, channel_id2 = register_acc(cli_controller, connid)
9478
assert ica_address2 == ica_address, ica_address2
9579
assert channel_id2 != channel_id, channel_id2
9680
# submit normal txs should work

integration_tests/test_ica_ctrl.py

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
import json
2+
3+
import pytest
4+
from pystarport import cluster
5+
6+
from .ibc_utils import (
7+
deploy_contract,
8+
funds_ica,
9+
gen_send_msg,
10+
parse_events_rpc,
11+
prepare_network,
12+
register_acc,
13+
wait_for_check_tx,
14+
)
15+
from .utils import CONTRACTS, wait_for_fn
16+
17+
18+
@pytest.fixture(scope="module")
19+
def ibc(request, tmp_path_factory):
20+
"prepare-network"
21+
name = "ibc_rly"
22+
path = tmp_path_factory.mktemp(name)
23+
yield from prepare_network(
24+
path,
25+
name,
26+
incentivized=False,
27+
connection_only=True,
28+
relayer=cluster.Relayer.RLY.value,
29+
)
30+
31+
32+
def test_cb(ibc):
33+
connid = "connection-0"
34+
cli_host = ibc.chainmain.cosmos_cli()
35+
cli_controller = ibc.cronos.cosmos_cli()
36+
ica_address, _ = register_acc(cli_controller, connid)
37+
funds_ica(cli_host, ica_address)
38+
num_txs = len(cli_host.query_all_txs(ica_address)["txs"])
39+
to = cli_host.address("signer2")
40+
amount = 1000
41+
denom = "basecro"
42+
jsonfile = CONTRACTS["TestICA"]
43+
tcontract = deploy_contract(ibc.cronos.w3, jsonfile)
44+
memo = {"src_callback": {"address": tcontract.address}}
45+
46+
def generated_tx_packet(msg_num):
47+
# generate a transaction to send to host chain
48+
m = gen_send_msg(ica_address, to, denom, amount)
49+
msgs = []
50+
for i in range(msg_num):
51+
msgs.append(m)
52+
data = json.dumps(msgs)
53+
packet = cli_controller.ica_generate_packet_data(data, json.dumps(memo))
54+
return packet
55+
56+
def send_tx(msg_num, gas="200000"):
57+
generated_tx = json.dumps(generated_tx_packet(msg_num))
58+
# submit transaction on host chain on behalf of interchain account
59+
rsp = cli_controller.ica_ctrl_send_tx(
60+
connid,
61+
generated_tx,
62+
gas=gas,
63+
from_="signer2",
64+
)
65+
assert rsp["code"] == 0, rsp["raw_log"]
66+
wait_for_check_tx(cli_host, ica_address, num_txs)
67+
68+
msg_num = 10
69+
send_tx(msg_num)
70+
71+
def check_for_ack():
72+
criteria = "message.action=/ibc.core.channel.v1.MsgAcknowledgement"
73+
return cli_controller.tx_search(criteria)["txs"]
74+
75+
txs = wait_for_fn("ack change", check_for_ack)
76+
events = parse_events_rpc(txs[0]["events"])
77+
err = events.get("ibc_src_callback")["callback_error"]
78+
assert "sender is not authenticated" in err, err

0 commit comments

Comments
 (0)