func HandleMsgEthereumTx(ctx sdk.Context, k Keeper, msg types.MsgEthereumTx) sdk.Result {
	ctx = ctx.WithEventManager(sdk.NewEventManager())
	// parse the chainID from a string to a base-10 integer
	intChainID, ok := new(big.Int).SetString(ctx.ChainID(), 10)
	if !ok {
		return emint.ErrInvalidChainID(fmt.Sprintf("invalid chainID: %s", ctx.ChainID())).Result()
	}

	// Verify signature and retrieve sender address
	sender, err := msg.VerifySig(intChainID)
	if err != nil {
		return sdk.ResultFromError(err)
	}

	txHash := tmtypes.Tx(ctx.TxBytes()).Hash()
	ethHash := common.BytesToHash(txHash)

	st := types.StateTransition{
		Sender:       sender,
		AccountNonce: msg.Data.AccountNonce,
		Price:        msg.Data.Price,
		GasLimit:     msg.Data.GasLimit,
		Recipient:    msg.Data.Recipient,
		Amount:       msg.Data.Amount,
		Payload:      msg.Data.Payload,
		Csdb:         k.CommitStateDB.WithContext(ctx),
		ChainID:      intChainID,
		THash:        &ethHash,
		Simulate:     ctx.IsCheckTx(),
	}

	// Prepare db for logs
	// TODO: block hash
	k.CommitStateDB.Prepare(ethHash, common.Hash{}, k.TxCount)
	k.TxCount++

	// TODO: move to keeper
	returnData, err := st.TransitionCSDB(ctx)
	if err != nil {
		return sdk.ResultFromError(err)
	}

	// update block bloom filter
	k.Bloom.Or(k.Bloom, returnData.Bloom)

	// update transaction logs in KVStore
	err = k.SetTransactionLogs(ctx, returnData.Logs, txHash[:])
	if err != nil {
		return sdk.ResultFromError(err)
	}

	ctx.EventManager().EmitEvents(sdk.Events{
		sdk.NewEvent(
			types.EventTypeEthereumTx,
			sdk.NewAttribute(sdk.AttributeKeyAmount, msg.Data.Amount.String()),
		),
		sdk.NewEvent(
			sdk.EventTypeMessage,
			sdk.NewAttribute(sdk.AttributeKeyModule, types.AttributeValueCategory),
			sdk.NewAttribute(sdk.AttributeKeySender, sender.String()),
		),
	})

	if msg.Data.Recipient != nil {
		ctx.EventManager().EmitEvent(
			sdk.NewEvent(
				types.EventTypeEthereumTx,
				sdk.NewAttribute(types.AttributeKeyRecipient, msg.Data.Recipient.String()),
			),
		)
	}

	// set the events to the result
	returnData.Result.Events = ctx.EventManager().Events()
	return *returnData.Result
}
// HandleMsgEthereumTx handles an Ethereum specific tx
HandleMsgEthereumTx handles an Ethereum specific tx
// HandleMsgEthereumTx handles an Ethereum specific tx
func HandleMsgEthereumTx(ctx sdk.Context, k Keeper, msg types.MsgEthereumTx) sdk.Result {
	ctx = ctx.WithEventManager(sdk.NewEventManager())
	intChainID, ok := new(big.Int).SetString(ctx.ChainID(), 10)
	if !ok {
		return emint.ErrInvalidChainID(fmt.Sprintf("invalid chainID: %s", ctx.ChainID())).Result()
	}
	sender, err := msg.VerifySig(intChainID)
	if err != nil {
		return sdk.ResultFromError(err)
	}
	txHash := tmtypes.Tx(ctx.TxBytes()).Hash()
	ethHash := common.BytesToHash(txHash)
	st := types.StateTransition{
		Sender:       sender,
		AccountNonce: msg.Data.AccountNonce,
		Price:        msg.Data.Price,
		GasLimit:     msg.Data.GasLimit,
		Recipient:    msg.Data.Recipient,
		Amount:       msg.Data.Amount,
		Payload:      msg.Data.Payload,
		Csdb:         k.CommitStateDB.WithContext(ctx),
		ChainID:      intChainID,
		THash:        &ethHash,
		Simulate:     ctx.IsCheckTx(),
	}
	k.CommitStateDB.Prepare(ethHash, common.Hash{}, k.TxCount)
	k.TxCount++
	returnData, err := st.TransitionCSDB(ctx)
	if err != nil {
		return sdk.ResultFromError(err)
	}
	k.Bloom.Or(k.Bloom, returnData.Bloom)
	err = k.SetTransactionLogs(ctx, returnData.Logs, txHash[:])
	if err != nil {
		return sdk.ResultFromError(err)
	}
	ctx.EventManager().EmitEvents(sdk.Events{
		sdk.NewEvent(
			types.EventTypeEthereumTx,
			sdk.NewAttribute(sdk.AttributeKeyAmount, msg.Data.Amount.String()),
		),
		sdk.NewEvent(
			sdk.EventTypeMessage,
			sdk.NewAttribute(sdk.AttributeKeyModule, types.AttributeValueCategory),
			sdk.NewAttribute(sdk.AttributeKeySender, sender.String()),
		),
	})
	if msg.Data.Recipient != nil {
		ctx.EventManager().EmitEvent(
			sdk.NewEvent(
				types.EventTypeEthereumTx,
				sdk.NewAttribute(types.AttributeKeyRecipient, msg.Data.Recipient.String()),
			),
		)
	}
	returnData.Result.Events = ctx.EventManager().Events()
	return *returnData.Result
}
func HandleMsgEthereumTx ( ctx sdk . Context , k Keeper , msg types . MsgEthereumTx ) sdk . Result { ctx = ctx . WithEventManager ( sdk . NewEventManager ( ) ) intChainID , ok := new ( big . Int ) . SetString ( ctx . ChainID ( ) , 10 ) if ! ok { return emint . ErrInvalidChainID ( fmt . Sprintf ( " " , ctx . ChainID ( ) ) ) . Result ( ) } sender , err := msg . VerifySig ( intChainID ) if err != nil { return sdk . ResultFromError ( err ) } txHash := tmtypes . Tx ( ctx . TxBytes ( ) ) . Hash ( ) ethHash := common . BytesToHash ( txHash ) st := types . StateTransition { Sender : sender , AccountNonce : msg . Data . AccountNonce , Price : msg . Data . Price , GasLimit : msg . Data . GasLimit , Recipient : msg . Data . Recipient , Amount : msg . Data . Amount , Payload : msg . Data . Payload , Csdb : k . CommitStateDB . WithContext ( ctx ) , ChainID : intChainID , THash : & ethHash , Simulate : ctx . IsCheckTx ( ) , } k . CommitStateDB . Prepare ( ethHash , common . Hash { } , k . TxCount ) k . TxCount ++ returnData , err := st . TransitionCSDB ( ctx ) if err != nil { return sdk . ResultFromError ( err ) } k . Bloom . Or ( k . Bloom , returnData . Bloom ) err = k . SetTransactionLogs ( ctx , returnData . Logs , txHash [ : ] ) if err != nil { return sdk . ResultFromError ( err ) } ctx . EventManager ( ) . EmitEvents ( sdk . Events { sdk . NewEvent ( types . EventTypeEthereumTx , sdk . NewAttribute ( sdk . AttributeKeyAmount , msg . Data . Amount . String ( ) ) , ) , sdk . NewEvent ( sdk . EventTypeMessage , sdk . NewAttribute ( sdk . AttributeKeyModule , types . AttributeValueCategory ) , sdk . NewAttribute ( sdk . AttributeKeySender , sender . String ( ) ) , ) , } ) if msg . Data . Recipient != nil { ctx . EventManager ( ) . EmitEvent ( sdk . NewEvent ( types . EventTypeEthereumTx , sdk . NewAttribute ( types . AttributeKeyRecipient , msg . Data . Recipient . String ( ) ) , ) , ) } returnData . Result . Events = ctx . EventManager ( ) . Events ( ) return * returnData . Result }
HandleMsgEthereumTx handles an Ethereum specific tx
HandleMsgEthereumTx handles an Ethereum specific tx
// parse the chainID from a string to a base-10 integer // Verify signature and retrieve sender address // Prepare db for logs // TODO: block hash // TODO: move to keeper // update block bloom filter // update transaction logs in KVStore // set the events to the result