@oracle-agent/oracle 0.25.4 → 0.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/assets/skills/oracle-desk-product/SKILL.md +1 -1
- package/dist/bin/desk-server.mjs +35 -79
- package/dist/bin/oracle-data-mcp.mjs +13 -57
- package/dist/bin/oracle-public-server.mjs +4 -48
- package/dist/bin/oracle-route.mjs +22 -66
- package/dist/bin/oracle-scan.mjs +15 -59
- package/dist/cli/commands/chat.mjs +100 -135
- package/dist/cli/commands/doctor.mjs +4 -4
- package/dist/cli/commands/eval.mjs +147 -190
- package/dist/cli/commands/farm.mjs +34 -78
- package/dist/cli/commands/follow.mjs +17 -61
- package/dist/cli/commands/model.mjs +106 -141
- package/dist/cli/commands/receipt.mjs +3 -3
- package/dist/cli/commands/resolve.mjs +13 -57
- package/dist/cli/commands/sign.mjs +14 -14
- package/dist/cli/commands/signer.mjs +14 -14
- package/dist/cli/commands/strategy.mjs +5 -49
- package/dist/cli/commands/swap.mjs +27 -71
- package/dist/cli/commands/venues.mjs +3 -3
- package/dist/data/desk-data.mjs +33 -77
- package/dist/data/names.mjs +2 -46
- package/dist/data/providers/farming.mjs +2 -46
- package/dist/index.mjs +37 -81
- package/dist/local-signer/anvil-attestation-worker.mjs +2 -0
- package/dist/local-signer/index.mjs +3 -3
- package/dist/local-signer/runtime.mjs +13 -0
- package/dist/nft/universal-mint-router.mjs +3 -47
- package/dist/router/index.mjs +2 -46
- package/dist/router/prepare-bridge.mjs +2 -46
- package/dist/scanner/index.mjs +4 -48
- package/dist/strategy/index.mjs +3 -47
- package/package.json +2 -1
- package/public/oracle-splash/_variants/ice.html +1 -1
- package/public/oracle-splash/_variants/ivory.html +1 -1
- package/public/oracle-splash/index.html +1 -1
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
var x={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}},Ce=new Map(Object.values(x).map(e=>[e.chainId,e]));import T from"node:fs";import M from"node:path";import{homedir as pe}from"node:os";function b(e){let t=e?.transactionHash||e?.hash||e?.txid||null;return t?{happened:!0,hash:String(t),note:null}:{happened:!1,hash:null,note:"no transaction hash \u2014 the action did not succeed"}}import c from"node:path";import de from"node:os";import{createHash as fe,randomBytes as jo}from"node:crypto";import{Transaction as Ho}from"@scure/btc-signer";import{ed25519 as Go}from"@noble/curves/ed25519.js";import{base58 as En}from"@scure/base";import{Interface as te}from"ethers";import{Interface as V,MaxUint256 as mr,isAddress as hr,keccak256 as wr,toUtf8Bytes as gr}from"ethers";import{Interface as G,isAddress as Ke}from"ethers";import{isAddress as We}from"ethers";var Qe=new G(["function approve(address spender,uint256 amount) returns (bool)"]);import{Interface as z,isAddress as tr}from"ethers";var sr=new z(["function approve(address spender,uint256 amount) returns (bool)"]),ar=Object.freeze({42161:"0x1c3fa76e6e1088bce750f23a5bfcffa1efef6a41",43114:"0x8f550e53dfe96c055d5bdb267c21f268fcaf63b2"});var Ar=new V(["function approve(address spender,uint256 amount) returns (bool)"]);var Ir=300*1e3,Tr=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})();import{Address as _r,NETWORK as Cr,OutScript as Pr,RawTx as Br,SigHash as Rr,TEST_NETWORK as $r,Transaction as Mr}from"@scure/btc-signer";import{createHash as Y}from"node:crypto";import{base58 as Dr}from"@scure/base";import{getCompiledTransactionMessageDecoder as Wr}from"@solana/transaction-messages";var L=e=>Y("sha256").update(`global:${e}`).digest().subarray(0,8).toString("hex"),Hr=new Map([[L("route"),{name:"route",prefixBytes:0}],[L("shared_accounts_route"),{name:"shared_accounts_route",prefixBytes:1}]]);var at=Object.freeze({"perp-order":"order","hip3-order":"order","hip4-order":"order","perp-bracket":"order","perp-cancel":"cancel","perp-leverage":"leverage","perp-isolated-margin":"margin","builder-fee-approval":"approveBuilder","hype-stake-deposit":"stake","hype-stake-withdraw":"unstake","hype-delegate":"delegate","hype-undelegate":"delegate"}),ct=Object.freeze({"perp-order":"order","hip3-order":"order","hip4-order":"order","perp-bracket":"order","perp-cancel":"cancel","perp-leverage":"updateLeverage","perp-isolated-margin":"updateIsolatedMargin","builder-fee-approval":"approveBuilderFee","hype-stake-deposit":"cDeposit","hype-stake-withdraw":"cWithdraw","hype-delegate":"tokenDelegate","hype-undelegate":"tokenDelegate"});var dt="0x"+"00".repeat(32);var X=Object.freeze([["salt","uint256"],["maker","address"],["signer","address"],["tokenId","uint256"],["makerAmount","uint256"],["takerAmount","uint256"],["side","uint8"],["signatureType","uint8"],["timestamp","uint256"],["metadata","bytes32"],["builder","bytes32"]]),wt=Object.freeze(X.map(e=>e[0]));var ne=new Set(["evm","evm-swap","evm-bridge","evm-nft","btc","sol","hl","poly","lighter"]);var Rt=Object.freeze({swap:5,bridge:5,perps:0,nft:0,mint:0,transfer:0,approve:0,order:0,cancel:0,leverage:0,margin:0,approveBuilder:0,stake:0,unstake:0,delegate: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"},"0xc04b8d59":{provider:"uniswap-v3",action:"swap",layout:"exact-input-deadline"},"0xb858183f":{provider:"uniswap-v3",action:"swap",layout:"exact-input"},"0x5ae401dc":{provider:"uniswap-v3",action:"swap",layout:"multicall-deadline"},"0xa026383e":{provider:"aerodrome",action:"swap",layout:"aerodrome-exact-input-single"},"0x7b939232":{provider:"across-v3",action:"bridge",layout:"across-deposit-v3"}}),$t=Object.freeze({"0x161ac21f":{provider:"opensea-nft",action:"mint",layout:"seadrop-mint-public"},"0xc2f6663a":{provider:"opensea-nft",action:"mint",layout:"seadrop-mint-allowlist"}}),Mt=new te(["function mintAllowList(address nftContract,address feeRecipient,address minterIfNotPayer,uint256 quantity,(uint80 mintPrice,uint48 maxTotalMintableByWallet,uint48 startTime,uint48 endTime,uint48 dropStageIndex,uint32 maxTokenSupplyForStage,uint16 feeBps,bool restrictFeeRecipients) mintParams,bytes32[] proof) payable"]),Ft=Object.freeze({"0xa0712d68":{provider:"nft-mint",action:"mint",layout:"mint-quantity"},"0x1249c58b":{provider:"nft-mint",action:"mint",layout:"mint-no-args"},"0x2db11544":{provider:"nft-mint",action:"mint",layout:"mint-quantity"},"0xefef39a1":{provider:"nft-mint",action:"mint",layout:"mint-quantity"},"0xa6f2ae3a":{provider:"nft-mint",action:"mint",layout:"mint-no-args"}});var ie=Object.freeze([...ne]),qt=Object.freeze({...oe});import{ed25519 as rn}from"@noble/curves/ed25519.js";import{base58 as nn}from"@scure/base";import{RawTx as sn,SigHash as an,Transaction as cn}from"@scure/btc-signer";import{Transaction as ln,keccak256 as dn,verifyTypedData as fn}from"ethers";import{encode as jt}from"@msgpack/msgpack";import{keccak256 as Ht,verifyTypedData as Jt}from"ethers";var Gt=Object.freeze({name:"Exchange",version:"1",chainId:1337,verifyingContract:"0x0000000000000000000000000000000000000000"}),zt=Object.freeze({Agent:[{name:"source",type:"string"},{name:"connectionId",type:"bytes32"}]});var _n=Object.freeze({N:1<<17,r:8,p:1}),Cn=256*1024*1024,Pn=16*1024;import{homedir as v}from"node:os";import{join as I}from"node:path";var B=process.env.ORACLE_PUBLIC_DESKTOP==="1",ue=B?process.env.ORACLE_CONFIG_DIR||I(v(),".config","oracle"):I(v(),".config","oracle"),Mn=B?ue:I(v(),".config","mad-desk");var jn="0".repeat(64),Wn=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 Hn=Promise.resolve();import{Wallet as Qn}from"ethers";import{base58 as ro}from"@scure/base";import{ed25519 as no}from"@noble/curves/ed25519.js";import{NETWORK as io,TEST_NETWORK as so,WIF as ao,p2wpkh as co}from"@scure/btc-signer";import{pubECDSA as lo}from"@scure/btc-signer/utils.js";function $(e){let t=process.env.ORACLE_SIGNER_STATE_DIR||c.join(process.env.XDG_STATE_HOME||c.join(de.homedir(),".local","state"),"oracle"),r=fe("sha256").update(c.resolve(e)).digest("hex").slice(0,16);return{vault:c.join(e,"vault.json"),policy:c.join(e,"signer-policy.json"),policyKey:c.join(e,"policy-integrity-key"),policyAnchor:c.join(t,`signer-policy-${r}.high-water`),ledger:c.join(e,"signer-ledger.json"),ledgerAnchor:c.join(t,`signer-ledger-${r}.high-water`),token:c.join(e,"signer-token"),lock:c.join(t,`signer-${r}.lock`)}}function me(){return process.env.ORACLE_CONFIG_DIR||M.join(pe(),".config","oracle")}function h(){let e=$(M.join(me(),"signer")),t=T.existsSync(e.vault),r=T.existsSync(e.lock),o=t?r?"disarmed":"armed-owner-confirmed":"inert-no-key";return{vaultExists:t,policyConfigured:T.existsSync(e.policy),armed:t&&!r,disarmed:r,capabilities:{swap:o,bridge:o},autonomous:!1,note:"Keys stay on this machine. Exact confirmation is required before any broadcast."}}var Si=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 U from"node:fs";import Ie from"node:path";import w from"node:fs";import he from"node:os";import f from"node:path";import{fileURLToPath as we}from"node:url";var ge=f.dirname(we(import.meta.url)),Oi=f.resolve(ge,"../..");function F(){return process.env.ORACLE_FAKE_HOME||he.homedir()}function ye(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function g(){return ye()?process.env.ORACLE_CONFIG_DIR||f.join(F(),".config","oracle"):f.join(F(),".config","oracle")}function Ee(){return f.join(g(),"desk.json")}function xe(){return f.join(g(),"env")}function d({force:e=!1}={}){if(d._done&&!e)return d._result||null;d._done=!0;let t={},r=(i,n)=>{if(n==null)return;let s=String(n).trim();s&&(process.env[i]!=null&&String(process.env[i]).trim()!==""||(process.env[i]=s,t[i]=s))};try{let i=xe();if(w.existsSync(i))for(let n of w.readFileSync(i,"utf8").split(/\r?\n/)){let s=n.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=Ee();if(w.existsSync(i)){let n=JSON.parse(w.readFileSync(i,"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 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)),d._result=Object.keys(t).length?t:null,d._result}try{d()}catch{}var be=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 Se(e,{required:t=!1}={}){let r=y(e)?.toLowerCase();if(!r){if(t)throw new Error("model provider is required");return}if(!be.has(r))throw new Error(`unsupported provider: ${r}`);return r}function Ae(e,{required:t=!1}={}){let r=y(e);if(!r){if(t)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 ve(e){let t=y(e);if(!t||t.length>2048)throw new Error("invalid custom base URL");let r;try{r=new URL(t)}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 q({provider:e,model:t,baseUrl:r}={},{requireModel:o=!1}={}){let i=Se(e),n=Ae(t,{required:o});if(i==="custom")return{provider:i,...n?{model:n}:{},baseUrl:ve(r)};if(y(r))throw new Error("baseUrl is only supported for the custom provider");return{...i?{provider:i}:{},...n?{model:n}:{}}}var Te=new Set(["auto","standalone","hermes","remote","arch"]);function ke(){return Ie.join(g(),"model.json")}function p(e){return String(e||"").trim()||void 0}function Oe(e={}){let t=p(e.backend)?.toLowerCase()||"auto",r=q({provider:e.provider,model:e.model,baseUrl:e.baseUrl},{requireModel:t==="standalone"}),o=p(e.apiKeyEnv),i=Number.parseInt(String(e.contextLength||""),10),n=p(e.reasoningEffort),s=p(e.computeHost||e.remoteHost),a=p(e.computeUser||e.remoteUser),u=p(e.computePath||e.remotePath);if(!Te.has(t))throw new Error(`unsupported backend: ${t}`);if(process.env.ORACLE_PUBLIC_DESKTOP==="1"&&["remote","arch"].includes(t))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(t==="remote"&&!s)throw new Error("remote backend requires computeHost");return{backend:t,...r,...o?{apiKeyEnv:o}:{},...Number.isFinite(i)&&i>0?{contextLength:i}:{},...n?{reasoningEffort:n}:{},...s?{computeHost:s}:{},...a?{computeUser:a}:{},...u?{computePath:u}:{}}}function D(){let e=ke();if(!U.existsSync(e))return null;try{return Oe(JSON.parse(U.readFileSync(e,"utf8")))}catch{return null}}var Le=new Set(["127.0.0.1","::1","localhost"]);function k({env:e=process.env,vault:t=null}={}){let r=t||h(),o=[];for(let[i,n]of Object.entries(x)){let s=(n.rpcEnv||[]).some(u=>String(e[u]||"").trim()),a="prepare";n.evm?s&&(a="live"):a="unavailable",o.push({key:i,chainId:n.chainId,name:n.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 Ne({env:e=process.env,model:t=D(),vault:r=h(),signerReachable:o=!1,quote:i=null}={}){let n=[],s=(l,E,j,W=null)=>n.push({id:l,status:E,detail:j,fix:W}),a=(()=>{let[l,E]=process.versions.node.split(".").map(Number);return l>20||l===20&&E>=19})();s("node",a?"ok":"fail",`node ${process.versions.node}`,a?null:"install node >= 20.19"),t?t.backend==="hermes"?s("model","warn","backend=hermes (opt-in attach)","oracle model --backend standalone"):s("model","ok",`${t.backend||"auto"} ${t.provider||""} ${t.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 u=e.ORACLE_SIGNER_HOST||"127.0.0.1";return Le.has(u)?s("signer",o?"ok":"warn",o?`loopback ${u}:${e.ORACLE_SIGNER_PORT||9462}`:"loopback signer not reachable",o?null:"oracle signer"):s("signer","fail",`signer host ${u} 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:!n.some(l=>l.status==="fail"),checks:n,venues:k({env:e,vault:r})}}async function Hi(e=process.env){let t=e.ORACLE_SIGNER_HOST||"127.0.0.1",r=e.ORACLE_SIGNER_PORT||9462;try{return(await fetch(`http://${t}:${r}/status`,{signal:AbortSignal.timeout(1500)})).ok}catch{return!1}}async function Ji(){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 Gi={name:"venues",summary:"label every shipped venue live / prepare / unavailable",group:"read",usage:"oracle venues [--json]",async run(e){let t=e.argv.includes("--json"),r=k();if(t)return process.stdout.write(`${JSON.stringify({venues:r},null,2)}
|
|
2
|
-
`),0;for(let o of
|
|
3
|
-
`);return 0}};export{
|
|
1
|
+
var b={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}},Pe=new Map(Object.values(b).map(e=>[e.chainId,e]));import T from"node:fs";import D from"node:path";import{homedir as me}from"node:os";function x(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 c from"node:path";import fe from"node:os";import{createHash as pe,randomBytes as Go}from"node:crypto";import{Interface as k,keccak256 as Ko}from"ethers";import{Transaction as Xo}from"@scure/btc-signer";import{ed25519 as Zo}from"@noble/curves/ed25519.js";import{base58 as vn}from"@scure/base";import{Interface as B}from"ethers";import{Interface as X,MaxUint256 as ht,isAddress as wt,keccak256 as gt,toUtf8Bytes as yt}from"ethers";import{Interface as K,isAddress as Ye}from"ethers";import{isAddress as He}from"ethers";var et=new K(["function approve(address spender,uint256 amount) returns (bool)"]);import{Interface as Y,isAddress as nt}from"ethers";var st=new Y(["function approve(address spender,uint256 amount) returns (bool)"]),ct=Object.freeze({42161:"0x1c3fa76e6e1088bce750f23a5bfcffa1efef6a41",43114:"0x8f550e53dfe96c055d5bdb267c21f268fcaf63b2"});var vt=new X(["function approve(address spender,uint256 amount) returns (bool)"]);var kt=300*1e3,Tt=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})();import{Address as Rt,NETWORK as Pt,OutScript as _t,RawTx as Bt,SigHash as $t,TEST_NETWORK as Ft,Transaction as Mt}from"@scure/btc-signer";import{createHash as Z}from"node:crypto";import{base58 as jt}from"@scure/base";import{getCompiledTransactionMessageDecoder as Ht}from"@solana/transaction-messages";var C=e=>Z("sha256").update(`global:${e}`).digest().subarray(0,8).toString("hex"),Jt=new Map([[C("route"),{name:"route",prefixBytes:0}],[C("shared_accounts_route"),{name:"shared_accounts_route",prefixBytes:1}]]);var Zt=64*1024;var dr=Object.freeze({"perp-order":"order","hip3-order":"order","hip4-order":"order","perp-bracket":"order","perp-cancel":"cancel","perp-leverage":"leverage","perp-isolated-margin":"margin","builder-fee-approval":"approveBuilder","hype-stake-deposit":"stake","hype-stake-withdraw":"unstake","hype-delegate":"delegate","hype-undelegate":"delegate"}),fr=Object.freeze({"perp-order":"order","hip3-order":"order","hip4-order":"order","perp-bracket":"order","perp-cancel":"cancel","perp-leverage":"updateLeverage","perp-isolated-margin":"updateIsolatedMargin","builder-fee-approval":"approveBuilderFee","hype-stake-deposit":"cDeposit","hype-stake-withdraw":"cWithdraw","hype-delegate":"tokenDelegate","hype-undelegate":"tokenDelegate"});var hr="0x"+"00".repeat(32);var ee=Object.freeze([["salt","uint256"],["maker","address"],["signer","address"],["tokenId","uint256"],["makerAmount","uint256"],["takerAmount","uint256"],["side","uint8"],["signatureType","uint8"],["timestamp","uint256"],["metadata","bytes32"],["builder","bytes32"]]),br=Object.freeze(ee.map(e=>e[0]));var ie=new Set(["evm","evm-swap","evm-bridge","evm-nft","btc","sol","hl","poly","lighter"]);var qr=Object.freeze({swap:5,bridge:5,perps:0,nft:0,mint:0,transfer:0,approve:0,order:0,cancel:0,leverage:0,margin:0,approveBuilder:0,stake:0,unstake:0,delegate:0});var ae=Object.freeze({"0x04e45aaf":{provider:"uniswap-v3",action:"swap",layout:"router02-exact-input-single"},"0x414bf389":{provider:"uniswap-v3",action:"swap",layout:"swap-router-exact-input-single"},"0xc04b8d59":{provider:"uniswap-v3",action:"swap",layout:"exact-input-deadline"},"0xb858183f":{provider:"uniswap-v3",action:"swap",layout:"exact-input"},"0x5ae401dc":{provider:"uniswap-v3",action:"swap",layout:"multicall-deadline"},"0xa026383e":{provider:"aerodrome",action:"swap",layout:"aerodrome-exact-input-single"},"0x7b939232":{provider:"across-v3",action:"bridge",layout:"across-deposit-v3"}}),Dr=Object.freeze({"0x161ac21f":{provider:"opensea-nft",action:"mint",layout:"seadrop-mint-public"},"0xc2f6663a":{provider:"opensea-nft",action:"mint",layout:"seadrop-mint-allowlist"}}),Ur=new B(["function buySpecificNFT(uint256 tokenId,uint256 maxCost) payable","function sellNFT(uint256 tokenId,uint256 minPayout) payable"]),jr=new B(["function mintAllowList(address nftContract,address feeRecipient,address minterIfNotPayer,uint256 quantity,(uint80 mintPrice,uint48 maxTotalMintableByWallet,uint48 startTime,uint48 endTime,uint48 dropStageIndex,uint32 maxTokenSupplyForStage,uint16 feeBps,bool restrictFeeRecipients) mintParams,bytes32[] proof) payable"]),Wr=Object.freeze({"0xa0712d68":{provider:"nft-mint",action:"mint",layout:"mint-quantity"},"0x1249c58b":{provider:"nft-mint",action:"mint",layout:"mint-no-args"},"0x2db11544":{provider:"nft-mint",action:"mint",layout:"mint-quantity"},"0xefef39a1":{provider:"nft-mint",action:"mint",layout:"mint-quantity"},"0xa6f2ae3a":{provider:"nft-mint",action:"mint",layout:"mint-no-args"}});var se=Object.freeze([...ie]),Hr=Object.freeze({...ae});import{ed25519 as sn}from"@noble/curves/ed25519.js";import{base58 as un}from"@scure/base";import{RawTx as dn,SigHash as fn,Transaction as pn}from"@scure/btc-signer";import{Transaction as hn,keccak256 as wn,verifyTypedData as gn}from"ethers";import{encode as Gr}from"@msgpack/msgpack";import{keccak256 as Kr,verifyTypedData as Yr}from"ethers";var Xr=Object.freeze({name:"Exchange",version:"1",chainId:1337,verifyingContract:"0x0000000000000000000000000000000000000000"}),Qr=Object.freeze({Agent:[{name:"source",type:"string"},{name:"connectionId",type:"bytes32"}]});var $n=Object.freeze({N:1<<17,r:8,p:1}),Fn=256*1024*1024,Mn=16*1024;import{homedir as v}from"node:os";import{join as I}from"node:path";var F=process.env.ORACLE_PUBLIC_DESKTOP==="1",le=F?process.env.ORACLE_CONFIG_DIR||I(v(),".config","oracle"):I(v(),".config","oracle"),jn=F?le:I(v(),".config","mad-desk");var Gn="0".repeat(64),Vn=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 Kn=Promise.resolve();import{Wallet as oo}from"ethers";import{base58 as ao}from"@scure/base";import{ed25519 as co}from"@noble/curves/ed25519.js";import{NETWORK as lo,TEST_NETWORK as fo,WIF as po,p2wpkh as mo}from"@scure/btc-signer";import{pubECDSA as wo}from"@scure/btc-signer/utils.js";var bi=new k(["function collection() view returns (address)","function token() view returns (address)","function robinhoodSwapFeeWei() view returns (uint256)","function quoteSpecificBuy(uint256 tokenId) view returns (uint256 totalCost,uint256 baseCost,uint256 fee,uint256 protocolFee,bool available)","function quoteSellNFT() view returns (uint256 netPayout,uint256 grossPayout,uint256 fee,uint256 protocolFee)","function inventory(uint256 tokenId) view returns (bool)","function buySpecificNFT(uint256 tokenId,uint256 maxCost) payable","function sellNFT(uint256 tokenId,uint256 minPayout) payable"]),xi=new k(["function decimals() view returns (uint8)","function allowance(address owner,address spender) view returns (uint256)"]),Si=new k(["function ownerOf(uint256 tokenId) view returns (address)","function getApproved(uint256 tokenId) view returns (address)","function isApprovedForAll(address owner,address operator) view returns (bool)"]);function q(e){let r=process.env.ORACLE_SIGNER_STATE_DIR||c.join(process.env.XDG_STATE_HOME||c.join(fe.homedir(),".local","state"),"oracle"),t=pe("sha256").update(c.resolve(e)).digest("hex").slice(0,16);return{vault:c.join(e,"vault.json"),policy:c.join(e,"signer-policy.json"),policyKey:c.join(e,"policy-integrity-key"),policyAnchor:c.join(r,`signer-policy-${t}.high-water`),ledger:c.join(e,"signer-ledger.json"),ledgerAnchor:c.join(r,`signer-ledger-${t}.high-water`),token:c.join(e,"signer-token"),lock:c.join(r,`signer-${t}.lock`)}}function he(){return process.env.ORACLE_CONFIG_DIR||D.join(me(),".config","oracle")}function h(){let e=q(D.join(he(),"signer")),r=T.existsSync(e.vault),t=T.existsSync(e.lock),o=r?t?"disarmed":"armed-owner-confirmed":"inert-no-key";return{vaultExists:r,policyConfigured:T.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 Pi=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 W from"node:fs";import ke from"node:path";import w from"node:fs";import we from"node:os";import f from"node:path";import{fileURLToPath as ge}from"node:url";var ye=f.dirname(ge(import.meta.url)),qi=f.resolve(ye,"../..");function U(){return process.env.ORACLE_FAKE_HOME||we.homedir()}function Ee(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function g(){return Ee()?process.env.ORACLE_CONFIG_DIR||f.join(U(),".config","oracle"):f.join(U(),".config","oracle")}function be(){return f.join(g(),"desk.json")}function xe(){return f.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=xe();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=be();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 Se=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 Ae(e,{required:r=!1}={}){let t=y(e)?.toLowerCase();if(!t){if(r)throw new Error("model provider is required");return}if(!Se.has(t))throw new Error(`unsupported provider: ${t}`);return t}function ve(e,{required:r=!1}={}){let t=y(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 Ie(e){let r=y(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 j({provider:e,model:r,baseUrl:t}={},{requireModel:o=!1}={}){let i=Ae(e),n=ve(r,{required:o});if(i==="custom")return{provider:i,...n?{model:n}:{},baseUrl:Ie(t)};if(y(t))throw new Error("baseUrl is only supported for the custom provider");return{...i?{provider:i}:{},...n?{model:n}:{}}}var Te=new Set(["auto","standalone","hermes","remote","arch"]);function Oe(){return ke.join(g(),"model.json")}function p(e){return String(e||"").trim()||void 0}function Ne(e={}){let r=p(e.backend)?.toLowerCase()||"auto",t=j({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),u=p(e.computePath||e.remotePath);if(!Te.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}:{},...u?{computePath:u}:{}}}function H(){let e=Oe();if(!W.existsSync(e))return null;try{return Ne(JSON.parse(W.readFileSync(e,"utf8")))}catch{return null}}var Ce=new Set(["127.0.0.1","::1","localhost"]);function O({env:e=process.env,vault:r=null}={}){let t=r||h(),o=[];for(let[i,n]of Object.entries(b)){let a=(n.rpcEnv||[]).some(u=>String(e[u]||"").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 Le({env:e=process.env,model:r=H(),vault:t=h(),signerReachable:o=!1,quote:i=null}={}){let n=[],a=(l,E,J,z=null)=>n.push({id:l,status:E,detail:J,fix:z}),s=(()=>{let[l,E]=process.versions.node.split(".").map(Number);return l>20||l===20&&E>=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 u=e.ORACLE_SIGNER_HOST||"127.0.0.1";return Ce.has(u)?a("signer",o?"ok":"warn",o?`loopback ${u}:${e.ORACLE_SIGNER_PORT||9462}`:"loopback signer not reachable",o?null:"oracle signer"):a("signer","fail",`signer host ${u} 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(l=>l.status==="fail"),checks:n,venues:O({env:e,vault:t})}}async function ta(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 ra(){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 na={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=O();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{x as classifyReceipt,na as default,Le as firstHourReport,ra as probeQuote,ta as probeSigner,h as vaultStatus};
|