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