1
1
//! State transition types
2
2
3
- use crate :: error:: SwapError ;
4
3
use arrayref:: { array_mut_ref, array_ref, array_refs, mut_array_refs} ;
5
- use solana_sdk:: { program_error:: ProgramError , pubkey:: Pubkey } ;
4
+ use solana_sdk:: {
5
+ program_error:: ProgramError ,
6
+ program_pack:: { IsInitialized , Pack , Sealed } ,
7
+ pubkey:: Pubkey ,
8
+ } ;
6
9
7
10
/// Program states.
8
11
#[ repr( C ) ]
@@ -30,26 +33,19 @@ pub struct SwapInfo {
30
33
pub fee_denominator : u64 ,
31
34
}
32
35
33
- impl SwapInfo {
34
- /// Helper function to get the more efficient packed size of the struct
35
- const fn get_packed_len ( ) -> usize {
36
- 114
36
+ impl Sealed for SwapInfo { }
37
+ impl IsInitialized for SwapInfo {
38
+ fn is_initialized ( & self ) -> bool {
39
+ self . is_initialized
37
40
}
41
+ }
38
42
39
- /// Unpacks a byte buffer into a [SwapInfo](struct.SwapInfo.html) and checks
40
- /// that it is initialized.
41
- pub fn unpack ( input : & [ u8 ] ) -> Result < Self , ProgramError > {
42
- let value = Self :: unpack_unchecked ( input) ?;
43
- if value. is_initialized {
44
- Ok ( value)
45
- } else {
46
- Err ( SwapError :: InvalidSwapInfo . into ( ) )
47
- }
48
- }
43
+ impl Pack for SwapInfo {
44
+ const LEN : usize = 114 ;
49
45
50
46
/// Unpacks a byte buffer into a [SwapInfo](struct.SwapInfo.html).
51
- pub fn unpack_unchecked ( input : & [ u8 ] ) -> Result < Self , ProgramError > {
52
- let input = array_ref ! [ input, 0 , SwapInfo :: get_packed_len ( ) ] ;
47
+ fn unpack_from_slice ( input : & [ u8 ] ) -> Result < Self , ProgramError > {
48
+ let input = array_ref ! [ input, 0 , 114 ] ;
53
49
#[ allow( clippy:: ptr_offset_with_cast) ]
54
50
let ( is_initialized, nonce, token_a, token_b, pool_mint, fee_numerator, fee_denominator) =
55
51
array_refs ! [ input, 1 , 1 , 32 , 32 , 32 , 8 , 8 ] ;
@@ -68,9 +64,8 @@ impl SwapInfo {
68
64
} )
69
65
}
70
66
71
- /// Packs [SwapInfo](struct.SwapInfo.html) into a byte buffer.
72
- pub fn pack ( & self , output : & mut [ u8 ] ) {
73
- let output = array_mut_ref ! [ output, 0 , SwapInfo :: get_packed_len( ) ] ;
67
+ fn pack_into_slice ( & self , output : & mut [ u8 ] ) {
68
+ let output = array_mut_ref ! [ output, 0 , 114 ] ;
74
69
let ( is_initialized, nonce, token_a, token_b, pool_mint, fee_numerator, fee_denominator) =
75
70
mut_array_refs ! [ output, 1 , 1 , 32 , 32 , 32 , 8 , 8 ] ;
76
71
is_initialized[ 0 ] = self . is_initialized as u8 ;
@@ -109,8 +104,8 @@ mod tests {
109
104
fee_denominator,
110
105
} ;
111
106
112
- let mut packed = [ 0u8 ; SwapInfo :: get_packed_len ( ) ] ;
113
- swap_info . pack ( & mut packed) ;
107
+ let mut packed = [ 0u8 ; SwapInfo :: LEN ] ;
108
+ SwapInfo :: pack ( swap_info , & mut packed) . unwrap ( ) ;
114
109
let unpacked = SwapInfo :: unpack ( & packed) . unwrap ( ) ;
115
110
assert_eq ! ( swap_info, unpacked) ;
116
111
@@ -127,11 +122,11 @@ mod tests {
127
122
let unpacked = SwapInfo :: unpack ( & packed) . unwrap ( ) ;
128
123
assert_eq ! ( swap_info, unpacked) ;
129
124
130
- let packed = [ 0u8 ; SwapInfo :: get_packed_len ( ) ] ;
125
+ let packed = [ 0u8 ; SwapInfo :: LEN ] ;
131
126
let swap_info: SwapInfo = Default :: default ( ) ;
132
127
let unpack_unchecked = SwapInfo :: unpack_unchecked ( & packed) . unwrap ( ) ;
133
128
assert_eq ! ( unpack_unchecked, swap_info) ;
134
129
let err = SwapInfo :: unpack ( & packed) . unwrap_err ( ) ;
135
- assert_eq ! ( err, SwapError :: InvalidSwapInfo . into ( ) ) ;
130
+ assert_eq ! ( err, ProgramError :: UninitializedAccount ) ;
136
131
}
137
132
}
0 commit comments