numbers.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. package abi
  2. import (
  3. "math/big"
  4. "reflect"
  5. "github.com/ethereum/go-ethereum/common"
  6. )
  7. var big_t = reflect.TypeOf(&big.Int{})
  8. var ubig_t = reflect.TypeOf(&big.Int{})
  9. var byte_t = reflect.TypeOf(byte(0))
  10. var byte_ts = reflect.TypeOf([]byte(nil))
  11. var uint_t = reflect.TypeOf(uint(0))
  12. var uint8_t = reflect.TypeOf(uint8(0))
  13. var uint16_t = reflect.TypeOf(uint16(0))
  14. var uint32_t = reflect.TypeOf(uint32(0))
  15. var uint64_t = reflect.TypeOf(uint64(0))
  16. var int_t = reflect.TypeOf(int(0))
  17. var int8_t = reflect.TypeOf(int8(0))
  18. var int16_t = reflect.TypeOf(int16(0))
  19. var int32_t = reflect.TypeOf(int32(0))
  20. var int64_t = reflect.TypeOf(int64(0))
  21. var uint_ts = reflect.TypeOf([]uint(nil))
  22. var uint8_ts = reflect.TypeOf([]uint8(nil))
  23. var uint16_ts = reflect.TypeOf([]uint16(nil))
  24. var uint32_ts = reflect.TypeOf([]uint32(nil))
  25. var uint64_ts = reflect.TypeOf([]uint64(nil))
  26. var ubig_ts = reflect.TypeOf([]*big.Int(nil))
  27. var int_ts = reflect.TypeOf([]int(nil))
  28. var int8_ts = reflect.TypeOf([]int8(nil))
  29. var int16_ts = reflect.TypeOf([]int16(nil))
  30. var int32_ts = reflect.TypeOf([]int32(nil))
  31. var int64_ts = reflect.TypeOf([]int64(nil))
  32. var big_ts = reflect.TypeOf([]*big.Int(nil))
  33. // U256 will ensure unsigned 256bit on big nums
  34. func U256(n *big.Int) []byte {
  35. return common.LeftPadBytes(common.U256(n).Bytes(), 32)
  36. }
  37. func S256(n *big.Int) []byte {
  38. sint := common.S256(n)
  39. ret := common.LeftPadBytes(sint.Bytes(), 32)
  40. if sint.Cmp(common.Big0) < 0 {
  41. for i, b := range ret {
  42. if b == 0 {
  43. ret[i] = 1
  44. continue
  45. }
  46. break
  47. }
  48. }
  49. return ret
  50. }
  51. // S256 will ensure signed 256bit on big nums
  52. func U2U256(n uint64) []byte {
  53. return U256(big.NewInt(int64(n)))
  54. }
  55. func S2S256(n int64) []byte {
  56. return S256(big.NewInt(n))
  57. }
  58. // packNum packs the given number (using the reflect value) and will cast it to appropriate number representation
  59. func packNum(value reflect.Value, to byte) []byte {
  60. switch kind := value.Kind(); kind {
  61. case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
  62. if to == UintTy {
  63. return U2U256(value.Uint())
  64. } else {
  65. return S2S256(int64(value.Uint()))
  66. }
  67. case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
  68. if to == UintTy {
  69. return U2U256(uint64(value.Int()))
  70. } else {
  71. return S2S256(value.Int())
  72. }
  73. case reflect.Ptr:
  74. // This only takes care of packing and casting. No type checking is done here. It should be done prior to using this function.
  75. if to == UintTy {
  76. return U256(value.Interface().(*big.Int))
  77. } else {
  78. return S256(value.Interface().(*big.Int))
  79. }
  80. }
  81. return nil
  82. }
  83. // checks whether the given reflect value is signed. This also works for slices with a number type
  84. func isSigned(v reflect.Value) bool {
  85. switch v.Type() {
  86. case ubig_ts, big_ts, big_t, ubig_t:
  87. return true
  88. case int_ts, int8_ts, int16_ts, int32_ts, int64_ts, int_t, int8_t, int16_t, int32_t, int64_t:
  89. return true
  90. }
  91. return false
  92. }