oracle.gno
4.19 Kb · 129 lines
1package pool
2
3// ObservationState manages the oracle's historical data
4type ObservationState struct {
5 observations map[uint16]*Observation // circular buffer of observations
6 index uint16 // the most-recently updated index of the observations array
7 cardinality uint16 // the current maximum number of observations that are being stored
8 cardinalityNext uint16 // the next maximum number of observations to store, triggered in observations.write
9}
10
11// ObservationState Getters methods
12func (os *ObservationState) Index() uint16 { return os.index }
13func (os *ObservationState) Cardinality() uint16 { return os.cardinality }
14func (os *ObservationState) CardinalityNext() uint16 { return os.cardinalityNext }
15func (os *ObservationState) Observations() map[uint16]*Observation { return os.observations }
16
17// ObservationState Setters methods
18func (os *ObservationState) SetIndex(index uint16) {
19 os.index = index
20}
21
22func (os *ObservationState) SetCardinality(cardinality uint16) {
23 os.cardinality = cardinality
24}
25
26func (os *ObservationState) SetCardinalityNext(cardinalityNext uint16) {
27 os.cardinalityNext = cardinalityNext
28}
29
30func (os *ObservationState) SetObservation(index uint16, observation *Observation) {
31 os.observations[index] = observation
32}
33
34func (os *ObservationState) SetObservations(observations map[uint16]*Observation) {
35 os.observations = observations
36}
37
38type Observation struct {
39 blockTimestamp int64 // timestamp of the observation
40 tickCumulative int64 // cumulative tick up to this timestamp
41 liquidityCumulative string // cumulative liquidity up to this timestamp
42 secondsPerLiquidityCumulativeX128 string // cumulative seconds per liquidity
43 initialized bool // whether this observation has been initialized
44}
45
46// Observation Getters methods
47func (o *Observation) BlockTimestamp() int64 { return o.blockTimestamp }
48func (o *Observation) TickCumulative() int64 { return o.tickCumulative }
49func (o *Observation) LiquidityCumulative() string { return o.liquidityCumulative }
50func (o *Observation) SecondsPerLiquidityCumulativeX128() string {
51 return o.secondsPerLiquidityCumulativeX128
52}
53func (o *Observation) Initialized() bool { return o.initialized }
54
55// Observation Setters methods
56func (o *Observation) SetBlockTimestamp(blockTimestamp int64) {
57 o.blockTimestamp = blockTimestamp
58}
59
60func (o *Observation) SetTickCumulative(tickCumulative int64) {
61 o.tickCumulative = tickCumulative
62}
63
64func (o *Observation) SetLiquidityCumulative(liquidityCumulative string) {
65 o.liquidityCumulative = liquidityCumulative
66}
67
68func (o *Observation) SetSecondsPerLiquidityCumulativeX128(secondsPerLiquidityCumulativeX128 string) {
69 o.secondsPerLiquidityCumulativeX128 = secondsPerLiquidityCumulativeX128
70}
71
72func (o *Observation) SetInitialized(initialized bool) {
73 o.initialized = initialized
74}
75
76func (o *Observation) Clone() *Observation {
77 return &Observation{
78 blockTimestamp: o.blockTimestamp,
79 tickCumulative: o.tickCumulative,
80 liquidityCumulative: o.liquidityCumulative,
81 secondsPerLiquidityCumulativeX128: o.secondsPerLiquidityCumulativeX128,
82 initialized: o.initialized,
83 }
84}
85
86func NewObservationState(currentTime int64) *ObservationState {
87 state := &ObservationState{
88 index: 0,
89 cardinality: 1,
90 cardinalityNext: 1,
91 observations: make(map[uint16]*Observation),
92 }
93
94 state.observations[0] = NewObservation(
95 currentTime,
96 0,
97 "0",
98 "0",
99 true,
100 )
101
102 return state
103}
104
105func NewObservation(
106 blockTimestamp int64,
107 tickCumulative int64,
108 liquidityCumulative string,
109 secondsPerLiquidityCumulativeX128 string,
110 initialized bool,
111) *Observation {
112 return &Observation{
113 blockTimestamp: blockTimestamp,
114 tickCumulative: tickCumulative,
115 liquidityCumulative: liquidityCumulative,
116 secondsPerLiquidityCumulativeX128: secondsPerLiquidityCumulativeX128,
117 initialized: initialized,
118 }
119}
120
121func NewDefaultObservation() *Observation {
122 return NewObservation(
123 0,
124 0,
125 "0",
126 "0",
127 false,
128 )
129}