11package precompiles
22
33import (
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() {
101103type 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 :
0 commit comments