UNPKG

@witnet/ethers

Version:

Wit/Oracle Ethers Framework package for EVM-compatible projects

147 lines (138 loc) 5.39 kB
const { Witnet } = require("@witnet/sdk") const moment = require("moment") const prompt = require("inquirer").createPromptModule() const { utils, WitOracle } = require("../../../dist/src/lib") const helpers = require("../helpers.js") module.exports = async function (options = {}, args = []) { [args] = helpers.deleteExtraFlags(args) const witOracle = await WitOracle.fromJsonRpcUrl( `http://127.0.0.1:${options?.port || 8545}`, options?.signer, ) const { network, provider } = witOracle helpers.traceHeader(`${network.toUpperCase()}`, helpers.colors.lcyan) const framework = await helpers.prompter(utils.fetchWitOracleFramework(provider)) let target = args[0] let chosen = false if (!target) { const artifacts = Object.entries(framework).filter(([key]) => key.startsWith("WitPriceFeeds")) if (artifacts.length === 1) { target = artifacts[0][1].address } else { const selection = await prompt([{ choices: artifacts.map(([, artifact]) => artifact.address), message: "Price feeds contract:", name: "target", type: "rawlist", }]) target = selection.target chosen = true } } let pfs try { pfs = await witOracle.getWitPriceFeedsAt(target) } catch { pfs = await witOracle.getWitPriceFeedsLegacyAt(target) } const artifact = await pfs.getEvmImplClass() if (artifact.indexOf("Legacy") >= 0) { pfs = await witOracle.getWitPriceFeedsLegacyAt(target) } const version = await pfs.getEvmImplVersion() const maxWidth = Math.max(21, artifact.length + 2) console.info( `> ${ helpers.colors.lwhite(artifact) }:${ " ".repeat(maxWidth - artifact.length) }${ chosen ? "" : helpers.colors.lblue(target) + " " }${ helpers.colors.blue(`[ ${version} ]`) }` ) let priceFeeds = (await pfs.lookupPriceFeeds()).sort((a, b) => a.symbol.localeCompare(b.symbol)) if (!options["trace-back"]) { const registry = await witOracle.getWitOracleRadonRegistry() priceFeeds = await helpers.prompter( Promise.all( priceFeeds.map(async pf => { let providers = [] if (pf?.oracle && pf.oracle.class === "Witnet") { const bytecode = await registry.lookupRadonRequestBytecode(pf.oracle.sources) const request = Witnet.Radon.RadonRequest.fromBytecode(bytecode) try { const dryrun = JSON.parse(await request.execDryRun(true)) // const result = dryrun.tally.result providers = request.sources.map((source, index) => { let authority = source.authority.split(".").slice(-2)[0] authority = authority[0].toUpperCase() + authority.slice(1) return ( dryrun.retrieve[index].result?.RadonInteger ? helpers.colors.mmagenta(authority) : helpers.colors.red(authority) ) }).sort((a, b) => helpers.colorstrip(a).localeCompare(helpers.colorstrip(b))) } catch (err) { providers = request.sources.map(source => { const authority = source.authority.split(".").slice(-2)[0] return helpers.colors.magenta(authority[0].toUpperCase() + authority.slice(1)) }).sort((a, b) => helpers.colorstrip(a).localeCompare(helpers.colorstrip(b))) } } else if (pf?.oracle) { providers = [helpers.colors.mblue(`${pf.oracle.class}:${ pf.oracle.sources !== "0x0000000000000000000000000000000000000000000000000000000000000000" ? `${pf.oracle.target}:${pf.oracle.sources.slice(2, 10)}` : pf.oracle.target }`)] } else if (pf?.mapper) { providers = pf.mapper.deps.map(dep => helpers.colors.gray(dep.split(".").pop().toLowerCase())) } return { ...pf, providers, } }) ).catch(err => console.error(err)) ) } if (priceFeeds?.length > 0) { helpers.traceTable( priceFeeds.map(pf => [ pf.id4, pf.symbol, pf.lastUpdate.timestamp ? pf.lastUpdate.price.toFixed(6) : "", pf.lastUpdate.timestamp ? moment.unix(Number(pf.lastUpdate.timestamp)).fromNow() : "", ...(options["trace-back"] ? [ pf.lastUpdate.trail !== "0x0000000000000000000000000000000000000000000000000000000000000000" ? helpers.colors.mmagenta(pf.lastUpdate.trail.slice(2)) : "", ] : [ pf?.providers && pf.providers.join(" "), ]), ]), { colors: [ helpers.colors.lwhite, helpers.colors.mgreen, helpers.colors.mcyan, helpers.colors.yellow,, ], headlines: [ ":ID4", ":CAPTION", "LAST PRICE:", "FRESHNESS:", options["trace-back"] ? `DATA WITNESSING TRAIL ON ${helpers.colors.lwhite(`WITNET ${utils.isEvmNetworkMainnet(network) ? "MAINNET" : "TESTNET"}`)}` : ":DATA PROVIDERS", ], } ) } else { console.info("> No price feeds currently supported.") } }