@oracle-agent/oracle 0.28.25 → 0.28.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/skills/oracle-chain-graphs-telegram-cards/SKILL.md +10 -1
- package/dist/assets/skills/oracle-desk-product/SKILL.md +1 -1
- package/dist/bin/oracle-gateway.mjs +32 -27
- package/dist/bin/oracle-mev-arb-shadow.mjs +7 -0
- package/dist/bin/oracle-mev-control.mjs +9 -0
- package/dist/bin/oracle-mev-keygen.mjs +5 -0
- package/dist/bin/oracle-mev-operator.mjs +14 -0
- package/dist/bin/oracle-mev-restore-apply.mjs +10 -0
- package/dist/bin/oracle-mev-restore-approve.mjs +5 -0
- package/dist/bin/oracle-mev-restore-keygen.mjs +5 -0
- package/dist/bin/oracle-mev-shadow.mjs +7 -0
- package/dist/bin/oracle.mjs +11 -8
- package/dist/cli/commands/chat.mjs +159 -159
- package/dist/cli/commands/doctor.mjs +3 -3
- package/dist/cli/commands/eval.mjs +43 -43
- package/dist/cli/commands/mev.mjs +35 -0
- package/dist/cli/commands/model.mjs +162 -162
- package/dist/cli/commands/receipt.mjs +2 -2
- package/dist/cli/commands/sign.mjs +8 -8
- package/dist/cli/commands/signer.mjs +13 -13
- package/dist/cli/commands/swap.mjs +27 -18
- package/dist/cli/commands/venues.mjs +2 -2
- package/dist/local-signer/anvil-attestation-worker.mjs +1 -1
- package/dist/local-signer/index.mjs +3 -3
- package/dist/local-signer/runtime.mjs +10 -10
- package/package.json +10 -2
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import{readFile as Rr}from"node:fs/promises";import{homedir as Sr}from"node:os";import{join as T}from"node:path";import{JsonRpcProvider as Cr}from"ethers";import{createHmac as jt,randomUUID as Pt,timingSafeEqual as ut}from"node:crypto";import{mkdir as Ie,open as ke,readFile as ae,rename as Ht,lstat as Ve,unlink as Wt}from"node:fs/promises";import{basename as Dt,dirname as xe,join as qt}from"node:path";import{createHmac as Ct,timingSafeEqual as Rt,randomUUID as Lt}from"node:crypto";import{lstat as Vt,mkdir as Bt,open as nt,readFile as ot,rename as Ft}from"node:fs/promises";import{dirname as zt}from"node:path";function Re(e){return Array.isArray(e)?`[${e.map(Re).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Re(e[t])}`).join(",")}}`:JSON.stringify(e)}function it(e){let t=Buffer.isBuffer(e)?e:Buffer.from(String(e||""));if(t.length<32||t.length>128)throw new Error("monotonic anchor key length is invalid");return t}function at(e){return/^(?:0x)?[0-9a-f]{64}$/i.test(String(e))}function Le(e){let t=String(e).toLowerCase();return t.startsWith("0x")?t:`0x${t}`}function ct(e,t){return`0x${Ct("sha256",it(e)).update("oracle-monotonic-anchor-v1\0").update(Re(t)).digest("hex")}`}async function st(e,t,r){let n=await Vt(e);if(n.isSymbolicLink()||!n.isFile()||(n.mode&63)!==0||n.size>r||typeof process.getuid=="function"&&n.uid!==process.getuid())throw new Error(`${t} permissions, type, owner, or size are unsafe`);return n}async function $t(e,t){let r=zt(e);await Bt(r,{recursive:!0,mode:448});let n=`${e}.${process.pid}.${Lt()}.tmp`,o=await nt(n,"wx",384);try{await o.writeFile(t),await o.sync()}finally{await o.close()}await Ft(n,e);let a=await nt(r,"r");try{await a.sync()}finally{await a.close()}}async function Ee(e){return await st(e,"monotonic anchor key",128),it(await ot(e))}async function pe({path:e,key:t,domain:r}={}){if(typeof e!="string"||!e||typeof r!="string"||!/^[a-z0-9:_-]{1,80}$/i.test(r))throw new TypeError("monotonic anchor path and domain are required");await st(e,"monotonic anchor",4096);let n=JSON.parse(await ot(e,"utf8")),o=n?.base;if(!o||o.version!==1||o.domain!==r||!Number.isSafeInteger(o.revision)||o.revision<1||!at(o.digest)||!Number.isSafeInteger(o.updatedAt)||!/^0x[0-9a-f]{64}$/i.test(String(n.mac||"")))throw new Error("monotonic anchor is invalid");let a=Buffer.from(ct(t,o).slice(2),"hex"),h=Buffer.from(n.mac.slice(2),"hex");if(h.length!==a.length||!Rt(h,a))throw new Error("monotonic anchor authentication failed");return Object.freeze({...o,digest:Le(o.digest)})}async function ge({path:e,key:t,domain:r,revision:n,digest:o}={}){let a=await pe({path:e,key:t,domain:r});if(a.revision!==n||a.digest!==Le(o))throw new Error("monotonic anchor rollback or divergence detected");return a}async function oe({path:e,key:t,domain:r,revision:n,digest:o,now:a=Date.now,allowInitializeAtRevision:h=!1}={}){if(!Number.isSafeInteger(n)||n<1||!at(o)||typeof a!="function")throw new TypeError("monotonic anchor revision, digest, and clock are required");let d=null;try{d=await pe({path:e,key:t,domain:r})}catch(f){if(f?.code!=="ENOENT")throw f}if(d){if(n!==d.revision+1)throw new Error("monotonic anchor revision must advance exactly once")}else if(n!==1&&h!==!0)throw new Error("monotonic anchor initialization revision is unsafe");let s={version:1,domain:r,revision:n,digest:Le(o),updatedAt:a()},y={base:s,mac:ct(t,s)};return await $t(e,`${JSON.stringify(y)}
|
|
3
|
+
`),Object.freeze(s)}function X(e,t,r){if(typeof e!="string"||!e.trim()||e.length>r||/[\u0000-\u001f\u007f]/.test(e))throw new TypeError(`${t} must be non-empty printable text up to ${r} characters`);return e.trim()}function Gt(e){let t=String(e??"");if(!/^[1-9][0-9]{0,19}$/.test(t))throw new TypeError("chainId must be a positive decimal string");return t}function Oe(e,t){return jt("sha256",e).update(t).digest("hex")}function ie(e){let t={};for(let n of Object.keys(e.chains??{}).sort()){let o=e.chains[n];t[n]={revoked:o.revoked,armed:o.armed,revision:o.revision}}let r={version:1,revision:e.revision,globalRevoked:e.globalRevoked,chains:t,updatedAt:e.updatedAt,actor:e.actor,reason:e.reason};return e.authorizationId!=null&&(r.authorizationId=String(e.authorizationId).toLowerCase()),e.authorizationExpiresAt!=null&&(r.authorizationExpiresAt=e.authorizationExpiresAt),r}function Ut(e){return!e||typeof e!="object"||Array.isArray(e)||e.version!==1||!Number.isSafeInteger(e.revision)||e.revision<1||typeof e.globalRevoked!="boolean"||!e.chains||typeof e.chains!="object"||Array.isArray(e.chains)||!Number.isSafeInteger(e.updatedAt)||e.authorizationId!=null&&!/^0x[0-9a-fA-F]{64}$/.test(String(e.authorizationId))||e.authorizationId==null&&e.authorizationExpiresAt!=null||e.authorizationId!=null&&(!Number.isSafeInteger(e.authorizationExpiresAt)||e.authorizationExpiresAt<=e.updatedAt)||typeof e.actor!="string"||typeof e.reason!="string"?!1:Object.entries(e.chains).every(([t,r])=>{let n=r?.revoked===!0&&r?.armed===!1,o=r?.revoked===!1&&r?.armed===!0;return/^[1-9][0-9]{0,19}$/.test(t)&&r&&typeof r=="object"&&(n||!e.globalRevoked&&o)&&Number.isSafeInteger(r.revision)&&r.revision>=1&&r.revision<=e.revision})}async function Be(e,t,r){let n=await Ve(e);if(n.isSymbolicLink()||!n.isFile()||(n.mode&63)!==0||n.size>r||typeof process.getuid=="function"&&n.uid!==process.getuid())throw new Error(`${t} permissions, type, or size are unsafe`);return n}async function ye(e){await Be(e,"control key",128);let t=await ae(e);if(t.length<32||t.length>128)throw new Error("control key length is invalid");return t}async function Jt(e){let t=await ke(e,"r");try{await t.sync()}finally{await t.close()}}async function Kt(e,t){let r=xe(e);await Ie(r,{recursive:!0,mode:448});let n=qt(r,`.${Dt(e)}.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`),o=await ke(n,"wx",384);try{await o.writeFile(t),await o.sync()}finally{await o.close()}await Ht(n,e),await Jt(r)}function Ae(e,t){let r=ie(e),n=JSON.stringify(r);return{state:r,mac:Oe(t,n)}}async function be(e,t){await Be(e,"revocation state",1048576);let r=JSON.parse(await ae(e,"utf8"));if(!r||typeof r!="object"||typeof r.mac!="string"||!Ut(r.state))throw new Error("revocation state invalid");let n=Buffer.from(Oe(t,JSON.stringify(ie(r.state))),"hex"),o=Buffer.from(r.mac,"hex");if(o.length!==n.length||!ut(o,n))throw new Error("revocation state authentication failed");return ie(r.state)}async function Xt(e){await Ie(xe(e),{recursive:!0,mode:448});for(let t=0;t<100;t+=1)try{let r=await ke(e,"wx",384),n=Pt();return await r.writeFile(`${JSON.stringify({version:1,pid:process.pid,token:n})}
|
|
4
|
+
`),await r.sync(),{handle:r,token:n}}catch(r){if(r?.code!=="EEXIST")throw r;let n;try{n=await Ve(e)}catch(a){if(a?.code==="ENOENT")continue;throw a}if(n.isSymbolicLink()||!n.isFile()||(n.mode&63)!==0||n.size>256||typeof process.getuid=="function"&&n.uid!==process.getuid())throw new Error("revocation control lock permissions, type, or size are unsafe");let o;try{o=JSON.parse(await ae(e,"utf8"))}catch(a){if(a?.code==="ENOENT")continue;throw new Error("revocation control lock metadata invalid")}if(o?.version!==1||!Number.isSafeInteger(o.pid)||o.pid<1||typeof o.token!="string"||!/^[0-9a-f-]{36}$/i.test(o.token))throw new Error("revocation control lock metadata invalid");try{process.kill(o.pid,0)}catch(a){if(a?.code==="ESRCH")throw new Error("stale revocation control lock requires manual recovery");if(a?.code!=="EPERM")throw a}await new Promise(a=>setTimeout(a,10))}throw new Error("revocation control lock unavailable")}async function Yt(e,t){try{let[r,n]=await Promise.all([t.handle.stat(),Ve(e)]),o=JSON.parse(await ae(e,"utf8"));if(!n.isFile()||n.isSymbolicLink()||r.dev!==n.dev||r.ino!==n.ino||o?.version!==1||o.pid!==process.pid||o.token!==t.token)throw new Error("revocation control lock ownership changed; refusing unsafe release");await Wt(e)}finally{await t.handle.close().catch(()=>{})}}function lt({keyPath:e,statePath:t,auditPath:r,anchorPath:n,anchorKeyPath:o,fencePath:a,actor:h,now:d=Date.now}={}){X(e,"keyPath",1e3),X(t,"statePath",1e3),X(r,"auditPath",1e3),X(n,"anchorPath",1e3),X(o,"anchorKeyPath",1e3),X(a,"fencePath",1e3);let s=X(h,"actor",80);if(typeof d!="function")throw new TypeError("now must be a function");let y=a,f=Promise.resolve();async function w(c){let m;try{await Be(r,"revocation audit",16*1024*1024),m=await ae(r,"utf8")}catch(u){if(u?.code==="ENOENT")return[];throw u}let g=m.split(`
|
|
5
|
+
`).filter(Boolean),b=[],I=null,k=0;for(let u=0;u<g.length;u+=1){let i=JSON.parse(g[u]);if(!i||typeof i!="object"||Array.isArray(i)||typeof i.recordMac!="string")throw new Error("revocation audit record invalid");let{recordMac:p,...l}=i,O=Buffer.from(Oe(c,JSON.stringify(l)),"hex"),L=Buffer.from(p,"hex");if(L.length!==O.length||!ut(L,O)||l.version!==1||l.auditSeq!==u+1||l.prevRecordMac!==I||!Number.isSafeInteger(l.revision)||(u===0?l.revision<1:l.revision!==k+1)||typeof l.stateMac!="string")throw new Error("revocation audit authentication failed");b.push(i),I=p,k=l.revision}return b}async function v(c,m){let g=await w(m),b=g.at(-1),I=Ae(c,m).mac;if(!b||b.revision!==c.revision||b.stateMac!==I)throw new Error("revocation state and audit revision mismatch");let k=await Ee(o);return await ge({path:n,key:k,domain:"oracle-revocation",revision:c.revision,digest:I}),g}async function S(){try{let c=await ye(e),m=await be(t,c);return await v(m,c),Object.freeze({authenticated:!0,state:Object.freeze(structuredClone(m))})}catch{return Object.freeze({authenticated:!1,state:null})}}async function E(c,m,g){let b=await w(g),I={version:1,auditSeq:b.length+1,prevRecordMac:b.at(-1)?.recordMac??null,action:c,revision:m.revision,updatedAt:m.updatedAt,actor:m.actor,reason:m.reason,stateMac:Ae(m,g).mac},k={...I,recordMac:Oe(g,JSON.stringify(I))};await Ie(xe(r),{recursive:!0,mode:448});let u=await ke(r,"a",384);try{await u.writeFile(`${JSON.stringify(k)}
|
|
6
|
+
`),await u.sync()}finally{await u.close()}}async function _(c,m,g){let b=Ae(m,g);await Kt(t,`${JSON.stringify(b)}
|
|
7
|
+
`),await E(c,m,g);let I=await Ee(o);return await oe({path:n,key:I,domain:"oracle-revocation",revision:m.revision,digest:b.mac,now:d,allowInitializeAtRevision:c==="BOOTSTRAP_REVOKED"}),Object.freeze(structuredClone(m))}function N(c){let m=f.then(async()=>{await Ie(xe(y),{recursive:!0,mode:448});let g=await Xt(y);try{return await c()}finally{await Yt(y,g)}});return f=m.catch(()=>{}),m}function B({reason:c,initialRevision:m=1}={}){let g=X(c,"reason",240);if(!Number.isSafeInteger(m)||m<1)throw new TypeError("initialRevision must be a positive safe integer");return N(async()=>{let b=await ye(e);try{let k=await be(t,b);return await v(k,b),Object.freeze(k)}catch(k){if(k?.code!=="ENOENT")throw k}let I=ie({revision:m,globalRevoked:!0,chains:{},updatedAt:d(),actor:s,reason:g});return _("BOOTSTRAP_REVOKED",I,b)})}function $(c,{reason:m,expectedRevision:g,chainId:b}={}){let I=X(m,"reason",240);if(g!==void 0&&(!Number.isSafeInteger(g)||g<1))throw new TypeError("expectedRevision must be a positive integer");let k=b===void 0?null:Gt(b);return N(async()=>{let u=await ye(e),i=await be(t,u);if(await v(i,u),g!==void 0&&i.revision!==g)throw new Error(`revision conflict: expected ${g}, found ${i.revision}`);let p=i.revision+1,l=structuredClone(i.chains);if(k)l[k]={revoked:!0,armed:!1,revision:p};else for(let L of Object.keys(l))l[L]={revoked:!0,armed:!1,revision:p};let O=ie({...i,revision:p,globalRevoked:k?i.globalRevoked:!0,authorizationId:null,authorizationExpiresAt:null,chains:l,updatedAt:d(),actor:s,reason:I});return _(c,O,u)})}function x({expectedRevision:c}={}){if(!Number.isSafeInteger(c)||c<1)throw new TypeError("expectedRevision must be a positive integer");return N(async()=>{let m=await ye(e),g=await be(t,m),b=await w(m),I=Ae(g,m).mac,k=b.at(-1);if(!k||k.revision!==g.revision||k.stateMac!==I)throw new Error("revocation state and audit revision mismatch");if(g.globalRevoked!==!0||g.revision!==c)throw new Error("only an exact currently revoked revision may initialize the anchor");let u=await Ee(o);return await oe({path:n,key:u,domain:"oracle-revocation",revision:g.revision,digest:I,now:d,allowInitializeAtRevision:!0}),Object.freeze(structuredClone(g))})}return Object.freeze({bootstrapRevoked:B,readSnapshot:S,anchorCurrentRevoked:x,revokeAll:c=>$("REVOKE_ALL",c),revokeChain:c=>$("REVOKE_CHAIN",c),withFence:c=>{if(typeof c!="function")throw new TypeError("fenced operation must be a function");return N(c)}})}import{createHmac as wr,timingSafeEqual as mr}from"node:crypto";import{getAddress as hr,Interface as Er,keccak256 as We}from"ethers";var dt=["admission","promotion","prepare","sign","send","relay","broadcast","contract-execute"],Ur=Object.freeze([...dt]);function W(e,t){let r=new Error(`revocation ${t}`);throw r.code=e,r}function Fe(e){return e&&typeof e=="object"&&!Array.isArray(e)}function Zt(e){let t=String(e??"");if(!/^[1-9][0-9]{0,19}$/.test(t))throw new TypeError("chainId must be a positive decimal string");return t}function Qt(e,t,r){e||W("REVOCATION_STATE_UNAVAILABLE","state unavailable"),e.authenticated!==!0&&W("REVOCATION_STATE_UNAUTHENTICATED","state unauthenticated");let n=e.state;(!Fe(n)||n.version!==1||!Number.isSafeInteger(n.revision)||n.revision<1||typeof n.globalRevoked!="boolean"||!Fe(n.chains)||!Number.isSafeInteger(n.updatedAt))&&W("REVOCATION_STATE_INVALID","state invalid");let o=t(),a=o-n.updatedAt;return(!Number.isSafeInteger(a)||a<-5e3||a>r)&&W("REVOCATION_STATE_STALE","state stale"),n.globalRevoked===!1&&((!/^0x[0-9a-fA-F]{64}$/.test(String(n.authorizationId||""))||!Number.isSafeInteger(n.authorizationExpiresAt)||n.authorizationExpiresAt<=n.updatedAt)&&W("REVOCATION_STATE_INVALID","restored authorization invalid"),o>=n.authorizationExpiresAt&&W("ACTION_AUTHORIZATION_EXPIRED","owner action authorization expired")),n}function ze({snapshot:e,chainId:t,stage:r,actionId:n,now:o=Date.now,maxAgeMs:a=6e4}={}){if(!dt.includes(r))throw new TypeError("stage must be a recognized execution stage");if(typeof o!="function")throw new TypeError("now must be a function");if(!Number.isSafeInteger(a)||a<1||a>3e5)throw new TypeError("maxAgeMs must be an integer from 1 through 300000");let h=Zt(t),d=Qt(e,o,a);if(d.globalRevoked===!1&&n===void 0&&W("ACTION_NOT_AUTHORIZED","owner action is required"),n!==void 0){let y=String(n||"").toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(y))throw new TypeError("actionId must be bytes32");String(d.authorizationId||"").toLowerCase()!==y&&W("ACTION_NOT_AUTHORIZED","owner action is not authorized")}d.globalRevoked&&W("GLOBAL_REVOKED","global execution is revoked");let s=d.chains[h];return Fe(s)||W("CHAIN_NOT_ARMED",`chain ${h} is not armed`),s.revoked===!0&&W("CHAIN_REVOKED",`chain ${h} is revoked`),(s.revoked!==!1||s.armed!==!0)&&W("CHAIN_NOT_ARMED",`chain ${h} is not armed`),(!Number.isSafeInteger(s.revision)||s.revision<1||s.revision>d.revision)&&W("REVOCATION_STATE_INVALID","state invalid"),Object.freeze({allowed:!0,chainId:h,stage:r,revision:d.revision})}import{createHmac as er,timingSafeEqual as tr}from"node:crypto";import{Interface as rr,getAddress as nr,keccak256 as or,toUtf8Bytes as ir}from"ethers";var ar=(1n<<256n)-1n,cr=new Set([100,500,3e3,1e4]),sr=new Set([1,10,50,100,200]),ft=Object.freeze({UNISWAP_V3:0,AERODROME:1}),je=Object.freeze(["function requestFlashLoan(uint256 amount,(bytes32 intentId,uint8 firstVenue,uint24 uniFee,int24 aeroTickSpacing,uint256 minIntermediateAmount,uint256 minFinalAmount,uint256 minProfit,uint256 quoteBlock,uint256 validUntilBlock,uint256 deadline) plan) returns (uint256 realizedProfit)","function paused() view returns (bool)","event FlashExecutionSettled(bytes32 indexed intentId,uint8 indexed firstVenue,uint256 amount,uint256 premium,uint256 finalAmount,uint256 realizedProfit)"]),$e=new rr(je);function ce(e){return Array.isArray(e)?`[${e.map(ce).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${ce(e[t])}`).join(",")}}`:JSON.stringify(e)}function Pe(e){return e&&typeof e=="object"&&!Array.isArray(e)}function J(e,t,{allowZero:r=!1}={}){let n=String(e??"");if(!/^(0|[1-9][0-9]*)$/.test(n))throw new TypeError(`${t} must be an unsigned decimal integer`);let o=BigInt(n);if(o>ar||!r&&o===0n)throw new RangeError(`${t} outside uint256 bounds`);return o.toString()}function q(e,t,{min:r=0,max:n=Number.MAX_SAFE_INTEGER}={}){let o=Number(e);if(!Number.isSafeInteger(o)||o<r||o>n)throw new TypeError(`${t} must be an integer from ${r} through ${n}`);return o}function te(e,t){try{return nr(String(e)).toLowerCase()}catch{throw new TypeError(`${t} must be a valid address`)}}function se(e,t){let r=String(e||"").toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(r))throw new TypeError(`${t} must be bytes32`);return r}function ur(e){let t=String(e||"");if(Buffer.byteLength(t)<32)throw new Error("MEV execution artifact secret must be at least 32 bytes");return t}function wt(e,t){return`0x${er("sha256",ur(e)).update(t).digest("hex")}`}function lr(e,t){return!/^0x[0-9a-f]{64}$/i.test(String(e))||!/^0x[0-9a-f]{64}$/i.test(String(t))?!1:tr(Buffer.from(e.slice(2),"hex"),Buffer.from(t.slice(2),"hex"))}function dr(e){let{signature:t,...r}=e;return r}function ue(e={}){if(!Pe(e))throw new TypeError("MEV policy must be an object");let t={chainId:q(e.chainId,"policy.chainId",{min:1}),executorRuntimeCodeHash:se(e.executorRuntimeCodeHash,"policy.executorRuntimeCodeHash"),maxLoanWei:J(e.maxLoanWei,"policy.maxLoanWei"),minContractProfitWei:J(e.minContractProfitWei,"policy.minContractProfitWei"),minNetProfitWei:J(e.minNetProfitWei,"policy.minNetProfitWei"),maxBlockDrift:q(e.maxBlockDrift,"policy.maxBlockDrift",{min:0,max:20}),artifactTtlMs:q(e.artifactTtlMs,"policy.artifactTtlMs",{min:1e3,max:6e4}),maxGasUnits:J(e.maxGasUnits,"policy.maxGasUnits"),maxL1FeeWei:J(e.maxL1FeeWei,"policy.maxL1FeeWei",{allowZero:!0}),maxTotalCostWei:J(e.maxTotalCostWei,"policy.maxTotalCostWei"),gasLimitBps:q(e.gasLimitBps,"policy.gasLimitBps",{min:1e4,max:2e4}),confirmations:q(e.confirmations,"policy.confirmations",{min:2,max:12})};if(BigInt(t.minContractProfitWei)>BigInt(t.maxLoanWei))throw new RangeError("policy minimum contract profit cannot exceed max loan");return Object.freeze(t)}function mt(e){return or(ir(ce(ue(e))))}function fr(e,t,r){if(!Pe(e))throw new TypeError("candidate must be an object");let n=q(e.quoteBlock,"candidate.quoteBlock",{min:1}),o=q(e.lenderBlock,"candidate.lenderBlock",{min:1});if(n!==o||e.blockConsistency!=="PINNED")throw new Error("candidate must use one lender-pinned block");if(e.lenderAvailable!==!0||e.lenderLiquidityPass!==!0)throw new Error("candidate lender availability and liquidity must pass");let a=J(e.loanAmountWei,"candidate.loanAmountWei");if(BigInt(a)>BigInt(t.maxLoanWei))throw new RangeError("candidate loan exceeds policy cap");let h=J(e.expectedGrossProfitWei,"candidate.expectedGrossProfitWei");if(BigInt(h)<BigInt(t.minContractProfitWei))throw new RangeError("candidate gross profit below contract floor");let d=J(e.minContractProfitWei,"candidate.minContractProfitWei");if(BigInt(d)<BigInt(t.minContractProfitWei))throw new RangeError("candidate contract profit floor too low");let s=String(e.firstVenue||"");if(!(s in ft))throw new Error("candidate first venue is unsupported");let y=q(e.uniFee,"candidate.uniFee",{min:1,max:1e4}),f=q(e.aeroTickSpacing,"candidate.aeroTickSpacing",{min:1,max:1e4});if(!cr.has(y)||!sr.has(f))throw new Error("candidate venue parameter is not allowlisted");let w=Math.floor(r/1e3),v=q(e.deadline,"candidate.deadline",{min:w,max:w+300});return Object.freeze({candidateId:se(e.candidateId,"candidate.candidateId"),ownerActionId:se(e.ownerActionId,"candidate.ownerActionId"),quoteBlock:n,lenderBlock:o,loanAmountWei:a,expectedGrossProfitWei:h,firstVenue:ft[s],firstVenueName:s,uniFee:y,aeroTickSpacing:f,minIntermediateAmount:J(e.minIntermediateAmount,"candidate.minIntermediateAmount"),minFinalAmount:J(e.minFinalAmount,"candidate.minFinalAmount"),minContractProfitWei:d,validUntilBlock:n+t.maxBlockDrift,deadline:v})}function ht({candidate:e,executorAddress:t,signerAddress:r,policy:n,secret:o,nowMs:a=Date.now()}={}){let h=q(a,"nowMs",{min:1}),d=ue(n),s=fr(e,d,h),y=te(t,"executorAddress"),f=te(r,"signerAddress"),w={intentId:s.ownerActionId,firstVenue:s.firstVenue,uniFee:s.uniFee,aeroTickSpacing:s.aeroTickSpacing,minIntermediateAmount:s.minIntermediateAmount,minFinalAmount:s.minFinalAmount,minProfit:s.minContractProfitWei,quoteBlock:s.quoteBlock,validUntilBlock:s.validUntilBlock,deadline:s.deadline},v=$e.encodeFunctionData("requestFlashLoan",[s.loanAmountWei,w]).toLowerCase(),S=Math.min(h+d.artifactTtlMs,s.deadline*1e3);if(S<=h)throw new Error("candidate deadline leaves no execution window");let E={kind:"oracle-mev-execution-artifact",version:1,chainId:d.chainId,candidateId:s.candidateId,ownerActionId:s.ownerActionId,quoteBlock:s.quoteBlock,validUntilBlock:s.validUntilBlock,lenderBlock:s.lenderBlock,expectedGrossProfitWei:s.expectedGrossProfitWei,policyHash:mt(d),from:f,to:y,value:"0",data:v,intentId:s.ownerActionId,issuedAtMs:h,expiresAtMs:S};return Object.freeze({...E,signature:wt(o,ce(E))})}function He(e,{secret:t,policy:r,executorAddress:n,signerAddress:o,nowMs:a=Date.now()}={}){if(!Pe(e)||e.kind!=="oracle-mev-execution-artifact"||e.version!==1)throw new Error("MEV execution artifact required");let h=q(a,"nowMs",{min:1});if(!Number.isSafeInteger(e.issuedAtMs)||!Number.isSafeInteger(e.expiresAtMs)||e.issuedAtMs>h+5e3||e.expiresAtMs<=h)throw new Error("MEV execution artifact expired or temporally invalid");let d=ue(r);if(e.chainId!==d.chainId||e.policyHash!==mt(d))throw new Error("MEV execution artifact policy mismatch");let s=wt(t,ce(dr(e)));if(!lr(e.signature,s))throw new Error("MEV execution artifact authentication failed");let y=te(e.to,"artifact.to"),f=te(e.from,"artifact.from");if(n&&y!==te(n,"executorAddress"))throw new Error("MEV executor destination mismatch");if(o&&f!==te(o,"signerAddress"))throw new Error("MEV signer mismatch");if(e.value!=="0")throw new Error("MEV transaction value must be zero");if(!/^0x[0-9a-f]+$/.test(String(e.data))||String(e.data).slice(0,10)!==$e.getFunction("requestFlashLoan").selector)throw new Error("MEV calldata is not bounded requestFlashLoan");let w=$e.decodeFunctionData("requestFlashLoan",e.data);if(w[1].intentId.toLowerCase()!==se(e.intentId,"artifact.intentId"))throw new Error("MEV intent mismatch");if(Number(w[1].quoteBlock)!==e.quoteBlock||Number(w[1].validUntilBlock)!==e.validUntilBlock)throw new Error("MEV on-chain block window mismatch");if(se(e.ownerActionId,"artifact.ownerActionId"),e.ownerActionId!==e.intentId||e.quoteBlock!==e.lenderBlock)throw new Error("MEV artifact block or intent mismatch");return Object.freeze({...e,from:f,to:y})}var le=new Er(je);function De(e){return Array.isArray(e)?`[${e.map(De).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${De(e[t])}`).join(",")}}`:JSON.stringify(e)}function pr(e,t){return`0x${wr("sha256",String(e)).update(t).digest("hex")}`}function gr(e,t){return!/^0x[0-9a-f]{64}$/i.test(String(e))||!/^0x[0-9a-f]{64}$/i.test(String(t))?!1:mr(Buffer.from(e.slice(2),"hex"),Buffer.from(t.slice(2),"hex"))}function yr(e){let{signature:t,...r}=e;return r}function Z(e,t){try{return hr(String(e)).toLowerCase()}catch{throw new TypeError(`${t} must be a valid address`)}}function _e(e,t){let r=String(e??"");if(!/^(0|[1-9][0-9]*)$/.test(r))throw new TypeError(`${t} must be an unsigned decimal integer`);return BigInt(r)}function Et(e,t,r){for(let n of e?.logs||[])if(Z(n.address,"receipt.log.address")===t)try{let o=le.parseLog(n);if(o?.name==="FlashExecutionSettled"&&o.args.intentId.toLowerCase()===r)return o}catch{}throw new Error("MEV settlement event missing or intent mismatch")}function Ar(e,t){return(e*BigInt(t)+9999n)/10000n}function qe(e){return`0x${BigInt(e).toString(16)}`}function gt(e){let t={};for(let[r,n]of Object.entries(e||{}))n==null||r==="chainId"||r==="type"||(t[r]=typeof n=="bigint"||typeof n=="number"?qe(n):n);return t}async function pt(e,t,r){return typeof e.send=="function"?e.send("eth_call",[gt(t),qe(r)]):e.call(t,r)}async function br(e,t,r){return typeof e.send=="function"?BigInt(await e.send("eth_estimateGas",[gt(t),qe(r)])):BigInt(await e.estimateGas(t,r))}function yt(e,t){return pr(t,De(e))}function Ir(e,{artifact:t,secret:r,nowMs:n}){if(!e||e.kind!=="oracle-mev-simulation"||e.version!==1)throw new Error("authenticated MEV simulation required");if(e.artifactSignature!==t.signature||e.intentId!==t.intentId)throw new Error("MEV simulation artifact mismatch");if(!Number.isSafeInteger(e.expiresAtMs)||e.expiresAtMs<=n)throw new Error("MEV simulation expired");let o=yt(yr(e),r);if(!gr(e.signature,o))throw new Error("MEV simulation authentication failed");if(e.executionEligible!==!0)throw new Error("MEV simulation is not execution eligible");return e}function At({executorAddress:e,signer:t,provider:r,readRevocation:n,artifactSecret:o,policy:a,enabled:h=!1,now:d=Date.now,estimateL1Fee:s,onAuthorizedStage:y,receiptStore:f,attemptStore:w,withRevocationFence:v,hooks:S={}}={}){if(!t||typeof t.getAddress!="function")throw new TypeError("dedicated MEV signer required");if(!r||typeof r.getNetwork!="function")throw new TypeError("MEV provider required");if(typeof n!="function")throw new TypeError("readRevocation required");if(typeof d!="function")throw new TypeError("now must be a function");typeof s!="function"&&(s=async()=>{throw new Error("Base L1 fee estimator required")});let E=ue(a);if(h){for(let u of["inspect","begin","record","recover"])if(typeof w?.[u]!="function")throw new TypeError(`enabled MEV operator requires attemptStore.${u}`);if(typeof f?.append!="function")throw new TypeError("enabled MEV operator requires receiptStore.append");if(typeof v!="function")throw new TypeError("enabled MEV operator requires a revocation fence")}let _=Z(e,"executorAddress"),N=!1;async function B(){return Z(await t.getAddress(),"dedicated signer")}async function $(){let u=le.encodeFunctionData("paused"),i=await r.call({to:_,data:u},"latest"),[p]=le.decodeFunctionResult("paused",i);if(typeof p!="boolean")throw new Error("MEV executor pause state malformed");return p}async function x(u,i){let p;try{p=await n()}catch{let O=new Error("revocation state unavailable");throw O.code="REVOCATION_STATE_UNAVAILABLE",O}let l=ze({snapshot:p,chainId:E.chainId,stage:u,actionId:i,now:d});return y?.(u,l),l}async function c(){let[u,i]=await Promise.all([r.getNetwork(),r.getCode(_)]);if(Number(u.chainId)!==E.chainId)throw new Error("MEV provider chain mismatch");if(typeof i!="string"||i==="0x")throw new Error("MEV executor bytecode missing");let p=We(i);if(p.toLowerCase()!==E.executorRuntimeCodeHash)throw new Error("MEV executor runtime code hash mismatch");if(await $())throw new Error("MEV executor is paused");return Object.freeze({runtimeCodeHash:p,paused:!1})}async function m(){let[u,i,p]=await Promise.all([B(),r.getNetwork(),r.getCode(_)]),l=Number(i.chainId)===E.chainId,O=typeof p=="string"&&p!=="0x",L=O?We(p):null,M=L?.toLowerCase()===E.executorRuntimeCodeHash,A=null,P=null;if(O&&M)try{A=await $()}catch(z){P=z?.message||"MEV executor pause state unavailable"}let V=null,F=null;try{V=await w?.inspect?.()??Object.freeze({locked:!1,unresolved:[]})}catch(z){F=z?.message||"MEV attempt journal unavailable"}let j=F===null&&V.locked!==!0&&V.unresolved.length===0,C=!1,G=null,R=null,U=null;try{let z=await n();R=z?.state?.authorizationId??null,U=z?.state?.authorizationExpiresAt??null,ze({snapshot:z,chainId:E.chainId,stage:"admission",actionId:R,now:d}),C=!0}catch(z){G=z?.code||"REVOCATION_DENIED"}let K=h===!0&&l&&O&&M&&P===null&&j,Q=K&&A===!1;return Object.freeze({mode:h?l?O?M?P!==null||A===null?"pause-unknown":F!==null?"journal-integrity-failed":j?A?"staged-paused":"armed-idle":"recovery-required":"identity-failed":"missing-contract":"chain-mismatch":"disabled",capabilityInstalled:K,armed:Q,autonomous:!1,executionPermitted:Q&&C,revocationAllowed:C,revocationCode:G,authorizedActionId:R,authorizationExpiresAt:U,authorizationIsActionScoped:!0,executionInProgress:N,chainId:E.chainId,signer:u,executor:_,chainMatches:l,contractPresent:O,contractIdentityMatches:M,contractPaused:A,contractStateError:P,runtimeCodeHash:L,signerAvailable:j,attemptIntegrityError:F,unresolvedAttempts:V?.unresolved?.length??null})}async function g(u){return await x("admission",u?.ownerActionId),await x("promotion",u?.ownerActionId),await x("prepare",u?.ownerActionId),await c(),ht({candidate:u,executorAddress:_,signerAddress:await B(),policy:E,secret:o,nowMs:d()})}async function b(u){let i=await B(),p=He(u,{secret:o,policy:E,executorAddress:_,signerAddress:i,nowMs:d()});await x("contract-execute",p.ownerActionId),await c();let l=await r.getBlockNumber();if(!Number.isSafeInteger(l)||l<p.quoteBlock||l>p.validUntilBlock||l-p.quoteBlock>E.maxBlockDrift)throw new Error("MEV simulation block drift exceeded");S.onProviderCall?.("eth_call");let O={from:i,to:_,data:p.data,value:0n},L=await pt(r,O,l),[M]=le.decodeFunctionResult("requestFlashLoan",L),A=BigInt(M);S.onProviderCall?.("eth_estimateGas");let P=await br(r,O,l),V=Ar(P,E.gasLimitBps);if(V>BigInt(E.maxGasUnits))throw new Error("MEV simulation gas cap exceeded");let F=await r.getFeeData(),j=BigInt(F.maxFeePerGas??F.gasPrice??0n),C=BigInt(F.maxPriorityFeePerGas??0n);if(j<=0n)throw new Error("MEV simulation fee data unavailable");let G=await r.getTransactionCount(i,"pending"),R={chainId:E.chainId,type:2,from:i,to:_,data:p.data,value:0n,nonce:G,gasLimit:V,maxFeePerGas:j,maxPriorityFeePerGas:C},U=BigInt(await s(R));if(U>BigInt(E.maxL1FeeWei))throw new Error("Base L1 data fee cap exceeded");let K=V*j+U;if(K>BigInt(E.maxTotalCostWei))throw new Error("MEV total cost cap exceeded");if(A<=K)throw new Error("MEV simulation is net negative");let Q=A-K;if(Q<BigInt(E.minNetProfitWei))throw new Error("MEV simulation net profit below floor");let Y={kind:"oracle-mev-simulation",version:1,artifactSignature:p.signature,intentId:p.intentId,blockNumber:l,realizedGrossProfitWei:A.toString(),estimatedGas:P.toString(),gasLimit:V.toString(),maxFeePerGas:j.toString(),maxPriorityFeePerGas:C.toString(),l1FeeWei:U.toString(),totalCostWei:K.toString(),netProfitWei:Q.toString(),tx:{chainId:R.chainId,type:R.type,from:R.from,to:R.to,data:R.data,value:R.value.toString(),nonce:R.nonce,gasLimit:R.gasLimit.toString(),maxFeePerGas:R.maxFeePerGas.toString(),maxPriorityFeePerGas:R.maxPriorityFeePerGas.toString()},executionEligible:!0,issuedAtMs:d(),expiresAtMs:Math.min(p.expiresAtMs,d()+E.artifactTtlMs)};return Object.freeze({...Y,signature:yt(Y,o)})}async function I(){if(!w?.inspect||!w?.recover)return Object.freeze({status:"NO_ATTEMPT_STORE"});let u=await w.inspect();if(!u.locked&&u.unresolved.length===0)return Object.freeze({status:"CLEAR"});if(!u.locked&&u.unresolved.length>0)throw new Error("MEV unresolved attempt exists without its signer lock");let i=u.unresolved[0],p=i||u.lock||u.last;if(!p?.ownerActionId||!p?.intentId)throw new Error("MEV recovery record lacks action identity");if(!i)return await w.recover({expectedLockToken:u.lock.token,stage:"reconciled-terminal-lock",terminal:!0,ownerActionId:p.ownerActionId,intentId:p.intentId,nonce:p.nonce}),Object.freeze({status:"TERMINAL_LOCK_CLEARED",ownerActionId:p.ownerActionId});if(!i.signedTxHash)return await w.recover({expectedLockToken:u.lock.token,stage:"reconciled-pre-broadcast",terminal:!0,ownerActionId:i.ownerActionId,intentId:i.intentId,nonce:i.nonce}),Object.freeze({status:"PRE_BROADCAST_CLEARED",ownerActionId:i.ownerActionId});let l=await r.getTransactionReceipt(i.signedTxHash);if(!l){let V=await B(),[F,j]=await Promise.all([r.getTransactionCount(V,"latest"),r.getTransactionCount(V,"pending")]),C=Number(F)>Number(i.nonce),G=Number(j)>Number(i.nonce);return Object.freeze({status:C?"NONCE_CONSUMED_UNKNOWN_TX":G?"PENDING_OR_REPLACED":"DROPPED_OR_NOT_PROPAGATED",ownerActionId:i.ownerActionId,txHash:i.signedTxHash,nonce:i.nonce,latestNonce:F,pendingNonce:j})}if(await r.getBlockNumber()-Number(l.blockNumber)+1<E.confirmations)return Object.freeze({status:"PENDING_CONFIRMATIONS",txHash:i.signedTxHash,blockNumber:l.blockNumber});let L=await r.getBlock(l.blockNumber);if(!L||String(L.hash||"").toLowerCase()!==String(l.blockHash||"").toLowerCase())return Object.freeze({status:"REORG_OR_NONCANONICAL",txHash:i.signedTxHash,blockNumber:l.blockNumber});if(Number(l.status)!==1){let V=Object.freeze({idempotencyKey:`receipt:${i.signedTxHash.toLowerCase()}`,recovery:!0,ownerActionId:i.ownerActionId,intentId:i.intentId,txHash:i.signedTxHash,receiptStatus:Number(l.status),blockNumber:l.blockNumber,blockHash:l.blockHash});return await w.recover({expectedLockToken:u.lock.token,beforeRecord:async()=>f.append(V),stage:"reconciled-reverted",terminal:!0,ownerActionId:i.ownerActionId,intentId:i.intentId,nonce:i.nonce,txHash:i.signedTxHash,blockNumber:l.blockNumber,blockHash:l.blockHash}),Object.freeze({status:"REVERTED",txHash:i.signedTxHash,blockNumber:l.blockNumber})}let M=await B();if(Z(l.to,"receipt.to")!==_||Z(l.from,"receipt.from")!==M)throw new Error("MEV recovered receipt boundary mismatch");let A=Et(l,_,i.intentId),P=Object.freeze({idempotencyKey:`receipt:${i.signedTxHash.toLowerCase()}`,recovery:!0,ownerActionId:i.ownerActionId,intentId:i.intentId,txHash:i.signedTxHash,receiptStatus:1,realizedProfitWei:A.args.realizedProfit.toString(),premiumWei:A.args.premium.toString(),finalAmountWei:A.args.finalAmount.toString(),blockNumber:l.blockNumber,blockHash:l.blockHash});return await w.recover({expectedLockToken:u.lock.token,beforeRecord:async()=>f.append(P),stage:"reconciled-confirmed",terminal:!0,ownerActionId:i.ownerActionId,intentId:i.intentId,nonce:i.nonce,txHash:i.signedTxHash,blockNumber:l.blockNumber,blockHash:l.blockHash}),Object.freeze({status:"CONFIRMED",...P})}async function k({artifact:u,simulation:i,execute:p,ownerActionId:l}={}){if(h!==!0)throw new Error("MEV operator is not armed");if(p!==!0)throw new Error("explicit execute:true owner scope required");let O=String(l||"").toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(O))throw new Error("ownerActionId bytes32 required");if(N)throw new Error("MEV execution already in progress");let L=await B(),M=He(u,{secret:o,policy:E,executorAddress:_,signerAddress:L,nowMs:d()}),A=Ir(i,{artifact:M,secret:o,nowMs:d()});if(M.ownerActionId!==O)throw new Error("owner action does not match restored artifact scope");N=!0;let P=!1,V=!1,F=!1,j=!1;try{await x("contract-execute",O);let C=await r.getBlockNumber();if(C<A.blockNumber||C>M.validUntilBlock||C-A.blockNumber>E.maxBlockDrift)throw new Error("MEV execution simulation became stale");S.onProviderCall?.("eth_call-pre-sign");let G=await pt(r,{from:L,to:_,data:M.data,value:0n},C),[R]=le.decodeFunctionResult("requestFlashLoan",G),U=BigInt(R);if(U<=BigInt(A.totalCostWei)||U-BigInt(A.totalCostWei)<BigInt(E.minNetProfitWei))throw new Error("MEV pre-sign simulation no longer meets net profit floor");let K={chainId:A.tx.chainId,type:A.tx.type,to:A.tx.to,data:A.tx.data,value:_e(A.tx.value,"simulation.tx.value"),nonce:A.tx.nonce,gasLimit:_e(A.tx.gasLimit,"simulation.tx.gasLimit"),maxFeePerGas:_e(A.tx.maxFeePerGas,"simulation.tx.maxFeePerGas"),maxPriorityFeePerGas:_e(A.tx.maxPriorityFeePerGas,"simulation.tx.maxPriorityFeePerGas")};if(await r.getTransactionCount(L,"pending")!==A.tx.nonce)throw new Error("MEV signer nonce changed after simulation");await x("sign",O),await w.begin({ownerActionId:O,intentId:M.intentId,nonce:A.tx.nonce}),P=!0;let Y=await t.signTransaction(K);if(!/^0x[0-9a-f]+$/i.test(String(Y)))throw new Error("MEV signer returned invalid transaction");let z=We(Y),me=BigInt(await s(Y)),et=BigInt(A.l1FeeWei),tt=BigInt(A.totalCostWei);if(tt<et)throw new Error("MEV authenticated simulation cost is malformed");let ne=tt-et+me;if(me>BigInt(E.maxL1FeeWei)||ne>BigInt(E.maxTotalCostWei))throw new Error("MEV exact signed transaction cost exceeds policy");if(U<=ne||U-ne<BigInt(E.minNetProfitWei))throw new Error("MEV exact signed transaction cost violates net profit floor");await w.record({stage:"signed-cost-verified",ownerActionId:O,intentId:M.intentId,nonce:A.tx.nonce,signedTxHash:z,exactL1FeeWei:me.toString(),exactTotalCostWei:ne.toString()}),await x("send",O),await x("relay",O),await x("broadcast",O),await w.record({stage:"broadcast-authorized",ownerActionId:O,intentId:M.intentId,nonce:A.tx.nonce});let Se=await v(async()=>(await x("broadcast",O),V=!0,r.broadcastTransaction(Y)));if(String(Se.hash||"").toLowerCase()!==z.toLowerCase())throw new Error("MEV broadcaster returned a hash different from the signed transaction");await w.record({stage:"broadcast-returned",ownerActionId:O,intentId:M.intentId,nonce:A.tx.nonce,txHash:Se.hash});let ee=await Se.wait(E.confirmations);if(!ee||Number(ee.status)!==1)throw new Error("MEV transaction reverted or receipt unavailable");if(String(ee.hash||ee.transactionHash||"").toLowerCase()!==z.toLowerCase())throw new Error("MEV receipt transaction hash mismatch");let H=await r.getTransactionReceipt(z);if(!H||String(H.blockHash||"").toLowerCase()!==String(ee.blockHash||"").toLowerCase()||Number(H.blockNumber)!==Number(ee.blockNumber)||Number(H.status)!==1)throw new Error("MEV receipt is not canonical at the required confirmation depth");if(await r.getBlockNumber()-Number(H.blockNumber)+1<E.confirmations)throw new Error("MEV receipt confirmation depth is insufficient");let rt=await r.getBlock(H.blockNumber);if(!rt||String(rt.hash||"").toLowerCase()!==String(H.blockHash||"").toLowerCase())throw new Error("MEV receipt block is no longer canonical");if(Z(H.to,"receipt.to")!==_||Z(H.from,"receipt.from")!==L)throw new Error("MEV receipt boundary mismatch");let Ce=Et(H,_,M.intentId);j=!0;let he=Object.freeze({idempotencyKey:`receipt:${z.toLowerCase()}`,ownerActionId:O,intentId:M.intentId,txHash:z,receiptStatus:Number(H.status),realizedProfitWei:Ce.args.realizedProfit.toString(),premiumWei:Ce.args.premium.toString(),finalAmountWei:Ce.args.finalAmount.toString(),blockNumber:H.blockNumber??null,blockHash:H.blockHash??null,quoteBlock:M.quoteBlock,validUntilBlock:M.validUntilBlock,artifactSignature:M.signature,simulationSignature:A.signature,exactL1FeeWei:me.toString(),exactTotalCostWei:ne.toString()});return await f.append(he),F=!0,await w.record({stage:"confirmed",terminal:!0,ownerActionId:O,intentId:M.intentId,nonce:A.tx.nonce,txHash:he.txHash,blockNumber:he.blockNumber}),he}catch(C){if(P){let G=!V||F;try{await w.record({stage:j&&!F?"receipt-durability-failed":G?F?"failed-receipt":"failed-before-broadcast":"broadcast-ambiguous",terminal:G,ownerActionId:O,intentId:M.intentId,nonce:A.tx.nonce,errorCode:C?.code||null,errorMessage:String(C?.message||"MEV execution failed").slice(0,500)})}catch(R){C.message=`${C.message}; attempt journal also failed: ${R.message}`}}throw C}finally{N=!1}}return Object.freeze({status:m,reconcile:I,prepare:g,simulate:b,execute:k})}import{createHash as xr,createHmac as Or,randomUUID as Ue,timingSafeEqual as kr}from"node:crypto";import{constants as D}from"node:fs";import{lstat as Je,mkdir as Ke,open as de,readFile as fe,rename as _r,unlink as Ge}from"node:fs/promises";import{dirname as Xe}from"node:path";import{Interface as vr,Transaction as bt,Wallet as Nr}from"ethers";var Mr="0x420000000000000000000000000000000000000F",It=new vr(["function getL1Fee(bytes) view returns (uint256)"]);function ve(e){return Array.isArray(e)?`[${e.map(ve).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${ve(e[t])}`).join(",")}}`:JSON.stringify(e)}function _t(e){return`0x${xr("sha256").update(ve(e)).digest("hex")}`}function vt(e){let t=String(e||"");if(Buffer.byteLength(t)<32)throw new Error("MEV journal integrity secret must be at least 32 bytes");return t}function Ne(e,t,r){return`0x${Or("sha256",vt(e)).update(t).update("\0").update(ve(r)).digest("hex")}`}function xt(e,t){return!/^0x[0-9a-f]{64}$/i.test(String(e))||!/^0x[0-9a-f]{64}$/i.test(String(t))?!1:kr(Buffer.from(e.slice(2),"hex"),Buffer.from(t.slice(2),"hex"))}async function Tr(e,t){let r=Xe(e);await Ke(r,{recursive:!0,mode:448});let n=`${e}.${process.pid}.${Ue()}.tmp`,o=await de(n,D.O_WRONLY|D.O_CREAT|D.O_EXCL,384);try{await o.writeFile(t),await o.sync()}finally{await o.close()}await _r(n,e);let a=await de(r,D.O_RDONLY);try{await a.sync()}finally{await a.close()}}async function Ot(e,t){try{if((await we(e,t)).size>16*1024*1024)throw new Error(`${t} is oversized`);return await fe(e,"utf8")}catch(r){if(r?.code==="ENOENT")return null;throw r}}async function we(e,t){let r=await Je(e);if(!r.isFile()||r.isSymbolicLink())throw new Error(`${t} must be a regular non-symlink file`);if((r.mode&63)!==0)throw new Error(`${t} permissions are unsafe`);if(typeof process.getuid=="function"&&r.uid!==process.getuid())throw new Error(`${t} owner is unsafe`);return r}async function Ye(e,t="secret",{minBytes:r=32,maxBytes:n=4096}={}){await we(e,t);let o=await fe(e);if(o.length<r||o.length>n)throw new Error(`${t} length is invalid`);return o.toString("utf8").replace(/[\r\n]+$/,"")}async function Nt({keyFile:e,passwordFile:t,provider:r}={}){if(!e||!t)throw new Error("dedicated encrypted MEV key and password files are required");await Promise.all([we(e,"dedicated MEV keystore"),we(t,"dedicated MEV password")]);let[n,o]=await Promise.all([fe(e,"utf8"),fe(t)]),a=o.toString("utf8").replace(/[\r\n]+$/,"");if(Buffer.byteLength(a)<16)throw new Error("dedicated MEV password is too short");let h=await Nr.fromEncryptedJson(n,a),d=r?h.connect(r):h;return Object.freeze({getAddress:()=>d.getAddress(),signTransaction:s=>d.signTransaction(s)})}function Mt(e,{gasPriceOracle:t=Mr}={}){if(!e||typeof e.call!="function")throw new TypeError("provider.call required for Base L1 fee estimation");return async function(n){let o;if(typeof n=="string"){if(!/^0x[0-9a-fA-F]+$/.test(n))throw new TypeError("signed transaction hex required");o=bt.from(n).serialized}else{let{from:s,gasPrice:y,...f}=n||{};o=bt.from({...f,signature:{r:`0x${"6f".repeat(32)}`,s:`0x${"3f".repeat(32)}`,yParity:1}}).serialized}let a=It.encodeFunctionData("getL1Fee",[o]),h=await e.call({to:t,data:a}),[d]=It.decodeFunctionResult("getL1Fee",h);return BigInt(d)}}async function kt(e,{headPath:t,integritySecret:r,anchorPath:n,anchorKey:o,anchorDomain:a}){let[h,d]=await Promise.all([Ot(e,"MEV journal"),Ot(t,"MEV journal head")]);if(h===null&&d===null)try{throw await pe({path:n,key:o,domain:a}),new Error("MEV journal is missing while its independent anchor exists")}catch(N){if(N?.code==="ENOENT")return[];throw N}if(h===null||d===null)throw new Error("MEV journal or authenticated head is missing");let y=h.split(`
|
|
8
|
+
`).filter(Boolean).map(N=>JSON.parse(N)),f=null;for(let N=0;N<y.length;N+=1){let B=y[N];if(B.sequence!==N+1||B.previousHash!==f)throw new Error("MEV receipt chain continuity invalid");let{recordHash:$,recordMac:x,...c}=B;if($!==_t(c))throw new Error("MEV receipt chain hash invalid");if(!xt(x,Ne(r,"oracle-mev-journal-record-v1",{...c,recordHash:$})))throw new Error("MEV receipt chain authentication invalid");f=$}let w=JSON.parse(d),{mac:v,...S}=w;if(!xt(v,Ne(r,"oracle-mev-journal-head-v1",S)))throw new Error("MEV journal head authentication invalid");let E=y.length,_=y.length?y.at(-1).recordHash:null;if(w.sequence!==E||w.recordHash!==_)throw new Error("MEV journal rollback or truncation detected");return await ge({path:n,key:o,domain:a,revision:E,digest:_}),y}function Ze({path:e,headPath:t=`${e}.head`,integritySecret:r,anchorPath:n,anchorKey:o,anchorDomain:a="oracle-mev-receipts",now:h=Date.now}={}){if(!e||!t)throw new TypeError("MEV receipt store and head paths required");if(vt(r),!n||Buffer.byteLength(String(o||""))<32||!/^[a-z0-9:_-]{1,80}$/i.test(a))throw new TypeError("independent MEV journal anchor path, key, and domain are required");if(typeof h!="function")throw new TypeError("now must be a function");let d=Promise.resolve();async function s(f){return d=d.then(async()=>{await Ke(Xe(e),{recursive:!0,mode:448});let w=await kt(e,{headPath:t,integritySecret:r,anchorPath:n,anchorKey:o,anchorDomain:a});if(f?.idempotencyKey!==void 0){if(typeof f.idempotencyKey!="string"||!/^[a-z0-9:_-]{1,160}$/i.test(f.idempotencyKey))throw new Error("MEV journal idempotency key is invalid");let $=w.find(x=>x.idempotencyKey===f.idempotencyKey);if($)return Object.freeze($)}let v={sequence:w.length+1,previousHash:w.length?w.at(-1).recordHash:null,recordedAtMs:h(),...f},S=_t(v),E={...v,recordHash:S,recordMac:Ne(r,"oracle-mev-journal-record-v1",{...v,recordHash:S})},_=await de(e,D.O_WRONLY|D.O_CREAT|D.O_APPEND,384);try{await _.writeFile(`${JSON.stringify(E)}
|
|
9
|
+
`),await _.sync()}finally{await _.close()}let N={sequence:E.sequence,recordHash:E.recordHash},B={...N,mac:Ne(r,"oracle-mev-journal-head-v1",N)};return await Tr(t,`${JSON.stringify(B)}
|
|
10
|
+
`),await oe({path:n,key:o,domain:a,revision:E.sequence,digest:E.recordHash,now:h}),Object.freeze(E)}),d}async function y(){let f=await kt(e,{headPath:t,integritySecret:r,anchorPath:n,anchorKey:o,anchorDomain:a});return Object.freeze({rows:Object.freeze(f.map(w=>Object.freeze({...w})))})}return Object.freeze({append:s,inspect:y})}function Tt({path:e,headPath:t=`${e}.head`,lockPath:r=`${e}.lock`,integritySecret:n,anchorPath:o,anchorKey:a,anchorDomain:h="oracle-mev-attempts",now:d=Date.now,isProcessAlive:s=y=>{try{return process.kill(y,0),!0}catch(f){if(f?.code==="ESRCH")return!1;if(f?.code==="EPERM")return!0;throw f}}}={}){if(!e||!t||!r)throw new TypeError("MEV attempt store, head, and lock paths required");if(typeof s!="function")throw new TypeError("isProcessAlive must be a function");let y=Ze({path:e,headPath:t,integritySecret:n,anchorPath:o,anchorKey:a,anchorDomain:h,now:d}),f=null,w=null;async function v(){await we(r,"MEV signer lock");let x=await Je(r),c=JSON.parse(await fe(r,"utf8"));if(c?.version!==1||!Number.isSafeInteger(c.pid)||c.pid<1||typeof c.token!="string"||!/^[0-9a-f-]{36}$/i.test(c.token)||typeof c.ownerActionId!="string"||typeof c.intentId!="string")throw new Error("MEV signer lock metadata invalid");return{info:x,lock:c}}async function S(){if(!f||!w)throw new Error("MEV signer lock is not held");try{let[x,c]=await Promise.all([f.stat(),v()]);if(x.dev!==c.info.dev||x.ino!==c.info.ino||c.lock.pid!==process.pid||c.lock.token!==w)throw new Error("MEV signer lock ownership changed; refusing unsafe release");await Ge(r)}finally{await f.close().catch(()=>{}),f=null,w=null}}async function E({ownerActionId:x,intentId:c,nonce:m}){if(f)throw new Error("MEV attempt already active in this process");await Ke(Xe(e),{recursive:!0,mode:448});try{f=await de(r,D.O_WRONLY|D.O_CREAT|D.O_EXCL,384),w=Ue()}catch(g){throw g?.code==="EEXIST"?new Error("MEV attempt lock exists; reconcile before any new signing"):g}try{await f.writeFile(`${JSON.stringify({version:1,pid:process.pid,token:w,ownerActionId:x,intentId:c,nonce:m,lockedAtMs:d()})}
|
|
11
|
+
`),await f.sync();let{rows:g}=await y.inspect();if(g.some(b=>b.ownerActionId===x||b.intentId===c))throw new Error("MEV owner action or intent was already attempted");return y.append({stage:"signing-reserved",ownerActionId:x,intentId:c,nonce:m})}catch(g){throw await S().catch(()=>{}),g}}async function _({terminal:x=!1,...c}){if(!f)throw new Error("MEV attempt lock is not held");let m=await y.append(c);return x&&await S(),m}async function N({terminal:x=!1,expectedLockToken:c,beforeRecord:m,...g}){if(f)throw new Error("MEV live attempt cannot be recovered concurrently");if(typeof c!="string"||!/^[0-9a-f-]{36}$/i.test(c))throw new Error("MEV recovery requires the exact inspected lock token");if(m!==void 0&&typeof m!="function")throw new Error("MEV recovery beforeRecord must be a function");let b=await v();if(b.lock.token!==c)throw new Error("MEV recovery lock token mismatch");if(s(b.lock.pid))throw new Error("MEV live attempt holder is still running; recovery refused");let I=`${r}.recovery`,k,u;try{k=await de(I,D.O_WRONLY|D.O_CREAT|D.O_EXCL,384),u=await k.stat(),await k.writeFile(`${JSON.stringify({version:1,pid:process.pid,token:Ue()})}
|
|
12
|
+
`),await k.sync();let i=await v();if(i.lock.token!==c||i.info.dev!==b.info.dev||i.info.ino!==b.info.ino)throw new Error("MEV signer lock changed during recovery");m&&await m();let p=await y.append(g);if(x){let l=await v();if(l.lock.token!==c||l.info.dev!==b.info.dev||l.info.ino!==b.info.ino)throw new Error("MEV signer lock changed before terminal recovery");await Ge(r)}return p}finally{if(k){await k.close().catch(()=>{});let i=await Je(I).catch(p=>{if(p?.code==="ENOENT")return null;throw p});i&&u&&i.dev===u.dev&&i.ino===u.ino&&await Ge(I).catch(p=>{if(p?.code!=="ENOENT")throw p})}}}async function B(){let{rows:x}=await y.inspect(),c=!1,m=null;try{({lock:m}=await v()),c=!0}catch(I){if(I?.code!=="ENOENT")throw I}let g=new Map;for(let I of x)I.ownerActionId&&g.set(I.ownerActionId,{...g.get(I.ownerActionId)||{},...I});let b=[...g.values()].filter(I=>!["confirmed","failed-before-broadcast","failed-receipt","reconciled-pre-broadcast","reconciled-confirmed","reconciled-reverted","reconciled-terminal-lock"].includes(I.stage));return Object.freeze({locked:c,lock:m?Object.freeze(m):null,records:x.length,last:x.at(-1)??null,unresolved:Object.freeze(b.map(I=>Object.freeze({...I})))})}async function $(){return f?(await f.close(),f=null,w=null,!0):!1}return Object.freeze({begin:E,record:_,recover:N,inspect:B,closeForShutdown:$})}function Qe(e,t){let r=String(e[t]||"").trim();if(!r)throw new Error(`${t} is required`);return r}function re(e,t,r){let n=String(e[t]??r??"");if(!/^(0|[1-9][0-9]*)$/.test(n))throw new Error(`${t} must be an unsigned decimal integer`);return n}function Me(e,t,r){let n=Number(e[t]??r);if(!Number.isSafeInteger(n))throw new Error(`${t} must be a safe integer`);return n}async function St({env:e=process.env,now:t=Date.now}={}){let r=Sr(),n=e.ORACLE_MEV_OPERATOR_DIR||T(r,".local/state/oracle/mev-operator"),o=e.ORACLE_MEV_CONTROL_DIR||T(r,".local/state/oracle/mev-control"),a=e.ORACLE_MEV_CONTROL_ANCHOR_DIR||T(r,".local/state/oracle/mev-control-anchor"),h=e.ORACLE_MEV_OPERATOR_ANCHOR_DIR||T(r,".local/state/oracle/mev-operator-anchor"),d=Qe(e,"BASE_RPC_URL"),s=Qe(e,"ORACLE_MEV_EXECUTOR_ADDRESS"),y=new Cr(d,8453,{staticNetwork:!0}),f=await Nt({keyFile:e.ORACLE_MEV_KEY_FILE||T(n,"signer.keystore.json"),passwordFile:e.ORACLE_MEV_PASSWORD_FILE||T(n,"signer.password"),provider:y}),w=await Ye(e.ORACLE_MEV_ARTIFACT_KEY_FILE||T(n,"artifact.key"),"MEV artifact key"),v=e.ORACLE_MEV_ANCHOR_KEY_FILE||T(a,"anchor.key"),S=await Ye(v,"MEV monotonic anchor key"),E=lt({keyPath:e.ORACLE_MEV_CONTROL_KEY_FILE||T(o,"control.key"),statePath:e.ORACLE_MEV_CONTROL_STATE_FILE||T(o,"state.json"),auditPath:e.ORACLE_MEV_CONTROL_AUDIT_FILE||T(o,"audit.jsonl"),anchorPath:e.ORACLE_MEV_REVOCATION_ANCHOR_FILE||T(a,"revocation.json"),anchorKeyPath:v,fencePath:e.ORACLE_MEV_FENCE_FILE||T(r,".local/state/oracle/mev-fence/control.lock"),actor:"oracle-mev-operator-read",now:t}),_={chainId:8453,executorRuntimeCodeHash:Qe(e,"ORACLE_MEV_EXECUTOR_CODE_HASH"),maxLoanWei:re(e,"ORACLE_MEV_MAX_LOAN_WEI","250000000000000000"),minContractProfitWei:re(e,"ORACLE_MEV_MIN_CONTRACT_PROFIT_WEI","10000000000000"),minNetProfitWei:re(e,"ORACLE_MEV_MIN_NET_PROFIT_WEI","10000000000000"),maxBlockDrift:Me(e,"ORACLE_MEV_MAX_BLOCK_DRIFT",2),artifactTtlMs:Me(e,"ORACLE_MEV_ARTIFACT_TTL_MS",2e4),maxGasUnits:re(e,"ORACLE_MEV_MAX_GAS_UNITS","500000"),maxL1FeeWei:re(e,"ORACLE_MEV_MAX_L1_FEE_WEI","100000000000000"),maxTotalCostWei:re(e,"ORACLE_MEV_MAX_TOTAL_COST_WEI","1000000000000000"),gasLimitBps:Me(e,"ORACLE_MEV_GAS_LIMIT_BPS",12e3),confirmations:Me(e,"ORACLE_MEV_CONFIRMATIONS",3)};return At({executorAddress:s,signer:f,provider:y,readRevocation:E.readSnapshot,withRevocationFence:E.withFence,artifactSecret:w,policy:_,enabled:e.ORACLE_MEV_EXECUTE_ENABLED==="1",now:t,estimateL1Fee:Mt(y),attemptStore:Tt({path:e.ORACLE_MEV_ATTEMPT_FILE||T(n,"attempts.jsonl"),headPath:e.ORACLE_MEV_ATTEMPT_HEAD_FILE||T(n,"attempts.head.json"),lockPath:e.ORACLE_MEV_ATTEMPT_LOCK_FILE||T(n,"attempt.lock"),integritySecret:w,anchorPath:e.ORACLE_MEV_ATTEMPT_ANCHOR_FILE||T(h,"attempts.json"),anchorKey:S,now:t}),receiptStore:Ze({path:e.ORACLE_MEV_RECEIPT_FILE||T(n,"receipts.jsonl"),headPath:e.ORACLE_MEV_RECEIPT_HEAD_FILE||T(n,"receipts.head.json"),integritySecret:w,anchorPath:e.ORACLE_MEV_RECEIPT_ANCHOR_FILE||T(h,"receipts.json"),anchorKey:S,now:t})})}function Lr(e){let t=e[0],r={};for(let n=1;n<e.length;n+=1){let o=e[n];if(o==="--execute")r.execute=!0;else if(o.startsWith("--"))r[o.slice(2)]=e[++n];else throw new Error(`unexpected argument: ${o}`)}return{command:t,options:r}}async function Te(e,t){if(!e)throw new Error(`${t} file required`);return JSON.parse(await Rr(e,"utf8"))}async function Vr(){let{command:e,options:t}=Lr(process.argv.slice(2));if(!["status","reconcile","prepare","simulate","execute"].includes(e))throw new Error("usage: oracle-mev-operator status|reconcile|prepare|simulate|execute");let r=await St(),n;if(e==="status")n=await r.status();else if(e==="reconcile")n=await r.reconcile();else if(e==="prepare")n=await r.prepare(await Te(t.candidate,"candidate"));else if(e==="simulate")n=await r.simulate(await Te(t.artifact,"artifact"));else{if(t.execute!==!0)throw new Error("execute command requires literal --execute");n=await r.execute({artifact:await Te(t.artifact,"artifact"),simulation:await Te(t.simulation,"simulation"),execute:!0,ownerActionId:t["owner-action-id"]})}process.stdout.write(`${JSON.stringify(n)}
|
|
13
|
+
`)}Vr().catch(e=>{process.stderr.write(`oracle-mev-operator: ${e.code?`${e.code}: `:""}${e.message}
|
|
14
|
+
`),process.exitCode=1});
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import{readFile as je}from"node:fs/promises";import{homedir as Ke}from"node:os";import{join as u}from"node:path";import{createHash as ie,createHmac as Ee,createPrivateKey as We,createPublicKey as ge,randomUUID as Ae,sign as Xe,timingSafeEqual as be,verify as xe}from"node:crypto";import{lstat as N,mkdir as $,open as A,readFile as w,rename as Oe,unlink as Se}from"node:fs/promises";import{basename as _e,dirname as L,join as Re}from"node:path";import{createHmac as le,timingSafeEqual as fe,randomUUID as pe}from"node:crypto";import{lstat as ye,mkdir as we,open as V,readFile as U,rename as he}from"node:fs/promises";import{dirname as me}from"node:path";function R(e){return Array.isArray(e)?`[${e.map(R).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(r=>`${JSON.stringify(r)}:${R(e[r])}`).join(",")}}`:JSON.stringify(e)}function q(e){let r=Buffer.isBuffer(e)?e:Buffer.from(String(e||""));if(r.length<32||r.length>128)throw new Error("monotonic anchor key length is invalid");return r}function Y(e){return/^(?:0x)?[0-9a-f]{64}$/i.test(String(e))}function I(e){let r=String(e).toLowerCase();return r.startsWith("0x")?r:`0x${r}`}function W(e,r){return`0x${le("sha256",q(e)).update("oracle-monotonic-anchor-v1\0").update(R(r)).digest("hex")}`}async function X(e,r,t){let o=await ye(e);if(o.isSymbolicLink()||!o.isFile()||(o.mode&63)!==0||o.size>t||typeof process.getuid=="function"&&o.uid!==process.getuid())throw new Error(`${r} permissions, type, owner, or size are unsafe`);return o}async function ve(e,r){let t=me(e);await we(t,{recursive:!0,mode:448});let o=`${e}.${process.pid}.${pe()}.tmp`,i=await V(o,"wx",384);try{await i.writeFile(r),await i.sync()}finally{await i.close()}await he(o,e);let n=await V(t,"r");try{await n.sync()}finally{await n.close()}}async function Z(e){return await X(e,"monotonic anchor key",128),q(await U(e))}async function G({path:e,key:r,domain:t}={}){if(typeof e!="string"||!e||typeof t!="string"||!/^[a-z0-9:_-]{1,80}$/i.test(t))throw new TypeError("monotonic anchor path and domain are required");await X(e,"monotonic anchor",4096);let o=JSON.parse(await U(e,"utf8")),i=o?.base;if(!i||i.version!==1||i.domain!==t||!Number.isSafeInteger(i.revision)||i.revision<1||!Y(i.digest)||!Number.isSafeInteger(i.updatedAt)||!/^0x[0-9a-f]{64}$/i.test(String(o.mac||"")))throw new Error("monotonic anchor is invalid");let n=Buffer.from(W(r,i).slice(2),"hex"),a=Buffer.from(o.mac.slice(2),"hex");if(a.length!==n.length||!fe(a,n))throw new Error("monotonic anchor authentication failed");return Object.freeze({...i,digest:I(i.digest)})}async function Q({path:e,key:r,domain:t,revision:o,digest:i}={}){let n=await G({path:e,key:r,domain:t});if(n.revision!==o||n.digest!==I(i))throw new Error("monotonic anchor rollback or divergence detected");return n}async function ee({path:e,key:r,domain:t,revision:o,digest:i,now:n=Date.now,allowInitializeAtRevision:a=!1}={}){if(!Number.isSafeInteger(o)||o<1||!Y(i)||typeof n!="function")throw new TypeError("monotonic anchor revision, digest, and clock are required");let d=null;try{d=await G({path:e,key:r,domain:t})}catch(p){if(p?.code!=="ENOENT")throw p}if(d){if(o!==d.revision+1)throw new Error("monotonic anchor revision must advance exactly once")}else if(o!==1&&a!==!0)throw new Error("monotonic anchor initialization revision is unsafe");let l={version:1,domain:t,revision:o,digest:I(i),updatedAt:n()},s={base:l,mac:W(r,l)};return await ve(e,`${JSON.stringify(s)}
|
|
3
|
+
`),Object.freeze(l)}function h(e,r,t){if(typeof e!="string"||!e.trim()||e.length>t||/[\u0000-\u001f\u007f]/.test(e))throw new TypeError(`${r} must be printable text up to ${t} characters`);return e.trim()}function Ie(e){let r=String(e??"");if(!/^[1-9][0-9]{0,19}$/.test(r))throw new TypeError("chainId must be a positive decimal string");return r}function E(e){return Array.isArray(e)?`[${e.map(E).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(r=>`${JSON.stringify(r)}:${E(e[r])}`).join(",")}}`:JSON.stringify(e)}function b(e,r){return Ee("sha256",e).update(r).digest("hex")}function ne(e,r){return!/^[0-9a-f]{64}$/i.test(String(e))||!/^[0-9a-f]{64}$/i.test(String(r))?!1:be(Buffer.from(e,"hex"),Buffer.from(r,"hex"))}async function x(e,r,t){let o=await N(e);if(o.isSymbolicLink()||!o.isFile()||(o.mode&63)!==0||o.size>t||typeof process.getuid=="function"&&o.uid!==process.getuid())throw new Error(`${r} permissions, type, or size are unsafe`);return o}async function ke(e,r){await x(e,r,128);let t=await w(e);if(t.length<32||t.length>128)throw new Error(`${r} length is invalid`);return t}async function re(e,r){await x(e,r,8192);let t=ge(await w(e));if(t.asymmetricKeyType!=="ed25519")throw new Error(`${r} must be an Ed25519 public key`);return t}function te(e){return ie("sha256").update(e.export({type:"spki",format:"der"})).digest("hex")}function g(e){let r={};for(let o of Object.keys(e.chains??{}).sort()){let i=e.chains[o];r[o]={revoked:i.revoked,armed:i.armed,revision:i.revision}}let t={version:1,revision:e.revision,globalRevoked:e.globalRevoked,chains:r,updatedAt:e.updatedAt,actor:e.actor,reason:e.reason};return e.authorizationId!=null&&(t.authorizationId=String(e.authorizationId).toLowerCase()),e.authorizationExpiresAt!=null&&(t.authorizationExpiresAt=e.authorizationExpiresAt),t}function Ne(e){return!e||typeof e!="object"||e.version!==1||!Number.isSafeInteger(e.revision)||e.revision<1||typeof e.globalRevoked!="boolean"||!e.chains||typeof e.chains!="object"||!Number.isSafeInteger(e.updatedAt)||e.authorizationId!=null&&!/^0x[0-9a-fA-F]{64}$/.test(String(e.authorizationId))||e.authorizationId==null&&e.authorizationExpiresAt!=null||e.authorizationId!=null&&(!Number.isSafeInteger(e.authorizationExpiresAt)||e.authorizationExpiresAt<=e.updatedAt)||typeof e.actor!="string"||typeof e.reason!="string"?!1:Object.entries(e.chains).every(([r,t])=>{let o=t?.revoked===!0&&t?.armed===!1,i=t?.revoked===!1&&t?.armed===!0;return/^[1-9][0-9]{0,19}$/.test(r)&&(o||!e.globalRevoked&&i)&&Number.isSafeInteger(t.revision)&&t.revision>=1&&t.revision<=e.revision})}function k(e,r){let t=g(e);return{state:t,mac:b(r,JSON.stringify(t))}}async function $e(e,r){await x(e,"revocation state",1048576);let t=JSON.parse(await w(e,"utf8"));if(!t||typeof t.mac!="string"||!Ne(t.state))throw new Error("revocation state invalid");let o=b(r,JSON.stringify(g(t.state)));if(!ne(t.mac,o))throw new Error("revocation state authentication failed");return g(t.state)}async function Le(e,r){await x(e,"revocation audit",16*1024*1024);let t=(await w(e,"utf8")).split(`
|
|
4
|
+
`).filter(Boolean),o=[],i=null,n=0;for(let a=0;a<t.length;a+=1){let d=JSON.parse(t[a]),{recordMac:l,...s}=d||{},p=b(r,JSON.stringify(s));if(!ne(l,p)||s.version!==1||s.auditSeq!==a+1||s.prevRecordMac!==i||!Number.isSafeInteger(s.revision)||(a===0?s.revision<1:s.revision!==n+1)||typeof s.stateMac!="string")throw new Error("revocation audit authentication failed");o.push(d),i=l,n=s.revision}return o}async function ze(e,r,t){let o=await $e(e,t),i=await Le(r,t),n=i.at(-1);if(!n||n.revision!==o.revision||n.stateMac!==k(o,t).mac)throw new Error("revocation state and audit revision mismatch");return{state:o,records:i}}async function Ce(e){let r=await A(e,"r");try{await r.sync()}finally{await r.close()}}async function Pe(e,r){let t=L(e);await $(t,{recursive:!0,mode:448});let o=Re(t,`.${_e(e)}.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`),i=await A(o,"wx",384);try{await i.writeFile(r),await i.sync()}finally{await i.close()}await Oe(o,e),await Ce(t)}async function Te(e){await $(L(e),{recursive:!0,mode:448});for(let r=0;r<100;r+=1)try{let t=await A(e,"wx",384),o=Ae();return await t.writeFile(`${JSON.stringify({version:1,pid:process.pid,token:o})}
|
|
5
|
+
`),await t.sync(),{handle:t,token:o}}catch(t){if(t?.code!=="EEXIST")throw t;let o;try{o=await N(e)}catch(n){if(n?.code==="ENOENT")continue;throw n}if(o.isSymbolicLink()||!o.isFile()||(o.mode&63)!==0||o.size>256||typeof process.getuid=="function"&&o.uid!==process.getuid())throw new Error("revocation restoration lock permissions, type, or size are unsafe");let i;try{i=JSON.parse(await w(e,"utf8"))}catch(n){if(n?.code==="ENOENT")continue;throw new Error("revocation restoration lock metadata invalid")}if(i?.version!==1||!Number.isSafeInteger(i.pid)||i.pid<1||typeof i.token!="string"||!/^[0-9a-f-]{36}$/i.test(i.token))throw new Error("revocation restoration lock metadata invalid");try{process.kill(i.pid,0)}catch(n){if(n?.code==="ESRCH")throw new Error("stale revocation restoration lock requires manual recovery");if(n?.code!=="EPERM")throw n}await new Promise(n=>setTimeout(n,10))}throw new Error("revocation restoration lock unavailable")}async function Me(e,r){try{let[t,o]=await Promise.all([r.handle.stat(),N(e)]),i=JSON.parse(await w(e,"utf8"));if(!o.isFile()||o.isSymbolicLink()||t.dev!==o.dev||t.ino!==o.ino||i?.version!==1||i.pid!==process.pid||i.token!==r.token)throw new Error("revocation restoration lock ownership changed; refusing unsafe release");await Se(e)}finally{await r.handle.close().catch(()=>{})}}function Fe(e){if(!e||e.version!==1)throw new Error("restoration proposal version invalid");let r=String(e.actionId||"").toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(r))throw new Error("restoration actionId must be bytes32");let t=Ie(e.chainId);if(!Number.isSafeInteger(e.expectedRevision)||e.expectedRevision<1)throw new Error("restoration expectedRevision invalid");if(!Number.isSafeInteger(e.issuedAt)||!Number.isSafeInteger(e.expiresAt)||e.expiresAt<=e.issuedAt||e.expiresAt-e.issuedAt>6e4)throw new Error("restoration validity window invalid");return{version:1,actionId:r,chainId:t,expectedRevision:e.expectedRevision,issuedAt:e.issuedAt,expiresAt:e.expiresAt,reason:h(e.reason,"reason",240)}}function He(e){return`0x${ie("sha256").update(E(e)).digest("hex")}`}function oe(e,r,t,o,i){if(!e||e.version!==1||e.role!==r||e.proposalHash!==He(t)||e.issuedAt!==t.issuedAt||e.expiresAt!==t.expiresAt||i>=e.expiresAt)throw new Error(`${r} restoration approval invalid or expired`);let{signature:n,...a}=e;if(typeof n!="string"||!/^[A-Za-z0-9_-]{80,100}$/.test(n)||!xe(null,Buffer.from(E(a)),o,Buffer.from(n,"base64url")))throw new Error(`${r} restoration approval authentication failed`)}function ae({controlKeyPath:e,controllerPublicKeyPath:r,recoveryPublicKeyPath:t,statePath:o,auditPath:i,anchorPath:n,anchorKeyPath:a,fencePath:d,actor:l,now:s=Date.now}={}){h(n,"anchorPath",1e3),h(a,"anchorKeyPath",1e3),h(d,"fencePath",1e3);let p=h(l,"actor",80),O=d,C=Promise.resolve();function se({proposal:ce,controllerApproval:P,recoveryApproval:T}={}){let c=Fe(ce),M=C.then(async()=>{let y=s();if(y<c.issuedAt-5e3||y>=c.expiresAt)throw new Error("restoration proposal expired or not active");let[m,F,H,j]=await Promise.all([ke(e,"revocation control key"),re(r,"controller restoration public key"),re(t,"recovery restoration public key"),Z(a)]);if(te(F)===te(H))throw new Error("restoration authorities must use distinct keys");oe(P,"controller",c,F,y),oe(T,"recovery",c,H,y),await $(L(O),{recursive:!0,mode:448});let ue=await Te(O);try{let{state:f,records:K}=await ze(o,i,m);if(await Q({path:n,key:j,domain:"oracle-revocation",revision:f.revision,digest:k(f,m).mac}),f.revision!==c.expectedRevision)throw new Error(`revision conflict: expected ${c.expectedRevision}, found ${f.revision}`);if(f.globalRevoked!==!0)throw new Error("restoration replay or state is already globally open");let v=f.revision+1,J=structuredClone(f.chains);J[c.chainId]={armed:!0,revoked:!1,revision:v};let D=g({...f,revision:v,globalRevoked:!1,authorizationId:c.actionId,authorizationExpiresAt:c.expiresAt,chains:J,updatedAt:y,actor:p,reason:c.reason}),S=k(D,m);await Pe(o,`${JSON.stringify(S)}
|
|
6
|
+
`);let B={version:1,auditSeq:K.length+1,prevRecordMac:K.at(-1)?.recordMac??null,action:"RESTORE_CHAIN_DUAL_APPROVAL",revision:v,updatedAt:y,actor:p,reason:c.reason,stateMac:S.mac,actionId:c.actionId,chainId:c.chainId,controllerProposalHash:P.proposalHash,recoveryProposalHash:T.proposalHash},de={...B,recordMac:b(m,JSON.stringify(B))},_=await A(i,"a",384);try{await _.writeFile(`${JSON.stringify(de)}
|
|
7
|
+
`),await _.sync()}finally{await _.close()}return await ee({path:n,key:j,domain:"oracle-revocation",revision:v,digest:S.mac,now:s}),Object.freeze(structuredClone(D))}finally{await Me(O,ue)}});return C=M.catch(()=>{}),M}return Object.freeze({restore:se})}function Je(e){let r=process.argv.indexOf(`--${e}`);return r>=0?process.argv[r+1]:void 0}async function z(e){let r=Je(e);if(!r)throw new Error(`Usage: oracle-mev-restore-apply --proposal PATH --controller-approval PATH --recovery-approval PATH (${e} missing)`);return JSON.parse(await je(r,"utf8"))}async function De(){if(process.argv.includes("--help")||process.argv.includes("-h")){process.stdout.write(`Usage: oracle-mev-restore-apply --proposal PATH --controller-approval PATH --recovery-approval PATH
|
|
8
|
+
`);return}let e=Ke(),r=process.env.ORACLE_MEV_CONTROL_DIR||u(e,".local/state/oracle/mev-control"),t=process.env.ORACLE_MEV_RESTORE_PUBLIC_DIR||u(e,".local/state/oracle/mev-restore-public"),o=process.env.ORACLE_MEV_CONTROL_ANCHOR_DIR||u(e,".local/state/oracle/mev-control-anchor"),n=await ae({controlKeyPath:process.env.ORACLE_MEV_CONTROL_KEY_FILE||u(r,"control.key"),controllerPublicKeyPath:process.env.ORACLE_MEV_RESTORE_CONTROLLER_PUBLIC_KEY_FILE||u(t,"controller.pub"),recoveryPublicKeyPath:process.env.ORACLE_MEV_RESTORE_RECOVERY_PUBLIC_KEY_FILE||u(t,"recovery.pub"),statePath:process.env.ORACLE_MEV_CONTROL_STATE_FILE||u(r,"state.json"),auditPath:process.env.ORACLE_MEV_CONTROL_AUDIT_FILE||u(r,"audit.jsonl"),anchorPath:process.env.ORACLE_MEV_REVOCATION_ANCHOR_FILE||u(o,"revocation.json"),anchorKeyPath:process.env.ORACLE_MEV_ANCHOR_KEY_FILE||u(o,"anchor.key"),fencePath:process.env.ORACLE_MEV_FENCE_FILE||u(e,".local/state/oracle/mev-fence/control.lock"),actor:"oracle-mev-isolated-restore"}).restore({proposal:await z("proposal"),controllerApproval:await z("controller-approval"),recoveryApproval:await z("recovery-approval")});process.stdout.write(`${JSON.stringify({revision:n.revision,globalRevoked:n.globalRevoked,authorizationId:n.authorizationId,authorizationExpiresAt:n.authorizationExpiresAt,chains:n.chains,updatedAt:n.updatedAt})}
|
|
9
|
+
`)}De().catch(e=>{process.stderr.write(`oracle-mev-restore-apply: ${e.message}
|
|
10
|
+
`),process.exitCode=1});
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import{readFile as x}from"node:fs/promises";import{createHash as f,createHmac as O,createPrivateKey as d,createPublicKey as N,randomUUID as R,sign as l,timingSafeEqual as z,verify as _}from"node:crypto";import{lstat as w,mkdir as M,open as P,readFile as y,rename as T,unlink as H}from"node:fs/promises";function p(e,r,t){if(typeof e!="string"||!e.trim()||e.length>t||/[\u0000-\u001f\u007f]/.test(e))throw new TypeError(`${r} must be printable text up to ${t} characters`);return e.trim()}function m(e){let r=String(e??"");if(!/^[1-9][0-9]{0,19}$/.test(r))throw new TypeError("chainId must be a positive decimal string");return r}function i(e){return Array.isArray(e)?`[${e.map(i).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(r=>`${JSON.stringify(r)}:${i(e[r])}`).join(",")}}`:JSON.stringify(e)}async function h(e,r,t){let o=await w(e);if(o.isSymbolicLink()||!o.isFile()||(o.mode&63)!==0||o.size>t||typeof process.getuid=="function"&&o.uid!==process.getuid())throw new Error(`${r} permissions, type, or size are unsafe`);return o}async function v(e,r){await h(e,r,8192);let t=d(await y(e));if(t.asymmetricKeyType!=="ed25519")throw new Error(`${r} must be an Ed25519 private key`);return t}function g(e){if(!e||e.version!==1)throw new Error("restoration proposal version invalid");let r=String(e.actionId||"").toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(r))throw new Error("restoration actionId must be bytes32");let t=m(e.chainId);if(!Number.isSafeInteger(e.expectedRevision)||e.expectedRevision<1)throw new Error("restoration expectedRevision invalid");if(!Number.isSafeInteger(e.issuedAt)||!Number.isSafeInteger(e.expiresAt)||e.expiresAt<=e.issuedAt||e.expiresAt-e.issuedAt>6e4)throw new Error("restoration validity window invalid");return{version:1,actionId:r,chainId:t,expectedRevision:e.expectedRevision,issuedAt:e.issuedAt,expiresAt:e.expiresAt,reason:p(e.reason,"reason",240)}}function E(e){return`0x${f("sha256").update(i(e)).digest("hex")}`}async function c({proposal:e,role:r,keyPath:t}={}){if(!new Set(["controller","recovery"]).has(r))throw new Error("restoration role invalid");let o=g(e),n=await v(t,`${r} restoration private key`),s={version:1,role:r,proposalHash:E(o),issuedAt:o.issuedAt,expiresAt:o.expiresAt},u=l(null,Buffer.from(i(s)),n).toString("base64url");return Object.freeze({...s,signature:u})}function a(e){let r=process.argv.indexOf(`--${e}`);return r>=0?process.argv[r+1]:void 0}async function b(){if(process.argv.includes("--help")||process.argv.includes("-h")){process.stdout.write(`Usage: oracle-mev-restore-approve --role controller|recovery --proposal PATH [--key PATH]
|
|
3
|
+
`);return}let e=a("role"),r=a("proposal");if(!e||!r)throw new Error("Usage: oracle-mev-restore-approve --role controller|recovery --proposal PATH [--key PATH]");let t=a("key")||(e==="controller"?process.env.ORACLE_MEV_RESTORE_CONTROLLER_KEY_FILE:process.env.ORACLE_MEV_RESTORE_RECOVERY_KEY_FILE);if(!t)throw new Error(`isolated ${e} key path required`);let o=JSON.parse(await x(r,"utf8")),n=await c({proposal:o,role:e,keyPath:t});process.stdout.write(`${JSON.stringify(n)}
|
|
4
|
+
`)}b().catch(e=>{process.stderr.write(`oracle-mev-restore-approve: ${e.message}
|
|
5
|
+
`),process.exitCode=1});
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import{createHash as l,generateKeyPairSync as u}from"node:crypto";import{mkdir as y,open as d}from"node:fs/promises";import{dirname as m}from"node:path";function i(e){let r=process.argv.indexOf(`--${e}`);return r>=0?process.argv[r+1]:void 0}async function a(e,r){await y(m(e),{recursive:!0,mode:448});let t=await d(e,"wx",384);try{await t.writeFile(r),await t.sync()}finally{await t.close()}}async function f(){if(process.argv.includes("--help")||process.argv.includes("-h")){process.stdout.write(`Usage: oracle-mev-restore-keygen --role controller|recovery --private PATH --public PATH
|
|
3
|
+
`);return}let e=i("role"),r=i("private"),t=i("public");if(!new Set(["controller","recovery"]).has(e)||!r||!t)throw new Error("Usage: oracle-mev-restore-keygen --role controller|recovery --private PATH --public PATH");if(r===t)throw new Error("private and public paths must differ");let o=u("ed25519"),s=o.privateKey.export({type:"pkcs8",format:"pem"}),n=o.publicKey.export({type:"spki",format:"pem"});await a(r,s);try{await a(t,n)}catch(p){throw new Error(`public key write failed after private key creation; preserve and secure ${r}: ${p.message}`)}let c=l("sha256").update(o.publicKey.export({type:"spki",format:"der"})).digest("hex");process.stdout.write(`${JSON.stringify({role:e,publicKeyPath:t,fingerprint:`sha256:${c}`})}
|
|
4
|
+
`)}f().catch(e=>{process.stderr.write(`oracle-mev-restore-keygen: ${e.message}
|
|
5
|
+
`),process.exitCode=1});
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
var hr=Object.defineProperty;var R=(e,t,r)=>()=>{if(r)throw r[0];try{return e&&(t=e(e=0)),t}catch(n){throw r=[n],n}};var Ze=(e,t)=>{for(var r in t)hr(e,r,{get:t[r],enumerable:!0})};import z from"node:net";import gr from"node:dns";function ie(e){let t=String(e).toLowerCase().split("%")[0];if((t.match(/::/g)||[]).length>1)return null;let r=l=>{if(!l)return[];let c=l.split(":"),s=c.at(-1);if(s?.includes(".")){let p=s.split(".").map(Number);if(p.length!==4||p.some(m=>!Number.isInteger(m)||m<0||m>255))return null;c.splice(c.length-1,1,(p[0]<<8|p[1]).toString(16),(p[2]<<8|p[3]).toString(16))}return c.some(p=>!/^[0-9a-f]{1,4}$/.test(p))?null:c.map(p=>Number.parseInt(p,16))},[n,o]=t.split("::"),i=r(n),a=r(o);if(!i||!a)return null;let u=t.includes("::"),d=8-i.length-a.length;if(!u&&d!==0||u&&d<1)return null;let f=[...i,...Array(Math.max(0,d)).fill(0),...a];return f.length!==8?null:Uint8Array.from(f.flatMap(l=>[l>>8,l&255]))}function Ie(e,t,r){let n=Math.floor(r/8),o=r%8;for(let a=0;a<n;a+=1)if(e[a]!==t[a])return!1;if(!o)return!0;let i=255<<8-o;return(e[n]&i)===(t[n]&i)}function _e(e){if(z.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(z.isIPv6(e)){let t=ie(e);if(!t)return!1;let r=ie("::ffff:0:0");return Ie(t,r,96)?_e([...t.slice(12)].join(".")):Ie(t,ie("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([o,i])=>Ie(t,ie(o),i)):!1}return!1}function br(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 r=t.hostname.toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,"");if(wr.has(r)||r.endsWith(".localhost")||r.endsWith(".internal"))return{ok:!1,error:`refused internal host ${r}`};let n=z.isIP(r);return n!==0&&!_e(r)?{ok:!1,error:`refused private address ${r}`}:{ok:!0,url:t,host:r,isLiteralIp:n!==0}}async function Ce(e,{lookupFn:t=gr.promises.lookup}={}){let r=br(e);if(!r.ok)return r;if(r.isLiteralIp)return{ok:!0,url:r.url,addresses:[{address:r.host,family:z.isIPv6(r.host)?6:4}]};let n;try{n=await t(r.host,{all:!0,verbatim:!0})}catch{return{ok:!1,error:`refused: ${r.host} did not resolve`}}return!Array.isArray(n)||n.length===0||n.some(o=>!_e(o.address))?{ok:!1,error:`refused: ${r.host} resolves to a non-public address`}:{ok:!0,url:r.url,addresses:n}}async function Oe({requireUndici:e=!1,importUndici:t=()=>import("undici")}={}){let r,n;try{let c=await t();r=c.Agent,n=c.fetch}catch(c){if(e)throw new Error(`egress-guard: untrustedUrl pinning requires the undici package, which failed to load: ${c?.message||c}`);return null}if(typeof r!="function"||typeof n!="function"){if(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 o=c=>String(c).toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,""),i=new Map,a=c=>(Array.isArray(c)?c:[c]).map(s=>typeof s=="string"?{address:s}:s).filter(s=>s&&s.address).map(s=>({address:s.address,family:s.family||(z.isIPv6(s.address)?6:4)})),u=(c,s,p)=>{i.set(o(c),a(typeof s=="string"?[{address:s,family:p}]:s))},d=c=>{let s=o(c);if(z.isIP(s))return[{address:s,family:z.isIPv6(s)?6:4}];let p=i.get(s);if(!p||!p.length)throw new Error(`refused: unpinned host ${c} during pinned fetch`);return p},f=new r({connect:{lookup(c,s,p){let m;try{m=d(c)}catch(A){return p(A)}return s?.all?p(null,m):p(null,m[0].address,m[0].family)}}}),l=Er((c,s={})=>n(c,{...s,dispatcher:f}),u);return{dispatcher:f,fetch:l,pin:u,resolve:d,async close(){try{await f.destroy()}catch{}}}}function Er(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[Ne]=Object.freeze({pin:t}),e}function ke(e){return typeof e=="function"&&typeof e[Ne]?.pin=="function"}function et(e,t,r){if(!ke(e))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");e[Ne].pin(t,r)}var wr,Ne,tt=R(()=>{wr=new Set(["localhost","metadata.google.internal","metadata.goog"]);Ne=Symbol.for("oracle.egressGuard.pinCapableFetch")});import{createHash as yr}from"node:crypto";function _r(e){let t=String(e||"").toLowerCase();return at.includes(t)||/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(t)}function Cr(e){let t={};for(let[r,n]of Object.entries(e||{}))_r(r)||(t[r]=n);return t}function Or(e,t){if(!e)throw new Error(`HTTP redirect from ${t} missing Location`);let r=new URL(String(e),String(t));if(r.protocol!=="http:"&&r.protocol!=="https:")throw new Error(`HTTP redirect from ${t} used unsupported protocol ${r.protocol}`);return r.toString()}function Nr(e,t){return new URL(String(e)).origin===new URL(String(t)).origin}function kr(e,t,r,n={}){let o={};for(let[l,c]of Object.entries(r||{}))o[l.toLowerCase()]=c;let i=Object.keys(o).filter(l=>/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(l)),u=[...new Set([...at,...i])].sort().map(l=>`${l}=${o[l]??""}`).join(`
|
|
3
|
+
`),d=yr("sha256").update(u).digest("hex").slice(0,32),f=`${n.untrustedUrl?"untrusted":"trusted"}:${n.maxResponseBytes??"unbounded"}`;return`${e} ${t} ${f} ${d}`}function Tr(e,t){let r=Number(t);return Number.isFinite(r)&&r>0?Math.min(r*1e3,nt):Math.min(250*2**e,nt)+Math.floor(Math.random()*100)}function J(e,t={}){let r=new Error(e);return r.retryable=!1,Object.assign(r,t),r}function Re(e,t,r){return J(`HTTP response from ${e} exceeded maxResponseBytes ${r} (${t})`,{oversize:!0})}function Q(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 it(e,t,{url:r,truncate:n=!1,onOversize:o}={}){if(t==null)return await e.text();let i=Number(e.headers?.get?.("content-length"));if(Number.isFinite(i)&&i>t&&(Q(e),!n))throw Re(r,`content-length ${i}`,t);let a=e.body?.getReader?.();if(!a){let c=await e.text(),s=Buffer.byteLength(c,"utf8");if(s>t){if(!n)throw Re(r,`body ${s} bytes`,t);return Buffer.from(c,"utf8").subarray(0,t).toString("utf8")}return c}let u=[],d=0,f=!1;try{for(;;){let{value:c,done:s}=await a.read();if(s)break;if(c&&(u.push(Buffer.from(c)),d+=Br(c),d>t)){f=!0;break}}}finally{if(f)try{await a.cancel()}catch{}try{a.releaseLock?.()}catch{}}if(f&&(typeof o=="function"&&o(),!n))throw Re(r,`streamed ${d} bytes`,t);let l=Buffer.concat(u);return(f?l.subarray(0,t):l).toString("utf8")}function st(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function $r(e,{fetchImpl:t,method:r,headers:n,body:o,timeoutMs:i,lookupFn:a,realFetch:u,untrustedUrl:d=!1,maxResponseBytes:f=null,importUndici:l,validateResponse:c}){let s=new AbortController,p=setTimeout(()=>s.abort(),i),m=null,A=t,O=a?{lookupFn:a}:{};if(d&&!u&&!ke(A))throw J(`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 y=async(h,{status:E=null}={})=>{let b=await Ce(h,O);if(!b.ok)throw J(E==null?`HTTP refused ${h}: ${b.error}`:`HTTP redirect to ${h} ${b.error}`,E==null?{}:{status:E});let g=new URL(h).hostname;if(u){if(m&&(await m.close(),m=null),!m)try{m=await Oe({requireUndici:!0,...l?{importUndici:l}:{}})}catch(w){throw J(E==null?`HTTP refused ${h}: ${w?.message||w}`:`HTTP redirect to ${h} refused: ${w?.message||w}`,E==null?{}:{status:E})}m.pin(g,b.addresses),A=m.fetch}else et(A,g,b.addresses);return b};try{let h=String(e),E={...n||{}};d&&await y(h);for(let b=0;b<=ot;b+=1){let g=await A(h,{method:r,headers:E,body:o,signal:s.signal,redirect:"manual"});if(Sr.has(g.status)){if(r!=="GET"&&r!=="HEAD"){let k=await it(g,f??Ir,{url:h,truncate:!0}),T=new Error(`HTTP ${g.status} ${r} ${h} redirected non-idempotent request`);throw T.status=g.status,T.body=st(k)??k.slice(0,300),T}if(b===ot)throw Q(g),new Error(`HTTP redirect loop for ${e}`);let x=g.headers?.get?.("location"),I;try{I=Or(x,h)}catch(k){throw Q(g),k}let _=!Nr(I,h);if(Q(g),_&&(E=Cr(E)),d)await y(I,{status:g.status});else if(_){let k=await Ce(I,O);if(!k.ok){let T=new Error(`HTTP redirect from ${h} ${k.error}`);throw T.status=g.status,T.retryable=!1,T}u&&k.addresses?.length&&(m||(m=await Oe(l?{importUndici:l}:{})),m&&(m.pin(new URL(I).hostname,k.addresses),A=m.fetch))}h=I;continue}if(typeof c=="function")try{await c(g,{url:h})}catch(x){throw Q(g),J(x?.message||String(x))}let w=await it(g,f,{url:h,onOversize:()=>s.abort()}),S=st(w);if(!g.ok){let x=new Error(`HTTP ${g.status} ${r} ${h}`);throw x.status=g.status,x.retryAfter=g.headers?.get?.("retry-after")??null,x.body=S??w.slice(0,300),x}return S??w}throw new Error(`HTTP redirect loop for ${e}`)}finally{clearTimeout(p),m&&await m.close()}}async function se(e,t={}){let r=t.fetchImpl||globalThis.fetch;if(typeof r!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let n=t.timeoutMs??12e3,o=(t.method||"GET").toUpperCase(),i={Accept:"application/json",...t.headers||{}},a=t.body;a!=null&&typeof a!="string"&&(i["Content-Type"]=i["Content-Type"]||"application/json",a=JSON.stringify(a));let u=Number.isInteger(t.retries)?Math.max(t.retries,0):xr,d=t.lookupFn,f=!t.fetchImpl,l=t.untrustedUrl===!0,c=t.importUndici,s=t.validateResponse,p=Number(t.maxResponseBytes),m=Number.isFinite(p)&&p>0?Math.floor(p):null,A=async()=>{let b;for(let g=0;g<=u;g++)try{return await $r(e,{fetchImpl:r,method:o,headers:i,body:a,timeoutMs:n,lookupFn:d,realFetch:f,untrustedUrl:l,maxResponseBytes:m,importUndici:c,validateResponse:s})}catch(w){b=w;let S=w?.status,x=w?.name==="AbortError",I=new Set([408,425,429]),_=w?.retryable===!1?!1:S!=null?I.has(S)||Ar.has(S)&&rt.has(o):!x&&rt.has(o);if(g===u||!_)throw w;await Rr(Tr(g,w?.retryAfter))}throw b};if(!(t.dedupe!==!1&&o==="GET"&&a==null))return A();let y=kr(o,e,i,{untrustedUrl:l,maxResponseBytes:m}),h=Te.get(y);if(h)return h;let E=A().finally(()=>Te.delete(y));return Te.set(y,E),E}var Ar,rt,xr,nt,at,Sr,ot,Ir,Te,Rr,Be=R(()=>{tt();Ar=new Set([408,425,429,500,502,503,504]),rt=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),xr=2,nt=4e3,at=["authorization","x-api-key","x-tensor-api-key","0x-api-key","api-key","cookie","proxy-authorization"],Sr=new Set([301,302,303,307,308]),ot=3,Ir=64*1024;Te=new Map;Rr=e=>new Promise(t=>setTimeout(t,e))});function Pe(e){return ct.get(Number(e))||null}function ut(e,t=process.env){let r=Pe(e);if(!r)return null;for(let n of r.rpcEnv){let o=(t[n]||"").trim();if(o)return o}return null}function lt(e){return ct.has(Number(e))}var $e,ct,ft=R(()=>{$e={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}},ct=new Map(Object.values($e).map(e=>[e.chainId,e]))});var pt={};Ze(pt,{PUBLIC_RPC_FALLBACKS:()=>De,erc20Allowance:()=>Hr,erc20BalanceOf:()=>qr,resolveRpcUrl:()=>Me,rpcBlockNumber:()=>Fe,rpcCall:()=>N,rpcChainId:()=>vr,rpcGasPrice:()=>Ur,rpcGetBalance:()=>Wr,rpcHealth:()=>dt,rpcHealthAll:()=>zr,transactionReceipt:()=>jr});import{Interface as Pr,getAddress as Lr}from"ethers";function U(e,t){try{return Lr(e).toLowerCase()}catch{throw new Error(`${t} must be a valid EVM address`)}}function Dr(e){let t=String(e||"").trim();if(!/^0x[0-9a-fA-F]{64}$/.test(t))throw new Error("txHash must be a 32-byte hex transaction hash");return t.toLowerCase()}function Le(e){return e==null?null:Number.parseInt(String(e),16)}function Me(e,{rpcUrl:t,env:r=process.env}={}){if(t)return t;let n=ut(e,r);return n||De[Number(e)]||null}function Fr(e){let t=String(e||""),r=t.toLowerCase();if(t!==t.trim()||!/^[a-zA-Z0-9_]+$/.test(t)||!Mr.test(r))throw new Error(`evm-rpc: ${t} refused \u2014 @oracle-agent/oracle is prepare-only (read RPC only; no broadcast/sign)`);return r}async function N(e,t,r=[],n={}){let o=String(t||"");Fr(o);let i=Me(e,n);if(!i)throw new Error(`No RPC URL for chainId ${e} (set env from chain registry rpcEnv or pass rpcUrl)`);let u=await se(i,{method:"POST",body:{jsonrpc:"2.0",id:1,method:t,params:r},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3});if(u?.error){let d=new Error(u.error.message||JSON.stringify(u.error));throw d.code=u.error.code,d}return u.result}async function dt(e,t={}){let r=await N(e,"eth_blockNumber",[],t),n=parseInt(r,16),o=await N(e,"eth_chainId",[],t),i=parseInt(o,16);return{ok:Number.isFinite(n)&&i===Number(e),chainId:Number(e),reportedChainId:i,blockNumber:n,name:Pe(e)?.name||null}}async function Fe(e,t={}){let r=await N(e,"eth_blockNumber",[],t);return parseInt(r,16)}async function vr(e,t={}){let r=await N(e,"eth_chainId",[],t);return parseInt(r,16)}async function Ur(e,t={}){let r=await N(e,"eth_gasPrice",[],t);if(r==null)return null;try{return BigInt(r)}catch{return null}}async function Wr(e,t,r={}){if(!t)throw new Error("rpcGetBalance requires address");let n=await N(e,"eth_getBalance",[t,"latest"],r);return{chainId:Number(e),address:t,balanceWei:BigInt(n).toString(),balanceHex:n}}async function Hr(e={},t={}){let r=Number(e.chainId??t.chainId??1),n=U(e.token||e.tokenAddress,"token"),o=U(e.owner,"owner"),i=U(e.spender,"spender"),a=ae.encodeFunctionData("allowance",[o,i]),u=await N(r,"eth_call",[{to:n,data:a},e.blockTag||"latest"],t),d=ae.decodeFunctionResult("allowance",u),f=BigInt(d[0]);return{chainId:r,token:n,owner:o,spender:i,allowance:f.toString(),allowanceHex:`0x${f.toString(16)}`,blockTag:e.blockTag||"latest"}}async function qr(e={},t={}){let r=Number(e.chainId??t.chainId??1),n=U(e.token||e.tokenAddress,"token"),o=U(e.account||e.owner||e.address,"account"),i=ae.encodeFunctionData("balanceOf",[o]),a=await N(r,"eth_call",[{to:n,data:i},e.blockTag||"latest"],t),u=ae.decodeFunctionResult("balanceOf",a),d=BigInt(u[0]);return{chainId:r,token:n,account:o,balance:d.toString(),balanceHex:`0x${d.toString(16)}`,blockTag:e.blockTag||"latest"}}async function jr(e={},t={}){let r=Number(e.chainId??t.chainId??1),n=Dr(e.txHash||e.hash||e.transactionHash),o=await N(r,"eth_getTransactionReceipt",[n],t);if(!o)return{ok:!1,chainId:r,txHash:n,status:"pending",receipt:null,reason:"receipt pending"};let i=Le(o.status),a=i===1,u=i===1?"success":i===0?"reverted":"unknown",d=a?null:u==="reverted"?"transaction reverted":"unknown receipt status",f=e.expectedTo?U(e.expectedTo,"expectedTo"):null,l=o.to?U(o.to,"receipt.to"):null;return f&&l!==f&&(a=!1,d=`to mismatch: expected ${f}, got ${l||"null"}`),{ok:a,chainId:r,txHash:n,status:u,reason:d,statusCode:i,to:l,from:o.from?U(o.from,"receipt.from"):null,blockNumber:Le(o.blockNumber),transactionIndex:Le(o.transactionIndex),logs:Array.isArray(o.logs)?o.logs:[],receipt:o}}async function zr(e={}){let t=e.chainIds||Object.values($e).map(n=>n.chainId),r={};return await Promise.all(t.map(async n=>{if(!lt(n)&&!De[n]&&!Me(n,e)){r[n]={ok:!1,error:"no rpc configured",chainId:n};return}try{r[n]=await dt(n,e)}catch(o){r[n]={ok:!1,chainId:n,error:String(o.message||o)}}})),r}var ae,De,Mr,Z=R(()=>{Be();ft();ae=new Pr(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);De={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"};Mr=/^(?:eth_(?:call|blocknumber|chainid|get[a-z0-9]+|feehistory|gasprice|maxpriorityfeepergas|syncing|protocolversion|estimategas|createaccesslist)|net_(?:version|listening|peercount)|web3_(?:clientversion|sha3))$/});import{readFileSync as gn}from"node:fs";import{homedir as wn}from"node:os";import{join as fe}from"node:path";function bn(){if(process.env.ORACLE_TEST_ISOLATE_SECRETS==="1"){let r=(process.env.ORACLE_EXEC_ENV_FILE||"").trim();return r?[r]:[]}let e=(process.env.ORACLE_EXEC_ENV_FILE||process.env.MAD_EXEC_ENV_FILE||"").trim(),t=wn();if(process.env.ORACLE_PUBLIC_DESKTOP==="1"){let r=(process.env.ORACLE_CONFIG_DIR||fe(t,".config","oracle")).trim();return[e,fe(r,"exec.env")].filter(Boolean)}return[e,fe(t,".config","oracle","exec.env"),fe(t,".config","mad-desk","exec.env")].filter(Boolean)}function Tt(e,t,r){let n=e??process.env[t]??process.env[r];if(!String(n||"").trim())for(let o of bn())try{let i=gn(o,"utf8"),a=i.match(new RegExp(`^${t}=(.*)$`,"m"))||i.match(new RegExp(`^${r}=(.*)$`,"m"));if(a&&(n=a[1].trim(),n))break}catch{}if(!String(n||"").trim())throw new Error(`${t} required for attestation. Set it in the environment, or place ${t}=<value> in ~/.config/oracle/exec.env`);return n}var Rt=R(()=>{});var Bt=R(()=>{});import{createHash as jo,createHmac as En,timingSafeEqual as zo}from"node:crypto";function ze(e){return Array.isArray(e)?`[${e.map(ze).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${ze(e[t])}`).join(",")}}`:JSON.stringify(e??null)}function yn(e,{required:t=!1}={}){try{return Tt(e,"ORACLE_ROUTE_ATTESTATION_SECRET","MAD_ROUTE_ATTESTATION_SECRET")}catch(r){if(t)throw r;return null}}function An(e){let{signature:t,...r}=e;return r}function xn(e,{secret:t}={}){let r=yn(t);return r?{...e,signature:En("sha256",r).update(ze(An(e))).digest("hex")}:e}function je(e,t=0){let r=Number(e);return Number.isFinite(r)?r:t}function Sn(e){let t=e==null?$t:Number(e);if(!Number.isInteger(t)||t<0)throw new Error("auto-slippage cap must be a non-negative integer bps value");return Math.min(t,$t)}function In({liquidityUsd:e,priceChange5m:t=0,quoteAgeMs:r=0,crossChain:n=!1,requestedCapBps:o}={}){let i=je(e,0),a=i>0?i>=25e4?5:i>=1e5?10:i>=5e4?20:i>=1e4?40:70:n?30:10,u=Math.min(60,Math.abs(je(t,0))*2),d=Math.min(40,Math.floor(Math.max(0,je(r,0))/5e3)*5),f=Math.max(25,Math.ceil(20+a+u+d)),l=Sn(o);return{mode:"auto",requiredBps:f,selectedBps:Math.min(f,l),capBps:l,executable:f<=l}}function _n({chainId:e,venue:t,quoteAmountOut:r,liquidityUsd:n,priceChange5m:o=0,quoteAgeMs:i=0,crossChain:a=!1,requestedCapBps:u,quotedAtMs:d=Date.now(),ttlMs:f=Pt,secret:l}={}){let c=BigInt(r??0);if(c<=0n)throw new Error("auto-slippage guard requires positive quoteAmountOut");let s=In({liquidityUsd:n,priceChange5m:o,quoteAgeMs:i,crossChain:a,requestedCapBps:u});if(!s.executable)throw new Error(`auto-slippage requires ${s.requiredBps} bps above hard/requested cap ${s.capBps}; route blocked`);let p=Number(d);if(!Number.isFinite(p))throw new Error("auto-slippage: quotedAtMs must be a finite number");let m=Math.min(3e4,Math.max(1e3,Number(f)||Pt)),A=c*BigInt(1e4-s.selectedBps),O=A/10000n;if(A%10000n!==0n&&(O+=1n),O>c&&(O=c),c>0n&&O<=0n)throw new Error(`auto-slippage: quote ${c} is too small to express a ${s.selectedBps} bps floor without rounding to zero`);let y=Number((c-O)*10000n/(c===0n?1n:c));if(y>s.capBps)throw new Error(`auto-slippage: realised floor implies ${y} bps, above cap ${s.capBps} \u2014 refusing to issue a guard weaker than advertised`);return xn({mode:"auto",chainId:Number(e),venue:String(t||"unknown"),quoteAmountOut:c.toString(),minAmountOut:O.toString(),requiredBps:s.requiredBps,selectedBps:s.selectedBps,capBps:s.capBps,quotedAtMs:p,expiresAtMs:p+m},{secret:l})}function de(e,{chainId:t,venue:r,amountOut:n,liquidityUsd:o,priceChange5m:i,crossChain:a,requestedCapBps:u,quotedAtMs:d=Date.now(),ttlMs:f}={}){let l=_n({chainId:t,venue:r,quoteAmountOut:n,liquidityUsd:o,priceChange5m:i,crossChain:a,requestedCapBps:u,quotedAtMs:d,ttlMs:f});return{...e,autoSlippage:l,amountOutMinimum:l.minAmountOut}}var $t,Pt,Ge=R(()=>{Rt();Bt();$t=100,Pt=2e4});var Ko,Yo,Ve=R(()=>{Ko=300*1e3,Yo=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})()});import{Interface as Mt,getAddress as pe,isAddress as Nn}from"ethers";function Bn(e){let t=Number(e),r=re[t];if(!r)throw new Error(`aerodrome: unsupported chainId ${e} (supported: ${Object.keys(re).join(", ")})`);return{chainId:t,...r}}function Dt(e,t){let r=re[Number(t)];if(!e||e===Tn||e===Rn||/^eth$/i.test(String(e)))return pe(r.weth);let n=String(e);if(/^weth$/i.test(n))return pe(r.weth);if(/^usdc$/i.test(n))return pe(r.usdc);if(!Nn(n))throw new Error(`invalid token address: ${e}`);return pe(n)}async function Ft(e={},t={}){let{chainId:r,quoter:n,router:o}=Bn(e.chainId??8453),i=Dt(e.tokenIn||"WETH",r),a=Dt(e.tokenOut||re[r].usdc,r),u=BigInt(e.amountIn??0);if(u<=0n)throw new Error("amountIn required (raw base units)");let d=e.tickSpacing!=null?[Number(e.tickSpacing)]:e.tryTickSpacings===!1?[100]:[...kn],f=[],l=null;for(let c of d){let s=Lt.encodeFunctionData("quoteExactInputSingle",[{tokenIn:i,tokenOut:a,amountIn:u,tickSpacing:c,sqrtPriceLimitX96:0n}]);try{let p=await N(r,"eth_call",[{to:n,data:s},"latest"],t);if(!p||p==="0x"){f.push({tickSpacing:c,ok:!1,error:"empty result"});continue}let m=Lt.decodeFunctionResult("quoteExactInputSingle",p),A={tickSpacing:c,ok:!0,amountOut:m[0].toString(),sqrtPriceX96After:m[1].toString(),initializedTicksCrossed:Number(m[2]),gasEstimate:m[3].toString()};f.push(A),(!l||BigInt(A.amountOut)>BigInt(l.amountOut))&&(l=A)}catch(p){f.push({tickSpacing:c,ok:!1,error:String(p.message||p).slice(0,160)})}}if(!l){let c=f.map(s=>`${s.tickSpacing}:${s.error||"fail"}`).join("; ");throw new Error(`aerodrome quote failed chain=${r}: ${c}`)}return de({venue:"aerodrome",chainId:r,chain:re[r].name,quoter:n,router:o,tokenIn:i,tokenOut:a,amountIn:u.toString(),tickSpacing:l.tickSpacing,amountOut:l.amountOut,gasEstimate:l.gasEstimate,sqrtPriceX96After:l.sqrtPriceX96After,initializedTicksCrossed:l.initializedTicksCrossed,triedTickSpacings:f,best:!0},{chainId:r,venue:o,amountOut:l.amountOut,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}var re,kn,Lt,ri,Tn,Rn,vt=R(()=>{Z();Ge();Ve();re={8453:{name:"base",quoter:"0x254cF9E1E6e233aa1AC962CB9B05b2cfeAaE15b0",router:"0xBE6D8f0d05cC4be24d5167a3eF062215bE6D18a5",factory:"0x5e7BB104d84c7CB9B682AaC2F3d509f5F406809A",weth:"0x4200000000000000000000000000000000000006",usdc:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}},kn=[1,50,100,200,2e3],Lt=new Mt(["function quoteExactInputSingle((address tokenIn, address tokenOut, uint256 amountIn, int24 tickSpacing, uint160 sqrtPriceLimitX96) params) returns (uint256 amountOut, uint160 sqrtPriceX96After, uint32 initializedTicksCrossed, uint256 gasEstimate)"]),ri=new Mt(["function exactInputSingle((address tokenIn, address tokenOut, int24 tickSpacing, address recipient, uint256 deadline, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountOut)"]),Tn="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",Rn="0x0000000000000000000000000000000000000000"});function Dn(e,t,r){let n=L(t),o=L(r),i=L(e?.baseToken?.address),a=L(e?.quoteToken?.address);return i===n&&a===o||i===o&&a===n}function Mn(e){let t=Number(e?.liquidity?.usd);return Number.isFinite(t)&&t>=0?t:null}function Fn(e={}){return(e.baseUrl||process.env.DEXSCREENER_API_URL||$n).replace(/\/$/,"")}async function vn(e,t={}){if(!e)throw new Error("tokenAddress required");return se(`${Fn(t)}/latest/dex/tokens/${e}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function Ut({chainId:e,tokenA:t,tokenB:r,dexIds:n=[]}={},o={}){if(e==null||!t||!r)throw new Error("chainId, tokenA, and tokenB required");let i=L(Pn[Number(e)]||e),a=new Set(Ln(n).filter(Boolean).map(L)),u=[...new Set([t,r].map(s=>String(s)).filter(Boolean))],d=await Promise.allSettled(u.map(s=>vn(s,{...o,baseUrl:o.dexscreenerBaseUrl,timeoutMs:o.dexscreenerTimeoutMs??Math.min(Number(o.timeoutMs??4e3),4e3)}))),f=new Set,l=[];for(let s of d)if(s.status==="fulfilled")for(let p of s.value?.pairs||s.value?.data?.pairs||[]){let m=`${L(p?.chainId)}:${L(p?.dexId)}:${L(p?.pairAddress)}`;f.has(m)||(f.add(m),l.push(p))}return l.filter(s=>L(s?.chainId)===i).filter(s=>Dn(s,t,r)).filter(s=>!a.size||a.has(L(s?.dexId))).map(s=>({pairAddress:s.pairAddress??null,dexId:s.dexId??null,chainId:s.chainId??null,liquidityUsd:Mn(s),pairCreatedAt:s.pairCreatedAt??null})).filter(s=>s.liquidityUsd!=null).sort((s,p)=>p.liquidityUsd-s.liquidityUsd)}var $n,Pn,L,Ln,Wt=R(()=>{Be();$n="https://api.dexscreener.com",Pn=Object.freeze({1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avalanche",999:"hyperevm",4663:"robinhood"}),L=e=>String(e??"").toLowerCase(),Ln=e=>Array.isArray(e)?e:e==null?[]:[e]});import{Interface as jt,getAddress as me,isAddress as zt}from"ethers";function zn(e,t){let r=Number(e),n=ne[r];if(!n)throw new Error(`uniswap-v3: unsupported chainId ${e} (supported: ${Object.keys(ne).join(", ")})`);let o=jn[r]||{};if(!t){if(!n.quoter||!n.router){let d=Object.keys(o).join(", ")||"none registered";throw new Error(`uniswap-v3: chain ${r} (${n.name}) has no canonical Uniswap v3 deployment -- name a venue explicitly (known: ${d})`)}return{chainId:r,venue:n.name,...n}}let i=String(t).toLowerCase();if(i===n.name&&n.quoter&&n.router)return{chainId:r,venue:n.name,...n};let a=o,u=a[i];if(!u){let d=[...n.quoter&&n.router?[n.name]:[],...Object.keys(a)].join(", ");throw new Error(`uniswap-v3: unknown venue "${t}" on chain ${r} (known: ${d})`)}return{chainId:r,venue:i,...n,quoter:u.quoter,router:u.router,feeTiers:u.feeTiers||null}}function qt(e,t){let r=ne[Number(t)];if(!e||e===Hn||e===qn||/^eth$/i.test(String(e)))return me(r.weth);let n=String(e);if(/^weth$/i.test(n))return me(r.weth);if(/^usdc$/i.test(n))return me(r.usdc);if(!zt(n))throw new Error(`invalid token address: ${e}`);return me(n)}function Gn(e){let t=String(e||"uniswap").toLowerCase();return t==="uniswap"?["uniswap-v3","uniswap"]:t==="pancakeswap"?["pancakeswap-v3","pancakeswap"]:t==="hyperswap"?["hyperswap-v3","hyperswap"]:[t,`${t}-v3`]}async function Gt(e={},t={}){let{chainId:r,quoter:n,router:o,feeTiers:i}=zn(e.chainId??8453,e.venue),a=qt(e.tokenIn||"WETH",r),u=qt(e.tokenOut||ne[r].usdc,r),d=BigInt(e.amountIn??0);if(d<=0n)throw new Error("amountIn required (raw base units)");let f=i&&i.length?i:Un,l=e.fee!=null?[Number(e.fee)]:e.tryFees===!1?[f[Math.min(2,f.length-1)]]:[...f],c=[],s=null;for(let w of l){let S=Ht.encodeFunctionData("quoteExactInputSingle",[{tokenIn:a,tokenOut:u,amountIn:d,fee:w,sqrtPriceLimitX96:0n}]);try{let x=await N(r,"eth_call",[{to:n,data:S},"latest"],t);if(!x||x==="0x"){c.push({fee:w,ok:!1,error:"empty result"});continue}let I=Ht.decodeFunctionResult("quoteExactInputSingle",x),_={fee:w,ok:!0,amountOut:I[0].toString(),sqrtPriceX96After:I[1].toString(),initializedTicksCrossed:Number(I[2]),gasEstimate:I[3].toString()};c.push(_),(!s||BigInt(_.amountOut)>BigInt(s.amountOut))&&(s=_)}catch(x){c.push({fee:w,ok:!1,error:String(x.message||x).slice(0,160)})}}if(!s){let w=c.map(S=>`${S.fee}:${S.error||"fail"}`).join("; ");throw new Error(`uniswap-v3 quote failed chain=${r}: ${w}`)}let p=e.liquidityUsd==null?await Ut({chainId:r,tokenA:a,tokenB:u,dexIds:Gn(e.venue)},t).catch(()=>[]):[],m={};for(let w of p.slice(0,8))if(!(!w.pairAddress||!zt(w.pairAddress)))try{let S=await N(r,"eth_call",[{to:w.pairAddress,data:Wn},"latest"],t),x=S&&S!=="0x"&&S.length<=66?Number.parseInt(S,16):NaN;if(!Number.isFinite(x)||x<=0||x>1e6)continue;(m[x]==null||w.liquidityUsd>m[x].liquidityUsd)&&(m[x]=w)}catch{}let A=e.liquidityBandBps==null?50:Number(e.liquidityBandBps),O=null;if(e.fee==null&&A>0&&BigInt(s.amountOut)>0n){let w=BigInt(s.amountOut),x=c.filter(I=>I.ok&&Number((w-BigInt(I.amountOut))*10000n/w)<=A).filter(I=>m[I.fee]?.liquidityUsd!=null).sort((I,_)=>m[_.fee].liquidityUsd-m[I.fee].liquidityUsd)[0];x&&x.fee!==s.fee&&(O={priceBestFee:s.fee,chosenFee:x.fee,chosenPoolUsd:m[x.fee].liquidityUsd,bandBps:A},s=x)}let y=m[s.fee]??null,h=p[0]??null,E=y??h,b=e.liquidityUsd??y?.liquidityUsd??h?.liquidityUsd??null,g=e.liquidityUsd!=null?"caller":y?"pool":h?"pair":null;return de({venue:"uniswap-v3",chainId:r,chain:ne[r].name,quoter:n,tokenIn:a,tokenOut:u,amountIn:d.toString(),fee:s.fee,amountOut:s.amountOut,gasEstimate:s.gasEstimate,liquidityUsd:b,liquiditySource:E,liquidityAttribution:g,liquidityPick:O,sqrtPriceX96After:s.sqrtPriceX96After,initializedTicksCrossed:s.initializedTicksCrossed,triedFees:c,best:!0},{chainId:r,venue:o,amountOut:s.amountOut,liquidityUsd:b,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}var ne,Un,Wn,Ht,fi,Hn,qn,Xe,jn,Vt=R(()=>{Z();Wt();Ge();Ve();ne={1:{name:"ethereum",quoter:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",router:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",weth:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",usdc:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"},8453:{name:"base",quoter:"0x3d4e44Eb1374240CE5F1B871ab261CD16335B76a",router:"0x2626664c2603336E57B271c5C0b26F421741e481",weth:"0x4200000000000000000000000000000000000006",usdc:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"},42161:{name:"arbitrum",quoter:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",router:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",weth:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",usdc:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},4663:{name:"robinhood",quoter:"0x33e885ed0ec9bf04ecfb19341582aadcb4c8a9e7",router:"0xcaf681a66d020601342297493863e78c959e5cb2",weth:"0x0bd7d308f8e1639fab988df18a8011f41eacad73",usdc:"0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168"},999:{name:"hyperevm",weth:"0x5555555555555555555555555555555555555555",usdc:"0xB8CE59FC3717ada4C02eaDF9682A9e934F625ebb"},10:{name:"optimism",quoter:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",router:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",weth:"0x4200000000000000000000000000000000000006",usdc:"0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85"},56:{name:"bsc",quoter:"0x78D78E420Da98ad378D7799bE8f4AF69033EB077",router:"0xB971eF87ede563556b2ED4b1C0b0019111Dd85d2",weth:"0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c",usdc:"0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d"},137:{name:"polygon",quoter:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",router:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",weth:"0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270",usdc:"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359"},43114:{name:"avalanche",quoter:"0xbe0F5544EC67e9B3b2D979aaA43f18Fd87E6257F",router:"0xbb00FF08d01D300023C629E8fFfFcb65A5a578cE",weth:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",usdc:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"}},Un=[100,500,3e3,1e4],Wn="0xddca3f43",Ht=new jt(["function quoteExactInputSingle((address tokenIn, address tokenOut, uint256 amountIn, uint24 fee, uint160 sqrtPriceLimitX96) params) returns (uint256 amountOut, uint160 sqrtPriceX96After, uint32 initializedTicksCrossed, uint256 gasEstimate)","function quoteExactInput(bytes path, uint256 amountIn) returns (uint256 amountOut, uint160[] sqrtPriceX96AfterList, uint32[] initializedTicksCrossedList, uint256 gasEstimate)"]),fi=new jt(["function exactInputSingle((address tokenIn,address tokenOut,uint24 fee,address recipient,uint256 amountIn,uint256 amountOutMinimum,uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountOut)","function multicall(uint256 deadline,bytes[] data) payable returns (bytes[] results)"]),Hn="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",qn="0x0000000000000000000000000000000000000000",Xe=[100,500,2500,1e4],jn={56:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:Xe}},8453:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:Xe}},42161:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:Xe}},999:{hyperswap:{name:"hyperswap",quoter:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",router:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D"}}}});var Qt={};Ze(Qt,{collectBaseRoundTripCycles:()=>Kn});function Ke(e,{positive:t=!1}={}){return typeof e=="string"&&/^(?:0|[1-9][0-9]*)$/.test(e)&&(!t||e!=="0")&&BigInt(e)<=Vn}function Xt(e){if(!Ke(e,{positive:!0})){let t=typeof e=="string"&&/^[1-9][0-9]*$/.test(e)?" and fit uint256":"";throw new TypeError(`amountInWei must be a positive strict decimal string${t}`)}return e}function Kt(e,t){let r=e?.amountOut;if(!Ke(r,{positive:!0}))throw new Error(`${t} returned an invalid amountOut`);return r}function Yt(e,t){let r=e?.gasEstimate??e?.gasUnits;if(!Ke(r))throw new Error(`${t} returned invalid gas units`);return r}function Y(e,t){return e==="uniswap-v3"?{venue:e,...t?.fee==null?{}:{fee:t.fee}}:{venue:e,...t?.tickSpacing==null?{}:{tickSpacing:t.tickSpacing}}}function he(e,t,r,n,o,i){return{status:"UNAVAILABLE",entryVenue:e,exitVenue:t,amountInWei:r,intermediateAmountBase:n,amountOutWei:null,gasUnits:null,source:o,error:String(i?.message||i)}}async function Jt({entryVenue:e,exitVenue:t,amountInWei:r,blockTag:n,entryQuote:o,exitQuote:i}){let a;try{a=await o({chainId:oe,tokenIn:"WETH",tokenOut:"USDC",amountIn:r,blockTag:n})}catch(l){return he(e,t,r,null,{},l)}let u,d;try{u=Kt(a,e),d=Yt(a,e)}catch(l){return he(e,t,r,null,{entry:Y(e,a)},l)}let f;try{f=await i({chainId:oe,tokenIn:"USDC",tokenOut:"WETH",amountIn:u,blockTag:n})}catch(l){return he(e,t,r,u,{entry:Y(e,a)},l)}try{let l=Kt(f,t),c=(BigInt(d)+BigInt(Yt(f,t))).toString();return{status:"OK",entryVenue:e,exitVenue:t,amountInWei:r,intermediateAmountBase:u,amountOutWei:l,gasUnits:c,source:{entry:Y(e,a),exit:Y(t,f)}}}catch(l){return he(e,t,r,u,{entry:Y(e,a),exit:Y(t,f)},l)}}async function Xn(e){let t=await N(oe,"eth_gasPrice",[],e);return BigInt(t).toString()}async function Kn(e={}){let t=Xt(e.amountInWei),r=e.quoteUniswap??(m=>Gt(m,e)),n=e.quoteAerodrome??(m=>Ft(m,e)),o=e.getBlockNumber??(()=>Fe(oe,e)),i=e.getGasPriceWei??(()=>Xn(e)),a=e.now??(()=>new Date().toISOString()),u=e.maxBlockDrift??1;if(!Number.isSafeInteger(u)||u<0)throw new TypeError("maxBlockDrift must be a non-negative safe integer");let d=e.pinnedBlock??await o();if(!Number.isSafeInteger(d)||d<0)throw new Error("block provider returned invalid height");let f=`0x${d.toString(16)}`,l=Xt(await i()),c=[];c.push(await Jt({entryVenue:"uniswap-v3",exitVenue:"aerodrome",amountInWei:t,blockTag:f,entryQuote:r,exitQuote:n})),c.push(await Jt({entryVenue:"aerodrome",exitVenue:"uniswap-v3",amountInWei:t,blockTag:f,entryQuote:n,exitQuote:r}));let s=await o();if(!Number.isSafeInteger(s)||s<0)throw new Error("block provider returned invalid height");let p=Math.abs(s-d);return{mode:"shadow",executionReady:!1,chainId:oe,pair:"WETH-USDC",capturedAt:a(),amountInWei:t,blockStart:d,blockEnd:s,pinnedBlock:d,blockTag:f,blockConsistency:"PINNED",blockDrift:p,maxBlockDrift:u,stale:p>u,gasPriceWei:l,cycles:c}}var oe,Vn,Zt=R(()=>{vt();Z();Vt();oe=8453,Vn=(1n<<256n)-1n});import{homedir as fo}from"node:os";import{isAbsolute as po,join as mo}from"node:path";var ve=Object.freeze({premium:"0x074b2e43",provider:"0x0542975c",reserves:"0xd1946dbc"}),ht=/^0x[0-9a-fA-F]{64}$/,Gr=/^0x(?:0|[1-9a-fA-F][0-9a-fA-F]*)$/,Vr=256,Xr=100;async function Kr(...e){let{rpcCall:t}=await Promise.resolve().then(()=>(Z(),pt));return t(...e)}function Ue(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))Ue(t);Object.freeze(e)}return e}var M=Ue({chainId:8453,pool:"0xA238Dd80C259a72e81d7e4664a9801593F98d1c5",addressesProvider:"0xe20fCBdBfFC4Dd138cE8b2E6FBb6CB49777ad64D",WETH:"0x4200000000000000000000000000000000000006",USDC:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",requiredReserves:["0x4200000000000000000000000000000000000006","0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"],observedPremiumBps:5});function Yr(e){if(typeof e!="string"||!Gr.test(e))throw new Error("malformed eth_blockNumber result");let t=BigInt(e);if(t>BigInt(Number.MAX_SAFE_INTEGER))throw new Error("malformed eth_blockNumber result: outside safe range");return Number(t)}function Jr(e,t){if(typeof e!="string"||!ht.test(e))throw new Error(`malformed ${t} result`);return BigInt(e)}function gt(e,t){if(typeof e!="string"||!ht.test(e)||e.slice(2,26)!=="0".repeat(24))throw new Error(`malformed ${t} result`);return`0x${e.slice(26).toLowerCase()}`}function Qr(e){if(typeof e!="string"||!/^0x[0-9a-fA-F]+$/.test(e)||e.length<130)throw new Error("malformed getReservesList result");let t=e.slice(2);if(t.length%64!==0||BigInt(`0x${t.slice(0,64)}`)!==32n)throw new Error("malformed getReservesList result");let r=BigInt(`0x${t.slice(64,128)}`);if(r>BigInt(Vr)||r>BigInt(Number.MAX_SAFE_INTEGER))throw new Error("malformed getReservesList result: unreasonable reserve count");let n=Number(r);if(t.length!==128+n*64)throw new Error("malformed getReservesList result: invalid length");let o=[];for(let i=0;i<n;i+=1){let a=`0x${t.slice(128+i*64,192+i*64)}`;o.push(gt(a,"getReservesList address"))}return o}function mt(e,t,r,n){return Ue({mode:"shadow",executionReady:!1,status:e,chainId:M.chainId,block:t,premiumBps:r,reasons:n})}async function wt(e={}){let t=e.rpc??Kr;if(typeof t!="function")throw new TypeError("rpc must be a function");let r=null,n=null;try{let o=await t(M.chainId,"eth_blockNumber",[],e);r=Yr(o);let i=c=>t(M.chainId,"eth_call",[{to:M.pool,data:c},o],e),a=Jr(await i(ve.premium),"FLASHLOAN_PREMIUM_TOTAL");if(a>BigInt(Number.MAX_SAFE_INTEGER))throw new Error("malformed FLASHLOAN_PREMIUM_TOTAL result: outside safe range");n=Number(a);let u=gt(await i(ve.provider),"ADDRESSES_PROVIDER"),d=Qr(await i(ve.reserves)),f=[];n>Xr?f.push(`premium ${n} bps exceeds reasonable bound`):n!==M.observedPremiumBps&&f.push(`premium ${n} bps differs from observed ${M.observedPremiumBps} bps`),u!==M.addressesProvider.toLowerCase()&&f.push(`addresses provider mismatch: received ${u}`);let l=new Set(d);for(let[c,s]of[["WETH",M.WETH],["USDC",M.USDC]])l.has(s.toLowerCase())||f.push(`${c} required reserve is missing`);return mt(f.length===0?"AVAILABLE":"MISMATCH",r,n,f)}catch(o){return mt("UNAVAILABLE",r,n,[String(o?.message||o)])}}var Zr=/^(?:0|[1-9][0-9]*)$/,bt=10000n,We=(1n<<256n)-1n;function B(e,t="value"){let r;if(typeof e=="bigint"&&e>=0n)r=e;else if(typeof e=="string"&&Zr.test(e))r=BigInt(e);else throw new TypeError(`${t} must be a non-negative plain decimal string or bigint`);if(r>We)throw new RangeError(`${t} must fit uint256`);return r}function ce(e,t){return typeof e=="number"&&Number.isSafeInteger(e)&&e>=0?BigInt(e):B(e,t)}function en(e,t){let r=B(e,"amount"),n=ce(t,"basisPoints");if(n>bt)throw new RangeError("basisPoints must be at most 10000");let o=r*n;return o===0n?0n:(o-1n)/bt+1n}function ee(e){if(typeof e!="bigint")throw new TypeError("value must be a bigint");return e.toString(10)}function Et(e,t){if(e===null||typeof e!="object"||Array.isArray(e))throw new TypeError(`${t} must be an object`);return e}function yt(e){for(let t of Object.values(e))t!==null&&typeof t=="object"&&!Object.isFrozen(t)&&yt(t);return Object.freeze(e)}function At(e,t){Et(e,"cycle"),Et(t,"policy");let r=B(e.amountInWei,"cycle.amountInWei"),n=B(e.amountOutWei,"cycle.amountOutWei"),o=ce(e.gasUnits,"cycle.gasUnits"),i=B(e.gasPriceWei,"cycle.gasPriceWei"),a=ce(t.loanPremiumBps,"policy.loanPremiumBps"),u=B(t.builderFeeWei,"policy.builderFeeWei"),d=B(t.extraCostWei,"policy.extraCostWei"),f=B(t.minProfitWei,"policy.minProfitWei"),l=B(t.maxGasWei,"policy.maxGasWei"),c=B(t.maxLoanWei,"policy.maxLoanWei");ce(t.maxBlockDrift,"policy.maxBlockDrift");let s=n-r,p=o*i;if(p>We)throw new RangeError("gas cost must fit uint256");let m=en(r,a),A=p+m+u+d;if(A>We)throw new RangeError("total cost must fit uint256");let O=s-A,y=O>=f&&p<=l&&r<=c;return yt({grossProfitWei:ee(s),gasCostWei:ee(p),loanPremiumWei:ee(m),totalCostWei:ee(A),netProfitWei:ee(O),status:y?"PROFITABLE":"UNPROFITABLE",executionReady:!1,mode:"shadow"})}var tn=/^(?:0|[1-9][0-9]*)$/,rn=(1n<<256n)-1n;function te(e){let t=null;return typeof e=="bigint"&&e>=0n&&(t=e),typeof e=="string"&&tn.test(e)&&(t=BigInt(e)),t!==null&&t<=rn?t:null}function ue(e){return typeof e=="string"&&e.length>0?e:null}function He(e){return Array.isArray(e)&&e.every(t=>typeof t=="string")?e:null}function $(e,t){e.push(`MALFORMED_${t.replaceAll(/[^A-Za-z0-9]+/g,"_").toUpperCase()}`)}function nn(e){return Object.freeze(e.reasonCodes),Object.freeze(e)}function xt(e,t,r){let n=[],o=e!==null&&typeof e=="object"&&!Array.isArray(e)?e:{},i=t!==null&&typeof t=="object"&&!Array.isArray(t)?t:{},a=r!==null&&typeof r=="object"&&!Array.isArray(r)?r:{},u=ue(o.chainId),d=ue(a.chainId),f=ue(o.lender),l=ue(o.strategy),c=He(i.supportedChainIds),s=He(i.allowedLenders),p=He(i.allowedStrategies);u||$(n,"chainId"),d||$(n,"opts.chainId"),u&&d&&u!==d&&n.push("CHAIN_MISMATCH"),c?(!u||!c.includes(u))&&n.push("UNSUPPORTED_CHAIN"):$(n,"supportedChainIds"),f||$(n,"lender"),s?(!f||!s.includes(f))&&n.push("LENDER_NOT_ALLOWED"):$(n,"allowedLenders"),l||$(n,"strategy"),p?(!l||!p.includes(l))&&n.push("STRATEGY_NOT_ALLOWED"):$(n,"allowedStrategies");let m=te(o.blockNumber),A=te(a.currentBlock),O=te(i.maxBlockDrift);m===null&&$(n,"blockNumber"),A===null&&$(n,"opts.currentBlock"),O===null&&$(n,"maxBlockDrift"),m!==null&&A!==null&&O!==null&&(m>A||A-m>O)&&n.push("STALE_BLOCK"),o.simulationStatus!=="PASS"&&n.push("SIMULATION_NOT_PASS"),o.repaymentStatus!=="PASS"&&n.push("REPAYMENT_NOT_PASS");let y=[["realizedProfitWei","minRealizedProfitWei","PROFIT_BELOW_MINIMUM",(b,g)=>b<g],["gasCostWei","maxGasWei","GAS_LIMIT_EXCEEDED",(b,g)=>b>g],["builderFeeWei","maxBuilderFeeWei","BUILDER_FEE_EXCEEDED",(b,g)=>b>g],["loanPremiumWei","maxLoanPremiumWei","LOAN_PREMIUM_EXCEEDED",(b,g)=>b>g],["loanAmountWei","maxLoanWei","LOAN_LIMIT_EXCEEDED",(b,g)=>b>g]],h={};for(let[b,g,w,S]of y){let x=te(o[b]),I=te(i[g]);h[b]=x,x===null&&$(n,b),I===null&&$(n,g),x!==null&&I!==null&&S(x,I)&&n.push(w)}a.armed!==!1&&n.push("NOT_DISARMED");let E={status:n.length===0?"ELIGIBLE":"BLOCKED",reasonCodes:[...new Set(n)],executionReady:!1,mode:"shadow"};return u&&(E.chainId=u),f&&(E.lender=f),l&&(E.strategy=l),m!==null&&(E.blockNumber=m.toString(10)),h.realizedProfitWei!==null&&(E.realizedProfitWei=h.realizedProfitWei.toString(10)),nn(E)}function W(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))W(t);Object.freeze(e)}return e}function le(e){return e instanceof Error&&e.message?e.message.slice(0,300):String(e||"unknown error").slice(0,300)}function on(e,t){for(let r of[e?.cycleId,e?.id])if(typeof r=="string"&&r.trim())return r.trim().slice(0,160);return`cycle-${t}`}function sn(e,t){if(!e||typeof e!="object"||e.profitable===!1)return!1;if(typeof t=="function")return t(e)===!0;if(typeof t?.isProfitable=="function")return t.isProfitable(e)===!0;let r=Number(t?.minNetProfitUsd??0);return Number.isFinite(e.netProfitUsd)&&e.netProfitUsd>=(Number.isFinite(r)?r:0)}function St({collectCycles:e,evaluateCycle:t,store:r,policy:n={},intervalMs:o=6e4,now:i=Date.now}={}){if(typeof e!="function")throw new Error("collectCycles must be a function");if(typeof t!="function")throw new Error("evaluateCycle must be a function");if(!r||typeof r.append!="function"||typeof r.latest!="function")throw new Error("store must provide append() and latest()");if(!Number.isInteger(o)||o<=0)throw new Error("intervalMs must be a positive integer");if(typeof i!="function")throw new Error("now must be a function");let a=null,u=!1,d=0,f=0,l=null,c=[];function s(){return W({mode:"shadow",execution:!1,signer:!1,broadcaster:!1,running:a!==null,inFlight:u,ticks:d,failures:f,lastError:l})}async function p(){if(u)return W({ok:!1,skipped:"overlap"});u=!0;let E=i(),b=[],g=[],w=[],S=[],x=[];try{try{let _=await e();if(!Array.isArray(_))throw new Error("collectCycles must return an array");x=_}catch(_){b.push({stage:"collect",message:le(_)})}for(let _=0;_<x.length;_+=1){let k=x[_],T=on(k,_);g.push({id:T});try{let C=await t(k,n),j={...C,cycleId:C?.cycleId??T};w.push(j),sn(C,n)&&S.push({...j,profitable:!0})}catch(C){b.push({stage:"evaluate",cycleId:T,message:le(C)})}}let I={id:`shadow-${E}-${d+1}`,observedAt:E,cyclesEvaluated:x.length,cycles:g,candidates:w,opportunities:S,errors:b};try{await r.append(I)}catch(_){b.push({stage:"persist",message:le(_)})}return d+=1,b.length?(f+=1,l=b.map(_=>_.message).join("; ")):l=null,c=r.latest()?.opportunities??W(structuredClone(S)),W({ok:b.length===0,observation:r.latest()??I})}catch(I){return d+=1,f+=1,l=le(I),W({ok:!1,error:l})}finally{u=!1}}function m(){return a!==null?!1:(a=setInterval(()=>p().catch(()=>{}),o),!0)}function A(){return a===null?!1:(clearInterval(a),a=null,!0)}async function O({timeoutMs:E=3e4}={}){if(!Number.isInteger(E)||E<=0)throw new Error("timeoutMs must be a positive integer");let b=Date.now()+E;for(;u;){if(Date.now()>=b)throw new Error("shadow engine drain timed out");await new Promise(g=>setTimeout(g,5))}return typeof r.drain=="function"&&await r.drain(),!0}function y(){return r.latest()}function h(){return W(structuredClone(c))}return W({tick:p,start:m,stop:A,drain:O,status:s,latest:y,opportunities:h})}import{mkdir as an,open as It,readFile as _t,rename as cn,unlink as un}from"node:fs/promises";import{dirname as ln,basename as fn,join as dn}from"node:path";var pn=1e3;function G(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))G(t);Object.freeze(e)}return e}function qe(e){return typeof e=="number"&&Number.isFinite(e)?e:void 0}function V(e,t=300){return typeof e=="string"&&e.trim()?e.trim().slice(0,t):void 0}function mn(e){if(!e||typeof e!="object")return null;let t={},r=V(e.stage,30),n=V(e.message,300),o=V(e.cycleId,160);return r&&(t.stage=r),n&&(t.message=n),o&&(t.cycleId=o),Object.keys(t).length?t:null}function Ct(e,{signed:t=!1,max:r=96}={}){return typeof e!="string"||e.length>r?void 0:(t?/^-?(?:0|[1-9][0-9]*)$/:/^(?:0|[1-9][0-9]*)$/).test(e)?e:void 0}function Ot(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let t={};for(let r of["cycleId","chain","pair","tokenIn","tokenOut","strategy","venue","lender","qualification","economicStatus","eligibilityStatus","costModel","blockConsistency"]){let n=V(e[r],160);n&&(t[r]=n)}for(let r of["netProfitUsd","grossProfitUsd","costUsd","gasCostUsd","confidence"]){let n=qe(e[r]);n!==void 0&&(t[r]=n)}for(let r of["amountInWei","amountOutWei","gasUnits","gasCostWei","loanPremiumWei","totalCostWei"]){let n=Ct(e[r]);n!==void 0&&(t[r]=n)}for(let r of["grossProfitWei","netProfitWei"]){let n=Ct(e[r],{signed:!0});n!==void 0&&(t[r]=n)}return["PROFITABLE","UNPROFITABLE","STALE","UNAVAILABLE","THEORETICAL"].includes(e.status)&&(t.status=e.status),typeof e.profitable=="boolean"&&(t.profitable=e.profitable),typeof e.economicallyProfitable=="boolean"&&(t.economicallyProfitable=e.economicallyProfitable),e.executionReady===!1&&(t.executionReady=!1),Array.isArray(e.reasonCodes)&&(t.reasonCodes=e.reasonCodes.map(r=>V(r,80)).filter(Boolean).slice(0,32)),Object.keys(t).length?t:null}function hn(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let t={};for(let r of["id","cycleId","chain","tokenIn","tokenOut","strategy"]){let n=V(e[r],160);n&&(t[r]=n)}return Object.keys(t).length?t:null}function Nt(e,t){let r=e&&typeof e=="object"&&!Array.isArray(e)?e:{},n=qe(r.observedAt)??qe(r.timestamp)??t(),o=V(r.id,160)??`shadow-${n}`,i=Array.isArray(r.cycles)?r.cycles.map(hn).filter(Boolean):[],a=Array.isArray(r.opportunities)?r.opportunities.map(Ot).filter(Boolean):[],u=Array.isArray(r.candidates)?r.candidates.map(Ot).filter(Boolean):[],d=Array.isArray(r.errors)?r.errors.map(mn).filter(Boolean):[];return{id:o,observedAt:n,mode:"shadow",cyclesEvaluated:Number.isInteger(r.cyclesEvaluated)&&r.cyclesEvaluated>=0?r.cyclesEvaluated:i.length,cycles:i,candidates:u,opportunities:a,errors:d}}function kt({filePath:e,maxRecords:t=pn,now:r=Date.now,persist:n=!0}={}){if(!Number.isInteger(t)||t<=0)throw new Error("maxRecords must be a positive integer");if(typeof r!="function")throw new Error("now must be a function");if(typeof n!="boolean")throw new Error("persist must be a boolean");if(n&&(typeof e!="string"||!e.trim()))throw new Error("filePath is required when persistence is enabled");let o=[],i=Promise.resolve(),a=()=>G(structuredClone(o));async function u(y){let h=JSON.parse(await _t(y,"utf8")),E=Array.isArray(h)?h:h?.records;if(!Array.isArray(E))throw new Error("shadow store payload is malformed");return E.map(b=>Nt(b,r)).slice(-t)}async function d(){if(!n)return a();let y=i.then(async()=>{try{o=await u(e)}catch(h){if(h?.code==="ENOENT")try{o=await u(`${e}.bak`)}catch(E){if(E?.code==="ENOENT")o=[];else throw new Error("shadow store backup is corrupted")}else try{o=await u(`${e}.bak`)}catch{throw new Error("shadow store primary and backup are corrupted")}}return a()});return i=y.catch(()=>{}),y}let f=0;async function l(y,h){let E=ln(y),b=dn(E,`.${fn(y)}.${process.pid}.${Date.now()}.${f+=1}.tmp`);await an(E,{recursive:!0,mode:448});let g;try{g=await It(b,"wx",384),await g.writeFile(h,"utf8"),await g.sync(),await g.close(),g=null,await cn(b,y);let w=await It(E,"r");try{await w.sync()}finally{await w.close()}}finally{g&&await g.close().catch(()=>{}),await un(b).catch(()=>{})}}async function c(y){try{let h=await _t(e,"utf8"),E=JSON.parse(h);if(!Array.isArray(E)&&!Array.isArray(E?.records))throw new Error("shadow store payload is malformed");await l(`${e}.bak`,h)}catch(h){if(h?.code!=="ENOENT")throw new Error("refusing to overwrite corrupted shadow store")}await l(e,`${JSON.stringify({version:1,records:y})}
|
|
4
|
+
`)}async function s(y){let h=Nt(y,r),E=i.then(async()=>{let b=[...o,h].slice(-t);return n&&await c(b),o=b,G(structuredClone(h))});return i=E.catch(()=>{}),E}async function p(){return await i,!0}function m({limit:y}={}){let h=Number.isInteger(y)&&y>=0?o.slice(-y):o;return G(structuredClone(h))}function A(){let y=o.at(-1);return y?G(structuredClone(y)):null}function O(){return G({records:o.length,maxRecords:t,candidates:o.reduce((y,h)=>y+h.candidates.length,0),opportunities:o.reduce((y,h)=>y+h.opportunities.length,0),errors:o.reduce((y,h)=>y+h.errors.length,0)})}return G({append:s,record:s,load:d,drain:p,list:m,latest:A,stats:O})}var Yn=/^(?:0|[1-9][0-9]*)$/,ge="8453",er="base",tr="WETH-USDC",we="base-weth-usdc-round-trip",be="aave-v3";async function Jn(e){let{collectBaseRoundTripCycles:t}=await Promise.resolve().then(()=>(Zt(),Qt));return t(e)}function F(e,t,{positive:r=!1}={}){if(typeof e!="string"||!Yn.test(e)||r&&e==="0")throw new TypeError(`${t} must be ${r?"a positive":"a non-negative"} decimal string`);return B(e,t),e}function Ye(e,t,r,n){if(!Number.isSafeInteger(e)||e<r||e>n)throw new TypeError(`${t} must be an integer from ${r} through ${n}`);return e}function H(e){return e==null?e:structuredClone(e)}function P(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))P(t);Object.freeze(e)}return e}function Qn(e){return String(e?.message||e||"unknown provider failure").slice(0,300)}function rr(e={}){let t=F(e.amountInWei,"amountInWei",{positive:!0}),r=F(e.minProfitWei,"minProfitWei"),n=F(e.maxLoanWei,"maxLoanWei"),o=F(e.maxGasWei,"maxGasWei"),i=F(e.builderFeeWei,"builderFeeWei"),a=F(e.extraCostWei,"extraCostWei"),u=F(e.extraGasUnits,"extraGasUnits"),d=Ye(e.intervalMs,"intervalMs",1,864e5),f=Ye(e.maxBlockDrift,"maxBlockDrift",0,1e3),l=Ye(e.maxRecords,"maxRecords",1,1e5),c=e.dependencies??{},s=e.collectCycles??c.collectBaseRoundTripCycles??Jn,p=e.readLenderState??c.readBaseAaveLenderState??wt,m=e.evaluateEconomics??c.evaluateCycleEconomics??At,A=e.evaluateEligibility??c.evaluateFlashLoanCandidate??xt,O=e.createEngine??c.createShadowEngine??St,y=e.createStore??c.createShadowStore??kt;for(let[C,j]of Object.entries({collect:s,readLender:p,evaluateEconomics:m,evaluateEligibility:A,makeEngine:O,makeStore:y}))if(typeof j!="function")throw new TypeError(`${C} dependency must be a function`);let h=y({filePath:e.filePath,persist:e.persist??!0,maxRecords:l,now:e.now??Date.now}),E=[],b=null,g=P({async append(C){return await h.append(C),E=[...E,P(H(C))].slice(-l),P(H(C))},async drain(){return typeof h.drain=="function"&&await h.drain(),!0},latest(){return E.length?P(H(E.at(-1))):null}}),w=null,S=null;async function x(){try{S=await p(e.lenderOptions??e)}catch(C){S={status:"UNAVAILABLE",block:null,premiumBps:null,reasons:[Qn(C)]}}if(b=P(H(S)),!S||S.status!=="AVAILABLE")throw new Error(`lender ${S?.status?.toLowerCase()||"unavailable"}: ${(S?.reasons||[]).join("; ")}`);if(!Number.isSafeInteger(S.block)||!Number.isSafeInteger(S.premiumBps)||S.premiumBps<0)throw new Error("lender returned malformed live state");if(w=await s({...e.collectorOptions,amountInWei:t,maxBlockDrift:f,pinnedBlock:S.block}),!w||!Array.isArray(w.cycles))throw new Error("quote provider returned malformed snapshot");if(w.stale===!0||w.blockDrift>f)throw new Error("stale quote snapshot");if(!Number.isSafeInteger(w.blockEnd)||Math.abs(w.blockEnd-S.block)>f)throw new Error("stale lender snapshot relative to quotes");return F(w.gasPriceWei,"quoteSnapshot.gasPriceWei",{positive:!0}),w.cycles}async function I(C){if(!C||C.status!=="OK")throw new Error(C?.error||"cycle quote unavailable");let j=(BigInt(F(C.gasUnits,"cycle.gasUnits"))+BigInt(u)).toString(),pr={...C,gasUnits:j,gasPriceWei:w.gasPriceWei},D=await m(pr,{loanPremiumBps:S.premiumBps,builderFeeWei:i,extraCostWei:a,minProfitWei:r,maxGasWei:o,maxLoanWei:n,maxBlockDrift:f}),Se=await A({chainId:ge,lender:be,strategy:we,blockNumber:String(w.blockEnd),realizedProfitWei:D.netProfitWei.startsWith("-")?"0":D.netProfitWei,gasCostWei:D.gasCostWei,builderFeeWei:i,loanPremiumWei:D.loanPremiumWei,loanAmountWei:C.amountInWei},{supportedChainIds:[ge],allowedLenders:[be],allowedStrategies:[we],maxBlockDrift:String(f),minRealizedProfitWei:r,maxGasWei:o,maxBuilderFeeWei:i,maxLoanPremiumWei:D.loanPremiumWei,maxLoanWei:n},{chainId:ge,currentBlock:String(w.blockEnd),armed:!1}),Qe=[...new Set([...Se.reasonCodes,"L1_DATA_FEE_NOT_MODELED","EXECUTOR_GAS_NOT_SIMULATED","LENDER_LIQUIDITY_NOT_CHECKED",...w.blockConsistency==="PINNED"?[]:["QUOTE_BLOCK_NOT_PINNED"]])],mr=D.status==="PROFITABLE"&&Se.status==="ELIGIBLE"&&Qe.length===0;return P({cycleId:`${C.entryVenue||"unknown"}->${C.exitVenue||"unknown"}`,chain:er,pair:tr,strategy:we,lender:be,amountInWei:C.amountInWei,amountOutWei:C.amountOutWei,gasUnits:j,...D,status:"THEORETICAL",economicStatus:D.status,economicallyProfitable:D.status==="PROFITABLE",qualification:"THEORETICAL_ONLY",eligibilityStatus:Se.status,reasonCodes:Qe,costModel:"INCOMPLETE_ESTIMATE",blockConsistency:w.blockConsistency??"RANGE_ONLY",profitable:mr,executionReady:!1,mode:"shadow"})}let _=O({collectCycles:x,evaluateCycle:I,store:g,policy:{isProfitable:C=>C?.profitable===!0},intervalMs:d,now:e.now??Date.now});async function k(){let C=await h.load();return E=H(C).slice(-l),P(H(E))}function T(){return P({mode:"shadow",execution:!1,signer:!1,broadcaster:!1,chain:er,chainId:ge,pair:tr,strategy:we,lender:be,..._.status(),lastProviderState:P(H(b))})}return P({load:k,tick:_.tick,start:_.start,stop:_.stop,drain:_.drain,status:T,latest:g.latest,opportunities:()=>P(H(g.latest()?.opportunities??[]))})}import{createServer as ro}from"node:http";var xi=Object.freeze(["chainId","agentAddress","accountAddress","actions","targets","maxValueWei","maxGasWei","maxSlippageBps","expiresAt","nonce","revocationKey"]),Si=Object.freeze(["read","simulate"]);var Ii=1440*60;var v=class extends Error{constructor(t,r){super(`secret material must never appear in a public API object (at ${t}, rule: ${r})`),this.name="SecretLeakError",this.path=t,this.rule=r}},Zn=/(private[_-]?key|secret|bearer|keystore|mnemonic|seed[_-]?phrase|passphrase|password|api[_-]?key|access[_-]?token|auth[_-]?token|session[_-]?token|signer[_-]?url|signature)/i,eo=Object.freeze(["privkey","wif","xprv","seed"]);function Je(e){let t=String(e),r=t.toLowerCase().replace(/[\s._-]+/g,"");return Zn.test(t)||eo.includes(r)}var nr=Object.freeze([{rule:"raw-32-byte-hex-key",re:/^0x[0-9a-fA-F]{64}$/},{rule:"raw-32-byte-hex-bare",re:/^[0-9a-fA-F]{64}$/},{rule:"extended-private-key",re:/\b(?:xprv|tprv|yprv|zprv)[1-9A-HJ-NP-Za-km-z]{107}\b/},{rule:"bitcoin-wif",re:/\b[59KLc][1-9A-HJ-NP-Za-km-z]{50,51}\b/},{rule:"bip39-mnemonic",re:/\b(?:[a-z]{3,8}\s+){11,23}[a-z]{3,8}\b/},{rule:"bearer-token",re:/bearer\s+[A-Za-z0-9._~+/=-]+/i},{rule:"pem-private-key",re:/-----BEGIN[A-Z ]*PRIVATE KEY-----/},{rule:"keystore-path",re:/keystore/i},{rule:"signer-url",re:/https?:\/\/\S*sign/i},{rule:"authorization-header",re:/authorization\s*:/i}]),or=Object.freeze(["grantid","id","hash","sha256","sha256hex","checksum","txhash","transactionhash","blockhash","digest","userophash","commithash","prevhash","intenthash","canonicalhash","payloadhash","requestid"]);function to(e){return e.replace(/"([A-Za-z0-9_-]+)"\s*:\s*"(?:0x)?([0-9a-fA-F]{64})"/g,(t,r)=>or.includes(String(r).toLowerCase().replace(/[_-]/g,""))?`"${r}":"<hex64>"`:t)}function ir(e){let t;try{t=JSON.stringify(e)}catch(o){throw new v("$",`unserializable-payload: ${String(o?.message||o)}`)}if(t===void 0)return"null";let r=to(t);for(let{rule:o,re:i}of nr)if(i.test(r))throw new v("$<serialized>",o);if(/(?:^|[^0-9a-fA-Fx])0x[0-9a-fA-F]{64}(?![0-9a-fA-F])/.test(r))throw new v("$<serialized>","raw-32-byte-hex-embedded");return JSON.parse(t,(o,i)=>{if(o&&Je(o))throw new v(`$<serialized>.${o}`,"forbidden-key-name");return i}),t}function X(e,t="$",r=new Set,n=""){if(e==null)return e;if(typeof e=="string"){let o=or.includes(String(n).toLowerCase().replace(/[_-]/g,""));for(let{rule:i,re:a}of nr)if(!(o&&i.startsWith("raw-32-byte-hex"))&&a.test(e))throw new v(t,i);return e}if(typeof e!="object"||r.has(e)||(r.add(e),ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e;if(e instanceof Map){for(let[o,i]of e.entries()){if(typeof o=="string"&&Je(o))throw new v(`${t}[${JSON.stringify(o)}]`,"forbidden-key-name");X(o,`${t}[key]`,r),X(i,`${t}[${String(o)}]`,r)}return e}if(e instanceof Set){let o=0;for(let i of e.values())X(i,`${t}[${o++}]`,r);return e}if(Array.isArray(e))return e.forEach((o,i)=>X(o,`${t}[${i}]`,r)),e;for(let[o,i]of Object.entries(e)){if(Je(o))throw new v(`${t}.${o}`,"forbidden-key-name");X(i,`${t}.${o}`,r,o)}return e}var sr=null,no="127.0.0.1",oo=8798,io=1e6,so='{"error":"redacted"}',ao=Object.freeze({"content-type":"application/json; charset=utf-8","cache-control":"no-store","content-security-policy":"default-src 'none'","x-content-type-options":"nosniff","x-frame-options":"DENY"});function co(e){if(!((e==="localhost"||e==="::1"||/^127(?:\.\d{1,3}){3}$/.test(e))&&(!e.startsWith("127.")||e.split(".").slice(1).every(t=>Number(t)<=255))))throw new Error("host must be a loopback address")}function uo(e){if(!e||["status","latest","opportunities"].some(t=>typeof e[t]!="function"))throw new Error("runtime must provide status(), latest(), and opportunities()")}function lo(e){typeof sr=="function"&&sr(e),X(e);let t=ir(e);if(Buffer.byteLength(t)>io)throw new Error("response too large");return t}function q(e,t,r){let n,o=t;try{n=lo(r)}catch{o=500,n=so}e.writeHead(o,{...ao,"content-length":Buffer.byteLength(n)}),e.end(n)}function ar({runtime:e,host:t=no,port:r=oo}={}){if(uo(e),typeof t!="string")throw new Error("host must be a loopback address");if(co(t),!Number.isInteger(r)||r<0||r>65535)throw new Error("port must be an integer between 0 and 65535");function n(){let c=e.status(),s=Number.isSafeInteger(c?.ticks)?c.ticks:0,p=typeof c?.lastProviderState?.status=="string"?c.lastProviderState.status:"UNKNOWN",m=c?.running===!0&&s>0&&c?.lastError==null&&p==="AVAILABLE";return{httpStatus:m?200:503,body:{ok:m,ready:m,service:"oracle-mev-shadow",mode:"shadow",execution:!1,signer:!1,broadcaster:!1,ticks:s,provider:p}}}let o=new Map([["/status",()=>e.status()],["/latest",()=>e.latest()],["/opportunities",()=>e.opportunities()]]);async function i(c,s){if(c.method!=="GET"){q(s,405,{error:"method-not-allowed"});return}let p;try{p=new URL(c.url||"/","http://localhost").pathname}catch{q(s,404,{error:"not-found"});return}if(p==="/health"){try{let A=n();q(s,A.httpStatus,A.body)}catch{q(s,503,{error:"redacted"})}return}let m=o.get(p);if(!m){q(s,404,{error:"not-found"});return}try{q(s,200,await m())}catch{q(s,500,{error:"redacted"})}}let a=ro((c,s)=>{i(c,s).catch(()=>{s.headersSent?s.destroy():q(s,500,{error:"redacted"})})}),u=null;function d(){let c=a.address();return c&&typeof c=="object"?{address:c.address,family:c.family,port:c.port}:null}function f(){return a.listening?Promise.resolve(d()):u||(u=new Promise((c,s)=>{let p=A=>{a.off("listening",m),u=null,s(A)},m=()=>{a.off("error",p);let A=d();u=null,c(A)};a.once("error",p),a.once("listening",m),a.listen(r,t)}),u)}async function l(){if(u)try{await u}catch{return!1}return a.listening?(await new Promise((c,s)=>a.close(p=>p?s(p):c())),!0):!1}return Object.freeze({start:f,stop:l,address:d,handler:i})}var ur=/^(?:0|[1-9][0-9]*)$/,ho=/^127(?:\.\d{1,3}){3}$/,go=(1n<<256n)-1n;function ye(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))ye(t);Object.freeze(e)}return e}function cr(e,t){let r=String(e??"").trim().toLowerCase();if(!["","0","false","off"].includes(r))throw new Error(`${t} must remain disarmed for the shadow service`)}function wo(e){return e==="localhost"||e==="::1"?!0:ho.test(e)?e.split(".").slice(1).every(t=>Number(t)<=255):!1}function K(e,t,r,{positive:n=!1}={}){let o=String(e[t]??r);if(!ur.test(o)||n&&o==="0"){let i=t.replace("ORACLE_MEV_SHADOW_","").toLowerCase();throw new TypeError(`${i} must be ${n?"a positive":"a non-negative"} decimal string`)}if(BigInt(o)>go){let i=t.replace("ORACLE_MEV_SHADOW_","").toLowerCase();throw new RangeError(`${i} must fit uint256`)}return o}function Ee(e,t,r,n,o,i){let a=String(e[t]??r);if(!ur.test(a))throw new TypeError(`${i} must be an integer`);let u=Number(a);if(!Number.isSafeInteger(u)||u<n||u>o)throw new TypeError(`${i} must be an integer from ${n} through ${o}`);return u}function bo(e=process.env){cr(e.ORACLE_EXECUTE_ENABLED,"ORACLE_EXECUTE_ENABLED"),cr(e.MAD_EXECUTE_ENABLED,"MAD_EXECUTE_ENABLED");let t=String(e.ORACLE_MEV_SHADOW_HOST??"127.0.0.1").trim();if(!wo(t))throw new Error("ORACLE_MEV_SHADOW_HOST must be loopback-only");let r=String(e.HOME||fo()),n=String(e.ORACLE_MEV_SHADOW_STATE??mo(r,".local/state/oracle/mev-shadow/observations.json"));if(!po(n))throw new Error("ORACLE_MEV_SHADOW_STATE must be an absolute path");let o=String(e.ORACLE_MEV_SHADOW_PERSIST??"1").trim();if(!["0","1"].includes(o))throw new Error("persist must be 0 or 1");return ye({host:t,port:Ee(e,"ORACLE_MEV_SHADOW_PORT","8808",0,65535,"port"),intervalMs:Ee(e,"ORACLE_MEV_SHADOW_INTERVAL_MS","15000",1e3,864e5,"intervalMs"),amountInWei:K(e,"ORACLE_MEV_SHADOW_AMOUNT_IN_WEI","10000000000000000",{positive:!0}),minProfitWei:K(e,"ORACLE_MEV_SHADOW_MIN_PROFIT_WEI","10000000000000"),maxLoanWei:K(e,"ORACLE_MEV_SHADOW_MAX_LOAN_WEI","250000000000000000",{positive:!0}),maxGasWei:K(e,"ORACLE_MEV_SHADOW_MAX_GAS_WEI","500000000000000"),builderFeeWei:K(e,"ORACLE_MEV_SHADOW_BUILDER_FEE_WEI","0"),extraCostWei:K(e,"ORACLE_MEV_SHADOW_EXTRA_COST_WEI","0"),extraGasUnits:K(e,"ORACLE_MEV_SHADOW_EXTRA_GAS_UNITS","250000"),maxBlockDrift:Ee(e,"ORACLE_MEV_SHADOW_MAX_BLOCK_DRIFT","5",0,1e3,"maxBlockDrift"),maxRecords:Ee(e,"ORACLE_MEV_SHADOW_MAX_RECORDS","500",1,1e5,"maxRecords"),filePath:n,persist:o==="1"})}function lr({env:e=process.env,runtimeFactory:t=rr,serverFactory:r=ar}={}){if(typeof t!="function"||typeof r!="function")throw new TypeError("runtimeFactory and serverFactory must be functions");let n=bo(e),o=t(n),i=r({runtime:o,host:n.host,port:n.port}),a=null,u=null;async function d(){return a||u||(u=(async()=>{let c=!1;try{await o.load();let s=await o.tick();o.start(),c=!0;let p=await i.start();return a=ye({mode:"shadow",execution:!1,signer:!1,broadcaster:!1,address:p,initialTick:s}),a}catch(s){try{await i.stop()}catch{}if(c)try{o.stop(),typeof o.drain=="function"&&await o.drain()}catch{}throw s}finally{u=null}})(),u)}async function f(){if(u)try{await u}catch{}if(!a)return!1;let c=null;try{await i.stop()}catch(s){c=s}if(o.stop(),typeof o.drain=="function"&&await o.drain(),a=null,c)throw c;return!0}function l(){return ye({mode:"shadow",execution:!1,signer:!1,broadcaster:!1,listening:!!a,address:i.address(),runtime:o.status()})}return Object.freeze({start:d,stop:f,status:l,config:n})}var Ae="oracle-mev-shadow";function xe(e,t){e.write(`${JSON.stringify(t)}
|
|
5
|
+
`)}async function fr({env:e=process.env,appFactory:t=lr,stdout:r=process.stdout,stderr:n=process.stderr,processLike:o=process}={}){if(typeof t!="function")throw new TypeError("appFactory must be a function");if(!r||typeof r.write!="function"||!n||typeof n.write!="function")throw new TypeError("stdout and stderr must be writable streams");if(!o||typeof o.once!="function")throw new TypeError("processLike must provide once()");let i=t({env:e}),a=null;async function u(l="shutdown"){return a||(a=(async()=>{try{return await i.stop(),xe(r,{event:"stopped",service:Ae,signal:l}),!0}catch{return o.exitCode=1,xe(n,{event:"fatal",service:Ae,error:"shutdown failed"}),!1}})(),a)}for(let l of["SIGINT","SIGTERM"])o.once(l,()=>{u(l).catch(()=>{o.exitCode=1})});let d;try{d=await i.start()}catch{throw o.exitCode=1,xe(n,{event:"fatal",service:Ae,error:"startup failed"}),new Error("shadow service failed to start")}let f=d?.address&&typeof d.address=="object"?d.address:{};return xe(r,{event:"listening",service:Ae,mode:"shadow",execution:!1,signer:!1,broadcaster:!1,address:f.address??null,family:f.family??null,port:f.port??null}),Object.freeze({app:i,stop:u})}var dr=process.argv.slice(2);(dr.includes("--help")||dr.includes("-h"))&&(process.stdout.write(`Usage: oracle-mev-shadow [--help]
|
|
6
|
+
Loopback-only Base MEV observer. Never prepares, signs, or broadcasts.
|
|
7
|
+
`),process.exit(0));fr().catch(()=>{process.exitCode=1});
|
package/dist/bin/oracle.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{realpathSync as T}from"node:fs";import{fileURLToPath as oe}from"node:url";import h from"node:fs";import g from"node:path";import{pathToFileURL as
|
|
2
|
+
import{realpathSync as T}from"node:fs";import{fileURLToPath as oe}from"node:url";import h from"node:fs";import g from"node:path";import{pathToFileURL as z}from"node:url";import d from"node:fs";import P from"node:os";import i from"node:path";import{fileURLToPath as $}from"node:url";var M=i.dirname($(import.meta.url)),l=i.resolve(M,"../..");function u(){return process.env.ORACLE_FAKE_HOME||P.homedir()}function R(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function f(){return R()?process.env.ORACLE_CONFIG_DIR||i.join(u(),".config","oracle"):i.join(u(),".config","oracle")}function I(){return i.join(f(),"exec.env")}function v(){return i.join(f(),"desk.json")}function k(){return i.join(f(),"env")}function p({force:e=!1}={}){if(p._done&&!e)return p._result||null;p._done=!0;let o={},n=(c,t)=>{if(t==null)return;let r=String(t).trim();r&&(process.env[c]!=null&&String(process.env[c]).trim()!==""||(process.env[c]=r,o[c]=r))};try{let c=k();if(d.existsSync(c))for(let t of d.readFileSync(c,"utf8").split(/\r?\n/)){let r=t.match(/^\s*([A-Z0-9_]+)\s*=\s*(.*?)\s*$/);if(!r||r[2].startsWith("#"))continue;let a=r[2];(a.startsWith('"')&&a.endsWith('"')||a.startsWith("'")&&a.endsWith("'"))&&(a=a.slice(1,-1)),n(r[1],a)}}catch{}try{let c=v();if(d.existsSync(c)){let t=JSON.parse(d.readFileSync(c,"utf8"));t&&typeof t=="object"&&(n("ORACLE_DESK_URL",t.deskUrl||t.dataUrl||t.url),n("ORACLE_DATA_URL",t.dataUrl||t.deskUrl||t.url),n("ORACLE_API_URL",t.apiUrl||t.dataUrl||t.deskUrl),n("ORACLE_PUBLIC_URL",t.publicUrl||t.deskUrl||t.dataUrl),n("ORACLE_EXEC_URL",t.execUrl),n("MAD_DESK_URL",t.deskUrl||t.dataUrl))}}catch{}let s=process.env.ORACLE_DESK_URL||process.env.ORACLE_DATA_URL||"";return s&&(n("ORACLE_DESK_URL",s),n("ORACLE_DATA_URL",s),n("ORACLE_API_URL",s),n("ORACLE_PUBLIC_URL",s),n("MAD_DESK_URL",s)),p._result=Object.keys(o).length?o:null,p._result}try{p()}catch{}function H(){return process.env.HERMES_HOME?i.resolve(process.env.HERMES_HOME):i.join(u(),".hermes")}function N(){return i.join(u(),".claude.json")}function F(e=process.cwd()){return i.join(e,".mcp.json")}function q(){return process.platform==="darwin"?i.join(u(),"Library","Application Support","Claude","claude_desktop_config.json"):i.join(u(),".config","Claude","claude_desktop_config.json")}function K(){return i.join(u(),".codex","config.toml")}function C(){return i.join(f(),"connectors")}function B(){return i.join(C(),"chatgpt-openapi.json")}function G(){return i.join(f(),"active-chain.json")}function y(e){let o=[i.join(l,"bin",e),i.join(l,"dist","bin",e),i.join(l,"..","bin",e)];return o.find(n=>d.existsSync(n))||o[0]}function V(e){return d.mkdirSync(e,{recursive:!0}),e}var j={homeDir:u,isPublicDesktop:R,oracleConfigDir:f,oracleExecEnvPath:I,oracleDeskJsonPath:v,oracleEnvFilePath:k,loadDeskRouting:p,hermesRoot:H,activeChainPath:G,claudeCodeUserConfigPath:N,claudeCodeProjectMcpPath:F,claudeDesktopConfigPath:q,codexConfigPath:K,chatgptConnectorDir:C,chatgptOpenApiPath:B,packageBin:y,ensureDir:V,PACKAGE_ROOT:l};import{execFile as J}from"node:child_process";import{existsSync as me,mkdirSync as he,readFileSync as W,realpathSync as ge,writeFileSync as ye}from"node:fs";import L from"node:path";import{promisify as Y}from"node:util";var Ae=Y(J);var _e=1440*60*1e3;function w(e,o){let n=t=>String(t).replace(/^v/,"").split("-")[0].split(".").map(r=>Number.parseInt(r,10)||0),s=n(e),c=n(o);for(let t=0;t<Math.max(s.length,c.length);t+=1){let r=s[t]??0,a=c[t]??0;if(r>a)return 1;if(r<a)return-1}return 0}function X(e){let o=e?.stateDir||L.join(process.env.HOME||".",".oracle");return L.join(o,"update-check.json")}function O(e){try{return JSON.parse(W(X(e),"utf8"))}catch{return null}}var Q="\u25C7 ORACLE // self-custody multichain agent control plane",Z=`START
|
|
3
3
|
oracle open the native Oracle chat (TTY)
|
|
4
4
|
oracle chat open chat explicitly
|
|
5
5
|
oracle setup connect a model and optional messaging
|
|
@@ -19,6 +19,7 @@ PREPARE
|
|
|
19
19
|
oracle swap unsigned route and wallet-signable calldata
|
|
20
20
|
oracle prepare build an unsigned swap (alias of route prepare)
|
|
21
21
|
oracle strategy draft|validate|backtest|optimize|evidence \xB7 shadow \xB7 prepare
|
|
22
|
+
oracle mev observe \xB7 status \xB7 control \xB7 operator (execute needs --execute)
|
|
22
23
|
|
|
23
24
|
LOCAL SIGNING (SELF-HOSTED)
|
|
24
25
|
oracle sign init|import|status|lock|doctor
|
|
@@ -42,17 +43,19 @@ BOUNDARY
|
|
|
42
43
|
Oracle ships armed local-signer surfaces for self-hosters. Hosted/keyless
|
|
43
44
|
access cannot move value without the operator's encrypted local signer.
|
|
44
45
|
Autonomous execution additionally requires ORACLE_AUTONOMOUS_TRADING=1.
|
|
46
|
+
MEV observe is read-only. Flash-loan execute needs ORACLE_MEV_EXECUTE_ENABLED=1
|
|
47
|
+
and literal --execute. There is no autonomous MEV loop.
|
|
45
48
|
Use oracle <command> --help for command details.
|
|
46
|
-
`;function
|
|
49
|
+
`;function U(){try{return JSON.parse(h.readFileSync(g.join(l,"package.json"),"utf8")).version||"0.0.0"}catch{return"0.0.0"}}function ee(){let e=g.join(l,"src","cli","commands");return h.existsSync(e)?e:g.join(l,"dist","cli","commands")}async function m(){let e=ee(),o=new Map;if(!h.existsSync(e))return o;let n=h.readdirSync(e).filter(s=>s.endsWith(".mjs")).sort();for(let s of n){let c=g.join(e,s);try{let r=(await import(z(c).href+`?t=${Date.now()}`)).default;if(!r||typeof r!="object"||typeof r.run!="function")continue;let a=r.name||s.replace(/\.mjs$/,""),A={...r,name:a,__file:c};o.set(a,A);for(let _ of Array.isArray(r.aliases)?r.aliases:[])o.set(_,{...A,name:_,aliasFor:a})}catch(t){process.env.ORACLE_CLI_DEBUG&&console.error(`oracle: failed loading command ${s}: ${t.message}`)}}return o}function te(e,o=O()){return!o?.latest||!e||w(o.latest,e)<=0?"":`
|
|
47
50
|
Update available: ${e} \u2192 ${o.latest}. Run 'oracle update'.
|
|
48
|
-
`}function
|
|
51
|
+
`}function E(e,o){let n=[];n.push(`${Q} (v${e})`),n.push(""),n.push(Z.trimEnd());let s=[];for(let c of o.values()){if(["help","version"].includes(c.name))continue;!new Set(["init","doctor","chat","model","auth","chain","setup","data","data-mcp","scan","route","prepare","swap","farm","follow","equities","strategy","mev","public","mcp","plugins","harness","clients","upgrade","bootstrap","eval","fees","sign","signer"]).has(c.name)&&c.summary&&s.push(` oracle ${c.name.padEnd(20)} ${c.summary}`)}return s.length&&(n.push(""),n.push("ADDITIONAL"),n.push(...s)),n.join(`
|
|
49
52
|
`)+`
|
|
50
53
|
`+te(e)}function S(e,o){let n=[...o.keys()].sort(),s=n.length?n.join(", "):"(none loaded yet)";return`oracle: unknown command '${e}'. Known: ${s}
|
|
51
54
|
Try: oracle --help
|
|
52
|
-
`}function
|
|
55
|
+
`}function x(e){return{argv:e,root:l,bin:y,paths:j}}async function D(e=[]){let o=U();if(e.includes("--version")||e.includes("-V"))return b();if(e[0]==="--help"||e[0]==="-h"){let r=await m();return process.stdout.write(E(o,r)),0}if(e.length===0){let r=await m();if(re(e)){let a=r.get("chat");if(a)return a.run(x([]))}return process.stdout.write(E(o,r)),0}if(ne(e[0])){let a=(await m()).get("chat");if(a)return a.run(x(e))}let n=e[0],s=e.slice(1);if(n==="version")return b();if(n==="help"){let r=await m();if(s[0]){let a=r.get(s[0]);return a?(process.stdout.write((a.usage||`oracle ${a.name}`)+`
|
|
53
56
|
`),a.summary&&process.stdout.write(a.summary+`
|
|
54
|
-
`),0):(process.stderr.write(S(s[0],r)),1)}return process.stdout.write(
|
|
57
|
+
`),0):(process.stderr.write(S(s[0],r)),1)}return process.stdout.write(E(o,r)),0}let c=await m(),t=c.get(n);if(t){if(s[0]==="--help"||s[0]==="-h")return process.stdout.write((t.usage||`oracle ${t.name}`)+`
|
|
55
58
|
`),t.summary&&process.stdout.write(t.summary+`
|
|
56
|
-
`),0;try{let r=await t.run(
|
|
57
|
-
`),1}}return process.stderr.write(S(n,c)),1}async function
|
|
58
|
-
`),0}function re(e=[],o={stdin:process.stdin,stdout:process.stdout}){return e.length!==0?!1:process.env.ORACLE_FORCE_CHAT==="1"?!0:o.stdin?.isTTY===!0&&o.stdout?.isTTY===!0}function ne(e){return["-m","--model","--provider","-q","--query","-Q","--quiet","-c","--continue","-r","--resume","-s","--skills","-t","--toolsets","--reasoning","--tui","--cli","--yolo","--checkpoints","--source","--max-turns"].includes(String(e||""))}var
|
|
59
|
+
`),0;try{let r=await t.run(x(s));return typeof r=="number"?r:0}catch(r){return process.stderr.write(`oracle ${n}: ${r?.message||r}
|
|
60
|
+
`),1}}return process.stderr.write(S(n,c)),1}async function b(){let e=U();return process.stdout.write(`oracle ${e}
|
|
61
|
+
`),0}function re(e=[],o={stdin:process.stdin,stdout:process.stdout}){return e.length!==0?!1:process.env.ORACLE_FORCE_CHAT==="1"?!0:o.stdin?.isTTY===!0&&o.stdout?.isTTY===!0}function ne(e){return["-m","--model","--provider","-q","--query","-Q","--quiet","-c","--continue","-r","--resume","-s","--skills","-t","--toolsets","--reasoning","--tui","--cli","--yolo","--checkpoints","--source","--max-turns"].includes(String(e||""))}var Ue=Object.freeze({data:"./desk-server.mjs",public:"./oracle-public-server.mjs","data-mcp":"./oracle-data-mcp.mjs",init:"./oracle-init.mjs",upgrade:"./oracle-upgrade.mjs",scan:"./oracle-scan.mjs",route:"./oracle-route.mjs",equities:"./oracle-equities.mjs"});function se(){if(!process.argv[1])return!1;try{return T(oe(import.meta.url))===T(process.argv[1])}catch{return!1}}async function ae(e=process.argv.slice(2)){return D(e)}if(se()){let e=await ae();process.exit(typeof e=="number"?e:0)}export{Ue as COMMANDS,ae as main};
|