Search Apps Documentation Source Content File Folder Download Copy Actions Download

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}