@oracle-agent/oracle 0.28.29 → 0.29.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.
Files changed (38) hide show
  1. package/README.md +1 -1
  2. package/dist/assets/skills/oracle-action-semantics/SKILL.md +1 -1
  3. package/dist/assets/skills/oracle-desk-product/SKILL.md +1 -1
  4. package/dist/bin/desk-server.mjs +28 -28
  5. package/dist/bin/oracle-data-mcp.mjs +15 -21
  6. package/dist/bin/oracle-gateway.mjs +39 -39
  7. package/dist/bin/oracle-mev-arb-shadow.mjs +5 -5
  8. package/dist/bin/oracle-mev-shadow.mjs +5 -5
  9. package/dist/bin/oracle-public-server.mjs +4 -4
  10. package/dist/bin/oracle-route.mjs +10 -10
  11. package/dist/bin/oracle-scan.mjs +10 -10
  12. package/dist/cli/commands/chat.mjs +161 -161
  13. package/dist/cli/commands/doctor.mjs +3 -3
  14. package/dist/cli/commands/eval.mjs +138 -139
  15. package/dist/cli/commands/farm.mjs +22 -22
  16. package/dist/cli/commands/follow.mjs +14 -14
  17. package/dist/cli/commands/model.mjs +165 -165
  18. package/dist/cli/commands/receipt.mjs +3 -3
  19. package/dist/cli/commands/resolve.mjs +6 -6
  20. package/dist/cli/commands/sign.mjs +14 -14
  21. package/dist/cli/commands/signer.mjs +13 -13
  22. package/dist/cli/commands/snipe.mjs +8 -8
  23. package/dist/cli/commands/strategy.mjs +3 -3
  24. package/dist/cli/commands/swap.mjs +17 -17
  25. package/dist/cli/commands/venues.mjs +3 -3
  26. package/dist/data/desk-data.mjs +21 -21
  27. package/dist/data/names.mjs +2 -2
  28. package/dist/data/providers/farming.mjs +2 -2
  29. package/dist/index.mjs +32 -32
  30. package/dist/local-signer/anvil-attestation-worker.mjs +1 -1
  31. package/dist/local-signer/index.mjs +3 -3
  32. package/dist/local-signer/runtime.mjs +10 -10
  33. package/dist/nft/universal-mint-router.mjs +3 -3
  34. package/dist/router/index.mjs +2 -2
  35. package/dist/router/prepare-bridge.mjs +2 -2
  36. package/dist/scanner/index.mjs +3 -3
  37. package/dist/strategy/index.mjs +3 -3
  38. package/package.json +1 -1
