cosmos-sdk/server/v2/stf/mock/tx.go
Hieu Vu ac53e337a9
test(server/v2/cometbft): Add abci unit tests (#21020)
Co-authored-by: Julien Robert <julien@rbrt.fr>
2024-09-09 10:34:29 +00:00

123 lines
2.4 KiB
Go

package mock
import (
"crypto/sha256"
"encoding/json"
"errors"
"reflect"
"github.com/cosmos/gogoproto/proto"
gogoproto "github.com/cosmos/gogoproto/types"
"cosmossdk.io/core/transaction"
)
var _ transaction.Tx = Tx{}
type Tx struct {
Sender []byte
Msg transaction.Msg
GasLimit uint64
}
func (t Tx) Hash() [32]byte {
return sha256.Sum256(t.Bytes())
}
func (t Tx) GetMessages() ([]transaction.Msg, error) {
if t.Msg == nil {
return nil, errors.New("messages not available or are nil")
}
return []transaction.Msg{t.Msg}, nil
}
func (t Tx) GetSenders() ([]transaction.Identity, error) {
if t.Sender == nil {
return nil, errors.New("senders not available or are nil")
}
return []transaction.Identity{t.Sender}, nil
}
func (t Tx) GetGasLimit() (uint64, error) {
return t.GasLimit, nil
}
type encodedTx struct {
Sender []byte `json:"sender"`
Msg *gogoproto.Any `json:"message"`
GasLimit uint64 `json:"gas_limit"`
}
func (t Tx) Bytes() []byte {
v2Msg := t.Msg
msg, err := gogoproto.MarshalAny(v2Msg)
if err != nil {
panic(err)
}
tx, err := json.Marshal(encodedTx{
Sender: t.Sender,
Msg: msg,
GasLimit: t.GasLimit,
})
if err != nil {
panic(err)
}
return tx
}
func (t *Tx) Decode(b []byte) error {
rawTx := new(encodedTx)
err := json.Unmarshal(b, rawTx)
if err != nil {
return err
}
msgName, err := gogoproto.AnyMessageName(rawTx.Msg)
msgType := proto.MessageType(msgName).Elem()
if err != nil {
return err
}
msg := reflect.New(msgType).Interface().(proto.Message)
if err := gogoproto.UnmarshalAny(rawTx.Msg, msg); err != nil {
return err
}
t.Msg = msg
t.Sender = rawTx.Sender
t.GasLimit = rawTx.GasLimit
return nil
}
func (t *Tx) DecodeJSON(b []byte) error {
rawTx := new(encodedTx)
err := json.Unmarshal(b, rawTx)
if err != nil {
return err
}
msgName, err := gogoproto.AnyMessageName(rawTx.Msg)
msgType := proto.MessageType(msgName).Elem()
if err != nil {
return err
}
msg := reflect.New(msgType).Interface().(transaction.Msg)
if err := gogoproto.UnmarshalAny(rawTx.Msg, msg); err != nil {
return err
}
t.Msg = msg
t.Sender = rawTx.Sender
t.GasLimit = rawTx.GasLimit
return nil
}
type TxCodec struct{}
func (TxCodec) Decode(bytes []byte) (Tx, error) {
t := new(Tx)
err := t.Decode(bytes)
return *t, err
}
func (TxCodec) DecodeJSON(bytes []byte) (Tx, error) {
t := new(Tx)
err := t.DecodeJSON(bytes)
return *t, err
}