@oracle-agent/oracle 0.35.21 → 0.35.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -1
- package/dist/agent-lifecycle.mjs +3 -0
- package/dist/assets/skills/oracle-desk-product/SKILL.md +1 -1
- package/dist/bin/desk-server.mjs +36 -36
- package/dist/bin/oracle-mev-arb-shadow.mjs +4 -4
- package/dist/bin/oracle-mev-shadow.mjs +6 -6
- package/dist/bin/oracle-route.mjs +11 -11
- package/dist/bin/oracle-scan.mjs +15 -15
- package/dist/bin/oracle.mjs +19 -10
- package/dist/cli/commands/chat.mjs +1 -1
- package/dist/cli/commands/context.mjs +16 -0
- package/dist/cli/commands/doctor.mjs +5 -5
- package/dist/cli/commands/eval.mjs +89 -89
- package/dist/cli/commands/lifecycle.mjs +17 -0
- package/dist/cli/commands/model.mjs +1 -1
- package/dist/cli/commands/quickstart.mjs +5 -5
- package/dist/cli/commands/sign.mjs +1 -1
- package/dist/cli/commands/signer.mjs +22 -22
- package/dist/cli/commands/snipe.mjs +4 -4
- package/dist/cli/commands/swap.mjs +4 -4
- package/dist/cli/commands/venues.mjs +2 -2
- package/dist/context-graph.mjs +3 -0
- package/dist/data/desk-data.mjs +34 -34
- package/dist/data/providers/lp-destination-discovery.mjs +6 -0
- package/dist/data/providers/lp-liquidity-ranker.mjs +1 -0
- package/dist/index.mjs +50 -48
- package/dist/local-signer/anvil-attestation-worker.mjs +1 -1
- package/dist/local-signer/runtime.mjs +1 -1
- package/dist/router/index.mjs +3 -3
- package/dist/router/prepare-bridge.mjs +2 -2
- package/dist/scanner/index.mjs +4 -4
- package/dist/tenant-rbac.mjs +1 -1
- package/dist/workflow-telemetry.mjs +1 -1
- package/package.json +5 -1
- package/public/eval-report.json +1 -1
- package/public/oracle-splash/brand/liquidlaunch.webp +0 -0
- package/public/oracle-splash/brand/markets.webp +0 -0
- package/public/oracle-splash/brand/motion.webp +0 -0
- package/public/oracle-splash/brand/nest.webp +0 -0
- package/public/oracle-splash/brand/outcome.webp +0 -0
- package/public/oracle-splash/brand/silhouette.webp +0 -0
- package/public/oracle-splash/brand/tradexyz.webp +0 -0
- package/public/oracle-splash/index.html +9 -9
- package/server.json +2 -2
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import{readFileSync as We}from"node:fs";import{homedir as $t}from"node:os";import{join as qt}from"node:path";import{createHash as Ke}from"node:crypto";var G=1,B=1,Qe=1,ye="local-owner",me="local-owner",et=Object.freeze(["owner","operator","agent","viewer"]),tt=Object.freeze(["tenant","config","policy","grant","workflow","trade","receipt","audit","telemetry","context","lifecycle"]),ge=Object.freeze({read:"read",create:"create",update:"update",delete:"delete",manage:"manage",prepare:"prepare",cancel:"cancel",export:"export",approve:"approve"}),nt=Object.freeze(["owner"]),T=Object.freeze({ALLOW_ROLE_PERMISSION:"allow.role_permission",DENY_MISSING_CONTEXT:"deny.missing_context",DENY_INVALID_CONTEXT:"deny.invalid_context",DENY_INVALID_REQUEST:"deny.invalid_request",DENY_UNKNOWN_RESOURCE:"deny.unknown_resource",DENY_UNKNOWN_ACTION:"deny.unknown_action",DENY_UNBOUND_OBJECT:"deny.unbound_object",DENY_TENANT_MISMATCH:"deny.tenant_mismatch",DENY_RESOURCE_MISMATCH:"deny.resource_mismatch",DENY_ROLE_PERMISSION:"deny.role_permission",DENY_POLICY_NOT_APPROVER:"deny.policy_not_approver"}),Se=new Set(et),ie=new Set(tt),rt=new Set(Object.values(ge)),Ie=new Set(["user","service","local-owner"]),Ee=new Set(["verified-session","service-credential","desktop-session","owner-arm-token","local-owner"]),Z=/^[A-Za-z0-9][A-Za-z0-9._:@-]{0,127}$/,be="tob1",Oe=new WeakSet,ot=new WeakMap,Ne=Object.freeze({owner:Object.freeze(["tenant:read","tenant:manage","config:read","config:manage","policy:read","policy:manage","grant:read","grant:create","grant:update","grant:delete","grant:manage","workflow:read","workflow:create","workflow:update","workflow:delete","workflow:cancel","workflow:approve","trade:read","trade:prepare","receipt:read","receipt:export","audit:read","audit:export","telemetry:read","telemetry:create","telemetry:export","context:read","context:create","context:update","context:delete","context:manage","context:export","lifecycle:read","lifecycle:create","lifecycle:update","lifecycle:delete","lifecycle:manage","lifecycle:approve","lifecycle:export"]),operator:Object.freeze(["tenant:read","config:read","policy:read","grant:read","workflow:read","workflow:create","workflow:update","workflow:cancel","trade:read","trade:prepare","receipt:read","audit:read","telemetry:read","telemetry:create","context:read","context:create","context:update","context:delete","lifecycle:read","lifecycle:create","lifecycle:update","lifecycle:manage"]),agent:Object.freeze(["tenant:read","config:read","policy:read","grant:read","workflow:read","workflow:create","workflow:update","trade:read","trade:prepare","receipt:read","telemetry:create","context:read","context:create","context:update","lifecycle:read"]),viewer:Object.freeze(["tenant:read","config:read","grant:read","workflow:read","trade:read","receipt:read","audit:read","telemetry:read","context:read","lifecycle:read"])}),Yt=Object.freeze(Object.fromEntries(Object.entries(Ne).map(([e,n])=>[e,Object.freeze([...n])]))),v=class extends Error{constructor(n,t="invalid-context"){super(n),this.name="TenantContextError",this.code=t}};function re(e){return!!e&&typeof e=="object"&&!Array.isArray(e)&&Object.getPrototypeOf(e)===Object.prototype}function W(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let n of Object.values(e))W(n)}return e}function oe(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(oe).join(",")}]`:`{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${oe(e[n])}`).join(",")}}`}function _e(e){return Ke("sha256").update(oe(e)).digest("hex")}function he(e,n,t){if(!re(e))throw new v(`${t} must be a plain object`);let r=Object.keys(e).filter(o=>!n.has(o));if(r.length)throw new v(`${t} has unknown fields: ${r.sort().join(", ")}`)}function we(e,n){let t=String(e??"").trim();if(!Z.test(t))throw new v(`${n} is invalid`);return t}function ve(e,n="assignedRoles"){if(!Array.isArray(e)||e.length===0)throw new v(`${n} must contain at least one trusted role`,"missing-role-assignment");let t=[...new Set(e.map(o=>String(o??"").trim()))].sort(),r=t.filter(o=>!Se.has(o));if(r.length)throw new v(`${n} contains unknown roles: ${r.join(", ")}`,"unknown-role");return t}function Te(e,n){return e.length===n.length&&e.every((t,r)=>t===n[r])}function it(e){if(!re(e)||e.schemaVersion!==G||!Z.test(e.tenantId||"")||typeof e.localCompatibility!="boolean")return!1;let n=e.actor;if(!re(n)||n.schemaVersion!==B||!Z.test(n.actorId||"")||!Ie.has(n.actorType)||!Ee.has(n.authSource)||!Array.isArray(n.roles)||n.roles.length===0)return!1;let t=[...new Set(n.roles)].sort();return t.every(r=>Se.has(r))&&Te(t,n.roles)}function st(e,{assignedTenantId:n,assignedActorId:t,assignedActorType:r,assignedAuthSource:o,assignedRoles:i,assignedContextDomains:a=null,localCompatibility:l=!1}={}){let E=e;if(he(E,new Set(["schemaVersion","tenantId","actor","localCompatibility"]),"tenant claims"),E.schemaVersion!=null&&E.schemaVersion!==G)throw new v("unsupported tenant context schema version","unsupported-version");if(![n,t,r,o].every(O=>O!=null))throw new v("trusted tenant and actor identity assignments are required","missing-trusted-identity");let A=E.actor??{};if(he(A,new Set(["schemaVersion","actorId","actorType","authSource","roles"]),"actor claims"),A.schemaVersion!=null&&A.schemaVersion!==B)throw new v("unsupported actor identity schema version","unsupported-version");let x=we(n,"tenantId"),$=we(t,"actorId"),q=String(r).trim(),M=String(o).trim();if(!Ie.has(q))throw new v("actorType is invalid");if(!Ee.has(M))throw new v("authSource is invalid");let D=ve(i);if(!Array.isArray(a)&&a!=null)throw new v("assignedContextDomains must be an array","invalid-domain-assignment");let z=a==null?D.includes("owner")?["*"]:[]:[...new Set(a.map(O=>String(O??"").trim()))].sort();if(z.some(O=>O!=="*"&&!/^[a-z0-9][a-z0-9._-]{0,95}$/.test(O)))throw new v("assignedContextDomains contains an invalid domain","invalid-domain-assignment");if(A.roles!==void 0){let O;try{O=ve(A.roles,"claimed roles")}catch{throw new v("claimed roles do not match the trusted assignment","forged-role")}if(!Te(O,D))throw new v("claimed roles do not match the trusted assignment","forged-role")}if(E.localCompatibility!==void 0&&E.localCompatibility!==l)throw new v("local compatibility may only be set by the trusted boundary","forged-local-compatibility");if([[E.tenantId,x],[A.actorId,$],[A.actorType,q],[A.authSource,M]].some(([O,te])=>O!==void 0&&String(O).trim()!==te))throw new v("claimed identity does not match the trusted assignment","forged-identity");let L=W({schemaVersion:G,tenantId:x,actor:{schemaVersion:B,actorId:$,actorType:q,authSource:M,roles:D},localCompatibility:l===!0});return Oe.add(L),ot.set(L,Object.freeze(z)),L}function ke({authSource:e="local-owner"}={}){if(!new Set(["local-owner","desktop-session","owner-arm-token"]).has(e))throw new v("local owner authSource is invalid");return st({schemaVersion:G,tenantId:ye,actor:{schemaVersion:B,actorId:me,actorType:"local-owner",authSource:e}},{assignedTenantId:ye,assignedActorId:me,assignedActorType:"local-owner",assignedAuthSource:e,assignedRoles:["owner"],localCompatibility:!0})}function J(e){return Oe.has(e)&&it(e)}function at(e){if(!J(e))throw new v("a resolved tenant context is required","unresolved-context");return e}function F(e){return Buffer.from(e,"utf8").toString("base64url")}function ne(e,n){if(!e||!/^[A-Za-z0-9_-]+$/.test(e))throw new v(`${n} binding is invalid`,"invalid-object-binding");let t=Buffer.from(e,"base64url").toString("utf8");if(!t||F(t)!==e)throw new v(`${n} binding is non-canonical`,"invalid-object-binding");return t}function Re(e){let n=String(e??"").trim();if(!n||n.length>256||/[\u0000-\u001f\u007f]/.test(n))throw new v("objectId is invalid","invalid-object-id");return n}function xe(e,n,t){at(e);let r=String(n??"").trim();if(!ie.has(r))throw new v("resource is unknown","unknown-resource");let o=Re(t);return`${be}.${F(e.tenantId)}.${F(r)}.${F(o)}`}function ct(e){let n=String(e??""),t=n.split(".");if(t.length!==4||t[0]!==be)throw new v("tenant-bound object id required","unbound-object");let r=ne(t[1],"tenant"),o=ne(t[2],"resource"),i=ne(t[3],"object");if(!Z.test(r)||!ie.has(o))throw new v("tenant-bound object id is invalid","invalid-object-binding");return Re(i),W({schemaVersion:1,tenantId:r,resource:o,objectId:i,boundId:n})}function dt(e){if(typeof e!="string"||!/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/.test(e))return null;let n=Date.parse(e);return Number.isFinite(n)&&new Date(n).toISOString()===e?e:null}function Ae(e){let n={...e,decisionId:_e(e)};return W(n)}function lt({context:e,resource:n,action:t,objectId:r=null,decidedAt:o}={}){let i=dt(o),a={schemaVersion:Qe,recordType:"tenant.access-decision",decidedAt:i,tenantId:J(e)?e.tenantId:null,actor:J(e)?{actorId:e.actor.actorId,actorType:e.actor.actorType,authSource:e.actor.authSource,roles:[...e.actor.roles]}:null,request:{resource:typeof n=="string"?n:null,action:typeof t=="string"?t:null,objectRefHash:r==null?null:_e(String(r))}},l=S=>Ae({...a,allowed:!1,outcome:"deny",reason:S});if(e==null)return l(T.DENY_MISSING_CONTEXT);if(!J(e))return l(T.DENY_INVALID_CONTEXT);if(!i)return l(T.DENY_INVALID_REQUEST);if(!ie.has(n))return l(T.DENY_UNKNOWN_RESOURCE);if(!rt.has(t))return l(T.DENY_UNKNOWN_ACTION);if(r!=null){let S;try{S=ct(r)}catch{return l(T.DENY_UNBOUND_OBJECT)}if(S.tenantId!==e.tenantId)return l(T.DENY_TENANT_MISMATCH);if(S.resource!==n)return l(T.DENY_RESOURCE_MISMATCH)}if(t===ge.approve&&!e.actor.roles.some(A=>nt.includes(A)))return l(T.DENY_ROLE_PERMISSION);let E=`${n}:${t}`,_=e.actor.roles.some(S=>Ne[S]?.includes(E));return Ae({...a,allowed:_,outcome:_?"allow":"deny",reason:_?T.ALLOW_ROLE_PERMISSION:T.DENY_ROLE_PERMISSION})}function Ce(e){let n=lt(e);if(!n.allowed){let t=new v(`tenant access denied: ${n.reason}`,"access-denied");throw t.decision=n,t}return n}import{createHash as ut,randomUUID as ft}from"node:crypto";import{chmodSync as pt,closeSync as K,constants as H,existsSync as se,fsyncSync as ae,lstatSync as De,mkdirSync as je,openSync as ce,readFileSync as yt,renameSync as mt,unlinkSync as de,writeFileSync as ze}from"node:fs";import{dirname as Le,resolve as $e}from"node:path";function le(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(le).join(",")}]`:`{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${le(e[n])}`).join(",")}}`}function C(e){return ut("sha256").update(le(e)).digest("hex")}function k(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let n of Object.values(e))k(n)}return e}function ht(e,n,t){let r=$e(e),o=Le(r);if(je(o,{recursive:!0,mode:448}),se(r)){let a=De(r);if(!a.isFile()||a.isSymbolicLink())throw t("state path must be a regular non-symlink file","unsafe-file")}let i=`${r}.${ft()}.tmp`;try{ze(i,`${JSON.stringify(n)}
|
|
2
|
+
`,{encoding:"utf8",mode:384,flag:"wx"});let a=ce(i,H.O_RDONLY);try{ae(a)}finally{K(a)}mt(i,r),pt(r,384);let l;try{l=ce(o,H.O_RDONLY),ae(l)}finally{l!==void 0&&K(l)}}catch(a){try{se(i)&&de(i)}catch{}throw a}}function wt(e,n,t){if(!e||typeof e!="object"||Array.isArray(e))throw t("state must be an object","integrity-failed");if(e.schemaVersion!==n||!Array.isArray(e.events))throw t("state schema is invalid","integrity-failed");let r=null;for(let a=0;a<e.events.length;a+=1){let l=e.events[a];if(!l||typeof l!="object"||Array.isArray(l))throw t("event is invalid","integrity-failed");if(l.record&&typeof l.record.recordHash=="string"){let{recordHash:S,...A}=l.record;if(C(A)!==S)throw t("record hash integrity failed; state may be tampered","integrity-failed")}let{eventHash:E,..._}=l;if(l.sequence!==a+1||l.previousEventHash!==r||C(_)!==E)throw t("event hash chain integrity failed; state may be tampered","integrity-failed");r=E}let{stateHash:o,...i}=e;if(C(i)!==o)throw t("state hash integrity failed; state may be tampered","integrity-failed");return e}function X(e,n,t){if(!se(e)){let i={schemaVersion:n,events:[]};return{...i,stateHash:C(i)}}let r=De(e);if(!r.isFile()||r.isSymbolicLink())throw t("state path must be a regular non-symlink file","unsafe-file");if((r.mode&511)!==384)throw t("state file permissions must be 0600","unsafe-permissions");let o;try{o=JSON.parse(yt(e,"utf8"))}catch{throw t("state JSON is malformed","integrity-failed")}return wt(o,n,t)}function vt(e,n,t){let r=`${e}.lock`,o;try{o=ce(r,H.O_CREAT|H.O_EXCL|H.O_WRONLY,384),ze(o,`${JSON.stringify({pid:process.pid,createdAt:new Date().toISOString()})}
|
|
3
|
+
`,"utf8"),ae(o)}catch(i){if(o!==void 0){K(o);try{de(r)}catch{}}throw i?.code==="EEXIST"?n("state is locked by another writer","state-locked"):i}try{return t()}finally{try{K(o)}finally{de(r)}}}function qe({path:e,schemaVersion:n,fail:t}){if(typeof e!="string"||e.length<1||e.length>4096)throw t("bounded state path required","invalid-path");if(typeof t!="function")throw new TypeError("fail factory required");let r=$e(e);je(Le(r),{recursive:!0,mode:448});let o=X(r,n,t);function i(){let l={schemaVersion:n,events:o.events};o={...l,stateHash:C(l)},ht(r,o,t)}function a({tenantId:l,recordType:E,recordId:_,operation:S,occurredAt:A,record:x,expectedRecordHash:$=null}){return vt(r,t,()=>{if(o=X(r,n,t),(([...o.events].reverse().find(U=>U.record?.boundId===x?.boundId)??null)?.record?.recordHash??null)!==$)throw t("record changed concurrently; retry from current state","state-conflict");if(x&&typeof x.recordHash=="string"){let{recordHash:U,...L}=x;if(C(L)!==U)throw t("record hash is inconsistent","integrity-failed")}let D={sequence:o.events.length+1,previousEventHash:o.events.at(-1)?.eventHash??null,tenantId:l,recordType:E,recordId:_,operation:S,occurredAt:A,record:x},z=k({...D,eventHash:C(D)});return o={...o,events:[...o.events,z]},i(),z})}return Object.freeze({append:a,events:()=>(o=X(r,n,t),o.events.map(l=>structuredClone(l))),verify:()=>{try{return o=X(r,n,t),{ok:!0,count:o.events.length,stateHash:o.stateHash}}catch(l){return{ok:!1,reason:l?.code||"integrity-failed"}}},path:r})}var At=Object.freeze([/(?:^|\s)Bearer\s+\S+/i,/-----BEGIN [A-Z ]*PRIVATE KEY-----/i,/\b(?:sk-|xprv|gh[pousr]_|github_pat_|AKIA|ASIA)[A-Za-z0-9_/-]{12,}\b/i,/\beyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\b/,/\b(?:0x)?[0-9a-f]{64}\b/i,/(?<![1-9A-HJ-NP-Za-km-z])[59KLc][1-9A-HJ-NP-Za-km-z]{50,51}(?![1-9A-HJ-NP-Za-km-z])/,/(?<![1-9A-HJ-NP-Za-km-z])[1-9A-HJ-NP-Za-km-z]{64,88}(?![1-9A-HJ-NP-Za-km-z])/]),gt=new Set(["apikey","key","token","accesstoken","secret","password","passwd","auth","authorization","bearer","signertoken","credential","credentials","clientsecret","privatekey","xapikey","accesskey","refreshtoken"]),St=Object.freeze(["apikey","accesskey","privatekey","clientsecret","accesstoken","refreshtoken","signertoken","credential","password","passwd","authorization","bearer","secret","token"]);function It(e){return String(e??"").replace(/[^a-z0-9]/gi,"").toLowerCase()}function Et(e){let n;try{n=new URL(e)}catch{return!1}if(n.username||n.password)return!0;for(let t of n.searchParams.keys()){let r=It(t);if(gt.has(r)||St.some(o=>r.includes(o)))return!0}return!1}function Me(e){try{let n=decodeURIComponent(e);return n===e?null:n}catch{return null}}var bt=/[a-z][a-z0-9+.-]{1,15}(?::\/\/|%3a%2f%2f)\S+/gi;function Ot(e){return e.replace(/[),.;:!?'"\]}]+$/,"")}function Nt(e){let n=e.match(bt)||[];for(let t of n){let r=Ot(t),o=Me(r),i=o?Me(o):null;for(let a of[r,o,i])if(a&&Et(a))return!0}return!1}function ue(e){return typeof e!="string"||e.length===0?!1:At.some(n=>n.test(e))?!0:Nt(e)}var _t="oracle.agent-lifecycle/1",Tt="oracle.agent-lifecycle-state/1",kt=Object.freeze(["agent","tool","workflow","credential"]),Rt=Object.freeze(["active","quarantined","retired","pending_reactivation"]),Q=Object.freeze({inactivityMs:2160*60*60*1e3,maxEvalAgeMs:720*60*60*1e3}),xt=50,Ue=100,Ye=new Set(kt),Ge=/^[A-Za-z0-9][A-Za-z0-9._:@/-]{0,127}$/,Ct=512,Pe=300*1e3,Dt=["authorization","apikey","accesskey","cookie","password","passphrase","secret","token","privatekey","seed","mnemonic","keystore","signature"],fe=class extends Error{constructor(n,t="invalid-agent-lifecycle"){super(`agent-lifecycle: ${n}`),this.name="AgentLifecycleError",this.code=t}};function f(e,n){return new fe(e,n)}function j(e,n){if(typeof e!="string")throw f(`${n} must be an ISO timestamp`,"invalid-time");let t=Date.parse(e);if(!Number.isFinite(t)||new Date(t).toISOString()!==e)throw f(`${n} must be an ISO timestamp`,"invalid-time");return e}function b(e,n){let t=String(e??"").trim();if(ue(t))throw f(`${n} contains secret-shaped material`,"secret-material");if(!Ge.test(t))throw f(`${n} is invalid`,"invalid-id");return t}function V(e,n,{required:t=!0}={}){let r=String(e??"").trim();if(t&&!r||r.length>Ct||/[\u0000-\u001f\u007f]/.test(r)||ue(r))throw f(`${n} is invalid or contains secret-shaped material`,"invalid-text");return r}function jt(e={}){if(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)throw f("metadata must be a plain object","invalid-metadata");let n=Object.keys(e).sort();if(n.length>24)throw f("metadata field limit exceeded","metadata-limit");let t={};for(let r of n){if(!/^[A-Za-z][A-Za-z0-9_.-]{0,47}$/.test(r))throw f(`metadata key ${r} is invalid`,"invalid-metadata");let o=r.replace(/[^a-z0-9]/gi,"").toLowerCase();if(Dt.some(a=>o.includes(a)))throw f(`metadata key ${r} is forbidden because it may contain a secret`,"secret-material");let i=e[r];if(typeof i=="string")t[r]=V(i,`metadata.${r}`,{required:!1});else if(typeof i=="boolean"||i===null)t[r]=i;else if(typeof i=="number"&&Number.isFinite(i))t[r]=i;else throw f(`metadata.${r} must be a scalar`,"invalid-metadata")}return t}function He(e=[]){if(!Array.isArray(e)||e.length>32)throw f("credentialRefs must be a bounded array","invalid-credentials");let n=new Set;return e.map(t=>{if(!t||typeof t!="object"||Array.isArray(t))throw f("credential reference is invalid","invalid-credentials");let r=Object.keys(t).filter(i=>!["ref","expiresAt"].includes(i));if(r.length)throw f(`credential reference has unknown fields: ${r.sort().join(", ")}`,"invalid-credentials");let o=b(V(t.ref,"credential ref"),"credential ref");if(n.has(o))throw f("credential references must be unique","invalid-credentials");return n.add(o),{ref:o,expiresAt:j(t.expiresAt,"credential expiresAt")}}).sort((t,r)=>t.ref.localeCompare(r.ref))}function zt(e={}){let n=e.inactivityMs??Q.inactivityMs,t=e.maxEvalAgeMs??Q.maxEvalAgeMs;if(!Number.isSafeInteger(n)||n<1440*60*1e3||n>3660*24*60*60*1e3)throw f("policy.inactivityMs is invalid","invalid-policy");if(!Number.isSafeInteger(t)||t<1||t>3660*24*60*60*1e3)throw f("policy.maxEvalAgeMs is invalid","invalid-policy");return{inactivityMs:n,maxEvalAgeMs:t}}function Ve(e){let n=e==null||e===""?xt:Number(e);if(!Number.isSafeInteger(n)||n<1||n>Ue)throw f(`limit must be an integer from 1 to ${Ue}`,"invalid-limit");return n}function Be(e){return Buffer.from(JSON.stringify(e),"utf8").toString("base64url")}function Lt(e,n){if(typeof e!="string"||e.length<1||e.length>2048||!/^[A-Za-z0-9_-]+$/.test(e))throw f("cursor is invalid","invalid-cursor");let t;try{t=JSON.parse(Buffer.from(e,"base64url").toString("utf8"))}catch{throw f("cursor is invalid","invalid-cursor")}let r=t&&typeof t=="object"&&!Array.isArray(t)?Object.keys(t).sort():[],o=["after","checkedAt","entityType","kind","sequence","status","tenantId","version"].sort();if(JSON.stringify(r)!==JSON.stringify(o)||t.version!==1||t.kind!==n.kind||t.tenantId!==n.tenantId||t.entityType!==n.entityType||t.status!==n.status||!Number.isSafeInteger(t.sequence)||t.sequence<0||t.sequence>n.headSequence||typeof t.after!="string"||!Ge.test(t.after)||Be(t)!==e)throw f("cursor does not match this lifecycle query","invalid-cursor");try{j(t.checkedAt,"cursor checkedAt")}catch{throw f("cursor is invalid","invalid-cursor")}if(Date.parse(t.checkedAt)>Date.parse(n.authorizedAt))throw f("cursor timestamp is in the future","invalid-cursor");return t}function Je(e){let n=new Map;for(let t of e)n.set(`${t.tenantId}\0${t.recordId}`,t.record);return n}function Fe(e,{at:n=new Date().toISOString(),inactivityMs:t=Q.inactivityMs,maxEvalAgeMs:r=Q.maxEvalAgeMs}={}){let o=j(n,"at"),i=Date.parse(o),a=[];if(e.latestEval&&(e.latestEval.passed===!1||e.latestEval.score<e.latestEval.threshold)&&a.push("eval-below-threshold"),e.latestEval?.passed===!0&&i-Date.parse(e.latestEval.evaluatedAt)>r&&a.push("eval-stale"),(e.credentialRefs||[]).some(E=>Date.parse(E.expiresAt)<=i)&&a.push("credential-expired"),e.entityType==="credential"&&e.expiresAt&&Date.parse(e.expiresAt)<=i&&a.push("credential-expired"),a.length)return k({status:"quarantined",reasons:a.sort(),evaluatedAt:o});let l=e.lastUsedAt??e.registeredAt;return i-Date.parse(l)>=t?k({status:"retired",reasons:["inactive"],evaluatedAt:o}):k({status:"active",reasons:[],evaluatedAt:o})}function Ze({path:e,now:n=()=>new Date().toISOString(),policy:t={}}={}){let r=zt(t),o=qe({path:e,schemaVersion:Tt,fail:f});function i(){return j(n(),"now")}function a(s,y,p=i()){return Ce({context:s,resource:"lifecycle",action:y,decidedAt:p})}function l(s,y){return Je(o.events()).get(`${s.tenantId}\0${y}`)??null}function E({context:s,kind:y,cursor:p,checkedAt:d,entityType:u=null,status:c=null}){let m=o.events(),h=m.at(-1)?.sequence??0,g=p==null?null:Lt(p,{kind:y,tenantId:s.tenantId,entityType:u,status:c,headSequence:h,authorizedAt:d}),w=g?.sequence??h,I=g?.checkedAt??d,Y=g?.after??null;return{records:[...Je(m.filter(N=>N.sequence<=w)).values()].filter(N=>N.tenantId===s.tenantId).filter(N=>u==null||N.entityType===u).sort((N,P)=>N.entityId.localeCompare(P.entityId)).filter(N=>Y==null||N.entityId.localeCompare(Y)>0),sequence:w,checkedAt:I}}function _({items:s,hasMore:y,lastEntityId:p,kind:d,context:u,entityType:c=null,status:m=null,sequence:h,checkedAt:g}){let w=y?Be({version:1,kind:d,tenantId:u.tenantId,entityType:c,status:m,sequence:h,checkedAt:g,after:p}):null;return k({items:s,nextCursor:w,sequence:h})}function S(s,y){let p=Fe(s,{at:y,...r}),d=["quarantined","retired","pending_reactivation"].includes(s.status)&&p.status==="active",u=d?s.status:p.status,c=d?[...s.reasons||[]]:[...p.reasons];return k({...structuredClone(s),status:u,reasons:c,evaluatedAt:p.evaluatedAt})}function A(s,y,p,d=i()){let u=p.recordHash??null,c={...p};delete c.recordHash;let m=k({...c,recordHash:C(c)});return o.append({tenantId:s.tenantId,recordType:"lifecycle",recordId:m.entityId,operation:y,occurredAt:d,record:m,expectedRecordHash:u}),m}function x({context:s,input:y}={}){let p=i();a(s,"create",p);let d=b(y?.entityId,"entityId");if(l(s,d))throw f("entity already exists","duplicate-entity");let u=String(y?.entityType??"").trim();if(!Ye.has(u))throw f("entityType is invalid","invalid-entity-type");let c=He(y?.credentialRefs);if(u==="credential"&&c.length)throw f("credential entities cannot contain credentialRefs","invalid-credentials");let m=u==="credential"?j(y?.expiresAt,"expiresAt"):null,h=c.some(I=>Date.parse(I.expiresAt)<=Date.parse(p))||m!=null&&Date.parse(m)<=Date.parse(p),g=b(y?.ownerActorId,"ownerActorId"),w=b(s.actor.actorId,"registering actorId");if(!s.actor.roles.includes("owner")&&g!==w)throw f("only an owner may assign lifecycle ownership to another actor","owner-assignment-required");return A(s,"register",{schemaVersion:_t,tenantId:s.tenantId,boundId:xe(s,"lifecycle",d),entityId:d,entityType:u,label:V(y?.label,"label"),ownerActorId:g,registeredBy:w,credentialRefs:c,expiresAt:m,metadata:jt(y?.metadata),status:h?"quarantined":"active",reasons:h?["credential-expired"]:[],registeredAt:p,updatedAt:p,lastUsedAt:null,latestEval:null,reactivation:null,revision:1},p)}function $({context:s,entityId:y}={}){let p=i();a(s,"read",p);let d=l(s,b(y,"entityId"));return d?S(d,p):null}function q({context:s,entityType:y=null,status:p=null,limit:d=null,cursor:u=null}={}){let c=i();if(a(s,"read",c),y!=null&&!Ye.has(y))throw f("entityType is invalid","invalid-entity-type");if(p!=null&&!Rt.includes(p))throw f("status is invalid","invalid-status");let m=Ve(d),h=E({context:s,kind:"list",cursor:u,checkedAt:c,entityType:y,status:p}),g=h.records.map(I=>S(I,h.checkedAt)).filter(I=>p==null||I.status===p),w=g.slice(0,m).map(I=>k(structuredClone(I)));return _({items:w,hasMore:g.length>m,lastEntityId:w.at(-1)?.entityId??null,kind:"list",context:s,entityType:y,status:p,sequence:h.sequence,checkedAt:h.checkedAt})}function M({context:s,entityId:y,outcome:p,occurredAt:d=null}={}){let u=i();a(s,"update",u);let c=l(s,b(y,"entityId"));if(!c)throw f("entity not found","not-found");let m=new Set(["succeeded","failed","denied","cancelled","skipped"]),h=String(p??"").trim();if(!m.has(h))throw f("usage outcome is invalid","invalid-outcome");let g=j(d??u,"occurredAt"),w=S(c,u);if(w.status!=="active")throw(w.status!==c.status||JSON.stringify(w.reasons)!==JSON.stringify(c.reasons||[]))&&A(s,"usage-denied",{...c,status:w.status,reasons:[...w.reasons],evaluatedAt:w.evaluatedAt,updatedAt:u,revision:c.revision+1},u),f(`entity is not active: ${w.status}`,"entity-not-active");if(Date.parse(g)>Date.parse(u)+Pe)throw f("occurredAt is too far in the future","future-usage");if(c.lastUsedAt&&Date.parse(g)<Date.parse(c.lastUsedAt))throw f("occurredAt must be monotonic","non-monotonic-usage");return A(s,"usage",{...c,lastUsedAt:g,lastOutcome:h,updatedAt:u,revision:c.revision+1},u)}function D({context:s,entityId:y,suite:p,score:d,threshold:u,evaluatedAt:c=null}={}){let m=i();a(s,"update",m);let h=l(s,b(y,"entityId"));if(!h)throw f("entity not found","not-found");let g=Number(d),w=Number(u);if(![g,w].every(P=>Number.isFinite(P)&&P>=0&&P<=1))throw f("eval score and threshold must be from 0 to 1","invalid-eval");let I=j(c??m,"evaluatedAt");if(Date.parse(I)>Date.parse(m)+Pe)throw f("evaluatedAt is too far in the future","future-eval");if(h.latestEval&&Date.parse(I)<Date.parse(h.latestEval.evaluatedAt))throw f("evaluatedAt must be monotonic","non-monotonic-eval");let Y={suite:b(p,"eval suite"),score:g,threshold:w,evaluatedAt:I,evaluatorActorId:b(s.actor.actorId,"evaluatorActorId"),passed:g>=w},pe={...h,latestEval:Y},N=S(pe,m);return A(s,"eval",{...h,latestEval:Y,status:N.status,reasons:[...N.reasons],evaluatedAt:N.evaluatedAt,updatedAt:m,revision:h.revision+1},m)}function z({context:s,entityId:y,refs:p}={}){let d=i();a(s,"update",d);let u=l(s,b(y,"entityId"));if(!u)throw f("entity not found","not-found");let c=S(u,d);if(c.entityType==="credential")throw f("credential entities use updateCredentialExpiry","invalid-credentials");let m=He(p),h=m.some(g=>Date.parse(g.expiresAt)<=Date.parse(d));return A(s,"credential-refs",{...c,credentialRefs:m,status:h?"quarantined":c.status,reasons:h?[...new Set([...c.reasons||[],"credential-expired"])].sort():c.reasons,updatedAt:d,revision:c.revision+1},d)}function U({context:s,entityId:y,expiresAt:p}={}){let d=i();a(s,"update",d);let u=l(s,b(y,"entityId"));if(!u)throw f("entity not found","not-found");let c=S(u,d);if(c.entityType!=="credential")throw f("entity is not a credential","invalid-entity-type");let m=j(p,"expiresAt"),h=Date.parse(m)<=Date.parse(d);return A(s,"credential-expiry",{...c,expiresAt:m,status:h?"quarantined":c.status,reasons:h?[...new Set([...c.reasons||[],"credential-expired"])].sort():c.reasons,updatedAt:d,revision:c.revision+1},d)}function L({context:s,limit:y=null,cursor:p=null}={}){let d=i();a(s,"manage",d);let u=Ve(y),c=E({context:s,kind:"sweep",cursor:p,checkedAt:d}),m=c.checkedAt,h=[],g=c.records.slice(0,u);for(let w of g){let I=S(w,m);(I.status!==w.status||JSON.stringify(I.reasons)!==JSON.stringify(w.reasons||[]))&&A(s,"sweep",{...w,status:I.status,reasons:[...I.reasons],evaluatedAt:m,updatedAt:m,revision:w.revision+1},m),h.push({entityId:w.entityId,status:I.status,reasons:[...I.reasons],evaluatedAt:m})}return _({items:h.map(w=>k(w)),hasMore:c.records.length>u,lastEntityId:g.at(-1)?.entityId??null,kind:"sweep",context:s,sequence:c.sequence,checkedAt:m})}function O({context:s,entityId:y,reason:p}={}){let d=i();a(s,"update",d);let u=l(s,b(y,"entityId"));if(!u)throw f("entity not found","not-found");let c=S(u,d);if(!["quarantined","retired"].includes(c.status))throw f("only quarantined or retired entities may request reactivation","invalid-transition");return A(s,"reactivation-requested",{...c,status:"pending_reactivation",reactivation:{requestedAt:d,requestedBy:b(s.actor.actorId,"requestedBy"),reason:V(p,"reactivation reason"),reviewedAt:null,reviewedBy:null,review:null},updatedAt:d,revision:c.revision+1},d)}function te({context:s,entityId:y,review:p}={}){let d=i();a(s,"approve",d);let u=l(s,b(y,"entityId"));if(!u)throw f("entity not found","not-found");if(u.status!=="pending_reactivation"||!u.reactivation)throw f("reactivation request is required","invalid-transition");let c=Fe(u,{at:d,...r});if(c.status!=="active")throw f(`reactivation remediation incomplete: ${c.reasons.join(", ")}`,"remediation-required");let m=d;return A(s,"reactivation-approved",{...u,status:"active",reasons:[],reactivation:{...u.reactivation,reviewedAt:m,reviewedBy:b(s.actor.actorId,"reviewedBy"),review:V(p,"reactivation review")},updatedAt:m,revision:u.revision+1},d)}return Object.freeze({register:x,get:$,list:q,recordUsage:M,recordEval:D,updateCredentialRefs:z,updateCredentialExpiry:U,sweep:L,requestReactivation:O,approveReactivation:te,verify:o.verify})}var ee=`oracle lifecycle <command> [options]
|
|
4
|
+
register <input.json|->
|
|
5
|
+
get --id ID
|
|
6
|
+
list [--type agent|tool|workflow|credential] [--status STATUS] [--limit N] [--cursor CURSOR]
|
|
7
|
+
usage --id ID --outcome OUTCOME [--occurred-at ISO]
|
|
8
|
+
eval --id ID --suite NAME --score N --threshold N [--evaluated-at ISO]
|
|
9
|
+
credentials --id ID <refs.json|->
|
|
10
|
+
credential-expiry --id ID --expires-at ISO
|
|
11
|
+
sweep [--limit N] [--cursor CURSOR]
|
|
12
|
+
reactivate-request --id ID --reason TEXT
|
|
13
|
+
reactivate-approve --id ID --review TEXT
|
|
14
|
+
verify
|
|
15
|
+
Options: --store PATH --inactivity-days N --limit N --cursor CURSOR`;function Mt(e){let n=[],t={},r=new Set(["store","id","type","status","outcome","occurred-at","suite","score","threshold","evaluated-at","expires-at","reason","review","inactivity-days","limit","cursor"]);for(let o=0;o<e.length;o+=1){let i=e[o];if(!i.startsWith("--")){n.push(i);continue}let a=i.slice(2);if(!r.has(a)||e[o+1]==null)throw new TypeError(ee);t[a]=e[++o]}return{positionals:n,options:t}}function Xe(e){let n=e==="-"?We(0,"utf8"):We(e,"utf8");return JSON.parse(n)}function R(e){process.stdout.write(`${JSON.stringify(e,null,2)}
|
|
16
|
+
`)}var rn={name:"lifecycle",summary:"inventory and govern agent, tool, workflow, and credential lifecycles",group:"system",usage:ee,async run(e){let{positionals:n,options:t}=Mt(e.argv??[]),r=n[0];if(!r||["help","--help","-h"].includes(r))return process.stdout.write(`${ee}
|
|
17
|
+
`),0;let o=t["inactivity-days"]==null?90:Number(t["inactivity-days"]),i=Ze({path:t.store||qt($t(),".config","oracle","agent-lifecycle.json"),policy:{inactivityMs:o*24*60*60*1e3}}),a=ke();if(r==="register")R(i.register({context:a,input:Xe(n[1])}));else if(r==="get")R(i.get({context:a,entityId:t.id}));else if(r==="list")R(i.list({context:a,entityType:t.type||null,status:t.status||null,limit:t.limit==null?void 0:Number(t.limit),cursor:t.cursor}));else if(r==="usage")R(i.recordUsage({context:a,entityId:t.id,outcome:t.outcome,occurredAt:t["occurred-at"]}));else if(r==="eval")R(i.recordEval({context:a,entityId:t.id,suite:t.suite,score:Number(t.score),threshold:Number(t.threshold),evaluatedAt:t["evaluated-at"]}));else if(r==="credentials")R(i.updateCredentialRefs({context:a,entityId:t.id,refs:Xe(n[1])}));else if(r==="credential-expiry")R(i.updateCredentialExpiry({context:a,entityId:t.id,expiresAt:t["expires-at"]}));else if(r==="sweep")R(i.sweep({context:a,limit:t.limit==null?void 0:Number(t.limit),cursor:t.cursor}));else if(r==="reactivate-request")R(i.requestReactivation({context:a,entityId:t.id,reason:t.reason}));else if(r==="reactivate-approve")R(i.approveReactivation({context:a,entityId:t.id,review:t.review}));else if(r==="verify")R(i.verify());else throw new TypeError(ee);return 0}};export{rn as default};
|
|
@@ -8,7 +8,7 @@ ${JSON.stringify(r??[])}`}async function Vv(e,t,r){return Fe(e,{method:"POST",bo
|
|
|
8
8
|
`)){let r=t.match(/^\s*OPENSEA_API_KEY\s*=\s*(.+)\s*$/);if(r)return r[1].replace(/^["']|["']$/g,"").trim()}}catch{}return""}function wl(e={}){return e.apiKey?e.apiKey:e.allowAmbientCredentials===!1||e.allowDiskCredentials===!1?e.env?.OPENSEA_API_KEY||e.env?.OPEN_SEA_API_KEY||"":e.env?.OPENSEA_API_KEY||process.env.OPENSEA_API_KEY||process.env.OPEN_SEA_API_KEY||Tk()}function Zm(e={}){return ro({provider:"opensea",defaultUrl:kk,hosts:["api.opensea.io","testnets-api.opensea.io"],url:e.baseUrl||process.env.OPENSEA_API_URL})}function eh(e={}){return Zm(e).baseUrl}function th(e={}){return fn({accept:"application/json"},{"x-api-key":wl(e)},Zm(e).trusted)}function Ck(e){let t=String(e||"ethereum").trim().toLowerCase();if(!Ik.has(t))throw new Error(`opensea: unsupported account chain ${t}`);return t}function Qm(e,t="address"){try{return vk(String(e||"").trim().toLowerCase())}catch{throw new Error(`opensea: invalid ${t}`)}}function rh(e,t=null){let r=String(e||"").trim();if(!r)throw new Error("opensea: account address required");if(t&&!Ok.has(t)||!t&&/^0x[0-9a-fA-F]{40}$/.test(r))return Qm(r,"account address");if(!/^[1-9A-HJ-NP-Za-km-z]{32,64}$/.test(r))throw new Error("opensea: invalid account address");return r}function Nk(e={},t,r){return{chain:t,owner:r,contract:e.contract||null,tokenId:e.identifier==null?null:String(e.identifier),tokenStandard:e.token_standard||null,collection:e.collection||null,name:e.name||null,description:e.description||null,imageUrl:e.display_image_url||e.image_url||e.original_image_url||null,originalImageUrl:e.original_image_url||e.image_url||null,animationUrl:e.display_animation_url||e.original_animation_url||null,metadataUrl:e.metadata_url||null,marketplaceUrl:e.opensea_url||null,estimatedValueUsd:e.estimated_value_usd!=null&&Number.isFinite(Number(e.estimated_value_usd))?Number(e.estimated_value_usd):null,spam:e.is_disabled===!0,disabled:e.is_disabled===!0,nsfw:e.is_nsfw===!0,traits:Array.isArray(e.traits)?e.traits:[],updatedAt:e.updated_at||null,acquisitionCost:null,itemPnl:{status:"unavailable",reason:"OpenSea account inventory does not expose trustworthy per-item acquisition cost"}}}async function yl(e={},t={}){if(!wl(t))throw new Error("OPENSEA_API_KEY required");let r=Ck(e.chain),n=rh(e.address||e.owner,r),o=Math.min(Math.max(Number(e.pageSize??e.limit??200)||200,1),200),i=Math.min(Math.max(Number(e.maxPages??5)||5,1),25),s=[],a=e.next?String(e.next):null,c=0;do{let u=new URL(`${eh(t)}/chain/${encodeURIComponent(r)}/account/${encodeURIComponent(n)}/nfts`);u.searchParams.set("limit",String(o)),e.collection&&u.searchParams.set("collection",String(e.collection)),a&&u.searchParams.set("next",a);let d=await Fe(u.toString(),{headers:th(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});for(let f of Array.isArray(d?.nfts)?d.nfts:[])s.push(Nk(f,r,n));a=d?.next?String(d.next):null,c+=1}while(a&&c<i);return{provider:"opensea-nft",source:"opensea-account-inventory",chain:r,owner:n,count:s.length,pages:c,complete:!a,next:a,nfts:s,exec:!1,readOnly:!0}}async function nh(e={},t={}){if(!wl(t))throw new Error("OPENSEA_API_KEY required");let r=rh(e.address||e.owner),n=await Fe(`${eh(t)}/account/${encodeURIComponent(r)}/pnl`,{headers:th(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});return{provider:"opensea-nft",source:"opensea-indexed-account-pnl",address:r,scope:"OpenSea-indexed account trading PnL across supported currencies, not per-item NFT cost basis",methodology:"provider-indexed",realizedPnlUsd:n?.realized_pnl_usd??null,unrealizedPnlUsd:n?.unrealized_pnl_usd??null,totalPnlUsd:n?.total_pnl_usd??null,netInvestedUsd:n?.net_invested_usd??null,currentValueUsd:n?.current_value_usd??null,returnPercentage:n?.return_percentage??null,itemLevelPnlAvailable:!1,raw:n,exec:!1,readOnly:!0}}var kk,Ak,jB,HB,_k,Ik,Ok,zB,WB,KB,VB,oh=L(()=>{Ge();ti();Nr();Xm();kk="https://api.opensea.io/api/v2",Ak="fulfillAdvancedOrder(((address offerer,address zone,(uint8 itemType,address token,uint256 identifierOrCriteria,uint256 startAmount,uint256 endAmount)[] offer,(uint8 itemType,address token,uint256 identifierOrCriteria,uint256 startAmount,uint256 endAmount,address recipient)[] consideration,uint8 orderType,uint256 startTime,uint256 endTime,bytes32 zoneHash,uint256 salt,bytes32 conduitKey,uint256 totalOriginalConsiderationItems) parameters,uint120 numerator,uint120 denominator,bytes signature,bytes extraData) advancedOrder,(uint256 orderIndex,uint8 side,uint256 index,uint256 identifier,bytes32[] criteriaProof)[] criteriaResolvers,bytes32 fulfillerConduitKey,address recipient)",jB=new Rs([`function ${Ak}`]),HB=new Rs(["function mintPublic(address nftContract,address feeRecipient,address minterIfNotPayer,uint256 quantity) payable","function mintAllowList(address nftContract,address feeRecipient,address minterIfNotPayer,uint256 quantity,(uint80 mintPrice,uint48 maxTotalMintableByWallet,uint48 startTime,uint48 endTime,uint48 dropStageIndex,uint32 maxTokenSupplyForStage,uint16 feeBps,bool restrictFeeRecipients) mintParams,bytes32[] proof) payable"]),_k=Object.freeze(["blast","base","ethereum","zora","arbitrum","sei","avalanche","polygon","optimism","ape_chain","flow","b3","soneium","ronin","bera_chain","solana","shape","unichain","gunzilla","abstract","animechain","hyperevm","somnia","monad","hyperliquid","megaeth","ink","robinhood","stablechain"]),Ik=new Set(_k),Ok=new Set(["solana","flow"]);zB=Object.freeze({robinhood:4663,ethereum:1,base:8453,arbitrum:42161,optimism:10,polygon:137,avalanche:43114,zora:7777777,blast:81457,sei:1329,ape_chain:33139,b3:8333,soneium:1868,ronin:2020,bera_chain:80094,shape:360,unichain:130,gunzilla:43419,abstract:2741,animechain:69e3,hyperevm:999,somnia:5031,monad:143,megaeth:4326,ink:57073,stablechain:988}),WB=Object.freeze({OrderComponents:[{name:"offerer",type:"address"},{name:"zone",type:"address"},{name:"offer",type:"OfferItem[]"},{name:"consideration",type:"ConsiderationItem[]"},{name:"orderType",type:"uint8"},{name:"startTime",type:"uint256"},{name:"endTime",type:"uint256"},{name:"zoneHash",type:"bytes32"},{name:"salt",type:"uint256"},{name:"conduitKey",type:"bytes32"},{name:"counter",type:"uint256"}],OfferItem:[{name:"itemType",type:"uint8"},{name:"token",type:"address"},{name:"identifierOrCriteria",type:"uint256"},{name:"startAmount",type:"uint256"},{name:"endAmount",type:"uint256"}],ConsiderationItem:[{name:"itemType",type:"uint8"},{name:"token",type:"address"},{name:"identifierOrCriteria",type:"uint256"},{name:"startAmount",type:"uint256"},{name:"endAmount",type:"uint256"},{name:"recipient",type:"address"}]}),KB=new Rs(["function setApprovalForAll(address operator,bool approved)"]),VB=new Rs(["function cancel((address offerer,address zone,(uint8 itemType,address token,uint256 identifierOrCriteria,uint256 startAmount,uint256 endAmount)[] offer,(uint8 itemType,address token,uint256 identifierOrCriteria,uint256 startAmount,uint256 endAmount,address recipient)[] consideration,uint8 orderType,uint256 startTime,uint256 endTime,bytes32 zoneHash,uint256 salt,bytes32 conduitKey,uint256 counter)[] orders) returns (bool cancelled)"])});var bl=L(()=>{});function ih(e={}){return ro({provider:"satflow",defaultUrl:Rk,hosts:["api.satflow.com"],url:e.baseUrl||process.env.SATFLOW_API_URL})}function Lk(e={}){return ih(e).baseUrl}function sh(e={}){return String(e.apiKey||process.env.SATFLOW_API_KEY||process.env.BTC_SATFLOW_API_KEY||"").trim()}function Pk(e={}){return fn({accept:"application/json","content-type":"application/json","user-agent":"oracle-btc-satflow/0.1"},{"x-api-key":sh(e)},ih(e).trusted)}async function Mk(e,{method:t="GET",body:r,opts:n={}}={}){if(!sh(n))throw new Error("satflow: SATFLOW_API_KEY not set (request key via Satflow docs form)");let i=`${Lk(n)}${e.startsWith("/")?e:`/${e}`}`,a=await(n.fetchImpl||fetch)(i,{method:t,headers:Pk(n),body:r!=null?JSON.stringify(r):void 0,signal:AbortSignal.timeout(n.timeoutMs??2e4)}),c=await a.text(),u;try{u=JSON.parse(c)}catch{u=c}if(!a.ok)throw new Error(`satflow ${t} ${e}: HTTP ${a.status} ${String(c).slice(0,200)}`);return u}async function ah(e={},t={}){let r=Or(e.address||e.addr,"address"),n=new URLSearchParams({address:r});e.type&&n.set("type",e.type),e.limit!=null&&n.set("limit",String(e.limit)),e.offset!=null&&n.set("offset",String(e.offset));let o=await Mk(`/address/wallet-contents?${n}`,{opts:t});return{provider:"satflow",address:r,contents:o}}var Rk,ch=L(()=>{Os();ti();Nr();bl();Rk="https://api.satflow.com/v1"});var lh=L(()=>{Ge();al();ti();Nr();bl()});var cD,uh=L(()=>{Ge();cD=Object.freeze(["i.seadn.io","openseauserdata.com","arweave.net","ipfs.io","nftstorage.link","dweb.link","cloudflare-ipfs.com","ordinals.com","ordinals.g.com","cdn.helius-rpc.com","shdw-drive.genesysgo.net"])});function qk(e={}){let t=[],r=String(e.name||""),n=String(e.description||""),o=`${r} ${n}`;Dk.test(r)&&t.push("url-in-name");let i=Bk.filter(u=>u.test(o)).length;i>0&&t.push(`lure-language:${i}`),Fk.test(r)&&t.push("value-claim-in-name"),/[\u200B-\u200F\u202A-\u202E\uFEFF]/.test(r)&&t.push("invisible-characters"),e.disabled===!0&&t.push("marketplace-disabled");let s=e.estimatedValueUsd==null&&e.estimatedValueSats==null,a=!Array.isArray(e.traits)||e.traits.length===0;s&&a&&i>0&&t.push("valueless-airdrop-with-lure");let c=t.includes("url-in-name")||t.includes("invisible-characters")||t.includes("valueless-airdrop-with-lure")||t.length>=2;return{spam:c,risk:c?"high":t.length>0?"low":"none",reasons:t}}function dh(e={}){let t=qk(e);return{...e,spam:e.spam===!0||t.spam,riskLevel:t.risk,riskReasons:t.reasons.length?t.reasons:void 0}}var Bk,Dk,Fk,fh=L(()=>{Bk=[/\bclaim\b/i,/\breward\b/i,/\bairdrop\b/i,/\bvoucher\b/i,/\bwinner\b/i,/\bfree\s*mint\b/i,/\bactivate\b/i,/\bunlock\b/i,/\bverify\b/i,/\bconnect\s+wallet\b/i],Dk=/(https?:\/\/|www\.|[a-z0-9-]+\.(?:com|net|io|xyz|org|app|finance|gift|claims?|site|link|live|vip|top|cc))/i,Fk=/(\$\s?\d|\d[\d,.]*\s*(?:usd|usdc|usdt|eth|weth|btc|sol)\b)/i});function xl(e={},t){return{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs,env:e.env,allowDiskCredentials:e.allowDiskCredentials,allowAmbientCredentials:e.allowAmbientCredentials,...e[t]||{}}}async function oi(e,t){let r=await qe(t);return r.ok?{ok:!0,data:r.data}:{ok:!1,error:`${e}: ${r.error}`.slice(0,300)}}function Hk(e){if(Array.isArray(e))return e;for(let t of["items","results","ordinals","inscriptions","data"])if(Array.isArray(e?.[t]))return e[t];return[]}function zk(e={},t){let r=e.inscription_id||e.inscriptionId||e.id||e.inscription||null;return{chain:"bitcoin",family:"bitcoin",owner:t,contract:null,tokenId:r==null?null:String(r),tokenStandard:"ordinal",collection:e.collection_slug||e.collectionSlug||e.collection?.slug||e.collection||null,name:e.name||e.meta?.name||(r?`Inscription ${r}`:"Bitcoin inscription"),description:e.description||e.meta?.description||null,imageUrl:e.image_url||e.imageUrl||e.content_url||e.contentUrl||e.thumbnail||null,originalImageUrl:e.content_url||e.contentUrl||e.image_url||e.imageUrl||null,animationUrl:null,metadataUrl:e.metadata_url||e.metadataUrl||null,marketplaceUrl:e.marketplace_url||e.marketplaceUrl||null,estimatedValueUsd:e.estimated_value_usd!=null&&Number.isFinite(Number(e.estimated_value_usd))?Number(e.estimated_value_usd):null,estimatedValueSats:(e.floor_price_sats??e.price_sats)!=null&&Number.isFinite(Number(e.floor_price_sats??e.price_sats))?Number(e.floor_price_sats??e.price_sats):null,spam:!1,disabled:!1,nsfw:!1,listed:e.listed===!0||e.is_listed===!0,listingId:e.listing_id||e.listingId||null,traits:Array.isArray(e.traits)?e.traits:[],updatedAt:e.updated_at||e.updatedAt||null,acquisitionCost:null,itemPnl:{status:"unavailable",reason:"Satflow wallet inventory does not expose trustworthy acquisition cost"},listingAdapter:"satflow",source:"satflow-wallet-contents"}}function Wk(e,t){return{chain:"bitcoin",family:"bitcoin",owner:t,contract:null,tokenId:String(e),tokenStandard:"ordinal",collection:null,name:`Inscription ${e}`,description:null,imageUrl:null,originalImageUrl:null,animationUrl:null,metadataUrl:null,marketplaceUrl:null,estimatedValueUsd:null,spam:!1,disabled:!1,nsfw:!1,traits:[],updatedAt:null,acquisitionCost:null,itemPnl:{status:"unavailable",reason:"address indexer returned no acquisition or valuation data"},listingAdapter:"satflow",source:"bitcoin-meta-address-indexer"}}function ph(e={}){return[e.chain||"unknown",e.contract||"native",e.tokenId||"unknown"].join(":").toLowerCase()}function Kk(e){let t=new Map;if(Array.isArray(e)){for(let r of e)r?.assetKey&&t.set(String(r.assetKey).toLowerCase(),r);return t}if(e&&typeof e=="object")for(let[r,n]of Object.entries(e))t.set(r.toLowerCase(),n);return t}function Vk(e,t){let r=ph(e),n=t.get(r),o=e.estimatedValueUsd==null?null:Number(e.estimatedValueUsd);if(!n)return{...e,assetKey:r};let i=Number(n.costUsd),s=Number(n.feesUsd??0);if(!Number.isFinite(i)||i<0||!Number.isFinite(s)||s<0)return{...e,assetKey:r,acquisitionCost:null,itemPnl:{status:"unavailable",reason:"invalid user-supplied cost basis"}};let a=Math.round((i+s)*100)/100;return Number.isFinite(o)?{...e,assetKey:r,acquisitionCost:{costUsd:i,feesUsd:s,totalCostUsd:a,acquiredAt:n.acquiredAt||null,source:n.source||"user-supplied"},itemPnl:{status:"estimated",methodology:"provider estimated current value minus supplied USD acquisition cost and fees",unrealizedUsd:Math.round((o-a)*100)/100,currentValueUsd:o,totalCostUsd:a,realizedUsd:null}}:{...e,assetKey:r,acquisitionCost:{costUsd:i,feesUsd:s,totalCostUsd:a,acquiredAt:n.acquiredAt||null,source:n.source||"user-supplied"},itemPnl:{status:"unavailable",reason:"current NFT valuation is unavailable"}}}function Gk(e){let t=new Map;for(let r of e){let n=ph(r);t.has(n)||t.set(n,r)}return[...t.values()]}function Yk(e,t){let r=e.filter(i=>i.itemPnl?.status==="estimated"),n=e.length-r.length,o=Math.round(r.reduce((i,s)=>i+Number(s.itemPnl.unrealizedUsd||0),0)*100)/100;return{nftItemPnl:{status:n===0&&e.length?"estimated-complete-for-held-items":r.length?"partial":"unavailable",methodology:"Only items with explicit acquisition cost and provider estimated current value are included",knownUnrealizedUsd:o,knownItems:r.length,unknownItems:n,realizedUsd:null,warning:"Transfers, gifts, airdrops, mints, bridges, gas, royalties, and off-market sales can make cost basis unavailable or incomplete."},providerAccountPnl:t}}async function mh(e={},t={}){let r=new Date().toISOString(),n=oo(e,t.env||process.env),o=Array.isArray(e.chains)&&e.chains.length?new Set(e.chains.map(w=>String(w).toLowerCase())):null,i=Uk.filter(w=>!o||o.has(w.chain)),s=[],a=[],c=xl(t,"opensea"),u=n.evm?i.filter(w=>w.family!=="solana"):[],d=await eo(u,4,async w=>({row:w,result:await oi(`opensea-${w.chain}`,()=>yl({chain:w.chain,address:n.evm,pageSize:e.pageSize,maxPages:e.maxPages},c),t.timeoutMs??35e3)}));for(let{row:w,result:v}of d)if(v.ok){let _=v.data.nfts.map(T=>({...T,family:w.family,chainId:w.chainId,listingAdapter:"opensea",source:"opensea-account-inventory"}));a.push(..._),s.push({family:w.family,chain:w.chain,chainId:w.chainId,status:v.data.complete?"ok":"partial",count:_.length,complete:v.data.complete,next:v.data.next,source:"opensea"})}else s.push({family:w.family,chain:w.chain,chainId:w.chainId,status:"unavailable",error:v.error,source:"opensea"});if(!n.evm)for(let w of i.filter(v=>v.family!=="solana"))s.push({family:w.family,chain:w.chain,chainId:w.chainId,status:"not-configured",reason:"EVM address missing"});if(n.solana&&(!o||o.has("solana"))){let w=await oi("opensea-solana",()=>yl({chain:"solana",address:n.solana,pageSize:e.pageSize,maxPages:e.maxPages},c),t.timeoutMs??35e3);if(w.ok){let v=w.data.nfts.map(_=>({..._,family:"solana",chainId:null,listingAdapter:null,source:"opensea-account-inventory"}));a.push(...v),s.push({family:"solana",chain:"solana",status:w.data.complete?"ok":"partial",count:v.length,complete:w.data.complete,next:w.data.next,source:"opensea"})}else s.push({family:"solana",chain:"solana",status:"unavailable",error:w.error,source:"opensea"})}else(!o||o.has("solana"))&&s.push({family:"solana",chain:"solana",status:"not-configured",reason:"Solana address missing"});if(n.bitcoin&&(!o||o.has("bitcoin"))){let w=await oi("satflow-wallet-contents",()=>ah({address:n.bitcoin,type:"ordinals",limit:e.bitcoinLimit??100,offset:0},xl(t,"satflow")),t.timeoutMs??35e3);if(w.ok){let v=Hk(w.data.contents).map(T=>zk(T,n.bitcoin));a.push(...v);let _=v.length<Number(e.bitcoinLimit??100);s.push({family:"bitcoin",chain:"bitcoin",status:_?"ok":"partial",count:v.length,complete:_,source:"satflow"})}else{let v=await oi("bitcoin-meta-inscriptions",()=>Ts({address:n.bitcoin},xl(t,"bitcoinMeta")),t.timeoutMs??35e3),_=v.ok&&v.data?.ok&&Array.isArray(v.data.inscriptions)?v.data.inscriptions:[];a.push(..._.map(T=>Wk(T,n.bitcoin))),s.push({family:"bitcoin",chain:"bitcoin",status:_.length?"partial":"unavailable",count:_.length,complete:!1,source:_.length?"bitcoin-meta":"satflow",error:_.length?"Satflow unavailable; fallback has IDs only":w.error})}}else(!o||o.has("bitcoin"))&&s.push({family:"bitcoin",chain:"bitcoin",status:"not-configured",reason:"Bitcoin address missing"});let f=[];if(e.includePnl!==!1)for(let w of[...new Set([n.evm,n.solana].filter(Boolean))]){let v=await oi(`opensea-pnl-${w}`,()=>nh({address:w},c),t.timeoutMs??35e3);f.push(v.ok?{status:"ok",...v.data}:{status:"unavailable",address:w,source:"opensea-indexed-account-pnl",error:v.error})}let l=Kk(e.costBasis),p=Gk(a).map(w=>Vk(w,l)).map(w=>dh(w)),m=p.filter(w=>!w.spam),g=p.filter(w=>w.spam),y=m.filter(w=>w.estimatedValueUsd!=null&&Number.isFinite(Number(w.estimatedValueUsd))),b=Math.round(y.reduce((w,v)=>w+Number(v.estimatedValueUsd),0)*100)/100,A=m.length-y.length,S=s.filter(w=>w.status!=="ok"||w.complete===!1);return{provider:"nft-portfolio",operation:"inventory",readOnly:!0,generatedAt:r,addresses:n,coverage:s,unsupported:jk,inventory:{count:p.length,visibleCount:m.length,flaggedCount:g.length,items:p,visibleItems:m,flaggedItems:g},valuation:{estimatedCurrentValueUsd:b,valuedItems:y.length,unvaluedItems:A,complete:A===0&&S.length===0,methodology:"Sum of provider estimated_value_usd for non-flagged items. It is not an executable bid."},pnl:Yk(m,f),listingCoverage:{opensea:"EVM listing actions available with OPENSEA_API_KEY, explicit price/currency/expiry, and user confirmation",satflow:"Bitcoin unsigned listing PSBT available with SATFLOW_API_KEY, explicit price/expiry, and user confirmation",solana:"Magic Eden unsigned list transaction available with MAGICEDEN_API_KEY, explicit SOL price/expiry, and user confirmation",unsupported:"Sui, Aptos, Cosmos, BSC, and unknown marketplaces fail closed"},traitSniperCoverage:{opensea:"Evaluates reveal/trait-floor mispricing only with recent trait sales and volume evidence. Buy intents require local vault signing.",execution:"prepare-only on hosted surfaces; local vault required for purchase"},metadataSafety:{imagesAreUntrusted:!0,animationAndHtmlNotRendered:!0,galleryRasterOnly:!0,missingImagesUsePlaceholders:!0}}}var Uk,jk,hh=L(()=>{Ge();gl();oh();ch();ll();lh();uh();fh();Nr();Uk=Object.freeze([{chain:"ethereum",chainId:1,family:"evm"},{chain:"optimism",chainId:10,family:"evm"},{chain:"polygon",chainId:137,family:"evm"},{chain:"stablechain",chainId:988,family:"evm"},{chain:"hyperevm",chainId:999,family:"evm"},{chain:"abstract",chainId:2741,family:"evm"},{chain:"robinhood",chainId:4663,family:"evm"},{chain:"base",chainId:8453,family:"evm"},{chain:"arbitrum",chainId:42161,family:"evm"},{chain:"avalanche",chainId:43114,family:"evm"},{chain:"hyperliquid",chainId:null,family:"hyperliquid"}]),jk=Object.freeze([{family:"evm",chain:"bsc",chainId:56,reason:"OpenSea account inventory does not support BSC"},{family:"cosmos",reason:"requires a chain-specific bech32 address and NFT indexer"},{family:"sui",reason:"owner inventory adapter not installed"},{family:"aptos",reason:"owner inventory adapter not installed"}])});var Eh={};Hr(Eh,{portfolioHistory:()=>Sh,portfolioIdForAddresses:()=>Sl,portfolioSnapshot:()=>lA,portfolioValueGraph:()=>mA,resolvePortfolioHistoryFile:()=>El});import{constants as Ls}from"node:fs";import{chmod as Jk,mkdir as Xk,open as Qk,readFile as Zk}from"node:fs/promises";import{createHash as eA,randomUUID as tA}from"node:crypto";import rA from"node:os";import io from"node:path";function $r(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function so(e){return Number.isFinite(e)?Number(e.toFixed(2)):null}function wh(e,t){if(e==null||e==="")return null;let r=Date.parse(String(e));if(!Number.isFinite(r))throw new Error(`${t} must be an ISO 8601 timestamp`);return new Date(r).toISOString()}function xh(e,t,r,n,o){if(e==null||e==="")return t;let i=Number(e);if(!Number.isInteger(i)||i<r||i>n)throw new Error(`${o} must be an integer from ${r} to ${n}`);return i}function nA(e={}){return["evm","solana","bitcoin","hyperliquid"].map(t=>`${t}:${String(e[t]||"").trim().toLowerCase()}`).join("|")}function Sl(e={}){return`portfolio_${eA("sha256").update(nA(e)).digest("hex").slice(0,20)}`}function El(e={}){if(e.historyFile)return io.resolve(String(e.historyFile));let t=e.env||process.env;if(t.ORACLE_PORTFOLIO_HISTORY_FILE)return io.resolve(String(t.ORACLE_PORTFOLIO_HISTORY_FILE));let r=String(t.HERMES_HOME||"").trim()||io.join(rA.homedir(),".hermes");return io.join(io.resolve(r),"state","oracle","portfolio-history.jsonl")}function oA(e){let t=$r(e?.valuation?.knownUsd);return t==null?null:Number(e?.valuation?.pricedItems||0)>0||e?.valuation?.complete===!0?so(t):null}function iA(e){if(!e||e.status==="unavailable"||e.status==="not-requested")return null;let t=$r(e?.valuation?.estimatedCurrentValueUsd);return t==null?null:Number(e?.valuation?.valuedItems||0)>0||e?.valuation?.complete===!0?so(t):null}function sA(e){let t=[];for(let r of e?.chains||[]){if(r.family==="hyperliquid"){let o=(r.spot?.balances||[]).reduce((a,c)=>{let u=$r(c.usdValue);return u==null?a:a+u},0),i=$r(r.perps?.accountValueUsd),s=so(o+(i??0));(s!==0||i!=null||(r.spot?.balances||[]).some(a=>$r(a.usdValue)!=null))&&t.push({family:"hyperliquid",chainId:null,name:r.name||"Hyperliquid",knownUsd:s});continue}let n=$r(r.native?.usdValue);n!=null&&t.push({family:r.family||"evm",chainId:r.chainId??null,name:r.name||r.native?.symbol||"Unknown",knownUsd:so(n)})}return t}function aA(e,t,r){let n=Array.isArray(t?.coverage)?t.coverage:[];return{balances:e?.coverage||null,nfts:{requested:r,ok:n.filter(o=>o.status==="ok").length,partial:n.filter(o=>o.status==="partial").length,unavailable:n.filter(o=>o.status==="unavailable").length,notConfigured:n.filter(o=>o.status==="not-configured").length,status:r?t?.status==="unavailable"?"unavailable":t?.valuation?.complete?"ok":"partial":"not-requested"}}}async function cA(e,t){let r=El(t),n=`${JSON.stringify(e)}
|
|
9
9
|
`;if(Buffer.byteLength(n)>32*1024)throw new Error("portfolio history snapshot exceeds 32 KiB");await Xk(io.dirname(r),{recursive:!0,mode:448});let o=Ls.O_APPEND|Ls.O_CREAT|Ls.O_WRONLY|(Ls.O_NOFOLLOW||0),i=await Qk(r,o,384);try{await i.writeFile(n,"utf8")}finally{await i.close()}return await Jk(r,384),r}async function lA(e={},t={}){let r=e.includeNfts!==!1,n=t.portfolioBalanceImpl||Jm,o=t.nftInventoryImpl||mh,i=n(e,t),s=r?o({...e,includePnl:!1},t).catch(v=>({status:"unavailable",error:String(v?.message||v).slice(0,300)})):Promise.resolve({status:"not-requested"}),[a,c]=await Promise.all([i,s]),u=oA(a),d=iA(c),f=[u,d].filter(v=>v!=null),l=f.length?so(f.reduce((v,_)=>v+_,0)):null,p=!!(a?.valuation?.complete&&(!r||c?.valuation?.complete===!0)),m=typeof t.now=="function"?t.now():new Date,g=new Date(m).toISOString(),y=a?.addresses||oo(e,t.env||process.env),b=Sl(y),A=[...a?.warnings||[]];r&&c?.status==="unavailable"&&A.push(`NFT inventory unavailable: ${c.error}`),r&&c?.valuation&&c.valuation.complete!==!0&&A.push("NFT estimated value is incomplete and is not an executable bid.");let S={schemaVersion:1,id:`snapshot_${tA()}`,portfolioId:b,recordedAt:g,sourceQueriedAt:{balances:a?.queriedAt||null,nfts:c?.generatedAt||null},configuredFamilies:Object.fromEntries(["evm","solana","bitcoin","hyperliquid"].map(v=>[v,!!y?.[v]])),valuation:{knownUsd:l,liquidKnownUsd:u,nftEstimatedValueUsd:d,complete:p,label:p?"complete known portfolio value":"known priced value, including provider-estimated NFTs when available, not a complete portfolio total",liquidPricedItems:Number(a?.valuation?.pricedItems||0),liquidUnpricedNonzeroItems:Number(a?.valuation?.unpricedNonzeroItems||0),nftValuedItems:Number(c?.valuation?.valuedItems||0),nftUnvaluedItems:Number(c?.valuation?.unvaluedItems||0)},breakdown:{liquid:sA(a),nfts:{knownUsd:d,visibleItems:Number(c?.inventory?.visibleCount||0),flaggedItems:Number(c?.inventory?.flaggedCount||0)}},coverage:aA(a,c,r),warnings:[...new Set(A)].slice(0,50)};return{provider:"portfolio",operation:"snapshot",readOnly:!0,localObservationRecorded:!0,historyFile:await cA(S,t),snapshot:S,balance:a,nfts:c}}async function uA(e){let t=El(e);try{let r=await Zk(t);if(r.byteLength>gh)throw new Error(`portfolio history exceeds ${gh} bytes`);let n=[],o=0;for(let i of r.toString("utf8").split(`
|
|
10
10
|
`))if(i.trim())try{let s=JSON.parse(i);s?.schemaVersion===1&&s?.portfolioId&&s?.recordedAt?n.push(s):o+=1}catch{o+=1}return{file:t,snapshots:n,corruptLines:o}}catch(r){if(r?.code==="ENOENT")return{file:t,snapshots:[],corruptLines:0};throw r}}function dA(e,t){if(e.allPortfolios===!0)return null;if(e.portfolioId)return String(e.portfolioId);let r=oo(e,t.env||process.env);return Object.values(r).some(Boolean)?Sl(r):null}async function Sh(e={},t={}){let r=xh(e.limit,100,1,bh,"portfolio history limit"),n=String(e.order||"desc").toLowerCase();if(!new Set(["asc","desc"]).has(n))throw new Error("portfolio history order must be asc or desc");let o=wh(e.since,"portfolio history since"),i=wh(e.until,"portfolio history until"),s=dA(e,t),a=await uA(t),c=a.snapshots.filter(f=>!(s&&f.portfolioId!==s||o&&f.recordedAt<o||i&&f.recordedAt>i));c.sort((f,l)=>String(f.recordedAt).localeCompare(String(l.recordedAt)));let u=c.length;c=c.slice(-r),n==="desc"&&c.reverse();let d=c.filter(f=>$r(f?.valuation?.knownUsd)!=null);return{provider:"portfolio",operation:"history",readOnly:!0,historyFile:a.file,portfolioId:s,order:n,totalStored:a.snapshots.length,totalMatching:u,corruptLines:a.corruptLines,snapshots:c,stats:{returned:c.length,valuedSnapshots:d.length,unpricedSnapshots:c.length-d.length,firstRecordedAt:c.length?[...c].sort((f,l)=>String(f.recordedAt).localeCompare(String(l.recordedAt)))[0].recordedAt:null,lastRecordedAt:c.length?[...c].sort((f,l)=>String(f.recordedAt).localeCompare(String(l.recordedAt))).at(-1).recordedAt:null}}}function yh(e){return`$${Number(e).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}`}function Ps(e){return String(e).replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function fA(e,t){if(e.length<=t)return e;let r=[];for(let n=0;n<t;n+=1)r.push(e[Math.round(n*(e.length-1)/(t-1))]);return r}function pA(e,t){let c=e.map(S=>S.value),u=Math.min(...c),d=Math.max(...c);if(u===d){let S=Math.max(1,Math.abs(u)*.05);u-=S,d+=S}else{let S=(d-u)*.1;u=Math.max(0,u-S),d+=S}let f=S=>e.length===1?1240/2:100+1040*S/(e.length-1),l=S=>570-(S-u)/(d-u)*470,p=e.map((S,w)=>`${w?"L":"M"}${f(w).toFixed(2)},${l(S.value).toFixed(2)}`).join(" "),m=Array.from({length:5},(S,w)=>{let v=w/4,_=100+v*470,T=d-v*(d-u);return`<line x1="100" y1="${_}" x2="1140" y2="${_}" stroke="#26313c" stroke-width="1"/><text x="86" y="${_+5}" text-anchor="end" fill="#8795a5" font-size="15">${yh(T)}</text>`}).join(""),g=e.map((S,w)=>`<circle cx="${f(w)}" cy="${l(S.value)}" r="5" fill="#b8f0ff"><title>${Ps(S.recordedAt)}: ${yh(S.value)}</title></circle>`).join(""),y=Ps(e[0].recordedAt.slice(0,10)),b=Ps(e.at(-1).recordedAt.slice(0,10));return`<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="675" viewBox="0 0 1200 675"><rect width="1200" height="675" fill="#0b1016"/><text x="60" y="50" fill="#f4f7fa" font-size="28" font-family="Inter,Arial,sans-serif" font-weight="700">Oracle Portfolio Value</text><text x="60" y="78" fill="#8795a5" font-size="15" font-family="Inter,Arial,sans-serif">Known priced value, not a complete total unless every snapshot says complete \xB7 ${Ps(t||"configured portfolio")}</text>${m}<line x1="100" y1="570" x2="1140" y2="570" stroke="#526171" stroke-width="1"/><path d="${p}" fill="none" stroke="#b8f0ff" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/>${g}<text x="100" y="610" fill="#8795a5" font-size="15">${y}</text><text x="1140" y="610" text-anchor="end" fill="#8795a5" font-size="15">${b}</text><text x="60" y="650" fill="#526171" font-size="13">NFT values are provider estimates, not executable bids. Unavailable values are omitted, never plotted as zero.</text></svg>`}async function mA(e={},t={}){if(e.allPortfolios===!0)throw new Error("portfolio value graph requires one portfolioId or configured public-address portfolio");let r=xh(e.maxPoints,200,2,500,"portfolio graph maxPoints"),n=await Sh({...e,order:"asc",limit:e.limit??bh},t);if(!n.portfolioId)throw new Error("portfolio value graph requires one portfolioId or configured public-address portfolio");let o=n.snapshots.map(f=>({recordedAt:f.recordedAt,value:$r(f?.valuation?.knownUsd),complete:f?.valuation?.complete===!0})).filter(f=>f.value!=null);if(!o.length)throw new Error("portfolio value graph requires at least one snapshot with known priced value");let i=fA(o,r),s=i[0].value,a=i.at(-1).value,c=so(a-s),u=s===0?null:Number(((a-s)/s*100).toFixed(2)),d=pA(i,n.portfolioId);return{provider:"portfolio",operation:"valueGraph",readOnly:!0,portfolioId:n.portfolioId,mimeType:"image/svg+xml",dataBase64:Buffer.from(d).toString("base64"),byteLength:Buffer.byteLength(d),summary:{points:i.length,omittedUnavailablePoints:n.snapshots.length-o.length,startRecordedAt:i[0].recordedAt,endRecordedAt:i.at(-1).recordedAt,startKnownUsd:s,endKnownUsd:a,changeUsd:c,changePct:u,completeSnapshots:i.filter(f=>f.complete).length,label:"known priced value history; incomplete snapshots are not complete portfolio totals"}}}var gh,bh,vh=L(()=>{gl();hh();gh=10*1024*1024,bh=1e3});function Ms(e){let t=e?.transactionHash||e?.hash||e?.txid||null;return t?{happened:!0,hash:String(t),note:null}:{happened:!1,hash:null,note:"no transaction hash \u2014 the action did not succeed"}}var vl=L(()=>{});var _h={};Hr(_h,{createWatch:()=>Il,listWatches:()=>_l,removeWatch:()=>yA});import ii from"node:fs";import kl from"node:path";import{randomUUID as hA}from"node:crypto";import{homedir as gA}from"node:os";function wA(e=process.env){return e.ORACLE_CONFIG_DIR||kl.join(gA(),".config","oracle")}function kh(e=process.env){return kl.join(wA(e),"watches.json")}function Al(e=process.env){let t=kh(e);if(!ii.existsSync(t))return{watches:[]};try{let r=JSON.parse(ii.readFileSync(t,"utf8"));return{watches:Array.isArray(r.watches)?r.watches:[]}}catch{return{watches:[]}}}function Ah(e,t=process.env){let r=kh(t);ii.mkdirSync(kl.dirname(r),{recursive:!0,mode:448});let n=`${r}.${process.pid}.tmp`;ii.writeFileSync(n,`${JSON.stringify(e,null,2)}
|
|
11
|
-
`,{mode:384}),ii.renameSync(n,r)}function _l(e=process.env){return Al(e).watches}function Il({chain:e,token:t,condition:r,note:n}={},o=process.env){if(!e||!t||!r)throw new Error("watch requires chain, token, condition");let i={id:hA(),chain:String(e),token:String(t),condition:String(r),note:n?String(n):null,actionMode:"alert_only",createdAt:new Date().toISOString()},s=Al(o);return s.watches.push(i),Ah(s,o),i}function yA(e,t=process.env){let r=Al(t),n=r.watches.filter(o=>o.id!==e);return n.length===r.watches.length?!1:(Ah({watches:n},t),!0)}var Ol=L(()=>{});function Tl(e){let t=xA[Number(e)]||[];return new Set([...t,...bA].map(r=>String(r).trim().toLowerCase()).filter(Boolean))}var bA,xA,Cl=L(()=>{bA=["0x000000000022d473030f116ddee9f6b43ac78ba3"],xA={4663:["0xcaf681a66d020601342297493863e78c959e5cb2","0x33e885ed0ec9bf04ecfb19341582aadcb4c8a9e7","0x1f7d7550b1b028f7571e69a784071f0205fd2efa","0x0bd7d308f8e1639fab988df18a8011f41eacad73","0x5fc5360d0400a0fd4f2af552add042d716f1d168","0xb477751b76cf82d00a686a1232f5fcd772414af3","0xff5cb29241f002ffed2eaa224e3e996d24a6e8d1"],8453:["0x2626664c2603336e57b271c5c0b26f421741e481","0x6ff5693b99212da76ad316178a184ab56d299b43","0x3d4e44eb1374240ce5f1b871ab261cd16335b76a","0x33128a8fc17869897dce68ed026d694621f6fdfd","0x4200000000000000000000000000000000000006","0x833589fcd6edb6e08f4c7c32d4f71b54bda02913","0xbe6d8f0d05cc4be24d5167a3ef062215be6d18a5","0x254cf9e1e6e233aa1ac962cb9b05b2cfeaae15b0","0x5e7bb104d84c7cb9b682aac2f3d509f5f406809a","0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0x888888888889758f76e7103c6cbf23abbf58f946","0x3f170631ed9821ca51a59d996ab095162438dc10","0x4f37a9d177470499a2dd084621020b023fcffc1f","0xc92e8bdf79f0507f65a392b0ab4667716bfe0110"],42161:["0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45","0x61ffe014ba17989e743c5f6cb21bf9697530b21e","0x82af49447d8a07e3bd95bd0d56f35241523fbab1","0xaf88d065e77c8cc2239327c5edb3a432268e5831","0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9","0x888888888889758f76e7103c6cbf23abbf58f946","0xeaedc32a51c510d35ebc11088fd5ff2b47aacf2e","0x2191718cd32d02b8e60badffea33e4b5dd9a0a0d","0xc92e8bdf79f0507f65a392b0ab4667716bfe0110","0x1c3fa76e6e1088bce750f23a5bfcffa1efef6a41","0x7452c558d45f8afc8c83dae62c3f8a5be19c71f6"],1:["0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45","0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0x4cd00e387622c35bddb9b4c962c136462338bc31","0x6a000f20005980200259b80c5102003040001068","0xae563e3f8219521950555f5962419c8919758ea2","0x45312ea0eff7e09c83cbe249fa1d7598c4c8cd4e","0xc92e8bdf79f0507f65a392b0ab4667716bfe0110"],137:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0x0dcded3545d565ba3b19e683431381007245d983"],10:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xe2fa4e1d17725e72dcdafe943ecf45df4b9e285b","0x0dcded3545d565ba3b19e683431381007245d983"],56:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xa72c85c258a81761433b4e8da60505fe3dd551cc"],43114:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xf39ca6ede9bf7820a952b52f3c94af526bab9015","0x0dcded3545d565ba3b19e683431381007245d983","0x8f550e53dfe96c055d5bdb267c21f268fcaf63b2","0x820f5ffc5b525cd4d88cd91acf2c28f16530cc68"],999:["0x0a0758d937d1059c356d4714e57f5df0239bce1a","0xd2002373543ce3527023c75e7518c274a51ce712"],2741:["0x4f8c9056bb8a3616693a76922fa35d53c056e5b3"],988:["0x026f252016a7c47cdef1f05a3fc9e20c92a49c37","0xff5cb29241f002ffed2eaa224e3e996d24a6e8d1","0x817997ca8394e26cce3de3a076a4889b27dbf9de","0x3dea4be5615974f31624404ef288ba3b36dfeb83","0xeaf7ac0fdf150cdd89340fb762d83848de6a7b83","0x779ded0c9e1022225f8e0630b35a9b54be713736","0xbc6f7725f08232c151b528bdfcaaf89993ca86ee"]}});var si=L(()=>{});var ao=L(()=>{});var ai,ci=L(()=>{si();ao();ai=100});import{isAddress as zD}from"ethers";var $l=L(()=>{ci();si();ao()});import{Interface as vA,isAddress as JD}from"ethers";var eF,Ih=L(()=>{$l();si();ao();eF=new vA(["function approve(address spender,uint256 amount) returns (bool)"])});import{Interface as kA,isAddress as nF}from"ethers";var aF,cF,Oh=L(()=>{$l();si();ao();aF=new kA(["function approve(address spender,uint256 amount) returns (bool)"]),cF=Object.freeze({42161:"0x1c3fa76e6e1088bce750f23a5bfcffa1efef6a41",43114:"0x8f550e53dfe96c055d5bdb267c21f268fcaf63b2"})});var pn=L(()=>{});import{Interface as AA,MaxUint256 as mF,isAddress as hF,keccak256 as gF,toUtf8Bytes as wF}from"ethers";var vF,mn=L(()=>{Cl();Ih();Oh();pn();ao();vF=new AA(["function approve(address spender,uint256 amount) returns (bool)"])});var Ds=L(()=>{mn()});import{Address as OF,NETWORK as TF,OutScript as CF,RawTx as NF,SigHash as $F,TEST_NETWORK as RF,Transaction as LF}from"@scure/btc-signer";var Pl=L(()=>{});import{createHash as _A}from"node:crypto";import{base58 as DF}from"@scure/base";import{getCompiledTransactionMessageDecoder as qF}from"@solana/transaction-messages";var Th,UF,Ml=L(()=>{Th=e=>_A("sha256").update(`global:${e}`).digest().subarray(0,8).toString("hex"),UF=new Map([[Th("route"),{name:"route",prefixBytes:0}],[Th("shared_accounts_route"),{name:"shared_accounts_route",prefixBytes:1}]])});var Ch=L(()=>{ul()});var YF,JF,Dl=L(()=>{pn();Ch();YF=Object.freeze({"perp-order":"order","hip3-order":"order","hip4-order":"order","perp-bracket":"order","perp-cancel":"cancel","perp-leverage":"leverage","perp-isolated-margin":"margin","builder-fee-approval":"approveBuilder","hype-stake-deposit":"stake","hype-stake-withdraw":"unstake","hype-delegate":"delegate","hype-undelegate":"delegate"}),JF=Object.freeze({"perp-order":"order","hip3-order":"order","hip4-order":"order","perp-bracket":"order","perp-cancel":"cancel","perp-leverage":"updateLeverage","perp-isolated-margin":"updateIsolatedMargin","builder-fee-approval":"approveBuilderFee","hype-stake-deposit":"cDeposit","hype-stake-withdraw":"cWithdraw","hype-delegate":"tokenDelegate","hype-undelegate":"tokenDelegate"})});var ZF,Fl=L(()=>{pn();ZF="0x"+"00".repeat(32)});var IA,oq,ql=L(()=>{Fl();pn();IA=Object.freeze([["salt","uint256"],["maker","address"],["signer","address"],["tokenId","uint256"],["makerAmount","uint256"],["takerAmount","uint256"],["side","uint8"],["signatureType","uint8"],["timestamp","uint256"],["metadata","bytes32"],["builder","bytes32"]]),oq=Object.freeze(IA.map(e=>e[0]))});var Fs=L(()=>{pn()});import{TypedDataEncoder as lq,getAddress as uq,isAddress as dq}from"ethers";var OA,TA,Lh=L(()=>{Nr();OA=Object.freeze({1:"0x111111125421cA6dc452d289314280a0f8842A65",8453:"0x111111125421cA6dc452d289314280a0f8842A65",42161:"0x111111125421cA6dc452d289314280a0f8842A65",10:"0x111111125421cA6dc452d289314280a0f8842A65",137:"0x111111125421cA6dc452d289314280a0f8842A65",56:"0x111111125421cA6dc452d289314280a0f8842A65"}),TA=Object.freeze({Order:[{name:"salt",type:"uint256"},{name:"maker",type:"address"},{name:"receiver",type:"address"},{name:"makerAsset",type:"address"},{name:"takerAsset",type:"address"},{name:"makingAmount",type:"uint256"},{name:"takingAmount",type:"uint256"},{name:"makerTraits",type:"uint256"}]})});var mq,Ph=L(()=>{mq=Object.freeze({READ:"read",PREPARE:"prepare",EXECUTE:"execute",AUTONOMOUS:"autonomous"})});var Mh=L(()=>{});import{TypedDataEncoder as Eq,getAddress as vq,isAddress as kq}from"ethers";var CA,Nq,NA,$q,Bh=L(()=>{Ge();ci();Ph();Mh();Nr();CA=Object.freeze({1:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",100:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",42161:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",8453:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41"}),Nq=Object.freeze({1:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",100:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",42161:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",8453:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110"}),NA=Object.freeze({Order:[{name:"sellToken",type:"address"},{name:"buyToken",type:"address"},{name:"receiver",type:"address"},{name:"sellAmount",type:"uint256"},{name:"buyAmount",type:"uint256"},{name:"validTo",type:"uint32"},{name:"appData",type:"bytes32"},{name:"feeAmount",type:"uint256"},{name:"kind",type:"string"},{name:"partiallyFillable",type:"bool"},{name:"sellTokenBalance",type:"string"},{name:"buyTokenBalance",type:"string"}]}),$q=Object.freeze({OrderCancellations:[{name:"orderUids",type:"bytes[]"}]})});import{TypedDataEncoder as Pq,getAddress as Mq}from"ethers";var Fq,Ul=L(()=>{Lh();Bh();Fq=Object.freeze(["https://limit-orders.1inch.io","https://api.1inch.dev/orderbook"])});import{Interface as Fh}from"ethers";var BA,rU,DA,nU,oU,iU,sU,FA,aU,qs=L(()=>{mn();ci();Nr();Ds();Pl();Ml();Dl();ql();Fs();Ul();BA=new Set(["evm","evm-swap","evm-bridge","evm-nft","evm-order","btc","sol","hl","poly","lighter"]),rU=Object.freeze({swap:5,bridge:5,perps:0,nft:0,mint:0,transfer:0,approve:0,delegate:0,identity:0,order:0,cancel:0,leverage:0,margin:0,approveBuilder:0,stake:0,unstake:0}),DA=Object.freeze({"0x04e45aaf":{provider:"uniswap-v3",action:"swap",layout:"router02-exact-input-single"},"0x414bf389":{provider:"uniswap-v3",action:"swap",layout:"swap-router-exact-input-single"},"0xc04b8d59":{provider:"uniswap-v3",action:"swap",layout:"exact-input-deadline"},"0xb858183f":{provider:"uniswap-v3",action:"swap",layout:"exact-input"},"0x5ae401dc":{provider:"uniswap-v3",action:"swap",layout:"multicall-deadline"},"0xa026383e":{provider:"aerodrome",action:"swap",layout:"aerodrome-exact-input-single"},"0x7b939232":{provider:"across-v3",action:"bridge",layout:"across-deposit-v3"}}),nU=Object.freeze({"0x161ac21f":{provider:"opensea-nft",action:"mint",layout:"seadrop-mint-public"},"0xc2f6663a":{provider:"opensea-nft",action:"mint",layout:"seadrop-mint-allowlist"}}),oU=new Fh(["function buySpecificNFT(uint256 tokenId,uint256 maxCost) payable","function sellNFT(uint256 tokenId,uint256 minPayout) payable"]),iU=new Fh(["function mintAllowList(address nftContract,address feeRecipient,address minterIfNotPayer,uint256 quantity,(uint80 mintPrice,uint48 maxTotalMintableByWallet,uint48 startTime,uint48 endTime,uint48 dropStageIndex,uint32 maxTokenSupplyForStage,uint16 feeBps,bool restrictFeeRecipients) mintParams,bytes32[] proof) payable"]),sU=Object.freeze({"0xa0712d68":{provider:"nft-mint",action:"mint",layout:"mint-quantity"},"0x1249c58b":{provider:"nft-mint",action:"mint",layout:"mint-no-args"},"0x2db11544":{provider:"nft-mint",action:"mint",layout:"mint-quantity"},"0xefef39a1":{provider:"nft-mint",action:"mint",layout:"mint-quantity"},"0xa6f2ae3a":{provider:"nft-mint",action:"mint",layout:"mint-no-args"}}),FA=Object.freeze([...BA]),aU=Object.freeze({...DA})});import{encode as uU}from"@msgpack/msgpack";import{keccak256 as fU,verifyTypedData as pU}from"ethers";var mU,hU,jl=L(()=>{mU=Object.freeze({name:"Exchange",version:"1",chainId:1337,verifyingContract:"0x0000000000000000000000000000000000000000"}),hU=Object.freeze({Agent:[{name:"source",type:"string"},{name:"connectionId",type:"bytes32"}]})});var Hl=L(()=>{Fs()});import{ed25519 as vU}from"@noble/curves/ed25519.js";import{base58 as AU}from"@scure/base";import{RawTx as IU,SigHash as OU,Transaction as TU}from"@scure/btc-signer";import{Transaction as NU,keccak256 as $U,verifyTypedData as RU}from"ethers";var zl=L(()=>{jl();Hl()});import{base58 as qU}from"@scure/base";var Us=L(()=>{qs();Ds();mn();zl()});var Uh=L(()=>{Us();qs()});import{wordlists as jA}from"ethers";function KA(e){let t=String(e).trim().toLowerCase().split(/\s+/).filter(Boolean);return WA.has(t.length)&&t.every(r=>jA.en.getWordIndex(r)>=0)}function JA(e){let t=jh(e);return YA.has(t)||GA.test(t)}function jh(e){return String(e).replace(/[^a-z0-9]/gi,"").toLowerCase()}function XA(e){let t=jh(e);return[...HA].some(r=>t.includes(r))}function QA(e,t,r){if(typeof t=="string"){if(zA.some(n=>n.test(t))||KA(t))throw new ui(r);if(VA.test(t)&&!JA(e))throw new ui(r)}}function js(e,t="$",r=""){if(e==null||typeof e=="boolean")return e;if(typeof e=="string")return QA(r,e,t),e;if(typeof e=="number"){if(!Number.isFinite(e))throw new TypeError(`action receipt: non-finite number at ${t}`);return e}if(typeof e=="bigint")return e.toString();if(Array.isArray(e))return e.map((o,i)=>js(o,`${t}[${i}]`,r));if(typeof e!="object"||Object.getPrototypeOf(e)!==Object.prototype)throw new TypeError(`action receipt: JSON-like value required at ${t}`);let n={};for(let o of Object.keys(e).sort()){let i=`${t}.${o}`;if(XA(o))throw new ui(i);e[o]!==void 0&&(n[o]=js(e[o],i,o))}return n}function re(e){return js(e)}function Wl(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(Wl).join(",")}]`:`{${Object.keys(e).map(t=>`${JSON.stringify(t)}:${Wl(e[t])}`).join(",")}}`}function co(e){return Wl(js(e))}var HA,zA,WA,VA,GA,YA,ui,nr=L(()=>{HA=new Set(["privatekey","privkey","secretkey","seedphrase","seed","mnemonic","passphrase","password","keystore","keymaterial","wif","xprv","xpriv","bearer","authorization","signature","apikey","credential"]),zA=[/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/,/\bxprv[0-9A-Za-z]{50,}\b/],WA=new Set([12,15,18,21,24]);VA=/^\s*(?:0x)?[0-9a-fA-F]{64}\s*$/,GA=/(hash|digest|root|salt|nonce|proof|commitment|sig|id)(?:e?s)?$/i,YA=new Set(["calldata","data","publickey","pubkey","message","payload","input","extradata"]);ui=class extends Error{constructor(t){super(`action receipt refused: secret-bearing field at ${t}`),this.name="ActionReceiptSecretError",this.code="ACTION_RECEIPT_SECRET"}}});import{wordlists as tj}from"ethers";var Hh,nj,lo=L(()=>{nr();Hh=64*1024,nj=32*1024});var t_,sj,aj,zs=L(()=>{lo();t_=["schemaVersion","buildVersion","recordType","execution","custody"],sj=[...t_,"recordHash"],aj=Object.freeze({signed:new Set(["workflow.signed","legacy.signed"]),submitted:new Set(["workflow.submitted","legacy.broadcast"]),finalized:new Set(["workflow.finalized"]),reorged:new Set(["workflow.reorged"]),orphaned:new Set(["workflow.orphaned"]),compensating:new Set(["workflow.compensating"]),compensated:new Set(["workflow.compensated"])})});var r_,Qh,fj,Jl=L(()=>{lo();zs();r_=Object.freeze(["draft","checked","approval","signed","submitted","finalized","reorged","orphaned","compensating","compensated","failed","cancelled"]),Qh=Object.freeze(["workflow.drafted","workflow.checked","workflow.approval_requested","workflow.approval_granted","workflow.signed","workflow.submitted","workflow.finalized","workflow.reorged","workflow.orphaned","workflow.compensating","workflow.compensated","workflow.failed","workflow.cancelled","workflow.annotated"]),fj=new Set(Qh)});var c_,Zh=L(()=>{lo();Jl();c_=64*1024*1024});var bj,xj,Sj,eg=L(()=>{bj=Object.freeze(["chainId","agentAddress","accountAddress","actions","targets","maxValueWei","maxGasWei","maxSlippageBps","expiresAt","nonce","revocationKey"]),xj=Object.freeze(["read","simulate"]),Sj=1440*60});function Xl(e){let t=String(e),r=t.toLowerCase().replace(/[\s._-]+/g,"");return l_.test(t)||u_.includes(r)}function d_(e){return e.replace(/"([A-Za-z0-9_-]+)"\s*:\s*"(?:0x)?([0-9a-fA-F]{64})"/g,(t,r)=>rg.includes(String(r).toLowerCase().replace(/[_-]/g,""))?`"${r}":"<hex64>"`:t)}function ng(e){let t;try{t=JSON.stringify(e)}catch(o){throw new ir("$",`unserializable-payload: ${String(o?.message||o)}`)}if(t===void 0)return"null";let r=d_(t);for(let{rule:o,re:i}of tg)if(i.test(r))throw new ir("$<serialized>",o);if(/(?:^|[^0-9a-fA-Fx])0x[0-9a-fA-F]{64}(?![0-9a-fA-F])/.test(r))throw new ir("$<serialized>","raw-32-byte-hex-embedded");return JSON.parse(t,(o,i)=>{if(o&&Xl(o))throw new ir(`$<serialized>.${o}`,"forbidden-key-name");return i}),t}function or(e,t="$",r=new Set,n=""){if(e==null)return e;if(typeof e=="string"){let o=rg.includes(String(n).toLowerCase().replace(/[_-]/g,""));for(let{rule:i,re:s}of tg)if(!(o&&i.startsWith("raw-32-byte-hex"))&&s.test(e))throw new ir(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"&&Xl(o))throw new ir(`${t}[${JSON.stringify(o)}]`,"forbidden-key-name");or(o,`${t}[key]`,r),or(i,`${t}[${String(o)}]`,r)}return e}if(e instanceof Set){let o=0;for(let i of e.values())or(i,`${t}[${o++}]`,r);return e}if(Array.isArray(e))return e.forEach((o,i)=>or(o,`${t}[${i}]`,r)),e;for(let[o,i]of Object.entries(e)){if(Xl(o))throw new ir(`${t}.${o}`,"forbidden-key-name");or(i,`${t}.${o}`,r,o)}return e}var ir,l_,u_,tg,rg,Ql=L(()=>{eg();ir=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}},l_=/(private[_-]?key|secret|bearer|keystore|mnemonic|seed[_-]?phrase|passphrase|password|api[_-]?key|access[_-]?token|auth[_-]?token|session[_-]?token|signer[_-]?url|signature)/i,u_=Object.freeze(["privkey","wif","xprv","seed"]);tg=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}]),rg=Object.freeze(["grantid","id","hash","sha256","sha256hex","checksum","txhash","transactionhash","blockhash","digest","userophash","commithash","prevhash","intenthash","canonicalhash","payloadhash","requestid"])});import{createHash as f_}from"node:crypto";function eu(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(eu).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${eu(e[t])}`).join(",")}}`}function p_(e){return e===void 0?null:JSON.parse(JSON.stringify(e))}function Ws(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let t of Object.values(e))Ws(t)}return e}function tu(e,t="fact"){try{or(e,t)}catch{throw new Error(`${t} contains custody material and is forbidden`)}}function sg(e){return f_("sha256").update(eu(e)).digest("hex")}function ag({tradeId:e,state:t,fact:r,asOf:n,previousHash:o,external:i}){let s={tradeId:e,state:t,asOf:n,previousHash:o??null,external:i===!0,fact:p_(r)};return Ws({...s,hash:sg(s)})}function Ks({tradeId:e,intent:t,asOf:r=0}={}){if(!e||typeof e!="string")throw new Error("tradeId is required");if(!t||typeof t!="object"||Array.isArray(t))throw new Error("intent fact is required");tu(t,"intent");let n=ag({tradeId:e,state:"intent",fact:t,asOf:r,previousHash:null,external:!1});return Ws({tradeId:e,state:"intent",events:[n],headHash:n.hash,custody:"none",execution:"prepare-only"})}function cg(e,t,r,n={}){if(Vs(e),!(og[e.state]||[]).includes(t))throw new Error(`invalid trade transition ${e.state} -> ${t}`);if(!r||typeof r!="object"||Array.isArray(r))throw new Error(`${t} fact is required`);tu(r,t);let i=n.external===!0||n.externallySupplied===!0;if(ig.has(t)&&!i)throw new Error(`${t} must be an externally supplied fact; this module never signs or broadcasts`);let s=e.events.at(-1),a=n.asOf??s.asOf;if(!Number.isFinite(Number(a))||Number(a)<Number(s.asOf))throw new Error("asOf must be finite and monotonic");let c=ag({tradeId:e.tradeId,state:t,fact:r,asOf:a,previousHash:s.hash,external:i});return Ws({...e,state:t,events:[...e.events,c],headHash:c.hash})}function Vs(e){if(!e||!Array.isArray(e.events)||e.events.length===0)throw new Error("invalid trade lifecycle");if(e.custody!=="none")throw new Error("trade lifecycle custody must be none");if(e.execution!=="prepare-only")throw new Error("trade lifecycle execution must be prepare-only");let t=null;for(let r=0;r<e.events.length;r+=1){let n=e.events[r],{hash:o,...i}=n;if(sg(i)!==o)throw new Error(`trade event ${r} hash mismatch`);if(tu(n.fact,`trade event ${r} fact`),!Number.isFinite(Number(n.asOf))||t&&Number(n.asOf)<Number(t.asOf))throw new Error(`trade event ${r} asOf must be finite and monotonic`);if(n.tradeId!==e.tradeId||n.previousHash!==t?.hash&&r>0)throw new Error(`trade event ${r} chain mismatch`);if(r===0&&(n.state!=="intent"||n.previousHash!==null))throw new Error("trade lifecycle must start with intent");if(t&&!og[t.state]?.includes(n.state))throw new Error(`invalid recorded transition ${t.state} -> ${n.state}`);if(ig.has(n.state)&&n.external!==!0)throw new Error(`${n.state} is not externally supplied`);t=n}if(e.state!==t.state||e.headHash!==t.hash)throw new Error("trade lifecycle head mismatch");return!0}var Zl,og,ig,Gs=L(()=>{Ql();Zl=Object.freeze(["intent","quote_comparison","simulation","prepared","approval","signed","broadcast","settlement","balance_delta","position"]),og=Object.freeze(Object.fromEntries(Zl.map((e,t)=>[e,Object.freeze(t+1<Zl.length?[Zl[t+1]]:[])]))),ig=new Set(["signed","broadcast"])});var m_,lg=L(()=>{Gs();lo();zs();m_=Object.freeze({intent:"draft",quote_comparison:"draft",simulation:"draft",prepared:"checked",approval:"approval",signed:"signed",broadcast:"submitted",settlement:"finalized",balance_delta:"compensated",position:"compensated"})});var ug=L(()=>{lo();zs();Jl();Zh();lg()});var g_,w_,y_,h6,g6,w6,y6,b6,b_,x6,dg=L(()=>{g_=Object.freeze(["owner","operator","agent","viewer"]),w_=Object.freeze(["tenant","config","policy","grant","workflow","trade","receipt","audit","telemetry"]),y_=Object.freeze({read:"read",create:"create",update:"update",delete:"delete",manage:"manage",prepare:"prepare",cancel:"cancel",export:"export",approve:"approve"}),h6=Object.freeze(["owner"]),g6=Object.freeze({ALLOW_ROLE_PERMISSION:"allow.role_permission",DENY_MISSING_CONTEXT:"deny.missing_context",DENY_INVALID_CONTEXT:"deny.invalid_context",DENY_INVALID_REQUEST:"deny.invalid_request",DENY_UNKNOWN_RESOURCE:"deny.unknown_resource",DENY_UNKNOWN_ACTION:"deny.unknown_action",DENY_UNBOUND_OBJECT:"deny.unbound_object",DENY_TENANT_MISMATCH:"deny.tenant_mismatch",DENY_RESOURCE_MISMATCH:"deny.resource_mismatch",DENY_ROLE_PERMISSION:"deny.role_permission",DENY_POLICY_NOT_APPROVER:"deny.policy_not_approver"}),w6=new Set(g_),y6=new Set(w_),b6=new Set(Object.values(y_)),b_=Object.freeze({owner:Object.freeze(["tenant:read","tenant:manage","config:read","config:manage","policy:read","policy:manage","grant:read","grant:create","grant:update","grant:delete","grant:manage","workflow:read","workflow:create","workflow:update","workflow:delete","workflow:cancel","workflow:approve","trade:read","trade:prepare","receipt:read","receipt:export","audit:read","audit:export","telemetry:read","telemetry:create","telemetry:export"]),operator:Object.freeze(["tenant:read","config:read","policy:read","grant:read","workflow:read","workflow:create","workflow:update","workflow:cancel","trade:read","trade:prepare","receipt:read","audit:read","telemetry:read","telemetry:create"]),agent:Object.freeze(["tenant:read","config:read","policy:read","grant:read","workflow:read","workflow:create","workflow:update","trade:read","trade:prepare","receipt:read","telemetry:create"]),viewer:Object.freeze(["tenant:read","config:read","grant:read","workflow:read","trade:read","receipt:read","audit:read","telemetry:read"])}),x6=Object.freeze(Object.fromEntries(Object.entries(b_).map(([e,t])=>[e,Object.freeze([...t])])))});var x_,S_,E_,k6,A6,_6,I6,O6,T6,ru=L(()=>{dg();x_=Object.freeze(["succeeded","denied","invalid","failed","cancelled","timed_out","unavailable","skipped"]),S_=Object.freeze(["workflow","task","intent","plan","run","event","eval"]),E_=Object.freeze(["taskId","intentId","planId","runId","eventId"]),k6=Object.freeze({maxAttributes:24,maxKeyLength:48,maxStringLength:256,maxArrayLength:8}),A6=new Set(x_),_6=new Set(S_),I6=new Set(E_),O6=Object.freeze(["authorization","bearer","cookie","credential","password","passphrase","secret","token","privatekey","privkey","seed","mnemonic","keystore","signature","prompt","systemmessage","usermessage","assistantmessage","rawtransaction","signedtransaction","serializedtransaction","transactionbytes","calldata","callbytes","inputdata"]),T6=Object.freeze({taskId:"x-oracle-task-id",intentId:"x-oracle-intent-id",planId:"x-oracle-plan-id",runId:"x-oracle-run-id",eventId:"x-oracle-event-id"})});var P6,fg=L(()=>{ug();ru();P6=Object.freeze({"workflow.cancelled":"cancelled","workflow.failed":"failed"})});var U6,pg=L(()=>{ru();U6=32*1024*1024});import hn from"node:fs";function v_(e){if(!e.isFile())throw new Error("local-vault: secret source must be a regular file");if(e.uid!==process.getuid?.())throw new Error("local-vault: secret source must be owned by this user");if(e.nlink!==1)throw new Error("local-vault: refusing hard-linked secret source");if((e.mode&63)!==0)throw new Error("local-vault: secret source must be owner-only (0600)")}function uo(e){let t;try{t=hn.openSync(e,hn.constants.O_RDONLY|hn.constants.O_NOFOLLOW)}catch(r){throw r.code==="ELOOP"?new Error("local-vault: refusing symlink"):r}try{let r=hn.fstatSync(t);if(v_(r),r.size>1024*1024)throw new Error("local-vault: secret source changed or is too large");let n=hn.lstatSync(e);if(n.isSymbolicLink()||n.dev!==r.dev||n.ino!==r.ino)throw new Error("local-vault: secret source changed or is too large");return hn.readFileSync(t,"utf8").replace(/[\r\n]+$/,"")}finally{hn.closeSync(t)}}var z6,W6,K6,fo=L(()=>{z6=Object.freeze({N:1<<17,r:8,p:1}),W6=256*1024*1024,K6=16*1024});var G6,mg=L(()=>{G6=Object.freeze({1:{name:"ethereum",mode:"mempool-private",endpoints:["https://rpc.flashbots.net/fast","https://rpc.mevblocker.io"]},8453:{name:"base",mode:"sequencer",endpoints:["https://mainnet-sequencer.base.org"]},10:{name:"optimism",mode:"sequencer",endpoints:["https://mainnet-sequencer.optimism.io"]},42161:{name:"arbitrum",mode:"sequencer",endpoints:["https://arb1-sequencer.arbitrum.io/rpc"]},56:{name:"bsc",mode:"mempool-private",endpoints:["https://rpc.48.club","https://bsc.rpc.blxrbdn.com"]},137:{name:"polygon",mode:"mempool-private",endpoints:["https://polygon-bor-rpc.publicnode.com"]},43114:{name:"avalanche",mode:"public-only",endpoints:[]},999:{name:"hyperevm",mode:"public-only",endpoints:[]}})});import{homedir as nu}from"node:os";import{join as ou}from"node:path";function gg(e,t,r=""){let n=process.env[e];if(n!=null&&String(n).trim()!=="")return n;let o=t?process.env[t]:void 0;return o!=null&&String(o).trim()!==""?o:r}function wg(e,t,r=!0){let n=String(gg(e,t,"")).trim().toLowerCase();return n===""?r:!A_.includes(n)}var hg,k_,Q6,A_,iu=L(()=>{hg=process.env.ORACLE_PUBLIC_DESKTOP==="1",k_=hg?process.env.ORACLE_CONFIG_DIR||ou(nu(),".config","oracle"):ou(nu(),".config","oracle"),Q6=hg?k_:ou(nu(),".config","mad-desk");A_=["0","false","off","no"]});var r5,n5,o5,yg=L(()=>{iu();r5="0".repeat(64),n5=Object.freeze({PREPARE:"exec.prepare",SIGN:"exec.sign",BROADCAST:"exec.broadcast",POLICY_REJECT:"policy.reject",AUTH_GRANT:"auth.grant",AUTH_OK:"auth.verify.ok",AUTH_FAIL:"auth.verify.fail"}),o5=Promise.resolve()});var su=L(()=>{yg();pn();fo();Us()});var xg=L(()=>{});var vg={};Hr(vg,{SIGN_TIME_REVIEW_VERSION:()=>__,SignTimeReviewSecretError:()=>di,createSignTimeReview:()=>Eg});function au(e,t="$",r=""){if(e==null||typeof e=="boolean")return e;if(typeof e=="string"){let o=e.trim().split(/\s+/);if(N_.test(e)||$_.has(o.length)&&o.every(i=>/^[a-z]+$/i.test(i)))throw new di(t);return e}if(typeof e=="bigint")return e.toString();if(typeof e=="number"){if(!Number.isSafeInteger(e))throw new TypeError(`sign-time review: safe integer required at ${t}`);return e}if(Array.isArray(e))return e.map((o,i)=>au(o,`${t}[${i}]`,r));gn(e,t);let n={};for(let o of Object.keys(e).sort()){let i=o.replace(/[^a-z0-9]/gi,"");if(C_.test(i))throw new di(`${t}.${o}`);e[o]!==void 0&&(n[o]=au(e[o],`${t}.${o}`,o))}return n}function gn(e,t){if(e==null||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)throw new TypeError(`sign-time review: ${t} must be a plain object`);return e}function fi(e,t){if(e==null||e==="")throw new TypeError(`sign-time review: ${t} required`);return e}function po(e,t){let r=String(fi(e,t)).toLowerCase();if(!I_.test(r))throw new TypeError(`sign-time review: ${t} must be an EVM address`);return r}function sr(e,t,{positive:r=!1}={}){try{let n=BigInt(fi(e,t));if(n<0n||r&&n===0n)throw new Error;return n.toString()}catch{throw new TypeError(`sign-time review: ${t} must be an unsigned integer`)}}function cu(e,t){if(typeof e!="string"||e.length===0||e.length>500||e!==e.trim())throw new TypeError(`sign-time review: ${t} must be non-empty text`);return e}function Sg(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))Sg(t);Object.freeze(e)}return e}function R_(e,t){if(typeof e=="boolean")return{passed:e,reason:e?"passed":"failed"};gn(e,t);let r=e.passed??e.ok??e.allowed;if(typeof r!="boolean")throw new TypeError(`sign-time review: ${t} needs a boolean result`);let n=e.reason??e.message??e.name??(r?"passed":"failed");return{...e,passed:r,reason:cu(String(n),`${t}.reason`)}}function L_(e){if(!Array.isArray(e))throw new TypeError("sign-time review: policyChecks must be an array");let t=e.map((n,o)=>R_(n,`policyChecks[${o}]`)),r=t.filter(n=>!n.passed);return{checks:t,passed:t.length-r.length,failed:r.length,reasons:r.map(n=>n.reason)}}function P_(e){if(e==null)return null;if(gn(e,"simulation"),typeof e.status!="string"||!["ok","success","failed","error","unavailable","unknown"].includes(e.status))throw new TypeError("sign-time review: simulation.status is invalid");if(e.willRevert!==!0&&e.willRevert!==!1&&e.willRevert!==null)throw new TypeError("sign-time review: simulation.willRevert must be boolean or null");let t={status:e.status,willRevert:e.willRevert??null,summary:cu(String(e.summary??"simulation result recorded"),"simulation.summary")};return e.gasEstimate!=null&&(t.gasEstimate=sr(e.gasEstimate,"simulation.gasEstimate")),e.gasLimit!=null&&(t.gasLimit=sr(e.gasLimit,"simulation.gasLimit")),t}function M_(e){if(e==null)return null;if(!Array.isArray(e)||e.length===0)throw new TypeError("sign-time review: assetDeltas must be a non-empty array");return e.map((t,r)=>{gn(t,`assetDeltas[${r}]`);let n=sr(t.before,`assetDeltas[${r}].before`),o=sr(t.after,`assetDeltas[${r}].after`),i=(BigInt(o)-BigInt(n)).toString(),s;try{s=t.delta==null?i:BigInt(t.delta).toString()}catch{throw new TypeError(`sign-time review: assetDeltas[${r}].delta must be an integer`)}if(s!==i)throw new TypeError(`sign-time review: assetDeltas[${r}].delta does not match before/after`);return{...t,asset:cu(String(fi(t.asset??t.token,`assetDeltas[${r}].asset`)),`assetDeltas[${r}].asset`),before:n,after:o,delta:s}})}function B_(e){if(e==null)return[];if(!Array.isArray(e))throw new TypeError("sign-time review: approvalDeltas must be an array");return e.map((t,r)=>{gn(t,`approvalDeltas[${r}]`);let n=sr(t.amount??t.after,`approvalDeltas[${r}].amount`);if(t.revokeLike!=null&&typeof t.revokeLike!="boolean")throw new TypeError(`sign-time review: approvalDeltas[${r}].revokeLike must be boolean`);return{token:po(t.token,`approvalDeltas[${r}].token`),spender:po(t.spender,`approvalDeltas[${r}].spender`),owner:po(t.owner,`approvalDeltas[${r}].owner`),amount:n,revokeLike:t.revokeLike??BigInt(n)===0n}})}function Eg(e={}){gn(e,"input");let t=au(e),r=t.tx==null?t:gn(t.tx,"tx"),n=sr(t.chainId??r.chainId,"chainId",{positive:!0}),o=po(t.account??t.from??r.from,"account/from"),i=po(t.destination??t.to??r.to,"destination/to"),s=String(fi(t.prepareHash,"prepareHash")).toLowerCase();if(!T_.test(s))throw new TypeError("sign-time review: prepareHash must be a 32-byte hash");let a=t.route??t.venue;if(a==null)throw new TypeError("sign-time review: route/venue required");let c=t.decodedCalldata??t.decodedAction;if(c==null)throw new TypeError("sign-time review: decodedCalldata or decodedAction required");let u=String(fi(t.calldata??t.data??r.data,"calldata/data")).toLowerCase();if(!O_.test(u))throw new TypeError("sign-time review: calldata/data must be even-length hex");let d=t.policyChecks!==void 0&&t.policyChecks!==null,f=L_(d?t.policyChecks:[]),l=P_(t.simulation),p=M_(t.assetDeltas),m=B_(t.approvalDeltas),g=t.allowlistHits??[];if(!Array.isArray(g))throw new TypeError("sign-time review: allowlistHits must be an array");let y=l?.willRevert===!0||["failed","error"].includes(l?.status),b=l!=null&&l.willRevert===!1&&["ok","success"].includes(l.status),A=y||f.failed>0?"BLOCKED":b&&d&&f.checks.length>0&&p!=null?"READY":"UNKNOWN",S=typeof c=="string"?c:c.method??c.action??c.type??"transaction",w=`${A}: review ${S} on chain ${n}; policy ${f.passed} passed, ${f.failed} failed; ${p?.length??0} asset delta${p?.length===1?"":"s"}; local signature required`,v={reviewVersion:1,status:A,requiresLocalSignature:!0,signingLocal:!0,custody:"none",execution:"review-only",chainId:n,account:o,from:o,route:a,venue:t.venue??(typeof a=="string"?a:a.venue??a.provider??null),destination:i,to:i,...t.spender==null?{}:{spender:po(t.spender,"spender")},prepareHash:s,...t.decodedCalldata!==void 0?{decodedCalldata:t.decodedCalldata}:{decodedAction:t.decodedAction},calldata:u,data:u,selector:u.length>=10?u.slice(0,10):null,value:sr(t.value??r.value??0,"value"),...(t.gasEstimate??r.gasEstimate)==null?{}:{gasEstimate:sr(t.gasEstimate??r.gasEstimate,"gasEstimate")},...(t.gasLimit??r.gasLimit)==null?{}:{gasLimit:sr(t.gasLimit??r.gasLimit,"gasLimit")},simulation:l,policyChecks:f,allowlistHits:g,assetDeltas:p,approvalDeltas:m,summary:w};return Sg(v)}var __,I_,O_,T_,C_,N_,$_,di,lu=L(()=>{__=1,I_=/^0x[0-9a-f]{40}$/,O_=/^0x(?:[0-9a-f]{2})*$/,T_=/^(?:0x)?[0-9a-f]{64}$/,C_=/(privatekey|privkey|secretkey|seedphrase|mnemonic|passphrase|password|keystore|keymaterial|wif|xprv|xpriv|bearer|authorization|signature|apikey|credential)/i,N_=/\b(?:[5KL][1-9A-HJ-NP-Za-km-z]{50,51}|xprv[0-9A-Za-z]{50,})\b/,$_=new Set([12,15,18,21,24]),di=class extends Error{constructor(t){super(`sign-time review refused: secret-bearing field at ${t}`),this.name="SignTimeReviewSecretError",this.code="SIGN_TIME_REVIEW_SECRET"}}});import{readFileSync as m5,readdirSync as h5,existsSync as D_}from"node:fs";import{dirname as F_,join as pi}from"node:path";import{fileURLToPath as q_}from"node:url";function U_(){let e=[pi(mi,"descriptors"),pi(mi,"clear-sign","descriptors"),pi(mi,"..","clear-sign","descriptors"),pi(mi,"..","..","clear-sign","descriptors"),pi(mi,"..","..","..","clear-sign","descriptors")];for(let t of e)if(D_(t))return t;return e[0]}var mi,b5,x5,kg=L(()=>{mn();mi=F_(q_(import.meta.url));b5=U_(),x5=(1n<<256n)-1n});var Ag=L(()=>{lu();mn();kg()});import{Wallet as O5}from"ethers";import{base58 as C5}from"@scure/base";import{ed25519 as $5}from"@noble/curves/ed25519.js";import{NETWORK as L5,TEST_NETWORK as P5,WIF as M5,p2wpkh as B5}from"@scure/btc-signer";import{pubECDSA as F5}from"@scure/btc-signer/utils.js";var _g=L(()=>{});var j5,H5,z5,W5,K5,V5,G5,Y5,J5,X5,Q5,Ig=L(()=>{su();j5=Object.freeze(["spot-limit-create","spot-limit-cancel","spot-order-status"]),H5=Object.freeze(["binance","bybit","okx","coinbase"]),z5=Object.freeze({binance:"https://api.binance.com",bybit:"https://api.bybit.com",okx:"https://openapi.okx.com",coinbase:"https://api.exchange.coinbase.com"}),W5=Object.freeze({binance:"/api/v3",bybit:"/v5/order",okx:"/api/v5/trade",coinbase:"/orders"}),K5=Object.freeze(["version","surface","kind","venue","credentialRef","symbol","base","quote","side","baseSize","limitPrice","maxQuoteNotional","timeInForce","clientOrderId","expiresAtMs","venueOrderId","nonce","grantId","artifactHash"]),V5=Object.freeze(["market-create","withdraw","transfer","subaccount","leverage","futures","margin","convert","api-key"]),G5=Object.freeze(["url","host","path","method","headers","signature","apiKey","apiSecret","passphrase","privateKey","redirect","proxy"]),Y5=Object.freeze(["ccxt","binance-api-node","node-binance-api","coinbase-advanced-node","@okx-dex/okx-dex-sdk","bybit-api"]),J5=Object.freeze({perOrderQuote:"sealed-owner-policy",dailyGrossQuote:"sealed-owner-policy",scope:Object.freeze(["per-order","UTC-day","account","venue","quote"]),envelopeFieldIsNotCeiling:!0}),X5=Object.freeze({binanceRecvWindowMs:5e3,bybitWindowMs:5e3,maxLocalSkewMs:2e3}),Q5=Object.freeze({perSecond:1,perMinute:30,bind:"tighter"})});var Og=L(()=>{fo()});var z_,Tg,Ys=L(()=>{z_=Object.freeze({binance:Object.freeze({create:["POST","/api/v3/order"],cancel:["DELETE","/api/v3/order"],status:["GET","/api/v3/order"]}),bybit:Object.freeze({create:["POST","/v5/order/create"],cancel:["POST","/v5/order/cancel"],status:["GET","/v5/order/realtime"]}),okx:Object.freeze({create:["POST","/api/v5/trade/order"],cancel:["POST","/api/v5/trade/cancel-order"],status:["GET","/api/v5/trade/order"]}),coinbase:Object.freeze({create:["POST","/orders"],cancel:["DELETE","/orders/{order_id}"],status:["GET","/orders/{order_id}"]})}),Tg=Object.freeze({binance:"https://api.binance.com",bybit:"https://api.bybit.com",okx:"https://openapi.okx.com",coinbase:"https://api.exchange.coinbase.com"})});var Cg=L(()=>{Ys()});var c4,Ng=L(()=>{Ys();Cg();c4=256*1024});var $g=L(()=>{Ys();Ng()});var Rg=L(()=>{fo()});import at from"node:path";import W_ from"node:os";import{createHash as K_,randomBytes as t3}from"node:crypto";import{Interface as uu,keccak256 as n3}from"ethers";import{Transaction as i3}from"@scure/btc-signer";import{ed25519 as a3}from"@noble/curves/ed25519.js";function du(e){let t=process.env.ORACLE_SIGNER_STATE_DIR||at.join(process.env.XDG_STATE_HOME||at.join(W_.homedir(),".local","state"),"oracle"),r=K_("sha256").update(at.resolve(e)).digest("hex").slice(0,16);return{vault:at.join(e,"vault.json"),policy:at.join(e,"signer-policy.json"),policyKey:at.join(e,"policy-integrity-key"),policyAnchor:at.join(t,`signer-policy-${r}.high-water`),ledger:at.join(e,"signer-ledger.json"),ledgerAnchor:at.join(t,`signer-ledger-${r}.high-water`),cexOrders:at.join(e,"cex-orders.json"),cexOrdersAnchor:at.join(t,`cex-orders-${r}.high-water`),token:at.join(e,"signer-token"),lock:at.join(t,`signer-${r}.lock`),workflowLedger:at.join(e,"workflow-events.jsonl")}}var B3,D3,F3,Lg=L(()=>{Uh();fg();pg();Us();fo();mg();su();xg();mn();Ag();qs();Ds();zl();Dl();ql();Fs();Hl();Fl();jl();Pl();Ml();Ul();_g();Ig();Og();$g();Rg();B3=new uu(["function collection() view returns (address)","function token() view returns (address)","function robinhoodSwapFeeWei() view returns (uint256)","function quoteSpecificBuy(uint256 tokenId) view returns (uint256 totalCost,uint256 baseCost,uint256 fee,uint256 protocolFee,bool available)","function quoteSellNFT() view returns (uint256 netPayout,uint256 grossPayout,uint256 fee,uint256 protocolFee)","function inventory(uint256 tokenId) view returns (bool)","function buySpecificNFT(uint256 tokenId,uint256 maxCost) payable","function sellNFT(uint256 tokenId,uint256 minPayout) payable"]),D3=new uu(["function decimals() view returns (uint8)","function allowance(address owner,address spender) view returns (uint256)"]),F3=new uu(["function ownerOf(uint256 tokenId) view returns (address)","function getApproved(uint256 tokenId) view returns (address)","function isApprovedForAll(address owner,address operator) view returns (bool)"])});var gu={};Hr(gu,{CRYPTO_DESK_TOOLS:()=>hu,runCryptoDeskTool:()=>mu,signerAck:()=>Dg,signerDeny:()=>Fg,signerPending:()=>Mg,signerQueue:()=>Bg,signerStatus:()=>Pg,vaultStatus:()=>hi});import Js from"node:fs";import Xs from"node:path";import{homedir as V_}from"node:os";function fu(){return process.env.ORACLE_CONFIG_DIR||Xs.join(V_(),".config","oracle")}function hi(){let e=du(Xs.join(fu(),"signer")),t=Js.existsSync(e.vault),r=Js.existsSync(e.lock),n=t?r?"disarmed":"armed-owner-confirmed":"inert-no-key";return{vaultExists:t,policyConfigured:Js.existsSync(e.policy),armed:t&&!r,disarmed:r,capabilities:{swap:n,bridge:n},autonomous:!1,note:"Keys stay on this machine. Exact confirmation is required before any broadcast."}}function Y_(){let e=Xs.join(fu(),"signer.env");try{for(let t of Js.readFileSync(e,"utf8").split(`
|
|
11
|
+
`,{mode:384}),ii.renameSync(n,r)}function _l(e=process.env){return Al(e).watches}function Il({chain:e,token:t,condition:r,note:n}={},o=process.env){if(!e||!t||!r)throw new Error("watch requires chain, token, condition");let i={id:hA(),chain:String(e),token:String(t),condition:String(r),note:n?String(n):null,actionMode:"alert_only",createdAt:new Date().toISOString()},s=Al(o);return s.watches.push(i),Ah(s,o),i}function yA(e,t=process.env){let r=Al(t),n=r.watches.filter(o=>o.id!==e);return n.length===r.watches.length?!1:(Ah({watches:n},t),!0)}var Ol=L(()=>{});function Tl(e){let t=xA[Number(e)]||[];return new Set([...t,...bA].map(r=>String(r).trim().toLowerCase()).filter(Boolean))}var bA,xA,Cl=L(()=>{bA=["0x000000000022d473030f116ddee9f6b43ac78ba3"],xA={4663:["0xcaf681a66d020601342297493863e78c959e5cb2","0x33e885ed0ec9bf04ecfb19341582aadcb4c8a9e7","0x1f7d7550b1b028f7571e69a784071f0205fd2efa","0x0bd7d308f8e1639fab988df18a8011f41eacad73","0x5fc5360d0400a0fd4f2af552add042d716f1d168","0xb477751b76cf82d00a686a1232f5fcd772414af3","0xff5cb29241f002ffed2eaa224e3e996d24a6e8d1"],8453:["0x2626664c2603336e57b271c5c0b26f421741e481","0x6ff5693b99212da76ad316178a184ab56d299b43","0x3d4e44eb1374240ce5f1b871ab261cd16335b76a","0x33128a8fc17869897dce68ed026d694621f6fdfd","0x4200000000000000000000000000000000000006","0x833589fcd6edb6e08f4c7c32d4f71b54bda02913","0xbe6d8f0d05cc4be24d5167a3ef062215be6d18a5","0x254cf9e1e6e233aa1ac962cb9b05b2cfeaae15b0","0x5e7bb104d84c7cb9b682aac2f3d509f5f406809a","0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0x888888888889758f76e7103c6cbf23abbf58f946","0x3f170631ed9821ca51a59d996ab095162438dc10","0x4f37a9d177470499a2dd084621020b023fcffc1f","0xc92e8bdf79f0507f65a392b0ab4667716bfe0110"],42161:["0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45","0x61ffe014ba17989e743c5f6cb21bf9697530b21e","0x82af49447d8a07e3bd95bd0d56f35241523fbab1","0xaf88d065e77c8cc2239327c5edb3a432268e5831","0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9","0x888888888889758f76e7103c6cbf23abbf58f946","0xeaedc32a51c510d35ebc11088fd5ff2b47aacf2e","0x2191718cd32d02b8e60badffea33e4b5dd9a0a0d","0xc92e8bdf79f0507f65a392b0ab4667716bfe0110","0x1c3fa76e6e1088bce750f23a5bfcffa1efef6a41","0x7452c558d45f8afc8c83dae62c3f8a5be19c71f6"],1:["0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45","0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0x4cd00e387622c35bddb9b4c962c136462338bc31","0x6a000f20005980200259b80c5102003040001068","0xae563e3f8219521950555f5962419c8919758ea2","0x45312ea0eff7e09c83cbe249fa1d7598c4c8cd4e","0xc92e8bdf79f0507f65a392b0ab4667716bfe0110"],137:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0x0dcded3545d565ba3b19e683431381007245d983"],10:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xe2fa4e1d17725e72dcdafe943ecf45df4b9e285b","0x0dcded3545d565ba3b19e683431381007245d983"],56:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xa72c85c258a81761433b4e8da60505fe3dd551cc"],43114:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xf39ca6ede9bf7820a952b52f3c94af526bab9015","0x0dcded3545d565ba3b19e683431381007245d983","0x8f550e53dfe96c055d5bdb267c21f268fcaf63b2","0x820f5ffc5b525cd4d88cd91acf2c28f16530cc68"],999:["0x0a0758d937d1059c356d4714e57f5df0239bce1a","0xd2002373543ce3527023c75e7518c274a51ce712"],2741:["0x4f8c9056bb8a3616693a76922fa35d53c056e5b3"],988:["0x026f252016a7c47cdef1f05a3fc9e20c92a49c37","0xff5cb29241f002ffed2eaa224e3e996d24a6e8d1","0x817997ca8394e26cce3de3a076a4889b27dbf9de","0x3dea4be5615974f31624404ef288ba3b36dfeb83","0xeaf7ac0fdf150cdd89340fb762d83848de6a7b83","0x779ded0c9e1022225f8e0630b35a9b54be713736","0xbc6f7725f08232c151b528bdfcaaf89993ca86ee"]}});var si=L(()=>{});var ao=L(()=>{});var ai,ci=L(()=>{si();ao();ai=100});import{isAddress as zD}from"ethers";var $l=L(()=>{ci();si();ao()});import{Interface as vA,isAddress as JD}from"ethers";var eF,Ih=L(()=>{$l();si();ao();eF=new vA(["function approve(address spender,uint256 amount) returns (bool)"])});import{Interface as kA,isAddress as nF}from"ethers";var aF,cF,Oh=L(()=>{$l();si();ao();aF=new kA(["function approve(address spender,uint256 amount) returns (bool)"]),cF=Object.freeze({42161:"0x1c3fa76e6e1088bce750f23a5bfcffa1efef6a41",43114:"0x8f550e53dfe96c055d5bdb267c21f268fcaf63b2"})});var pn=L(()=>{});import{Interface as AA,MaxUint256 as mF,isAddress as hF,keccak256 as gF,toUtf8Bytes as wF}from"ethers";var vF,mn=L(()=>{Cl();Ih();Oh();pn();ao();vF=new AA(["function approve(address spender,uint256 amount) returns (bool)"])});var Ds=L(()=>{mn()});import{Address as OF,NETWORK as TF,OutScript as CF,RawTx as NF,SigHash as $F,TEST_NETWORK as RF,Transaction as LF}from"@scure/btc-signer";var Pl=L(()=>{});import{createHash as _A}from"node:crypto";import{base58 as DF}from"@scure/base";import{getCompiledTransactionMessageDecoder as qF}from"@solana/transaction-messages";var Th,UF,Ml=L(()=>{Th=e=>_A("sha256").update(`global:${e}`).digest().subarray(0,8).toString("hex"),UF=new Map([[Th("route"),{name:"route",prefixBytes:0}],[Th("shared_accounts_route"),{name:"shared_accounts_route",prefixBytes:1}]])});var Ch=L(()=>{ul()});var YF,JF,Dl=L(()=>{pn();Ch();YF=Object.freeze({"perp-order":"order","hip3-order":"order","hip4-order":"order","perp-bracket":"order","perp-cancel":"cancel","perp-leverage":"leverage","perp-isolated-margin":"margin","builder-fee-approval":"approveBuilder","hype-stake-deposit":"stake","hype-stake-withdraw":"unstake","hype-delegate":"delegate","hype-undelegate":"delegate"}),JF=Object.freeze({"perp-order":"order","hip3-order":"order","hip4-order":"order","perp-bracket":"order","perp-cancel":"cancel","perp-leverage":"updateLeverage","perp-isolated-margin":"updateIsolatedMargin","builder-fee-approval":"approveBuilderFee","hype-stake-deposit":"cDeposit","hype-stake-withdraw":"cWithdraw","hype-delegate":"tokenDelegate","hype-undelegate":"tokenDelegate"})});var ZF,Fl=L(()=>{pn();ZF="0x"+"00".repeat(32)});var IA,oq,ql=L(()=>{Fl();pn();IA=Object.freeze([["salt","uint256"],["maker","address"],["signer","address"],["tokenId","uint256"],["makerAmount","uint256"],["takerAmount","uint256"],["side","uint8"],["signatureType","uint8"],["timestamp","uint256"],["metadata","bytes32"],["builder","bytes32"]]),oq=Object.freeze(IA.map(e=>e[0]))});var Fs=L(()=>{pn()});import{TypedDataEncoder as lq,getAddress as uq,isAddress as dq}from"ethers";var OA,TA,Lh=L(()=>{Nr();OA=Object.freeze({1:"0x111111125421cA6dc452d289314280a0f8842A65",8453:"0x111111125421cA6dc452d289314280a0f8842A65",42161:"0x111111125421cA6dc452d289314280a0f8842A65",10:"0x111111125421cA6dc452d289314280a0f8842A65",137:"0x111111125421cA6dc452d289314280a0f8842A65",56:"0x111111125421cA6dc452d289314280a0f8842A65"}),TA=Object.freeze({Order:[{name:"salt",type:"uint256"},{name:"maker",type:"address"},{name:"receiver",type:"address"},{name:"makerAsset",type:"address"},{name:"takerAsset",type:"address"},{name:"makingAmount",type:"uint256"},{name:"takingAmount",type:"uint256"},{name:"makerTraits",type:"uint256"}]})});var mq,Ph=L(()=>{mq=Object.freeze({READ:"read",PREPARE:"prepare",EXECUTE:"execute",AUTONOMOUS:"autonomous"})});var Mh=L(()=>{});import{TypedDataEncoder as Eq,getAddress as vq,isAddress as kq}from"ethers";var CA,Nq,NA,$q,Bh=L(()=>{Ge();ci();Ph();Mh();Nr();CA=Object.freeze({1:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",100:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",42161:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",8453:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41"}),Nq=Object.freeze({1:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",100:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",42161:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",8453:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110"}),NA=Object.freeze({Order:[{name:"sellToken",type:"address"},{name:"buyToken",type:"address"},{name:"receiver",type:"address"},{name:"sellAmount",type:"uint256"},{name:"buyAmount",type:"uint256"},{name:"validTo",type:"uint32"},{name:"appData",type:"bytes32"},{name:"feeAmount",type:"uint256"},{name:"kind",type:"string"},{name:"partiallyFillable",type:"bool"},{name:"sellTokenBalance",type:"string"},{name:"buyTokenBalance",type:"string"}]}),$q=Object.freeze({OrderCancellations:[{name:"orderUids",type:"bytes[]"}]})});import{TypedDataEncoder as Pq,getAddress as Mq}from"ethers";var Fq,Ul=L(()=>{Lh();Bh();Fq=Object.freeze(["https://limit-orders.1inch.io","https://api.1inch.dev/orderbook"])});import{Interface as Fh}from"ethers";var BA,rU,DA,nU,oU,iU,sU,FA,aU,qs=L(()=>{mn();ci();Nr();Ds();Pl();Ml();Dl();ql();Fs();Ul();BA=new Set(["evm","evm-swap","evm-bridge","evm-nft","evm-order","btc","sol","hl","poly","lighter"]),rU=Object.freeze({swap:5,bridge:5,perps:0,nft:0,mint:0,transfer:0,approve:0,delegate:0,identity:0,order:0,cancel:0,leverage:0,margin:0,approveBuilder:0,stake:0,unstake:0}),DA=Object.freeze({"0x04e45aaf":{provider:"uniswap-v3",action:"swap",layout:"router02-exact-input-single"},"0x414bf389":{provider:"uniswap-v3",action:"swap",layout:"swap-router-exact-input-single"},"0xc04b8d59":{provider:"uniswap-v3",action:"swap",layout:"exact-input-deadline"},"0xb858183f":{provider:"uniswap-v3",action:"swap",layout:"exact-input"},"0x5ae401dc":{provider:"uniswap-v3",action:"swap",layout:"multicall-deadline"},"0xa026383e":{provider:"aerodrome",action:"swap",layout:"aerodrome-exact-input-single"},"0x7b939232":{provider:"across-v3",action:"bridge",layout:"across-deposit-v3"}}),nU=Object.freeze({"0x161ac21f":{provider:"opensea-nft",action:"mint",layout:"seadrop-mint-public"},"0xc2f6663a":{provider:"opensea-nft",action:"mint",layout:"seadrop-mint-allowlist"}}),oU=new Fh(["function buySpecificNFT(uint256 tokenId,uint256 maxCost) payable","function sellNFT(uint256 tokenId,uint256 minPayout) payable"]),iU=new Fh(["function mintAllowList(address nftContract,address feeRecipient,address minterIfNotPayer,uint256 quantity,(uint80 mintPrice,uint48 maxTotalMintableByWallet,uint48 startTime,uint48 endTime,uint48 dropStageIndex,uint32 maxTokenSupplyForStage,uint16 feeBps,bool restrictFeeRecipients) mintParams,bytes32[] proof) payable"]),sU=Object.freeze({"0xa0712d68":{provider:"nft-mint",action:"mint",layout:"mint-quantity"},"0x1249c58b":{provider:"nft-mint",action:"mint",layout:"mint-no-args"},"0x2db11544":{provider:"nft-mint",action:"mint",layout:"mint-quantity"},"0xefef39a1":{provider:"nft-mint",action:"mint",layout:"mint-quantity"},"0xa6f2ae3a":{provider:"nft-mint",action:"mint",layout:"mint-no-args"}}),FA=Object.freeze([...BA]),aU=Object.freeze({...DA})});import{encode as uU}from"@msgpack/msgpack";import{keccak256 as fU,verifyTypedData as pU}from"ethers";var mU,hU,jl=L(()=>{mU=Object.freeze({name:"Exchange",version:"1",chainId:1337,verifyingContract:"0x0000000000000000000000000000000000000000"}),hU=Object.freeze({Agent:[{name:"source",type:"string"},{name:"connectionId",type:"bytes32"}]})});var Hl=L(()=>{Fs()});import{ed25519 as vU}from"@noble/curves/ed25519.js";import{base58 as AU}from"@scure/base";import{RawTx as IU,SigHash as OU,Transaction as TU}from"@scure/btc-signer";import{Transaction as NU,keccak256 as $U,verifyTypedData as RU}from"ethers";var zl=L(()=>{jl();Hl()});import{base58 as qU}from"@scure/base";var Us=L(()=>{qs();Ds();mn();zl()});var Uh=L(()=>{Us();qs()});import{wordlists as jA}from"ethers";function KA(e){let t=String(e).trim().toLowerCase().split(/\s+/).filter(Boolean);return WA.has(t.length)&&t.every(r=>jA.en.getWordIndex(r)>=0)}function JA(e){let t=jh(e);return YA.has(t)||GA.test(t)}function jh(e){return String(e).replace(/[^a-z0-9]/gi,"").toLowerCase()}function XA(e){let t=jh(e);return[...HA].some(r=>t.includes(r))}function QA(e,t,r){if(typeof t=="string"){if(zA.some(n=>n.test(t))||KA(t))throw new ui(r);if(VA.test(t)&&!JA(e))throw new ui(r)}}function js(e,t="$",r=""){if(e==null||typeof e=="boolean")return e;if(typeof e=="string")return QA(r,e,t),e;if(typeof e=="number"){if(!Number.isFinite(e))throw new TypeError(`action receipt: non-finite number at ${t}`);return e}if(typeof e=="bigint")return e.toString();if(Array.isArray(e))return e.map((o,i)=>js(o,`${t}[${i}]`,r));if(typeof e!="object"||Object.getPrototypeOf(e)!==Object.prototype)throw new TypeError(`action receipt: JSON-like value required at ${t}`);let n={};for(let o of Object.keys(e).sort()){let i=`${t}.${o}`;if(XA(o))throw new ui(i);e[o]!==void 0&&(n[o]=js(e[o],i,o))}return n}function re(e){return js(e)}function Wl(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(Wl).join(",")}]`:`{${Object.keys(e).map(t=>`${JSON.stringify(t)}:${Wl(e[t])}`).join(",")}}`}function co(e){return Wl(js(e))}var HA,zA,WA,VA,GA,YA,ui,nr=L(()=>{HA=new Set(["privatekey","privkey","secretkey","seedphrase","seed","mnemonic","passphrase","password","keystore","keymaterial","wif","xprv","xpriv","bearer","authorization","signature","apikey","credential"]),zA=[/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/,/\bxprv[0-9A-Za-z]{50,}\b/],WA=new Set([12,15,18,21,24]);VA=/^\s*(?:0x)?[0-9a-fA-F]{64}\s*$/,GA=/(hash|digest|root|salt|nonce|proof|commitment|sig|id)(?:e?s)?$/i,YA=new Set(["calldata","data","publickey","pubkey","message","payload","input","extradata"]);ui=class extends Error{constructor(t){super(`action receipt refused: secret-bearing field at ${t}`),this.name="ActionReceiptSecretError",this.code="ACTION_RECEIPT_SECRET"}}});import{wordlists as tj}from"ethers";var Hh,nj,lo=L(()=>{nr();Hh=64*1024,nj=32*1024});var t_,sj,aj,zs=L(()=>{lo();t_=["schemaVersion","buildVersion","recordType","execution","custody"],sj=[...t_,"recordHash"],aj=Object.freeze({signed:new Set(["workflow.signed","legacy.signed"]),submitted:new Set(["workflow.submitted","legacy.broadcast"]),finalized:new Set(["workflow.finalized"]),reorged:new Set(["workflow.reorged"]),orphaned:new Set(["workflow.orphaned"]),compensating:new Set(["workflow.compensating"]),compensated:new Set(["workflow.compensated"])})});var r_,Qh,fj,Jl=L(()=>{lo();zs();r_=Object.freeze(["draft","checked","approval","signed","submitted","finalized","reorged","orphaned","compensating","compensated","failed","cancelled"]),Qh=Object.freeze(["workflow.drafted","workflow.checked","workflow.approval_requested","workflow.approval_granted","workflow.signed","workflow.submitted","workflow.finalized","workflow.reorged","workflow.orphaned","workflow.compensating","workflow.compensated","workflow.failed","workflow.cancelled","workflow.annotated"]),fj=new Set(Qh)});var c_,Zh=L(()=>{lo();Jl();c_=64*1024*1024});var bj,xj,Sj,eg=L(()=>{bj=Object.freeze(["chainId","agentAddress","accountAddress","actions","targets","maxValueWei","maxGasWei","maxSlippageBps","expiresAt","nonce","revocationKey"]),xj=Object.freeze(["read","simulate"]),Sj=1440*60});function Xl(e){let t=String(e),r=t.toLowerCase().replace(/[\s._-]+/g,"");return l_.test(t)||u_.includes(r)}function d_(e){return e.replace(/"([A-Za-z0-9_-]+)"\s*:\s*"(?:0x)?([0-9a-fA-F]{64})"/g,(t,r)=>rg.includes(String(r).toLowerCase().replace(/[_-]/g,""))?`"${r}":"<hex64>"`:t)}function ng(e){let t;try{t=JSON.stringify(e)}catch(o){throw new ir("$",`unserializable-payload: ${String(o?.message||o)}`)}if(t===void 0)return"null";let r=d_(t);for(let{rule:o,re:i}of tg)if(i.test(r))throw new ir("$<serialized>",o);if(/(?:^|[^0-9a-fA-Fx])0x[0-9a-fA-F]{64}(?![0-9a-fA-F])/.test(r))throw new ir("$<serialized>","raw-32-byte-hex-embedded");return JSON.parse(t,(o,i)=>{if(o&&Xl(o))throw new ir(`$<serialized>.${o}`,"forbidden-key-name");return i}),t}function or(e,t="$",r=new Set,n=""){if(e==null)return e;if(typeof e=="string"){let o=rg.includes(String(n).toLowerCase().replace(/[_-]/g,""));for(let{rule:i,re:s}of tg)if(!(o&&i.startsWith("raw-32-byte-hex"))&&s.test(e))throw new ir(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"&&Xl(o))throw new ir(`${t}[${JSON.stringify(o)}]`,"forbidden-key-name");or(o,`${t}[key]`,r),or(i,`${t}[${String(o)}]`,r)}return e}if(e instanceof Set){let o=0;for(let i of e.values())or(i,`${t}[${o++}]`,r);return e}if(Array.isArray(e))return e.forEach((o,i)=>or(o,`${t}[${i}]`,r)),e;for(let[o,i]of Object.entries(e)){if(Xl(o))throw new ir(`${t}.${o}`,"forbidden-key-name");or(i,`${t}.${o}`,r,o)}return e}var ir,l_,u_,tg,rg,Ql=L(()=>{eg();ir=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}},l_=/(private[_-]?key|secret|bearer|keystore|mnemonic|seed[_-]?phrase|passphrase|password|api[_-]?key|access[_-]?token|auth[_-]?token|session[_-]?token|signer[_-]?url|signature)/i,u_=Object.freeze(["privkey","wif","xprv","seed"]);tg=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}]),rg=Object.freeze(["grantid","id","hash","sha256","sha256hex","checksum","txhash","transactionhash","blockhash","digest","userophash","commithash","prevhash","intenthash","canonicalhash","payloadhash","requestid"])});import{createHash as f_}from"node:crypto";function eu(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(eu).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${eu(e[t])}`).join(",")}}`}function p_(e){return e===void 0?null:JSON.parse(JSON.stringify(e))}function Ws(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let t of Object.values(e))Ws(t)}return e}function tu(e,t="fact"){try{or(e,t)}catch{throw new Error(`${t} contains custody material and is forbidden`)}}function sg(e){return f_("sha256").update(eu(e)).digest("hex")}function ag({tradeId:e,state:t,fact:r,asOf:n,previousHash:o,external:i}){let s={tradeId:e,state:t,asOf:n,previousHash:o??null,external:i===!0,fact:p_(r)};return Ws({...s,hash:sg(s)})}function Ks({tradeId:e,intent:t,asOf:r=0}={}){if(!e||typeof e!="string")throw new Error("tradeId is required");if(!t||typeof t!="object"||Array.isArray(t))throw new Error("intent fact is required");tu(t,"intent");let n=ag({tradeId:e,state:"intent",fact:t,asOf:r,previousHash:null,external:!1});return Ws({tradeId:e,state:"intent",events:[n],headHash:n.hash,custody:"none",execution:"prepare-only"})}function cg(e,t,r,n={}){if(Vs(e),!(og[e.state]||[]).includes(t))throw new Error(`invalid trade transition ${e.state} -> ${t}`);if(!r||typeof r!="object"||Array.isArray(r))throw new Error(`${t} fact is required`);tu(r,t);let i=n.external===!0||n.externallySupplied===!0;if(ig.has(t)&&!i)throw new Error(`${t} must be an externally supplied fact; this module never signs or broadcasts`);let s=e.events.at(-1),a=n.asOf??s.asOf;if(!Number.isFinite(Number(a))||Number(a)<Number(s.asOf))throw new Error("asOf must be finite and monotonic");let c=ag({tradeId:e.tradeId,state:t,fact:r,asOf:a,previousHash:s.hash,external:i});return Ws({...e,state:t,events:[...e.events,c],headHash:c.hash})}function Vs(e){if(!e||!Array.isArray(e.events)||e.events.length===0)throw new Error("invalid trade lifecycle");if(e.custody!=="none")throw new Error("trade lifecycle custody must be none");if(e.execution!=="prepare-only")throw new Error("trade lifecycle execution must be prepare-only");let t=null;for(let r=0;r<e.events.length;r+=1){let n=e.events[r],{hash:o,...i}=n;if(sg(i)!==o)throw new Error(`trade event ${r} hash mismatch`);if(tu(n.fact,`trade event ${r} fact`),!Number.isFinite(Number(n.asOf))||t&&Number(n.asOf)<Number(t.asOf))throw new Error(`trade event ${r} asOf must be finite and monotonic`);if(n.tradeId!==e.tradeId||n.previousHash!==t?.hash&&r>0)throw new Error(`trade event ${r} chain mismatch`);if(r===0&&(n.state!=="intent"||n.previousHash!==null))throw new Error("trade lifecycle must start with intent");if(t&&!og[t.state]?.includes(n.state))throw new Error(`invalid recorded transition ${t.state} -> ${n.state}`);if(ig.has(n.state)&&n.external!==!0)throw new Error(`${n.state} is not externally supplied`);t=n}if(e.state!==t.state||e.headHash!==t.hash)throw new Error("trade lifecycle head mismatch");return!0}var Zl,og,ig,Gs=L(()=>{Ql();Zl=Object.freeze(["intent","quote_comparison","simulation","prepared","approval","signed","broadcast","settlement","balance_delta","position"]),og=Object.freeze(Object.fromEntries(Zl.map((e,t)=>[e,Object.freeze(t+1<Zl.length?[Zl[t+1]]:[])]))),ig=new Set(["signed","broadcast"])});var m_,lg=L(()=>{Gs();lo();zs();m_=Object.freeze({intent:"draft",quote_comparison:"draft",simulation:"draft",prepared:"checked",approval:"approval",signed:"signed",broadcast:"submitted",settlement:"finalized",balance_delta:"compensated",position:"compensated"})});var ug=L(()=>{lo();zs();Jl();Zh();lg()});var g_,w_,y_,h6,g6,w6,y6,b6,b_,x6,dg=L(()=>{g_=Object.freeze(["owner","operator","agent","viewer"]),w_=Object.freeze(["tenant","config","policy","grant","workflow","trade","receipt","audit","telemetry","context","lifecycle"]),y_=Object.freeze({read:"read",create:"create",update:"update",delete:"delete",manage:"manage",prepare:"prepare",cancel:"cancel",export:"export",approve:"approve"}),h6=Object.freeze(["owner"]),g6=Object.freeze({ALLOW_ROLE_PERMISSION:"allow.role_permission",DENY_MISSING_CONTEXT:"deny.missing_context",DENY_INVALID_CONTEXT:"deny.invalid_context",DENY_INVALID_REQUEST:"deny.invalid_request",DENY_UNKNOWN_RESOURCE:"deny.unknown_resource",DENY_UNKNOWN_ACTION:"deny.unknown_action",DENY_UNBOUND_OBJECT:"deny.unbound_object",DENY_TENANT_MISMATCH:"deny.tenant_mismatch",DENY_RESOURCE_MISMATCH:"deny.resource_mismatch",DENY_ROLE_PERMISSION:"deny.role_permission",DENY_POLICY_NOT_APPROVER:"deny.policy_not_approver"}),w6=new Set(g_),y6=new Set(w_),b6=new Set(Object.values(y_)),b_=Object.freeze({owner:Object.freeze(["tenant:read","tenant:manage","config:read","config:manage","policy:read","policy:manage","grant:read","grant:create","grant:update","grant:delete","grant:manage","workflow:read","workflow:create","workflow:update","workflow:delete","workflow:cancel","workflow:approve","trade:read","trade:prepare","receipt:read","receipt:export","audit:read","audit:export","telemetry:read","telemetry:create","telemetry:export","context:read","context:create","context:update","context:delete","context:manage","context:export","lifecycle:read","lifecycle:create","lifecycle:update","lifecycle:delete","lifecycle:manage","lifecycle:approve","lifecycle:export"]),operator:Object.freeze(["tenant:read","config:read","policy:read","grant:read","workflow:read","workflow:create","workflow:update","workflow:cancel","trade:read","trade:prepare","receipt:read","audit:read","telemetry:read","telemetry:create","context:read","context:create","context:update","context:delete","lifecycle:read","lifecycle:create","lifecycle:update","lifecycle:manage"]),agent:Object.freeze(["tenant:read","config:read","policy:read","grant:read","workflow:read","workflow:create","workflow:update","trade:read","trade:prepare","receipt:read","telemetry:create","context:read","context:create","context:update","lifecycle:read"]),viewer:Object.freeze(["tenant:read","config:read","grant:read","workflow:read","trade:read","receipt:read","audit:read","telemetry:read","context:read","lifecycle:read"])}),x6=Object.freeze(Object.fromEntries(Object.entries(b_).map(([e,t])=>[e,Object.freeze([...t])])))});var x_,S_,E_,k6,A6,_6,I6,O6,T6,ru=L(()=>{dg();x_=Object.freeze(["succeeded","denied","invalid","failed","cancelled","timed_out","unavailable","skipped"]),S_=Object.freeze(["workflow","task","intent","plan","run","event","eval"]),E_=Object.freeze(["taskId","intentId","planId","runId","eventId"]),k6=Object.freeze({maxAttributes:24,maxKeyLength:48,maxStringLength:256,maxArrayLength:8}),A6=new Set(x_),_6=new Set(S_),I6=new Set(E_),O6=Object.freeze(["authorization","bearer","cookie","credential","password","passphrase","secret","token","privatekey","privkey","seed","mnemonic","keystore","signature","prompt","systemmessage","usermessage","assistantmessage","rawtransaction","signedtransaction","serializedtransaction","transactionbytes","calldata","callbytes","inputdata"]),T6=Object.freeze({taskId:"x-oracle-task-id",intentId:"x-oracle-intent-id",planId:"x-oracle-plan-id",runId:"x-oracle-run-id",eventId:"x-oracle-event-id"})});var P6,fg=L(()=>{ug();ru();P6=Object.freeze({"workflow.cancelled":"cancelled","workflow.failed":"failed"})});var U6,pg=L(()=>{ru();U6=32*1024*1024});import hn from"node:fs";function v_(e){if(!e.isFile())throw new Error("local-vault: secret source must be a regular file");if(e.uid!==process.getuid?.())throw new Error("local-vault: secret source must be owned by this user");if(e.nlink!==1)throw new Error("local-vault: refusing hard-linked secret source");if((e.mode&63)!==0)throw new Error("local-vault: secret source must be owner-only (0600)")}function uo(e){let t;try{t=hn.openSync(e,hn.constants.O_RDONLY|hn.constants.O_NOFOLLOW)}catch(r){throw r.code==="ELOOP"?new Error("local-vault: refusing symlink"):r}try{let r=hn.fstatSync(t);if(v_(r),r.size>1024*1024)throw new Error("local-vault: secret source changed or is too large");let n=hn.lstatSync(e);if(n.isSymbolicLink()||n.dev!==r.dev||n.ino!==r.ino)throw new Error("local-vault: secret source changed or is too large");return hn.readFileSync(t,"utf8").replace(/[\r\n]+$/,"")}finally{hn.closeSync(t)}}var z6,W6,K6,fo=L(()=>{z6=Object.freeze({N:1<<17,r:8,p:1}),W6=256*1024*1024,K6=16*1024});var G6,mg=L(()=>{G6=Object.freeze({1:{name:"ethereum",mode:"mempool-private",endpoints:["https://rpc.flashbots.net/fast","https://rpc.mevblocker.io"]},8453:{name:"base",mode:"sequencer",endpoints:["https://mainnet-sequencer.base.org"]},10:{name:"optimism",mode:"sequencer",endpoints:["https://mainnet-sequencer.optimism.io"]},42161:{name:"arbitrum",mode:"sequencer",endpoints:["https://arb1-sequencer.arbitrum.io/rpc"]},56:{name:"bsc",mode:"mempool-private",endpoints:["https://rpc.48.club","https://bsc.rpc.blxrbdn.com"]},137:{name:"polygon",mode:"mempool-private",endpoints:["https://polygon-bor-rpc.publicnode.com"]},43114:{name:"avalanche",mode:"public-only",endpoints:[]},999:{name:"hyperevm",mode:"public-only",endpoints:[]}})});import{homedir as nu}from"node:os";import{join as ou}from"node:path";function gg(e,t,r=""){let n=process.env[e];if(n!=null&&String(n).trim()!=="")return n;let o=t?process.env[t]:void 0;return o!=null&&String(o).trim()!==""?o:r}function wg(e,t,r=!0){let n=String(gg(e,t,"")).trim().toLowerCase();return n===""?r:!A_.includes(n)}var hg,k_,Q6,A_,iu=L(()=>{hg=process.env.ORACLE_PUBLIC_DESKTOP==="1",k_=hg?process.env.ORACLE_CONFIG_DIR||ou(nu(),".config","oracle"):ou(nu(),".config","oracle"),Q6=hg?k_:ou(nu(),".config","mad-desk");A_=["0","false","off","no"]});var r5,n5,o5,yg=L(()=>{iu();r5="0".repeat(64),n5=Object.freeze({PREPARE:"exec.prepare",SIGN:"exec.sign",BROADCAST:"exec.broadcast",POLICY_REJECT:"policy.reject",AUTH_GRANT:"auth.grant",AUTH_OK:"auth.verify.ok",AUTH_FAIL:"auth.verify.fail"}),o5=Promise.resolve()});var su=L(()=>{yg();pn();fo();Us()});var xg=L(()=>{});var vg={};Hr(vg,{SIGN_TIME_REVIEW_VERSION:()=>__,SignTimeReviewSecretError:()=>di,createSignTimeReview:()=>Eg});function au(e,t="$",r=""){if(e==null||typeof e=="boolean")return e;if(typeof e=="string"){let o=e.trim().split(/\s+/);if(N_.test(e)||$_.has(o.length)&&o.every(i=>/^[a-z]+$/i.test(i)))throw new di(t);return e}if(typeof e=="bigint")return e.toString();if(typeof e=="number"){if(!Number.isSafeInteger(e))throw new TypeError(`sign-time review: safe integer required at ${t}`);return e}if(Array.isArray(e))return e.map((o,i)=>au(o,`${t}[${i}]`,r));gn(e,t);let n={};for(let o of Object.keys(e).sort()){let i=o.replace(/[^a-z0-9]/gi,"");if(C_.test(i))throw new di(`${t}.${o}`);e[o]!==void 0&&(n[o]=au(e[o],`${t}.${o}`,o))}return n}function gn(e,t){if(e==null||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)throw new TypeError(`sign-time review: ${t} must be a plain object`);return e}function fi(e,t){if(e==null||e==="")throw new TypeError(`sign-time review: ${t} required`);return e}function po(e,t){let r=String(fi(e,t)).toLowerCase();if(!I_.test(r))throw new TypeError(`sign-time review: ${t} must be an EVM address`);return r}function sr(e,t,{positive:r=!1}={}){try{let n=BigInt(fi(e,t));if(n<0n||r&&n===0n)throw new Error;return n.toString()}catch{throw new TypeError(`sign-time review: ${t} must be an unsigned integer`)}}function cu(e,t){if(typeof e!="string"||e.length===0||e.length>500||e!==e.trim())throw new TypeError(`sign-time review: ${t} must be non-empty text`);return e}function Sg(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))Sg(t);Object.freeze(e)}return e}function R_(e,t){if(typeof e=="boolean")return{passed:e,reason:e?"passed":"failed"};gn(e,t);let r=e.passed??e.ok??e.allowed;if(typeof r!="boolean")throw new TypeError(`sign-time review: ${t} needs a boolean result`);let n=e.reason??e.message??e.name??(r?"passed":"failed");return{...e,passed:r,reason:cu(String(n),`${t}.reason`)}}function L_(e){if(!Array.isArray(e))throw new TypeError("sign-time review: policyChecks must be an array");let t=e.map((n,o)=>R_(n,`policyChecks[${o}]`)),r=t.filter(n=>!n.passed);return{checks:t,passed:t.length-r.length,failed:r.length,reasons:r.map(n=>n.reason)}}function P_(e){if(e==null)return null;if(gn(e,"simulation"),typeof e.status!="string"||!["ok","success","failed","error","unavailable","unknown"].includes(e.status))throw new TypeError("sign-time review: simulation.status is invalid");if(e.willRevert!==!0&&e.willRevert!==!1&&e.willRevert!==null)throw new TypeError("sign-time review: simulation.willRevert must be boolean or null");let t={status:e.status,willRevert:e.willRevert??null,summary:cu(String(e.summary??"simulation result recorded"),"simulation.summary")};return e.gasEstimate!=null&&(t.gasEstimate=sr(e.gasEstimate,"simulation.gasEstimate")),e.gasLimit!=null&&(t.gasLimit=sr(e.gasLimit,"simulation.gasLimit")),t}function M_(e){if(e==null)return null;if(!Array.isArray(e)||e.length===0)throw new TypeError("sign-time review: assetDeltas must be a non-empty array");return e.map((t,r)=>{gn(t,`assetDeltas[${r}]`);let n=sr(t.before,`assetDeltas[${r}].before`),o=sr(t.after,`assetDeltas[${r}].after`),i=(BigInt(o)-BigInt(n)).toString(),s;try{s=t.delta==null?i:BigInt(t.delta).toString()}catch{throw new TypeError(`sign-time review: assetDeltas[${r}].delta must be an integer`)}if(s!==i)throw new TypeError(`sign-time review: assetDeltas[${r}].delta does not match before/after`);return{...t,asset:cu(String(fi(t.asset??t.token,`assetDeltas[${r}].asset`)),`assetDeltas[${r}].asset`),before:n,after:o,delta:s}})}function B_(e){if(e==null)return[];if(!Array.isArray(e))throw new TypeError("sign-time review: approvalDeltas must be an array");return e.map((t,r)=>{gn(t,`approvalDeltas[${r}]`);let n=sr(t.amount??t.after,`approvalDeltas[${r}].amount`);if(t.revokeLike!=null&&typeof t.revokeLike!="boolean")throw new TypeError(`sign-time review: approvalDeltas[${r}].revokeLike must be boolean`);return{token:po(t.token,`approvalDeltas[${r}].token`),spender:po(t.spender,`approvalDeltas[${r}].spender`),owner:po(t.owner,`approvalDeltas[${r}].owner`),amount:n,revokeLike:t.revokeLike??BigInt(n)===0n}})}function Eg(e={}){gn(e,"input");let t=au(e),r=t.tx==null?t:gn(t.tx,"tx"),n=sr(t.chainId??r.chainId,"chainId",{positive:!0}),o=po(t.account??t.from??r.from,"account/from"),i=po(t.destination??t.to??r.to,"destination/to"),s=String(fi(t.prepareHash,"prepareHash")).toLowerCase();if(!T_.test(s))throw new TypeError("sign-time review: prepareHash must be a 32-byte hash");let a=t.route??t.venue;if(a==null)throw new TypeError("sign-time review: route/venue required");let c=t.decodedCalldata??t.decodedAction;if(c==null)throw new TypeError("sign-time review: decodedCalldata or decodedAction required");let u=String(fi(t.calldata??t.data??r.data,"calldata/data")).toLowerCase();if(!O_.test(u))throw new TypeError("sign-time review: calldata/data must be even-length hex");let d=t.policyChecks!==void 0&&t.policyChecks!==null,f=L_(d?t.policyChecks:[]),l=P_(t.simulation),p=M_(t.assetDeltas),m=B_(t.approvalDeltas),g=t.allowlistHits??[];if(!Array.isArray(g))throw new TypeError("sign-time review: allowlistHits must be an array");let y=l?.willRevert===!0||["failed","error"].includes(l?.status),b=l!=null&&l.willRevert===!1&&["ok","success"].includes(l.status),A=y||f.failed>0?"BLOCKED":b&&d&&f.checks.length>0&&p!=null?"READY":"UNKNOWN",S=typeof c=="string"?c:c.method??c.action??c.type??"transaction",w=`${A}: review ${S} on chain ${n}; policy ${f.passed} passed, ${f.failed} failed; ${p?.length??0} asset delta${p?.length===1?"":"s"}; local signature required`,v={reviewVersion:1,status:A,requiresLocalSignature:!0,signingLocal:!0,custody:"none",execution:"review-only",chainId:n,account:o,from:o,route:a,venue:t.venue??(typeof a=="string"?a:a.venue??a.provider??null),destination:i,to:i,...t.spender==null?{}:{spender:po(t.spender,"spender")},prepareHash:s,...t.decodedCalldata!==void 0?{decodedCalldata:t.decodedCalldata}:{decodedAction:t.decodedAction},calldata:u,data:u,selector:u.length>=10?u.slice(0,10):null,value:sr(t.value??r.value??0,"value"),...(t.gasEstimate??r.gasEstimate)==null?{}:{gasEstimate:sr(t.gasEstimate??r.gasEstimate,"gasEstimate")},...(t.gasLimit??r.gasLimit)==null?{}:{gasLimit:sr(t.gasLimit??r.gasLimit,"gasLimit")},simulation:l,policyChecks:f,allowlistHits:g,assetDeltas:p,approvalDeltas:m,summary:w};return Sg(v)}var __,I_,O_,T_,C_,N_,$_,di,lu=L(()=>{__=1,I_=/^0x[0-9a-f]{40}$/,O_=/^0x(?:[0-9a-f]{2})*$/,T_=/^(?:0x)?[0-9a-f]{64}$/,C_=/(privatekey|privkey|secretkey|seedphrase|mnemonic|passphrase|password|keystore|keymaterial|wif|xprv|xpriv|bearer|authorization|signature|apikey|credential)/i,N_=/\b(?:[5KL][1-9A-HJ-NP-Za-km-z]{50,51}|xprv[0-9A-Za-z]{50,})\b/,$_=new Set([12,15,18,21,24]),di=class extends Error{constructor(t){super(`sign-time review refused: secret-bearing field at ${t}`),this.name="SignTimeReviewSecretError",this.code="SIGN_TIME_REVIEW_SECRET"}}});import{readFileSync as m5,readdirSync as h5,existsSync as D_}from"node:fs";import{dirname as F_,join as pi}from"node:path";import{fileURLToPath as q_}from"node:url";function U_(){let e=[pi(mi,"descriptors"),pi(mi,"clear-sign","descriptors"),pi(mi,"..","clear-sign","descriptors"),pi(mi,"..","..","clear-sign","descriptors"),pi(mi,"..","..","..","clear-sign","descriptors")];for(let t of e)if(D_(t))return t;return e[0]}var mi,b5,x5,kg=L(()=>{mn();mi=F_(q_(import.meta.url));b5=U_(),x5=(1n<<256n)-1n});var Ag=L(()=>{lu();mn();kg()});import{Wallet as O5}from"ethers";import{base58 as C5}from"@scure/base";import{ed25519 as $5}from"@noble/curves/ed25519.js";import{NETWORK as L5,TEST_NETWORK as P5,WIF as M5,p2wpkh as B5}from"@scure/btc-signer";import{pubECDSA as F5}from"@scure/btc-signer/utils.js";var _g=L(()=>{});var j5,H5,z5,W5,K5,V5,G5,Y5,J5,X5,Q5,Ig=L(()=>{su();j5=Object.freeze(["spot-limit-create","spot-limit-cancel","spot-order-status"]),H5=Object.freeze(["binance","bybit","okx","coinbase"]),z5=Object.freeze({binance:"https://api.binance.com",bybit:"https://api.bybit.com",okx:"https://openapi.okx.com",coinbase:"https://api.exchange.coinbase.com"}),W5=Object.freeze({binance:"/api/v3",bybit:"/v5/order",okx:"/api/v5/trade",coinbase:"/orders"}),K5=Object.freeze(["version","surface","kind","venue","credentialRef","symbol","base","quote","side","baseSize","limitPrice","maxQuoteNotional","timeInForce","clientOrderId","expiresAtMs","venueOrderId","nonce","grantId","artifactHash"]),V5=Object.freeze(["market-create","withdraw","transfer","subaccount","leverage","futures","margin","convert","api-key"]),G5=Object.freeze(["url","host","path","method","headers","signature","apiKey","apiSecret","passphrase","privateKey","redirect","proxy"]),Y5=Object.freeze(["ccxt","binance-api-node","node-binance-api","coinbase-advanced-node","@okx-dex/okx-dex-sdk","bybit-api"]),J5=Object.freeze({perOrderQuote:"sealed-owner-policy",dailyGrossQuote:"sealed-owner-policy",scope:Object.freeze(["per-order","UTC-day","account","venue","quote"]),envelopeFieldIsNotCeiling:!0}),X5=Object.freeze({binanceRecvWindowMs:5e3,bybitWindowMs:5e3,maxLocalSkewMs:2e3}),Q5=Object.freeze({perSecond:1,perMinute:30,bind:"tighter"})});var Og=L(()=>{fo()});var z_,Tg,Ys=L(()=>{z_=Object.freeze({binance:Object.freeze({create:["POST","/api/v3/order"],cancel:["DELETE","/api/v3/order"],status:["GET","/api/v3/order"]}),bybit:Object.freeze({create:["POST","/v5/order/create"],cancel:["POST","/v5/order/cancel"],status:["GET","/v5/order/realtime"]}),okx:Object.freeze({create:["POST","/api/v5/trade/order"],cancel:["POST","/api/v5/trade/cancel-order"],status:["GET","/api/v5/trade/order"]}),coinbase:Object.freeze({create:["POST","/orders"],cancel:["DELETE","/orders/{order_id}"],status:["GET","/orders/{order_id}"]})}),Tg=Object.freeze({binance:"https://api.binance.com",bybit:"https://api.bybit.com",okx:"https://openapi.okx.com",coinbase:"https://api.exchange.coinbase.com"})});var Cg=L(()=>{Ys()});var c4,Ng=L(()=>{Ys();Cg();c4=256*1024});var $g=L(()=>{Ys();Ng()});var Rg=L(()=>{fo()});import at from"node:path";import W_ from"node:os";import{createHash as K_,randomBytes as t3}from"node:crypto";import{Interface as uu,keccak256 as n3}from"ethers";import{Transaction as i3}from"@scure/btc-signer";import{ed25519 as a3}from"@noble/curves/ed25519.js";function du(e){let t=process.env.ORACLE_SIGNER_STATE_DIR||at.join(process.env.XDG_STATE_HOME||at.join(W_.homedir(),".local","state"),"oracle"),r=K_("sha256").update(at.resolve(e)).digest("hex").slice(0,16);return{vault:at.join(e,"vault.json"),policy:at.join(e,"signer-policy.json"),policyKey:at.join(e,"policy-integrity-key"),policyAnchor:at.join(t,`signer-policy-${r}.high-water`),ledger:at.join(e,"signer-ledger.json"),ledgerAnchor:at.join(t,`signer-ledger-${r}.high-water`),cexOrders:at.join(e,"cex-orders.json"),cexOrdersAnchor:at.join(t,`cex-orders-${r}.high-water`),token:at.join(e,"signer-token"),lock:at.join(t,`signer-${r}.lock`),workflowLedger:at.join(e,"workflow-events.jsonl")}}var B3,D3,F3,Lg=L(()=>{Uh();fg();pg();Us();fo();mg();su();xg();mn();Ag();qs();Ds();zl();Dl();ql();Fs();Hl();Fl();jl();Pl();Ml();Ul();_g();Ig();Og();$g();Rg();B3=new uu(["function collection() view returns (address)","function token() view returns (address)","function robinhoodSwapFeeWei() view returns (uint256)","function quoteSpecificBuy(uint256 tokenId) view returns (uint256 totalCost,uint256 baseCost,uint256 fee,uint256 protocolFee,bool available)","function quoteSellNFT() view returns (uint256 netPayout,uint256 grossPayout,uint256 fee,uint256 protocolFee)","function inventory(uint256 tokenId) view returns (bool)","function buySpecificNFT(uint256 tokenId,uint256 maxCost) payable","function sellNFT(uint256 tokenId,uint256 minPayout) payable"]),D3=new uu(["function decimals() view returns (uint8)","function allowance(address owner,address spender) view returns (uint256)"]),F3=new uu(["function ownerOf(uint256 tokenId) view returns (address)","function getApproved(uint256 tokenId) view returns (address)","function isApprovedForAll(address owner,address operator) view returns (bool)"])});var gu={};Hr(gu,{CRYPTO_DESK_TOOLS:()=>hu,runCryptoDeskTool:()=>mu,signerAck:()=>Dg,signerDeny:()=>Fg,signerPending:()=>Mg,signerQueue:()=>Bg,signerStatus:()=>Pg,vaultStatus:()=>hi});import Js from"node:fs";import Xs from"node:path";import{homedir as V_}from"node:os";function fu(){return process.env.ORACLE_CONFIG_DIR||Xs.join(V_(),".config","oracle")}function hi(){let e=du(Xs.join(fu(),"signer")),t=Js.existsSync(e.vault),r=Js.existsSync(e.lock),n=t?r?"disarmed":"armed-owner-confirmed":"inert-no-key";return{vaultExists:t,policyConfigured:Js.existsSync(e.policy),armed:t&&!r,disarmed:r,capabilities:{swap:n,bridge:n},autonomous:!1,note:"Keys stay on this machine. Exact confirmation is required before any broadcast."}}function Y_(){let e=Xs.join(fu(),"signer.env");try{for(let t of Js.readFileSync(e,"utf8").split(`
|
|
12
12
|
`)){let r=t.trim();if(!r||r.startsWith("#"))continue;let n=r.indexOf("=");if(n<1)continue;let o=r.slice(0,n).trim();o!=="ORACLE_SIGNER_HOST"&&o!=="ORACLE_SIGNER_PORT"||process.env[o]||(process.env[o]=r.slice(n+1).trim().replace(/^['\"]|['\"]$/g,""))}}catch{}}function J_(){Y_();let e=process.env.ORACLE_SIGNER_HOST||"127.0.0.1";if(!G_.has(e))throw new Error("signer: loopback host required");let t=Number(process.env.ORACLE_SIGNER_PORT||7432);if(!Number.isInteger(t)||t<1||t>65535)throw new Error("signer: invalid port");return{host:e,port:t,origin:`http://${e}`}}function X_(){let e=du(Xs.join(fu(),"signer"));return uo(e.token)}async function Rr(e,t,r){let{host:n,port:o,origin:i}=J_(),s;try{s=X_()}catch{throw new Error("local signer is not running")}if(!s)throw new Error("local signer is not running");let a;try{a=await fetch(`http://${n}:${o}${t}`,{method:e,headers:{authorization:`Bearer ${s}`,origin:i,host:`${n}:${o}`,...r?{"content-type":"application/json"}:{}},body:r?JSON.stringify(r):void 0})}catch{throw new Error("local signer is not running")}let c=await a.json().catch(()=>({}));if(!a.ok)throw new Error(c?.error||`signer ${a.status}`);return c}async function Pg(){let[e,t]=await Promise.allSettled([Rr("GET","/status"),Rr("GET","/health")]);return e.status==="fulfilled"?{ok:!0,running:!0,...e.value}:t.status==="fulfilled"?{ok:!0,running:!0,...t.value}:{ok:!1,running:!1,error:"local signer is not running"}}function pu(e={}){let{confirmationNonce:t,token:r,authorization:n,...o}=e&&typeof e=="object"?e:{};return o}async function Mg(){try{let e=await Rr("GET","/pending");return{ok:!0,running:!0,items:Array.isArray(e.items)?e.items:[],armed:e.armed===!0,execution:!1,note:"Queue with signer_queue, fill with signer_ack when the loopback signer is armed."}}catch{return{ok:!1,running:!1,items:[],error:"local signer is not running"}}}async function Bg(e){if(!e||typeof e!="object")return{ok:!1,error:"artifact required"};try{let t=await Rr("POST","/pending",{artifact:e});return{ok:!0,queued:!0,execution:!1,...pu(t)}}catch(t){return{ok:!1,queued:!1,error:String(t?.message||t)}}}async function Dg(e){let t=String(e||"").trim();if(!t)return{ok:!1,executed:!1,error:"id required"};try{let r=await Rr("POST","/ack",{id:t});return{ok:!0,executed:r.executed===!0,...pu(r)}}catch(r){return{ok:!1,executed:!1,error:String(r?.message||r)}}}async function Fg(e){let t=String(e||"").trim();if(!t)return{ok:!1,denied:!1,error:"id required"};try{let r=await Rr("POST","/deny",{id:t});return{ok:!0,denied:r.denied===!0,...pu(r)}}catch(r){return{ok:!1,denied:!1,error:String(r?.message||r)}}}async function mu(e,t={}){if(e==="vault_status")return{ok:!0,...hi()};if(e==="signer_status")return Pg();if(e==="signer_pending")return Mg();if(e==="signer_queue")return Bg(t?.artifact);if(e==="signer_ack")return Dg(t?.id||t?.digest);if(e==="signer_deny")return Fg(t?.id||t?.digest);if(e==="signer_execute"){if(!t?.artifact||!t?.confirmationNonce)throw new Error("signer_execute requires artifact and confirmationNonce from a local human confirm");return{ok:!0,...await Rr("POST","/execute",{artifact:t.artifact,confirmationNonce:t.confirmationNonce})}}if(e==="signer_disarm")return{ok:!0,...await Rr("POST","/disarm")};if(e==="receipt_report")return{ok:!0,...Ms(t?.receipt||t)};if(e==="watch_create")return{ok:!0,watch:Il(t)};if(e==="watch_list")return{ok:!0,watches:_l()};if(e==="portfolio_snapshot")return{ok:!0,note:"use oracle_cli data call portfolio snapshot \u2014 knownUsd is incomplete if a provider is missing",hint:["data","call","portfolio","snapshot"]};throw new Error(`unknown crypto desk tool: ${e}`)}var G_,hu,gi=L(()=>{vl();Ol();Lg();fo();G_=new Set(["127.0.0.1","::1","localhost"]);hu=Object.freeze([{type:"function",function:{name:"vault_status",description:"Read local Oracle vault/signer readiness. Never returns key material.",parameters:{type:"object",properties:{},additionalProperties:!1}}},{type:"function",function:{name:"signer_status",description:"Ping the loopback signer. Fails closed if it is not running.",parameters:{type:"object",properties:{},additionalProperties:!1}}},{type:"function",function:{name:"signer_pending",description:"List pending local-signer artifacts. Read-only. Does not approve, sign, or broadcast.",parameters:{type:"object",properties:{},additionalProperties:!1}}},{type:"function",function:{name:"signer_queue",description:"Queue a prepared unsigned artifact on the loopback signer. Does not broadcast.",parameters:{type:"object",properties:{artifact:{type:"object"}},required:["artifact"],additionalProperties:!1}}},{type:"function",function:{name:"signer_ack",description:"Execute one pending artifact through the armed local signer (same path as Telegram Allow). Fails if the signer is not running or disarmed. Never holds keys.",parameters:{type:"object",properties:{id:{type:"string"},digest:{type:"string"}},additionalProperties:!1}}},{type:"function",function:{name:"signer_deny",description:"Drop one pending local-signer artifact. Nothing signed.",parameters:{type:"object",properties:{id:{type:"string"},digest:{type:"string"}},additionalProperties:!1}}},{type:"function",function:{name:"signer_execute",description:"Broadcast one already-confirmed local artifact. Requires a one-use confirmationNonce from the local signer TTY confirm. Cannot mint confirmation itself.",parameters:{type:"object",properties:{artifact:{type:"object"},confirmationNonce:{type:"string",minLength:32,maxLength:128}},required:["artifact","confirmationNonce"],additionalProperties:!1}}},{type:"function",function:{name:"signer_disarm",description:"Global kill switch. Stops the local signer from broadcasting.",parameters:{type:"object",properties:{},additionalProperties:!1}}},{type:"function",function:{name:"receipt_report",description:"Receipt or it did not happen. Requires transactionHash/hash/txid.",parameters:{type:"object",properties:{receipt:{type:"object"},transactionHash:{type:"string"},hash:{type:"string"},txid:{type:"string"}},additionalProperties:!1}}},{type:"function",function:{name:"watch_create",description:"Create an alert-only watch. Never execute.",parameters:{type:"object",properties:{chain:{type:"string"},token:{type:"string"},condition:{type:"string"},note:{type:"string"}},required:["chain","token","condition"],additionalProperties:!1}}},{type:"function",function:{name:"watch_list",description:"List local alert-only watches.",parameters:{type:"object",properties:{},additionalProperties:!1}}},{type:"function",function:{name:"portfolio_snapshot",description:"How to read the one portfolio snapshot. knownUsd is incomplete if a provider is missing.",parameters:{type:"object",properties:{},additionalProperties:!1}}}])});function wu(e,t){if(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)throw new TypeError(`${t} must be a plain object`);return e}function yu(e,t="control input"){try{or(e,t),ng(e)}catch(r){throw new TypeError(`${t} contains secret or custody material: ${r.message}`)}return e}function wi(e,{required:t=[],optional:r=[]}={},n="object"){wu(e,n);let o=new Set([...t,...r]),i=Object.keys(e).filter(s=>!o.has(s));if(i.length)throw new TypeError(`${n} has unknown field ${i[0]}`);for(let s of t)if(!Object.hasOwn(e,s))throw new TypeError(`${n}.${s} is required`);return e}function bu(e,t,r=200,{lower:n=!1}={}){if(typeof e!="string"||!e.trim()||e.length>r||Q_.test(e))throw new TypeError(`${t} must be non-empty control-free text up to ${r} characters`);let o=e.trim();return n?o.toLowerCase():o}function yi(e,t,r=80){let n=bu(e,t,r,{lower:!0});if(!/^[a-z0-9][a-z0-9._:-]*$/.test(n))throw new TypeError(`${t} must be a lowercase identifier`);return n}function Qs(e,t,{positive:r=!1}={}){if(!Number.isSafeInteger(e)||e<0||r&&e===0)throw new TypeError(`${t} must be a ${r?"positive":"non-negative"} safe integer`);return e}function kt(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))kt(t);Object.freeze(e)}return e}var Q_,xu=L(()=>{nr();Ql();Q_=/[\u0000-\u001f\u007f]/});function qg({family:e,chainId:t},r="chain"){let n=yi(e,`${r}.family`,40),o;if(n==="evm"){if(typeof t=="number")o=String(Qs(t,`${r}.chainId`,{positive:!0}));else if(o=bu(t,`${r}.chainId`,40),!/^[1-9][0-9]*$/.test(o))throw new TypeError(`${r}.chainId must be a positive decimal EVM chain id`)}else o=yi(t,`${r}.chainId`,80);return{family:n,chainId:o}}function tI(e,t="chain"){return wi(e,{required:["family","chainId"]},t),kt(qg(e,t))}function Ug(e,t="finality rule"){yu(e,t),wu(e,t);let r=e.rule;if(!Z_.includes(r))throw new TypeError(`${t}.rule must be confirmations, finalizedTag, or checkpoint`);let n=r==="confirmations"?"confirmations":r;wi(e,{required:["family","chainId","rule",n]},t);let o=qg(e,t);return r==="confirmations"?{...o,rule:r,confirmations:Qs(e.confirmations,`${t}.confirmations`,{positive:!0})}:{...o,rule:r,[n]:yi(e[n],`${t}.${n}`,80)}}function Su(e){if(!Array.isArray(e))throw new TypeError("finality policy rules must be an array");let t=e.map((n,o)=>Ug(n,`finality policy rule ${o}`)),r=new Set;for(let n of t){let o=`${n.family}\0${n.chainId}`;if(r.has(o))throw new TypeError(`duplicate finality rule for ${n.family}:${n.chainId}`);r.add(o)}return kt({policyVersion:1,rules:t})}function rI(e){if(wi(e,{required:["policyVersion","rules"]},"finality policy"),e.policyVersion!==1||!Array.isArray(e.rules))throw new TypeError("unsupported finality policy");return Su(e.rules)}function jg(e,t){let r=tI(t,"finality query"),o=rI(e).rules.find(i=>i.family===r.family&&i.chainId===r.chainId);return o?kt({status:"KNOWN",...r,rule:o}):kt({status:wn.UNKNOWN,reason:"MISSING_FINALITY_RULE",...r,rule:null})}function nI(e,t){if(e==null)return null;yu(e,"finality evidence");let r=t.rule==="confirmations"?"confirmations":t.rule;if(wi(e,{required:["status"],optional:[r]},"finality evidence"),!eI.includes(e.status))throw new TypeError("finality evidence.status is unknown");let n={status:e.status};return e[r]!=null&&(n[r]=t.rule==="confirmations"?Qs(e.confirmations,"finality evidence.confirmations",{positive:!0}):yi(e[r],`finality evidence.${r}`,80)),n}function Hg(e,t){if(!e||e.status===wn.UNKNOWN||e.rule==null)return kt({status:wn.UNKNOWN,final:!1,reason:"MISSING_FINALITY_RULE"});let r=Ug(e.rule??e,"resolved finality rule"),n=nI(t,r);if(n==null)return kt({status:wn.UNKNOWN,final:!1,reason:"MISSING_FINALITY_EVIDENCE"});if(n.status!=="LIVE")return kt({status:wn.UNKNOWN,final:!1,reason:`${n.status}_EVIDENCE`});let o=!1;return r.rule==="confirmations"?o=n.confirmations!=null&&n.confirmations>=r.confirmations:r.rule==="finalizedTag"?o=n.finalizedTag===r.finalizedTag:o=n.checkpoint===r.checkpoint,kt({status:o?wn.FINAL:wn.INCLUDED,final:o,reason:o?"PINNED_RULE_SATISFIED":"PINNED_RULE_NOT_SATISFIED",rule:r})}var Z_,wn,eI,zg=L(()=>{xu();Z_=Object.freeze(["confirmations","finalizedTag","checkpoint"]),wn=Object.freeze({UNKNOWN:"UNKNOWN",INCLUDED:"INCLUDED",FINAL:"FINAL"}),eI=Object.freeze(["LIVE","STALE","UNKNOWN","UNAVAILABLE"])});function iI(e){if(e===!0||e===1||e==="1")return"SUCCESS";if(e===!1||e===0||e==="0")return"FAIL";if(typeof e!="string")return"UNKNOWN";let t=e.trim().toUpperCase();return["SUCCESS","SUCCEEDED","OK","EXECUTED"].includes(t)?"SUCCESS":["FAIL","FAILED","FAILURE","REVERTED","REJECTED"].includes(t)?"FAIL":"UNKNOWN"}function Wg(e){return typeof e=="string"&&["FAIL","FAILED","FAILURE","ORPHAN","ORPHANED","REVERTED"].includes(e.trim().toUpperCase())}function vu(e){return e==null?e:Array.isArray(e)?e.map(vu):bi(e)?Object.fromEntries(Object.keys(e).sort().map(t=>[t,vu(e[t])])):String(e)}function sI(e,t,r,n){let o=be(e.finalityEvidence,n?.finality,e.evidence),i=be(e.finalityPolicy,e.policy);try{return i==null&&bi(e.finalityRule)&&(i=Su([{family:t,chainId:r,...e.finalityRule}])),i==null||t==null||r==null?{status:"UNKNOWN",final:!1,reason:"MISSING_FINALITY_RULE"}:Hg(jg(i,{family:t,chainId:r}),o)}catch{return{status:"UNKNOWN",final:!1,reason:"MALFORMED_FINALITY_EVIDENCE"}}}function Ye(e,t,r){r!=null&&(e[t]=r)}function aI(e){return e==null?null:String(e).trim().toLowerCase()}function Eu(...e){let t=e.map(aI).filter(Boolean);return t.length<=1||t.every(r=>r===t[0])}function Kg(e={}){if(!bi(e))throw new TypeError("verified receipt: input object required");let t=re(e),r=be(t.actionReceipt,t.receipt),n=bi(r)?r:t,o=be(t.observation,t.chainObservation,t.observedReceipt),i=bi(o),s=be(t.txHash,n.txHash,n.transactionHash,o?.txHash,o?.transactionHash),a=be(t.family,n.family,n.chain?.family,o?.family,o?.chain?.family),c=be(t.chainId,n.chainId,n.chain?.chainId,o?.chainId,o?.chain?.chainId),u=!Eu(t.txHash,n.txHash,n.transactionHash,o?.txHash,o?.transactionHash)||!Eu(t.family,n.family,n.chain?.family,o?.family,o?.chain?.family)||!Eu(t.chainId,n.chainId,n.chain?.chainId,o?.chainId,o?.chain?.chainId),d=sI(t,a,c,i&&!u?o:null),f=iI(be(o?.receiptStatus,o?.executionStatus,o?.status)),l=be(t.reconciliationStatus,t.reconciliation?.status,o?.reconciliationStatus),p=be(t.finalityState,t.finalityEvidence?.status,t.evidence?.status,o?.finalityState),m="UNKNOWN";Wg(l)||!u&&(i&&f==="FAIL"||Wg(p))?m="FAIL":!u&&s&&i&&f==="SUCCESS"&&["INCLUDED","FINAL"].includes(d.status)&&(m="SUCCESS");let g={verifiedReceiptVersion:oI,status:m};u&&(g.reason="REFERENCE_MISMATCH"),Ye(g,"txHash",s),Ye(g,"chain",be(t.chain,n.chain,o?.chain)),Ye(g,"family",a),Ye(g,"chainId",c),Ye(g,"block",be(o?.block,t.block)),Ye(g,"blockState",be(o?.blockState,o?.inclusionState)),g.finalityState=d.status,Ye(g,"confirmations",be(o?.confirmations,o?.finality?.confirmations,t.finalityEvidence?.confirmations,t.evidence?.confirmations)),Ye(g,"observedAt",be(o?.observedAt,t.observedAt)),Ye(g,"route",be(t.route,n.route)),Ye(g,"prepareHash",be(t.prepareHash,n.prepareHash)),Ye(g,"policyOutcome",be(t.policyOutcome,n.policyOutcome,n.policyChecks));let y=be(t.balanceChanges,o?.balanceChanges,o?.balances,n.balanceChanges,n.balances);return y!=null&&(g.balanceChanges=vu(y)),Ye(g,"createdAt",be(t.createdAt,n.createdAt)),Ye(g,"submittedAt",be(t.submittedAt,n.submittedAt)),Ye(g,"finalizedAt",be(t.finalizedAt,o?.finalizedAt)),Ye(g,"timestamps",be(t.timestamps,n.timestamps,o?.timestamps)),kt(g)}var oI,rH,be,bi,Vg=L(()=>{nr();zg();xu();oI=1,rH=Object.freeze(["SUCCESS","FAIL","UNKNOWN"]),be=(...e)=>e.find(t=>t!=null),bi=e=>!!e&&typeof e=="object"&&!Array.isArray(e)&&Object.getPrototypeOf(e)===Object.prototype});var Yg={};Hr(Yg,{observeEvmReceipt:()=>Gg,verifyEvmReceipt:()=>uI});function lI(e){if(e==null)return null;let t=typeof e=="number"?e:Number.parseInt(String(e),16);return Number.isSafeInteger(t)?t:null}async function Gg({txHash:e,chainId:t,rpcUrl:r},n={}){let o=String(e||"").trim().toLowerCase();if(!cI.test(o))throw new TypeError("observe receipt: txHash must be a 32-byte hash");let i=Number(t);if(!Number.isSafeInteger(i)||i<=0)throw new TypeError("observe receipt: chainId required");let s=n.transactionReceipt||xm,a=n.rpcCall||un,c={...n.rpcOptions||{},...r?{rpcUrl:r}:{}},u;try{u=await s({txHash:o,chainId:i},c)}catch(p){return{observation:null,reason:`RPC_UNAVAILABLE: ${p.message}`}}if(!u||u.receipt==null)return{observation:null,reason:u?.reason||"receipt pending"};let d=null,f=u.blockNumber;if(Number.isSafeInteger(f))try{let p=lI(await a(i,"eth_blockNumber",[],c));p!=null&&p>=f&&(d=p-f+1)}catch{}let l={txHash:o,family:"evm",chainId:String(i),receiptStatus:u.status==="success"?"SUCCESS":u.status==="reverted"?"FAIL":"UNKNOWN",block:f==null?void 0:String(f),observedAt:new Date().toISOString(),finality:{status:"LIVE",...d==null?{}:{confirmations:d}}};return d!=null&&(l.confirmations=d),{observation:l,reason:null}}async function uI({txHash:e,chainId:t,confirmations:r=1,rpcUrl:n},o={}){let{observation:i,reason:s}=await Gg({txHash:e,chainId:t,rpcUrl:n},o),a=Kg({txHash:String(e).trim().toLowerCase(),family:"evm",chainId:String(Number(t)),finalityRule:{rule:"confirmations",confirmations:r},...i?{observation:i}:{}});return{receipt:a,observed:!!i,final:a.finalityState==="FINAL",requiredConfirmations:r,reason:s}}var cI,Jg=L(()=>{to();Vg();cI=/^0x[0-9a-f]{64}$/});var Qg={};Hr(Qg,{classifyReceipt:()=>Ms,configDir:()=>mI,firstHourReport:()=>hI,probeReceiptModule:()=>wI,probeReviewModule:()=>gI,venueMap:()=>Xg});import dI from"node:path";import{homedir as fI}from"node:os";function mI(e=process.env){return e.ORACLE_CONFIG_DIR||dI.join(fI(),".config","oracle")}function Xg({env:e=process.env,vault:t=null}={}){let r=t||hi(),n=[];for(let[o,i]of Object.entries(xs)){let s=(i.rpcEnv||[]).some(c=>String(e[c]||"").trim()),a="prepare";i.evm?s&&(a="live"):a="unavailable",n.push({key:o,chainId:i.chainId,name:i.name,family:"evm",status:a,execute:!!(r.vaultExists&&r.armed&&!r.disarmed),note:s?"rpc configured":"public read/prepare; set RPC for live reads"})}return n.push({key:"solana",chainId:null,name:"Solana",family:"sol",status:"prepare",execute:!1,note:"Jupiter quote/prepare; local sol signer"},{key:"bitcoin",chainId:null,name:"Bitcoin",family:"btc",status:"prepare",execute:!1,note:"Esplora read; local btc signer"},{key:"hyperliquid-l1",chainId:null,name:"Hyperliquid L1",family:"data",status:"live",execute:!1,note:"data/prepare only \u2014 not an EVM signer family"},{key:"polymarket",chainId:null,name:"Polymarket",family:"data",status:"live",execute:!1,note:"data/prepare only \u2014 not a signer family"}),n}function hI({env:e=process.env,model:t=it(),vault:r=hi(),signerReachable:n=!1,quote:o=null,reviewAvailable:i=!1,receiptAvailable:s=!1}={}){let a=[],c=(p,m,g,y=null)=>a.push({id:p,status:m,detail:g,fix:y}),u=(()=>{let[p,m]=process.versions.node.split(".").map(Number);return p>20||p===20&&m>=19})();c("node",u?"ok":"fail",`node ${process.versions.node}`,u?null:"install node >= 20.19"),t?t.backend==="hermes"?c("model","warn","backend=hermes (opt-in attach)","oracle model --backend standalone"):c("model","ok",`${t.backend||"auto"} ${t.provider||""} ${t.model||""}`.trim()):c("model","fail","no model.json","oracle setup model"),r.vaultExists?r.disarmed?c("vault","warn","vault present, DISARMED","oracle signer (re-arm after confirm)"):c("vault",r.armed?"ok":"warn",r.armed?"present, armed":"present, not armed"):c("vault","fail","no local vault","oracle sign init");let d=e.ORACLE_SIGNER_HOST||"127.0.0.1";if(pI.has(d)?c("signer",n?"ok":"warn",n?`loopback ${d}:${e.ORACLE_SIGNER_PORT||9462}`:"loopback signer not reachable",n?null:"oracle signer"):c("signer","fail",`signer host ${d} is not loopback`,"unset ORACLE_SIGNER_HOST"),!o)c("quote","warn","quote not probed",null);else if(o.ok){let p=String(o.detail||"net quote returned");c("quote","ok",p.length>140?`${p.slice(0,140)}\u2026`:p)}else c("quote","warn",o.detail||"quote unavailable","check network / oracle data serve");c("review",i?"ok":"fail",i?"sign-time review renders decoded action, policy hits, approval deltas":"sign-time review module missing from this build",i?null:"reinstall @oracle-agent/oracle (src/control/sign-time-review.mjs)"),c("receipt",s?"ok":"fail",s?"oracle receipt verifies on-chain state (SUCCESS/FAIL/UNKNOWN, finality-pinned)":"verified-receipt observer missing from this build",s?null:"reinstall @oracle-agent/oracle (src/desk/observe-receipt.mjs)");let f=a.some(p=>p.status==="fail"),l=a.filter(p=>p.status==="ok").length;return{ok:!f,checks:a,firstRunScore:{ok:l,total:a.length,label:`${l}/${a.length} first-run hops green`},venues:Xg({env:e,vault:r})}}async function gI(){try{return typeof(await Promise.resolve().then(()=>(lu(),vg))).createSignTimeReview=="function"}catch{return!1}}async function wI(){try{let e=await Promise.resolve().then(()=>(Jg(),Yg));return typeof e.observeReceipt=="function"||typeof e.default=="function"||Object.values(e).some(t=>typeof t=="function")}catch{return!1}}var pI,Zg=L(()=>{Es();gi();Kr();vl();pI=new Set(["127.0.0.1","::1","localhost"])});import{spawn as px}from"node:child_process";var mx=["SIGINT","SIGTERM","SIGHUP"];function Rn(e,t=[],r={},n=e){return new Promise(o=>{let i=px(e,t,r),s=!1,a=null,c=new Map(mx.map(d=>[d,()=>{a||=d,i.exitCode===null&&i.signalCode===null&&i.kill(d)}]));for(let[d,f]of c)process.on(d,f);let u=()=>{for(let[d,f]of c)process.off(d,f)};i.once("error",d=>{s||(s=!0,u(),process.stderr.write(`oracle: could not start ${n}: ${d.message}
|
|
13
13
|
`),o(1))}),i.once("exit",(d,f)=>{if(s)return;s=!0,u();let l=a||f;if(l){process.kill(process.pid,l);return}o(d??1)})})}Vt();import nt from"node:fs";import Ke from"node:path";import{createHash as Sx}from"node:crypto";import{spawnSync as Mn}from"node:child_process";var Ex="0.19.0",gf=`hermes-agent==${Ex}`,tc=[3,11],rc=[3,14],Lo="3.13",Vi="0.12.1",Gi=Object.freeze({posix:Object.freeze({url:`https://github.com/astral-sh/uv/releases/download/${Vi}/uv-installer.sh`,sha256:"d3f5412d38c99f9d024901843bf98206f0d2c6dbe64df40d0b740e2751ca62c1"}),windows:Object.freeze({url:`https://github.com/astral-sh/uv/releases/download/${Vi}/uv-installer.ps1`,sha256:"b9ec035151bfbb11d616dbd69886498d885551489eddf095ea3c0ad59f640eb0"})});function vx(e,{windows:t=process.platform==="win32"}={}){let r=Buffer.isBuffer(e)?e:Buffer.from(e),n=t?Gi.windows:Gi.posix,o=Sx("sha256").update(r).digest("hex"),i=r.toString("utf8");return o===n.sha256&&i.length>=1e3&&i.includes(Vi)}function Wr(){return Ke.join(rt(),"runtime")}function yf(){return Ke.join(Wr(),"venv")}function oc(e){let t=process.platform==="win32"?"Scripts":"bin",r=process.platform==="win32"?`${e}.exe`:e;return Ke.join(yf(),t,r)}function Ki(){return oc("hermes")}function kx(){let e=oc("python3");return nt.existsSync(e)?e:oc("python")}function Po(){return Ke.join(Wr(),"uv",process.platform==="win32"?"uv.exe":"uv")}function Pn(e){let t=process.platform==="win32"&&!Ke.extname(e)?["",".exe",".cmd",".bat"]:[""];for(let r of(process.env.PATH||"").split(Ke.delimiter))if(r)for(let n of t){let o=Ke.join(r,`${e}${n}`);try{if(nt.existsSync(o))return o}catch{}}return null}function Ax(e){let t=/Python (\d+)\.(\d+)\.(\d+)/.exec(e||"");return t?[Number(t[1]),Number(t[2]),Number(t[3])]:null}function _x(e){if(!e)return!1;let[t,r]=e;return!(t<tc[0]||t===tc[0]&&r<tc[1]||t>rc[0]||t===rc[0]&&r>=rc[1])}function Ix(){let e=[process.env.ORACLE_PYTHON,"python3.13","python3.12","python3.11","python3","python"].filter(Boolean);for(let t of e){let r=Ke.isAbsolute(t)?nt.existsSync(t)?t:null:Pn(t);if(!r)continue;let n=Mn(r,["--version"],{encoding:"utf8",timeout:15e3}),o=Ax(`${n.stdout||""}${n.stderr||""}`);if(_x(o))return{bin:r,version:o.join("."),source:"host"}}return null}function Ox(){return process.env.ORACLE_UV_BIN||Pn("uv")||(nt.existsSync(Ke.join(zr(),".local","bin","uv"))?Ke.join(zr(),".local","bin","uv"):null)||(nt.existsSync(Po())?Po():null)}function Tx(e,t){let r=["const fs=require('node:fs');","const [url,dest]=process.argv.slice(1);","fetch(url).then(r=>{if(!r.ok)throw new Error('http '+r.status);return r.arrayBuffer()})",".then(b=>fs.writeFileSync(dest,Buffer.from(b)))",".catch(e=>{console.error(e.message);process.exit(1)});"].join("");return Mn(process.execPath,["-e",r,e,t],{encoding:"utf8",timeout:2*6e4})}function Cx({quiet:e=!1}={}){let t=Ox();if(t)return{ok:!0,bin:t,reused:!0};Ie(Wr());let r=process.platform==="win32",n=Ke.join(Wr(),r?"uv-install.ps1":"uv-install.sh"),o=r?Gi.windows:Gi.posix,i=Tx(o.url,n);if(i.status!==0)return{ok:!1,reason:`could not download the uv installer (${i.status})`,stderr:(i.stderr||"").slice(-800)};let s=nt.readFileSync(n);if(!vx(s,{windows:r}))return{ok:!1,reason:`uv ${Vi} installer checksum mismatch`};let a=Ke.dirname(Po());Ie(a);let c=r?Pn("powershell.exe")||Pn("powershell"):Pn("sh")||"/bin/sh";if(!c)return{ok:!1,reason:r?"PowerShell not found":"sh not found"};let d=Mn(c,r?["-NoProfile","-ExecutionPolicy","Bypass","-File",n]:[n],{stdio:e?"pipe":"inherit",encoding:"utf8",timeout:5*6e4,env:{...process.env,UV_INSTALL_DIR:a,UV_NO_MODIFY_PATH:"1"}});return d.status!==0||!nt.existsSync(Po())?{ok:!1,reason:`uv install failed (${d.status})`,stderr:(d.stderr||"").slice(-800)}:{ok:!0,bin:Po(),reused:!1}}function wf({quiet:e=!1}={}){let t=Cx({quiet:e});if(!t.ok)return t;let r=t.bin,n={...process.env,UV_PYTHON_INSTALL_DIR:Ke.join(Wr(),"python"),UV_CACHE_DIR:Ke.join(Wr(),"cache")},o=Mn(r,["python","install","--no-bin",Lo],{stdio:e?"pipe":"inherit",encoding:"utf8",timeout:15*6e4,env:n});if(o.status!==0)return{ok:!1,reason:`uv python install ${Lo} failed (${o.status})`,stderr:(o.stderr||"").slice(-800)};let i=Mn(r,["python","find",Lo],{encoding:"utf8",timeout:6e4,env:n}),s=(i.stdout||"").trim().split(/\r?\n/)[0];return i.status!==0||!s||!nt.existsSync(s)?{ok:!1,reason:`uv could not locate python ${Lo}`}:{ok:!0,bin:s,version:Lo,source:"uv"}}function ot(){if(process.env.ORACLE_HERMES_BIN)return{ok:!0,bin:process.env.ORACLE_HERMES_BIN,source:"env"};let e=Ki();if(nt.existsSync(e))return{ok:!0,bin:e,source:"managed"};let t=Pn("hermes");return t?{ok:!0,bin:t,source:"path"}:{ok:!1,bin:null,source:null}}function nc(e,t,{quiet:r}){return Mn(e,t,{stdio:r?"pipe":"inherit",encoding:"utf8",timeout:20*6e4})}function bf({quiet:e=!1,upgrade:t=!1}={}){let r=Ix();if(!r){let u=wf({quiet:e});if(u.ok)r={bin:u.bin,version:u.version,source:"uv"};else return{ok:!1,reason:`no supported python found (need 3.11-3.13) and uv could not provide one: ${u.reason}. install uv (https://docs.astral.sh/uv) or python 3.13, then re-run 'oracle bootstrap'`}}Ie(Wr());let n=yf();if(nt.existsSync(Ki())&&!t)return{ok:!0,bin:Ki(),reused:!0};if(!nt.existsSync(Ke.join(n,"pyvenv.cfg"))){let u=nc(r.bin,["-m","venv",n],{quiet:e});if(u.status!==0&&r.source!=="uv"){nt.rmSync(n,{recursive:!0,force:!0});let d=wf({quiet:e});if(d.ok)r={bin:d.bin,version:d.version,source:"uv"},u=nc(r.bin,["-m","venv",n],{quiet:e});else return{ok:!1,reason:`python -m venv failed (${u.status}) and uv fallback failed: ${d.reason}`,stderr:(u.stderr||"").slice(-800)}}if(u.status!==0)return{ok:!1,reason:`isolated python -m venv failed (${u.status})`,stderr:(u.stderr||"").slice(-800)}}let i=kx();if(!nt.existsSync(i))return{ok:!1,reason:`venv python missing at ${i}`};let s=["-m","pip","install","--disable-pip-version-check"];t&&s.push("--upgrade"),s.push(gf);let a=nc(i,s,{quiet:e});if(a.status!==0)return{ok:!1,reason:`pip install ${gf} failed (${a.status})`,stderr:(a.stderr||"").slice(-1200)};let c=Ki();return nt.existsSync(c)?{ok:!0,bin:c,reused:!1,python:r.version}:{ok:!1,reason:`hermes entrypoint not found after install (${c})`}}Kr();Vt();import ge from"node:fs";import ce from"node:path";import xL from"node:readline/promises";import{spawnSync as SL}from"node:child_process";import Do from"node:fs";import Dx from"node:path";import Rx from"node:fs";import Lx from"node:os";import Ef from"node:path";var vf=Object.freeze([{key:"hyperliquid",aliases:["hl","hyperevm","hype","999"],chainId:999,name:"hyperliquid",kind:"evm",family:"hyperliquid",agent:"hyperliquid-agent",note:"perps \xB7 hip-3/4 \xB7 hyperevm 999",build:!0},{key:"ethereum",aliases:["eth","mainnet","1"],chainId:1,name:"ethereum",kind:"evm",family:"evm",agent:"oracle",note:"l1 \xB7 bridge hub",build:!0},{key:"base",aliases:["8453"],chainId:8453,name:"base",kind:"evm",family:"evm",agent:"oracle",note:"evm l2",build:!0},{key:"arbitrum",aliases:["arb","42161"],chainId:42161,name:"arbitrum",kind:"evm",family:"evm",agent:"oracle",note:"evm l2",build:!0},{key:"optimism",aliases:["op","10"],chainId:10,name:"optimism",kind:"evm",family:"evm",agent:"oracle",note:"op mainnet",build:!0},{key:"polygon",aliases:["matic","137"],chainId:137,name:"polygon",kind:"evm",family:"evm",agent:"oracle",note:"evm l2",build:!0},{key:"bsc",aliases:["bnb","56"],chainId:56,name:"bnb chain",kind:"evm",family:"evm",agent:"oracle",note:"bsc",build:!0},{key:"avalanche",aliases:["avax","43114"],chainId:43114,name:"avalanche",kind:"evm",family:"evm",agent:"oracle",note:"c-chain",build:!0},{key:"abstract",aliases:["abs","2741"],chainId:2741,name:"abstract",kind:"evm",family:"evm",agent:"oracle",note:"open / add agent",build:!0},{key:"stable",aliases:["988"],chainId:988,name:"stable",kind:"evm",family:"stable",agent:"stable-agent",note:"usdt0 gas \xB7 stable agent",build:!0},{key:"robinhood",aliases:["rh","4663"],chainId:4663,name:"robinhood",kind:"evm",family:"robinhood",agent:"robinhood-agent",note:"rh chain 4663",build:!0},{key:"solana",aliases:["sol"],chainId:"SOL",name:"solana",kind:"svm",family:"solana",agent:"solana-agent",note:"jup \xB7 nfts \xB7 dexs",build:!0},{key:"bitcoin",aliases:["btc"],chainId:"BTC",name:"bitcoin",kind:"utxo",family:"bitcoin",agent:"bitcoin-agent",note:"ord \xB7 runes \xB7 l1",build:!0},{key:"polymarket",aliases:["poly","polygon-poly"],chainId:137,name:"polymarket",kind:"venue",family:"polymarket",agent:"polymarket-agent",note:"prediction markets (polygon venue)",build:!1}]);function Un(e){return String(e||"").trim().toLowerCase().replace(/^\/+/,"").replace(/\s+/g,"-")}var kf=/^[a-z0-9][a-z0-9-]*$/;function Px(){let e=process.env.ORACLE_CONFIG_DIR||Ef.join(Lx.homedir(),".config","oracle");return Ef.join(e,"chains.json")}function Mx(e){if(!e||typeof e!="object")return null;let t=String(e.key??"").trim();if(!t||/[/\\.]/.test(t))return null;let r=Un(t);if(!kf.test(r))return null;let n=typeof e.chainId=="string"?e.chainId.trim():Number(e.chainId);if(n===""||n===null||n===void 0||typeof n=="number"&&!Number.isFinite(n))return null;let o=typeof e.agent=="string"&&kf.test(e.agent.trim())?e.agent.trim():"oracle";return{key:r,aliases:Array.isArray(e.aliases)?e.aliases.map(Un).filter(Boolean).slice(0,8):[],chainId:n,name:String(e.name||r).slice(0,60),kind:["evm","svm","utxo","venue"].includes(e.kind)?e.kind:"evm",family:Un(e.family)||r,agent:o,note:String(e.note||"user-defined").slice(0,80),build:e.build!==!1,source:"user"}}function Bx(e=Rx.readFileSync){try{let t=JSON.parse(e(Px(),"utf8")),r=Array.isArray(t?.chains)?t.chains:[],n=[],o=new Set;for(let i of r){let s=Mx(i);!s||o.has(s.key)||(o.add(s.key),n.push(s))}return n}catch{return[]}}function Af(){let e=Bx();if(e.length===0)return vf;let t=new Map(vf.map(r=>[r.key,r]));for(let r of e)t.set(r.key,r);return[...t.values()]}function sc({buildOnly:e=!1}={}){return Af().filter(t=>e?t.build:!0)}function jn(e){let t=Un(e);if(!t)return null;for(let r of Af())if(r.key===t||String(r.chainId).toLowerCase()===t||(r.aliases||[]).map(Un).includes(t)||Un(r.name)===t)return r;return null}function _f({selectedKey:e=null,buildOnly:t=!1}={}){let r=sc({buildOnly:t}),n=["oracle chains","","pick a build/trade surface:",""];for(let o of r){let i=e&&e===o.key?"*":" ",s=String(o.chainId).padEnd(6),a=o.key.padEnd(12);n.push(`${i} ${a} ${s} ${o.note}`)}return n.push(""),n.push("usage:"),n.push(" /chain list"),n.push(" /chain hyperliquid select"),n.push(" /chain show current"),n.push(" /chain clear unset"),n.push(" oracle chain use base same from shell"),e&&n.push("",`active: ${e}`),n.join(`
|
|
14
14
|
`)+`
|