diff --git a/chain/types/ethtypes/eth_transactions.go b/chain/types/ethtypes/eth_transactions.go index b6ae22169..18b922234 100644 --- a/chain/types/ethtypes/eth_transactions.go +++ b/chain/types/ethtypes/eth_transactions.go @@ -12,13 +12,11 @@ import ( "github.com/filecoin-project/go-address" gocrypto "github.com/filecoin-project/go-crypto" - "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" builtintypes "github.com/filecoin-project/go-state-types/builtin" typescrypto "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/lotus/build" - "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/types" ) @@ -63,6 +61,7 @@ func EthTxArgsFromMessage(msg *types.Message) (EthTxArgs, error) { to *EthAddress params []byte paramsReader = bytes.NewReader(msg.Params) + err error ) if msg.Version != 0 { @@ -72,11 +71,10 @@ func EthTxArgsFromMessage(msg *types.Message) (EthTxArgs, error) { if msg.To == builtintypes.EthereumAddressManagerActorAddr { switch msg.Method { case builtintypes.MethodsEAM.CreateExternal: - var create abi.CborBytes - if err := create.UnmarshalCBOR(paramsReader); err != nil { - return EthTxArgs{}, err + params, err = cbg.ReadByteArray(paramsReader, uint64(len(msg.Params))) + if err != nil { + return EthTxArgs{}, xerrors.Errorf("failed to read params byte array: %w", err) } - params = create default: return EthTxArgs{}, fmt.Errorf("unsupported EAM method") } @@ -103,11 +101,6 @@ func EthTxArgsFromMessage(msg *types.Message) (EthTxArgs, error) { if err != nil { return EthTxArgs{}, xerrors.Errorf("failed to read params byte array: %w", err) } - - if len(params) == 0 { - // Otherwise, we don't get a guaranteed round-trip. - return EthTxArgs{}, xerrors.Errorf("cannot invoke contracts with empty parameters from an eth-account") - } } } @@ -115,6 +108,11 @@ func EthTxArgsFromMessage(msg *types.Message) (EthTxArgs, error) { return EthTxArgs{}, xerrors.Errorf("extra data found in params") } + if len(params) == 0 && msg.Method != builtintypes.MethodSend { + // Otherwise, we don't get a guaranteed round-trip. + return EthTxArgs{}, xerrors.Errorf("msgs with empty parameters from an eth-account must be Sends (MethodNum: %d)", msg.Method) + } + return EthTxArgs{ ChainID: build.Eip155ChainId, Nonce: int(msg.Nonce), @@ -143,12 +141,13 @@ func (tx *EthTxArgs) ToUnsignedMessage(from address.Address) (*types.Message, er if len(tx.Input) == 0 { return nil, xerrors.New("cannot call CreateExternal without params") } - inputParams := abi.CborBytes(tx.Input) - params, err = actors.SerializeParams(&inputParams) - if err != nil { - return nil, fmt.Errorf("failed to serialize Create params: %w", err) + + buf := new(bytes.Buffer) + if err = cbg.WriteByteArray(buf, tx.Input); err != nil { + return nil, xerrors.Errorf("failed to serialize Create params: %w", err) } + params = buf.Bytes() } else { to, err = tx.To.ToFilecoinAddress() if err != nil {