@oracle-agent/oracle 0.24.5 → 0.24.7

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.
@@ -1,5 +1,5 @@
1
- var h={robinhood:{chainId:4663,name:"Robinhood Chain",rpcEnv:["RH_CHAIN_RPC"],evm:!0},ethereum:{chainId:1,name:"Ethereum",rpcEnv:["ETH_RPC_URL","ETHEREUM_RPC_URL","MAINNET_RPC_URL"],evm:!0},polygon:{chainId:137,name:"Polygon",rpcEnv:["POLYGON_RPC_URL","POLYGON_RPC"],evm:!0},arbitrum:{chainId:42161,name:"Arbitrum One",rpcEnv:["ARBITRUM_RPC_URL","ARB_RPC_URL"],evm:!0},base:{chainId:8453,name:"Base",rpcEnv:["BASE_RPC_URL"],evm:!0},hyperevm:{chainId:999,name:"HyperEVM",rpcEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],evm:!0},bsc:{chainId:56,name:"BNB Smart Chain",rpcEnv:["BSC_RPC_URL","BNB_RPC_URL"],evm:!0},avalanche:{chainId:43114,name:"Avalanche C-Chain",rpcEnv:["AVALANCHE_RPC_URL","AVAX_RPC_URL"],evm:!0},optimism:{chainId:10,name:"OP Mainnet",rpcEnv:["OPTIMISM_RPC_URL","OP_RPC_URL"],evm:!0},abstract:{chainId:2741,name:"Abstract",rpcEnv:["ABSTRACT_RPC_URL","ABS_RPC_URL"],evm:!0},stable:{chainId:988,name:"Stable Mainnet",rpcEnv:["STABLE_RPC_URL","STABLE_RPC"],evm:!0}},L=new Map(Object.values(h).map(o=>[o.chainId,o]));function l(o){let n=o?.transactionHash||o?.hash||o?.txid||null;return n?{happened:!0,hash:String(n),note:null}:{happened:!1,hash:null,note:"no transaction hash \u2014 the action did not succeed"}}var S=new Set(["evm","evm-swap","evm-bridge","btc","sol"]),I=Object.freeze({swap:5,bridge:5,perps:0,nft:0});var T=Object.freeze([...S]);var q=Object.freeze({N:1<<17,r:8,p:1}),G=256*1024*1024,W=16*1024;import{homedir as f}from"node:os";import{join as d}from"node:path";var g=process.env.ORACLE_PUBLIC_DESKTOP==="1",x=g?process.env.ORACLE_CONFIG_DIR||d(f(),".config","oracle"):d(f(),".config","oracle"),K=g?x:d(f(),".config","mad-desk");var ee="0".repeat(64),re=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"});var te=Promise.resolve();var Ne=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_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}}}]);import p from"node:fs";import A from"node:os";import u from"node:path";import{fileURLToPath as _}from"node:url";var O=u.dirname(_(import.meta.url)),Be=u.resolve(O,"../..");function y(){return process.env.ORACLE_FAKE_HOME||A.homedir()}function b(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function m(){return b()?process.env.ORACLE_CONFIG_DIR||u.join(y(),".config","oracle"):u.join(y(),".config","oracle")}function R(){return u.join(m(),"desk.json")}function C(){return u.join(m(),"env")}function c({force:o=!1}={}){if(c._done&&!o)return c._result||null;c._done=!0;let n={},r=(t,e)=>{if(e==null)return;let i=String(e).trim();i&&(process.env[t]!=null&&String(process.env[t]).trim()!==""||(process.env[t]=i,n[t]=i))};try{let t=C();if(p.existsSync(t))for(let e of p.readFileSync(t,"utf8").split(/\r?\n/)){let i=e.match(/^\s*([A-Z0-9_]+)\s*=\s*(.*?)\s*$/);if(!i||i[2].startsWith("#"))continue;let a=i[2];(a.startsWith('"')&&a.endsWith('"')||a.startsWith("'")&&a.endsWith("'"))&&(a=a.slice(1,-1)),r(i[1],a)}}catch{}try{let t=R();if(p.existsSync(t)){let e=JSON.parse(p.readFileSync(t,"utf8"));e&&typeof e=="object"&&(r("ORACLE_DESK_URL",e.deskUrl||e.dataUrl||e.url),r("ORACLE_DATA_URL",e.dataUrl||e.deskUrl||e.url),r("ORACLE_API_URL",e.apiUrl||e.dataUrl||e.deskUrl),r("ORACLE_PUBLIC_URL",e.publicUrl||e.deskUrl||e.dataUrl),r("ORACLE_EXEC_URL",e.execUrl),r("MAD_DESK_URL",e.deskUrl||e.dataUrl))}}catch{}let s=process.env.ORACLE_DESK_URL||process.env.ORACLE_DATA_URL||"";return s&&(r("ORACLE_DESK_URL",s),r("ORACLE_DATA_URL",s),r("ORACLE_API_URL",s),r("ORACLE_PUBLIC_URL",s),r("MAD_DESK_URL",s)),c._result=Object.keys(n).length?n:null,c._result}try{c()}catch{}var er={name:"receipt",summary:"say whether an on-chain action happened (hash or it did not)",group:"read",usage:"oracle receipt --hash <txid> | oracle receipt --json '<receipt>'",async run(o){let n=o.argv||[],r={},s=n.indexOf("--hash"),t=n.indexOf("--json");if(s>=0)r={transactionHash:n[s+1]};else if(t>=0)try{r=JSON.parse(n[t+1]||"{}")}catch(i){return process.stderr.write(`receipt: bad json: ${i.message}
2
- `),1}let e=l(r);return n.includes("--quiet")?process.stdout.write(`${JSON.stringify(e)}
1
+ var g={robinhood:{chainId:4663,name:"Robinhood Chain",rpcEnv:["RH_CHAIN_RPC"],evm:!0},ethereum:{chainId:1,name:"Ethereum",rpcEnv:["ETH_RPC_URL","ETHEREUM_RPC_URL","MAINNET_RPC_URL"],evm:!0},polygon:{chainId:137,name:"Polygon",rpcEnv:["POLYGON_RPC_URL","POLYGON_RPC"],evm:!0},arbitrum:{chainId:42161,name:"Arbitrum One",rpcEnv:["ARBITRUM_RPC_URL","ARB_RPC_URL"],evm:!0},base:{chainId:8453,name:"Base",rpcEnv:["BASE_RPC_URL"],evm:!0},hyperevm:{chainId:999,name:"HyperEVM",rpcEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],evm:!0},bsc:{chainId:56,name:"BNB Smart Chain",rpcEnv:["BSC_RPC_URL","BNB_RPC_URL"],evm:!0},avalanche:{chainId:43114,name:"Avalanche C-Chain",rpcEnv:["AVALANCHE_RPC_URL","AVAX_RPC_URL"],evm:!0},optimism:{chainId:10,name:"OP Mainnet",rpcEnv:["OPTIMISM_RPC_URL","OP_RPC_URL"],evm:!0},abstract:{chainId:2741,name:"Abstract",rpcEnv:["ABSTRACT_RPC_URL","ABS_RPC_URL"],evm:!0},stable:{chainId:988,name:"Stable Mainnet",rpcEnv:["STABLE_RPC_URL","STABLE_RPC"],evm:!0}},M=new Map(Object.values(g).map(o=>[o.chainId,o]));function d(o){let n=o?.transactionHash||o?.hash||o?.txid||null;return n?{happened:!0,hash:String(n),note:null}:{happened:!1,hash:null,note:"no transaction hash \u2014 the action did not succeed"}}import{Interface as O,MaxUint256 as Ee,isAddress as Se,keccak256 as ve,toUtf8Bytes as ye}from"ethers";import{Interface as y,isAddress as ee}from"ethers";import{isAddress as z}from"ethers";var oe=new y(["function approve(address spender,uint256 amount) returns (bool)"]);import{Interface as A,isAddress as se}from"ethers";var fe=new A(["function approve(address spender,uint256 amount) returns (bool)"]),pe=Object.freeze({42161:"0x1c3fa76e6e1088bce750f23a5bfcffa1efef6a41",43114:"0x8f550e53dfe96c055d5bdb267c21f268fcaf63b2"});var Ie=new O(["function approve(address spender,uint256 amount) returns (bool)"]);var _=new Set(["evm","evm-swap","evm-bridge","btc","sol"]),$e=Object.freeze({swap:5,bridge:5,perps:0,nft:0});var N=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"},"0x7b939232":{provider:"across-v3",action:"bridge",layout:"across-deposit-v3"}});var Pe=Object.freeze([..._]),Be=Object.freeze({...N});var Ye=Object.freeze({N:1<<17,r:8,p:1}),Xe=256*1024*1024,Ze=16*1024;import{homedir as m}from"node:os";import{join as h}from"node:path";var x=process.env.ORACLE_PUBLIC_DESKTOP==="1",I=x?process.env.ORACLE_CONFIG_DIR||h(m(),".config","oracle"):h(m(),".config","oracle"),tr=x?I:h(m(),".config","mad-desk");var sr="0".repeat(64),cr=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"});var ur=Promise.resolve();var jr=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_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}}}]);import p from"node:fs";import k from"node:os";import u from"node:path";import{fileURLToPath as R}from"node:url";var L=u.dirname(R(import.meta.url)),Vr=u.resolve(L,"../..");function E(){return process.env.ORACLE_FAKE_HOME||k.homedir()}function $(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function w(){return $()?process.env.ORACLE_CONFIG_DIR||u.join(E(),".config","oracle"):u.join(E(),".config","oracle")}function P(){return u.join(w(),"desk.json")}function B(){return u.join(w(),"env")}function c({force:o=!1}={}){if(c._done&&!o)return c._result||null;c._done=!0;let n={},r=(t,e)=>{if(e==null)return;let i=String(e).trim();i&&(process.env[t]!=null&&String(process.env[t]).trim()!==""||(process.env[t]=i,n[t]=i))};try{let t=B();if(p.existsSync(t))for(let e of p.readFileSync(t,"utf8").split(/\r?\n/)){let i=e.match(/^\s*([A-Z0-9_]+)\s*=\s*(.*?)\s*$/);if(!i||i[2].startsWith("#"))continue;let s=i[2];(s.startsWith('"')&&s.endsWith('"')||s.startsWith("'")&&s.endsWith("'"))&&(s=s.slice(1,-1)),r(i[1],s)}}catch{}try{let t=P();if(p.existsSync(t)){let e=JSON.parse(p.readFileSync(t,"utf8"));e&&typeof e=="object"&&(r("ORACLE_DESK_URL",e.deskUrl||e.dataUrl||e.url),r("ORACLE_DATA_URL",e.dataUrl||e.deskUrl||e.url),r("ORACLE_API_URL",e.apiUrl||e.dataUrl||e.deskUrl),r("ORACLE_PUBLIC_URL",e.publicUrl||e.deskUrl||e.dataUrl),r("ORACLE_EXEC_URL",e.execUrl),r("MAD_DESK_URL",e.deskUrl||e.dataUrl))}}catch{}let a=process.env.ORACLE_DESK_URL||process.env.ORACLE_DATA_URL||"";return a&&(r("ORACLE_DESK_URL",a),r("ORACLE_DATA_URL",a),r("ORACLE_API_URL",a),r("ORACLE_PUBLIC_URL",a),r("MAD_DESK_URL",a)),c._result=Object.keys(n).length?n:null,c._result}try{c()}catch{}var at={name:"receipt",summary:"say whether an on-chain action happened (hash or it did not)",group:"read",usage:"oracle receipt --hash <txid> | oracle receipt --json '<receipt>'",async run(o){let n=o.argv||[],r={},a=n.indexOf("--hash"),t=n.indexOf("--json");if(a>=0)r={transactionHash:n[a+1]};else if(t>=0)try{r=JSON.parse(n[t+1]||"{}")}catch(i){return process.stderr.write(`receipt: bad json: ${i.message}
2
+ `),1}let e=d(r);return n.includes("--quiet")?process.stdout.write(`${JSON.stringify(e)}
3
3
  `):e.happened?process.stdout.write(`happened ${e.hash}
4
4
  `):process.stdout.write(`did not happen ${e.note}
5
- `),e.happened?0:2}};export{er as default};
5
+ `),e.happened?0:2}};export{at as default};
@@ -1,6 +1,6 @@
1
- import f from"node:fs";import b from"node:path";import S from"node:fs";import B from"node:os";import h from"node:path";import{fileURLToPath as M}from"node:url";var U=h.dirname(M(import.meta.url)),ue=h.resolve(U,"../..");function L(){return process.env.ORACLE_FAKE_HOME||B.homedir()}function F(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function E(){return F()?process.env.ORACLE_CONFIG_DIR||h.join(L(),".config","oracle"):h.join(L(),".config","oracle")}function $(){return h.join(E(),"desk.json")}function G(){return h.join(E(),"env")}function m({force:e=!1}={}){if(m._done&&!e)return m._result||null;m._done=!0;let i={},r=(s,n)=>{if(n==null)return;let a=String(n).trim();a&&(process.env[s]!=null&&String(process.env[s]).trim()!==""||(process.env[s]=a,i[s]=a))};try{let s=G();if(S.existsSync(s))for(let n of S.readFileSync(s,"utf8").split(/\r?\n/)){let a=n.match(/^\s*([A-Z0-9_]+)\s*=\s*(.*?)\s*$/);if(!a||a[2].startsWith("#"))continue;let c=a[2];(c.startsWith('"')&&c.endsWith('"')||c.startsWith("'")&&c.endsWith("'"))&&(c=c.slice(1,-1)),r(a[1],c)}}catch{}try{let s=$();if(S.existsSync(s)){let n=JSON.parse(S.readFileSync(s,"utf8"));n&&typeof n=="object"&&(r("ORACLE_DESK_URL",n.deskUrl||n.dataUrl||n.url),r("ORACLE_DATA_URL",n.dataUrl||n.deskUrl||n.url),r("ORACLE_API_URL",n.apiUrl||n.dataUrl||n.deskUrl),r("ORACLE_PUBLIC_URL",n.publicUrl||n.deskUrl||n.dataUrl),r("ORACLE_EXEC_URL",n.execUrl),r("MAD_DESK_URL",n.deskUrl||n.dataUrl))}}catch{}let t=process.env.ORACLE_DESK_URL||process.env.ORACLE_DATA_URL||"";return t&&(r("ORACLE_DESK_URL",t),r("ORACLE_DATA_URL",t),r("ORACLE_API_URL",t),r("ORACLE_PUBLIC_URL",t),r("MAD_DESK_URL",t)),m._result=Object.keys(i).length?i:null,m._result}try{m()}catch{}import{createCipheriv as W,createDecipheriv as pe,randomBytes as A,scryptSync as H}from"node:crypto";import o from"node:fs";import d from"node:path";var J="ORACLE-LOCAL-VAULT",q=1,C=Object.freeze({N:1<<17,r:8,p:1}),V=256*1024*1024,ge=16*1024;function K(e,i,r=C){let t=String(e??"");if(t.length<12)throw new Error("local-vault: passphrase must be at least 12 characters");return H(t,i,32,{...r,maxmem:V})}function T(e,i,r={}){let t=Buffer.isBuffer(e)?Buffer.from(e):Buffer.from(String(e));if(!t.length)throw new Error("local-vault: refusing empty key material");let s=A(32),n=A(12),a={magic:J,version:q,kdf:{name:"scrypt",...C,salt:s.toString("base64")},cipher:{name:"aes-256-gcm",iv:n.toString("base64")},meta:{address:r.address?String(r.address).toLowerCase():null,kind:r.kind||"evm",createdAt:new Date().toISOString()}},c=K(i,s);try{let l=W("aes-256-gcm",c,n);l.setAAD(Buffer.from(JSON.stringify(a)));let u=Buffer.concat([l.update(t),l.final()]);return{...a,ciphertext:u.toString("base64"),tag:l.getAuthTag().toString("base64")}}finally{c.fill(0),t.fill(0)}}function z(e){let i=o.lstatSync(e);if(i.isSymbolicLink())throw new Error("local-vault: refusing symlink");if(!i.isFile())throw new Error("local-vault: secret source must be a regular file");if(i.uid!==process.getuid?.())throw new Error("local-vault: secret source must be owned by this user");if(i.nlink!==1)throw new Error("local-vault: refusing hard-linked secret source");if((i.mode&63)!==0)throw new Error("local-vault: secret source must be owner-only (0600)")}function R(e){let i=d.dirname(e),r=o.lstatSync(i);if(!r.isDirectory()||r.isSymbolicLink())throw new Error("local-vault: unsafe destination directory");if(r.uid!==process.getuid?.())throw new Error("local-vault: destination directory must be owned by this user");try{let t=o.lstatSync(e);if(t.isSymbolicLink())throw new Error("local-vault: refusing symlink destination");if(!t.isFile()||t.uid!==process.getuid?.()||t.nlink!==1)throw new Error("local-vault: unsafe destination file");if(t.dev!==r.dev)throw new Error("local-vault: destination device mismatch")}catch(t){if(t.code!=="ENOENT")throw t}}function p(e){let i=o.lstatSync(e);z(e);let r=o.openSync(e,o.constants.O_RDONLY|o.constants.O_NOFOLLOW);try{let t=o.fstatSync(r);if(i.dev!==t.dev||i.ino!==t.ino||t.size>1024*1024)throw new Error("local-vault: secret source changed or is too large");return o.readFileSync(r,"utf8").replace(/[\r\n]+$/,"")}finally{o.closeSync(r)}}function P(e,i){o.mkdirSync(d.dirname(e),{recursive:!0,mode:448}),R(e);let r=d.join(d.dirname(e),`.${d.basename(e)}.${process.pid}.${A(6).toString("hex")}.tmp`),t;try{t=o.openSync(r,o.constants.O_CREAT|o.constants.O_EXCL|o.constants.O_WRONLY|o.constants.O_NOFOLLOW,384),o.writeFileSync(t,JSON.stringify(i,null,2)+`
2
- `),o.fsyncSync(t),o.closeSync(t),t=void 0;let s=o.openSync(r,o.constants.O_RDONLY|o.constants.O_NOFOLLOW),n;try{n=o.fstatSync(s)}finally{o.closeSync(s)}let a=o.lstatSync(d.dirname(e));if(n.nlink!==1||n.dev!==a.dev||n.uid!==process.getuid?.())throw new Error("local-vault: unsafe temporary file");o.renameSync(r,e),o.chmodSync(e,384);let c=o.openSync(d.dirname(e),"r");try{o.fsyncSync(c)}finally{o.closeSync(c)}}catch(s){if(t!==void 0)try{o.closeSync(t)}catch{}try{o.unlinkSync(r)}catch{}throw s}return e}function g(e,i){o.mkdirSync(d.dirname(e),{recursive:!0,mode:448}),R(e);let r=d.join(d.dirname(e),`.${d.basename(e)}.${process.pid}.${A(6).toString("hex")}.tmp`);try{let t=o.openSync(r,o.constants.O_CREAT|o.constants.O_EXCL|o.constants.O_WRONLY|o.constants.O_NOFOLLOW,384);try{o.writeFileSync(t,String(i)),o.fsyncSync(t)}finally{o.closeSync(t)}o.renameSync(r,e),o.chmodSync(e,384);let s=o.openSync(d.dirname(e),"r");try{o.fsyncSync(s)}finally{o.closeSync(s)}}catch(t){try{o.unlinkSync(r)}catch{}throw t}}import w from"node:path";var Y=new Set(["evm","evm-swap","evm-bridge","btc","sol"]),ye=Object.freeze({swap:5,bridge:5,perps:0,nft:0});var Se=Object.freeze([...Y]);import{createHmac as Q,timingSafeEqual as Fe}from"node:crypto";import{homedir as O}from"node:os";import{join as _}from"node:path";var N=process.env.ORACLE_PUBLIC_DESKTOP==="1",Z=N?process.env.ORACLE_CONFIG_DIR||_(O(),".config","oracle"):_(O(),".config","oracle"),Te=N?Z:_(O(),".config","mad-desk");var je="0".repeat(64),Ie=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"});function x(e){return e==null?"null":typeof e!="object"?JSON.stringify(e):Array.isArray(e)?"["+e.map(x).join(",")+"]":"{"+Object.keys(e).sort().map(r=>JSON.stringify(r)+":"+x(e[r])).join(",")+"}"}var Be=Promise.resolve();var ee=(e,i)=>Q("sha256",i).update(x(e)).digest("hex");function re(e,i){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("policy: object required");return{policy:e,integrity:{algorithm:"hmac-sha256-canonical-json-v1",mac:ee(e,i)}}}function D(e,i,r){let t=p(i);g(e,JSON.stringify(re(r,t),null,2)+`
3
- `)}function j(e){return{vault:w.join(e,"vault.json"),policy:w.join(e,"signer-policy.json"),policyKey:w.join(e,"policy-integrity-key"),ledger:w.join(e,"signer-ledger.json"),token:w.join(e,"signer-token"),lock:w.join(e,"signer.lock")}}import{randomBytes as te}from"node:crypto";var I=`oracle sign init|import|policy|status|lock|doctor
1
+ import d from"node:fs";import T from"node:path";import b from"node:fs";import j from"node:os";import w from"node:path";import{fileURLToPath as q}from"node:url";var F=w.dirname(q(import.meta.url)),xe=w.resolve(F,"../..");function k(){return process.env.ORACLE_FAKE_HOME||j.homedir()}function U(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function E(){return U()?process.env.ORACLE_CONFIG_DIR||w.join(k(),".config","oracle"):w.join(k(),".config","oracle")}function V(){return w.join(E(),"desk.json")}function G(){return w.join(E(),"env")}function h({force:e=!1}={}){if(h._done&&!e)return h._result||null;h._done=!0;let i={},r=(a,n)=>{if(n==null)return;let s=String(n).trim();s&&(process.env[a]!=null&&String(process.env[a]).trim()!==""||(process.env[a]=s,i[a]=s))};try{let a=G();if(b.existsSync(a))for(let n of b.readFileSync(a,"utf8").split(/\r?\n/)){let s=n.match(/^\s*([A-Z0-9_]+)\s*=\s*(.*?)\s*$/);if(!s||s[2].startsWith("#"))continue;let c=s[2];(c.startsWith('"')&&c.endsWith('"')||c.startsWith("'")&&c.endsWith("'"))&&(c=c.slice(1,-1)),r(s[1],c)}}catch{}try{let a=V();if(b.existsSync(a)){let n=JSON.parse(b.readFileSync(a,"utf8"));n&&typeof n=="object"&&(r("ORACLE_DESK_URL",n.deskUrl||n.dataUrl||n.url),r("ORACLE_DATA_URL",n.dataUrl||n.deskUrl||n.url),r("ORACLE_API_URL",n.apiUrl||n.dataUrl||n.deskUrl),r("ORACLE_PUBLIC_URL",n.publicUrl||n.deskUrl||n.dataUrl),r("ORACLE_EXEC_URL",n.execUrl),r("MAD_DESK_URL",n.deskUrl||n.dataUrl))}}catch{}let t=process.env.ORACLE_DESK_URL||process.env.ORACLE_DATA_URL||"";return t&&(r("ORACLE_DESK_URL",t),r("ORACLE_DATA_URL",t),r("ORACLE_API_URL",t),r("ORACLE_PUBLIC_URL",t),r("MAD_DESK_URL",t)),h._result=Object.keys(i).length?i:null,h._result}try{h()}catch{}import{createCipheriv as H,createDecipheriv as Se,randomBytes as S,scryptSync as W}from"node:crypto";import o from"node:fs";import l from"node:path";var J="ORACLE-LOCAL-VAULT",z=1,I=Object.freeze({N:1<<17,r:8,p:1}),K=256*1024*1024,Ae=16*1024;function X(e,i,r=I){let t=String(e??"");if(t.length<12)throw new Error("local-vault: passphrase must be at least 12 characters");return W(t,i,32,{...r,maxmem:K})}function L(e,i,r={}){let t=Buffer.isBuffer(e)?Buffer.from(e):Buffer.from(String(e));if(!t.length)throw new Error("local-vault: refusing empty key material");let a=S(32),n=S(12),s={magic:J,version:z,kdf:{name:"scrypt",...I,salt:a.toString("base64")},cipher:{name:"aes-256-gcm",iv:n.toString("base64")},meta:{address:r.address?String(r.address).toLowerCase():null,kind:r.kind||"evm",createdAt:new Date().toISOString()}},c=X(i,a);try{let u=H("aes-256-gcm",c,n);u.setAAD(Buffer.from(JSON.stringify(s)));let f=Buffer.concat([u.update(t),u.final()]);return{...s,ciphertext:f.toString("base64"),tag:u.getAuthTag().toString("base64")}}finally{c.fill(0),t.fill(0)}}function Y(e){let i=o.lstatSync(e);if(i.isSymbolicLink())throw new Error("local-vault: refusing symlink");if(!i.isFile())throw new Error("local-vault: secret source must be a regular file");if(i.uid!==process.getuid?.())throw new Error("local-vault: secret source must be owned by this user");if(i.nlink!==1)throw new Error("local-vault: refusing hard-linked secret source");if((i.mode&63)!==0)throw new Error("local-vault: secret source must be owner-only (0600)")}function $(e){let i=l.dirname(e),r=o.lstatSync(i);if(!r.isDirectory()||r.isSymbolicLink())throw new Error("local-vault: unsafe destination directory");if(r.uid!==process.getuid?.())throw new Error("local-vault: destination directory must be owned by this user");try{let t=o.lstatSync(e);if(t.isSymbolicLink())throw new Error("local-vault: refusing symlink destination");if(!t.isFile()||t.uid!==process.getuid?.()||t.nlink!==1)throw new Error("local-vault: unsafe destination file");if(t.dev!==r.dev)throw new Error("local-vault: destination device mismatch")}catch(t){if(t.code!=="ENOENT")throw t}}function p(e){let i=o.lstatSync(e);Y(e);let r=o.openSync(e,o.constants.O_RDONLY|o.constants.O_NOFOLLOW);try{let t=o.fstatSync(r);if(i.dev!==t.dev||i.ino!==t.ino||t.size>1024*1024)throw new Error("local-vault: secret source changed or is too large");return o.readFileSync(r,"utf8").replace(/[\r\n]+$/,"")}finally{o.closeSync(r)}}function R(e,i){o.mkdirSync(l.dirname(e),{recursive:!0,mode:448}),$(e);let r=l.join(l.dirname(e),`.${l.basename(e)}.${process.pid}.${S(6).toString("hex")}.tmp`),t;try{t=o.openSync(r,o.constants.O_CREAT|o.constants.O_EXCL|o.constants.O_WRONLY|o.constants.O_NOFOLLOW,384),o.writeFileSync(t,JSON.stringify(i,null,2)+`
2
+ `),o.fsyncSync(t),o.closeSync(t),t=void 0;let a=o.openSync(r,o.constants.O_RDONLY|o.constants.O_NOFOLLOW),n;try{n=o.fstatSync(a)}finally{o.closeSync(a)}let s=o.lstatSync(l.dirname(e));if(n.nlink!==1||n.dev!==s.dev||n.uid!==process.getuid?.())throw new Error("local-vault: unsafe temporary file");o.renameSync(r,e),o.chmodSync(e,384);let c=o.openSync(l.dirname(e),"r");try{o.fsyncSync(c)}finally{o.closeSync(c)}}catch(a){if(t!==void 0)try{o.closeSync(t)}catch{}try{o.unlinkSync(r)}catch{}throw a}return e}function g(e,i){o.mkdirSync(l.dirname(e),{recursive:!0,mode:448}),$(e);let r=l.join(l.dirname(e),`.${l.basename(e)}.${process.pid}.${S(6).toString("hex")}.tmp`);try{let t=o.openSync(r,o.constants.O_CREAT|o.constants.O_EXCL|o.constants.O_WRONLY|o.constants.O_NOFOLLOW,384);try{o.writeFileSync(t,String(i)),o.fsyncSync(t)}finally{o.closeSync(t)}o.renameSync(r,e),o.chmodSync(e,384);let a=o.openSync(l.dirname(e),"r");try{o.fsyncSync(a)}finally{o.closeSync(a)}}catch(t){try{o.unlinkSync(r)}catch{}throw t}}import m from"node:path";import{Interface as te,MaxUint256 as ir,isAddress as ar,keccak256 as sr,toUtf8Bytes as cr}from"ethers";import{Interface as ee,isAddress as je}from"ethers";import{isAddress as $e}from"ethers";var Ve=new ee(["function approve(address spender,uint256 amount) returns (bool)"]);import{Interface as re,isAddress as We}from"ethers";var Xe=new re(["function approve(address spender,uint256 amount) returns (bool)"]),Ye=Object.freeze({42161:"0x1c3fa76e6e1088bce750f23a5bfcffa1efef6a41",43114:"0x8f550e53dfe96c055d5bdb267c21f268fcaf63b2"});var mr=new te(["function approve(address spender,uint256 amount) returns (bool)"]);var ne=new Set(["evm","evm-swap","evm-bridge","btc","sol"]),br=Object.freeze({swap:5,bridge:5,perps:0,nft:0});var oe=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"},"0x7b939232":{provider:"across-v3",action:"bridge",layout:"across-deposit-v3"}});var Er=Object.freeze([...ne]),Sr=Object.freeze({...oe});import{createHash as Jr,createHmac as se,timingSafeEqual as zr,verify as Kr}from"node:crypto";import{homedir as _}from"node:os";import{join as N}from"node:path";var B=process.env.ORACLE_PUBLIC_DESKTOP==="1",ae=B?process.env.ORACLE_CONFIG_DIR||N(_(),".config","oracle"):N(_(),".config","oracle"),Dr=B?ae:N(_(),".config","mad-desk");var Ur="0".repeat(64),Vr=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"});function y(e){return e==null?"null":typeof e!="object"?JSON.stringify(e):Array.isArray(e)?"["+e.map(y).join(",")+"]":"{"+Object.keys(e).sort().map(r=>JSON.stringify(r)+":"+y(e[r])).join(",")+"}"}var Gr=Promise.resolve();var ce=(e,i)=>se("sha256",i).update(y(e)).digest("hex");function ue(e,i){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("policy: object required");return{policy:e,integrity:{algorithm:"hmac-sha256-canonical-json-v1",mac:ce(e,i)}}}function M(e,i,r){let t=p(i);g(e,JSON.stringify(ue(r,t),null,2)+`
3
+ `)}function D(e){return{vault:m.join(e,"vault.json"),policy:m.join(e,"signer-policy.json"),policyKey:m.join(e,"policy-integrity-key"),triggerAuthorityPublicKey:m.join(e,"trigger-attestation-authority.pub"),ledger:m.join(e,"signer-ledger.json"),token:m.join(e,"signer-token"),lock:m.join(e,"signer.lock")}}import{randomBytes as fe}from"node:crypto";var P=`oracle sign init|import|policy|status|lock|doctor
4
4
 
5
5
  oracle sign init [--passphrase-file <0600 file>]
6
6
  oracle sign import --key-file <0600 file> [--passphrase-file <0600 file>]
@@ -10,14 +10,14 @@ import f from"node:fs";import b from"node:path";import S from"node:fs";import B
10
10
  oracle sign doctor
11
11
 
12
12
  Secrets are accepted only from a hidden TTY or protected owner-only files.
13
- They are never accepted as argument values or inherited environment variables.`,k=(e,i)=>{let r=e.indexOf(i);return r>=0?e[r+1]:null};async function ne(e,i={}){if(i.readHidden)return i.readHidden(e);if(!process.stdin.isTTY)throw new Error("passphrase requires a TTY or --passphrase-file");return process.stderr.write(e),process.stdin.setRawMode(!0),process.stdin.resume(),new Promise((r,t)=>{let s="",n=c=>{for(let l of c){if(l===3){a(),t(new Error("cancelled"));return}if(l===13||l===10){a(),process.stderr.write(`
14
- `),r(s);return}l===127?s=s.slice(0,-1):s+=String.fromCharCode(l)}},a=()=>{process.stdin.off("data",n),process.stdin.setRawMode(!1),process.stdin.pause()};process.stdin.on("data",n)})}async function oe(e,i){let r=k(e,"--passphrase-file");return r?p(r):ne("Vault passphrase: ",i)}async function ie(e=[],i={}){let r=i.out||process.stdout,t=e[0],s=i.configDir||E(),n=j(b.join(s,"signer"));if(!t||t==="help")return r.write(I+`
15
- `),0;if(t==="status")return r.write(JSON.stringify({initialized:f.existsSync(n.vault),policyConfigured:f.existsSync(n.policy),armed:f.existsSync(n.vault)&&!f.existsSync(n.lock),disarmed:f.existsSync(n.lock)})+`
16
- `),0;if(t==="lock")return f.mkdirSync(b.dirname(n.lock),{recursive:!0,mode:448}),g(n.lock,`locked
13
+ They are never accepted as argument values or inherited environment variables.`,C=(e,i)=>{let r=e.indexOf(i);return r>=0?e[r+1]:null};async function de(e,i={}){if(i.readHidden)return i.readHidden(e);if(!process.stdin.isTTY)throw new Error("passphrase requires a TTY or --passphrase-file");return process.stderr.write(e),process.stdin.setRawMode(!0),process.stdin.resume(),new Promise((r,t)=>{let a="",n=c=>{for(let u of c){if(u===3){s(),t(new Error("cancelled"));return}if(u===13||u===10){s(),process.stderr.write(`
14
+ `),r(a);return}u===127?a=a.slice(0,-1):a+=String.fromCharCode(u)}},s=()=>{process.stdin.off("data",n),process.stdin.setRawMode(!1),process.stdin.pause()};process.stdin.on("data",n)})}async function le(e,i){let r=C(e,"--passphrase-file");return r?p(r):de("Vault passphrase: ",i)}async function pe(e=[],i={}){let r=i.out||process.stdout,t=e[0],a=i.configDir||E(),n=D(T.join(a,"signer"));if(!t||t==="help")return r.write(P+`
15
+ `),0;if(t==="status")return r.write(JSON.stringify({initialized:d.existsSync(n.vault),policyConfigured:d.existsSync(n.policy),armed:d.existsSync(n.vault)&&!d.existsSync(n.lock),disarmed:d.existsSync(n.lock)})+`
16
+ `),0;if(t==="lock")return d.mkdirSync(T.dirname(n.lock),{recursive:!0,mode:448}),g(n.lock,`locked
17
17
  `),r.write(`Local signer locked.
18
- `),0;if(t==="doctor"){let u=[];return f.existsSync(n.vault)||u.push("vault missing"),f.existsSync(n.policy)||u.push("policy missing (empty allowlists fail closed)"),r.write(u.length?`Signer not ready: ${u.join("; ")}
18
+ `),0;if(t==="doctor"){let f=[];return d.existsSync(n.vault)||f.push("vault missing"),d.existsSync(n.policy)||f.push("policy missing (empty allowlists fail closed)"),r.write(f.length?`Signer not ready: ${f.join("; ")}
19
19
  `:`Signer files ready; vault remains locked until a short-lived signer session starts.
20
- `),u.length?1:0}if(t==="policy"){if(!f.existsSync(n.vault)||!f.existsSync(n.policyKey))throw new Error("initialize the local signer before sealing policy");let u=k(e,"--policy-file");if(!u)throw new Error("policy requires --policy-file <0600 JSON file>");let y;try{y=JSON.parse(p(u))}catch{throw new Error("policy file must contain valid JSON")}for(let v of["surfaces","actions","chains","destinations","owners"])if(!Array.isArray(y[v])||y[v].length===0)throw new Error(`policy: ${v} allowlist is empty`);return D(n.policy,n.policyKey,y),r.write(`Signer policy sealed with local integrity protection.
21
- `),0}if(t!=="init"&&t!=="import")throw new Error(`unknown subcommand '${t}'`);let a=await oe(e,i),{Wallet:c}=await import("ethers"),l;if(t==="import"){let u=k(e,"--key-file");if(!u)throw new Error("import requires --key-file <0600 file>");l=new c(p(u))}else l=c.createRandom();f.mkdirSync(b.dirname(n.vault),{recursive:!0,mode:448}),P(n.vault,T(Buffer.from(l.privateKey),a,{address:l.address,kind:"evm"})),f.existsSync(n.policyKey)||g(n.policyKey,te(32).toString("hex")+`
22
- `);try{f.unlinkSync(n.lock)}catch(u){if(u.code!=="ENOENT")throw u}return r.write(`Encrypted local vault initialized for ${l.address}. User-initiated actions are armed; non-empty sealed policy rails are still required and disarm always wins.
23
- `),0}var hr={name:"sign",summary:"manage the encrypted self-hosted signing vault",usage:I,run:e=>ie(e.argv||[])};export{hr as default,ie as run};
20
+ `),f.length?1:0}if(t==="policy"){if(!d.existsSync(n.vault)||!d.existsSync(n.policyKey))throw new Error("initialize the local signer before sealing policy");let f=C(e,"--policy-file");if(!f)throw new Error("policy requires --policy-file <0600 JSON file>");let x;try{x=JSON.parse(p(f))}catch{throw new Error("policy file must contain valid JSON")}for(let A of["surfaces","actions","chains","destinations","owners"])if(!Array.isArray(x[A])||x[A].length===0)throw new Error(`policy: ${A} allowlist is empty`);return M(n.policy,n.policyKey,x),r.write(`Signer policy sealed with local integrity protection.
21
+ `),0}if(t!=="init"&&t!=="import")throw new Error(`unknown subcommand '${t}'`);let s=await le(e,i),{Wallet:c}=await import("ethers"),u;if(t==="import"){let f=C(e,"--key-file");if(!f)throw new Error("import requires --key-file <0600 file>");u=new c(p(f))}else u=c.createRandom();d.mkdirSync(T.dirname(n.vault),{recursive:!0,mode:448}),R(n.vault,L(Buffer.from(u.privateKey),s,{address:u.address,kind:"evm"})),d.existsSync(n.policyKey)||g(n.policyKey,fe(32).toString("hex")+`
22
+ `);try{d.unlinkSync(n.lock)}catch(f){if(f.code!=="ENOENT")throw f}return r.write(`Encrypted local vault initialized for ${u.address}. User-initiated swaps and bridges are armed; non-empty sealed policy rails, exact confirmation, and per-action bounds are still required, and disarm always wins.
23
+ `),0}var yt={name:"sign",summary:"manage the encrypted self-hosted signing vault",usage:P,run:e=>pe(e.argv||[])};export{yt as default,pe as run};
@@ -1,13 +1,19 @@
1
- import ur from"node:path";import N from"node:fs";import be from"node:os";import O from"node:path";import{fileURLToPath as Le}from"node:url";var Ce=O.dirname(Le(import.meta.url)),hr=O.resolve(Ce,"../..");function ee(){return process.env.ORACLE_FAKE_HOME||be.homedir()}function ke(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function D(){return ke()?process.env.ORACLE_CONFIG_DIR||O.join(ee(),".config","oracle"):O.join(ee(),".config","oracle")}function Te(){return O.join(D(),"desk.json")}function Re(){return O.join(D(),"env")}function v({force:e=!1}={}){if(v._done&&!e)return v._result||null;v._done=!0;let t={},r=(i,o)=>{if(o==null)return;let s=String(o).trim();s&&(process.env[i]!=null&&String(process.env[i]).trim()!==""||(process.env[i]=s,t[i]=s))};try{let i=Re();if(N.existsSync(i))for(let o of N.readFileSync(i,"utf8").split(/\r?\n/)){let s=o.match(/^\s*([A-Z0-9_]+)\s*=\s*(.*?)\s*$/);if(!s||s[2].startsWith("#"))continue;let u=s[2];(u.startsWith('"')&&u.endsWith('"')||u.startsWith("'")&&u.endsWith("'"))&&(u=u.slice(1,-1)),r(s[1],u)}}catch{}try{let i=Te();if(N.existsSync(i)){let o=JSON.parse(N.readFileSync(i,"utf8"));o&&typeof o=="object"&&(r("ORACLE_DESK_URL",o.deskUrl||o.dataUrl||o.url),r("ORACLE_DATA_URL",o.dataUrl||o.deskUrl||o.url),r("ORACLE_API_URL",o.apiUrl||o.dataUrl||o.deskUrl),r("ORACLE_PUBLIC_URL",o.publicUrl||o.deskUrl||o.dataUrl),r("ORACLE_EXEC_URL",o.execUrl),r("MAD_DESK_URL",o.deskUrl||o.dataUrl))}}catch{}let n=process.env.ORACLE_DESK_URL||process.env.ORACLE_DATA_URL||"";return n&&(r("ORACLE_DESK_URL",n),r("ORACLE_DATA_URL",n),r("ORACLE_API_URL",n),r("ORACLE_PUBLIC_URL",n),r("MAD_DESK_URL",n)),v._result=Object.keys(t).length?t:null,v._result}try{v()}catch{}import ye from"node:fs";import b from"node:path";import{randomBytes as ir}from"node:crypto";import Fe from"node:http";import{timingSafeEqual as $e}from"node:crypto";import{createHash as Ie,randomBytes as je,timingSafeEqual as Be}from"node:crypto";var te=new Set(["evm","evm-swap","evm-bridge","btc","sol"]),re=Object.freeze({swap:5,bridge:5,perps:0,nft:0}),I=(e,t,r=256)=>{if(typeof e!="string"||!e||e.length>r)throw new Error(`envelope: bounded ${t} required`);return e},E=(e,t)=>{try{let r=BigInt(e);if(r<0n)throw 0;return r}catch{throw new Error(`envelope: ${t} must be a non-negative integer`)}},Pe=(e,t)=>{if(!Array.isArray(e)||e.length===0)throw new Error(`policy: ${t} allowlist is empty`);return e},g=(e,t,r)=>{if(!Pe(t,r).map(n=>String(n).toLowerCase()).includes(String(e).toLowerCase()))throw new Error(`policy: ${r} not allowed`)};function Ne(e,{localsWaiver:t=!1}={}){if(!(e in re))throw new Error("fee: unknown action");return t?0:re[e]}function H(e,t,{nowMs:r=Date.now()}={}){if(!e||e.version!==1)throw new Error("envelope: version 1 required");let n=I(e.surface,"surface",16);if(!te.has(n))throw new Error("envelope: unsupported public surface");let i=I(e.action,"action",32);if(g(n,t.surfaces,"surface"),g(i,t.actions,"action"),g(e.owner,t.owners,"owner"),g(e.destination,t.destinations,"destination"),!Number.isFinite(e.expiresAtMs)||e.expiresAtMs<=r||e.expiresAtMs-r>Number(t.maxTtlMs))throw new Error("policy: TTL outside bounds");if(!Number.isFinite(e.slippageBps)||e.slippageBps<0||e.slippageBps>Number(t.maxSlippageBps))throw new Error("policy: slippage exceeds cap");let o=e.artifact;if(!o||typeof o!="object"||Array.isArray(o))throw new Error("envelope: structured artifact required");if(n.startsWith("evm")){g(Number(o.chainId),t.chains,"chain");let u=String(o.data||"0x").slice(0,10).toLowerCase();if(g(u,t.selectors,"selector"),String(o.to).toLowerCase()!==String(e.destination).toLowerCase())throw new Error("envelope: destination mismatch");if(E(o.value??0,"value")>E(t.maxValueWei,"maxValueWei"))throw new Error("policy: value exceeds cap");let p=E(o.gasLimit,"gasLimit"),a=E(o.maxFeePerGas??o.gasPrice,"feePerGas");if(p>E(t.maxGasLimit,"maxGasLimit")||p*a>E(t.maxFeeWei,"maxFeeWei"))throw new Error("policy: gas/fee exceeds cap")}else if(n==="btc"){if(I(o.psbt,"PSBT",1e5),g(o.network,t.chains,"chain"),!Array.isArray(o.outputs)||o.outputs.length===0||o.outputs.some(u=>!u.address||E(u.valueSats,"output value")<0n))throw new Error("envelope: bounded BTC outputs required")}else if(n==="sol"){if(I(o.messageBase64,"Solana message",1e5),g(o.cluster,t.chains,"chain"),!Array.isArray(o.programIds)||o.programIds.length===0)throw new Error("envelope: Solana program ids required");for(let u of o.programIds)g(u,t.programs,"program")}else throw new Error("envelope: unsupported public surface");let s=Ne(i,{localsWaiver:e.fee?.waiver==="locals-only-verified"});if(Number(e.fee?.oracleFeeBps)!==s)throw new Error("fee: final artifact fee mismatch");return!0}var De=Object.freeze([...te]);function ne(e={}){let t={};for(let r of De){let n=e[r];if(n){if(typeof n.sign!="function"||typeof n.broadcast!="function")throw new Error(`adapter: ${r} requires sign and broadcast functions`);t[r]=Object.freeze({sign:(i,o)=>n.sign(structuredClone(i),structuredClone(o)),broadcast:(i,o,s)=>n.broadcast(i,structuredClone(o),structuredClone(s))})}}return Object.freeze(t)}function J(e,t){let r=e?.surface||"evm",n=t?.[r];if(!n)throw new Error(`adapter: ${r} is not configured on this self-host`);return n}var j=e=>String(e||"").toLowerCase(),A=(e,t)=>{try{let r=BigInt(e??0);if(r<0n)throw 0;return r}catch{throw new Error(`policy: ${t} must be a non-negative integer`)}},C=(e,t,r,n=String)=>{if(!Array.isArray(t)||t.length===0)throw new Error(`policy: ${r} allowlist is empty`);if(!t.map(n).includes(n(e)))throw new Error(`policy: ${r} not allowed`)};function y(e){return Ie("sha256").update(JSON.stringify(e)).digest("hex")}function Me(e){let t=String(e||"").toLowerCase();return!t.startsWith("0x095ea7b3")||t.length!==138?null:{spender:`0x${t.slice(34,74)}`,amount:BigInt(`0x${t.slice(74)}`)}}function oe(e,t,{nowMs:r=Date.now()}={}){if(!e||!t)throw new Error("policy: artifact and policy required");C(Number(e.chainId),t.chains,"chain",Number),C(e.to,t.destinations,"destination",j),C(String(e.data||"0x").slice(0,10),t.selectors,"selector",s=>String(s).toLowerCase()),C(e.from,t.owners,"owner",j);let n=Me(e.data);if(String(e.data||"").slice(0,10).toLowerCase()==="0x095ea7b3"){if(!n)throw new Error("policy: malformed approval calldata");if(C(n.spender,t.spenders,"spender",j),n.amount>A(t.maxApproval,"maxApproval"))throw new Error("policy: approval exceeds cap")}if(A(e.value,"value")>A(t.maxValueWei,"maxValueWei"))throw new Error("policy: value exceeds cap");let i=A(e.gasLimit,"gasLimit");if(i>A(t.maxGasLimit,"maxGasLimit"))throw new Error("policy: gas exceeds cap");if(A(e.maxFeePerGas??e.gasPrice,"feePerGas")*i>A(t.maxFeeWei,"maxFeeWei"))throw new Error("policy: fee exceeds cap");if(!Number.isFinite(e.slippageBps)||e.slippageBps<0||e.slippageBps>Number(t.maxSlippageBps))throw new Error("policy: slippage attestation exceeds cap");if(!Number.isFinite(e.expiresAtMs)||e.expiresAtMs<=r)throw new Error("policy: artifact expired");return!0}var B=class{#e=new Map;constructor({now:t=Date.now}={}){this.now=t}issue({artifact:t,owner:r,ttlMs:n=6e4}){if(n<=0||n>12e4)throw new Error("confirmation: ttl out of range");let i=je(32).toString("hex");return this.#e.set(i,{digest:y(t),owner:j(r),expiresAtMs:this.now()+n}),i}consume(t,r){let n=this.#e.get(String(t));if(!n)throw new Error("confirmation: used or unknown nonce");if(n.expiresAtMs<=this.now())throw this.#e.delete(String(t)),new Error("confirmation: expired nonce");let i=Buffer.from(n.digest,"hex"),o=Buffer.from(y(r),"hex");if(!Be(i,o))throw new Error("confirmation: artifact mismatch");return this.#e.delete(String(t)),n}clear(){this.#e.clear()}};function Ue(e={},t={}){let r={};for(let n of new Set([...Object.keys(e),...Object.keys(t)]))r[n]=(BigInt(t[n]??0)-BigInt(e[n]??0)).toString();return r}async function ie(e,t,r){if(!r.isArmed())throw new Error("signer: disarmed");let n=e?.version===1&&e?.surface?e:null,i=n?n.artifact:e,o=typeof r.readPolicy=="function"?r.readPolicy():r.policy,s=o?.confirmationMode||"exact-human";if(r.autonomous===!0){if(r.env?.ORACLE_AUTONOMOUS_TRADING!=="1")throw new Error("signer: autonomous execution requires ORACLE_AUTONOMOUS_TRADING=1");if(typeof r.verifyTriggerAttestation!="function"||await r.verifyTriggerAttestation(n?.triggerAttestation,e)!==!0)throw new Error("signer: autonomous trigger attestation required")}else if(s==="exact-human")r.confirmations.consume(t,e);else if(s!=="auto-within-rails")throw new Error("signer: unsupported confirmation mode");let u=y(e),p=()=>typeof r.nowMs=="function"?r.nowMs():r.nowMs??Date.now();n?H(n,o,{nowMs:p()}):oe(e,o,{nowMs:p()}),typeof r.reserveLedger=="function"&&r.reserveLedger(n||e,o);let a=await r.sign(i,n);if(!r.isArmed())throw new Error("signer: disarmed before broadcast");if(y(e)!==u)throw new Error("signer: artifact mutated after signing");o=typeof r.readPolicy=="function"?r.readPolicy():r.policy,n?H(n,o,{nowMs:p()}):oe(e,o,{nowMs:p()});let f=await r.broadcast(a,i,n),c=f?.status,L=c===1||c==="0x1"?"success":c===0||c==="0x0"?"failed":"pending",x=f?.verifiedBefore??f?.before,S=f?.verifiedAfter??f?.after;return{prepared:e,signed:a,receipt:{transactionHash:f?.hash||f?.transactionHash||null,status:L,balanceDeltaVerified:!!(f?.verifiedBefore&&f?.verifiedAfter),delta:Ue(x,S)}}}var se=new Set(["127.0.0.1","::1","localhost"]),Ge=(e,t)=>{let r=Buffer.from(String(e)),n=Buffer.from(String(t));return r.length===n.length&&$e(r,n)},m=(e,t,r)=>{let n=JSON.stringify(r);e.writeHead(t,{"content-type":"application/json","cache-control":"no-store","content-length":Buffer.byteLength(n)}),e.end(n)},ae=e=>new Promise((t,r)=>{let n=0,i=[],o=!1;e.on("data",s=>{n+=s.length,n>64*1024&&!o?(o=!0,r(new Error("request refused")),e.resume()):o||i.push(s)}),e.on("end",()=>{if(!o)try{t(JSON.parse(Buffer.concat(i).toString()||"{}"))}catch{r(new Error("request refused"))}}),e.on("error",r)});function ce(e={}){let t=e.host||"127.0.0.1";if(!se.has(t))throw new Error("signer: loopback bind required");if(String(e.token||"").length<32)throw new Error("signer: strong auth token required");let r=e.confirmations||new B,n=e.origin||`http://${t}`;return Fe.createServer(async(o,s)=>{try{let u=String(o.headers.authorization||"").replace(/^Bearer /i,"");if(!Ge(u,e.token))return m(s,401,{error:"unauthorized"});let p=String(o.headers.host||"").replace(/^\[|\](?=:|$)/g,"").split(":")[0];if(!se.has(p))return m(s,403,{error:"host refused"});if(o.headers.origin&&o.headers.origin!==n)return m(s,403,{error:"origin refused"});if(o.method==="GET"&&o.url==="/status")return m(s,200,{ok:!0,armed:e.isArmed?.()===!0,sessionExpiresAtMs:e.sessionExpiresAtMs||null});if(o.method==="POST"&&o.url==="/disarm")return e.disarm?.(),r.clear(),m(s,200,{ok:!0,armed:!1});if(!["GET","POST"].includes(o.method))return m(s,405,{error:"request refused"});if(o.method==="POST"&&String(o.headers["content-type"]||"").split(";",1)[0].trim().toLowerCase()!=="application/json")return m(s,415,{error:"request refused"});if(o.method==="POST"&&o.url==="/confirm"){let a=await ae(o),f=y(a.artifact);if(e.autonomous!==!0){if(typeof e.confirmArtifact!="function")return m(s,403,{error:"local human confirmation unavailable"});if(await e.confirmArtifact(a.artifact,f)!==!0)return m(s,400,{error:"exact human confirmation refused"})}return m(s,200,{confirmationNonce:r.issue({artifact:a.artifact,owner:a.artifact?.from,ttlMs:a.ttlMs})})}if(o.method==="POST"&&o.url==="/execute"){let a=await ae(o),f=await ie(a.artifact,a.confirmationNonce,{...e,confirmations:r});return m(s,200,f)}return m(s,404,{error:"not found"})}catch(u){return e.onError?.(String(u?.message||u)),m(s,400,{error:"request refused"})}})}import{createCipheriv as br,createDecipheriv as We,randomBytes as He,scryptSync as Je}from"node:crypto";import l from"node:fs";import _ from"node:path";var Ve="ORACLE-LOCAL-VAULT",qe=1,U=Object.freeze({N:1<<17,r:8,p:1}),ze=256*1024*1024,Ke=16*1024;function M(e,t,r,{max:n=t}={}){if(typeof e!="string"||!/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(e))throw new Error(`local-vault: invalid ${r} encoding`);let i=Buffer.from(e,"base64");if(i.toString("base64")!==e||i.length<t||i.length>n)throw new Error(`local-vault: invalid ${r} length`);return i}function Ye(e,t,r=U){let n=String(e??"");if(n.length<12)throw new Error("local-vault: passphrase must be at least 12 characters");return Je(n,t,32,{...r,maxmem:ze})}function ue(e,t){if(e?.magic!==Ve||e?.version!==qe)throw new Error("local-vault: unsupported vault file");if(e?.kdf?.name!=="scrypt"||e?.cipher?.name!=="aes-256-gcm")throw new Error("local-vault: unsupported cryptography");if(e.kdf.N!==U.N||e.kdf.r!==U.r||e.kdf.p!==U.p)throw new Error("local-vault: unsupported KDF parameters");if(Object.keys(e.kdf).sort().join(",")!=="N,name,p,r,salt"||Object.keys(e.cipher).sort().join(",")!=="iv,name")throw new Error("local-vault: unexpected cryptography field");if(!e.meta||Object.keys(e.meta).some(c=>!["address","kind","createdAt"].includes(c))||String(e.meta.kind||"").length>16||String(e.meta.address||"").length>128||!Number.isFinite(Date.parse(e.meta.createdAt)))throw new Error("local-vault: invalid metadata");let r=["magic","version","kdf","cipher","meta","ciphertext","tag"];if(Object.keys(e).some(c=>!r.includes(c)))throw new Error("local-vault: unexpected vault field");let n=M(e.kdf.salt,32,"salt"),i=M(e.cipher.iv,12,"iv"),o=M(e.tag,16,"tag"),s=M(e.ciphertext,1,"ciphertext",{max:Ke}),{ciphertext:u,tag:p,...a}=e,f=Ye(t,n);try{let c=We("aes-256-gcm",f,i);return c.setAAD(Buffer.from(JSON.stringify(a))),c.setAuthTag(o),Buffer.concat([c.update(s),c.final()])}catch{throw new Error("local-vault: wrong passphrase or tampered vault")}finally{f.fill(0)}}function le(e){let t=l.lstatSync(e);if(t.isSymbolicLink())throw new Error("local-vault: refusing symlink");if(!t.isFile())throw new Error("local-vault: secret source must be a regular file");if(t.uid!==process.getuid?.())throw new Error("local-vault: secret source must be owned by this user");if(t.nlink!==1)throw new Error("local-vault: refusing hard-linked secret source");if((t.mode&63)!==0)throw new Error("local-vault: secret source must be owner-only (0600)")}function Xe(e){let t=_.dirname(e),r=l.lstatSync(t);if(!r.isDirectory()||r.isSymbolicLink())throw new Error("local-vault: unsafe destination directory");if(r.uid!==process.getuid?.())throw new Error("local-vault: destination directory must be owned by this user");try{let n=l.lstatSync(e);if(n.isSymbolicLink())throw new Error("local-vault: refusing symlink destination");if(!n.isFile()||n.uid!==process.getuid?.()||n.nlink!==1)throw new Error("local-vault: unsafe destination file");if(n.dev!==r.dev)throw new Error("local-vault: destination device mismatch")}catch(n){if(n.code!=="ENOENT")throw n}}function w(e){let t=l.lstatSync(e);le(e);let r=l.openSync(e,l.constants.O_RDONLY|l.constants.O_NOFOLLOW);try{let n=l.fstatSync(r);if(t.dev!==n.dev||t.ino!==n.ino||n.size>1024*1024)throw new Error("local-vault: secret source changed or is too large");return l.readFileSync(r,"utf8").replace(/[\r\n]+$/,"")}finally{l.closeSync(r)}}function fe(e){return le(e),JSON.parse(l.readFileSync(e,"utf8"))}function k(e,t){l.mkdirSync(_.dirname(e),{recursive:!0,mode:448}),Xe(e);let r=_.join(_.dirname(e),`.${_.basename(e)}.${process.pid}.${He(6).toString("hex")}.tmp`);try{let n=l.openSync(r,l.constants.O_CREAT|l.constants.O_EXCL|l.constants.O_WRONLY|l.constants.O_NOFOLLOW,384);try{l.writeFileSync(n,String(t)),l.fsyncSync(n)}finally{l.closeSync(n)}l.renameSync(r,e),l.chmodSync(e,384);let i=l.openSync(_.dirname(e),"r");try{l.fsyncSync(i)}finally{l.closeSync(i)}}catch(n){try{l.unlinkSync(r)}catch{}throw n}}import{createHmac as Qe,timingSafeEqual as er}from"node:crypto";import{homedir as V}from"node:os";import{join as q}from"node:path";var de=process.env.ORACLE_PUBLIC_DESKTOP==="1",Ze=de?process.env.ORACLE_CONFIG_DIR||q(V(),".config","oracle"):q(V(),".config","oracle"),Pr=de?Ze:q(V(),".config","mad-desk");var Br="0".repeat(64),Mr=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"});function F(e){return e==null?"null":typeof e!="object"?JSON.stringify(e):Array.isArray(e)?"["+e.map(F).join(",")+"]":"{"+Object.keys(e).sort().map(r=>JSON.stringify(r)+":"+F(e[r])).join(",")+"}"}var Ur=Promise.resolve();var rr=864e5,$=(e,t)=>Qe("sha256",t).update(F(e)).digest("hex"),z=(e,t)=>{let r=Buffer.from(String(e)),n=Buffer.from(String(t));return r.length===n.length&&er(r,n)};function tr(e,t){if(e?.integrity?.algorithm!=="hmac-sha256-canonical-json-v1"||!z(e.integrity.mac,$(e.policy,t)))throw new Error("policy: integrity verification failed");return structuredClone(e.policy)}function me(e,t){let r=w(t),n;try{n=JSON.parse(w(e))}catch(i){throw new Error(`policy: cannot read sealed policy: ${i?.message||i}`)}return tr(n,r)}function nr(e,t,r){try{let n=JSON.parse(w(e));if(!z(n?.integrity?.mac,$(n.ledger,t)))throw new Error("integrity verification failed");let i=n.ledger;if(!Number.isFinite(i?.windowStartMs)||!Array.isArray(i?.entries))throw new Error("invalid ledger");return r-i.windowStartMs>=rr?{windowStartMs:r,entries:[]}:i}catch(n){if(n?.code==="ENOENT")return{windowStartMs:r,entries:[]};throw new Error(`ledger: corrupt or unreadable: ${n?.message||n}`)}}function pe(e,t){return e.reduce((r,n)=>r+BigInt(n[t]??0),0n)}function he({file:e,keyFile:t,tradeId:r,value:n=0,notional:i=0,policy:o,nowMs:s=Date.now()}){if(!/^[A-Za-z0-9._:-]{1,128}$/.test(String(r||"")))throw new Error("ledger: bounded tradeId required");let u=w(t),p=nr(e,u,s);if(p.entries.some(S=>S.tradeId===r))throw new Error("ledger: replayed tradeId");let a=BigInt(n),f=BigInt(i),c=BigInt(o.maxDailyValueWei),L=BigInt(o.maxDailyNotional??o.maxDailyValueWei),x=BigInt(o.maxPerTrade??o.maxValueWei);if(a<0n||f<0n||f>x)throw new Error("ledger: per-trade cap exceeded");if(pe(p.entries,"value")+a>c||pe(p.entries,"notional")+f>L)throw new Error("ledger: daily cap exceeded");return p.entries.push({tradeId:String(r),value:a.toString(),notional:f.toString(),atMs:s}),k(e,JSON.stringify({ledger:p,integrity:{algorithm:"hmac-sha256-canonical-json-v1",mac:$(p,u)}})+`
2
- `),structuredClone(p)}function ge(e,t,r,n=Date.now()){if(e?.algorithm!=="hmac-sha256-canonical-json-v1"||!/^[A-Za-z0-9._:-]{1,128}$/.test(String(e?.triggerId||""))||!Number.isFinite(e.issuedAtMs)||!Number.isFinite(e.expiresAtMs)||e.issuedAtMs>n||e.expiresAtMs<=n||e.expiresAtMs-e.issuedAtMs>12e4)return!1;let i={triggerId:e.triggerId,issuedAtMs:e.issuedAtMs,expiresAtMs:e.expiresAtMs,artifactDigest:y(t)};return z(e.mac,$(i,w(r)))}import{spawnSync as or}from"node:child_process";function we(e="oracle-local-signer",t=process.env.USER||process.env.USERNAME||"oracle"){let r,n;if(process.platform==="darwin")r="/usr/bin/security",n=["find-generic-password","-s",e,"-a",t,"-w"];else if(process.platform==="linux")r="secret-tool",n=["lookup","service",e,"account",t];else throw new Error("signer: OS credential lookup is supported on macOS and Linux; use a protected passphrase file on this platform");let i=or(r,n,{encoding:"utf8",stdio:["ignore","pipe","ignore"],env:{PATH:process.env.PATH,HOME:process.env.HOME,USER:process.env.USER,LOGNAME:process.env.LOGNAME,DBUS_SESSION_BUS_ADDRESS:process.env.DBUS_SESSION_BUS_ADDRESS}}),o=String(i.stdout||"").replace(/[\r\n]+$/,"");if(i.status!==0||o.length<12)throw new Error("signer: OS credential passphrase unavailable");return o}function sr(e){return{vault:b.join(e,"vault.json"),policy:b.join(e,"signer-policy.json"),policyKey:b.join(e,"policy-integrity-key"),ledger:b.join(e,"signer-ledger.json"),token:b.join(e,"signer-token"),lock:b.join(e,"signer.lock")}}function ar(e){try{return w(e)}catch(r){if(r.code!=="ENOENT")throw r}let t=ir(32).toString("hex");return k(e,t+`
3
- `),t}async function Se({configDir:e,passphraseFile:t,credentialService:r,surfaceTransports:n={},host:i="127.0.0.1",port:o=9462,sessionMs:s=12e4}={}){let{JsonRpcProvider:u,Wallet:p}=await import("ethers");if(!t&&!r)throw new Error("signer: --credential-service or --passphrase-file is required for non-interactive service start");if(s<1e3||s>12e4)throw new Error("signer: session must be at most 120 seconds");let a=sr(e),f=()=>Object.freeze(me(a.policy,a.policyKey)),c=f();for(let d of["surfaces","actions","chains","destinations","spenders","owners"])if(!Array.isArray(c[d])||c[d].length===0)throw new Error(`signer: ${d} allowlist is empty`);if(c.surfaces.some(d=>String(d).startsWith("evm"))&&(!Array.isArray(c.selectors)||c.selectors.length===0))throw new Error("signer: selectors allowlist is empty");if(c.surfaces.includes("sol")&&(!Array.isArray(c.programs)||c.programs.length===0))throw new Error("signer: programs allowlist is empty");if(c.surfaces.some(d=>d==="hl"||d==="poly"))throw new Error("signer: hl/poly are not public signer families");let L=r?we(r):w(t),x=ue(fe(a.vault),L),S;try{S=new p(x.toString())}finally{x.fill(0)}let T=new u(c.rpcUrl,Number(c.chains?.[0])),Ae=S.connect(T),W={sign:d=>Ae.signTransaction(d),broadcast:async(d,h)=>{let P={native:(await T.getBalance(h.from)).toString()},Z=await T.broadcastTransaction(d),Q=await Z.wait(),_e={native:(await T.getBalance(h.from)).toString()};return{hash:Q?.hash??Z.hash,status:Q?.status??null,verifiedBefore:P,verifiedAfter:_e}}},K=ne({evm:W,"evm-swap":W,"evm-bridge":W,...n}),xe=Date.now(),Y=xe+s,ve=()=>ye.existsSync(a.vault)&&!ye.existsSync(a.lock)&&Date.now()<Y,Oe=()=>(k(a.lock,`disarmed ${new Date().toISOString()}
4
- `),!0),R=ce({host:i,port:o,token:ar(a.token),policy:c,readPolicy:f,isArmed:ve,disarm:Oe,sessionExpiresAtMs:Y,nowMs:Date.now,sign:(d,h)=>J(h,K).sign(d,h),broadcast:(d,h,P)=>J(P,K).broadcast(d,h,P),confirmArtifact:cr,reserveLedger:(d,h)=>he({file:a.ledger,keyFile:a.policyKey,tradeId:d.tradeId,value:d.artifact?.value??0,notional:d.notional??d.artifact?.value??0,policy:h}),verifyTriggerAttestation:(d,h)=>ge(d,h,a.policyKey),autonomous:process.env.ORACLE_AUTONOMOUS_TRADING==="1",env:process.env}),X=setTimeout(()=>R.close(),s);return X.unref(),R.on("close",()=>{clearTimeout(X),S=null}),R.listen(o,i),R}async function cr(e,t){return process.stdin.isTTY?(process.stderr.write(`
1
+ import at from"node:path";import K from"node:fs";import Je from"node:os";import M from"node:path";import{fileURLToPath as ze}from"node:url";var Ke=M.dirname(ze(import.meta.url)),dt=M.resolve(Ke,"../..");function Se(){return process.env.ORACLE_FAKE_HOME||Je.homedir()}function Xe(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function X(){return Xe()?process.env.ORACLE_CONFIG_DIR||M.join(Se(),".config","oracle"):M.join(Se(),".config","oracle")}function Ye(){return M.join(X(),"desk.json")}function Ze(){return M.join(X(),"env")}function B({force:e=!1}={}){if(B._done&&!e)return B._result||null;B._done=!0;let r={},t=(o,a)=>{if(a==null)return;let i=String(a).trim();i&&(process.env[o]!=null&&String(process.env[o]).trim()!==""||(process.env[o]=i,r[o]=i))};try{let o=Ze();if(K.existsSync(o))for(let a of K.readFileSync(o,"utf8").split(/\r?\n/)){let i=a.match(/^\s*([A-Z0-9_]+)\s*=\s*(.*?)\s*$/);if(!i||i[2].startsWith("#"))continue;let f=i[2];(f.startsWith('"')&&f.endsWith('"')||f.startsWith("'")&&f.endsWith("'"))&&(f=f.slice(1,-1)),t(i[1],f)}}catch{}try{let o=Ye();if(K.existsSync(o)){let a=JSON.parse(K.readFileSync(o,"utf8"));a&&typeof a=="object"&&(t("ORACLE_DESK_URL",a.deskUrl||a.dataUrl||a.url),t("ORACLE_DATA_URL",a.dataUrl||a.deskUrl||a.url),t("ORACLE_API_URL",a.apiUrl||a.dataUrl||a.deskUrl),t("ORACLE_PUBLIC_URL",a.publicUrl||a.deskUrl||a.dataUrl),t("ORACLE_EXEC_URL",a.execUrl),t("MAD_DESK_URL",a.deskUrl||a.dataUrl))}}catch{}let n=process.env.ORACLE_DESK_URL||process.env.ORACLE_DATA_URL||"";return n&&(t("ORACLE_DESK_URL",n),t("ORACLE_DATA_URL",n),t("ORACLE_API_URL",n),t("ORACLE_PUBLIC_URL",n),t("MAD_DESK_URL",n)),B._result=Object.keys(r).length?r:null,B._result}try{B()}catch{}import Ve from"node:fs";import L from"node:path";import{randomBytes as et}from"node:crypto";import kr from"node:http";import{timingSafeEqual as Lr}from"node:crypto";import{createHash as Or,randomBytes as _r,timingSafeEqual as Nr}from"node:crypto";import{Interface as mr,MaxUint256 as Xt,isAddress as Yt,keccak256 as Zt,toUtf8Bytes as Qt}from"ethers";import{Interface as lr,isAddress as Ct}from"ethers";import{isAddress as yt}from"ethers";import{createHash as nr,createHmac as or,timingSafeEqual as ar}from"node:crypto";import{readFileSync as Qe}from"node:fs";import{homedir as er}from"node:os";import{join as Y}from"node:path";function rr(){if(process.env.ORACLE_TEST_ISOLATE_SECRETS==="1"){let t=(process.env.ORACLE_EXEC_ENV_FILE||"").trim();return t?[t]:[]}let e=(process.env.ORACLE_EXEC_ENV_FILE||process.env.MAD_EXEC_ENV_FILE||"").trim(),r=er();if(process.env.ORACLE_PUBLIC_DESKTOP==="1"){let t=(process.env.ORACLE_CONFIG_DIR||Y(r,".config","oracle")).trim();return[e,Y(t,"exec.env")].filter(Boolean)}return[e,Y(r,".config","oracle","exec.env"),Y(r,".config","mad-desk","exec.env")].filter(Boolean)}function V(e,r,t){let n=e??process.env[r]??process.env[t];if(!String(n||"").trim())for(let o of rr())try{let a=Qe(o,"utf8"),i=a.match(new RegExp(`^${r}=(.*)$`,"m"))||a.match(new RegExp(`^${t}=(.*)$`,"m"));if(i&&(n=i[1].trim(),n))break}catch{}if(!String(n||"").trim())throw new Error(`${r} required for attestation. Set it in the environment, or place ${r}=<value> in ~/.config/oracle/exec.env`);return n}function D(e,r,t="guard"){let n=Number(r);if(r==null||!Number.isFinite(n))throw new Error(`${t}: current time must be a finite number (got ${tr(r)})`);let o=Number(e?.issuedAtMs),a=Number(e?.expiresAtMs);if(!Number.isFinite(a))throw new Error(`${t}: expiresAtMs is required and must be a finite number`);if(n>a)throw new Error(`${t} expired at ${a}, now ${n}`);if(e?.issuedAtMs!=null){if(!Number.isFinite(o))throw new Error(`${t}: issuedAtMs must be a finite number when present`);if(a<=o)throw new Error(`${t}: expiry must be after issuance`)}return{now:n,issuedAtMs:o,expiresAtMs:a}}function tr(e){return e===null?"null":e===void 0?"undefined":typeof e=="number"?String(e):`${typeof e} ${JSON.stringify(String(e)).slice(0,24)}`}var ve=100;function oe(e){return Array.isArray(e)?`[${e.map(oe).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(r=>`${JSON.stringify(r)}:${oe(e[r])}`).join(",")}}`:JSON.stringify(e??null)}function ir(e,{required:r=!1}={}){try{return V(e,"ORACLE_ROUTE_ATTESTATION_SECRET","MAD_ROUTE_ATTESTATION_SECRET")}catch(t){if(r)throw t;return null}}function sr(e){let{signature:r,...t}=e;return t}function cr(e){let r=String(e||"").toLowerCase();if(!/^0x[0-9a-f]+$/.test(r)||r.length<10||r.length%2!==0)throw new Error("auto-slippage calldata must be even-length hex with a selector");return nr("sha256").update(Buffer.from(r.slice(2),"hex")).digest("hex")}function ur(e,r){let t=Buffer.from(String(e??""),"utf8"),n=Buffer.from(String(r??""),"utf8");return t.length!==n.length||t.length===0?!1:ar(t,n)}function fr(e){let r=String(e||"");if(!/^0x[0-9a-fA-F]+$/.test(r)||r.length<10||r.length%2!==0)return null;let t=r.slice(0,10).toLowerCase(),n=[];for(let a=10;a+64<=r.length;a+=64)n.push(r.slice(a,a+64));let o=a=>n[a]==null?null:BigInt("0x"+n[a]);switch(t){case"0x414bf389":return o(6);case"0x04e45aaf":return o(5);case"0xc04b8d59":{let a=o(0);if(a==null)return null;let i=Number(a)/32;return!Number.isInteger(i)||i<0?null:o(i+4)}case"0xb858183f":{let a=o(0);if(a==null)return null;let i=Number(a)/32;return!Number.isInteger(i)||i<0?null:o(i+3)}case"0xa026383e":return o(6);case"0x38ed1739":case"0x5c11d795":return o(1);case"0x7ff36ab5":case"0xb6f9de95":return o(0);case"0x18cbafe5":case"0x791ac947":return o(1);default:return null}}function ae(e,{nowMs:r=Date.now(),chainId:t,venue:n,secret:o,tx:a,requireSigned:i=!1}={}){if(!e||e.mode!=="auto")throw new Error("bounded auto-slippage guard required");let f=ir(o,{required:i});if(i&&!f)throw new Error("auto-slippage attestation secret required for signing or broadcast");if(f){let m=or("sha256",f).update(oe(sr(e))).digest("hex");if(!ur(e.signature,m))throw new Error("auto-slippage guard signature mismatch \u2014 the guard was not issued by this Oracle")}else if(e.signature)throw new Error("auto-slippage guard carries a signature but no attestation secret is configured");let d=Number(e.selectedBps),s=Number(e.capBps);if(!Number.isInteger(d)||d<0||d>ve)throw new Error("auto-slippage selected tolerance exceeds hard 100 bps cap");if(!Number.isInteger(s)||s<0||s>ve||d>s)throw new Error("auto-slippage cap exceeds hard 100 bps cap");try{D({expiresAtMs:e.expiresAtMs,issuedAtMs:e.quotedAtMs},r,"auto-slippage quote")}catch(m){throw new Error(`${m.message}; re-quote before signing`)}if(t!=null&&Number(e.chainId)!==Number(t))throw new Error("auto-slippage guard chain mismatch");if(n&&String(e.venue).toLowerCase()!==String(n).toLowerCase())throw new Error("auto-slippage guard venue mismatch");let l=BigInt(e.quoteAmountOut??0),c=BigInt(e.minAmountOut??0);if(l<=0n||c<=0n)throw new Error("auto-slippage guard amounts must be positive");let E=l*BigInt(1e4-d)/10000n;if(c<E)throw new Error("auto-slippage guard is under-protected relative to its fresh quote");if(a?.data&&e.minAmountOut!=null)if(e.calldataHash!=null){if(String(e.calldataHash)!==cr(a.data))throw new Error("auto-slippage guard is not bound to this call: calldata hash mismatch")}else{let m=fr(a.data);if(m==null){let h=String(a.data).slice(0,10);throw new Error(`auto-slippage: cannot verify the output floor encoded by selector ${h}; refusing rather than trusting unbound calldata at an allowlisted venue`)}if(m!==BigInt(e.minAmountOut))throw new Error(`auto-slippage guard is not bound to this call: guard minAmountOut ${e.minAmountOut} but calldata encodes ${m}`)}return!0}var Rt=new lr(["function approve(address spender,uint256 amount) returns (bool)"]);import{Interface as pr,isAddress as Dt}from"ethers";var qt=new pr(["function approve(address spender,uint256 amount) returns (bool)"]),Ut=Object.freeze({42161:"0x1c3fa76e6e1088bce750f23a5bfcffa1efef6a41",43114:"0x8f550e53dfe96c055d5bdb267c21f268fcaf63b2"});var an=new mr(["function approve(address spender,uint256 amount) returns (bool)"]);var ie=new Set(["0x095ea7b3","0x39509351","0x61f49ed6","0xeb5625d9","0xf9255c1f","0x87517c45","0xd505accf","0x8fcbaf0c","0x2b67b570","0x2a2d80d1"]);var ye=new Set(["evm","evm-swap","evm-bridge","btc","sol"]),Ae=Object.freeze({swap:5,bridge:5,perps:0,nft:0}),Oe=new Set(["evm-swap","evm-bridge"]),hr=new Set(["0x0000000000000000000000000000000000000000","0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"]),ce=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"},"0x7b939232":{provider:"across-v3",action:"bridge",layout:"across-deposit-v3"}}),gr=new Set(["0x04e45aaf","0x414bf389","0xc04b8d59","0xb858183f","0xa026383e","0x38ed1739","0x5c11d795","0x7ff36ab5","0xb6f9de95","0x18cbafe5","0x791ac947"]),wr=new Set(["0xa9059cbb","0x23b872dd","0x42842e0e","0xb88d4fde","0xf242432a","0x2eb2c2d6","0xa22cb465","0xd0e30db0","0x2e1a7d4d","0x3593564c","0x24856bc3","0xac9650d8","0x5ae401dc"]),se=(e,r,t=256)=>{if(typeof e!="string"||!e||e.length>t)throw new Error(`envelope: bounded ${r} required`);return e},x=(e,r)=>{try{let t=BigInt(e);if(t<0n)throw 0;return t}catch{throw new Error(`envelope: ${r} must be a non-negative integer`)}},xr=(e,r)=>{if(!Array.isArray(e)||e.length===0)throw new Error(`policy: ${r} allowlist is empty`);return e},v=(e,r,t)=>{if(!xr(r,t).map(n=>String(n).toLowerCase()).includes(String(e).toLowerCase()))throw new Error(`policy: ${t} not allowed`)},G=(e,r)=>{let t=String(e||"").toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(t))throw new Error(`envelope: ${r} must be a 20-byte address`);return t},P=e=>String(e||"0x").slice(0,10).toLowerCase();function ue(e){return ie.has(P(e))}function H(e){let r=P(e);return gr.has(r)||wr.has(r)||Object.hasOwn(ce,r)||ie.has(r)}function fe(e,r,t,{dynamicTail:n=!1}={}){let o=String(e||"").toLowerCase();if(!/^0x[0-9a-f]*$/.test(o)||o.length<10+r*64)throw new Error(`envelope: malformed ${t} calldata`);if(!n&&o.length!==10+r*64)throw new Error(`envelope: malformed ${t} calldata`);return{hex:o,word:a=>o.slice(10+a*64,10+(a+1)*64)}}function I(e,r){if(!/^0{24}[0-9a-f]{40}$/.test(e))throw new Error(`envelope: malformed ${r} address`);return`0x${e.slice(24)}`}function C(e,r){try{return BigInt(`0x${e}`)}catch{throw new Error(`envelope: malformed ${r} integer`)}}function br(e){if(P(e)!=="0x095ea7b3")return null;let r=fe(e,2,"approval");return{kind:"approval",spender:I(r.word(0),"approval spender"),amount:C(r.word(1),"approval amount")}}function Er(e,r){let t=r==="router02-exact-input-single"?7:8,n=fe(e,t,"Uniswap v3 exactInputSingle"),o=t===7?4:5;return{kind:"action",action:"swap",inputToken:I(n.word(0),"input token"),outputToken:I(n.word(1),"output token"),recipient:I(n.word(3),"recipient"),amountIn:C(n.word(o),"amountIn"),minimumOut:C(n.word(o+1),"amountOutMinimum")}}function Sr(e){let r=fe(e,12,"Across depositV3",{dynamicTail:!0}),t=C(r.word(11),"message offset");if(t!==384n)throw new Error("envelope: malformed Across depositV3 message offset");let n=10+Number(t)*2;if(r.hex.length<n+64)throw new Error("envelope: malformed Across depositV3 message");let o=Number(BigInt(`0x${r.hex.slice(n,n+64)}`));if(!Number.isSafeInteger(o))throw new Error("envelope: malformed Across depositV3 message length");let a=Math.ceil(o/32)*64;if(r.hex.length!==n+64+a)throw new Error("envelope: malformed Across depositV3 trailing bytes");return{kind:"action",action:"bridge",depositor:I(r.word(0),"depositor"),recipient:I(r.word(1),"recipient"),inputToken:I(r.word(2),"input token"),outputToken:I(r.word(3),"output token"),amountIn:C(r.word(4),"inputAmount"),minimumOut:C(r.word(5),"outputAmount"),destinationChainId:C(r.word(6),"destinationChainId")}}function vr(e,r){let t=P(e),n=ce[t];if(!n)throw new Error("envelope: opaque or unsupported EVM swap/bridge calldata");if(String(r).toLowerCase()!==n.provider)throw new Error("envelope: provider does not match reviewed selector");if(n.action==="swap")return{...Er(e,n.layout),selector:t,provider:n.provider};if(n.action==="bridge")return{...Sr(e),selector:t,provider:n.provider};throw new Error("envelope: unsupported reviewed EVM action")}function de(e){let r=e?.artifact;if(Array.isArray(r?.transactions))return r.transactions;if(r?.transaction&&typeof r.transaction=="object")return[r.transaction];if(r?.data)return[r];throw new Error("envelope: ordered EVM transaction batch required")}function le(e,r,{nowMs:t=Date.now(),routeAttestationSecret:n}={}){let o=String(e?.surface||"");if(!Oe.has(o))throw new Error("envelope: strict EVM swap/bridge surface required");let a=se(e.provider,"provider",64).toLowerCase();v(a,r.providers,"provider");let i=G(e.owner,"owner"),f=e.artifact,d=Number(f?.chainId);if(!Number.isSafeInteger(d)||d<=0)throw new Error("envelope: explicit batch chainId required");if(v(d,r.chains,"chain"),G(f?.owner,"batch owner")!==i)throw new Error("envelope: explicit batch owner mismatch");let s=de(e);if(!s.length||s.length>8)throw new Error("envelope: bounded EVM transaction batch required");let l=0n,c=0n,E=0n,m=[],h=-1;for(let b=0;b<s.length;b++){let w=s[b];if(!w||typeof w!="object"||Array.isArray(w))throw new Error("envelope: structured EVM transaction required");if(Number(w.chainId)!==d)throw new Error("envelope: every batch leg must use the same chain");if(G(w.from,"transaction owner")!==i)throw new Error("envelope: every batch leg must use the same owner");let ne=P(w.data);v(ne,r.selectors,"selector");let R=br(w.data),T;if(R){if(h!==-1)throw new Error("envelope: approval must be before action");let _=G(w.to,"approval token");if(v(_,r.tokens,"token"),v(R.spender,r.spenders,"spender"),R.amount>x(r.maxApproval,"maxApproval"))throw new Error("policy: approval exceeds cap");T={...R,token:_,index:b}}else{if(h!==-1)throw new Error("envelope: exactly one swap/bridge action is supported per batch");v(w.to,r.destinations,"destination"),T={...vr(w.data,a),target:G(w.to,"action target"),index:b},h=b}let U=x(w.value??0,"value"),u=x(w.gasLimit,"gasLimit"),S=x(w.maxFeePerGas??w.gasPrice,"feePerGas");l+=U,c+=u,E+=u*S,m.push({...T,value:U,gas:u,fee:u*S})}if(h<0)throw new Error("envelope: reviewed swap/bridge action required");if(l>x(r.maxValueWei,"maxValueWei"))throw new Error("policy: aggregate value exceeds cap");if(c>x(r.maxGasLimit,"maxGasLimit"))throw new Error("policy: aggregate gas exceeds cap");if(E>x(r.maxFeeWei,"maxFeeWei"))throw new Error("policy: aggregate fee exceeds cap");let g=m[h],$=o==="evm-swap"?"swap":"bridge";if(g.action!==$||e.action!==$)throw new Error("envelope: surface/action/calldata mismatch");if(g.recipient!==i)throw new Error("envelope: decoded recipient must equal owner");if(g.depositor&&g.depositor!==i)throw new Error("envelope: decoded bridge depositor must equal owner");if(v(g.inputToken,r.tokens,"input token"),v(g.outputToken,r.tokens,"output token"),g.amountIn<=0n||g.amountIn>x(r.maxPerTrade,"maxPerTrade"))throw new Error("policy: decoded amount exceeds per-trade cap");if(g.minimumOut<=0n)throw new Error("policy: decoded minimum output must be positive");if(ae(e.autoSlippage,{nowMs:t,chainId:d,venue:a,tx:s[h],secret:n,requireSigned:!0}),Number(e.slippageBps)!==Number(e.autoSlippage.selectedBps))throw new Error("policy: slippageBps must equal the authenticated quote selectedBps");if(g.minimumOut!==x(e.autoSlippage.minAmountOut,"authenticated quote minAmountOut"))throw new Error("policy: decoded minimum output does not match authenticated quote");if(g.action==="bridge"&&x(e.toChainId,"toChainId")!==g.destinationChainId)throw new Error("envelope: decoded bridge destination chain mismatch");let O=m.filter(b=>b.kind==="approval");if(hr.has(g.inputToken)){if(O.length)throw new Error("envelope: native-value action must not include token approval")}else{if(O.length!==1)throw new Error("envelope: exactly one approval is required before action");let b=O[0];if(b.index>=h)throw new Error("envelope: approval must be before action");if(b.token!==g.inputToken)throw new Error("envelope: approval token does not match decoded input token");if(b.spender!==g.target)throw new Error("envelope: approval spender does not match decoded action target");if(b.amount!==g.amountIn)throw new Error("envelope: approval amount must exactly match decoded action amount")}let z=Object.freeze({quoteAmountOut:x(e.autoSlippage.quoteAmountOut,"authenticated quote amountOut"),minAmountOut:x(e.autoSlippage.minAmountOut,"authenticated quote minAmountOut"),selectedBps:Number(e.autoSlippage.selectedBps),quotedAtMs:Number(e.autoSlippage.quotedAtMs),expiresAtMs:Number(e.autoSlippage.expiresAtMs)});return{transactions:s,decoded:m,action:g,totalValue:l,totalGas:c,totalFee:E,chainId:d,owner:i,provider:a,authenticatedQuote:z}}function Ar(e,{localsWaiver:r=!1}={}){if(!(e in Ae))throw new Error("fee: unknown action");return r?0:Ae[e]}function _e(e,r,{nowMs:t=Date.now(),routeAttestationSecret:n}={}){if(!e||e.version!==1)throw new Error("envelope: version 1 required");let o=se(e.surface,"surface",16);if(!ye.has(o))throw new Error("envelope: unsupported public surface");let a=se(e.action,"action",32);if(v(o,r.surfaces,"surface"),v(a,r.actions,"action"),v(e.owner,r.owners,"owner"),v(e.destination,r.destinations,"destination"),!Number.isFinite(e.expiresAtMs)||e.expiresAtMs<=t||e.expiresAtMs-t>Number(r.maxTtlMs))throw new Error("policy: TTL outside bounds");if(!Number.isFinite(e.slippageBps)||e.slippageBps<0||e.slippageBps>Number(r.maxSlippageBps))throw new Error("policy: slippage exceeds cap");let i=e.artifact;if(!i||typeof i!="object"||Array.isArray(i))throw new Error("envelope: structured artifact required");if(Oe.has(o))le(e,r,{nowMs:t,routeAttestationSecret:n});else if(o==="evm"){if(ue(i.data))throw new Error("envelope: approval requires a strict decoded surface");if(a==="swap"||a==="bridge"||H(i.data))throw new Error("envelope: strict EVM swap/bridge surface required");v(Number(i.chainId),r.chains,"chain");let d=P(i.data);if(v(d,r.selectors,"selector"),String(i.from).toLowerCase()!==String(e.owner).toLowerCase())throw new Error("envelope: owner mismatch");if(String(i.to).toLowerCase()!==String(e.destination).toLowerCase())throw new Error("envelope: destination mismatch");if(x(i.value??0,"value")>x(r.maxValueWei,"maxValueWei"))throw new Error("policy: value exceeds cap");let s=x(i.gasLimit,"gasLimit"),l=x(i.maxFeePerGas??i.gasPrice,"feePerGas");if(s>x(r.maxGasLimit,"maxGasLimit")||s*l>x(r.maxFeeWei,"maxFeeWei"))throw new Error("policy: gas/fee exceeds cap")}else throw o==="btc"||o==="sol"?new Error("envelope: btc/sol require decoded payload; caller-authored outputs and programIds are refused"):new Error("envelope: unsupported public surface");let f=Ar(a,{localsWaiver:e.fee?.waiver==="locals-only-verified"});if(Number(e.fee?.oracleFeeBps)!==f)throw new Error("fee: final artifact fee mismatch");return!0}var yr=Object.freeze([...ye]),fn=Object.freeze({...ce});function Ne(e={}){let r={};for(let t of yr){let n=e[t];if(n){if(typeof n.sign!="function"||typeof n.broadcast!="function")throw new Error(`adapter: ${t} requires sign and broadcast functions`);r[t]=Object.freeze({sign:(o,a)=>n.sign(structuredClone(o),structuredClone(a)),broadcast:(o,a,i)=>n.broadcast(o,structuredClone(a),structuredClone(i))})}}return Object.freeze(r)}function pe(e,r){let t=e?.surface||"evm",n=r?.[t];if(!n)throw new Error(`adapter: ${t} is not configured on this self-host`);return n}var me=e=>String(e||"").toLowerCase(),j=(e,r)=>{try{let t=BigInt(e??0);if(t<0n)throw 0;return t}catch{throw new Error(`policy: ${r} must be a non-negative integer`)}},Z=(e,r,t,n=String)=>{if(!Array.isArray(r)||r.length===0)throw new Error(`policy: ${t} allowlist is empty`);if(!r.map(n).includes(n(e)))throw new Error(`policy: ${t} not allowed`)};function k(e){return Or("sha256").update(JSON.stringify(e)).digest("hex")}function Tr(e,r,{nowMs:t=Date.now()}={}){if(!e||!r)throw new Error("policy: artifact and policy required");if(ue(e.data))throw new Error("envelope: approval requires a strict decoded surface");if(H(e.data))throw new Error("envelope: strict EVM swap/bridge surface required");if(Z(Number(e.chainId),r.chains,"chain",Number),Z(e.to,r.destinations,"destination",me),Z(String(e.data||"0x").slice(0,10),r.selectors,"selector",a=>String(a).toLowerCase()),Z(e.from,r.owners,"owner",me),j(e.value,"value")>j(r.maxValueWei,"maxValueWei"))throw new Error("policy: value exceeds cap");let n=j(e.gasLimit,"gasLimit");if(n>j(r.maxGasLimit,"maxGasLimit"))throw new Error("policy: gas exceeds cap");if(j(e.maxFeePerGas??e.gasPrice,"feePerGas")*n>j(r.maxFeeWei,"maxFeeWei"))throw new Error("policy: fee exceeds cap");if(!Number.isFinite(e.slippageBps)||e.slippageBps<0||e.slippageBps>Number(r.maxSlippageBps))throw new Error("policy: slippage attestation exceeds cap");if(!Number.isFinite(e.expiresAtMs)||e.expiresAtMs<=t)throw new Error("policy: artifact expired");return!0}var Q=class{#e=new Map;constructor({now:r=Date.now}={}){this.now=r}issue({artifact:r,owner:t,ttlMs:n=6e4}){if(n<=0||n>12e4)throw new Error("confirmation: ttl out of range");let o=_r(32).toString("hex");return this.#e.set(o,{digest:k(r),owner:me(t),expiresAtMs:this.now()+n}),o}consume(r,t){let n=this.#e.get(String(r));if(!n)throw new Error("confirmation: used or unknown nonce");if(n.expiresAtMs<=this.now())throw this.#e.delete(String(r)),new Error("confirmation: expired nonce");let o=Buffer.from(n.digest,"hex"),a=Buffer.from(k(t),"hex");if(!Nr(o,a))throw new Error("confirmation: artifact mismatch");return this.#e.delete(String(r)),n}clear(){this.#e.clear()}};function Ir(e={},r={}){let t={};for(let n of new Set([...Object.keys(e||{}),...Object.keys(r||{})]))t[n]=(BigInt(r?.[n]??0)-BigInt(e?.[n]??0)).toString();return t}function Cr(e){let r=e?.status,t=r===1||r==="0x1"?"success":r===0||r==="0x0"?"failed":"pending",n=e?.verifiedBefore??e?.before,o=e?.verifiedAfter??e?.after;return{transactionHash:e?.hash||e?.transactionHash||null,status:t,balanceDeltaVerified:!!(e?.verifiedBefore&&e?.verifiedAfter),delta:Ir(n,o)}}function Te(e){return e?.surface==="evm-swap"||e?.surface==="evm-bridge"}function W(e,r,t=Date.now(),{routeAttestationSecret:n}={}){let o=e?.version===1&&e?.surface?e:null;return o?(_e(o,r,{nowMs:t,routeAttestationSecret:n}),Te(o)?le(o,r,{nowMs:t,routeAttestationSecret:n}):null):(Tr(e,r,{nowMs:t}),null)}async function Ie(e,r,t){if(!t.isArmed())throw new Error("signer: disarmed");let n=e?.version===1&&e?.surface?e:null,o=()=>typeof t.nowMs=="function"?t.nowMs():t.nowMs??Date.now(),a=typeof t.readPolicy=="function"?t.readPolicy():t.policy,i=a?.confirmationMode||"exact-human";if(t.autonomous===!0){if(t.env?.ORACLE_AUTONOMOUS_TRADING!=="1")throw new Error("signer: autonomous execution requires ORACLE_AUTONOMOUS_TRADING=1");if(typeof t.verifyTriggerAttestation!="function"||await t.verifyTriggerAttestation(n?.triggerAttestation,e)!==!0)throw new Error("signer: autonomous trigger attestation required")}else{if(i==="auto-within-rails")throw new Error("signer: auto-within-rails requires autonomous trading with authenticated trigger attestation");if(i!=="exact-human")throw new Error("signer: unsupported confirmation mode");if(!t.confirmations||typeof t.confirmations.consume!="function")throw new Error("signer: exact confirmation store required");t.confirmations.consume(r,e)}let f=k(e),d=W(e,a,o(),{routeAttestationSecret:t.routeAttestationSecret});typeof t.reserveLedger=="function"&&t.reserveLedger(n||e,a,d);let s=n&&Te(n)?de(n):[n?n.artifact:e],l=[],c=[];for(let h=0;h<s.length;h++){if(!t.isArmed())throw new Error("signer: disarmed before signing");if(k(e)!==f)throw new Error("signer: artifact mutated before signing");h>0&&(a=typeof t.readPolicy=="function"?t.readPolicy():t.policy,d=W(e,a,o(),{routeAttestationSecret:t.routeAttestationSecret}));let g=await t.sign(s[h],n);if(l.push(g),!t.isArmed())throw new Error("signer: disarmed before broadcast");if(k(e)!==f)throw new Error("signer: artifact mutated before broadcast");a=typeof t.readPolicy=="function"?t.readPolicy():t.policy,d=W(e,a,o(),{routeAttestationSecret:t.routeAttestationSecret});let $=await t.broadcast(g,s[h],n),O=Cr($);if(c.push(O),O.status!=="success")break}let E=c.length===s.length&&c.every(h=>h.status==="success")?"success":c.some(h=>h.status==="failed")?"failed":"pending",m={prepared:e,signed:s.length===1?l[0]:l,receipt:c[0]||null,receipts:c,status:E};return n?.surface==="evm-bridge"&&(m.originStatus=E,m.destinationStatus="unverified",m.destinationSuccess=!1,m.note="Origin-chain receipts do not prove destination-chain settlement."),m}var Ce=new Set(["127.0.0.1","::1","localhost"]),$r=(e,r)=>{let t=Buffer.from(String(e)),n=Buffer.from(String(r));return t.length===n.length&&Lr(t,n)},A=(e,r,t)=>{let n=JSON.stringify(t);e.writeHead(r,{"content-type":"application/json","cache-control":"no-store","content-length":Buffer.byteLength(n)}),e.end(n)},ke=e=>new Promise((r,t)=>{let n=0,o=[],a=!1;e.on("data",i=>{n+=i.length,n>64*1024&&!a?(a=!0,t(new Error("request refused")),e.resume()):a||o.push(i)}),e.on("end",()=>{if(!a)try{r(JSON.parse(Buffer.concat(o).toString()||"{}"))}catch{t(new Error("request refused"))}}),e.on("error",t)});function Le(e={}){let r=e.host||"127.0.0.1";if(!Ce.has(r))throw new Error("signer: loopback bind required");if(String(e.token||"").length<32)throw new Error("signer: strong auth token required");let t=e.confirmations||new Q,n=e.origin||`http://${r}`;return kr.createServer(async(a,i)=>{try{let f=String(a.headers.authorization||"").replace(/^Bearer /i,"");if(!$r(f,e.token))return A(i,401,{error:"unauthorized"});let d=String(a.headers.host||"").replace(/^\[|\](?=:|$)/g,"").split(":")[0];if(!Ce.has(d))return A(i,403,{error:"host refused"});if(a.headers.origin&&a.headers.origin!==n)return A(i,403,{error:"origin refused"});if(a.method==="GET"&&a.url==="/status")return A(i,200,{ok:!0,armed:e.isArmed?.()===!0,sessionExpiresAtMs:e.sessionExpiresAtMs||null});if(a.method==="POST"&&a.url==="/disarm")return e.disarm?.(),t.clear(),A(i,200,{ok:!0,armed:!1});if(!["GET","POST"].includes(a.method))return A(i,405,{error:"request refused"});if(a.method==="POST"&&String(a.headers["content-type"]||"").split(";",1)[0].trim().toLowerCase()!=="application/json")return A(i,415,{error:"request refused"});if(a.method==="POST"&&a.url==="/confirm"){let s=await ke(a),l=k(s.artifact);if(e.autonomous!==!0){if(typeof e.confirmArtifact!="function")return A(i,403,{error:"local human confirmation unavailable"});let c=typeof e.readPolicy=="function"?e.readPolicy():e.policy,E=typeof e.nowMs=="function"?e.nowMs():e.nowMs??Date.now(),m=W(s.artifact,c,E);if(await e.confirmArtifact(s.artifact,l,m)!==!0)return A(i,400,{error:"exact human confirmation refused"})}return A(i,200,{confirmationNonce:t.issue({artifact:s.artifact,owner:s.artifact?.from,ttlMs:s.ttlMs})})}if(a.method==="POST"&&a.url==="/execute"){let s=await ke(a),l=await Ie(s.artifact,s.confirmationNonce,{...e,confirmations:t});return A(i,200,l)}return A(i,404,{error:"not found"})}catch(f){return e.onError?.(String(f?.message||f)),A(i,400,{error:"request refused"})}})}import{createCipheriv as En,createDecipheriv as Rr,randomBytes as Br,scryptSync as Mr}from"node:crypto";import p from"node:fs";import F from"node:path";var Dr="ORACLE-LOCAL-VAULT",Pr=1,re=Object.freeze({N:1<<17,r:8,p:1}),jr=256*1024*1024,Fr=16*1024;function ee(e,r,t,{max:n=r}={}){if(typeof e!="string"||!/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(e))throw new Error(`local-vault: invalid ${t} encoding`);let o=Buffer.from(e,"base64");if(o.toString("base64")!==e||o.length<r||o.length>n)throw new Error(`local-vault: invalid ${t} length`);return o}function qr(e,r,t=re){let n=String(e??"");if(n.length<12)throw new Error("local-vault: passphrase must be at least 12 characters");return Mr(n,r,32,{...t,maxmem:jr})}function $e(e,r){if(e?.magic!==Dr||e?.version!==Pr)throw new Error("local-vault: unsupported vault file");if(e?.kdf?.name!=="scrypt"||e?.cipher?.name!=="aes-256-gcm")throw new Error("local-vault: unsupported cryptography");if(e.kdf.N!==re.N||e.kdf.r!==re.r||e.kdf.p!==re.p)throw new Error("local-vault: unsupported KDF parameters");if(Object.keys(e.kdf).sort().join(",")!=="N,name,p,r,salt"||Object.keys(e.cipher).sort().join(",")!=="iv,name")throw new Error("local-vault: unexpected cryptography field");if(!e.meta||Object.keys(e.meta).some(c=>!["address","kind","createdAt"].includes(c))||String(e.meta.kind||"").length>16||String(e.meta.address||"").length>128||!Number.isFinite(Date.parse(e.meta.createdAt)))throw new Error("local-vault: invalid metadata");let t=["magic","version","kdf","cipher","meta","ciphertext","tag"];if(Object.keys(e).some(c=>!t.includes(c)))throw new Error("local-vault: unexpected vault field");let n=ee(e.kdf.salt,32,"salt"),o=ee(e.cipher.iv,12,"iv"),a=ee(e.tag,16,"tag"),i=ee(e.ciphertext,1,"ciphertext",{max:Fr}),{ciphertext:f,tag:d,...s}=e,l=qr(r,n);try{let c=Rr("aes-256-gcm",l,o);return c.setAAD(Buffer.from(JSON.stringify(s))),c.setAuthTag(a),Buffer.concat([c.update(i),c.final()])}catch{throw new Error("local-vault: wrong passphrase or tampered vault")}finally{l.fill(0)}}function Re(e){let r=p.lstatSync(e);if(r.isSymbolicLink())throw new Error("local-vault: refusing symlink");if(!r.isFile())throw new Error("local-vault: secret source must be a regular file");if(r.uid!==process.getuid?.())throw new Error("local-vault: secret source must be owned by this user");if(r.nlink!==1)throw new Error("local-vault: refusing hard-linked secret source");if((r.mode&63)!==0)throw new Error("local-vault: secret source must be owner-only (0600)")}function Ur(e){let r=F.dirname(e),t=p.lstatSync(r);if(!t.isDirectory()||t.isSymbolicLink())throw new Error("local-vault: unsafe destination directory");if(t.uid!==process.getuid?.())throw new Error("local-vault: destination directory must be owned by this user");try{let n=p.lstatSync(e);if(n.isSymbolicLink())throw new Error("local-vault: refusing symlink destination");if(!n.isFile()||n.uid!==process.getuid?.()||n.nlink!==1)throw new Error("local-vault: unsafe destination file");if(n.dev!==t.dev)throw new Error("local-vault: destination device mismatch")}catch(n){if(n.code!=="ENOENT")throw n}}function N(e){let r=p.lstatSync(e);Re(e);let t=p.openSync(e,p.constants.O_RDONLY|p.constants.O_NOFOLLOW);try{let n=p.fstatSync(t);if(r.dev!==n.dev||r.ino!==n.ino||n.size>1024*1024)throw new Error("local-vault: secret source changed or is too large");return p.readFileSync(t,"utf8").replace(/[\r\n]+$/,"")}finally{p.closeSync(t)}}function Be(e){return Re(e),JSON.parse(p.readFileSync(e,"utf8"))}function J(e,r){p.mkdirSync(F.dirname(e),{recursive:!0,mode:448}),Ur(e);let t=F.join(F.dirname(e),`.${F.basename(e)}.${process.pid}.${Br(6).toString("hex")}.tmp`);try{let n=p.openSync(t,p.constants.O_CREAT|p.constants.O_EXCL|p.constants.O_WRONLY|p.constants.O_NOFOLLOW,384);try{p.writeFileSync(n,String(r)),p.fsyncSync(n)}finally{p.closeSync(n)}p.renameSync(t,e),p.chmodSync(e,384);let o=p.openSync(F.dirname(e),"r");try{p.fsyncSync(o)}finally{p.closeSync(o)}}catch(n){try{p.unlinkSync(t)}catch{}throw n}}import{createHash as Gr,createHmac as Hr,timingSafeEqual as Wr,verify as Jr}from"node:crypto";import{homedir as he}from"node:os";import{join as ge}from"node:path";var Me=process.env.ORACLE_PUBLIC_DESKTOP==="1",Vr=Me?process.env.ORACLE_CONFIG_DIR||ge(he(),".config","oracle"):ge(he(),".config","oracle"),_n=Me?Vr:ge(he(),".config","mad-desk");var kn="0".repeat(64),Ln=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"});function q(e){return e==null?"null":typeof e!="object"?JSON.stringify(e):Array.isArray(e)?"["+e.map(q).join(",")+"]":"{"+Object.keys(e).sort().map(t=>JSON.stringify(t)+":"+q(e[t])).join(",")+"}"}var $n=Promise.resolve();var zr=864e5,we=(e,r)=>Hr("sha256",r).update(q(e)).digest("hex"),xe=(e,r)=>{let t=Buffer.from(String(e)),n=Buffer.from(String(r));return t.length===n.length&&Wr(t,n)};function Pe(e){if(!e||typeof e!="object"||Object.isFrozen(e))return e;Object.freeze(e);for(let r of Object.values(e))Pe(r);return e}function Kr(e){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("trigger attestation: artifact object required");let r=structuredClone(e);return delete r.triggerAttestation,Pe(r)}function Xr(e){return Gr("sha256").update(q(Kr(e))).digest("hex")}function Yr(e,r){if(e?.integrity?.algorithm!=="hmac-sha256-canonical-json-v1"||!xe(e.integrity.mac,we(e.policy,r)))throw new Error("policy: integrity verification failed");return structuredClone(e.policy)}function je(e,r){let t=N(r),n;try{n=JSON.parse(N(e))}catch(o){throw new Error(`policy: cannot read sealed policy: ${o?.message||o}`)}return Yr(n,t)}function Zr(e,r,t){try{let n=JSON.parse(N(e));if(!xe(n?.integrity?.mac,we(n.ledger,r)))throw new Error("integrity verification failed");let o=n.ledger;if(!Number.isFinite(o?.windowStartMs)||!Array.isArray(o?.entries))throw new Error("invalid ledger");return t-o.windowStartMs>=zr?{windowStartMs:t,entries:[]}:o}catch(n){if(n?.code==="ENOENT")return{windowStartMs:t,entries:[]};throw new Error(`ledger: corrupt or unreadable: ${n?.message||n}`)}}function De(e,r){return e.reduce((t,n)=>t+BigInt(n[r]??0),0n)}function Fe({file:e,keyFile:r,tradeId:t,value:n=0,notional:o=0,policy:a,nowMs:i=Date.now()}){if(!/^[A-Za-z0-9._:-]{1,128}$/.test(String(t||"")))throw new Error("ledger: bounded tradeId required");let f=N(r),d=Zr(e,f,i);if(d.entries.some(h=>h.tradeId===t))throw new Error("ledger: replayed tradeId");let s=BigInt(n),l=BigInt(o),c=BigInt(a.maxDailyValueWei),E=BigInt(a.maxDailyNotional??a.maxDailyValueWei),m=BigInt(a.maxPerTrade??a.maxValueWei);if(s<0n||l<0n||l>m)throw new Error("ledger: per-trade cap exceeded");if(De(d.entries,"value")+s>c||De(d.entries,"notional")+l>E)throw new Error("ledger: daily cap exceeded");return d.entries.push({tradeId:String(t),value:s.toString(),notional:l.toString(),atMs:i}),J(e,JSON.stringify({ledger:d,integrity:{algorithm:"hmac-sha256-canonical-json-v1",mac:we(d,f)}})+`
2
+ `),structuredClone(d)}function qe(e,r,t,n=Date.now()){if(e?.algorithm!=="ed25519-canonical-json-v1"||!/^[A-Za-z0-9._:-]{1,128}$/.test(String(e?.triggerId||""))||!Number.isFinite(e.issuedAtMs)||!Number.isFinite(e.expiresAtMs)||e.issuedAtMs>n||e.expiresAtMs<=n||e.expiresAtMs-e.issuedAtMs>12e4)return!1;let o;try{o=Xr(r)}catch{return!1}if(!/^[0-9a-f]{64}$/.test(String(e.artifactDigest||""))||!xe(e.artifactDigest,o))return!1;let a={triggerId:e.triggerId,issuedAtMs:e.issuedAtMs,expiresAtMs:e.expiresAtMs,artifactDigest:o};if(!/^[A-Za-z0-9+/]{86}==$/.test(String(e.signature||"")))return!1;try{return Jr(null,Buffer.from(q(a)),N(t),Buffer.from(e.signature,"base64"))}catch{return!1}}import{spawnSync as Qr}from"node:child_process";function Ue(e="oracle-local-signer",r=process.env.USER||process.env.USERNAME||"oracle"){let t,n;if(process.platform==="darwin")t="/usr/bin/security",n=["find-generic-password","-s",e,"-a",r,"-w"];else if(process.platform==="linux")t="secret-tool",n=["lookup","service",e,"account",r];else throw new Error("signer: OS credential lookup is supported on macOS and Linux; use a protected passphrase file on this platform");let o=Qr(t,n,{encoding:"utf8",stdio:["ignore","pipe","ignore"],env:{PATH:process.env.PATH,HOME:process.env.HOME,USER:process.env.USER,LOGNAME:process.env.LOGNAME,DBUS_SESSION_BUS_ADDRESS:process.env.DBUS_SESSION_BUS_ADDRESS}}),a=String(o.stdout||"").replace(/[\r\n]+$/,"");if(o.status!==0||a.length<12)throw new Error("signer: OS credential passphrase unavailable");return a}function rt(e){return{vault:L.join(e,"vault.json"),policy:L.join(e,"signer-policy.json"),policyKey:L.join(e,"policy-integrity-key"),triggerAuthorityPublicKey:L.join(e,"trigger-attestation-authority.pub"),ledger:L.join(e,"signer-ledger.json"),token:L.join(e,"signer-token"),lock:L.join(e,"signer.lock")}}function tt(e){try{return N(e)}catch(t){if(t.code!=="ENOENT")throw t}let r=et(32).toString("hex");return J(e,r+`
3
+ `),r}async function Ge({configDir:e,passphraseFile:r,credentialService:t,surfaceTransports:n={},host:o="127.0.0.1",port:a=9462,sessionMs:i=12e4}={}){let{JsonRpcProvider:f,Wallet:d}=await import("ethers");if(!r&&!t)throw new Error("signer: --credential-service or --passphrase-file is required for non-interactive service start");if(i<1e3||i>12e4)throw new Error("signer: session must be at most 120 seconds");let s=rt(e),l=()=>Object.freeze(je(s.policy,s.policyKey)),c=l();for(let u of["surfaces","actions","chains","destinations","spenders","owners"])if(!Array.isArray(c[u])||c[u].length===0)throw new Error(`signer: ${u} allowlist is empty`);if(c.surfaces.some(u=>u==="evm-swap"||u==="evm-bridge")){for(let u of["providers","tokens"])if(!Array.isArray(c[u])||c[u].length===0)throw new Error(`signer: ${u} allowlist is empty`)}if(c.surfaces.some(u=>String(u).startsWith("evm"))&&(!Array.isArray(c.selectors)||c.selectors.length===0))throw new Error("signer: selectors allowlist is empty");if(c.surfaces.includes("sol")&&(!Array.isArray(c.programs)||c.programs.length===0))throw new Error("signer: programs allowlist is empty");if(c.surfaces.some(u=>u==="hl"||u==="poly"))throw new Error("signer: hl/poly are not public signer families");let E=t?Ue(t):N(r),m=$e(Be(s.vault),E),h;try{h=new d(m.toString())}finally{m.fill(0)}let g=new f(c.rpcUrl,Number(c.chains?.[0])),$=h.connect(g),O={sign:u=>$.signTransaction(u),broadcast:async(u,S)=>{let _={native:(await g.getBalance(S.from)).toString()},be=await g.broadcastTransaction(u),Ee=await be.wait(),We={native:(await g.getBalance(S.from)).toString()};return{hash:Ee?.hash??be.hash,status:Ee?.status??null,verifiedBefore:_,verifiedAfter:We}}},z=Ne({evm:O,"evm-swap":O,"evm-bridge":O,...n}),b=Date.now(),w=b+i,ne=()=>Ve.existsSync(s.vault)&&!Ve.existsSync(s.lock)&&Date.now()<w,R=()=>(J(s.lock,`disarmed ${new Date().toISOString()}
4
+ `),!0),T=Le({host:o,port:a,token:tt(s.token),policy:c,readPolicy:l,isArmed:ne,disarm:R,sessionExpiresAtMs:w,nowMs:Date.now,sign:(u,S)=>pe(S,z).sign(u,S),broadcast:(u,S,_)=>pe(_,z).broadcast(u,S,_),confirmArtifact:ot,reserveLedger:(u,S,_)=>Fe({file:s.ledger,keyFile:s.policyKey,tradeId:u.tradeId,value:_?.totalValue??u.artifact?.value??0,notional:_?.action?.amountIn??u.artifact?.value??0,policy:S}),verifyTriggerAttestation:(u,S)=>qe(u,S,s.triggerAuthorityPublicKey),autonomous:process.env.ORACLE_AUTONOMOUS_TRADING==="1",env:process.env}),U=setTimeout(()=>T.close(),i);return U.unref(),T.on("close",()=>{clearTimeout(U),h=null}),T.listen(a,o),T}var y=e=>BigInt(e??0).toString();function nt(e,r,t){if(t)return`
5
+ Confirm exact action
6
+ ${t.decoded.map((o,a)=>{let i=`value=${y(o.value)} gas=${y(o.gas)} fee=${y(o.fee)}`;if(o.kind==="approval")return`leg[${a}] approval token=${o.token} spender=${o.spender} amount=${y(o.amount)} ${i}`;let f=o.action==="bridge"?` destinationChain=${y(o.destinationChainId)} destinationAsset=${o.outputToken}`:"";return`leg[${a}] ${o.action} provider=${o.provider} inputToken=${o.inputToken} outputToken=${o.outputToken} amountIn=${y(o.amountIn)} minOut=${y(o.minimumOut)} recipient=${o.recipient}${f} target=${o.target} ${i}`}).join(`
7
+ `)}
8
+ aggregateGas=${y(t.totalGas)} aggregateValue=${y(t.totalValue)} aggregateFee=${y(t.totalFee)}
9
+ quotedOut=${y(t.authenticatedQuote.quoteAmountOut)} authenticatedMinOut=${y(t.authenticatedQuote.minAmountOut)} slippageBps=${t.authenticatedQuote.selectedBps} quoteExpiresAtMs=${t.authenticatedQuote.expiresAtMs} expiresAtMs=${e.expiresAtMs}
10
+ Type digest ${r}: `;if(H(e?.data))throw new Error("confirmation: generic money-moving calldata requires a strict decoded surface");return`
5
11
  Confirm exact action
6
12
  chain=${e.chainId} owner=${e.from}
7
13
  to=${e.to} selector=${String(e.data||"0x").slice(0,10)} value=${e.value}
8
14
  gas=${e.gasLimit} maxFeePerGas=${e.maxFeePerGas??e.gasPrice}
9
15
  slippageBps=${e.slippageBps} expiresAtMs=${e.expiresAtMs}
10
- Type digest ${t}: `),process.stdin.resume(),new Promise(r=>{let n=i=>{process.stdin.off("data",n),process.stdin.pause(),r(String(i).trim()===t)};process.stdin.once("data",n)})):!1}var Ee=`oracle signer (--credential-service oracle-local-signer | --passphrase-file <0600 file>) [--port 9462] [--session-seconds 120]
11
- Starts a loopback-only, short-lived local signer. No secret may be passed directly or through the environment.`,G=(e,t,r)=>{let n=e.indexOf(t);return n>=0?e[n+1]:r};async function lr(e=[],t={}){if(e.includes("--help"))return(t.out||process.stdout).write(Ee+`
12
- `),0;let r=G(e,"--passphrase-file"),n=await Se({configDir:ur.join(t.configDir||D(),"signer"),passphraseFile:r,credentialService:G(e,"--credential-service"),port:Number(G(e,"--port",9462)),sessionMs:Number(G(e,"--session-seconds",120))*1e3});return(t.out||process.stdout).write(`Oracle signer listening on loopback for a short-lived session.
13
- `),await new Promise(i=>n.on("close",i)),0}var st={name:"signer",summary:"run the short-lived loopback signer",usage:Ee,run:e=>lr(e.argv||[])};export{st as default,lr as run};
16
+ Type digest ${r}: `}async function ot(e,r,t){return process.stdin.isTTY?(process.stderr.write(nt(e,r,t)),process.stdin.resume(),new Promise(n=>{let o=a=>{process.stdin.off("data",o),process.stdin.pause(),n(String(a).trim()===r)};process.stdin.once("data",o)})):!1}var He=`oracle signer (--credential-service oracle-local-signer | --passphrase-file <0600 file>) [--port 9462] [--session-seconds 120]
17
+ Starts a loopback-only, short-lived local signer. No secret may be passed directly or through the environment.`,te=(e,r,t)=>{let n=e.indexOf(r);return n>=0?e[n+1]:t};async function it(e=[],r={}){if(e.includes("--help"))return(r.out||process.stdout).write(He+`
18
+ `),0;let t=te(e,"--passphrase-file"),n=await Ge({configDir:at.join(r.configDir||X(),"signer"),passphraseFile:t,credentialService:te(e,"--credential-service"),port:Number(te(e,"--port",9462)),sessionMs:Number(te(e,"--session-seconds",120))*1e3});return(r.out||process.stdout).write(`Oracle signer listening on loopback for a short-lived session.
19
+ `),await new Promise(o=>n.on("close",o)),0}var Qn={name:"signer",summary:"run the short-lived loopback signer",usage:He,run:e=>it(e.argv||[])};export{Qn as default,it as run};
@@ -1,3 +1,3 @@
1
- var E={robinhood:{chainId:4663,name:"Robinhood Chain",rpcEnv:["RH_CHAIN_RPC"],evm:!0},ethereum:{chainId:1,name:"Ethereum",rpcEnv:["ETH_RPC_URL","ETHEREUM_RPC_URL","MAINNET_RPC_URL"],evm:!0},polygon:{chainId:137,name:"Polygon",rpcEnv:["POLYGON_RPC_URL","POLYGON_RPC"],evm:!0},arbitrum:{chainId:42161,name:"Arbitrum One",rpcEnv:["ARBITRUM_RPC_URL","ARB_RPC_URL"],evm:!0},base:{chainId:8453,name:"Base",rpcEnv:["BASE_RPC_URL"],evm:!0},hyperevm:{chainId:999,name:"HyperEVM",rpcEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],evm:!0},bsc:{chainId:56,name:"BNB Smart Chain",rpcEnv:["BSC_RPC_URL","BNB_RPC_URL"],evm:!0},avalanche:{chainId:43114,name:"Avalanche C-Chain",rpcEnv:["AVALANCHE_RPC_URL","AVAX_RPC_URL"],evm:!0},optimism:{chainId:10,name:"OP Mainnet",rpcEnv:["OPTIMISM_RPC_URL","OP_RPC_URL"],evm:!0},abstract:{chainId:2741,name:"Abstract",rpcEnv:["ABSTRACT_RPC_URL","ABS_RPC_URL"],evm:!0},stable:{chainId:988,name:"Stable Mainnet",rpcEnv:["STABLE_RPC_URL","STABLE_RPC"],evm:!0}},oe=new Map(Object.values(E).map(e=>[e.chainId,e]));import m from"node:fs";import C from"node:path";import{homedir as M}from"node:os";function x(e){let n=e?.transactionHash||e?.hash||e?.txid||null;return n?{happened:!0,hash:String(n),note:null}:{happened:!1,hash:null,note:"no transaction hash \u2014 the action did not succeed"}}import l from"node:path";var U=new Set(["evm","evm-swap","evm-bridge","btc","sol"]),ce=Object.freeze({swap:5,bridge:5,perps:0,nft:0});var ue=Object.freeze([...U]);var ye=Object.freeze({N:1<<17,r:8,p:1}),Se=256*1024*1024,Ee=16*1024;import{homedir as v}from"node:os";import{join as A}from"node:path";var O=process.env.ORACLE_PUBLIC_DESKTOP==="1",D=O?process.env.ORACLE_CONFIG_DIR||A(v(),".config","oracle"):A(v(),".config","oracle"),_e=O?D:A(v(),".config","mad-desk");var ke="0".repeat(64),Le=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"});var Pe=Promise.resolve();function R(e){return{vault:l.join(e,"vault.json"),policy:l.join(e,"signer-policy.json"),policyKey:l.join(e,"policy-integrity-key"),ledger:l.join(e,"signer-ledger.json"),token:l.join(e,"signer-token"),lock:l.join(e,"signer.lock")}}function $(){return process.env.ORACLE_CONFIG_DIR||C.join(M(),".config","oracle")}function h(){let e=R(C.join($(),"signer"));return{vaultExists:m.existsSync(e.vault),policyConfigured:m.existsSync(e.policy),armed:m.existsSync(e.vault)&&!m.existsSync(e.lock),disarmed:m.existsSync(e.lock),note:"Keys stay on this machine. Exact confirmation is required before any broadcast."}}var lr=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_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}}}]);import P from"node:fs";import Z from"node:path";import g from"node:fs";import F from"node:os";import f from"node:path";import{fileURLToPath as H}from"node:url";var q=f.dirname(H(import.meta.url)),gr=f.resolve(q,"../..");function k(){return process.env.ORACLE_FAKE_HOME||F.homedir()}function G(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function w(){return G()?process.env.ORACLE_CONFIG_DIR||f.join(k(),".config","oracle"):f.join(k(),".config","oracle")}function W(){return f.join(w(),"desk.json")}function J(){return f.join(w(),"env")}function p({force:e=!1}={}){if(p._done&&!e)return p._result||null;p._done=!0;let n={},r=(i,t)=>{if(t==null)return;let s=String(t).trim();s&&(process.env[i]!=null&&String(process.env[i]).trim()!==""||(process.env[i]=s,n[i]=s))};try{let i=J();if(g.existsSync(i))for(let t of g.readFileSync(i,"utf8").split(/\r?\n/)){let s=t.match(/^\s*([A-Z0-9_]+)\s*=\s*(.*?)\s*$/);if(!s||s[2].startsWith("#"))continue;let a=s[2];(a.startsWith('"')&&a.endsWith('"')||a.startsWith("'")&&a.endsWith("'"))&&(a=a.slice(1,-1)),r(s[1],a)}}catch{}try{let i=W();if(g.existsSync(i)){let t=JSON.parse(g.readFileSync(i,"utf8"));t&&typeof t=="object"&&(r("ORACLE_DESK_URL",t.deskUrl||t.dataUrl||t.url),r("ORACLE_DATA_URL",t.dataUrl||t.deskUrl||t.url),r("ORACLE_API_URL",t.apiUrl||t.dataUrl||t.deskUrl),r("ORACLE_PUBLIC_URL",t.publicUrl||t.deskUrl||t.dataUrl),r("ORACLE_EXEC_URL",t.execUrl),r("MAD_DESK_URL",t.deskUrl||t.dataUrl))}}catch{}let o=process.env.ORACLE_DESK_URL||process.env.ORACLE_DATA_URL||"";return o&&(r("ORACLE_DESK_URL",o),r("ORACLE_DATA_URL",o),r("ORACLE_API_URL",o),r("ORACLE_PUBLIC_URL",o),r("MAD_DESK_URL",o)),p._result=Object.keys(n).length?n:null,p._result}try{p()}catch{}var z=new Set(["openrouter","openai","anthropic","xai","deepseek","gemini","kimi","mistral","custom","anthropic-oauth","openai-codex","xai-oauth"]);function y(e){return String(e||"").trim()||void 0}function V(e,{required:n=!1}={}){let r=y(e)?.toLowerCase();if(!r){if(n)throw new Error("model provider is required");return}if(!z.has(r))throw new Error(`unsupported provider: ${r}`);return r}function K(e,{required:n=!1}={}){let r=y(e);if(!r){if(n)throw new Error("model is required");return}if(r.includes("..")||r.startsWith("/")||!/^[a-zA-Z0-9._:/-]{1,200}$/.test(r))throw new Error("invalid model id");return r}function Y(e){let n=y(e);if(!n||n.length>2048)throw new Error("invalid custom base URL");let r;try{r=new URL(n)}catch{throw new Error("invalid custom base URL")}let o=r.hostname.toLowerCase().replace(/^\[|\]$/g,""),i=o==="localhost"||o==="127.0.0.1"||o==="::1";if(r.protocol!=="https:"&&!(r.protocol==="http:"&&i)||r.username||r.password||r.search||r.hash)throw new Error("custom base URL must use HTTPS or loopback HTTP without credentials, query, or fragment");return r.toString().replace(/\/+$/,"")}function L({provider:e,model:n,baseUrl:r}={},{requireModel:o=!1}={}){let i=V(e),t=K(n,{required:o});if(i==="custom")return{provider:i,...t?{model:t}:{},baseUrl:Y(r)};if(y(r))throw new Error("baseUrl is only supported for the custom provider");return{...i?{provider:i}:{},...t?{model:t}:{}}}var X=new Set(["auto","standalone","hermes","remote","arch"]);function Q(){return Z.join(w(),"model.json")}function d(e){return String(e||"").trim()||void 0}function ee(e={}){let n=d(e.backend)?.toLowerCase()||"auto",r=L({provider:e.provider,model:e.model,baseUrl:e.baseUrl},{requireModel:n==="standalone"}),o=d(e.apiKeyEnv),i=Number.parseInt(String(e.contextLength||""),10),t=d(e.reasoningEffort),s=d(e.computeHost||e.remoteHost),a=d(e.computeUser||e.remoteUser),c=d(e.computePath||e.remotePath);if(!X.has(n))throw new Error(`unsupported backend: ${n}`);if(process.env.ORACLE_PUBLIC_DESKTOP==="1"&&["remote","arch"].includes(n))throw new Error("remote compute backends are disabled in the public desktop");if(o&&!/^[A-Z][A-Z0-9_]*$/.test(o))throw new Error("api key env must be an uppercase environment variable name");if(n==="remote"&&!s)throw new Error("remote backend requires computeHost");return{backend:n,...r,...o?{apiKeyEnv:o}:{},...Number.isFinite(i)&&i>0?{contextLength:i}:{},...t?{reasoningEffort:t}:{},...s?{computeHost:s}:{},...a?{computeUser:a}:{},...c?{computePath:c}:{}}}function I(){let e=Q();if(!P.existsSync(e))return null;try{return ee(JSON.parse(P.readFileSync(e,"utf8")))}catch{return null}}var re=new Set(["127.0.0.1","::1","localhost"]);function _({env:e=process.env,vault:n=null}={}){let r=n||h(),o=[];for(let[i,t]of Object.entries(E)){let s=(t.rpcEnv||[]).some(c=>String(e[c]||"").trim()),a="prepare";t.evm?s&&(a="live"):a="unavailable",o.push({key:i,chainId:t.chainId,name:t.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 o.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"}),o}function te({env:e=process.env,model:n=I(),vault:r=h(),signerReachable:o=!1,quote:i=null}={}){let t=[],s=(u,S,N,T=null)=>t.push({id:u,status:S,detail:N,fix:T}),a=(()=>{let[u,S]=process.versions.node.split(".").map(Number);return u>20||u===20&&S>=19})();s("node",a?"ok":"fail",`node ${process.versions.node}`,a?null:"install node >= 20.19"),n?n.backend==="hermes"?s("model","warn","backend=hermes (opt-in attach)","oracle model --backend standalone"):s("model","ok",`${n.backend||"auto"} ${n.provider||""} ${n.model||""}`.trim()):s("model","fail","no model.json","oracle setup model"),r.vaultExists?r.disarmed?s("vault","warn","vault present, DISARMED","oracle signer (re-arm after confirm)"):s("vault",r.armed?"ok":"warn",r.armed?"present, armed":"present, not armed"):s("vault","fail","no local vault","oracle sign init");let c=e.ORACLE_SIGNER_HOST||"127.0.0.1";return re.has(c)?s("signer",o?"ok":"warn",o?`loopback ${c}:${e.ORACLE_SIGNER_PORT||9462}`:"loopback signer not reachable",o?null:"oracle signer"):s("signer","fail",`signer host ${c} is not loopback`,"unset ORACLE_SIGNER_HOST"),i?i.ok?s("quote","ok",i.detail||"net quote returned"):s("quote","warn",i.detail||"quote unavailable","check network / oracle data serve"):s("quote","warn","quote not probed",null),{ok:!t.some(u=>u.status==="fail"),checks:t,venues:_({env:e,vault:r})}}async function Ir(e=process.env){let n=e.ORACLE_SIGNER_HOST||"127.0.0.1",r=e.ORACLE_SIGNER_PORT||9462;try{return(await fetch(`http://${n}:${r}/status`,{signal:AbortSignal.timeout(1500)})).ok}catch{return!1}}async function Nr(){try{let e=await fetch("https://api.dexscreener.com/latest/dex/search?q=WETH%20USDC",{signal:AbortSignal.timeout(4e3)});if(!e.ok)return{ok:!1,detail:`dexscreener ${e.status}`};let r=(await e.json())?.pairs?.[0];return!r?.chainId||!r?.priceUsd?{ok:!1,detail:"no pair"}:{ok:!0,detail:`${r.chainId} ${r.baseToken?.symbol}/${r.quoteToken?.symbol} $${r.priceUsd}`}}catch(e){return{ok:!1,detail:e instanceof Error?e.message:"quote failed"}}}var Tr={name:"venues",summary:"label every shipped venue live / prepare / unavailable",group:"read",usage:"oracle venues [--json]",async run(e){let n=e.argv.includes("--json"),r=_();if(n)return process.stdout.write(`${JSON.stringify({venues:r},null,2)}
2
- `),0;for(let o of r)process.stdout.write(`${o.status.padEnd(12)} ${o.key.padEnd(16)} ${o.name} exec=${o.execute?"local":"no"}
3
- `);return 0}};export{x as classifyReceipt,Tr as default,te as firstHourReport,Nr as probeQuote,Ir as probeSigner,h as vaultStatus};
1
+ var E={robinhood:{chainId:4663,name:"Robinhood Chain",rpcEnv:["RH_CHAIN_RPC"],evm:!0},ethereum:{chainId:1,name:"Ethereum",rpcEnv:["ETH_RPC_URL","ETHEREUM_RPC_URL","MAINNET_RPC_URL"],evm:!0},polygon:{chainId:137,name:"Polygon",rpcEnv:["POLYGON_RPC_URL","POLYGON_RPC"],evm:!0},arbitrum:{chainId:42161,name:"Arbitrum One",rpcEnv:["ARBITRUM_RPC_URL","ARB_RPC_URL"],evm:!0},base:{chainId:8453,name:"Base",rpcEnv:["BASE_RPC_URL"],evm:!0},hyperevm:{chainId:999,name:"HyperEVM",rpcEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],evm:!0},bsc:{chainId:56,name:"BNB Smart Chain",rpcEnv:["BSC_RPC_URL","BNB_RPC_URL"],evm:!0},avalanche:{chainId:43114,name:"Avalanche C-Chain",rpcEnv:["AVALANCHE_RPC_URL","AVAX_RPC_URL"],evm:!0},optimism:{chainId:10,name:"OP Mainnet",rpcEnv:["OPTIMISM_RPC_URL","OP_RPC_URL"],evm:!0},abstract:{chainId:2741,name:"Abstract",rpcEnv:["ABSTRACT_RPC_URL","ABS_RPC_URL"],evm:!0},stable:{chainId:988,name:"Stable Mainnet",rpcEnv:["STABLE_RPC_URL","STABLE_RPC"],evm:!0}},le=new Map(Object.values(E).map(e=>[e.chainId,e]));import O from"node:fs";import k from"node:path";import{homedir as J}from"node:os";function S(e){let r=e?.transactionHash||e?.hash||e?.txid||null;return r?{happened:!0,hash:String(r),note:null}:{happened:!1,hash:null,note:"no transaction hash \u2014 the action did not succeed"}}import u from"node:path";import{Interface as q,MaxUint256 as Ke,isAddress as Ye,keccak256 as Xe,toUtf8Bytes as Ze}from"ethers";import{Interface as D,isAddress as Ie}from"ethers";import{isAddress as ye}from"ethers";var Le=new D(["function approve(address spender,uint256 amount) returns (bool)"]);import{Interface as U,isAddress as Be}from"ethers";var Ue=new U(["function approve(address spender,uint256 amount) returns (bool)"]),qe=Object.freeze({42161:"0x1c3fa76e6e1088bce750f23a5bfcffa1efef6a41",43114:"0x8f550e53dfe96c055d5bdb267c21f268fcaf63b2"});var ot=new q(["function approve(address spender,uint256 amount) returns (bool)"]);var F=new Set(["evm","evm-swap","evm-bridge","btc","sol"]),ut=Object.freeze({swap:5,bridge:5,perps:0,nft:0});var H=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"},"0x7b939232":{provider:"across-v3",action:"bridge",layout:"across-deposit-v3"}});var ft=Object.freeze([...F]),dt=Object.freeze({...H});var Ot=Object.freeze({N:1<<17,r:8,p:1}),_t=256*1024*1024,Nt=16*1024;import{homedir as y}from"node:os";import{join as A}from"node:path";var N=process.env.ORACLE_PUBLIC_DESKTOP==="1",V=N?process.env.ORACLE_CONFIG_DIR||A(y(),".config","oracle"):A(y(),".config","oracle"),Tt=N?V:A(y(),".config","mad-desk");var Bt="0".repeat(64),Mt=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"});var jt=Promise.resolve();function I(e){return{vault:u.join(e,"vault.json"),policy:u.join(e,"signer-policy.json"),policyKey:u.join(e,"policy-integrity-key"),triggerAuthorityPublicKey:u.join(e,"trigger-attestation-authority.pub"),ledger:u.join(e,"signer-ledger.json"),token:u.join(e,"signer-token"),lock:u.join(e,"signer.lock")}}function z(){return process.env.ORACLE_CONFIG_DIR||k.join(J(),".config","oracle")}function h(){let e=I(k.join(z(),"signer")),r=O.existsSync(e.vault),t=O.existsSync(e.lock),o=r?t?"disarmed":"armed-owner-confirmed":"inert-no-key";return{vaultExists:r,policyConfigured:O.existsSync(e.policy),armed:r&&!t,disarmed:t,capabilities:{swap:o,bridge:o},autonomous:!1,note:"Keys stay on this machine. Exact confirmation is required before any broadcast."}}var wr=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_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}}}]);import L from"node:fs";import ie from"node:path";import w from"node:fs";import K from"node:os";import l from"node:path";import{fileURLToPath as Y}from"node:url";var X=l.dirname(Y(import.meta.url)),vr=l.resolve(X,"../..");function T(){return process.env.ORACLE_FAKE_HOME||K.homedir()}function Z(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function g(){return Z()?process.env.ORACLE_CONFIG_DIR||l.join(T(),".config","oracle"):l.join(T(),".config","oracle")}function Q(){return l.join(g(),"desk.json")}function ee(){return l.join(g(),"env")}function d({force:e=!1}={}){if(d._done&&!e)return d._result||null;d._done=!0;let r={},t=(i,n)=>{if(n==null)return;let a=String(n).trim();a&&(process.env[i]!=null&&String(process.env[i]).trim()!==""||(process.env[i]=a,r[i]=a))};try{let i=ee();if(w.existsSync(i))for(let n of w.readFileSync(i,"utf8").split(/\r?\n/)){let a=n.match(/^\s*([A-Z0-9_]+)\s*=\s*(.*?)\s*$/);if(!a||a[2].startsWith("#"))continue;let s=a[2];(s.startsWith('"')&&s.endsWith('"')||s.startsWith("'")&&s.endsWith("'"))&&(s=s.slice(1,-1)),t(a[1],s)}}catch{}try{let i=Q();if(w.existsSync(i)){let n=JSON.parse(w.readFileSync(i,"utf8"));n&&typeof n=="object"&&(t("ORACLE_DESK_URL",n.deskUrl||n.dataUrl||n.url),t("ORACLE_DATA_URL",n.dataUrl||n.deskUrl||n.url),t("ORACLE_API_URL",n.apiUrl||n.dataUrl||n.deskUrl),t("ORACLE_PUBLIC_URL",n.publicUrl||n.deskUrl||n.dataUrl),t("ORACLE_EXEC_URL",n.execUrl),t("MAD_DESK_URL",n.deskUrl||n.dataUrl))}}catch{}let o=process.env.ORACLE_DESK_URL||process.env.ORACLE_DATA_URL||"";return o&&(t("ORACLE_DESK_URL",o),t("ORACLE_DATA_URL",o),t("ORACLE_API_URL",o),t("ORACLE_PUBLIC_URL",o),t("MAD_DESK_URL",o)),d._result=Object.keys(r).length?r:null,d._result}try{d()}catch{}var te=new Set(["openrouter","openai","anthropic","xai","deepseek","gemini","kimi","mistral","custom","anthropic-oauth","openai-codex","xai-oauth"]);function b(e){return String(e||"").trim()||void 0}function re(e,{required:r=!1}={}){let t=b(e)?.toLowerCase();if(!t){if(r)throw new Error("model provider is required");return}if(!te.has(t))throw new Error(`unsupported provider: ${t}`);return t}function ne(e,{required:r=!1}={}){let t=b(e);if(!t){if(r)throw new Error("model is required");return}if(t.includes("..")||t.startsWith("/")||!/^[a-zA-Z0-9._:/-]{1,200}$/.test(t))throw new Error("invalid model id");return t}function oe(e){let r=b(e);if(!r||r.length>2048)throw new Error("invalid custom base URL");let t;try{t=new URL(r)}catch{throw new Error("invalid custom base URL")}let o=t.hostname.toLowerCase().replace(/^\[|\]$/g,""),i=o==="localhost"||o==="127.0.0.1"||o==="::1";if(t.protocol!=="https:"&&!(t.protocol==="http:"&&i)||t.username||t.password||t.search||t.hash)throw new Error("custom base URL must use HTTPS or loopback HTTP without credentials, query, or fragment");return t.toString().replace(/\/+$/,"")}function R({provider:e,model:r,baseUrl:t}={},{requireModel:o=!1}={}){let i=re(e),n=ne(r,{required:o});if(i==="custom")return{provider:i,...n?{model:n}:{},baseUrl:oe(t)};if(b(t))throw new Error("baseUrl is only supported for the custom provider");return{...i?{provider:i}:{},...n?{model:n}:{}}}var ae=new Set(["auto","standalone","hermes","remote","arch"]);function se(){return ie.join(g(),"model.json")}function p(e){return String(e||"").trim()||void 0}function ce(e={}){let r=p(e.backend)?.toLowerCase()||"auto",t=R({provider:e.provider,model:e.model,baseUrl:e.baseUrl},{requireModel:r==="standalone"}),o=p(e.apiKeyEnv),i=Number.parseInt(String(e.contextLength||""),10),n=p(e.reasoningEffort),a=p(e.computeHost||e.remoteHost),s=p(e.computeUser||e.remoteUser),c=p(e.computePath||e.remotePath);if(!ae.has(r))throw new Error(`unsupported backend: ${r}`);if(process.env.ORACLE_PUBLIC_DESKTOP==="1"&&["remote","arch"].includes(r))throw new Error("remote compute backends are disabled in the public desktop");if(o&&!/^[A-Z][A-Z0-9_]*$/.test(o))throw new Error("api key env must be an uppercase environment variable name");if(r==="remote"&&!a)throw new Error("remote backend requires computeHost");return{backend:r,...t,...o?{apiKeyEnv:o}:{},...Number.isFinite(i)&&i>0?{contextLength:i}:{},...n?{reasoningEffort:n}:{},...a?{computeHost:a}:{},...s?{computeUser:s}:{},...c?{computePath:c}:{}}}function $(){let e=se();if(!L.existsSync(e))return null;try{return ce(JSON.parse(L.readFileSync(e,"utf8")))}catch{return null}}var ue=new Set(["127.0.0.1","::1","localhost"]);function _({env:e=process.env,vault:r=null}={}){let t=r||h(),o=[];for(let[i,n]of Object.entries(E)){let a=(n.rpcEnv||[]).some(c=>String(e[c]||"").trim()),s="prepare";n.evm?a&&(s="live"):s="unavailable",o.push({key:i,chainId:n.chainId,name:n.name,family:"evm",status:s,execute:!!(t.vaultExists&&t.armed&&!t.disarmed),note:a?"rpc configured":"public read/prepare; set RPC for live reads"})}return o.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"}),o}function fe({env:e=process.env,model:r=$(),vault:t=h(),signerReachable:o=!1,quote:i=null}={}){let n=[],a=(f,x,P,B=null)=>n.push({id:f,status:x,detail:P,fix:B}),s=(()=>{let[f,x]=process.versions.node.split(".").map(Number);return f>20||f===20&&x>=19})();a("node",s?"ok":"fail",`node ${process.versions.node}`,s?null:"install node >= 20.19"),r?r.backend==="hermes"?a("model","warn","backend=hermes (opt-in attach)","oracle model --backend standalone"):a("model","ok",`${r.backend||"auto"} ${r.provider||""} ${r.model||""}`.trim()):a("model","fail","no model.json","oracle setup model"),t.vaultExists?t.disarmed?a("vault","warn","vault present, DISARMED","oracle signer (re-arm after confirm)"):a("vault",t.armed?"ok":"warn",t.armed?"present, armed":"present, not armed"):a("vault","fail","no local vault","oracle sign init");let c=e.ORACLE_SIGNER_HOST||"127.0.0.1";return ue.has(c)?a("signer",o?"ok":"warn",o?`loopback ${c}:${e.ORACLE_SIGNER_PORT||9462}`:"loopback signer not reachable",o?null:"oracle signer"):a("signer","fail",`signer host ${c} is not loopback`,"unset ORACLE_SIGNER_HOST"),i?i.ok?a("quote","ok",i.detail||"net quote returned"):a("quote","warn",i.detail||"quote unavailable","check network / oracle data serve"):a("quote","warn","quote not probed",null),{ok:!n.some(f=>f.status==="fail"),checks:n,venues:_({env:e,vault:t})}}async function jr(e=process.env){let r=e.ORACLE_SIGNER_HOST||"127.0.0.1",t=e.ORACLE_SIGNER_PORT||9462;try{return(await fetch(`http://${r}:${t}/status`,{signal:AbortSignal.timeout(1500)})).ok}catch{return!1}}async function Dr(){try{let e=await fetch("https://api.dexscreener.com/latest/dex/search?q=WETH%20USDC",{signal:AbortSignal.timeout(4e3)});if(!e.ok)return{ok:!1,detail:`dexscreener ${e.status}`};let t=(await e.json())?.pairs?.[0];return!t?.chainId||!t?.priceUsd?{ok:!1,detail:"no pair"}:{ok:!0,detail:`${t.chainId} ${t.baseToken?.symbol}/${t.quoteToken?.symbol} $${t.priceUsd}`}}catch(e){return{ok:!1,detail:e instanceof Error?e.message:"quote failed"}}}var Ur={name:"venues",summary:"label every shipped venue live / prepare / unavailable",group:"read",usage:"oracle venues [--json]",async run(e){let r=e.argv.includes("--json"),t=_();if(r)return process.stdout.write(`${JSON.stringify({venues:t},null,2)}
2
+ `),0;for(let o of t)process.stdout.write(`${o.status.padEnd(12)} ${o.key.padEnd(16)} ${o.name} exec=${o.execute?"local":"no"}
3
+ `);return 0}};export{S as classifyReceipt,Ur as default,fe as firstHourReport,Dr as probeQuote,jr as probeSigner,h as vaultStatus};