package types import ( "encoding/json" fmt "fmt" "github.com/cosmos/gogoproto/proto" "github.com/cosmos/cosmos-sdk/codec" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" ) type ( // Msg defines the interface a transaction message must fulfill. Msg interface { proto.Message // ValidateBasic does a simple validation check that // doesn't require access to any other information. ValidateBasic() error // GetSigners returns the addrs of signers that must sign. // CONTRACT: All signatures must be present to be valid. // CONTRACT: Returns addrs in some deterministic order. GetSigners() []AccAddress } // Fee defines an interface for an application application-defined concrete // transaction type to be able to set and return the transaction fee. Fee interface { GetGas() uint64 GetAmount() Coins } // Signature defines an interface for an application application-defined // concrete transaction type to be able to set and return transaction signatures. Signature interface { GetPubKey() cryptotypes.PubKey GetSignature() []byte } // Tx defines the interface a transaction must fulfill. Tx interface { // GetMsgs gets the all the transaction's messages. GetMsgs() []Msg // ValidateBasic does a simple and lightweight validation check that doesn't // require access to any other information. ValidateBasic() error } // FeeTx defines the interface to be implemented by Tx to use the FeeDecorators FeeTx interface { Tx GetGas() uint64 GetFee() Coins FeePayer() AccAddress FeeGranter() AccAddress } // TxWithMemo must have GetMemo() method to use ValidateMemoDecorator TxWithMemo interface { Tx GetMemo() string } // TxWithTimeoutHeight extends the Tx interface by allowing a transaction to // set a height timeout. TxWithTimeoutHeight interface { Tx GetTimeoutHeight() uint64 } ) // TxDecoder unmarshals transaction bytes type TxDecoder func(txBytes []byte) (Tx, error) // TxEncoder marshals transaction to bytes type TxEncoder func(tx Tx) ([]byte, error) // MsgTypeURL returns the TypeURL of a `sdk.Msg`. func MsgTypeURL(msg Msg) string { return "/" + proto.MessageName(msg) } // GetMsgFromTypeURL returns a `sdk.Msg` message type from a type URL func GetMsgFromTypeURL(cdc codec.Codec, input string) (Msg, error) { var msg Msg bz, err := json.Marshal(struct { Type string `json:"@type"` }{ Type: input, }) if err != nil { return nil, err } if err := cdc.UnmarshalInterfaceJSON(bz, &msg); err != nil { return nil, fmt.Errorf("failed to determine sdk.Msg for %s URL : %w", input, err) } return msg, nil }