memo
field in the ICS20 and ICS721 transfer packets, as introduced in IBC v3.4.0.
MsgCall
is defined here and other types are defined here.
Sender
: We cannot trust the sender of an IBC packet, the counter-party chain has full ability to lie about it. We cannot risk this sender being confused for a particular user or module address on Initia. So we replace the sender with an account to represent the sender prefixed by the channel and a evm module prefix. This is done by setting the sender to Bech32(Hash(Hash("ibc-evm-hook-intermediary") + channelID/sender))
, where the channelId is the channel id on the local chain.ContractAddr
: This field should be directly obtained from the ICS-20 packet metadataInput
: This field should be directly obtained from the ICS-20 packet metadata.memo
is not blankmemo
is valid JSONmemo
has at least one key, with value "evm"
memo["evm"]["message"]
has exactly five entries, "contract_addr"
and "input"
receiver
== "" || receiver
== "module_address::module_name::function_name"
memo
is not blankmemo
is valid JSONmemo
has at least one key, with name "evm"
memo['evm']['async_callback']['id']
: the async callback id is assigned from the contract. so later it will be passed as argument of ibc_ack
and ibc_timeout
.memo['evm']['async_callback']['contract_addr']
: The address of module which defines the callback function.MsgExecuteMessages
in OPchild module.