Skip to content

Commit 5a42afb

Browse files
committed
Problem: no register support for payee and counterpartyPayee
1 parent 7dd3362 commit 5a42afb

File tree

8 files changed

+136
-313
lines changed

8 files changed

+136
-313
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# Changelog
22

3+
## UNRELEASED
4+
5+
### Features
6+
7+
* [#1665](https://github.com/crypto-org-chain/cronos/pull/1665) Support register for payee and counterpartyPayee in relayer precompile.
8+
39
*Oct 24, 2024*
410

511
## v1.4.0-rc2

app/app.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -680,7 +680,7 @@ func New(
680680
evmS,
681681
[]evmkeeper.CustomContractFn{
682682
func(_ sdk.Context, rules ethparams.Rules) vm.PrecompiledContract {
683-
return cronosprecompiles.NewRelayerContract(app.IBCKeeper, appCodec, rules, app.Logger())
683+
return cronosprecompiles.NewRelayerContract(app.IBCKeeper, app.IBCFeeKeeper, appCodec, rules, app.Logger())
684684
},
685685
func(ctx sdk.Context, rules ethparams.Rules) vm.PrecompiledContract {
686686
return cronosprecompiles.NewIcaContract(ctx, app.ICAControllerKeeper, &app.CronosKeeper, appCodec, gasConfig)
Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,32 @@
11
// SPDX-License-Identifier: MIT
22
pragma solidity ^0.8.4;
33

4+
import {IRelayerFunctions} from "./src/RelayerFunctions.sol";
5+
46
contract TestRelayer {
5-
address constant relayer = 0x0000000000000000000000000000000000000065;
7+
address constant relayerContract = 0x0000000000000000000000000000000000000065;
8+
IRelayerFunctions relayer = IRelayerFunctions(relayerContract);
9+
address payee;
10+
address counterpartyPayee;
611

712
function batchCall(bytes[] memory payloads) public {
813
for (uint256 i = 0; i < payloads.length; i++) {
9-
(bool success,) = relayer.call(payloads[i]);
14+
(bool success,) = relayerContract.call(payloads[i]);
1015
require(success);
1116
}
1217
}
18+
19+
function callRegisterPayee(string calldata portID, string calldata channelID, address relayerAddr) public returns (bool) {
20+
require(payee == address(0) || payee == msg.sender, "register fail");
21+
bool result = relayer.registerPayee(portID, channelID, relayerAddr);
22+
require(result, "call failed");
23+
payee = msg.sender;
24+
}
25+
26+
function callRegisterCounterpartyPayee(string calldata portID, string calldata channelID, address relayerAddr) public returns (bool) {
27+
require(counterpartyPayee == address(0) || counterpartyPayee == msg.sender, "register fail");
28+
bool result = relayer.registerCounterpartyPayee(portID, channelID, relayerAddr);
29+
require(result, "call failed");
30+
counterpartyPayee = msg.sender;
31+
}
1332
}

integration_tests/ibc_utils.py

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,8 @@ def prepare_network(
189189
tx = {"to": sender, "value": fund, "gasPrice": w3.eth.gas_price}
190190
send_transaction(w3, tx)
191191
assert w3.eth.get_balance(sender, "latest") == fund
192-
caller = deploy_contract(w3, CONTRACTS["TestRelayer"], key=acc.key).address
192+
contract = deploy_contract(w3, CONTRACTS["TestRelayer"], key=acc.key)
193+
caller = contract.address
193194
assert caller == RELAYER_CALLER, caller
194195
if is_hermes:
195196
hermes = Hermes(path.with_suffix(".toml"))
@@ -203,7 +204,17 @@ def prepare_network(
203204
call_rly_cmd(path, connection_only, version)
204205

205206
if incentivized:
206-
register_fee_payee(cronos.cosmos_cli(), chainmain.cosmos_cli())
207+
port_id = "transfer"
208+
channel_id = "channel-0"
209+
register_fee_payee(
210+
cronos.cosmos_cli(), chainmain.cosmos_cli(), port_id, channel_id
211+
)
212+
data = {"from": acc.address}
213+
tx = contract.functions.callRegisterPayee(
214+
port_id, channel_id, ADDRS["signer1"]
215+
).build_transaction(data)
216+
receipt = send_transaction(w3, tx, acc.key)
217+
assert receipt.status == 1, receipt
207218

208219
port = None
209220
if is_relay:
@@ -217,10 +228,10 @@ def prepare_network(
217228
wait_for_port(port)
218229

219230

220-
def register_fee_payee(src_chain, dst_chain):
231+
def register_fee_payee(src_chain, dst_chain, port_id, channel_id):
221232
rsp = dst_chain.register_counterparty_payee(
222-
"transfer",
223-
"channel-0",
233+
port_id,
234+
channel_id,
224235
dst_chain.address("relayer"),
225236
src_chain.address("signer1"),
226237
from_="relayer",

x/cronos/events/bindings/cosmos/precompile/relayer/i_relayer_functions.abigen.go

Lines changed: 43 additions & 274 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

x/cronos/events/bindings/src/RelayerFunctions.sol

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,6 @@ interface IRelayerFunctions {
2020
function acknowledgement(bytes calldata data) external payable returns (bytes calldata);
2121
function timeout(bytes calldata data) external payable returns (bytes calldata);
2222
function timeoutOnClose(bytes calldata data) external payable returns (bytes calldata);
23-
function updateClientAndConnectionOpenInit(bytes calldata data1, bytes calldata data2) external payable returns (bool);
24-
function updateClientAndConnectionOpenTry(bytes calldata data1, bytes calldata data2) external payable returns (bool);
25-
function updateClientAndConnectionOpenAck(bytes calldata data1, bytes calldata data2) external payable returns (bool);
26-
function updateClientAndConnectionOpenConfirm(bytes calldata data1, bytes calldata data2) external payable returns (bool);
27-
function updateClientAndChannelOpenInit(bytes calldata data1, bytes calldata data2) external payable returns (bool);
28-
function updateClientAndChannelOpenTry(bytes calldata data1, bytes calldata data2) external payable returns (bool);
29-
function updateClientAndChannelOpenAck(bytes calldata data1, bytes calldata data2) external payable returns (bool);
30-
function updateClientAndChannelOpenConfirm(bytes calldata data1, bytes calldata data2) external payable returns (bool);
31-
function updateClientAndRecvPacket(bytes calldata data1, bytes calldata data2) external payable returns (bool);
32-
function updateClientAndAcknowledgement(bytes calldata data1, bytes calldata data2) external payable returns (bool);
33-
function updateClientAndTimeout(bytes calldata data1, bytes calldata data2) external payable returns (bool);
34-
function updateClientAndChannelCloseInit(bytes calldata data1, bytes calldata data2) external payable returns (bool);
35-
function updateClientAndChannelCloseConfirm(bytes calldata data1, bytes calldata data2) external payable returns (bool);
23+
function registerPayee(string calldata portID, string calldata channelID, address relayerAddr) external payable returns (bool);
24+
function registerCounterpartyPayee(string calldata portID, string calldata channelID, address relayerAddr) external payable returns (bool);
3625
}

x/cronos/keeper/precompiles/relayer.go

Lines changed: 41 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package precompiles
22

33
import (
4-
"context"
54
"errors"
65
"fmt"
76

@@ -15,6 +14,7 @@ import (
1514
"github.com/ethereum/go-ethereum/params"
1615

1716
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
17+
ibcfeetypes "github.com/cosmos/ibc-go/v8/modules/apps/29-fee/types"
1818
ibctransfertypes "github.com/cosmos/ibc-go/v8/modules/apps/transfer/types"
1919
channeltypes "github.com/cosmos/ibc-go/v8/modules/core/04-channel/types"
2020
cronosevents "github.com/crypto-org-chain/cronos/v2/x/cronos/events"
@@ -48,7 +48,9 @@ const (
4848
Acknowledgement = "acknowledgement"
4949
Timeout = "timeout"
5050
TimeoutOnClose = "timeoutOnClose"
51-
51+
// ibc fee
52+
RegisterPayee = "registerPayee"
53+
RsegisterCounterpartyPayee = "registerCounterpartyPayee"
5254
GasWhenReceiverChainIsSource = 51705
5355
GasWhenReceiverChainIsNotSource = 144025
5456
)
@@ -101,18 +103,20 @@ func init() {
101103
type RelayerContract struct {
102104
BaseContract
103105

104-
cdc codec.Codec
105-
ibcKeeper types.IbcKeeper
106-
logger log.Logger
107-
isHomestead bool
108-
isIstanbul bool
109-
isShanghai bool
106+
cdc codec.Codec
107+
ibcKeeper types.IbcKeeper
108+
ibcFeeKeeper types.IbcFeeKeeper
109+
logger log.Logger
110+
isHomestead bool
111+
isIstanbul bool
112+
isShanghai bool
110113
}
111114

112-
func NewRelayerContract(ibcKeeper types.IbcKeeper, cdc codec.Codec, rules params.Rules, logger log.Logger) vm.PrecompiledContract {
115+
func NewRelayerContract(ibcKeeper types.IbcKeeper, ibcFeeKeeper types.IbcFeeKeeper, cdc codec.Codec, rules params.Rules, logger log.Logger) vm.PrecompiledContract {
113116
return &RelayerContract{
114117
BaseContract: NewBaseContract(relayerContractAddress),
115118
ibcKeeper: ibcKeeper,
119+
ibcFeeKeeper: ibcFeeKeeper,
116120
cdc: cdc,
117121
isHomestead: rules.IsHomestead,
118122
isIstanbul: rules.IsIstanbul,
@@ -191,8 +195,33 @@ func (bc *RelayerContract) Run(evm *vm.EVM, contract *vm.Contract, readonly bool
191195
if err != nil {
192196
return nil, errors.New("fail to unpack input arguments")
193197
}
194-
input := args[0].([]byte)
195198
converter := cronosevents.RelayerConvertEvent
199+
if method.Name == RegisterPayee || method.Name == RsegisterCounterpartyPayee {
200+
execErr := stateDB.ExecuteNativeAction(precompileAddr, converter, func(ctx sdk.Context) error {
201+
portID := args[0].(string)
202+
channelID := args[1].(string)
203+
relayerAddr := sdk.AccAddress(args[2].(common.Address).Bytes()).String()
204+
caller := sdk.AccAddress(contract.CallerAddress.Bytes()).String()
205+
if method.Name == RegisterPayee {
206+
_, err := bc.ibcFeeKeeper.RegisterPayee(
207+
ctx,
208+
ibcfeetypes.NewMsgRegisterPayee(portID, channelID, caller, relayerAddr),
209+
)
210+
return err
211+
} else {
212+
_, err = bc.ibcFeeKeeper.RegisterCounterpartyPayee(
213+
ctx,
214+
ibcfeetypes.NewMsgRegisterCounterpartyPayee(portID, channelID, caller, relayerAddr),
215+
)
216+
return err
217+
}
218+
})
219+
if execErr != nil {
220+
return nil, execErr
221+
}
222+
return method.Outputs.Pack(true)
223+
}
224+
input := args[0].([]byte)
196225
e := &Executor{
197226
cdc: bc.cdc,
198227
stateDB: stateDB,
@@ -231,15 +260,9 @@ func (bc *RelayerContract) Run(evm *vm.EVM, contract *vm.Contract, readonly bool
231260
case RecvPacket:
232261
res, err = exec(e, bc.ibcKeeper.RecvPacket)
233262
case Acknowledgement:
234-
res, err = exec(e, func(goCtx context.Context, msg *channeltypes.MsgAcknowledgement) (*channeltypes.MsgAcknowledgementResponse, error) {
235-
msg.Signer = sdk.AccAddress(evm.TxContext.Origin.Bytes()).String()
236-
return bc.ibcKeeper.Acknowledgement(goCtx, msg)
237-
})
263+
res, err = exec(e, bc.ibcKeeper.Acknowledgement)
238264
case Timeout:
239-
res, err = exec(e, func(goCtx context.Context, msg *channeltypes.MsgTimeout) (*channeltypes.MsgTimeoutResponse, error) {
240-
msg.Signer = sdk.AccAddress(evm.TxContext.Origin.Bytes()).String()
241-
return bc.ibcKeeper.Timeout(goCtx, msg)
242-
})
265+
res, err = exec(e, bc.ibcKeeper.Timeout)
243266
case TimeoutOnClose:
244267
res, err = exec(e, bc.ibcKeeper.TimeoutOnClose)
245268
default:

x/cronos/types/interfaces.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"github.com/ethereum/go-ethereum/params"
1616
evmtypes "github.com/evmos/ethermint/x/evm/types"
1717

18+
ibcfeetypes "github.com/cosmos/ibc-go/v8/modules/apps/29-fee/types"
1819
clienttypes "github.com/cosmos/ibc-go/v8/modules/core/02-client/types"
1920
connectiontypes "github.com/cosmos/ibc-go/v8/modules/core/03-connection/types"
2021
channeltypes "github.com/cosmos/ibc-go/v8/modules/core/04-channel/types"
@@ -94,3 +95,8 @@ type IbcKeeper interface {
9495
Timeout(goCtx context.Context, msg *channeltypes.MsgTimeout) (*channeltypes.MsgTimeoutResponse, error)
9596
TimeoutOnClose(goCtx context.Context, msg *channeltypes.MsgTimeoutOnClose) (*channeltypes.MsgTimeoutOnCloseResponse, error)
9697
}
98+
99+
type IbcFeeKeeper interface {
100+
RegisterPayee(goCtx context.Context, msg *ibcfeetypes.MsgRegisterPayee) (*ibcfeetypes.MsgRegisterPayeeResponse, error)
101+
RegisterCounterpartyPayee(goCtx context.Context, msg *ibcfeetypes.MsgRegisterCounterpartyPayee) (*ibcfeetypes.MsgRegisterCounterpartyPayeeResponse, error)
102+
}

0 commit comments

Comments
 (0)