github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/libs/cosmos-sdk/types/utils.go (about) 1 package types 2 3 import ( 4 "encoding/binary" 5 "encoding/json" 6 "fmt" 7 "time" 8 9 "github.com/spf13/viper" 10 11 "github.com/ethereum/go-ethereum/common" 12 13 dbm "github.com/fibonacci-chain/fbc/libs/tm-db" 14 ) 15 16 const FlagDBBackend = "db_backend" 17 18 // SortedJSON takes any JSON and returns it sorted by keys. Also, all white-spaces 19 // are removed. 20 // This method can be used to canonicalize JSON to be returned by GetSignBytes, 21 // e.g. for the ledger integration. 22 // If the passed JSON isn't valid it will return an error. 23 func SortJSON(toSortJSON []byte) ([]byte, error) { 24 var c interface{} 25 err := json.Unmarshal(toSortJSON, &c) 26 if err != nil { 27 return nil, err 28 } 29 js, err := json.Marshal(c) 30 if err != nil { 31 return nil, err 32 } 33 return js, nil 34 } 35 36 // MustSortJSON is like SortJSON but panic if an error occurs, e.g., if 37 // the passed JSON isn't valid. 38 func MustSortJSON(toSortJSON []byte) []byte { 39 js, err := SortJSON(toSortJSON) 40 if err != nil { 41 panic(err) 42 } 43 return js 44 } 45 46 // Uint64ToBigEndian - marshals uint64 to a bigendian byte slice so it can be sorted 47 func Uint64ToBigEndian(i uint64) []byte { 48 b := make([]byte, 8) 49 binary.BigEndian.PutUint64(b, i) 50 return b 51 } 52 53 // BigEndianToUint64 returns an uint64 from big endian encoded bytes. If encoding 54 // is empty, zero is returned. 55 func BigEndianToUint64(bz []byte) uint64 { 56 if len(bz) == 0 { 57 return 0 58 } 59 60 return binary.BigEndian.Uint64(bz) 61 } 62 63 // Slight modification of the RFC3339Nano but it right pads all zeros and drops the time zone info 64 const SortableTimeFormat = "2006-01-02T15:04:05.000000000" 65 66 // Formats a time.Time into a []byte that can be sorted 67 func FormatTimeBytes(t time.Time) []byte { 68 return []byte(t.UTC().Round(0).Format(SortableTimeFormat)) 69 } 70 71 // Parses a []byte encoded using FormatTimeKey back into a time.Time 72 func ParseTimeBytes(bz []byte) (time.Time, error) { 73 str := string(bz) 74 t, err := time.Parse(SortableTimeFormat, str) 75 if err != nil { 76 return t, err 77 } 78 return t.UTC().Round(0), nil 79 } 80 81 // NewDB instantiate a new DB instance according to db_backend. 82 func NewDB(name, dir string) (db dbm.DB, err error) { 83 defer func() { 84 if r := recover(); r != nil { 85 err = fmt.Errorf("couldn't create db: %v", r) 86 } 87 }() 88 89 backend := viper.GetString(FlagDBBackend) 90 if len(backend) == 0 { 91 backend = string(dbm.GoLevelDBBackend) 92 } 93 db = dbm.NewDB(name, dbm.BackendType(backend), dir) 94 return 95 } 96 97 type ParaMsg struct { 98 UseCurrentState bool 99 HaveCosmosTxInBlock bool 100 AnteErr error 101 RefundFee Coins 102 LogIndex int 103 HasRunEvmTx bool 104 } 105 106 type FeeSplitInfo struct { 107 Addr AccAddress 108 Fee Coins 109 HasFee bool 110 } 111 112 type TxWatcher struct { 113 IWatcher 114 } 115 type WatchMessage interface { 116 GetKey() []byte 117 GetValue() string 118 GetType() uint32 119 } 120 121 type IWatcher interface { 122 Enabled() bool 123 SaveContractCode(addr common.Address, code []byte, height uint64) 124 SaveContractCodeByHash(hash []byte, code []byte) 125 SaveAccount(account interface{}) 126 DeleteAccount(account interface{}) 127 SaveState(addr common.Address, key, value []byte) 128 SaveContractBlockedListItem(addr interface{}) 129 SaveContractMethodBlockedListItem(addr interface{}, methods []byte) 130 SaveContractDeploymentWhitelistItem(addr interface{}) 131 DeleteContractBlockedList(addr interface{}) 132 DeleteContractDeploymentWhitelist(addr interface{}) 133 Finalize() 134 Destruct() []WatchMessage 135 } 136 137 type EmptyWatcher struct { 138 } 139 140 func (e EmptyWatcher) Enabled() bool { return false } 141 func (e EmptyWatcher) SaveContractCode(addr common.Address, code []byte, height uint64) {} 142 func (e EmptyWatcher) SaveContractCodeByHash(hash []byte, code []byte) {} 143 func (e EmptyWatcher) SaveAccount(account interface{}) {} 144 func (e EmptyWatcher) DeleteAccount(account interface{}) {} 145 func (e EmptyWatcher) SaveState(addr common.Address, key, value []byte) {} 146 func (e EmptyWatcher) SaveContractBlockedListItem(addr interface{}) {} 147 func (e EmptyWatcher) SaveContractMethodBlockedListItem(addr interface{}, methods []byte) {} 148 func (e EmptyWatcher) SaveContractDeploymentWhitelistItem(addr interface{}) {} 149 func (e EmptyWatcher) DeleteContractBlockedList(addr interface{}) {} 150 func (e EmptyWatcher) DeleteContractDeploymentWhitelist(addr interface{}) {} 151 func (e EmptyWatcher) Finalize() {} 152 func (e EmptyWatcher) Destruct() []WatchMessage { return nil }