@oracle-agent/oracle 0.35.49 → 0.35.51
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -2
- package/artifacts/specialist-packs/oracle-full-crypto.json +11 -0
- package/dist/agent-sessions.mjs +19 -19
- package/dist/artifacts/token-dashboard.mjs +1 -1
- package/dist/assets/profiles/near-agent/SOUL.md +46 -0
- package/dist/assets/profiles/near-agent/profile.json +30 -0
- package/dist/assets/profiles/oracle/SOUL.md +1 -0
- package/dist/assets/skills/oracle-desk-product/SKILL.md +1 -1
- package/dist/assets/skills/oracle-near/SKILL.md +66 -0
- package/dist/automation-plan.mjs +1 -1
- package/dist/bin/desk-server.mjs +33 -33
- package/dist/bin/oracle-data-mcp.mjs +16 -16
- package/dist/bin/oracle-gateway.mjs +3 -3
- package/dist/bin/oracle-launch-radar-shadow.mjs +3 -3
- package/dist/bin/oracle-mev-arb-shadow.mjs +4 -4
- package/dist/bin/oracle-mev-shadow.mjs +4 -4
- package/dist/bin/oracle-public-server.mjs +5 -5
- package/dist/bin/oracle-route.mjs +27 -27
- package/dist/bin/oracle-scan.mjs +3 -3
- package/dist/bin/oracle-telegram-mcp.mjs +1 -1
- package/dist/chains.mjs +1 -1
- package/dist/cli/commands/account.mjs +22 -22
- package/dist/cli/commands/agent-session.mjs +23 -23
- package/dist/cli/commands/auth.mjs +16 -15
- package/dist/cli/commands/chain.mjs +5 -5
- package/dist/cli/commands/chat.mjs +310 -228
- package/dist/cli/commands/data.mjs +37 -37
- package/dist/cli/commands/doctor.mjs +5 -5
- package/dist/cli/commands/eval.mjs +249 -167
- package/dist/cli/commands/farm.mjs +1 -1
- package/dist/cli/commands/follow.mjs +4 -4
- package/dist/cli/commands/harness.mjs +5 -5
- package/dist/cli/commands/mint.mjs +11 -11
- package/dist/cli/commands/model.mjs +313 -231
- package/dist/cli/commands/project.mjs +8 -7
- package/dist/cli/commands/quickstart.mjs +2 -2
- package/dist/cli/commands/receipt.mjs +2 -2
- package/dist/cli/commands/resolve.mjs +4 -4
- package/dist/cli/commands/session-vault.mjs +4 -4
- package/dist/cli/commands/setup.mjs +53 -52
- package/dist/cli/commands/snipe.mjs +13 -13
- package/dist/cli/commands/strategy.mjs +5 -5
- package/dist/cli/commands/swap.mjs +11 -11
- package/dist/cli/commands/telegram.mjs +7 -7
- package/dist/cli/commands/venues.mjs +1 -1
- package/dist/cli/project-access.mjs +4 -3
- package/dist/data/desk-data.mjs +31 -31
- package/dist/data/holder-table.mjs +2 -2
- package/dist/data/market-tape.mjs +1 -1
- package/dist/data/names.mjs +3 -3
- package/dist/data/providers/farming.mjs +2 -2
- package/dist/data/providers/lp-destination-discovery.mjs +4 -4
- package/dist/index.mjs +49 -49
- package/dist/launch-radar/index.mjs +5 -5
- package/dist/lp/index.mjs +4 -4
- package/dist/nft/universal-mint-router.mjs +4 -4
- package/dist/notifications/index.mjs +1 -1
- package/dist/router/index.mjs +3 -3
- package/dist/router/prepare-bridge.mjs +2 -2
- package/dist/router/prepare-route.mjs +3 -3
- package/dist/scanner/index.mjs +3 -3
- package/dist/strategy/index.mjs +4 -4
- package/dist/task.mjs +1 -1
- package/dist/teams/index.mjs +6 -6
- package/dist/telegram/chart-card.mjs +5 -5
- package/dist/telegram/market-commands.mjs +1 -1
- package/dist/tui/standalone-client.mjs +179 -97
- package/package.json +2 -2
- package/public/oracle-splash/assets/desktop-app.jpg +0 -0
- package/public/oracle-splash/docs/browser-and-web/index.html +2 -2
- package/public/oracle-splash/docs/connectors/index.html +2 -2
- package/public/oracle-splash/docs/getting-started/index.html +2 -2
- package/public/oracle-splash/docs/index.html +3 -3
- package/public/oracle-splash/docs/reference/index.html +2 -2
- package/public/oracle-splash/docs/security/index.html +2 -2
- package/public/oracle-splash/docs/using-oracle/index.html +2 -2
- package/public/oracle-splash/download/index.html +219 -5
- package/public/oracle-splash/downloads/index.html +1 -1
- package/public/oracle-splash/eval/index.html +19 -19
- package/public/oracle-splash/eval/releases/oracle-0.35.49.json +852 -0
- package/public/oracle-splash/index.html +262 -37
- package/public/oracle-splash/pricing/index.html +215 -1
- package/public/oracle-splash/security/index.html +215 -1
- package/public/oracle-splash/what-it-does/index.html +215 -1
- package/public/oracle-splash/where-it-works/index.html +215 -1
- package/server.json +2 -2
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
var ts=Object.defineProperty;var _=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(r){throw n=[r],r}};var _e=(e,t)=>{for(var n in t)ts(e,n,{get:t[n],enumerable:!0})};import{AsyncLocalStorage as rs}from"node:async_hooks";function pt(e){let t=os.getStore();if(!t||t.closed||!is.includes(e))return null;if(t.spans.length>=ss)return t.droppedSpans++,null;let n={stage:e,startMs:t.now()-t.start,durationMs:null,outcome:"pending",status:null};return t.spans.push(n),(r,o=null)=>{t.closed||n.durationMs!==null||(n.durationMs=Math.max(0,t.now()-t.start-n.startMs),n.outcome=r==="succeeded"?"succeeded":"failed",n.status=Number.isInteger(o)&&o>=100&&o<=599?o:null)}}var os,is,ss,Zn=_(()=>{os=new rs,is=["http","retry","shared"],ss=512});import ye from"node:net";import as from"node:dns";function ft(e){let t=String(e).toLowerCase().split("%")[0];if((t.match(/::/g)||[]).length>1)return null;let n=d=>{if(!d)return[];let c=d.split(":"),f=c.at(-1);if(f?.includes(".")){let m=f.split(".").map(Number);if(m.length!==4||m.some(p=>!Number.isInteger(p)||p<0||p>255))return null;c.splice(c.length-1,1,(m[0]<<8|m[1]).toString(16),(m[2]<<8|m[3]).toString(16))}return c.some(m=>!/^[0-9a-f]{1,4}$/.test(m))?null:c.map(m=>Number.parseInt(m,16))},[r,o]=t.split("::"),i=n(r),s=n(o);if(!i||!s)return null;let a=t.includes("::"),l=8-i.length-s.length;if(!a&&l!==0||a&&l<1)return null;let u=[...i,...Array(Math.max(0,l)).fill(0),...s];return u.length!==8?null:Uint8Array.from(u.flatMap(d=>[d>>8,d&255]))}function Ht(e,t,n){let r=Math.floor(n/8),o=n%8;for(let s=0;s<r;s+=1)if(e[s]!==t[s])return!1;if(!o)return!0;let i=255<<8-o;return(e[r]&i)===(t[r]&i)}function zt(e){if(ye.isIPv4(e)){let t=e.split(".").map(Number);return!(t[0]===0||t[0]===10||t[0]===127||t[0]>=224||t[0]===100&&t[1]>=64&&t[1]<=127||t[0]===169&&t[1]===254||t[0]===172&&t[1]>=16&&t[1]<=31||t[0]===192&&(t[1]===0||t[1]===2||t[1]===168)||t[0]===192&&t[1]===88&&t[2]===99||t[0]===198&&(t[1]===18||t[1]===19||t[1]===51)||t[0]===203&&t[1]===0&&t[2]===113)}if(ye.isIPv6(e)){let t=ft(e);if(!t)return!1;let n=ft("::ffff:0:0");return Ht(t,n,96)?zt([...t.slice(12)].join(".")):Ht(t,ft("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([o,i])=>Ht(t,ft(o),i)):!1}return!1}function ls(e){let t;try{t=new URL(String(e))}catch{return{ok:!1,error:`not a valid URL: ${String(e).slice(0,120)}`}}if(t.protocol!=="http:"&&t.protocol!=="https:")return{ok:!1,error:`refused protocol ${t.protocol} (only http/https)`};let n=t.hostname.toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,"");if(cs.has(n)||n.endsWith(".localhost")||n.endsWith(".internal"))return{ok:!1,error:`refused internal host ${n}`};let r=ye.isIP(n);return r!==0&&!zt(n)?{ok:!1,error:`refused private address ${n}`}:{ok:!0,url:t,host:n,isLiteralIp:r!==0}}async function Vt(e,{lookupFn:t=as.promises.lookup}={}){let n=ls(e);if(!n.ok)return n;if(n.isLiteralIp)return{ok:!0,url:n.url,addresses:[{address:n.host,family:ye.isIPv6(n.host)?6:4}]};let r;if(process.env.ORACLE_HOSTED_EGRESS_PROXY)return{ok:!0,url:n.url,addresses:[]};try{r=await t(n.host,{all:!0,verbatim:!0})}catch{return{ok:!1,error:`refused: ${n.host} did not resolve`}}return!Array.isArray(r)||r.length===0||r.some(o=>!zt(o.address))?{ok:!1,error:`refused: ${n.host} resolves to a non-public address`}:{ok:!0,url:n.url,addresses:r}}function us(e=process.env){let t=e.ORACLE_HOSTED_EGRESS_PROXY||"";if(!t)return null;let n;try{n=new URL(t)}catch{throw new Error("egress-guard: ORACLE_HOSTED_EGRESS_PROXY is not a URL")}if(n.protocol!=="http:"||!["127.0.0.1","::1","localhost","[::1]"].includes(n.hostname)||!n.port||n.username||n.password)throw new Error("egress-guard: egress proxy must be an exact loopback http origin");let r=e.ORACLE_HOSTED_EGRESS_TOKEN||"";if(!/^[A-Za-z0-9_-]{43}$/.test(r))throw new Error("egress-guard: egress proxy token is missing");return{uri:n.origin,token:r}}async function Kt({requireUndici:e=!1,importUndici:t=()=>import("undici")}={}){let n,r,o;try{o=await t(),n=o.Agent,r=o.fetch}catch(m){if(e)throw new Error(`egress-guard: untrustedUrl pinning requires the undici package, which failed to load: ${m?.message||m}`);return null}if(typeof n!="function"||typeof r!="function"){if(e)throw new Error("egress-guard: untrustedUrl pinning requires undici's Agent and fetch exports, which were not found on the imported module");return null}let i=m=>String(m).toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,""),s=new Map,a=m=>(Array.isArray(m)?m:[m]).map(p=>typeof p=="string"?{address:p}:p).filter(p=>p&&p.address).map(p=>({address:p.address,family:p.family||(ye.isIPv6(p.address)?6:4)})),l=(m,p,y)=>{s.set(i(m),a(typeof p=="string"?[{address:p,family:y}]:p))},u=m=>{let p=i(m);if(ye.isIP(p))return[{address:p,family:ye.isIPv6(p)?6:4}];let y=s.get(p);if(!y||!y.length)throw new Error(`refused: unpinned host ${m} during pinned fetch`);return y},d=us(),c=d&&typeof o.ProxyAgent=="function"?new o.ProxyAgent({uri:d.uri,token:`Bearer ${d.token}`,connectTimeout:1e4}):new n({connect:{lookup(m,p,y){let S;try{S=u(m)}catch(v){return y(v)}return p?.all?y(null,S):y(null,S[0].address,S[0].family)}}}),f=ds((m,p={})=>r(m,{...p,dispatcher:c}),l);return{dispatcher:c,fetch:f,pin:l,resolve:u,async close(){try{await c.destroy()}catch{}}}}function ds(e,t){if(typeof e!="function")throw new Error("markPinCapableFetch: fetchImpl must be a function");if(typeof t!="function")throw new Error("markPinCapableFetch: pin must be a function");return e[Wt]=Object.freeze({pin:t}),e}function Gt(e){return typeof e=="function"&&typeof e[Wt]?.pin=="function"}function er(e,t,n){if(!Gt(e))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");e[Wt].pin(t,n)}var cs,Wt,tr=_(()=>{cs=new Set(["localhost","metadata.google.internal","metadata.goog"]);Wt=Symbol.for("oracle.egressGuard.pinCapableFetch")});import{createHash as ps}from"node:crypto";import{types as oe}from"node:util";function U(e){return ue(`HTTP JSON body refused: ${e}`)}function xs(e){return["isArgumentsObject","isArrayBuffer","isAnyArrayBuffer","isArrayBufferView","isBoxedPrimitive","isDataView","isDate","isExternal","isGeneratorObject","isKeyObject","isCryptoKey","isMap","isMapIterator","isModuleNamespaceObject","isNativeError","isPromise","isRegExp","isSet","isSetIterator","isTypedArray","isWeakMap","isWeakSet"].some(t=>typeof oe[t]=="function"&&oe[t](e))}function Es(e){let t=[],n=0,r=0,o=0,i=0,s=new WeakSet,a=d=>{if(n+=Buffer.byteLength(d,"utf8"),n>re.bytes)throw U("serialized byte limit exceeded");t.push(d)},l=d=>{if(Buffer.byteLength(d,"utf8")>re.bytes)throw U("serialized byte limit exceeded");return JSON.stringify(d)},u=(d,c)=>{if(r+=1,r>re.nodes)throw U("node limit exceeded");if(c>re.depth)throw U("depth limit exceeded");if(d===null){a("null");return}if(typeof d=="string"){a(l(d));return}if(typeof d=="boolean"){a(d?"true":"false");return}if(typeof d=="number"){if(!Number.isFinite(d))throw U("non-finite number");a(Object.is(d,-0)?"0":String(d));return}if(typeof d!="object")throw U("unsupported non-JSON value");if(oe.isProxy(d))throw U("proxy value");if(xs(d))throw U("unsupported exotic object");if(s.has(d))throw U("cyclic value");s.add(d);try{if(Object.getOwnPropertySymbols(d).length>0)throw U("symbol-keyed fields are unsupported");if(Array.isArray(d)){let p=Object.getPrototypeOf(d),y=0;for(;p!==null;){if(oe.isProxy(p))throw U("proxy array prototype");if(y+=1,y>re.depth)throw U("array prototype depth limit exceeded");p=Object.getPrototypeOf(p)}if(d.length>re.arrayLength)throw U("array length limit exceeded");for(let v=0;v<d.length;v+=1){let N=Object.getOwnPropertyDescriptor(d,String(v));if(!N||!Object.hasOwn(N,"value")||N.enumerable!==!0)throw U("array entries must be dense enumerable own data")}let S=0;for(let v in d){if(i+=1,i>re.fields)throw U("enumeration limit exceeded");if(Object.hasOwn(d,v)&&(S+=1,S>d.length))throw U("named array fields are unsupported")}if(S!==d.length)throw U("array entries must be dense enumerable own data");a("[");for(let v=0;v<d.length;v+=1)v&&a(","),u(Object.getOwnPropertyDescriptor(d,String(v)).value,c+1);a("]");return}let f=Object.getPrototypeOf(d);if(f!==Object.prototype&&f!==null)throw U("non-plain object");let m=[];for(let p in d){if(i+=1,i>re.fields)throw U("enumeration limit exceeded");if(!Object.hasOwn(d,p))continue;if(o+=1,o>re.fields)throw U("field limit exceeded");let y=Object.getOwnPropertyDescriptor(d,p);if(!y||!Object.hasOwn(y,"value")||y.enumerable!==!0)throw U("object fields must be enumerable own data");m.push([p,y.value])}a("{");for(let p=0;p<m.length;p+=1)p&&a(","),a(l(m[p][0])),a(":"),u(m[p][1],c+1);a("}")}finally{s.delete(d)}};return u(e,0),t.join("")}function ks(e){let t=Object.create(null);if(e==null)return t;if(typeof e!="object"&&typeof e!="function")throw new TypeError("HTTP headers must be an object");if(oe.isProxy(e))throw new TypeError("HTTP headers must not be a proxy");if(Object.getOwnPropertySymbols(e).length>0)throw new TypeError("HTTP headers must not contain symbol fields");let n=new Set;for(let r of Object.keys(e)){if(!/^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/u.test(r))throw new TypeError("HTTP header names must be valid tokens");let o=r.toLowerCase();if(n.has(o))throw new TypeError("HTTP headers contain a duplicate canonical name");n.add(o);let i=Object.getOwnPropertyDescriptor(e,r);if(!i||!Object.hasOwn(i,"value"))throw new TypeError("HTTP headers must contain own data properties");let s=i.value;if(s==null||["object","function","symbol"].includes(typeof s))throw new TypeError("HTTP header values must be scalar");t[r]=String(s)}return t}function vs(){return Object.assign(Object.create(null),{Accept:"application/json"})}function As(e,t){if(!e)throw new Error(`HTTP redirect from ${t} missing Location`);let n=new URL(String(e),String(t));if(n.protocol!=="http:"&&n.protocol!=="https:")throw new Error(`HTTP redirect from ${t} used unsupported protocol ${n.protocol}`);return n.toString()}function Is(e,t){return new URL(String(e)).origin===new URL(String(t)).origin}function mt(e){if((typeof e!="object"||e===null)&&typeof e!="function")return`${typeof e}:${String(e)}`;let t=sr.get(e);return t||(t=ar,ar+=1,sr.set(e,t)),`reference:${t}`}function cr(e){if(!e||typeof e!="object"||Array.isArray(e)||!Object.hasOwn(e,"jsonrpc")||!Object.hasOwn(e,"method")||e.jsonrpc!=="2.0")return!1;let t=typeof e.method=="string"?e.method:"";return t?_s.has(t)||/^get[A-Z0-9_]/u.test(t)||/^is[A-Z0-9_]/u.test(t)||/^eth_get[A-Z0-9_]/u.test(t):!1}function lr(e,t){if(e==="GET"&&t==null)return!0;if(e!=="POST"||t==null)return!1;let n=t;if(typeof t=="string")try{n=JSON.parse(t)}catch{return!1}if(Array.isArray(n))return n.length>0&&n.every(cr);if(!n||typeof n!="object")return!1;if(Object.hasOwn(n,"jsonrpc")||Object.hasOwn(n,"method"))return cr(n);let r=Object.hasOwn(n,"type")?n.type:null;return typeof r=="string"&&Cs.has(r)&&(!Object.hasOwn(n,"action")||n.action==null)&&(!Object.hasOwn(n,"signature")||n.signature==null)&&(!Object.hasOwn(n,"nonce")||n.nonce==null)}function Os(e,t,n,r={},o=null){let i=ps("sha256"),s=(l,u)=>{let d=String(u);i.update(String(Buffer.byteLength(l,"utf8"))).update(":").update(l),i.update("=").update(String(Buffer.byteLength(d,"utf8"))).update(":").update(d).update(`
|
|
3
|
-
`)};s("method",e),s("url",t),Object.keys(n||{}).map((l,u)=>({name:l.toLowerCase(),order:u,value:String(n[l])})).sort((l,u)=>l.name.localeCompare(u.name)||l.order-u.order).forEach((l,u)=>{s(`header-name-${u}`,l.name),s(`header-value-${u}`,l.value)}),s("body",o??"-");for(let l of["untrustedUrl","maxResponseBytes","sameOriginRedirectsOnly","redirectPolicy","maxRedirects","timeoutMs","retries","fetchImpl","realFetch","lookupFn","importUndici","validateResponse"])s(`context-${l}`,r[l]??"-");return i.digest("hex")}function Ns(e,t){let n=Number(t);return Number.isFinite(n)&&n>0?Math.min(n*1e3,rr):Math.min(250*2**e,rr)+Math.floor(Math.random()*100)}function ue(e,t={}){let n=new Error(e);return n.retryable=!1,Object.assign(n,t),n}function Jt(e,t,n){return ue(`HTTP response from ${e} exceeded maxResponseBytes ${n} (${t})`,{oversize:!0})}function ge(e){try{let t=e?.body?.cancel?.();t&&typeof t.then=="function"&&t.catch(()=>{})}catch{}}function $s(e){return e?e.byteLength??e.length??0:0}async function Ps(e,t,{url:n,truncate:r=!1,onOversize:o}={}){if(t==null)return await e.text();let i=Number(e.headers?.get?.("content-length"));if(Number.isFinite(i)&&i>t&&(ge(e),!r))throw Jt(n,`content-length ${i}`,t);let s=e.body?.getReader?.();if(!s){let c=await e.text(),f=Buffer.byteLength(c,"utf8");if(f>t){if(!r)throw Jt(n,`body ${f} bytes`,t);return Buffer.from(c,"utf8").subarray(0,t).toString("utf8")}return c}let a=[],l=0,u=!1;try{for(;;){let{value:c,done:f}=await s.read();if(f)break;if(c&&(a.push(Buffer.from(c)),l+=$s(c),l>t)){u=!0;break}}}finally{if(u)try{await s.cancel()}catch{}try{s.releaseLock?.()}catch{}}if(u&&(typeof o=="function"&&o(),!r))throw Jt(n,`streamed ${l} bytes`,t);let d=Buffer.concat(a);return(u?d.subarray(0,t):d).toString("utf8")}function Rs(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function Ls(e,{fetchImpl:t,method:n,headers:r,body:o,timeoutMs:i,lookupFn:s,realFetch:a,untrustedUrl:l=!1,maxResponseBytes:u=null,sameOriginRedirectsOnly:d=!1,importUndici:c,validateResponse:f,signal:m,redirectPolicy:p="follow",maxRedirects:y=ht}){let S=null,v=t,N=s?{lookupFn:s}:{};if(l&&!a&&!Gt(v))throw ue(`HTTP refused ${e}: untrustedUrl requires a pin-capable fetchImpl (see markPinCapableFetch in egress-guard.mjs) or no fetchImpl override so Oracle can pin the connection itself`);let E=new AbortController,h=setTimeout(()=>E.abort(),i),x=m?ir?ir([m,E.signal]):m:E.signal,b=async(k,{status:C=null}={})=>{let T=await Vt(k,N);if(!T.ok)throw ue(C==null?`HTTP refused ${k}: ${T.error}`:`HTTP redirect to ${k} ${T.error}`,C==null?{}:{status:C});let L=new URL(k).hostname;if(a){if(S&&(await S.close(),S=null),!S)try{S=await Kt({requireUndici:!0,...c?{importUndici:c}:{}})}catch(w){throw ue(C==null?`HTTP refused ${k}: ${w?.message||w}`:`HTTP redirect to ${k} refused: ${w?.message||w}`,C==null?{}:{status:C})}S.pin(L,T.addresses),v=S.fetch}else er(v,L,T.addresses);return T};try{let k=String(e),C=Object.assign(Object.create(null),r||{});l&&await b(k);for(let T=0;T<=y;T+=1){let L=Object.assign(Object.create(null),{method:n,headers:C,body:o,signal:x,redirect:"manual",dispatcher:void 0}),w=await v(k,L);if((p==="error"||y===0)&&w.status>=300&&w.status<400)throw ge(w),ue(`HTTP ${w.status} ${n} redirect refused`,{status:w.status,redirectRefused:!0});if(Ss.has(w.status)){let M=d===!0&&n==="POST"&&[307,308].includes(w.status)&&lr(n,o);if(n!=="GET"&&n!=="HEAD"&&!M){ge(w);let F=new Error(`HTTP ${w.status} ${n} ${k} redirected non-idempotent request`);throw F.status=w.status,F}if(T===y)throw ge(w),ue(`HTTP ${w.status} ${n} redirect budget exhausted`,{status:w.status,redirectRefused:!0});let q=w.headers?.get?.("location"),K;try{K=As(q,k)}catch(F){throw ge(w),F}let W=!Is(K,k);if(ge(w),W&&n==="POST"){let F=new Error(`HTTP ${w.status} ${n} cross-origin redirect refused`);throw F.status=w.status,F}if(W&&d){let F=new Error(`HTTP ${w.status} ${n} cross-origin redirect refused`);throw F.status=w.status,F.retryable=!1,F}if(W&&(C=vs(C)),l)await b(K,{status:w.status});else if(W){let F=await Vt(K,N);if(!F.ok){let A=new Error(`HTTP redirect from ${k} ${F.error}`);throw A.status=w.status,A.retryable=!1,A}a&&F.addresses?.length&&(S||(S=await Kt(c?{importUndici:c}:{})),S&&(S.pin(new URL(K).hostname,F.addresses),v=S.fetch))}k=K;continue}if(typeof f=="function")try{await f(w,{url:k})}catch(M){throw ge(w),ue(M?.message||String(M))}let I=await Ps(w,u,{url:k,onOversize:()=>E.abort()}),B=Rs(I);if(!w.ok){let M=new Error(`HTTP ${w.status} ${n} ${k}`);throw M.status=w.status,M.retryAfter=w.headers?.get?.("retry-after")??null,M.body=B??I.slice(0,300),M}return B??I}throw new Error(`HTTP redirect loop for ${e}`)}catch(k){if(E.signal.aborted&&!We(m)){let C=k&&(typeof k=="object"||typeof k=="function")&&!oe.isProxy(k)?k:null,T=C?Object.getOwnPropertyDescriptor(C,"oversize"):null;if(!(T&&Object.hasOwn(T,"value")&&T.value===!0))try{if(!C)throw new TypeError("unsafe rejection");Object.defineProperties(C,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}})}catch{let w=new Error("HTTP request timed out");throw Object.defineProperties(w,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}}),w}}throw k}finally{clearTimeout(h),S&&await S.close()}}async function z(e,t={}){if(t!=null&&typeof t!="object"&&typeof t!="function")throw new TypeError("HTTP options must be an object");if(t!=null&&oe.isProxy(t))throw new TypeError("HTTP options must not be a proxy");let n=new Set(["body","dedupe","fetchImpl","headers","importUndici","lookupFn","maxRedirects","maxResponseBytes","method","redirectPolicy","retries","sameOriginRedirectsOnly","signal","timeoutMs","untrustedUrl","validateResponse"]);if(t!=null){if(Object.getOwnPropertySymbols(t).length>0)throw new TypeError("HTTP options contain unknown fields");for(let A of Object.getOwnPropertyNames(t)){let $=Object.getOwnPropertyDescriptor(t,A);if(!(A==="toJSON"&&$&&Object.hasOwn($,"value")&&$.value===void 0)){if(!n.has(A))throw new TypeError("HTTP options contain unknown fields");if(!$||!$.enumerable||!Object.hasOwn($,"value"))throw new TypeError("HTTP options must contain enumerable own data properties")}}}let r=A=>{if(t==null||!Object.hasOwn(t,A))return;let $=Object.getOwnPropertyDescriptor(t,A);if(!$||!Object.hasOwn($,"value"))throw new TypeError("HTTP options must contain own data properties");return $.value};if(typeof e!="string"||e.length===0||e.length>8192)throw new TypeError("HTTP URL must be a bounded string");let o=r("method");if(o!==void 0&&(typeof o!="string"||!/^[A-Za-z]+$/u.test(o)))throw new TypeError("HTTP method must be a string token");let i=r("timeoutMs");if(i!==void 0&&(!Number.isInteger(i)||i<1||i>12e4))throw new TypeError("HTTP timeoutMs must be a bounded integer");let s=r("retries");if(s!==void 0&&(!Number.isInteger(s)||s<0||s>10))throw new TypeError("HTTP retries must be a bounded integer");let a=r("redirectPolicy");if(a!==void 0&&a!=="follow"&&a!=="error")throw new TypeError('HTTP redirectPolicy must be "follow" or "error"');let l=r("maxRedirects");if(l!==void 0&&(!Number.isInteger(l)||l<0||l>ht))throw new TypeError(`HTTP maxRedirects must be an integer from 0 through ${ht}`);if(a==="error"&&l!==void 0&&l!==0)throw new TypeError('HTTP redirectPolicy "error" requires maxRedirects 0 when supplied');let u=a??"follow",d=u==="error"?0:l??ht;for(let A of["dedupe","untrustedUrl","sameOriginRedirectsOnly"]){let $=r(A);if($!==void 0&&typeof $!="boolean")throw new TypeError(`HTTP ${A} must be boolean`)}let c=r("maxResponseBytes");if(c!==void 0&&(!Number.isInteger(c)||c<1||c>64*1024*1024))throw new TypeError("HTTP maxResponseBytes must be a bounded integer");let f=r("signal");if(f!==void 0){if(oe.isProxy(f)||!(f instanceof AbortSignal))throw new TypeError("HTTP signal must be a native AbortSignal");try{We(f)}catch{throw new TypeError("HTTP signal must be a native AbortSignal")}}for(let A of["importUndici","lookupFn","validateResponse"]){let $=r(A);if($!==void 0&&typeof $!="function")throw new TypeError(`HTTP ${A} must be a function`)}let m=r("fetchImpl"),p=m||globalThis.fetch;if(typeof p!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let y=i??12e3,S=(o||"GET").toUpperCase(),v=r("headers"),N=ks(v),E=Object.assign(Object.create(null),N);Object.keys(E).some(A=>A.toLowerCase()==="accept")||(E.Accept="application/json");let h=r("body");h!=null&&typeof h!="string"&&(Object.keys(E).find($=>$.toLowerCase()==="content-type")||(E["Content-Type"]="application/json"),h=Es(h));let x=s??ms,b=r("lookupFn"),k=!m,C=r("untrustedUrl")===!0,T=r("sameOriginRedirectsOnly")===!0,L=r("importUndici"),w=r("validateResponse"),I=f,B=c??null,M=async()=>{let A;for(let $=0;$<=x;$++){I&&gs.call(I);let st=pt("http");try{let ne=await Ls(e,{fetchImpl:p,method:S,headers:E,body:h,timeoutMs:y,lookupFn:b,realFetch:k,untrustedUrl:C,maxResponseBytes:B,sameOriginRedirectsOnly:T,importUndici:L,validateResponse:w,signal:I,redirectPolicy:u,maxRedirects:d});return st?.("succeeded"),ne}catch(ne){A=ne;let Ie=Dt=>{if(!ne||typeof ne!="object"&&typeof ne!="function"||oe.isProxy(ne))return;let Ve=Object.getOwnPropertyDescriptor(ne,Dt);return Ve&&Object.hasOwn(Ve,"value")?Ve.value:void 0},at=Ie("status");st?.("failed",at);let Xi=Ie("oracleTimeout")===!0||Ie("name")==="AbortError"||Ie("name")==="TimeoutError"||We(I),Qi=new Set([408,425,429]),Zi=Ie("retryable")===!1?!1:at!=null?Qi.has(at)||fs.has(at)&&nr.has(S):!Xi&&nr.has(S);if($===x||!Zi)throw ne;let Kn=Ns($,Ie("retryAfter")),es=pt("retry"),Wn=!1;try{I?await new Promise((Dt,Ve)=>{let Gn,Ke=()=>{clearTimeout(Gn),or.call(I,"abort",Ke),Ve(bs(I)||new DOMException("Aborted","AbortError"))};if(We(I)){Ke();return}Gn=setTimeout(()=>{or.call(I,"abort",Ke),Dt()},Kn),ws.call(I,"abort",Ke,{once:!0}),We(I)&&Ke()}):await Ts(Kn),Wn=!0}finally{es?.(Wn?"succeeded":"failed")}}}throw A};if(!(r("dedupe")!==!1&&!I&&lr(S,h)))return M();let K=Os(S,e,E,{untrustedUrl:C,maxResponseBytes:B,sameOriginRedirectsOnly:T,redirectPolicy:u,maxRedirects:d,timeoutMs:y,retries:x,fetchImpl:mt(p),realFetch:k,lookupFn:mt(b),importUndici:mt(L),validateResponse:mt(w)},h),W=Yt.get(K);if(W){let A=pt("shared");try{let $=await W;return A?.("succeeded"),$}catch($){throw A?.("failed"),$}}let F=M().finally(()=>Yt.delete(K));return Yt.set(K,F),F}async function yt(e){let t=Date.now();try{let n=await e();return{ok:!0,ms:Date.now()-t,data:n}}catch(n){return{ok:!1,ms:Date.now()-t,error:String(n.message||n),status:n.status??null}}}async function Ge(e,t,n){let r=Array.from(e),o=Math.max(1,Math.min(Number(t)||1,r.length||1)),i=new Array(r.length),s=0;return await Promise.all(Array.from({length:o},async()=>{for(;s<r.length;){let a=s++;i[a]=await n(r[a],a)}})),i}var fs,nr,ms,rr,hs,ys,gs,ws,or,ir,We,bs,Ss,ht,Gu,re,Yt,sr,ar,_s,Cs,Ts,V=_(()=>{Zn();tr();fs=new Set([408,425,429,500,502,503,504]),nr=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),ms=2,rr=4e3,hs=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"aborted")?.get,ys=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"reason")?.get,gs=AbortSignal.prototype.throwIfAborted,ws=EventTarget.prototype.addEventListener,or=EventTarget.prototype.removeEventListener,ir=typeof AbortSignal.any=="function"?AbortSignal.any.bind(AbortSignal):null,We=e=>e?hs.call(e):!1,bs=e=>e?ys.call(e):void 0,Ss=new Set([301,302,303,307,308]),ht=3,Gu=64*1024,re=Object.freeze({depth:32,nodes:1e4,fields:1e4,arrayLength:1e4,bytes:1024*1024});Yt=new Map,sr=new WeakMap,ar=1;_s=new Set(["eth_blockNumber","eth_call","eth_chainId","eth_estimateGas","getHealth","minimumLedgerSlot","net_version","simulateTransaction","web3_clientVersion"]),Cs=new Set(["allMids","l2Book","outcomeMeta","spotClearinghouseState","userFills","meta","metaAndAssetCtxs","perpDexs","candleSnapshot","fundingHistory","openOrders","frontendOpenOrders","clearinghouseState","spotMeta","validatorSummaries","delegatorSummary","delegations","delegatorRewards","delegatorHistory","maxBuilderFee"]);Ts=e=>new Promise(t=>setTimeout(t,e))});var Qt,mr=_(()=>{Qt={robinhood:{chainId:4663,name:"Robinhood Chain",rpcEnv:["RH_CHAIN_RPC"],evm:!0},ethereum:{chainId:1,name:"Ethereum",rpcEnv:["ETH_RPC_URL","ETHEREUM_RPC_URL","MAINNET_RPC_URL"],evm:!0},polygon:{chainId:137,name:"Polygon",rpcEnv:["POLYGON_RPC_URL","POLYGON_RPC"],evm:!0},arbitrum:{chainId:42161,name:"Arbitrum One",rpcEnv:["ARBITRUM_RPC_URL","ARB_RPC_URL"],evm:!0},base:{chainId:8453,name:"Base",rpcEnv:["BASE_RPC_URL"],evm:!0},hyperevm:{chainId:999,name:"HyperEVM",rpcEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],evm:!0},bsc:{chainId:56,name:"BNB Smart Chain",rpcEnv:["BSC_RPC_URL","BNB_RPC_URL"],evm:!0},avalanche:{chainId:43114,name:"Avalanche C-Chain",rpcEnv:["AVALANCHE_RPC_URL","AVAX_RPC_URL"],evm:!0},optimism:{chainId:10,name:"OP Mainnet",rpcEnv:["OPTIMISM_RPC_URL","OP_RPC_URL"],evm:!0},abstract:{chainId:2741,name:"Abstract",rpcEnv:["ABSTRACT_RPC_URL","ABS_RPC_URL"],evm:!0},stable:{chainId:988,name:"Stable Mainnet",rpcEnv:["STABLE_RPC_URL","STABLE_RPC"],evm:!0}}});function Zt(e){return qs.get(Number(e))||null}var qs,en=_(()=>{mr();qs=new Map(Object.values(Qt).map(e=>[e.chainId,e]))});import{Interface as js,getAddress as pd}from"ethers";var fd,Ce=_(()=>{V();en();fd=new js(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"])});var tn=_(()=>{});var wd,wt=_(()=>{V();tn();wd=Object.freeze({1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avalanche",999:"hyperevm",4663:"robinhood"})});var sn,an=_(()=>{sn=Object.freeze([{key:"ethereum",chainId:1,name:"Ethereum",rpcEnv:["ETH_RPC_URL","ETHEREUM_RPC_URL","MAINNET_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://etherscan.io",dexscreenerSlug:"ethereum",venueKind:"uniswap-v3",wrappedNative:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",stableQuoteAssets:["0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48","0xdAC17F958D2ee523a2206206994597C13D831ec7"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1908.71 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:1}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:1}}]},{key:"optimism",chainId:10,name:"OP Mainnet",rpcEnv:["OPTIMISM_RPC_URL","OP_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://optimistic.etherscan.io",dexscreenerSlug:"optimism",venueKind:"uniswap-v3",wrappedNative:"0x4200000000000000000000000000000000000006",stableQuoteAssets:["0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85","0x94b008aA00579c1307B0EF2c499aD98a8ce58e58"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1905.23 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:10}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:10}}]},{key:"bsc",chainId:56,name:"BNB Smart Chain",rpcEnv:["BSC_RPC_URL","BNB_RPC_URL"],nativeCurrency:{symbol:"BNB",decimals:18},explorer:"https://bscscan.com",dexscreenerSlug:"bsc",venueKind:"uniswap-v3",wrappedNative:"0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c",stableQuoteAssets:["0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d","0x55d398326f99059fF775485246999027B3197955"],venues:[{kind:"quoter",address:"0x78D78E420Da98ad378D7799bE8f4AF69033EB077",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WBNB->USDC fee 500 quoted 413.86 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:56}},{kind:"router",address:"0xB971eF87ede563556b2ED4b1C0b0019111Dd85d2",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:56}}]},{key:"polygon",chainId:137,name:"Polygon",rpcEnv:["POLYGON_RPC_URL","POLYGON_RPC"],nativeCurrency:{symbol:"POL",decimals:18},explorer:"https://polygonscan.com",dexscreenerSlug:"polygon",venueKind:"uniswap-v3",wrappedNative:"0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270",stableQuoteAssets:["0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359","0xc2132D05D31c914a87C6611C10748AEb04B58e8F"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WMATIC->USDC fee 500 quoted 0.0720 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:137}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:137}}]},{key:"stable",chainId:988,name:"Stable Mainnet",rpcEnv:["STABLE_RPC_URL","STABLE_RPC"],nativeCurrency:{symbol:"USDT0",decimals:18},venueKind:"uniswap-v3",wrappedNative:"0x5d442b349590a6048Eb2dC0eC346cAA5F47A9ab5",venues:[{kind:"quoter",address:"0xb070179E7032CdA868b53e6C1742F80c9e940d1A",label:"Uniswap V3 QuoterV2 (canonical)",verified:{method:"Stable is on the OFFICIAL Uniswap v3 Deployments List (governance-recognised 2026-05-12, UAC process completed 2026-04, deployed by Protofire), so this is a canonical deployment rather than a fork. eth_getCode returned 8273 bytes, the same size as the canonical quoter on the seven already-verified chains. Functional probe on a live pool (TOAST -> USDT0, fee 10000): 100 in -> 0.000003, 1000 -> 0.000031, 10000 -> 0.000319 USDT0. Output scales monotonically with input, which is a working quoter answering, not a revert. Two of three sampled pools carry non-zero liquidity. NOTE: the pools discovered so far are thin, so real routing size is limited -- the venue is proved, deep liquidity is not.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:988}},{kind:"router",address:"0x32eaf9B5d5F2CD7361c5012890C943D7de84C22a",label:"Uniswap SwapRouter02 (canonical)",verified:{method:"eth_getCode returned 24497 bytes. Cross-checked on-chain rather than trusted from docs: router.factory() returns 0x88f0a512ef09175d456bc9547f914f48c013e4aa, the same v3 core factory that created the pools quoted above, and router.WETH9() returns the wrappedNative recorded on this chain entry. Address published in the Stable docs DEX reference and the Uniswap deployments list.",source:"docs.stable.xyz/en/reference/dexes + on-chain factory()/WETH9() round-trip",date:"2026-08-05",chainId:988}}]},{key:"hyperevm",chainId:999,name:"HyperEVM",rpcEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],nativeCurrency:{symbol:"HYPE",decimals:18},dexscreenerSlug:"hyperevm",venueKind:"uniswap-v3",wrappedNative:"0x5555555555555555555555555555555555555555",venues:[{kind:"quoter",address:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",label:"HyperSwap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle(1 WHYPE -> USDT0) returned live output on all four fee tiers (100: 57.3385, 500: 57.4187, 3000: 57.3237, 10000: 56.1963 USDT0). Decimals read on-chain: WHYPE 18, USDT0 6. Best tier checked against an INDEPENDENT control the same minute -- Hyperliquid allMids put HYPE at 57.3205, so the pool is 0.171% from the perp mid, which is the right shape for fee plus impact rather than a wrong contract or a decimals bug.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:999}},{kind:"router",address:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D",label:"HyperSwap V3 SwapRouter",verified:{method:"eth_getCode returned 12070 bytes, and it is the router paired with the quoter proved above -- the same pair already shipped in UNI_V3_VENUES[999].hyperswap, which is the map the quote/prepare path actually routes through.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:999}}]},{key:"abstract",chainId:2741,name:"Abstract",rpcEnv:["ABSTRACT_RPC_URL","ABS_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},venueKind:"uniswap-v3",wrappedNative:"0x3439153EB7AF838Ad19d56E1571FBD09333C2809",venues:[{kind:"quoter",address:"0x728BD3eC25D5EDBafebB84F3d67367Cd9EBC7693",label:"Uniswap V3 QuoterV2 (Abstract deployment)",verified:{method:"Abstract is a ZK-stack chain, so CREATE2 addresses differ and the canonical Uniswap addresses are NOT valid here -- probing them returns codesize 0, which is what previously made this chain look like it had no V3 at all. Found the real deployment from live traffic instead: scanned recent Swap(...) logs, took the busiest pool, read pool.factory() = 0xa1160e73b63f322ae88cc2d8e700833e71d0b2a1, then enumerated that factory's deployer (0xf3d63166F0Ca56C3c1A3508FcE03Ff0Cf3Fb691e) and probed each of its 56 contracts with a real quoteExactInputSingle call. Exactly one answered: 1 WETH -> 1846.475731 USDC.e at fee 500. Independent sanity check: the pool's own slot0() spot price is 1873.11 USDC.e per WETH, so the quoter sits ~1.4% below spot, the right shape for fee plus price impact on this size.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:2741}},{kind:"router",address:"0x7712FA47387542819d4E35A23f8116C90C18767C",label:"Uniswap SwapRouter02 (Abstract deployment)",verified:{method:"eth_getCode returned 167392 bytes and the runtime contains the exactInputSingle selector. router.factory() matches the factory proved above and router.WETH9() matches the wrappedNative on this entry. Chosen over its byte-identical twin (0xfD6257F4...) because this is the address real users actually route through: it appeared as tx.to on live swaps against the WETH/USDC.e pool.",source:"on-chain factory()/WETH9() round-trip + live swap tx.to sampling",date:"2026-08-05",chainId:2741}}]},{key:"robinhood",chainId:4663,name:"Robinhood Chain",rpcEnv:["RH_CHAIN_RPC","ROBINHOOD_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},dexscreenerSlug:"robinhood",venueKind:"uniswap-v3",wrappedNative:"0x0bd7d308f8e1639fab988df18a8011f41eacad73",stableQuoteAssets:["0x5fc5360d0400a0fd4f2af552add042d716f1d168"],venues:[{kind:"quoter",address:"0x33e885ed0ec9bf04ecfb19341582aadcb4c8a9e7",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDG fee 100 quoted 1866.58 USDG, and USDG->CASHCAT fee 10000 quoted a live amount). A contract that correctly prices known pairs IS a working V3 quoter",source:"live eth_call against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}},{kind:"router",address:"0xcaf681a66d020601342297493863e78c959e5cb2",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode (24497 bytes) on this chain and the paired quoter at the same deployment passed a live functional quote",source:"live eth_getCode against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}},{kind:"factory",address:"0x1f7d7550b1b028f7571e69a784071f0205fd2efa",label:"Uniswap V3 Factory",verified:{method:"eth_getCode returned real bytecode (24535 bytes) and a PoolCreated log scan over this factory returned 76 pools in ~9000 recent blocks",source:"live eth_getLogs against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}}]},{key:"base",chainId:8453,name:"Base",rpcEnv:["BASE_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://basescan.org",dexscreenerSlug:"base",venueKind:"uniswap-v3",wrappedNative:"0x4200000000000000000000000000000000000006",stableQuoteAssets:["0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"],venues:[{kind:"quoter",address:"0x3d4e44Eb1374240CE5F1B871ab261CD16335B76a",label:"Uniswap V3 QuoterV2 (Base)",verified:{method:"functional probe: quoteExactInputSingle returned WETH->USDC at fee 500 = 1908.44 USDC, a live sane price. The canonical mainnet quoter address also has bytecode on Base but does NOT price this pair, which is exactly the false positive a codesize-only check accepts",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:8453}},{kind:"router",address:"0x2626664c2603336E57B271c5C0b26F421741e481",label:"Uniswap V3 SwapRouter02 (Base)",verified:{method:"eth_getCode returned real bytecode and the paired Base quoter passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:8453}},{kind:"router-v2",address:"0x4752ba5DBc23f44D87826276BF6Fd6b1C372aD24",label:"Uniswap V2 Router02 (Base)",verified:{method:"eth_getCode returned 17891 bytes; live getAmountsOut on WETH->USDC round-tripped to 98.75% (2x0.30% fee + impact)",source:"https://docs.uniswap.org/contracts/v2/reference/smart-contracts/v2-deployments",date:"2026-07-30",chainId:8453}}]},{key:"arbitrum",chainId:42161,name:"Arbitrum One",rpcEnv:["ARBITRUM_RPC_URL","ARB_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://arbiscan.io",dexscreenerSlug:"arbitrum",venueKind:"uniswap-v3",wrappedNative:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",stableQuoteAssets:["0xaf88d065e77c8cC2239327C5EDb3A432268e5831","0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1908.72 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:42161}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:42161}}]},{key:"avalanche",chainId:43114,name:"Avalanche C-Chain",rpcEnv:["AVALANCHE_RPC_URL","AVAX_RPC_URL"],nativeCurrency:{symbol:"AVAX",decimals:18},explorer:"https://snowtrace.io",dexscreenerSlug:"avalanche",venueKind:"uniswap-v3",wrappedNative:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",stableQuoteAssets:["0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"],venues:[{kind:"quoter",address:"0xbe0F5544EC67e9B3b2D979aaA43f18Fd87E6257F",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WAVAX->USDC fee 500 quoted 6.48 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:43114}},{kind:"router",address:"0xbb00FF08d01D300023C629E8fFfFcb65A5a578cE",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:43114}}]}])});var wr,un=_(()=>{wr=Object.freeze({1:"https://eth.blockscout.com",10:"https://explorer.optimism.io",137:"https://polygon.blockscout.com",324:"https://zksync.blockscout.com",8453:"https://base.blockscout.com",42161:"https://arbitrum.blockscout.com",534352:"https://scrollscan.com"})});import{createHash as Qs,createHmac as Zs,timingSafeEqual as rf}from"node:crypto";function dn(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(dn).join(",")}]`:`{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${dn(e[n])}`).join(",")}}`}function xr(e){let t=String(e?.ORACLE_STAMP_HMAC_SECRET||"").trim();return t.length>=16?t:""}function kr(e=process.env){return xr(process.env)||xr(e)}function na(e){let{prepareHash:t,prepareMac:n,note:r,...o}=e||{};return o}function vr(e){let t=na(e);return Qs("sha256").update(dn(t)).digest("hex")}function Ar(e,t=kr()){return t?Zs("sha256",t).update(String(e)).digest("hex"):""}function be(e,{provider:t,kind:n,env:r=process.env,nowMs:o=Date.now(),expiresAtMs:i}={}){if(!e||typeof e!="object")throw new Error("stampPrepared: payload object required");let s=Object.prototype.hasOwnProperty.call(e,"oraclePrepared");if(s&&typeof e.oraclePrepared!="boolean")throw new Error("stampPrepared: oraclePrepared must be boolean");let a={...e,provider:e.provider||t,kind:e.kind||n,requiresUserSignature:e.requiresUserSignature!==!1,signingReady:!1,broadcastReady:!1,executionReady:!1,oraclePrepared:s?e.oraclePrepared:!0};if(!a.provider)throw new Error("stampPrepared: provider required");if(!a.kind)throw new Error("stampPrepared: kind required");let l=Number(o),u=i==null?l+Er:Number(i),d=u-l;if(!Number.isSafeInteger(l)||!Number.isSafeInteger(u)||d<=0||d>ta)throw new Error("stampPrepared: bounded preparedAt/expiresAt required");let f={...a,preparedAt:l,expiresAt:u,prepareVersion:ea},m=vr(f),p=kr(r),y=p?Ar(m,p):void 0,S={...f,prepareHash:m};return y&&(S.prepareMac=y),S}var ea,Er,ta,pe=_(()=>{ea=2,Er=300*1e3,ta=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})()});function Se(e,t=160){return String(e??"").replace(/[\u0000-\u001f\u007f]/g," ").slice(0,t)}function mn(e){let t=Number(e);return Number.isFinite(t)?t:null}function $e(e,t={},n=process.env){let r=String(e||"").trim().toUpperCase().replace(/[^A-Z0-9]/g,"");if(!r)return[];let o=String(n[`ORACLE_OWNER_${r}`]||"").split(/[\s,;]+/).filter(Boolean),i=Array.isArray(t.owners)?t.owners.map(String):[];return[...new Set([...o,...i].map(s=>s.trim()).filter(Boolean))]}function Ga(e={}){let t=typeof e.heldCount=="string"&&/^\d+$/.test(e.heldCount)?e.heldCount:Number.isSafeInteger(Number(e.heldCount))?String(Number(e.heldCount)):"unknown",n=mn(e.fromFloor),r=mn(e.floor),o=mn(e.changePct),i=Se(e.currency||"unknown",16);return`ORACLE NFT \u2014 YOUR BAG IS PUMPING
|
|
3
|
+
`)};s("method",e),s("url",t),Object.keys(n||{}).map((l,u)=>({name:l.toLowerCase(),order:u,value:String(n[l])})).sort((l,u)=>l.name.localeCompare(u.name)||l.order-u.order).forEach((l,u)=>{s(`header-name-${u}`,l.name),s(`header-value-${u}`,l.value)}),s("body",o??"-");for(let l of["untrustedUrl","maxResponseBytes","sameOriginRedirectsOnly","redirectPolicy","maxRedirects","timeoutMs","retries","fetchImpl","realFetch","lookupFn","importUndici","validateResponse"])s(`context-${l}`,r[l]??"-");return i.digest("hex")}function Ns(e,t){let n=Number(t);return Number.isFinite(n)&&n>0?Math.min(n*1e3,rr):Math.min(250*2**e,rr)+Math.floor(Math.random()*100)}function ue(e,t={}){let n=new Error(e);return n.retryable=!1,Object.assign(n,t),n}function Jt(e,t,n){return ue(`HTTP response from ${e} exceeded maxResponseBytes ${n} (${t})`,{oversize:!0})}function ge(e){try{let t=e?.body?.cancel?.();t&&typeof t.then=="function"&&t.catch(()=>{})}catch{}}function $s(e){return e?e.byteLength??e.length??0:0}async function Ps(e,t,{url:n,truncate:r=!1,onOversize:o}={}){if(t==null)return await e.text();let i=Number(e.headers?.get?.("content-length"));if(Number.isFinite(i)&&i>t&&(ge(e),!r))throw Jt(n,`content-length ${i}`,t);let s=e.body?.getReader?.();if(!s){let c=await e.text(),f=Buffer.byteLength(c,"utf8");if(f>t){if(!r)throw Jt(n,`body ${f} bytes`,t);return Buffer.from(c,"utf8").subarray(0,t).toString("utf8")}return c}let a=[],l=0,u=!1;try{for(;;){let{value:c,done:f}=await s.read();if(f)break;if(c&&(a.push(Buffer.from(c)),l+=$s(c),l>t)){u=!0;break}}}finally{if(u)try{await s.cancel()}catch{}try{s.releaseLock?.()}catch{}}if(u&&(typeof o=="function"&&o(),!r))throw Jt(n,`streamed ${l} bytes`,t);let d=Buffer.concat(a);return(u?d.subarray(0,t):d).toString("utf8")}function Rs(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function Ls(e,{fetchImpl:t,method:n,headers:r,body:o,timeoutMs:i,lookupFn:s,realFetch:a,untrustedUrl:l=!1,maxResponseBytes:u=null,sameOriginRedirectsOnly:d=!1,importUndici:c,validateResponse:f,signal:m,redirectPolicy:p="follow",maxRedirects:y=ht}){let S=null,v=t,N=s?{lookupFn:s}:{};if(l&&!a&&!Gt(v))throw ue(`HTTP refused ${e}: untrustedUrl requires a pin-capable fetchImpl (see markPinCapableFetch in egress-guard.mjs) or no fetchImpl override so Oracle can pin the connection itself`);let E=new AbortController,h=setTimeout(()=>E.abort(),i),x=m?ir?ir([m,E.signal]):m:E.signal,b=async(k,{status:C=null}={})=>{let T=await Vt(k,N);if(!T.ok)throw ue(C==null?`HTTP refused ${k}: ${T.error}`:`HTTP redirect to ${k} ${T.error}`,C==null?{}:{status:C});let L=new URL(k).hostname;if(a){if(S&&(await S.close(),S=null),!S)try{S=await Kt({requireUndici:!0,...c?{importUndici:c}:{}})}catch(w){throw ue(C==null?`HTTP refused ${k}: ${w?.message||w}`:`HTTP redirect to ${k} refused: ${w?.message||w}`,C==null?{}:{status:C})}S.pin(L,T.addresses),v=S.fetch}else er(v,L,T.addresses);return T};try{let k=String(e),C=Object.assign(Object.create(null),r||{});l&&await b(k);for(let T=0;T<=y;T+=1){let L=Object.assign(Object.create(null),{method:n,headers:C,body:o,signal:x,redirect:"manual",dispatcher:void 0}),w=await v(k,L);if((p==="error"||y===0)&&w.status>=300&&w.status<400)throw ge(w),ue(`HTTP ${w.status} ${n} redirect refused`,{status:w.status,redirectRefused:!0});if(Ss.has(w.status)){let M=d===!0&&n==="POST"&&[307,308].includes(w.status)&&lr(n,o);if(n!=="GET"&&n!=="HEAD"&&!M){ge(w);let F=new Error(`HTTP ${w.status} ${n} ${k} redirected non-idempotent request`);throw F.status=w.status,F}if(T===y)throw ge(w),ue(`HTTP ${w.status} ${n} redirect budget exhausted`,{status:w.status,redirectRefused:!0});let q=w.headers?.get?.("location"),K;try{K=As(q,k)}catch(F){throw ge(w),F}let W=!Is(K,k);if(ge(w),W&&n==="POST"){let F=new Error(`HTTP ${w.status} ${n} cross-origin redirect refused`);throw F.status=w.status,F}if(W&&d){let F=new Error(`HTTP ${w.status} ${n} cross-origin redirect refused`);throw F.status=w.status,F.retryable=!1,F}if(W&&(C=vs(C)),l)await b(K,{status:w.status});else if(W){let F=await Vt(K,N);if(!F.ok){let A=new Error(`HTTP redirect from ${k} ${F.error}`);throw A.status=w.status,A.retryable=!1,A}a&&F.addresses?.length&&(S||(S=await Kt(c?{importUndici:c}:{})),S&&(S.pin(new URL(K).hostname,F.addresses),v=S.fetch))}k=K;continue}if(typeof f=="function")try{await f(w,{url:k})}catch(M){throw ge(w),ue(M?.message||String(M))}let I=await Ps(w,u,{url:k,onOversize:()=>E.abort()}),B=Rs(I);if(!w.ok){let M=new Error(`HTTP ${w.status} ${n} ${k}`);throw M.status=w.status,M.retryAfter=w.headers?.get?.("retry-after")??null,M.body=B??I.slice(0,300),M}return B??I}throw new Error(`HTTP redirect loop for ${e}`)}catch(k){if(E.signal.aborted&&!We(m)){let C=k&&(typeof k=="object"||typeof k=="function")&&!oe.isProxy(k)?k:null,T=C?Object.getOwnPropertyDescriptor(C,"oversize"):null;if(!(T&&Object.hasOwn(T,"value")&&T.value===!0))try{if(!C)throw new TypeError("unsafe rejection");Object.defineProperties(C,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}})}catch{let w=new Error("HTTP request timed out");throw Object.defineProperties(w,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}}),w}}throw k}finally{clearTimeout(h),S&&await S.close()}}async function z(e,t={}){if(t!=null&&typeof t!="object"&&typeof t!="function")throw new TypeError("HTTP options must be an object");if(t!=null&&oe.isProxy(t))throw new TypeError("HTTP options must not be a proxy");let n=new Set(["body","dedupe","fetchImpl","headers","importUndici","lookupFn","maxRedirects","maxResponseBytes","method","redirectPolicy","retries","sameOriginRedirectsOnly","signal","timeoutMs","untrustedUrl","validateResponse"]);if(t!=null){if(Object.getOwnPropertySymbols(t).length>0)throw new TypeError("HTTP options contain unknown fields");for(let A of Object.getOwnPropertyNames(t)){let $=Object.getOwnPropertyDescriptor(t,A);if(!(A==="toJSON"&&$&&Object.hasOwn($,"value")&&$.value===void 0)){if(!n.has(A))throw new TypeError("HTTP options contain unknown fields");if(!$||!$.enumerable||!Object.hasOwn($,"value"))throw new TypeError("HTTP options must contain enumerable own data properties")}}}let r=A=>{if(t==null||!Object.hasOwn(t,A))return;let $=Object.getOwnPropertyDescriptor(t,A);if(!$||!Object.hasOwn($,"value"))throw new TypeError("HTTP options must contain own data properties");return $.value};if(typeof e!="string"||e.length===0||e.length>8192)throw new TypeError("HTTP URL must be a bounded string");let o=r("method");if(o!==void 0&&(typeof o!="string"||!/^[A-Za-z]+$/u.test(o)))throw new TypeError("HTTP method must be a string token");let i=r("timeoutMs");if(i!==void 0&&(!Number.isInteger(i)||i<1||i>12e4))throw new TypeError("HTTP timeoutMs must be a bounded integer");let s=r("retries");if(s!==void 0&&(!Number.isInteger(s)||s<0||s>10))throw new TypeError("HTTP retries must be a bounded integer");let a=r("redirectPolicy");if(a!==void 0&&a!=="follow"&&a!=="error")throw new TypeError('HTTP redirectPolicy must be "follow" or "error"');let l=r("maxRedirects");if(l!==void 0&&(!Number.isInteger(l)||l<0||l>ht))throw new TypeError(`HTTP maxRedirects must be an integer from 0 through ${ht}`);if(a==="error"&&l!==void 0&&l!==0)throw new TypeError('HTTP redirectPolicy "error" requires maxRedirects 0 when supplied');let u=a??"follow",d=u==="error"?0:l??ht;for(let A of["dedupe","untrustedUrl","sameOriginRedirectsOnly"]){let $=r(A);if($!==void 0&&typeof $!="boolean")throw new TypeError(`HTTP ${A} must be boolean`)}let c=r("maxResponseBytes");if(c!==void 0&&(!Number.isInteger(c)||c<1||c>64*1024*1024))throw new TypeError("HTTP maxResponseBytes must be a bounded integer");let f=r("signal");if(f!==void 0){if(oe.isProxy(f)||!(f instanceof AbortSignal))throw new TypeError("HTTP signal must be a native AbortSignal");try{We(f)}catch{throw new TypeError("HTTP signal must be a native AbortSignal")}}for(let A of["importUndici","lookupFn","validateResponse"]){let $=r(A);if($!==void 0&&typeof $!="function")throw new TypeError(`HTTP ${A} must be a function`)}let m=r("fetchImpl"),p=m||globalThis.fetch;if(typeof p!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let y=i??12e3,S=(o||"GET").toUpperCase(),v=r("headers"),N=ks(v),E=Object.assign(Object.create(null),N);Object.keys(E).some(A=>A.toLowerCase()==="accept")||(E.Accept="application/json");let h=r("body");h!=null&&typeof h!="string"&&(Object.keys(E).find($=>$.toLowerCase()==="content-type")||(E["Content-Type"]="application/json"),h=Es(h));let x=s??ms,b=r("lookupFn"),k=!m,C=r("untrustedUrl")===!0,T=r("sameOriginRedirectsOnly")===!0,L=r("importUndici"),w=r("validateResponse"),I=f,B=c??null,M=async()=>{let A;for(let $=0;$<=x;$++){I&&gs.call(I);let st=pt("http");try{let ne=await Ls(e,{fetchImpl:p,method:S,headers:E,body:h,timeoutMs:y,lookupFn:b,realFetch:k,untrustedUrl:C,maxResponseBytes:B,sameOriginRedirectsOnly:T,importUndici:L,validateResponse:w,signal:I,redirectPolicy:u,maxRedirects:d});return st?.("succeeded"),ne}catch(ne){A=ne;let Ie=Dt=>{if(!ne||typeof ne!="object"&&typeof ne!="function"||oe.isProxy(ne))return;let Ve=Object.getOwnPropertyDescriptor(ne,Dt);return Ve&&Object.hasOwn(Ve,"value")?Ve.value:void 0},at=Ie("status");st?.("failed",at);let Xi=Ie("oracleTimeout")===!0||Ie("name")==="AbortError"||Ie("name")==="TimeoutError"||We(I),Qi=new Set([408,425,429]),Zi=Ie("retryable")===!1?!1:at!=null?Qi.has(at)||fs.has(at)&&nr.has(S):!Xi&&nr.has(S);if($===x||!Zi)throw ne;let Kn=Ns($,Ie("retryAfter")),es=pt("retry"),Wn=!1;try{I?await new Promise((Dt,Ve)=>{let Gn,Ke=()=>{clearTimeout(Gn),or.call(I,"abort",Ke),Ve(bs(I)||new DOMException("Aborted","AbortError"))};if(We(I)){Ke();return}Gn=setTimeout(()=>{or.call(I,"abort",Ke),Dt()},Kn),ws.call(I,"abort",Ke,{once:!0}),We(I)&&Ke()}):await Ts(Kn),Wn=!0}finally{es?.(Wn?"succeeded":"failed")}}}throw A};if(!(r("dedupe")!==!1&&!I&&lr(S,h)))return M();let K=Os(S,e,E,{untrustedUrl:C,maxResponseBytes:B,sameOriginRedirectsOnly:T,redirectPolicy:u,maxRedirects:d,timeoutMs:y,retries:x,fetchImpl:mt(p),realFetch:k,lookupFn:mt(b),importUndici:mt(L),validateResponse:mt(w)},h),W=Yt.get(K);if(W){let A=pt("shared");try{let $=await W;return A?.("succeeded"),$}catch($){throw A?.("failed"),$}}let F=M().finally(()=>Yt.delete(K));return Yt.set(K,F),F}async function yt(e){let t=Date.now();try{let n=await e();return{ok:!0,ms:Date.now()-t,data:n}}catch(n){return{ok:!1,ms:Date.now()-t,error:String(n.message||n),status:n.status??null}}}async function Ge(e,t,n){let r=Array.from(e),o=Math.max(1,Math.min(Number(t)||1,r.length||1)),i=new Array(r.length),s=0;return await Promise.all(Array.from({length:o},async()=>{for(;s<r.length;){let a=s++;i[a]=await n(r[a],a)}})),i}var fs,nr,ms,rr,hs,ys,gs,ws,or,ir,We,bs,Ss,ht,Gu,re,Yt,sr,ar,_s,Cs,Ts,V=_(()=>{Zn();tr();fs=new Set([408,425,429,500,502,503,504]),nr=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),ms=2,rr=4e3,hs=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"aborted")?.get,ys=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"reason")?.get,gs=AbortSignal.prototype.throwIfAborted,ws=EventTarget.prototype.addEventListener,or=EventTarget.prototype.removeEventListener,ir=typeof AbortSignal.any=="function"?AbortSignal.any.bind(AbortSignal):null,We=e=>e?hs.call(e):!1,bs=e=>e?ys.call(e):void 0,Ss=new Set([301,302,303,307,308]),ht=3,Gu=64*1024,re=Object.freeze({depth:32,nodes:1e4,fields:1e4,arrayLength:1e4,bytes:1024*1024});Yt=new Map,sr=new WeakMap,ar=1;_s=new Set(["eth_blockNumber","eth_call","eth_chainId","eth_estimateGas","getHealth","minimumLedgerSlot","net_version","simulateTransaction","web3_clientVersion"]),Cs=new Set(["allMids","l2Book","outcomeMeta","spotClearinghouseState","userFills","meta","metaAndAssetCtxs","perpDexs","candleSnapshot","fundingHistory","openOrders","frontendOpenOrders","clearinghouseState","spotMeta","validatorSummaries","delegatorSummary","delegations","delegatorRewards","delegatorHistory","maxBuilderFee"]);Ts=e=>new Promise(t=>setTimeout(t,e))});var Qt,mr=_(()=>{Qt={robinhood:{chainId:4663,name:"Robinhood Chain",rpcEnv:["RH_CHAIN_RPC"],evm:!0},ethereum:{chainId:1,name:"Ethereum",rpcEnv:["ETH_RPC_URL","ETHEREUM_RPC_URL","MAINNET_RPC_URL"],evm:!0},polygon:{chainId:137,name:"Polygon",rpcEnv:["POLYGON_RPC_URL","POLYGON_RPC"],evm:!0},arbitrum:{chainId:42161,name:"Arbitrum One",rpcEnv:["ARBITRUM_RPC_URL","ARB_RPC_URL"],evm:!0},base:{chainId:8453,name:"Base",rpcEnv:["BASE_RPC_URL"],evm:!0},hyperevm:{chainId:999,name:"HyperEVM",rpcEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],evm:!0},bsc:{chainId:56,name:"BNB Smart Chain",rpcEnv:["BSC_RPC_URL","BNB_RPC_URL"],evm:!0},avalanche:{chainId:43114,name:"Avalanche C-Chain",rpcEnv:["AVALANCHE_RPC_URL","AVAX_RPC_URL"],evm:!0},optimism:{chainId:10,name:"OP Mainnet",rpcEnv:["OPTIMISM_RPC_URL","OP_RPC_URL"],evm:!0},abstract:{chainId:2741,name:"Abstract",rpcEnv:["ABSTRACT_RPC_URL","ABS_RPC_URL"],evm:!0},stable:{chainId:988,name:"Stable Mainnet",rpcEnv:["STABLE_RPC_URL","STABLE_RPC"],evm:!0},elysium:{chainId:1339,name:"Elysium",rpcEnv:["ELYSIUM_RPC_URL"],evm:!0,readOnly:!0}}});function Zt(e){return qs.get(Number(e))||null}var qs,en=_(()=>{mr();qs=new Map(Object.values(Qt).map(e=>[e.chainId,e]))});import{Interface as js,getAddress as pd}from"ethers";var fd,Ce=_(()=>{V();en();fd=new js(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"])});var tn=_(()=>{});var wd,wt=_(()=>{V();tn();wd=Object.freeze({1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avalanche",999:"hyperevm",4663:"robinhood"})});var sn,an=_(()=>{sn=Object.freeze([{key:"ethereum",chainId:1,name:"Ethereum",rpcEnv:["ETH_RPC_URL","ETHEREUM_RPC_URL","MAINNET_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://etherscan.io",dexscreenerSlug:"ethereum",venueKind:"uniswap-v3",wrappedNative:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",stableQuoteAssets:["0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48","0xdAC17F958D2ee523a2206206994597C13D831ec7"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1908.71 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:1}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:1}}]},{key:"optimism",chainId:10,name:"OP Mainnet",rpcEnv:["OPTIMISM_RPC_URL","OP_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://optimistic.etherscan.io",dexscreenerSlug:"optimism",venueKind:"uniswap-v3",wrappedNative:"0x4200000000000000000000000000000000000006",stableQuoteAssets:["0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85","0x94b008aA00579c1307B0EF2c499aD98a8ce58e58"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1905.23 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:10}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:10}}]},{key:"bsc",chainId:56,name:"BNB Smart Chain",rpcEnv:["BSC_RPC_URL","BNB_RPC_URL"],nativeCurrency:{symbol:"BNB",decimals:18},explorer:"https://bscscan.com",dexscreenerSlug:"bsc",venueKind:"uniswap-v3",wrappedNative:"0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c",stableQuoteAssets:["0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d","0x55d398326f99059fF775485246999027B3197955"],venues:[{kind:"quoter",address:"0x78D78E420Da98ad378D7799bE8f4AF69033EB077",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WBNB->USDC fee 500 quoted 413.86 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:56}},{kind:"router",address:"0xB971eF87ede563556b2ED4b1C0b0019111Dd85d2",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:56}}]},{key:"polygon",chainId:137,name:"Polygon",rpcEnv:["POLYGON_RPC_URL","POLYGON_RPC"],nativeCurrency:{symbol:"POL",decimals:18},explorer:"https://polygonscan.com",dexscreenerSlug:"polygon",venueKind:"uniswap-v3",wrappedNative:"0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270",stableQuoteAssets:["0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359","0xc2132D05D31c914a87C6611C10748AEb04B58e8F"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WMATIC->USDC fee 500 quoted 0.0720 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:137}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:137}}]},{key:"stable",chainId:988,name:"Stable Mainnet",rpcEnv:["STABLE_RPC_URL","STABLE_RPC"],nativeCurrency:{symbol:"USDT0",decimals:18},venueKind:"uniswap-v3",wrappedNative:"0x5d442b349590a6048Eb2dC0eC346cAA5F47A9ab5",venues:[{kind:"quoter",address:"0xb070179E7032CdA868b53e6C1742F80c9e940d1A",label:"Uniswap V3 QuoterV2 (canonical)",verified:{method:"Stable is on the OFFICIAL Uniswap v3 Deployments List (governance-recognised 2026-05-12, UAC process completed 2026-04, deployed by Protofire), so this is a canonical deployment rather than a fork. eth_getCode returned 8273 bytes, the same size as the canonical quoter on the seven already-verified chains. Functional probe on a live pool (TOAST -> USDT0, fee 10000): 100 in -> 0.000003, 1000 -> 0.000031, 10000 -> 0.000319 USDT0. Output scales monotonically with input, which is a working quoter answering, not a revert. Two of three sampled pools carry non-zero liquidity. NOTE: the pools discovered so far are thin, so real routing size is limited -- the venue is proved, deep liquidity is not.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:988}},{kind:"router",address:"0x32eaf9B5d5F2CD7361c5012890C943D7de84C22a",label:"Uniswap SwapRouter02 (canonical)",verified:{method:"eth_getCode returned 24497 bytes. Cross-checked on-chain rather than trusted from docs: router.factory() returns 0x88f0a512ef09175d456bc9547f914f48c013e4aa, the same v3 core factory that created the pools quoted above, and router.WETH9() returns the wrappedNative recorded on this chain entry. Address published in the Stable docs DEX reference and the Uniswap deployments list.",source:"docs.stable.xyz/en/reference/dexes + on-chain factory()/WETH9() round-trip",date:"2026-08-05",chainId:988}}]},{key:"hyperevm",chainId:999,name:"HyperEVM",rpcEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],nativeCurrency:{symbol:"HYPE",decimals:18},dexscreenerSlug:"hyperevm",venueKind:"uniswap-v3",wrappedNative:"0x5555555555555555555555555555555555555555",venues:[{kind:"quoter",address:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",label:"HyperSwap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle(1 WHYPE -> USDT0) returned live output on all four fee tiers (100: 57.3385, 500: 57.4187, 3000: 57.3237, 10000: 56.1963 USDT0). Decimals read on-chain: WHYPE 18, USDT0 6. Best tier checked against an INDEPENDENT control the same minute -- Hyperliquid allMids put HYPE at 57.3205, so the pool is 0.171% from the perp mid, which is the right shape for fee plus impact rather than a wrong contract or a decimals bug.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:999}},{kind:"router",address:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D",label:"HyperSwap V3 SwapRouter",verified:{method:"eth_getCode returned 12070 bytes, and it is the router paired with the quoter proved above -- the same pair already shipped in UNI_V3_VENUES[999].hyperswap, which is the map the quote/prepare path actually routes through.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:999}}]},{key:"abstract",chainId:2741,name:"Abstract",rpcEnv:["ABSTRACT_RPC_URL","ABS_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},venueKind:"uniswap-v3",wrappedNative:"0x3439153EB7AF838Ad19d56E1571FBD09333C2809",venues:[{kind:"quoter",address:"0x728BD3eC25D5EDBafebB84F3d67367Cd9EBC7693",label:"Uniswap V3 QuoterV2 (Abstract deployment)",verified:{method:"Abstract is a ZK-stack chain, so CREATE2 addresses differ and the canonical Uniswap addresses are NOT valid here -- probing them returns codesize 0, which is what previously made this chain look like it had no V3 at all. Found the real deployment from live traffic instead: scanned recent Swap(...) logs, took the busiest pool, read pool.factory() = 0xa1160e73b63f322ae88cc2d8e700833e71d0b2a1, then enumerated that factory's deployer (0xf3d63166F0Ca56C3c1A3508FcE03Ff0Cf3Fb691e) and probed each of its 56 contracts with a real quoteExactInputSingle call. Exactly one answered: 1 WETH -> 1846.475731 USDC.e at fee 500. Independent sanity check: the pool's own slot0() spot price is 1873.11 USDC.e per WETH, so the quoter sits ~1.4% below spot, the right shape for fee plus price impact on this size.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:2741}},{kind:"router",address:"0x7712FA47387542819d4E35A23f8116C90C18767C",label:"Uniswap SwapRouter02 (Abstract deployment)",verified:{method:"eth_getCode returned 167392 bytes and the runtime contains the exactInputSingle selector. router.factory() matches the factory proved above and router.WETH9() matches the wrappedNative on this entry. Chosen over its byte-identical twin (0xfD6257F4...) because this is the address real users actually route through: it appeared as tx.to on live swaps against the WETH/USDC.e pool.",source:"on-chain factory()/WETH9() round-trip + live swap tx.to sampling",date:"2026-08-05",chainId:2741}}]},{key:"robinhood",chainId:4663,name:"Robinhood Chain",rpcEnv:["RH_CHAIN_RPC","ROBINHOOD_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},dexscreenerSlug:"robinhood",venueKind:"uniswap-v3",wrappedNative:"0x0bd7d308f8e1639fab988df18a8011f41eacad73",stableQuoteAssets:["0x5fc5360d0400a0fd4f2af552add042d716f1d168"],venues:[{kind:"quoter",address:"0x33e885ed0ec9bf04ecfb19341582aadcb4c8a9e7",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDG fee 100 quoted 1866.58 USDG, and USDG->CASHCAT fee 10000 quoted a live amount). A contract that correctly prices known pairs IS a working V3 quoter",source:"live eth_call against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}},{kind:"router",address:"0xcaf681a66d020601342297493863e78c959e5cb2",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode (24497 bytes) on this chain and the paired quoter at the same deployment passed a live functional quote",source:"live eth_getCode against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}},{kind:"factory",address:"0x1f7d7550b1b028f7571e69a784071f0205fd2efa",label:"Uniswap V3 Factory",verified:{method:"eth_getCode returned real bytecode (24535 bytes) and a PoolCreated log scan over this factory returned 76 pools in ~9000 recent blocks",source:"live eth_getLogs against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}}]},{key:"base",chainId:8453,name:"Base",rpcEnv:["BASE_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://basescan.org",dexscreenerSlug:"base",venueKind:"uniswap-v3",wrappedNative:"0x4200000000000000000000000000000000000006",stableQuoteAssets:["0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"],venues:[{kind:"quoter",address:"0x3d4e44Eb1374240CE5F1B871ab261CD16335B76a",label:"Uniswap V3 QuoterV2 (Base)",verified:{method:"functional probe: quoteExactInputSingle returned WETH->USDC at fee 500 = 1908.44 USDC, a live sane price. The canonical mainnet quoter address also has bytecode on Base but does NOT price this pair, which is exactly the false positive a codesize-only check accepts",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:8453}},{kind:"router",address:"0x2626664c2603336E57B271c5C0b26F421741e481",label:"Uniswap V3 SwapRouter02 (Base)",verified:{method:"eth_getCode returned real bytecode and the paired Base quoter passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:8453}},{kind:"router-v2",address:"0x4752ba5DBc23f44D87826276BF6Fd6b1C372aD24",label:"Uniswap V2 Router02 (Base)",verified:{method:"eth_getCode returned 17891 bytes; live getAmountsOut on WETH->USDC round-tripped to 98.75% (2x0.30% fee + impact)",source:"https://docs.uniswap.org/contracts/v2/reference/smart-contracts/v2-deployments",date:"2026-07-30",chainId:8453}}]},{key:"arbitrum",chainId:42161,name:"Arbitrum One",rpcEnv:["ARBITRUM_RPC_URL","ARB_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://arbiscan.io",dexscreenerSlug:"arbitrum",venueKind:"uniswap-v3",wrappedNative:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",stableQuoteAssets:["0xaf88d065e77c8cC2239327C5EDb3A432268e5831","0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1908.72 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:42161}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:42161}}]},{key:"avalanche",chainId:43114,name:"Avalanche C-Chain",rpcEnv:["AVALANCHE_RPC_URL","AVAX_RPC_URL"],nativeCurrency:{symbol:"AVAX",decimals:18},explorer:"https://snowtrace.io",dexscreenerSlug:"avalanche",venueKind:"uniswap-v3",wrappedNative:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",stableQuoteAssets:["0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"],venues:[{kind:"quoter",address:"0xbe0F5544EC67e9B3b2D979aaA43f18Fd87E6257F",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WAVAX->USDC fee 500 quoted 6.48 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:43114}},{kind:"router",address:"0xbb00FF08d01D300023C629E8fFfFcb65A5a578cE",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:43114}}]}])});var wr,un=_(()=>{wr=Object.freeze({1:"https://eth.blockscout.com",10:"https://explorer.optimism.io",137:"https://polygon.blockscout.com",324:"https://zksync.blockscout.com",8453:"https://base.blockscout.com",42161:"https://arbitrum.blockscout.com",534352:"https://scrollscan.com"})});import{createHash as Qs,createHmac as Zs,timingSafeEqual as rf}from"node:crypto";function dn(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(dn).join(",")}]`:`{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${dn(e[n])}`).join(",")}}`}function xr(e){let t=String(e?.ORACLE_STAMP_HMAC_SECRET||"").trim();return t.length>=16?t:""}function kr(e=process.env){return xr(process.env)||xr(e)}function na(e){let{prepareHash:t,prepareMac:n,note:r,...o}=e||{};return o}function vr(e){let t=na(e);return Qs("sha256").update(dn(t)).digest("hex")}function Ar(e,t=kr()){return t?Zs("sha256",t).update(String(e)).digest("hex"):""}function be(e,{provider:t,kind:n,env:r=process.env,nowMs:o=Date.now(),expiresAtMs:i}={}){if(!e||typeof e!="object")throw new Error("stampPrepared: payload object required");let s=Object.prototype.hasOwnProperty.call(e,"oraclePrepared");if(s&&typeof e.oraclePrepared!="boolean")throw new Error("stampPrepared: oraclePrepared must be boolean");let a={...e,provider:e.provider||t,kind:e.kind||n,requiresUserSignature:e.requiresUserSignature!==!1,signingReady:!1,broadcastReady:!1,executionReady:!1,oraclePrepared:s?e.oraclePrepared:!0};if(!a.provider)throw new Error("stampPrepared: provider required");if(!a.kind)throw new Error("stampPrepared: kind required");let l=Number(o),u=i==null?l+Er:Number(i),d=u-l;if(!Number.isSafeInteger(l)||!Number.isSafeInteger(u)||d<=0||d>ta)throw new Error("stampPrepared: bounded preparedAt/expiresAt required");let f={...a,preparedAt:l,expiresAt:u,prepareVersion:ea},m=vr(f),p=kr(r),y=p?Ar(m,p):void 0,S={...f,prepareHash:m};return y&&(S.prepareMac=y),S}var ea,Er,ta,pe=_(()=>{ea=2,Er=300*1e3,ta=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})()});function Se(e,t=160){return String(e??"").replace(/[\u0000-\u001f\u007f]/g," ").slice(0,t)}function mn(e){let t=Number(e);return Number.isFinite(t)?t:null}function $e(e,t={},n=process.env){let r=String(e||"").trim().toUpperCase().replace(/[^A-Z0-9]/g,"");if(!r)return[];let o=String(n[`ORACLE_OWNER_${r}`]||"").split(/[\s,;]+/).filter(Boolean),i=Array.isArray(t.owners)?t.owners.map(String):[];return[...new Set([...o,...i].map(s=>s.trim()).filter(Boolean))]}function Ga(e={}){let t=typeof e.heldCount=="string"&&/^\d+$/.test(e.heldCount)?e.heldCount:Number.isSafeInteger(Number(e.heldCount))?String(Number(e.heldCount)):"unknown",n=mn(e.fromFloor),r=mn(e.floor),o=mn(e.changePct),i=Se(e.currency||"unknown",16);return`ORACLE NFT \u2014 YOUR BAG IS PUMPING
|
|
4
4
|
|
|
5
5
|
${[`Collection: ${Se(e.name||e.slug||"Unknown")}`,`Chain: ${Se(e.chain||"unknown")}`,`You hold: ${t}`,`Floor: ${n??"unknown"} \u2192 ${r??"unknown"} ${i}`,`Move: ${o===null?"unknown":`+${o}%`}`,`Contract: ${Se(e.contract||"unknown",64)}`,"Evidence: provider-estimated floor; not an executable bid or guaranteed liquidation value."].join(`
|
|
6
6
|
`)}`}function qr(e=[],t=""){let n=(Array.isArray(e)?e:[]).filter(a=>typeof a?.notifyRecipient=="function");if(!n.length)return null;let r=String(t||"").trim().toLowerCase(),o=r?n.filter(a=>String(a.platform||"").toLowerCase()===r):[],i=n.filter(a=>a.platform==="telegram"),s=o.length?o:i.length?i:n;for(let a of s){let l=[...new Set((Array.isArray(a.ownerIds)?a.ownerIds:[]).map(d=>String(d).trim()).filter(Boolean))];if(l.length!==1)continue;let u=Se(String(a.platform||"").toLowerCase(),32);if(u)return Object.freeze({platform:u,recipientId:l[0],target:a})}return null}function jr(e){if(!e||typeof e.target?.notifyRecipient!="function")throw new TypeError("one recipient-bound notification subscription is required");let{target:t,recipientId:n}=e,r=Se(e.platform||t.platform||"unknown",32);return async function(i){let s=Ga(i);try{let a=Number(await t.notifyRecipient(n,s,i)),l=Number.isSafeInteger(a)&&a>0?1:0;return{delivered:l,recipient:{platform:r,id:n},error:l?null:"delivery-failed"}}catch{return{delivered:0,recipient:{platform:r,id:n},error:"delivery-failed"}}}}function Hr({watchdog:e,intervalMs:t=3e5,setIntervalFn:n=setInterval,clearIntervalFn:r=clearInterval,onError:o=i=>process.stderr.write(`oracle-gateway: held NFT watchdog failed: ${Se(i?.message||i,200)}
|
|
@@ -13,9 +13,9 @@ ${[`Collection: ${Se(e.name||e.slug||"Unknown")}`,`Chain: ${Se(e.chain||"unknown
|
|
|
13
13
|
`),buttons:null}}let a=i.verb==="approve"?"/ack":"/deny";if(!i.id)return{text:"Usage: /approve <id> (only when approve cards are not available)",buttons:null};let l=await xe(a,{method:"POST",body:{id:i.id,...o?{ownerProof:o}:{}},env:r});if(l.httpStatus===404||l.error==="no pending artifact")return{text:"Nothing pending with that id. It may have expired or already been decided.",buttons:null};if(l.ok===!1||l.httpStatus&&l.httpStatus>=400)return{text:`Local signer refused: ${l.error||"not running"}`,buttons:null};if(i.verb==="deny")return{text:`Denied ${l.id||i.id}. Artifact dropped. Nothing signed.`,buttons:null};let u=l.result?.hash||l.result?.txHash||l.result?.transactionHash||l.hash,d=l.id||i.id;return u?{text:`Bought. Local signer executed ${d}.
|
|
14
14
|
Tx: \`${u}\``,buttons:null,executed:!0,hash:u}:{text:`Local signer executed ${d}. Check the signer receipt if no hash was returned.`,buttons:null,executed:!0,result:l.result||null}}async function oo({platform:e,data:t,senderId:n,chatId:r,ownerProofAuthority:o,grant:i={local:!0},env:s=process.env}={}){let l=String(t||"").match(/^oracle:(approve|deny):([0-9a-fA-F]{4,64})$/i);if(!l)return null;let u=l[1].toLowerCase()==="approve"?"approve":"deny",d;if(u==="approve"&&o){let f=(await xe("/pending",{env:s})).items?.find(m=>m.id===l[2].toLowerCase()||m.digest===l[2].toLowerCase());if(!f)return{text:"Nothing pending with that id. It may have expired or already been decided.",buttons:null};d=o.mint({digest:f.digest,senderId:n,chatId:r,platform:e})}return An({platform:e,text:`/${u} ${l[2]}`,grant:i,env:s,ownerProof:d})}var In=_(()=>{_t();Nt();_t()});import{execFile as Cc}from"node:child_process";import{existsSync as Oc,mkdirSync as Nc,readFileSync as io,realpathSync as Tc,writeFileSync as $c}from"node:fs";import me from"node:path";import{promisify as Pc}from"node:util";import{fileURLToPath as so}from"node:url";function Fc(e=import.meta.url){try{let t=Tc(so(e)),n=`${me.sep}node_modules${me.sep}`,r=t.lastIndexOf(n);if(r>0)return{root:t.slice(0,r),managed:!0}}catch{}return{root:null,managed:!1}}function Cn(e=import.meta.url){try{let t=me.dirname(so(e));for(let n=0;n<8;n+=1){let r=me.join(t,"package.json");if(Oc(r)){let i=JSON.parse(io(r,"utf8"));if(i?.name===_n&&i.version)return i.version}let o=me.dirname(t);if(o===t)break;t=o}}catch{return null}return null}function Uc(e,t){let n=i=>String(i).replace(/^v/,"").split("-")[0].split(".").map(s=>Number.parseInt(s,10)||0),r=n(e),o=n(t);for(let i=0;i<Math.max(r.length,o.length);i+=1){let s=r[i]??0,a=o[i]??0;if(s>a)return 1;if(s<a)return-1}return 0}function ao(e){let t=e?.stateDir||me.join(process.env.HOME||".",".oracle");return me.join(t,"update-check.json")}function Bc(e){try{return JSON.parse(io(ao(e),"utf8"))}catch{return null}}function Dc(e,t){try{let n=ao(e);Nc(me.dirname(n),{recursive:!0}),$c(n,`${JSON.stringify(t,null,2)}
|
|
15
15
|
`)}catch{}}async function qc({timeoutMs:e=4e3}={}){try{let t=new AbortController,n=setTimeout(()=>t.abort(),e),r=await fetch(`${Lc}/${encodeURIComponent(_n)}/latest`,{signal:t.signal});return clearTimeout(n),r.ok&&(await r.json())?.version||null}catch{return null}}async function co({paths:e,force:t=!1,timeoutMs:n=4e3}={}){let r=Cn(),o=t?null:Bc(e),s=o&&Date.now()-(o.checkedAt||0)<Mc?o.latest:null;return s||(s=await qc({timeoutMs:n}),s&&Dc(e,{latest:s,checkedAt:Date.now()})),!r||!s?{current:r,latest:s,updateAvailable:!1,checked:!!s}:{current:r,latest:s,updateAvailable:Uc(s,r)>0,checked:!0}}async function lo({version:e="latest",dryRun:t=!1}={}){let{root:n,managed:r}=Fc();if(!r||!n)return{ok:!1,reason:"unmanaged",message:`oracle is not running from a resolvable node_modules tree (source checkout or linked dev install).
|
|
16
|
-
Update it the same way you installed it \u2014 git pull, or npm install -g @oracle-agent/oracle@latest.`};let o=`${_n}@${e}`,i=["install","--prefix",n,"--no-audit","--no-fund",o];if(t)return{ok:!0,dryRun:!0,root:n,command:`npm ${i.join(" ")}`};try{let{stdout:s,stderr:a}=await Rc("npm",i,{timeout:3e5,maxBuffer:16777216});return{ok:!0,root:n,stdout:s,stderr:a}}catch(s){return{ok:!1,reason:"npm-failed",root:n,message:s?.stderr||s?.message||"npm install failed"}}}var Rc,_n,Lc,Mc,uo=_(()=>{Rc=Pc(Cc),_n="@oracle-agent/oracle",Lc="https://registry.npmjs.org",Mc=1440*60*1e3});import jc from"node:fs";import Hc from"node:os";import po from"node:path";function Ue(e){return String(e||"").trim().toLowerCase().replace(/^\/+/,"").replace(/\s+/g,"-")}function zc(){let e=process.env.ORACLE_CONFIG_DIR||po.join(Hc.homedir(),".config","oracle");return po.join(e,"chains.json")}function Vc(e){if(!e||typeof e!="object")return null;let t=String(e.key??"").trim();if(!t||/[/\\.]/.test(t))return null;let n=Ue(t);if(!mo.test(n))return null;let r=typeof e.chainId=="string"?e.chainId.trim():Number(e.chainId);if(r===""||r===null||r===void 0||typeof r=="number"&&!Number.isFinite(r))return null;let o=typeof e.agent=="string"&&mo.test(e.agent.trim())?e.agent.trim():"oracle";return{key:n,aliases:Array.isArray(e.aliases)?e.aliases.map(Ue).filter(Boolean).slice(0,8):[],chainId:r,name:String(e.name||n).slice(0,60),kind:["evm","svm","utxo","venue","daml"].includes(e.kind)?e.kind:"evm",family:Ue(e.family)||n,agent:o,note:String(e.note||"user-defined").slice(0,80),build:e.build!==!1,source:"user"}}function Kc(e=jc.readFileSync){try{let t=JSON.parse(e(zc(),"utf8")),n=Array.isArray(t?.chains)?t.chains:[],r=[],o=new Set;for(let i of n){let s=Vc(i);!s||o.has(s.key)||(o.add(s.key),r.push(s))}return r}catch{return[]}}function ho(){let e=Kc();if(e.length===0)return fo;let t=new Map(fo.map(n=>[n.key,n]));for(let n of e)t.set(n.key,n);return[...t.values()]}function Wc({buildOnly:e=!1}={}){return ho().filter(t=>e?t.build:!0)}function Ze(e){let t=Ue(e);if(!t)return null;for(let n of ho())if(n.key===t||String(n.chainId).toLowerCase()===t||(n.aliases||[]).map(Ue).includes(t)||Ue(n.name)===t)return n;return null}function yo({selectedKey:e=null,buildOnly:t=!1}={}){let n=Wc({buildOnly:t}),r=["oracle chains","","pick a build/trade surface:",""];for(let o of n){let i=e&&e===o.key?"*":" ",s=String(o.chainId).padEnd(6),a=o.key.padEnd(12);r.push(`${i} ${a} ${s} ${o.note}`)}return r.push(""),r.push("usage:"),r.push(" /chain list"),r.push(" /chain hyperliquid select"),r.push(" /chain show current"),r.push(" /chain clear unset"),r.push(" oracle chain use base same from shell"),e&&r.push("",`active: ${e}`),r.join(`
|
|
16
|
+
Update it the same way you installed it \u2014 git pull, or npm install -g @oracle-agent/oracle@latest.`};let o=`${_n}@${e}`,i=["install","--prefix",n,"--no-audit","--no-fund",o];if(t)return{ok:!0,dryRun:!0,root:n,command:`npm ${i.join(" ")}`};try{let{stdout:s,stderr:a}=await Rc("npm",i,{timeout:3e5,maxBuffer:16777216});return{ok:!0,root:n,stdout:s,stderr:a}}catch(s){return{ok:!1,reason:"npm-failed",root:n,message:s?.stderr||s?.message||"npm install failed"}}}var Rc,_n,Lc,Mc,uo=_(()=>{Rc=Pc(Cc),_n="@oracle-agent/oracle",Lc="https://registry.npmjs.org",Mc=1440*60*1e3});import jc from"node:fs";import Hc from"node:os";import po from"node:path";function Ue(e){return String(e||"").trim().toLowerCase().replace(/^\/+/,"").replace(/\s+/g,"-")}function zc(){let e=process.env.ORACLE_CONFIG_DIR||po.join(Hc.homedir(),".config","oracle");return po.join(e,"chains.json")}function Vc(e){if(!e||typeof e!="object")return null;let t=String(e.key??"").trim();if(!t||/[/\\.]/.test(t))return null;let n=Ue(t);if(!mo.test(n))return null;let r=typeof e.chainId=="string"?e.chainId.trim():Number(e.chainId);if(r===""||r===null||r===void 0||typeof r=="number"&&!Number.isFinite(r))return null;let o=typeof e.agent=="string"&&mo.test(e.agent.trim())?e.agent.trim():"oracle";return{key:n,aliases:Array.isArray(e.aliases)?e.aliases.map(Ue).filter(Boolean).slice(0,8):[],chainId:r,name:String(e.name||n).slice(0,60),kind:["evm","svm","utxo","venue","daml","near"].includes(e.kind)?e.kind:"evm",family:Ue(e.family)||n,agent:o,note:String(e.note||"user-defined").slice(0,80),build:e.build!==!1,source:"user"}}function Kc(e=jc.readFileSync){try{let t=JSON.parse(e(zc(),"utf8")),n=Array.isArray(t?.chains)?t.chains:[],r=[],o=new Set;for(let i of n){let s=Vc(i);!s||o.has(s.key)||(o.add(s.key),r.push(s))}return r}catch{return[]}}function ho(){let e=Kc();if(e.length===0)return fo;let t=new Map(fo.map(n=>[n.key,n]));for(let n of e)t.set(n.key,n);return[...t.values()]}function Wc({buildOnly:e=!1}={}){return ho().filter(t=>e?t.build:!0)}function Ze(e){let t=Ue(e);if(!t)return null;for(let n of ho())if(n.key===t||String(n.chainId).toLowerCase()===t||(n.aliases||[]).map(Ue).includes(t)||Ue(n.name)===t)return n;return null}function yo({selectedKey:e=null,buildOnly:t=!1}={}){let n=Wc({buildOnly:t}),r=["oracle chains","","pick a build/trade surface:",""];for(let o of n){let i=e&&e===o.key?"*":" ",s=String(o.chainId).padEnd(6),a=o.key.padEnd(12);r.push(`${i} ${a} ${s} ${o.note}`)}return r.push(""),r.push("usage:"),r.push(" /chain list"),r.push(" /chain hyperliquid select"),r.push(" /chain show current"),r.push(" /chain clear unset"),r.push(" oracle chain use base same from shell"),e&&r.push("",`active: ${e}`),r.join(`
|
|
17
17
|
`)+`
|
|
18
|
-
`}var fo,mo,On=_(()=>{fo=Object.freeze([{key:"hyperliquid",aliases:["hl","hyperevm","hype","999"],chainId:999,name:"hyperliquid",kind:"evm",family:"hyperliquid",agent:"hyperliquid-agent",note:"perps \xB7 hip-3/4 \xB7 hyperevm 999",build:!0},{key:"ethereum",aliases:["eth","mainnet","1"],chainId:1,name:"ethereum",kind:"evm",family:"evm",agent:"oracle",note:"l1 \xB7 bridge hub",build:!0},{key:"base",aliases:["8453"],chainId:8453,name:"base",kind:"evm",family:"evm",agent:"oracle",note:"evm l2",build:!0},{key:"arbitrum",aliases:["arb","42161"],chainId:42161,name:"arbitrum",kind:"evm",family:"evm",agent:"oracle",note:"evm l2",build:!0},{key:"optimism",aliases:["op","10"],chainId:10,name:"optimism",kind:"evm",family:"evm",agent:"oracle",note:"op mainnet",build:!0},{key:"polygon",aliases:["matic","137"],chainId:137,name:"polygon",kind:"evm",family:"evm",agent:"oracle",note:"evm l2",build:!0},{key:"bsc",aliases:["bnb","56"],chainId:56,name:"bnb chain",kind:"evm",family:"evm",agent:"oracle",note:"bsc",build:!0},{key:"avalanche",aliases:["avax","43114"],chainId:43114,name:"avalanche",kind:"evm",family:"evm",agent:"oracle",note:"c-chain",build:!0},{key:"abstract",aliases:["abs","2741"],chainId:2741,name:"abstract",kind:"evm",family:"evm",agent:"oracle",note:"open / add agent",build:!0},{key:"stable",aliases:["988"],chainId:988,name:"stable",kind:"evm",family:"stable",agent:"stable-agent",note:"usdt0 gas \xB7 stable agent",build:!0},{key:"robinhood",aliases:["rh","4663"],chainId:4663,name:"robinhood",kind:"evm",family:"robinhood",agent:"robinhood-agent",note:"rh chain 4663",build:!0},{key:"solana",aliases:["sol"],chainId:"SOL",name:"solana",kind:"svm",family:"solana",agent:"solana-agent",note:"jup \xB7 nfts \xB7 dexs",build:!0},{key:"bitcoin",aliases:["btc"],chainId:"BTC",name:"bitcoin",kind:"utxo",family:"bitcoin",agent:"bitcoin-agent",note:"ord \xB7 runes \xB7 l1",build:!0},{key:"canton",aliases:["cc","canton-network","canton-coin","amulet"],chainId:"CC",name:"canton",kind:"daml",family:"canton",agent:"canton-agent",note:"cc reads \xB7 not evm",build:!0},{key:"polymarket",aliases:["poly","polygon-poly"],chainId:137,name:"polymarket",kind:"venue",family:"polymarket",agent:"polymarket-agent",note:"prediction markets (polygon venue)",build:!1}]);mo=/^[a-z0-9][a-z0-9-]*$/});import Nn from"node:fs";import Gc from"node:path";function go(){return Gc.join(ie(),"active-chain.json")}function Tn(){let e=go();if(!Nn.existsSync(e))return null;try{let t=JSON.parse(Nn.readFileSync(e,"utf8"));if(!t||typeof t!="object"||!t.key)return null;let n=Ze(t.key);return n?{key:n.key,chainId:n.chainId,name:n.name,agent:n.agent,selectedAt:t.selectedAt||null}:null}catch{return null}}function wo(e){let t=Ze(e);if(!t){let r=new Error(`unknown chain '${e}'`);throw r.code="UNKNOWN_CHAIN",r}vt(ie());let n={key:t.key,chainId:t.chainId,name:t.name,agent:t.agent,selectedAt:new Date().toISOString()};return Nn.writeFileSync(go(),JSON.stringify(n,null,2)+`
|
|
18
|
+
`}var fo,mo,On=_(()=>{fo=Object.freeze([{key:"hyperliquid",aliases:["hl","hyperevm","hype","999"],chainId:999,name:"hyperliquid",kind:"evm",family:"hyperliquid",agent:"hyperliquid-agent",note:"perps \xB7 hip-3/4 \xB7 hyperevm 999",build:!0},{key:"ethereum",aliases:["eth","mainnet","1"],chainId:1,name:"ethereum",kind:"evm",family:"evm",agent:"oracle",note:"l1 \xB7 bridge hub",build:!0},{key:"base",aliases:["8453"],chainId:8453,name:"base",kind:"evm",family:"evm",agent:"oracle",note:"evm l2",build:!0},{key:"arbitrum",aliases:["arb","42161"],chainId:42161,name:"arbitrum",kind:"evm",family:"evm",agent:"oracle",note:"evm l2",build:!0},{key:"optimism",aliases:["op","10"],chainId:10,name:"optimism",kind:"evm",family:"evm",agent:"oracle",note:"op mainnet",build:!0},{key:"polygon",aliases:["matic","137"],chainId:137,name:"polygon",kind:"evm",family:"evm",agent:"oracle",note:"evm l2",build:!0},{key:"bsc",aliases:["bnb","56"],chainId:56,name:"bnb chain",kind:"evm",family:"evm",agent:"oracle",note:"bsc",build:!0},{key:"avalanche",aliases:["avax","43114"],chainId:43114,name:"avalanche",kind:"evm",family:"evm",agent:"oracle",note:"c-chain",build:!0},{key:"abstract",aliases:["abs","2741"],chainId:2741,name:"abstract",kind:"evm",family:"evm",agent:"oracle",note:"open / add agent",build:!0},{key:"stable",aliases:["988"],chainId:988,name:"stable",kind:"evm",family:"stable",agent:"stable-agent",note:"usdt0 gas \xB7 stable agent",build:!0},{key:"robinhood",aliases:["rh","4663"],chainId:4663,name:"robinhood",kind:"evm",family:"robinhood",agent:"robinhood-agent",note:"rh chain 4663",build:!0},{key:"elysium",aliases:["elysium-chain","pyr","1339"],chainId:1339,name:"elysium",kind:"evm",family:"evm",agent:"oracle",note:"pyr gas \xB7 read-only (no venue)",build:!0},{key:"solana",aliases:["sol"],chainId:"SOL",name:"solana",kind:"svm",family:"solana",agent:"solana-agent",note:"jup \xB7 nfts \xB7 dexs",build:!0},{key:"bitcoin",aliases:["btc"],chainId:"BTC",name:"bitcoin",kind:"utxo",family:"bitcoin",agent:"bitcoin-agent",note:"ord \xB7 runes \xB7 l1",build:!0},{key:"canton",aliases:["cc","canton-network","canton-coin","amulet"],chainId:"CC",name:"canton",kind:"daml",family:"canton",agent:"canton-agent",note:"cc reads \xB7 not evm",build:!0},{key:"near",aliases:["near-protocol","near-mainnet"],chainId:"NEAR",name:"near",kind:"near",family:"near",agent:"near-agent",note:"account + nep-141 reads \xB7 not evm",build:!0},{key:"polymarket",aliases:["poly","polygon-poly"],chainId:137,name:"polymarket",kind:"venue",family:"polymarket",agent:"polymarket-agent",note:"prediction markets (polygon venue)",build:!1}]);mo=/^[a-z0-9][a-z0-9-]*$/});import Nn from"node:fs";import Gc from"node:path";function go(){return Gc.join(ie(),"active-chain.json")}function Tn(){let e=go();if(!Nn.existsSync(e))return null;try{let t=JSON.parse(Nn.readFileSync(e,"utf8"));if(!t||typeof t!="object"||!t.key)return null;let n=Ze(t.key);return n?{key:n.key,chainId:n.chainId,name:n.name,agent:n.agent,selectedAt:t.selectedAt||null}:null}catch{return null}}function wo(e){let t=Ze(e);if(!t){let r=new Error(`unknown chain '${e}'`);throw r.code="UNKNOWN_CHAIN",r}vt(ie());let n={key:t.key,chainId:t.chainId,name:t.name,agent:t.agent,selectedAt:new Date().toISOString()};return Nn.writeFileSync(go(),JSON.stringify(n,null,2)+`
|
|
19
19
|
`,{mode:384}),n}var bo=_(()=>{On();At()});var So=_(()=>{});function xo(e,{coin:t,side:n,sizeUsd:r,leverage:o,venue:i,confirm:s,user:a}={}){let l=Zr(e);if(!l)return null;if(t&&Yc.test(String(t).toUpperCase())&&l.searchParams.set("coin",String(t).toUpperCase()),(n==="long"||n==="short")&&l.searchParams.set("side",n),Number.isFinite(Number(r))&&Number(r)>=1&&l.searchParams.set("size",String(Math.min(1e5,Math.round(Number(r))))),Number.isInteger(Number(o))&&Number(o)>=1&&l.searchParams.set("lev",String(Math.min(50,Number(o)))),i){let u=String(i).toLowerCase()==="hl"?"hyperliquid":String(i).toLowerCase();l.searchParams.set("venue",u)}else l.searchParams.get("venue")||l.searchParams.set("venue","hyperliquid");return l.searchParams.set("view","perps"),l.searchParams.set("build","1"),s&&/^[0-9a-f]{32}$/i.test(String(s))&&l.searchParams.set("confirm",String(s).toLowerCase()),a&&/^0x[0-9a-fA-F]{40}$/.test(String(a))&&l.searchParams.set("user",String(a).toLowerCase()),l.toString()}var Yc,Eo=_(()=>{So();Ct();Ct();Yc=/^[A-Z0-9][A-Z0-9._-]{0,11}$/});var ko=_(()=>{});var vo=_(()=>{});var Ao=_(()=>{ko();vo()});import{AbiCoder as Jc,Interface as $n,getAddress as qh,isAddress as jh,keccak256 as Hh}from"ethers";var Gh,Io,Yh,Jh,Xh,Qh,Zh,_o=_(()=>{Ce();wt();Ao();pe();Gh=Jc.defaultAbiCoder(),Io={1:{name:"ethereum",poolManager:"0x000000000004444c5dc75cB358380D2e3dE08A90",quoter:"0x52f0e24d1c21c8a0cb1e5a5dd6198556bd9e1203",stateView:"0x7ffe42c4a5deea5b0fec41c94c136cf115597227",universalRouter:"0x66a9893cc07d91d95644aedd05d03f95e1dba8af",weth:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",usdc:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"},10:{name:"optimism",poolManager:"0x9a13f98cb987694c9f086b1f5eb990eea8264ec3",quoter:"0x1f3131a13296fb91c90870043742c3cdbff1a8d7",stateView:"0xc18a3169788f4f75a170290584eca6395c75ecdb",universalRouter:"0x851116d9223fabed8e56c0e6b8ad0c31d98b3507",weth:"0x4200000000000000000000000000000000000006",usdc:"0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85"},56:{name:"bsc",poolManager:"0x28e2ea090877bf75740558f6bfb36a5ffee9e9df",quoter:"0x9f75dd27d6664c475b90e105573e550ff69437b0",stateView:"0xd13dd3d6e93f276fafc9db9e6bb47c1180aee0c4",universalRouter:"0x1906c1d672b88cd1b9ac7593301ca990f94eae07",weth:"0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c",usdc:"0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d"},137:{name:"polygon",poolManager:"0x67366782805870060151383f4bbff9dab53e5cd6",quoter:"0xb3d5c3dfc3a7aebff71895a7191796bffc2c81b9",stateView:"0x5ea1bd7974c8a611cbab0bdcafcb1d9cc9b3ba5a",universalRouter:"0x1095692a6237d83c6a72f3f5efedb9a670c49223",weth:"0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270",usdc:"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359"},8453:{name:"base",poolManager:"0x498581fF718922c3f8e6A244956aF099B2652b2b",quoter:"0x0d5e0f971ed27fbff6c2837bf31316121532048d",stateView:"0xa3c0c9b65bad0b08107aa264b0f3db444b867a71",universalRouter:"0x6ff5693b99212da76ad316178a184ab56d299b43",weth:"0x4200000000000000000000000000000000000006",usdc:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"},42161:{name:"arbitrum",poolManager:"0x360e68faccca8ca495c1b759fd9eee466db9fb32",quoter:"0x3972c00f7ed4885e145823eb7c655375d275a1c5",stateView:"0x76fd297e2d437cd7f76d50f01afe6160f86e9990",universalRouter:"0xa51afafe0263b40edaef0df8781ea9aa03e381a3",weth:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",usdc:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},43114:{name:"avalanche",poolManager:"0x06380c0e0912312b5150364b9dc4542ba0dbbc85",quoter:"0xbe40675bb704506a3c2ccfb762dcfd1e979845c2",stateView:"0xc3c9e198c735a4b97e3e683f391ccbdd60b69286",universalRouter:"0x94b75331ae8d42c1b61065089b7d48fe14aa73b7",weth:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",usdc:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"},4663:{name:"robinhood",poolManager:"0x8366a39cc670b4001a1121b8f6a443a643e40951",quoter:"0x8dc178efb8111bb0973dd9d722ebeff267c98f94",stateView:"0xf3334192d15450cdd385c8b70e03f9a6bd9e673b",universalRouter:"0x8876789976dEcBfCbBbe364623C63652db8C0904",weth:"0x0bd7d308f8e1639fab988df18a8011f41eacad73",usdc:"0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168"}},Yh=new $n(["function quoteExactInputSingle(((address currency0,address currency1,uint24 fee,int24 tickSpacing,address hooks) poolKey,bool zeroForOne,uint128 exactAmount,bytes hookData) params) returns (uint256 amountOut, uint256 gasEstimate)","function quoteExactOutputSingle(((address currency0,address currency1,uint24 fee,int24 tickSpacing,address hooks) poolKey,bool zeroForOne,uint128 exactAmount,bytes hookData) params) returns (uint256 amountIn, uint256 gasEstimate)"]),Jh=new $n(["function execute(bytes commands,bytes[] inputs,uint256 deadline) payable"]),Xh=new $n(["function getSlot0(bytes32 poolId) view returns (uint160 sqrtPriceX96,int24 tick,uint24 protocolFee,uint24 lpFee)","function getLiquidity(bytes32 poolId) view returns (uint128 liquidity)"]),Qh=Object.freeze([[13,"beforeInitialize"],[12,"afterInitialize"],[11,"beforeAddLiquidity"],[10,"afterAddLiquidity"],[9,"beforeRemoveLiquidity"],[8,"afterRemoveLiquidity"],[7,"beforeSwap"],[6,"afterSwap"],[5,"beforeDonate"],[4,"afterDonate"],[3,"beforeSwapReturnsDelta"],[2,"afterSwapReturnsDelta"],[1,"afterAddLiquidityReturnsDelta"],[0,"afterRemoveLiquidityReturnsDelta"]]),Zh=(1n<<14n)-1n});import{AbiCoder as Xc,Interface as Qc,getAddress as Ro,isAddress as Zc}from"ethers";function R(e){throw new Error(`uniswap-v4-lp: ${e}`)}function ee(e,t){(e==null||e==="")&&R(`${t} address required`);let n=String(e);return Zc(n)||R(`${t} is not a valid address: ${n}`),Ro(n)}function H(e,t,{max:n=el,min:r=0n}={}){(e==null||e==="")&&R(`${t} required`);let o;try{o=typeof e=="bigint"?e:BigInt(String(e))}catch{R(`${t} must be an integer, got ${String(e)}`)}return o<r&&R(`${t} must be >= ${r}`),o>n&&R(`${t} exceeds ${t==="fee"?"uint24":n===Q?"uint128":"uint256"}`),o}function Po(e,t){let n=Number(e);return Number.isInteger(n)||R(`${t} must be an integer tick`),(n<Oo||n>No)&&R(`${t} ${n} outside [${Oo}, ${No}]`),n}function Tt(e){return e==null||e===""||String(e).toLowerCase()!=="0x"&&R("opaque hookData is inspect-only until a hook-specific adapter exists"),"0x"}function Fo(e={}){(!e||typeof e!="object")&&R("poolKey required");let t=e.currency0==null||e.currency0===""?he:ee(e.currency0,"poolKey.currency0"),n=ee(e.currency1,"poolKey.currency1");BigInt(t)>=BigInt(n)&&R("poolKey.currency0 must sort below currency1 (V4 PoolKey invariant); reordering would target a different pool");let r=Number(H(e.fee,"fee",{max:tl})),o=Number(e.tickSpacing);(!Number.isInteger(o)||o<=0||o>32767)&&R(`poolKey.tickSpacing must be a positive int16, got ${e.tickSpacing}`);let i=e.hooks==null||e.hooks===""?he:ee(e.hooks,"poolKey.hooks");return{currency0:t,currency1:n,fee:r,tickSpacing:o,hooks:i}}function Uo(e,t,n){let r=Po(e,"tickLower"),o=Po(t,"tickUpper");return r>=o&&R(`tickLower ${r} must be below tickUpper ${o}`),(r%n!==0||o%n!==0)&&R(`ticks must be multiples of tickSpacing ${n} (got ${r}, ${o})`),{tickLower:r,tickUpper:o}}function al(e){let t=Number(e);return(!Number.isSafeInteger(t)||t<=0)&&R("deadline (unix seconds) required"),t}function Bo(e){return`0x${e.map(t=>t.toString(16).padStart(2,"0")).join("")}`}function Z(e,t){return Lo.encode(sl[e],t)}function cl(e,t){return(!Array.isArray(e)||!Array.isArray(t)||e.length!==t.length||e.length===0)&&R("actions and params must be equal-length non-empty arrays"),Lo.encode(["bytes","bytes[]"],[Bo(e),t])}function $t({chainId:e,positionManager:t,actions:n,params:r,deadline:o,value:i,summary:s,extra:a={}}){let l=cl(n,r),u=Mo.encodeFunctionData("modifyLiquidities",[l,BigInt(o)]);return Object.freeze({chainId:Number(e),to:t,data:u,value:i.toString(),deadline:o,actions:n.map(d=>nl[d]),actionsHex:Bo(n),summary:s,...a})}function Pt(e){let t=Number(e.chainId);(!Number.isInteger(t)||t<=0)&&R("chainId required");let n=ee(e.positionManager,"positionManager");return{chainId:t,positionManager:n,deadline:al(e.deadline)}}function ll(e={}){let{chainId:t,positionManager:n,deadline:r}=Pt(e),o=Fo(e.poolKey),{tickLower:i,tickUpper:s}=Uo(e.tickLower,e.tickUpper,o.tickSpacing),a=H(e.liquidity,"liquidity");a===0n&&R("liquidity must be > 0 for mint");let l=H(e.amount0Max,"amount0Max",{max:Q}),u=H(e.amount1Max,"amount1Max",{max:Q}),d=ee(e.owner,"owner"),c=Tt(e.hookData),f=o.currency0===he,m=[J.MINT_POSITION,J.SETTLE_PAIR],p=[Z("MINT_POSITION",[o,i,s,a,l,u,d,c]),Z("SETTLE_PAIR",[o.currency0,o.currency1])];f&&(m.push(J.SWEEP),p.push(Z("SWEEP",[he,d])));let y=f?l:0n,S=`mint v4 LP ${o.currency0}/${o.currency1} fee ${o.fee} ticks [${i}, ${s}] liquidity ${a} (max ${l} / ${u}) to ${d}${f?" paying native value":""}${o.hooks!==he?` hooked ${o.hooks}`:""}`;return $t({chainId:t,positionManager:n,actions:m,params:p,deadline:r,value:y,summary:S,extra:{poolKey:o,tickLower:i,tickUpper:s,owner:d,requiresApproval:jo(o,{amount0Max:l,amount1Max:u})}})}function Do(e={}){let{chainId:t,positionManager:n,deadline:r}=Pt(e),o=H(e.tokenId,"tokenId"),i=H(e.liquidity,"liquidity"),s=H(e.amount0Min,"amount0Min",{max:Q}),a=H(e.amount1Min,"amount1Min",{max:Q}),{currency0:l,currency1:u}=qo(e),d=ee(e.recipient??e.owner,"recipient"),c=Tt(e.hookData),f=[J.DECREASE_LIQUIDITY,J.TAKE_PAIR],m=[Z("DECREASE_LIQUIDITY",[o,i,s,a,c]),Z("TAKE_PAIR",[l,u,d])],p=i===0n?`collect fees on v4 LP #${o} to ${d}`:`decrease v4 LP #${o} by ${i} liquidity (min ${s} / ${a}) to ${d}`;return $t({chainId:t,positionManager:n,actions:f,params:m,deadline:r,value:0n,summary:p,extra:{tokenId:o.toString(),recipient:d,currency0:l,currency1:u}})}function ul(e={}){return Do({...e,liquidity:0n,amount0Min:0n,amount1Min:0n})}function dl(e={}){let{chainId:t,positionManager:n,deadline:r}=Pt(e),o=H(e.tokenId,"tokenId"),i=H(e.amount0Min,"amount0Min",{max:Q}),s=H(e.amount1Min,"amount1Min",{max:Q}),{currency0:a,currency1:l}=qo(e),u=ee(e.recipient??e.owner,"recipient"),d=Tt(e.hookData),c=[J.BURN_POSITION,J.TAKE_PAIR],f=[Z("BURN_POSITION",[o,i,s,d]),Z("TAKE_PAIR",[a,l,u])];return $t({chainId:t,positionManager:n,actions:c,params:f,deadline:r,value:0n,summary:`burn v4 LP #${o} (min ${i} / ${s}) to ${u}`,extra:{tokenId:o.toString(),recipient:u,currency0:a,currency1:l}})}function pl(e={}){let{chainId:t,positionManager:n,deadline:r}=Pt(e),o=e.burn||{},i=e.mint||{},s=H(o.tokenId,"burn.tokenId"),a=H(o.amount0Min??0n,"burn.amount0Min",{max:Q}),l=H(o.amount1Min??0n,"burn.amount1Min",{max:Q}),u=Fo(i.poolKey);u.currency0===he&&R("rebalance refuses native currency pools: shortfall msg.value cannot be sized offline");let{tickLower:d,tickUpper:c}=Uo(i.tickLower,i.tickUpper,u.tickSpacing),f=H(i.liquidity,"mint.liquidity");f===0n&&R("mint.liquidity must be > 0 for rebalance");let m=H(i.amount0Max,"mint.amount0Max",{max:Q}),p=H(i.amount1Max,"mint.amount1Max",{max:Q}),y=ee(i.owner??e.owner,"owner"),S=Tt(i.hookData??o.hookData),v=[J.BURN_POSITION,J.MINT_POSITION,J.CLOSE_CURRENCY,J.CLOSE_CURRENCY],N=[Z("BURN_POSITION",[s,a,l,S]),Z("MINT_POSITION",[u,d,c,f,m,p,y,S]),Z("CLOSE_CURRENCY",[u.currency0]),Z("CLOSE_CURRENCY",[u.currency1])];return $t({chainId:t,positionManager:n,actions:v,params:N,deadline:r,value:0n,summary:`rebalance v4 LP: burn #${s} then mint ${u.currency0}/${u.currency1} fee ${u.fee} ticks [${d}, ${c}] liquidity ${f} (max ${m} / ${p}) to ${y}, one unlock`,extra:{burnTokenId:s.toString(),poolKey:u,tickLower:d,tickUpper:c,owner:y,requiresApproval:jo(u,{amount0Max:m,amount1Max:p})}})}function qo(e){let t=e.poolKey&&typeof e.poolKey=="object"?e.poolKey:e,n=t.currency0==null||t.currency0===""?he:ee(t.currency0,"currency0"),r=ee(t.currency1,"currency1");return BigInt(n)>=BigInt(r)&&R("currency0 must sort below currency1"),{currency0:n,currency1:r}}function jo(e,{amount0Max:t,amount1Max:n}){let r=[];return e.currency0!==he&&r.push({token:e.currency0,spender:Co,amount:t.toString()}),r.push({token:e.currency1,spender:Co,amount:n.toString()}),{note:"PositionManager settles ERC-20 debt via Permit2; token\u2192Permit2 approval and a Permit2 allowance for PositionManager are both required",approvals:r}}function Ho(e={},t={}){let n=t.chains||Io,r=Number(e.chainId);(!Number.isInteger(r)||r<=0)&&R("chainId required");let o=n[r];o||R(`unsupported chainId ${r} (supported: ${Object.keys(n).join(", ")})`),o.positionManager||R(`no v4 PositionManager registered for chain ${r} (${o.name||"unnamed"})`);let i=String(e.kind||"").toLowerCase(),s=fl[i];s||R(`unknown kind ${e.kind} (expected ${rl.join("|")})`);let a=Number(e.deadlineSec);(!Number.isInteger(a)||a<To||a>$o)&&R(`deadlineSec must be an integer from ${To} through ${$o}`);let u=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+a,d=e.params&&typeof e.params=="object"?e.params:{},c=s({...d,chainId:r,positionManager:Ro(o.positionManager),deadline:u}),f=e.from??d.owner??d.recipient??null,m=f?ee(f,"from"):null,p={...c},{to:y,data:S,value:v,summary:N,actions:E,actionsHex:h,requiresApproval:x=null}=c;for(let b of["to","data","value","summary","actions","actionsHex","requiresApproval","chainId","deadline"])delete p[b];return be({provider:"uniswap-v4-lp",kind:`univ4-lp-${i}`,lpKind:i,prepareReady:!0,calldataReady:!0,executionReady:!1,executionAllowed:!1,requiresUserSignature:!0,requiresWalletSignature:!0,backendSigner:!1,unsigned:!0,houseSigned:!1,signingReady:!1,broadcastReady:!1,simulate:null,chainId:r,chainName:o.name||null,deadline:u,summary:N,plan:{actions:E,actionsHex:h,selector:ol},detail:p,requiresApproval:x,transaction:{chainId:r,from:m,to:y,data:S,value:v},notes:["prepare-only: user wallet must sign","one modifyLiquidities unlock; Telegram never sends","action bytes verified against v4-periphery Actions.sol; simulate before signing"]},{provider:"uniswap-v4-lp",kind:`univ4-lp-${i}`,env:t.env,nowMs:t.nowMs})}var Lo,he,Co,Oo,No,Q,el,tl,To,$o,J,nl,rl,Mo,ol,il,sl,fl,zo=_(()=>{_o();pe();Lo=Xc.defaultAbiCoder(),he="0x0000000000000000000000000000000000000000",Co="0x000000000022D473030F116dDEE9F6B43aC78BA3",Oo=-887272,No=887272,Q=(1n<<128n)-1n,el=(1n<<256n)-1n,tl=(1n<<24n)-1n,To=30,$o=600,J=Object.freeze({INCREASE_LIQUIDITY:0,DECREASE_LIQUIDITY:1,MINT_POSITION:2,BURN_POSITION:3,SETTLE_PAIR:13,TAKE_PAIR:17,CLOSE_CURRENCY:18,SWEEP:20}),nl=Object.freeze(Object.fromEntries(Object.entries(J).map(([e,t])=>[t,e]))),rl=Object.freeze(["mint","decrease","collect","burn","rebalance"]),Mo=new Qc(["function modifyLiquidities(bytes unlockData, uint256 deadline) payable"]),ol=Mo.getFunction("modifyLiquidities").selector,il="tuple(address currency0,address currency1,uint24 fee,int24 tickSpacing,address hooks)",sl=Object.freeze({MINT_POSITION:Object.freeze([il,"int24","int24","uint256","uint128","uint128","address","bytes"]),INCREASE_LIQUIDITY:Object.freeze(["uint256","uint256","uint128","uint128","bytes"]),DECREASE_LIQUIDITY:Object.freeze(["uint256","uint256","uint128","uint128","bytes"]),BURN_POSITION:Object.freeze(["uint256","uint128","uint128","bytes"]),SETTLE_PAIR:Object.freeze(["address","address"]),TAKE_PAIR:Object.freeze(["address","address","address"]),CLOSE_CURRENCY:Object.freeze(["address"]),SWEEP:Object.freeze(["address","address"])});fl=Object.freeze({mint:ll,decrease:Do,collect:ul,burn:dl,rebalance:pl})});function Y(e){return e==null?!1:typeof e=="number"?Number.isFinite(e):typeof e=="string"?e.trim()!==""&&e.trim().toLowerCase()!==G:!0}function et(e,{estimate:t=!0,signed:n=!1}={}){if(!Y(e))return G;let r=Number(e);if(!Number.isFinite(r))return G;let o=Math.abs(r),i=o>=1e3?o.toLocaleString("en-US",{maximumFractionDigits:0}):o.toFixed(2),s=r<0?"-":n&&r>0?"+":"";return`${t?"~":""}${s}$${i}`}function Pn(e){if(!Y(e))return G;let t=Number(e);return Number.isFinite(t)?t===0?"0":t>=1e3?t.toLocaleString("en-US",{maximumFractionDigits:2}):t>=1?t.toFixed(4):t.toPrecision(4):G}function hl(e){if(!Y(e))return G;let t=Number(e);return Number.isFinite(t)?`${(t/1e4).toFixed(t%100===0?2:3)}%`:g(e)}function yl(e){let t={1:"Ethereum",10:"Optimism",56:"BSC",137:"Polygon",8453:"Base",42161:"Arbitrum",43114:"Avalanche",4663:"Robinhood"},n=Number(e);return Number.isInteger(n)?t[n]?`${t[n]} (${n})`:`chain ${n}`:G}function gl(e){if(!e||typeof e!="object")return`Decision: ${G}`;let t=Y(e.action)?String(e.action).toUpperCase():G,n=Y(e.mode)?String(e.mode):"alert_only",r=Y(e.reason)?g(e.reason):G;return`Decision: ${g(t)} (${g(n)}) \u2014 ${r}`}function Ko(e={}){let n=[`*LP ${Y(e.pair)?g(e.pair):G} \xB7 ${g(yl(e.chainId))}*`,`Net: ${et(e.netUsd,{signed:!0})}`,`Fees ${et(e.feesUsd)} \xB7 IL ${et(e.ilUsd)} \xB7 Gas ${et(e.gasUsd)} \xB7 Slip ${et(e.slippageUsd)}`,`Range: ${Pn(e.rangeLower)} \u2013 ${Pn(e.rangeUpper)} \xB7 now ${Pn(e.priceNow)} \xB7 ${typeof e.inRange=="boolean"?e.inRange?"IN range":"OUT of range":`range ${G}`}`,`Fee tier: ${hl(e.feeTier)}`,gl(e.decision)];(Y(e.source)||Y(e.observedAt))&&n.push(`Source: ${Y(e.source)?g(e.source):G} at ${Y(e.observedAt)?g(e.observedAt):G}`),n.push("Buttons open the graph or queue an unsigned prepare. Telegram never sends.");let r=n.join(`
|
|
20
20
|
`);return r.length>Vo&&(r=`${r.slice(0,Vo-1)}\u2026`),r}function Wo({platform:e="telegram",artifactId:t,hasGrant:n=!1,openUrl:r,collectUrl:o}={}){let i=String(t||"").trim().toLowerCase();if(!ml.test(i))return{kind:"text_menu",text:"no LP artifact to continue",cancelHint:""};let s=[];Y(r)&&s.push({text:"Open",url:String(r)}),s.push({text:"Refresh",callback_data:`oracle:card:refresh:${i}`});let a=[Y(o)?{text:"Collect",url:String(o)}:{text:"Collect",callback_data:`oracle:card:collect:${i}`}];n&&a.push({text:"Rebalance",callback_data:`oracle:card:rebalance:${i}`}),a.push({text:"Exit",callback_data:`oracle:card:exit:${i}`});let l=[s,a].filter(c=>c.length>0),u=n?"Collect/Rebalance/Exit queue unsigned prepares. Sign in your wallet. Telegram never sends.":"Collect/Exit queue unsigned prepares. Rebalance needs a local grant. Telegram never sends.";return String(e)==="telegram"?{kind:"inline_keyboard",replyMarkup:{inline_keyboard:l},cancelHint:u}:{kind:"text_menu",text:l.flat().map(c=>c.text).join(" / "),cancelHint:u}}var Vo,G,ml,Go=_(()=>{Nt();Vo=1e3,G="unknown",ml=/^[a-z0-9-]{4,40}$/i});import{createHash as wl,randomBytes as cy}from"node:crypto";import{mkdirSync as bl,readFileSync as Sl,writeFileSync as xl}from"node:fs";import{homedir as El}from"node:os";import{dirname as kl,join as Yo}from"node:path";function nt(e=process.env){return Yo(e.ORACLE_CONFIG_DIR||Yo(El(),".config","oracle"),"telegram-cards.json")}function rt(){return{links:{},artifacts:{},threads:{}}}function Lt(){return tt}function Qo(e,{readFile:t=Sl}={}){try{let n=JSON.parse(String(t(e)));tt={links:n.links&&typeof n.links=="object"?n.links:{},artifacts:n.artifacts&&typeof n.artifacts=="object"?n.artifacts:{},threads:n.threads&&typeof n.threads=="object"?n.threads:{}}}catch{tt=rt()}return tt}function Mt(e,t=tt,{writeFile:n=xl,mkdir:r=bl}={}){r(kl(e),{recursive:!0,mode:448}),n(e,JSON.stringify(t),{mode:384})}function ce(e){return e==null?!1:typeof e=="string"?e.trim()!=="":!0}function Cl(e){return wl("sha256").update(String(e)).digest("hex")}function Rn(e){if(Array.isArray(e))return e.map(Rn);if(!e||typeof e!="object")return e;let t={};for(let[n,r]of Object.entries(e))!Ol.has(n)&&/(secret|token|key|seed|private|password|mnemonic|auth)/i.test(n)||(t[n]=Rn(r));return t}function Zo(e){return String(e?.kind||"").toLowerCase()==="lp"}function Nl(e){let n=String(e||"").trim().match(_l);return n?{action:n[1].toLowerCase(),artifactId:n[2].toLowerCase()}:null}function Tl({platform:e="telegram",artifactId:t,openUrl:n,hasGrant:r=!1}={}){let o=String(t||"").trim().toLowerCase();if(!Ln.test(o))return{kind:"text_menu",text:"no artifact to continue",cancelHint:""};let i=[],s=[{text:"TA",callback_data:`oracle:card:ta:${o}`},{text:"FA",callback_data:`oracle:card:fa:${o}`}],a=c=>xo(n,{side:c}),l=a("long"),u=a("short"),d=l&&u?[{text:"LONG",url:l},{text:"SHORT",url:u}]:[{text:"LONG",callback_data:`oracle:card:long:${o}`},{text:"SHORT",callback_data:`oracle:card:short:${o}`}];return ce(n)?(i.push([{text:"Open",url:String(n)},s[0]]),i.push(d),i.push(r?[s[1],{text:"Prep",callback_data:`oracle:card:prepare:${o}`}]:[s[1]])):(i.push(s),i.push(d),r&&i.push([{text:"Prep",callback_data:`oracle:card:prepare:${o}`}])),String(e)==="telegram"?{kind:"inline_keyboard",replyMarkup:{inline_keyboard:i.filter(c=>c.length>0)},cancelHint:"LONG/SHORT open the graph. CONFIRM there. Telegram never sends."}:{kind:"text_menu",text:"TA / FA / LONG / SHORT",cancelHint:""}}function ei(e,t){return Zo(e)?Wo({artifactId:e.id,openUrl:e.openUrl,collectUrl:e.payload?.lp?.collectUrl,hasGrant:t}):Tl({artifactId:e.id,openUrl:e.openUrl,hasGrant:t})}function ti(e={}){if(Zo(e)&&e.payload?.lp?.card&&typeof e.payload.lp.card=="object")return Ko(e.payload.lp.card);let n=[`*${ce(e.title)?g(e.title):"Oracle artifact"}*`,`Kind: ${ce(e.kind)?g(e.kind):O}`,`Id: ${ce(e.id)?`\`${String(e.id).replace(/`/g,"")}\``:O}`,`Summary: ${ce(e.summary)?g(e.summary):O}`],r=Sn(e.confidence);r!==O&&n.push(`Confidence: ${r}`),(ce(e.source)||ce(e.fetchedAt))&&n.push(`Source: ${g(e.source)} at ${g(e.fetchedAt)}`),Array.isArray(e.warnings)&&e.warnings.length&&n.push(`Warnings: ${e.warnings.map(i=>g(i)).join("; ")}`);let o=ve(e);return n.push(o.allowed?"Actions: TA / FA / LONG / SHORT open the graph. Execute on CONFIRM there.":`Actions: TA / FA / LONG / SHORT \u2014 ${g(o.reason)}`),n.join(`
|
|
21
21
|
`)}function $l(e,t={},{now:n=Date.now()}={}){let r=e||rt(),o=String(t.id||"").trim().toLowerCase();if(!Ln.test(o))throw new TypeError("artifact id required");let i={id:o,kind:String(t.kind||"thesis"),title:String(t.title||"Oracle artifact"),summary:String(t.summary||""),openUrl:ce(t.openUrl)?String(t.openUrl):null,confidence:t.confidence,source:t.source||"oracle",fetchedAt:t.fetchedAt||new Date(n).toISOString(),warnings:Array.isArray(t.warnings)?t.warnings.map(String):[],payload:Rn(t.payload||{}),wallet:/^0x[0-9a-f]{40}$/i.test(String(t.wallet||""))?String(t.wallet).toLowerCase():null,walletLabel:ce(t.walletLabel)?String(t.walletLabel).slice(0,64):null,chainId:Number.isInteger(Number(t.chainId))&&Number(t.chainId)>0?Number(t.chainId):null,createdAt:new Date(n).toISOString()};return r.artifacts[o]=i,i}function Mn(e,{chatId:t,artifactId:n,now:r=Date.now()}={}){let o=e||rt(),i=String(t||"").trim(),s=String(n||"").trim().toLowerCase();if(!i)throw new TypeError("chat id required");if(!Ln.test(s))throw new TypeError("artifact id required");return o.threads[i]={artifactId:s,updatedAt:r},o.threads[i]}function ni(e,{chatId:t,text:n}={}){let r=String(t||"").trim(),o=String(n||"").trim();if(!r||!o||/^\//.test(o))return null;let i=e?.threads?.[r];if(!i?.artifactId)return null;let s=e.artifacts?.[i.artifactId];return s?`Continue artifact ${s.id} (${s.kind}). Prior: ${s.summary||s.title}. User: ${o}`:null}function ri(e,{token:t,telegramUserId:n,now:r=Date.now()}={}){let o=e||rt(),i=String(t||"").trim(),s=String(n||"").trim();if(!Al.test(i))return{ok:!1,error:"invalid start token"};if(!Il.test(s))return{ok:!1,error:"invalid telegram user"};let a=Cl(i),l=o.links[a];return l?(delete o.links[a],Number(l.expiresAt)<=r?{ok:!1,error:"start token expired"}:String(l.ownerId)!==s?{ok:!1,error:"start token is bound to a different owner"}:{ok:!0,ownerId:s}):{ok:!1,error:"unknown or already used start token"}}function Pl(e,t,{now:n,prepareLp:r=Ho}={}){let o=Xo[t],i=e.payload?.lp&&typeof e.payload.lp=="object"?e.payload.lp:{},s=i[o]&&typeof i[o]=="object"?i[o]:null,a={artifactId:e.id,action:t,lpKind:o,unsigned:!0,broadcast:!1};if(!s||i.chainId==null)return{...a,envelope:null,reason:`artifact carries no ${o} params; desk must gather them`};try{let l=r({chainId:i.chainId,kind:o,params:s,deadlineSec:i.deadlineSec??300,from:i.owner??s.owner??s.recipient},{nowSeconds:Math.floor(Number(n)/1e3),nowMs:n});return{...a,envelope:l,reason:null}}catch(l){return{...a,envelope:null,reason:String(l?.message||l)}}}function Rt(e){let t=String(e||"");return t.length>=12?`${t.slice(0,6)}\u2026${t.slice(-4)}`:t}function oi(e,{data:t,chatId:n,grant:r=null,now:o=Date.now(),prepareLp:i,guest:s=!1,followStore:a=null,bagReader:l=null}={}){let u=Nl(t);if(!u)return null;if(!vl.has(u.action))return{text:"That card action is not available.",buttons:null};let d=e?.artifacts?.[u.artifactId];if(!d)return{text:"That artifact is gone. Ask again and I will issue a new card.",buttons:null};if(n&&Mn(e,{chatId:n,artifactId:d.id,now:o}),u.action==="follow"||u.action==="bag"){if(s)return{text:"Owner only.",buttons:null,prompt:null};let p=String(d.wallet||"").toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(p))return{text:"No wallet on this card.",buttons:null,prompt:null};if(u.action==="follow"){if(!a||typeof a.add!="function")return{text:"Follow list is not available here.",buttons:null,prompt:null};let y=a.add({address:p,chainId:d.chainId??null,label:d.walletLabel??null,source:"tap"});return y.added?{text:`Following ${Rt(p)}. Alerts on its buys and sells from now.`,buttons:null,prompt:null,follow:y}:y.reason==="already-following"?{text:`Already following ${Rt(p)}.`,buttons:null,prompt:null,follow:y}:{text:`Not following ${Rt(p)}: ${y.reason}.`,buttons:null,prompt:null,follow:y}}return typeof l!="function"?{text:"Bag is not available here.",buttons:null,prompt:null}:{text:`Reading bag for ${Rt(p)}\u2026`,buttons:null,prompt:null,bag:l({chainId:d.chainId??null,address:p})}}let c=ve({grant:r},{now:o}),f=ei(d,c.allowed);if(u.action==="refresh")return{text:ti(d),buttons:f,prompt:null};if(u.action==="deepen")return{text:null,buttons:null,prompt:`Deepen artifact ${d.id} (${d.kind}). Prior: ${d.summary||d.title}. Be terse. Do not sign or broadcast.`};if(u.action==="ta")return{text:null,buttons:null,prompt:`TA artifact ${d.id}. Prior: ${d.summary||d.title}. Run deterministic TA on the coin/venue in the artifact (RSI divergence, S/R, candle patterns). Reply in this Telegram chat with the verdict rows and say what was drawn. Do not sign or broadcast.`};if(u.action==="fa")return{text:null,buttons:null,prompt:`FA artifact ${d.id}. Prior: ${d.summary||d.title}. Run per-coin FA (funding, OI, book, premium) plus the separate MACRO thesis (M1/M2/Fed BS/net liquidity) if relevant. Cite receipts. Stay in this Telegram chat. Do not sign or broadcast.`};if(u.action==="allow")return{text:"Allow is the graph. Open the ticket there and CONFIRM. Telegram did not send.",buttons:null,prompt:null};if(u.action==="deny")return{text:`Denied ${d.id}. Ticket cancelled. Nothing signed.`,buttons:null,prompt:null};if(u.action==="long"||u.action==="short")return{text:null,buttons:null,prompt:`Open the live graph ticket for a ${u.action} on artifact ${d.id}. Prior: ${d.summary||d.title}. Size from the connected HL account. Execute only on CONFIRM on the graph. Never sign from Telegram.`};let m=u.action==="prepare"?"Prepare":u.action[0].toUpperCase()+u.action.slice(1);if(!c.allowed)return{text:`${m} blocked \u2014 ${c.reason}. Deepen and Refresh still work.`,buttons:f,prompt:null};if(u.action in Xo){let p=Pl(d,u.action,{now:o,prepareLp:i});return{text:p.envelope?`Queued unsigned ${p.lpKind} for LP ${d.id} (${p.envelope.plan.actions.join("+")}, one modifyLiquidities). Nothing signed. Sign in your wallet.`:`${m} for ${d.id} needs inputs \u2014 ${p.reason}. Nothing signed.`,buttons:f,prompt:null,prepare:p}}return{text:`Queued unsigned prepare for ${d.id}. Nothing signed. Allow/Deny still required.`,buttons:f,prompt:null,prepare:{artifactId:d.id,unsigned:!0,broadcast:!1}}}function ii(e={},{grant:t=null,now:n=Date.now(),state:r}={}){let o=r||Lt(),i=String(e.id||`art-${Math.abs(Number(n)).toString(36)}`).toLowerCase().slice(0,40),s=$l(o,{...e,id:i},{now:n}),a=ve({grant:t},{now:n});return{text:ti({...s,grant:t}),replyMarkup:ei(s,a.allowed).replyMarkup,artifact:s,state:o}}var Jo,Xo,vl,Ln,Al,Il,_l,tt,Ol,Fn=_(()=>{Eo();Nt();zo();Go();Jo=Object.freeze(["deepen","refresh","prepare","ta","fa","long","short","allow","deny","bag","follow","rebalance","exit","collect"]),Xo=Object.freeze({rebalance:"rebalance",exit:"burn",collect:"collect"}),vl=new Set(Jo),Ln=/^[a-z0-9-]{4,40}$/i,Al=/^[0-9a-f]{32}$/,Il=/^\d+$/,_l=new RegExp(`^oracle:card:(${Jo.join("|")}):([a-z0-9-]{4,40})$`,"i");tt=rt();Ol=new Set(["tokenId","poolKey","burnTokenId"])});var Ci={};_e(Ci,{NON_OWNER_REPLY:()=>De,buildPersona:()=>qe,handleSelfUpdate:()=>pi,isForwarded:()=>fi,isOwnerSender:()=>Be,ownerIdsFor:()=>ui,parseGatewayChainCommand:()=>Ei,parseGatewayCompactCommand:()=>xi,parseGatewayEffortCommand:()=>gi,parseGatewayGoalCommand:()=>Si,parseGatewayHelpCommand:()=>wi,parseGatewayModelCommand:()=>yi,parseGatewaySetupModelCommand:()=>Vl,parseGatewayStatusCommand:()=>bi,parsePeerAsk:()=>vi,parseSelfUpdate:()=>di,resolveBackendArgv:()=>Ai,resolveGatewayModel:()=>mi,resolveOracleBin:()=>li,routePeerConsult:()=>ot,routeToAgent:()=>le});import{spawn as ci}from"node:child_process";import{dirname as Rl,join as Bn}from"node:path";import{homedir as Ll}from"node:os";import{mkdirSync as Ml,readFileSync as Fl,writeFileSync as Ul,unlinkSync as Bl}from"node:fs";import{fileURLToPath as Dl}from"node:url";function li({env:e=process.env,moduleUrl:t=import.meta.url}={}){return e.ORACLE_CLI_ENTRY||Bn(Rl(Dl(t)),"oracle.mjs")}function ui(e,t=process.env){let n=String(t[`ORACLE_OWNER_${String(e).toUpperCase()}`]||""),r=String(t.ORACLE_OWNER_IDS||"");return new Set(`${n},${r}`.split(",").map(o=>o.trim()).filter(Boolean))}function Be({platform:e,senderId:t,extraOwners:n},r=process.env){let o=String(t||"").trim();return o?ui(e,r).has(o)?!0:Array.isArray(n)?n.map(i=>String(i).trim()).filter(Boolean).includes(o):!1:!1}function di(e){let t=String(e||"").trim();if(!t)return null;let n=t.replace(/^\/update(?:@[\w_]+)?\b/i,"update");return/^(?:oracle\s+)?update\s+--check\s*$/i.test(n)?{checkOnly:!0}:/^(?:oracle\s+)?update\s*$/i.test(n)?{checkOnly:!1}:null}async function pi(e,{check:t=co,update:n=lo,versionOf:r=Cn}={}){let o=await t({force:!0});if(e.checkOnly)return o.checked?o.updateAvailable?`oracle ${o.current} \u2192 ${o.latest} available. Send /update to install.`:`oracle ${o.current} is up to date`:`oracle ${o.current||"?"} \u2014 could not reach npm`;if(o.checked&&!o.updateAvailable)return`oracle ${o.current} is already up to date`;let i=o.latest||"latest",s=await n({version:i==="latest"?"latest":i});if(!s.ok)return`oracle update failed: ${s.message}`;let a=r();return[`oracle ${o.current||"?"} \u2192 ${a||i}`,"Restart the gateway to load it: oracle gateway"].join(`
|