@@ -28,13 +28,14 @@ use super::num_consts::NumConsts;
28
28
///
29
29
/// # Examples
30
30
///
31
- /// Use `from ` to create instances out of primitive uint types or `new` to provide big
32
- /// endian bytes:
31
+ /// Use `new ` to create instances out of u128, `from` for other primitive uint types
32
+ /// or `from_be_bytes` to provide big endian bytes:
33
33
///
34
34
/// ```
35
35
/// # use cosmwasm_std::Uint512;
36
- /// let a = Uint512::from(258u128);
37
- /// let b = Uint512::new([
36
+ /// let a = Uint512::new(258u128);
37
+ /// let b = Uint512::from(258u16);
38
+ /// let c = Uint512::from_be_bytes([
38
39
/// 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8,
39
40
/// 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8,
40
41
/// 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8,
@@ -45,6 +46,7 @@ use super::num_consts::NumConsts;
45
46
/// 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 1u8, 2u8,
46
47
/// ]);
47
48
/// assert_eq!(a, b);
49
+ /// assert_eq!(a, c);
48
50
/// ```
49
51
#[ derive( Copy , Clone , Default , Debug , PartialEq , Eq , PartialOrd , Ord , schemars:: JsonSchema ) ]
50
52
pub struct Uint512 ( #[ schemars( with = "String" ) ] pub ( crate ) U512 ) ;
@@ -56,10 +58,21 @@ impl Uint512 {
56
58
pub const MAX : Uint512 = Uint512 ( U512 :: MAX ) ;
57
59
pub const MIN : Uint512 = Uint512 ( U512 :: ZERO ) ;
58
60
59
- /// Creates a Uint512(value) from a big endian representation. It's just an alias for
60
- /// `from_be_bytes`.
61
- pub const fn new ( value : [ u8 ; 64 ] ) -> Self {
62
- Self :: from_be_bytes ( value)
61
+ /// Creates a Uint512(value).
62
+ ///
63
+ /// This method is less flexible than `from` but can be called in a const context.
64
+ ///
65
+ /// Before CosmWasm 3 this took a byte array as an argument. You can get this behaviour
66
+ /// with [`from_be_bytes`].
67
+ ///
68
+ /// [`from_be_bytes`]: Self::from_be_bytes
69
+ pub const fn new ( value : u128 ) -> Self {
70
+ let b = value. to_be_bytes ( ) ;
71
+ Self :: from_be_bytes ( [
72
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
73
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , b[ 0 ] , b[ 1 ] , b[ 2 ] , b[ 3 ] , b[ 4 ] ,
74
+ b[ 5 ] , b[ 6 ] , b[ 7 ] , b[ 8 ] , b[ 9 ] , b[ 10 ] , b[ 11 ] , b[ 12 ] , b[ 13 ] , b[ 14 ] , b[ 15 ] ,
75
+ ] )
63
76
}
64
77
65
78
/// Creates a Uint512(0)
@@ -622,7 +635,26 @@ mod tests {
622
635
623
636
#[ test]
624
637
fn uint512_new_works ( ) {
625
- let num = Uint512 :: new ( [ 1 ; 64 ] ) ;
638
+ let num = Uint512 :: new ( 1 ) ;
639
+ assert_eq ! (
640
+ num. to_be_bytes( ) ,
641
+ [
642
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
643
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
644
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1
645
+ ]
646
+ ) ;
647
+
648
+ for v in [ 0 , 1 , 18 , 875786576 , u128:: MAX ] {
649
+ // From is implemented by bnum, so we test two independent implementations against each other
650
+ let uut = Uint512 :: new ( v) ;
651
+ assert_eq ! ( uut, Uint512 :: from( v) ) ;
652
+ }
653
+ }
654
+
655
+ #[ test]
656
+ fn uint512_from_be_bytes_works ( ) {
657
+ let num = Uint512 :: from_be_bytes ( [ 1 ; 64 ] ) ;
626
658
let a: [ u8 ; 64 ] = num. to_be_bytes ( ) ;
627
659
assert_eq ! ( a, [ 1 ; 64 ] ) ;
628
660
@@ -632,14 +664,14 @@ mod tests {
632
664
0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 ,
633
665
0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 1u8 , 2u8 , 3u8 ,
634
666
] ;
635
- let num = Uint512 :: new ( be_bytes) ;
667
+ let num = Uint512 :: from_be_bytes ( be_bytes) ;
636
668
let resulting_bytes: [ u8 ; 64 ] = num. to_be_bytes ( ) ;
637
669
assert_eq ! ( be_bytes, resulting_bytes) ;
638
670
}
639
671
640
672
#[ test]
641
673
fn uint512_not_works ( ) {
642
- let num = Uint512 :: new ( [ 1 ; 64 ] ) ;
674
+ let num = Uint512 :: from_be_bytes ( [ 1 ; 64 ] ) ;
643
675
let a = ( !num) . to_be_bytes ( ) ;
644
676
assert_eq ! ( a, [ 254 ; 64 ] ) ;
645
677
@@ -689,12 +721,10 @@ mod tests {
689
721
] ;
690
722
691
723
// These should all be the same.
692
- let num1 = Uint512 :: new ( be_bytes) ;
693
- let num2 = Uint512 :: from_be_bytes ( be_bytes) ;
694
- let num3 = Uint512 :: from_le_bytes ( le_bytes) ;
695
- assert_eq ! ( num1, Uint512 :: from( 65536u32 + 512 + 3 ) ) ;
696
- assert_eq ! ( num1, num2) ;
697
- assert_eq ! ( num1, num3) ;
724
+ let a = Uint512 :: from_be_bytes ( be_bytes) ;
725
+ let b = Uint512 :: from_le_bytes ( le_bytes) ;
726
+ assert_eq ! ( a, Uint512 :: from( 65536u32 + 512 + 3 ) ) ;
727
+ assert_eq ! ( a, b) ;
698
728
}
699
729
700
730
#[ test]
@@ -1140,14 +1170,14 @@ mod tests {
1140
1170
1141
1171
#[ test]
1142
1172
fn uint512_shr_works ( ) {
1143
- let original = Uint512 :: new ( [
1173
+ let original = Uint512 :: from_be_bytes ( [
1144
1174
0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 ,
1145
1175
0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 ,
1146
1176
0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 ,
1147
1177
0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 2u8 , 0u8 , 4u8 , 2u8 ,
1148
1178
] ) ;
1149
1179
1150
- let shifted = Uint512 :: new ( [
1180
+ let shifted = Uint512 :: from_be_bytes ( [
1151
1181
0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 ,
1152
1182
0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 ,
1153
1183
0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 ,
@@ -1165,14 +1195,14 @@ mod tests {
1165
1195
1166
1196
#[ test]
1167
1197
fn uint512_shl_works ( ) {
1168
- let original = Uint512 :: new ( [
1198
+ let original = Uint512 :: from_be_bytes ( [
1169
1199
64u8 , 128u8 , 1u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 ,
1170
1200
0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 ,
1171
1201
0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 ,
1172
1202
0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 ,
1173
1203
] ) ;
1174
1204
1175
- let shifted = Uint512 :: new ( [
1205
+ let shifted = Uint512 :: from_be_bytes ( [
1176
1206
2u8 , 0u8 , 4u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 ,
1177
1207
0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 ,
1178
1208
0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 , 0u8 ,
0 commit comments