@oracle-agent/oracle 0.35.44 → 0.35.45
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/dist/agent-sessions.mjs +24 -24
- package/dist/assets/skills/oracle-desk-product/SKILL.md +1 -1
- package/dist/bin/desk-server.mjs +26 -26
- package/dist/bin/oracle-data-mcp.mjs +14 -14
- package/dist/bin/oracle-gateway.mjs +47 -47
- package/dist/bin/oracle-investigate.mjs +4 -4
- package/dist/bin/oracle-launch-radar-shadow.mjs +5 -5
- package/dist/bin/oracle-mev-arb-shadow.mjs +5 -5
- package/dist/bin/oracle-mev-shadow.mjs +5 -5
- package/dist/bin/oracle-public-server.mjs +5 -5
- package/dist/bin/oracle-route.mjs +23 -23
- package/dist/bin/oracle-scan.mjs +6 -6
- package/dist/bin/oracle.mjs +1 -0
- package/dist/cli/commands/account.mjs +39 -0
- package/dist/cli/commands/agent-session.mjs +23 -23
- package/dist/cli/commands/airdrop.mjs +7 -7
- package/dist/cli/commands/chat.mjs +198 -198
- package/dist/cli/commands/data.mjs +29 -29
- package/dist/cli/commands/doctor.mjs +7 -7
- package/dist/cli/commands/eval.mjs +123 -123
- package/dist/cli/commands/farm.mjs +16 -16
- package/dist/cli/commands/follow.mjs +36 -36
- package/dist/cli/commands/mint.mjs +10 -10
- package/dist/cli/commands/model.mjs +205 -205
- package/dist/cli/commands/quickstart.mjs +6 -6
- package/dist/cli/commands/receipt.mjs +11 -11
- package/dist/cli/commands/resolve.mjs +9 -9
- package/dist/cli/commands/session-vault.mjs +5 -5
- package/dist/cli/commands/sign.mjs +12 -12
- package/dist/cli/commands/signer.mjs +25 -25
- package/dist/cli/commands/snipe.mjs +7 -7
- package/dist/cli/commands/strategy.mjs +5 -5
- package/dist/cli/commands/swap.mjs +14 -14
- package/dist/cli/commands/venues.mjs +2 -2
- package/dist/data/desk-data.mjs +24 -24
- 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 +44 -44
- package/dist/investigator/index.mjs +2 -2
- package/dist/launch-radar/index.mjs +5 -5
- package/dist/local-signer/anvil-attestation-worker.mjs +1 -1
- package/dist/local-signer/index.mjs +7 -3
- package/dist/local-signer/runtime.mjs +22 -22
- package/dist/nft/universal-mint-router.mjs +4 -4
- package/dist/notifications/index.mjs +7 -7
- 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 +4 -4
- package/dist/strategy/index.mjs +3 -3
- package/dist/tui/standalone-client.mjs +85 -85
- package/package.json +1 -1
- 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 +3 -3
- package/public/oracle-splash/downloads/index.html +1 -1
- package/public/oracle-splash/index.html +6 -6
- package/server.json +2 -2
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import{createHash as yt}from"node:crypto";import{Interface as Re,encodeBytes32String as wt,formatUnits as gt,isAddress as bt}from"ethers";import{createHash as Ve}from"node:crypto";import{types as _}from"node:util";import{AsyncLocalStorage as Ne}from"node:async_hooks";var Fe=new Ne,De=["http","retry","shared"],Ue=512;function Y(t){let e=Fe.getStore();if(!e||e.closed||!De.includes(t))return null;if(e.spans.length>=Ue)return e.droppedSpans++,null;let r={stage:t,startMs:e.now()-e.start,durationMs:null,outcome:"pending",status:null};return e.spans.push(r),(n,s=null)=>{e.closed||r.durationMs!==null||(r.durationMs=Math.max(0,e.now()-e.start-r.startMs),r.outcome=n==="succeeded"?"succeeded":"failed",r.status=Number.isInteger(s)&&s>=100&&s<=599?s:null)}}import D from"node:net";import Be from"node:dns";var ze=new Set(["localhost","metadata.google.internal","metadata.goog"]);function q(t){let e=String(t).toLowerCase().split("%")[0];if((e.match(/::/g)||[]).length>1)return null;let r=o=>{if(!o)return[];let c=o.split(":"),f=c.at(-1);if(f?.includes(".")){let h=f.split(".").map(Number);if(h.length!==4||h.some(m=>!Number.isInteger(m)||m<0||m>255))return null;c.splice(c.length-1,1,(h[0]<<8|h[1]).toString(16),(h[2]<<8|h[3]).toString(16))}return c.some(h=>!/^[0-9a-f]{1,4}$/.test(h))?null:c.map(h=>Number.parseInt(h,16))},[n,s]=e.split("::"),d=r(n),i=r(s);if(!d||!i)return null;let l=e.includes("::"),a=8-d.length-i.length;if(!l&&a!==0||l&&a<1)return null;let u=[...d,...Array(Math.max(0,a)).fill(0),...i];return u.length!==8?null:Uint8Array.from(u.flatMap(o=>[o>>8,o&255]))}function re(t,e,r){let n=Math.floor(r/8),s=r%8;for(let i=0;i<n;i+=1)if(t[i]!==e[i])return!1;if(!s)return!0;let d=255<<8-s;return(t[n]&d)===(e[n]&d)}function ne(t){if(D.isIPv4(t)){let e=t.split(".").map(Number);return!(e[0]===0||e[0]===10||e[0]===127||e[0]>=224||e[0]===100&&e[1]>=64&&e[1]<=127||e[0]===169&&e[1]===254||e[0]===172&&e[1]>=16&&e[1]<=31||e[0]===192&&(e[1]===0||e[1]===2||e[1]===168)||e[0]===192&&e[1]===88&&e[2]===99||e[0]===198&&(e[1]===18||e[1]===19||e[1]===51)||e[0]===203&&e[1]===0&&e[2]===113)}if(D.isIPv6(t)){let e=q(t);if(!e)return!1;let r=q("::ffff:0:0");return re(e,r,96)?ne([...e.slice(12)].join(".")):re(e,q("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([s,d])=>re(e,q(s),d)):!1}return!1}function Je(t){let e;try{e=new URL(String(t))}catch{return{ok:!1,error:`not a valid URL: ${String(t).slice(0,120)}`}}if(e.protocol!=="http:"&&e.protocol!=="https:")return{ok:!1,error:`refused protocol ${e.protocol} (only http/https)`};let r=e.hostname.toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,"");if(ze.has(r)||r.endsWith(".localhost")||r.endsWith(".internal"))return{ok:!1,error:`refused internal host ${r}`};let n=D.isIP(r);return n!==0&&!ne(r)?{ok:!1,error:`refused private address ${r}`}:{ok:!0,url:e,host:r,isLiteralIp:n!==0}}async function oe(t,{lookupFn:e=Be.promises.lookup}={}){let r=Je(t);if(!r.ok)return r;if(r.isLiteralIp)return{ok:!0,url:r.url,addresses:[{address:r.host,family:D.isIPv6(r.host)?6:4}]};let n;try{n=await e(r.host,{all:!0,verbatim:!0})}catch{return{ok:!1,error:`refused: ${r.host} did not resolve`}}return!Array.isArray(n)||n.length===0||n.some(s=>!ne(s.address))?{ok:!1,error:`refused: ${r.host} resolves to a non-public address`}:{ok:!0,url:r.url,addresses:n}}async function se({requireUndici:t=!1,importUndici:e=()=>import("undici")}={}){let r,n;try{let c=await e();r=c.Agent,n=c.fetch}catch(c){if(t)throw new Error(`egress-guard: untrustedUrl pinning requires the undici package, which failed to load: ${c?.message||c}`);return null}if(typeof r!="function"||typeof n!="function"){if(t)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 s=c=>String(c).toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,""),d=new Map,i=c=>(Array.isArray(c)?c:[c]).map(f=>typeof f=="string"?{address:f}:f).filter(f=>f&&f.address).map(f=>({address:f.address,family:f.family||(D.isIPv6(f.address)?6:4)})),l=(c,f,h)=>{d.set(s(c),i(typeof f=="string"?[{address:f,family:h}]:f))},a=c=>{let f=s(c);if(D.isIP(f))return[{address:f,family:D.isIPv6(f)?6:4}];let h=d.get(f);if(!h||!h.length)throw new Error(`refused: unpinned host ${c} during pinned fetch`);return h},u=new r({connect:{lookup(c,f,h){let m;try{m=a(c)}catch(O){return h(O)}return f?.all?h(null,m):h(null,m[0].address,m[0].family)}}}),o=Ge((c,f={})=>n(c,{...f,dispatcher:u}),l);return{dispatcher:u,fetch:o,pin:l,resolve:a,async close(){try{await u.destroy()}catch{}}}}var ie=Symbol.for("oracle.egressGuard.pinCapableFetch");function Ge(t,e){if(typeof t!="function")throw new Error("markPinCapableFetch: fetchImpl must be a function");if(typeof e!="function")throw new Error("markPinCapableFetch: pin must be a function");return t[ie]=Object.freeze({pin:e}),t}function ae(t){return typeof t=="function"&&typeof t[ie]?.pin=="function"}function ge(t,e,r){if(!ae(t))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");t[ie].pin(e,r)}var We=new Set([408,425,429,500,502,503,504]),be=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),Ze=2,Te=4e3,Ke=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"aborted")?.get,Ye=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"reason")?.get,qe=AbortSignal.prototype.throwIfAborted,Xe=EventTarget.prototype.addEventListener,Oe=EventTarget.prototype.removeEventListener,Se=typeof AbortSignal.any=="function"?AbortSignal.any.bind(AbortSignal):null,Z=t=>t?Ke.call(t):!1,Qe=t=>t?Ye.call(t):void 0,et=new Set([301,302,303,307,308]),Q=3,Ut=64*1024,H=Object.freeze({depth:32,nodes:1e4,fields:1e4,arrayLength:1e4,bytes:1024*1024});function T(t){return L(`HTTP JSON body refused: ${t}`)}function tt(t){return["isArgumentsObject","isArrayBuffer","isAnyArrayBuffer","isArrayBufferView","isBoxedPrimitive","isDataView","isDate","isExternal","isGeneratorObject","isKeyObject","isCryptoKey","isMap","isMapIterator","isModuleNamespaceObject","isNativeError","isPromise","isRegExp","isSet","isSetIterator","isTypedArray","isWeakMap","isWeakSet"].some(e=>typeof _[e]=="function"&&_[e](t))}function rt(t){let e=[],r=0,n=0,s=0,d=0,i=new WeakSet,l=o=>{if(r+=Buffer.byteLength(o,"utf8"),r>H.bytes)throw T("serialized byte limit exceeded");e.push(o)},a=o=>{if(Buffer.byteLength(o,"utf8")>H.bytes)throw T("serialized byte limit exceeded");return JSON.stringify(o)},u=(o,c)=>{if(n+=1,n>H.nodes)throw T("node limit exceeded");if(c>H.depth)throw T("depth limit exceeded");if(o===null){l("null");return}if(typeof o=="string"){l(a(o));return}if(typeof o=="boolean"){l(o?"true":"false");return}if(typeof o=="number"){if(!Number.isFinite(o))throw T("non-finite number");l(Object.is(o,-0)?"0":String(o));return}if(typeof o!="object")throw T("unsupported non-JSON value");if(_.isProxy(o))throw T("proxy value");if(tt(o))throw T("unsupported exotic object");if(i.has(o))throw T("cyclic value");i.add(o);try{if(Object.getOwnPropertySymbols(o).length>0)throw T("symbol-keyed fields are unsupported");if(Array.isArray(o)){let m=Object.getPrototypeOf(o),O=0;for(;m!==null;){if(_.isProxy(m))throw T("proxy array prototype");if(O+=1,O>H.depth)throw T("array prototype depth limit exceeded");m=Object.getPrototypeOf(m)}if(o.length>H.arrayLength)throw T("array length limit exceeded");for(let S=0;S<o.length;S+=1){let j=Object.getOwnPropertyDescriptor(o,String(S));if(!j||!Object.hasOwn(j,"value")||j.enumerable!==!0)throw T("array entries must be dense enumerable own data")}let y=0;for(let S in o){if(d+=1,d>H.fields)throw T("enumeration limit exceeded");if(Object.hasOwn(o,S)&&(y+=1,y>o.length))throw T("named array fields are unsupported")}if(y!==o.length)throw T("array entries must be dense enumerable own data");l("[");for(let S=0;S<o.length;S+=1)S&&l(","),u(Object.getOwnPropertyDescriptor(o,String(S)).value,c+1);l("]");return}let f=Object.getPrototypeOf(o);if(f!==Object.prototype&&f!==null)throw T("non-plain object");let h=[];for(let m in o){if(d+=1,d>H.fields)throw T("enumeration limit exceeded");if(!Object.hasOwn(o,m))continue;if(s+=1,s>H.fields)throw T("field limit exceeded");let O=Object.getOwnPropertyDescriptor(o,m);if(!O||!Object.hasOwn(O,"value")||O.enumerable!==!0)throw T("object fields must be enumerable own data");h.push([m,O.value])}l("{");for(let m=0;m<h.length;m+=1)m&&l(","),l(a(h[m][0])),l(":"),u(h[m][1],c+1);l("}")}finally{i.delete(o)}};return u(t,0),e.join("")}function nt(t){let e=Object.create(null);if(t==null)return e;if(typeof t!="object"&&typeof t!="function")throw new TypeError("HTTP headers must be an object");if(_.isProxy(t))throw new TypeError("HTTP headers must not be a proxy");if(Object.getOwnPropertySymbols(t).length>0)throw new TypeError("HTTP headers must not contain symbol fields");let r=new Set;for(let n of Object.keys(t)){if(!/^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/u.test(n))throw new TypeError("HTTP header names must be valid tokens");let s=n.toLowerCase();if(r.has(s))throw new TypeError("HTTP headers contain a duplicate canonical name");r.add(s);let d=Object.getOwnPropertyDescriptor(t,n);if(!d||!Object.hasOwn(d,"value"))throw new TypeError("HTTP headers must contain own data properties");let i=d.value;if(i==null||["object","function","symbol"].includes(typeof i))throw new TypeError("HTTP header values must be scalar");e[n]=String(i)}return e}function ot(){return Object.assign(Object.create(null),{Accept:"application/json"})}function st(t,e){if(!t)throw new Error(`HTTP redirect from ${e} missing Location`);let r=new URL(String(t),String(e));if(r.protocol!=="http:"&&r.protocol!=="https:")throw new Error(`HTTP redirect from ${e} used unsupported protocol ${r.protocol}`);return r.toString()}function it(t,e){return new URL(String(t)).origin===new URL(String(e)).origin}var ce=new Map,Ae=new WeakMap,Pe=1;function X(t){if((typeof t!="object"||t===null)&&typeof t!="function")return`${typeof t}:${String(t)}`;let e=Ae.get(t);return e||(e=Pe,Pe+=1,Ae.set(t,e)),`reference:${e}`}var at=new Set(["eth_blockNumber","eth_call","eth_chainId","eth_estimateGas","getHealth","minimumLedgerSlot","net_version","simulateTransaction","web3_clientVersion"]),ct=new Set(["allMids","l2Book","outcomeMeta","spotClearinghouseState","userFills","meta","metaAndAssetCtxs","perpDexs","candleSnapshot","fundingHistory","openOrders","frontendOpenOrders","clearinghouseState","spotMeta","validatorSummaries","delegatorSummary","delegations","delegatorRewards","delegatorHistory","maxBuilderFee"]);function Ee(t){if(!t||typeof t!="object"||Array.isArray(t)||!Object.hasOwn(t,"jsonrpc")||!Object.hasOwn(t,"method")||t.jsonrpc!=="2.0")return!1;let e=typeof t.method=="string"?t.method:"";return e?at.has(e)||/^get[A-Z0-9_]/u.test(e)||/^is[A-Z0-9_]/u.test(e)||/^eth_get[A-Z0-9_]/u.test(e):!1}function ve(t,e){if(t==="GET"&&e==null)return!0;if(t!=="POST"||e==null)return!1;let r=e;if(typeof e=="string")try{r=JSON.parse(e)}catch{return!1}if(Array.isArray(r))return r.length>0&&r.every(Ee);if(!r||typeof r!="object")return!1;if(Object.hasOwn(r,"jsonrpc")||Object.hasOwn(r,"method"))return Ee(r);let n=Object.hasOwn(r,"type")?r.type:null;return typeof n=="string"&&ct.has(n)&&(!Object.hasOwn(r,"action")||r.action==null)&&(!Object.hasOwn(r,"signature")||r.signature==null)&&(!Object.hasOwn(r,"nonce")||r.nonce==null)}function lt(t,e,r,n={},s=null){let d=Ve("sha256"),i=(a,u)=>{let o=String(u);d.update(String(Buffer.byteLength(a,"utf8"))).update(":").update(a),d.update("=").update(String(Buffer.byteLength(o,"utf8"))).update(":").update(o).update(`
|
|
2
|
-
`)};i("method",t),i("url",e),Object.keys(r||{}).map((a,u)=>({name:a.toLowerCase(),order:u,value:String(r[a])})).sort((a,u)=>a.name.localeCompare(u.name)||a.order-u.order).forEach((a,u)=>{i(`header-name-${u}`,a.name),i(`header-value-${u}`,a.value)}),i("body",s??"-");for(let a of["untrustedUrl","maxResponseBytes","sameOriginRedirectsOnly","redirectPolicy","maxRedirects","timeoutMs","retries","fetchImpl","realFetch","lookupFn","importUndici","validateResponse"])i(`context-${a}`,n[a]??"-");return d.digest("hex")}function ut(t,e){let r=Number(e);return Number.isFinite(r)&&r>0?Math.min(r*1e3,Te):Math.min(250*2**t,Te)+Math.floor(Math.random()*100)}var dt=t=>new Promise(e=>setTimeout(e,t));function L(t,e={}){let r=new Error(t);return r.retryable=!1,Object.assign(r,e),r}function le(t,e,r){return L(`HTTP response from ${t} exceeded maxResponseBytes ${r} (${e})`,{oversize:!0})}function U(t){try{let e=t?.body?.cancel?.();e&&typeof e.then=="function"&&e.catch(()=>{})}catch{}}function ft(t){return t?t.byteLength??t.length??0:0}async function pt(t,e,{url:r,truncate:n=!1,onOversize:s}={}){if(e==null)return await t.text();let d=Number(t.headers?.get?.("content-length"));if(Number.isFinite(d)&&d>e&&(U(t),!n))throw le(r,`content-length ${d}`,e);let i=t.body?.getReader?.();if(!i){let c=await t.text(),f=Buffer.byteLength(c,"utf8");if(f>e){if(!n)throw le(r,`body ${f} bytes`,e);return Buffer.from(c,"utf8").subarray(0,e).toString("utf8")}return c}let l=[],a=0,u=!1;try{for(;;){let{value:c,done:f}=await i.read();if(f)break;if(c&&(l.push(Buffer.from(c)),a+=ft(c),a>e)){u=!0;break}}}finally{if(u)try{await i.cancel()}catch{}try{i.releaseLock?.()}catch{}}if(u&&(typeof s=="function"&&s(),!n))throw le(r,`streamed ${a} bytes`,e);let o=Buffer.concat(l);return(u?o.subarray(0,e):o).toString("utf8")}function ht(t){if(!t)return null;try{return JSON.parse(t)}catch{return null}}async function mt(t,{fetchImpl:e,method:r,headers:n,body:s,timeoutMs:d,lookupFn:i,realFetch:l,untrustedUrl:a=!1,maxResponseBytes:u=null,sameOriginRedirectsOnly:o=!1,importUndici:c,validateResponse:f,signal:h,redirectPolicy:m="follow",maxRedirects:O=Q}){let y=null,S=e,j=i?{lookupFn:i}:{};if(a&&!l&&!ae(S))throw L(`HTTP refused ${t}: untrustedUrl requires a pin-capable fetchImpl (see markPinCapableFetch in egress-guard.mjs) or no fetchImpl override so Oracle can pin the connection itself`);let R=new AbortController,M=setTimeout(()=>R.abort(),d),z=h?Se?Se([h,R.signal]):h:R.signal,J=async(w,{status:P=null}={})=>{let E=await oe(w,j);if(!E.ok)throw L(P==null?`HTTP refused ${w}: ${E.error}`:`HTTP redirect to ${w} ${E.error}`,P==null?{}:{status:P});let C=new URL(w).hostname;if(l){if(y&&(await y.close(),y=null),!y)try{y=await se({requireUndici:!0,...c?{importUndici:c}:{}})}catch(p){throw L(P==null?`HTTP refused ${w}: ${p?.message||p}`:`HTTP redirect to ${w} refused: ${p?.message||p}`,P==null?{}:{status:P})}y.pin(C,E.addresses),S=y.fetch}else ge(S,C,E.addresses);return E};try{let w=String(t),P=Object.assign(Object.create(null),n||{});a&&await J(w);for(let E=0;E<=O;E+=1){let C=Object.assign(Object.create(null),{method:r,headers:P,body:s,signal:z,redirect:"manual",dispatcher:void 0}),p=await S(w,C);if((m==="error"||O===0)&&p.status>=300&&p.status<400)throw U(p),L(`HTTP ${p.status} ${r} redirect refused`,{status:p.status,redirectRefused:!0});if(et.has(p.status)){let x=o===!0&&r==="POST"&&[307,308].includes(p.status)&&ve(r,s);if(r!=="GET"&&r!=="HEAD"&&!x){U(p);let A=new Error(`HTTP ${p.status} ${r} ${w} redirected non-idempotent request`);throw A.status=p.status,A}if(E===O)throw U(p),L(`HTTP ${p.status} ${r} redirect budget exhausted`,{status:p.status,redirectRefused:!0});let pe=p.headers?.get?.("location"),$;try{$=st(pe,w)}catch(A){throw U(p),A}let F=!it($,w);if(U(p),F&&r==="POST"){let A=new Error(`HTTP ${p.status} ${r} cross-origin redirect refused`);throw A.status=p.status,A}if(F&&o){let A=new Error(`HTTP ${p.status} ${r} cross-origin redirect refused`);throw A.status=p.status,A.retryable=!1,A}if(F&&(P=ot(P)),a)await J($,{status:p.status});else if(F){let A=await oe($,j);if(!A.ok){let b=new Error(`HTTP redirect from ${w} ${A.error}`);throw b.status=p.status,b.retryable=!1,b}l&&A.addresses?.length&&(y||(y=await se(c?{importUndici:c}:{})),y&&(y.pin(new URL($).hostname,A.addresses),S=y.fetch))}w=$;continue}if(typeof f=="function")try{await f(p,{url:w})}catch(x){throw U(p),L(x?.message||String(x))}let v=await pt(p,u,{url:w,onOversize:()=>R.abort()}),G=ht(v);if(!p.ok){let x=new Error(`HTTP ${p.status} ${r} ${w}`);throw x.status=p.status,x.retryAfter=p.headers?.get?.("retry-after")??null,x.body=G??v.slice(0,300),x}return G??v}throw new Error(`HTTP redirect loop for ${t}`)}catch(w){if(R.signal.aborted&&!Z(h)){let P=w&&(typeof w=="object"||typeof w=="function")&&!_.isProxy(w)?w:null,E=P?Object.getOwnPropertyDescriptor(P,"oversize"):null;if(!(E&&Object.hasOwn(E,"value")&&E.value===!0))try{if(!P)throw new TypeError("unsafe rejection");Object.defineProperties(P,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}})}catch{let p=new Error("HTTP request timed out");throw Object.defineProperties(p,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}}),p}}throw w}finally{clearTimeout(M),y&&await y.close()}}async function ue(t,e={}){if(e!=null&&typeof e!="object"&&typeof e!="function")throw new TypeError("HTTP options must be an object");if(e!=null&&_.isProxy(e))throw new TypeError("HTTP options must not be a proxy");let r=new Set(["body","dedupe","fetchImpl","headers","importUndici","lookupFn","maxRedirects","maxResponseBytes","method","redirectPolicy","retries","sameOriginRedirectsOnly","signal","timeoutMs","untrustedUrl","validateResponse"]);if(e!=null){if(Object.getOwnPropertySymbols(e).length>0)throw new TypeError("HTTP options contain unknown fields");for(let b of Object.getOwnPropertyNames(e)){let g=Object.getOwnPropertyDescriptor(e,b);if(!(b==="toJSON"&&g&&Object.hasOwn(g,"value")&&g.value===void 0)){if(!r.has(b))throw new TypeError("HTTP options contain unknown fields");if(!g||!g.enumerable||!Object.hasOwn(g,"value"))throw new TypeError("HTTP options must contain enumerable own data properties")}}}let n=b=>{if(e==null||!Object.hasOwn(e,b))return;let g=Object.getOwnPropertyDescriptor(e,b);if(!g||!Object.hasOwn(g,"value"))throw new TypeError("HTTP options must contain own data properties");return g.value};if(typeof t!="string"||t.length===0||t.length>8192)throw new TypeError("HTTP URL must be a bounded string");let s=n("method");if(s!==void 0&&(typeof s!="string"||!/^[A-Za-z]+$/u.test(s)))throw new TypeError("HTTP method must be a string token");let d=n("timeoutMs");if(d!==void 0&&(!Number.isInteger(d)||d<1||d>12e4))throw new TypeError("HTTP timeoutMs must be a bounded integer");let i=n("retries");if(i!==void 0&&(!Number.isInteger(i)||i<0||i>10))throw new TypeError("HTTP retries must be a bounded integer");let l=n("redirectPolicy");if(l!==void 0&&l!=="follow"&&l!=="error")throw new TypeError('HTTP redirectPolicy must be "follow" or "error"');let a=n("maxRedirects");if(a!==void 0&&(!Number.isInteger(a)||a<0||a>Q))throw new TypeError(`HTTP maxRedirects must be an integer from 0 through ${Q}`);if(l==="error"&&a!==void 0&&a!==0)throw new TypeError('HTTP redirectPolicy "error" requires maxRedirects 0 when supplied');let u=l??"follow",o=u==="error"?0:a??Q;for(let b of["dedupe","untrustedUrl","sameOriginRedirectsOnly"]){let g=n(b);if(g!==void 0&&typeof g!="boolean")throw new TypeError(`HTTP ${b} must be boolean`)}let c=n("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=n("signal");if(f!==void 0){if(_.isProxy(f)||!(f instanceof AbortSignal))throw new TypeError("HTTP signal must be a native AbortSignal");try{Z(f)}catch{throw new TypeError("HTTP signal must be a native AbortSignal")}}for(let b of["importUndici","lookupFn","validateResponse"]){let g=n(b);if(g!==void 0&&typeof g!="function")throw new TypeError(`HTTP ${b} must be a function`)}let h=n("fetchImpl"),m=h||globalThis.fetch;if(typeof m!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let O=d??12e3,y=(s||"GET").toUpperCase(),S=n("headers"),j=nt(S),R=Object.assign(Object.create(null),j);Object.keys(R).some(b=>b.toLowerCase()==="accept")||(R.Accept="application/json");let M=n("body");M!=null&&typeof M!="string"&&(Object.keys(R).find(g=>g.toLowerCase()==="content-type")||(R["Content-Type"]="application/json"),M=rt(M));let z=i??Ze,J=n("lookupFn"),w=!h,P=n("untrustedUrl")===!0,E=n("sameOriginRedirectsOnly")===!0,C=n("importUndici"),p=n("validateResponse"),v=f,G=c??null,x=async()=>{let b;for(let g=0;g<=z;g++){v&&qe.call(v);let he=Y("http");try{let I=await mt(t,{fetchImpl:m,method:y,headers:R,body:M,timeoutMs:O,lookupFn:J,realFetch:w,untrustedUrl:P,maxResponseBytes:G,sameOriginRedirectsOnly:E,importUndici:C,validateResponse:p,signal:v,redirectPolicy:u,maxRedirects:o});return he?.("succeeded"),I}catch(I){b=I;let B=te=>{if(!I||typeof I!="object"&&typeof I!="function"||_.isProxy(I))return;let V=Object.getOwnPropertyDescriptor(I,te);return V&&Object.hasOwn(V,"value")?V.value:void 0},K=B("status");he?.("failed",K);let He=B("oracleTimeout")===!0||B("name")==="AbortError"||B("name")==="TimeoutError"||Z(v),_e=new Set([408,425,429]),Ce=B("retryable")===!1?!1:K!=null?_e.has(K)||We.has(K)&&be.has(y):!He&&be.has(y);if(g===z||!Ce)throw I;let me=ut(g,B("retryAfter")),Le=Y("retry"),ye=!1;try{v?await new Promise((te,V)=>{let we,W=()=>{clearTimeout(we),Oe.call(v,"abort",W),V(Qe(v)||new DOMException("Aborted","AbortError"))};if(Z(v)){W();return}we=setTimeout(()=>{Oe.call(v,"abort",W),te()},me),Xe.call(v,"abort",W,{once:!0}),Z(v)&&W()}):await dt(me),ye=!0}finally{Le?.(ye?"succeeded":"failed")}}}throw b};if(!(n("dedupe")!==!1&&!v&&ve(y,M)))return x();let $=lt(y,t,R,{untrustedUrl:P,maxResponseBytes:G,sameOriginRedirectsOnly:E,redirectPolicy:u,maxRedirects:o,timeoutMs:O,retries:z,fetchImpl:X(m),realFetch:w,lookupFn:X(J),importUndici:X(C),validateResponse:X(p)},M),F=ce.get($);if(F){let b=Y("shared");try{let g=await F;return b?.("succeeded"),g}catch(g){throw b?.("failed"),g}}let A=x().finally(()=>ce.delete($));return ce.set($,A),A}var Tt=`0x${"00".repeat(32)}`,Ot=Object.freeze(["now","30days","60days","90days","stake"]),xe=Object.freeze([Object.freeze({id:"pharos-pros-genesis",project:"Pharos Genesis",addressFamily:"evm",chain:"pharos",chainId:1672,rpcUrl:"https://rpc.pharos.xyz",claimUrl:"https://claim.pharos.xyz/",evidenceUrl:"https://claim.pharos.xyz/user-guide",contract:"0xe5bfde2310fa2a315f814dcc0c8b97c159c8062d",tokenSymbol:"PROS",decimals:18,adapter:"pharos-static-v1",tiers:Ot,readOnly:!0}),Object.freeze({id:"plume-pp-season-2",project:"Plume PP Season 2",addressFamily:"evm",chain:"plume",chainId:98866,rpcUrl:"https://rpc.plume.org",claimUrl:"https://claim-pp.plume.org/",evidenceUrl:"https://claim-pp.plume.org/",contract:"0x8a2725a6f04816a5274ddd9feadd3bd0c253c1a6",tokenSymbol:"PLUME",decimals:18,adapter:"hedgey-v4",campaignUuid:"8f5ea864-3707-492f-8766-93f0da811a98",proofUrl:"https://api.hedgey.finance/token-claims/proof",restriction:"Official portal excludes US and OFAC-sanctioned jurisdictions.",readOnly:!0})]),St=new Re(["function campaigns(bytes16 campaignId) view returns (address manager,address token,uint256 amount,uint256 start,uint256 end,uint8 tokenLockup,bytes32 root,bool delegating)","function claimed(bytes16 campaignId,address claimer) view returns (bool)","function verify(bytes32 root,bytes32[] proof,address claimer,uint256 amount) pure returns (bool)"]),At=new Re(["function hasClaimed(address claimer) view returns (bool)","function claimTiers(bytes32 tier) view returns (bytes32 root,address token,uint256 start,uint256 end)","function check_proof(bytes32 tier,address claimer,uint256 amount,bytes32 root,bytes32[] proof) pure returns (bool)"]);function Pt(t){let e=String(t||"").trim();return/^0x[0-9a-fA-F]{40}$/u.test(e)?"evm":/^0x[0-9a-fA-F]{64}$/u.test(e)?"starknet-or-move":/^(bc1|tb1)[ac-hj-np-z02-9]{11,87}$/iu.test(e)?"bitcoin":/^[a-z][a-z0-9]{1,30}1[02-9ac-hj-np-z]{20,90}$/u.test(e)?"cosmos":e==="11111111111111111111111111111111"?"solana":/^[13][1-9A-HJ-NP-Za-km-z]{25,34}$/u.test(e)?"bitcoin":/^[1-9A-HJ-NP-Za-km-z]{32,44}$/u.test(e)?"solana":null}function Et(t,e){let r=String(t||"").trim(),s=String(e||"").trim().toLowerCase().slice(2,5),d=yt("md5").update(`pharosairdrop${r}${s}`.toLowerCase()).digest("hex");return`https://static.claim.pharos.xyz/resources/airdrops/PROD/PHAROSAIRDROP/${r}/proof_${d}_${r}.json`}function vt(t,e=xe[1]){return`${e.proofUrl}/${e.campaignUuid}/${String(t||"").trim().toLowerCase()}`}function jt(t){return`0x${String(t).replaceAll("-","")}`}function ee(t){if(typeof t=="bigint")return t.toString();if(Array.isArray(t))return t.map(ee);if(t&&typeof t=="object"){let e={};for(let[r,n]of Object.entries(t))/^\d+$/u.test(r)||(e[r]=ee(n));return e}return t}function de(t){return String(t?.message||t||"unknown source failure").slice(0,200)}function k(t){let e=Number(t);return Number.isFinite(e)&&e>0?e*1e3:null}function $e(t,e,r){let n=k(t),s=k(e);return n&&r<n?"not-open":s&&r>s?"expired":"claimable"}function fe(t,e){return gt(BigInt(String(t)),e).replace(/\.0+$/u,"").replace(/(\.\d*?[1-9])0+$/u,"$1")}function je(t){let e={claimable:0,claimed:0,ineligible:0,expired:0,notOpen:0,unavailable:0};for(let r of t)r.status==="claimable"?e.claimable+=1:r.status==="claimed"?e.claimed+=1:r.status==="ineligible"?e.ineligible+=1:r.status==="expired"?e.expired+=1:r.status==="not-open"?e.notOpen+=1:r.status==="unavailable"&&(e.unavailable+=1);return e}function N(t,e={}){return{campaignId:t.id,project:t.project,chain:t.chain,chainId:t.chainId,tokenSymbol:t.tokenSymbol,contract:t.contract,claimUrl:t.claimUrl,evidenceUrl:t.evidenceUrl,restriction:t.restriction||null,readOnly:!0,...e}}async function Rt(t,e){return await ue(t,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3,retries:e.retries??1,maxResponseBytes:e.maxResponseBytes??8*1024*1024})}async function xt({campaign:t,functionName:e,args:r},n){let s=t.adapter==="hedgey-v4"?St:At,d=r;t.adapter==="hedgey-v4"&&["campaigns","claimed"].includes(e)&&(d=[jt(t.campaignUuid),...r.slice(1)]),t.adapter==="pharos-static-v1"&&["claimTiers","check_proof"].includes(e)&&(d=[wt(r[0]),...r.slice(1)]);let i=s.encodeFunctionData(e,d),l=await ue(t.rpcUrl,{method:"POST",body:{jsonrpc:"2.0",id:1,method:"eth_call",params:[{to:t.contract,data:i},"latest"]},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3,retries:n.retries??1,maxResponseBytes:1024*1024});if(!l||l.error||typeof l.result!="string")throw new Error(l?.error?.message||`invalid ${t.chain} RPC response`);let a=s.decodeFunctionResult(e,l.result);if(a.length===1)return ee(a[0]);let u=s.getFunction(e);return Object.fromEntries(u.outputs.map((o,c)=>[o.name||String(c),ee(a[c])]))}async function $t(t,e,r,n){try{let s=await r.rpcRead({campaign:t,functionName:"campaigns",args:[t.campaignUuid]});if(await r.rpcRead({campaign:t,functionName:"claimed",args:[t.campaignUuid,e]})===!0)return N(t,{status:"claimed",proofVerified:!1});let i=await r.fetchJson(vt(e,t)),l=i?.amount,a=i?.proof;if(i?.canClaim!==!0||!l||!Array.isArray(a)||a.length===0)return N(t,{status:"ineligible",proofVerified:!1});if(await r.rpcRead({campaign:t,functionName:"verify",args:[s.root,a,e,l]})!==!0)throw new Error("official proof did not verify against the claim contract");return N(t,{status:$e(s.start,s.end,n),amountRaw:String(l),amountFormatted:fe(l,t.decimals),proofVerified:!0,claimStart:k(s.start)?new Date(k(s.start)).toISOString():null,claimEnd:k(s.end)?new Date(k(s.end)).toISOString():null})}catch(s){return N(t,{status:"unavailable",proofVerified:!1,error:de(s)})}}async function kt(t,e,r,n){try{if(await r.rpcRead({campaign:t,functionName:"hasClaimed",args:[e]})===!0)return N(t,{status:"claimed",proofVerified:!1});let d=[];for(let o of t.tiers){let c=await r.rpcRead({campaign:t,functionName:"claimTiers",args:[o]});String(c.root||"").toLowerCase()!==Tt&&d.push({tier:o,state:c})}let i=[],l=[];for(let{tier:o,state:c}of d){let f;try{f=await r.fetchJson(Et(o,e))}catch(j){if(j?.status===404)continue;l.push(de(j));continue}if(!Array.isArray(f)){l.push(`${o} proof shard returned invalid data`);continue}let h=f.find(j=>Array.isArray(j)&&String(j[0]).toLowerCase()===e.toLowerCase());if(!h)continue;let[,m,O,y]=h;if(!m||String(O).toLowerCase()!==String(c.root).toLowerCase()||!Array.isArray(y)){l.push(`${o} proof row did not match onchain state`);continue}if(await r.rpcRead({campaign:t,functionName:"check_proof",args:[o,e,m,O,y]})!==!0){l.push(`${o} proof did not verify against the claim contract`);continue}i.push({tier:o,amount:String(m),state:c})}if(i.length===0){if(l.length>0)throw new Error(l.join("; "));return N(t,{status:"ineligible",proofVerified:!1})}i.sort((o,c)=>BigInt(c.amount)>BigInt(o.amount)?1:BigInt(c.amount)<BigInt(o.amount)?-1:0);let a=i[0],u=l.length===0;return N(t,{status:$e(a.state.start,a.state.end,n),amountRaw:a.amount,amountFormatted:fe(a.amount,t.decimals),proofVerified:!0,sourceComplete:u,error:u?void 0:l.join("; ").slice(0,200),selectedTier:a.tier,allocationOptions:i.map(o=>({tier:o.tier,amountFormatted:fe(o.amount,t.decimals)})),claimStart:k(a.state.start)?new Date(k(a.state.start)).toISOString():null,claimEnd:k(a.state.end)?new Date(k(a.state.end)).toISOString():null})}catch(s){return N(t,{status:"unavailable",proofVerified:!1,error:de(s)})}}async function ke(t,e={}){let r=String(t||"").trim(),n=Pt(r);if(!n)throw new Error("unsupported or invalid wallet address");if(n==="evm"&&!bt(r))throw new Error("invalid EVM address");let s=xe.filter(u=>u.addressFamily===n),d="Oracle checks packaged official machine-readable campaigns; this is not a universal airdrop index.";if(s.length===0)return{address:r,addressFamily:n,generatedAt:new Date(e.nowMs??Date.now()).toISOString(),complete:!1,coverage:{universal:!1,campaignsChecked:0,chainsChecked:[],reason:`Oracle has no packaged official campaigns for ${n}; this is not a universal airdrop index.`},summary:je([]),results:[]};let i={fetchJson:e.fetchJson||(u=>Rt(u,e)),rpcRead:e.rpcRead||(u=>xt(u,e))},l=e.nowMs??Date.now(),a=await Promise.all(s.map(u=>u.adapter==="hedgey-v4"?$t(u,r,i,l):kt(u,r,i,l)));return{address:r,addressFamily:n,generatedAt:new Date(l).toISOString(),complete:a.every(u=>u.status!=="unavailable"&&u.sourceComplete!==!1),coverage:{universal:!1,campaignsChecked:s.length,chainsChecked:[...new Set(s.map(u=>u.chain))].sort(),reason:d},summary:je(a),results:a}}function Me(t){let e=[],r=t.summary?.claimable||0;e.push(`Airdrop scan: ${r} verified claimable${r===1?"":"s"}`),e.push(`Address: ${t.address} (${t.addressFamily})`);for(let n of t.results||[]){let s=n.amountFormatted?`${n.amountFormatted} ${n.tokenSymbol}`:n.tokenSymbol;e.push(`${String(n.status).toUpperCase()} ${s} ${n.project} on ${n.chain}`),n.status==="claimable"&&e.push(`Claim: ${n.claimUrl}`),n.error&&e.push(`Source error: ${n.error}`),n.restriction&&e.push(`Restriction: ${n.restriction}`)}return(t.results||[]).length===0&&e.push("No packaged official campaigns support this address family yet."),e.push(`Coverage: ${t.coverage.reason}`),e.join(`
|
|
1
|
+
import{createHash as wt}from"node:crypto";import{Interface as xe,encodeBytes32String as gt,formatUnits as bt,isAddress as Tt}from"ethers";import{createHash as We}from"node:crypto";import{types as H}from"node:util";import{AsyncLocalStorage as Ne}from"node:async_hooks";var De=new Ne,Fe=["http","retry","shared"],Ue=512;function K(t){let e=De.getStore();if(!e||e.closed||!Fe.includes(t))return null;if(e.spans.length>=Ue)return e.droppedSpans++,null;let r={stage:t,startMs:e.now()-e.start,durationMs:null,outcome:"pending",status:null};return e.spans.push(r),(n,s=null)=>{e.closed||r.durationMs!==null||(r.durationMs=Math.max(0,e.now()-e.start-r.startMs),r.outcome=n==="succeeded"?"succeeded":"failed",r.status=Number.isInteger(s)&&s>=100&&s<=599?s:null)}}import F from"node:net";import Be from"node:dns";var ze=new Set(["localhost","metadata.google.internal","metadata.goog"]);function X(t){let e=String(t).toLowerCase().split("%")[0];if((e.match(/::/g)||[]).length>1)return null;let r=o=>{if(!o)return[];let f=o.split(":"),b=f.at(-1);if(b?.includes(".")){let p=b.split(".").map(Number);if(p.length!==4||p.some(l=>!Number.isInteger(l)||l<0||l>255))return null;f.splice(f.length-1,1,(p[0]<<8|p[1]).toString(16),(p[2]<<8|p[3]).toString(16))}return f.some(p=>!/^[0-9a-f]{1,4}$/.test(p))?null:f.map(p=>Number.parseInt(p,16))},[n,s]=e.split("::"),u=r(n),i=r(s);if(!u||!i)return null;let c=e.includes("::"),a=8-u.length-i.length;if(!c&&a!==0||c&&a<1)return null;let d=[...u,...Array(Math.max(0,a)).fill(0),...i];return d.length!==8?null:Uint8Array.from(d.flatMap(o=>[o>>8,o&255]))}function re(t,e,r){let n=Math.floor(r/8),s=r%8;for(let i=0;i<n;i+=1)if(t[i]!==e[i])return!1;if(!s)return!0;let u=255<<8-s;return(t[n]&u)===(e[n]&u)}function ne(t){if(F.isIPv4(t)){let e=t.split(".").map(Number);return!(e[0]===0||e[0]===10||e[0]===127||e[0]>=224||e[0]===100&&e[1]>=64&&e[1]<=127||e[0]===169&&e[1]===254||e[0]===172&&e[1]>=16&&e[1]<=31||e[0]===192&&(e[1]===0||e[1]===2||e[1]===168)||e[0]===192&&e[1]===88&&e[2]===99||e[0]===198&&(e[1]===18||e[1]===19||e[1]===51)||e[0]===203&&e[1]===0&&e[2]===113)}if(F.isIPv6(t)){let e=X(t);if(!e)return!1;let r=X("::ffff:0:0");return re(e,r,96)?ne([...e.slice(12)].join(".")):re(e,X("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([s,u])=>re(e,X(s),u)):!1}return!1}function Je(t){let e;try{e=new URL(String(t))}catch{return{ok:!1,error:`not a valid URL: ${String(t).slice(0,120)}`}}if(e.protocol!=="http:"&&e.protocol!=="https:")return{ok:!1,error:`refused protocol ${e.protocol} (only http/https)`};let r=e.hostname.toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,"");if(ze.has(r)||r.endsWith(".localhost")||r.endsWith(".internal"))return{ok:!1,error:`refused internal host ${r}`};let n=F.isIP(r);return n!==0&&!ne(r)?{ok:!1,error:`refused private address ${r}`}:{ok:!0,url:e,host:r,isLiteralIp:n!==0}}async function oe(t,{lookupFn:e=Be.promises.lookup}={}){let r=Je(t);if(!r.ok)return r;if(r.isLiteralIp)return{ok:!0,url:r.url,addresses:[{address:r.host,family:F.isIPv6(r.host)?6:4}]};let n;if(process.env.ORACLE_HOSTED_EGRESS_PROXY)return{ok:!0,url:r.url,addresses:[]};try{n=await e(r.host,{all:!0,verbatim:!0})}catch{return{ok:!1,error:`refused: ${r.host} did not resolve`}}return!Array.isArray(n)||n.length===0||n.some(s=>!ne(s.address))?{ok:!1,error:`refused: ${r.host} resolves to a non-public address`}:{ok:!0,url:r.url,addresses:n}}function Ge(t=process.env){let e=t.ORACLE_HOSTED_EGRESS_PROXY||"";if(!e)return null;let r;try{r=new URL(e)}catch{throw new Error("egress-guard: ORACLE_HOSTED_EGRESS_PROXY is not a URL")}if(r.protocol!=="http:"||!["127.0.0.1","::1","localhost","[::1]"].includes(r.hostname)||!r.port||r.username||r.password)throw new Error("egress-guard: egress proxy must be an exact loopback http origin");let n=t.ORACLE_HOSTED_EGRESS_TOKEN||"";if(!/^[A-Za-z0-9_-]{43}$/.test(n))throw new Error("egress-guard: egress proxy token is missing");return{uri:r.origin,token:n}}async function se({requireUndici:t=!1,importUndici:e=()=>import("undici")}={}){let r,n,s;try{s=await e(),r=s.Agent,n=s.fetch}catch(p){if(t)throw new Error(`egress-guard: untrustedUrl pinning requires the undici package, which failed to load: ${p?.message||p}`);return null}if(typeof r!="function"||typeof n!="function"){if(t)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 u=p=>String(p).toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,""),i=new Map,c=p=>(Array.isArray(p)?p:[p]).map(l=>typeof l=="string"?{address:l}:l).filter(l=>l&&l.address).map(l=>({address:l.address,family:l.family||(F.isIPv6(l.address)?6:4)})),a=(p,l,y)=>{i.set(u(p),c(typeof l=="string"?[{address:l,family:y}]:l))},d=p=>{let l=u(p);if(F.isIP(l))return[{address:l,family:F.isIPv6(l)?6:4}];let y=i.get(l);if(!y||!y.length)throw new Error(`refused: unpinned host ${p} during pinned fetch`);return y},o=Ge(),f=o&&typeof s.ProxyAgent=="function"?new s.ProxyAgent({uri:o.uri,token:`Bearer ${o.token}`,connectTimeout:1e4}):new r({connect:{lookup(p,l,y){let m;try{m=d(p)}catch(O){return y(O)}return l?.all?y(null,m):y(null,m[0].address,m[0].family)}}}),b=Ve((p,l={})=>n(p,{...l,dispatcher:f}),a);return{dispatcher:f,fetch:b,pin:a,resolve:d,async close(){try{await f.destroy()}catch{}}}}var ie=Symbol.for("oracle.egressGuard.pinCapableFetch");function Ve(t,e){if(typeof t!="function")throw new Error("markPinCapableFetch: fetchImpl must be a function");if(typeof e!="function")throw new Error("markPinCapableFetch: pin must be a function");return t[ie]=Object.freeze({pin:e}),t}function ae(t){return typeof t=="function"&&typeof t[ie]?.pin=="function"}function ge(t,e,r){if(!ae(t))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");t[ie].pin(e,r)}var Ze=new Set([408,425,429,500,502,503,504]),be=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),Ye=2,Te=4e3,Ke=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"aborted")?.get,Xe=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"reason")?.get,qe=AbortSignal.prototype.throwIfAborted,Qe=EventTarget.prototype.addEventListener,Oe=EventTarget.prototype.removeEventListener,Se=typeof AbortSignal.any=="function"?AbortSignal.any.bind(AbortSignal):null,Z=t=>t?Ke.call(t):!1,et=t=>t?Xe.call(t):void 0,tt=new Set([301,302,303,307,308]),Q=3,Bt=64*1024,_=Object.freeze({depth:32,nodes:1e4,fields:1e4,arrayLength:1e4,bytes:1024*1024});function S(t){return C(`HTTP JSON body refused: ${t}`)}function rt(t){return["isArgumentsObject","isArrayBuffer","isAnyArrayBuffer","isArrayBufferView","isBoxedPrimitive","isDataView","isDate","isExternal","isGeneratorObject","isKeyObject","isCryptoKey","isMap","isMapIterator","isModuleNamespaceObject","isNativeError","isPromise","isRegExp","isSet","isSetIterator","isTypedArray","isWeakMap","isWeakSet"].some(e=>typeof H[e]=="function"&&H[e](t))}function nt(t){let e=[],r=0,n=0,s=0,u=0,i=new WeakSet,c=o=>{if(r+=Buffer.byteLength(o,"utf8"),r>_.bytes)throw S("serialized byte limit exceeded");e.push(o)},a=o=>{if(Buffer.byteLength(o,"utf8")>_.bytes)throw S("serialized byte limit exceeded");return JSON.stringify(o)},d=(o,f)=>{if(n+=1,n>_.nodes)throw S("node limit exceeded");if(f>_.depth)throw S("depth limit exceeded");if(o===null){c("null");return}if(typeof o=="string"){c(a(o));return}if(typeof o=="boolean"){c(o?"true":"false");return}if(typeof o=="number"){if(!Number.isFinite(o))throw S("non-finite number");c(Object.is(o,-0)?"0":String(o));return}if(typeof o!="object")throw S("unsupported non-JSON value");if(H.isProxy(o))throw S("proxy value");if(rt(o))throw S("unsupported exotic object");if(i.has(o))throw S("cyclic value");i.add(o);try{if(Object.getOwnPropertySymbols(o).length>0)throw S("symbol-keyed fields are unsupported");if(Array.isArray(o)){let l=Object.getPrototypeOf(o),y=0;for(;l!==null;){if(H.isProxy(l))throw S("proxy array prototype");if(y+=1,y>_.depth)throw S("array prototype depth limit exceeded");l=Object.getPrototypeOf(l)}if(o.length>_.arrayLength)throw S("array length limit exceeded");for(let O=0;O<o.length;O+=1){let v=Object.getOwnPropertyDescriptor(o,String(O));if(!v||!Object.hasOwn(v,"value")||v.enumerable!==!0)throw S("array entries must be dense enumerable own data")}let m=0;for(let O in o){if(u+=1,u>_.fields)throw S("enumeration limit exceeded");if(Object.hasOwn(o,O)&&(m+=1,m>o.length))throw S("named array fields are unsupported")}if(m!==o.length)throw S("array entries must be dense enumerable own data");c("[");for(let O=0;O<o.length;O+=1)O&&c(","),d(Object.getOwnPropertyDescriptor(o,String(O)).value,f+1);c("]");return}let b=Object.getPrototypeOf(o);if(b!==Object.prototype&&b!==null)throw S("non-plain object");let p=[];for(let l in o){if(u+=1,u>_.fields)throw S("enumeration limit exceeded");if(!Object.hasOwn(o,l))continue;if(s+=1,s>_.fields)throw S("field limit exceeded");let y=Object.getOwnPropertyDescriptor(o,l);if(!y||!Object.hasOwn(y,"value")||y.enumerable!==!0)throw S("object fields must be enumerable own data");p.push([l,y.value])}c("{");for(let l=0;l<p.length;l+=1)l&&c(","),c(a(p[l][0])),c(":"),d(p[l][1],f+1);c("}")}finally{i.delete(o)}};return d(t,0),e.join("")}function ot(t){let e=Object.create(null);if(t==null)return e;if(typeof t!="object"&&typeof t!="function")throw new TypeError("HTTP headers must be an object");if(H.isProxy(t))throw new TypeError("HTTP headers must not be a proxy");if(Object.getOwnPropertySymbols(t).length>0)throw new TypeError("HTTP headers must not contain symbol fields");let r=new Set;for(let n of Object.keys(t)){if(!/^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/u.test(n))throw new TypeError("HTTP header names must be valid tokens");let s=n.toLowerCase();if(r.has(s))throw new TypeError("HTTP headers contain a duplicate canonical name");r.add(s);let u=Object.getOwnPropertyDescriptor(t,n);if(!u||!Object.hasOwn(u,"value"))throw new TypeError("HTTP headers must contain own data properties");let i=u.value;if(i==null||["object","function","symbol"].includes(typeof i))throw new TypeError("HTTP header values must be scalar");e[n]=String(i)}return e}function st(){return Object.assign(Object.create(null),{Accept:"application/json"})}function it(t,e){if(!t)throw new Error(`HTTP redirect from ${e} missing Location`);let r=new URL(String(t),String(e));if(r.protocol!=="http:"&&r.protocol!=="https:")throw new Error(`HTTP redirect from ${e} used unsupported protocol ${r.protocol}`);return r.toString()}function at(t,e){return new URL(String(t)).origin===new URL(String(e)).origin}var ce=new Map,Ae=new WeakMap,Ee=1;function q(t){if((typeof t!="object"||t===null)&&typeof t!="function")return`${typeof t}:${String(t)}`;let e=Ae.get(t);return e||(e=Ee,Ee+=1,Ae.set(t,e)),`reference:${e}`}var ct=new Set(["eth_blockNumber","eth_call","eth_chainId","eth_estimateGas","getHealth","minimumLedgerSlot","net_version","simulateTransaction","web3_clientVersion"]),lt=new Set(["allMids","l2Book","outcomeMeta","spotClearinghouseState","userFills","meta","metaAndAssetCtxs","perpDexs","candleSnapshot","fundingHistory","openOrders","frontendOpenOrders","clearinghouseState","spotMeta","validatorSummaries","delegatorSummary","delegations","delegatorRewards","delegatorHistory","maxBuilderFee"]);function Pe(t){if(!t||typeof t!="object"||Array.isArray(t)||!Object.hasOwn(t,"jsonrpc")||!Object.hasOwn(t,"method")||t.jsonrpc!=="2.0")return!1;let e=typeof t.method=="string"?t.method:"";return e?ct.has(e)||/^get[A-Z0-9_]/u.test(e)||/^is[A-Z0-9_]/u.test(e)||/^eth_get[A-Z0-9_]/u.test(e):!1}function Re(t,e){if(t==="GET"&&e==null)return!0;if(t!=="POST"||e==null)return!1;let r=e;if(typeof e=="string")try{r=JSON.parse(e)}catch{return!1}if(Array.isArray(r))return r.length>0&&r.every(Pe);if(!r||typeof r!="object")return!1;if(Object.hasOwn(r,"jsonrpc")||Object.hasOwn(r,"method"))return Pe(r);let n=Object.hasOwn(r,"type")?r.type:null;return typeof n=="string"&<.has(n)&&(!Object.hasOwn(r,"action")||r.action==null)&&(!Object.hasOwn(r,"signature")||r.signature==null)&&(!Object.hasOwn(r,"nonce")||r.nonce==null)}function ut(t,e,r,n={},s=null){let u=We("sha256"),i=(a,d)=>{let o=String(d);u.update(String(Buffer.byteLength(a,"utf8"))).update(":").update(a),u.update("=").update(String(Buffer.byteLength(o,"utf8"))).update(":").update(o).update(`
|
|
2
|
+
`)};i("method",t),i("url",e),Object.keys(r||{}).map((a,d)=>({name:a.toLowerCase(),order:d,value:String(r[a])})).sort((a,d)=>a.name.localeCompare(d.name)||a.order-d.order).forEach((a,d)=>{i(`header-name-${d}`,a.name),i(`header-value-${d}`,a.value)}),i("body",s??"-");for(let a of["untrustedUrl","maxResponseBytes","sameOriginRedirectsOnly","redirectPolicy","maxRedirects","timeoutMs","retries","fetchImpl","realFetch","lookupFn","importUndici","validateResponse"])i(`context-${a}`,n[a]??"-");return u.digest("hex")}function dt(t,e){let r=Number(e);return Number.isFinite(r)&&r>0?Math.min(r*1e3,Te):Math.min(250*2**t,Te)+Math.floor(Math.random()*100)}var ft=t=>new Promise(e=>setTimeout(e,t));function C(t,e={}){let r=new Error(t);return r.retryable=!1,Object.assign(r,e),r}function le(t,e,r){return C(`HTTP response from ${t} exceeded maxResponseBytes ${r} (${e})`,{oversize:!0})}function U(t){try{let e=t?.body?.cancel?.();e&&typeof e.then=="function"&&e.catch(()=>{})}catch{}}function pt(t){return t?t.byteLength??t.length??0:0}async function ht(t,e,{url:r,truncate:n=!1,onOversize:s}={}){if(e==null)return await t.text();let u=Number(t.headers?.get?.("content-length"));if(Number.isFinite(u)&&u>e&&(U(t),!n))throw le(r,`content-length ${u}`,e);let i=t.body?.getReader?.();if(!i){let f=await t.text(),b=Buffer.byteLength(f,"utf8");if(b>e){if(!n)throw le(r,`body ${b} bytes`,e);return Buffer.from(f,"utf8").subarray(0,e).toString("utf8")}return f}let c=[],a=0,d=!1;try{for(;;){let{value:f,done:b}=await i.read();if(b)break;if(f&&(c.push(Buffer.from(f)),a+=pt(f),a>e)){d=!0;break}}}finally{if(d)try{await i.cancel()}catch{}try{i.releaseLock?.()}catch{}}if(d&&(typeof s=="function"&&s(),!n))throw le(r,`streamed ${a} bytes`,e);let o=Buffer.concat(c);return(d?o.subarray(0,e):o).toString("utf8")}function mt(t){if(!t)return null;try{return JSON.parse(t)}catch{return null}}async function yt(t,{fetchImpl:e,method:r,headers:n,body:s,timeoutMs:u,lookupFn:i,realFetch:c,untrustedUrl:a=!1,maxResponseBytes:d=null,sameOriginRedirectsOnly:o=!1,importUndici:f,validateResponse:b,signal:p,redirectPolicy:l="follow",maxRedirects:y=Q}){let m=null,O=e,v=i?{lookupFn:i}:{};if(a&&!c&&!ae(O))throw C(`HTTP refused ${t}: untrustedUrl requires a pin-capable fetchImpl (see markPinCapableFetch in egress-guard.mjs) or no fetchImpl override so Oracle can pin the connection itself`);let x=new AbortController,M=setTimeout(()=>x.abort(),u),z=p?Se?Se([p,x.signal]):p:x.signal,J=async(w,{status:E=null}={})=>{let P=await oe(w,v);if(!P.ok)throw C(E==null?`HTTP refused ${w}: ${P.error}`:`HTTP redirect to ${w} ${P.error}`,E==null?{}:{status:E});let L=new URL(w).hostname;if(c){if(m&&(await m.close(),m=null),!m)try{m=await se({requireUndici:!0,...f?{importUndici:f}:{}})}catch(h){throw C(E==null?`HTTP refused ${w}: ${h?.message||h}`:`HTTP redirect to ${w} refused: ${h?.message||h}`,E==null?{}:{status:E})}m.pin(L,P.addresses),O=m.fetch}else ge(O,L,P.addresses);return P};try{let w=String(t),E=Object.assign(Object.create(null),n||{});a&&await J(w);for(let P=0;P<=y;P+=1){let L=Object.assign(Object.create(null),{method:r,headers:E,body:s,signal:z,redirect:"manual",dispatcher:void 0}),h=await O(w,L);if((l==="error"||y===0)&&h.status>=300&&h.status<400)throw U(h),C(`HTTP ${h.status} ${r} redirect refused`,{status:h.status,redirectRefused:!0});if(tt.has(h.status)){let j=o===!0&&r==="POST"&&[307,308].includes(h.status)&&Re(r,s);if(r!=="GET"&&r!=="HEAD"&&!j){U(h);let A=new Error(`HTTP ${h.status} ${r} ${w} redirected non-idempotent request`);throw A.status=h.status,A}if(P===y)throw U(h),C(`HTTP ${h.status} ${r} redirect budget exhausted`,{status:h.status,redirectRefused:!0});let pe=h.headers?.get?.("location"),$;try{$=it(pe,w)}catch(A){throw U(h),A}let D=!at($,w);if(U(h),D&&r==="POST"){let A=new Error(`HTTP ${h.status} ${r} cross-origin redirect refused`);throw A.status=h.status,A}if(D&&o){let A=new Error(`HTTP ${h.status} ${r} cross-origin redirect refused`);throw A.status=h.status,A.retryable=!1,A}if(D&&(E=st(E)),a)await J($,{status:h.status});else if(D){let A=await oe($,v);if(!A.ok){let T=new Error(`HTTP redirect from ${w} ${A.error}`);throw T.status=h.status,T.retryable=!1,T}c&&A.addresses?.length&&(m||(m=await se(f?{importUndici:f}:{})),m&&(m.pin(new URL($).hostname,A.addresses),O=m.fetch))}w=$;continue}if(typeof b=="function")try{await b(h,{url:w})}catch(j){throw U(h),C(j?.message||String(j))}let R=await ht(h,d,{url:w,onOversize:()=>x.abort()}),G=mt(R);if(!h.ok){let j=new Error(`HTTP ${h.status} ${r} ${w}`);throw j.status=h.status,j.retryAfter=h.headers?.get?.("retry-after")??null,j.body=G??R.slice(0,300),j}return G??R}throw new Error(`HTTP redirect loop for ${t}`)}catch(w){if(x.signal.aborted&&!Z(p)){let E=w&&(typeof w=="object"||typeof w=="function")&&!H.isProxy(w)?w:null,P=E?Object.getOwnPropertyDescriptor(E,"oversize"):null;if(!(P&&Object.hasOwn(P,"value")&&P.value===!0))try{if(!E)throw new TypeError("unsafe rejection");Object.defineProperties(E,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}})}catch{let h=new Error("HTTP request timed out");throw Object.defineProperties(h,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}}),h}}throw w}finally{clearTimeout(M),m&&await m.close()}}async function ue(t,e={}){if(e!=null&&typeof e!="object"&&typeof e!="function")throw new TypeError("HTTP options must be an object");if(e!=null&&H.isProxy(e))throw new TypeError("HTTP options must not be a proxy");let r=new Set(["body","dedupe","fetchImpl","headers","importUndici","lookupFn","maxRedirects","maxResponseBytes","method","redirectPolicy","retries","sameOriginRedirectsOnly","signal","timeoutMs","untrustedUrl","validateResponse"]);if(e!=null){if(Object.getOwnPropertySymbols(e).length>0)throw new TypeError("HTTP options contain unknown fields");for(let T of Object.getOwnPropertyNames(e)){let g=Object.getOwnPropertyDescriptor(e,T);if(!(T==="toJSON"&&g&&Object.hasOwn(g,"value")&&g.value===void 0)){if(!r.has(T))throw new TypeError("HTTP options contain unknown fields");if(!g||!g.enumerable||!Object.hasOwn(g,"value"))throw new TypeError("HTTP options must contain enumerable own data properties")}}}let n=T=>{if(e==null||!Object.hasOwn(e,T))return;let g=Object.getOwnPropertyDescriptor(e,T);if(!g||!Object.hasOwn(g,"value"))throw new TypeError("HTTP options must contain own data properties");return g.value};if(typeof t!="string"||t.length===0||t.length>8192)throw new TypeError("HTTP URL must be a bounded string");let s=n("method");if(s!==void 0&&(typeof s!="string"||!/^[A-Za-z]+$/u.test(s)))throw new TypeError("HTTP method must be a string token");let u=n("timeoutMs");if(u!==void 0&&(!Number.isInteger(u)||u<1||u>12e4))throw new TypeError("HTTP timeoutMs must be a bounded integer");let i=n("retries");if(i!==void 0&&(!Number.isInteger(i)||i<0||i>10))throw new TypeError("HTTP retries must be a bounded integer");let c=n("redirectPolicy");if(c!==void 0&&c!=="follow"&&c!=="error")throw new TypeError('HTTP redirectPolicy must be "follow" or "error"');let a=n("maxRedirects");if(a!==void 0&&(!Number.isInteger(a)||a<0||a>Q))throw new TypeError(`HTTP maxRedirects must be an integer from 0 through ${Q}`);if(c==="error"&&a!==void 0&&a!==0)throw new TypeError('HTTP redirectPolicy "error" requires maxRedirects 0 when supplied');let d=c??"follow",o=d==="error"?0:a??Q;for(let T of["dedupe","untrustedUrl","sameOriginRedirectsOnly"]){let g=n(T);if(g!==void 0&&typeof g!="boolean")throw new TypeError(`HTTP ${T} must be boolean`)}let f=n("maxResponseBytes");if(f!==void 0&&(!Number.isInteger(f)||f<1||f>64*1024*1024))throw new TypeError("HTTP maxResponseBytes must be a bounded integer");let b=n("signal");if(b!==void 0){if(H.isProxy(b)||!(b instanceof AbortSignal))throw new TypeError("HTTP signal must be a native AbortSignal");try{Z(b)}catch{throw new TypeError("HTTP signal must be a native AbortSignal")}}for(let T of["importUndici","lookupFn","validateResponse"]){let g=n(T);if(g!==void 0&&typeof g!="function")throw new TypeError(`HTTP ${T} must be a function`)}let p=n("fetchImpl"),l=p||globalThis.fetch;if(typeof l!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let y=u??12e3,m=(s||"GET").toUpperCase(),O=n("headers"),v=ot(O),x=Object.assign(Object.create(null),v);Object.keys(x).some(T=>T.toLowerCase()==="accept")||(x.Accept="application/json");let M=n("body");M!=null&&typeof M!="string"&&(Object.keys(x).find(g=>g.toLowerCase()==="content-type")||(x["Content-Type"]="application/json"),M=nt(M));let z=i??Ye,J=n("lookupFn"),w=!p,E=n("untrustedUrl")===!0,P=n("sameOriginRedirectsOnly")===!0,L=n("importUndici"),h=n("validateResponse"),R=b,G=f??null,j=async()=>{let T;for(let g=0;g<=z;g++){R&&qe.call(R);let he=K("http");try{let I=await yt(t,{fetchImpl:l,method:m,headers:x,body:M,timeoutMs:y,lookupFn:J,realFetch:w,untrustedUrl:E,maxResponseBytes:G,sameOriginRedirectsOnly:P,importUndici:L,validateResponse:h,signal:R,redirectPolicy:d,maxRedirects:o});return he?.("succeeded"),I}catch(I){T=I;let B=te=>{if(!I||typeof I!="object"&&typeof I!="function"||H.isProxy(I))return;let V=Object.getOwnPropertyDescriptor(I,te);return V&&Object.hasOwn(V,"value")?V.value:void 0},Y=B("status");he?.("failed",Y);let _e=B("oracleTimeout")===!0||B("name")==="AbortError"||B("name")==="TimeoutError"||Z(R),He=new Set([408,425,429]),Le=B("retryable")===!1?!1:Y!=null?He.has(Y)||Ze.has(Y)&&be.has(m):!_e&&be.has(m);if(g===z||!Le)throw I;let me=dt(g,B("retryAfter")),Ce=K("retry"),ye=!1;try{R?await new Promise((te,V)=>{let we,W=()=>{clearTimeout(we),Oe.call(R,"abort",W),V(et(R)||new DOMException("Aborted","AbortError"))};if(Z(R)){W();return}we=setTimeout(()=>{Oe.call(R,"abort",W),te()},me),Qe.call(R,"abort",W,{once:!0}),Z(R)&&W()}):await ft(me),ye=!0}finally{Ce?.(ye?"succeeded":"failed")}}}throw T};if(!(n("dedupe")!==!1&&!R&&Re(m,M)))return j();let $=ut(m,t,x,{untrustedUrl:E,maxResponseBytes:G,sameOriginRedirectsOnly:P,redirectPolicy:d,maxRedirects:o,timeoutMs:y,retries:z,fetchImpl:q(l),realFetch:w,lookupFn:q(J),importUndici:q(L),validateResponse:q(h)},M),D=ce.get($);if(D){let T=K("shared");try{let g=await D;return T?.("succeeded"),g}catch(g){throw T?.("failed"),g}}let A=j().finally(()=>ce.delete($));return ce.set($,A),A}var Ot=`0x${"00".repeat(32)}`,St=Object.freeze(["now","30days","60days","90days","stake"]),je=Object.freeze([Object.freeze({id:"pharos-pros-genesis",project:"Pharos Genesis",addressFamily:"evm",chain:"pharos",chainId:1672,rpcUrl:"https://rpc.pharos.xyz",claimUrl:"https://claim.pharos.xyz/",evidenceUrl:"https://claim.pharos.xyz/user-guide",contract:"0xe5bfde2310fa2a315f814dcc0c8b97c159c8062d",tokenSymbol:"PROS",decimals:18,adapter:"pharos-static-v1",tiers:St,readOnly:!0}),Object.freeze({id:"plume-pp-season-2",project:"Plume PP Season 2",addressFamily:"evm",chain:"plume",chainId:98866,rpcUrl:"https://rpc.plume.org",claimUrl:"https://claim-pp.plume.org/",evidenceUrl:"https://claim-pp.plume.org/",contract:"0x8a2725a6f04816a5274ddd9feadd3bd0c253c1a6",tokenSymbol:"PLUME",decimals:18,adapter:"hedgey-v4",campaignUuid:"8f5ea864-3707-492f-8766-93f0da811a98",proofUrl:"https://api.hedgey.finance/token-claims/proof",restriction:"Official portal excludes US and OFAC-sanctioned jurisdictions.",readOnly:!0})]),At=new xe(["function campaigns(bytes16 campaignId) view returns (address manager,address token,uint256 amount,uint256 start,uint256 end,uint8 tokenLockup,bytes32 root,bool delegating)","function claimed(bytes16 campaignId,address claimer) view returns (bool)","function verify(bytes32 root,bytes32[] proof,address claimer,uint256 amount) pure returns (bool)"]),Et=new xe(["function hasClaimed(address claimer) view returns (bool)","function claimTiers(bytes32 tier) view returns (bytes32 root,address token,uint256 start,uint256 end)","function check_proof(bytes32 tier,address claimer,uint256 amount,bytes32 root,bytes32[] proof) pure returns (bool)"]);function Pt(t){let e=String(t||"").trim();return/^0x[0-9a-fA-F]{40}$/u.test(e)?"evm":/^0x[0-9a-fA-F]{64}$/u.test(e)?"starknet-or-move":/^(bc1|tb1)[ac-hj-np-z02-9]{11,87}$/iu.test(e)?"bitcoin":/^[a-z][a-z0-9]{1,30}1[02-9ac-hj-np-z]{20,90}$/u.test(e)?"cosmos":e==="11111111111111111111111111111111"?"solana":/^[13][1-9A-HJ-NP-Za-km-z]{25,34}$/u.test(e)?"bitcoin":/^[1-9A-HJ-NP-Za-km-z]{32,44}$/u.test(e)?"solana":null}function Rt(t,e){let r=String(t||"").trim(),s=String(e||"").trim().toLowerCase().slice(2,5),u=wt("md5").update(`pharosairdrop${r}${s}`.toLowerCase()).digest("hex");return`https://static.claim.pharos.xyz/resources/airdrops/PROD/PHAROSAIRDROP/${r}/proof_${u}_${r}.json`}function vt(t,e=je[1]){return`${e.proofUrl}/${e.campaignUuid}/${String(t||"").trim().toLowerCase()}`}function xt(t){return`0x${String(t).replaceAll("-","")}`}function ee(t){if(typeof t=="bigint")return t.toString();if(Array.isArray(t))return t.map(ee);if(t&&typeof t=="object"){let e={};for(let[r,n]of Object.entries(t))/^\d+$/u.test(r)||(e[r]=ee(n));return e}return t}function de(t){return String(t?.message||t||"unknown source failure").slice(0,200)}function k(t){let e=Number(t);return Number.isFinite(e)&&e>0?e*1e3:null}function $e(t,e,r){let n=k(t),s=k(e);return n&&r<n?"not-open":s&&r>s?"expired":"claimable"}function fe(t,e){return bt(BigInt(String(t)),e).replace(/\.0+$/u,"").replace(/(\.\d*?[1-9])0+$/u,"$1")}function ve(t){let e={claimable:0,claimed:0,ineligible:0,expired:0,notOpen:0,unavailable:0};for(let r of t)r.status==="claimable"?e.claimable+=1:r.status==="claimed"?e.claimed+=1:r.status==="ineligible"?e.ineligible+=1:r.status==="expired"?e.expired+=1:r.status==="not-open"?e.notOpen+=1:r.status==="unavailable"&&(e.unavailable+=1);return e}function N(t,e={}){return{campaignId:t.id,project:t.project,chain:t.chain,chainId:t.chainId,tokenSymbol:t.tokenSymbol,contract:t.contract,claimUrl:t.claimUrl,evidenceUrl:t.evidenceUrl,restriction:t.restriction||null,readOnly:!0,...e}}async function jt(t,e){return await ue(t,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3,retries:e.retries??1,maxResponseBytes:e.maxResponseBytes??8*1024*1024})}async function $t({campaign:t,functionName:e,args:r},n){let s=t.adapter==="hedgey-v4"?At:Et,u=r;t.adapter==="hedgey-v4"&&["campaigns","claimed"].includes(e)&&(u=[xt(t.campaignUuid),...r.slice(1)]),t.adapter==="pharos-static-v1"&&["claimTiers","check_proof"].includes(e)&&(u=[gt(r[0]),...r.slice(1)]);let i=s.encodeFunctionData(e,u),c=await ue(t.rpcUrl,{method:"POST",body:{jsonrpc:"2.0",id:1,method:"eth_call",params:[{to:t.contract,data:i},"latest"]},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3,retries:n.retries??1,maxResponseBytes:1024*1024});if(!c||c.error||typeof c.result!="string")throw new Error(c?.error?.message||`invalid ${t.chain} RPC response`);let a=s.decodeFunctionResult(e,c.result);if(a.length===1)return ee(a[0]);let d=s.getFunction(e);return Object.fromEntries(d.outputs.map((o,f)=>[o.name||String(f),ee(a[f])]))}async function kt(t,e,r,n){try{let s=await r.rpcRead({campaign:t,functionName:"campaigns",args:[t.campaignUuid]});if(await r.rpcRead({campaign:t,functionName:"claimed",args:[t.campaignUuid,e]})===!0)return N(t,{status:"claimed",proofVerified:!1});let i=await r.fetchJson(vt(e,t)),c=i?.amount,a=i?.proof;if(i?.canClaim!==!0||!c||!Array.isArray(a)||a.length===0)return N(t,{status:"ineligible",proofVerified:!1});if(await r.rpcRead({campaign:t,functionName:"verify",args:[s.root,a,e,c]})!==!0)throw new Error("official proof did not verify against the claim contract");return N(t,{status:$e(s.start,s.end,n),amountRaw:String(c),amountFormatted:fe(c,t.decimals),proofVerified:!0,claimStart:k(s.start)?new Date(k(s.start)).toISOString():null,claimEnd:k(s.end)?new Date(k(s.end)).toISOString():null})}catch(s){return N(t,{status:"unavailable",proofVerified:!1,error:de(s)})}}async function Mt(t,e,r,n){try{if(await r.rpcRead({campaign:t,functionName:"hasClaimed",args:[e]})===!0)return N(t,{status:"claimed",proofVerified:!1});let u=[];for(let o of t.tiers){let f=await r.rpcRead({campaign:t,functionName:"claimTiers",args:[o]});String(f.root||"").toLowerCase()!==Ot&&u.push({tier:o,state:f})}let i=[],c=[];for(let{tier:o,state:f}of u){let b;try{b=await r.fetchJson(Rt(o,e))}catch(v){if(v?.status===404)continue;c.push(de(v));continue}if(!Array.isArray(b)){c.push(`${o} proof shard returned invalid data`);continue}let p=b.find(v=>Array.isArray(v)&&String(v[0]).toLowerCase()===e.toLowerCase());if(!p)continue;let[,l,y,m]=p;if(!l||String(y).toLowerCase()!==String(f.root).toLowerCase()||!Array.isArray(m)){c.push(`${o} proof row did not match onchain state`);continue}if(await r.rpcRead({campaign:t,functionName:"check_proof",args:[o,e,l,y,m]})!==!0){c.push(`${o} proof did not verify against the claim contract`);continue}i.push({tier:o,amount:String(l),state:f})}if(i.length===0){if(c.length>0)throw new Error(c.join("; "));return N(t,{status:"ineligible",proofVerified:!1})}i.sort((o,f)=>BigInt(f.amount)>BigInt(o.amount)?1:BigInt(f.amount)<BigInt(o.amount)?-1:0);let a=i[0],d=c.length===0;return N(t,{status:$e(a.state.start,a.state.end,n),amountRaw:a.amount,amountFormatted:fe(a.amount,t.decimals),proofVerified:!0,sourceComplete:d,error:d?void 0:c.join("; ").slice(0,200),selectedTier:a.tier,allocationOptions:i.map(o=>({tier:o.tier,amountFormatted:fe(o.amount,t.decimals)})),claimStart:k(a.state.start)?new Date(k(a.state.start)).toISOString():null,claimEnd:k(a.state.end)?new Date(k(a.state.end)).toISOString():null})}catch(s){return N(t,{status:"unavailable",proofVerified:!1,error:de(s)})}}async function ke(t,e={}){let r=String(t||"").trim(),n=Pt(r);if(!n)throw new Error("unsupported or invalid wallet address");if(n==="evm"&&!Tt(r))throw new Error("invalid EVM address");let s=je.filter(d=>d.addressFamily===n),u="Oracle checks packaged official machine-readable campaigns; this is not a universal airdrop index.";if(s.length===0)return{address:r,addressFamily:n,generatedAt:new Date(e.nowMs??Date.now()).toISOString(),complete:!1,coverage:{universal:!1,campaignsChecked:0,chainsChecked:[],reason:`Oracle has no packaged official campaigns for ${n}; this is not a universal airdrop index.`},summary:ve([]),results:[]};let i={fetchJson:e.fetchJson||(d=>jt(d,e)),rpcRead:e.rpcRead||(d=>$t(d,e))},c=e.nowMs??Date.now(),a=await Promise.all(s.map(d=>d.adapter==="hedgey-v4"?kt(d,r,i,c):Mt(d,r,i,c)));return{address:r,addressFamily:n,generatedAt:new Date(c).toISOString(),complete:a.every(d=>d.status!=="unavailable"&&d.sourceComplete!==!1),coverage:{universal:!1,campaignsChecked:s.length,chainsChecked:[...new Set(s.map(d=>d.chain))].sort(),reason:u},summary:ve(a),results:a}}function Me(t){let e=[],r=t.summary?.claimable||0;e.push(`Airdrop scan: ${r} verified claimable${r===1?"":"s"}`),e.push(`Address: ${t.address} (${t.addressFamily})`);for(let n of t.results||[]){let s=n.amountFormatted?`${n.amountFormatted} ${n.tokenSymbol}`:n.tokenSymbol;e.push(`${String(n.status).toUpperCase()} ${s} ${n.project} on ${n.chain}`),n.status==="claimable"&&e.push(`Claim: ${n.claimUrl}`),n.error&&e.push(`Source error: ${n.error}`),n.restriction&&e.push(`Restriction: ${n.restriction}`)}return(t.results||[]).length===0&&e.push("No packaged official campaigns support this address family yet."),e.push(`Coverage: ${t.coverage.reason}`),e.join(`
|
|
3
3
|
`)}var Ie=`oracle airdrop <address> [--json]
|
|
4
4
|
|
|
5
5
|
Checks packaged official machine-readable airdrop sources, then verifies proofs
|
|
@@ -7,10 +7,10 @@ and claimed state against each project claim contract.
|
|
|
7
7
|
|
|
8
8
|
Read-only. Requires an explicit wallet address. It never connects a wallet,
|
|
9
9
|
signs, approves, broadcasts, or claims. Coverage is not a universal airdrop
|
|
10
|
-
index, and unavailable sources are never reported as ineligible.`,
|
|
10
|
+
index, and unavailable sources are never reported as ineligible.`,Yt={name:"airdrop",summary:"verify official airdrop eligibility and claimed state",group:"read",usage:Ie,async run(t={}){let e=Array.isArray(t.argv)?t.argv:[],r=new Set(["--json","--help","-h"]),n=e.filter(i=>i.startsWith("-")&&!r.has(i)),s=e.filter(i=>!i.startsWith("-"));if(n.length||s.length>1)return process.stderr.write(`oracle airdrop only accepts one explicit address and optional --json
|
|
11
11
|
`),1;if(e.includes("--help")||e.includes("-h"))return process.stdout.write(`${Ie}
|
|
12
|
-
`),0;let
|
|
13
|
-
`),1;try{let
|
|
14
|
-
`):process.stdout.write(`${(t.airdropRender||Me)(
|
|
12
|
+
`),0;let u=String(s[0]||"").trim();if(!u)return process.stderr.write(`oracle airdrop requires an explicit wallet address
|
|
13
|
+
`),1;try{let c=await(t.airdropScan||ke)(u,t.fetchImpl?{fetchImpl:t.fetchImpl}:{});return e.includes("--json")?process.stdout.write(`${JSON.stringify(c,null,2)}
|
|
14
|
+
`):process.stdout.write(`${(t.airdropRender||Me)(c)}
|
|
15
15
|
`),0}catch(i){return process.stderr.write(`oracle airdrop failed: ${i?.message||i}
|
|
16
|
-
`),1}}};export{
|
|
16
|
+
`),1}}};export{Yt as default};
|