wormhole/staging/algorand/backend/fetcher/WormholePythPriceFetcher.ts

153 lines
4.6 KiB
TypeScript
Raw Normal View History

Pricecaster V2-alpha (#716) * Removed unnecessary file. Change-Id: Ic85cb42fef37028bc99d266148fae35107d2cf5f * Update sample pyth VAA information on README Change-Id: I2a4d3b23bfbc525d25f3f0360605aece0c104f4b * Test and lib fixes. Change-Id: I4af5e0313ba04b322f428a15a19bc7b30c6ae027 * Check owner balance + Feed ALGOs to stateless account address. Change-Id: Ibf57c66b24153b917f5d33febff97a002c163b59 * Working VAA verification test. Change-Id: Ib44e96ce8979161cdf703b1c4c92742cdc3e9cae * Lot of new tests and a little refactoring. Change-Id: Ic1da9be0a91fc3ace136c80cc5b2329cb3bf2e77 * Removed parts of old Pricekeeper logic Change-Id: Id77f4366d30dac2b89d039cea9b115a46a189e2d * Proper fetching, parsing and unpacking of Pyth-Wormhole data Change-Id: Id3b5002f072873d8161fa619f387171483a3e66c * Pricekeeper V2 PyTEAL contract. Change-Id: Idc1771e1ade371f51befdfd36ab6add55b3081fc * Streamlined and refac support library. Removed old code. Change-Id: I1f9633700527b1e0ca5ea9a38d24d3960e3e2341 * Changes to successfully publish price in target contract. Change-Id: Ie346648cec5b7b0b70786c2a99373df9bf71633d * pclib: Concurrent internal group TXs supported. Change-Id: I78e16d0dbf71c86fbb6be61e956aa370a4c48130 * Fetching and publishing from Wormhole/Spy. Removed most of old Pricekeeper V1 functionality. Simplified code. Change-Id: I197436c52460c04143501a60e3db9609159e9f25 * README + Deployment tool updated Change-Id: Iaf1f76ce69ea303f734c2a79f529f60ebf55a4ca * Modifications to use compiled stateless program. Change-Id: Ibc294412728052c1e29c7df929b3d9e481d714be * Removed old settings file. Change-Id: I1b8ca64426983b0a56f55f99a69304aaca702fee * Implements Randlabs Logger (C3PROT-92) Change-Id: Ia527169dc56bb2622fcde2fcfad53ed2efb5f399 * STEPS updated to 8. Change-Id: I9b092bb321231cde003e12b5a68cf90404f670f8 * Fixed handling double-hashing Change-Id: I5695e2783d439a85a61af44cab03ba99898cb16b * Added option to dump failed TX and diagnostic information in README Change-Id: If3d7b068d8d408851bcaae443ff412dc9cc30c69 * Fixed chainId handling. Change-Id: Id798a2e7afc0d646a179e3bd682204ba738fa53a * Successfully push prices to priceKeeper V2. Change-Id: Ib04da78b819e17579677e0187c9f5bd6bb1e2feb * Fixed price output log Change-Id: I99df39a05c667b5eb1af6cda988326cd768f89ee * Update WIP Tests. Change-Id: I4c2f94306dcaab578c30e487ceb6c140ea902ac3 * Support for VAAs with minimal quorum (> 2/3+1 signers ) Change-Id: I65dc52f6ef531cd24f7d080108451c5302e08524 * Remove old files. Change-Id: I9fd2127d9374617f53cb1cc6f721a2a655b79385 * Removed unnecessary entries in gitignore file Change-Id: I498ee2e192eb87d090767d8a12fd59ac679c8579 Co-authored-by: Josh Siegel <jsiegel@jumptrading.com> Co-authored-by: jumpsiegel <83408952+jumpsiegel@users.noreply.github.com>
2022-01-21 06:37:49 -08:00
/* eslint-disable camelcase */
2021-11-12 11:34:25 -08:00
/**
* Pricecaster Service.
*
* Fetcher backend component.
*
* Copyright 2022 Wormhole Project Contributors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
2021-11-12 11:34:25 -08:00
*/
2021-11-02 07:49:06 -07:00
Pricecaster V2-alpha (#716) * Removed unnecessary file. Change-Id: Ic85cb42fef37028bc99d266148fae35107d2cf5f * Update sample pyth VAA information on README Change-Id: I2a4d3b23bfbc525d25f3f0360605aece0c104f4b * Test and lib fixes. Change-Id: I4af5e0313ba04b322f428a15a19bc7b30c6ae027 * Check owner balance + Feed ALGOs to stateless account address. Change-Id: Ibf57c66b24153b917f5d33febff97a002c163b59 * Working VAA verification test. Change-Id: Ib44e96ce8979161cdf703b1c4c92742cdc3e9cae * Lot of new tests and a little refactoring. Change-Id: Ic1da9be0a91fc3ace136c80cc5b2329cb3bf2e77 * Removed parts of old Pricekeeper logic Change-Id: Id77f4366d30dac2b89d039cea9b115a46a189e2d * Proper fetching, parsing and unpacking of Pyth-Wormhole data Change-Id: Id3b5002f072873d8161fa619f387171483a3e66c * Pricekeeper V2 PyTEAL contract. Change-Id: Idc1771e1ade371f51befdfd36ab6add55b3081fc * Streamlined and refac support library. Removed old code. Change-Id: I1f9633700527b1e0ca5ea9a38d24d3960e3e2341 * Changes to successfully publish price in target contract. Change-Id: Ie346648cec5b7b0b70786c2a99373df9bf71633d * pclib: Concurrent internal group TXs supported. Change-Id: I78e16d0dbf71c86fbb6be61e956aa370a4c48130 * Fetching and publishing from Wormhole/Spy. Removed most of old Pricekeeper V1 functionality. Simplified code. Change-Id: I197436c52460c04143501a60e3db9609159e9f25 * README + Deployment tool updated Change-Id: Iaf1f76ce69ea303f734c2a79f529f60ebf55a4ca * Modifications to use compiled stateless program. Change-Id: Ibc294412728052c1e29c7df929b3d9e481d714be * Removed old settings file. Change-Id: I1b8ca64426983b0a56f55f99a69304aaca702fee * Implements Randlabs Logger (C3PROT-92) Change-Id: Ia527169dc56bb2622fcde2fcfad53ed2efb5f399 * STEPS updated to 8. Change-Id: I9b092bb321231cde003e12b5a68cf90404f670f8 * Fixed handling double-hashing Change-Id: I5695e2783d439a85a61af44cab03ba99898cb16b * Added option to dump failed TX and diagnostic information in README Change-Id: If3d7b068d8d408851bcaae443ff412dc9cc30c69 * Fixed chainId handling. Change-Id: Id798a2e7afc0d646a179e3bd682204ba738fa53a * Successfully push prices to priceKeeper V2. Change-Id: Ib04da78b819e17579677e0187c9f5bd6bb1e2feb * Fixed price output log Change-Id: I99df39a05c667b5eb1af6cda988326cd768f89ee * Update WIP Tests. Change-Id: I4c2f94306dcaab578c30e487ceb6c140ea902ac3 * Support for VAAs with minimal quorum (> 2/3+1 signers ) Change-Id: I65dc52f6ef531cd24f7d080108451c5302e08524 * Remove old files. Change-Id: I9fd2127d9374617f53cb1cc6f721a2a655b79385 * Removed unnecessary entries in gitignore file Change-Id: I498ee2e192eb87d090767d8a12fd59ac679c8579 Co-authored-by: Josh Siegel <jsiegel@jumptrading.com> Co-authored-by: jumpsiegel <83408952+jumpsiegel@users.noreply.github.com>
2022-01-21 06:37:49 -08:00
import {
importCoreWasm,
setDefaultWasm
} from '@certusone/wormhole-sdk/lib/cjs/solana/wasm'
import {
createSpyRPCServiceClient, subscribeSignedVAA
} from '@certusone/wormhole-spydk'
import { SpyRPCServiceClient } from '@certusone/wormhole-spydk/lib/cjs/proto/spy/v1/spy'
import { PythData, Symbol, VAA } from 'backend/common/basetypes'
2021-11-12 11:34:25 -08:00
import { IStrategy } from '../strategy/strategy'
Pricecaster V2-alpha (#716) * Removed unnecessary file. Change-Id: Ic85cb42fef37028bc99d266148fae35107d2cf5f * Update sample pyth VAA information on README Change-Id: I2a4d3b23bfbc525d25f3f0360605aece0c104f4b * Test and lib fixes. Change-Id: I4af5e0313ba04b322f428a15a19bc7b30c6ae027 * Check owner balance + Feed ALGOs to stateless account address. Change-Id: Ibf57c66b24153b917f5d33febff97a002c163b59 * Working VAA verification test. Change-Id: Ib44e96ce8979161cdf703b1c4c92742cdc3e9cae * Lot of new tests and a little refactoring. Change-Id: Ic1da9be0a91fc3ace136c80cc5b2329cb3bf2e77 * Removed parts of old Pricekeeper logic Change-Id: Id77f4366d30dac2b89d039cea9b115a46a189e2d * Proper fetching, parsing and unpacking of Pyth-Wormhole data Change-Id: Id3b5002f072873d8161fa619f387171483a3e66c * Pricekeeper V2 PyTEAL contract. Change-Id: Idc1771e1ade371f51befdfd36ab6add55b3081fc * Streamlined and refac support library. Removed old code. Change-Id: I1f9633700527b1e0ca5ea9a38d24d3960e3e2341 * Changes to successfully publish price in target contract. Change-Id: Ie346648cec5b7b0b70786c2a99373df9bf71633d * pclib: Concurrent internal group TXs supported. Change-Id: I78e16d0dbf71c86fbb6be61e956aa370a4c48130 * Fetching and publishing from Wormhole/Spy. Removed most of old Pricekeeper V1 functionality. Simplified code. Change-Id: I197436c52460c04143501a60e3db9609159e9f25 * README + Deployment tool updated Change-Id: Iaf1f76ce69ea303f734c2a79f529f60ebf55a4ca * Modifications to use compiled stateless program. Change-Id: Ibc294412728052c1e29c7df929b3d9e481d714be * Removed old settings file. Change-Id: I1b8ca64426983b0a56f55f99a69304aaca702fee * Implements Randlabs Logger (C3PROT-92) Change-Id: Ia527169dc56bb2622fcde2fcfad53ed2efb5f399 * STEPS updated to 8. Change-Id: I9b092bb321231cde003e12b5a68cf90404f670f8 * Fixed handling double-hashing Change-Id: I5695e2783d439a85a61af44cab03ba99898cb16b * Added option to dump failed TX and diagnostic information in README Change-Id: If3d7b068d8d408851bcaae443ff412dc9cc30c69 * Fixed chainId handling. Change-Id: Id798a2e7afc0d646a179e3bd682204ba738fa53a * Successfully push prices to priceKeeper V2. Change-Id: Ib04da78b819e17579677e0187c9f5bd6bb1e2feb * Fixed price output log Change-Id: I99df39a05c667b5eb1af6cda988326cd768f89ee * Update WIP Tests. Change-Id: I4c2f94306dcaab578c30e487ceb6c140ea902ac3 * Support for VAAs with minimal quorum (> 2/3+1 signers ) Change-Id: I65dc52f6ef531cd24f7d080108451c5302e08524 * Remove old files. Change-Id: I9fd2127d9374617f53cb1cc6f721a2a655b79385 * Removed unnecessary entries in gitignore file Change-Id: I498ee2e192eb87d090767d8a12fd59ac679c8579 Co-authored-by: Josh Siegel <jsiegel@jumptrading.com> Co-authored-by: jumpsiegel <83408952+jumpsiegel@users.noreply.github.com>
2022-01-21 06:37:49 -08:00
import { IPriceFetcher } from './IPriceFetcher'
import * as Logger from '@randlabs/js-logger'
2021-11-02 07:49:06 -07:00
2021-11-12 11:34:25 -08:00
export class WormholePythPriceFetcher implements IPriceFetcher {
Pricecaster V2-alpha (#716) * Removed unnecessary file. Change-Id: Ic85cb42fef37028bc99d266148fae35107d2cf5f * Update sample pyth VAA information on README Change-Id: I2a4d3b23bfbc525d25f3f0360605aece0c104f4b * Test and lib fixes. Change-Id: I4af5e0313ba04b322f428a15a19bc7b30c6ae027 * Check owner balance + Feed ALGOs to stateless account address. Change-Id: Ibf57c66b24153b917f5d33febff97a002c163b59 * Working VAA verification test. Change-Id: Ib44e96ce8979161cdf703b1c4c92742cdc3e9cae * Lot of new tests and a little refactoring. Change-Id: Ic1da9be0a91fc3ace136c80cc5b2329cb3bf2e77 * Removed parts of old Pricekeeper logic Change-Id: Id77f4366d30dac2b89d039cea9b115a46a189e2d * Proper fetching, parsing and unpacking of Pyth-Wormhole data Change-Id: Id3b5002f072873d8161fa619f387171483a3e66c * Pricekeeper V2 PyTEAL contract. Change-Id: Idc1771e1ade371f51befdfd36ab6add55b3081fc * Streamlined and refac support library. Removed old code. Change-Id: I1f9633700527b1e0ca5ea9a38d24d3960e3e2341 * Changes to successfully publish price in target contract. Change-Id: Ie346648cec5b7b0b70786c2a99373df9bf71633d * pclib: Concurrent internal group TXs supported. Change-Id: I78e16d0dbf71c86fbb6be61e956aa370a4c48130 * Fetching and publishing from Wormhole/Spy. Removed most of old Pricekeeper V1 functionality. Simplified code. Change-Id: I197436c52460c04143501a60e3db9609159e9f25 * README + Deployment tool updated Change-Id: Iaf1f76ce69ea303f734c2a79f529f60ebf55a4ca * Modifications to use compiled stateless program. Change-Id: Ibc294412728052c1e29c7df929b3d9e481d714be * Removed old settings file. Change-Id: I1b8ca64426983b0a56f55f99a69304aaca702fee * Implements Randlabs Logger (C3PROT-92) Change-Id: Ia527169dc56bb2622fcde2fcfad53ed2efb5f399 * STEPS updated to 8. Change-Id: I9b092bb321231cde003e12b5a68cf90404f670f8 * Fixed handling double-hashing Change-Id: I5695e2783d439a85a61af44cab03ba99898cb16b * Added option to dump failed TX and diagnostic information in README Change-Id: If3d7b068d8d408851bcaae443ff412dc9cc30c69 * Fixed chainId handling. Change-Id: Id798a2e7afc0d646a179e3bd682204ba738fa53a * Successfully push prices to priceKeeper V2. Change-Id: Ib04da78b819e17579677e0187c9f5bd6bb1e2feb * Fixed price output log Change-Id: I99df39a05c667b5eb1af6cda988326cd768f89ee * Update WIP Tests. Change-Id: I4c2f94306dcaab578c30e487ceb6c140ea902ac3 * Support for VAAs with minimal quorum (> 2/3+1 signers ) Change-Id: I65dc52f6ef531cd24f7d080108451c5302e08524 * Remove old files. Change-Id: I9fd2127d9374617f53cb1cc6f721a2a655b79385 * Removed unnecessary entries in gitignore file Change-Id: I498ee2e192eb87d090767d8a12fd59ac679c8579 Co-authored-by: Josh Siegel <jsiegel@jumptrading.com> Co-authored-by: jumpsiegel <83408952+jumpsiegel@users.noreply.github.com>
2022-01-21 06:37:49 -08:00
private symbolMap: Map<string, {
name: string,
publishIntervalSecs: number,
pythData: PythData | undefined
}>
private client: SpyRPCServiceClient
private pythEmitterAddress: { s: string, data: number[] }
private pythChainId: number
private strategy: IStrategy
private stream: any
private _hasData: boolean
private coreWasm: any
constructor (spyRpcServiceHost: string, pythChainId: number, pythEmitterAddress: string, symbols: Symbol[], strategy: IStrategy) {
setDefaultWasm('node')
this._hasData = false
this.client = createSpyRPCServiceClient(spyRpcServiceHost)
this.pythChainId = pythChainId
this.pythEmitterAddress = {
data: Buffer.from(pythEmitterAddress, 'hex').toJSON().data,
s: pythEmitterAddress
}
this.strategy = strategy
this.symbolMap = new Map()
symbols.forEach((sym) => {
this.symbolMap.set(sym.productId + sym.priceId, {
name: sym.name,
publishIntervalSecs: sym.publishIntervalSecs,
pythData: undefined
})
})
}
async start () {
this.coreWasm = await importCoreWasm()
// eslint-disable-next-line camelcase
this.stream = await subscribeSignedVAA(this.client,
{
filters:
[{
emitterFilter: {
chainId: this.pythChainId,
emitterAddress: this.pythEmitterAddress.s
}
}]
})
this.stream.on('data', (data: { vaaBytes: Buffer }) => {
try {
this._hasData = true
this.onPythData(data.vaaBytes)
} catch (e) {
Logger.error(`Failed to parse VAA data. \nReason: ${e}\nData: ${data}`)
}
})
this.stream.on('error', (e: Error) => {
Logger.error('Stream error: ' + e)
})
}
stop (): void {
this._hasData = false
}
setStrategy (s: IStrategy) {
this.strategy = s
}
hasData (): boolean {
// Return when any price is ready
return this._hasData
}
queryData (id: string): any | undefined {
const v = this.symbolMap.get(id)
if (v === undefined) {
Logger.error(`Unsupported symbol with identifier ${id}`)
} else {
return v.pythData
}
}
private async onPythData (vaaBytes: Buffer) {
// console.log(vaaBytes.toString('hex'))
const v: VAA = this.coreWasm.parse_vaa(new Uint8Array(vaaBytes))
const payload = Buffer.from(v.payload)
const productId = payload.slice(7, 7 + 32)
const priceId = payload.slice(7 + 32, 7 + 32 + 32)
// console.log(productId.toString('hex'), priceId.toString('hex'))
const k = productId.toString('hex') + priceId.toString('hex')
const sym = this.symbolMap.get(k)
if (sym !== undefined) {
sym.pythData = {
symbol: sym.name,
vaaBody: vaaBytes.slice(6 + v.signatures.length * 66),
signatures: vaaBytes.slice(6, 6 + v.signatures.length * 66),
price_type: payload.readInt8(71),
price: payload.readBigUInt64BE(72),
exponent: payload.readInt32BE(80),
confidence: payload.readBigUInt64BE(132),
status: payload.readInt8(140),
corporate_act: payload.readInt8(141),
timestamp: payload.readBigUInt64BE(142)
}
}
// if (pythPayload.status === 0) {
// console.log('WARNING: Symbol trading status currently halted (0). Publication will be skipped.')
// } else
// eslint-disable-next-line no-lone-blocks
}
2021-11-12 11:34:25 -08:00
}