105 lines
2.6 KiB
Go
105 lines
2.6 KiB
Go
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
|
|
}
|