@oracle-agent/oracle 0.35.12 → 0.35.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
- var Ie=(e,n,t)=>()=>{if(t)throw t[0];try{return e&&(n=e(e=0)),n}catch(r){throw t=[r],r}};import k from"node:fs";import ke from"node:os";import b from"node:path";import{fileURLToPath as Te}from"node:url";function X(){return process.env.ORACLE_FAKE_HOME||ke.homedir()}function Ce(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function T(){return Ce()?process.env.ORACLE_CONFIG_DIR||b.join(X(),".config","oracle"):b.join(X(),".config","oracle")}function Ne(){return b.join(T(),"desk.json")}function Le(){return b.join(T(),"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 a=String(o).trim();a&&(process.env[i]!=null&&String(process.env[i]).trim()!==""||(process.env[i]=a,n[i]=a))};try{let i=Le();if(k.existsSync(i))for(let o of k.readFileSync(i,"utf8").split(/\r?\n/)){let a=o.match(/^\s*([A-Z0-9_]+)\s*=\s*(.*?)\s*$/);if(!a||a[2].startsWith("#"))continue;let c=a[2];(c.startsWith('"')&&c.endsWith('"')||c.startsWith("'")&&c.endsWith("'"))&&(c=c.slice(1,-1)),t(a[1],c)}}catch{}try{let i=Ne();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}var Oe,qt,Y=Ie(()=>{Oe=b.dirname(Te(import.meta.url)),qt=b.resolve(Oe,"../..");try{E()}catch{}});Y();import m from"node:fs";import K from"node:path";import{createCipheriv as $e,createDecipheriv as Re,randomBytes as C,scryptSync as Be}from"node:crypto";import s from"node:fs";import w from"node:path";var Q="ORACLE-LOCAL-VAULT",Z=1,A=Object.freeze({N:1<<17,r:8,p:1}),Pe=256*1024*1024,_e=16*1024;function O(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 ee(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 Be(r,n,32,{...t,maxmem:Pe})}function te(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=C(32),o=C(12),a={magic:Q,version:Z,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=ee(n,i);try{let l=$e("aes-256-gcm",c,o);l.setAAD(Buffer.from(JSON.stringify(a)));let u=Buffer.concat([l.update(r),l.final()]);return{...a,ciphertext:u.toString("base64"),tag:l.getAuthTag().toString("base64")}}finally{c.fill(0),r.fill(0)}}function P(e,n){if(e?.magic!==Q||e?.version!==Z)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(d=>!["address","addresses","kind","createdAt"].includes(d))||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(d=>!t.includes(d)))throw new Error("local-vault: unexpected vault field");let r=O(e.kdf.salt,32,"salt"),i=O(e.cipher.iv,12,"iv"),o=O(e.tag,16,"tag"),a=O(e.ciphertext,1,"ciphertext",{max:_e}),{ciphertext:c,tag:l,...u}=e,f=ee(n,r);try{let d=Re("aes-256-gcm",f,i);return d.setAAD(Buffer.from(JSON.stringify(u))),d.setAuthTag(o),Buffer.concat([d.update(a),d.final()])}catch{throw new Error("local-vault: wrong passphrase or tampered vault")}finally{f.fill(0)}}function Fe(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 re(e){let n=w.dirname(e),t=s.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=s.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 h(e){let n;try{n=s.openSync(e,s.constants.O_RDONLY|s.constants.O_NOFOLLOW)}catch(t){throw t.code==="ELOOP"?new Error("local-vault: refusing symlink"):t}try{let t=s.fstatSync(n);if(Fe(t),t.size>1024*1024)throw new Error("local-vault: secret source changed or is too large");let r=s.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 s.readFileSync(n,"utf8").replace(/[\r\n]+$/,"")}finally{s.closeSync(n)}}function _(e){return JSON.parse(h(e))}function ne(e,n){s.mkdirSync(w.dirname(e),{recursive:!0,mode:448}),re(e);let t=w.join(w.dirname(e),`.${w.basename(e)}.${process.pid}.${C(6).toString("hex")}.tmp`),r;try{r=s.openSync(t,s.constants.O_CREAT|s.constants.O_EXCL|s.constants.O_WRONLY|s.constants.O_NOFOLLOW,384),s.writeFileSync(r,JSON.stringify(n,null,2)+`
2
- `),s.fsyncSync(r),s.closeSync(r),r=void 0;let i=s.openSync(t,s.constants.O_RDONLY|s.constants.O_NOFOLLOW),o;try{o=s.fstatSync(i)}finally{s.closeSync(i)}let a=s.lstatSync(w.dirname(e));if(o.nlink!==1||o.dev!==a.dev||o.uid!==process.getuid?.())throw new Error("local-vault: unsafe temporary file");s.renameSync(t,e),s.chmodSync(e,384);let c=s.openSync(w.dirname(e),"r");try{s.fsyncSync(c)}finally{s.closeSync(c)}}catch(i){if(r!==void 0)try{s.closeSync(r)}catch{}try{s.unlinkSync(t)}catch{}throw i}return e}function y(e,n){s.mkdirSync(w.dirname(e),{recursive:!0,mode:448}),re(e);let t=w.join(w.dirname(e),`.${w.basename(e)}.${process.pid}.${C(6).toString("hex")}.tmp`);try{let r=s.openSync(t,s.constants.O_CREAT|s.constants.O_EXCL|s.constants.O_WRONLY|s.constants.O_NOFOLLOW,384);try{s.writeFileSync(r,String(n)),s.fsyncSync(r)}finally{s.closeSync(r)}s.renameSync(t,e),s.chmodSync(e,384);let i=s.openSync(w.dirname(e),"r");try{s.fsyncSync(i)}finally{s.closeSync(i)}}catch(r){try{s.unlinkSync(t)}catch{}throw r}}import p from"node:path";import kt from"node:os";import{createHash as Tt,randomBytes as bs}from"node:crypto";import{Interface as V,keccak256 as Ss}from"ethers";import{Transaction as vs}from"@scure/btc-signer";import{ed25519 as ks}from"@noble/curves/ed25519.js";import{base58 as fi}from"@scure/base";import{Interface as ue}from"ethers";import{Interface as Ue,MaxUint256 as vr,isAddress as Ir,keccak256 as kr,toUtf8Bytes as Tr}from"ethers";import{Interface as qe,isAddress as ir}from"ethers";import{isAddress as Zt}from"ethers";var ur=new qe(["function approve(address spender,uint256 amount) returns (bool)"]);import{Interface as je,isAddress as fr}from"ethers";var hr=new je(["function approve(address spender,uint256 amount) returns (bool)"]),gr=Object.freeze({42161:"0x1c3fa76e6e1088bce750f23a5bfcffa1efef6a41",43114:"0x8f550e53dfe96c055d5bdb267c21f268fcaf63b2"});var Rr=new Ue(["function approve(address spender,uint256 amount) returns (bool)"]);var Pr=300*1e3,_r=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})();import{Address as jr,NETWORK as Ur,OutScript as zr,RawTx as Wr,SigHash as Hr,TEST_NETWORK as Jr,Transaction as Gr}from"@scure/btc-signer";import{createHash as ze}from"node:crypto";import{base58 as Yr}from"@scure/base";import{getCompiledTransactionMessageDecoder as Zr}from"@solana/transaction-messages";var oe=e=>ze("sha256").update(`global:${e}`).digest().subarray(0,8).toString("hex"),en=new Map([[oe("route"),{name:"route",prefixBytes:0}],[oe("shared_accounts_route"),{name:"shared_accounts_route",prefixBytes:1}]]);var un=64*1024;var bn=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"}),xn=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 vn="0x"+"00".repeat(32);var He=Object.freeze([["salt","uint256"],["maker","address"],["signer","address"],["tokenId","uint256"],["makerAmount","uint256"],["takerAmount","uint256"],["side","uint8"],["signatureType","uint8"],["timestamp","uint256"],["metadata","bytes32"],["builder","bytes32"]]),Cn=Object.freeze(He.map(e=>e[0]));import{TypedDataEncoder as ao,getAddress as so}from"ethers";import{TypedDataEncoder as Bn,getAddress as Pn,isAddress as _n}from"ethers";var Ge=Object.freeze({1:"0x111111125421cA6dc452d289314280a0f8842A65",8453:"0x111111125421cA6dc452d289314280a0f8842A65",42161:"0x111111125421cA6dc452d289314280a0f8842A65",10:"0x111111125421cA6dc452d289314280a0f8842A65",137:"0x111111125421cA6dc452d289314280a0f8842A65",56:"0x111111125421cA6dc452d289314280a0f8842A65"}),Ve=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 Gn,getAddress as Vn,isAddress as Kn}from"ethers";var Mn=Object.freeze({READ:"read",PREPARE:"prepare",EXECUTE:"execute",AUTONOMOUS:"autonomous"});var Ke=Object.freeze({1:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",100:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",42161:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",8453:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41"}),ro=Object.freeze({1:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",100:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",42161:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",8453:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110"});var Xe=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"}]}),no=Object.freeze({OrderCancellations:[{name:"orderUids",type:"bytes[]"}]});var lo=Object.freeze(["https://limit-orders.1inch.io","https://api.1inch.dev/orderbook"]);var rt=new Set(["evm","evm-swap","evm-bridge","evm-nft","evm-order","btc","sol","hl","poly","lighter"]);var Oo=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 nt=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"}}),Co=Object.freeze({"0x161ac21f":{provider:"opensea-nft",action:"mint",layout:"seadrop-mint-public"},"0xc2f6663a":{provider:"opensea-nft",action:"mint",layout:"seadrop-mint-allowlist"}}),No=new ue(["function buySpecificNFT(uint256 tokenId,uint256 maxCost) payable","function sellNFT(uint256 tokenId,uint256 minPayout) payable"]),Lo=new ue(["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"]),$o=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 ot=Object.freeze([...rt]),Ro=Object.freeze({...nt});import{ed25519 as Ko}from"@noble/curves/ed25519.js";import{base58 as Yo}from"@scure/base";import{RawTx as Zo,SigHash as ei,Transaction as ti}from"@scure/btc-signer";import{Transaction as ni,keccak256 as oi,verifyTypedData as ii}from"ethers";import{encode as _o}from"@msgpack/msgpack";import{keccak256 as Do,verifyTypedData as Mo}from"ethers";var qo=Object.freeze({name:"Exchange",version:"1",chainId:1337,verifyingContract:"0x0000000000000000000000000000000000000000"}),jo=Object.freeze({Agent:[{name:"source",type:"string"},{name:"connectionId",type:"bytes32"}]});var vi=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 ct,randomBytes as Di,timingSafeEqual as ut}from"node:crypto";import lt from"node:fs";import x from"node:path";import{homedir as j}from"node:os";import{join as U}from"node:path";var de=process.env.ORACLE_PUBLIC_DESKTOP==="1",st=de?process.env.ORACLE_CONFIG_DIR||U(j(),".config","oracle"):U(j(),".config","oracle"),Oi=de?st:U(j(),".config","mad-desk");var Ri="0".repeat(64),Bi=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 Pi=Promise.resolve();function dt(e,n){if(!e)throw new Error("ledger: separate freshness anchor required");let t=a=>{try{return lt.realpathSync(a)}catch{return x.resolve(a)}},r=t(x.dirname(x.resolve(e))),i=t(x.dirname(x.resolve(n))),o=(a,c)=>c===a||c.startsWith(a+x.sep);if(o(r,i)||o(i,r))throw new Error("ledger: separate freshness anchor required")}var z=(e,n)=>ct("sha256",n).update(L(e)).digest("hex"),ft=(e,n)=>{let t=Buffer.from(String(e)),r=Buffer.from(String(n));return t.length===r.length&&ut(t,r)};function pt(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:z(r,n)}}}function fe(e,n){if(!e)throw new Error("policy: sequence anchor required");let t;try{t=h(e)}catch{return{sequence:0,present:!1}}let r;try{r=JSON.parse(t)}catch{throw new Error("policy: sequence anchor is unreadable")}if(!ft(r?.integrity?.mac,z(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 mt(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=fe(e,t);o=c.present&&c.ledgerInitialized===!0}catch{o=!1}let a={policySequence:Number(n),policyMac:String(r)};o&&(a.ledgerInitialized=!0),y(e,JSON.stringify({marker:a,integrity:{algorithm:"hmac-sha256-canonical-json-v1",mac:z(a,t)}})+`
3
- `)}function pe(e,n,t,{sequenceAnchorFile:r}={}){let i=h(n);if(!r)throw new Error("policy: sequence anchor required");let o=fe(r,i);dt(r,e);let a=Number(o.sequence||0)+1,c=pt(t,i,{sequence:a});mt(r,a,i,c?.integrity?.mac??null),y(e,JSON.stringify(c,null,2)+`
4
- `)}import{dirname as wt,join as ht}from"node:path";import{fileURLToPath as gt}from"node:url";var yt=wt(gt(import.meta.url)),Yi=ht(yt,"descriptors");var Qi=(1n<<256n)-1n;import{Wallet as W}from"ethers";import{base58 as H}from"@scure/base";import{ed25519 as ge}from"@noble/curves/ed25519.js";import{NETWORK as ye,TEST_NETWORK as Ee,WIF as Et,p2wpkh as me}from"@scure/btc-signer";import{pubECDSA as bt}from"@scure/btc-signer/utils.js";var $=e=>{let n=String(e||"").trim().replace(/^0x/i,"");return!/^[0-9a-fA-F]+$/.test(n)||n.length%2?null:Buffer.from(n,"hex")},xt=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},we=e=>{let n=String(e||"").trim();try{let t=Buffer.from(H.decode(n));return H.encode(t)===n?t:null}catch{return null}},J=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(ge.getPublicKey(n));if(!t.equals(r))throw new Error("sol: supplied public key does not match seed")}return n},he=e=>!(e instanceof Uint8Array)||e.length!==32&&e.length!==64?null:Buffer.from(e.subarray(0,32)),g=(e,n)=>{if(n==="sol")return J(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 W(t).privateKey;if(e==="btc")for(let o of[ye,Ee])try{return Buffer.from(Et(o).decode(t))}catch{}if(e==="sol"){if(/^hex:/i.test(t)){let u=$(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=we(t.slice(7));if(!he(u))throw new Error("sol: invalid explicit base58 private key");return J(u)}if(/^0x/i.test(t)){let u=$(t);if(!u)throw new Error("sol: invalid explicit hex private key");return g(u,"sol")}let o=$(t),a=o&&(o.length===32||o.length===64)?g(o,"sol"):null,c=we(t),l=he(c);if(a&&l&&!a.equals(l))throw new Error("sol: ambiguous private key format; prefix with hex: or base58:");if(l)return J(c);if(o)return g(o,"sol")}let r=$(t);if(r)return e==="evm"?new W(`0x${r.toString("hex")}`).privateKey:g(r,e);let i=xt(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 a=o.privateKey??o.secretKey??o.key;if(a)return S(e,Array.isArray(a)?JSON.stringify(a):String(a))}throw new Error(`${e}: unsupported private key format`)}function I(e,n){if(e==="evm"){let t=new W(String(n));return{kind:e,secret:t.privateKey,addresses:[t.address.toLowerCase()]}}if(e==="btc"){let t=g(n,"btc"),r=bt(t);return{kind:e,secret:t.toString("hex"),addresses:[me(r,ye).address,me(r,Ee).address]}}if(e==="sol"){let t=g(n,"sol");return{kind:e,secret:t.toString("hex"),addresses:[H.encode(ge.getPublicKey(t))]}}throw new Error(`unsupported signer kind ${e}`)}function G(e,n={}){let t=Buffer.isBuffer(e)?e.toString("utf8"):String(e||"");if(String(n.kind||"")!=="multichain")return{[n.kind||"evm"]:I(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]=I(o,S(o,r[o])));if(r.cex!==void 0){if(!r.cex||typeof r.cex!="object"||Array.isArray(r.cex))throw new Error("local-vault: cex credential records invalid");i.cex={};for(let[o,a]of Object.entries(r.cex)){if(!/^[A-Za-z0-9._-]{1,64}$/.test(o)||!a||typeof a!="object")throw new Error("local-vault: cex credential record invalid");if(!/^(?:binance|bybit|okx|coinbase)$/.test(a.venue)||!/^[A-Za-z0-9._-]{1,64}$/.test(a.accountId||""))throw new Error("local-vault: cex credential binding invalid");let c=(u,f=!0)=>{let d=a[u];if(!(!f&&d===void 0)){if(!Array.isArray(d)||d.length<4||d.some(B=>!Number.isInteger(B)||B<0||B>255))throw new Error("local-vault: cex credential bytes invalid");return Buffer.from(d)}},l=a.apiSecretEncoding;if(l!==(a.venue==="coinbase"?"base64":"raw"))throw new Error("local-vault: explicit cex secret encoding refused");i.cex[o]=Object.freeze({venue:a.venue,accountId:a.accountId,apiKeyBytes:c("apiKeyBytes"),apiSecretBytes:c("apiSecretBytes"),apiSecretEncoding:l,passphraseBytes:c("passphraseBytes",!1)})}if(!Object.keys(i.cex).length)throw new Error("local-vault: empty cex credential records refused");Object.freeze(i.cex)}if(!Object.keys(i).length)throw new Error("local-vault: multichain vault is empty");return i}function be(e){let n={};for(let t of["evm","btc","sol"])e[t]&&(n[t]=t==="evm"?e[t].secret:`0x${e[t].secret}`);return e.cex&&(n.cex=Object.fromEntries(Object.entries(e.cex).map(([t,r])=>[t,{venue:r.venue,accountId:r.accountId,apiKeyBytes:[...r.apiKeyBytes],apiSecretBytes:[...r.apiSecretBytes],apiSecretEncoding:r.apiSecretEncoding,...r.passphraseBytes?{passphraseBytes:[...r.passphraseBytes]}:{}}]))),Buffer.from(JSON.stringify(n))}function xe(e){let n={};for(let[t,r]of Object.entries(e))r?.addresses&&(n[t]=r.addresses);return{kind:"multichain",address:null,addresses:n}}var pa=Object.freeze(["spot-limit-create","spot-limit-cancel","spot-order-status"]),ma=Object.freeze(["binance","bybit","okx","coinbase"]),wa=Object.freeze({binance:"https://api.binance.com",bybit:"https://api.bybit.com",okx:"https://openapi.okx.com",coinbase:"https://api.exchange.coinbase.com"}),ha=Object.freeze({binance:"/api/v3",bybit:"/v5/order",okx:"/api/v5/trade",coinbase:"/orders"}),ga=Object.freeze(["version","surface","kind","venue","credentialRef","symbol","base","quote","side","baseSize","limitPrice","maxQuoteNotional","timeInForce","clientOrderId","expiresAtMs","venueOrderId","nonce","grantId","artifactHash"]),ya=Object.freeze(["market-create","withdraw","transfer","subaccount","leverage","futures","margin","convert","api-key"]),Ea=Object.freeze(["url","host","path","method","headers","signature","apiKey","apiSecret","passphrase","privateKey","redirect","proxy"]),ba=Object.freeze(["ccxt","binance-api-node","node-binance-api","coinbase-advanced-node","@okx-dex/okx-dex-sdk","bybit-api"]),xa=Object.freeze({perOrderQuote:"sealed-owner-policy",dailyGrossQuote:"sealed-owner-policy",scope:Object.freeze(["per-order","UTC-day","account","venue","quote"]),envelopeFieldIsNotCeiling:!0}),Sa=Object.freeze({binanceRecvWindowMs:5e3,bybitWindowMs:5e3,maxLocalSkewMs:2e3}),Aa=Object.freeze({perSecond:1,perMinute:30,bind:"tighter"});var It=Object.freeze({binance:Object.freeze({create:["POST","/api/v3/order"],cancel:["DELETE","/api/v3/order"],status:["GET","/api/v3/order"]}),bybit:Object.freeze({create:["POST","/v5/order/create"],cancel:["POST","/v5/order/cancel"],status:["GET","/v5/order/realtime"]}),okx:Object.freeze({create:["POST","/api/v5/trade/order"],cancel:["POST","/api/v5/trade/cancel-order"],status:["GET","/api/v5/trade/order"]}),coinbase:Object.freeze({create:["POST","/orders"],cancel:["DELETE","/orders/{order_id}"],status:["GET","/orders/{order_id}"]})}),Se=Object.freeze({binance:"https://api.binance.com",bybit:"https://api.bybit.com",okx:"https://openapi.okx.com",coinbase:"https://api.exchange.coinbase.com"});var Ra=256*1024;var ec=new V(["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"]),tc=new V(["function decimals() view returns (uint8)","function allowance(address owner,address spender) view returns (uint256)"]),rc=new V(["function ownerOf(uint256 tokenId) view returns (address)","function getApproved(uint256 tokenId) view returns (address)","function isApprovedForAll(address owner,address operator) view returns (bool)"]);function Ae(e){let n=process.env.ORACLE_SIGNER_STATE_DIR||p.join(process.env.XDG_STATE_HOME||p.join(kt.homedir(),".local","state"),"oracle"),t=Tt("sha256").update(p.resolve(e)).digest("hex").slice(0,16);return{vault:p.join(e,"vault.json"),policy:p.join(e,"signer-policy.json"),policyKey:p.join(e,"policy-integrity-key"),policyAnchor:p.join(n,`signer-policy-${t}.high-water`),ledger:p.join(e,"signer-ledger.json"),ledgerAnchor:p.join(n,`signer-ledger-${t}.high-water`),cexOrders:p.join(e,"cex-orders.json"),cexOrdersAnchor:p.join(n,`cex-orders-${t}.high-water`),token:p.join(e,"signer-token"),lock:p.join(n,`signer-${t}.lock`)}}import{randomBytes as Ot}from"node:crypto";import{Wallet as Ct}from"ethers";var ve=`oracle sign init|import|policy|status|lock|doctor
1
+ var Te=(e,n,t)=>()=>{if(t)throw t[0];try{return e&&(n=e(e=0)),n}catch(r){throw t=[r],r}};import O from"node:fs";import Oe from"node:os";import b from"node:path";import{fileURLToPath as Ce}from"node:url";function Q(){return process.env.ORACLE_FAKE_HOME||Oe.homedir()}function Le(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function C(){return Le()?process.env.ORACLE_CONFIG_DIR||b.join(Q(),".config","oracle"):b.join(Q(),".config","oracle")}function $e(){return b.join(C(),"desk.json")}function Re(){return b.join(C(),"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 a=String(o).trim();a&&(process.env[i]!=null&&String(process.env[i]).trim()!==""||(process.env[i]=a,n[i]=a))};try{let i=Re();if(O.existsSync(i))for(let o of O.readFileSync(i,"utf8").split(/\r?\n/)){let a=o.match(/^\s*([A-Z0-9_]+)\s*=\s*(.*?)\s*$/);if(!a||a[2].startsWith("#"))continue;let c=a[2];(c.startsWith('"')&&c.endsWith('"')||c.startsWith("'")&&c.endsWith("'"))&&(c=c.slice(1,-1)),t(a[1],c)}}catch{}try{let i=$e();if(O.existsSync(i)){let o=JSON.parse(O.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}var Ne,Ut,Z=Te(()=>{Ne=b.dirname(Ce(import.meta.url)),Ut=b.resolve(Ne,"../..");try{E()}catch{}});Z();import m from"node:fs";import Y from"node:path";import{createCipheriv as Be,createDecipheriv as Pe,randomBytes as L,scryptSync as _e}from"node:crypto";import s from"node:fs";import w from"node:path";var ee="ORACLE-LOCAL-VAULT",te=1,A=Object.freeze({N:1<<17,r:8,p:1}),Fe=256*1024*1024,De=16*1024;function N(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 re(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 _e(r,n,32,{...t,maxmem:Fe})}function ne(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=L(32),o=L(12),a={magic:ee,version:te,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=re(n,i);try{let l=Be("aes-256-gcm",c,o);l.setAAD(Buffer.from(JSON.stringify(a)));let u=Buffer.concat([l.update(r),l.final()]);return{...a,ciphertext:u.toString("base64"),tag:l.getAuthTag().toString("base64")}}finally{c.fill(0),r.fill(0)}}function F(e,n){if(e?.magic!==ee||e?.version!==te)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(d=>!["address","addresses","kind","createdAt"].includes(d))||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(d=>!t.includes(d)))throw new Error("local-vault: unexpected vault field");let r=N(e.kdf.salt,32,"salt"),i=N(e.cipher.iv,12,"iv"),o=N(e.tag,16,"tag"),a=N(e.ciphertext,1,"ciphertext",{max:De}),{ciphertext:c,tag:l,...u}=e,f=re(n,r);try{let d=Pe("aes-256-gcm",f,i);return d.setAAD(Buffer.from(JSON.stringify(u))),d.setAuthTag(o),Buffer.concat([d.update(a),d.final()])}catch{throw new Error("local-vault: wrong passphrase or tampered vault")}finally{f.fill(0)}}function Me(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 oe(e){let n=w.dirname(e),t=s.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=s.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 h(e){let n;try{n=s.openSync(e,s.constants.O_RDONLY|s.constants.O_NOFOLLOW)}catch(t){throw t.code==="ELOOP"?new Error("local-vault: refusing symlink"):t}try{let t=s.fstatSync(n);if(Me(t),t.size>1024*1024)throw new Error("local-vault: secret source changed or is too large");let r=s.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 s.readFileSync(n,"utf8").replace(/[\r\n]+$/,"")}finally{s.closeSync(n)}}function D(e){return JSON.parse(h(e))}function ie(e,n){s.mkdirSync(w.dirname(e),{recursive:!0,mode:448}),oe(e);let t=w.join(w.dirname(e),`.${w.basename(e)}.${process.pid}.${L(6).toString("hex")}.tmp`),r;try{r=s.openSync(t,s.constants.O_CREAT|s.constants.O_EXCL|s.constants.O_WRONLY|s.constants.O_NOFOLLOW,384),s.writeFileSync(r,JSON.stringify(n,null,2)+`
2
+ `),s.fsyncSync(r),s.closeSync(r),r=void 0;let i=s.openSync(t,s.constants.O_RDONLY|s.constants.O_NOFOLLOW),o;try{o=s.fstatSync(i)}finally{s.closeSync(i)}let a=s.lstatSync(w.dirname(e));if(o.nlink!==1||o.dev!==a.dev||o.uid!==process.getuid?.())throw new Error("local-vault: unsafe temporary file");s.renameSync(t,e),s.chmodSync(e,384);let c=s.openSync(w.dirname(e),"r");try{s.fsyncSync(c)}finally{s.closeSync(c)}}catch(i){if(r!==void 0)try{s.closeSync(r)}catch{}try{s.unlinkSync(t)}catch{}throw i}return e}function y(e,n){s.mkdirSync(w.dirname(e),{recursive:!0,mode:448}),oe(e);let t=w.join(w.dirname(e),`.${w.basename(e)}.${process.pid}.${L(6).toString("hex")}.tmp`);try{let r=s.openSync(t,s.constants.O_CREAT|s.constants.O_EXCL|s.constants.O_WRONLY|s.constants.O_NOFOLLOW,384);try{s.writeFileSync(r,String(n)),s.fsyncSync(r)}finally{s.closeSync(r)}s.renameSync(t,e),s.chmodSync(e,384);let i=s.openSync(w.dirname(e),"r");try{s.fsyncSync(i)}finally{s.closeSync(i)}}catch(r){try{s.unlinkSync(t)}catch{}throw r}}import p from"node:path";import Ot from"node:os";import{createHash as Ct,randomBytes as Is}from"node:crypto";import{Interface as X,keccak256 as Ts}from"ethers";import{Transaction as Cs}from"@scure/btc-signer";import{ed25519 as Ls}from"@noble/curves/ed25519.js";import{base58 as mi}from"@scure/base";import{Interface as de}from"ethers";import{Interface as We,MaxUint256 as kr,isAddress as Tr,keccak256 as Or,toUtf8Bytes as Cr}from"ethers";import{Interface as Ue,isAddress as sr}from"ethers";import{isAddress as tr}from"ethers";var dr=new Ue(["function approve(address spender,uint256 amount) returns (bool)"]);import{Interface as ze,isAddress as mr}from"ethers";var yr=new ze(["function approve(address spender,uint256 amount) returns (bool)"]),Er=Object.freeze({42161:"0x1c3fa76e6e1088bce750f23a5bfcffa1efef6a41",43114:"0x8f550e53dfe96c055d5bdb267c21f268fcaf63b2"});var Pr=new We(["function approve(address spender,uint256 amount) returns (bool)"]);var Fr=300*1e3,Dr=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})();import{Address as zr,NETWORK as Wr,OutScript as Hr,RawTx as Jr,SigHash as Gr,TEST_NETWORK as Vr,Transaction as Kr}from"@scure/btc-signer";import{createHash as He}from"node:crypto";import{base58 as Zr}from"@scure/base";import{getCompiledTransactionMessageDecoder as tn}from"@solana/transaction-messages";var ae=e=>He("sha256").update(`global:${e}`).digest().subarray(0,8).toString("hex"),rn=new Map([[ae("route"),{name:"route",prefixBytes:0}],[ae("shared_accounts_route"),{name:"shared_accounts_route",prefixBytes:1}]]);var dn=64*1024;var Sn=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"}),An=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 kn="0x"+"00".repeat(32);var Ge=Object.freeze([["salt","uint256"],["maker","address"],["signer","address"],["tokenId","uint256"],["makerAmount","uint256"],["takerAmount","uint256"],["side","uint8"],["signatureType","uint8"],["timestamp","uint256"],["metadata","bytes32"],["builder","bytes32"]]),Ln=Object.freeze(Ge.map(e=>e[0]));import{TypedDataEncoder as co,getAddress as uo}from"ethers";import{TypedDataEncoder as _n,getAddress as Fn,isAddress as Dn}from"ethers";var Ke=Object.freeze({1:"0x111111125421cA6dc452d289314280a0f8842A65",8453:"0x111111125421cA6dc452d289314280a0f8842A65",42161:"0x111111125421cA6dc452d289314280a0f8842A65",10:"0x111111125421cA6dc452d289314280a0f8842A65",137:"0x111111125421cA6dc452d289314280a0f8842A65",56:"0x111111125421cA6dc452d289314280a0f8842A65"}),Xe=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 Kn,getAddress as Xn,isAddress as Yn}from"ethers";var jn=Object.freeze({READ:"read",PREPARE:"prepare",EXECUTE:"execute",AUTONOMOUS:"autonomous"});var Ye=Object.freeze({1:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",100:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",42161:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",8453:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41"}),oo=Object.freeze({1:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",100:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",42161:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",8453:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110"});var Qe=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"}]}),io=Object.freeze({OrderCancellations:[{name:"orderUids",type:"bytes[]"}]});var po=Object.freeze(["https://limit-orders.1inch.io","https://api.1inch.dev/orderbook"]);var ot=new Set(["evm","evm-swap","evm-bridge","evm-nft","evm-order","btc","sol","hl","poly","lighter"]);var No=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 it=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"}}),Lo=Object.freeze({"0x161ac21f":{provider:"opensea-nft",action:"mint",layout:"seadrop-mint-public"},"0xc2f6663a":{provider:"opensea-nft",action:"mint",layout:"seadrop-mint-allowlist"}}),$o=new de(["function buySpecificNFT(uint256 tokenId,uint256 maxCost) payable","function sellNFT(uint256 tokenId,uint256 minPayout) payable"]),Ro=new de(["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"]),Bo=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 at=Object.freeze([...ot]),Po=Object.freeze({...it});import{ed25519 as Yo}from"@noble/curves/ed25519.js";import{base58 as Zo}from"@scure/base";import{RawTx as ti,SigHash as ri,Transaction as ni}from"@scure/btc-signer";import{Transaction as ii,keccak256 as ai,verifyTypedData as si}from"ethers";import{encode as Do}from"@msgpack/msgpack";import{keccak256 as qo,verifyTypedData as jo}from"ethers";var Uo=Object.freeze({name:"Exchange",version:"1",chainId:1337,verifyingContract:"0x0000000000000000000000000000000000000000"}),zo=Object.freeze({Agent:[{name:"source",type:"string"},{name:"connectionId",type:"bytes32"}]});var ki=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 lt,randomBytes as qi,timingSafeEqual as dt}from"node:crypto";import ft from"node:fs";import x from"node:path";import{homedir as z}from"node:os";import{join as W}from"node:path";var pe=process.env.ORACLE_PUBLIC_DESKTOP==="1",ut=pe?process.env.ORACLE_CONFIG_DIR||W(z(),".config","oracle"):W(z(),".config","oracle"),Ni=pe?ut:W(z(),".config","mad-desk");var Pi="0".repeat(64),_i=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 R(e){return e==null?"null":typeof e!="object"?JSON.stringify(e):Array.isArray(e)?"["+e.map(R).join(",")+"]":"{"+Object.keys(e).sort().map(t=>JSON.stringify(t)+":"+R(e[t])).join(",")+"}"}var Fi=Promise.resolve();function pt(e,n){if(!e)throw new Error("ledger: separate freshness anchor required");let t=a=>{try{return ft.realpathSync(a)}catch{return x.resolve(a)}},r=t(x.dirname(x.resolve(e))),i=t(x.dirname(x.resolve(n))),o=(a,c)=>c===a||c.startsWith(a+x.sep);if(o(r,i)||o(i,r))throw new Error("ledger: separate freshness anchor required")}var H=(e,n)=>lt("sha256",n).update(R(e)).digest("hex"),mt=(e,n)=>{let t=Buffer.from(String(e)),r=Buffer.from(String(n));return t.length===r.length&&dt(t,r)};function wt(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:H(r,n)}}}function me(e,n){if(!e)throw new Error("policy: sequence anchor required");let t;try{t=h(e)}catch{return{sequence:0,present:!1}}let r;try{r=JSON.parse(t)}catch{throw new Error("policy: sequence anchor is unreadable")}if(!mt(r?.integrity?.mac,H(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 ht(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=me(e,t);o=c.present&&c.ledgerInitialized===!0}catch{o=!1}let a={policySequence:Number(n),policyMac:String(r)};o&&(a.ledgerInitialized=!0),y(e,JSON.stringify({marker:a,integrity:{algorithm:"hmac-sha256-canonical-json-v1",mac:H(a,t)}})+`
3
+ `)}function we(e,n,t,{sequenceAnchorFile:r}={}){let i=h(n);if(!r)throw new Error("policy: sequence anchor required");let o=me(r,i);pt(r,e);let a=Number(o.sequence||0)+1,c=wt(t,i,{sequence:a});ht(r,a,i,c?.integrity?.mac??null),y(e,JSON.stringify(c,null,2)+`
4
+ `)}import{readFileSync as Yi,readdirSync as Qi,existsSync as gt}from"node:fs";import{dirname as yt,join as I}from"node:path";import{fileURLToPath as Et}from"node:url";var k=yt(Et(import.meta.url));function bt(){let e=[I(k,"descriptors"),I(k,"clear-sign","descriptors"),I(k,"..","clear-sign","descriptors"),I(k,"..","..","clear-sign","descriptors"),I(k,"..","..","..","clear-sign","descriptors")];for(let n of e)if(gt(n))return n;return e[0]}var ra=bt();var na=(1n<<256n)-1n;import{Wallet as J}from"ethers";import{base58 as G}from"@scure/base";import{ed25519 as Ee}from"@noble/curves/ed25519.js";import{NETWORK as be,TEST_NETWORK as xe,WIF as xt,p2wpkh as he}from"@scure/btc-signer";import{pubECDSA as St}from"@scure/btc-signer/utils.js";var B=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},ge=e=>{let n=String(e||"").trim();try{let t=Buffer.from(G.decode(n));return G.encode(t)===n?t:null}catch{return null}},V=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(Ee.getPublicKey(n));if(!t.equals(r))throw new Error("sol: supplied public key does not match seed")}return n},ye=e=>!(e instanceof Uint8Array)||e.length!==32&&e.length!==64?null:Buffer.from(e.subarray(0,32)),g=(e,n)=>{if(n==="sol")return V(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`)},vt=(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[be,xe])try{return Buffer.from(xt(o).decode(t))}catch{}if(e==="sol"){if(/^hex:/i.test(t)){let u=B(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=ge(t.slice(7));if(!ye(u))throw new Error("sol: invalid explicit base58 private key");return V(u)}if(/^0x/i.test(t)){let u=B(t);if(!u)throw new Error("sol: invalid explicit hex private key");return g(u,"sol")}let o=B(t),a=o&&(o.length===32||o.length===64)?g(o,"sol"):null,c=ge(t),l=ye(c);if(a&&l&&!a.equals(l))throw new Error("sol: ambiguous private key format; prefix with hex: or base58:");if(l)return V(c);if(o)return g(o,"sol")}let r=B(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 vt(o,e);let a=o.privateKey??o.secretKey??o.key;if(a)return S(e,Array.isArray(a)?JSON.stringify(a):String(a))}throw new Error(`${e}: unsupported private key format`)}function T(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=St(t);return{kind:e,secret:t.toString("hex"),addresses:[he(r,be).address,he(r,xe).address]}}if(e==="sol"){let t=g(n,"sol");return{kind:e,secret:t.toString("hex"),addresses:[G.encode(Ee.getPublicKey(t))]}}throw new Error(`unsupported signer kind ${e}`)}function K(e,n={}){let t=Buffer.isBuffer(e)?e.toString("utf8"):String(e||"");if(String(n.kind||"")!=="multichain")return{[n.kind||"evm"]:T(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]=T(o,S(o,r[o])));if(r.cex!==void 0){if(!r.cex||typeof r.cex!="object"||Array.isArray(r.cex))throw new Error("local-vault: cex credential records invalid");i.cex={};for(let[o,a]of Object.entries(r.cex)){if(!/^[A-Za-z0-9._-]{1,64}$/.test(o)||!a||typeof a!="object")throw new Error("local-vault: cex credential record invalid");if(!/^(?:binance|bybit|okx|coinbase)$/.test(a.venue)||!/^[A-Za-z0-9._-]{1,64}$/.test(a.accountId||""))throw new Error("local-vault: cex credential binding invalid");let c=(u,f=!0)=>{let d=a[u];if(!(!f&&d===void 0)){if(!Array.isArray(d)||d.length<4||d.some(_=>!Number.isInteger(_)||_<0||_>255))throw new Error("local-vault: cex credential bytes invalid");return Buffer.from(d)}},l=a.apiSecretEncoding;if(l!==(a.venue==="coinbase"?"base64":"raw"))throw new Error("local-vault: explicit cex secret encoding refused");i.cex[o]=Object.freeze({venue:a.venue,accountId:a.accountId,apiKeyBytes:c("apiKeyBytes"),apiSecretBytes:c("apiSecretBytes"),apiSecretEncoding:l,passphraseBytes:c("passphraseBytes",!1)})}if(!Object.keys(i.cex).length)throw new Error("local-vault: empty cex credential records refused");Object.freeze(i.cex)}if(!Object.keys(i).length)throw new Error("local-vault: multichain vault is empty");return i}function Se(e){let n={};for(let t of["evm","btc","sol"])e[t]&&(n[t]=t==="evm"?e[t].secret:`0x${e[t].secret}`);return e.cex&&(n.cex=Object.fromEntries(Object.entries(e.cex).map(([t,r])=>[t,{venue:r.venue,accountId:r.accountId,apiKeyBytes:[...r.apiKeyBytes],apiSecretBytes:[...r.apiSecretBytes],apiSecretEncoding:r.apiSecretEncoding,...r.passphraseBytes?{passphraseBytes:[...r.passphraseBytes]}:{}}]))),Buffer.from(JSON.stringify(n))}function Ae(e){let n={};for(let[t,r]of Object.entries(e))r?.addresses&&(n[t]=r.addresses);return{kind:"multichain",address:null,addresses:n}}var ya=Object.freeze(["spot-limit-create","spot-limit-cancel","spot-order-status"]),Ea=Object.freeze(["binance","bybit","okx","coinbase"]),ba=Object.freeze({binance:"https://api.binance.com",bybit:"https://api.bybit.com",okx:"https://openapi.okx.com",coinbase:"https://api.exchange.coinbase.com"}),xa=Object.freeze({binance:"/api/v3",bybit:"/v5/order",okx:"/api/v5/trade",coinbase:"/orders"}),Sa=Object.freeze(["version","surface","kind","venue","credentialRef","symbol","base","quote","side","baseSize","limitPrice","maxQuoteNotional","timeInForce","clientOrderId","expiresAtMs","venueOrderId","nonce","grantId","artifactHash"]),Aa=Object.freeze(["market-create","withdraw","transfer","subaccount","leverage","futures","margin","convert","api-key"]),va=Object.freeze(["url","host","path","method","headers","signature","apiKey","apiSecret","passphrase","privateKey","redirect","proxy"]),Ia=Object.freeze(["ccxt","binance-api-node","node-binance-api","coinbase-advanced-node","@okx-dex/okx-dex-sdk","bybit-api"]),ka=Object.freeze({perOrderQuote:"sealed-owner-policy",dailyGrossQuote:"sealed-owner-policy",scope:Object.freeze(["per-order","UTC-day","account","venue","quote"]),envelopeFieldIsNotCeiling:!0}),Ta=Object.freeze({binanceRecvWindowMs:5e3,bybitWindowMs:5e3,maxLocalSkewMs:2e3}),Oa=Object.freeze({perSecond:1,perMinute:30,bind:"tighter"});var Tt=Object.freeze({binance:Object.freeze({create:["POST","/api/v3/order"],cancel:["DELETE","/api/v3/order"],status:["GET","/api/v3/order"]}),bybit:Object.freeze({create:["POST","/v5/order/create"],cancel:["POST","/v5/order/cancel"],status:["GET","/v5/order/realtime"]}),okx:Object.freeze({create:["POST","/api/v5/trade/order"],cancel:["POST","/api/v5/trade/cancel-order"],status:["GET","/api/v5/trade/order"]}),coinbase:Object.freeze({create:["POST","/orders"],cancel:["DELETE","/orders/{order_id}"],status:["GET","/orders/{order_id}"]})}),ve=Object.freeze({binance:"https://api.binance.com",bybit:"https://api.bybit.com",okx:"https://openapi.okx.com",coinbase:"https://api.exchange.coinbase.com"});var Da=256*1024;var ic=new X(["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"]),ac=new X(["function decimals() view returns (uint8)","function allowance(address owner,address spender) view returns (uint256)"]),sc=new X(["function ownerOf(uint256 tokenId) view returns (address)","function getApproved(uint256 tokenId) view returns (address)","function isApprovedForAll(address owner,address operator) view returns (bool)"]);function Ie(e){let n=process.env.ORACLE_SIGNER_STATE_DIR||p.join(process.env.XDG_STATE_HOME||p.join(Ot.homedir(),".local","state"),"oracle"),t=Ct("sha256").update(p.resolve(e)).digest("hex").slice(0,16);return{vault:p.join(e,"vault.json"),policy:p.join(e,"signer-policy.json"),policyKey:p.join(e,"policy-integrity-key"),policyAnchor:p.join(n,`signer-policy-${t}.high-water`),ledger:p.join(e,"signer-ledger.json"),ledgerAnchor:p.join(n,`signer-ledger-${t}.high-water`),cexOrders:p.join(e,"cex-orders.json"),cexOrdersAnchor:p.join(n,`cex-orders-${t}.high-water`),token:p.join(e,"signer-token"),lock:p.join(n,`signer-${t}.lock`)}}import{randomBytes as Nt}from"node:crypto";import{Wallet as Lt}from"ethers";var ke=`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 @@ var Ie=(e,n,t)=>()=>{if(t)throw t[0];try{return e&&(n=e(e=0)),n}catch(r){throw t
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.`,R=(e,n)=>{let t=e.indexOf(n);return t>=0?e[t+1]:null},Nt=e=>{let n=String(R(e,"--kind")||"evm").toLowerCase();if(!["evm","btc","sol"].includes(n))throw new Error("import requires --kind evm|btc|sol");return n};async function Lt(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){a(),r(new Error("cancelled"));return}if(l===13||l===10){a(),process.stderr.write(`
15
- `),t(i);return}l===127?i=i.slice(0,-1):i+=String.fromCharCode(l)}},a=()=>{process.stdin.off("data",o),process.stdin.setRawMode(!1),process.stdin.pause()};process.stdin.on("data",o)})}async function $t(e,n){let t=R(e,"--passphrase-file");return t?h(t):Lt("Vault passphrase: ",n)}function Rt(e){return e.addresses.join(", ")}async function Bt(e=[],n={}){let t=n.out||process.stdout,r=e[0],i=n.configDir||T(),o=Ae(K.join(i,"signer"));if(!r||r==="help")return t.write(ve+`
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},$t=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 Rt(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){a(),r(new Error("cancelled"));return}if(l===13||l===10){a(),process.stderr.write(`
15
+ `),t(i);return}l===127?i=i.slice(0,-1):i+=String.fromCharCode(l)}},a=()=>{process.stdin.off("data",o),process.stdin.setRawMode(!1),process.stdin.pause()};process.stdin.on("data",o)})}async function Bt(e,n){let t=P(e,"--passphrase-file");return t?h(t):Rt("Vault passphrase: ",n)}function Pt(e){return e.addresses.join(", ")}async function _t(e=[],n={}){let t=n.out||process.stdout,r=e[0],i=n.configDir||C(),o=Ie(Y.join(i,"signer"));if(!r||r==="help")return t.write(ke+`
16
16
  `),0;if(r==="status")return t.write(JSON.stringify({initialized:m.existsSync(o.vault),policyConfigured:m.existsSync(o.policy),armed:m.existsSync(o.vault)&&!m.existsSync(o.lock),disarmed:m.existsSync(o.lock)})+`
17
- `),0;if(r==="lock")return m.mkdirSync(K.dirname(o.lock),{recursive:!0,mode:448}),y(o.lock,`locked
17
+ `),0;if(r==="lock")return m.mkdirSync(Y.dirname(o.lock),{recursive:!0,mode:448}),y(o.lock,`locked
18
18
  `),t.write(`Local signer locked.
19
19
  `),0;if(r==="doctor"){let u=[];return m.existsSync(o.vault)||u.push("vault missing"),m.existsSync(o.policy)||u.push("policy missing (empty allowlists fail closed)"),t.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(!m.existsSync(o.vault)||!m.existsSync(o.policyKey))throw new Error("initialize the local signer before sealing policy");let u=R(e,"--policy-file");if(!u)throw new Error("policy requires --policy-file <0600 JSON file>");let f;try{f=JSON.parse(h(u))}catch{throw new Error("policy file must contain valid JSON")}for(let d of["surfaces","actions","chains","destinations","owners"])if(!Array.isArray(f[d])||f[d].length===0)throw new Error(`policy: ${d} allowlist is empty`);return pe(o.policy,o.policyKey,f,{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 a=await $t(e,n),c={};if(m.existsSync(o.vault)){if(r==="init")throw new Error("local signer vault already exists");let u=_(o.vault),f=P(u,a);try{c=G(f,u.meta)}finally{f.fill(0)}}if(r==="init"){let u=Ct.createRandom();c.evm=I("evm",S("evm",u.privateKey))}else{let u=Nt(e),f=R(e,"--key-file");if(!f)throw new Error("import requires --key-file <0600 file>");c[u]=I(u,S(u,h(f)))}m.mkdirSync(K.dirname(o.vault),{recursive:!0,mode:448}),ne(o.vault,te(be(c),a,xe(c))),m.existsSync(o.policyKey)||y(o.policyKey,Ot(32).toString("hex")+`
23
- `);let l=Object.entries(c).map(([u,f])=>`${u}:${Rt(f)}`).join(" ");return t.write(`Encrypted local vault initialized for ${l}. Configure sealed policy rails before starting a signer session.
24
- `),0}var pc={name:"sign",summary:"manage the encrypted self-hosted signing vault",usage:ve,run:e=>Bt(e.argv||[])};export{pc as default,Bt as run};
21
+ `),u.length?1:0}if(r==="policy"){if(!m.existsSync(o.vault)||!m.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 f;try{f=JSON.parse(h(u))}catch{throw new Error("policy file must contain valid JSON")}for(let d of["surfaces","actions","chains","destinations","owners"])if(!Array.isArray(f[d])||f[d].length===0)throw new Error(`policy: ${d} allowlist is empty`);return we(o.policy,o.policyKey,f,{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 a=await Bt(e,n),c={};if(m.existsSync(o.vault)){if(r==="init")throw new Error("local signer vault already exists");let u=D(o.vault),f=F(u,a);try{c=K(f,u.meta)}finally{f.fill(0)}}if(r==="init"){let u=Lt.createRandom();c.evm=T("evm",S("evm",u.privateKey))}else{let u=$t(e),f=P(e,"--key-file");if(!f)throw new Error("import requires --key-file <0600 file>");c[u]=T(u,S(u,h(f)))}m.mkdirSync(Y.dirname(o.vault),{recursive:!0,mode:448}),ie(o.vault,ne(Se(c),a,Ae(c))),m.existsSync(o.policyKey)||y(o.policyKey,Nt(32).toString("hex")+`
23
+ `);let l=Object.entries(c).map(([u,f])=>`${u}:${Pt(f)}`).join(" ");return t.write(`Encrypted local vault initialized for ${l}. Configure sealed policy rails before starting a signer session.
24
+ `),0}var yc={name:"sign",summary:"manage the encrypted self-hosted signing vault",usage:ke,run:e=>_t(e.argv||[])};export{yc as default,_t as run};