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 }