@oracle-agent/oracle 0.35.49 → 0.35.50
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 +6 -6
- 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/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/eval/index.html +19 -19
- package/public/oracle-splash/eval/releases/oracle-0.35.49.json +852 -0
- package/public/oracle-splash/index.html +9 -9
- package/server.json +2 -2
package/dist/lp/index.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
var kn=Object.defineProperty;var Tn=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(r){throw n=[r],r}};var An=(e,t)=>{for(var n in t)kn(e,n,{get:t[n],enumerable:!0})};var Ot={};An(Ot,{MAX_SQRT_RATIO:()=>ot,MAX_TICK:()=>Ee,MIN_SQRT_RATIO:()=>rt,MIN_TICK:()=>xe,NET_PNL_COMPONENTS:()=>Tt,NET_PNL_FORMULA:()=>At,Q128:()=>Ye,Q192:()=>Le,Q32:()=>St,Q96:()=>Me,UINT256_MAX:()=>nt,amount0InToken1:()=>tt,amountsForLiquidity:()=>Ie,amountsValueUsd:()=>it,bigintSqrt:()=>kt,feeGrowthInside:()=>et,feesAccrued:()=>at,feesToUsd:()=>Bn,formatNet:()=>jn,formatUnitsNumber:()=>Ue,getAmount0ForLiquidity:()=>Qe,getAmount1ForLiquidity:()=>Ze,getLiquidityForAmount0:()=>We,getLiquidityForAmount1:()=>Je,getSqrtRatioAtTick:()=>Te,getTickAtSqrtRatio:()=>_n,impermanentLoss:()=>qn,liquidityForAmounts:()=>Cn,nearestUsableTick:()=>Nn,netPnl:()=>Fn,positionValueUsd:()=>$n,priceToSqrtPriceX96:()=>Ln,priceToTick:()=>Un,sqrtPriceX96ToPrice:()=>Mn,tickToPrice:()=>vn,toBigInt:()=>ie,toUint128:()=>Ce,toUint160:()=>re,toUint256:()=>se});function ie(e,t="value"){if(typeof e=="bigint")return e;if(typeof e=="number"){if(!Number.isInteger(e))throw new Error(`${t} must be an integer`);if(!Number.isSafeInteger(e))throw new Error(`${t} exceeds safe integer range; pass a bigint or string`);return BigInt(e)}if(typeof e=="string"){let n=e.trim();if(!/^-?(0x[0-9a-fA-F]+|\d+)$/.test(n))throw new Error(`${t} is not an integer string`);return BigInt(n)}if(e&&typeof e=="object"&&typeof e.toString=="function")return ie(e.toString(),t);throw new Error(`${t} must be a bigint, integer, or integer string`)}function st(e,t,n){let r=ie(e,t);if(r<0n||r>n)throw new Error(`${t} out of range`);return r}function se(e,t="value"){return st(e,t,nt)}function re(e,t="sqrtPriceX96"){return st(e,t,Pn)}function Ce(e,t="liquidity"){return st(e,t,On)}function ye(e,t="tick"){let n=Number(e);if(!Number.isInteger(n))throw new Error(`${t} must be an integer`);if(n<xe||n>Ee)throw new Error(`${t} ${n} outside [${xe}, ${Ee}]`);return n}function ae(e,t){let n=Number(e);if(!Number.isInteger(n)||n<0||n>77)throw new Error(`${t} must be an integer in [0, 77]`);return n}function fe(e){return typeof e=="number"&&Number.isFinite(e)}function Te(e){let t=ye(e),n=BigInt(Math.abs(t)),r=(n&0x1n)!==0n?0xfffcb933bd6fad37aa2d162d1a594001n:0x100000000000000000000000000000000n;for(let[o,s]of Rn)(n&o)!==0n&&(r=r*s>>128n);return t>0&&(r=nt/r),(r>>32n)+(r%St===0n?0n:1n)}function _n(e){let t=re(e);if(t<rt||t>=ot)throw new Error("sqrtPriceX96 outside [MIN_SQRT_RATIO, MAX_SQRT_RATIO)");let n=xe,r=Ee;for(;n<r;){let o=Math.ceil((n+r)/2);Te(o)<=t?n=o:r=o-1}return n}function Nn(e,t){let n=ye(e),r=Number(t);if(!Number.isInteger(r)||r<=0)throw new Error("tickSpacing must be a positive integer");let o=Math.round(n/r)*r;return o<xe?o+r:o>Ee?o-r:o}function vn(e,t=18,n=18){let r=ye(e),o=ae(t,"decimals0"),s=ae(n,"decimals1");return 1.0001**r*10**(o-s)}function Un(e,t=18,n=18){if(!fe(e)||e<=0)throw new Error("price must be a positive finite number");let r=ae(t,"decimals0"),o=ae(n,"decimals1"),s=e*10**(o-r),i=Math.floor(Math.log(s)/Math.log(1.0001));return Math.min(Ee,Math.max(xe,i))}function Mn(e,t=18,n=18){let r=re(e),o=ae(t,"decimals0"),s=ae(n,"decimals1"),i=10n**36n,l=r*r*i/Le;return Number(l)/1e36*10**(o-s)}function kt(e){let t=ie(e,"n");if(t<0n)throw new Error("sqrt of negative");if(t<2n)return t;let n=BigInt(Math.floor(Math.sqrt(Number(t))));for(;;){let r=n+t/n>>1n;if(r>=n){for(;n*n>t;)n-=1n;for(;(n+1n)*(n+1n)<=t;)n+=1n;return n}n=r}}function Ln(e,t=18,n=18){if(!fe(e)||e<=0)throw new Error("price must be a positive finite number");let r=ae(t,"decimals0"),o=ae(n,"decimals1"),s=18n,i=BigInt(Math.round(e*1e18));if(i<=0n)throw new Error("price too small to represent");let l=i*Le,u=10n**s;o>=r?l*=10n**BigInt(o-r):u*=10n**BigInt(r-o);let a=kt(l/u);if(a<rt||a>ot)throw new Error("price outside representable sqrt range");return a}function Se(e,t){let n=re(e,"sqrtRatioAX96"),r=re(t,"sqrtRatioBX96");return n>r?[r,n]:[n,r]}function We(e,t,n){let[r,o]=Se(e,t),s=se(n,"amount0");if(o===r)throw new Error("sqrt ratios must differ");let i=r*o/Me;return s*i/(o-r)}function Je(e,t,n){let[r,o]=Se(e,t),s=se(n,"amount1");if(o===r)throw new Error("sqrt ratios must differ");return s*Me/(o-r)}function Cn(e,t,n,r,o){let s=re(n),[i,l]=Se(r,o);if(s<=i)return We(i,l,e);if(s<l){let u=We(s,l,e),a=Je(i,s,t);return u<a?u:a}return Je(i,l,t)}function Qe(e,t,n){let[r,o]=Se(e,t),s=Ce(n);if(r===0n)throw new Error("sqrtRatioAX96 must be > 0");return(s<<96n)*(o-r)/o/r}function Ze(e,t,n){let[r,o]=Se(e,t);return Ce(n)*(o-r)/Me}function Ie(e,t,n,r){let o=re(t),[s,i]=Se(n,r);return o<=s?{amount0:Qe(s,i,e),amount1:0n}:o<i?{amount0:Qe(o,i,e),amount1:Ze(s,o,e)}:{amount0:0n,amount1:Ze(s,i,e)}}function Ue(e,t){let n=ie(e,"amount"),r=ae(t,"decimals"),o=n<0n,s=o?-n:n,i=10n**BigInt(r),l=s/i,u=s%i,a=Number(l)+Number(u)/Number(i);return o?-a:a}function $n({liquidity:e,sqrtPriceX96:t,sqrtRatioAX96:n,sqrtRatioBX96:r,decimals0:o,decimals1:s,price0Usd:i,price1Usd:l}){let{amount0:u,amount1:a}=Ie(e,t,n,r);return it({amount0:u,amount1:a,decimals0:o,decimals1:s,price0Usd:i,price1Usd:l})}function it({amount0:e,amount1:t,decimals0:n,decimals1:r,price0Usd:o,price1Usd:s}){let i=ie(e,"amount0"),l=ie(t,"amount1"),u=[],a="unknown",c="unknown";fe(o)&&o>=0?a=Ue(i,n)*o:u.push("price0Usd"),fe(s)&&s>=0?c=Ue(l,r)*s:u.push("price1Usd");let f=u.length?"unknown":a+c;return Object.freeze({valueUsd:f,value0Usd:a,value1Usd:c,amount0:i,amount1:l,unknown:Object.freeze(u)})}function ge(e,t){return((e-t)%Ke+Ke)%Ke}function et({tickCurrent:e,tickLower:t,tickUpper:n,feeGrowthGlobalX128:r,feeGrowthOutsideLowerX128:o,feeGrowthOutsideUpperX128:s}){let i=ye(e,"tickCurrent"),l=ye(t,"tickLower"),u=ye(n,"tickUpper");if(l>=u)throw new Error("tickLower must be < tickUpper");let a=se(r,"feeGrowthGlobalX128"),c=se(o,"feeGrowthOutsideLowerX128"),f=se(s,"feeGrowthOutsideUpperX128"),m=i>=l?c:ge(a,c),p=i<u?f:ge(a,f);return ge(ge(a,m),p)}function at({tickCurrent:e,tickLower:t,tickUpper:n,liquidity:r,feeGrowthGlobal0X128:o,feeGrowthGlobal1X128:s,feeGrowthOutsideLower0X128:i,feeGrowthOutsideLower1X128:l,feeGrowthOutsideUpper0X128:u,feeGrowthOutsideUpper1X128:a,feeGrowthInside0LastX128:c,feeGrowthInside1LastX128:f}){let m=Ce(r),p=et({tickCurrent:e,tickLower:t,tickUpper:n,feeGrowthGlobalX128:o,feeGrowthOutsideLowerX128:i,feeGrowthOutsideUpperX128:u}),d=et({tickCurrent:e,tickLower:t,tickUpper:n,feeGrowthGlobalX128:s,feeGrowthOutsideLowerX128:l,feeGrowthOutsideUpperX128:a}),b=se(c,"feeGrowthInside0LastX128"),h=se(f,"feeGrowthInside1LastX128"),E=ge(p,b)*m/Ye,I=ge(d,h)*m/Ye;return Object.freeze({feeGrowthInside0X128:p,feeGrowthInside1X128:d,fees0:E,fees1:I})}function Bn({fees0:e,fees1:t,decimals0:n,decimals1:r,price0Usd:o,price1Usd:s}){let i=it({amount0:e,amount1:t,decimals0:n,decimals1:r,price0Usd:o,price1Usd:s});return Object.freeze({feesUsd:i.valueUsd,fees0Usd:i.value0Usd,fees1Usd:i.value1Usd,unknown:i.unknown})}function tt(e,t){let n=se(e,"amount0"),r=re(t);return n*r*r/Le}function qn({liquidity:e,sqrtPriceEntryX96:t,sqrtPriceNowX96:n,sqrtRatioAX96:r,sqrtRatioBX96:o,decimals1:s,price1Usd:i}){let l=re(t,"sqrtPriceEntryX96"),u=re(n,"sqrtPriceNowX96"),a=Ie(e,l,r,o),c=Ie(e,u,r,o),f=tt(a.amount0,u)+a.amount1,m=tt(c.amount0,u)+c.amount1,p=f-m,d=f===0n?0:Number(m-f)/Number(f),b="unknown",h=[];return s!=null&&fe(i)&&i>=0?b=Ue(p,s)*i:h.push("price1Usd"),Object.freeze({entryAmount0:a.amount0,entryAmount1:a.amount1,nowAmount0:c.amount0,nowAmount1:c.amount1,hodlValue1:f,lpValue1:m,ilLossValue1:p,ilFraction:d,ilUsd:b,unknown:Object.freeze(h)})}function Fn(e={}){let t={},n=[];for(let o of Tt){let s=e?.[o];fe(s)?t[o]=s:(t[o]="unknown",n.push(o))}let r=n.length?"unknown":t.feesUsd-t.ilUsd-t.gasUsd-t.slippageUsd;return Object.freeze({net:r,components:Object.freeze(t),unknown:Object.freeze(n),formula:At})}function jn(e,t=2){return fe(e)?`${e<0?"-":""}$${Math.abs(e).toFixed(t)}`:"unknown"}var St,Me,Ye,Le,nt,Ke,On,Pn,xe,Ee,rt,ot,Rn,Tt,At,$e=Tn(()=>{St=1n<<32n,Me=1n<<96n,Ye=1n<<128n,Le=1n<<192n,nt=(1n<<256n)-1n,Ke=1n<<256n,On=(1n<<128n)-1n,Pn=(1n<<160n)-1n,xe=-887272,Ee=887272,rt=4295128739n,ot=1461446703485210103287273052203988822378723970342n;Rn=[[0x2n,0xfff97272373d413259a46990580e213an],[0x4n,0xfff2e50f5f656932ef12357cf3c7fdccn],[0x8n,0xffe5caca7e10e4e61c3624eaa0941cd0n],[0x10n,0xffcb9843d60f6159c9db58835c926644n],[0x20n,0xff973b41fa98c081472e6896dfb254c0n],[0x40n,0xff2ea16466c96a3843ec78b326b52861n],[0x80n,0xfe5dee046a99a2a811c461f1969c3053n],[0x100n,0xfcbe86c7900a88aedcffc83b479aa3a4n],[0x200n,0xf987a7253ac413176f2b074cf7815e54n],[0x400n,0xf3392b0822b70005940c7a398e4b70f3n],[0x800n,0xe7159475a2c29b7443b29c7fa6e889d9n],[0x1000n,0xd097f3bdfd2022b8845ad8f792aa5825n],[0x2000n,0xa9f746462d870fdf8a65dc1f90e061e5n],[0x4000n,0x70d869a156d2a1b890bb3df62baf32f7n],[0x8000n,0x31be135f97d08fd981231505542fcfa6n],[0x10000n,0x9aa508b5b7a84e1c677de54f3e99bc9n],[0x20000n,0x5d6af8dedb81196699c329225ee604n],[0x40000n,0x2216e584f5fa1ea926041bedfe98n],[0x80000n,0x48a170391f7dc42444e8fa2n]];Tt=Object.freeze(["feesUsd","ilUsd","gasUsd","slippageUsd"]),At="feesUsd - ilUsd - gasUsd - slippageUsd"});$e();import{Interface as Fr}from"ethers";import{createHash as Jn}from"node:crypto";import{types as ue}from"node:util";import{AsyncLocalStorage as Dn}from"node:async_hooks";var Hn=new Dn,zn=["http","retry","shared"],Gn=512;function Be(e){let t=Hn.getStore();if(!t||t.closed||!zn.includes(e))return null;if(t.spans.length>=Gn)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)}}import pe from"node:net";import Vn from"node:dns";var Xn=new Set(["localhost","metadata.google.internal","metadata.goog"]);function qe(e){let t=String(e).toLowerCase().split("%")[0];if((t.match(/::/g)||[]).length>1)return null;let n=c=>{if(!c)return[];let f=c.split(":"),m=f.at(-1);if(m?.includes(".")){let p=m.split(".").map(Number);if(p.length!==4||p.some(d=>!Number.isInteger(d)||d<0||d>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))},[r,o]=t.split("::"),s=n(r),i=n(o);if(!s||!i)return null;let l=t.includes("::"),u=8-s.length-i.length;if(!l&&u!==0||l&&u<1)return null;let a=[...s,...Array(Math.max(0,u)).fill(0),...i];return a.length!==8?null:Uint8Array.from(a.flatMap(c=>[c>>8,c&255]))}function ct(e,t,n){let r=Math.floor(n/8),o=n%8;for(let i=0;i<r;i+=1)if(e[i]!==t[i])return!1;if(!o)return!0;let s=255<<8-o;return(e[r]&s)===(t[r]&s)}function ut(e){if(pe.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(pe.isIPv6(e)){let t=qe(e);if(!t)return!1;let n=qe("::ffff:0:0");return ct(t,n,96)?ut([...t.slice(12)].join(".")):ct(t,qe("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([o,s])=>ct(t,qe(o),s)):!1}return!1}function Kn(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(Xn.has(n)||n.endsWith(".localhost")||n.endsWith(".internal"))return{ok:!1,error:`refused internal host ${n}`};let r=pe.isIP(n);return r!==0&&!ut(n)?{ok:!1,error:`refused private address ${n}`}:{ok:!0,url:t,host:n,isLiteralIp:r!==0}}async function lt(e,{lookupFn:t=Vn.promises.lookup}={}){let n=Kn(e);if(!n.ok)return n;if(n.isLiteralIp)return{ok:!0,url:n.url,addresses:[{address:n.host,family:pe.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=>!ut(o.address))?{ok:!1,error:`refused: ${n.host} resolves to a non-public address`}:{ok:!0,url:n.url,addresses:r}}function Yn(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 dt({requireUndici:e=!1,importUndici:t=()=>import("undici")}={}){let n,r,o;try{o=await t(),n=o.Agent,r=o.fetch}catch(p){if(e)throw new Error(`egress-guard: untrustedUrl pinning requires the undici package, which failed to load: ${p?.message||p}`);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 s=p=>String(p).toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,""),i=new Map,l=p=>(Array.isArray(p)?p:[p]).map(d=>typeof d=="string"?{address:d}:d).filter(d=>d&&d.address).map(d=>({address:d.address,family:d.family||(pe.isIPv6(d.address)?6:4)})),u=(p,d,b)=>{i.set(s(p),l(typeof d=="string"?[{address:d,family:b}]:d))},a=p=>{let d=s(p);if(pe.isIP(d))return[{address:d,family:pe.isIPv6(d)?6:4}];let b=i.get(d);if(!b||!b.length)throw new Error(`refused: unpinned host ${p} during pinned fetch`);return b},c=Yn(),f=c&&typeof o.ProxyAgent=="function"?new o.ProxyAgent({uri:c.uri,token:`Bearer ${c.token}`,connectTimeout:1e4}):new n({connect:{lookup(p,d,b){let h;try{h=a(p)}catch(E){return b(E)}return d?.all?b(null,h):b(null,h[0].address,h[0].family)}}}),m=Wn((p,d={})=>r(p,{...d,dispatcher:f}),u);return{dispatcher:f,fetch:m,pin:u,resolve:a,async close(){try{await f.destroy()}catch{}}}}var ft=Symbol.for("oracle.egressGuard.pinCapableFetch");function Wn(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[ft]=Object.freeze({pin:t}),e}function pt(e){return typeof e=="function"&&typeof e[ft]?.pin=="function"}function Pt(e,t,n){if(!pt(e))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");e[ft].pin(t,n)}var Qn=new Set([408,425,429,500,502,503,504]),Rt=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),Zn=2,_t=4e3,er=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"aborted")?.get,tr=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"reason")?.get,nr=AbortSignal.prototype.throwIfAborted,rr=EventTarget.prototype.addEventListener,Nt=EventTarget.prototype.removeEventListener,vt=typeof AbortSignal.any=="function"?AbortSignal.any.bind(AbortSignal):null,Ae=e=>e?er.call(e):!1,or=e=>e?tr.call(e):void 0,sr=new Set([301,302,303,307,308]),je=3,ko=64*1024,ce=Object.freeze({depth:32,nodes:1e4,fields:1e4,arrayLength:1e4,bytes:1024*1024});function $(e){return le(`HTTP JSON body refused: ${e}`)}function ir(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 ue[t]=="function"&&ue[t](e))}function ar(e){let t=[],n=0,r=0,o=0,s=0,i=new WeakSet,l=c=>{if(n+=Buffer.byteLength(c,"utf8"),n>ce.bytes)throw $("serialized byte limit exceeded");t.push(c)},u=c=>{if(Buffer.byteLength(c,"utf8")>ce.bytes)throw $("serialized byte limit exceeded");return JSON.stringify(c)},a=(c,f)=>{if(r+=1,r>ce.nodes)throw $("node limit exceeded");if(f>ce.depth)throw $("depth limit exceeded");if(c===null){l("null");return}if(typeof c=="string"){l(u(c));return}if(typeof c=="boolean"){l(c?"true":"false");return}if(typeof c=="number"){if(!Number.isFinite(c))throw $("non-finite number");l(Object.is(c,-0)?"0":String(c));return}if(typeof c!="object")throw $("unsupported non-JSON value");if(ue.isProxy(c))throw $("proxy value");if(ir(c))throw $("unsupported exotic object");if(i.has(c))throw $("cyclic value");i.add(c);try{if(Object.getOwnPropertySymbols(c).length>0)throw $("symbol-keyed fields are unsupported");if(Array.isArray(c)){let d=Object.getPrototypeOf(c),b=0;for(;d!==null;){if(ue.isProxy(d))throw $("proxy array prototype");if(b+=1,b>ce.depth)throw $("array prototype depth limit exceeded");d=Object.getPrototypeOf(d)}if(c.length>ce.arrayLength)throw $("array length limit exceeded");for(let E=0;E<c.length;E+=1){let I=Object.getOwnPropertyDescriptor(c,String(E));if(!I||!Object.hasOwn(I,"value")||I.enumerable!==!0)throw $("array entries must be dense enumerable own data")}let h=0;for(let E in c){if(s+=1,s>ce.fields)throw $("enumeration limit exceeded");if(Object.hasOwn(c,E)&&(h+=1,h>c.length))throw $("named array fields are unsupported")}if(h!==c.length)throw $("array entries must be dense enumerable own data");l("[");for(let E=0;E<c.length;E+=1)E&&l(","),a(Object.getOwnPropertyDescriptor(c,String(E)).value,f+1);l("]");return}let m=Object.getPrototypeOf(c);if(m!==Object.prototype&&m!==null)throw $("non-plain object");let p=[];for(let d in c){if(s+=1,s>ce.fields)throw $("enumeration limit exceeded");if(!Object.hasOwn(c,d))continue;if(o+=1,o>ce.fields)throw $("field limit exceeded");let b=Object.getOwnPropertyDescriptor(c,d);if(!b||!Object.hasOwn(b,"value")||b.enumerable!==!0)throw $("object fields must be enumerable own data");p.push([d,b.value])}l("{");for(let d=0;d<p.length;d+=1)d&&l(","),l(u(p[d][0])),l(":"),a(p[d][1],f+1);l("}")}finally{i.delete(c)}};return a(e,0),t.join("")}function cr(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(ue.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 s=Object.getOwnPropertyDescriptor(e,r);if(!s||!Object.hasOwn(s,"value"))throw new TypeError("HTTP headers must contain own data properties");let i=s.value;if(i==null||["object","function","symbol"].includes(typeof i))throw new TypeError("HTTP header values must be scalar");t[r]=String(i)}return t}function ur(){return Object.assign(Object.create(null),{Accept:"application/json"})}function lr(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 dr(e,t){return new URL(String(e)).origin===new URL(String(t)).origin}var mt=new Map,Ut=new WeakMap,Mt=1;function Fe(e){if((typeof e!="object"||e===null)&&typeof e!="function")return`${typeof e}:${String(e)}`;let t=Ut.get(e);return t||(t=Mt,Mt+=1,Ut.set(e,t)),`reference:${t}`}var fr=new Set(["eth_blockNumber","eth_call","eth_chainId","eth_estimateGas","getHealth","minimumLedgerSlot","net_version","simulateTransaction","web3_clientVersion"]),pr=new Set(["allMids","l2Book","outcomeMeta","spotClearinghouseState","userFills","meta","metaAndAssetCtxs","perpDexs","candleSnapshot","fundingHistory","openOrders","frontendOpenOrders","clearinghouseState","spotMeta","validatorSummaries","delegatorSummary","delegations","delegatorRewards","delegatorHistory","maxBuilderFee"]);function Lt(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?fr.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 Ct(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(Lt);if(!n||typeof n!="object")return!1;if(Object.hasOwn(n,"jsonrpc")||Object.hasOwn(n,"method"))return Lt(n);let r=Object.hasOwn(n,"type")?n.type:null;return typeof r=="string"&&pr.has(r)&&(!Object.hasOwn(n,"action")||n.action==null)&&(!Object.hasOwn(n,"signature")||n.signature==null)&&(!Object.hasOwn(n,"nonce")||n.nonce==null)}function mr(e,t,n,r={},o=null){let s=Jn("sha256"),i=(u,a)=>{let c=String(a);s.update(String(Buffer.byteLength(u,"utf8"))).update(":").update(u),s.update("=").update(String(Buffer.byteLength(c,"utf8"))).update(":").update(c).update(`
|
|
2
|
-
`)};i("method",e),i("url",t),Object.keys(n||{}).map((u,a)=>({name:u.toLowerCase(),order:a,value:String(n[u])})).sort((u,a)=>u.name.localeCompare(a.name)||u.order-a.order).forEach((u,a)=>{i(`header-name-${a}`,u.name),i(`header-value-${a}`,u.value)}),i("body",o??"-");for(let u of["untrustedUrl","maxResponseBytes","sameOriginRedirectsOnly","redirectPolicy","maxRedirects","timeoutMs","retries","fetchImpl","realFetch","lookupFn","importUndici","validateResponse"])i(`context-${u}`,r[u]??"-");return s.digest("hex")}function hr(e,t){let n=Number(t);return Number.isFinite(n)&&n>0?Math.min(n*1e3,_t):Math.min(250*2**e,_t)+Math.floor(Math.random()*100)}var wr=e=>new Promise(t=>setTimeout(t,e));function le(e,t={}){let n=new Error(e);return n.retryable=!1,Object.assign(n,t),n}function ht(e,t,n){return le(`HTTP response from ${e} exceeded maxResponseBytes ${n} (${t})`,{oversize:!0})}function me(e){try{let t=e?.body?.cancel?.();t&&typeof t.then=="function"&&t.catch(()=>{})}catch{}}function br(e){return e?e.byteLength??e.length??0:0}async function gr(e,t,{url:n,truncate:r=!1,onOversize:o}={}){if(t==null)return await e.text();let s=Number(e.headers?.get?.("content-length"));if(Number.isFinite(s)&&s>t&&(me(e),!r))throw ht(n,`content-length ${s}`,t);let i=e.body?.getReader?.();if(!i){let f=await e.text(),m=Buffer.byteLength(f,"utf8");if(m>t){if(!r)throw ht(n,`body ${m} bytes`,t);return Buffer.from(f,"utf8").subarray(0,t).toString("utf8")}return f}let l=[],u=0,a=!1;try{for(;;){let{value:f,done:m}=await i.read();if(m)break;if(f&&(l.push(Buffer.from(f)),u+=br(f),u>t)){a=!0;break}}}finally{if(a)try{await i.cancel()}catch{}try{i.releaseLock?.()}catch{}}if(a&&(typeof o=="function"&&o(),!r))throw ht(n,`streamed ${u} bytes`,t);let c=Buffer.concat(l);return(a?c.subarray(0,t):c).toString("utf8")}function yr(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function xr(e,{fetchImpl:t,method:n,headers:r,body:o,timeoutMs:s,lookupFn:i,realFetch:l,untrustedUrl:u=!1,maxResponseBytes:a=null,sameOriginRedirectsOnly:c=!1,importUndici:f,validateResponse:m,signal:p,redirectPolicy:d="follow",maxRedirects:b=je}){let h=null,E=t,I=i?{lookupFn:i}:{};if(u&&!l&&!pt(E))throw le(`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 k=new AbortController,R=setTimeout(()=>k.abort(),s),_=p?vt?vt([p,k.signal]):p:k.signal,U=async(x,{status:S=null}={})=>{let A=await lt(x,I);if(!A.ok)throw le(S==null?`HTTP refused ${x}: ${A.error}`:`HTTP redirect to ${x} ${A.error}`,S==null?{}:{status:S});let j=new URL(x).hostname;if(l){if(h&&(await h.close(),h=null),!h)try{h=await dt({requireUndici:!0,...f?{importUndici:f}:{}})}catch(g){throw le(S==null?`HTTP refused ${x}: ${g?.message||g}`:`HTTP redirect to ${x} refused: ${g?.message||g}`,S==null?{}:{status:S})}h.pin(j,A.addresses),E=h.fetch}else Pt(E,j,A.addresses);return A};try{let x=String(e),S=Object.assign(Object.create(null),r||{});u&&await U(x);for(let A=0;A<=b;A+=1){let j=Object.assign(Object.create(null),{method:n,headers:S,body:o,signal:_,redirect:"manual",dispatcher:void 0}),g=await E(x,j);if((d==="error"||b===0)&&g.status>=300&&g.status<400)throw me(g),le(`HTTP ${g.status} ${n} redirect refused`,{status:g.status,redirectRefused:!0});if(sr.has(g.status)){let M=c===!0&&n==="POST"&&[307,308].includes(g.status)&&Ct(n,o);if(n!=="GET"&&n!=="HEAD"&&!M){me(g);let P=new Error(`HTTP ${g.status} ${n} ${x} redirected non-idempotent request`);throw P.status=g.status,P}if(A===b)throw me(g),le(`HTTP ${g.status} ${n} redirect budget exhausted`,{status:g.status,redirectRefused:!0});let oe=g.headers?.get?.("location"),L;try{L=lr(oe,x)}catch(P){throw me(g),P}let B=!dr(L,x);if(me(g),B&&n==="POST"){let P=new Error(`HTTP ${g.status} ${n} cross-origin redirect refused`);throw P.status=g.status,P}if(B&&c){let P=new Error(`HTTP ${g.status} ${n} cross-origin redirect refused`);throw P.status=g.status,P.retryable=!1,P}if(B&&(S=ur(S)),u)await U(L,{status:g.status});else if(B){let P=await lt(L,I);if(!P.ok){let w=new Error(`HTTP redirect from ${x} ${P.error}`);throw w.status=g.status,w.retryable=!1,w}l&&P.addresses?.length&&(h||(h=await dt(f?{importUndici:f}:{})),h&&(h.pin(new URL(L).hostname,P.addresses),E=h.fetch))}x=L;continue}if(typeof m=="function")try{await m(g,{url:x})}catch(M){throw me(g),le(M?.message||String(M))}let N=await gr(g,a,{url:x,onOversize:()=>k.abort()}),C=yr(N);if(!g.ok){let M=new Error(`HTTP ${g.status} ${n} ${x}`);throw M.status=g.status,M.retryAfter=g.headers?.get?.("retry-after")??null,M.body=C??N.slice(0,300),M}return C??N}throw new Error(`HTTP redirect loop for ${e}`)}catch(x){if(k.signal.aborted&&!Ae(p)){let S=x&&(typeof x=="object"||typeof x=="function")&&!ue.isProxy(x)?x:null,A=S?Object.getOwnPropertyDescriptor(S,"oversize"):null;if(!(A&&Object.hasOwn(A,"value")&&A.value===!0))try{if(!S)throw new TypeError("unsafe rejection");Object.defineProperties(S,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}})}catch{let g=new Error("HTTP request timed out");throw Object.defineProperties(g,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}}),g}}throw x}finally{clearTimeout(R),h&&await h.close()}}async function wt(e,t={}){if(t!=null&&typeof t!="object"&&typeof t!="function")throw new TypeError("HTTP options must be an object");if(t!=null&&ue.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 w of Object.getOwnPropertyNames(t)){let y=Object.getOwnPropertyDescriptor(t,w);if(!(w==="toJSON"&&y&&Object.hasOwn(y,"value")&&y.value===void 0)){if(!n.has(w))throw new TypeError("HTTP options contain unknown fields");if(!y||!y.enumerable||!Object.hasOwn(y,"value"))throw new TypeError("HTTP options must contain enumerable own data properties")}}}let r=w=>{if(t==null||!Object.hasOwn(t,w))return;let y=Object.getOwnPropertyDescriptor(t,w);if(!y||!Object.hasOwn(y,"value"))throw new TypeError("HTTP options must contain own data properties");return y.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 s=r("timeoutMs");if(s!==void 0&&(!Number.isInteger(s)||s<1||s>12e4))throw new TypeError("HTTP timeoutMs must be a bounded integer");let i=r("retries");if(i!==void 0&&(!Number.isInteger(i)||i<0||i>10))throw new TypeError("HTTP retries must be a bounded integer");let l=r("redirectPolicy");if(l!==void 0&&l!=="follow"&&l!=="error")throw new TypeError('HTTP redirectPolicy must be "follow" or "error"');let u=r("maxRedirects");if(u!==void 0&&(!Number.isInteger(u)||u<0||u>je))throw new TypeError(`HTTP maxRedirects must be an integer from 0 through ${je}`);if(l==="error"&&u!==void 0&&u!==0)throw new TypeError('HTTP redirectPolicy "error" requires maxRedirects 0 when supplied');let a=l??"follow",c=a==="error"?0:u??je;for(let w of["dedupe","untrustedUrl","sameOriginRedirectsOnly"]){let y=r(w);if(y!==void 0&&typeof y!="boolean")throw new TypeError(`HTTP ${w} must be boolean`)}let f=r("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 m=r("signal");if(m!==void 0){if(ue.isProxy(m)||!(m instanceof AbortSignal))throw new TypeError("HTTP signal must be a native AbortSignal");try{Ae(m)}catch{throw new TypeError("HTTP signal must be a native AbortSignal")}}for(let w of["importUndici","lookupFn","validateResponse"]){let y=r(w);if(y!==void 0&&typeof y!="function")throw new TypeError(`HTTP ${w} must be a function`)}let p=r("fetchImpl"),d=p||globalThis.fetch;if(typeof d!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let b=s??12e3,h=(o||"GET").toUpperCase(),E=r("headers"),I=cr(E),k=Object.assign(Object.create(null),I);Object.keys(k).some(w=>w.toLowerCase()==="accept")||(k.Accept="application/json");let R=r("body");R!=null&&typeof R!="string"&&(Object.keys(k).find(y=>y.toLowerCase()==="content-type")||(k["Content-Type"]="application/json"),R=ar(R));let _=i??Zn,U=r("lookupFn"),x=!p,S=r("untrustedUrl")===!0,A=r("sameOriginRedirectsOnly")===!0,j=r("importUndici"),g=r("validateResponse"),N=m,C=f??null,M=async()=>{let w;for(let y=0;y<=_;y++){N&&nr.call(N);let te=Be("http");try{let F=await xr(e,{fetchImpl:d,method:h,headers:k,body:R,timeoutMs:b,lookupFn:U,realFetch:x,untrustedUrl:S,maxResponseBytes:C,sameOriginRedirectsOnly:A,importUndici:j,validateResponse:g,signal:N,redirectPolicy:a,maxRedirects:c});return te?.("succeeded"),F}catch(F){w=F;let K=ne=>{if(!F||typeof F!="object"&&typeof F!="function"||ue.isProxy(F))return;let H=Object.getOwnPropertyDescriptor(F,ne);return H&&Object.hasOwn(H,"value")?H.value:void 0},O=K("status");te?.("failed",O);let q=K("oracleTimeout")===!0||K("name")==="AbortError"||K("name")==="TimeoutError"||Ae(N),he=new Set([408,425,429]),J=K("retryable")===!1?!1:O!=null?he.has(O)||Qn.has(O)&&Rt.has(h):!q&&Rt.has(h);if(y===_||!J)throw F;let V=hr(y,K("retryAfter")),we=Be("retry"),Xe=!1;try{N?await new Promise((ne,H)=>{let be,ke=()=>{clearTimeout(be),Nt.call(N,"abort",ke),H(or(N)||new DOMException("Aborted","AbortError"))};if(Ae(N)){ke();return}be=setTimeout(()=>{Nt.call(N,"abort",ke),ne()},V),rr.call(N,"abort",ke,{once:!0}),Ae(N)&&ke()}):await wr(V),Xe=!0}finally{we?.(Xe?"succeeded":"failed")}}}throw w};if(!(r("dedupe")!==!1&&!N&&Ct(h,R)))return M();let L=mr(h,e,k,{untrustedUrl:S,maxResponseBytes:C,sameOriginRedirectsOnly:A,redirectPolicy:a,maxRedirects:c,timeoutMs:b,retries:_,fetchImpl:Fe(d),realFetch:x,lookupFn:Fe(U),importUndici:Fe(j),validateResponse:Fe(g)},R),B=mt.get(L);if(B){let w=Be("shared");try{let y=await B;return w?.("succeeded"),y}catch(y){throw w?.("failed"),y}}let P=M().finally(()=>mt.delete(L));return mt.set(L,P),P}var bt={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}};var Er=new Map(Object.values(bt).map(e=>[e.chainId,e]));function $t(e){return Er.get(Number(e))||null}function Bt(e,t=process.env){let n=$t(e);if(!n)return null;for(let r of n.rpcEnv){let o=(t[r]||"").trim();if(o)return o}return null}import{Interface as Ir,getAddress as Uo}from"ethers";var Mo=new Ir(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);var Sr={1:"https://ethereum.publicnode.com",137:"https://polygon-bor-rpc.publicnode.com",42161:"https://arbitrum-one-rpc.publicnode.com",8453:"https://base-rpc.publicnode.com",10:"https://optimism-rpc.publicnode.com",988:"https://rpc.stable.xyz",56:"https://bsc-rpc.publicnode.com",43114:"https://avalanche-c-chain-rpc.publicnode.com",999:"https://rpc.hyperliquid.xyz/evm",2741:"https://api.mainnet.abs.xyz",4663:"https://rpc.mainnet.chain.robinhood.com"};function kr(e,{rpcUrl:t,env:n=process.env}={}){if(t)return t;let r=Bt(e,n);return r||Sr[Number(e)]||null}var Tr=/^(?:eth_(?:call|blocknumber|chainid|get[a-z0-9]+|feehistory|gasprice|maxpriorityfeepergas|syncing|protocolversion|estimategas|createaccesslist)|net_(?:version|listening|peercount)|web3_(?:clientversion|sha3))$/;function Ar(e){let t=String(e||""),n=t.toLowerCase();if(t!==t.trim()||!/^[a-zA-Z0-9_]+$/.test(t)||!Tr.test(n))throw new Error(`evm-rpc: ${t} refused \u2014 @oracle-agent/oracle is prepare-only (read RPC only; no broadcast/sign)`);return n}var Oe=new Map,qt=new Map;function Or(e){let t=new Error(e?.message||JSON.stringify(e));return t.code=e?.code,t}function Pr(e){if(e?.error)throw Or(e.error);return e?.result}function Rr(e,t,n){return`${e}
|
|
1
|
+
var kn=Object.defineProperty;var Tn=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(r){throw n=[r],r}};var On=(e,t)=>{for(var n in t)kn(e,n,{get:t[n],enumerable:!0})};var At={};On(At,{MAX_SQRT_RATIO:()=>ot,MAX_TICK:()=>Ee,MIN_SQRT_RATIO:()=>rt,MIN_TICK:()=>xe,NET_PNL_COMPONENTS:()=>Tt,NET_PNL_FORMULA:()=>Ot,Q128:()=>Ye,Q192:()=>Me,Q32:()=>St,Q96:()=>Le,UINT256_MAX:()=>nt,amount0InToken1:()=>tt,amountsForLiquidity:()=>Ie,amountsValueUsd:()=>it,bigintSqrt:()=>kt,feeGrowthInside:()=>et,feesAccrued:()=>at,feesToUsd:()=>Bn,formatNet:()=>jn,formatUnitsNumber:()=>Ue,getAmount0ForLiquidity:()=>Qe,getAmount1ForLiquidity:()=>Ze,getLiquidityForAmount0:()=>We,getLiquidityForAmount1:()=>Je,getSqrtRatioAtTick:()=>Te,getTickAtSqrtRatio:()=>_n,impermanentLoss:()=>qn,liquidityForAmounts:()=>Cn,nearestUsableTick:()=>Nn,netPnl:()=>Fn,positionValueUsd:()=>$n,priceToSqrtPriceX96:()=>Mn,priceToTick:()=>Un,sqrtPriceX96ToPrice:()=>Ln,tickToPrice:()=>vn,toBigInt:()=>ie,toUint128:()=>Ce,toUint160:()=>re,toUint256:()=>se});function ie(e,t="value"){if(typeof e=="bigint")return e;if(typeof e=="number"){if(!Number.isInteger(e))throw new Error(`${t} must be an integer`);if(!Number.isSafeInteger(e))throw new Error(`${t} exceeds safe integer range; pass a bigint or string`);return BigInt(e)}if(typeof e=="string"){let n=e.trim();if(!/^-?(0x[0-9a-fA-F]+|\d+)$/.test(n))throw new Error(`${t} is not an integer string`);return BigInt(n)}if(e&&typeof e=="object"&&typeof e.toString=="function")return ie(e.toString(),t);throw new Error(`${t} must be a bigint, integer, or integer string`)}function st(e,t,n){let r=ie(e,t);if(r<0n||r>n)throw new Error(`${t} out of range`);return r}function se(e,t="value"){return st(e,t,nt)}function re(e,t="sqrtPriceX96"){return st(e,t,Pn)}function Ce(e,t="liquidity"){return st(e,t,An)}function ye(e,t="tick"){let n=Number(e);if(!Number.isInteger(n))throw new Error(`${t} must be an integer`);if(n<xe||n>Ee)throw new Error(`${t} ${n} outside [${xe}, ${Ee}]`);return n}function ae(e,t){let n=Number(e);if(!Number.isInteger(n)||n<0||n>77)throw new Error(`${t} must be an integer in [0, 77]`);return n}function fe(e){return typeof e=="number"&&Number.isFinite(e)}function Te(e){let t=ye(e),n=BigInt(Math.abs(t)),r=(n&0x1n)!==0n?0xfffcb933bd6fad37aa2d162d1a594001n:0x100000000000000000000000000000000n;for(let[o,s]of Rn)(n&o)!==0n&&(r=r*s>>128n);return t>0&&(r=nt/r),(r>>32n)+(r%St===0n?0n:1n)}function _n(e){let t=re(e);if(t<rt||t>=ot)throw new Error("sqrtPriceX96 outside [MIN_SQRT_RATIO, MAX_SQRT_RATIO)");let n=xe,r=Ee;for(;n<r;){let o=Math.ceil((n+r)/2);Te(o)<=t?n=o:r=o-1}return n}function Nn(e,t){let n=ye(e),r=Number(t);if(!Number.isInteger(r)||r<=0)throw new Error("tickSpacing must be a positive integer");let o=Math.round(n/r)*r;return o<xe?o+r:o>Ee?o-r:o}function vn(e,t=18,n=18){let r=ye(e),o=ae(t,"decimals0"),s=ae(n,"decimals1");return 1.0001**r*10**(o-s)}function Un(e,t=18,n=18){if(!fe(e)||e<=0)throw new Error("price must be a positive finite number");let r=ae(t,"decimals0"),o=ae(n,"decimals1"),s=e*10**(o-r),i=Math.floor(Math.log(s)/Math.log(1.0001));return Math.min(Ee,Math.max(xe,i))}function Ln(e,t=18,n=18){let r=re(e),o=ae(t,"decimals0"),s=ae(n,"decimals1"),i=10n**36n,l=r*r*i/Me;return Number(l)/1e36*10**(o-s)}function kt(e){let t=ie(e,"n");if(t<0n)throw new Error("sqrt of negative");if(t<2n)return t;let n=BigInt(Math.floor(Math.sqrt(Number(t))));for(;;){let r=n+t/n>>1n;if(r>=n){for(;n*n>t;)n-=1n;for(;(n+1n)*(n+1n)<=t;)n+=1n;return n}n=r}}function Mn(e,t=18,n=18){if(!fe(e)||e<=0)throw new Error("price must be a positive finite number");let r=ae(t,"decimals0"),o=ae(n,"decimals1"),s=18n,i=BigInt(Math.round(e*1e18));if(i<=0n)throw new Error("price too small to represent");let l=i*Me,u=10n**s;o>=r?l*=10n**BigInt(o-r):u*=10n**BigInt(r-o);let a=kt(l/u);if(a<rt||a>ot)throw new Error("price outside representable sqrt range");return a}function Se(e,t){let n=re(e,"sqrtRatioAX96"),r=re(t,"sqrtRatioBX96");return n>r?[r,n]:[n,r]}function We(e,t,n){let[r,o]=Se(e,t),s=se(n,"amount0");if(o===r)throw new Error("sqrt ratios must differ");let i=r*o/Le;return s*i/(o-r)}function Je(e,t,n){let[r,o]=Se(e,t),s=se(n,"amount1");if(o===r)throw new Error("sqrt ratios must differ");return s*Le/(o-r)}function Cn(e,t,n,r,o){let s=re(n),[i,l]=Se(r,o);if(s<=i)return We(i,l,e);if(s<l){let u=We(s,l,e),a=Je(i,s,t);return u<a?u:a}return Je(i,l,t)}function Qe(e,t,n){let[r,o]=Se(e,t),s=Ce(n);if(r===0n)throw new Error("sqrtRatioAX96 must be > 0");return(s<<96n)*(o-r)/o/r}function Ze(e,t,n){let[r,o]=Se(e,t);return Ce(n)*(o-r)/Le}function Ie(e,t,n,r){let o=re(t),[s,i]=Se(n,r);return o<=s?{amount0:Qe(s,i,e),amount1:0n}:o<i?{amount0:Qe(o,i,e),amount1:Ze(s,o,e)}:{amount0:0n,amount1:Ze(s,i,e)}}function Ue(e,t){let n=ie(e,"amount"),r=ae(t,"decimals"),o=n<0n,s=o?-n:n,i=10n**BigInt(r),l=s/i,u=s%i,a=Number(l)+Number(u)/Number(i);return o?-a:a}function $n({liquidity:e,sqrtPriceX96:t,sqrtRatioAX96:n,sqrtRatioBX96:r,decimals0:o,decimals1:s,price0Usd:i,price1Usd:l}){let{amount0:u,amount1:a}=Ie(e,t,n,r);return it({amount0:u,amount1:a,decimals0:o,decimals1:s,price0Usd:i,price1Usd:l})}function it({amount0:e,amount1:t,decimals0:n,decimals1:r,price0Usd:o,price1Usd:s}){let i=ie(e,"amount0"),l=ie(t,"amount1"),u=[],a="unknown",c="unknown";fe(o)&&o>=0?a=Ue(i,n)*o:u.push("price0Usd"),fe(s)&&s>=0?c=Ue(l,r)*s:u.push("price1Usd");let f=u.length?"unknown":a+c;return Object.freeze({valueUsd:f,value0Usd:a,value1Usd:c,amount0:i,amount1:l,unknown:Object.freeze(u)})}function ge(e,t){return((e-t)%Ke+Ke)%Ke}function et({tickCurrent:e,tickLower:t,tickUpper:n,feeGrowthGlobalX128:r,feeGrowthOutsideLowerX128:o,feeGrowthOutsideUpperX128:s}){let i=ye(e,"tickCurrent"),l=ye(t,"tickLower"),u=ye(n,"tickUpper");if(l>=u)throw new Error("tickLower must be < tickUpper");let a=se(r,"feeGrowthGlobalX128"),c=se(o,"feeGrowthOutsideLowerX128"),f=se(s,"feeGrowthOutsideUpperX128"),m=i>=l?c:ge(a,c),p=i<u?f:ge(a,f);return ge(ge(a,m),p)}function at({tickCurrent:e,tickLower:t,tickUpper:n,liquidity:r,feeGrowthGlobal0X128:o,feeGrowthGlobal1X128:s,feeGrowthOutsideLower0X128:i,feeGrowthOutsideLower1X128:l,feeGrowthOutsideUpper0X128:u,feeGrowthOutsideUpper1X128:a,feeGrowthInside0LastX128:c,feeGrowthInside1LastX128:f}){let m=Ce(r),p=et({tickCurrent:e,tickLower:t,tickUpper:n,feeGrowthGlobalX128:o,feeGrowthOutsideLowerX128:i,feeGrowthOutsideUpperX128:u}),d=et({tickCurrent:e,tickLower:t,tickUpper:n,feeGrowthGlobalX128:s,feeGrowthOutsideLowerX128:l,feeGrowthOutsideUpperX128:a}),b=se(c,"feeGrowthInside0LastX128"),h=se(f,"feeGrowthInside1LastX128"),E=ge(p,b)*m/Ye,I=ge(d,h)*m/Ye;return Object.freeze({feeGrowthInside0X128:p,feeGrowthInside1X128:d,fees0:E,fees1:I})}function Bn({fees0:e,fees1:t,decimals0:n,decimals1:r,price0Usd:o,price1Usd:s}){let i=it({amount0:e,amount1:t,decimals0:n,decimals1:r,price0Usd:o,price1Usd:s});return Object.freeze({feesUsd:i.valueUsd,fees0Usd:i.value0Usd,fees1Usd:i.value1Usd,unknown:i.unknown})}function tt(e,t){let n=se(e,"amount0"),r=re(t);return n*r*r/Me}function qn({liquidity:e,sqrtPriceEntryX96:t,sqrtPriceNowX96:n,sqrtRatioAX96:r,sqrtRatioBX96:o,decimals1:s,price1Usd:i}){let l=re(t,"sqrtPriceEntryX96"),u=re(n,"sqrtPriceNowX96"),a=Ie(e,l,r,o),c=Ie(e,u,r,o),f=tt(a.amount0,u)+a.amount1,m=tt(c.amount0,u)+c.amount1,p=f-m,d=f===0n?0:Number(m-f)/Number(f),b="unknown",h=[];return s!=null&&fe(i)&&i>=0?b=Ue(p,s)*i:h.push("price1Usd"),Object.freeze({entryAmount0:a.amount0,entryAmount1:a.amount1,nowAmount0:c.amount0,nowAmount1:c.amount1,hodlValue1:f,lpValue1:m,ilLossValue1:p,ilFraction:d,ilUsd:b,unknown:Object.freeze(h)})}function Fn(e={}){let t={},n=[];for(let o of Tt){let s=e?.[o];fe(s)?t[o]=s:(t[o]="unknown",n.push(o))}let r=n.length?"unknown":t.feesUsd-t.ilUsd-t.gasUsd-t.slippageUsd;return Object.freeze({net:r,components:Object.freeze(t),unknown:Object.freeze(n),formula:Ot})}function jn(e,t=2){return fe(e)?`${e<0?"-":""}$${Math.abs(e).toFixed(t)}`:"unknown"}var St,Le,Ye,Me,nt,Ke,An,Pn,xe,Ee,rt,ot,Rn,Tt,Ot,$e=Tn(()=>{St=1n<<32n,Le=1n<<96n,Ye=1n<<128n,Me=1n<<192n,nt=(1n<<256n)-1n,Ke=1n<<256n,An=(1n<<128n)-1n,Pn=(1n<<160n)-1n,xe=-887272,Ee=887272,rt=4295128739n,ot=1461446703485210103287273052203988822378723970342n;Rn=[[0x2n,0xfff97272373d413259a46990580e213an],[0x4n,0xfff2e50f5f656932ef12357cf3c7fdccn],[0x8n,0xffe5caca7e10e4e61c3624eaa0941cd0n],[0x10n,0xffcb9843d60f6159c9db58835c926644n],[0x20n,0xff973b41fa98c081472e6896dfb254c0n],[0x40n,0xff2ea16466c96a3843ec78b326b52861n],[0x80n,0xfe5dee046a99a2a811c461f1969c3053n],[0x100n,0xfcbe86c7900a88aedcffc83b479aa3a4n],[0x200n,0xf987a7253ac413176f2b074cf7815e54n],[0x400n,0xf3392b0822b70005940c7a398e4b70f3n],[0x800n,0xe7159475a2c29b7443b29c7fa6e889d9n],[0x1000n,0xd097f3bdfd2022b8845ad8f792aa5825n],[0x2000n,0xa9f746462d870fdf8a65dc1f90e061e5n],[0x4000n,0x70d869a156d2a1b890bb3df62baf32f7n],[0x8000n,0x31be135f97d08fd981231505542fcfa6n],[0x10000n,0x9aa508b5b7a84e1c677de54f3e99bc9n],[0x20000n,0x5d6af8dedb81196699c329225ee604n],[0x40000n,0x2216e584f5fa1ea926041bedfe98n],[0x80000n,0x48a170391f7dc42444e8fa2n]];Tt=Object.freeze(["feesUsd","ilUsd","gasUsd","slippageUsd"]),Ot="feesUsd - ilUsd - gasUsd - slippageUsd"});$e();import{Interface as Fr}from"ethers";import{createHash as Jn}from"node:crypto";import{types as ue}from"node:util";import{AsyncLocalStorage as Dn}from"node:async_hooks";var Hn=new Dn,zn=["http","retry","shared"],Gn=512;function Be(e){let t=Hn.getStore();if(!t||t.closed||!zn.includes(e))return null;if(t.spans.length>=Gn)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)}}import pe from"node:net";import Vn from"node:dns";var Xn=new Set(["localhost","metadata.google.internal","metadata.goog"]);function qe(e){let t=String(e).toLowerCase().split("%")[0];if((t.match(/::/g)||[]).length>1)return null;let n=c=>{if(!c)return[];let f=c.split(":"),m=f.at(-1);if(m?.includes(".")){let p=m.split(".").map(Number);if(p.length!==4||p.some(d=>!Number.isInteger(d)||d<0||d>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))},[r,o]=t.split("::"),s=n(r),i=n(o);if(!s||!i)return null;let l=t.includes("::"),u=8-s.length-i.length;if(!l&&u!==0||l&&u<1)return null;let a=[...s,...Array(Math.max(0,u)).fill(0),...i];return a.length!==8?null:Uint8Array.from(a.flatMap(c=>[c>>8,c&255]))}function ct(e,t,n){let r=Math.floor(n/8),o=n%8;for(let i=0;i<r;i+=1)if(e[i]!==t[i])return!1;if(!o)return!0;let s=255<<8-o;return(e[r]&s)===(t[r]&s)}function ut(e){if(pe.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(pe.isIPv6(e)){let t=qe(e);if(!t)return!1;let n=qe("::ffff:0:0");return ct(t,n,96)?ut([...t.slice(12)].join(".")):ct(t,qe("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([o,s])=>ct(t,qe(o),s)):!1}return!1}function Kn(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(Xn.has(n)||n.endsWith(".localhost")||n.endsWith(".internal"))return{ok:!1,error:`refused internal host ${n}`};let r=pe.isIP(n);return r!==0&&!ut(n)?{ok:!1,error:`refused private address ${n}`}:{ok:!0,url:t,host:n,isLiteralIp:r!==0}}async function lt(e,{lookupFn:t=Vn.promises.lookup}={}){let n=Kn(e);if(!n.ok)return n;if(n.isLiteralIp)return{ok:!0,url:n.url,addresses:[{address:n.host,family:pe.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=>!ut(o.address))?{ok:!1,error:`refused: ${n.host} resolves to a non-public address`}:{ok:!0,url:n.url,addresses:r}}function Yn(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 dt({requireUndici:e=!1,importUndici:t=()=>import("undici")}={}){let n,r,o;try{o=await t(),n=o.Agent,r=o.fetch}catch(p){if(e)throw new Error(`egress-guard: untrustedUrl pinning requires the undici package, which failed to load: ${p?.message||p}`);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 s=p=>String(p).toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,""),i=new Map,l=p=>(Array.isArray(p)?p:[p]).map(d=>typeof d=="string"?{address:d}:d).filter(d=>d&&d.address).map(d=>({address:d.address,family:d.family||(pe.isIPv6(d.address)?6:4)})),u=(p,d,b)=>{i.set(s(p),l(typeof d=="string"?[{address:d,family:b}]:d))},a=p=>{let d=s(p);if(pe.isIP(d))return[{address:d,family:pe.isIPv6(d)?6:4}];let b=i.get(d);if(!b||!b.length)throw new Error(`refused: unpinned host ${p} during pinned fetch`);return b},c=Yn(),f=c&&typeof o.ProxyAgent=="function"?new o.ProxyAgent({uri:c.uri,token:`Bearer ${c.token}`,connectTimeout:1e4}):new n({connect:{lookup(p,d,b){let h;try{h=a(p)}catch(E){return b(E)}return d?.all?b(null,h):b(null,h[0].address,h[0].family)}}}),m=Wn((p,d={})=>r(p,{...d,dispatcher:f}),u);return{dispatcher:f,fetch:m,pin:u,resolve:a,async close(){try{await f.destroy()}catch{}}}}var ft=Symbol.for("oracle.egressGuard.pinCapableFetch");function Wn(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[ft]=Object.freeze({pin:t}),e}function pt(e){return typeof e=="function"&&typeof e[ft]?.pin=="function"}function Pt(e,t,n){if(!pt(e))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");e[ft].pin(t,n)}var Qn=new Set([408,425,429,500,502,503,504]),Rt=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),Zn=2,_t=4e3,er=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"aborted")?.get,tr=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"reason")?.get,nr=AbortSignal.prototype.throwIfAborted,rr=EventTarget.prototype.addEventListener,Nt=EventTarget.prototype.removeEventListener,vt=typeof AbortSignal.any=="function"?AbortSignal.any.bind(AbortSignal):null,Oe=e=>e?er.call(e):!1,or=e=>e?tr.call(e):void 0,sr=new Set([301,302,303,307,308]),je=3,ko=64*1024,ce=Object.freeze({depth:32,nodes:1e4,fields:1e4,arrayLength:1e4,bytes:1024*1024});function $(e){return le(`HTTP JSON body refused: ${e}`)}function ir(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 ue[t]=="function"&&ue[t](e))}function ar(e){let t=[],n=0,r=0,o=0,s=0,i=new WeakSet,l=c=>{if(n+=Buffer.byteLength(c,"utf8"),n>ce.bytes)throw $("serialized byte limit exceeded");t.push(c)},u=c=>{if(Buffer.byteLength(c,"utf8")>ce.bytes)throw $("serialized byte limit exceeded");return JSON.stringify(c)},a=(c,f)=>{if(r+=1,r>ce.nodes)throw $("node limit exceeded");if(f>ce.depth)throw $("depth limit exceeded");if(c===null){l("null");return}if(typeof c=="string"){l(u(c));return}if(typeof c=="boolean"){l(c?"true":"false");return}if(typeof c=="number"){if(!Number.isFinite(c))throw $("non-finite number");l(Object.is(c,-0)?"0":String(c));return}if(typeof c!="object")throw $("unsupported non-JSON value");if(ue.isProxy(c))throw $("proxy value");if(ir(c))throw $("unsupported exotic object");if(i.has(c))throw $("cyclic value");i.add(c);try{if(Object.getOwnPropertySymbols(c).length>0)throw $("symbol-keyed fields are unsupported");if(Array.isArray(c)){let d=Object.getPrototypeOf(c),b=0;for(;d!==null;){if(ue.isProxy(d))throw $("proxy array prototype");if(b+=1,b>ce.depth)throw $("array prototype depth limit exceeded");d=Object.getPrototypeOf(d)}if(c.length>ce.arrayLength)throw $("array length limit exceeded");for(let E=0;E<c.length;E+=1){let I=Object.getOwnPropertyDescriptor(c,String(E));if(!I||!Object.hasOwn(I,"value")||I.enumerable!==!0)throw $("array entries must be dense enumerable own data")}let h=0;for(let E in c){if(s+=1,s>ce.fields)throw $("enumeration limit exceeded");if(Object.hasOwn(c,E)&&(h+=1,h>c.length))throw $("named array fields are unsupported")}if(h!==c.length)throw $("array entries must be dense enumerable own data");l("[");for(let E=0;E<c.length;E+=1)E&&l(","),a(Object.getOwnPropertyDescriptor(c,String(E)).value,f+1);l("]");return}let m=Object.getPrototypeOf(c);if(m!==Object.prototype&&m!==null)throw $("non-plain object");let p=[];for(let d in c){if(s+=1,s>ce.fields)throw $("enumeration limit exceeded");if(!Object.hasOwn(c,d))continue;if(o+=1,o>ce.fields)throw $("field limit exceeded");let b=Object.getOwnPropertyDescriptor(c,d);if(!b||!Object.hasOwn(b,"value")||b.enumerable!==!0)throw $("object fields must be enumerable own data");p.push([d,b.value])}l("{");for(let d=0;d<p.length;d+=1)d&&l(","),l(u(p[d][0])),l(":"),a(p[d][1],f+1);l("}")}finally{i.delete(c)}};return a(e,0),t.join("")}function cr(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(ue.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 s=Object.getOwnPropertyDescriptor(e,r);if(!s||!Object.hasOwn(s,"value"))throw new TypeError("HTTP headers must contain own data properties");let i=s.value;if(i==null||["object","function","symbol"].includes(typeof i))throw new TypeError("HTTP header values must be scalar");t[r]=String(i)}return t}function ur(){return Object.assign(Object.create(null),{Accept:"application/json"})}function lr(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 dr(e,t){return new URL(String(e)).origin===new URL(String(t)).origin}var mt=new Map,Ut=new WeakMap,Lt=1;function Fe(e){if((typeof e!="object"||e===null)&&typeof e!="function")return`${typeof e}:${String(e)}`;let t=Ut.get(e);return t||(t=Lt,Lt+=1,Ut.set(e,t)),`reference:${t}`}var fr=new Set(["eth_blockNumber","eth_call","eth_chainId","eth_estimateGas","getHealth","minimumLedgerSlot","net_version","simulateTransaction","web3_clientVersion"]),pr=new Set(["allMids","l2Book","outcomeMeta","spotClearinghouseState","userFills","meta","metaAndAssetCtxs","perpDexs","candleSnapshot","fundingHistory","openOrders","frontendOpenOrders","clearinghouseState","spotMeta","validatorSummaries","delegatorSummary","delegations","delegatorRewards","delegatorHistory","maxBuilderFee"]);function Mt(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?fr.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 Ct(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(Mt);if(!n||typeof n!="object")return!1;if(Object.hasOwn(n,"jsonrpc")||Object.hasOwn(n,"method"))return Mt(n);let r=Object.hasOwn(n,"type")?n.type:null;return typeof r=="string"&&pr.has(r)&&(!Object.hasOwn(n,"action")||n.action==null)&&(!Object.hasOwn(n,"signature")||n.signature==null)&&(!Object.hasOwn(n,"nonce")||n.nonce==null)}function mr(e,t,n,r={},o=null){let s=Jn("sha256"),i=(u,a)=>{let c=String(a);s.update(String(Buffer.byteLength(u,"utf8"))).update(":").update(u),s.update("=").update(String(Buffer.byteLength(c,"utf8"))).update(":").update(c).update(`
|
|
2
|
+
`)};i("method",e),i("url",t),Object.keys(n||{}).map((u,a)=>({name:u.toLowerCase(),order:a,value:String(n[u])})).sort((u,a)=>u.name.localeCompare(a.name)||u.order-a.order).forEach((u,a)=>{i(`header-name-${a}`,u.name),i(`header-value-${a}`,u.value)}),i("body",o??"-");for(let u of["untrustedUrl","maxResponseBytes","sameOriginRedirectsOnly","redirectPolicy","maxRedirects","timeoutMs","retries","fetchImpl","realFetch","lookupFn","importUndici","validateResponse"])i(`context-${u}`,r[u]??"-");return s.digest("hex")}function hr(e,t){let n=Number(t);return Number.isFinite(n)&&n>0?Math.min(n*1e3,_t):Math.min(250*2**e,_t)+Math.floor(Math.random()*100)}var wr=e=>new Promise(t=>setTimeout(t,e));function le(e,t={}){let n=new Error(e);return n.retryable=!1,Object.assign(n,t),n}function ht(e,t,n){return le(`HTTP response from ${e} exceeded maxResponseBytes ${n} (${t})`,{oversize:!0})}function me(e){try{let t=e?.body?.cancel?.();t&&typeof t.then=="function"&&t.catch(()=>{})}catch{}}function br(e){return e?e.byteLength??e.length??0:0}async function gr(e,t,{url:n,truncate:r=!1,onOversize:o}={}){if(t==null)return await e.text();let s=Number(e.headers?.get?.("content-length"));if(Number.isFinite(s)&&s>t&&(me(e),!r))throw ht(n,`content-length ${s}`,t);let i=e.body?.getReader?.();if(!i){let f=await e.text(),m=Buffer.byteLength(f,"utf8");if(m>t){if(!r)throw ht(n,`body ${m} bytes`,t);return Buffer.from(f,"utf8").subarray(0,t).toString("utf8")}return f}let l=[],u=0,a=!1;try{for(;;){let{value:f,done:m}=await i.read();if(m)break;if(f&&(l.push(Buffer.from(f)),u+=br(f),u>t)){a=!0;break}}}finally{if(a)try{await i.cancel()}catch{}try{i.releaseLock?.()}catch{}}if(a&&(typeof o=="function"&&o(),!r))throw ht(n,`streamed ${u} bytes`,t);let c=Buffer.concat(l);return(a?c.subarray(0,t):c).toString("utf8")}function yr(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function xr(e,{fetchImpl:t,method:n,headers:r,body:o,timeoutMs:s,lookupFn:i,realFetch:l,untrustedUrl:u=!1,maxResponseBytes:a=null,sameOriginRedirectsOnly:c=!1,importUndici:f,validateResponse:m,signal:p,redirectPolicy:d="follow",maxRedirects:b=je}){let h=null,E=t,I=i?{lookupFn:i}:{};if(u&&!l&&!pt(E))throw le(`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 k=new AbortController,R=setTimeout(()=>k.abort(),s),_=p?vt?vt([p,k.signal]):p:k.signal,U=async(x,{status:S=null}={})=>{let O=await lt(x,I);if(!O.ok)throw le(S==null?`HTTP refused ${x}: ${O.error}`:`HTTP redirect to ${x} ${O.error}`,S==null?{}:{status:S});let j=new URL(x).hostname;if(l){if(h&&(await h.close(),h=null),!h)try{h=await dt({requireUndici:!0,...f?{importUndici:f}:{}})}catch(g){throw le(S==null?`HTTP refused ${x}: ${g?.message||g}`:`HTTP redirect to ${x} refused: ${g?.message||g}`,S==null?{}:{status:S})}h.pin(j,O.addresses),E=h.fetch}else Pt(E,j,O.addresses);return O};try{let x=String(e),S=Object.assign(Object.create(null),r||{});u&&await U(x);for(let O=0;O<=b;O+=1){let j=Object.assign(Object.create(null),{method:n,headers:S,body:o,signal:_,redirect:"manual",dispatcher:void 0}),g=await E(x,j);if((d==="error"||b===0)&&g.status>=300&&g.status<400)throw me(g),le(`HTTP ${g.status} ${n} redirect refused`,{status:g.status,redirectRefused:!0});if(sr.has(g.status)){let L=c===!0&&n==="POST"&&[307,308].includes(g.status)&&Ct(n,o);if(n!=="GET"&&n!=="HEAD"&&!L){me(g);let P=new Error(`HTTP ${g.status} ${n} ${x} redirected non-idempotent request`);throw P.status=g.status,P}if(O===b)throw me(g),le(`HTTP ${g.status} ${n} redirect budget exhausted`,{status:g.status,redirectRefused:!0});let oe=g.headers?.get?.("location"),M;try{M=lr(oe,x)}catch(P){throw me(g),P}let B=!dr(M,x);if(me(g),B&&n==="POST"){let P=new Error(`HTTP ${g.status} ${n} cross-origin redirect refused`);throw P.status=g.status,P}if(B&&c){let P=new Error(`HTTP ${g.status} ${n} cross-origin redirect refused`);throw P.status=g.status,P.retryable=!1,P}if(B&&(S=ur(S)),u)await U(M,{status:g.status});else if(B){let P=await lt(M,I);if(!P.ok){let w=new Error(`HTTP redirect from ${x} ${P.error}`);throw w.status=g.status,w.retryable=!1,w}l&&P.addresses?.length&&(h||(h=await dt(f?{importUndici:f}:{})),h&&(h.pin(new URL(M).hostname,P.addresses),E=h.fetch))}x=M;continue}if(typeof m=="function")try{await m(g,{url:x})}catch(L){throw me(g),le(L?.message||String(L))}let N=await gr(g,a,{url:x,onOversize:()=>k.abort()}),C=yr(N);if(!g.ok){let L=new Error(`HTTP ${g.status} ${n} ${x}`);throw L.status=g.status,L.retryAfter=g.headers?.get?.("retry-after")??null,L.body=C??N.slice(0,300),L}return C??N}throw new Error(`HTTP redirect loop for ${e}`)}catch(x){if(k.signal.aborted&&!Oe(p)){let S=x&&(typeof x=="object"||typeof x=="function")&&!ue.isProxy(x)?x:null,O=S?Object.getOwnPropertyDescriptor(S,"oversize"):null;if(!(O&&Object.hasOwn(O,"value")&&O.value===!0))try{if(!S)throw new TypeError("unsafe rejection");Object.defineProperties(S,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}})}catch{let g=new Error("HTTP request timed out");throw Object.defineProperties(g,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}}),g}}throw x}finally{clearTimeout(R),h&&await h.close()}}async function wt(e,t={}){if(t!=null&&typeof t!="object"&&typeof t!="function")throw new TypeError("HTTP options must be an object");if(t!=null&&ue.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 w of Object.getOwnPropertyNames(t)){let y=Object.getOwnPropertyDescriptor(t,w);if(!(w==="toJSON"&&y&&Object.hasOwn(y,"value")&&y.value===void 0)){if(!n.has(w))throw new TypeError("HTTP options contain unknown fields");if(!y||!y.enumerable||!Object.hasOwn(y,"value"))throw new TypeError("HTTP options must contain enumerable own data properties")}}}let r=w=>{if(t==null||!Object.hasOwn(t,w))return;let y=Object.getOwnPropertyDescriptor(t,w);if(!y||!Object.hasOwn(y,"value"))throw new TypeError("HTTP options must contain own data properties");return y.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 s=r("timeoutMs");if(s!==void 0&&(!Number.isInteger(s)||s<1||s>12e4))throw new TypeError("HTTP timeoutMs must be a bounded integer");let i=r("retries");if(i!==void 0&&(!Number.isInteger(i)||i<0||i>10))throw new TypeError("HTTP retries must be a bounded integer");let l=r("redirectPolicy");if(l!==void 0&&l!=="follow"&&l!=="error")throw new TypeError('HTTP redirectPolicy must be "follow" or "error"');let u=r("maxRedirects");if(u!==void 0&&(!Number.isInteger(u)||u<0||u>je))throw new TypeError(`HTTP maxRedirects must be an integer from 0 through ${je}`);if(l==="error"&&u!==void 0&&u!==0)throw new TypeError('HTTP redirectPolicy "error" requires maxRedirects 0 when supplied');let a=l??"follow",c=a==="error"?0:u??je;for(let w of["dedupe","untrustedUrl","sameOriginRedirectsOnly"]){let y=r(w);if(y!==void 0&&typeof y!="boolean")throw new TypeError(`HTTP ${w} must be boolean`)}let f=r("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 m=r("signal");if(m!==void 0){if(ue.isProxy(m)||!(m instanceof AbortSignal))throw new TypeError("HTTP signal must be a native AbortSignal");try{Oe(m)}catch{throw new TypeError("HTTP signal must be a native AbortSignal")}}for(let w of["importUndici","lookupFn","validateResponse"]){let y=r(w);if(y!==void 0&&typeof y!="function")throw new TypeError(`HTTP ${w} must be a function`)}let p=r("fetchImpl"),d=p||globalThis.fetch;if(typeof d!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let b=s??12e3,h=(o||"GET").toUpperCase(),E=r("headers"),I=cr(E),k=Object.assign(Object.create(null),I);Object.keys(k).some(w=>w.toLowerCase()==="accept")||(k.Accept="application/json");let R=r("body");R!=null&&typeof R!="string"&&(Object.keys(k).find(y=>y.toLowerCase()==="content-type")||(k["Content-Type"]="application/json"),R=ar(R));let _=i??Zn,U=r("lookupFn"),x=!p,S=r("untrustedUrl")===!0,O=r("sameOriginRedirectsOnly")===!0,j=r("importUndici"),g=r("validateResponse"),N=m,C=f??null,L=async()=>{let w;for(let y=0;y<=_;y++){N&&nr.call(N);let te=Be("http");try{let F=await xr(e,{fetchImpl:d,method:h,headers:k,body:R,timeoutMs:b,lookupFn:U,realFetch:x,untrustedUrl:S,maxResponseBytes:C,sameOriginRedirectsOnly:O,importUndici:j,validateResponse:g,signal:N,redirectPolicy:a,maxRedirects:c});return te?.("succeeded"),F}catch(F){w=F;let K=ne=>{if(!F||typeof F!="object"&&typeof F!="function"||ue.isProxy(F))return;let H=Object.getOwnPropertyDescriptor(F,ne);return H&&Object.hasOwn(H,"value")?H.value:void 0},A=K("status");te?.("failed",A);let q=K("oracleTimeout")===!0||K("name")==="AbortError"||K("name")==="TimeoutError"||Oe(N),he=new Set([408,425,429]),J=K("retryable")===!1?!1:A!=null?he.has(A)||Qn.has(A)&&Rt.has(h):!q&&Rt.has(h);if(y===_||!J)throw F;let V=hr(y,K("retryAfter")),we=Be("retry"),Xe=!1;try{N?await new Promise((ne,H)=>{let be,ke=()=>{clearTimeout(be),Nt.call(N,"abort",ke),H(or(N)||new DOMException("Aborted","AbortError"))};if(Oe(N)){ke();return}be=setTimeout(()=>{Nt.call(N,"abort",ke),ne()},V),rr.call(N,"abort",ke,{once:!0}),Oe(N)&&ke()}):await wr(V),Xe=!0}finally{we?.(Xe?"succeeded":"failed")}}}throw w};if(!(r("dedupe")!==!1&&!N&&Ct(h,R)))return L();let M=mr(h,e,k,{untrustedUrl:S,maxResponseBytes:C,sameOriginRedirectsOnly:O,redirectPolicy:a,maxRedirects:c,timeoutMs:b,retries:_,fetchImpl:Fe(d),realFetch:x,lookupFn:Fe(U),importUndici:Fe(j),validateResponse:Fe(g)},R),B=mt.get(M);if(B){let w=Be("shared");try{let y=await B;return w?.("succeeded"),y}catch(y){throw w?.("failed"),y}}let P=L().finally(()=>mt.delete(M));return mt.set(M,P),P}var bt={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}};var Er=new Map(Object.values(bt).map(e=>[e.chainId,e]));function $t(e){return Er.get(Number(e))||null}function Bt(e,t=process.env){let n=$t(e);if(!n)return null;for(let r of n.rpcEnv){let o=(t[r]||"").trim();if(o)return o}return null}import{Interface as Ir,getAddress as Uo}from"ethers";var Lo=new Ir(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);var Sr={1:"https://ethereum.publicnode.com",137:"https://polygon-bor-rpc.publicnode.com",42161:"https://arbitrum-one-rpc.publicnode.com",8453:"https://base-rpc.publicnode.com",10:"https://optimism-rpc.publicnode.com",988:"https://rpc.stable.xyz",56:"https://bsc-rpc.publicnode.com",43114:"https://avalanche-c-chain-rpc.publicnode.com",999:"https://rpc.hyperliquid.xyz/evm",2741:"https://api.mainnet.abs.xyz",4663:"https://rpc.mainnet.chain.robinhood.com",1339:"https://rpc.elysiumchain.tech"};function kr(e,{rpcUrl:t,env:n=process.env}={}){if(t)return t;let r=Bt(e,n);return r||Sr[Number(e)]||null}var Tr=/^(?:eth_(?:call|blocknumber|chainid|get[a-z0-9]+|feehistory|gasprice|maxpriorityfeepergas|syncing|protocolversion|estimategas|createaccesslist)|net_(?:version|listening|peercount)|web3_(?:clientversion|sha3))$/;function Or(e){let t=String(e||""),n=t.toLowerCase();if(t!==t.trim()||!/^[a-zA-Z0-9_]+$/.test(t)||!Tr.test(n))throw new Error(`evm-rpc: ${t} refused \u2014 @oracle-agent/oracle is prepare-only (read RPC only; no broadcast/sign)`);return n}var Ae=new Map,qt=new Map;function Ar(e){let t=new Error(e?.message||JSON.stringify(e));return t.code=e?.code,t}function Pr(e){if(e?.error)throw Ar(e.error);return e?.result}function Rr(e,t,n){return`${e}
|
|
3
3
|
${t}
|
|
4
|
-
${JSON.stringify(n??[])}`}async function _r(e,t,n){return wt(e,{method:"POST",body:t,fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3,signal:n.signal})}async function gt(e,t,n=[],r={}){let o=String(t||""),s=Ar(o),i=kr(e,r);if(!i)throw new Error(`No RPC URL for chainId ${e} (set env from chain registry rpcEnv or pass rpcUrl)`);if(s==="eth_chainid"&&r.cacheChainId!==!1){let c=qt.get(i);if(c!=null)return c}let u=r.dedupe!==!1&&!r.signal?Rr(i,o,n):null;if(u&&Oe.has(u))return Oe.get(u);let a=(async()=>{let c=await _r(i,{jsonrpc:"2.0",id:1,method:t,params:n},r),f=Pr(c);return s==="eth_chainid"&&typeof f=="string"&&qt.set(i,f),f})();return u&&(Oe.set(u,a),a.finally(()=>{Oe.get(u)===a&&Oe.delete(u)}).catch(()=>{})),a}import{AbiCoder as qr,Interface as Et,getAddress as ns,isAddress as rs,keccak256 as os}from"ethers";var Fo=Object.freeze({1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avalanche",999:"hyperevm",4663:"robinhood"});import{createHash as Nr,createHmac as vr,timingSafeEqual as Wo}from"node:crypto";var Ur=2,Mr=300*1e3,Lr=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})();function yt(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(yt).join(",")}]`:`{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${yt(e[n])}`).join(",")}}`}function Ft(e){let t=String(e?.ORACLE_STAMP_HMAC_SECRET||"").trim();return t.length>=16?t:""}function jt(e=process.env){return Ft(process.env)||Ft(e)}function Cr(e){let{prepareHash:t,prepareMac:n,note:r,...o}=e||{};return o}function $r(e){let t=Cr(e);return Nr("sha256").update(yt(t)).digest("hex")}function Br(e,t=jt()){return t?vr("sha256",t).update(String(e)).digest("hex"):""}function xt(e,{provider:t,kind:n,env:r=process.env,nowMs:o=Date.now(),expiresAtMs:s}={}){if(!e||typeof e!="object")throw new Error("stampPrepared: payload object required");let i=Object.prototype.hasOwnProperty.call(e,"oraclePrepared");if(i&&typeof e.oraclePrepared!="boolean")throw new Error("stampPrepared: oraclePrepared must be boolean");let l={...e,provider:e.provider||t,kind:e.kind||n,requiresUserSignature:e.requiresUserSignature!==!1,signingReady:!1,broadcastReady:!1,executionReady:!1,oraclePrepared:i?e.oraclePrepared:!0};if(!l.provider)throw new Error("stampPrepared: provider required");if(!l.kind)throw new Error("stampPrepared: kind required");let u=Number(o),a=s==null?u+Mr:Number(s),c=a-u;if(!Number.isSafeInteger(u)||!Number.isSafeInteger(a)||c<=0||c>Lr)throw new Error("stampPrepared: bounded preparedAt/expiresAt required");let m={...l,preparedAt:u,expiresAt:a,prepareVersion:Ur},p=$r(m),d=jt(r),b=d?Br(p,d):void 0,h={...m,prepareHash:p};return b&&(h.prepareMac=b),h}var us=qr.defaultAbiCoder();var Pe={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"}};var ls=new Et(["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)"]),ds=new Et(["function execute(bytes commands,bytes[] inputs,uint256 deadline) payable"]),fs=new Et(["function getSlot0(bytes32 poolId) view returns (uint160 sqrtPriceX96,int24 tick,uint24 protocolFee,uint24 lpFee)","function getLiquidity(bytes32 poolId) view returns (uint128 liquidity)"]),ps=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"]]),ms=(1n<<14n)-1n;$e();var Ht=Object.freeze(["function getSlot0(bytes32 poolId) view returns (uint160 sqrtPriceX96,int24 tick,uint24 protocolFee,uint24 lpFee)","function getLiquidity(bytes32 poolId) view returns (uint128 liquidity)","function getFeeGrowthGlobals(bytes32 poolId) view returns (uint256 feeGrowthGlobal0,uint256 feeGrowthGlobal1)","function getTickFeeGrowthOutside(bytes32 poolId,int24 tick) view returns (uint256 feeGrowthOutside0X128,uint256 feeGrowthOutside1X128)","function getTickInfo(bytes32 poolId,int24 tick) view returns (uint128 liquidityGross,int128 liquidityNet,uint256 feeGrowthOutside0X128,uint256 feeGrowthOutside1X128)","function getFeeGrowthInside(bytes32 poolId,int24 tickLower,int24 tickUpper) view returns (uint256 feeGrowthInside0X128,uint256 feeGrowthInside1X128)","function getPositionInfo(bytes32 poolId,address owner,int24 tickLower,int24 tickUpper,bytes32 salt) view returns (uint128 liquidity,uint256 feeGrowthInside0LastX128,uint256 feeGrowthInside1LastX128)"]),X=new Fr([...Ht]),zt=/^0x[0-9a-fA-F]{64}$/,jr=/^0x[0-9a-fA-F]{40}$/;function Gt(e){if(e==null||e==="")return`0x${"0".repeat(64)}`;if(typeof e=="string"&&zt.test(e))return e.toLowerCase();let t=ie(e,"salt");if(t<0n||t>=1n<<256n)throw new Error("salt out of bytes32 range");return`0x${t.toString(16).padStart(64,"0")}`}function Vt(e){let t=Number(e),n=Pe[t];if(!n)throw new Error(`v4-position-read: unsupported chainId ${e}`);if(!n.stateView)throw new Error(`v4-position-read: no StateView on chain ${t}`);return{chainId:t,stateView:n.stateView,name:n.name}}function Dt(e,t){let n=Number(e);if(!Number.isInteger(n)||n<-887272||n>887272)throw new Error(`${t} must be an int24 tick`);return n}async function Dr(e={},t={}){let{chainId:n,stateView:r,name:o}=Vt(e.chainId),s=String(e.poolId||"");if(!zt.test(s))throw new Error("v4-position-read: poolId must be bytes32");let i=String(e.owner||"");if(!jr.test(i))throw new Error("v4-position-read: owner must be an EVM address");let l=Dt(e.tickLower,"tickLower"),u=Dt(e.tickUpper,"tickUpper");if(l>=u)throw new Error("v4-position-read: tickLower must be < tickUpper");let a=Gt(e.salt),c=e.rpcCall||t.rpcCall||gt,f=e.blockTag||t.blockTag||"latest",m={slot0:X.encodeFunctionData("getSlot0",[s]),liquidity:X.encodeFunctionData("getLiquidity",[s]),feeGrowthGlobals:X.encodeFunctionData("getFeeGrowthGlobals",[s]),lowerOutside:X.encodeFunctionData("getTickFeeGrowthOutside",[s,l]),upperOutside:X.encodeFunctionData("getTickFeeGrowthOutside",[s,u]),position:X.encodeFunctionData("getPositionInfo",[s,i,l,u,a])},p=Object.keys(m),d=await Promise.all(p.map(M=>c(n,"eth_call",[{to:r,data:m[M]},f],t))),b=Object.fromEntries(p.map((M,oe)=>[M,d[oe]])),h=X.decodeFunctionResult("getSlot0",b.slot0),E=X.decodeFunctionResult("getLiquidity",b.liquidity)[0],I=X.decodeFunctionResult("getFeeGrowthGlobals",b.feeGrowthGlobals),k=X.decodeFunctionResult("getTickFeeGrowthOutside",b.lowerOutside),R=X.decodeFunctionResult("getTickFeeGrowthOutside",b.upperOutside),_=X.decodeFunctionResult("getPositionInfo",b.position),U=BigInt(h[0]),x=Number(h[1]),S=BigInt(_[0]),A=U>0n,j=Te(l),g=Te(u),N={amount0:0n,amount1:0n},C={fees0:0n,fees1:0n,feeGrowthInside0X128:0n,feeGrowthInside1X128:0n};return A&&(N=Ie(S,U,j,g),C=at({tickCurrent:x,tickLower:l,tickUpper:u,liquidity:S,feeGrowthGlobal0X128:BigInt(I[0]),feeGrowthGlobal1X128:BigInt(I[1]),feeGrowthOutsideLower0X128:BigInt(k[0]),feeGrowthOutsideLower1X128:BigInt(k[1]),feeGrowthOutsideUpper0X128:BigInt(R[0]),feeGrowthOutsideUpper1X128:BigInt(R[1]),feeGrowthInside0LastX128:BigInt(_[1]),feeGrowthInside1LastX128:BigInt(_[2])})),Object.freeze({venue:"uniswap-v4",chainId:n,chainName:o,stateView:r,blockTag:f,poolId:s.toLowerCase(),owner:i,salt:a,tickLower:l,tickUpper:u,inRange:A&&x>=l&&x<u,pool:Object.freeze({initialized:A,sqrtPriceX96:U.toString(),tick:x,protocolFee:Number(h[2]),lpFee:Number(h[3]),liquidity:BigInt(E).toString(),feeGrowthGlobal0X128:BigInt(I[0]).toString(),feeGrowthGlobal1X128:BigInt(I[1]).toString()}),ticks:Object.freeze({lower:Object.freeze({feeGrowthOutside0X128:BigInt(k[0]).toString(),feeGrowthOutside1X128:BigInt(k[1]).toString(),sqrtRatioX96:j.toString()}),upper:Object.freeze({feeGrowthOutside0X128:BigInt(R[0]).toString(),feeGrowthOutside1X128:BigInt(R[1]).toString(),sqrtRatioX96:g.toString()})}),position:Object.freeze({liquidity:S.toString(),feeGrowthInside0LastX128:BigInt(_[1]).toString(),feeGrowthInside1LastX128:BigInt(_[2]).toString(),amount0:N.amount0.toString(),amount1:N.amount1.toString(),feeGrowthInside0X128:C.feeGrowthInside0X128.toString(),feeGrowthInside1X128:C.feeGrowthInside1X128.toString(),uncollectedFees0:C.fees0.toString(),uncollectedFees1:C.fees1.toString()}),abiProvenance:Object.freeze({verified:Object.freeze(["getSlot0","getLiquidity"]),unverified:Object.freeze(["getFeeGrowthGlobals","getTickFeeGrowthOutside","getPositionInfo"])})})}var Es=Object.freeze({READ:"read",PREPARE:"prepare",EXECUTE:"execute",AUTONOMOUS:"autonomous"});function Xt(e=process.env){return String(e.ORACLE_AUTONOMOUS_TRADING??"").trim()==="1"}var Re={};try{Re=await Promise.resolve().then(()=>($e(),Ot))}catch(e){if(e?.code!=="ERR_MODULE_NOT_FOUND")throw e}var D="unknown",Wt=8760,Kt=-887272,Yt=887272,Hr=Math.log(1.0001),Jt=Object.freeze({.5:.6745,.68:.9945,.8:1.2816,.9:1.6449,.95:1.96}),Qt=Jt[.8];function T(e){return typeof e=="number"&&Number.isFinite(e)}function G(e){return e===D}function De(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function He(e,t,n){return Math.min(n,Math.max(t,e))}function zr(e,t){return Math.floor(e/t)*t}function Gr(e,t){return Math.ceil(e/t)*t}function Y(e){return Math.round(e*100)/100}function Zt(e){return Math.pow(1.0001,e)}function en(e){return Math.floor(Math.log(e)/Hr)}function ve(e={}){let t=e.tickToPrice??Re.tickToPrice??Zt,n=e.priceToTick??Re.priceToTick??en,r=e.netPnl??null,o=e.tickToPrice||e.priceToTick?"injected":Re.tickToPrice&&Re.priceToTick?"position-math":"local";return{tickToPrice:t,priceToTick:n,netPnl:r,source:o}}function Vr(e){let t=[];for(let n=1;n<e.length;n++){let r=e[n-1]?.t,o=e[n]?.t;T(r)&&T(o)&&o>r&&t.push((o-r)/36e5)}return t.length?(t.sort((n,r)=>n-r),t[Math.floor(t.length/2)]):1}function tn(e,t=24,{barHours:n}={}){if(!Array.isArray(e))throw new TypeError("bars must be an array");if(!Number.isInteger(t)||t<2)throw new TypeError("lookback must be an integer >= 2");let r=e.slice(-(t+1)).map(a=>a?.c);for(let a of r)if(!T(a)||!(a>0))throw new TypeError("bars[].c must be positive finite");if(r.length<3)return D;let o=[];for(let a=1;a<r.length;a++)o.push(Math.log(r[a]/r[a-1]));let s=o.reduce((a,c)=>a+c,0)/o.length,i=0;for(let a of o)i+=(a-s)**2;let l=Math.sqrt(i/(o.length-1)),u=T(n)&&n>0?n:Vr(e.slice(-(t+1)));return l*Math.sqrt(Wt/u)}function nn({volAnnual:e,horizonHours:t,k:n=Qt}={}){if(G(e))return D;if(!T(e)||e<0)throw new TypeError("volAnnual must be a finite number >= 0");if(!T(t)||t<=0)throw new TypeError("horizonHours must be > 0");if(!T(n)||n<=0)throw new TypeError("k must be > 0");return n*e*Math.sqrt(t/Wt)*100}function It({priceNow:e,widthPct:t,tickSpacing:n}={},{math:r}={}){if(!T(e)||e<=0)throw new TypeError("priceNow must be > 0");if(!T(t)||t<=0)throw new TypeError("widthPct must be > 0");if(!Number.isInteger(n)||n<=0)throw new TypeError("tickSpacing must be a positive integer");let o=ve(r),s=t/100,i=e/(1+s),l=e*(1+s),u=zr(o.priceToTick(i),n),a=o.priceToTick(l);o.tickToPrice(a)<l&&(a+=1);let c=Gr(a,n);return c<=u&&(c=u+n),u=He(u,Kt,Yt),c=He(c,Kt,Yt),{tickLower:u,tickUpper:c,priceLower:o.tickToPrice(u),priceUpper:o.tickToPrice(c),tickSpacing:n,widthPct:t}}function rn(e,t,{math:n}={}){if(!Number.isInteger(e)||!Number.isInteger(t)||t<=e)throw new TypeError("tickLower/tickUpper must be integers with tickUpper > tickLower");let r=ve(n);return{priceLower:r.tickToPrice(e),priceUpper:r.tickToPrice(t)}}function on({priceLower:e,priceUpper:t}){return(Math.sqrt(t/e)-1)*100}function _e({priceLower:e,priceUpper:t,entryPrice:n,priceNow:r,valueUsdAtEntry:o}={}){for(let[E,I]of Object.entries({priceLower:e,priceUpper:t,entryPrice:n,priceNow:r,valueUsdAtEntry:o}))if(!T(I)||I<=0)throw new TypeError(`${E} must be > 0`);if(t<=e)throw new TypeError("priceUpper must be > priceLower");let s=Math.sqrt(e),i=Math.sqrt(t),l=Math.sqrt(He(n,e,t)),u=Math.sqrt(He(r,e,t)),a=(i-l)/(l*i),c=l-s,f=a*n+c;if(!(f>0))return{ilUsd:0,lpValueUsd:o,holdValueUsd:o,liquidity:0};let m=o/f,p=(i-u)/(u*i),d=u-s,b=m*(p*r+d),h=m*(a*r+c);return{ilUsd:Math.max(0,h-b),lpValueUsd:b,holdValueUsd:h,liquidity:m}}function Ne(e,t,{min:n=0}={}){if(G(e))return D;if(!T(e)||e<n)throw new TypeError(`${t} must be a finite number >= ${n} or 'unknown'`);return e}function sn(e={},{env:t=process.env,math:n}={}){if(!De(e))throw new TypeError("input must be a plain object");let{position:r,priceNow:o,bars:s,gasUsd:i,slippageBps:l,feeRateEstimateUsdPerHour:u,horizonHours:a,hysteresisPct:c=0,minHoldHours:f=0,sinceLastRebalanceHours:m,autonomous:p=!1,tickSpacing:d,widthPct:b,drawdownGuardPct:h,positionValueUsd:E}=e;if(!De(r))throw new TypeError("position must be a plain object");if(!Number.isInteger(r.tickLower)||!Number.isInteger(r.tickUpper)||r.tickUpper<=r.tickLower)throw new TypeError("position.tickLower/tickUpper must be integers with tickUpper > tickLower");if(!T(o)||o<=0)throw new TypeError("priceNow must be > 0");if(s!=null&&!Array.isArray(s))throw new TypeError("bars must be an array when provided");if(!T(a)||a<=0)throw new TypeError("horizonHours must be > 0");if(!T(c)||c<0)throw new TypeError("hysteresisPct must be >= 0");if(!T(f)||f<0)throw new TypeError("minHoldHours must be >= 0");if(m!=null&&(!T(m)||m<0))throw new TypeError("sinceLastRebalanceHours must be >= 0 when provided");if(!Number.isInteger(d)||d<=0)throw new TypeError("tickSpacing must be a positive integer");if(h!=null&&(!T(h)||h<=0||h>=100))throw new TypeError("drawdownGuardPct must be in (0,100) when provided");let I=Ne(i,"gasUsd"),k=Ne(l,"slippageBps"),R=Ne(u,"feeRateEstimateUsdPerHour"),_=r.entryPriceUsd,U=T(E)?E:r.valueUsdAtEntry,x=ve(n),{priceLower:S,priceUpper:A}=rn(r.tickLower,r.tickUpper,{math:x}),j=o>=S&&o<=A,g=j?0:o<S?(S-o)/S*100:(o-A)/A*100,N={priceLower:S,priceUpper:A,inRange:j,distancePct:g},C=[],M=T(b)&&b>0?b:on({priceLower:S,priceUpper:A}),oe=It({priceNow:o,widthPct:M,tickSpacing:d},{math:x}),L=q=>({expectedFeesUsd:D,costUsd:D,netEdgeUsd:D,components:{gasUsd:I,slippageUsd:D,ilUsd:D},range:N,proposed:oe,mode:"alert_only",notes:C,prepareOnly:!0,...q});if(h!=null&&T(_)&&_>0){let q=(_-o)/_*100;if(q>=h)return C.push("exit is always alert_only: leaving a market is a human decision"),L({action:"exit",reason:`price collapse: ${Y(q)}% below entry exceeds drawdown guard ${h}%`,proposed:void 0})}if(j)return L({action:"hold",reason:"in range",proposed:void 0});if(g<=c)return L({action:"hold",reason:`out of range by ${Y(g)}% but within hysteresis ${c}%`,proposed:void 0});if(m!=null&&m<f)return L({action:"hold",reason:`min hold not satisfied: ${Y(m)}h since last rebalance < ${f}h`,proposed:void 0});let B=[];G(I)&&B.push("gasUsd"),G(R)&&B.push("feeRateEstimateUsdPerHour");let P=D;G(k)?B.push("slippageBps"):k===0?P=0:T(U)&&U>0?P=U*(k/1e4):B.push("positionValueUsd (needed to price slippage)");let w=D;if(T(U)&&U>0&&T(_)&&_>0?w=_e({priceLower:S,priceUpper:A,entryPrice:_,priceNow:o,valueUsdAtEntry:U}).ilUsd:B.push("ilUsd (needs position.entryPriceUsd and positionValueUsd)"),B.length)return L({action:"alert",reason:`cost unknown: ${B.join(", ")} \u2014 will not rebalance on an unknown cost`,components:{gasUsd:I,slippageUsd:P,ilUsd:w},expectedFeesUsd:G(R)?D:R*a});let y=R*a,te=I+P+w,F=y-te,K={gasUsd:I,slippageUsd:P,ilUsd:w};if(!(F>0))return L({action:"hold",reason:`expected fees ${Y(y)} over ${a}h do not cover rebalance cost ${Y(te)} (gas ${Y(I)} + slippage ${Y(P)} + IL ${Y(w)})`,expectedFeesUsd:y,costUsd:te,netEdgeUsd:F,components:K,proposed:void 0});let O="alert_only";return p===!0?Xt(t)?(O="execute",C.push("ARMED: one exact bounded rebalance to the proposed range; this decision does not loop")):C.push("DOWNGRADED to alert_only: autonomous trading is off \u2014 set ORACLE_AUTONOMOUS_TRADING=1 to let a rebalance fire unattended"):C.push("alert_only: Oracle will notify and prepare an artifact; you sign it"),L({action:"rebalance",reason:`out of range by ${Y(g)}% > hysteresis ${c}%; expected fees ${Y(y)} > cost ${Y(te)} (net edge ${Y(F)})`,expectedFeesUsd:y,costUsd:te,netEdgeUsd:F,components:K,mode:O})}function Xr(e){if(!Array.isArray(e)||e.length<2)throw new TypeError("bars must be an array with >= 2 bars");let t=null;for(let n=0;n<e.length;n++){let r=e[n];if(!De(r))throw new TypeError(`bars[${n}] must be an object`);if(!T(r.c)||r.c<=0)throw new TypeError(`bars[${n}].c must be positive finite`);if(r.t!=null){if(!T(r.t))throw new TypeError(`bars[${n}].t must be finite`);if(t!=null&&!(r.t>t))throw new TypeError("bars t must be strictly increasing");t=r.t}}}function Kr(e,t){let n=typeof e=="function"?e(t):e;if(G(n))return D;if(!T(n)||n<0)throw new TypeError("feePerHourInRange must yield a finite number >= 0 or 'unknown'");return n}function an(e,t={},n={}){if(Xr(e),!De(t))throw new TypeError("params must be a plain object");let{k:r=Qt,volLookback:o=24,horizonHours:s=24,tickSpacing:i,gasUsd:l,slippageBps:u,feePerHourInRange:a,hysteresisPct:c=0,minHoldHours:f=0,positionValueUsd:m=1e4,drawdownGuardPct:p,expectedInRangeFraction:d=1,maxEvents:b=500}=t;if(!Number.isInteger(i)||i<=0)throw new TypeError("params.tickSpacing must be a positive integer");if(a==null)throw new TypeError("params.feePerHourInRange is required (number or function)");if(!T(m)||m<=0)throw new TypeError("params.positionValueUsd must be > 0");let h=Ne(l,"gasUsd"),E=Ne(u,"slippageBps"),I=ve(n.math),k=t.widthPct,R=0;if(k==null){let O=tn(e.slice(0,o+1),o);if(G(O))throw new TypeError("not enough bars to derive width from vol; pass widthPct");k=nn({volAnnual:O,horizonHours:s,k:r}),R=o}if(!T(k)||k<=0)throw new TypeError("widthPct must be > 0");let _=0,U=0,x=0,S=0,A=0,j=0,g=0,N=0,C=0,M=0,oe=!1,L=[],B=O=>{L.length<b&&L.push(O)},P=(O,q,he)=>{let J=It({priceNow:O,widthPct:k,tickSpacing:i},{math:I});return{tickLower:J.tickLower,tickUpper:J.tickUpper,priceLower:J.priceLower,priceUpper:J.priceUpper,entryPriceUsd:O,valueUsdAtEntry:q,feesUsdAccrued:0,openedAtIndex:he,sinceLastRebalanceHours:0}},w=P(e[R].c,m,R),y=m;for(let O=R+1;O<e.length;O++){let q=e[O],he=e[O-1],J=T(q.t)&&T(he.t)?(q.t-he.t)/36e5:1;if(M+=J,!w)continue;w.sinceLastRebalanceHours+=J;let V=q.c,we=Kr(a,{bar:q,index:O,widthPct:k,position:w});if(V>=w.priceLower&&V<=w.priceUpper&&(C+=J,!G(we))){let H=we*J;_+=H,w.feesUsdAccrued+=H}let ne=sn({position:{tickLower:w.tickLower,tickUpper:w.tickUpper,liquidity:null,feesUsdAccrued:w.feesUsdAccrued,entryPriceUsd:w.entryPriceUsd,valueUsdAtEntry:w.valueUsdAtEntry},priceNow:V,gasUsd:h,slippageBps:E,feeRateEstimateUsdPerHour:G(we)?D:we*d,horizonHours:s,hysteresisPct:c,minHoldHours:f,sinceLastRebalanceHours:w.sinceLastRebalanceHours,autonomous:!1,tickSpacing:i,widthPct:k,drawdownGuardPct:p},{env:{},math:I});if(ne.action==="rebalance"){let H=_e({priceLower:w.priceLower,priceUpper:w.priceUpper,entryPrice:w.entryPriceUsd,priceNow:V,valueUsdAtEntry:w.valueUsdAtEntry}),be=H.lpValueUsd*(E/1e4);if(U+=H.ilUsd,x+=h,S+=be,y=H.lpValueUsd-h-be,A+=1,B({index:O,t:q.t??null,action:"rebalance",price:V,ilUsd:H.ilUsd,gasUsd:h,slippageUsd:be,valueUsd:y}),!(y>0)){w=null,N+=1,B({index:O,t:q.t??null,action:"exit",price:V,reason:"position value exhausted by costs"});continue}w=P(V,y,O)}else if(ne.action==="exit"){let H=_e({priceLower:w.priceLower,priceUpper:w.priceUpper,entryPrice:w.entryPriceUsd,priceNow:V,valueUsdAtEntry:w.valueUsdAtEntry});U+=H.ilUsd,y=H.lpValueUsd,N+=1,B({index:O,t:q.t??null,action:"exit",price:V,reason:ne.reason,ilUsd:H.ilUsd}),w=null}else ne.action==="alert"?(j+=1,/cost unknown/.test(ne.reason)&&(oe=!0),B({index:O,t:q.t??null,action:"alert",price:V,reason:ne.reason})):g+=1}if(w){let O=e[e.length-1].c,q=_e({priceLower:w.priceLower,priceUpper:w.priceUpper,entryPrice:w.entryPriceUsd,priceNow:O,valueUsdAtEntry:w.valueUsdAtEntry});U+=q.ilUsd,y=q.lpValueUsd}let te=oe||G(h)||G(E),F,K="local";if(te)F=D;else if(typeof I.netPnl=="function"){let O=I.netPnl({feesUsd:_,ilUsd:U,gasUsd:x,slippageUsd:S});F=T(O?.net)?O.net:D,K="injected"}else F=_-U-x-S;return{widthPct:k,netUsd:F,netPnlSource:K,feesUsd:_,ilUsd:U,gasUsd:G(h)?D:x,slippageUsd:G(E)?D:S,rebalances:A,alerts:j,holds:g,exits:N,hoursInRange:C,hoursTotal:M,inRangePct:M>0?C/M*100:0,finalValueUsd:y,positionValueUsd:m,mathSource:I.source,events:L}}function Yr(e,t,n={},r={}){if(!Array.isArray(t)||t.length===0)throw new TypeError("widths must be a non-empty array");let o=t.map(s=>{let i=an(e,{...n,widthPct:s},r);return{widthPct:s,netUsd:i.netUsd,feesUsd:i.feesUsd,ilUsd:i.ilUsd,gasUsd:i.gasUsd,slippageUsd:i.slippageUsd,rebalances:i.rebalances,hoursInRange:i.hoursInRange,hoursTotal:i.hoursTotal,inRangePct:i.inRangePct}});return{byWidth:o,table:cn(o)}}function cn(e){let t=["widthPct","netUsd","feesUsd","ilUsd","gasUsd","slippageUsd","rebalances","hoursInRange","hoursTotal","inRangePct"],n=l=>T(l)?Number.isInteger(l)?String(l):l.toFixed(2):String(l),r=e.map(l=>t.map(u=>n(l[u]))),o=t.map((l,u)=>Math.max(l.length,...r.map(a=>a[u].length))),s=l=>"| "+l.map((u,a)=>u.padStart(o[a])).join(" | ")+" |",i="|-"+o.map(l=>"-".repeat(l)).join("-|-")+"-|";return[s(t),i,...r.map(s)].join(`
|
|
5
|
-
`)}import{AbiCoder as Wr,Interface as Jr,getAddress as hn,isAddress as Qr}from"ethers";var wn=Wr.defaultAbiCoder(),de="0x0000000000000000000000000000000000000000",un="0x000000000022D473030F116dDEE9F6B43aC78BA3",ln=-887272,dn=887272,Q=(1n<<128n)-1n,Zr=(1n<<256n)-1n,eo=(1n<<24n)-1n,fn=30,pn=600,W=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}),to=Object.freeze(Object.fromEntries(Object.entries(W).map(([e,t])=>[t,e]))),no=Object.freeze(["mint","decrease","collect","burn","rebalance"]),bn=new Jr(["function modifyLiquidities(bytes unlockData, uint256 deadline) payable"]),ro=bn.getFunction("modifyLiquidities").selector,oo="tuple(address currency0,address currency1,uint24 fee,int24 tickSpacing,address hooks)",so=Object.freeze({MINT_POSITION:Object.freeze([oo,"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"])});function v(e){throw new Error(`uniswap-v4-lp: ${e}`)}function ee(e,t){(e==null||e==="")&&v(`${t} address required`);let n=String(e);return Qr(n)||v(`${t} is not a valid address: ${n}`),hn(n)}function z(e,t,{max:n=Zr,min:r=0n}={}){(e==null||e==="")&&v(`${t} required`);let o;try{o=typeof e=="bigint"?e:BigInt(String(e))}catch{v(`${t} must be an integer, got ${String(e)}`)}return o<r&&v(`${t} must be >= ${r}`),o>n&&v(`${t} exceeds ${t==="fee"?"uint24":n===Q?"uint128":"uint256"}`),o}function mn(e,t){let n=Number(e);return Number.isInteger(n)||v(`${t} must be an integer tick`),(n<ln||n>dn)&&v(`${t} ${n} outside [${ln}, ${dn}]`),n}function ze(e){return e==null||e===""||String(e).toLowerCase()!=="0x"&&v("opaque hookData is inspect-only until a hook-specific adapter exists"),"0x"}function gn(e={}){(!e||typeof e!="object")&&v("poolKey required");let t=e.currency0==null||e.currency0===""?de:ee(e.currency0,"poolKey.currency0"),n=ee(e.currency1,"poolKey.currency1");BigInt(t)>=BigInt(n)&&v("poolKey.currency0 must sort below currency1 (V4 PoolKey invariant); reordering would target a different pool");let r=Number(z(e.fee,"fee",{max:eo})),o=Number(e.tickSpacing);(!Number.isInteger(o)||o<=0||o>32767)&&v(`poolKey.tickSpacing must be a positive int16, got ${e.tickSpacing}`);let s=e.hooks==null||e.hooks===""?de:ee(e.hooks,"poolKey.hooks");return{currency0:t,currency1:n,fee:r,tickSpacing:o,hooks:s}}function yn(e,t,n){let r=mn(e,"tickLower"),o=mn(t,"tickUpper");return r>=o&&v(`tickLower ${r} must be below tickUpper ${o}`),(r%n!==0||o%n!==0)&&v(`ticks must be multiples of tickSpacing ${n} (got ${r}, ${o})`),{tickLower:r,tickUpper:o}}function io(e){let t=Number(e);return(!Number.isSafeInteger(t)||t<=0)&&v("deadline (unix seconds) required"),t}function xn(e){return`0x${e.map(t=>t.toString(16).padStart(2,"0")).join("")}`}function Z(e,t){return wn.encode(so[e],t)}function ao(e,t){return(!Array.isArray(e)||!Array.isArray(t)||e.length!==t.length||e.length===0)&&v("actions and params must be equal-length non-empty arrays"),wn.encode(["bytes","bytes[]"],[xn(e),t])}function Ge({chainId:e,positionManager:t,actions:n,params:r,deadline:o,value:s,summary:i,extra:l={}}){let u=ao(n,r),a=bn.encodeFunctionData("modifyLiquidities",[u,BigInt(o)]);return Object.freeze({chainId:Number(e),to:t,data:a,value:s.toString(),deadline:o,actions:n.map(c=>to[c]),actionsHex:xn(n),summary:i,...l})}function Ve(e){let t=Number(e.chainId);(!Number.isInteger(t)||t<=0)&&v("chainId required");let n=ee(e.positionManager,"positionManager");return{chainId:t,positionManager:n,deadline:io(e.deadline)}}function co(e={}){let{chainId:t,positionManager:n,deadline:r}=Ve(e),o=gn(e.poolKey),{tickLower:s,tickUpper:i}=yn(e.tickLower,e.tickUpper,o.tickSpacing),l=z(e.liquidity,"liquidity");l===0n&&v("liquidity must be > 0 for mint");let u=z(e.amount0Max,"amount0Max",{max:Q}),a=z(e.amount1Max,"amount1Max",{max:Q}),c=ee(e.owner,"owner"),f=ze(e.hookData),m=o.currency0===de,p=[W.MINT_POSITION,W.SETTLE_PAIR],d=[Z("MINT_POSITION",[o,s,i,l,u,a,c,f]),Z("SETTLE_PAIR",[o.currency0,o.currency1])];m&&(p.push(W.SWEEP),d.push(Z("SWEEP",[de,c])));let b=m?u:0n,h=`mint v4 LP ${o.currency0}/${o.currency1} fee ${o.fee} ticks [${s}, ${i}] liquidity ${l} (max ${u} / ${a}) to ${c}${m?" paying native value":""}${o.hooks!==de?` hooked ${o.hooks}`:""}`;return Ge({chainId:t,positionManager:n,actions:p,params:d,deadline:r,value:b,summary:h,extra:{poolKey:o,tickLower:s,tickUpper:i,owner:c,requiresApproval:Sn(o,{amount0Max:u,amount1Max:a})}})}function En(e={}){let{chainId:t,positionManager:n,deadline:r}=Ve(e),o=z(e.tokenId,"tokenId"),s=z(e.liquidity,"liquidity"),i=z(e.amount0Min,"amount0Min",{max:Q}),l=z(e.amount1Min,"amount1Min",{max:Q}),{currency0:u,currency1:a}=In(e),c=ee(e.recipient??e.owner,"recipient"),f=ze(e.hookData),m=[W.DECREASE_LIQUIDITY,W.TAKE_PAIR],p=[Z("DECREASE_LIQUIDITY",[o,s,i,l,f]),Z("TAKE_PAIR",[u,a,c])],d=s===0n?`collect fees on v4 LP #${o} to ${c}`:`decrease v4 LP #${o} by ${s} liquidity (min ${i} / ${l}) to ${c}`;return Ge({chainId:t,positionManager:n,actions:m,params:p,deadline:r,value:0n,summary:d,extra:{tokenId:o.toString(),recipient:c,currency0:u,currency1:a}})}function uo(e={}){return En({...e,liquidity:0n,amount0Min:0n,amount1Min:0n})}function lo(e={}){let{chainId:t,positionManager:n,deadline:r}=Ve(e),o=z(e.tokenId,"tokenId"),s=z(e.amount0Min,"amount0Min",{max:Q}),i=z(e.amount1Min,"amount1Min",{max:Q}),{currency0:l,currency1:u}=In(e),a=ee(e.recipient??e.owner,"recipient"),c=ze(e.hookData),f=[W.BURN_POSITION,W.TAKE_PAIR],m=[Z("BURN_POSITION",[o,s,i,c]),Z("TAKE_PAIR",[l,u,a])];return Ge({chainId:t,positionManager:n,actions:f,params:m,deadline:r,value:0n,summary:`burn v4 LP #${o} (min ${s} / ${i}) to ${a}`,extra:{tokenId:o.toString(),recipient:a,currency0:l,currency1:u}})}function fo(e={}){let{chainId:t,positionManager:n,deadline:r}=Ve(e),o=e.burn||{},s=e.mint||{},i=z(o.tokenId,"burn.tokenId"),l=z(o.amount0Min??0n,"burn.amount0Min",{max:Q}),u=z(o.amount1Min??0n,"burn.amount1Min",{max:Q}),a=gn(s.poolKey);a.currency0===de&&v("rebalance refuses native currency pools: shortfall msg.value cannot be sized offline");let{tickLower:c,tickUpper:f}=yn(s.tickLower,s.tickUpper,a.tickSpacing),m=z(s.liquidity,"mint.liquidity");m===0n&&v("mint.liquidity must be > 0 for rebalance");let p=z(s.amount0Max,"mint.amount0Max",{max:Q}),d=z(s.amount1Max,"mint.amount1Max",{max:Q}),b=ee(s.owner??e.owner,"owner"),h=ze(s.hookData??o.hookData),E=[W.BURN_POSITION,W.MINT_POSITION,W.CLOSE_CURRENCY,W.CLOSE_CURRENCY],I=[Z("BURN_POSITION",[i,l,u,h]),Z("MINT_POSITION",[a,c,f,m,p,d,b,h]),Z("CLOSE_CURRENCY",[a.currency0]),Z("CLOSE_CURRENCY",[a.currency1])];return Ge({chainId:t,positionManager:n,actions:E,params:I,deadline:r,value:0n,summary:`rebalance v4 LP: burn #${i} then mint ${a.currency0}/${a.currency1} fee ${a.fee} ticks [${c}, ${f}] liquidity ${m} (max ${p} / ${d}) to ${b}, one unlock`,extra:{burnTokenId:i.toString(),poolKey:a,tickLower:c,tickUpper:f,owner:b,requiresApproval:Sn(a,{amount0Max:p,amount1Max:d})}})}function In(e){let t=e.poolKey&&typeof e.poolKey=="object"?e.poolKey:e,n=t.currency0==null||t.currency0===""?de:ee(t.currency0,"currency0"),r=ee(t.currency1,"currency1");return BigInt(n)>=BigInt(r)&&v("currency0 must sort below currency1"),{currency0:n,currency1:r}}function Sn(e,{amount0Max:t,amount1Max:n}){let r=[];return e.currency0!==de&&r.push({token:e.currency0,spender:un,amount:t.toString()}),r.push({token:e.currency1,spender:un,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}}var po=Object.freeze({mint:co,decrease:En,collect:uo,burn:lo,rebalance:fo});function Ps(e={},t={}){let n=t.chains||Pe,r=Number(e.chainId);(!Number.isInteger(r)||r<=0)&&v("chainId required");let o=n[r];o||v(`unsupported chainId ${r} (supported: ${Object.keys(n).join(", ")})`),o.positionManager||v(`no v4 PositionManager registered for chain ${r} (${o.name||"unnamed"})`);let s=String(e.kind||"").toLowerCase(),i=po[s];i||v(`unknown kind ${e.kind} (expected ${no.join("|")})`);let l=Number(e.deadlineSec);(!Number.isInteger(l)||l<fn||l>pn)&&v(`deadlineSec must be an integer from ${fn} through ${pn}`);let a=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+l,c=e.params&&typeof e.params=="object"?e.params:{},f=i({...c,chainId:r,positionManager:hn(o.positionManager),deadline:a}),m=e.from??c.owner??c.recipient??null,p=m?ee(m,"from"):null,d={...f},{to:b,data:h,value:E,summary:I,actions:k,actionsHex:R,requiresApproval:_=null}=f;for(let U of["to","data","value","summary","actions","actionsHex","requiresApproval","chainId","deadline"])delete d[U];return xt({provider:"uniswap-v4-lp",kind:`univ4-lp-${s}`,lpKind:s,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:a,summary:I,plan:{actions:k,actionsHex:R,selector:ro},detail:d,requiresApproval:_,transaction:{chainId:r,from:p,to:b,data:h,value:E},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-${s}`,env:t.env,nowMs:t.nowMs})}function Rs(e=Pe){return Object.entries(e).filter(([,t])=>t&&t.positionManager).map(([t,n])=>({chainId:Number(t),name:n.name,positionManager:n.positionManager}))}export{Jt as K_FOR_PROBABILITY,no as LP_ARTIFACT_KINDS,ot as MAX_SQRT_RATIO,Ee as MAX_TICK,rt as MIN_SQRT_RATIO,xe as MIN_TICK,ro as MODIFY_LIQUIDITIES_SELECTOR,Tt as NET_PNL_COMPONENTS,At as NET_PNL_FORMULA,un as PERMIT2,bn as POSITION_MANAGER_IFACE,Ye as Q128,Le as Q192,St as Q32,Me as Q96,nt as UINT256_MAX,W as V4_LP_ACTIONS,so as V4_LP_PARAM_TYPES,dn as V4_MAX_TICK,ln as V4_MIN_TICK,Ht as V4_STATE_VIEW_ABI,X as V4_STATE_VIEW_IFACE,de as ZERO_ADDRESS,tt as amount0InToken1,Ie as amountsForLiquidity,it as amountsValueUsd,kt as bigintSqrt,_e as concentratedIl,lo as encodeBurn,uo as encodeCollect,En as encodeDecreaseLiquidity,co as encodeMintPosition,fo as encodeRebalance,ao as encodeUnlockData,et as feeGrowthInside,at as feesAccrued,Bn as feesToUsd,cn as formatBacktestTable,jn as formatNet,Ue as formatUnitsNumber,Qe as getAmount0ForLiquidity,Ze as getAmount1ForLiquidity,We as getLiquidityForAmount0,Je as getLiquidityForAmount1,Te as getSqrtRatioAtTick,_n as getTickAtSqrtRatio,qn as impermanentLoss,Cn as liquidityForAmounts,en as localPriceToTick,Zt as localTickToPrice,Rs as lpArtifactChains,an as lpBacktest,Yr as lpBacktestSweep,Nn as nearestUsableTick,Fn as netPnl,gn as normalizePoolKey,Gt as normalizeSalt,$n as positionValueUsd,Ps as prepareLpArtifact,Ln as priceToSqrtPriceX96,Un as priceToTick,It as proposeRange,rn as rangeFromTicks,nn as rangeWidthFromVol,Dr as readV4Position,tn as realizedVol,sn as rebalanceDecision,ve as resolveMath,Mn as sqrtPriceX96ToPrice,vn as tickToPrice,ie as toBigInt,Ce as toUint128,re as toUint160,se as toUint256,Vt as v4StateViewAddress,on as widthPctFromRange};
|
|
4
|
+
${JSON.stringify(n??[])}`}async function _r(e,t,n){return wt(e,{method:"POST",body:t,fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3,signal:n.signal})}async function gt(e,t,n=[],r={}){let o=String(t||""),s=Or(o),i=kr(e,r);if(!i)throw new Error(`No RPC URL for chainId ${e} (set env from chain registry rpcEnv or pass rpcUrl)`);if(s==="eth_chainid"&&r.cacheChainId!==!1){let c=qt.get(i);if(c!=null)return c}let u=r.dedupe!==!1&&!r.signal?Rr(i,o,n):null;if(u&&Ae.has(u))return Ae.get(u);let a=(async()=>{let c=await _r(i,{jsonrpc:"2.0",id:1,method:t,params:n},r),f=Pr(c);return s==="eth_chainid"&&typeof f=="string"&&qt.set(i,f),f})();return u&&(Ae.set(u,a),a.finally(()=>{Ae.get(u)===a&&Ae.delete(u)}).catch(()=>{})),a}import{AbiCoder as qr,Interface as Et,getAddress as ns,isAddress as rs,keccak256 as os}from"ethers";var Fo=Object.freeze({1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avalanche",999:"hyperevm",4663:"robinhood"});import{createHash as Nr,createHmac as vr,timingSafeEqual as Wo}from"node:crypto";var Ur=2,Lr=300*1e3,Mr=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})();function yt(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(yt).join(",")}]`:`{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${yt(e[n])}`).join(",")}}`}function Ft(e){let t=String(e?.ORACLE_STAMP_HMAC_SECRET||"").trim();return t.length>=16?t:""}function jt(e=process.env){return Ft(process.env)||Ft(e)}function Cr(e){let{prepareHash:t,prepareMac:n,note:r,...o}=e||{};return o}function $r(e){let t=Cr(e);return Nr("sha256").update(yt(t)).digest("hex")}function Br(e,t=jt()){return t?vr("sha256",t).update(String(e)).digest("hex"):""}function xt(e,{provider:t,kind:n,env:r=process.env,nowMs:o=Date.now(),expiresAtMs:s}={}){if(!e||typeof e!="object")throw new Error("stampPrepared: payload object required");let i=Object.prototype.hasOwnProperty.call(e,"oraclePrepared");if(i&&typeof e.oraclePrepared!="boolean")throw new Error("stampPrepared: oraclePrepared must be boolean");let l={...e,provider:e.provider||t,kind:e.kind||n,requiresUserSignature:e.requiresUserSignature!==!1,signingReady:!1,broadcastReady:!1,executionReady:!1,oraclePrepared:i?e.oraclePrepared:!0};if(!l.provider)throw new Error("stampPrepared: provider required");if(!l.kind)throw new Error("stampPrepared: kind required");let u=Number(o),a=s==null?u+Lr:Number(s),c=a-u;if(!Number.isSafeInteger(u)||!Number.isSafeInteger(a)||c<=0||c>Mr)throw new Error("stampPrepared: bounded preparedAt/expiresAt required");let m={...l,preparedAt:u,expiresAt:a,prepareVersion:Ur},p=$r(m),d=jt(r),b=d?Br(p,d):void 0,h={...m,prepareHash:p};return b&&(h.prepareMac=b),h}var us=qr.defaultAbiCoder();var Pe={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"}};var ls=new Et(["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)"]),ds=new Et(["function execute(bytes commands,bytes[] inputs,uint256 deadline) payable"]),fs=new Et(["function getSlot0(bytes32 poolId) view returns (uint160 sqrtPriceX96,int24 tick,uint24 protocolFee,uint24 lpFee)","function getLiquidity(bytes32 poolId) view returns (uint128 liquidity)"]),ps=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"]]),ms=(1n<<14n)-1n;$e();var Ht=Object.freeze(["function getSlot0(bytes32 poolId) view returns (uint160 sqrtPriceX96,int24 tick,uint24 protocolFee,uint24 lpFee)","function getLiquidity(bytes32 poolId) view returns (uint128 liquidity)","function getFeeGrowthGlobals(bytes32 poolId) view returns (uint256 feeGrowthGlobal0,uint256 feeGrowthGlobal1)","function getTickFeeGrowthOutside(bytes32 poolId,int24 tick) view returns (uint256 feeGrowthOutside0X128,uint256 feeGrowthOutside1X128)","function getTickInfo(bytes32 poolId,int24 tick) view returns (uint128 liquidityGross,int128 liquidityNet,uint256 feeGrowthOutside0X128,uint256 feeGrowthOutside1X128)","function getFeeGrowthInside(bytes32 poolId,int24 tickLower,int24 tickUpper) view returns (uint256 feeGrowthInside0X128,uint256 feeGrowthInside1X128)","function getPositionInfo(bytes32 poolId,address owner,int24 tickLower,int24 tickUpper,bytes32 salt) view returns (uint128 liquidity,uint256 feeGrowthInside0LastX128,uint256 feeGrowthInside1LastX128)"]),X=new Fr([...Ht]),zt=/^0x[0-9a-fA-F]{64}$/,jr=/^0x[0-9a-fA-F]{40}$/;function Gt(e){if(e==null||e==="")return`0x${"0".repeat(64)}`;if(typeof e=="string"&&zt.test(e))return e.toLowerCase();let t=ie(e,"salt");if(t<0n||t>=1n<<256n)throw new Error("salt out of bytes32 range");return`0x${t.toString(16).padStart(64,"0")}`}function Vt(e){let t=Number(e),n=Pe[t];if(!n)throw new Error(`v4-position-read: unsupported chainId ${e}`);if(!n.stateView)throw new Error(`v4-position-read: no StateView on chain ${t}`);return{chainId:t,stateView:n.stateView,name:n.name}}function Dt(e,t){let n=Number(e);if(!Number.isInteger(n)||n<-887272||n>887272)throw new Error(`${t} must be an int24 tick`);return n}async function Dr(e={},t={}){let{chainId:n,stateView:r,name:o}=Vt(e.chainId),s=String(e.poolId||"");if(!zt.test(s))throw new Error("v4-position-read: poolId must be bytes32");let i=String(e.owner||"");if(!jr.test(i))throw new Error("v4-position-read: owner must be an EVM address");let l=Dt(e.tickLower,"tickLower"),u=Dt(e.tickUpper,"tickUpper");if(l>=u)throw new Error("v4-position-read: tickLower must be < tickUpper");let a=Gt(e.salt),c=e.rpcCall||t.rpcCall||gt,f=e.blockTag||t.blockTag||"latest",m={slot0:X.encodeFunctionData("getSlot0",[s]),liquidity:X.encodeFunctionData("getLiquidity",[s]),feeGrowthGlobals:X.encodeFunctionData("getFeeGrowthGlobals",[s]),lowerOutside:X.encodeFunctionData("getTickFeeGrowthOutside",[s,l]),upperOutside:X.encodeFunctionData("getTickFeeGrowthOutside",[s,u]),position:X.encodeFunctionData("getPositionInfo",[s,i,l,u,a])},p=Object.keys(m),d=await Promise.all(p.map(L=>c(n,"eth_call",[{to:r,data:m[L]},f],t))),b=Object.fromEntries(p.map((L,oe)=>[L,d[oe]])),h=X.decodeFunctionResult("getSlot0",b.slot0),E=X.decodeFunctionResult("getLiquidity",b.liquidity)[0],I=X.decodeFunctionResult("getFeeGrowthGlobals",b.feeGrowthGlobals),k=X.decodeFunctionResult("getTickFeeGrowthOutside",b.lowerOutside),R=X.decodeFunctionResult("getTickFeeGrowthOutside",b.upperOutside),_=X.decodeFunctionResult("getPositionInfo",b.position),U=BigInt(h[0]),x=Number(h[1]),S=BigInt(_[0]),O=U>0n,j=Te(l),g=Te(u),N={amount0:0n,amount1:0n},C={fees0:0n,fees1:0n,feeGrowthInside0X128:0n,feeGrowthInside1X128:0n};return O&&(N=Ie(S,U,j,g),C=at({tickCurrent:x,tickLower:l,tickUpper:u,liquidity:S,feeGrowthGlobal0X128:BigInt(I[0]),feeGrowthGlobal1X128:BigInt(I[1]),feeGrowthOutsideLower0X128:BigInt(k[0]),feeGrowthOutsideLower1X128:BigInt(k[1]),feeGrowthOutsideUpper0X128:BigInt(R[0]),feeGrowthOutsideUpper1X128:BigInt(R[1]),feeGrowthInside0LastX128:BigInt(_[1]),feeGrowthInside1LastX128:BigInt(_[2])})),Object.freeze({venue:"uniswap-v4",chainId:n,chainName:o,stateView:r,blockTag:f,poolId:s.toLowerCase(),owner:i,salt:a,tickLower:l,tickUpper:u,inRange:O&&x>=l&&x<u,pool:Object.freeze({initialized:O,sqrtPriceX96:U.toString(),tick:x,protocolFee:Number(h[2]),lpFee:Number(h[3]),liquidity:BigInt(E).toString(),feeGrowthGlobal0X128:BigInt(I[0]).toString(),feeGrowthGlobal1X128:BigInt(I[1]).toString()}),ticks:Object.freeze({lower:Object.freeze({feeGrowthOutside0X128:BigInt(k[0]).toString(),feeGrowthOutside1X128:BigInt(k[1]).toString(),sqrtRatioX96:j.toString()}),upper:Object.freeze({feeGrowthOutside0X128:BigInt(R[0]).toString(),feeGrowthOutside1X128:BigInt(R[1]).toString(),sqrtRatioX96:g.toString()})}),position:Object.freeze({liquidity:S.toString(),feeGrowthInside0LastX128:BigInt(_[1]).toString(),feeGrowthInside1LastX128:BigInt(_[2]).toString(),amount0:N.amount0.toString(),amount1:N.amount1.toString(),feeGrowthInside0X128:C.feeGrowthInside0X128.toString(),feeGrowthInside1X128:C.feeGrowthInside1X128.toString(),uncollectedFees0:C.fees0.toString(),uncollectedFees1:C.fees1.toString()}),abiProvenance:Object.freeze({verified:Object.freeze(["getSlot0","getLiquidity"]),unverified:Object.freeze(["getFeeGrowthGlobals","getTickFeeGrowthOutside","getPositionInfo"])})})}var Es=Object.freeze({READ:"read",PREPARE:"prepare",EXECUTE:"execute",AUTONOMOUS:"autonomous"});function Xt(e=process.env){return String(e.ORACLE_AUTONOMOUS_TRADING??"").trim()==="1"}var Re={};try{Re=await Promise.resolve().then(()=>($e(),At))}catch(e){if(e?.code!=="ERR_MODULE_NOT_FOUND")throw e}var D="unknown",Wt=8760,Kt=-887272,Yt=887272,Hr=Math.log(1.0001),Jt=Object.freeze({.5:.6745,.68:.9945,.8:1.2816,.9:1.6449,.95:1.96}),Qt=Jt[.8];function T(e){return typeof e=="number"&&Number.isFinite(e)}function G(e){return e===D}function De(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function He(e,t,n){return Math.min(n,Math.max(t,e))}function zr(e,t){return Math.floor(e/t)*t}function Gr(e,t){return Math.ceil(e/t)*t}function Y(e){return Math.round(e*100)/100}function Zt(e){return Math.pow(1.0001,e)}function en(e){return Math.floor(Math.log(e)/Hr)}function ve(e={}){let t=e.tickToPrice??Re.tickToPrice??Zt,n=e.priceToTick??Re.priceToTick??en,r=e.netPnl??null,o=e.tickToPrice||e.priceToTick?"injected":Re.tickToPrice&&Re.priceToTick?"position-math":"local";return{tickToPrice:t,priceToTick:n,netPnl:r,source:o}}function Vr(e){let t=[];for(let n=1;n<e.length;n++){let r=e[n-1]?.t,o=e[n]?.t;T(r)&&T(o)&&o>r&&t.push((o-r)/36e5)}return t.length?(t.sort((n,r)=>n-r),t[Math.floor(t.length/2)]):1}function tn(e,t=24,{barHours:n}={}){if(!Array.isArray(e))throw new TypeError("bars must be an array");if(!Number.isInteger(t)||t<2)throw new TypeError("lookback must be an integer >= 2");let r=e.slice(-(t+1)).map(a=>a?.c);for(let a of r)if(!T(a)||!(a>0))throw new TypeError("bars[].c must be positive finite");if(r.length<3)return D;let o=[];for(let a=1;a<r.length;a++)o.push(Math.log(r[a]/r[a-1]));let s=o.reduce((a,c)=>a+c,0)/o.length,i=0;for(let a of o)i+=(a-s)**2;let l=Math.sqrt(i/(o.length-1)),u=T(n)&&n>0?n:Vr(e.slice(-(t+1)));return l*Math.sqrt(Wt/u)}function nn({volAnnual:e,horizonHours:t,k:n=Qt}={}){if(G(e))return D;if(!T(e)||e<0)throw new TypeError("volAnnual must be a finite number >= 0");if(!T(t)||t<=0)throw new TypeError("horizonHours must be > 0");if(!T(n)||n<=0)throw new TypeError("k must be > 0");return n*e*Math.sqrt(t/Wt)*100}function It({priceNow:e,widthPct:t,tickSpacing:n}={},{math:r}={}){if(!T(e)||e<=0)throw new TypeError("priceNow must be > 0");if(!T(t)||t<=0)throw new TypeError("widthPct must be > 0");if(!Number.isInteger(n)||n<=0)throw new TypeError("tickSpacing must be a positive integer");let o=ve(r),s=t/100,i=e/(1+s),l=e*(1+s),u=zr(o.priceToTick(i),n),a=o.priceToTick(l);o.tickToPrice(a)<l&&(a+=1);let c=Gr(a,n);return c<=u&&(c=u+n),u=He(u,Kt,Yt),c=He(c,Kt,Yt),{tickLower:u,tickUpper:c,priceLower:o.tickToPrice(u),priceUpper:o.tickToPrice(c),tickSpacing:n,widthPct:t}}function rn(e,t,{math:n}={}){if(!Number.isInteger(e)||!Number.isInteger(t)||t<=e)throw new TypeError("tickLower/tickUpper must be integers with tickUpper > tickLower");let r=ve(n);return{priceLower:r.tickToPrice(e),priceUpper:r.tickToPrice(t)}}function on({priceLower:e,priceUpper:t}){return(Math.sqrt(t/e)-1)*100}function _e({priceLower:e,priceUpper:t,entryPrice:n,priceNow:r,valueUsdAtEntry:o}={}){for(let[E,I]of Object.entries({priceLower:e,priceUpper:t,entryPrice:n,priceNow:r,valueUsdAtEntry:o}))if(!T(I)||I<=0)throw new TypeError(`${E} must be > 0`);if(t<=e)throw new TypeError("priceUpper must be > priceLower");let s=Math.sqrt(e),i=Math.sqrt(t),l=Math.sqrt(He(n,e,t)),u=Math.sqrt(He(r,e,t)),a=(i-l)/(l*i),c=l-s,f=a*n+c;if(!(f>0))return{ilUsd:0,lpValueUsd:o,holdValueUsd:o,liquidity:0};let m=o/f,p=(i-u)/(u*i),d=u-s,b=m*(p*r+d),h=m*(a*r+c);return{ilUsd:Math.max(0,h-b),lpValueUsd:b,holdValueUsd:h,liquidity:m}}function Ne(e,t,{min:n=0}={}){if(G(e))return D;if(!T(e)||e<n)throw new TypeError(`${t} must be a finite number >= ${n} or 'unknown'`);return e}function sn(e={},{env:t=process.env,math:n}={}){if(!De(e))throw new TypeError("input must be a plain object");let{position:r,priceNow:o,bars:s,gasUsd:i,slippageBps:l,feeRateEstimateUsdPerHour:u,horizonHours:a,hysteresisPct:c=0,minHoldHours:f=0,sinceLastRebalanceHours:m,autonomous:p=!1,tickSpacing:d,widthPct:b,drawdownGuardPct:h,positionValueUsd:E}=e;if(!De(r))throw new TypeError("position must be a plain object");if(!Number.isInteger(r.tickLower)||!Number.isInteger(r.tickUpper)||r.tickUpper<=r.tickLower)throw new TypeError("position.tickLower/tickUpper must be integers with tickUpper > tickLower");if(!T(o)||o<=0)throw new TypeError("priceNow must be > 0");if(s!=null&&!Array.isArray(s))throw new TypeError("bars must be an array when provided");if(!T(a)||a<=0)throw new TypeError("horizonHours must be > 0");if(!T(c)||c<0)throw new TypeError("hysteresisPct must be >= 0");if(!T(f)||f<0)throw new TypeError("minHoldHours must be >= 0");if(m!=null&&(!T(m)||m<0))throw new TypeError("sinceLastRebalanceHours must be >= 0 when provided");if(!Number.isInteger(d)||d<=0)throw new TypeError("tickSpacing must be a positive integer");if(h!=null&&(!T(h)||h<=0||h>=100))throw new TypeError("drawdownGuardPct must be in (0,100) when provided");let I=Ne(i,"gasUsd"),k=Ne(l,"slippageBps"),R=Ne(u,"feeRateEstimateUsdPerHour"),_=r.entryPriceUsd,U=T(E)?E:r.valueUsdAtEntry,x=ve(n),{priceLower:S,priceUpper:O}=rn(r.tickLower,r.tickUpper,{math:x}),j=o>=S&&o<=O,g=j?0:o<S?(S-o)/S*100:(o-O)/O*100,N={priceLower:S,priceUpper:O,inRange:j,distancePct:g},C=[],L=T(b)&&b>0?b:on({priceLower:S,priceUpper:O}),oe=It({priceNow:o,widthPct:L,tickSpacing:d},{math:x}),M=q=>({expectedFeesUsd:D,costUsd:D,netEdgeUsd:D,components:{gasUsd:I,slippageUsd:D,ilUsd:D},range:N,proposed:oe,mode:"alert_only",notes:C,prepareOnly:!0,...q});if(h!=null&&T(_)&&_>0){let q=(_-o)/_*100;if(q>=h)return C.push("exit is always alert_only: leaving a market is a human decision"),M({action:"exit",reason:`price collapse: ${Y(q)}% below entry exceeds drawdown guard ${h}%`,proposed:void 0})}if(j)return M({action:"hold",reason:"in range",proposed:void 0});if(g<=c)return M({action:"hold",reason:`out of range by ${Y(g)}% but within hysteresis ${c}%`,proposed:void 0});if(m!=null&&m<f)return M({action:"hold",reason:`min hold not satisfied: ${Y(m)}h since last rebalance < ${f}h`,proposed:void 0});let B=[];G(I)&&B.push("gasUsd"),G(R)&&B.push("feeRateEstimateUsdPerHour");let P=D;G(k)?B.push("slippageBps"):k===0?P=0:T(U)&&U>0?P=U*(k/1e4):B.push("positionValueUsd (needed to price slippage)");let w=D;if(T(U)&&U>0&&T(_)&&_>0?w=_e({priceLower:S,priceUpper:O,entryPrice:_,priceNow:o,valueUsdAtEntry:U}).ilUsd:B.push("ilUsd (needs position.entryPriceUsd and positionValueUsd)"),B.length)return M({action:"alert",reason:`cost unknown: ${B.join(", ")} \u2014 will not rebalance on an unknown cost`,components:{gasUsd:I,slippageUsd:P,ilUsd:w},expectedFeesUsd:G(R)?D:R*a});let y=R*a,te=I+P+w,F=y-te,K={gasUsd:I,slippageUsd:P,ilUsd:w};if(!(F>0))return M({action:"hold",reason:`expected fees ${Y(y)} over ${a}h do not cover rebalance cost ${Y(te)} (gas ${Y(I)} + slippage ${Y(P)} + IL ${Y(w)})`,expectedFeesUsd:y,costUsd:te,netEdgeUsd:F,components:K,proposed:void 0});let A="alert_only";return p===!0?Xt(t)?(A="execute",C.push("ARMED: one exact bounded rebalance to the proposed range; this decision does not loop")):C.push("DOWNGRADED to alert_only: autonomous trading is off \u2014 set ORACLE_AUTONOMOUS_TRADING=1 to let a rebalance fire unattended"):C.push("alert_only: Oracle will notify and prepare an artifact; you sign it"),M({action:"rebalance",reason:`out of range by ${Y(g)}% > hysteresis ${c}%; expected fees ${Y(y)} > cost ${Y(te)} (net edge ${Y(F)})`,expectedFeesUsd:y,costUsd:te,netEdgeUsd:F,components:K,mode:A})}function Xr(e){if(!Array.isArray(e)||e.length<2)throw new TypeError("bars must be an array with >= 2 bars");let t=null;for(let n=0;n<e.length;n++){let r=e[n];if(!De(r))throw new TypeError(`bars[${n}] must be an object`);if(!T(r.c)||r.c<=0)throw new TypeError(`bars[${n}].c must be positive finite`);if(r.t!=null){if(!T(r.t))throw new TypeError(`bars[${n}].t must be finite`);if(t!=null&&!(r.t>t))throw new TypeError("bars t must be strictly increasing");t=r.t}}}function Kr(e,t){let n=typeof e=="function"?e(t):e;if(G(n))return D;if(!T(n)||n<0)throw new TypeError("feePerHourInRange must yield a finite number >= 0 or 'unknown'");return n}function an(e,t={},n={}){if(Xr(e),!De(t))throw new TypeError("params must be a plain object");let{k:r=Qt,volLookback:o=24,horizonHours:s=24,tickSpacing:i,gasUsd:l,slippageBps:u,feePerHourInRange:a,hysteresisPct:c=0,minHoldHours:f=0,positionValueUsd:m=1e4,drawdownGuardPct:p,expectedInRangeFraction:d=1,maxEvents:b=500}=t;if(!Number.isInteger(i)||i<=0)throw new TypeError("params.tickSpacing must be a positive integer");if(a==null)throw new TypeError("params.feePerHourInRange is required (number or function)");if(!T(m)||m<=0)throw new TypeError("params.positionValueUsd must be > 0");let h=Ne(l,"gasUsd"),E=Ne(u,"slippageBps"),I=ve(n.math),k=t.widthPct,R=0;if(k==null){let A=tn(e.slice(0,o+1),o);if(G(A))throw new TypeError("not enough bars to derive width from vol; pass widthPct");k=nn({volAnnual:A,horizonHours:s,k:r}),R=o}if(!T(k)||k<=0)throw new TypeError("widthPct must be > 0");let _=0,U=0,x=0,S=0,O=0,j=0,g=0,N=0,C=0,L=0,oe=!1,M=[],B=A=>{M.length<b&&M.push(A)},P=(A,q,he)=>{let J=It({priceNow:A,widthPct:k,tickSpacing:i},{math:I});return{tickLower:J.tickLower,tickUpper:J.tickUpper,priceLower:J.priceLower,priceUpper:J.priceUpper,entryPriceUsd:A,valueUsdAtEntry:q,feesUsdAccrued:0,openedAtIndex:he,sinceLastRebalanceHours:0}},w=P(e[R].c,m,R),y=m;for(let A=R+1;A<e.length;A++){let q=e[A],he=e[A-1],J=T(q.t)&&T(he.t)?(q.t-he.t)/36e5:1;if(L+=J,!w)continue;w.sinceLastRebalanceHours+=J;let V=q.c,we=Kr(a,{bar:q,index:A,widthPct:k,position:w});if(V>=w.priceLower&&V<=w.priceUpper&&(C+=J,!G(we))){let H=we*J;_+=H,w.feesUsdAccrued+=H}let ne=sn({position:{tickLower:w.tickLower,tickUpper:w.tickUpper,liquidity:null,feesUsdAccrued:w.feesUsdAccrued,entryPriceUsd:w.entryPriceUsd,valueUsdAtEntry:w.valueUsdAtEntry},priceNow:V,gasUsd:h,slippageBps:E,feeRateEstimateUsdPerHour:G(we)?D:we*d,horizonHours:s,hysteresisPct:c,minHoldHours:f,sinceLastRebalanceHours:w.sinceLastRebalanceHours,autonomous:!1,tickSpacing:i,widthPct:k,drawdownGuardPct:p},{env:{},math:I});if(ne.action==="rebalance"){let H=_e({priceLower:w.priceLower,priceUpper:w.priceUpper,entryPrice:w.entryPriceUsd,priceNow:V,valueUsdAtEntry:w.valueUsdAtEntry}),be=H.lpValueUsd*(E/1e4);if(U+=H.ilUsd,x+=h,S+=be,y=H.lpValueUsd-h-be,O+=1,B({index:A,t:q.t??null,action:"rebalance",price:V,ilUsd:H.ilUsd,gasUsd:h,slippageUsd:be,valueUsd:y}),!(y>0)){w=null,N+=1,B({index:A,t:q.t??null,action:"exit",price:V,reason:"position value exhausted by costs"});continue}w=P(V,y,A)}else if(ne.action==="exit"){let H=_e({priceLower:w.priceLower,priceUpper:w.priceUpper,entryPrice:w.entryPriceUsd,priceNow:V,valueUsdAtEntry:w.valueUsdAtEntry});U+=H.ilUsd,y=H.lpValueUsd,N+=1,B({index:A,t:q.t??null,action:"exit",price:V,reason:ne.reason,ilUsd:H.ilUsd}),w=null}else ne.action==="alert"?(j+=1,/cost unknown/.test(ne.reason)&&(oe=!0),B({index:A,t:q.t??null,action:"alert",price:V,reason:ne.reason})):g+=1}if(w){let A=e[e.length-1].c,q=_e({priceLower:w.priceLower,priceUpper:w.priceUpper,entryPrice:w.entryPriceUsd,priceNow:A,valueUsdAtEntry:w.valueUsdAtEntry});U+=q.ilUsd,y=q.lpValueUsd}let te=oe||G(h)||G(E),F,K="local";if(te)F=D;else if(typeof I.netPnl=="function"){let A=I.netPnl({feesUsd:_,ilUsd:U,gasUsd:x,slippageUsd:S});F=T(A?.net)?A.net:D,K="injected"}else F=_-U-x-S;return{widthPct:k,netUsd:F,netPnlSource:K,feesUsd:_,ilUsd:U,gasUsd:G(h)?D:x,slippageUsd:G(E)?D:S,rebalances:O,alerts:j,holds:g,exits:N,hoursInRange:C,hoursTotal:L,inRangePct:L>0?C/L*100:0,finalValueUsd:y,positionValueUsd:m,mathSource:I.source,events:M}}function Yr(e,t,n={},r={}){if(!Array.isArray(t)||t.length===0)throw new TypeError("widths must be a non-empty array");let o=t.map(s=>{let i=an(e,{...n,widthPct:s},r);return{widthPct:s,netUsd:i.netUsd,feesUsd:i.feesUsd,ilUsd:i.ilUsd,gasUsd:i.gasUsd,slippageUsd:i.slippageUsd,rebalances:i.rebalances,hoursInRange:i.hoursInRange,hoursTotal:i.hoursTotal,inRangePct:i.inRangePct}});return{byWidth:o,table:cn(o)}}function cn(e){let t=["widthPct","netUsd","feesUsd","ilUsd","gasUsd","slippageUsd","rebalances","hoursInRange","hoursTotal","inRangePct"],n=l=>T(l)?Number.isInteger(l)?String(l):l.toFixed(2):String(l),r=e.map(l=>t.map(u=>n(l[u]))),o=t.map((l,u)=>Math.max(l.length,...r.map(a=>a[u].length))),s=l=>"| "+l.map((u,a)=>u.padStart(o[a])).join(" | ")+" |",i="|-"+o.map(l=>"-".repeat(l)).join("-|-")+"-|";return[s(t),i,...r.map(s)].join(`
|
|
5
|
+
`)}import{AbiCoder as Wr,Interface as Jr,getAddress as hn,isAddress as Qr}from"ethers";var wn=Wr.defaultAbiCoder(),de="0x0000000000000000000000000000000000000000",un="0x000000000022D473030F116dDEE9F6B43aC78BA3",ln=-887272,dn=887272,Q=(1n<<128n)-1n,Zr=(1n<<256n)-1n,eo=(1n<<24n)-1n,fn=30,pn=600,W=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}),to=Object.freeze(Object.fromEntries(Object.entries(W).map(([e,t])=>[t,e]))),no=Object.freeze(["mint","decrease","collect","burn","rebalance"]),bn=new Jr(["function modifyLiquidities(bytes unlockData, uint256 deadline) payable"]),ro=bn.getFunction("modifyLiquidities").selector,oo="tuple(address currency0,address currency1,uint24 fee,int24 tickSpacing,address hooks)",so=Object.freeze({MINT_POSITION:Object.freeze([oo,"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"])});function v(e){throw new Error(`uniswap-v4-lp: ${e}`)}function ee(e,t){(e==null||e==="")&&v(`${t} address required`);let n=String(e);return Qr(n)||v(`${t} is not a valid address: ${n}`),hn(n)}function z(e,t,{max:n=Zr,min:r=0n}={}){(e==null||e==="")&&v(`${t} required`);let o;try{o=typeof e=="bigint"?e:BigInt(String(e))}catch{v(`${t} must be an integer, got ${String(e)}`)}return o<r&&v(`${t} must be >= ${r}`),o>n&&v(`${t} exceeds ${t==="fee"?"uint24":n===Q?"uint128":"uint256"}`),o}function mn(e,t){let n=Number(e);return Number.isInteger(n)||v(`${t} must be an integer tick`),(n<ln||n>dn)&&v(`${t} ${n} outside [${ln}, ${dn}]`),n}function ze(e){return e==null||e===""||String(e).toLowerCase()!=="0x"&&v("opaque hookData is inspect-only until a hook-specific adapter exists"),"0x"}function gn(e={}){(!e||typeof e!="object")&&v("poolKey required");let t=e.currency0==null||e.currency0===""?de:ee(e.currency0,"poolKey.currency0"),n=ee(e.currency1,"poolKey.currency1");BigInt(t)>=BigInt(n)&&v("poolKey.currency0 must sort below currency1 (V4 PoolKey invariant); reordering would target a different pool");let r=Number(z(e.fee,"fee",{max:eo})),o=Number(e.tickSpacing);(!Number.isInteger(o)||o<=0||o>32767)&&v(`poolKey.tickSpacing must be a positive int16, got ${e.tickSpacing}`);let s=e.hooks==null||e.hooks===""?de:ee(e.hooks,"poolKey.hooks");return{currency0:t,currency1:n,fee:r,tickSpacing:o,hooks:s}}function yn(e,t,n){let r=mn(e,"tickLower"),o=mn(t,"tickUpper");return r>=o&&v(`tickLower ${r} must be below tickUpper ${o}`),(r%n!==0||o%n!==0)&&v(`ticks must be multiples of tickSpacing ${n} (got ${r}, ${o})`),{tickLower:r,tickUpper:o}}function io(e){let t=Number(e);return(!Number.isSafeInteger(t)||t<=0)&&v("deadline (unix seconds) required"),t}function xn(e){return`0x${e.map(t=>t.toString(16).padStart(2,"0")).join("")}`}function Z(e,t){return wn.encode(so[e],t)}function ao(e,t){return(!Array.isArray(e)||!Array.isArray(t)||e.length!==t.length||e.length===0)&&v("actions and params must be equal-length non-empty arrays"),wn.encode(["bytes","bytes[]"],[xn(e),t])}function Ge({chainId:e,positionManager:t,actions:n,params:r,deadline:o,value:s,summary:i,extra:l={}}){let u=ao(n,r),a=bn.encodeFunctionData("modifyLiquidities",[u,BigInt(o)]);return Object.freeze({chainId:Number(e),to:t,data:a,value:s.toString(),deadline:o,actions:n.map(c=>to[c]),actionsHex:xn(n),summary:i,...l})}function Ve(e){let t=Number(e.chainId);(!Number.isInteger(t)||t<=0)&&v("chainId required");let n=ee(e.positionManager,"positionManager");return{chainId:t,positionManager:n,deadline:io(e.deadline)}}function co(e={}){let{chainId:t,positionManager:n,deadline:r}=Ve(e),o=gn(e.poolKey),{tickLower:s,tickUpper:i}=yn(e.tickLower,e.tickUpper,o.tickSpacing),l=z(e.liquidity,"liquidity");l===0n&&v("liquidity must be > 0 for mint");let u=z(e.amount0Max,"amount0Max",{max:Q}),a=z(e.amount1Max,"amount1Max",{max:Q}),c=ee(e.owner,"owner"),f=ze(e.hookData),m=o.currency0===de,p=[W.MINT_POSITION,W.SETTLE_PAIR],d=[Z("MINT_POSITION",[o,s,i,l,u,a,c,f]),Z("SETTLE_PAIR",[o.currency0,o.currency1])];m&&(p.push(W.SWEEP),d.push(Z("SWEEP",[de,c])));let b=m?u:0n,h=`mint v4 LP ${o.currency0}/${o.currency1} fee ${o.fee} ticks [${s}, ${i}] liquidity ${l} (max ${u} / ${a}) to ${c}${m?" paying native value":""}${o.hooks!==de?` hooked ${o.hooks}`:""}`;return Ge({chainId:t,positionManager:n,actions:p,params:d,deadline:r,value:b,summary:h,extra:{poolKey:o,tickLower:s,tickUpper:i,owner:c,requiresApproval:Sn(o,{amount0Max:u,amount1Max:a})}})}function En(e={}){let{chainId:t,positionManager:n,deadline:r}=Ve(e),o=z(e.tokenId,"tokenId"),s=z(e.liquidity,"liquidity"),i=z(e.amount0Min,"amount0Min",{max:Q}),l=z(e.amount1Min,"amount1Min",{max:Q}),{currency0:u,currency1:a}=In(e),c=ee(e.recipient??e.owner,"recipient"),f=ze(e.hookData),m=[W.DECREASE_LIQUIDITY,W.TAKE_PAIR],p=[Z("DECREASE_LIQUIDITY",[o,s,i,l,f]),Z("TAKE_PAIR",[u,a,c])],d=s===0n?`collect fees on v4 LP #${o} to ${c}`:`decrease v4 LP #${o} by ${s} liquidity (min ${i} / ${l}) to ${c}`;return Ge({chainId:t,positionManager:n,actions:m,params:p,deadline:r,value:0n,summary:d,extra:{tokenId:o.toString(),recipient:c,currency0:u,currency1:a}})}function uo(e={}){return En({...e,liquidity:0n,amount0Min:0n,amount1Min:0n})}function lo(e={}){let{chainId:t,positionManager:n,deadline:r}=Ve(e),o=z(e.tokenId,"tokenId"),s=z(e.amount0Min,"amount0Min",{max:Q}),i=z(e.amount1Min,"amount1Min",{max:Q}),{currency0:l,currency1:u}=In(e),a=ee(e.recipient??e.owner,"recipient"),c=ze(e.hookData),f=[W.BURN_POSITION,W.TAKE_PAIR],m=[Z("BURN_POSITION",[o,s,i,c]),Z("TAKE_PAIR",[l,u,a])];return Ge({chainId:t,positionManager:n,actions:f,params:m,deadline:r,value:0n,summary:`burn v4 LP #${o} (min ${s} / ${i}) to ${a}`,extra:{tokenId:o.toString(),recipient:a,currency0:l,currency1:u}})}function fo(e={}){let{chainId:t,positionManager:n,deadline:r}=Ve(e),o=e.burn||{},s=e.mint||{},i=z(o.tokenId,"burn.tokenId"),l=z(o.amount0Min??0n,"burn.amount0Min",{max:Q}),u=z(o.amount1Min??0n,"burn.amount1Min",{max:Q}),a=gn(s.poolKey);a.currency0===de&&v("rebalance refuses native currency pools: shortfall msg.value cannot be sized offline");let{tickLower:c,tickUpper:f}=yn(s.tickLower,s.tickUpper,a.tickSpacing),m=z(s.liquidity,"mint.liquidity");m===0n&&v("mint.liquidity must be > 0 for rebalance");let p=z(s.amount0Max,"mint.amount0Max",{max:Q}),d=z(s.amount1Max,"mint.amount1Max",{max:Q}),b=ee(s.owner??e.owner,"owner"),h=ze(s.hookData??o.hookData),E=[W.BURN_POSITION,W.MINT_POSITION,W.CLOSE_CURRENCY,W.CLOSE_CURRENCY],I=[Z("BURN_POSITION",[i,l,u,h]),Z("MINT_POSITION",[a,c,f,m,p,d,b,h]),Z("CLOSE_CURRENCY",[a.currency0]),Z("CLOSE_CURRENCY",[a.currency1])];return Ge({chainId:t,positionManager:n,actions:E,params:I,deadline:r,value:0n,summary:`rebalance v4 LP: burn #${i} then mint ${a.currency0}/${a.currency1} fee ${a.fee} ticks [${c}, ${f}] liquidity ${m} (max ${p} / ${d}) to ${b}, one unlock`,extra:{burnTokenId:i.toString(),poolKey:a,tickLower:c,tickUpper:f,owner:b,requiresApproval:Sn(a,{amount0Max:p,amount1Max:d})}})}function In(e){let t=e.poolKey&&typeof e.poolKey=="object"?e.poolKey:e,n=t.currency0==null||t.currency0===""?de:ee(t.currency0,"currency0"),r=ee(t.currency1,"currency1");return BigInt(n)>=BigInt(r)&&v("currency0 must sort below currency1"),{currency0:n,currency1:r}}function Sn(e,{amount0Max:t,amount1Max:n}){let r=[];return e.currency0!==de&&r.push({token:e.currency0,spender:un,amount:t.toString()}),r.push({token:e.currency1,spender:un,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}}var po=Object.freeze({mint:co,decrease:En,collect:uo,burn:lo,rebalance:fo});function Ps(e={},t={}){let n=t.chains||Pe,r=Number(e.chainId);(!Number.isInteger(r)||r<=0)&&v("chainId required");let o=n[r];o||v(`unsupported chainId ${r} (supported: ${Object.keys(n).join(", ")})`),o.positionManager||v(`no v4 PositionManager registered for chain ${r} (${o.name||"unnamed"})`);let s=String(e.kind||"").toLowerCase(),i=po[s];i||v(`unknown kind ${e.kind} (expected ${no.join("|")})`);let l=Number(e.deadlineSec);(!Number.isInteger(l)||l<fn||l>pn)&&v(`deadlineSec must be an integer from ${fn} through ${pn}`);let a=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+l,c=e.params&&typeof e.params=="object"?e.params:{},f=i({...c,chainId:r,positionManager:hn(o.positionManager),deadline:a}),m=e.from??c.owner??c.recipient??null,p=m?ee(m,"from"):null,d={...f},{to:b,data:h,value:E,summary:I,actions:k,actionsHex:R,requiresApproval:_=null}=f;for(let U of["to","data","value","summary","actions","actionsHex","requiresApproval","chainId","deadline"])delete d[U];return xt({provider:"uniswap-v4-lp",kind:`univ4-lp-${s}`,lpKind:s,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:a,summary:I,plan:{actions:k,actionsHex:R,selector:ro},detail:d,requiresApproval:_,transaction:{chainId:r,from:p,to:b,data:h,value:E},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-${s}`,env:t.env,nowMs:t.nowMs})}function Rs(e=Pe){return Object.entries(e).filter(([,t])=>t&&t.positionManager).map(([t,n])=>({chainId:Number(t),name:n.name,positionManager:n.positionManager}))}export{Jt as K_FOR_PROBABILITY,no as LP_ARTIFACT_KINDS,ot as MAX_SQRT_RATIO,Ee as MAX_TICK,rt as MIN_SQRT_RATIO,xe as MIN_TICK,ro as MODIFY_LIQUIDITIES_SELECTOR,Tt as NET_PNL_COMPONENTS,Ot as NET_PNL_FORMULA,un as PERMIT2,bn as POSITION_MANAGER_IFACE,Ye as Q128,Me as Q192,St as Q32,Le as Q96,nt as UINT256_MAX,W as V4_LP_ACTIONS,so as V4_LP_PARAM_TYPES,dn as V4_MAX_TICK,ln as V4_MIN_TICK,Ht as V4_STATE_VIEW_ABI,X as V4_STATE_VIEW_IFACE,de as ZERO_ADDRESS,tt as amount0InToken1,Ie as amountsForLiquidity,it as amountsValueUsd,kt as bigintSqrt,_e as concentratedIl,lo as encodeBurn,uo as encodeCollect,En as encodeDecreaseLiquidity,co as encodeMintPosition,fo as encodeRebalance,ao as encodeUnlockData,et as feeGrowthInside,at as feesAccrued,Bn as feesToUsd,cn as formatBacktestTable,jn as formatNet,Ue as formatUnitsNumber,Qe as getAmount0ForLiquidity,Ze as getAmount1ForLiquidity,We as getLiquidityForAmount0,Je as getLiquidityForAmount1,Te as getSqrtRatioAtTick,_n as getTickAtSqrtRatio,qn as impermanentLoss,Cn as liquidityForAmounts,en as localPriceToTick,Zt as localTickToPrice,Rs as lpArtifactChains,an as lpBacktest,Yr as lpBacktestSweep,Nn as nearestUsableTick,Fn as netPnl,gn as normalizePoolKey,Gt as normalizeSalt,$n as positionValueUsd,Ps as prepareLpArtifact,Mn as priceToSqrtPriceX96,Un as priceToTick,It as proposeRange,rn as rangeFromTicks,nn as rangeWidthFromVol,Dr as readV4Position,tn as realizedVol,sn as rebalanceDecision,ve as resolveMath,Ln as sqrtPriceX96ToPrice,vn as tickToPrice,ie as toBigInt,Ce as toUint128,re as toUint160,se as toUint256,Vt as v4StateViewAddress,on as widthPctFromRange};
|