1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
pub const MAGIC : u32 = 0xa1b2c3d4;
pub const VERSION_2 : u32 = 2;
pub const VERSION : u32 = VERSION_2;
pub const MAP_TABLE_SIZE : usize = 640;
pub const PROD_ACCT_SIZE : usize = 512;
pub const PROD_HDR_SIZE : usize = 48;
pub const PROD_ATTR_SIZE : usize = PROD_ACCT_SIZE - PROD_HDR_SIZE;
#[repr(C)]
pub enum AccountType
{
Unknown,
Mapping,
Product,
Price
}
#[repr(C)]
pub enum PriceStatus
{
Unknown,
Trading,
Halted,
Auction
}
#[repr(C)]
pub enum CorpAction
{
NoCorpAct
}
#[repr(C)]
pub enum PriceType
{
Unknown,
Price
}
#[repr(C)]
pub struct AccKey
{
pub val: [u8;32]
}
#[repr(C)]
pub struct Mapping
{
pub magic : u32,
pub ver : u32,
pub atype : u32,
pub size : u32,
pub num : u32,
pub unused : u32,
pub next : AccKey,
pub products : [AccKey;MAP_TABLE_SIZE]
}
#[repr(C)]
pub struct Product
{
pub magic : u32,
pub ver : u32,
pub atype : u32,
pub size : u32,
pub px_acc : AccKey,
pub attr : [u8;PROD_ATTR_SIZE]
}
#[repr(C)]
pub struct PriceInfo
{
pub price : i64,
pub conf : u64,
pub status : PriceStatus,
pub corp_act : CorpAction,
pub pub_slot : u64
}
#[repr(C)]
pub struct PriceComp
{
publisher : AccKey,
agg : PriceInfo,
latest : PriceInfo
}
#[repr(C)]
pub struct Price
{
pub magic : u32,
pub ver : u32,
pub atype : u32,
pub size : u32,
pub ptype : PriceType,
pub expo : i32,
pub num : u32,
pub unused : u32,
pub curr_slot : u64,
pub valid_slot : u64,
pub twap : i64,
pub avol : u64,
pub drv0 : i64,
pub drv1 : i64,
pub drv2 : i64,
pub drv3 : i64,
pub drv4 : i64,
pub drv5 : i64,
pub prod : AccKey,
pub next : AccKey,
pub agg_pub : AccKey,
pub agg : PriceInfo,
pub comp : [PriceComp;32]
}
struct AccKeyU64
{
pub val: [u64;4]
}
pub fn cast<T>( d: &[u8] ) -> &T {
let (_, pxa, _) = unsafe { d.align_to::<T>() };
&pxa[0]
}
impl AccKey
{
pub fn is_valid( &self ) -> bool {
let k8 = cast::<AccKeyU64>( &self.val );
return k8.val[0]!=0 || k8.val[1]!=0 || k8.val[2]!=0 || k8.val[3]!=0;
}
}