solana-flux-aggregator/src/PriceFeeder.ts

62 lines
1.6 KiB
TypeScript
Raw Normal View History

2021-02-19 05:13:56 -08:00
import fs from "fs"
import { Wallet } from "solray"
2021-02-19 05:16:33 -08:00
import { AggregatorDeployFile } from "./Deployer"
2021-02-19 05:13:56 -08:00
import { loadJSONFile } from "./json"
2021-02-19 05:16:33 -08:00
import { coinbase } from "./feeds"
2021-02-19 05:13:56 -08:00
import { Submitter, SubmitterConfig } from "./Submitter"
import { log } from "./log"
2021-02-24 18:41:36 -08:00
import { conn } from "./context"
2021-02-19 05:13:56 -08:00
// Look at all the available aggregators and submit to those that the wallet can
// act as an oracle.
2021-02-19 05:13:56 -08:00
export class PriceFeeder {
constructor(
private deployInfo: AggregatorDeployFile,
2021-02-19 05:13:56 -08:00
private wallet: Wallet
) {}
2021-02-19 05:13:56 -08:00
async start() {
// find aggregators that this wallet can act as oracle
this.startAccessibleAggregators()
}
2021-02-24 18:41:36 -08:00
private async startAccessibleAggregators() {
let slot = await conn.getSlot()
conn.onSlotChange((slotInfo) => {
2021-02-24 18:41:36 -08:00
slot = slotInfo.slot
})
2021-02-19 05:13:56 -08:00
for (let [name, aggregatorInfo] of Object.entries(
this.deployInfo.aggregators
)) {
const oracleInfo = Object.values(aggregatorInfo.oracles).find(
(oracleInfo) => {
return oracleInfo.owner.equals(this.wallet.pubkey)
}
)
if (oracleInfo == null) {
2021-02-20 03:28:39 -08:00
log.debug("Is not an oracle", { name })
2021-02-19 05:13:56 -08:00
continue
}
const priceFeed = coinbase(name)
const submitter = new Submitter(
this.deployInfo.programID,
aggregatorInfo.pubkey,
oracleInfo.pubkey,
this.wallet,
priceFeed,
{
// TODO: errrrr... probably make configurable on chain. hardwire for
// now, don't submit value unless btc changes at least a dollar
2021-02-19 05:13:56 -08:00
minValueChangeForNewRound: 100,
2021-02-24 18:41:36 -08:00
},
() => slot
2021-02-19 05:13:56 -08:00
)
submitter.start()
}
}
}