openoracle-sdk-js
Version:
OpenOracle Node.js SDK - Intelligent Oracle Routing with Multiple LLM Providers
14 lines (12 loc) • 68 kB
JavaScript
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const Ae=require("axios"),Ie=require("dotenv"),P=require("winston");class y extends Error{code;severity;context;constructor(e,t="ORACLE_ERROR",r="error",s){super(e),this.name=this.constructor.name,this.code=t,this.severity=r,this.context=s,Error.captureStackTrace(this,this.constructor)}toJSON(){return{name:this.name,message:this.message,code:this.code,severity:this.severity,context:this.context,stack:this.stack}}}class U extends y{constructor(e,t){super(e,"ROUTING_ERROR","error",t)}}class f extends y{constructor(e,t){super(e,"VALIDATION_ERROR","error",t)}}class v extends y{constructor(e,t){super(e,"CONFIGURATION_ERROR","error",t)}}class R extends y{provider;constructor(e,t,r){super(e,"PROVIDER_ERROR","error",{...r,provider:t}),this.provider=t}}class W extends y{statusCode;response;constructor(e,t,r,s){super(e,"NETWORK_ERROR","error",{...s,statusCode:t,response:r}),this.statusCode=t,this.response=r}}class x extends y{constructor(e,t){super(e,"AUTHENTICATION_ERROR","error",t)}}class be extends y{retryAfter;constructor(e,t,r){super(e,"RATE_LIMIT_ERROR","warning",{...r,retryAfter:t}),this.retryAfter=t}}class H extends y{timeoutMs;constructor(e,t,r){super(e,"TIMEOUT_ERROR","error",{...r,timeoutMs:t}),this.timeoutMs=t}}class We extends y{expectedValue;actualValue;constructor(e,t,r,s){super(e,"DATA_INTEGRITY_ERROR","critical",{...s,expectedValue:t,actualValue:r}),this.expectedValue=t,this.actualValue=r}}class Ye extends y{operation;provider;constructor(e,t,r){const s=t?`Operation '${e}' is not supported by provider '${t}'`:`Operation '${e}' is not supported`;super(s,"UNSUPPORTED_OPERATION_ERROR","error",{...r,operation:e,provider:t}),this.operation=e,this.provider=t}}class Be extends y{constructor(e,t){super(e,"CACHE_ERROR","warning",t)}}class Ve extends y{providers;values;constructor(e,t,r,s){super(e,"CONSENSUS_ERROR","error",{...s,providers:t,values:r}),this.providers=t,this.values=r}}function Oe(i){return i instanceof y}function Qe(i,e){return i instanceof e}function ze(i){return Oe(i)?i:i instanceof Error?new y(i.message,"UNKNOWN_ERROR","error",{originalError:i.name,stack:i.stack}):new y(String(i),"UNKNOWN_ERROR","error",{originalError:i})}let Se=class{axios;config;requestCount=0;lastRequestTime=0;constructor(e,t){this.config=e,this.axios=Ae.create({baseURL:(t==null?void 0:t.baseURL)||"http://localhost:8000",timeout:(t==null?void 0:t.timeout)||e.network.timeouts.request,headers:{"Content-Type":"application/json","User-Agent":"openoracle-sdk-node/0.1.0",...t==null?void 0:t.headers}}),this.setupInterceptors()}setupInterceptors(){this.axios.interceptors.request.use(e=>(this.requestCount++,this.lastRequestTime=Date.now(),this.config.apiKeys.openai&&(e.headers=e.headers||{},e.headers.Authorization=`Bearer ${this.config.apiKeys.openai}`),e),e=>Promise.reject(this.normalizeError(e))),this.axios.interceptors.response.use(e=>e,e=>Promise.reject(this.normalizeError(e)))}normalizeError(e){var t,r,s,a,n,o,d,h,m,w,C,A,O,S,_,M;if(Ae.isAxiosError(e)){const D=(t=e.response)==null?void 0:t.status,E=((s=(r=e.response)==null?void 0:r.data)==null?void 0:s.message)||e.message;switch(D){case 401:return new x(E,{url:(a=e.config)==null?void 0:a.url,method:(n=e.config)==null?void 0:n.method});case 429:const k=(o=e.response)==null?void 0:o.headers["retry-after"];return new be(E,k?parseInt(k):void 0,{url:(d=e.config)==null?void 0:d.url,method:(h=e.config)==null?void 0:h.method});case 400:return new f(E,{url:(m=e.config)==null?void 0:m.url,method:(w=e.config)==null?void 0:w.method,data:(C=e.config)==null?void 0:C.data});default:return e.code==="ECONNABORTED"||e.code==="ETIMEDOUT"?new H(E,this.config.network.timeouts.request,{url:(A=e.config)==null?void 0:A.url,method:(O=e.config)==null?void 0:O.method}):new W(E,D,(S=e.response)==null?void 0:S.data,{url:(_=e.config)==null?void 0:_.url,method:(M=e.config)==null?void 0:M.method})}}return e}async get(e,t){return(await this.axios.get(e,t)).data}async post(e,t,r){return(await this.axios.post(e,t,r)).data}async put(e,t,r){return(await this.axios.put(e,t,r)).data}async patch(e,t,r){return(await this.axios.patch(e,t,r)).data}async delete(e,t){return(await this.axios.delete(e,t)).data}async request(e){return(await this.axios.request(e)).data}async healthCheck(){try{return await this.get("/health"),!0}catch{return!1}}getStats(){return{requestCount:this.requestCount,lastRequestTime:this.lastRequestTime}}updateConfig(e){this.axios.defaults.timeout=e.network.timeouts.request,e.apiKeys.openai&&(this.axios.defaults.headers.common.Authorization=`Bearer ${e.apiKeys.openai}`)}async withRetry(e,t=this.config.network.retries.maxAttempts){let r;for(let s=1;s<=t;s++)try{return await e()}catch(a){if(r=a,s===t)throw r;if(a instanceof x||a instanceof f)throw a;const n=Math.min(this.config.network.retries.backoffMs*Math.pow(2,s-1),this.config.network.retries.maxBackoffMs);await new Promise(o=>setTimeout(o,n))}throw r}async batch(e){return Promise.all(e.map(t=>t()))}createEventStream(e,t){const r=new EventSource(e);return t!=null&&t.onData&&(r.onmessage=s=>{var a;try{const n=JSON.parse(s.data);t.onData(n)}catch(n){(a=t.onError)==null||a.call(t,n)}}),t!=null&&t.onError&&(r.onerror=s=>{t.onError(new W("EventSource error",void 0,s))}),t!=null&&t.onClose&&r.addEventListener("close",t.onClose),r}createWebSocket(e,t){const r=new WebSocket(e,t);return r.onerror=s=>{console.error("WebSocket error:",s)},r}destroy(){}};var c=(i=>(i.CHAINLINK="chainlink",i.PYTH="pyth",i.UMA="uma",i.BAND="band",i.API3="api3",i.DIA="dia",i.TELLOR="tellor",i.SUPRA="supra",i.FLUX="flux",i.REDSTONE="redstone",i))(c||{}),u=(i=>(i.PRICE="price",i.SPORTS="sports",i.WEATHER="weather",i.ECONOMIC="economic",i.NFT="nft",i.SOCIAL="social",i.NEWS="news",i.CRYPTO="crypto",i.STOCKS="stocks",i.COMMODITIES="commodities",i.FOREX="forex",i.DEFI="defi",i.CUSTOM="custom",i))(u||{}),I=(i=>(i.REALTIME="realtime",i.SECOND="second",i.MINUTE="minute",i.HOUR="hour",i.DAILY="daily",i.WEEKLY="weekly",i.MONTHLY="monthly",i.ON_DEMAND="on_demand",i))(I||{}),_e=(i=>(i.AUTOMATED="automated",i.MANUAL="manual",i.VOTING="voting",i.CONSENSUS="consensus",i.OPTIMISTIC="optimistic",i.CHALLENGE="challenge",i))(_e||{}),g=(i=>(i.PRICE_FEEDS="price_feeds",i.VRF="vrf",i.AUTOMATION="automation",i.EXTERNAL_ADAPTERS="external_adapters",i.PROOF_OF_RESERVE="proof_of_reserve",i.CCIP="ccip",i.FUNCTIONS="functions",i.SPORTS_DATA="sports_data",i.WEATHER_DATA="weather_data",i.ECONOMIC_DATA="economic_data",i.NFT_DATA="nft_data",i))(g||{}),l=(i=>(i.VERY_LOW="very_low",i.LOW="low",i.MEDIUM="medium",i.HIGH="high",i.VERY_HIGH="very_high",i))(l||{}),Me=(i=>(i.INFO="info",i.WARNING="warning",i.ERROR="error",i.CRITICAL="critical",i))(Me||{}),T=(i=>(i.COST_OPTIMIZED="cost_optimized",i.SPEED_OPTIMIZED="speed_optimized",i.ACCURACY_OPTIMIZED="accuracy_optimized",i.BALANCED="balanced",i.REDUNDANT="redundant",i))(T||{}),De=(i=>(i.ONLINE="online",i.OFFLINE="offline",i.DEGRADED="degraded",i.MAINTENANCE="maintenance",i))(De||{}),Y=(i=>(i.NO_CACHE="no_cache",i.MEMORY_ONLY="memory_only",i.PERSISTENT="persistent",i.HYBRID="hybrid",i))(Y||{}),p=(i=>(i[i.ETHEREUM=1]="ETHEREUM",i[i.POLYGON=137]="POLYGON",i[i.BSC=56]="BSC",i[i.AVALANCHE=43114]="AVALANCHE",i[i.ARBITRUM=42161]="ARBITRUM",i[i.OPTIMISM=10]="OPTIMISM",i[i.FANTOM=250]="FANTOM",i[i.FLOW_EVM=545]="FLOW_EVM",i[i.FLOW_TESTNET=646]="FLOW_TESTNET",i))(p||{});const Ge=[1,137,56,43114,42161,10,545,646];function je(i){return i&&typeof i=="object"&&"value"in i&&"timestamp"in i&&"source"in i&&"confidence"in i}function Je(i){return i&&typeof i=="object"&&typeof i.query=="string"&&Object.values(u).includes(i.category)}function Ze(i){return i&&typeof i=="object"&&Object.values(c).includes(i.oracleProvider)&&Object.values(l).includes(i.confidence)&&Array.isArray(i.data)}function ke(i){const e=[],t=[];i.query?i.query.length<3&&e.push("Query must be at least 3 characters long"):e.push("Query is required"),i.category?Object.values(u).includes(i.category)||e.push("Invalid category"):e.push("Category is required"),i.maxProviders&&i.maxProviders<1&&e.push("Max providers must be at least 1"),i.consensusThreshold&&(i.consensusThreshold<0||i.consensusThreshold>1)&&e.push("Consensus threshold must be between 0 and 1"),i.timeoutMs&&i.timeoutMs<1e3&&t.push("Timeout less than 1 second may cause failures");const r=e.length===0?t.length===0?l.VERY_HIGH:l.HIGH:l.LOW;return{isValid:e.length===0,errors:e,warnings:t,confidence:r}}function Ne(i){const e=[],t=[];i.provider?Object.values(c).includes(i.provider)||e.push("Invalid provider"):e.push("Provider is required"),i.timeout&&i.timeout<1e3&&t.push("Timeout less than 1 second may cause failures"),i.retryAttempts&&i.retryAttempts<0&&e.push("Retry attempts must be non-negative"),i.rateLimit&&i.rateLimit<1&&e.push("Rate limit must be at least 1");const r=e.length===0?t.length===0?l.VERY_HIGH:l.HIGH:l.LOW;return{isValid:e.length===0,errors:e,warnings:t,confidence:r}}let Xe=class{config;client;providerMetrics=new Map;cache=new Map;constructor(e,t){this.config=e,this.client=t||new Se(e),this.initializeProviderMetrics()}initializeProviderMetrics(){Object.values(c).forEach(e=>{this.providerMetrics.set(e,{providerId:e,requestCount:0,successCount:0,errorCount:0,averageResponseTime:0,lastUsed:new Date(0),cost:0,reliability:1})})}async routeQuestion(e,t,r={}){const s={query:e,category:t,maxProviders:r.maxProviders||this.config.routing.maxProviders,consensusThreshold:r.consensusThreshold||this.config.routing.consensusThreshold,timeoutMs:r.timeoutMs||this.config.network.timeouts.request,cacheEnabled:r.enableCaching??this.config.cache.strategy!=="no_cache"},a=ke(s);if(!a.isValid)throw new f(`Invalid routing request: ${a.errors.join(", ")}`);if(s.cacheEnabled){const o=this.getCachedResponse(s);if(o)return o}const n=Date.now();try{const o=await this.selectProviders(s,r.strategy);if(o.length===0)throw new U("No suitable providers found for the query");const d=await this.executeQueries(s,o),h=this.aggregateResponses(d,s),m={oracleProvider:h.primaryProvider,confidence:h.confidence,data:h.data,reasoning:h.reasoning,alternativeProviders:o.filter(w=>w!==h.primaryProvider),executionTimeMs:Date.now()-n,cached:!1,metadata:{totalProviders:o.length,consensus:h.consensus,strategy:r.strategy||this.config.routing.strategy}};return s.cacheEnabled&&this.cacheResponse(s,m),m}catch(o){if(r.fallbackEnabled&&this.config.routing.fallbackProviders.length>0)return this.executeFallback(s,o);throw o}}async selectProviders(e,t){const r=this.getAvailableProviders(e);switch(t||this.config.routing.strategy){case T.COST_OPTIMIZED:return this.selectByCost(r,e.maxProviders);case T.SPEED_OPTIMIZED:return this.selectBySpeed(r,e.maxProviders);case T.ACCURACY_OPTIMIZED:return this.selectByAccuracy(r,e.maxProviders);case T.REDUNDANT:return this.selectForRedundancy(r,e.maxProviders);case T.BALANCED:default:return this.selectBalanced(r,e.maxProviders)}}getAvailableProviders(e){let t=Object.values(c);return e.requiredProviders&&e.requiredProviders.length>0&&(t=t.filter(r=>e.requiredProviders.includes(r))),e.excludedProviders&&e.excludedProviders.length>0&&(t=t.filter(r=>!e.excludedProviders.includes(r))),t.filter(r=>this.config.hasApiKey(r)||this.isPublicProvider(r))}isPublicProvider(e){return[c.PYTH].includes(e)}selectByCost(e,t){return e.sort((r,s)=>this.getProviderCost(r)-this.getProviderCost(s)).slice(0,t)}selectBySpeed(e,t){return e.sort((r,s)=>{const a=this.providerMetrics.get(r),n=this.providerMetrics.get(s);return a.averageResponseTime-n.averageResponseTime}).slice(0,t)}selectByAccuracy(e,t){return e.sort((r,s)=>{const a=this.providerMetrics.get(r).reliability;return this.providerMetrics.get(s).reliability-a}).slice(0,t)}selectForRedundancy(e,t){return[c.CHAINLINK,c.PYTH,c.UMA,c.BAND,c.API3].filter(s=>e.includes(s)).slice(0,t)}selectBalanced(e,t){return e.map(s=>{const a=this.providerMetrics.get(s),n=this.getProviderCost(s),o=this.config.routing.speedWeighting*(1/(a.averageResponseTime+1))+this.config.routing.accuracyWeighting*a.reliability+this.config.routing.costWeighting*(1/(n+1));return{provider:s,score:o}}).sort((s,a)=>a.score-s.score).slice(0,t).map(s=>s.provider)}getProviderCost(e){return{[c.CHAINLINK]:.01,[c.PYTH]:.005,[c.UMA]:.02,[c.BAND]:.015,[c.API3]:.01}[e]||.01}async executeQueries(e,t){const r=t.map(async s=>{const a=Date.now();try{const n=await this.queryProvider(s,e);return this.updateProviderMetrics(s,{success:!0,responseTime:Date.now()-a}),{provider:s,data:n}}catch(n){return this.updateProviderMetrics(s,{success:!1,responseTime:Date.now()-a}),{provider:s,data:[],error:n}}});return Promise.all(r)}async queryProvider(e,t){try{return(await this.client.post(`/api/oracle/${e}/query`,{query:t.query,category:t.category,metadata:t.metadata})).data||[]}catch(r){throw new R(`Provider ${e} query failed`,e,{originalError:r.message})}}aggregateResponses(e,t){const r=e.filter(o=>!o.error&&o.data.length>0);if(r.length===0)throw new U("All providers failed to return data");const s=r[0];let a=!0;r.length>1&&(a=this.checkConsensus(r,t.consensusThreshold));const n=this.calculateConfidence(r,a);return{primaryProvider:s.provider,confidence:n,data:s.data,reasoning:this.generateReasoning(r,a),consensus:a}}checkConsensus(e,t){if(e.length<2)return!0;const r=e.map(a=>{var n;return(n=a.data[0])==null?void 0:n.value}).filter(a=>a!==void 0);if(r.length<2)return!0;if(typeof r[0]=="number"){const a=r,n=a.reduce((h,m)=>h+m,0)/a.length,o=a.reduce((h,m)=>h+Math.pow(m-n,2),0)/a.length;return Math.sqrt(o)/Math.abs(n)<1-t}return new Set(r).size===1}calculateConfidence(e,t){if(e.length===0)return l.VERY_LOW;if(e.length===1){const r=this.providerMetrics.get(e[0].provider).reliability;return r>.9?l.HIGH:r>.7?l.MEDIUM:l.LOW}return t?e.length>=3?l.VERY_HIGH:l.HIGH:l.MEDIUM}generateReasoning(e,t){const r=e.map(s=>s.provider).join(", ");return e.length===1?`Single provider response from ${r}`:t?`Consensus achieved across ${e.length} providers: ${r}`:`Mixed results from ${e.length} providers: ${r}. Using primary provider result.`}async executeFallback(e,t){const r=this.config.routing.fallbackProviders;try{const s=await this.executeQueries(e,r),a=this.aggregateResponses(s,e);return{oracleProvider:a.primaryProvider,confidence:l.LOW,data:a.data,reasoning:`Fallback execution after primary failure: ${t.message}`,alternativeProviders:[],executionTimeMs:0,cached:!1,metadata:{fallback:!0,originalError:t.message}}}catch(s){throw new U("Both primary and fallback routing failed",{originalError:t.message,fallbackError:s.message})}}updateProviderMetrics(e,t){const r=this.providerMetrics.get(e);r.requestCount++,r.lastUsed=new Date,t.success?r.successCount++:r.errorCount++,r.averageResponseTime=(r.averageResponseTime*(r.requestCount-1)+t.responseTime)/r.requestCount,r.reliability=r.successCount/r.requestCount}getCachedResponse(e){const t=this.getCacheKey(e),r=this.cache.get(t);return r?Date.now()-r.timestamp>r.ttl?(this.cache.delete(t),null):{...r.data,cached:!0}:null}cacheResponse(e,t){const r=this.getCacheKey(e);if(this.cache.set(r,{data:t,timestamp:Date.now(),ttl:this.config.cache.ttlSeconds*1e3}),this.cache.size>this.config.cache.maxSize){const s=this.cache.keys().next().value;this.cache.delete(s)}}getCacheKey(e){return`${e.query}:${e.category}:${JSON.stringify(e.metadata||{})}`}getMetrics(){return new Map(this.providerMetrics)}clearCache(){this.cache.clear()}async healthCheck(){const e=Object.values(c),t={};return await Promise.all(e.map(async r=>{try{await this.client.get(`/api/oracle/${r}/health`),t[r]=!0}catch{t[r]=!1}})),t}},$e=class N{apiKeys;network;cache;routing;logging;environment;constructor(e={}){var t,r,s,a,n,o,d,h,m,w,C,A,O,S,_,M,D,E,k,V,Q,z,G,j,J,Z,X,ee,te,re,se,ie,ae,ne,oe,ce,le,ue,de,he,me,ge,pe,fe,ye,we,Pe,ve,Ee,Te,Re,Ce;this.environment=e.environment||"production",this.apiKeys={openai:((t=e.apiKeys)==null?void 0:t.openai)||process.env.OPENAI_API_KEY,chainlink:((r=e.apiKeys)==null?void 0:r.chainlink)||process.env.CHAINLINK_API_KEY,pyth:((s=e.apiKeys)==null?void 0:s.pyth)||process.env.PYTH_API_KEY,uma:((a=e.apiKeys)==null?void 0:a.uma)||process.env.UMA_API_KEY,band:((n=e.apiKeys)==null?void 0:n.band)||process.env.BAND_API_KEY,api3:((o=e.apiKeys)==null?void 0:o.api3)||process.env.API3_API_KEY,twitter:{bearerToken:((h=(d=e.apiKeys)==null?void 0:d.twitter)==null?void 0:h.bearerToken)||process.env.TWITTER_BEARER_TOKEN,apiKey:((w=(m=e.apiKeys)==null?void 0:m.twitter)==null?void 0:w.apiKey)||process.env.TWITTER_API_KEY,apiSecret:((A=(C=e.apiKeys)==null?void 0:C.twitter)==null?void 0:A.apiSecret)||process.env.TWITTER_API_SECRET,accessToken:((S=(O=e.apiKeys)==null?void 0:O.twitter)==null?void 0:S.accessToken)||process.env.TWITTER_ACCESS_TOKEN,accessTokenSecret:((M=(_=e.apiKeys)==null?void 0:_.twitter)==null?void 0:M.accessTokenSecret)||process.env.TWITTER_ACCESS_TOKEN_SECRET},polygon:((D=e.apiKeys)==null?void 0:D.polygon)||process.env.POLYGON_API_KEY,etherscan:((E=e.apiKeys)==null?void 0:E.etherscan)||process.env.ETHERSCAN_API_KEY,moralis:((k=e.apiKeys)==null?void 0:k.moralis)||process.env.MORALIS_API_KEY,alchemy:((V=e.apiKeys)==null?void 0:V.alchemy)||process.env.ALCHEMY_API_KEY,...e.apiKeys},this.network={defaultChain:((Q=e.network)==null?void 0:Q.defaultChain)||p.ETHEREUM,rpcs:{[p.ETHEREUM]:process.env.ETHEREUM_RPC||"https://eth.llamarpc.com",[p.POLYGON]:process.env.POLYGON_RPC||"https://polygon.llamarpc.com",[p.BSC]:process.env.BSC_RPC||"https://bsc.llamarpc.com",[p.ARBITRUM]:process.env.ARBITRUM_RPC||"https://arbitrum.llamarpc.com",[p.OPTIMISM]:process.env.OPTIMISM_RPC||"https://optimism.llamarpc.com",[p.FLOW_EVM]:process.env.FLOW_EVM_RPC||"https://mainnet.evm.nodes.onflow.org",[p.FLOW_TESTNET]:process.env.FLOW_TESTNET_RPC||"https://testnet.evm.nodes.onflow.org",...(z=e.network)==null?void 0:z.rpcs},timeouts:{connection:((j=(G=e.network)==null?void 0:G.timeouts)==null?void 0:j.connection)||1e4,request:((Z=(J=e.network)==null?void 0:J.timeouts)==null?void 0:Z.request)||3e4,retry:((ee=(X=e.network)==null?void 0:X.timeouts)==null?void 0:ee.retry)||5e3},retries:{maxAttempts:((re=(te=e.network)==null?void 0:te.retries)==null?void 0:re.maxAttempts)||3,backoffMs:((ie=(se=e.network)==null?void 0:se.retries)==null?void 0:ie.backoffMs)||1e3,maxBackoffMs:((ne=(ae=e.network)==null?void 0:ae.retries)==null?void 0:ne.maxBackoffMs)||1e4}},this.cache={strategy:((oe=e.cache)==null?void 0:oe.strategy)||Y.MEMORY_ONLY,ttlSeconds:((ce=e.cache)==null?void 0:ce.ttlSeconds)||300,maxSize:((le=e.cache)==null?void 0:le.maxSize)||1e3,persistPath:((ue=e.cache)==null?void 0:ue.persistPath)||"./cache",...e.cache},this.routing={strategy:((de=e.routing)==null?void 0:de.strategy)||T.BALANCED,preferredProviders:((he=e.routing)==null?void 0:he.preferredProviders)||[c.CHAINLINK,c.PYTH],fallbackProviders:((me=e.routing)==null?void 0:me.fallbackProviders)||[c.UMA,c.BAND,c.API3],consensusThreshold:((ge=e.routing)==null?void 0:ge.consensusThreshold)||.8,maxProviders:((pe=e.routing)==null?void 0:pe.maxProviders)||3,costWeighting:((fe=e.routing)==null?void 0:fe.costWeighting)||.3,speedWeighting:((ye=e.routing)==null?void 0:ye.speedWeighting)||.4,accuracyWeighting:((we=e.routing)==null?void 0:we.accuracyWeighting)||.3,...e.routing},this.logging={level:((Pe=e.logging)==null?void 0:Pe.level)||(this.environment==="production"?"error":"info"),format:((ve=e.logging)==null?void 0:ve.format)||"text",destination:((Ee=e.logging)==null?void 0:Ee.destination)||"console",filePath:((Te=e.logging)==null?void 0:Te.filePath)||"./logs/openoracle.log",maxFileSize:((Re=e.logging)==null?void 0:Re.maxFileSize)||"10m",maxFiles:((Ce=e.logging)==null?void 0:Ce.maxFiles)||5,...e.logging},this.validateConfig()}static fromEnv(e){return e?Ie.config({path:e}):Ie.config(),new N}static fromJSON(e){const t=typeof e=="string"?JSON.parse(e):e;return new N(t)}static async fromFile(e){try{const r=await(await Promise.resolve().then(()=>require("./__vite-browser-external-BcPniuRQ.js"))).readFile(e,"utf-8");return N.fromJSON(r)}catch(t){throw new v(`Failed to load config from file: ${e}`,{filePath:e,error:t instanceof Error?t.message:String(t)})}}validateConfig(){if(!this.apiKeys.openai&&this.environment==="production")throw new v("OpenAI API key is required for production");if(this.network.timeouts.connection<=0)throw new v("Connection timeout must be positive");if(this.network.retries.maxAttempts<1)throw new v("Max retry attempts must be at least 1");if(this.routing.consensusThreshold<0||this.routing.consensusThreshold>1)throw new v("Consensus threshold must be between 0 and 1");const e=this.routing.costWeighting+this.routing.speedWeighting+this.routing.accuracyWeighting;if(Math.abs(e-1)>.01)throw new v("Routing weightings must sum to 1.0");if(this.cache.ttlSeconds<=0)throw new v("Cache TTL must be positive");if(this.cache.maxSize<=0)throw new v("Cache max size must be positive")}getRpcUrl(e){const t=this.network.rpcs[e];if(!t)throw new v(`No RPC URL configured for chain ${e}`);return t}hasApiKey(e){switch(e){case c.CHAINLINK:return!!this.apiKeys.chainlink;case c.PYTH:return!!this.apiKeys.pyth;case c.UMA:return!!this.apiKeys.uma;case c.BAND:return!!this.apiKeys.band;case c.API3:return!!this.apiKeys.api3;default:return!1}}toJSON(){return{apiKeys:this.apiKeys,network:this.network,cache:this.cache,routing:this.routing,logging:this.logging,environment:this.environment}}withOptions(e){return new N({...this.toJSON(),...e})}},L=null;function et(){return L||(L=$e.fromEnv()),L}function tt(i){L=i}let rt=class{client;config;constructor(e,t){this.client=e,this.config=t}async getPrice(e){if(!e.symbol)throw new f("Symbol is required for price queries");return(await this.client.get("/api/oracle/price",{params:{symbol:e.symbol,currency:e.currency||"USD",provider:e.provider,max_age:e.maxAge,include_fees:e.includeFees}})).data||[]}async queryData(e){const t={query:e.query,category:e.category,requiredProviders:e.providers,maxProviders:e.maxProviders,consensusThreshold:e.consensusRequired?.8:.5,timeoutMs:e.timeoutMs||this.config.network.timeouts.request};return await this.client.post("/api/oracle/query",t)}async getChainlinkFeed(e,t){return(await this.client.get(`/api/oracle/chainlink/feed/${e}`,{params:{chain_id:t}})).data}async getPythFeed(e){return(await this.client.get(`/api/oracle/pyth/price/${e}`)).data}async listChainlinkFeeds(e){return(await this.client.get("/api/oracle/chainlink/feeds",{params:{chain_id:e}})).data||[]}async listPythFeeds(){return(await this.client.get("/api/oracle/pyth/feeds")).data||[]}async getProviderCapabilities(e){return(await this.client.get(`/api/oracle/providers/${e}/capabilities`)).data}async listProviders(){return(await this.client.get("/api/oracle/providers")).data||[]}async checkProviderHealth(e){try{return await this.client.get(`/api/oracle/providers/${e}/health`),!0}catch{return!1}}async aggregateData(e,t,r){return(await this.client.post("/api/oracle/aggregate",{query:e,category:t,providers:r})).data}subscribeToPriceUpdates(e,t,r){const s=new URLSearchParams({symbol:e,...(r==null?void 0:r.provider)&&{provider:r.provider},...(r==null?void 0:r.interval)&&{interval:r.interval.toString()},...(r==null?void 0:r.currency)&&{currency:r.currency}});return this.client.createEventStream(`/api/oracle/price/stream?${s}`,{onData:t,onError:a=>{console.error("Price stream error:",a)}})}subscribeToDataUpdates(e,t,r,s){const a=new URLSearchParams({query:e,category:t,...(s==null?void 0:s.providers)&&{providers:s.providers.join(",")},...(s==null?void 0:s.interval)&&{interval:s.interval.toString()}});return this.client.createEventStream(`/api/oracle/data/stream?${a}`,{onData:r,onError:n=>{console.error("Data stream error:",n)}})}async createCustomFeed(e){return(await this.client.post("/api/oracle/feeds/custom",e)).data}async getCustomFeedData(e){return(await this.client.get(`/api/oracle/feeds/custom/${e}`)).data||[]}async listCustomFeeds(){return(await this.client.get("/api/oracle/feeds/custom")).data||[]}async deleteCustomFeed(e){try{return await this.client.delete(`/api/oracle/feeds/custom/${e}`),!0}catch{return!1}}async batchQuery(e){return(await this.client.post("/api/oracle/batch",{queries:e})).data||[]}async getHistoricalData(e,t,r,s){return(await this.client.get("/api/oracle/historical",{params:{query:e,category:t,from:r.from.toISOString(),to:r.to.toISOString(),interval:r.interval||"1h",provider:s}})).data||[]}async getProviderStats(e,t){const r={provider:e};return t&&(r.from=t.from.toISOString(),r.to=t.to.toISOString()),(await this.client.get("/api/oracle/providers/stats",{params:r})).data}},st=class{client;config;constructor(e,t){this.client=e,this.config=t,this.validateTwitterConfig()}validateTwitterConfig(){var e,t;if(!((e=this.config.apiKeys.twitter)!=null&&e.bearerToken)&&!((t=this.config.apiKeys.twitter)!=null&&t.apiKey))throw new x("Twitter API credentials are required")}async searchTweets(e){var r,s,a;if(!e.query)throw new f("Search query is required");return((a=(await this.client.post("/api/twitter/search",{query:e.query,max_results:e.maxResults||100,tweet_fields:e.tweetFields||["public_metrics","created_at","context_annotations"],user_fields:e.userFields||["public_metrics","verified_type"],expansions:e.expansions||["author_id"],start_time:(r=e.startTime)==null?void 0:r.toISOString(),end_time:(s=e.endTime)==null?void 0:s.toISOString(),lang:e.lang||"en"})).data)==null?void 0:a.tweets)||[]}async analyzeSentiment(e,t){var s,a,n,o;return(await this.client.post("/api/twitter/sentiment",{query:e,max_tweets:(t==null?void 0:t.maxTweets)||500,start_time:(a=(s=t==null?void 0:t.timeRange)==null?void 0:s.from)==null?void 0:a.toISOString(),end_time:(o=(n=t==null?void 0:t.timeRange)==null?void 0:n.to)==null?void 0:o.toISOString(),include_retweets:(t==null?void 0:t.includeRetweets)??!1,lang:(t==null?void 0:t.lang)||"en"})).data}async extractPredictions(e,t,r){return(await this.client.post("/api/twitter/predictions",{query:e,category:t,timeframe:r==null?void 0:r.timeframe,min_confidence:(r==null?void 0:r.confidence)||.6,max_tweets:(r==null?void 0:r.maxTweets)||200})).data||[]}async createPredictionFromTweet(e){if(!e.tweetId&&!e.query)throw new f("Either tweet ID or query is required");return(await this.client.post("/api/twitter/create-prediction",e)).data}async getTrendingTopics(e,t){return(await this.client.get("/api/twitter/trends",{params:{location:e||"worldwide",category:t}})).data||[]}async analyzeUser(e){return(await this.client.get(`/api/twitter/users/${e}/analysis`)).data}async monitorMentions(e,t,r){const s=new URLSearchParams({keywords:e.join(","),include_retweets:((r==null?void 0:r.includeRetweets)??!1).toString(),lang:(r==null?void 0:r.lang)||"en",sentiment:((r==null?void 0:r.sentiment)??!0).toString()});return this.client.createEventStream(`/api/twitter/stream/mentions?${s}`,{onData:t,onError:a=>{console.error("Twitter stream error:",a)}})}async getMarketConfidence(e,t){return(await this.client.post("/api/twitter/market-confidence",{query:e,start_time:t.from.toISOString(),end_time:t.to.toISOString()})).data}async extractNumericPredictions(e,t,r){return(await this.client.post("/api/twitter/numeric-predictions",{query:e,target_metric:t,timeframe:r==null?void 0:r.timeframe,currency:r==null?void 0:r.currency,unit:r==null?void 0:r.unit,min_confidence:(r==null?void 0:r.minConfidence)||.5})).data||[]}async getEventPredictions(e,t,r){return(await this.client.post("/api/twitter/event-predictions",{event_query:e,category:t,time_horizon:r})).data}async createTwitterFeed(e){return(await this.client.post("/api/twitter/feeds",e)).data}async getHistoricalSentiment(e,t,r="1d"){return(await this.client.get("/api/twitter/historical-sentiment",{params:{query:e,from:t.from.toISOString(),to:t.to.toISOString(),interval:r}})).data||[]}},it=class{client;config;constructor(e,t){this.client=e,this.config=t}async createPoll(e){const t=this.validatePollRequest(e);if(!t.isValid)throw new f(`Invalid poll request: ${t.errors.join(", ")}`);return(await this.client.post("/api/polls",{question:e.question,description:e.description,category:e.category,options:e.options,end_time:e.endTime.toISOString(),resolution_method:e.resolutionMethod,minimum_stake:e.minimumStake,maximum_stake:e.maximumStake,creator_stake:e.creatorStake,tags:e.tags,metadata:e.metadata})).data}async getPoll(e){return(await this.client.get(`/api/polls/${e}`)).data}async listPolls(e){var r;return(await this.client.get("/api/polls",{params:{category:e==null?void 0:e.category,status:e==null?void 0:e.status,creator:e==null?void 0:e.creator,tags:(r=e==null?void 0:e.tags)==null?void 0:r.join(","),limit:(e==null?void 0:e.limit)||50,offset:(e==null?void 0:e.offset)||0,sort_by:(e==null?void 0:e.sortBy)||"created_time",sort_order:(e==null?void 0:e.sortOrder)||"desc"}})).data}async vote(e,t,r,s,a){if(r<=0)throw new f("Stake must be positive");if(t<0)throw new f("Option index must be non-negative");return(await this.client.post(`/api/polls/${e}/vote`,{option_index:t,stake:r,confidence:s||l.MEDIUM,reasoning:a})).data}async getPollStatistics(e){return(await this.client.get(`/api/polls/${e}/statistics`)).data}async getUserActivity(e){return(await this.client.get(`/api/polls/users/${e}/activity`)).data}async resolvePoll(e,t,r,s){return(await this.client.post(`/api/polls/${e}/resolve`,{winning_option:t,resolution_data:r,resolution_source:s})).data}async getPollResolution(e){return(await this.client.get(`/api/polls/${e}/resolution`)).data}async getTrendingPolls(e="1d",t){return(await this.client.get("/api/polls/trending",{params:{timeframe:e,category:t}})).data||[]}async searchPolls(e,t){return(await this.client.get("/api/polls/search",{params:{q:e,category:t==null?void 0:t.category,status:t==null?void 0:t.status,limit:(t==null?void 0:t.limit)||50,include_content:(t==null?void 0:t.includeContent)??!0}})).data||[]}async getRecommendations(e,t=10){return(await this.client.get(`/api/polls/users/${e}/recommendations`,{params:{limit:t}})).data||[]}subscribeToPollUpdates(e,t){return this.client.createEventStream(`/api/polls/${e}/stream`,{onData:t,onError:r=>{console.error("Poll stream error:",r)}})}subscribeToNewPolls(e,t){return this.client.createEventStream(`/api/polls/stream/new?category=${e}`,{onData:t,onError:r=>{console.error("New polls stream error:",r)}})}async getMarketMakerOpportunities(e,t,r){return(await this.client.get("/api/polls/market-maker/opportunities",{params:{min_liquidity:e,max_risk:t,categories:r==null?void 0:r.join(",")}})).data||[]}async createAutomatedResolution(e,t){return(await this.client.post(`/api/polls/${e}/automated-resolution`,t)).data}async getPollAnalytics(e){return(await this.client.get(`/api/polls/${e}/analytics`)).data}validatePollRequest(e){const t=[],r=[];(!e.question||e.question.trim().length<10)&&t.push("Question must be at least 10 characters long"),(!e.options||e.options.length<2)&&t.push("Poll must have at least 2 options"),e.options&&e.options.length>10&&r.push("Polls with more than 10 options may be difficult to manage"),(!e.endTime||e.endTime<=new Date)&&t.push("End time must be in the future"),e.endTime&&e.endTime.getTime()-Date.now()<36e5&&r.push("Polls ending in less than 1 hour may not get enough participation"),e.minimumStake&&e.maximumStake&&e.minimumStake>=e.maximumStake&&t.push("Minimum stake must be less than maximum stake"),e.minimumStake&&e.minimumStake<=0&&t.push("Minimum stake must be positive");const s=t.length===0?r.length===0?l.VERY_HIGH:l.HIGH:l.LOW;return{isValid:t.length===0,errors:t,warnings:r,confidence:s}}},b=class{config;client;providerConfig;capabilities;supportedCategories;requestCount=0;lastRequestTime=0;rateLimitQueue=[];constructor(e,t,r){this.config=e,this.client=t,this.providerConfig=r,this.capabilities=this.getProviderCapabilities(),this.supportedCategories=this.getSupportedCategories(),this.validateConfiguration()}getDefaultTimeout(){return this.providerConfig.timeout||3e4}getDefaultRetries(){return this.providerConfig.retryAttempts||3}getCostPerQuery(){return .01}async query(e,t={}){if(this.validateRequest(e),!this.supportedCategories.includes(e.category))throw new R(`Category ${e.category} is not supported by ${this.getProviderName()}`,this.getProviderName());await this.applyRateLimit();const r=Date.now(),s=t.retryAttempts??this.getDefaultRetries();for(let a=1;a<=s;a++)try{const n=await this.executeQueryWithTimeout(e,t);return this.updateMetrics(!0,Date.now()-r),n}catch(n){if(a===s)throw this.updateMetrics(!1,Date.now()-r),n;if(n instanceof f)throw n;const o=Math.min(1e3*Math.pow(2,a-1),1e4);await new Promise(d=>setTimeout(d,o))}throw new R(`All retry attempts failed for ${this.getProviderName()}`,this.getProviderName())}async executeQueryWithTimeout(e,t){const r=t.timeout??this.getDefaultTimeout();return Promise.race([this.queryData(e,t),new Promise((s,a)=>{setTimeout(()=>a(new H(`Query timeout after ${r}ms`,r)),r)})])}async healthCheck(){try{const e={query:"health_check",category:u.CUSTOM};return await this.query(e,{timeout:5e3}),!0}catch{return!1}}getCapabilities(){return{provider:this.getProviderName(),capabilities:this.capabilities,supportedCategories:this.supportedCategories,updateFrequencies:this.getSupportedUpdateFrequencies(),costPerQuery:this.getCostPerQuery(),averageResponseTimeMs:this.getAverageResponseTime(),reliability:this.getReliability(),accuracy:this.getAccuracy()}}getSupportedUpdateFrequencies(){return[I.ON_DEMAND,I.MINUTE,I.HOUR,I.DAILY]}getStats(){return{requestCount:this.requestCount,lastRequestTime:this.lastRequestTime,averageResponseTime:this.getAverageResponseTime(),reliability:this.getReliability()}}async testConnection(){const e=Date.now();try{const t=await this.client.get(this.getEndpointUrl(),{timeout:5e3});return{connected:!0,responseTime:Date.now()-e}}catch(t){return{connected:!1,error:t instanceof Error?t.message:String(t)}}}createDataPoint(e,t,r=l.MEDIUM,s){return{value:e,timestamp:new Date,source:`${this.getProviderName()}:${t}`,confidence:r,metadata:{provider:this.getProviderName(),...s}}}normalizeResponse(e,t,r,s=!1){return{data:(Array.isArray(e)?e:[e]).map(n=>this.createDataPoint(n,"api",l.MEDIUM)),metadata:{provider:this.getProviderName(),responseTime:r,cached:s,confidence:l.MEDIUM,cost:this.getCostPerQuery()}}}validateRequest(e){if(!e.query||e.query.trim().length===0)throw new f("Query cannot be empty");if(!Object.values(u).includes(e.category))throw new f("Invalid data category")}validateConfiguration(){const e=Ne(this.providerConfig);if(!e.isValid)throw new f(`Invalid provider configuration: ${e.errors.join(", ")}`)}async applyRateLimit(){if(!this.providerConfig.rateLimit)return;const t=Date.now()-this.lastRequestTime,r=60*1e3/this.providerConfig.rateLimit;if(t<r){const s=r-t;await new Promise(a=>setTimeout(a,s))}}updateMetrics(e,t){this.requestCount++,this.lastRequestTime=Date.now()}getAverageResponseTime(){return 1500}getReliability(){return .95}getAccuracy(){return .85}createProviderError(e,t){return new R(e,this.getProviderName(),{originalError:t==null?void 0:t.message,endpointUrl:this.getEndpointUrl(),requestCount:this.requestCount})}hasApiKey(){return!!this.providerConfig.apiKey}getAuthHeaders(){return this.providerConfig.apiKey?{Authorization:`Bearer ${this.providerConfig.apiKey}`}:{}}buildQueryParams(e){const t={};for(const[r,s]of Object.entries(e))s!=null&&(t[r]=String(s));return t}destroy(){this.rateLimitQueue.length=0}},at=class extends b{baseUrls={[p.ETHEREUM]:"https://api.chain.link",[p.POLYGON]:"https://api.chain.link",[p.BSC]:"https://api.chain.link",[p.ARBITRUM]:"https://api.chain.link",[p.OPTIMISM]:"https://api.chain.link",[p.AVALANCHE]:"https://api.chain.link",[p.FANTOM]:"https://api.chain.link",[p.FLOW_EVM]:"https://api.chain.link",[p.FLOW_TESTNET]:"https://api.chain.link"};feedCache=new Map;constructor(e,t,r){super(e,t,r)}getProviderName(){return c.CHAINLINK}getProviderCapabilities(){return[g.PRICE_FEEDS,g.VRF,g.AUTOMATION,g.EXTERNAL_ADAPTERS,g.PROOF_OF_RESERVE,g.CCIP,g.FUNCTIONS,g.SPORTS_DATA,g.WEATHER_DATA,g.ECONOMIC_DATA]}getSupportedCategories(){return[u.PRICE,u.CRYPTO,u.STOCKS,u.FOREX,u.COMMODITIES,u.SPORTS,u.WEATHER,u.ECONOMIC,u.DEFI]}getEndpointUrl(){const e=this.config.network.defaultChain;return this.baseUrls[e]||this.baseUrls[p.ETHEREUM]}getCostPerQuery(){return .01}async queryData(e,t={}){try{switch(e.category){case u.PRICE:case u.CRYPTO:case u.STOCKS:case u.FOREX:case u.COMMODITIES:return await this.queryPriceData(e,t);case u.SPORTS:return await this.querySportsData(e,t);case u.WEATHER:return await this.queryWeatherData(e,t);default:return await this.queryGenericData(e,t)}}catch(r){throw this.createProviderError(`Chainlink query failed: ${r instanceof Error?r.message:String(r)}`,r)}}async queryPriceData(e,t){const r=Date.now(),s=this.extractSymbol(e.query);if(!s)throw new f("Could not extract trading pair from query");const a=await this.findPriceFeed(s,t.chainId);if(!a)throw new R(`No Chainlink price feed found for ${s}`,this.getProviderName());try{const n=await this.client.get(`/v1/feeds/${a.feedId}/latest`,{headers:this.getAuthHeaders(),params:this.buildQueryParams({format:"json",include_metadata:!0})}),o={feedId:a.feedId,pair:a.pair,price:n.price/Math.pow(10,a.decimals),timestamp:new Date(n.timestamp*1e3),decimals:a.decimals,round:n.round,updatedAt:new Date(n.updatedAt*1e3)},d=[this.createDataPoint(o.price,`price_feed:${a.feedId}`,l.VERY_HIGH,{pair:o.pair,decimals:o.decimals,round:o.round,feedId:o.feedId,heartbeat:a.heartbeat})];if(t.includeHistorical){const h=await this.getHistoricalPriceData(a.feedId,24);d.push(...h)}return this.normalizeResponse(d,e,Date.now()-r)}catch(n){throw this.createProviderError(`Failed to fetch price data for ${s}`,n)}}async querySportsData(e,t){var s;const r=Date.now();try{const n=((s=(await this.client.get("/v1/sports/events",{headers:this.getAuthHeaders(),params:this.buildQueryParams({query:e.query,format:"json"})})).events)==null?void 0:s.map(o=>this.createDataPoint(o.outcome,`sports:${o.eventId}`,l.HIGH,{sport:o.sport,league:o.league,teams:o.teams,startTime:o.startTime})))||[];return this.normalizeResponse(n,e,Date.now()-r)}catch(a){throw this.createProviderError("Failed to fetch sports data",a)}}async queryWeatherData(e,t){const r=Date.now();try{const s=await this.client.get("/v1/weather/current",{headers:this.getAuthHeaders(),params:this.buildQueryParams({query:e.query,format:"json"})}),a=[this.createDataPoint(s.temperature,"weather:temperature",l.HIGH,{location:s.location,humidity:s.humidity,pressure:s.pressure,windSpeed:s.windSpeed,conditions:s.conditions})];return this.normalizeResponse(a,e,Date.now()-r)}catch(s){throw this.createProviderError("Failed to fetch weather data",s)}}async queryGenericData(e,t){var s;const r=Date.now();try{const a=await this.client.post("/v1/functions/execute",{source:this.buildFunctionSource(e),args:[e.query],subscriptionId:(s=this.providerConfig.customParams)==null?void 0:s.subscriptionId},{headers:this.getAuthHeaders()}),n=[this.createDataPoint(a.result,"function:custom",l.MEDIUM,{executionId:a.executionId,gasUsed:a.gasUsed,cost:a.cost})];return this.normalizeResponse(n,e,Date.now()-r)}catch(a){throw this.createProviderError("Failed to execute custom function",a)}}async findPriceFeed(e,t){const r=t||this.config.network.defaultChain,s=`feeds:${r}`;this.feedCache.has(s)||await this.loadFeedDirectory(r);const a=this.feedCache.get(s)||[];let n=a.find(o=>o.pair.toLowerCase()===e.toLowerCase()||o.name.toLowerCase().includes(e.toLowerCase()));if(!n){const o=e.toLowerCase().split("/").join("");n=a.find(d=>d.pair.toLowerCase().replace("/","").includes(o)||d.name.toLowerCase().replace(/[\s\/]/g,"").includes(o))}return n||null}async loadFeedDirectory(e){var t;try{const s=((t=(await this.client.get("/v1/feeds",{headers:this.getAuthHeaders(),params:{chainId:e.toString()}})).feeds)==null?void 0:t.map(a=>({feedId:a.feedId,name:a.name,pair:a.pair,decimals:a.decimals,proxy:a.proxy,aggregator:a.aggregator,phase:a.phase,heartbeat:a.heartbeat})))||[];this.feedCache.set(`feeds:${e}`,s)}catch(r){console.warn(`Failed to load Chainlink feed directory for chain ${e}:`,r),this.feedCache.set(`feeds:${e}`,[])}}extractSymbol(e){const t=e.match(/([A-Z]{2,5})[\/\-\s]([A-Z]{2,5})/i);if(t)return`${t[1]}/${t[2]}`.toUpperCase();const r=e.match(/\b([A-Z]{2,5})\b/i);return r?`${r[1]}/USD`.toUpperCase():null}async getHistoricalPriceData(e,t){var r;try{return((r=(await this.client.get(`/v1/feeds/${e}/historical`,{headers:this.getAuthHeaders(),params:this.buildQueryParams({hours:t.toString(),interval:"1h"})})).data)==null?void 0:r.map(a=>this.createDataPoint(a.price,`price_feed:${e}:historical`,l.HIGH,{timestamp:new Date(a.timestamp*1e3),round:a.round})))||[]}catch(s){return console.warn(`Failed to fetch historical data for feed ${e}:`,s),[]}}buildFunctionSource(e){return`
const query = args[0];
const response = await Functions.makeHttpRequest({
url: 'https://api.example.com/data',
method: 'GET',
params: { q: query }
});
if (response.error) {
throw new Error('HTTP request failed');
}
return Functions.encodeString(response.data.result);
`}async getAvailableFeeds(e){const t=e||this.config.network.defaultChain;return this.feedCache.has(`feeds:${t}`)||await this.loadFeedDirectory(t),this.feedCache.get(`feeds:${t}`)||[]}subscribeToFeed(e,t){const r=this.client.createWebSocket(`wss://ws.chain.link/v1/feeds/${e}`);return r.onmessage=s=>{try{const a=JSON.parse(s.data),n={feedId:e,pair:a.pair,price:a.price,timestamp:new Date(a.timestamp*1e3),decimals:a.decimals,round:a.round,updatedAt:new Date};t(n)}catch(a){console.error("Error parsing Chainlink feed data:",a)}},r}},nt=class extends b{hermesEndpoint="https://hermes.pyth.network";feedCache=new Map;lastFeedUpdate=0;FEED_CACHE_TTL=5*60*1e3;constructor(e,t,r){super(e,t,r)}getProviderName(){return c.PYTH}getProviderCapabilities(){return[g.PRICE_FEEDS]}getSupportedCategories(){return[u.PRICE,u.CRYPTO,u.STOCKS,u.FOREX,u.COMMODITIES]}getEndpointUrl(){return this.providerConfig.endpointUrl||this.hermesEndpoint}getCostPerQuery(){return .005}async queryData(e,t={}){try{switch(e.category){case u.PRICE:case u.CRYPTO:case u.STOCKS:case u.FOREX:case u.COMMODITIES:return await this.queryPriceData(e,t);default:throw new f(`Category ${e.category} not supported by Pyth`)}}catch(r){throw this.createProviderError(`Pyth query failed: ${r instanceof Error?r.message:String(r)}`,r)}}async queryPriceData(e,t){const r=Date.now(),s=this.extractSymbol(e.query);if(!s)throw new f("Could not extract trading pair from query");const a=await this.findPriceFeed(s);if(!a)throw new R(`No Pyth price feed found for ${s}`,this.getProviderName());try{const n=t.binary?"/api/latest_vaas":"/v2/updates/price/latest",o=await this.client.get(n,{params:this.buildQueryParams({ids:a.id,...t.binary&&{encoding:"base64",parsed:!0}}),baseURL:this.getEndpointUrl()}),d=t.binary?o.data[0]:o.parsed[0],h={priceId:a.id,symbol:a.symbol,price:this.parsePythPrice(d.price),confidence:this.parsePythPrice(d.price,!0),timestamp:new Date(d.price.publishTime*1e3),status:this.getPriceStatus(d.price),previousPrice:d.emaPrice?this.parsePythPrice(d.emaPrice):void 0,previousTimestamp:d.emaPrice?new Date(d.emaPrice.publishTime*1e3):void 0},m=[this.createDataPoint(h.price,`price_feed:${a.id}`,this.calculateConfidence(h),{symbol:h.symbol,priceId:h.priceId,confidence:h.confidence,status:h.status,publishTime:h.timestamp,assetType:a.assetType,base:a.base,quote:a.quote})];return this.normalizeResponse(m,e,Date.now()-r)}catch(n){throw this.createProviderError(`Failed to fetch price data for ${s}`,n)}}async findPriceFeed(e){(!this.feedCache.has("all")||Date.now()-this.lastFeedUpdate>this.FEED_CACHE_TTL)&&await this.loadFeedDirectory();const t=this.feedCache.get("all")||[];let r=t.find(s=>{var a;return s.symbol.toLowerCase()===e.toLowerCase()||((a=s.genericSymbol)==null?void 0:a.toLowerCase())===e.toLowerCase()||`${s.base}/${s.quote}`.toLowerCase()===e.toLowerCase()});if(!r){const s=e.toLowerCase().replace(/[\s\/\-]/g,"");r=t.find(a=>{const n=a.symbol.toLowerCase().replace(/[\s\/\-]/g,""),o=`${a.base}${a.quote}`.toLowerCase();return n.includes(s)||o.includes(s)})}return r||null}async loadFeedDirectory(){var e;try{const r=((e=(await this.client.get("/v2/price_feeds",{baseURL:this.getEndpointUrl(),params:{query:"",asset_type:"crypto,equity,fx,commodities"}})).data)==null?void 0:e.map(s=>{var a,n,o,d,h,m;return{id:s.id,symbol:((a=s.attributes)==null?void 0:a.symbol)||"",assetType:((n=s.attributes)==null?void 0:n.asset_type)||"",base:((o=s.attributes)==null?void 0:o.base)||"",quote:((d=s.attributes)==null?void 0:d.quote_currency)||"",description:((h=s.attributes)==null?void 0:h.description)||"",genericSymbol:(m=s.attributes)==null?void 0:m.generic_symbol}}))||[];this.feedCache.set("all",r),this.lastFeedUpdate=Date.now()}catch(t){console.warn("Failed to load Pyth feed directory:",t),this.feedCache.set("all",[]),this.lastFeedUpdate=Date.now()}}parsePythPrice(e,t=!1){const r=t?e.conf:e.price,s=e.expo;return parseFloat(r)*Math.pow(10,s)}getPriceStatus(e){const t=Date.now()/1e3,r=e.publishTime,s=t-r;return s>300?"halted":s>60?"auction":"trading"}calculateConfidence(e){if(!e.confidence||e.confidence===0)return l.MEDIUM;const t=e.confidence/Math.abs(e.price);return t<.001?l.VERY_HIGH:t<.005?l.HIGH:t<.02?l.MEDIUM:t<.05?l.LOW:l.VERY_LOW}extractSymbol(e){const t=e.match(/([A-Z]{2,10})[\/\-\s]([A-Z]{2,10})/i);if(t)return`${t[1]}/${t[2]}`.toUpperCase();const r=e.match(/\b([A-Z]{2,10})\b/i);if(r){const s=r[1].toUpperCase();return["BTC","ETH","ADA","SOL","AVAX","MATIC","DOT","LINK"].includes(s)?`${s}/USD`:s}return null}async getAvailableFeeds(){return(!this.feedCache.has("all")||Date.now()-this.lastFeedUpdate>this.FEED_CACHE_TTL)&&await this.loadFeedDirectory(),this.feedCache.get("all")||[]}async getBatchPrices(e){var t;if(e.length===0)return[];try{return((t=(await this.client.get("/v2/updates/price/latest",{params:{ids:e.join(",")},baseURL:this.getEndpointUrl()})).parsed)==null?void 0:t.map((s,a)=>({priceId:e[a],symbol:"",price:this.parsePythPrice(s.price),confidence:this.parsePythPrice(s.price,!0),timestamp:new Date(s.price.publishTime*1e3),status:this.getPriceStatus(s.price),previousPrice:s.emaPrice?this.parsePythPrice(s.emaPrice):void 0,previousTimestamp:s.emaPrice?new Date(s.emaPrice.publishTime*1e3):void 0})))||[]}catch(r){throw this.createProviderError("Failed to fetch batch price data",r)}}async getHistoricalPrices(e,t,r){var s;try{return((s=(await this.client.get("/v2/updates/price",{params:{ids:e,start_time:Math.floor(t.getTime()/1e3),end_time:Math.floor(r.getTime()/1e3)},baseURL:this.getEndpointUrl()})).parsed)==null?void 0:s.map(n=>({priceId:e,symbol:"",price:this.parsePythPrice(n.price),confidence:this.parsePythPrice(n.price,!0),timestamp:new Date(n.price.publishTime*1e3),status:this.getPriceStatus(n.price)})))||[]}catch(a){throw this.createProviderError("Failed to fetch historical price data",a)}}subscribeToPrice(e,t){const r=this.client.createWebSocket("wss://hermes.pyth.network/ws");return r.onopen=()=>{r.send(JSON.stringify({type:"subscribe",ids:[e]}))},r.onmessage=s=>{try{const a=JSON.parse(s.data);if(a.type==="price_update"){const n=a.price_feed,o={priceId:e,symbol:"",price:this.parsePythPrice(n.price),confidence:this.parsePythPrice(n.price,!0),timestamp:new Date(n.price.publishTime*1e3),status:this.getPriceStatus(n.price)};t(o)}}catch(a){console.error("Error parsing Pyth price update:",a)}},r}async getFeedMetadata(e){return(await this.getAvailableFeeds()).find(r=>r.id===e)||null}async searchFeedsByAssetType(e){return(await this.getAvailableFeeds()).filter(r=>r.assetType===e)}},ot=class extends b{constructor(e,t,r){super(e,t,r)}getProviderName(){return c.UMA}getProviderCapabilities(){return[g.PRICE_FEEDS,g.EXTERNAL_ADAPTERS]}getSupportedCategories(){return[u.PRICE,u.SPORTS,u.ECONOMIC,u.NEWS,u.CUSTOM]}getEndpointUrl(){return this.providerConfig.endpointUrl||"https://api.umaproject.org"}getCostPerQuery(){return .02}async queryData(e,t={}){const r=Date.now();try{const s=await this.client.post("/v1/request",{identifier:this.encodeIdentifier(e.query),ancillaryData:e.metadata,timestamp:Math.floor(Date.now()/1e3),bond:t.bondAmount||"1000000000000000000",disputeWindow:t.disputeWindow||7200},{headers:this.getAuthHeaders(),baseURL:this.getEndpointUrl()}),a=[this.createDataPoint(s.proposedPrice||"pending","optimistic_oracle",l.MEDIUM,{requestId:s.requestId,proposer:s.proposer,bondAmount:t.bondAmount,expirationTime:s.expirationTime,disputed:s.disputed||!1})];return this.normalizeResponse(a,e,Date.now()-r)}catch(s){throw this.createProviderError(`UMA query failed: ${s instanceof Error?s.message:String(s)}`,s)}}encodeIdentifier(e){return e.replace(/\s+/g,"_").toUpperCase()}},ct=class extends b{constructor(e,t,r){super(e,t,r)}getProviderName(){return c.BAND}getProviderCapabilities(){return[g.PRICE_FEEDS,g.SPORTS_DATA,g.ECONOMIC_DATA]}getSupportedCategories(){return[u.PRICE,u.CRYPTO,u.SPORTS,u.ECONOMIC]}getEndpointUrl(){return this.providerConfig.endpointUrl||"https://laozi1.bandchain.org/api"}getCostPerQuery(){return .015}async queryData(e,t={}){var s;const r=Date.now();try{const n=((s=(await this.client.get("/oracle/v1/request_search",{params:{oid:1,symbols:this.extractSymbol(e.query),min_count:3,ask_count:4},baseURL:this.getEndpointUrl()})).result)==null?void 0:s.map(o=>this.createDataPoint(o.px,"band_protocol",l.HIGH,{symbol:o.symbol,timestamp:o.resolve_time,requestId:o.request_id})))||[];return this.normalizeResponse(n,e,Date.now()-r)}catch(a){throw this.createProviderError(`Band Protocol query failed: ${a instanceof Error?a.message:String(a)}`,a)}}extractSymbol(e){const t=e.match(/([A-Z]{2,5})/i);return t?t[1].toUpperCase():"BTC"}},lt=class extends b{constructor(e,t,r){super(e,t,r)}getProviderName(){return c.API3}getProviderCapabilities(){return[g.PRICE_FEEDS,g.EXTERNAL_ADAPTERS]}getSupportedCategories(){return[u.PRICE,u.CRYPTO,u.STOCKS,u.ECONOMIC]}getEndpointUrl(){re