github.com/cosmos/cosmos-sdk@v0.50.10/codec/amino.go (about)

     1  package codec
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/json"
     6  	"errors"
     7  	"fmt"
     8  	"io"
     9  
    10  	cmttypes "github.com/cometbft/cometbft/types"
    11  	amino "github.com/tendermint/go-amino"
    12  
    13  	"github.com/cosmos/cosmos-sdk/codec/types"
    14  )
    15  
    16  // LegacyAmino defines a wrapper for an Amino codec that properly
    17  // handles protobuf types with Any's. Deprecated.
    18  type LegacyAmino struct {
    19  	Amino *amino.Codec
    20  }
    21  
    22  func (cdc *LegacyAmino) Seal() {
    23  	cdc.Amino.Seal()
    24  }
    25  
    26  func NewLegacyAmino() *LegacyAmino {
    27  	return &LegacyAmino{amino.NewCodec()}
    28  }
    29  
    30  // RegisterEvidences registers CometBFT evidence types with the provided Amino
    31  // codec.
    32  func RegisterEvidences(cdc *LegacyAmino) {
    33  	cdc.Amino.RegisterInterface((*cmttypes.Evidence)(nil), nil)
    34  	cdc.Amino.RegisterConcrete(&cmttypes.DuplicateVoteEvidence{}, "tendermint/DuplicateVoteEvidence", nil)
    35  }
    36  
    37  // MarshalJSONIndent provides a utility for indented JSON encoding of an object
    38  // via an Amino codec. It returns an error if it cannot serialize or indent as
    39  // JSON.
    40  func MarshalJSONIndent(cdc *LegacyAmino, obj interface{}) ([]byte, error) {
    41  	bz, err := cdc.MarshalJSON(obj)
    42  	if err != nil {
    43  		return nil, err
    44  	}
    45  
    46  	var out bytes.Buffer
    47  	if err = json.Indent(&out, bz, "", "  "); err != nil {
    48  		return nil, err
    49  	}
    50  	return out.Bytes(), nil
    51  }
    52  
    53  // MustMarshalJSONIndent executes MarshalJSONIndent except it panics upon failure.
    54  func MustMarshalJSONIndent(cdc *LegacyAmino, obj interface{}) []byte {
    55  	bz, err := MarshalJSONIndent(cdc, obj)
    56  	if err != nil {
    57  		panic(fmt.Sprintf("failed to marshal JSON: %s", err))
    58  	}
    59  
    60  	return bz
    61  }
    62  
    63  func (cdc *LegacyAmino) marshalAnys(o interface{}) error {
    64  	return types.UnpackInterfaces(o, types.AminoPacker{Cdc: cdc.Amino})
    65  }
    66  
    67  func (cdc *LegacyAmino) unmarshalAnys(o interface{}) error {
    68  	return types.UnpackInterfaces(o, types.AminoUnpacker{Cdc: cdc.Amino})
    69  }
    70  
    71  func (cdc *LegacyAmino) jsonMarshalAnys(o interface{}) error {
    72  	return types.UnpackInterfaces(o, types.AminoJSONPacker{Cdc: cdc.Amino})
    73  }
    74  
    75  func (cdc *LegacyAmino) jsonUnmarshalAnys(o interface{}) error {
    76  	return types.UnpackInterfaces(o, types.AminoJSONUnpacker{Cdc: cdc.Amino})
    77  }
    78  
    79  func (cdc *LegacyAmino) Marshal(o interface{}) ([]byte, error) {
    80  	err := cdc.marshalAnys(o)
    81  	if err != nil {
    82  		return nil, err
    83  	}
    84  	return cdc.Amino.MarshalBinaryBare(o)
    85  }
    86  
    87  func (cdc *LegacyAmino) MustMarshal(o interface{}) []byte {
    88  	bz, err := cdc.Marshal(o)
    89  	if err != nil {
    90  		panic(err)
    91  	}
    92  	return bz
    93  }
    94  
    95  func (cdc *LegacyAmino) MarshalLengthPrefixed(o interface{}) ([]byte, error) {
    96  	err := cdc.marshalAnys(o)
    97  	if err != nil {
    98  		return nil, err
    99  	}
   100  	return cdc.Amino.MarshalBinaryLengthPrefixed(o)
   101  }
   102  
   103  func (cdc *LegacyAmino) MustMarshalLengthPrefixed(o interface{}) []byte {
   104  	bz, err := cdc.MarshalLengthPrefixed(o)
   105  	if err != nil {
   106  		panic(err)
   107  	}
   108  	return bz
   109  }
   110  
   111  func (cdc *LegacyAmino) Unmarshal(bz []byte, ptr interface{}) error {
   112  	err := cdc.Amino.UnmarshalBinaryBare(bz, ptr)
   113  	if err != nil {
   114  		return err
   115  	}
   116  	return cdc.unmarshalAnys(ptr)
   117  }
   118  
   119  func (cdc *LegacyAmino) MustUnmarshal(bz []byte, ptr interface{}) {
   120  	err := cdc.Unmarshal(bz, ptr)
   121  	if err != nil {
   122  		panic(err)
   123  	}
   124  }
   125  
   126  func (cdc *LegacyAmino) UnmarshalLengthPrefixed(bz []byte, ptr interface{}) error {
   127  	err := cdc.Amino.UnmarshalBinaryLengthPrefixed(bz, ptr)
   128  	if err != nil {
   129  		return err
   130  	}
   131  	return cdc.unmarshalAnys(ptr)
   132  }
   133  
   134  func (cdc *LegacyAmino) MustUnmarshalLengthPrefixed(bz []byte, ptr interface{}) {
   135  	err := cdc.UnmarshalLengthPrefixed(bz, ptr)
   136  	if err != nil {
   137  		panic(err)
   138  	}
   139  }
   140  
   141  // MarshalJSON implements codec.Codec interface
   142  func (cdc *LegacyAmino) MarshalJSON(o interface{}) ([]byte, error) {
   143  	err := cdc.jsonMarshalAnys(o)
   144  	if err != nil {
   145  		return nil, err
   146  	}
   147  	return cdc.Amino.MarshalJSON(o)
   148  }
   149  
   150  func (cdc *LegacyAmino) MustMarshalJSON(o interface{}) []byte {
   151  	bz, err := cdc.MarshalJSON(o)
   152  	if err != nil {
   153  		panic(err)
   154  	}
   155  	return bz
   156  }
   157  
   158  // UnmarshalJSON implements codec.Codec interface
   159  func (cdc *LegacyAmino) UnmarshalJSON(bz []byte, ptr interface{}) error {
   160  	err := cdc.Amino.UnmarshalJSON(bz, ptr)
   161  	if err != nil {
   162  		return err
   163  	}
   164  	return cdc.jsonUnmarshalAnys(ptr)
   165  }
   166  
   167  func (cdc *LegacyAmino) MustUnmarshalJSON(bz []byte, ptr interface{}) {
   168  	err := cdc.UnmarshalJSON(bz, ptr)
   169  	if err != nil {
   170  		panic(err)
   171  	}
   172  }
   173  
   174  func (*LegacyAmino) UnpackAny(*types.Any, interface{}) error {
   175  	return errors.New("AminoCodec can't handle unpack protobuf Any's")
   176  }
   177  
   178  func (cdc *LegacyAmino) RegisterInterface(ptr interface{}, iopts *amino.InterfaceOptions) {
   179  	cdc.Amino.RegisterInterface(ptr, iopts)
   180  }
   181  
   182  func (cdc *LegacyAmino) RegisterConcrete(o interface{}, name string, copts *amino.ConcreteOptions) {
   183  	cdc.Amino.RegisterConcrete(o, name, copts)
   184  }
   185  
   186  func (cdc *LegacyAmino) MarshalJSONIndent(o interface{}, prefix, indent string) ([]byte, error) {
   187  	err := cdc.jsonMarshalAnys(o)
   188  	if err != nil {
   189  		panic(err)
   190  	}
   191  	return cdc.Amino.MarshalJSONIndent(o, prefix, indent)
   192  }
   193  
   194  func (cdc *LegacyAmino) PrintTypes(out io.Writer) error {
   195  	return cdc.Amino.PrintTypes(out)
   196  }