cyberindex/modules/wasm/handle_msg.go

package wasm

import (
	wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types"
	sdk "github.com/cosmos/cosmos-sdk/types"
	"github.com/cosmos/cosmos-sdk/x/authz"
	"github.com/cybercongress/cyberindex/v2/database"
	cybertypes "github.com/cybercongress/cyberindex/v2/database/types"
	"github.com/forbole/juno/v5/types"
)

func (m *Module) HandleMsgExec(index int, _ *authz.MsgExec, _ int, executedMsg sdk.Msg, tx *types.Tx) error {
	return m.HandleMsg(index, executedMsg, tx)
}

func (m *Module) HandleMsg(index int, msg sdk.Msg, tx *types.Tx) error {
	return HandleMsg(tx, index, msg, m.db)
}

func HandleMsg(
	tx *types.Tx,
	index int,
	msg sdk.Msg,
	db *database.CyberDb,
) error {
	if len(tx.Logs) == 0 {
		return nil
	}

	switch cosmosMsg := msg.(type) {
	case *wasmtypes.MsgInstantiateContract:
		return handleMsgInstantiateContract(tx, index, cosmosMsg, db)
	case *wasmtypes.MsgExecuteContract:
		return handleMsgExecuteContract(tx, index, cosmosMsg, db)
	}

	return nil
}

func handleMsgInstantiateContract(tx *types.Tx, index int, msg *wasmtypes.MsgInstantiateContract, db *database.CyberDb) error {
	event, err := tx.FindEventByType(index, wasmtypes.EventTypeInstantiate)
	if err != nil {
		return err
	}

	contractAddress, err := tx.FindAttributeByKey(event, wasmtypes.AttributeKeyContractAddr)
	if err != nil {
		return err
	}

	createdAt := &wasmtypes.AbsoluteTxPosition{
		BlockHeight: uint64(tx.Height),
		TxIndex:     uint64(index),
	}

	creator, _ := sdk.AccAddressFromBech32(msg.Sender)
	admin, _ := sdk.AccAddressFromBech32(msg.Admin)
	contractInfo := wasmtypes.NewContractInfo(msg.CodeID, creator, admin, msg.Label, createdAt)
	contract := cybertypes.NewContract(&contractInfo, contractAddress, tx.Timestamp)

	return db.SaveContract(contract)
}

func handleMsgExecuteContract(tx *types.Tx, index int, msg *wasmtypes.MsgExecuteContract, db *database.CyberDb) error {
	event, err := tx.FindEventByType(index, wasmtypes.EventTypeExecute)
	if err != nil {
		return err
	}

	contractAddress, err := tx.FindAttributeByKey(event, wasmtypes.AttributeKeyContractAddr)
	if err != nil {
		return err
	}

	fee := tx.GetFee()
	feeAmount := int64(0)
	if fee.Len() == 1 {
		feeAmount = fee[0].Amount.Int64()
	}

	return db.UpdateContractStats(contractAddress, 1, tx.GasUsed, feeAmount)
}

Synonyms

cyberindex/modules/bank/handle_msg.go
cyberindex/modules/resources/handle_msg.go
cyberindex/modules/graph/handle_msg.go
cyberindex/modules/liquidity/handle_msg.go
cyberindex/modules/grid/handle_msg.go

Neighbours