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 }