@@ -1,5 +1,5 @@
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}},ne=new Map(Object.values(x).map(t=>[t.chainId,t]));function l(t){let o=t?.transactionHash||t?.hash||t?.txid||null;return o?{happened:!0,hash:String(o),note:null}:{happened:!1,hash:null,note:"no transaction hash \u2014 the action did not succeed"}}import{Interface as E,keccak256 as yo}from"ethers";import{Transaction as bo}from"@scure/btc-signer";import{ed25519 as So}from"@noble/curves/ed25519.js";import{base58 as zr}from"@scure/base";import{Interface as T}from"ethers";import{Interface as $,MaxUint256 as Me,isAddress as De,keccak256 as Ue,toUtf8Bytes as je}from"ethers";import{Interface as _,isAddress as be}from"ethers";import{isAddress as me}from"ethers";var ve=new _(["function approve(address spender,uint256 amount) returns (bool)"]);import{Interface as B,isAddress as Te}from"ethers";var Ce=new B(["function approve(address spender,uint256 amount) returns (bool)"]),Re=Object.freeze({42161:"0x1c3fa76e6e1088bce750f23a5bfcffa1efef6a41",43114:"0x8f550e53dfe96c055d5bdb267c21f268fcaf63b2"});var Ve=new $(["function approve(address spender,uint256 amount) returns (bool)"]);var Ye=300*1e3,Xe=(()=>{let t=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(t)&&t>0?t:1800*1e3})();import{Address as rt,NETWORK as nt,OutScript as ot,RawTx as it,SigHash as at,TEST_NETWORK as st,Transaction as ct}from"@scure/btc-signer";import{createHash as q}from"node:crypto";import{base58 as ft}from"@scure/base";import{getCompiledTransactionMessageDecoder as mt}from"@solana/transaction-messages";var S=t=>q("sha256").update(`global:${t}`).digest().subarray(0,8).toString("hex"),ht=new Map([[S("route"),{name:"route",prefixBytes:0}],[S("shared_accounts_route"),{name:"shared_accounts_route",prefixBytes:1}]]);var At=64*1024;var Bt=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"}),$t=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 Mt="0x"+"00".repeat(32);var M=Object.freeze([["salt","uint256"],["maker","address"],["signer","address"],["tokenId","uint256"],["makerAmount","uint256"],["takerAmount","uint256"],["side","uint8"],["signatureType","uint8"],["timestamp","uint256"],["metadata","bytes32"],["builder","bytes32"]]),Ht=Object.freeze(M.map(t=>t[0]));var H=new Set(["evm","evm-swap","evm-bridge","evm-nft","btc","sol","hl","poly","lighter"]);var cr=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 J=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"}}),ur=Object.freeze({"0x161ac21f":{provider:"opensea-nft",action:"mint",layout:"seadrop-mint-public"},"0xc2f6663a":{provider:"opensea-nft",action:"mint",layout:"seadrop-mint-allowlist"}}),lr=new T(["function buySpecificNFT(uint256 tokenId,uint256 maxCost) payable","function sellNFT(uint256 tokenId,uint256 minPayout) payable"]),dr=new T(["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"]),fr=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 z=Object.freeze([...H]),pr=Object.freeze({...J});import{ed25519 as Or}from"@noble/curves/ed25519.js";import{base58 as Cr}from"@scure/base";import{RawTx as Pr,SigHash as _r,Transaction as Br}from"@scure/btc-signer";import{Transaction as Fr,keccak256 as qr,verifyTypedData as Mr}from"ethers";import{encode as wr}from"@msgpack/msgpack";import{keccak256 as yr,verifyTypedData as Er}from"ethers";var br=Object.freeze({name:"Exchange",version:"1",chainId:1337,verifyingContract:"0x0000000000000000000000000000000000000000"}),xr=Object.freeze({Agent:[{name:"source",type:"string"},{name:"connectionId",type:"bytes32"}]});var on=Object.freeze({N:1<<17,r:8,p:1}),an=256*1024*1024,sn=16*1024;var un=Object.freeze({1:{name:"ethereum",mode:"mempool-private",endpoints:["https://rpc.flashbots.net/fast","https://rpc.mevblocker.io"]},8453:{name:"base",mode:"sequencer",endpoints:["https://mainnet-sequencer.base.org"]},10:{name:"optimism",mode:"sequencer",endpoints:["https://mainnet-sequencer.optimism.io"]},42161:{name:"arbitrum",mode:"sequencer",endpoints:["https://arb1-sequencer.arbitrum.io/rpc"]},56:{name:"bsc",mode:"mempool-private",endpoints:["https://rpc.48.club","https://bsc.rpc.blxrbdn.com"]},137:{name:"polygon",mode:"mempool-private",endpoints:["https://polygon-bor-rpc.publicnode.com"]},43114:{name:"avalanche",mode:"public-only",endpoints:[]},999:{name:"hyperevm",mode:"public-only",endpoints:[]}});import{homedir as g}from"node:os";import{join as y}from"node:path";var O=process.env.ORACLE_PUBLIC_DESKTOP==="1",K=O?process.env.ORACLE_CONFIG_DIR||y(g(),".config","oracle"):y(g(),".config","oracle"),pn=O?K:y(g(),".config","mad-desk");var yn="0".repeat(64),En=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 bn=Promise.resolve();import{Wallet as Ln}from"ethers";import{base58 as Rn}from"@scure/base";import{ed25519 as _n}from"@noble/curves/ed25519.js";import{NETWORK as $n,TEST_NETWORK as Fn,WIF as qn,p2wpkh as Mn}from"@scure/btc-signer";import{pubECDSA as Un}from"@scure/btc-signer/utils.js";var Ho=new E(["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"]),Jo=new E(["function decimals() view returns (uint8)","function allowance(address owner,address spender) view returns (uint256)"]),zo=new E(["function ownerOf(uint256 tokenId) view returns (address)","function getApproved(uint256 tokenId) view returns (address)","function isApprovedForAll(address owner,address operator) view returns (bool)"]);var ti=Object.freeze([{type:"function",function:{name:"vault_status",description:"Read local Oracle vault/signer readiness. Never returns key material.",parameters:{type:"object",properties:{},additionalProperties:!1}}},{type:"function",function:{name:"signer_status",description:"Ping the loopback signer. Fails closed if it is not running.",parameters:{type:"object",properties:{},additionalProperties:!1}}},{type:"function",function:{name:"signer_pending",description:"List pending local-signer artifacts. Read-only. Does not approve, sign, or broadcast.",parameters:{type:"object",properties:{},additionalProperties:!1}}},{type:"function",function:{name:"signer_queue",description:"Queue a prepared unsigned artifact on the loopback signer. Does not broadcast.",parameters:{type:"object",properties:{artifact:{type:"object"}},required:["artifact"],additionalProperties:!1}}},{type:"function",function:{name:"signer_ack",description:"Execute one pending artifact through the armed local signer (same path as Telegram Allow). Fails if the signer is not running or disarmed. Never holds keys.",parameters:{type:"object",properties:{id:{type:"string"},digest:{type:"string"}},additionalProperties:!1}}},{type:"function",function:{name:"signer_deny",description:"Drop one pending local-signer artifact. Nothing signed.",parameters:{type:"object",properties:{id:{type:"string"},digest:{type:"string"}},additionalProperties:!1}}},{type:"function",function:{name:"signer_execute",description:"Broadcast one already-confirmed local artifact. Requires a one-use confirmationNonce from the local signer TTY confirm. Cannot mint confirmation itself.",parameters:{type:"object",properties:{artifact:{type:"object"},confirmationNonce:{type:"string",minLength:32,maxLength:128}},required:["artifact","confirmationNonce"],additionalProperties:!1}}},{type:"function",function:{name:"signer_disarm",description:"Global kill switch. Stops the local signer from broadcasting.",parameters:{type:"object",properties:{},additionalProperties:!1}}},{type:"function",function:{name:"receipt_report",description:"Receipt or it did not happen. Requires transactionHash/hash/txid.",parameters:{type:"object",properties:{receipt:{type:"object"},transactionHash:{type:"string"},hash:{type:"string"},txid:{type:"string"}},additionalProperties:!1}}},{type:"function",function:{name:"watch_create",description:"Create an alert-only watch. Never execute.",parameters:{type:"object",properties:{chain:{type:"string"},token:{type:"string"},condition:{type:"string"},note:{type:"string"}},required:["chain","token","condition"],additionalProperties:!1}}},{type:"function",function:{name:"watch_list",description:"List local alert-only watches.",parameters:{type:"object",properties:{},additionalProperties:!1}}},{type:"function",function:{name:"portfolio_snapshot",description:"How to read the one portfolio snapshot. knownUsd is incomplete if a provider is missing.",parameters:{type:"object",properties:{},additionalProperties:!1}}}]);import f from"node:fs";import X from"node:os";import u from"node:path";import{fileURLToPath as Q}from"node:url";var Z=u.dirname(Q(import.meta.url)),si=u.resolve(Z,"../..");function C(){return process.env.ORACLE_FAKE_HOME||X.homedir()}function ee(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function b(){return ee()?process.env.ORACLE_CONFIG_DIR||u.join(C(),".config","oracle"):u.join(C(),".config","oracle")}function te(){return u.join(b(),"desk.json")}function re(){return u.join(b(),"env")}function c({force:t=!1}={}){if(c._done&&!t)return c._result||null;c._done=!0;let o={},r=(n,e)=>{if(e==null)return;let i=String(e).trim();i&&(process.env[n]!=null&&String(process.env[n]).trim()!==""||(process.env[n]=i,o[n]=i))};try{let n=re();if(f.existsSync(n))for(let e of f.readFileSync(n,"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 n=te();if(f.existsSync(n)){let e=JSON.parse(f.readFileSync(n,"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(o).length?o:null,c._result}try{c()}catch{}var Ai={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(t){let o=t.argv||[],r={},a=o.indexOf("--hash"),n=o.indexOf("--json");if(a>=0)r={transactionHash:o[a+1]};else if(n>=0)try{r=JSON.parse(o[n+1]||"{}")}catch(i){return process.stderr.write(`receipt: bad json: ${i.message}
2
- `),1}let e=l(r);return o.includes("--quiet")?process.stdout.write(`${JSON.stringify(e)}
1
+ var _=(r,n,t)=>()=>{if(t)throw t[0];try{return r&&(n=r(r=0)),n}catch(i){throw t=[i],i}};import f from"node:fs";import ae from"node:os";import u from"node:path";import{fileURLToPath as se}from"node:url";function L(){return process.env.ORACLE_FAKE_HOME||ae.homedir()}function ue(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function b(){return ue()?process.env.ORACLE_CONFIG_DIR||u.join(L(),".config","oracle"):u.join(L(),".config","oracle")}function le(){return u.join(b(),"desk.json")}function de(){return u.join(b(),"env")}function c({force:r=!1}={}){if(c._done&&!r)return c._result||null;c._done=!0;let n={},t=(o,e)=>{if(e==null)return;let a=String(e).trim();a&&(process.env[o]!=null&&String(process.env[o]).trim()!==""||(process.env[o]=a,n[o]=a))};try{let o=de();if(f.existsSync(o))for(let e of f.readFileSync(o,"utf8").split(/\r?\n/)){let a=e.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 o=le();if(f.existsSync(o)){let e=JSON.parse(f.readFileSync(o,"utf8"));e&&typeof e=="object"&&(t("ORACLE_DESK_URL",e.deskUrl||e.dataUrl||e.url),t("ORACLE_DATA_URL",e.dataUrl||e.deskUrl||e.url),t("ORACLE_API_URL",e.apiUrl||e.dataUrl||e.deskUrl),t("ORACLE_PUBLIC_URL",e.publicUrl||e.deskUrl||e.dataUrl),t("ORACLE_EXEC_URL",e.execUrl),t("MAD_DESK_URL",e.deskUrl||e.dataUrl))}}catch{}let i=process.env.ORACLE_DESK_URL||process.env.ORACLE_DATA_URL||"";return i&&(t("ORACLE_DESK_URL",i),t("ORACLE_DATA_URL",i),t("ORACLE_API_URL",i),t("ORACLE_PUBLIC_URL",i),t("MAD_DESK_URL",i)),c._result=Object.keys(n).length?n:null,c._result}var ce,Xi,R=_(()=>{ce=u.dirname(se(import.meta.url)),Xi=u.resolve(ce,"../..");try{c()}catch{}});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}},pe=new Map(Object.values(x).map(r=>[r.chainId,r]));function l(r){let n=r?.transactionHash||r?.hash||r?.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 E,keccak256 as si}from"ethers";import{Transaction as ui}from"@scure/btc-signer";import{ed25519 as di}from"@noble/curves/ed25519.js";import{base58 as $n}from"@scure/base";import{Interface as T}from"ethers";import{Interface as M,MaxUint256 as Ke,isAddress as Ye,keccak256 as Xe,toUtf8Bytes as Qe}from"ethers";import{Interface as $,isAddress as Ce}from"ethers";import{isAddress as ve}from"ethers";var Pe=new $(["function approve(address spender,uint256 amount) returns (bool)"]);import{Interface as F,isAddress as Fe}from"ethers";var Ue=new F(["function approve(address spender,uint256 amount) returns (bool)"]),je=Object.freeze({42161:"0x1c3fa76e6e1088bce750f23a5bfcffa1efef6a41",43114:"0x8f550e53dfe96c055d5bdb267c21f268fcaf63b2"});var or=new M(["function approve(address spender,uint256 amount) returns (bool)"]);var ar=300*1e3,sr=(()=>{let r=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(r)&&r>0?r:1800*1e3})();import{Address as fr,NETWORK as pr,OutScript as mr,RawTx as wr,SigHash as hr,TEST_NETWORK as gr,Transaction as yr}from"@scure/btc-signer";import{createHash as D}from"node:crypto";import{base58 as Sr}from"@scure/base";import{getCompiledTransactionMessageDecoder as vr}from"@solana/transaction-messages";var S=r=>D("sha256").update(`global:${r}`).digest().subarray(0,8).toString("hex"),kr=new Map([[S("route"),{name:"route",prefixBytes:0}],[S("shared_accounts_route"),{name:"shared_accounts_route",prefixBytes:1}]]);var _r=64*1024;var Hr=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"}),Jr=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 Vr="0x"+"00".repeat(32);var j=Object.freeze([["salt","uint256"],["maker","address"],["signer","address"],["tokenId","uint256"],["makerAmount","uint256"],["takerAmount","uint256"],["side","uint8"],["signatureType","uint8"],["timestamp","uint256"],["metadata","bytes32"],["builder","bytes32"]]),Zr=Object.freeze(j.map(r=>r[0]));import{TypedDataEncoder as Ct,getAddress as Lt}from"ethers";import{TypedDataEncoder as ot,getAddress as it,isAddress as at}from"ethers";var H=Object.freeze({1:"0x111111125421cA6dc452d289314280a0f8842A65",8453:"0x111111125421cA6dc452d289314280a0f8842A65",42161:"0x111111125421cA6dc452d289314280a0f8842A65",10:"0x111111125421cA6dc452d289314280a0f8842A65",137:"0x111111125421cA6dc452d289314280a0f8842A65",56:"0x111111125421cA6dc452d289314280a0f8842A65"}),J=Object.freeze({Order:[{name:"salt",type:"uint256"},{name:"maker",type:"address"},{name:"receiver",type:"address"},{name:"makerAsset",type:"address"},{name:"takerAsset",type:"address"},{name:"makingAmount",type:"uint256"},{name:"takingAmount",type:"uint256"},{name:"makerTraits",type:"uint256"}]});import{TypedDataEncoder as gt,getAddress as yt,isAddress as Et}from"ethers";var ut=Object.freeze({READ:"read",PREPARE:"prepare",EXECUTE:"execute",AUTONOMOUS:"autonomous"});var z=Object.freeze({1:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",100:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",42161:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",8453:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41"}),It=Object.freeze({1:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",100:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",42161:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",8453:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110"});var G=Object.freeze({Order:[{name:"sellToken",type:"address"},{name:"buyToken",type:"address"},{name:"receiver",type:"address"},{name:"sellAmount",type:"uint256"},{name:"buyAmount",type:"uint256"},{name:"validTo",type:"uint32"},{name:"appData",type:"bytes32"},{name:"feeAmount",type:"uint256"},{name:"kind",type:"string"},{name:"partiallyFillable",type:"bool"},{name:"sellTokenBalance",type:"string"},{name:"buyTokenBalance",type:"string"}]}),Tt=Object.freeze({OrderCancellations:[{name:"orderUids",type:"bytes[]"}]});var Pt=Object.freeze(["https://limit-orders.1inch.io","https://api.1inch.dev/orderbook"]);var Z=new Set(["evm","evm-swap","evm-bridge","evm-nft","evm-order","btc","sol","hl","poly","lighter"]);var Xt=Object.freeze({swap:5,bridge:5,perps:0,nft:0,mint:0,transfer:0,approve:0,delegate:0,identity:0,order:0,cancel:0,leverage:0,margin:0,approveBuilder:0,stake:0,unstake:0});var ee=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"}}),Qt=Object.freeze({"0x161ac21f":{provider:"opensea-nft",action:"mint",layout:"seadrop-mint-public"},"0xc2f6663a":{provider:"opensea-nft",action:"mint",layout:"seadrop-mint-allowlist"}}),Zt=new T(["function buySpecificNFT(uint256 tokenId,uint256 maxCost) payable","function sellNFT(uint256 tokenId,uint256 minPayout) payable"]),en=new T(["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"]),rn=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 re=Object.freeze([...Z]),tn=Object.freeze({...ee});import{ed25519 as En}from"@noble/curves/ed25519.js";import{base58 as xn}from"@scure/base";import{RawTx as An,SigHash as vn,Transaction as kn}from"@scure/btc-signer";import{Transaction as Tn,keccak256 as On,verifyTypedData as Nn}from"ethers";import{encode as an}from"@msgpack/msgpack";import{keccak256 as cn,verifyTypedData as un}from"ethers";var ln=Object.freeze({name:"Exchange",version:"1",chainId:1337,verifyingContract:"0x0000000000000000000000000000000000000000"}),dn=Object.freeze({Agent:[{name:"source",type:"string"},{name:"connectionId",type:"bytes32"}]});var Vn=Object.freeze({N:1<<17,r:8,p:1}),Kn=256*1024*1024,Yn=16*1024;var Qn=Object.freeze({1:{name:"ethereum",mode:"mempool-private",endpoints:["https://rpc.flashbots.net/fast","https://rpc.mevblocker.io"]},8453:{name:"base",mode:"sequencer",endpoints:["https://mainnet-sequencer.base.org"]},10:{name:"optimism",mode:"sequencer",endpoints:["https://mainnet-sequencer.optimism.io"]},42161:{name:"arbitrum",mode:"sequencer",endpoints:["https://arb1-sequencer.arbitrum.io/rpc"]},56:{name:"bsc",mode:"mempool-private",endpoints:["https://rpc.48.club","https://bsc.rpc.blxrbdn.com"]},137:{name:"polygon",mode:"mempool-private",endpoints:["https://polygon-bor-rpc.publicnode.com"]},43114:{name:"avalanche",mode:"public-only",endpoints:[]},999:{name:"hyperevm",mode:"public-only",endpoints:[]}});import{homedir as g}from"node:os";import{join as y}from"node:path";var N=process.env.ORACLE_PUBLIC_DESKTOP==="1",oe=N?process.env.ORACLE_CONFIG_DIR||y(g(),".config","oracle"):y(g(),".config","oracle"),to=N?oe:y(g(),".config","mad-desk");var so="0".repeat(64),co=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 uo=Promise.resolve();import{Wallet as bo}from"ethers";import{base58 as So}from"@scure/base";import{ed25519 as vo}from"@noble/curves/ed25519.js";import{NETWORK as Io,TEST_NETWORK as To,WIF as Oo,p2wpkh as No}from"@scure/btc-signer";import{pubECDSA as Lo}from"@scure/btc-signer/utils.js";var Pi=new E(["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"]),Bi=new E(["function decimals() view returns (uint8)","function allowance(address owner,address spender) view returns (uint256)"]),$i=new E(["function ownerOf(uint256 tokenId) view returns (address)","function getApproved(uint256 tokenId) view returns (address)","function isApprovedForAll(address owner,address operator) view returns (bool)"]);var Ji=Object.freeze([{type:"function",function:{name:"vault_status",description:"Read local Oracle vault/signer readiness. Never returns key material.",parameters:{type:"object",properties:{},additionalProperties:!1}}},{type:"function",function:{name:"signer_status",description:"Ping the loopback signer. Fails closed if it is not running.",parameters:{type:"object",properties:{},additionalProperties:!1}}},{type:"function",function:{name:"signer_pending",description:"List pending local-signer artifacts. Read-only. Does not approve, sign, or broadcast.",parameters:{type:"object",properties:{},additionalProperties:!1}}},{type:"function",function:{name:"signer_queue",description:"Queue a prepared unsigned artifact on the loopback signer. Does not broadcast.",parameters:{type:"object",properties:{artifact:{type:"object"}},required:["artifact"],additionalProperties:!1}}},{type:"function",function:{name:"signer_ack",description:"Execute one pending artifact through the armed local signer (same path as Telegram Allow). Fails if the signer is not running or disarmed. Never holds keys.",parameters:{type:"object",properties:{id:{type:"string"},digest:{type:"string"}},additionalProperties:!1}}},{type:"function",function:{name:"signer_deny",description:"Drop one pending local-signer artifact. Nothing signed.",parameters:{type:"object",properties:{id:{type:"string"},digest:{type:"string"}},additionalProperties:!1}}},{type:"function",function:{name:"signer_execute",description:"Broadcast one already-confirmed local artifact. Requires a one-use confirmationNonce from the local signer TTY confirm. Cannot mint confirmation itself.",parameters:{type:"object",properties:{artifact:{type:"object"},confirmationNonce:{type:"string",minLength:32,maxLength:128}},required:["artifact","confirmationNonce"],additionalProperties:!1}}},{type:"function",function:{name:"signer_disarm",description:"Global kill switch. Stops the local signer from broadcasting.",parameters:{type:"object",properties:{},additionalProperties:!1}}},{type:"function",function:{name:"receipt_report",description:"Receipt or it did not happen. Requires transactionHash/hash/txid.",parameters:{type:"object",properties:{receipt:{type:"object"},transactionHash:{type:"string"},hash:{type:"string"},txid:{type:"string"}},additionalProperties:!1}}},{type:"function",function:{name:"watch_create",description:"Create an alert-only watch. Never execute.",parameters:{type:"object",properties:{chain:{type:"string"},token:{type:"string"},condition:{type:"string"},note:{type:"string"}},required:["chain","token","condition"],additionalProperties:!1}}},{type:"function",function:{name:"watch_list",description:"List local alert-only watches.",parameters:{type:"object",properties:{},additionalProperties:!1}}},{type:"function",function:{name:"portfolio_snapshot",description:"How to read the one portfolio snapshot. knownUsd is incomplete if a provider is missing.",parameters:{type:"object",properties:{},additionalProperties:!1}}}]);R();var pa={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(r){let n=r.argv||[],t={},i=n.indexOf("--hash"),o=n.indexOf("--json");if(i>=0)t={transactionHash:n[i+1]};else if(o>=0)try{t=JSON.parse(n[o+1]||"{}")}catch(a){return process.stderr.write(`receipt: bad json: ${a.message}
2
+ `),1}let e=l(t);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{Ai as default};
5
+ `),e.happened?0:2}};export{pa as default};
@@ -1,5 +1,5 @@
1
- import{keccak_256 as V}from"@noble/hashes/sha3.js";import{createHash as Se}from"node:crypto";import v from"node:net";import be from"node:dns";var ge=new Set(["localhost","metadata.google.internal","metadata.goog"]);function N(t){let e=String(t).toLowerCase().split("%")[0];if((e.match(/::/g)||[]).length>1)return null;let r=d=>{if(!d)return[];let s=d.split(":"),a=s.at(-1);if(a?.includes(".")){let l=a.split(".").map(Number);if(l.length!==4||l.some(f=>!Number.isInteger(f)||f<0||f>255))return null;s.splice(s.length-1,1,(l[0]<<8|l[1]).toString(16),(l[2]<<8|l[3]).toString(16))}return s.some(l=>!/^[0-9a-f]{1,4}$/.test(l))?null:s.map(l=>Number.parseInt(l,16))},[n,o]=e.split("::"),c=r(n),i=r(o);if(!c||!i)return null;let u=e.includes("::"),h=8-c.length-i.length;if(!u&&h!==0||u&&h<1)return null;let w=[...c,...Array(Math.max(0,h)).fill(0),...i];return w.length!==8?null:Uint8Array.from(w.flatMap(d=>[d>>8,d&255]))}function B(t,e,r){let n=Math.floor(r/8),o=r%8;for(let i=0;i<n;i+=1)if(t[i]!==e[i])return!1;if(!o)return!0;let c=255<<8-o;return(t[n]&c)===(e[n]&c)}function M(t){if(v.isIPv4(t)){let e=t.split(".").map(Number);return!(e[0]===0||e[0]===10||e[0]===127||e[0]>=224||e[0]===100&&e[1]>=64&&e[1]<=127||e[0]===169&&e[1]===254||e[0]===172&&e[1]>=16&&e[1]<=31||e[0]===192&&(e[1]===0||e[1]===2||e[1]===168)||e[0]===192&&e[1]===88&&e[2]===99||e[0]===198&&(e[1]===18||e[1]===19||e[1]===51)||e[0]===203&&e[1]===0&&e[2]===113)}if(v.isIPv6(t)){let e=N(t);if(!e)return!1;let r=N("::ffff:0:0");return B(e,r,96)?M([...e.slice(12)].join(".")):B(e,N("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([o,c])=>B(e,N(o),c)):!1}return!1}function Ee(t){let e;try{e=new URL(String(t))}catch{return{ok:!1,error:`not a valid URL: ${String(t).slice(0,120)}`}}if(e.protocol!=="http:"&&e.protocol!=="https:")return{ok:!1,error:`refused protocol ${e.protocol} (only http/https)`};let r=e.hostname.toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,"");if(ge.has(r)||r.endsWith(".localhost")||r.endsWith(".internal"))return{ok:!1,error:`refused internal host ${r}`};let n=v.isIP(r);return n!==0&&!M(r)?{ok:!1,error:`refused private address ${r}`}:{ok:!0,url:e,host:r,isLiteralIp:n!==0}}async function U(t,{lookupFn:e=be.promises.lookup}={}){let r=Ee(t);if(!r.ok)return r;if(r.isLiteralIp)return{ok:!0,url:r.url,addresses:[{address:r.host,family:v.isIPv6(r.host)?6:4}]};let n;try{n=await e(r.host,{all:!0,verbatim:!0})}catch{return{ok:!1,error:`refused: ${r.host} did not resolve`}}return!Array.isArray(n)||n.length===0||n.some(o=>!M(o.address))?{ok:!1,error:`refused: ${r.host} resolves to a non-public address`}:{ok:!0,url:r.url,addresses:n}}async function O({requireUndici:t=!1,importUndici:e=()=>import("undici")}={}){let r,n;try{let s=await e();r=s.Agent,n=s.fetch}catch(s){if(t)throw new Error(`egress-guard: untrustedUrl pinning requires the undici package, which failed to load: ${s?.message||s}`);return null}if(typeof r!="function"||typeof n!="function"){if(t)throw new Error("egress-guard: untrustedUrl pinning requires undici's Agent and fetch exports, which were not found on the imported module");return null}let o=s=>String(s).toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,""),c=new Map,i=s=>(Array.isArray(s)?s:[s]).map(a=>typeof a=="string"?{address:a}:a).filter(a=>a&&a.address).map(a=>({address:a.address,family:a.family||(v.isIPv6(a.address)?6:4)})),u=(s,a,l)=>{c.set(o(s),i(typeof a=="string"?[{address:a,family:l}]:a))},h=s=>{let a=o(s);if(v.isIP(a))return[{address:a,family:v.isIPv6(a)?6:4}];let l=c.get(a);if(!l||!l.length)throw new Error(`refused: unpinned host ${s} during pinned fetch`);return l},w=new r({connect:{lookup(s,a,l){let f;try{f=h(s)}catch(R){return l(R)}return a?.all?l(null,f):l(null,f[0].address,f[0].family)}}}),d=Re((s,a={})=>n(s,{...a,dispatcher:w}),u);return{dispatcher:w,fetch:d,pin:u,resolve:h,async close(){try{await w.destroy()}catch{}}}}var F=Symbol.for("oracle.egressGuard.pinCapableFetch");function Re(t,e){if(typeof t!="function")throw new Error("markPinCapableFetch: fetchImpl must be a function");if(typeof e!="function")throw new Error("markPinCapableFetch: pin must be a function");return t[F]=Object.freeze({pin:e}),t}function D(t){return typeof t=="function"&&typeof t[F]?.pin=="function"}function W(t,e,r){if(!D(t))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");t[F].pin(e,r)}var xe=new Set([408,425,429,500,502,503,504]),K=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),Ae=2,X=4e3,te=["authorization","x-api-key","x-tensor-api-key","0x-api-key","api-key","cookie","proxy-authorization"],ve=new Set([301,302,303,307,308]),Z=3,Te=64*1024;function _e(t){let e=String(t||"").toLowerCase();return te.includes(e)||/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(e)}function Ie(t){let e={};for(let[r,n]of Object.entries(t||{}))_e(r)||(e[r]=n);return e}function Ce(t,e){if(!t)throw new Error(`HTTP redirect from ${e} missing Location`);let r=new URL(String(t),String(e));if(r.protocol!=="http:"&&r.protocol!=="https:")throw new Error(`HTTP redirect from ${e} used unsupported protocol ${r.protocol}`);return r.toString()}function ke(t,e){return new URL(String(t)).origin===new URL(String(e)).origin}var j=new Map;function Pe(t,e,r,n={}){let o={};for(let[d,s]of Object.entries(r||{}))o[d.toLowerCase()]=s;let c=Object.keys(o).filter(d=>/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(d)),u=[...new Set([...te,...c])].sort().map(d=>`${d}=${o[d]??""}`).join(`
2
- `),h=Se("sha256").update(u).digest("hex").slice(0,32),w=`${n.untrustedUrl?"untrusted":"trusted"}:${n.maxResponseBytes??"unbounded"}`;return`${t} ${e} ${w} ${h}`}function $e(t,e){let r=Number(e);return Number.isFinite(r)&&r>0?Math.min(r*1e3,X):Math.min(250*2**t,X)+Math.floor(Math.random()*100)}var Ne=t=>new Promise(e=>setTimeout(e,t));function k(t,e={}){let r=new Error(t);return r.retryable=!1,Object.assign(r,e),r}function z(t,e,r){return k(`HTTP response from ${t} exceeded maxResponseBytes ${r} (${e})`,{oversize:!0})}function P(t){try{let e=t?.body?.cancel?.();e&&typeof e.then=="function"&&e.catch(()=>{})}catch{}}function Le(t){return t?t.byteLength??t.length??0:0}async function Q(t,e,{url:r,truncate:n=!1,onOversize:o}={}){if(e==null)return await t.text();let c=Number(t.headers?.get?.("content-length"));if(Number.isFinite(c)&&c>e&&(P(t),!n))throw z(r,`content-length ${c}`,e);let i=t.body?.getReader?.();if(!i){let s=await t.text(),a=Buffer.byteLength(s,"utf8");if(a>e){if(!n)throw z(r,`body ${a} bytes`,e);return Buffer.from(s,"utf8").subarray(0,e).toString("utf8")}return s}let u=[],h=0,w=!1;try{for(;;){let{value:s,done:a}=await i.read();if(a)break;if(s&&(u.push(Buffer.from(s)),h+=Le(s),h>e)){w=!0;break}}}finally{if(w)try{await i.cancel()}catch{}try{i.releaseLock?.()}catch{}}if(w&&(typeof o=="function"&&o(),!n))throw z(r,`streamed ${h} bytes`,e);let d=Buffer.concat(u);return(w?d.subarray(0,e):d).toString("utf8")}function ee(t){if(!t)return null;try{return JSON.parse(t)}catch{return null}}async function He(t,{fetchImpl:e,method:r,headers:n,body:o,timeoutMs:c,lookupFn:i,realFetch:u,untrustedUrl:h=!1,maxResponseBytes:w=null,importUndici:d,validateResponse:s}){let a=new AbortController,l=setTimeout(()=>a.abort(),c),f=null,R=e,H=i?{lookupFn:i}:{};if(h&&!u&&!D(R))throw k(`HTTP refused ${t}: untrustedUrl requires a pin-capable fetchImpl (see markPinCapableFetch in egress-guard.mjs) or no fetchImpl override so Oracle can pin the connection itself`);let I=async(m,{status:b=null}={})=>{let g=await U(m,H);if(!g.ok)throw k(b==null?`HTTP refused ${m}: ${g.error}`:`HTTP redirect to ${m} ${g.error}`,b==null?{}:{status:b});let p=new URL(m).hostname;if(u){if(f&&(await f.close(),f=null),!f)try{f=await O({requireUndici:!0,...d?{importUndici:d}:{}})}catch(y){throw k(b==null?`HTTP refused ${m}: ${y?.message||y}`:`HTTP redirect to ${m} refused: ${y?.message||y}`,b==null?{}:{status:b})}f.pin(p,g.addresses),R=f.fetch}else W(R,p,g.addresses);return g};try{let m=String(t),b={...n||{}};h&&await I(m);for(let g=0;g<=Z;g+=1){let p=await R(m,{method:r,headers:b,body:o,signal:a.signal,redirect:"manual"});if(ve.has(p.status)){if(r!=="GET"&&r!=="HEAD"){let S=await Q(p,w??Te,{url:m,truncate:!0}),A=new Error(`HTTP ${p.status} ${r} ${m} redirected non-idempotent request`);throw A.status=p.status,A.body=ee(S)??S.slice(0,300),A}if(g===Z)throw P(p),new Error(`HTTP redirect loop for ${t}`);let E=p.headers?.get?.("location"),x;try{x=Ce(E,m)}catch(S){throw P(p),S}let $=!ke(x,m);if(P(p),$&&(b=Ie(b)),h)await I(x,{status:p.status});else if($){let S=await U(x,H);if(!S.ok){let A=new Error(`HTTP redirect from ${m} ${S.error}`);throw A.status=p.status,A.retryable=!1,A}u&&S.addresses?.length&&(f||(f=await O(d?{importUndici:d}:{})),f&&(f.pin(new URL(x).hostname,S.addresses),R=f.fetch))}m=x;continue}if(typeof s=="function")try{await s(p,{url:m})}catch(E){throw P(p),k(E?.message||String(E))}let y=await Q(p,w,{url:m,onOversize:()=>a.abort()}),C=ee(y);if(!p.ok){let E=new Error(`HTTP ${p.status} ${r} ${m}`);throw E.status=p.status,E.retryAfter=p.headers?.get?.("retry-after")??null,E.body=C??y.slice(0,300),E}return C??y}throw new Error(`HTTP redirect loop for ${t}`)}finally{clearTimeout(l),f&&await f.close()}}async function re(t,e={}){let r=e.fetchImpl||globalThis.fetch;if(typeof r!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let n=e.timeoutMs??12e3,o=(e.method||"GET").toUpperCase(),c={Accept:"application/json",...e.headers||{}},i=e.body;i!=null&&typeof i!="string"&&(c["Content-Type"]=c["Content-Type"]||"application/json",i=JSON.stringify(i));let u=Number.isInteger(e.retries)?Math.max(e.retries,0):Ae,h=e.lookupFn,w=!e.fetchImpl,d=e.untrustedUrl===!0,s=e.importUndici,a=e.validateResponse,l=Number(e.maxResponseBytes),f=Number.isFinite(l)&&l>0?Math.floor(l):null,R=async()=>{let g;for(let p=0;p<=u;p++)try{return await He(t,{fetchImpl:r,method:o,headers:c,body:i,timeoutMs:n,lookupFn:h,realFetch:w,untrustedUrl:d,maxResponseBytes:f,importUndici:s,validateResponse:a})}catch(y){g=y;let C=y?.status,E=y?.name==="AbortError",x=new Set([408,425,429]),$=y?.retryable===!1?!1:C!=null?x.has(C)||xe.has(C)&&K.has(o):!E&&K.has(o);if(p===u||!$)throw y;await Ne($e(p,y?.retryAfter))}throw g};if(!(e.dedupe!==!1&&o==="GET"&&i==null))return R();let I=Pe(o,t,c,{untrustedUrl:d,maxResponseBytes:f}),m=j.get(I);if(m)return m;let b=R().finally(()=>j.delete(I));return j.set(I,b),b}var ne={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}},Be=new Map(Object.values(ne).map(t=>[t.chainId,t]));function oe(t){return Be.get(Number(t))||null}function se(t,e=process.env){let r=oe(t);if(!r)return null;for(let n of r.rpcEnv){let o=(e[n]||"").trim();if(o)return o}return null}import{Interface as Me,getAddress as lt}from"ethers";var ft=new Me(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);var Ue={1:"https://ethereum.publicnode.com",137:"https://polygon-bor-rpc.publicnode.com",42161:"https://arbitrum-one-rpc.publicnode.com",8453:"https://base-rpc.publicnode.com",10:"https://optimism-rpc.publicnode.com",988:"https://rpc.stable.xyz",56:"https://bsc-rpc.publicnode.com",43114:"https://avalanche-c-chain-rpc.publicnode.com",999:"https://rpc.hyperliquid.xyz/evm",2741:"https://api.mainnet.abs.xyz",4663:"https://rpc.mainnet.chain.robinhood.com"};function Oe(t,{rpcUrl:e,env:r=process.env}={}){if(e)return e;let n=se(t,r);return n||Ue[Number(t)]||null}var Fe=/^(?:eth_(?:call|blocknumber|chainid|get[a-z0-9]+|feehistory|gasprice|maxpriorityfeepergas|syncing|protocolversion|estimategas|createaccesslist)|net_(?:version|listening|peercount)|web3_(?:clientversion|sha3))$/;function De(t){let e=String(t||""),r=e.toLowerCase();if(e!==e.trim()||!/^[a-zA-Z0-9_]+$/.test(e)||!Fe.test(r))throw new Error(`evm-rpc: ${e} refused \u2014 @oracle-agent/oracle is prepare-only (read RPC only; no broadcast/sign)`);return r}async function ae(t,e,r=[],n={}){let o=String(e||"");De(o);let c=Oe(t,n);if(!c)throw new Error(`No RPC URL for chainId ${t} (set env from chain registry rpcEnv or pass rpcUrl)`);let u=await re(c,{method:"POST",body:{jsonrpc:"2.0",id:1,method:e,params:r},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3});if(u?.error){let h=new Error(u.error.message||JSON.stringify(u.error));throw h.code=u.error.code,h}return u.result}var Y=999,G=1,je=8453,ce="0x1d9d87eBc14e71490bB87f1C39F65BDB979f3cb7",ze="0x4d5e4ed4D5e4A160Fa136853597cDc2eBBe66494",ie="0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e",Ve="0xC6d566A56A1aFf6508b41f6c90ff131615583BCD",Ge=".80002105.reverse",q=/^0x[a-fA-F0-9]{40}$/,ue=new TextEncoder,le=t=>"0x"+Buffer.from(t).toString("hex"),T=t=>le(V(ue.encode(t))).slice(0,10),fe=t=>t.toLowerCase().replace(/^0x/,"").padStart(64,"0");function L(t){let e=new Uint8Array(32);if(t)for(let r of String(t).split(".").reverse()){let n=V(ue.encode(r)),o=new Uint8Array(64);o.set(e,0),o.set(n,32),e=V(o)}return le(e)}function J(t){if(!t||t==="0x"||/^0x0*$/.test(t))return"";try{let e=t.slice(2),r=parseInt(e.slice(0,64),16)*2,n=parseInt(e.slice(r,r+64),16);if(!Number.isFinite(n)||n<=0)return"";let o=e.slice(r+64,r+64+n*2);return Buffer.from(o,"hex").toString("utf8")}catch{return""}}async function _(t,e,r){try{return await ae(t,"eth_call",[{to:e,data:r},"latest"])}catch{return null}}async function Ye(t){let e=await _(Y,ce,T("primaryName(address)")+fe(t)),r=J(e);return r?r.endsWith(".hl")?r:`${r}.hl`:null}async function qe(t){let e=await _(Y,ze,T("getName(address)")+fe(t)),r=J(e);return r?r.endsWith(".hype")?r:`${r}.hype`:null}async function de(t,e,r){let n=await _(t,r,T("name(bytes32)")+e.slice(2));return J(n)||null}async function Je(t){let e=L(`${t.slice(2).toLowerCase()}.addr.reverse`),r=await _(G,ie,T("resolver(bytes32)")+e.slice(2));if(!r)return null;let n="0x"+r.slice(-40);return/^0x0+$/.test(n)?null:de(G,e,n)}async function We(t){let e=L(t.slice(2).toLowerCase()+Ge);return de(je,e,Ve)}var pe=[{source:"hl",fn:Ye},{source:"hype",fn:qe},{source:"ens",fn:Je},{source:"basename",fn:We}];async function he(t){if(!q.test(String(t||"").trim()))return null;let e=String(t).trim();for(let{source:r,fn:n}of pe){let o=await n(e);if(o)return{name:o,source:r,address:e}}return null}async function Ke(t){let e=L(t),r=await _(Y,ce,T("ownerOf(uint256)")+e.slice(2));if(!r||r.length<66)return null;let n="0x"+r.slice(-40);return/^0x0+$/.test(n)?null:n}async function Xe(t,e,r){let n=L(e),o=await _(t,r,T("resolver(bytes32)")+n.slice(2));if(!o)return null;let c="0x"+o.slice(-40);if(/^0x0+$/.test(c))return null;let i=await _(t,c,T("addr(bytes32)")+n.slice(2));if(!i)return null;let u="0x"+i.slice(-40);return/^0x0+$/.test(u)?null:u}async function me(t){let e=String(t||"").trim().toLowerCase();if(!e||!e.includes("."))return null;if(e.endsWith(".hl")){let r=await Ke(e);return r?{address:r,source:"hl",name:e}:null}if(e.endsWith(".eth")){let r=await Xe(G,e,ie);return r?{address:r,source:e.endsWith(".base.eth")?"basename":"ens",name:e}:null}return null}var we=pe.map(t=>t.source);var ye=`oracle resolve <name-or-address> [--json]
1
+ import{keccak_256 as Y}from"@noble/hashes/sha3.js";import{createHash as ve}from"node:crypto";import v from"node:net";import Se from"node:dns";var Re=new Set(["localhost","metadata.google.internal","metadata.goog"]);function B(t){let e=String(t).toLowerCase().split("%")[0];if((e.match(/::/g)||[]).length>1)return null;let r=d=>{if(!d)return[];let s=d.split(":"),a=s.at(-1);if(a?.includes(".")){let i=a.split(".").map(Number);if(i.length!==4||i.some(b=>!Number.isInteger(b)||b<0||b>255))return null;s.splice(s.length-1,1,(i[0]<<8|i[1]).toString(16),(i[2]<<8|i[3]).toString(16))}return s.some(i=>!/^[0-9a-f]{1,4}$/.test(i))?null:s.map(i=>Number.parseInt(i,16))},[n,o]=e.split("::"),c=r(n),u=r(o);if(!c||!u)return null;let f=e.includes("::"),p=8-c.length-u.length;if(!f&&p!==0||f&&p<1)return null;let m=[...c,...Array(Math.max(0,p)).fill(0),...u];return m.length!==8?null:Uint8Array.from(m.flatMap(d=>[d>>8,d&255]))}function O(t,e,r){let n=Math.floor(r/8),o=r%8;for(let u=0;u<n;u+=1)if(t[u]!==e[u])return!1;if(!o)return!0;let c=255<<8-o;return(t[n]&c)===(e[n]&c)}function U(t){if(v.isIPv4(t)){let e=t.split(".").map(Number);return!(e[0]===0||e[0]===10||e[0]===127||e[0]>=224||e[0]===100&&e[1]>=64&&e[1]<=127||e[0]===169&&e[1]===254||e[0]===172&&e[1]>=16&&e[1]<=31||e[0]===192&&(e[1]===0||e[1]===2||e[1]===168)||e[0]===192&&e[1]===88&&e[2]===99||e[0]===198&&(e[1]===18||e[1]===19||e[1]===51)||e[0]===203&&e[1]===0&&e[2]===113)}if(v.isIPv6(t)){let e=B(t);if(!e)return!1;let r=B("::ffff:0:0");return O(e,r,96)?U([...e.slice(12)].join(".")):O(e,B("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([o,c])=>O(e,B(o),c)):!1}return!1}function xe(t){let e;try{e=new URL(String(t))}catch{return{ok:!1,error:`not a valid URL: ${String(t).slice(0,120)}`}}if(e.protocol!=="http:"&&e.protocol!=="https:")return{ok:!1,error:`refused protocol ${e.protocol} (only http/https)`};let r=e.hostname.toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,"");if(Re.has(r)||r.endsWith(".localhost")||r.endsWith(".internal"))return{ok:!1,error:`refused internal host ${r}`};let n=v.isIP(r);return n!==0&&!U(r)?{ok:!1,error:`refused private address ${r}`}:{ok:!0,url:e,host:r,isLiteralIp:n!==0}}async function F(t,{lookupFn:e=Se.promises.lookup}={}){let r=xe(t);if(!r.ok)return r;if(r.isLiteralIp)return{ok:!0,url:r.url,addresses:[{address:r.host,family:v.isIPv6(r.host)?6:4}]};let n;try{n=await e(r.host,{all:!0,verbatim:!0})}catch{return{ok:!1,error:`refused: ${r.host} did not resolve`}}return!Array.isArray(n)||n.length===0||n.some(o=>!U(o.address))?{ok:!1,error:`refused: ${r.host} resolves to a non-public address`}:{ok:!0,url:r.url,addresses:n}}async function D({requireUndici:t=!1,importUndici:e=()=>import("undici")}={}){let r,n;try{let s=await e();r=s.Agent,n=s.fetch}catch(s){if(t)throw new Error(`egress-guard: untrustedUrl pinning requires the undici package, which failed to load: ${s?.message||s}`);return null}if(typeof r!="function"||typeof n!="function"){if(t)throw new Error("egress-guard: untrustedUrl pinning requires undici's Agent and fetch exports, which were not found on the imported module");return null}let o=s=>String(s).toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,""),c=new Map,u=s=>(Array.isArray(s)?s:[s]).map(a=>typeof a=="string"?{address:a}:a).filter(a=>a&&a.address).map(a=>({address:a.address,family:a.family||(v.isIPv6(a.address)?6:4)})),f=(s,a,i)=>{c.set(o(s),u(typeof a=="string"?[{address:a,family:i}]:a))},p=s=>{let a=o(s);if(v.isIP(a))return[{address:a,family:v.isIPv6(a)?6:4}];let i=c.get(a);if(!i||!i.length)throw new Error(`refused: unpinned host ${s} during pinned fetch`);return i},m=new r({connect:{lookup(s,a,i){let b;try{b=p(s)}catch(I){return i(I)}return a?.all?i(null,b):i(null,b[0].address,b[0].family)}}}),d=Ae((s,a={})=>n(s,{...a,dispatcher:m}),f);return{dispatcher:m,fetch:d,pin:f,resolve:p,async close(){try{await m.destroy()}catch{}}}}var j=Symbol.for("oracle.egressGuard.pinCapableFetch");function Ae(t,e){if(typeof t!="function")throw new Error("markPinCapableFetch: fetchImpl must be a function");if(typeof e!="function")throw new Error("markPinCapableFetch: pin must be a function");return t[j]=Object.freeze({pin:e}),t}function z(t){return typeof t=="function"&&typeof t[j]?.pin=="function"}function X(t,e,r){if(!z(t))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");t[j].pin(e,r)}var Te=new Set([408,425,429,500,502,503,504]),Z=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),_e=2,Q=4e3,ne=["authorization","x-api-key","x-tensor-api-key","0x-api-key","api-key","cookie","proxy-authorization"],Ie=new Set([301,302,303,307,308]),ee=3,Ce=64*1024;function Pe(t){let e=String(t||"").toLowerCase();return ne.includes(e)||/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(e)}function ke(t){let e={};for(let[r,n]of Object.entries(t||{}))Pe(r)||(e[r]=n);return e}function $e(t,e){if(!t)throw new Error(`HTTP redirect from ${e} missing Location`);let r=new URL(String(t),String(e));if(r.protocol!=="http:"&&r.protocol!=="https:")throw new Error(`HTTP redirect from ${e} used unsupported protocol ${r.protocol}`);return r.toString()}function Ne(t,e){return new URL(String(t)).origin===new URL(String(e)).origin}var V=new Map;function Le(t,e,r,n={}){let o={};for(let[d,s]of Object.entries(r||{}))o[d.toLowerCase()]=s;let c=Object.keys(o).filter(d=>/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(d)),f=[...new Set([...ne,...c])].sort().map(d=>`${d}=${o[d]??""}`).join(`
2
+ `),p=ve("sha256").update(f).digest("hex").slice(0,32),m=`${n.untrustedUrl?"untrusted":"trusted"}:${n.maxResponseBytes??"unbounded"}`;return`${t} ${e} ${m} ${p}`}function He(t,e){let r=Number(e);return Number.isFinite(r)&&r>0?Math.min(r*1e3,Q):Math.min(250*2**t,Q)+Math.floor(Math.random()*100)}var Be=t=>new Promise(e=>setTimeout(e,t));function N(t,e={}){let r=new Error(t);return r.retryable=!1,Object.assign(r,e),r}function G(t,e,r){return N(`HTTP response from ${t} exceeded maxResponseBytes ${r} (${e})`,{oversize:!0})}function L(t){try{let e=t?.body?.cancel?.();e&&typeof e.then=="function"&&e.catch(()=>{})}catch{}}function Me(t){return t?t.byteLength??t.length??0:0}async function te(t,e,{url:r,truncate:n=!1,onOversize:o}={}){if(e==null)return await t.text();let c=Number(t.headers?.get?.("content-length"));if(Number.isFinite(c)&&c>e&&(L(t),!n))throw G(r,`content-length ${c}`,e);let u=t.body?.getReader?.();if(!u){let s=await t.text(),a=Buffer.byteLength(s,"utf8");if(a>e){if(!n)throw G(r,`body ${a} bytes`,e);return Buffer.from(s,"utf8").subarray(0,e).toString("utf8")}return s}let f=[],p=0,m=!1;try{for(;;){let{value:s,done:a}=await u.read();if(a)break;if(s&&(f.push(Buffer.from(s)),p+=Me(s),p>e)){m=!0;break}}}finally{if(m)try{await u.cancel()}catch{}try{u.releaseLock?.()}catch{}}if(m&&(typeof o=="function"&&o(),!n))throw G(r,`streamed ${p} bytes`,e);let d=Buffer.concat(f);return(m?d.subarray(0,e):d).toString("utf8")}function re(t){if(!t)return null;try{return JSON.parse(t)}catch{return null}}async function Oe(t,{fetchImpl:e,method:r,headers:n,body:o,timeoutMs:c,lookupFn:u,realFetch:f,untrustedUrl:p=!1,maxResponseBytes:m=null,importUndici:d,validateResponse:s,signal:a}){let i=new AbortController,b=setTimeout(()=>i.abort(),c),I=a?typeof AbortSignal.any=="function"?AbortSignal.any([a,i.signal]):a:i.signal,w=null,C=e,P=u?{lookupFn:u}:{};if(p&&!f&&!z(C))throw N(`HTTP refused ${t}: untrustedUrl requires a pin-capable fetchImpl (see markPinCapableFetch in egress-guard.mjs) or no fetchImpl override so Oracle can pin the connection itself`);let k=async(h,{status:g=null}={})=>{let y=await F(h,P);if(!y.ok)throw N(g==null?`HTTP refused ${h}: ${y.error}`:`HTTP redirect to ${h} ${y.error}`,g==null?{}:{status:g});let l=new URL(h).hostname;if(f){if(w&&(await w.close(),w=null),!w)try{w=await D({requireUndici:!0,...d?{importUndici:d}:{}})}catch(E){throw N(g==null?`HTTP refused ${h}: ${E?.message||E}`:`HTTP redirect to ${h} refused: ${E?.message||E}`,g==null?{}:{status:g})}w.pin(l,y.addresses),C=w.fetch}else X(C,l,y.addresses);return y};try{let h=String(t),g={...n||{}};p&&await k(h);for(let y=0;y<=ee;y+=1){let l=await C(h,{method:r,headers:g,body:o,signal:I,redirect:"manual"});if(Ie.has(l.status)){if(r!=="GET"&&r!=="HEAD"){let R=await te(l,m??Ce,{url:h,truncate:!0}),x=new Error(`HTTP ${l.status} ${r} ${h} redirected non-idempotent request`);throw x.status=l.status,x.body=re(R)??R.slice(0,300),x}if(y===ee)throw L(l),new Error(`HTTP redirect loop for ${t}`);let S=l.headers?.get?.("location"),A;try{A=$e(S,h)}catch(R){throw L(l),R}let $=!Ne(A,h);if(L(l),$&&(g=ke(g)),p)await k(A,{status:l.status});else if($){let R=await F(A,P);if(!R.ok){let x=new Error(`HTTP redirect from ${h} ${R.error}`);throw x.status=l.status,x.retryable=!1,x}f&&R.addresses?.length&&(w||(w=await D(d?{importUndici:d}:{})),w&&(w.pin(new URL(A).hostname,R.addresses),C=w.fetch))}h=A;continue}if(typeof s=="function")try{await s(l,{url:h})}catch(S){throw L(l),N(S?.message||String(S))}let E=await te(l,m,{url:h,onOversize:()=>i.abort()}),H=re(E);if(!l.ok){let S=new Error(`HTTP ${l.status} ${r} ${h}`);throw S.status=l.status,S.retryAfter=l.headers?.get?.("retry-after")??null,S.body=H??E.slice(0,300),S}return H??E}throw new Error(`HTTP redirect loop for ${t}`)}finally{clearTimeout(b),w&&await w.close()}}async function oe(t,e={}){let r=e.fetchImpl||globalThis.fetch;if(typeof r!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let n=e.timeoutMs??12e3,o=(e.method||"GET").toUpperCase(),c={Accept:"application/json",...e.headers||{}},u=e.body;u!=null&&typeof u!="string"&&(c["Content-Type"]=c["Content-Type"]||"application/json",u=JSON.stringify(u));let f=Number.isInteger(e.retries)?Math.max(e.retries,0):_e,p=e.lookupFn,m=!e.fetchImpl,d=e.untrustedUrl===!0,s=e.importUndici,a=e.validateResponse,i=e.signal,b=Number(e.maxResponseBytes),I=Number.isFinite(b)&&b>0?Math.floor(b):null,w=async()=>{let g;for(let y=0;y<=f;y++){i?.throwIfAborted?.();try{return await Oe(t,{fetchImpl:r,method:o,headers:c,body:u,timeoutMs:n,lookupFn:p,realFetch:m,untrustedUrl:d,maxResponseBytes:I,importUndici:s,validateResponse:a,signal:i})}catch(l){g=l;let E=l?.status,H=l?.name==="AbortError"||l?.name==="TimeoutError"||i?.aborted,S=new Set([408,425,429]),A=l?.retryable===!1?!1:E!=null?S.has(E)||Te.has(E)&&Z.has(o):!H&&Z.has(o);if(y===f||!A)throw l;let $=He(y,l?.retryAfter);i?await new Promise((R,x)=>{let Ee=setTimeout(R,$);i.addEventListener("abort",()=>{clearTimeout(Ee),x(i.reason||new DOMException("Aborted","AbortError"))},{once:!0})}):await Be($)}}throw g};if(!(e.dedupe!==!1&&!i&&o==="GET"&&u==null))return w();let P=Le(o,t,c,{untrustedUrl:d,maxResponseBytes:I}),k=V.get(P);if(k)return k;let h=w().finally(()=>V.delete(P));return V.set(P,h),h}var se={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}},Ue=new Map(Object.values(se).map(t=>[t.chainId,t]));function ae(t){return Ue.get(Number(t))||null}function ce(t,e=process.env){let r=ae(t);if(!r)return null;for(let n of r.rpcEnv){let o=(e[n]||"").trim();if(o)return o}return null}import{Interface as Fe,getAddress as pt}from"ethers";var ht=new Fe(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);var De={1:"https://ethereum.publicnode.com",137:"https://polygon-bor-rpc.publicnode.com",42161:"https://arbitrum-one-rpc.publicnode.com",8453:"https://base-rpc.publicnode.com",10:"https://optimism-rpc.publicnode.com",988:"https://rpc.stable.xyz",56:"https://bsc-rpc.publicnode.com",43114:"https://avalanche-c-chain-rpc.publicnode.com",999:"https://rpc.hyperliquid.xyz/evm",2741:"https://api.mainnet.abs.xyz",4663:"https://rpc.mainnet.chain.robinhood.com"};function je(t,{rpcUrl:e,env:r=process.env}={}){if(e)return e;let n=ce(t,r);return n||De[Number(t)]||null}var ze=/^(?:eth_(?:call|blocknumber|chainid|get[a-z0-9]+|feehistory|gasprice|maxpriorityfeepergas|syncing|protocolversion|estimategas|createaccesslist)|net_(?:version|listening|peercount)|web3_(?:clientversion|sha3))$/;function Ve(t){let e=String(t||""),r=e.toLowerCase();if(e!==e.trim()||!/^[a-zA-Z0-9_]+$/.test(e)||!ze.test(r))throw new Error(`evm-rpc: ${e} refused \u2014 @oracle-agent/oracle is prepare-only (read RPC only; no broadcast/sign)`);return r}async function ie(t,e,r=[],n={}){let o=String(e||"");Ve(o);let c=je(t,n);if(!c)throw new Error(`No RPC URL for chainId ${t} (set env from chain registry rpcEnv or pass rpcUrl)`);let f=await oe(c,{method:"POST",body:{jsonrpc:"2.0",id:1,method:e,params:r},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3,signal:n.signal});if(f?.error){let p=new Error(f.error.message||JSON.stringify(f.error));throw p.code=f.error.code,p}return f.result}var J=999,q=1,Ge=8453,ue="0x1d9d87eBc14e71490bB87f1C39F65BDB979f3cb7",Ye="0x4d5e4ed4D5e4A160Fa136853597cDc2eBBe66494",le="0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e",qe="0xC6d566A56A1aFf6508b41f6c90ff131615583BCD",Je=".80002105.reverse",W=/^0x[a-fA-F0-9]{40}$/,fe=new TextEncoder,de=t=>"0x"+Buffer.from(t).toString("hex"),T=t=>de(Y(fe.encode(t))).slice(0,10),pe=t=>t.toLowerCase().replace(/^0x/,"").padStart(64,"0");function M(t){let e=new Uint8Array(32);if(t)for(let r of String(t).split(".").reverse()){let n=Y(fe.encode(r)),o=new Uint8Array(64);o.set(e,0),o.set(n,32),e=Y(o)}return de(e)}function K(t){if(!t||t==="0x"||/^0x0*$/.test(t))return"";try{let e=t.slice(2),r=parseInt(e.slice(0,64),16)*2,n=parseInt(e.slice(r,r+64),16);if(!Number.isFinite(n)||n<=0)return"";let o=e.slice(r+64,r+64+n*2);return Buffer.from(o,"hex").toString("utf8")}catch{return""}}async function _(t,e,r){try{return await ie(t,"eth_call",[{to:e,data:r},"latest"])}catch{return null}}async function We(t){let e=await _(J,ue,T("primaryName(address)")+pe(t)),r=K(e);return r?r.endsWith(".hl")?r:`${r}.hl`:null}async function Ke(t){let e=await _(J,Ye,T("getName(address)")+pe(t)),r=K(e);return r?r.endsWith(".hype")?r:`${r}.hype`:null}async function he(t,e,r){let n=await _(t,r,T("name(bytes32)")+e.slice(2));return K(n)||null}async function Xe(t){let e=M(`${t.slice(2).toLowerCase()}.addr.reverse`),r=await _(q,le,T("resolver(bytes32)")+e.slice(2));if(!r)return null;let n="0x"+r.slice(-40);return/^0x0+$/.test(n)?null:he(q,e,n)}async function Ze(t){let e=M(t.slice(2).toLowerCase()+Je);return he(Ge,e,qe)}var me=[{source:"hl",fn:We},{source:"hype",fn:Ke},{source:"ens",fn:Xe},{source:"basename",fn:Ze}];async function we(t){if(!W.test(String(t||"").trim()))return null;let e=String(t).trim();for(let{source:r,fn:n}of me){let o=await n(e);if(o)return{name:o,source:r,address:e}}return null}async function Qe(t){let e=M(t),r=await _(J,ue,T("ownerOf(uint256)")+e.slice(2));if(!r||r.length<66)return null;let n="0x"+r.slice(-40);return/^0x0+$/.test(n)?null:n}async function et(t,e,r){let n=M(e),o=await _(t,r,T("resolver(bytes32)")+n.slice(2));if(!o)return null;let c="0x"+o.slice(-40);if(/^0x0+$/.test(c))return null;let u=await _(t,c,T("addr(bytes32)")+n.slice(2));if(!u)return null;let f="0x"+u.slice(-40);return/^0x0+$/.test(f)?null:f}async function ye(t){let e=String(t||"").trim().toLowerCase();if(!e||!e.includes("."))return null;if(e.endsWith(".hl")){let r=await Qe(e);return r?{address:r,source:"hl",name:e}:null}if(e.endsWith(".eth")){let r=await et(q,e,le);return r?{address:r,source:e.endsWith(".base.eth")?"basename":"ens",name:e}:null}return null}var be=me.map(t=>t.source);var ge=`oracle resolve <name-or-address> [--json]
3
3
 
4
4
  oracle resolve demi.hl
5
5
  oracle resolve vitalik.eth
@@ -8,16 +8,16 @@ import{keccak_256 as V}from"@noble/hashes/sha3.js";import{createHash as Se}from"
8
8
  Reads on-chain name records. No API key: HL Names publishes a paid REST API,
9
9
  but the contract answers primaryName(address) for free.
10
10
 
11
- Sources, in priority order: ${we.join(", ")}.`;async function Ze(t=[]){let e=t.filter(o=>o!=="--json"),r=t.includes("--json"),n=(e[0]||"").trim();if(!n||n==="--help"||n==="-h")return process.stdout.write(ye+`
12
- `),n?0:1;try{if(q.test(n)){let c=await he(n);return r?(process.stdout.write(JSON.stringify({address:n,name:c?.name??null,source:c?.source??null})+`
11
+ Sources, in priority order: ${be.join(", ")}.`;async function tt(t=[]){let e=t.filter(o=>o!=="--json"),r=t.includes("--json"),n=(e[0]||"").trim();if(!n||n==="--help"||n==="-h")return process.stdout.write(ge+`
12
+ `),n?0:1;try{if(W.test(n)){let c=await we(n);return r?(process.stdout.write(JSON.stringify({address:n,name:c?.name??null,source:c?.source??null})+`
13
13
  `),0):c?(process.stdout.write(`${n}
14
14
  ${c.name} [${c.source}]
15
15
  `),0):(process.stdout.write(`${n}
16
16
  no name record found
17
- `),0)}let o=await me(n);return r?(process.stdout.write(JSON.stringify({name:n,address:o?.address??null,source:o?.source??null})+`
17
+ `),0)}let o=await ye(n);return r?(process.stdout.write(JSON.stringify({name:n,address:o?.address??null,source:o?.source??null})+`
18
18
  `),0):o?(process.stdout.write(`${n}
19
19
  ${o.address} [${o.source}]
20
20
  `),0):(process.stdout.write(`${n}
21
21
  unresolved (no owner record)
22
22
  `),0)}catch(o){return process.stderr.write(`resolve failed: ${o?.message||o}
23
- `),1}}var yt={name:"resolve",summary:"resolve .hl/.hype/.eth names to addresses and back",usage:ye,async run(t){return Ze(t.argv||[])}};export{yt as default};
23
+ `),1}}var Et={name:"resolve",summary:"resolve .hl/.hype/.eth names to addresses and back",usage:ge,async run(t){return tt(t.argv||[])}};export{Et as default};
@@ -1,7 +1,7 @@
1
- import f from"node:fs";import V from"node:path";import k from"node:fs";import xe from"node:os";import b from"node:path";import{fileURLToPath as Se}from"node:url";var Ae=b.dirname(Se(import.meta.url)),xt=b.resolve(Ae,"../..");function G(){return process.env.ORACLE_FAKE_HOME||xe.homedir()}function ve(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function I(){return ve()?process.env.ORACLE_CONFIG_DIR||b.join(G(),".config","oracle"):b.join(G(),".config","oracle")}function ke(){return b.join(I(),"desk.json")}function Ie(){return b.join(I(),"env")}function E({force:e=!1}={}){if(E._done&&!e)return E._result||null;E._done=!0;let n={},t=(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,n[i]=s))};try{let i=Ie();if(k.existsSync(i))for(let o of k.readFileSync(i,"utf8").split(/\r?\n/)){let s=o.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)),t(s[1],c)}}catch{}try{let i=ke();if(k.existsSync(i)){let o=JSON.parse(k.readFileSync(i,"utf8"));o&&typeof o=="object"&&(t("ORACLE_DESK_URL",o.deskUrl||o.dataUrl||o.url),t("ORACLE_DATA_URL",o.dataUrl||o.deskUrl||o.url),t("ORACLE_API_URL",o.apiUrl||o.dataUrl||o.deskUrl),t("ORACLE_PUBLIC_URL",o.publicUrl||o.deskUrl||o.dataUrl),t("ORACLE_EXEC_URL",o.execUrl),t("MAD_DESK_URL",o.deskUrl||o.dataUrl))}}catch{}let r=process.env.ORACLE_DESK_URL||process.env.ORACLE_DATA_URL||"";return r&&(t("ORACLE_DESK_URL",r),t("ORACLE_DATA_URL",r),t("ORACLE_API_URL",r),t("ORACLE_PUBLIC_URL",r),t("MAD_DESK_URL",r)),E._result=Object.keys(n).length?n:null,E._result}try{E()}catch{}import{createCipheriv as Te,createDecipheriv as Ne,randomBytes as N,scryptSync as Oe}from"node:crypto";import a from"node:fs";import m from"node:path";var K="ORACLE-LOCAL-VAULT",Y=1,A=Object.freeze({N:1<<17,r:8,p:1}),Le=256*1024*1024,Ce=16*1024;function T(e,n,t,{max:r=n}={}){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 i=Buffer.from(e,"base64");if(i.toString("base64")!==e||i.length<n||i.length>r)throw new Error(`local-vault: invalid ${t} length`);return i}function X(e,n,t=A){let r=String(e??"");if(r.length<12)throw new Error("local-vault: passphrase must be at least 12 characters");return Oe(r,n,32,{...t,maxmem:Le})}function Q(e,n,t={}){let r=Buffer.isBuffer(e)?Buffer.from(e):Buffer.from(String(e));if(!r.length)throw new Error("local-vault: refusing empty key material");let i=N(32),o=N(12),s={magic:K,version:Y,kdf:{name:"scrypt",...A,salt:i.toString("base64")},cipher:{name:"aes-256-gcm",iv:o.toString("base64")},meta:{address:t.address?String(t.address).toLowerCase():null,addresses:t.addresses||void 0,kind:t.kind||"evm",createdAt:new Date().toISOString()}},c=X(n,i);try{let l=Te("aes-256-gcm",c,o);l.setAAD(Buffer.from(JSON.stringify(s)));let u=Buffer.concat([l.update(r),l.final()]);return{...s,ciphertext:u.toString("base64"),tag:l.getAuthTag().toString("base64")}}finally{c.fill(0),r.fill(0)}}function B(e,n){if(e?.magic!==K||e?.version!==Y)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!==A.N||e.kdf.r!==A.r||e.kdf.p!==A.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(p=>!["address","addresses","kind","createdAt"].includes(p))||String(e.meta.kind||"").length>16||String(e.meta.address||"").length>128||JSON.stringify(e.meta.addresses||{}).length>1024||!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(p=>!t.includes(p)))throw new Error("local-vault: unexpected vault field");let r=T(e.kdf.salt,32,"salt"),i=T(e.cipher.iv,12,"iv"),o=T(e.tag,16,"tag"),s=T(e.ciphertext,1,"ciphertext",{max:Ce}),{ciphertext:c,tag:l,...u}=e,d=X(n,r);try{let p=Ne("aes-256-gcm",d,i);return p.setAAD(Buffer.from(JSON.stringify(u))),p.setAuthTag(o),Buffer.concat([p.update(s),p.final()])}catch{throw new Error("local-vault: wrong passphrase or tampered vault")}finally{d.fill(0)}}function Pe(e){if(!e.isFile())throw new Error("local-vault: secret source must be a regular file");if(e.uid!==process.getuid?.())throw new Error("local-vault: secret source must be owned by this user");if(e.nlink!==1)throw new Error("local-vault: refusing hard-linked secret source");if((e.mode&63)!==0)throw new Error("local-vault: secret source must be owner-only (0600)")}function Z(e){let n=m.dirname(e),t=a.lstatSync(n);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");if((t.mode&63)!==0)throw new Error("local-vault: destination directory must be owner-only (0700)");try{let r=a.lstatSync(e);if(r.isSymbolicLink())throw new Error("local-vault: refusing symlink destination");if(!r.isFile()||r.uid!==process.getuid?.()||r.nlink!==1)throw new Error("local-vault: unsafe destination file");if(r.dev!==t.dev)throw new Error("local-vault: destination device mismatch")}catch(r){if(r.code!=="ENOENT")throw r}}function w(e){let n;try{n=a.openSync(e,a.constants.O_RDONLY|a.constants.O_NOFOLLOW)}catch(t){throw t.code==="ELOOP"?new Error("local-vault: refusing symlink"):t}try{let t=a.fstatSync(n);if(Pe(t),t.size>1024*1024)throw new Error("local-vault: secret source changed or is too large");let r=a.lstatSync(e);if(r.isSymbolicLink()||r.dev!==t.dev||r.ino!==t.ino)throw new Error("local-vault: secret source changed or is too large");return a.readFileSync(n,"utf8").replace(/[\r\n]+$/,"")}finally{a.closeSync(n)}}function R(e){return JSON.parse(w(e))}function ee(e,n){a.mkdirSync(m.dirname(e),{recursive:!0,mode:448}),Z(e);let t=m.join(m.dirname(e),`.${m.basename(e)}.${process.pid}.${N(6).toString("hex")}.tmp`),r;try{r=a.openSync(t,a.constants.O_CREAT|a.constants.O_EXCL|a.constants.O_WRONLY|a.constants.O_NOFOLLOW,384),a.writeFileSync(r,JSON.stringify(n,null,2)+`
2
- `),a.fsyncSync(r),a.closeSync(r),r=void 0;let i=a.openSync(t,a.constants.O_RDONLY|a.constants.O_NOFOLLOW),o;try{o=a.fstatSync(i)}finally{a.closeSync(i)}let s=a.lstatSync(m.dirname(e));if(o.nlink!==1||o.dev!==s.dev||o.uid!==process.getuid?.())throw new Error("local-vault: unsafe temporary file");a.renameSync(t,e),a.chmodSync(e,384);let c=a.openSync(m.dirname(e),"r");try{a.fsyncSync(c)}finally{a.closeSync(c)}}catch(i){if(r!==void 0)try{a.closeSync(r)}catch{}try{a.unlinkSync(t)}catch{}throw i}return e}function y(e,n){a.mkdirSync(m.dirname(e),{recursive:!0,mode:448}),Z(e);let t=m.join(m.dirname(e),`.${m.basename(e)}.${process.pid}.${N(6).toString("hex")}.tmp`);try{let r=a.openSync(t,a.constants.O_CREAT|a.constants.O_EXCL|a.constants.O_WRONLY|a.constants.O_NOFOLLOW,384);try{a.writeFileSync(r,String(n)),a.fsyncSync(r)}finally{a.closeSync(r)}a.renameSync(t,e),a.chmodSync(e,384);let i=a.openSync(m.dirname(e),"r");try{a.fsyncSync(i)}finally{a.closeSync(i)}}catch(r){try{a.unlinkSync(t)}catch{}throw r}}import h from"node:path";import ct from"node:os";import{createHash as ut,randomBytes as Ni}from"node:crypto";import{Interface as z,keccak256 as Li}from"ethers";import{Transaction as Pi}from"@scure/btc-signer";import{ed25519 as Ri}from"@noble/curves/ed25519.js";import{base58 as mo}from"@scure/base";import{Interface as ae}from"ethers";import{Interface as Fe,MaxUint256 as ir,isAddress as ar,keccak256 as sr,toUtf8Bytes as cr}from"ethers";import{Interface as _e,isAddress as Dt}from"ethers";import{isAddress as Rt}from"ethers";var Ht=new _e(["function approve(address spender,uint256 amount) returns (bool)"]);import{Interface as $e,isAddress as Vt}from"ethers";var Xt=new $e(["function approve(address spender,uint256 amount) returns (bool)"]),Qt=Object.freeze({42161:"0x1c3fa76e6e1088bce750f23a5bfcffa1efef6a41",43114:"0x8f550e53dfe96c055d5bdb267c21f268fcaf63b2"});var mr=new Fe(["function approve(address spender,uint256 amount) returns (bool)"]);var wr=300*1e3,gr=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})();import{Address as Sr,NETWORK as Ar,OutScript as vr,RawTx as kr,SigHash as Ir,TEST_NETWORK as Tr,Transaction as Nr}from"@scure/btc-signer";import{createHash as qe}from"node:crypto";import{base58 as Pr}from"@scure/base";import{getCompiledTransactionMessageDecoder as Rr}from"@solana/transaction-messages";var te=e=>qe("sha256").update(`global:${e}`).digest().subarray(0,8).toString("hex"),_r=new Map([[te("route"),{name:"route",prefixBytes:0}],[te("shared_accounts_route"),{name:"shared_accounts_route",prefixBytes:1}]]);var Wr=64*1024;var tn=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"}),rn=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 an="0x"+"00".repeat(32);var De=Object.freeze([["salt","uint256"],["maker","address"],["signer","address"],["tokenId","uint256"],["makerAmount","uint256"],["takerAmount","uint256"],["side","uint8"],["signatureType","uint8"],["timestamp","uint256"],["metadata","bytes32"],["builder","bytes32"]]),dn=Object.freeze(De.map(e=>e[0]));var Je=new Set(["evm","evm-swap","evm-bridge","evm-nft","btc","sol","hl","poly","lighter"]);var On=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 ze=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"}}),Ln=Object.freeze({"0x161ac21f":{provider:"opensea-nft",action:"mint",layout:"seadrop-mint-public"},"0xc2f6663a":{provider:"opensea-nft",action:"mint",layout:"seadrop-mint-allowlist"}}),Cn=new ae(["function buySpecificNFT(uint256 tokenId,uint256 maxCost) payable","function sellNFT(uint256 tokenId,uint256 minPayout) payable"]),Pn=new ae(["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"]),Bn=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 Ve=Object.freeze([...Je]),Rn=Object.freeze({...ze});import{ed25519 as Yn}from"@noble/curves/ed25519.js";import{base58 as Qn}from"@scure/base";import{RawTx as eo,SigHash as to,Transaction as ro}from"@scure/btc-signer";import{Transaction as oo,keccak256 as io,verifyTypedData as ao}from"ethers";import{encode as Fn}from"@msgpack/msgpack";import{keccak256 as qn,verifyTypedData as Dn}from"ethers";var Un=Object.freeze({name:"Exchange",version:"1",chainId:1337,verifyingContract:"0x0000000000000000000000000000000000000000"}),jn=Object.freeze({Agent:[{name:"source",type:"string"},{name:"connectionId",type:"bytes32"}]});var Io=Object.freeze({1:{name:"ethereum",mode:"mempool-private",endpoints:["https://rpc.flashbots.net/fast","https://rpc.mevblocker.io"]},8453:{name:"base",mode:"sequencer",endpoints:["https://mainnet-sequencer.base.org"]},10:{name:"optimism",mode:"sequencer",endpoints:["https://mainnet-sequencer.optimism.io"]},42161:{name:"arbitrum",mode:"sequencer",endpoints:["https://arb1-sequencer.arbitrum.io/rpc"]},56:{name:"bsc",mode:"mempool-private",endpoints:["https://rpc.48.club","https://bsc.rpc.blxrbdn.com"]},137:{name:"polygon",mode:"mempool-private",endpoints:["https://polygon-bor-rpc.publicnode.com"]},43114:{name:"avalanche",mode:"public-only",endpoints:[]},999:{name:"hyperevm",mode:"public-only",endpoints:[]}});import{createHmac as Xe,randomBytes as Do,timingSafeEqual as Qe}from"node:crypto";import Ze from"node:fs";import x from"node:path";import{homedir as q}from"node:os";import{join as D}from"node:path";var ce=process.env.ORACLE_PUBLIC_DESKTOP==="1",Ye=ce?process.env.ORACLE_CONFIG_DIR||D(q(),".config","oracle"):D(q(),".config","oracle"),Lo=ce?Ye:D(q(),".config","mad-desk");var _o="0".repeat(64),$o=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 L(e){return e==null?"null":typeof e!="object"?JSON.stringify(e):Array.isArray(e)?"["+e.map(L).join(",")+"]":"{"+Object.keys(e).sort().map(t=>JSON.stringify(t)+":"+L(e[t])).join(",")+"}"}var Fo=Promise.resolve();function et(e,n){if(!e)throw new Error("ledger: separate freshness anchor required");let t=s=>{try{return Ze.realpathSync(s)}catch{return x.resolve(s)}},r=t(x.dirname(x.resolve(e))),i=t(x.dirname(x.resolve(n))),o=(s,c)=>c===s||c.startsWith(s+x.sep);if(o(r,i)||o(i,r))throw new Error("ledger: separate freshness anchor required")}var U=(e,n)=>Xe("sha256",n).update(L(e)).digest("hex"),tt=(e,n)=>{let t=Buffer.from(String(e)),r=Buffer.from(String(n));return t.length===r.length&&Qe(t,r)};function rt(e,n,{sequence:t}={}){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("policy: object required");let r=t===void 0?e:{...e,policySequence:Number(t)};return{policy:r,integrity:{algorithm:"hmac-sha256-canonical-json-v1",mac:U(r,n)}}}function ue(e,n){if(!e)throw new Error("policy: sequence anchor required");let t;try{t=w(e)}catch{return{sequence:0,present:!1}}let r;try{r=JSON.parse(t)}catch{throw new Error("policy: sequence anchor is unreadable")}if(!tt(r?.integrity?.mac,U(r?.marker,n)))throw new Error("policy: sequence anchor integrity failed");return{sequence:Number(r?.marker?.policySequence||0),policyMac:r?.marker?.policyMac??null,present:!0,ledgerInitialized:r?.marker?.ledgerInitialized===!0}}function nt(e,n,t,r=null,{ledgerInitialized:i}={}){if(r==null||!String(r))throw new Error("policy: sequence anchor must bind the sealed policy MAC");let o=i===!0;if(i===void 0)try{let c=ue(e,t);o=c.present&&c.ledgerInitialized===!0}catch{o=!1}let s={policySequence:Number(n),policyMac:String(r)};o&&(s.ledgerInitialized=!0),y(e,JSON.stringify({marker:s,integrity:{algorithm:"hmac-sha256-canonical-json-v1",mac:U(s,t)}})+`
3
- `)}function le(e,n,t,{sequenceAnchorFile:r}={}){let i=w(n);if(!r)throw new Error("policy: sequence anchor required");let o=ue(r,i);et(r,e);let s=Number(o.sequence||0)+1,c=rt(t,i,{sequence:s});nt(r,s,i,c?.integrity?.mac??null),y(e,JSON.stringify(c,null,2)+`
4
- `)}import{Wallet as j}from"ethers";import{base58 as W}from"@scure/base";import{ed25519 as me}from"@noble/curves/ed25519.js";import{NETWORK as he,TEST_NETWORK as we,WIF as ot,p2wpkh as de}from"@scure/btc-signer";import{pubECDSA as it}from"@scure/btc-signer/utils.js";var C=e=>{let n=String(e||"").trim().replace(/^0x/i,"");return!/^[0-9a-fA-F]+$/.test(n)||n.length%2?null:Buffer.from(n,"hex")},at=e=>{let n=String(e||"").trim();if(!/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(n))return null;let t=Buffer.from(n,"base64");return t.toString("base64")===n?t:null},fe=e=>{let n=String(e||"").trim();try{let t=Buffer.from(W.decode(n));return W.encode(t)===n?t:null}catch{return null}},H=e=>{if(!(e instanceof Uint8Array))throw new Error("sol: key bytes required");if(e.length!==32&&e.length!==64)throw new Error("sol: expected 32-byte private key material");let n=Buffer.from(e.subarray(0,32));if(e.length===64){let t=Buffer.from(e.subarray(32,64)),r=Buffer.from(me.getPublicKey(n));if(!t.equals(r))throw new Error("sol: supplied public key does not match seed")}return n},pe=e=>!(e instanceof Uint8Array)||e.length!==32&&e.length!==64?null:Buffer.from(e.subarray(0,32)),g=(e,n)=>{if(n==="sol")return H(e);if(!(e instanceof Uint8Array))throw new Error(`${n}: key bytes required`);if(e.length===32)return Buffer.from(e);if(e.length===64)return Buffer.from(e.subarray(0,32));throw new Error(`${n}: expected 32-byte private key material`)},st=(e,n)=>{if(!Array.isArray(e))throw new Error(`${n}: expected byte array`);let t=Buffer.alloc(e.length);for(let r=0;r<e.length;r++){let i=e[r];if(typeof i!="number"||!Number.isSafeInteger(i)||i<0||i>255)throw new Error(`${n}: expected integer bytes in 0..255`);t[r]=i}return g(t,n)};function S(e,n){let t=String(n||"").trim();if(e==="evm")return new j(t).privateKey;if(e==="btc")for(let o of[he,we])try{return Buffer.from(ot(o).decode(t))}catch{}if(e==="sol"){if(/^hex:/i.test(t)){let u=C(t.slice(4));if(!u)throw new Error("sol: invalid explicit hex private key");return g(u,"sol")}if(/^base58:/i.test(t)){let u=fe(t.slice(7));if(!pe(u))throw new Error("sol: invalid explicit base58 private key");return H(u)}if(/^0x/i.test(t)){let u=C(t);if(!u)throw new Error("sol: invalid explicit hex private key");return g(u,"sol")}let o=C(t),s=o&&(o.length===32||o.length===64)?g(o,"sol"):null,c=fe(t),l=pe(c);if(s&&l&&!s.equals(l))throw new Error("sol: ambiguous private key format; prefix with hex: or base58:");if(l)return H(c);if(o)return g(o,"sol")}let r=C(t);if(r)return e==="evm"?new j(`0x${r.toString("hex")}`).privateKey:g(r,e);let i=at(t);if(i)return g(i,e);if(t.startsWith("[")||t.startsWith("{")){let o=JSON.parse(t);if(Array.isArray(o))return st(o,e);let s=o.privateKey??o.secretKey??o.key;if(s)return S(e,Array.isArray(s)?JSON.stringify(s):String(s))}throw new Error(`${e}: unsupported private key format`)}function v(e,n){if(e==="evm"){let t=new j(String(n));return{kind:e,secret:t.privateKey,addresses:[t.address.toLowerCase()]}}if(e==="btc"){let t=g(n,"btc"),r=it(t);return{kind:e,secret:t.toString("hex"),addresses:[de(r,he).address,de(r,we).address]}}if(e==="sol"){let t=g(n,"sol");return{kind:e,secret:t.toString("hex"),addresses:[W.encode(me.getPublicKey(t))]}}throw new Error(`unsupported signer kind ${e}`)}function J(e,n={}){let t=Buffer.isBuffer(e)?e.toString("utf8"):String(e||"");if(String(n.kind||"")!=="multichain")return{[n.kind||"evm"]:v(n.kind||"evm",S(n.kind||"evm",t))};let r=JSON.parse(t),i={};for(let o of["evm","btc","sol"])r[o]&&(i[o]=v(o,S(o,r[o])));if(!Object.keys(i).length)throw new Error("local-vault: multichain vault is empty");return i}function ge(e){let n={};for(let t of["evm","btc","sol"])e[t]&&(n[t]=t==="evm"?e[t].secret:`0x${e[t].secret}`);return Buffer.from(JSON.stringify(n))}function ye(e){let n={};for(let[t,r]of Object.entries(e))n[t]=r.addresses;return{kind:"multichain",address:null,addresses:n}}var ra=new z(["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"]),na=new z(["function decimals() view returns (uint8)","function allowance(address owner,address spender) view returns (uint256)"]),oa=new z(["function ownerOf(uint256 tokenId) view returns (address)","function getApproved(uint256 tokenId) view returns (address)","function isApprovedForAll(address owner,address operator) view returns (bool)"]);function Ee(e){let n=process.env.ORACLE_SIGNER_STATE_DIR||h.join(process.env.XDG_STATE_HOME||h.join(ct.homedir(),".local","state"),"oracle"),t=ut("sha256").update(h.resolve(e)).digest("hex").slice(0,16);return{vault:h.join(e,"vault.json"),policy:h.join(e,"signer-policy.json"),policyKey:h.join(e,"policy-integrity-key"),policyAnchor:h.join(n,`signer-policy-${t}.high-water`),ledger:h.join(e,"signer-ledger.json"),ledgerAnchor:h.join(n,`signer-ledger-${t}.high-water`),token:h.join(e,"signer-token"),lock:h.join(n,`signer-${t}.lock`)}}import{randomBytes as lt}from"node:crypto";import{Wallet as dt}from"ethers";var be=`oracle sign init|import|policy|status|lock|doctor
1
+ var Ae=(e,n,r)=>()=>{if(r)throw r[0];try{return e&&(n=e(e=0)),n}catch(t){throw r=[t],t}};import k from"node:fs";import Se from"node:os";import b from"node:path";import{fileURLToPath as ve}from"node:url";function V(){return process.env.ORACLE_FAKE_HOME||Se.homedir()}function Te(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function T(){return Te()?process.env.ORACLE_CONFIG_DIR||b.join(V(),".config","oracle"):b.join(V(),".config","oracle")}function Ie(){return b.join(T(),"desk.json")}function Oe(){return b.join(T(),"env")}function E({force:e=!1}={}){if(E._done&&!e)return E._result||null;E._done=!0;let n={},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,n[i]=s))};try{let i=Oe();if(k.existsSync(i))for(let o of k.readFileSync(i,"utf8").split(/\r?\n/)){let s=o.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 i=Ie();if(k.existsSync(i)){let o=JSON.parse(k.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 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)),E._result=Object.keys(n).length?n:null,E._result}var ke,Lr,K=Ae(()=>{ke=b.dirname(ve(import.meta.url)),Lr=b.resolve(ke,"../..");try{E()}catch{}});K();import f from"node:fs";import G from"node:path";import{createCipheriv as Ne,createDecipheriv as Ce,randomBytes as O,scryptSync as Le}from"node:crypto";import a from"node:fs";import m from"node:path";var Y="ORACLE-LOCAL-VAULT",X=1,S=Object.freeze({N:1<<17,r:8,p:1}),Be=256*1024*1024,Pe=16*1024;function I(e,n,r,{max:t=n}={}){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<n||i.length>t)throw new Error(`local-vault: invalid ${r} length`);return i}function Q(e,n,r=S){let t=String(e??"");if(t.length<12)throw new Error("local-vault: passphrase must be at least 12 characters");return Le(t,n,32,{...r,maxmem:Be})}function Z(e,n,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 i=O(32),o=O(12),s={magic:Y,version:X,kdf:{name:"scrypt",...S,salt:i.toString("base64")},cipher:{name:"aes-256-gcm",iv:o.toString("base64")},meta:{address:r.address?String(r.address).toLowerCase():null,addresses:r.addresses||void 0,kind:r.kind||"evm",createdAt:new Date().toISOString()}},c=Q(n,i);try{let l=Ne("aes-256-gcm",c,o);l.setAAD(Buffer.from(JSON.stringify(s)));let u=Buffer.concat([l.update(t),l.final()]);return{...s,ciphertext:u.toString("base64"),tag:l.getAuthTag().toString("base64")}}finally{c.fill(0),t.fill(0)}}function P(e,n){if(e?.magic!==Y||e?.version!==X)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!==S.N||e.kdf.r!==S.r||e.kdf.p!==S.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(p=>!["address","addresses","kind","createdAt"].includes(p))||String(e.meta.kind||"").length>16||String(e.meta.address||"").length>128||JSON.stringify(e.meta.addresses||{}).length>1024||!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(p=>!r.includes(p)))throw new Error("local-vault: unexpected vault field");let t=I(e.kdf.salt,32,"salt"),i=I(e.cipher.iv,12,"iv"),o=I(e.tag,16,"tag"),s=I(e.ciphertext,1,"ciphertext",{max:Pe}),{ciphertext:c,tag:l,...u}=e,d=Q(n,t);try{let p=Ce("aes-256-gcm",d,i);return p.setAAD(Buffer.from(JSON.stringify(u))),p.setAuthTag(o),Buffer.concat([p.update(s),p.final()])}catch{throw new Error("local-vault: wrong passphrase or tampered vault")}finally{d.fill(0)}}function Re(e){if(!e.isFile())throw new Error("local-vault: secret source must be a regular file");if(e.uid!==process.getuid?.())throw new Error("local-vault: secret source must be owned by this user");if(e.nlink!==1)throw new Error("local-vault: refusing hard-linked secret source");if((e.mode&63)!==0)throw new Error("local-vault: secret source must be owner-only (0600)")}function ee(e){let n=m.dirname(e),r=a.lstatSync(n);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");if((r.mode&63)!==0)throw new Error("local-vault: destination directory must be owner-only (0700)");try{let t=a.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 h(e){let n;try{n=a.openSync(e,a.constants.O_RDONLY|a.constants.O_NOFOLLOW)}catch(r){throw r.code==="ELOOP"?new Error("local-vault: refusing symlink"):r}try{let r=a.fstatSync(n);if(Re(r),r.size>1024*1024)throw new Error("local-vault: secret source changed or is too large");let t=a.lstatSync(e);if(t.isSymbolicLink()||t.dev!==r.dev||t.ino!==r.ino)throw new Error("local-vault: secret source changed or is too large");return a.readFileSync(n,"utf8").replace(/[\r\n]+$/,"")}finally{a.closeSync(n)}}function R(e){return JSON.parse(h(e))}function re(e,n){a.mkdirSync(m.dirname(e),{recursive:!0,mode:448}),ee(e);let r=m.join(m.dirname(e),`.${m.basename(e)}.${process.pid}.${O(6).toString("hex")}.tmp`),t;try{t=a.openSync(r,a.constants.O_CREAT|a.constants.O_EXCL|a.constants.O_WRONLY|a.constants.O_NOFOLLOW,384),a.writeFileSync(t,JSON.stringify(n,null,2)+`
2
+ `),a.fsyncSync(t),a.closeSync(t),t=void 0;let i=a.openSync(r,a.constants.O_RDONLY|a.constants.O_NOFOLLOW),o;try{o=a.fstatSync(i)}finally{a.closeSync(i)}let s=a.lstatSync(m.dirname(e));if(o.nlink!==1||o.dev!==s.dev||o.uid!==process.getuid?.())throw new Error("local-vault: unsafe temporary file");a.renameSync(r,e),a.chmodSync(e,384);let c=a.openSync(m.dirname(e),"r");try{a.fsyncSync(c)}finally{a.closeSync(c)}}catch(i){if(t!==void 0)try{a.closeSync(t)}catch{}try{a.unlinkSync(r)}catch{}throw i}return e}function y(e,n){a.mkdirSync(m.dirname(e),{recursive:!0,mode:448}),ee(e);let r=m.join(m.dirname(e),`.${m.basename(e)}.${process.pid}.${O(6).toString("hex")}.tmp`);try{let t=a.openSync(r,a.constants.O_CREAT|a.constants.O_EXCL|a.constants.O_WRONLY|a.constants.O_NOFOLLOW,384);try{a.writeFileSync(t,String(n)),a.fsyncSync(t)}finally{a.closeSync(t)}a.renameSync(r,e),a.chmodSync(e,384);let i=a.openSync(m.dirname(e),"r");try{a.fsyncSync(i)}finally{a.closeSync(i)}}catch(t){try{a.unlinkSync(r)}catch{}throw t}}import w from"node:path";import gr from"node:os";import{createHash as yr,randomBytes as ga}from"node:crypto";import{Interface as z,keccak256 as Ea}from"ethers";import{Transaction as xa}from"@scure/btc-signer";import{ed25519 as Sa}from"@noble/curves/ed25519.js";import{base58 as ni}from"@scure/base";import{Interface as se}from"ethers";import{Interface as qe,MaxUint256 as wt,isAddress as ht,keccak256 as gt,toUtf8Bytes as yt}from"ethers";import{Interface as Fe,isAddress as Yr}from"ethers";import{isAddress as Hr}from"ethers";var et=new Fe(["function approve(address spender,uint256 amount) returns (bool)"]);import{Interface as Me,isAddress as nt}from"ethers";var st=new Me(["function approve(address spender,uint256 amount) returns (bool)"]),ct=Object.freeze({42161:"0x1c3fa76e6e1088bce750f23a5bfcffa1efef6a41",43114:"0x8f550e53dfe96c055d5bdb267c21f268fcaf63b2"});var vt=new qe(["function approve(address spender,uint256 amount) returns (bool)"]);var Tt=300*1e3,It=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})();import{Address as Bt,NETWORK as Pt,OutScript as Rt,RawTx as _t,SigHash as $t,TEST_NETWORK as Ft,Transaction as Mt}from"@scure/btc-signer";import{createHash as Ue}from"node:crypto";import{base58 as jt}from"@scure/base";import{getCompiledTransactionMessageDecoder as Ht}from"@solana/transaction-messages";var te=e=>Ue("sha256").update(`global:${e}`).digest().subarray(0,8).toString("hex"),Jt=new Map([[te("route"),{name:"route",prefixBytes:0}],[te("shared_accounts_route"),{name:"shared_accounts_route",prefixBytes:1}]]);var Zt=64*1024;var dn=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"}),fn=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 wn="0x"+"00".repeat(32);var We=Object.freeze([["salt","uint256"],["maker","address"],["signer","address"],["tokenId","uint256"],["makerAmount","uint256"],["takerAmount","uint256"],["side","uint8"],["signatureType","uint8"],["timestamp","uint256"],["metadata","bytes32"],["builder","bytes32"]]),bn=Object.freeze(We.map(e=>e[0]));import{TypedDataEncoder as Xn,getAddress as Qn}from"ethers";import{TypedDataEncoder as kn,getAddress as Tn,isAddress as In}from"ethers";var Je=Object.freeze({1:"0x111111125421cA6dc452d289314280a0f8842A65",8453:"0x111111125421cA6dc452d289314280a0f8842A65",42161:"0x111111125421cA6dc452d289314280a0f8842A65",10:"0x111111125421cA6dc452d289314280a0f8842A65",137:"0x111111125421cA6dc452d289314280a0f8842A65",56:"0x111111125421cA6dc452d289314280a0f8842A65"}),ze=Object.freeze({Order:[{name:"salt",type:"uint256"},{name:"maker",type:"address"},{name:"receiver",type:"address"},{name:"makerAsset",type:"address"},{name:"takerAsset",type:"address"},{name:"makingAmount",type:"uint256"},{name:"takingAmount",type:"uint256"},{name:"makerTraits",type:"uint256"}]});import{TypedDataEncoder as Mn,getAddress as qn,isAddress as Dn}from"ethers";var Cn=Object.freeze({READ:"read",PREPARE:"prepare",EXECUTE:"execute",AUTONOMOUS:"autonomous"});var Ge=Object.freeze({1:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",100:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",42161:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",8453:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41"}),Gn=Object.freeze({1:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",100:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",42161:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",8453:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110"});var Ve=Object.freeze({Order:[{name:"sellToken",type:"address"},{name:"buyToken",type:"address"},{name:"receiver",type:"address"},{name:"sellAmount",type:"uint256"},{name:"buyAmount",type:"uint256"},{name:"validTo",type:"uint32"},{name:"appData",type:"bytes32"},{name:"feeAmount",type:"uint256"},{name:"kind",type:"string"},{name:"partiallyFillable",type:"bool"},{name:"sellTokenBalance",type:"string"},{name:"buyTokenBalance",type:"string"}]}),Vn=Object.freeze({OrderCancellations:[{name:"orderUids",type:"bytes[]"}]});var ro=Object.freeze(["https://limit-orders.1inch.io","https://api.1inch.dev/orderbook"]);var er=new Set(["evm","evm-swap","evm-bridge","evm-nft","evm-order","btc","sol","hl","poly","lighter"]);var Eo=Object.freeze({swap:5,bridge:5,perps:0,nft:0,mint:0,transfer:0,approve:0,delegate:0,identity:0,order:0,cancel:0,leverage:0,margin:0,approveBuilder:0,stake:0,unstake:0});var rr=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"}}),bo=Object.freeze({"0x161ac21f":{provider:"opensea-nft",action:"mint",layout:"seadrop-mint-public"},"0xc2f6663a":{provider:"opensea-nft",action:"mint",layout:"seadrop-mint-allowlist"}}),xo=new se(["function buySpecificNFT(uint256 tokenId,uint256 maxCost) payable","function sellNFT(uint256 tokenId,uint256 minPayout) payable"]),Ao=new se(["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"]),So=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 tr=Object.freeze([...er]),vo=Object.freeze({...rr});import{ed25519 as Do}from"@noble/curves/ed25519.js";import{base58 as jo}from"@scure/base";import{RawTx as Ho,SigHash as Jo,Transaction as zo}from"@scure/btc-signer";import{Transaction as Vo,keccak256 as Ko,verifyTypedData as Yo}from"ethers";import{encode as Io}from"@msgpack/msgpack";import{keccak256 as No,verifyTypedData as Co}from"ethers";var Lo=Object.freeze({name:"Exchange",version:"1",chainId:1337,verifyingContract:"0x0000000000000000000000000000000000000000"}),Bo=Object.freeze({Agent:[{name:"source",type:"string"},{name:"connectionId",type:"bytes32"}]});var wi=Object.freeze({1:{name:"ethereum",mode:"mempool-private",endpoints:["https://rpc.flashbots.net/fast","https://rpc.mevblocker.io"]},8453:{name:"base",mode:"sequencer",endpoints:["https://mainnet-sequencer.base.org"]},10:{name:"optimism",mode:"sequencer",endpoints:["https://mainnet-sequencer.optimism.io"]},42161:{name:"arbitrum",mode:"sequencer",endpoints:["https://arb1-sequencer.arbitrum.io/rpc"]},56:{name:"bsc",mode:"mempool-private",endpoints:["https://rpc.48.club","https://bsc.rpc.blxrbdn.com"]},137:{name:"polygon",mode:"mempool-private",endpoints:["https://polygon-bor-rpc.publicnode.com"]},43114:{name:"avalanche",mode:"public-only",endpoints:[]},999:{name:"hyperevm",mode:"public-only",endpoints:[]}});import{createHmac as ar,randomBytes as Ni,timingSafeEqual as sr}from"node:crypto";import cr from"node:fs";import x from"node:path";import{homedir as q}from"node:os";import{join as D}from"node:path";var ue=process.env.ORACLE_PUBLIC_DESKTOP==="1",ir=ue?process.env.ORACLE_CONFIG_DIR||D(q(),".config","oracle"):D(q(),".config","oracle"),Ei=ue?ir:D(q(),".config","mad-desk");var vi="0".repeat(64),ki=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 C(e){return e==null?"null":typeof e!="object"?JSON.stringify(e):Array.isArray(e)?"["+e.map(C).join(",")+"]":"{"+Object.keys(e).sort().map(r=>JSON.stringify(r)+":"+C(e[r])).join(",")+"}"}var Ti=Promise.resolve();function ur(e,n){if(!e)throw new Error("ledger: separate freshness anchor required");let r=s=>{try{return cr.realpathSync(s)}catch{return x.resolve(s)}},t=r(x.dirname(x.resolve(e))),i=r(x.dirname(x.resolve(n))),o=(s,c)=>c===s||c.startsWith(s+x.sep);if(o(t,i)||o(i,t))throw new Error("ledger: separate freshness anchor required")}var U=(e,n)=>ar("sha256",n).update(C(e)).digest("hex"),lr=(e,n)=>{let r=Buffer.from(String(e)),t=Buffer.from(String(n));return r.length===t.length&&sr(r,t)};function dr(e,n,{sequence:r}={}){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("policy: object required");let t=r===void 0?e:{...e,policySequence:Number(r)};return{policy:t,integrity:{algorithm:"hmac-sha256-canonical-json-v1",mac:U(t,n)}}}function le(e,n){if(!e)throw new Error("policy: sequence anchor required");let r;try{r=h(e)}catch{return{sequence:0,present:!1}}let t;try{t=JSON.parse(r)}catch{throw new Error("policy: sequence anchor is unreadable")}if(!lr(t?.integrity?.mac,U(t?.marker,n)))throw new Error("policy: sequence anchor integrity failed");return{sequence:Number(t?.marker?.policySequence||0),policyMac:t?.marker?.policyMac??null,present:!0,ledgerInitialized:t?.marker?.ledgerInitialized===!0}}function fr(e,n,r,t=null,{ledgerInitialized:i}={}){if(t==null||!String(t))throw new Error("policy: sequence anchor must bind the sealed policy MAC");let o=i===!0;if(i===void 0)try{let c=le(e,r);o=c.present&&c.ledgerInitialized===!0}catch{o=!1}let s={policySequence:Number(n),policyMac:String(t)};o&&(s.ledgerInitialized=!0),y(e,JSON.stringify({marker:s,integrity:{algorithm:"hmac-sha256-canonical-json-v1",mac:U(s,r)}})+`
3
+ `)}function de(e,n,r,{sequenceAnchorFile:t}={}){let i=h(n);if(!t)throw new Error("policy: sequence anchor required");let o=le(t,i);ur(t,e);let s=Number(o.sequence||0)+1,c=dr(r,i,{sequence:s});fr(t,s,i,c?.integrity?.mac??null),y(e,JSON.stringify(c,null,2)+`
4
+ `)}import{Wallet as j}from"ethers";import{base58 as W}from"@scure/base";import{ed25519 as we}from"@noble/curves/ed25519.js";import{NETWORK as he,TEST_NETWORK as ge,WIF as pr,p2wpkh as fe}from"@scure/btc-signer";import{pubECDSA as mr}from"@scure/btc-signer/utils.js";var L=e=>{let n=String(e||"").trim().replace(/^0x/i,"");return!/^[0-9a-fA-F]+$/.test(n)||n.length%2?null:Buffer.from(n,"hex")},wr=e=>{let n=String(e||"").trim();if(!/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(n))return null;let r=Buffer.from(n,"base64");return r.toString("base64")===n?r:null},pe=e=>{let n=String(e||"").trim();try{let r=Buffer.from(W.decode(n));return W.encode(r)===n?r:null}catch{return null}},H=e=>{if(!(e instanceof Uint8Array))throw new Error("sol: key bytes required");if(e.length!==32&&e.length!==64)throw new Error("sol: expected 32-byte private key material");let n=Buffer.from(e.subarray(0,32));if(e.length===64){let r=Buffer.from(e.subarray(32,64)),t=Buffer.from(we.getPublicKey(n));if(!r.equals(t))throw new Error("sol: supplied public key does not match seed")}return n},me=e=>!(e instanceof Uint8Array)||e.length!==32&&e.length!==64?null:Buffer.from(e.subarray(0,32)),g=(e,n)=>{if(n==="sol")return H(e);if(!(e instanceof Uint8Array))throw new Error(`${n}: key bytes required`);if(e.length===32)return Buffer.from(e);if(e.length===64)return Buffer.from(e.subarray(0,32));throw new Error(`${n}: expected 32-byte private key material`)},hr=(e,n)=>{if(!Array.isArray(e))throw new Error(`${n}: expected byte array`);let r=Buffer.alloc(e.length);for(let t=0;t<e.length;t++){let i=e[t];if(typeof i!="number"||!Number.isSafeInteger(i)||i<0||i>255)throw new Error(`${n}: expected integer bytes in 0..255`);r[t]=i}return g(r,n)};function A(e,n){let r=String(n||"").trim();if(e==="evm")return new j(r).privateKey;if(e==="btc")for(let o of[he,ge])try{return Buffer.from(pr(o).decode(r))}catch{}if(e==="sol"){if(/^hex:/i.test(r)){let u=L(r.slice(4));if(!u)throw new Error("sol: invalid explicit hex private key");return g(u,"sol")}if(/^base58:/i.test(r)){let u=pe(r.slice(7));if(!me(u))throw new Error("sol: invalid explicit base58 private key");return H(u)}if(/^0x/i.test(r)){let u=L(r);if(!u)throw new Error("sol: invalid explicit hex private key");return g(u,"sol")}let o=L(r),s=o&&(o.length===32||o.length===64)?g(o,"sol"):null,c=pe(r),l=me(c);if(s&&l&&!s.equals(l))throw new Error("sol: ambiguous private key format; prefix with hex: or base58:");if(l)return H(c);if(o)return g(o,"sol")}let t=L(r);if(t)return e==="evm"?new j(`0x${t.toString("hex")}`).privateKey:g(t,e);let i=wr(r);if(i)return g(i,e);if(r.startsWith("[")||r.startsWith("{")){let o=JSON.parse(r);if(Array.isArray(o))return hr(o,e);let s=o.privateKey??o.secretKey??o.key;if(s)return A(e,Array.isArray(s)?JSON.stringify(s):String(s))}throw new Error(`${e}: unsupported private key format`)}function v(e,n){if(e==="evm"){let r=new j(String(n));return{kind:e,secret:r.privateKey,addresses:[r.address.toLowerCase()]}}if(e==="btc"){let r=g(n,"btc"),t=mr(r);return{kind:e,secret:r.toString("hex"),addresses:[fe(t,he).address,fe(t,ge).address]}}if(e==="sol"){let r=g(n,"sol");return{kind:e,secret:r.toString("hex"),addresses:[W.encode(we.getPublicKey(r))]}}throw new Error(`unsupported signer kind ${e}`)}function J(e,n={}){let r=Buffer.isBuffer(e)?e.toString("utf8"):String(e||"");if(String(n.kind||"")!=="multichain")return{[n.kind||"evm"]:v(n.kind||"evm",A(n.kind||"evm",r))};let t=JSON.parse(r),i={};for(let o of["evm","btc","sol"])t[o]&&(i[o]=v(o,A(o,t[o])));if(!Object.keys(i).length)throw new Error("local-vault: multichain vault is empty");return i}function ye(e){let n={};for(let r of["evm","btc","sol"])e[r]&&(n[r]=r==="evm"?e[r].secret:`0x${e[r].secret}`);return Buffer.from(JSON.stringify(n))}function Ee(e){let n={};for(let[r,t]of Object.entries(e))n[r]=t.addresses;return{kind:"multichain",address:null,addresses:n}}var za=new z(["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"]),Ga=new z(["function decimals() view returns (uint8)","function allowance(address owner,address spender) view returns (uint256)"]),Va=new z(["function ownerOf(uint256 tokenId) view returns (address)","function getApproved(uint256 tokenId) view returns (address)","function isApprovedForAll(address owner,address operator) view returns (bool)"]);function be(e){let n=process.env.ORACLE_SIGNER_STATE_DIR||w.join(process.env.XDG_STATE_HOME||w.join(gr.homedir(),".local","state"),"oracle"),r=yr("sha256").update(w.resolve(e)).digest("hex").slice(0,16);return{vault:w.join(e,"vault.json"),policy:w.join(e,"signer-policy.json"),policyKey:w.join(e,"policy-integrity-key"),policyAnchor:w.join(n,`signer-policy-${r}.high-water`),ledger:w.join(e,"signer-ledger.json"),ledgerAnchor:w.join(n,`signer-ledger-${r}.high-water`),token:w.join(e,"signer-token"),lock:w.join(n,`signer-${r}.lock`)}}import{randomBytes as Er}from"node:crypto";import{Wallet as br}from"ethers";var xe=`oracle sign init|import|policy|status|lock|doctor
5
5
 
6
6
  oracle sign init [--passphrase-file <0600 file>]
7
7
  oracle sign import --kind evm|btc|sol --key-file <0600 file> [--passphrase-file <0600 file>]
@@ -11,14 +11,14 @@ import f from"node:fs";import V from"node:path";import k from"node:fs";import xe
11
11
  oracle sign doctor
12
12
 
13
13
  Secrets are accepted only from a hidden TTY or protected owner-only files.
14
- They are never accepted as argument values or inherited environment variables.`,P=(e,n)=>{let t=e.indexOf(n);return t>=0?e[t+1]:null},ft=e=>{let n=String(P(e,"--kind")||"evm").toLowerCase();if(!["evm","btc","sol"].includes(n))throw new Error("import requires --kind evm|btc|sol");return n};async function pt(e,n={}){if(n.readHidden)return n.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((t,r)=>{let i="",o=c=>{for(let l of c){if(l===3){s(),r(new Error("cancelled"));return}if(l===13||l===10){s(),process.stderr.write(`
15
- `),t(i);return}l===127?i=i.slice(0,-1):i+=String.fromCharCode(l)}},s=()=>{process.stdin.off("data",o),process.stdin.setRawMode(!1),process.stdin.pause()};process.stdin.on("data",o)})}async function mt(e,n){let t=P(e,"--passphrase-file");return t?w(t):pt("Vault passphrase: ",n)}function ht(e){return e.addresses.join(", ")}async function wt(e=[],n={}){let t=n.out||process.stdout,r=e[0],i=n.configDir||I(),o=Ee(V.join(i,"signer"));if(!r||r==="help")return t.write(be+`
16
- `),0;if(r==="status")return t.write(JSON.stringify({initialized:f.existsSync(o.vault),policyConfigured:f.existsSync(o.policy),armed:f.existsSync(o.vault)&&!f.existsSync(o.lock),disarmed:f.existsSync(o.lock)})+`
17
- `),0;if(r==="lock")return f.mkdirSync(V.dirname(o.lock),{recursive:!0,mode:448}),y(o.lock,`locked
18
- `),t.write(`Local signer locked.
19
- `),0;if(r==="doctor"){let u=[];return f.existsSync(o.vault)||u.push("vault missing"),f.existsSync(o.policy)||u.push("policy missing (empty allowlists fail closed)"),t.write(u.length?`Signer not ready: ${u.join("; ")}
14
+ They are never accepted as argument values or inherited environment variables.`,B=(e,n)=>{let r=e.indexOf(n);return r>=0?e[r+1]:null},xr=e=>{let n=String(B(e,"--kind")||"evm").toLowerCase();if(!["evm","btc","sol"].includes(n))throw new Error("import requires --kind evm|btc|sol");return n};async function Ar(e,n={}){if(n.readHidden)return n.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 i="",o=c=>{for(let l of c){if(l===3){s(),t(new Error("cancelled"));return}if(l===13||l===10){s(),process.stderr.write(`
15
+ `),r(i);return}l===127?i=i.slice(0,-1):i+=String.fromCharCode(l)}},s=()=>{process.stdin.off("data",o),process.stdin.setRawMode(!1),process.stdin.pause()};process.stdin.on("data",o)})}async function Sr(e,n){let r=B(e,"--passphrase-file");return r?h(r):Ar("Vault passphrase: ",n)}function vr(e){return e.addresses.join(", ")}async function kr(e=[],n={}){let r=n.out||process.stdout,t=e[0],i=n.configDir||T(),o=be(G.join(i,"signer"));if(!t||t==="help")return r.write(xe+`
16
+ `),0;if(t==="status")return r.write(JSON.stringify({initialized:f.existsSync(o.vault),policyConfigured:f.existsSync(o.policy),armed:f.existsSync(o.vault)&&!f.existsSync(o.lock),disarmed:f.existsSync(o.lock)})+`
17
+ `),0;if(t==="lock")return f.mkdirSync(G.dirname(o.lock),{recursive:!0,mode:448}),y(o.lock,`locked
18
+ `),r.write(`Local signer locked.
19
+ `),0;if(t==="doctor"){let u=[];return f.existsSync(o.vault)||u.push("vault missing"),f.existsSync(o.policy)||u.push("policy missing (empty allowlists fail closed)"),r.write(u.length?`Signer not ready: ${u.join("; ")}
20
20
  `:`Signer files ready; vault remains locked until a short-lived signer session starts.
21
- `),u.length?1:0}if(r==="policy"){if(!f.existsSync(o.vault)||!f.existsSync(o.policyKey))throw new Error("initialize the local signer before sealing policy");let u=P(e,"--policy-file");if(!u)throw new Error("policy requires --policy-file <0600 JSON file>");let d;try{d=JSON.parse(w(u))}catch{throw new Error("policy file must contain valid JSON")}for(let p of["surfaces","actions","chains","destinations","owners"])if(!Array.isArray(d[p])||d[p].length===0)throw new Error(`policy: ${p} allowlist is empty`);return le(o.policy,o.policyKey,d,{sequenceAnchorFile:o.policyAnchor}),t.write(`Signer policy sealed with local integrity and freshness protection.
22
- `),0}if(r!=="init"&&r!=="import")throw new Error(`unknown subcommand '${r}'`);let s=await mt(e,n),c={};if(f.existsSync(o.vault)){if(r==="init")throw new Error("local signer vault already exists");let u=R(o.vault),d=B(u,s);try{c=J(d,u.meta)}finally{d.fill(0)}}if(r==="init"){let u=dt.createRandom();c.evm=v("evm",S("evm",u.privateKey))}else{let u=ft(e),d=P(e,"--key-file");if(!d)throw new Error("import requires --key-file <0600 file>");c[u]=v(u,S(u,w(d)))}f.mkdirSync(V.dirname(o.vault),{recursive:!0,mode:448}),ee(o.vault,Q(ge(c),s,ye(c))),f.existsSync(o.policyKey)||y(o.policyKey,lt(32).toString("hex")+`
23
- `);let l=Object.entries(c).map(([u,d])=>`${u}:${ht(d)}`).join(" ");return t.write(`Encrypted local vault initialized for ${l}. Configure sealed policy rails before starting a signer session.
24
- `),0}var ha={name:"sign",summary:"manage the encrypted self-hosted signing vault",usage:be,run:e=>wt(e.argv||[])};export{ha as default,wt as run};
21
+ `),u.length?1:0}if(t==="policy"){if(!f.existsSync(o.vault)||!f.existsSync(o.policyKey))throw new Error("initialize the local signer before sealing policy");let u=B(e,"--policy-file");if(!u)throw new Error("policy requires --policy-file <0600 JSON file>");let d;try{d=JSON.parse(h(u))}catch{throw new Error("policy file must contain valid JSON")}for(let p of["surfaces","actions","chains","destinations","owners"])if(!Array.isArray(d[p])||d[p].length===0)throw new Error(`policy: ${p} allowlist is empty`);return de(o.policy,o.policyKey,d,{sequenceAnchorFile:o.policyAnchor}),r.write(`Signer policy sealed with local integrity and freshness protection.
22
+ `),0}if(t!=="init"&&t!=="import")throw new Error(`unknown subcommand '${t}'`);let s=await Sr(e,n),c={};if(f.existsSync(o.vault)){if(t==="init")throw new Error("local signer vault already exists");let u=R(o.vault),d=P(u,s);try{c=J(d,u.meta)}finally{d.fill(0)}}if(t==="init"){let u=br.createRandom();c.evm=v("evm",A("evm",u.privateKey))}else{let u=xr(e),d=B(e,"--key-file");if(!d)throw new Error("import requires --key-file <0600 file>");c[u]=v(u,A(u,h(d)))}f.mkdirSync(G.dirname(o.vault),{recursive:!0,mode:448}),re(o.vault,Z(ye(c),s,Ee(c))),f.existsSync(o.policyKey)||y(o.policyKey,Er(32).toString("hex")+`
23
+ `);let l=Object.entries(c).map(([u,d])=>`${u}:${vr(d)}`).join(" ");return r.write(`Encrypted local vault initialized for ${l}. Configure sealed policy rails before starting a signer session.
24
+ `),0}var is={name:"sign",summary:"manage the encrypted self-hosted signing vault",usage:xe,run:e=>kr(e.argv||[])};export{is as default,kr as run};