Skip to content

Commit c8aa25c

Browse files
committed
Support new twap and twac
1 parent 40cae40 commit c8aa25c

File tree

2 files changed

+67
-47
lines changed

2 files changed

+67
-47
lines changed

CHANGELOG.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,17 @@
11
# Changelog
22

3+
## 2.1.0
4+
5+
### Added
6+
7+
Support new twap and twac
8+
9+
## 2.0.1
10+
11+
### Added
12+
13+
Types
14+
315
## 2.0.0
416

517
### Added

src/index.ts

Lines changed: 55 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -54,31 +54,34 @@ export interface PriceComponent {
5454
latest: Price
5555
}
5656

57+
export interface Ema {
58+
valueComponent: bigint
59+
value: number
60+
numerator: bigint
61+
denominator: bigint
62+
}
63+
5764
export interface PriceData extends Base, Price {
5865
priceType: number
5966
exponent: number
6067
numComponentPrices: number
61-
currentSlot: bigint
68+
lastSlot: bigint
6269
validSlot: bigint
63-
twapComponent: bigint
64-
twap: number
65-
avolComponent: bigint
66-
avol: number
67-
drv0Component: bigint
68-
drv0: number
70+
twap: Ema
71+
twac: Ema
6972
drv1Component: bigint
7073
drv1: number
7174
drv2Component: bigint
7275
drv2: number
73-
drv3Component: bigint
74-
drv3: number
75-
drv4Component: bigint
76-
drv4: number
77-
drv5Component: bigint
78-
drv5: number
7976
productAccountKey: PublicKey
8077
nextPriceAccountKey: PublicKey | null
81-
aggregatePriceUpdaterAccountKey: PublicKey
78+
previousSlot: bigint
79+
previousPriceComponent: bigint
80+
previousPrice: number
81+
previousConfidenceComponent: bigint
82+
previousConfidence: number
83+
drv3Component: bigint
84+
drv3: number
8285
priceComponents: PriceComponent[]
8386
}
8487

@@ -95,7 +98,6 @@ export const parseMappingData = (data: Buffer): MappingData => {
9598
const numProducts = data.readUInt32LE(16)
9699
// unused
97100
// const unused = accountInfo.data.readUInt32LE(20)
98-
// TODO: check and use this
99101
// next mapping account (if any)
100102
const nextMappingAccount = PKorNull(data.slice(24, 56))
101103
// read each symbol account
@@ -147,6 +149,17 @@ export const parseProductData = (data: Buffer): ProductData => {
147149
return { magic, version, type, size, priceAccountKey, product }
148150
}
149151

152+
const parseEma = (data: Buffer, exponent: number): Ema => {
153+
// current value of ema
154+
const valueComponent = readBigInt64LE(data, 0)
155+
const value = Number(valueComponent) * 10 ** exponent
156+
// numerator state for next update
157+
const numerator = readBigInt64LE(data, 8)
158+
// denominator state for next update
159+
const denominator = readBigInt64LE(data, 16)
160+
return { valueComponent, value, numerator, denominator }
161+
}
162+
150163
const parsePriceInfo = (data: Buffer, exponent: number): Price => {
151164
// aggregate price
152165
const priceComponent = readBigInt64LE(data, 0)
@@ -188,35 +201,34 @@ export const parsePriceData = (data: Buffer): PriceData => {
188201
const numComponentPrices = data.readUInt32LE(24)
189202
// unused
190203
// const unused = accountInfo.data.readUInt32LE(28)
191-
// currently accumulating price slot
192-
const currentSlot = readBigUInt64LE(data, 32)
204+
// slot of last valid (not unknown) aggregate price
205+
const lastSlot = readBigUInt64LE(data, 32)
193206
// valid on-chain slot of aggregate price
194207
const validSlot = readBigUInt64LE(data, 40)
195208
// time-weighted average price
196-
const twapComponent = readBigInt64LE(data, 48)
197-
const twap = Number(twapComponent) * 10 ** exponent
198-
// annualized price volatility
199-
const avolComponent = readBigUInt64LE(data, 56)
200-
const avol = Number(avolComponent) * 10 ** exponent
209+
const twap = parseEma(data.slice(48, 72), exponent)
210+
// time-weighted average confidence interval
211+
const twac = parseEma(data.slice(72, 96), exponent)
201212
// space for future derived values
202-
const drv0Component = readBigInt64LE(data, 64)
203-
const drv0 = Number(drv0Component) * 10 ** exponent
204-
const drv1Component = readBigInt64LE(data, 72)
213+
const drv1Component = readBigInt64LE(data, 96)
205214
const drv1 = Number(drv1Component) * 10 ** exponent
206-
const drv2Component = readBigInt64LE(data, 80)
215+
const drv2Component = readBigInt64LE(data, 104)
207216
const drv2 = Number(drv2Component) * 10 ** exponent
208-
const drv3Component = readBigInt64LE(data, 88)
209-
const drv3 = Number(drv3Component) * 10 ** exponent
210-
const drv4Component = readBigInt64LE(data, 96)
211-
const drv4 = Number(drv4Component) * 10 ** exponent
212-
const drv5Component = readBigInt64LE(data, 104)
213-
const drv5 = Number(drv5Component) * 10 ** exponent
214217
// product id / reference account
215218
const productAccountKey = new PublicKey(data.slice(112, 144))
216219
// next price account in list
217220
const nextPriceAccountKey = PKorNull(data.slice(144, 176))
218-
// aggregate price updater
219-
const aggregatePriceUpdaterAccountKey = new PublicKey(data.slice(176, 208))
221+
// valid slot of previous update
222+
const previousSlot = readBigUInt64LE(data, 176)
223+
// aggregate price of previous update
224+
const previousPriceComponent = readBigInt64LE(data, 184)
225+
const previousPrice = Number(previousPriceComponent) * 10 ** exponent
226+
// confidence interval of previous update
227+
const previousConfidenceComponent = readBigUInt64LE(data, 192)
228+
const previousConfidence = Number(previousConfidenceComponent) * 10 ** exponent
229+
// space for future derived values
230+
const drv3Component = readBigInt64LE(data, 200)
231+
const drv3 = Number(drv3Component) * 10 ** exponent
220232
const aggregatePriceInfo = parsePriceInfo(data.slice(208, 240), exponent)
221233
// price components - up to 32
222234
const priceComponents: PriceComponent[] = []
@@ -243,27 +255,23 @@ export const parsePriceData = (data: Buffer): PriceData => {
243255
priceType,
244256
exponent,
245257
numComponentPrices,
246-
currentSlot,
258+
lastSlot,
247259
validSlot,
248-
twapComponent,
249260
twap,
250-
avolComponent,
251-
avol,
252-
drv0Component,
253-
drv0,
261+
twac,
254262
drv1Component,
255263
drv1,
256264
drv2Component,
257265
drv2,
258-
drv3Component,
259-
drv3,
260-
drv4Component,
261-
drv4,
262-
drv5Component,
263-
drv5,
264266
productAccountKey,
265267
nextPriceAccountKey,
266-
aggregatePriceUpdaterAccountKey,
268+
previousSlot,
269+
previousPriceComponent,
270+
previousPrice,
271+
previousConfidenceComponent,
272+
previousConfidence,
273+
drv3Component,
274+
drv3,
267275
...aggregatePriceInfo,
268276
priceComponents,
269277
}

0 commit comments

Comments
 (0)