pragma-openclaw 0.1.5 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/server/index.js +1 -1
package/package.json
CHANGED
package/server/index.js
CHANGED
|
@@ -212,7 +212,7 @@ Format: EventName(param1, param2, ...)
|
|
|
212
212
|
- \u2713 Verified source code - if verified is true
|
|
213
213
|
- \u26A0\uFE0F Unverified - if verified is false`,$ze.shape,async t=>{let n=await Mze(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function Mze(e){try{if(!/^0x[a-fA-F0-9]{40}$/.test(e.address))return{success:!1,message:"Invalid address",error:"Address must be 42 characters (0x + 40 hex chars). Example: 0x760AfE86e5de5fa0Ee542fc7B7B713e1c5425701"};let t=await q();if(!t||!Pe(t))return{success:!1,message:"Wallet not configured",error:"Please run setup_wallet first to create your pragma wallet"};if(!await Ct())return{success:!1,message:"x402 mode required",error:"explain_contract requires x402 mode. Run set_mode with mode='x402' first. This tool uses server infrastructure for contract analysis and ABI resolution."};let r=t.network.chainId,a=`${gn()}/${r}/contract/${e.address}`,s=await dt(a,{method:"GET",headers:{Accept:"application/json"}});if(!s.ok){if(s.status===404)return{success:!1,message:"Contract not found",error:`Contract ${e.address} not found or not verified on chain ${r}.`};let p=await s.text();return{success:!1,message:`API error (${s.status})`,error:p||`HTTP ${s.status}`}}let o=await s.json();if(!o.success||!o.contract)return{success:!1,message:"Failed to analyze contract",error:o.error||"Unknown API error"};let i=o.contract,u={address:i.address||e.address,name:i.name||"Unknown Contract",verified:i.verified??!1,abi:i.abi,sourceCode:i.sourceCode,compiler:i.compiler,isProxy:i.isProxy??!1,implementation:i.implementation,interfaces:i.interfaces||[],explorerUrl:i.explorerUrl,updatedAt:i.analyzedAt},d=u.isProxy?` (Proxy \u2192 ${u.implementation?.name||"Unknown Implementation"})`:"";return{success:!0,message:`${u.verified?"\u2713":"\u26A0\uFE0F Unverified"} Contract analyzed: ${u.name}${d}`,contract:u}}catch(t){let n=t instanceof Error?t.message:"Unknown error";return n.includes("Payment rejected")?{success:!1,message:"Payment failed",error:"x402 payment was rejected. Check your session key USDC balance with check_session_key_balance."}:{success:!1,message:"Failed to analyze contract",error:n}}}Y();Te();var Dze=C.object({token:C.string().describe("Token address to check graduation status. Must be a 0x address. Use this to determine whether to use nad.fun tools or regular swap tools.")});function lae(e){e.tool("nadfun_status","Check if a token has graduated from nad.fun bonding curve. Returns graduation status, progress percentage, and trading venue. CRITICAL: Always call this before nadfun_buy/nadfun_sell to verify the token is still on the bonding curve. If graduated, use regular swap tools instead.",Dze.shape,async t=>{let n=await Oze(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function Oze(e){try{let t=await q();if(!t||!Pe(t))return{success:!1,message:"Wallet not configured",error:"Please run setup_wallet first to create your pragma wallet"};let n;try{n=xe(e.token)}catch{return{success:!1,message:"Invalid token address",error:"Token must be a valid 0x address"}}let r=t.network.chainId,a=await ji(n,r),s;a.isGraduated?s="Token has graduated to DEX. Use regular swap tools (get_swap_quote + execute_swap).":a.isLocked?s="Token is locked during graduation. Wait for graduation to complete before trading.":s="Token is on the bonding curve. Use nad.fun tools (nadfun_quote, nadfun_buy, nadfun_sell).";let o=a.tokenSymbol||"Token",i;return a.isGraduated?i=`${o} has graduated from nad.fun and now trades on DEX`:a.isLocked?i=`${o} is currently locked (graduation in progress)`:i=`${o} is on nad.fun bonding curve at ${a.progressPercent} progress`,{success:!0,message:i,status:{token:a.token,tokenSymbol:a.tokenSymbol,tokenName:a.tokenName,isGraduated:a.isGraduated,isLocked:a.isLocked,progress:a.progress,progressPercent:a.progressPercent,availableTokens:a.availableTokens,requiredMon:a.requiredMon,tradingVenue:a.tradingVenue},recommendation:s}}catch(t){let n=t instanceof Error?t.message:"Unknown error";return n.includes("not supported on chain")?{success:!1,message:"nad.fun not available",error:n}:{success:!1,message:"Failed to check token status",error:n}}}Y();Te();var Nze=C.object({token:C.string().describe("Token address on nad.fun bonding curve. Must be a 0x address."),amount:C.string().describe("Amount to trade. Normal mode: input amount (MON for buy, tokens for sell). Exact output mode: desired output amount (tokens for buy, MON for sell). Examples: '1.5' for 1.5 units, '500' for 500 units."),isBuy:C.boolean().describe("true = buy tokens with MON, false = sell tokens for MON"),slippageBps:C.number().optional().describe(`Slippage tolerance in basis points. Default: ${ic} (5%). Max: ${V6} (50%).`),exactOutput:C.boolean().optional().describe("If true, 'amount' is the desired OUTPUT (e.g., 'buy me 500 tokens'). Calculates required input. Default: false (amount is the input).")});function pae(e){e.tool("nadfun_quote","Get a price quote for buying or selling tokens on nad.fun bonding curve. Returns expected output, minimum output (after slippage), and current graduation progress. Quote is valid for 5 minutes. Use the quoteId with nadfun_buy or nadfun_sell to execute.",Nze.shape,async t=>{let n=await Lze(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function Lze(e){try{let t=await q();if(!t||!Pe(t))return{success:!1,message:"Wallet not configured",error:"Please run setup_wallet first to create your pragma wallet"};let n;try{n=xe(e.token)}catch{return{success:!1,message:"Invalid token address",error:"Token must be a valid 0x address"}}let r,a=e.exactOutput??!1;try{r=ye(e.amount,18)}catch{return{success:!1,message:"Invalid amount",error:"Amount must be a valid number (e.g., '1.5', '1000')"}}if(r<=0n)return{success:!1,message:"Invalid amount",error:"Amount must be greater than 0"};let s=t.network.chainId,o=t.wallet.smartAccountAddress,i=e.slippageBps??ic,{quote:u,warning:d}=await ure({token:n,amount:r,isBuy:e.isBuy,slippageBps:i,chainId:s,sender:o,exactOutput:a}),l=dre(u),p=l>60?`${Math.floor(l/60)}m ${l%60}s`:`${l}s`,y=e.isBuy?"Buy":"Sell",m=e.isBuy?`${u.amountIn} MON`:`${u.amountIn} tokens`,g=e.isBuy?`${u.expectedOutput} tokens`:`${u.expectedOutput} MON`;return{success:!0,message:`${y} quote: ${m} \u2192 ${g} (min: ${u.minOutput})`,quote:{quoteId:u.quoteId,token:u.token,tokenSymbol:u.tokenSymbol,direction:u.direction,amountIn:u.amountIn,expectedOutput:u.expectedOutput,minOutput:u.minOutput,slippageBps:u.slippageBps,progress:u.progress.toString(),progressPercent:u.progressPercent,expiresIn:p},warning:d}}catch(t){let n=t instanceof Error?t.message:"Unknown error";return n.includes("graduated")?{success:!1,message:"Token has graduated",error:n}:n.includes("locked")?{success:!1,message:"Token is locked",error:n}:n.includes("not supported on chain")?{success:!1,message:"nad.fun not available",error:n}:{success:!1,message:"Failed to get quote",error:n}}}Te();Y();D0();Te();mt();We();Ar();async function mae(e){let t=await q();if(!t?.wallet)return{success:!1,error:"Wallet not configured. Please run setup_wallet first."};let n=po(e);if(!n)return{success:!1,error:"Quote not found. Please get a fresh quote with nadfun_quote."};if(mo(n))return Gi(e),{success:!1,error:"Quote has expired. Please get a fresh quote with nadfun_quote."};if(n.direction!=="BUY")return{success:!1,error:"This quote is for selling, not buying. Use nadfun_sell instead."};let r=qi(e);if(!r)return{success:!1,error:"Execution data missing. Please get a fresh quote."};let a=t.wallet.smartAccountAddress,s=t.wallet.sessionKeyAddress,o=t.network.chainId,i=Qe(o),u=await we(t),d=Ee(o,u),l=_e({chain:d,transport:Ze(u,t)}),p=await ht();if(!p)return{success:!1,error:"Session key not found. Please run setup_wallet first."};let y=await l.getBalance({address:s}),m=lo("swap");if(y<m)return{success:!1,error:`Session key balance too low. Have: ${G0(y)}, Need ~${G0(m)}. Please fund session key first.`};let g=await Tn(l,a),h=_0e({router:r.router,delegator:a,sessionKey:s,nonce:g,chainId:o,calldata:r.calldata,value:r.value}),w=`Buy ${n.expectedOutput} tokens with ${n.amountIn} MON on nad.fun`,v=await _n(h.delegation,o,t.wallet.keyId,w);h.delegation.signature=v;let T=on(p),A=Tt({account:T,chain:d,transport:Ze(u,t)});try{let _=await dn(A,l,Ue.delegationManager,[{permissionContext:[h.delegation],executions:[Pt({target:r.router,value:r.value,callData:r.calldata})],mode:nn.SingleDefault}]);return(await Xt(l,_)).status==="reverted"?{success:!1,txHash:_,error:"Transaction reverted on-chain"}:(Gi(e),{success:!0,txHash:_,explorerUrl:`${i.blockExplorer}/tx/${_}`,tokensTraded:n.expectedOutput,monAmount:n.amountIn})}catch(_){return{success:!1,error:`Transaction failed: ${_ instanceof Error?_.message:"Unknown error"}`}}}async function bae(e){let t=await q();if(!t?.wallet)return{success:!1,error:"Wallet not configured. Please run setup_wallet first."};let n=po(e);if(!n)return{success:!1,error:"Quote not found. Please get a fresh quote with nadfun_quote."};if(mo(n))return Gi(e),{success:!1,error:"Quote has expired. Please get a fresh quote with nadfun_quote."};if(n.direction!=="SELL")return{success:!1,error:"This quote is for buying, not selling. Use nadfun_buy instead."};let r=qi(e);if(!r)return{success:!1,error:"Execution data missing. Please get a fresh quote."};let a=t.wallet.smartAccountAddress,s=t.wallet.sessionKeyAddress,o=t.network.chainId,i=Qe(o),u=await we(t),d=Ee(o,u),l=_e({chain:d,transport:Ze(u,t)}),p=await ht();if(!p)return{success:!1,error:"Session key not found. Please run setup_wallet first."};let y=await l.getBalance({address:s}),m=lo("swap");if(y<m)return{success:!1,error:`Session key balance too low. Have: ${G0(y)}, Need ~${G0(m)}. Please fund session key first.`};let g=await Tn(l,a),h=[],w=await l.readContract({address:n.token,abi:Xe,functionName:"allowance",args:[a,r.router]});if(w<n.amountInWei){if(w>0n){let O=cs({tokenAddress:n.token,spender:r.router,amount:0n,delegator:a,sessionKey:s,nonce:g,chainId:o});h.push({delegation:O.delegation,execution:{target:n.token,value:0n,callData:X({abi:Xe,functionName:"approve",args:[r.router,0n]})},kind:"approve"})}let E=cs({tokenAddress:n.token,spender:r.router,amount:n.amountInWei,delegator:a,sessionKey:s,nonce:g,chainId:o});h.push({delegation:E.delegation,execution:{target:n.token,value:0n,callData:X({abi:Xe,functionName:"approve",args:[r.router,n.amountInWei]})},kind:"approve"})}let v=E0e({router:r.router,delegator:a,sessionKey:s,nonce:g,chainId:o,calldata:r.calldata});h.push({delegation:v.delegation,execution:{target:r.router,value:0n,callData:r.calldata},kind:"nadfun_sell"});for(let E of h){let O=E.kind==="approve"?`Approve ${n.amountIn} tokens for nad.fun`:`Sell ${n.amountIn} tokens for ${n.expectedOutput} MON on nad.fun`,$=await _n(E.delegation,o,t.wallet.keyId,O);E.delegation.signature=$}let T=on(p),A=Tt({account:T,chain:d,transport:Ze(u,t)}),_=h.map(E=>({permissionContext:[E.delegation],executions:[Pt({target:E.execution.target,value:E.execution.value,callData:E.execution.callData})],mode:nn.SingleDefault}));try{let E=await dn(A,l,Ue.delegationManager,_);return(await Xt(l,E)).status==="reverted"?{success:!1,txHash:E,error:"Transaction reverted on-chain"}:(Gi(e),{success:!0,txHash:E,explorerUrl:`${i.blockExplorer}/tx/${E}`,tokensTraded:n.amountIn,monAmount:n.expectedOutput})}catch(E){return{success:!1,error:`Transaction failed: ${E instanceof Error?E.message:"Unknown error"}`}}}t0();var Bze=C.object({quoteId:C.string().describe("Quote ID from nadfun_quote for a BUY operation. The quote must not be expired and must be a BUY direction quote."),agentId:C.string().optional().describe("Sub-agent ID for autonomous execution (no Touch ID). If omitted, uses assistant mode with Touch ID confirmation.")});function yae(e){e.tool("nadfun_buy","Execute a buy on nad.fun bonding curve using a quote. If agentId provided: uses autonomous mode (no Touch ID, pre-signed delegation). If no agentId: uses assistant mode (requires Touch ID confirmation). The quote must be obtained from nadfun_quote with isBuy=true.",Bze.shape,async t=>{let n=await Uze(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function Uze(e){try{let t=await q();if(!t||!Pe(t))return{success:!1,message:"Wallet not configured",error:"Please run setup_wallet first to create your pragma wallet"};if(e.agentId)return await Cre(e.agentId,e.quoteId);if(_t()){let s=po(e.quoteId);if(!s)return{success:!1,message:"Quote not found",error:"Quote not found or expired. Please get a fresh quote with nadfun_quote."};if(mo(s))return{success:!1,message:"Quote expired",error:"Quote has expired. Please get a fresh quote with nadfun_quote."};if(s.direction!=="BUY")return{success:!1,message:"Wrong quote type",error:"This quote is for selling, not buying. Use nadfun_sell instead."};let o=qi(e.quoteId);if(!o)return{success:!1,message:"Execution data missing",error:"Execution data missing. Please get a fresh quote."};let i=await zn({target:o.router,value:o.value,callData:o.calldata},t);return i.success?{success:!0,message:`Successfully bought ${s.expectedOutput} ${s.tokenSymbol} for ${s.amountIn} MON`,transaction:{hash:i.txHash,explorerUrl:i.explorerUrl},trade:{tokenSymbol:s.tokenSymbol,monSpent:s.amountIn,tokensReceived:s.expectedOutput,progress:s.progressPercent}}:{success:!1,message:"Buy failed",error:i.error}}let n=po(e.quoteId);if(!n)return{success:!1,message:"Quote not found",error:"Quote not found or expired. Please get a fresh quote with nadfun_quote."};let r=await mae(e.quoteId);if(!r.success)return{success:!1,message:"Buy failed",error:r.error};let a=n.progressPercent;try{a=(await ji(n.token,t.network.chainId)).progressPercent}catch{}return{success:!0,message:`Successfully bought ${r.tokensTraded} ${n.tokenSymbol} for ${r.monAmount} MON`,transaction:{hash:r.txHash,explorerUrl:r.explorerUrl},trade:{tokenSymbol:n.tokenSymbol,monSpent:r.monAmount,tokensReceived:r.tokensTraded,progress:a}}}catch(t){let n=t instanceof Error?t.message:"Unknown error";return n.includes("Session key balance")?{success:!1,message:"Insufficient gas",error:n}:n.includes("Touch ID")||n.includes("passkey")?{success:!1,message:"Authentication failed",error:"Touch ID authentication was cancelled or failed. Please try again."}:{success:!1,message:"Buy failed",error:n}}}Te();t0();var Hze=C.object({quoteId:C.string().describe("Quote ID from nadfun_quote for a SELL operation. The quote must not be expired and must be a SELL direction quote."),agentId:C.string().optional().describe("Sub-agent ID for autonomous execution (no Touch ID). Note: Sell requires token approval. First sell should use assistant mode to set approval.")});function gae(e){e.tool("nadfun_sell","Execute a sell on nad.fun bonding curve using a quote. If agentId provided: uses autonomous mode (no Touch ID, pre-signed delegation). If no agentId: uses assistant mode (requires Touch ID, handles approval). The quote must be obtained from nadfun_quote with isBuy=false.",Hze.shape,async t=>{let n=await Fze(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function Fze(e){try{let t=await q();if(!t||!Pe(t))return{success:!1,message:"Wallet not configured",error:"Please run setup_wallet first to create your pragma wallet"};if(e.agentId)return await Pre(e.agentId,e.quoteId);if(_t()){let s=po(e.quoteId);if(!s)return{success:!1,message:"Quote not found",error:"Quote not found or expired. Please get a fresh quote with nadfun_quote."};if(mo(s))return{success:!1,message:"Quote expired",error:"Quote has expired. Please get a fresh quote with nadfun_quote."};if(s.direction!=="SELL")return{success:!1,message:"Wrong quote type",error:"This quote is for buying, not selling. Use nadfun_buy instead."};let o=qi(e.quoteId);if(!o)return{success:!1,message:"Execution data missing",error:"Execution data missing. Please get a fresh quote."};let i=await Vi(s.token,o.router,s.amountInWei,{target:o.router,value:o.value,callData:o.calldata},t);return i.success?{success:!0,message:`Successfully sold ${s.amountIn} ${s.tokenSymbol} for ${s.expectedOutput} MON`,transaction:{hash:i.txHash,explorerUrl:i.explorerUrl},trade:{tokenSymbol:s.tokenSymbol,tokensSold:s.amountIn,monReceived:s.expectedOutput,progress:s.progressPercent}}:{success:!1,message:"Sell failed",error:i.error}}let n=po(e.quoteId);if(!n)return{success:!1,message:"Quote not found",error:"Quote not found or expired. Please get a fresh quote with nadfun_quote."};let r=await bae(e.quoteId);if(!r.success)return{success:!1,message:"Sell failed",error:r.error};let a=n.progressPercent;try{a=(await ji(n.token,t.network.chainId)).progressPercent}catch{}return{success:!0,message:`Successfully sold ${r.tokensTraded} ${n.tokenSymbol} for ${r.monAmount} MON`,transaction:{hash:r.txHash,explorerUrl:r.explorerUrl},trade:{tokenSymbol:n.tokenSymbol,tokensSold:r.tokensTraded,monReceived:r.monAmount,progress:a}}}catch(t){let n=t instanceof Error?t.message:"Unknown error";return n.includes("Session key balance")?{success:!1,message:"Insufficient gas",error:n}:n.includes("Touch ID")||n.includes("passkey")?{success:!1,message:"Authentication failed",error:"Touch ID authentication was cancelled or failed. Please try again."}:{success:!1,message:"Sell failed",error:n}}}Te();m0();import{readFile as zze,stat as jze}from"fs/promises";import{extname as qze}from"path";var y$="https://api.nad.fun";async function Q5(e,t){let n=new URL(e,y$);t&&Object.entries(t).forEach(([a,s])=>{s!==void 0&&n.searchParams.set(a,String(s))});let r=await O0(async()=>{let a=await fetch(n.toString(),{method:"GET",headers:{Accept:"application/json"}});if(!a.ok)throw new Error(`nad.fun API error (${a.status}): ${a.statusText}`);return a.json()},{operationName:`nadfun-api-${e}`,maxRetries:2,baseDelayMs:500});if(!r.success)throw new Error(r.error?.message||"nad.fun API request failed");return r.data}async function hae(e,t){let n=new URL(e,y$),r=await O0(async()=>{let a=await fetch(n.toString(),{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify(t)});if(!a.ok){let s=await a.text().catch(()=>a.statusText);throw new Error(`nad.fun API error (${a.status}): ${s}`)}return a.json()},{operationName:`nadfun-post-${e}`,maxRetries:2,baseDelayMs:500});if(!r.success)throw new Error(r.error?.message||"nad.fun API POST request failed");return r.data}function Gze(e){return{".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".webp":"image/webp",".svg":"image/svg+xml"}[e.toLowerCase()]||"application/octet-stream"}function Vze(e){return[".png",".jpg",".jpeg",".webp"].includes(e.toLowerCase())}async function xae(e){let t=qze(e);if(!Vze(t))throw new Error(`Invalid image format '${t}'. Supported: PNG, JPEG, WebP`);let n=await jze(e).catch(()=>null);if(!n)throw new Error(`Image file not found: ${e}`);let r=5*1024*1024;if(n.size>r){let d=(n.size/1024/1024).toFixed(2);throw new Error(`Image exceeds 5MB limit (current: ${d}MB)`)}let a=await zze(e),s=Gze(t),o=new URL("/metadata/image",y$),i=await O0(async()=>{let d=await fetch(o.toString(),{method:"POST",headers:{"Content-Type":s,Accept:"application/json"},body:a});if(!d.ok){let l=await d.text().catch(()=>d.statusText);throw new Error(`Image upload failed (${d.status}): ${l}`)}return d.json()},{operationName:"nadfun-image-upload",maxRetries:2,baseDelayMs:1e3});if(!i.success)throw new Error(i.error?.message||"Image upload failed");let u=i.data;if(u.is_nsfw)throw new Error("Image was flagged as NSFW and rejected by nad.fun");return u.image_uri}async function wae(e){let t={image_uri:e.imageUri,name:e.name,symbol:e.symbol};return e.description&&(t.description=e.description),e.twitter&&(t.twitter=e.twitter),e.telegram&&(t.telegram=e.telegram),e.website&&(t.website=e.website),(await hae("/metadata/metadata",t)).metadata_uri}async function vae(e,t,n,r){return await hae("/token/salt",{creator:e,name:t,symbol:n,metadata_uri:r})}function F7(e){if(!e)return"0.00%";let t=parseFloat(e);return isNaN(t)?"0.00%":t>=0?`+${t.toFixed(2)}%`:`${t.toFixed(2)}%`}function Q6(e){if(!e)return"0.00";let t=parseFloat(e);return isNaN(t)?"0.00":t<1e-4?t.toExponential(2):t<.01?t.toFixed(6):t<1?t.toFixed(4):t.toFixed(2)}function Tae(e){if(!e)return"0";let t=parseFloat(e);return isNaN(t)?"0":t>=1e6?`${(t/1e6).toFixed(2)}M`:t>=1e3?`${(t/1e3).toFixed(2)}K`:t<1e-4?t.toExponential(2):t<1?t.toFixed(6):t.toFixed(2)}function Sae(e){return e===void 0?"0.00%":`${(e/100).toFixed(2)}%`}var Wze=C.object({sortBy:C.enum(["market_cap","new","active","hackathon"]).optional().describe("How to sort: 'market_cap' (default), 'new' (newest), 'active' (most traded), 'hackathon' (Moltiverse hackathon submissions)"),limit:C.number().optional().describe("Max tokens to return (default: 10, max: 50)"),page:C.number().optional().describe("Page number for pagination (default: 1)"),excludeGraduated:C.boolean().optional().describe("If true, only show tokens still on bonding curve (default: false)")});function Aae(e){e.tool("nadfun_discover","Find trending/new tokens on nad.fun bonding curve. Sort by market cap, newest, or most active. Optionally filter to only tokens still on the bonding curve. Works in both BYOK and x402 modes (uses public nad.fun API).",Wze.shape,async t=>{let n=await Xze(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}var Zze={market_cap:"/order/market_cap",new:"/order/creation_time",active:"/order/latest_trade",hackathon:"/order/hackathon"};function Kze(e){let t={address:e.token_info.token_id,symbol:e.token_info.symbol,name:e.token_info.name,imageUri:e.token_info.image_uri||void 0,isGraduated:e.token_info.is_graduated,marketType:e.market_info.market_type,priceUsd:Q6(e.market_info.price_usd),priceChange:F7(e.percent),holderCount:e.market_info.holder_count||0,volume:e.market_info.volume||void 0,createdAt:String(e.token_info.created_at)},n=e.token_info.hackathon_info;return n&&(t.hackathon={teamName:n.team?.name,projectName:n.project?.name,projectDescription:n.project?.description,members:n.team?.members?.map(r=>({twitter:r.twitter||void 0,github:r.github?.url||void 0,githubStars:r.github?.star_count,githubRepos:r.github?.repo_count}))}),t}async function Xze(e){try{let t=await q();if(!t||!Pe(t))return{success:!1,message:"Wallet not configured",error:"Please run setup_wallet first to create your pragma wallet"};let n=e.sortBy||"market_cap",r=Zze[n],a=Math.max(e.page||1,1),s=Math.min(Math.max(e.limit||10,1),50),o=await Q5(r,{page:a,limit:s});if(!o.tokens||o.tokens.length===0)return{success:!0,message:`No tokens found sorted by ${n}`,tokens:[],totalCount:0,page:a};let i=o.tokens.map(Kze);e.excludeGraduated&&(i=i.filter(d=>!d.isGraduated));let u={market_cap:"market cap",new:"creation time (newest first)",active:"recent activity",hackathon:"Moltiverse hackathon"};return{success:!0,message:`Found ${i.length} tokens sorted by ${u[n]}${e.excludeGraduated?" (bonding curve only)":""}`,tokens:i,totalCount:o.total_count,page:a}}catch(t){return{success:!1,message:"Failed to discover tokens",error:t instanceof Error?t.message:"Unknown error"}}}Y();Te();var Jze=C.object({token:C.string().describe("Token address (0x...) to get info for")});function _ae(e){e.tool("nadfun_token_info","Get detailed information about a specific nad.fun token. Returns metadata (name, description, socials), market data (price, volume, holders), and graduation progress if still on bonding curve. Works in both BYOK and x402 modes (uses public nad.fun API).",Jze.shape,async t=>{let n=await Yze(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}function Qze(e,t,n){return e?"Token has graduated to DEX. Use regular swap tools (get_swap_quote + execute_swap).":t?"Token is locked during graduation. Wait for graduation to complete before trading.":n>=9e3?"Token is near graduation (>90% progress). Large trades may trigger graduation. Use nadfun_quote and nadfun_buy/nadfun_sell.":"Token is on bonding curve. Use nadfun_quote and nadfun_buy/nadfun_sell for trading."}async function Yze(e){try{let t=await q();if(!t||!Pe(t))return{success:!1,message:"Wallet not configured",error:"Please run setup_wallet first to create your pragma wallet"};let n;try{n=xe(e.token)}catch{return{success:!1,message:"Invalid token address",error:"Token must be a valid 0x address"}}let[r,a,s]=await Promise.all([Q5(`/token/${n}`),ji(n,t.network.chainId),Q5("/order/latest_trade",{limit:100}).catch(()=>null)]),o=r.token_info;if(!o||!o.token_id)return{success:!1,message:"Token not found",error:`Token ${n} not found on nad.fun. It may not be a nad.fun token.`};let i=s?.tokens?.find(g=>g.token_info.token_id.toLowerCase()===n.toLowerCase()),u,d;typeof o.creator=="object"&&o.creator!==null?(u=o.creator.account_id,d=o.creator.nickname):typeof o.creator=="string"&&(u=o.creator);let l={address:n,symbol:o.symbol,name:o.name,description:o.description||void 0,imageUri:o.image_uri||void 0,isGraduated:a.isGraduated,createdAt:String(o.created_at),creator:u?{address:u,name:d!==u?d:void 0}:void 0,socials:o.twitter||o.telegram||o.website?{twitter:o.twitter||void 0,telegram:o.telegram||void 0,website:o.website||void 0}:void 0,marketType:a.isGraduated?"DEX":"CURVE",priceUsd:i?Q6(i.market_info.price_usd):"N/A",priceNative:i?Q6(i.market_info.price_native):"N/A",totalSupply:i?.market_info.total_supply||void 0,reserveNative:i?.market_info.reserve_native||void 0,reserveToken:i?.market_info.reserve_token||void 0,volume:i?.market_info.volume||void 0,athPrice:i?.market_info.ath_price?Q6(i.market_info.ath_price):void 0,holderCount:i?.market_info.holder_count||0,progress:a.isGraduated?void 0:a.progress,progressPercent:a.isGraduated?void 0:Sae(a.progress)},p=i?.percent?F7(i.percent):void 0,y=Qze(a.isGraduated,a.isLocked,a.progress),m=`${o.symbol} - ${o.name}`;return a.isGraduated?m+=" (graduated)":m+=` (${l.progressPercent} to graduation)`,p&&(m+=` | ${p}`),{success:!0,message:m,token:l,recommendation:y}}catch(t){let n=t instanceof Error?t.message:"Unknown error";return n.includes("nothing to see here")?{success:!1,message:"Token not found on nad.fun",error:`Token ${e.token} is not a nad.fun token or doesn't exist.`}:{success:!1,message:"Failed to fetch token info",error:n}}}Y();Te();var eje=C.object({address:C.string().optional().describe("Wallet address to check (default: your smart account)"),positionType:C.enum(["all","open","closed"]).optional().describe("Filter by position type (default: 'all')"),limit:C.number().optional().describe("Max positions to return (default: 20)")});function Eae(e){e.tool("nadfun_positions","Get nad.fun token holdings with PnL analysis. Shows tokens bought on nad.fun, average buy price, current price, and profit/loss. Defaults to your smart account if no address provided. Works in both BYOK and x402 modes (uses public nad.fun API).",eje.shape,async t=>{let n=await tje(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function tje(e){try{let t=await q();if(!t||!Pe(t))return{success:!1,message:"Wallet not configured",error:"Please run setup_wallet first to create your pragma wallet"};let n;if(e.address)try{n=xe(e.address)}catch{return{success:!1,message:"Invalid address",error:"Address must be a valid 0x address"}}else n=t.wallet.smartAccountAddress;let r=Math.min(e.limit||20,100),a=await Q5(`/profile/hold-token/${n}`,{tableType:"hold-tokens-table",page:1,limit:r});if(!a.tokens||a.tokens.length===0)return{success:!0,message:"No nad.fun holdings found",address:n,positions:[],summary:{totalPositions:0,totalValue:"$0.00",totalPnl:"$0.00",profitableCount:0}};let s=a.tokens.map(u=>{let d=u.token_info,l=u.balance_info,p=u.market_info,y=BigInt(l.balance),m=le(y,18),g=parseFloat(l.token_price)||0,w=parseFloat(m)*g;return{token:{address:d.token_id,symbol:d.symbol,name:d.name,imageUri:d.image_uri||void 0},holdings:Tae(m),avgBuyPrice:"N/A",currentPrice:Q6(l.token_price),marketValue:`$${w.toFixed(2)}`,pnl:{usd:"N/A",percent:"N/A",isProfit:!1},marketType:p.market_type||"CURVE"}}),o=s;e.positionType==="open"?o=s.filter(u=>u.marketType==="CURVE"):e.positionType==="closed"&&(o=s.filter(u=>u.marketType==="DEX"));let i=o.reduce((u,d)=>{let l=parseFloat(d.marketValue.replace(/[$,]/g,""))||0;return u+l},0);return{success:!0,message:`Found ${o.length} nad.fun position${o.length!==1?"s":""}`,address:n,positions:o,summary:{totalPositions:o.length,totalValue:`$${i.toFixed(2)}`,totalPnl:"N/A (historical data not available)",profitableCount:0}}}catch(t){let n=t instanceof Error?t.message:"Unknown error";return n.includes("nothing to see here")?{success:!0,message:"No nad.fun holdings found",positions:[],summary:{totalPositions:0,totalValue:"$0.00",totalPnl:"$0.00",profitableCount:0}}:{success:!1,message:"Failed to fetch positions",error:n}}}Te();mt();import{stat as Pae}from"fs/promises";import*as Rae from"node:path";Y();D0();Te();mt();We();Ar();var g$=new Map;function nje(){return`create-${Date.now()}-${Math.random().toString(36).slice(2,8)}`}function rje(e){return g$.get(e)}function aje(e){return Date.now()>e.expiresAt}function kae(e){g$.delete(e)}var sje=[{type:"event",name:"Create",inputs:[{type:"address",name:"owner",indexed:!0},{type:"address",name:"curve",indexed:!0},{type:"address",name:"token",indexed:!0},{type:"string",name:"tokenURI"},{type:"string",name:"name"},{type:"string",name:"symbol"},{type:"uint256",name:"virtualNative"},{type:"uint256",name:"virtualToken"}]}];async function Iae(e,t){let n=await q();if(!n?.wallet)throw new Error("Wallet not configured. Please run setup_wallet first.");let r=n.network.chainId,a=await xae(e.imagePath),s=await wae({name:e.name,symbol:e.symbol,imageUri:a,description:e.description,twitter:e.twitter,telegram:e.telegram,website:e.website}),{salt:o,address:i}=await vae(t,e.name,e.symbol,s),u=0n;if(e.initialBuyMon){let m=ye(e.initialBuyMon,18),g=await cre(m,r),h=e.slippageBps??ic;u=g*BigInt(1e4-h)/10000n}let d=X({abi:ere,functionName:"create",args:[{name:e.name,symbol:e.symbol,tokenURI:s,amountOut:u,salt:o,actionId:1}]}),l=nje(),p=Date.now()+300*1e3,y={quoteId:l,name:e.name,symbol:e.symbol,imageUri:a,metadataUri:s,salt:o,predictedTokenAddress:i,initialBuyMon:e.initialBuyMon,expiresAt:p,chainId:r,_calldata:d};return g$.set(l,y),y}async function Cae(e){let t=await q();if(!t?.wallet)return{success:!1,error:"Wallet not configured. Please run setup_wallet first."};let n=rje(e);if(!n)return{success:!1,error:"Quote not found. Please prepare a fresh quote."};if(aje(n))return kae(e),{success:!1,error:"Quote has expired. Please prepare a fresh quote."};let r=t.wallet.smartAccountAddress,a=t.wallet.sessionKeyAddress,s=t.network.chainId,o=Qe(s),i=W6(s),u=await we(t),d=Ee(s,u),l=_e({chain:d,transport:Ze(u,t)}),p=await ht();if(!p)return{success:!1,error:"Session key not found. Please run setup_wallet first."};let y=n.initialBuyMon?ye(n.initialBuyMon,18):0n,m=tre+y,g=await l.getBalance({address:r});if(g<m){let $=le(m,18),B=le(g,18),V=n.initialBuyMon?`10 MON deploy fee + ${n.initialBuyMon} MON initial buy`:"10 MON deploy fee";return{success:!1,error:`Smart Account balance too low. Have: ${B} MON, Need: ${$} MON (${V}). Transfer MON to your Smart Account (${r}) first.`}}let h=await l.getBalance({address:a}),w=lo("transfer");if(h<w)return{success:!1,error:`Session key needs gas. Have: ${G0(h)}, Need: ~0.05 MON for gas. Fund session key (${a}) first.`};let v;try{v=await Tn(l,r)}catch($){return{success:!1,error:`Failed to fetch nonce: ${$ instanceof Error?$.message:String($)}`}}let T=k0e({router:i.router,delegator:r,sessionKey:a,nonce:v,chainId:s,calldata:n._calldata,value:m}),A=n.initialBuyMon?`Create token ${n.symbol} + buy ${n.initialBuyMon} MON`:`Create token ${n.symbol} on nad.fun`,_=await _n(T.delegation,s,t.wallet.keyId,A);T.delegation.signature=_;let E=on(p),O=Tt({account:E,chain:d,transport:Ze(u,t)});try{let $=await dn(O,l,Ue.delegationManager,[{permissionContext:[T.delegation],executions:[Pt({target:i.router,value:m,callData:n._calldata})],mode:nn.SingleDefault}]),B=await Xt(l,$);if(B.status==="reverted")return{success:!1,txHash:$,error:"Transaction reverted on-chain. Token name/symbol may already exist."};let V;try{let G=zo({abi:sje,logs:B.logs,eventName:"Create"});G.length>0&&(V=G[0].args.token)}catch{V=n.predictedTokenAddress}kae(e);let M=`Token ${n.symbol} created successfully!`;return n.initialBuyMon&&(M+=` Initial buy of ${n.initialBuyMon} MON included.`),{success:!0,txHash:$,explorerUrl:`${o.blockExplorer}/tx/${$}`,tokenAddress:V||n.predictedTokenAddress,tokenName:n.name,tokenSymbol:n.symbol,message:M,initialBuyMon:n.initialBuyMon}}catch($){return{success:!1,error:`Token creation failed: ${$ instanceof Error?$.message:"Unknown error"}`}}}var oje=C.object({name:C.string().min(1).max(32).describe("Token name (1-32 chars). Example: 'Moon Cat'. This is the full display name shown to users."),symbol:C.string().min(1).max(10).regex(/^[A-Za-z0-9]+$/).describe("Token symbol/ticker (1-10 alphanumeric). Example: 'MCAT'. Typically 3-5 uppercase letters."),imagePath:C.string().describe("Path to token image file (PNG, JPEG, WebP). Max 5MB. Example: './logo.png' or '/path/to/image.jpg'. CRITICAL: File must exist and be readable."),description:C.string().max(500).optional().describe("Token description (max 500 chars). Optional. Shown on nad.fun token page."),twitter:C.string().optional().describe("Twitter/X URL. Must contain 'x.com'. Optional. Example: 'https://x.com/mytoken'"),telegram:C.string().optional().describe("Telegram URL. Must contain 't.me'. Optional. Example: 'https://t.me/mytokengroup'"),website:C.string().optional().describe("Website URL. Must be https. Optional. Example: 'https://mytoken.xyz'"),initialBuyMon:C.string().optional().describe("MON amount to buy tokens with after creation. Optional. Creator becomes first token holder. Example: '1' for 1 MON. If provided, a separate nadfun_buy will be executed after creation."),slippageBps:C.number().min(0).max(V6).optional().describe(`Slippage tolerance in basis points for the initial buy. Default: ${ic} (5%). Max: ${V6} (50%).`)});function $ae(e){e.tool("nadfun_create","Create a new token on nad.fun bonding curve. Uploads image/metadata, mines vanity address (7777 suffix), and deploys token. Requires Touch ID confirmation. Check session key balance first to ensure sufficient gas (~0.05 MON).",oje.shape,async t=>{let n=await uje(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function ije(e){try{return await Pae(e),!0}catch{return!1}}async function cje(e){return(await Pae(e)).size}async function uje(e){try{let t=await q();if(!t||!Pe(t))return{success:!1,message:"Wallet not configured",error:"Please run setup_wallet first to create your pragma wallet"};let n=[".png",".jpg",".jpeg",".webp"],r=Rae.extname(e.imagePath).toLowerCase();if(!n.includes(r))return{success:!1,message:"Invalid image format",error:`Image must be PNG, JPEG, or WebP (got: ${r||"no extension"})`};if(!await ije(e.imagePath))return{success:!1,message:"Image file not found",error:`File not found: ${e.imagePath}`};let s=await cje(e.imagePath),o=5*1024*1024;if(s>o)return{success:!1,message:"Image too large",error:`Image exceeds 5MB limit (current: ${(s/1024/1024).toFixed(2)}MB)`};if(e.twitter&&!e.twitter.includes("x.com"))return{success:!1,message:"Invalid Twitter URL",error:"Twitter URL must contain 'x.com'. Example: 'https://x.com/mytoken'"};if(e.telegram&&!e.telegram.includes("t.me"))return{success:!1,message:"Invalid Telegram URL",error:"Telegram URL must contain 't.me'. Example: 'https://t.me/mytokengroup'"};if(e.website&&!e.website.startsWith("https://"))return{success:!1,message:"Invalid website URL",error:"Website URL must start with 'https://'. Example: 'https://mytoken.xyz'"};let i=t.wallet.smartAccountAddress,u=Qe(t.network.chainId),d=await Iae({name:e.name,symbol:e.symbol,imagePath:e.imagePath,description:e.description,twitter:e.twitter,telegram:e.telegram,website:e.website,initialBuyMon:e.initialBuyMon,slippageBps:e.slippageBps},i),l=await Cae(d.quoteId);if(!l.success)return{success:!1,message:"Token creation failed",error:l.error||"Unknown error during token creation"};let p={success:!0,message:l.message||`Successfully created token ${e.symbol}`,token:{address:l.tokenAddress,name:e.name,symbol:e.symbol,explorerUrl:`${u.blockExplorer}/token/${l.tokenAddress}`},transaction:{hash:l.txHash,explorerUrl:l.explorerUrl}};return l.initialBuyMon&&(p.initialBuy={monSpent:l.initialBuyMon}),p}catch(t){let n=t instanceof Error?t.message:"Unknown error";return n.includes("Smart Account balance")?{success:!1,message:"Insufficient funds",error:n}:n.includes("Session key needs gas")?{success:!1,message:"Session key needs gas",error:n}:n.includes("Touch ID")||n.includes("passkey")?{success:!1,message:"Authentication failed",error:"Touch ID authentication was cancelled or failed. Please try again."}:n.includes("NSFW")?{success:!1,message:"Image rejected",error:n}:n.includes("nad.fun API")?{success:!1,message:"nad.fun API error",error:n}:{success:!1,message:"Token creation failed",error:n}}}var dje=C.object({});function Mae(e){e.tool("leverup_list_pairs","List all supported trading pairs on LeverUp including Stocks and Forex.",dje.shape,async()=>{let t=fje();return{content:[{type:"text",text:JSON.stringify(t,null,2)}]}})}function fje(){let e=Fn.map(t=>({symbol:t.pair,category:t.category,isHighLeverage:!!t.isHighLeverage,pairBase:t.pairBase}));return{success:!0,message:`Found ${e.length} supported trading pairs.`,data:{pairs:e}}}Y();Te();mt();We();var lje=C.object({address:C.string().optional().describe("Optional address to check positions for. Defaults to your smart account."),agentId:C.string().optional().describe("Optional sub-agent ID. When provided, reconciles tracked positions to detect keeper-triggered closes (TP/SL/liquidation) and record settlement inflows.")}),pje=15,Dae=2000n;function Oae(e){e.tool("leverup_list_positions","List all your active LeverUp perpetual positions with PnL and liquidation analysis.",lje.shape,async t=>{let n=await mje(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function mje(e){try{let t=await q();if(!t||!Pe(t))return{success:!1,message:"Wallet not configured. Run setup_wallet first."};let n=e.address||t.wallet?.smartAccountAddress,r;if(e.agentId){let d=zi(e.agentId);d.length>0&&(r=[...new Set(d.map(l=>l.pair))])}let a=await J5(n,r),s=a.map(d=>({tradeHash:d.position.positionHash,pair:d.position.pair,side:d.position.isLong?"LONG":"SHORT",size:le(d.position.qty,10),margin:le(d.position.margin,18),entryPrice:`$${le(d.position.entryPrice,18)}`,stopLoss:d.position.stopLoss>0n?`$${Number(le(d.position.stopLoss,18)).toFixed(2)}`:"Not set",takeProfit:d.position.takeProfit>0n?`$${Number(le(d.position.takeProfit,18)).toFixed(2)}`:"Not set",unrealizedPnL:d.analysis.unrealizedPnL,pnlPercentage:d.analysis.pnlPercentage,liqPrice:`$${d.analysis.liqPrice}`,healthFactor:d.analysis.healthFactor,distanceToLiq:d.analysis.distanceToLiq})),o;if(e.agentId)try{o=await yje(e.agentId,n,s,t)}catch{}let i={positions:s,...o?{reconciliation:o}:{}};if(a.length===0)return{success:!0,message:"No active LeverUp positions found.",data:i};let u=s.map(d=>`${d.pair} ${d.side}: ${d.unrealizedPnL} (${d.pnlPercentage})`).join(", ");return{success:!0,message:`You have ${a.length} active positions. Summary: ${u}`,data:i}}catch(t){return{success:!1,message:`Failed to fetch LeverUp positions: ${t instanceof Error?t.message:"Unknown error"}`}}}function bje(e,t){return e>t?e-t:t-e}async function yje(e,t,n,r){let a=zi(e);if(a.length===0)return{trackedCount:0,linkedCount:0,settledCount:0,pendingSettlementCount:0};let s=new Set(n.map(E=>E.tradeHash)),o=0,i=0;for(let E=0;E<a.length;E++){let O=a[E];if(O.tradeHash)continue;let $=BigInt(O.margin),B=n.find(V=>{if(V.pair!==O.pair||V.side!==O.side)return!1;let M=ye(V.margin,18);return bje(M,$)*100n<=$*5n});B&&(zR(e,E,B.tradeHash),O.tradeHash=B.tradeHash,O.status==="pending_fill"&&(M7(e,B.tradeHash,"open"),O.status="open"),o++)}let u=await we(r),d=r.network?.chainId??143,l=Ee(d,u),y=await _e({chain:l,transport:Ze(u,r)}).getBlockNumber(),m=Number(y),g=a.filter(E=>E.tradeHash&&!s.has(E.tradeHash));for(let E of g)(E.status==="open"||E.status==="pending_fill")&&(M7(e,E.tradeHash,"pending_settlement",m),E.status="pending_settlement",E.detectedGoneAt=m);let h=g.filter(E=>E.status==="pending_settlement"&&E.detectedGoneAt!=null&&m-E.detectedGoneAt>=pje);if(h.length>0){let E=Math.min(...h.map(V=>V.detectedGoneAt)),O=BigInt(E)>Dae?BigInt(E)-Dae:0n,$=await kre(O,y,t);$.length>0&&await K5(e,{outflows:[],inflows:$});let B=$.length>0?$.map(V=>le(V.amount,18)).join(", "):"0";for(let V of h){let M=gje($.length>0,h.length>1,B,V);await ka(e,{ts:Date.now(),type:"trade_close",tradeHash:V.tradeHash,pair:V.pair,side:V.side,pnl:M,text:`Keeper close: ${V.pair} ${V.side} \u2014 inflows: ${M}`,protocol:"leverup"}),I2(e,V.tradeHash),i++}}let w=g.length-h.length,v=7200*1e3,T=Date.now();function A(E){return E.status==="pending_fill"&&!E.tradeHash&&T-E.openedAt>v}let _=a.filter(E=>!A(E));return _.length<a.length&&X5(e,_),{trackedCount:a.length,linkedCount:o,settledCount:i,pendingSettlementCount:w}}function gje(e,t,n,r){if(e)return t?`batch total: ${n}`:n;let a=r.stopLoss&&r.stopLoss!=="0",s=r.takeProfit&&r.takeProfit!=="0";return a||s?"0 (TP/SL was set \u2014 possible query miss or liquidation)":"0 (liquidation or expired)"}var hje=C.object({symbol:C.string().describe("The asset symbol to trade (e.g. BTC, ETH, MON, AAPL, EUR). NOTE: 500BTC and 500ETH are Zero-Fee pairs that ONLY support 500x, 750x, or 1001x leverage."),isLong:C.boolean().describe("True for Long, False for Short."),marginAmount:C.string().describe("The amount of collateral to use (e.g. '10' for 10 MON). Recommended minimum: $10 USD."),leverage:C.number().min(1).max(1001).describe("Leverage multiplier. Normal pairs: 1-100x with 0.045% fees. Zero-Fee pairs (500BTC/500ETH): ONLY 500, 750, or 1001 (no fees if PnL < 0, profit sharing if profitable). HARD LIMIT: Position size (margin \xD7 leverage) must be at least $200 USD."),collateralToken:C.enum(["MON","USDC","LVUSD","LVMON"]).default("MON").optional().describe("Collateral token: MON (native), USDC, LVUSD (vault USD), or LVMON (vault MON). Default: MON.")});function Nae(e){e.tool("leverup_get_quote","Calculate position size, liquidation price, and fees for a potential LeverUp trade.",hje.shape,async t=>{let n=await xje(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function xje(e){try{let t=await J6(e.symbol,e.isLong,e.marginAmount,e.leverage,e.collateralToken),n=e.isLong?"Long":"Short",r=Number(t.positionSize).toFixed(6),a=`Quote for ${e.leverage}x ${n} on ${e.symbol}: Size ${r} units, Liq Price $${t.liqPrice}. Distance to Liquidation: ${t.distanceToLiq}.`;return t.isHighLeveragePair&&(a+=" [Zero-Fee Pair: No fees if PnL < 0]"),t.canAddMargin||(a+=" [Cannot add/remove margin at this leverage]"),a+=` Max TP: ${t.maxTpPercent}% profit.`,t.meetsMinimums||(a+=`
|
|
214
214
|
|
|
215
|
-
\u26A0\uFE0F WARNING: `+t.warnings.join(". ")),{success:!0,message:a,data:t}}catch(t){return{success:!1,message:`Failed to get LeverUp quote: ${t instanceof Error?t.message:"Unknown error"}`}}}Te();t0();D0();mt();We();Ar();Y();var wje=C.object({symbol:C.string().describe("Asset to trade (e.g. BTC, ETH, MON). NOTE: 500BTC and 500ETH are Zero-Fee pairs that ONLY support 500x, 750x, or 1001x leverage."),isLong:C.boolean().describe("true for Long, false for Short"),marginAmount:C.string().describe("Amount of collateral (e.g. '10' for 10 MON). Recommended minimum: $10 USD."),leverage:C.number().min(1).max(1001).describe("Leverage multiplier. Normal pairs: 1-100x. Zero-Fee pairs (500BTC/500ETH): ONLY 500, 750, or 1001. HARD LIMIT: Position size (margin \xD7 leverage) must be at least $200 USD."),collateralToken:C.enum(["MON","USDC","LVUSD","LVMON"]).default("MON").optional().describe("Collateral token: MON (native), USDC, LVUSD (vault USD), or LVMON (vault MON). Default: MON."),slippageBps:C.number().min(0).max(5e3).default(100).optional().describe("Slippage in basis points (default: 100 = 1%)"),stopLoss:C.string().optional().describe("Stop Loss price in USD (e.g. '85000' for $85,000). Set to automatically close position at this price to limit losses. Cannot be cancelled once set, but can be edited."),takeProfit:C.string().optional().describe("Take Profit price in USD (e.g. '100000' for $100,000). Set to automatically close position at this price to secure profits. Max TP: 500% for leverage <50x, 300% for leverage \u226550x. Cannot be cancelled once set, but can be edited."),agentId:C.string().optional().describe("Sub-agent ID for autonomous execution (no Touch ID). If omitted, uses assistant mode with Touch ID confirmation. Note: For ERC20 collateral, approval must be set via assistant mode first.")});function Lae(e){e.tool("leverup_open_trade","Open a market perpetual position on LeverUp. If agentId provided: uses autonomous mode (no Touch ID). If no agentId: uses assistant mode (requires Touch ID).",wje.shape,async t=>{try{let n=await q();if(!n||!Pe(n))throw new Error("Wallet not configured.");if(t.agentId){let j=await Hre(t.agentId,{symbol:t.symbol,isLong:t.isLong,marginAmount:t.marginAmount,leverage:t.leverage,collateralToken:t.collateralToken||"MON",slippageBps:t.slippageBps,stopLoss:t.stopLoss,takeProfit:t.takeProfit});return{content:[{type:"text",text:JSON.stringify(j,null,2)}]}}if(_t()){let j=await J6(t.symbol,t.isLong,t.marginAmount,t.leverage,t.collateralToken||"MON"),Z=Fn.find(fn=>fn.pair===`${t.symbol}/USD`||fn.pair===t.symbol);if(Z?.isHighLeverage&&!Qo(t.leverage))throw new Error(`${Z.pair} is a Zero-Fee pair that ONLY supports ${bo.join(", ")}x leverage.`);let de=BigInt(t.slippageBps??100),ne=ye(j.entryPrice,18),be=t.isLong?ne*(10000n+de)/10000n:ne*(10000n-de)/10000n,ze=t.collateralToken??"MON",pt=ye(t.marginAmount,Ca(ze)),rn=ye(j.positionSize,10),zt=await N2({symbol:t.symbol,isLong:t.isLong,amountIn:pt,leverage:t.leverage,qty:rn,price:be,collateralToken:t.collateralToken||"MON",stopLoss:t.stopLoss?ye(t.stopLoss,18):0n,takeProfit:t.takeProfit?ye(t.takeProfit,18):0n},n),ct;return ze==="MON"?ct=await zn({target:zt.to,value:zt.value,callData:zt.data},n):ct=await Vi(zt.tokenIn,zt.to,zt.amountIn,{target:zt.to,value:zt.value,callData:zt.data},n),{content:[{type:"text",text:JSON.stringify({success:ct.success,message:ct.success?`Successfully opened ${t.leverage}x ${t.isLong?"Long":"Short"} on ${t.symbol}`:ct.message,txHash:ct.txHash,explorerUrl:ct.explorerUrl,error:ct.error},null,2)}]}}let r=n.wallet.smartAccountAddress,a=n.wallet.sessionKeyAddress,s=n.network.chainId,o=await we(n),i=await J6(t.symbol,t.isLong,t.marginAmount,t.leverage,t.collateralToken||"MON"),u=Fn.find(j=>j.pair===`${t.symbol}/USD`||j.pair===t.symbol);if(u?.isHighLeverage&&!Qo(t.leverage))throw new Error(`${u.pair} is a Zero-Fee pair that ONLY supports ${bo.join(", ")}x leverage. Requested: ${t.leverage}x. Use a standard pair (BTC, ETH) for lower leverage.`);let d=parseFloat(i.entryPrice);if(t.takeProfit){let j=parseFloat(t.takeProfit),Z=X6(t.leverage),de=t.isLong?(j-d)/d*100:(d-j)/d*100;if(de<=0){let ne=t.isLong?"above":"below";throw new Error(`Invalid Take Profit price. For a ${t.isLong?"Long":"Short"} position, TP must be ${ne} entry price ($${d}).`)}if(de>Z)throw new Error(`Take Profit exceeds maximum allowed. For ${t.leverage}x leverage, max TP is ${Z}% profit. Requested TP would be ~${de.toFixed(1)}% profit.`)}if(t.stopLoss){let j=parseFloat(t.stopLoss);if(t.isLong?j>=d:j<=d){let de=t.isLong?"below":"above";throw new Error(`Invalid Stop Loss for ${t.isLong?"Long":"Short"} position. SL price ($${j}) must be ${de} entry price ($${d}).`)}}let l=BigInt(t.slippageBps??100),p=ye(i.entryPrice,18),y=t.isLong?p*(10000n+l)/10000n:p*(10000n-l)/10000n,m=t.collateralToken??"MON",g=ye(t.marginAmount,Ca(m)),h=ye(i.positionSize,10),w=await N2({symbol:t.symbol,isLong:t.isLong,amountIn:g,leverage:t.leverage,qty:h,price:y,collateralToken:t.collateralToken||"MON",stopLoss:t.stopLoss?ye(t.stopLoss,18):0n,takeProfit:t.takeProfit?ye(t.takeProfit,18):0n},n),v=Ee(s,o),T=_e({chain:v,transport:Ze(o,n)}),A=Ca(m);if(m==="MON"){let j=await T.getBalance({address:r});if(j<w.value){let Z=le(w.amountIn,A),de=le(w.amountIn-g,A),ne=le(w.value,A);throw new Error(`Insufficient native MON balance. Required: ${ne} MON (${t.marginAmount} margin + ${de} trading fee + Pyth fee). Available: ${le(j,A)} MON.`)}}else{let j=m==="USDC"?V0:m==="LVUSD"?g0:h0,Z=await T.readContract({address:j,abi:Xe,functionName:"balanceOf",args:[r]});if(Z<w.amountIn){let de=le(w.amountIn,A),ne=le(Z,A),be=le(w.amountIn-g,A);throw new Error(`Insufficient ${m} balance. Required: ${de} ${m} (${t.marginAmount} margin + ${be} fee), Available: ${ne} ${m}.`)}}let _=await Tn(T,r),E=[];if(m!=="MON"){let j=w.tokenIn,Z=await T.readContract({address:j,abi:Xe,functionName:"allowance",args:[r,w.to]});if(Z<w.amountIn){if(Z>0n){let ne=cs({tokenAddress:j,spender:w.to,amount:0n,delegator:r,sessionKey:a,nonce:_,chainId:s});E.push({delegation:ne.delegation,execution:{target:j,value:0n,callData:X({abi:Xe,functionName:"approve",args:[w.to,0n]})},kind:"approve"})}let de=cs({tokenAddress:j,spender:w.to,amount:w.amountIn,delegator:r,sessionKey:a,nonce:_,chainId:s});E.push({delegation:de.delegation,execution:{target:j,value:0n,callData:X({abi:Xe,functionName:"approve",args:[w.to,w.amountIn]})},kind:"approve"})}}let O=I0e({diamond:w.to,delegator:r,sessionKey:a,nonce:_,chainId:s,calldata:w.data,value:w.value});E.push({delegation:O.delegation,execution:{target:w.to,value:w.value,callData:w.data},kind:"leverup_open"});for(let j of E){let Z;j.kind==="approve"?Z=`Approve ${m} for LeverUp`:Z=`LeverUp: ${t.leverage}x ${t.isLong?"Long":"Short"} ${t.symbol}`;let de=await _n(j.delegation,s,n.wallet.keyId,Z);j.delegation.signature=de}let $=await ht(),B=on($),V=Tt({account:B,chain:v,transport:Ze(o,n)}),M=E.filter(j=>j.kind==="approve");if(M.length>0){let j=M.map(ne=>({permissionContext:[ne.delegation],executions:[Pt({target:ne.execution.target,value:ne.execution.value,callData:ne.execution.callData})],mode:nn.SingleDefault})),Z=await dn(V,T,Ue.delegationManager,j);if((await Xt(T,Z)).status!=="success")return{content:[{type:"text",text:JSON.stringify({success:!1,message:"Failed to approve token. Transaction reverted."},null,2)}]}}let G=E.find(j=>j.kind==="leverup_open");if(!G)return{content:[{type:"text",text:JSON.stringify({success:!1,message:"Internal error: trade delegation not found."},null,2)}]};let N=[{permissionContext:[G.delegation],executions:[Pt({target:G.execution.target,value:G.execution.value,callData:G.execution.callData})],mode:nn.SingleDefault}],W=await dn(V,T,Ue.delegationManager,N),me=await Xt(T,W);return{content:[{type:"text",text:JSON.stringify({success:me.status==="success",message:me.status==="success"?`Successfully opened ${t.leverage}x ${t.isLong?"Long":"Short"} on ${t.symbol}`:"Transaction reverted on-chain",txHash:W,explorerUrl:`https://monadvision.com/tx/${W}`},null,2)}]}}catch(n){return{content:[{type:"text",text:JSON.stringify({success:!1,message:n instanceof Error?n.message:"Unknown error"},null,2)}]}}})}Te();t0();D0();mt();We();Ar();Y();var vje=C.object({tradeHash:C.string().regex(/^0x[a-fA-F0-9]{64}$/).describe("The unique identifier of the position to close."),agentId:C.string().optional().describe("Sub-agent ID for autonomous execution (no Touch ID). If omitted, uses assistant mode with Touch ID confirmation.")});function Bae(e){e.tool("leverup_close_trade","Close an existing LeverUp perpetual position. If agentId provided: uses autonomous mode (no Touch ID). If no agentId: uses assistant mode (requires Touch ID).",vje.shape,async t=>{try{let n=await q();if(!n||!Pe(n))throw new Error("Wallet not configured.");if(t.agentId){let A=await Rre(t.agentId,t.tradeHash);return{content:[{type:"text",text:JSON.stringify(A,null,2)}]}}if(_t()){let A=await L2(t.tradeHash),_=await zn({target:A.to,value:A.value,callData:A.data},n);return{content:[{type:"text",text:JSON.stringify({success:_.success,message:_.success?`Successfully closed position ${t.tradeHash}`:_.message,txHash:_.txHash,explorerUrl:_.explorerUrl,error:_.error},null,2)}]}}let r=n.wallet.smartAccountAddress,a=n.wallet.sessionKeyAddress,s=n.network.chainId,o=await we(n),i=await L2(t.tradeHash),u=Ee(s,o),d=_e({chain:u,transport:Ze(o,n)}),l=await Tn(d,r),p=C0e({diamond:i.to,delegator:r,sessionKey:a,nonce:l,chainId:s,calldata:i.data}),y=`Close LeverUp Position: ${t.tradeHash.slice(0,10)}...`,m=await _n(p.delegation,s,n.wallet.keyId,y);p.delegation.signature=m;let g=await ht(),h=on(g),w=Tt({account:h,chain:u,transport:Ze(o,n)}),v=await dn(w,d,Ue.delegationManager,[{permissionContext:[p.delegation],executions:[Pt({target:i.to,value:i.value,callData:i.data})],mode:nn.SingleDefault}]),T=await Xt(d,v);return{content:[{type:"text",text:JSON.stringify({success:T.status==="success",message:T.status==="success"?`Successfully closed position ${t.tradeHash}`:"Transaction reverted on-chain",txHash:v,explorerUrl:`https://monadvision.com/tx/${v}`},null,2)}]}}catch(n){return{content:[{type:"text",text:JSON.stringify({success:!1,message:n instanceof Error?n.message:"Unknown error"},null,2)}]}}})}Te();t0();D0();mt();We();Ar();Y();m0();var Tje=C.object({tradeHash:C.string().regex(/^0x[a-fA-F0-9]{64}$/).describe("The unique identifier of the position."),amount:C.string().describe("Amount of collateral to add (e.g. '5' for 5 MON)."),collateralToken:C.enum(["MON","USDC","LVUSD","LVMON"]).default("MON").describe("Collateral token matching the position's collateral. IMPORTANT: Positions opened with 500x, 750x, or 1001x leverage (Zero-Fee mode) CANNOT add margin - this operation will fail for those positions."),agentId:C.string().optional().describe("Sub-agent ID for autonomous execution (no Touch ID). If omitted, uses assistant mode with Touch ID confirmation.")});function Uae(e){switch(e){case"USDC":return V0;case"LVUSD":return g0;case"LVMON":return h0;default:return Yr}}function Hae(e){e.tool("leverup_update_margin","Add collateral to an existing LeverUp position. If agentId provided: uses autonomous mode (no Touch ID). If no agentId: uses assistant mode (requires Touch ID). NOTE: Only ADDING margin is supported. This does NOT work for Zero-Fee positions (500x/750x/1001x leverage).",Tje.shape,async t=>{try{let n=await q();if(!n||!Pe(n))throw new Error("Wallet not configured.");if(t.agentId){let $=await Dre(t.agentId,t.tradeHash,t.amount,t.collateralToken||"MON");return{content:[{type:"text",text:JSON.stringify($,null,2)}]}}if(_t()){let $=t.collateralToken||"MON",B=Uae($),V=$==="MON",M=ye(t.amount,Ca($)),G=B2(t.tradeHash,B,M,V),N;return V?N=await zn({target:G.to,value:G.value,callData:G.data},n):N=await Vi(B,Kn,M,{target:G.to,value:G.value,callData:G.data},n),{content:[{type:"text",text:JSON.stringify({success:N.success,message:N.success?`Successfully added ${t.amount} ${$} margin`:N.message,txHash:N.txHash,explorerUrl:N.explorerUrl,error:N.error},null,2)}]}}let r=n.wallet.smartAccountAddress,a=n.wallet.sessionKeyAddress,s=n.network.chainId,o=await we(n),i=t.collateralToken||"MON",u=Uae(i),d=i==="MON",l=ye(t.amount,Ca(i)),p=B2(t.tradeHash,u,l,d),y=Ee(s,o),m=_e({chain:y,transport:Ze(o,n)}),g=[],h=await xt(()=>Tn(m,r),{operationName:"get-delegation-nonce"});if(!d&&await xt(async()=>m.readContract({address:u,abi:Xe,functionName:"allowance",args:[r,Kn]}),{operationName:"check-allowance"})<l){let B=cs({tokenAddress:u,spender:Kn,amount:l,delegator:r,sessionKey:a,nonce:h,chainId:s});g.push({delegation:B.delegation,execution:{target:u,value:0n,callData:X({abi:Xe,functionName:"approve",args:[Kn,l]})}})}let w=P0e({diamond:p.to,delegator:r,sessionKey:a,nonce:h,chainId:s,calldata:p.data,value:p.value});g.push({delegation:w.delegation,execution:{target:p.to,value:p.value,callData:p.data}});let v=`Add ${t.amount} ${i} Margin to ${t.tradeHash.slice(0,10)}...`;for(let $ of g){let B=await _n($.delegation,s,n.wallet.keyId,v);$.delegation.signature=B}let T=await ht(),A=on(T),_=Tt({account:A,chain:y,transport:Ze(o,n)}),E=await dn(_,m,Ue.delegationManager,g.map($=>({permissionContext:[$.delegation],executions:[Pt($.execution)],mode:nn.SingleDefault}))),O=await Xt(m,E);return{content:[{type:"text",text:JSON.stringify({success:O.status==="success",message:O.status==="success"?`Successfully added ${t.amount} ${i} margin`:"Transaction reverted on-chain",txHash:E,explorerUrl:`https://monadvision.com/tx/${E}`},null,2)}]}}catch(n){let r=n instanceof Error?n.message:"Unknown error";return{content:[{type:"text",text:JSON.stringify({success:!1,message:"Failed to add margin",error:r},null,2)}]}}})}Te();t0();D0();mt();We();Ar();Y();m0();var Sje=C.object({tradeHash:C.string().regex(/^0x[a-fA-F0-9]{64}$/).describe("The unique identifier of the position."),takeProfit:C.string().optional().describe("New take profit price in USD (e.g. '110000' for $110,000). Set to '0' or omit to disable TP."),stopLoss:C.string().optional().describe("New stop loss price in USD (e.g. '95000' for $95,000). Set to '0' or omit to disable SL."),agentId:C.string().optional().describe("Sub-agent ID for autonomous execution (no Touch ID). If omitted, uses assistant mode with Touch ID confirmation.")});function Fae(e){e.tool("leverup_update_tpsl","Update take profit and/or stop loss on an existing LeverUp position. If agentId provided: uses autonomous mode (no Touch ID). If no agentId: uses assistant mode (requires Touch ID). Set a price to '0' to disable that trigger. At least one of takeProfit or stopLoss must be provided.",Sje.shape,async t=>{try{let n=await q();if(!n||!Pe(n))throw new Error("Wallet not configured.");if(t.takeProfit===void 0&&t.stopLoss===void 0)throw new Error("At least one of takeProfit or stopLoss must be provided.");if(t.stopLoss&&t.stopLoss!=="0"){let B=n.wallet.smartAccountAddress,M=(await J5(B)).find(G=>G.position.positionHash===t.tradeHash);if(M){let G=Number(le(M.position.entryPrice,18)),N=Number(t.stopLoss),W=M.position.isLong,me=W&&N>=G,j=!W&&N<=G;if(me){let Z=(G*.99).toFixed(2);throw new Error(`Invalid SL for LONG: SL ($${N}) must be below entry ($${G.toFixed(2)}). LeverUp requires SL in loss direction. Suggested: $${Z}`)}if(j){let Z=(G*1.01).toFixed(2);throw new Error(`Invalid SL for SHORT: SL ($${N}) must be above entry ($${G.toFixed(2)}). LeverUp requires SL in loss direction. Suggested: $${Z}`)}}}if(t.agentId){let B=await $re(t.agentId,t.tradeHash,t.takeProfit,t.stopLoss);return{content:[{type:"text",text:JSON.stringify(B,null,2)}]}}if(_t()){let B=t.takeProfit?ye(t.takeProfit,18):0n,V=t.stopLoss?ye(t.stopLoss,18):0n,M=U2(t.tradeHash,B,V),G=await zn({target:M.to,value:M.value,callData:M.data},n),N=[];return t.takeProfit&&N.push(t.takeProfit==="0"?"TP disabled":`TP=$${t.takeProfit}`),t.stopLoss&&N.push(t.stopLoss==="0"?"SL disabled":`SL=$${t.stopLoss}`),{content:[{type:"text",text:JSON.stringify({success:G.success,message:G.success?`Successfully updated ${N.join(", ")}`:G.message,txHash:G.txHash,explorerUrl:G.explorerUrl,error:G.error},null,2)}]}}let r=n.wallet.smartAccountAddress,a=n.wallet.sessionKeyAddress,s=n.network.chainId,o=await we(n),i=t.takeProfit?ye(t.takeProfit,18):0n,u=t.stopLoss?ye(t.stopLoss,18):0n,d=U2(t.tradeHash,i,u),l=Ee(s,o),p=_e({chain:l,transport:Ze(o,n)}),y=await xt(()=>Tn(p,r),{operationName:"get-delegation-nonce"}),m=M0e({diamond:d.to,delegator:r,sessionKey:a,nonce:y,chainId:s,calldata:d.data}),g=t.takeProfit?`TP=$${t.takeProfit}`:"",h=t.stopLoss?`SL=$${t.stopLoss}`:"",w=`Update ${[g,h].filter(Boolean).join(", ")} on ${t.tradeHash.slice(0,10)}...`,v=await _n(m.delegation,s,n.wallet.keyId,w);m.delegation.signature=v;let T=await ht(),A=on(T),_=Tt({account:A,chain:l,transport:Ze(o,n)}),E=await dn(_,p,Ue.delegationManager,[{permissionContext:[m.delegation],executions:[Pt({target:d.to,value:d.value,callData:d.data})],mode:nn.SingleDefault}]),O=await Xt(p,E),$=[];return t.takeProfit&&$.push(t.takeProfit==="0"?"TP disabled":`TP=$${t.takeProfit}`),t.stopLoss&&$.push(t.stopLoss==="0"?"SL disabled":`SL=$${t.stopLoss}`),{content:[{type:"text",text:JSON.stringify({success:O.status==="success",message:O.status==="success"?`Successfully updated ${$.join(", ")}`:"Transaction reverted on-chain",txHash:E,explorerUrl:`https://monadvision.com/tx/${E}`},null,2)}]}}catch(n){let r=n instanceof Error?n.message:"Unknown error";return{content:[{type:"text",text:JSON.stringify({success:!1,message:"Failed to update TP/SL",error:r},null,2)}]}}})}Y();var h$="https://benchmarks.pyth.network/v1/shims/tradingview",gp={BTC:"Crypto.BTC/USD",ETH:"Crypto.ETH/USD",MON:"Crypto.MON/USD",SOL:"Crypto.SOL/USD",XRP:"Crypto.XRP/USD",DOGE:"Crypto.DOGE/USD",ADA:"Crypto.ADA/USD",AVAX:"Crypto.AVAX/USD",DOT:"Crypto.DOT/USD",LINK:"Crypto.LINK/USD",ATOM:"Crypto.ATOM/USD",NEAR:"Crypto.NEAR/USD",APT:"Crypto.APT/USD",SUI:"Crypto.SUI/USD",ARB:"Crypto.ARB/USD",OP:"Crypto.OP/USD",QQQ:"Equity.US.QQQ/USD",SPY:"Equity.US.SPY/USD",DIA:"Equity.US.DIA/USD",IWM:"Equity.US.IWM/USD",AAPL:"Equity.US.AAPL/USD",AMZN:"Equity.US.AMZN/USD",TSLA:"Equity.US.TSLA/USD",NVDA:"Equity.US.NVDA/USD",META:"Equity.US.META/USD",MSFT:"Equity.US.MSFT/USD",GOOG:"Equity.US.GOOG/USD",GOOGL:"Equity.US.GOOGL/USD",AMD:"Equity.US.AMD/USD",NFLX:"Equity.US.NFLX/USD",EUR:"FX.EUR/USD",GBP:"FX.GBP/USD",JPY:"FX.USD/JPY",CHF:"FX.USD/CHF",AUD:"FX.AUD/USD",CAD:"FX.USD/CAD","EUR/USD":"FX.EUR/USD","GBP/USD":"FX.GBP/USD","USD/JPY":"FX.USD/JPY","USD/CHF":"FX.USD/CHF","AUD/USD":"FX.AUD/USD","USD/CAD":"FX.USD/CAD",XAU:"Metal.XAU/USD",XAG:"Metal.XAG/USD",GOLD:"Metal.XAU/USD",SILVER:"Metal.XAG/USD"};var x$={1:"1 minute",5:"5 minutes",15:"15 minutes",30:"30 minutes",60:"1 hour",240:"4 hours",D:"Daily","1W":"Weekly","1M":"Monthly"},w$={1:60,5:300,15:900,30:1800,60:3600,240:14400,D:86400,"1W":604800,"1M":2592e3};m0();function G2(e,t=!1){let n;return e>=1e3?n=e.toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2}):e>=1?n=e.toFixed(2):n=e.toFixed(6),t?`$${n}`:n}function zae(e){let t=e.toUpperCase().trim();if(gp[t])return gp[t];if(t.startsWith("CRYPTO.")||t.startsWith("EQUITY.")||t.startsWith("FX.")||t.startsWith("METAL."))return t;let n=t.match(/^([A-Z0-9]+)\/USD$/);if(n){let r=n[1];return gp[r]?gp[r]:`Crypto.${r}/USD`}return`Crypto.${t}/USD`}function jae(e){let t=e.match(/(?:Crypto\.|Equity\.US\.|FX\.|Metal\.)?([A-Z0-9]+)(?:\/USD)?$/i);return t?t[1].toUpperCase():e}async function v$(e,t="60",n=100){let r=zae(e),a=jae(r),s=Math.floor(Date.now()/1e3),o=w$[t],i=s-n*o,u=new URL(`${h$}/history`);u.searchParams.set("symbol",r),u.searchParams.set("resolution",t),u.searchParams.set("from",String(i)),u.searchParams.set("to",String(s));let d=await xt(async()=>{let v=await fetch(u.toString(),{headers:{Accept:"application/json"}});if(!v.ok)throw new Error(`Pyth API error (${v.status}): ${v.statusText}`);return await v.json()},{operationName:`pyth-chart-${e}`,maxRetries:2});if(d.s==="error")throw new Error(d.errmsg||"Pyth Benchmark API error");if(d.s==="no_data"||!d.t||d.t.length===0)throw new Error(`No chart data available for ${e}. The symbol may not be supported or market may be closed.`);let l=d.t.map((v,T)=>({timestamp:v,datetime:new Date(v*1e3).toISOString(),open:d.o[T],high:d.h[T],low:d.l[T],close:d.c[T],volume:d.v?.[T]??0})),p=l[l.length-1].close,y=l[0].open,m=p-y,g=(m/y*100).toFixed(2),h=Math.max(...l.map(v=>v.high)),w=Math.min(...l.map(v=>v.low));return{symbol:a,pythSymbol:r,resolution:t,resolutionLabel:x$[t],candles:l,latestPrice:p,priceChange:m,priceChangePercent:`${m>=0?"+":""}${g}%`,periodHigh:h,periodLow:w}}var Aje=C.object({symbol:C.string().optional().describe("Asset symbol to get market stats for (e.g., 'BTC', 'ETH', 'MON', 'AAPL'). If omitted, returns stats for all supported LeverUp pairs. Use this to check current prices before opening positions.")});function qae(e){e.tool("leverup_get_market_stats","Get current market prices and stats for LeverUp trading pairs. Returns real-time Pyth oracle prices for all supported markets (crypto, stocks, forex, commodities). For holding fees, funding rates, and open interest, use leverup_get_funding_rates.",Aje.shape,async t=>{let n=await _je(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function _je(e){try{let t=Fn;if(e.symbol){let o=e.symbol.toUpperCase().trim();if(t=Fn.filter(i=>i.pair.toUpperCase().startsWith(o)||i.pair.toUpperCase()===`${o}/USD`||i.pair.toUpperCase().includes(o)),t.length===0)return{success:!1,message:`No LeverUp market found for '${e.symbol}'`,error:`Symbol '${e.symbol}' is not supported on LeverUp. Use leverup_list_pairs to see all available markets.`}}let n=t.map(o=>o.pythId),r=await K6(n),a=t.map(o=>{let i=r.parsed?.find(p=>`0x${p.id}`===o.pythId),u="N/A",d="N/A",l="N/A";if(i){let p=BigInt(i.price.price)*10n**BigInt(18+i.price.expo),y=Number(le(p,18));u=G2(y,!0);let m=BigInt(i.price.conf)*10n**BigInt(18+i.price.expo),g=Number(le(m,18));d=`\xB1$${g<1?g.toFixed(4):g.toFixed(2)}`,l=new Date(i.price.publish_time*1e3).toISOString()}return{symbol:o.pair,category:o.category,currentPrice:u,priceConfidence:d,publishTime:l,isHighLeveragePair:o.isHighLeverage??!1,pairBase:o.pairBase}}),s=[...new Set(a.map(o=>o.category))];return{success:!0,message:`Market stats for ${a.length} LeverUp pair${a.length>1?"s":""}`,data:{markets:a,supportedCategories:s,note:"For holding fees, funding rates, and open interest (long/short OI), use leverup_get_funding_rates."}}}catch(t){return{success:!1,message:"Failed to fetch market stats",error:t instanceof Error?t.message:"Unknown error"}}}var Eje=C.object({symbol:C.string().optional().describe("Asset symbol to get funding rates for (e.g., 'BTC', 'ETH', 'MON'). If omitted, returns funding rates for all supported LeverUp pairs. High-leverage pairs (500BTC, 500ETH) are excluded as they use zero-fee model.")});function Gae(e){e.tool("leverup_get_funding_rates","Get funding rates, holding fees, and open interest for LeverUp perpetual pairs. Returns: (1) Holding fee rates \u2014 flat per-second carry cost by direction. (2) Real-time funding rate \u2014 directional fee based on OI imbalance (dominant side pays). (3) Open interest \u2014 long/short quantities and OI ratio for squeeze detection. Use this to assess carry costs, directional crowding, and squeeze risk before opening positions.",Eje.shape,async t=>{let n=await kje(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function kje(e){try{let t=await Sre(e.symbol);if(t.length===0)return{success:!1,message:e.symbol?`No funding data found for '${e.symbol}'`:"No funding data available",error:e.symbol?`Symbol '${e.symbol}' is not supported on LeverUp. Use leverup_list_pairs to see available markets.`:"Could not fetch funding data from any pair."};let n=t.map(({symbol:r,category:a,holdingFeeRate8h:s,holdingFeeRate1h:o,fundingDirection:i,pairBase:u,marketInfo:d})=>{let l={symbol:r,category:a,holdingFeeRate8h:s,holdingFeeRate1h:o,fundingDirection:i,pairBase:u};return d&&(l.openInterest={longQty:d.longQty,shortQty:d.shortQty,oiRatio:d.oiRatio,dominantSide:d.dominantSide},l.realTimeFundingRate={rate8h:d.currentFundingRate8h,rate1h:d.currentFundingRate1h,direction:d.fundingRateDirection}),l});return{success:!0,message:`Funding rates and open interest for ${n.length} LeverUp pair${n.length>1?"s":""}`,data:{fundingRates:n,model:"LeverUp charges TWO separate fees: (1) Holding fee \u2014 flat per-second cost, varies by asset and direction. (2) Funding fee \u2014 directional, scales with OI imbalance (dominant side pays minority). The realTimeFundingRate shows the current per-second funding rate. Negative = shorts pay longs. openInterest shows long/short quantities (in asset units) and OI ratio for squeeze detection.",note:"High-leverage pairs (500BTC/500ETH) use zero-fee model and are excluded. All data read directly from on-chain Diamond Proxy contract."}}}catch(t){return{success:!1,message:"Failed to fetch funding rates",error:t instanceof Error?t.message:"Unknown error"}}}Te();t0();D0();mt();We();Ar();Y();var Ije=C.object({symbol:C.string().describe("Asset to trade (e.g. BTC, ETH, MON). NOTE: 500BTC and 500ETH are Zero-Fee pairs that ONLY support 500x, 750x, or 1001x leverage."),isLong:C.boolean().describe("true for Long (order triggers when price drops below trigger price), false for Short (order triggers when price rises above trigger price)"),marginAmount:C.string().describe("Amount of collateral (e.g. '10' for 10 MON). Recommended minimum: $10 USD."),leverage:C.number().min(1).max(1001).describe("Leverage multiplier. Normal pairs: 1-100x. Zero-Fee pairs (500BTC/500ETH): ONLY 500, 750, or 1001. HARD LIMIT: Position size (margin \xD7 leverage) must be at least $200 USD."),triggerPrice:C.string().describe("Price at which the order will trigger and fill. For LONG orders: must be BELOW current market price (buy the dip). For SHORT orders: must be ABOVE current market price (sell the top)."),collateralToken:C.enum(["MON","USDC","LVUSD","LVMON"]).default("MON").optional().describe("Collateral token: MON (native), USDC, LVUSD (vault USD), or LVMON (vault MON). Default: MON."),stopLoss:C.string().optional().describe("Stop Loss price in USD. Set to automatically close position at this price to limit losses. For Long orders, must be below the trigger price. For Short orders, must be above the trigger price."),takeProfit:C.string().optional().describe("Take Profit price in USD. Set to automatically close position at this price to secure profits. For Long orders, must be above the trigger price. For Short orders, must be below the trigger price. Max TP: 500% for leverage <50x, 300% for leverage \u226550x."),agentId:C.string().optional().describe("Sub-agent ID for autonomous execution (no Touch ID). If omitted, uses assistant mode with Touch ID confirmation. Note: For ERC20 collateral, approval must be set via assistant mode first.")});function Vae(e){e.tool("leverup_open_limit_order","Place a limit order on LeverUp that will trigger when the market reaches your specified price. For Long orders, the trigger price must be BELOW current market (buy the dip). For Short orders, the trigger price must be ABOVE current market (sell the top). If agentId provided: uses autonomous mode (no Touch ID). If no agentId: uses assistant mode (requires Touch ID).",Ije.shape,async t=>{let n=await Cje(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function Cje(e){try{let t=await q();if(!t||!Pe(t))return{success:!1,message:"Wallet not configured. Run setup_wallet first."};if(e.agentId){let N=await Fre(e.agentId,{symbol:e.symbol,isLong:e.isLong,marginAmount:e.marginAmount,leverage:e.leverage,triggerPrice:e.triggerPrice,collateralToken:e.collateralToken||"MON",stopLoss:e.stopLoss,takeProfit:e.takeProfit});return{success:N.success,message:N.message,data:N.success?{quote:{symbol:e.symbol,side:e.isLong?"LONG":"SHORT",leverage:e.leverage,triggerPrice:`$${e.triggerPrice}`,currentPrice:"N/A (autonomous)",marginAmount:e.marginAmount,positionSize:"N/A (autonomous)",stopLoss:e.stopLoss?`$${e.stopLoss}`:void 0,takeProfit:e.takeProfit?`$${e.takeProfit}`:void 0},txHash:N.txHash,explorerUrl:N.explorerUrl}:void 0,error:N.error}}if(_t()){let N=e.collateralToken??"MON",W=await O2(e.symbol,e.isLong,e.marginAmount,e.leverage,e.triggerPrice,N);if(!W.isTriggerValid)return{success:!1,message:W.triggerValidationMessage,error:"Invalid trigger price"};if(!W.meetsMinimums)return{success:!1,message:W.warnings.join(" "),error:"Quote validation failed"};let me=Fn.find(ze=>ze.pair===`${e.symbol}/USD`||ze.pair===e.symbol);if(me?.isHighLeverage&&!Qo(e.leverage))return{success:!1,message:`${me.pair} is a Zero-Fee pair that ONLY supports ${bo.join(", ")}x leverage.`,error:"Invalid leverage for Zero-Fee pair"};let j=ye(e.triggerPrice,18),Z=ye(e.marginAmount,Ca(N)),de=ye(W.positionSize,10),ne=await H2({symbol:e.symbol,isLong:e.isLong,amountIn:Z,leverage:e.leverage,qty:de,triggerPrice:j,collateralToken:N,stopLoss:e.stopLoss?ye(e.stopLoss,18):0n,takeProfit:e.takeProfit?ye(e.takeProfit,18):0n},t),be;return N==="MON"?be=await zn({target:ne.to,value:ne.value,callData:ne.data},t):be=await Vi(ne.tokenIn,ne.to,ne.amountIn,{target:ne.to,value:ne.value,callData:ne.data},t),be.success?{success:!0,message:`Successfully placed ${e.leverage}x ${e.isLong?"Long":"Short"} limit order on ${e.symbol} at $${e.triggerPrice}`,data:{quote:{symbol:W.symbol,side:e.isLong?"LONG":"SHORT",leverage:e.leverage,triggerPrice:`$${e.triggerPrice}`,currentPrice:`$${W.currentPrice}`,marginAmount:W.marginAmount,positionSize:`$${W.positionValueUsd}`,stopLoss:e.stopLoss?`$${e.stopLoss}`:void 0,takeProfit:e.takeProfit?`$${e.takeProfit}`:void 0},txHash:be.txHash,explorerUrl:be.explorerUrl}}:{success:!1,message:be.message,error:be.error}}let n=t.wallet.smartAccountAddress,r=t.wallet.sessionKeyAddress,a=t.network.chainId,s=await we(t),o=e.collateralToken??"MON",i=await O2(e.symbol,e.isLong,e.marginAmount,e.leverage,e.triggerPrice,o);if(!i.isTriggerValid)return{success:!1,message:i.triggerValidationMessage,error:"Invalid trigger price for order direction"};if(!i.meetsMinimums)return{success:!1,message:i.warnings.join(" "),error:"Quote validation failed"};let u=Fn.find(N=>N.pair===`${e.symbol}/USD`||N.pair===e.symbol);if(u?.isHighLeverage&&!Qo(e.leverage))return{success:!1,message:`${u.pair} is a Zero-Fee pair that ONLY supports ${bo.join(", ")}x leverage. Requested: ${e.leverage}x. Use a standard pair (BTC, ETH) for lower leverage.`,error:"Invalid leverage for Zero-Fee pair"};let d=parseFloat(e.triggerPrice);if(e.takeProfit){let N=parseFloat(e.takeProfit),W=X6(e.leverage),me=e.isLong?(N-d)/d*100:(d-N)/d*100;if(me<=0){let j=e.isLong?"above":"below";return{success:!1,message:`Invalid Take Profit price. For a ${e.isLong?"Long":"Short"} limit order, TP must be ${j} trigger price ($${d}).`,error:"Invalid TP direction"}}if(me>W)return{success:!1,message:`Take Profit exceeds maximum allowed. For ${e.leverage}x leverage, max TP is ${W}% profit from trigger price. Requested TP would be ~${me.toFixed(1)}% profit.`,error:"TP exceeds maximum"}}if(e.stopLoss){let N=parseFloat(e.stopLoss);if(e.isLong?N>=d:N<=d){let me=e.isLong?"below":"above";return{success:!1,message:`Invalid Stop Loss for ${e.isLong?"Long":"Short"} limit order. SL price ($${N}) must be ${me} trigger price ($${d}).`,error:"Invalid SL direction"}}}let l=ye(e.triggerPrice,18),p=ye(e.marginAmount,Ca(o)),y=ye(i.positionSize,10),m=await H2({symbol:e.symbol,isLong:e.isLong,amountIn:p,leverage:e.leverage,qty:y,triggerPrice:l,collateralToken:o,stopLoss:e.stopLoss?ye(e.stopLoss,18):0n,takeProfit:e.takeProfit?ye(e.takeProfit,18):0n},t),g=Ee(a,s),h=_e({chain:g,transport:Ze(s,t)}),w=Ca(o);if(o==="MON"){let N=await h.getBalance({address:n});if(N<m.value){let W=le(m.amountIn,w),me=le(m.amountIn-p,w);return{success:!1,message:`Insufficient native MON balance. Required: ${le(m.value,w)} MON (${e.marginAmount} margin + ${me} trading fee + Pyth fee). Available: ${le(N,w)} MON.`,error:"Insufficient balance"}}}else{let N=o==="USDC"?V0:o==="LVUSD"?g0:h0,W=await h.readContract({address:N,abi:Xe,functionName:"balanceOf",args:[n]});if(W<m.amountIn){let me=le(m.amountIn,w),j=le(W,w),Z=le(m.amountIn-p,w);return{success:!1,message:`Insufficient ${o} balance. Required: ${me} ${o} (${e.marginAmount} margin + ${Z} fee), Available: ${j} ${o}.`,error:"Insufficient balance"}}}let v=await Tn(h,n),T=[];if(o!=="MON"){let N=m.tokenIn,W=await h.readContract({address:N,abi:Xe,functionName:"allowance",args:[n,m.to]});if(W<m.amountIn){if(W>0n){let j=cs({tokenAddress:N,spender:m.to,amount:0n,delegator:n,sessionKey:r,nonce:v,chainId:a});T.push({delegation:j.delegation,execution:{target:N,value:0n,callData:X({abi:Xe,functionName:"approve",args:[m.to,0n]})},kind:"approve"})}let me=cs({tokenAddress:N,spender:m.to,amount:m.amountIn,delegator:n,sessionKey:r,nonce:v,chainId:a});T.push({delegation:me.delegation,execution:{target:N,value:0n,callData:X({abi:Xe,functionName:"approve",args:[m.to,m.amountIn]})},kind:"approve"})}}let A=R0e({diamond:m.to,delegator:n,sessionKey:r,nonce:v,chainId:a,calldata:m.data,value:m.value});T.push({delegation:A.delegation,execution:{target:m.to,value:m.value,callData:m.data},kind:"leverup_limit_order"});for(let N of T){let W;N.kind==="approve"?W=`Approve ${o} for LeverUp`:W=`LeverUp Limit: ${e.leverage}x ${e.isLong?"Long":"Short"} ${e.symbol} @ $${e.triggerPrice}`;let me=await _n(N.delegation,a,t.wallet.keyId,W);N.delegation.signature=me}let _=await ht(),E=on(_),O=Tt({account:E,chain:g,transport:Ze(s,t)}),$=T.filter(N=>N.kind==="approve");if($.length>0){let N=$.map(j=>({permissionContext:[j.delegation],executions:[Pt({target:j.execution.target,value:j.execution.value,callData:j.execution.callData})],mode:nn.SingleDefault})),W=await dn(O,h,Ue.delegationManager,N);if((await Xt(h,W)).status!=="success")return{success:!1,message:"Failed to approve token. Transaction reverted.",error:"Approve transaction failed"}}let B=T.find(N=>N.kind==="leverup_limit_order");if(!B)return{success:!1,message:"Internal error: trade delegation not found.",error:"Missing trade delegation"};let V=[{permissionContext:[B.delegation],executions:[Pt({target:B.execution.target,value:B.execution.value,callData:B.execution.callData})],mode:nn.SingleDefault}],M=await dn(O,h,Ue.delegationManager,V);return(await Xt(h,M)).status==="success"?{success:!0,message:`Successfully placed ${e.leverage}x ${e.isLong?"Long":"Short"} limit order on ${e.symbol} at $${e.triggerPrice}. Order will trigger when market ${e.isLong?"drops to":"rises to"} your price.`,data:{quote:{symbol:i.symbol,side:e.isLong?"LONG":"SHORT",leverage:e.leverage,triggerPrice:`$${e.triggerPrice}`,currentPrice:`$${i.currentPrice}`,marginAmount:i.marginAmount,positionSize:`$${i.positionValueUsd}`,stopLoss:e.stopLoss?`$${e.stopLoss}`:void 0,takeProfit:e.takeProfit?`$${e.takeProfit}`:void 0},txHash:M,explorerUrl:`https://monadvision.com/tx/${M}`}}:{success:!1,message:"Transaction reverted on-chain. Check your collateral balance and try again.",error:"Transaction reverted"}}catch(t){let n=t instanceof Error?t.message:"Unknown error";return{success:!1,message:`Failed to place limit order: ${n}`,error:n}}}Te();Y();var Pje=C.object({address:C.string().optional().describe("Optional address to check limit orders for. Defaults to your smart account.")});function Wae(e){e.tool("leverup_list_limit_orders","List all your pending LeverUp limit orders. These are orders that haven't been filled yet and will trigger when the market reaches the specified price. For filled positions, use leverup_list_positions instead.",Pje.shape,async t=>{let n=await Rje(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function Rje(e){try{let t=await q();if(!t||!Pe(t))return{success:!1,message:"Wallet not configured. Run setup_wallet first."};let n=e.address||t.wallet?.smartAccountAddress,r=await vre(n);if(r.length===0)return{success:!0,message:"No pending limit orders found.",data:{orders:[],note:"Limit orders trigger when the market price reaches your specified trigger price. Long orders trigger when price drops BELOW the trigger price. Short orders trigger when price rises ABOVE the trigger price."}};let a=r.map(o=>({orderHash:o.orderHash,pair:o.pair,side:o.isLong?"LONG":"SHORT",triggerPrice:`$${Number(le(o.limitPrice,18)).toFixed(2)}`,size:le(o.qty,10),margin:`${le(o.amountIn,18)} (collateral)`,stopLoss:o.stopLoss>0n?`$${Number(le(o.stopLoss,18)).toFixed(2)}`:"Not set",takeProfit:o.takeProfit>0n?`$${Number(le(o.takeProfit,18)).toFixed(2)}`:"Not set",createdAt:new Date(o.timestamp*1e3).toISOString()})),s=a.map(o=>`${o.pair} ${o.side} @ ${o.triggerPrice}`).join(", ");return{success:!0,message:`You have ${r.length} pending limit order${r.length>1?"s":""}. Summary: ${s}`,data:{orders:a,note:"To cancel an order, use leverup_cancel_limit_order with the orderHash. Orders will automatically fill when the market reaches your trigger price."}}}catch(t){return{success:!1,message:`Failed to fetch limit orders: ${t instanceof Error?t.message:"Unknown error"}`}}}Te();t0();D0();mt();We();Ar();Y();var $je=C.object({orderHashes:C.array(C.string().regex(/^0x[a-fA-F0-9]{64}$/)).min(1).describe("Array of limit order hashes to cancel. Use leverup_list_limit_orders to get the orderHashes of your pending orders."),agentId:C.string().optional().describe("Sub-agent ID for autonomous execution (no Touch ID). If omitted, uses assistant mode with Touch ID confirmation.")});function Zae(e){e.tool("leverup_cancel_limit_order","Cancel one or more pending LeverUp limit orders. If agentId provided: uses autonomous mode (no Touch ID). If no agentId: uses assistant mode (requires Touch ID). Use leverup_list_limit_orders first to see your pending orders and their orderHashes.",$je.shape,async t=>{let n=await Mje(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function Mje(e){try{let t=await q();if(!t||!Pe(t))return{success:!1,message:"Wallet not configured. Run setup_wallet first."};if(e.agentId){let A=await Mre(e.agentId,e.orderHashes);return{success:A.success,message:A.message,data:A.txHash?{cancelledOrders:e.orderHashes,txHash:A.txHash,explorerUrl:A.explorerUrl}:void 0,error:A.error}}if(_t()){let A=e.orderHashes,_=A.length===1?F2(A[0]):z2(A),E=await zn({target:_.to,value:_.value,callData:_.data},t);return{success:E.success,message:E.success?A.length===1?`Successfully cancelled limit order ${A[0]}`:`Successfully cancelled ${A.length} limit orders`:E.message,data:E.txHash?{cancelledOrders:A,txHash:E.txHash,explorerUrl:E.explorerUrl}:void 0,error:E.error}}let n=t.wallet.smartAccountAddress,r=t.wallet.sessionKeyAddress,a=t.network.chainId,s=await we(t),o=e.orderHashes,i=o.length===1?F2(o[0]):z2(o),u=Ee(a,s),d=_e({chain:u,transport:Ze(s,t)}),l=await Tn(d,n),p=$0e({diamond:i.to,delegator:n,sessionKey:r,nonce:l,chainId:a,calldata:i.data}),y=o.length===1?`Cancel limit order: ${o[0].slice(0,10)}...`:`Cancel ${o.length} limit orders`,m=await _n(p.delegation,a,t.wallet.keyId,y);p.delegation.signature=m;let g=await ht(),h=on(g),w=Tt({account:h,chain:u,transport:Ze(s,t)}),v=await dn(w,d,Ue.delegationManager,[{permissionContext:[p.delegation],executions:[Pt({target:i.to,value:i.value,callData:i.data})],mode:nn.SingleDefault}]);return(await Xt(d,v)).status==="success"?{success:!0,message:o.length===1?`Successfully cancelled limit order ${o[0]}`:`Successfully cancelled ${o.length} limit orders`,data:{cancelledOrders:o,txHash:v,explorerUrl:`https://monadvision.com/tx/${v}`}}:{success:!1,message:"Transaction reverted on-chain. The order may have already been filled or cancelled.",error:"Transaction reverted"}}catch(t){let n=t instanceof Error?t.message:"Unknown error";return{success:!1,message:`Failed to cancel limit order: ${n}`,error:n}}}var Dje=C.object({symbol:C.string().describe("Asset symbol to get chart data for. Examples: 'BTC', 'ETH', 'MON', 'SOL', 'AAPL', 'NVDA', 'TSLA', 'GOLD', 'EUR'. Also accepts pair format like 'BTC/USD'. CRITICAL: Use this to analyze price trends BEFORE making trading decisions."),resolution:C.enum(["1","5","15","30","60","240","D","1W","1M"]).optional().describe("Candlestick timeframe: '1' (1min), '5', '15', '30', '60' (1hr), '240' (4hr), 'D' (daily), '1W' (weekly), '1M' (monthly). Default: '60' (1 hour)."),bars:C.number().min(1).max(500).optional().describe("Number of candles to return (1-500). Default: 100. More bars = longer history but larger response.")});function Kae(e){e.tool("market_get_chart","Get OHLCV candlestick chart data for any asset (crypto, stocks, forex, commodities). Returns price history with open/high/low/close/volume for technical analysis. Data from Pyth Network - same oracle source used for LeverUp price feeds.",Dje.shape,async t=>{let n=await Oje(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function Oje(e){try{let t=e.resolution||"60",n=e.bars||100,r=await v$(e.symbol,t,n),a=G2(r.latestPrice);return{success:!0,message:`${r.symbol} ${r.resolutionLabel} chart: $${a} (${r.priceChangePercent})`,data:{symbol:r.symbol,pythSymbol:r.pythSymbol,resolution:r.resolution,resolutionLabel:r.resolutionLabel,latestPrice:r.latestPrice,priceChange:r.priceChangePercent,periodHigh:r.periodHigh,periodLow:r.periodLow,candleCount:r.candles.length,candles:r.candles}}}catch(t){let n=t instanceof Error?t.message:"Unknown error";return{success:!1,message:`Failed to get chart data for ${e.symbol}`,error:n}}}We();Te();var Nje=C.object({base:C.string().optional().describe("Base currency code for exchange rates. Default: 'USD'. Examples: 'USD', 'EUR', 'GBP', 'JPY'. Rates show how much of each currency equals 1 unit of base.")});function Xae(e){e.tool("market_get_fx_reference","Get current ECB exchange rates for major currencies. Use to understand FX market conditions and currency valuations. Returns rates relative to base currency (default USD).",Nje.shape,async t=>{let n=await Lje(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function Lje(e){if(!await Ct())return{success:!1,message:"Market intelligence requires x402 mode",error:"Please run set_mode with mode 'x402' first"};try{let r=(await q())?.network?.chainId||143,a=e.base?.toUpperCase()||"USD",s=`${gn()}/${r}/market/fx-ref?base=${a}`,o=await dt(s,{method:"GET",headers:{Accept:"application/json"}});if(!o.ok)throw new Error(`API error (${o.status}): ${o.statusText}`);let i=await o.json();if(!i.success)throw new Error(i.error||"API returned unsuccessful response");let u=Object.keys(i.data?.rates||{}).length;return{success:!0,message:`${a} exchange rates (${u} currencies) as of ${i.data?.date}`,data:i.data}}catch(n){return{success:!1,message:"Failed to get exchange rates",error:n instanceof Error?n.message:"Unknown error"}}}We();Te();var Bje=C.object({});function Jae(e){e.tool("market_get_currency_strength","Get currency strength matrix for major currencies (USD, EUR, GBP, JPY, etc.). Returns strength scores (0-100), 7-day momentum, and trend signals. Use to identify strong/weak currencies for FX trading decisions.",Bje.shape,async()=>{let t=await Uje();return{content:[{type:"text",text:JSON.stringify(t,null,2)}]}})}async function Uje(){if(!await Ct())return{success:!1,message:"Market intelligence requires x402 mode",error:"Please run set_mode with mode 'x402' first"};try{let n=(await q())?.network?.chainId||143,r=`${gn()}/${n}/market/strength`,a=await dt(r,{method:"GET",headers:{Accept:"application/json"}});if(!a.ok)throw new Error(`API error (${a.status}): ${a.statusText}`);let s=await a.json();if(!s.success)throw new Error(s.error||"API returned unsuccessful response");return{success:!0,message:`Currency strength (${s.data?.currencies?.length||0} currencies): Strongest=${s.data?.strongest}, Weakest=${s.data?.weakest}`,data:s.data}}catch(t){return{success:!1,message:"Failed to get currency strength",error:t instanceof Error?t.message:"Unknown error"}}}We();Te();var Hje=C.object({});function Qae(e){e.tool("market_get_economic_events","Get upcoming high-impact economic events (FOMC, NFP, CPI, GDP, etc.). Returns events from Forex Factory with impact ratings. Use to prepare for market-moving announcements.",Hje.shape,async()=>{let t=await Fje();return{content:[{type:"text",text:JSON.stringify(t,null,2)}]}})}async function Fje(){if(!await Ct())return{success:!1,message:"Market intelligence requires x402 mode",error:"Please run set_mode with mode 'x402' first"};try{let n=(await q())?.network?.chainId||143,r=`${gn()}/${n}/market/events`,a=await dt(r,{method:"GET",headers:{Accept:"application/json"}});if(!a.ok)throw new Error(`API error (${a.status}): ${a.statusText}`);let s=await a.json();if(!s.success)throw new Error(s.error||"API returned unsuccessful response");let o=s.events||[];return{success:!0,message:`${o.length} upcoming high-impact economic events`,data:{events:o,count:o.length}}}catch(t){return{success:!1,message:"Failed to get economic events",error:t instanceof Error?t.message:"Unknown error"}}}We();Te();var zje=C.object({});function Yae(e){e.tool("market_get_weekly_calendar","Get this week's economic calendar grouped by day. Returns high-impact events organized Monday-Friday. Use to plan trading around scheduled releases.",zje.shape,async()=>{let t=await jje();return{content:[{type:"text",text:JSON.stringify(t,null,2)}]}})}async function jje(){if(!await Ct())return{success:!1,message:"Market intelligence requires x402 mode",error:"Please run set_mode with mode 'x402' first"};try{let n=(await q())?.network?.chainId||143,r=`${gn()}/${n}/market/calendar`,a=await dt(r,{method:"GET",headers:{Accept:"application/json"}});if(!a.ok)throw new Error(`API error (${a.status}): ${a.statusText}`);let s=await a.json();if(!s.success)throw new Error(s.error||"API returned unsuccessful response");return{success:!0,message:`Weekly calendar (${s.data?.weekStart} to ${s.data?.weekEnd}): ${s.data?.totalEvents} events`,data:s.data}}catch(t){return{success:!1,message:"Failed to get weekly calendar",error:t instanceof Error?t.message:"Unknown error"}}}We();Te();var qje=C.object({limit:C.number().min(1).max(50).optional().describe("Maximum number of news items to return (1-50). Default: 50.")});function ese(e){e.tool("market_get_critical_news","Get critical and high-impact market news from the last 7 days. Uses 5-layer red detection for critical news identification. Includes central bank decisions, inflation data, and major market events.",qje.shape,async t=>{let n=await Gje(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function Gje(e){if(!await Ct())return{success:!1,message:"Market intelligence requires x402 mode",error:"Please run set_mode with mode 'x402' first"};try{let r=(await q())?.network?.chainId||143,a=e.limit||50,s=`${gn()}/${r}/market/news?limit=${a}`,o=await dt(s,{method:"GET",headers:{Accept:"application/json"}});if(!o.ok)throw new Error(`API error (${o.status}): ${o.statusText}`);let i=await o.json();if(!i.success)throw new Error(i.error||"API returned unsuccessful response");let u=i.events||[],d=u.filter(p=>p.isCritical).length,l=u.filter(p=>p.isHighImpact).length;return{success:!0,message:`${u.length} news items (${d} critical, ${l} high-impact)`,data:{events:u,count:u.length}}}catch(n){return{success:!1,message:"Failed to get critical news",error:n instanceof Error?n.message:"Unknown error"}}}We();Te();var Vje=C.object({query:C.string().describe("Search keyword to find in news headlines. Examples: 'fed', 'inflation', 'bitcoin', 'trump'."),days:C.number().min(1).max(7).optional().describe("Time window for search (1-7 days). Default: 7."),limit:C.number().min(1).max(50).optional().describe("Maximum number of results (1-50). Default: 20.")});function tse(e){e.tool("market_search_news","Search news headlines by keyword over the last 7 days. Use to find specific topics like 'fed', 'inflation', 'bitcoin', etc. Returns matching news items sorted by recency.",Vje.shape,async t=>{let n=await Wje(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function Wje(e){if(!await Ct())return{success:!1,message:"Market intelligence requires x402 mode",error:"Please run set_mode with mode 'x402' first"};try{let r=(await q())?.network?.chainId||143,{query:a}=e,s=e.days||7,o=e.limit||20,i=`${gn()}/${r}/market/search?q=${encodeURIComponent(a)}&days=${s}&limit=${o}`,u=await dt(i,{method:"GET",headers:{Accept:"application/json"}});if(!u.ok)throw new Error(`API error (${u.status}): ${u.statusText}`);let d=await u.json();if(!d.success)throw new Error(d.error||"API returned unsuccessful response");let l=d.events||[];return{success:!0,message:`Found ${l.length} news items matching "${a}" (last ${s} days)`,data:{query:a,days:s,events:l,count:l.length}}}catch(n){return{success:!1,message:`Failed to search news for "${e.query}"`,error:n instanceof Error?n.message:"Unknown error"}}}We();Te();var Zje=C.object({bank:C.string().optional().describe("Filter by central bank code. Options: 'FED', 'ECB', 'BOE', 'BOC', 'RBA', 'BOJ', 'SNB', 'RBNZ'. Leave empty for all banks."),limit:C.number().min(1).max(50).optional().describe("Maximum number of speeches to return (1-50). Default: 20.")});function nse(e){e.tool("market_get_cb_speeches","Get recent central bank speeches and policy announcements. Filter by bank (FED, ECB, BOE, etc.) or get all. Includes speaker names and content classification.",Zje.shape,async t=>{let n=await Kje(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function Kje(e){if(!await Ct())return{success:!1,message:"Market intelligence requires x402 mode",error:"Please run set_mode with mode 'x402' first"};try{let r=(await q())?.network?.chainId||143,a=e.bank?.toUpperCase(),s=e.limit||20,o=a?`&bank=${a}`:"",i=`${gn()}/${r}/market/speeches?limit=${s}${o}`,u=await dt(i,{method:"GET",headers:{Accept:"application/json"}});if(!u.ok)throw new Error(`API error (${u.status}): ${u.statusText}`);let d=await u.json();if(!d.success)throw new Error(d.error||"API returned unsuccessful response");let l=d.speeches||[],p=l.filter(y=>y.isCritical).length;return{success:!0,message:`${l.length} speeches from ${a||"all banks"} (${p} critical)`,data:{bank:d.bank||"all",speeches:l,count:l.length}}}catch(n){return{success:!1,message:"Failed to get central bank speeches",error:n instanceof Error?n.message:"Unknown error"}}}We();Te();var Xje=C.object({query:C.string().describe("Search query for recent tweets. Supports X search operators: 'lang:en', '-is:retweet', 'has:links', etc. Examples: 'monad', 'monad lang:en -is:retweet', '@pragma_xyz'."),max_results:C.number().min(10).max(100).optional().describe("Number of tweets to return (10-100). Default: 10. Cost scales linearly at $0.007/tweet."),sort_order:C.enum(["recency","relevancy"]).optional().describe("Sort order: 'recency' (default, newest first) or 'relevancy' (most relevant first).")});function rse(e){e.tool("x_search","Search recent tweets on X/Twitter. Returns tweets with author info and engagement metrics. Supports X search operators. Cost: $0.007 per tweet returned (variable pricing).",Xje.shape,async t=>{let n=await Jje(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function Jje(e){if(!await Ct())return{success:!1,message:"Social intelligence requires x402 mode",error:"Please run set_mode with mode 'x402' first"};try{let r=(await q())?.network?.chainId||143,{query:a}=e,s=e.max_results||10,o=e.sort_order||"recency",i=`${gn()}/${r}/x/search?q=${encodeURIComponent(a)}&max_results=${s}&sort_order=${o}`,u=await dt(i,{method:"GET",headers:{Accept:"application/json"}});if(!u.ok)throw new Error(`API error (${u.status}): ${u.statusText}`);let d=await u.json();if(!d.success)throw new Error(d.error||"API returned unsuccessful response");let l=d.tweets||[];return{success:!0,message:`Found ${l.length} tweets matching "${a}"`,data:{query:d.query||a,count:d.count||l.length,tweets:l,meta:d.meta||null}}}catch(n){return{success:!1,message:`Failed to search tweets for "${e.query}"`,error:n instanceof Error?n.message:"Unknown error"}}}We();Te();var Qje=C.object({tweet_id:C.string().describe("The numeric tweet ID to look up. Example: '1893024529028493352'. Found in tweet URLs: x.com/user/status/{tweet_id}.")});function ase(e){e.tool("x_get_tweet","Look up a specific tweet by ID. Returns full tweet text, author info, and engagement metrics (likes, retweets, replies, quotes, bookmarks, impressions). Cost: $0.007 per call.",Qje.shape,async t=>{let n=await Yje(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function Yje(e){if(!await Ct())return{success:!1,message:"Social intelligence requires x402 mode",error:"Please run set_mode with mode 'x402' first"};try{let r=(await q())?.network?.chainId||143,a=`${gn()}/${r}/x/tweet/${e.tweet_id}`,s=await dt(a,{method:"GET",headers:{Accept:"application/json"}});if(!s.ok)throw new Error(`API error (${s.status}): ${s.statusText}`);let o=await s.json();if(!o.success)throw new Error(o.error||"API returned unsuccessful response");if(!o.tweet)throw new Error("Tweet not found");return{success:!0,message:`Tweet by ${o.tweet.author?.username?`@${o.tweet.author.username}`:"unknown"}`,data:{tweet:o.tweet}}}catch(n){return{success:!1,message:`Failed to look up tweet "${e.tweet_id}"`,error:n instanceof Error?n.message:"Unknown error"}}}We();Te();var eqe=C.object({username:C.string().describe("X/Twitter username to look up (without @). Example: '0xelpabl0', 'vaborsh'.")});function sse(e){e.tool("x_get_user","Look up an X/Twitter user profile by username. Returns bio, follower count, tweet count, account age, and verification status. Cost: $0.014 per call.",eqe.shape,async t=>{let n=await tqe(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function tqe(e){if(!await Ct())return{success:!1,message:"Social intelligence requires x402 mode",error:"Please run set_mode with mode 'x402' first"};try{let r=(await q())?.network?.chainId||143,a=`${gn()}/${r}/x/user/${encodeURIComponent(e.username)}`,s=await dt(a,{method:"GET",headers:{Accept:"application/json"}});if(!s.ok)throw new Error(`API error (${s.status}): ${s.statusText}`);let o=await s.json();if(!o.success)throw new Error(o.error||"API returned unsuccessful response");if(!o.user)throw new Error("User not found");return{success:!0,message:`@${o.user.username}: ${o.user.metrics?.followers?.toLocaleString()||0} followers`,data:{user:o.user}}}catch(n){return{success:!1,message:`Failed to look up user "${e.username}"`,error:n instanceof Error?n.message:"Unknown error"}}}We();Te();var nqe=C.object({tweet_id:C.string().describe("The numeric tweet ID to get replies for. Example: '1893024529028493352'. Found in tweet URLs: x.com/user/status/{tweet_id}."),max_results:C.number().min(10).max(100).optional().describe("Number of replies to return (10-100). Default: 10. Cost scales linearly at $0.007/reply.")});function ose(e){e.tool("x_get_replies","Get replies to a specific tweet. Returns conversation participants sorted by recency with author info and engagement metrics. Cost: $0.007 per reply returned (variable pricing).",nqe.shape,async t=>{let n=await rqe(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function rqe(e){if(!await Ct())return{success:!1,message:"Social intelligence requires x402 mode",error:"Please run set_mode with mode 'x402' first"};try{let r=(await q())?.network?.chainId||143,a=e.max_results||10,s=`${gn()}/${r}/x/tweet/${e.tweet_id}/replies?max_results=${a}`,o=await dt(s,{method:"GET",headers:{Accept:"application/json"}});if(!o.ok)throw new Error(`API error (${o.status}): ${o.statusText}`);let i=await o.json();if(!i.success)throw new Error(i.error||"API returned unsuccessful response");let u=i.replies||[];return{success:!0,message:`Found ${u.length} replies to tweet ${e.tweet_id}`,data:{tweetId:e.tweet_id,count:i.count||u.length,replies:u,meta:i.meta||null}}}catch(n){return{success:!1,message:`Failed to get replies for tweet "${e.tweet_id}"`,error:n instanceof Error?n.message:"Unknown error"}}}We();Te();var aqe=C.object({username:C.string().describe("X/Twitter username to get tweets from (without @). Example: '0xelpabl0', 'naddotfun'."),max_results:C.number().min(10).max(100).optional().describe("Number of tweets to return (10-100). Default: 10. Cost scales linearly at $0.007/tweet."),exclude:C.enum(["replies","retweets"]).optional().describe("Exclude tweet type: 'replies' or 'retweets'. Omit to include all.")});function ise(e){e.tool("x_get_user_tweets","Get a user's recent tweets by username. Returns their timeline with engagement metrics. Can exclude replies or retweets. Cost: $0.007 per tweet returned (variable pricing).",aqe.shape,async t=>{let n=await sqe(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function sqe(e){if(!await Ct())return{success:!1,message:"Social intelligence requires x402 mode",error:"Please run set_mode with mode 'x402' first"};try{let r=(await q())?.network?.chainId||143,a=e.max_results||10,s=`${gn()}/${r}/x/user/${encodeURIComponent(e.username)}/tweets?max_results=${a}`;e.exclude&&(s+=`&exclude=${e.exclude}`);let o=await dt(s,{method:"GET",headers:{Accept:"application/json"}});if(!o.ok)throw new Error(`API error (${o.status}): ${o.statusText}`);let i=await o.json();if(!i.success)throw new Error(i.error||"API returned unsuccessful response");let u=i.tweets||[];return{success:!0,message:`Found ${u.length} tweets from @${e.username}`,data:{username:i.username||e.username,count:i.count||u.length,tweets:u,meta:i.meta||null}}}catch(n){return{success:!1,message:`Failed to get tweets from "@${e.username}"`,error:n instanceof Error?n.message:"Unknown error"}}}Y();Te();D0();Y();import{existsSync as T$,readFileSync as cqe,writeFileSync as uqe,unlinkSync as dqe,mkdirSync as fqe}from"node:fs";import{homedir as lqe}from"node:os";import*as S$ from"node:path";mt();m0();function cc(e){let t=-e.getTimezoneOffset(),n=t>=0?"+":"-",r=a=>String(Math.floor(Math.abs(a))).padStart(2,"0");return`${e.getFullYear()}-${r(e.getMonth()+1)}-${r(e.getDate())}T${r(e.getHours())}:${r(e.getMinutes())}:${r(e.getSeconds())}${n}${r(t/60)}:${r(t%60)}`}function Pa(e){let t=Date.now(),n=e-t;if(n<=0)return"Expired";let r=Math.floor(n/(1440*60*1e3)),a=Math.floor(n%(1440*60*1e3)/(3600*1e3));return r>0?`${r}d ${a}h`:a>0?`${a}h`:`${Math.floor(n%(3600*1e3)/(60*1e3))}m`}Y();var oqe="0x0000000000000000000000000000000000000000000000000000000000000000",cse=1440*60,z7={openMarketTrade:"0xca004414",closeTrade:"0x5177fd3b",addMargin:"0xe1379570",updateTpSl:"0x2f745df6",openLimitOrder:"0xf37afc20",cancelLimitOrder:"0x4584eff6",batchCancelLimitOrders:"0x54688625"},j7={buy:"0x6df9e92b",sell:"0x5de3085d",create:"0xba12cd8d"},V2={deposit:"0xd0e30db0",withdraw:"0x2e1a7d4d"},W2={execute:"0x1fff991f",exec:"0x2213bc0b"},Z2={transfer:"0xa9059cbb"};function use(e){switch(e){case"kairos":return[...Object.values(z7),...Object.values(V2),...Object.values(W2),...Object.values(Z2)];case"thymos":return[...Object.values(j7),...Object.values(V2),...Object.values(W2),...Object.values(Z2)];case"pragma":return[...Object.values(z7),...Object.values(j7),...Object.values(V2),...Object.values(W2),...Object.values(Z2)]}}function iqe(e,t,n){let s=[{type:"timestamp",afterThreshold:0,beforeThreshold:Math.floor(Date.now()/1e3)+e*cse},{type:"limitedCalls",limit:t}];return n!==void 0&&s.push({type:"nonce",nonce:ge(n)}),s}function dse(e){let{parentDelegation:t,subAgentAddress:n,mainAgentAddress:r,allowedTargets:a,allowedSelectors:s,expiryDays:o,valueLtePerTx:i,maxCalls:u,chainId:d,nonce:l}=e,p=E0(),m=Math.floor(Date.now()/1e3)+o*cse,g=iqe(o,u,l),h=s&&s.length>0?s:[],v=L0({environment:p,scope:{type:"functionCall",targets:a,selectors:h},from:r,to:n,caveats:g,salt:oqe}),T={...t,salt:typeof t.salt=="bigint"?t.salt:BigInt(t.salt)};v.authority=ec(T);let A=[ip.toLowerCase(),z5.toLowerCase(),z6.toLowerCase()];v.caveats=v.caveats.filter(O=>!A.includes(O.enforcer.toLowerCase()));let _=N7(a,h);v.caveats.unshift(_),v.caveats.push({enforcer:z6,terms:Zt([{type:"uint256"}],[i]),args:"0x"});let E=k0(v,d);return{delegation:v,typedData:E,expiresAt:m,approximateBudget:i*BigInt(u)}}function fse(e){let t=[];return(e.expiryDays<1||e.expiryDays>30)&&t.push("expiryDays must be between 1 and 30"),(e.maxCalls<1||e.maxCalls>1e3)&&t.push("maxCalls must be between 1 and 1000"),e.valueLtePerTx<0n&&t.push("valueLtePerTx must be non-negative"),e.allowedTargets.length===0&&t.push("allowedTargets must have at least one address"),{valid:t.length===0,errors:t}}var pqe="0x0000000000000000000000000000000000000000000000000000000000000000",lse=1440*60,mqe="root-delegation.json";function bqe(){let e=S$.join(lqe(),".pragma");return T$(e)||fqe(e,{recursive:!0}),e}function A$(){return S$.join(bqe(),mqe)}function yqe(e){let t=[],n=S6[e];return t.push(Yr),t.push(Kn),n?.aggregators?.router&&t.push(n.aggregators.router),e===143&&t.push(bp[143].router),t.push(V0),t.push(g0),t.push(h0),t}function gqe(){return[...Object.values(z7),...Object.values(j7),...Object.values(V2),...Object.values(W2),...Object.values(Z2)]}function hqe(e,t){return[{type:"timestamp",afterThreshold:0,beforeThreshold:Math.floor(Date.now()/1e3)+e*lse},{type:"limitedCalls",limit:t}]}function xqe(e){let{delegator:t,sessionKey:n,expiryDays:r,valueLtePerTx:a,maxCalls:s,chainId:o}=e,i=E0(),d=Math.floor(Date.now()/1e3)+r*lse,l=yqe(o),p=gqe(),y=hqe(r,s),g=L0({environment:i,scope:{type:"functionCall",targets:l,selectors:p},from:t,to:n,caveats:y,salt:pqe}),h=[ip.toLowerCase(),z5.toLowerCase(),z6.toLowerCase()];g.caveats=g.caveats.filter(T=>!h.includes(T.enforcer.toLowerCase()));let w=N7(l,p);g.caveats.unshift(w),g.caveats.push({enforcer:z6,terms:Zt([{type:"uint256"}],[a]),args:"0x"});let v=k0(g,o);return{delegation:g,typedData:v,expiresAt:d,approximateBudget:a*BigInt(s),allowedTargets:l}}async function pse(e){let{delegator:t,sessionKey:n,expiryDays:r,valueLtePerTx:a,maxCalls:s,chainId:o,keyId:i,touchIdMessage:u,budgetMon:d,budgetUsd:l,maxValuePerTx:p}=e,y=xqe({delegator:t,sessionKey:n,expiryDays:r,valueLtePerTx:a,maxCalls:s,chainId:o}),m=await _n(y.delegation,o,i,u??"Enable autonomous trading mode"),g={...y.delegation,signature:m},h={...y.delegation,salt:BigInt(y.delegation.salt)},v={delegationHash:ec(h),delegation:g,allowedTargets:y.allowedTargets,sessionKey:n,delegator:t,chainId:o,createdAt:Date.now(),expiresAt:y.expiresAt*1e3,valueLtePerTx:a.toString(),maxCalls:s,approximateBudget:y.approximateBudget.toString(),budgetMon:d??Ge(a*BigInt(s)),budgetUsd:l??"0",maxValuePerTx:p??Ge(a)},T=A$();return uqe(T,JSON.stringify(v,null,2)),v}function K2(){let e=A$();if(!T$(e))return null;try{let t=cqe(e,"utf-8");return JSON.parse(t)}catch{return null}}function hp(){let e=K2();if(!e)return{exists:!1,valid:!1};let t=Date.now()<e.expiresAt,n=t?Pa(e.expiresAt):"expired";return{exists:!0,valid:t,expiresAt:e.expiresAt,expiresIn:n,budgetMon:e.budgetMon??Ge(BigInt(e.approximateBudget)),budgetUsd:e.budgetUsd??"0",maxValuePerTx:e.maxValuePerTx??Ge(BigInt(e.valueLtePerTx)),maxCalls:e.maxCalls,sessionKey:e.sessionKey,delegator:e.delegator}}async function mse(){let e=0,t=0,n=await sc();for(let a of n){if(a.walletId)try{await Ia(a.walletId),t++}catch{}try{await mp(a.id),e++}catch{}}let r=A$();return T$(r)&&dqe(r),{subAgentsCleanedUp:e,walletsReleased:t}}function bse(e){let t=[];(e.expiryDays<1||e.expiryDays>30)&&t.push("expiryDays must be between 1 and 30"),(e.maxCalls<1||e.maxCalls>500)&&t.push("maxCalls must be between 1 and 500"),e.valueLtePerTx<0n&&t.push("valueLtePerTx cannot be negative");let n=Hr("100");return e.valueLtePerTx>n&&t.push("valueLtePerTx exceeds 100 MON per-tx safety limit"),{valid:t.length===0,errors:t}}var wqe=C.object({expiryDays:C.number().min(1).max(30).default(7).describe("How many days until delegation expires. Default: 7"),budgetMon:C.number().min(0).max(1e3).default(50).describe("Total MON budget authorized for all agents. Sub-agent allocations must fit within this ceiling. 0 = no native MON spending allowed. Default: 50"),budgetUsd:C.number().min(0).max(1e4).default(0).describe("Total USD-group budget (USDC + LVUSD) authorized for all agents. 0 = no USD spending limit. Default: 0"),maxValuePerTx:C.number().min(0).max(100).default(10).describe("Maximum native MON per single transaction. On-chain enforced via ValueLteEnforcer. 0 = block ALL native MON transactions including Pyth oracle fees (prevents LeverUp even with ERC20 collateral). Set > 0 if any agent will use LeverUp or native MON. Default: 10"),maxCalls:C.number().min(1).max(500).default(100).describe("Maximum delegation calls (trades + approvals combined). Each trade may need 1-2 calls (approve + execute). Default: 100"),force:C.boolean().default(!1).describe("Force creation even if a valid root delegation exists")});function yse(e){e.tool("create_root_delegation","Create a persistent root delegation for autonomous trading mode. This requires Touch ID ONCE to authorize the Main Agent (Claude's session key) to execute trades on your behalf. After this, sub-agents can be created without requiring additional Touch ID. The delegation is time-bound and call-count limited. Use this before creating sub-agents with create_sub_agent.",wqe.shape,async t=>{let n=await vqe(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function vqe(e){try{let t=await q();if(!t?.wallet)return{success:!1,message:"Wallet not configured",error:"Please run setup_wallet first"};let n=await ht();if(!n)return{success:!1,message:"Session key not found",error:"Please run setup_wallet to create a session key"};if(!e.force){let d=hp();if(d.exists&&d.valid)return{success:!1,message:"A valid root delegation already exists",existingDelegation:{expiresAt:d.expiresAt?new Date(d.expiresAt).toISOString():"unknown",expiresIn:d.expiresIn||"unknown",budgetMon:(d.budgetMon??"unknown")+" MON",budgetUsd:(d.budgetUsd??"0")+" USD",maxCalls:d.maxCalls??0},error:"Use force: true to replace the existing delegation, or wait for it to expire"}}let r=t.network.chainId,a=Hr(e.maxValuePerTx.toString()),s=bse({expiryDays:e.expiryDays,valueLtePerTx:a,maxCalls:e.maxCalls});if(!s.valid)return{success:!1,message:"Invalid delegation parameters",error:s.errors.join(", ")};let o=await pse({delegator:t.wallet.smartAccountAddress,sessionKey:n.address,expiryDays:e.expiryDays,valueLtePerTx:a,maxCalls:e.maxCalls,chainId:r,keyId:t.wallet.keyId,touchIdMessage:`Authorize autonomous trading: ${e.budgetMon} MON + ${e.budgetUsd} USD, max ${e.maxValuePerTx} MON/tx, ${e.maxCalls} calls, ${e.expiryDays} days`,budgetMon:e.budgetMon.toString(),budgetUsd:e.budgetUsd.toString(),maxValuePerTx:e.maxValuePerTx.toString()}),i=new Date(o.expiresAt),u=Pa(o.expiresAt);return{success:!0,message:"Root delegation created successfully. You can now create sub-agents without Touch ID.",rootDelegation:{delegationHash:o.delegationHash,sessionKey:o.sessionKey,delegator:o.delegator,budgetMon:e.budgetMon+" MON",budgetUsd:e.budgetUsd+" USD",maxValuePerTx:e.maxValuePerTx+" MON/tx",maxCalls:o.maxCalls,expiresAt:i.toISOString(),expiresIn:u,allowedTargets:o.allowedTargets}}}catch(t){let n=t instanceof Error?t.message:"Unknown error";return/cancell?ed|user denied/i.test(n)?{success:!1,message:"Touch ID cancelled",error:"User cancelled Touch ID authentication"}:{success:!1,message:"Failed to create root delegation",error:n}}}Y();Te();mt();D0();We();import{randomUUID as Sqe}from"node:crypto";m0();import{spawn as Tqe}from"node:child_process";var Wi=null;function gse(){if(Wi!==null){if(Wi.exitCode===null&&!Wi.killed)return;Wi=null}try{let e=Tqe("caffeinate",["-i","-s","-w",`${process.pid}`],{stdio:"ignore"});e.on("exit",()=>{Wi=null}),e.on("error",()=>{Wi=null}),Wi=e}catch{}}function q7(){if(Wi!==null){try{Wi.kill("SIGTERM")}catch{}Wi=null}}function Aqe(){let e=u$();if(!e)return null;try{let t={...e,salt:typeof e.salt=="bigint"?e.salt:BigInt(e.salt)},n=ec(t),r=_qe(e.caveats),a=Eqe(e.caveats),s=kqe(e.caveats);return{delegationHash:n,delegation:e,allowedTargets:[],sessionKey:e.delegate,delegator:e.delegator,chainId:143,createdAt:Date.now(),expiresAt:r*1e3,valueLtePerTx:a.toString(),maxCalls:s,approximateBudget:(a*BigInt(s)).toString(),budgetMon:Ge(a*BigInt(s)),budgetUsd:"0",maxValuePerTx:Ge(a)}}catch{return null}}function _qe(e){let t=e.find(a=>a.enforcer.toLowerCase()===Ue.enforcers.timestamp.toLowerCase());if(!t?.terms||t.terms==="0x")return 0;let n=t.terms,r=s9(`0x${n.slice(34)}`,"bigint");return Number(r)}function Eqe(e){let t=e.find(r=>r.enforcer.toLowerCase()===z6.toLowerCase());if(!t?.terms||t.terms==="0x")return 0n;let[n]=ua([{type:"uint256"}],t.terms);return n}function kqe(e){let t=e.find(r=>r.enforcer.toLowerCase()===Ue.enforcers.limitedCalls.toLowerCase());if(!t?.terms||t.terms==="0x")return 0;let[n]=ua([{type:"uint256"}],t.terms);return Number(n)}var Iqe=C.object({agentType:C.enum(["kairos","thymos","pragma"]).describe("Type of sub-agent to create. kairos: Strategic/macro trader for perps (patient, calculated). thymos: Momentum trader for memecoins (fast, conviction-based). pragma: General-purpose agent for any task."),budgetMon:C.number().min(0).max(100).describe("MON trading capital for this sub-agent. Must fit within root budgetMon. kairos/pragma require >= 1 (LeverUp's 1 wei Pyth fee needs ValueLteEnforcer > 0). For ERC20 strategies, 1 MON is a safety floor, not actual spend. thymos can use 0."),budgetUsd:C.number().min(0).optional().describe("USD group budget covering USDC + LVUSD (soft limit, agent self-tracks). Default: 0"),allowedGroups:C.array(C.enum(["MON","USD"])).optional().describe("Token groups this agent is allowed to spend. MON group: native MON, WMON, LVMON. USD group: USDC, LVUSD. Tokens acquired during trading are always sellable. Omit for unrestricted access."),allowedTokens:C.array(C.string()).optional().describe("Specific tokens this agent is allowed to spend (by symbol). More specific than allowedGroups \u2014 when set, takes priority. Examples: ['LVUSD'], ['USDC', 'LVUSD'], ['WMON']. Tokens acquired during trading are always sellable. Omit for no per-token restriction."),expiryDays:C.number().min(1).max(30).default(7).describe("How many days until delegation expires. Default: 7"),maxCalls:C.number().min(1).max(100).default(20).describe("Maximum delegation calls (trades + approvals). Each trade may need 1-2 calls (approve + execute). Default: 20"),fundAmount:C.number().min(0).max(10).default(1).describe("Initial gas funding in MON. Set to 0 to skip funding. Default: 1 MON. Max: 10 MON"),taskId:C.string().optional().describe("Optional Claude Code Task ID for tracking"),loopType:C.enum(["none","condition","continuous","interval"]).default("none").describe("Loop behavior. none=one-shot (agent runs once and stops), condition=until condition met (e.g., 'BTC >= 95000'), continuous=until budget/expiry exhausted, interval=periodic checks at fixed intervals"),loopCondition:C.string().optional().describe("For condition type: human-readable condition (e.g., 'BTC price >= 95000')"),loopIntervalMinutes:C.number().min(1).max(1440).optional().describe("For interval type: minutes between checks (e.g., 2 for every 2 minutes)"),mission:C.string().optional().describe("Natural language task re-injected as the agent's next prompt when the SubagentStop hook blocks exit. Must be actionable and self-contained. Example: 'Monitor BTC/USD. Buy when price hits $95,000. Budget: 10 MON.'"),maxIterations:C.number().min(0).max(1e4).default(0).describe("Safety valve: max loop iterations before forcing exit. 0 = unlimited. Default: 0")});function Cqe(e,t,n){switch(e){case"kairos":{let r=[Kn,Yr];return t&&r.push(t),r.push(V0,g0,h0),r}case"thymos":{let r=[];return n&&r.push(n),r.push(Yr),t&&r.push(t),r.push(V0,g0,h0),r}case"pragma":{let r=[Kn,Yr];return t&&r.push(t),n&&r.push(n),r.push(V0,g0,h0),r}}}function hse(e){e.tool("create_sub_agent","Create a new autonomous sub-agent with its own wallet and delegation. Sub-agents can execute trades within their budget constraints without requiring Touch ID. The delegation is signed by the session key and inherits from the user's root delegation. Use this for autonomous trading or monitoring tasks.",Iqe.shape,async t=>{let n=await Pqe(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function Pqe(e){try{let t=await q();if(!t?.wallet)return{success:!1,message:"Wallet not configured",error:"Please run setup_wallet first"};let n=await ht();if(!n)return{success:!1,message:"Session key not found",error:"Please run setup_wallet to create a session key"};let r=t.network.chainId,a=K2()??Aqe();if(!a)return{success:!1,message:"No root delegation found",error:"No delegation found. Use the delegation flow (request \u2192 approve \u2192 retrieve) to create one."};if(Date.now()>a.expiresAt)return{success:!1,message:"Root delegation has expired",error:"Delegation has expired. Please create a new one via the delegation flow."};if(a.sessionKey.toLowerCase()!==n.address.toLowerCase())return{success:!1,message:"Session key mismatch",error:"Delegation was created with a different session key. Please create a new delegation."};let s=Sqe(),o=e.taskId||`subagent-${s}`,i=await QR(o);if(!await oc(i.id))return await Ia(i.id),{success:!1,message:"Wallet key not found in Keychain",error:`Wallet ${i.id} exists in pool but private key missing from Keychain. This can happen if Keychain was reset or pragma-signer was rebuilt. Try running setup_wallet to repair, or delete ~/.pragma/wallet-pool.json and retry.`};try{let d=Hr(e.budgetMon.toString()),l=e.maxCalls>0?d/BigInt(e.maxCalls):0n;if(a.budgetMon!==void 0){let ct=parseFloat(a.budgetMon),fn=await BR(),Pn=parseFloat(Ge(fn));if(Pn+e.budgetMon>ct)return await Ia(i.id),{success:!1,message:"Exceeds root MON budget",error:`Root authorized ${ct} MON. Already allocated: ${Pn} MON. Requested: ${e.budgetMon} MON. Total ${Pn+e.budgetMon} exceeds ${ct}.`}}if(a.budgetUsd!==void 0&&e.budgetUsd&&e.budgetUsd>0){let ct=parseFloat(a.budgetUsd);if(ct>0){let fn=await UR(),Pn=parseFloat(fn.toString())/1e6;if(Pn+e.budgetUsd>ct)return await Ia(i.id),{success:!1,message:"Exceeds root USD budget",error:`Root authorized ${ct} USD. Already allocated: ${Pn} USD. Requested: ${e.budgetUsd} USD.`}}}if((e.agentType==="kairos"||e.agentType==="pragma")&&e.budgetMon<1)return await Ia(i.id),{success:!1,message:"Insufficient MON budget for LeverUp agent",error:`${e.agentType} agents require budgetMon >= 1. LeverUp's Pyth oracle fee (1 wei) is sent as execution.value \u2014 budgetMon: 0 sets ValueLteEnforcer to 0, blocking it. For ERC20 strategies this is a safety floor, not actual spend. Use budgetMon >= 1 or thymos agent type.`};if(a.maxValuePerTx!==void 0){let ct=Hr(a.maxValuePerTx);if(l>ct)return await Ia(i.id),{success:!1,message:"Sub-agent per-tx value exceeds root limit",error:`Sub-agent valueLtePerTx (${Ge(l)} MON) exceeds root maxValuePerTx (${a.maxValuePerTx} MON).`}}let m=S6[r]?.aggregators?.router,g=r===143?bp[143].router:void 0,h=Cqe(e.agentType,m,g),w=use(e.agentType),v=fse({subAgentAddress:i.address,mainAgentAddress:n.address,allowedTargets:h,allowedSelectors:w,expiryDays:e.expiryDays,valueLtePerTx:l,maxCalls:e.maxCalls,chainId:r});if(!v.valid)return await Ia(i.id),{success:!1,message:"Invalid delegation parameters",error:v.errors.join(", ")};let T=dse({subAgentAddress:i.address,mainAgentAddress:n.address,parentDelegation:a.delegation,allowedTargets:h,allowedSelectors:w,expiryDays:e.expiryDays,valueLtePerTx:l,maxCalls:e.maxCalls,chainId:r}),A=on(n),_=await A.signTypedData({domain:T.typedData.domain,types:T.typedData.types,primaryType:"Delegation",message:T.typedData.message}),E=e.budgetUsd&&e.budgetUsd>0?{[V0.toLowerCase()]:BigInt(Math.floor(e.budgetUsd*1e6))}:void 0,O=e.budgetUsd&&e.budgetUsd>0?{USD:BigInt(Math.floor(e.budgetUsd*1e6))}:void 0,$;if(e.allowedTokens&&e.allowedTokens.length>0){let ct=[],fn=[];for(let Pn of e.allowedTokens){let W0=Pn.toUpperCase(),Zi=E2[W0];if(Zi){ct.push(Zi);continue}let ea=fp(Pn);if(ea){ct.push(ea.address);continue}fn.push(Pn)}if(fn.length>0){let Pn=Object.keys(E2).join(", ");return await Ia(i.id),{success:!1,message:`Unknown token symbols in allowedTokens: [${fn.join(", ")}]. Core tokens: ${Pn}`}}$=ct}await $R({id:s,walletId:i.id,walletAddress:i.address,agentType:e.agentType,taskId:o,budget:{monAllocated:d,tokenLimits:E,groupBudgets:O,allowedGroups:e.allowedGroups,allowedTokens:$},maxCalls:e.maxCalls,expiresAt:T.expiresAt*1e3});let B={...T.delegation,signature:_},V={...T.delegation,salt:BigInt(T.delegation.salt)},G={delegationHash:ec(V),signedDelegation:B,parentDelegationHash:a.delegationHash,rootDelegation:a.delegation,createdAt:Date.now(),expiresAt:T.expiresAt*1e3};if(await OR(s,G),e.loopType&&e.loopType!=="none"){let ct=e.mission||`Continue your ${e.agentType} agent task. `+(e.loopCondition?`Condition: ${e.loopCondition}. `:"")+"Check get_sub_agent_state for current state.";switch(e.loopType){case"continuous":t$(s,ct,e.maxIterations??0);break;case"condition":n$(s,e.loopCondition||"condition not specified",ct,e.maxIterations??0);break;case"interval":r$(s,e.loopIntervalMinutes||5,ct,e.maxIterations??0);break}}gse();let N=await we(t),W=Ee(r,N),me=_e({chain:W,transport:gt(N,Ot(t))}),j=await O0(async()=>me.getBalance({address:i.address}),{operationName:"check-wallet-balance"}),Z=j.success?j.data??0n:0n,de,ne=0n,be="none";if(e.fundAmount>0){let ct=Hr(e.fundAmount.toString());if(Z>=ct)be="skipped";else{let fn=ct-Z,Pn=Tt({account:A,chain:W,transport:gt(N,Ot(t))}),W0=await O0(async()=>me.getBalance({address:n.address}),{operationName:"check-session-key-balance"});(W0.success?W0.data??0n:0n)>=fn&&(de=await Pn.sendTransaction({to:i.address,value:fn}),await me.waitForTransactionReceipt({hash:de}),ne=fn,be=Z>0n?"partial":"full")}}let ze=Z+ne,pt=T.expiresAt*1e3,rn=new Date(pt),zt=Pa(pt);return{success:!0,message:`Created ${e.agentType} sub-agent with ${e.budgetMon} MON budget`,subAgent:{id:s,walletAddress:i.address,walletBalance:Ge(ze)+" MON",agentType:e.agentType,budget:{mon:e.budgetMon+" MON",usd:(e.budgetUsd||0)+" USD",perTransaction:Ge(l)+" MON/tx",allowedGroups:e.allowedGroups||"unrestricted",allowedTokens:e.allowedTokens||"none (using allowedGroups)"},maxCalls:e.maxCalls,expiresAt:rn.toISOString(),expiresIn:zt,funding:{requested:e.fundAmount+" MON",existingBalance:Ge(Z)+" MON",transferred:Ge(ne)+" MON",decision:be},fundingTx:de,loop:e.loopType!=="none"?{type:e.loopType,active:!0,mission:e.mission,condition:e.loopCondition,intervalMinutes:e.loopIntervalMinutes,maxIterations:e.maxIterations??0}:void 0,keychainNote:"If macOS prompted for Keychain access, select 'Always Allow' to prevent interruptions during autonomous trading."}}}catch(d){try{await Ia(i.id)}catch{}throw d}}catch(t){return{success:!1,message:"Failed to create sub-agent",error:t instanceof Error?t.message:"Unknown error"}}}Y();Te();mt();D0();We();m0();var Rqe=C.object({subAgentId:C.string().describe("The sub-agent ID (UUID) to fund"),amountMon:C.number().min(.001).max(10).default(1).describe("Amount of MON to transfer for gas. Default: 1 MON. Max: 10 MON")});function xse(e){e.tool("fund_sub_agent","Transfer MON from session key to a sub-agent wallet for gas. Use to top up a sub-agent that needs more gas for transactions. Requires an active session key with sufficient balance.",Rqe.shape,async t=>{let n=await $qe(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function $qe(e){try{let t=await q();if(!t?.wallet)return{success:!1,message:"Wallet not configured",error:"Please run setup_wallet first"};let n=await ht();if(!n)return{success:!1,message:"Session key not found",error:"Please run setup_wallet to create a session key"};let r=await c0(e.subAgentId);if(!r)return{success:!1,message:"Sub-agent not found",error:`No sub-agent found with ID: ${e.subAgentId}`};let a=await oc(r.walletId);if(!a)return{success:!1,message:"Sub-agent wallet not found",error:`Wallet ${r.walletId} not found in pool or Keychain`};let s=t.network.chainId,o=await we(t),i=Ee(s,o),u=_e({chain:i,transport:gt(o,Ot(t))}),d=on(n),l=Tt({account:d,chain:i,transport:gt(o,Ot(t))}),p=await xt(async()=>u.getBalance({address:n.address}),{operationName:"check-session-key-balance"}),y=Hr(e.amountMon.toString());if(p<y)return{success:!1,message:"Insufficient session key balance",error:`Session key has ${Ge(p)} MON, need ${e.amountMon} MON`};let m=await xt(async()=>u.getBalance({address:a.address}),{operationName:"check-subagent-balance"}),g=await l.sendTransaction({to:a.address,value:y});await u.waitForTransactionReceipt({hash:g});let h=await xt(async()=>u.getBalance({address:a.address}),{operationName:"check-new-balance"});return{success:!0,message:`Funded sub-agent with ${e.amountMon} MON`,funding:{subAgentId:e.subAgentId,walletAddress:a.address,amountFunded:e.amountMon+" MON",previousBalance:Ge(m)+" MON",newBalance:Ge(h)+" MON",txHash:g}}}catch(t){return{success:!1,message:"Failed to fund sub-agent",error:t instanceof Error?t.message:"Unknown error"}}}Y();Te();var Mqe=C.object({status:C.enum(["all","pending","running","paused","completed","failed","revoked"]).optional().describe("Filter by status. Default: 'all'. Options: all, running, paused, completed, failed, revoked")});function wse(e){e.tool("list_sub_agents","List all sub-agents with their status, budget remaining, and trade counts. Use to monitor autonomous trading agents. Filter by status to see only running, completed, or failed agents.",Mqe.shape,async t=>{let n=await Oqe(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}function Dqe(e){let t=BigInt(e.budget.monAllocated),n=BigInt(e.budget.monSpent),r=e.budget.tokenSpent?Object.keys(e.budget.tokenSpent).length:0;return{id:e.id,agentType:e.agentType,status:e.status,taskAgentId:e.taskAgentId,walletAddress:e.walletAddress,budget:{monRemaining:Ge(t-n)+" MON",tokensTracked:r},trades:{executed:e.trades.executed,max:e.trades.maxAllowed},expiresIn:Pa(e.expiresAt),createdAt:cc(new Date(e.createdAt))}}async function Oqe(e){try{if(!(await q())?.wallet)return{success:!1,message:"Wallet not configured",subAgents:[],summary:{total:0,pending:0,running:0,paused:0,completed:0,failed:0,revoked:0},error:"Please run setup_wallet first"};let n=await sc(),r=n;e.status&&e.status!=="all"&&(r=n.filter(i=>i.status===e.status));let a=r.map(Dqe),s={total:n.length,pending:0,running:0,paused:0,completed:0,failed:0,revoked:0};for(let i of n)i.status in s&&s[i.status]++;let o;if(n.length===0)o="No sub-agents found";else if(e.status&&e.status!=="all")o=`Found ${r.length} ${e.status} sub-agent(s)`;else{let i=[];s.pending>0&&i.push(`${s.pending} pending`),s.running>0&&i.push(`${s.running} running`),s.completed>0&&i.push(`${s.completed} completed`),s.failed>0&&i.push(`${s.failed} failed`),s.revoked>0&&i.push(`${s.revoked} revoked`),o=`Found ${n.length} sub-agent(s): ${i.join(", ")}`}return{success:!0,message:o,subAgents:a,summary:s}}catch(t){return{success:!1,message:"Failed to list sub-agents",subAgents:[],summary:{total:0,pending:0,running:0,paused:0,completed:0,failed:0,revoked:0},error:t instanceof Error?t.message:"Unknown error"}}}Y();T6();Te();mt();We();m0();var Nqe=C.object({subAgentId:C.string().describe("The sub-agent ID (UUID) to revoke"),sweepBalance:C.boolean().default(!1).describe("Sweep remaining gas balance back to session key. Default: false (gas stays in wallet for reuse by future agents)")});function vse(e){e.tool("revoke_sub_agent","Revoke a sub-agent's delegation, optionally sweep its balance back to session key, and return its wallet to the pool for reuse. Use this to stop an autonomous agent and reclaim its resources. For on-chain invalidation, use revoke_root_delegation with revocationMode: 'onchain' which cascades to ALL sub-delegations via NonceEnforcer nonce increment.",Nqe.shape,async t=>{let n=await Lqe(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function Lqe(e){try{let t=await q();if(!t?.wallet)return{success:!1,message:"Wallet not configured",error:"Please run setup_wallet first"};let n=await c0(e.subAgentId);if(!n)return{success:!1,message:"Sub-agent not found",error:`No sub-agent found with ID: ${e.subAgentId}`};let r=n.status;if(n.status==="revoked")return{success:!1,message:"Sub-agent already revoked",error:"This sub-agent has already been revoked"};let a=await oc(n.walletId);if(!a){try{await Ia(n.walletId)}catch{}return await mp(e.subAgentId),{success:!0,message:"Sub-agent cleaned up (wallet not found in Keychain)",revocation:{subAgentId:e.subAgentId,previousStatus:r,balanceSwept:"0 MON",walletReturnedToPool:!0}}}let s=t.network.chainId,o=await we(t),i=Ee(s,o),u=_e({chain:i,transport:gt(o,Ot(t))}),d=0n,l;if(e.sweepBalance&&a.privateKey){let p=await O0(async()=>u.getBalance({address:a.address}),{operationName:"check-subagent-balance"}),y=p.success?p.data??0n:0n;if(y>0n){let m=await O0(async()=>u.getGasPrice(),{operationName:"get-gas-price"}),h=(m.success?m.data??0n:0n)*21000n;if(y>h){let w=ma(a.privateKey),v=Tt({account:w,chain:i,transport:gt(o,Ot(t))}),T=y-h;try{l=await v.sendTransaction({to:t.wallet.sessionKeyAddress,value:T}),await u.waitForTransactionReceipt({hash:l}),d=T}catch(A){console.error("Failed to sweep balance:",A)}}}}await Ia(n.walletId),await mp(e.subAgentId);try{(await sc()).some(m=>m.status==="running"||m.status==="pending"||m.status==="paused")||q7()}catch{}return{success:!0,message:`Revoked and cleaned up sub-agent ${n.agentType}.`,revocation:{subAgentId:e.subAgentId,previousStatus:r,balanceSwept:Ge(d)+" MON",sweepTxHash:l,walletReturnedToPool:!0}}}catch(t){return{success:!1,message:"Failed to revoke sub-agent",error:t instanceof Error?t.message:"Unknown error"}}}Y();Te();mt();We();m0();var Bqe=C.object({subAgentId:C.string().describe("The sub-agent ID (UUID) to get state for"),taskAgentId:C.string().optional().describe("Optional: Claude Code Task agent ID to store for resume capability. Pass this after spawning a Task to enable resume after gas top-up."),teammateName:C.string().optional().describe("Optional: Teammate name for TeammateIdle hook lookup. Pass the 'name' parameter from Task spawn (e.g., 'kairos-abc123')."),includeTrades:C.boolean().optional().describe("Include recent trade history. Default: true"),tradeLimit:C.number().min(1).max(100).optional().describe("Max number of trades to include. Default: 10")});function Tse(e){e.tool("get_sub_agent_state","Get detailed state for a specific sub-agent including budget, trades, errors, and loop config. Can store taskAgentId for resume and teammateName for TeammateIdle hook lookup. Use report_agent_status to update agent status.",Bqe.shape,async t=>{let n=await Uqe(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function Uqe(e){try{let h=function(N){return g[N]||{symbol:N.slice(0,10),decimals:18}},E=function(N,W,me,j){let Z=C7(_,N),de=Z>0n?Z:0n,ne=W-de,be=-Z,ze=W>0n?Number(de*10000n/W)/100:0,pt=zt=>`${le(zt,me)} ${j}`,rn=zt=>`${zt>=0n?"+":"-"}${pt(zt>=0n?zt:-zt)}`;return{group:N,budget:pt(W),budgetConsumed:pt(de),remaining:pt(ne),pnl:rn(be),trackedPositions:A,utilization:`${ze.toFixed(1)}%`}};var t=h,n=E;let r=await q();if(!r?.wallet)return{success:!1,message:"Wallet not configured",error:"Please run setup_wallet first"};let a=await c0(e.subAgentId);if(!a)return{success:!1,message:"Sub-agent not found",error:`No sub-agent found with ID: ${e.subAgentId}`};let s=!1;if((e.taskAgentId||e.teammateName)&&(await Fi(e.subAgentId,{...e.taskAgentId&&{taskAgentId:e.taskAgentId},...e.teammateName&&{teammateName:e.teammateName}}),s=!0,a=await c0(e.subAgentId),!a))return{success:!1,message:"Failed to reload state after update",error:"State was updated but could not be reloaded"};let o=await we(r),i=Ee(r.network.chainId,o),u=_e({chain:i,transport:gt(o,Ot(r))}),d=await O0(async()=>u.getBalance({address:a.walletAddress}),{operationName:"check-wallet-balance"}),l=d.success?d.data??0n:0n,p=BigInt(a.budget.monAllocated),y=BigInt(a.budget.monSpent),m=await LR(e.subAgentId),g={[Hn.toLowerCase()]:{symbol:"MON",decimals:18},[I7.toLowerCase()]:{symbol:"USDC",decimals:6},"0x754704bc059f8c67012fed69bc8a327a5aafb603":{symbol:"USDC",decimals:6},"0x0f0bdebf0f83cd1ee3974779bcb7315f9808c714":{symbol:"USDT",decimals:6},"0xe0590015a873bf326bd645c3e1266d4db41c4e6b":{symbol:"WMON",decimals:18},"0x3bd359c1119da7da1d913d1c4d2b7c461115433a":{symbol:"WMON",decimals:18},"0xfd44b35139ae53fff7d8f2a9869c503d987f00d1":{symbol:"LVUSD",decimals:18},"0x91b81bfbe3a747230f0529aa28d8b2bc898e6d56":{symbol:"LVMON",decimals:18}},w=m?Object.entries(m).map(([N,{spent:W,limit:me}])=>{let{symbol:j,decimals:Z}=h(N),de=ne=>`${le(ne,Z)} ${j}`;return{address:N,symbol:j,spent:de(W),limit:me!==null?de(me):null,remaining:me!==null?de(me-W):null}}):[],v=await FR(e.subAgentId),T=v?Object.entries(v).filter(([,N])=>N.out>0n||N.in>0n).map(([N,W])=>{let{symbol:me,decimals:j}=h(N),Z=de=>`${le(de<0n?-de:de,j)} ${me}`;return{address:N,symbol:me,out:Z(W.out),in:Z(W.in),net:`${W.net>=0n?"+":"-"}${Z(W.net>=0n?W.net:-W.net)}`,group:W.group}}):void 0,A=0;try{A=zi(e.subAgentId).length}catch{}let _=a,O=[],$=a.budget.groupBudgets?.MON?BigInt(a.budget.groupBudgets.MON):p;if(O.push(E("MON",$,18,"MON")),a.budget.groupBudgets?.USD){let N=BigInt(a.budget.groupBudgets.USD);O.push(E("USD",N,6,"USD"))}let B=R2(e.subAgentId),V;if(e.includeTrades!==!1){let N=await DR(e.subAgentId),W=e.tradeLimit||10;V=N.slice(-W).reverse().map(me=>({timestamp:cc(new Date(me.timestamp)),action:me.action,protocol:me.protocol,txHash:me.txHash,success:me.success}))}let M=Date.now(),G=a.expiresAt<M;return{success:!0,message:s?`Sub-agent ${a.agentType} updated and retrieved`:`Sub-agent ${a.agentType} (${a.status})`,updated:s,state:{id:a.id,agentType:a.agentType,status:a.status,walletAddress:a.walletAddress,walletBalance:Ge(l)+" MON",taskId:a.taskId,taskAgentId:a.taskAgentId,budget:{monAllocated:Ge(p)+" MON",monSpent:Ge(y)+" MON",monRemaining:Ge(p-y)+" MON",tokenSpending:w,tokenFlows:T,groupBudgets:O.length>0?O:void 0},trades:{executed:a.trades.executed,maxAllowed:a.trades.maxAllowed,remaining:a.trades.maxAllowed-a.trades.executed},timing:{createdAt:cc(new Date(a.createdAt)),lastActivityAt:cc(new Date(a.lastActivityAt)),expiresAt:cc(new Date(a.expiresAt)),expiresIn:Pa(a.expiresAt),isExpired:G},errors:a.errors.slice(-10).map(N=>({timestamp:cc(new Date(N.timestamp)),message:N.message,recoverable:N.recoverable})),loop:B?{type:B.type,active:B.active,mission:B.mission,condition:B.condition,intervalMinutes:B.intervalMinutes,currentIteration:B.currentIteration??0,maxIterations:B.maxIterations??0}:void 0,recentTrades:V}}}catch(r){return{success:!1,message:"Failed to get sub-agent state",error:r instanceof Error?r.message:"Unknown error"}}}Te();var Hqe=C.object({agentId:C.string().describe("The sub-agent ID (UUID) reporting its status"),status:C.enum(["running","paused","completed","failed"]).describe("The new status: 'running' = actively working, 'paused' = temporarily stopped (e.g., low gas), can resume, 'completed' = user's goal was achieved, 'failed' = user's goal was NOT achieved (expired, error, budget depleted, etc.)"),reason:C.string().optional().describe("Optional reason for the status. Examples: 'Task achieved - opened BTC long at $95,200', 'Low gas - 0.05 MON remaining', 'Delegation expired - target not reached', 'Max trades reached (10/10) - target not achieved'")});function Sse(e){e.tool("report_agent_status","Report sub-agent status. Sub-agents MUST call this to report their status: when task is completed/failed, when pausing (low gas), or when resuming. This is the unified method for all status updates.",Hqe.shape,async t=>{let n=await Fqe(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function Fqe(e){try{if(!(await q())?.wallet)return{success:!1,message:"Wallet not configured",error:"Please run setup_wallet first"};let n=await c0(e.agentId);if(!n)return{success:!1,message:"Sub-agent not found",error:`No sub-agent found with ID: ${e.agentId}`};let r=n.status;if(n.status==="revoked")return{success:!1,message:"Cannot update revoked agent",error:"This sub-agent has been revoked and cannot be updated"};if(await Fi(e.agentId,{status:e.status}),e.reason)try{ka(e.agentId,{ts:Date.now(),type:e.status==="running"?"reasoning":"status",text:`[${e.status}] ${e.reason}`})}catch{}if(e.status==="completed"||e.status==="failed")try{e$(e.agentId)}catch{}return{success:!0,message:`Status updated: ${r} \u2192 ${e.status}`,previousStatus:r,newStatus:e.status,reason:e.reason}}catch(t){return{success:!1,message:"Failed to report status",error:t instanceof Error?t.message:"Unknown error"}}}Y();Te();mt();We();m0();var zqe=[{type:"function",name:"callCounts",stateMutability:"view",inputs:[{name:"delegationManager",type:"address"},{name:"delegationHash",type:"bytes32"}],outputs:[{name:"count",type:"uint256"}]}],jqe=C.object({agentId:C.string().optional().describe("Optional sub-agent ID to check. If omitted, checks root delegation status.")});function Ase(e){e.tool("check_delegation_status","Check the validity of root delegation or a sub-agent's delegation. Includes on-chain call count verification. Use without agentId to check root delegation status. Use with agentId to check a specific sub-agent's delegation. Returns expiry info, validity, and remaining calls (on-chain).",jqe.shape,async t=>{let n=await qqe(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function qqe(e){try{let t=await q();return t?.wallet?e.agentId?Vqe(e.agentId,t):Gqe(t):{success:!1,message:"Wallet not configured",error:"Please run setup_wallet first"}}catch(t){return{success:!1,message:"Failed to check delegation status",error:t instanceof Error?t.message:"Unknown error"}}}async function _se(e,t,n){if(!e)return null;try{let r=e.network.chainId,a=await we(e),s=Ee(r,a),o=E0(),i=_e({chain:s,transport:gt(a,Ot(e))}),u=await O0(async()=>i.readContract({address:o.caveatEnforcers.LimitedCallsEnforcer,abi:zqe,functionName:"callCounts",args:[o.DelegationManager,t]}),{operationName:"callCounts"});if(!u.success||u.data===void 0)return null;let d=u.data,l=Number(d),p=Math.max(0,n-l);return{used:l,limit:n,remaining:p,exhausted:p===0}}catch(r){return console.error("Failed to fetch on-chain call count:",r),null}}async function Gqe(e){let t=hp();if(!t.exists)return{success:!0,message:"No root delegation found",delegation:{type:"root",exists:!1,valid:!1,expired:!1}};let n=!t.valid,r=K2(),a=null;r&&t.maxCalls&&(a=await _se(e,r.delegationHash,t.maxCalls));let s=a?.exhausted??!1,o=t.valid&&!s,i;return n?i="Root delegation has expired":s?i="Root delegation call limit exhausted":a?i=`Root delegation valid: ${a.remaining}/${a.limit} calls remaining, expires in ${t.expiresIn}`:i=`Root delegation valid for ${t.expiresIn}`,{success:!0,message:i,delegation:{type:"root",exists:!0,valid:o,expired:n,expiresAt:t.expiresAt?new Date(t.expiresAt).toISOString():void 0,expiresIn:t.expiresIn,callCount:a??void 0,maxCalls:t.maxCalls,budgetMon:t.budgetMon,budgetUsd:t.budgetUsd,maxValuePerTx:t.maxValuePerTx}}}async function Vqe(e,t){let n=await c0(e);if(!n)return{success:!1,message:"Sub-agent not found",error:`No sub-agent found with ID: ${e}`};let r=await pp(e);if(!r)return{success:!0,message:"Sub-agent exists but delegation not found",delegation:{type:"sub-agent",exists:!1,valid:!1,expired:!1,agentId:e,agentType:n.agentType,agentStatus:n.status}};let s=Date.now()>r.expiresAt,o=null,i=n.trades.maxAllowed;r.delegationHash&&(o=await _se(t,r.delegationHash,i));let u=o?.exhausted??!1,d=!s&&!u&&n.status!=="revoked"&&n.status!=="failed",l;return s?l="Sub-agent delegation has expired":u?l="Sub-agent call limit exhausted":o?l=`Sub-agent delegation valid: ${o.remaining}/${o.limit} calls remaining, expires in ${Pa(r.expiresAt)}`:l=`Sub-agent delegation valid for ${Pa(r.expiresAt)}`,{success:!0,message:l,delegation:{type:"sub-agent",exists:!0,valid:d,expired:s,expiresAt:new Date(r.expiresAt).toISOString(),expiresIn:s?"expired":Pa(r.expiresAt),callCount:o??void 0,agentId:e,agentType:n.agentType,agentStatus:n.status,tradesExecuted:n.trades.executed,tradesMax:n.trades.maxAllowed}}}Y();We();m0();D0();Te();var Wqe=[{type:"function",name:"incrementNonce",stateMutability:"nonpayable",inputs:[{name:"delegationManager",type:"address"}],outputs:[]}];var Zqe=[{type:"function",name:"execute",inputs:[{name:"_execution",type:"tuple",components:[{name:"target",type:"address"},{name:"value",type:"uint256"},{name:"callData",type:"bytes"}]}],outputs:[],stateMutability:"payable"}],Ese=500000n,kse=400000n,Ise=100000n;async function Kqe(e){return xt(async()=>{let t=await dt(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",method:"pimlico_getUserOperationGasPrice",params:[],id:1})});if(!t.ok)throw new Error(`Gas price request failed: ${t.status}`);let n=await t.json();if(n.error)throw new Error(`Gas price error: ${n.error.message}`);let r=n.result?.fast??n.result?.standard;if(!r)throw new Error("No gas price data returned");return{maxFeePerGas:BigInt(r.maxFeePerGas),maxPriorityFeePerGas:BigInt(r.maxPriorityFeePerGas)}},{operationName:"revocation-gas-price"})}function _$(e){if(!e||e==="0x")return;let t=BigInt(e);return t>0n?t:void 0}async function Xqe(e,t,n){return xt(async()=>{let r=await dt(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",method:"eth_estimateUserOperationGas",params:[t,n],id:1})});if(!r.ok)throw new Error(`Gas estimation failed: ${r.status}`);let a=await r.json();if(a.error)throw new Error(`Gas estimation error: ${a.error.message}`);let s=a.result??{};return{callGasLimit:_$(s.callGasLimit),verificationGasLimit:_$(s.verificationGasLimit),preVerificationGas:_$(s.preVerificationGas)}},{operationName:"revocation-estimate-gas"})}function E$(e,t){return e!==void 0&&e>t?e:t}function Jqe(e,t){e.callGasLimit=E$(t.callGasLimit,Ise),e.verificationGasLimit=E$(t.verificationGasLimit,Ese),e.preVerificationGas=E$(t.preVerificationGas,kse)}async function Qqe(e,t,n){let r=await dt(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",method:"eth_sendUserOperation",params:[t,n],id:1})}),a=await r.json();if(!r.ok){let s=a.error?.message||`HTTP ${r.status}`;throw new Error(`Send UserOp failed: ${s}`)}if(a.error)throw new Error(`UserOp error: ${a.error.message}`);if(!a.result)throw new Error("No userOpHash returned");return a.result}async function Yqe(e,t,n=6e4){let r=Date.now();for(;Date.now()-r<n;){let a=await dt(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",method:"eth_getUserOperationReceipt",params:[t],id:1})});if(a.ok){let s=await a.json();if(s.error){await new Promise(o=>setTimeout(o,2e3));continue}if(s.result?.receipt?.transactionHash)return{transactionHash:s.result.receipt.transactionHash}}await new Promise(s=>setTimeout(s,2e3))}throw new Error(`Timeout waiting for UserOp ${t}`)}async function Cse(e,t,n){let r=await Tn(t,e.address),a=X({abi:Wqe,functionName:"incrementNonce",args:[xe(Ue.delegationManager)]}),s=X({abi:Zqe,functionName:"execute",args:[{target:Ue.enforcers.nonce,value:0n,callData:a}]}),o=await Ol(n),i=await e.smartAccount.getNonce?.()??0n,u=await Kqe(o),d={sender:e.address,nonce:i,callData:s,callGasLimit:Ise,verificationGasLimit:Ese,preVerificationGas:kse,maxFeePerGas:u.maxFeePerGas,maxPriorityFeePerGas:u.maxPriorityFeePerGas,signature:"0x"},l=e.smartAccount.entryPoint.address;try{let w=Jo({...d,signature:"0x"}),v=await Xqe(o,w,l);Jqe(d,v)}catch(w){console.warn("Failed to estimate gas for nonce increment, using defaults:",w)}let p=await e.smartAccount.signUserOperation(d);d.signature=p;let y=Jo({...d,signature:p}),m=await Qqe(o,y,l),g=await Yqe(o,m);await new Promise(w=>setTimeout(w,2e3));let h=await Tn(t,e.address);return{userOpHash:m,transactionHash:g.transactionHash,previousNonce:r,newNonce:h}}Te();mt();Y();We();var eGe=C.object({confirm:C.boolean().describe("Must be true to confirm revocation. This is a destructive action that revokes ALL autonomous permissions, archives ALL sub-agent states, and releases ALL wallets."),revocationMode:C.enum(["local","onchain"]).default("local").describe("Revocation mode. 'local' (default): deletes local delegation files only. 'onchain': increments NonceEnforcer nonce via UserOp (Touch ID required), which invalidates ALL delegations on-chain, then performs local cleanup. Use 'onchain' if you suspect session key compromise or want immediate on-chain invalidation.")});function Pse(e){e.tool("revoke_root_delegation","Revoke the root delegation entirely, cascading cleanup to ALL sub-agents. Archives all sub-agent states, releases all wallets to pool, and deletes root-delegation.json. After this, no autonomous trading is possible until a new root delegation is created. Requires confirm: true as a safety measure. Set revocationMode to 'onchain' to also invalidate all delegations on-chain via NonceEnforcer (requires Touch ID, recommended if session key may be compromised).",eGe.shape,async t=>{let n=await tGe(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function tGe(e){try{if(!e.confirm)return{success:!1,message:"Confirmation required",error:"Set confirm: true to proceed. This will revoke ALL autonomous permissions and archive ALL sub-agent states."};if(!hp().exists)return{success:!1,message:"No root delegation found",error:"There is no root delegation to revoke."};let n;if(e.revocationMode==="onchain"){let o=await q();if(!o||!Pe(o))return{success:!1,message:"Wallet not configured",error:"Please run setup_wallet first to use on-chain revocation."};let i=await j5(o,{touchIdMessage:"Revoke ALL delegations (nuclear revoke)"}),u=await we(o),d=Ee(o.network.chainId,u),l=_e({chain:d,transport:gt(u,Ot(o))});try{let p=await Cse(i,l,o);n={userOpHash:p.userOpHash,transactionHash:p.transactionHash,previousNonce:p.previousNonce.toString(),newNonce:p.newNonce.toString()}}catch(p){let y=p instanceof Error?p.message:"Unknown error";return/cancell?ed|user denied/i.test(y)?{success:!1,message:"Touch ID cancelled",error:"On-chain revocation requires Touch ID confirmation. Please try again."}:{success:!1,message:"On-chain revocation failed",error:`Failed to increment nonce on-chain: ${y}. Local delegation files were NOT removed.`}}}let r=await mse();q7();let a=e.revocationMode==="onchain"?"on-chain + local":"local",s=n?` Nonce incremented from ${n.previousNonce} to ${n.newNonce} (all old delegations invalidated on-chain).`:"";return{success:!0,message:`Root delegation revoked (${a}). ${r.subAgentsCleanedUp} sub-agent(s) archived, ${r.walletsReleased} wallet(s) released.`+s,revocation:{subAgentsCleanedUp:r.subAgentsCleanedUp,walletsReleased:r.walletsReleased},onChainRevocation:n}}catch(t){return{success:!1,message:"Failed to revoke root delegation",error:t instanceof Error?t.message:"Unknown error"}}}var nGe=C.object({filter:C.enum(["all","idle","active"]).default("all").describe("Filter wallets by status. idle = available for new agents, active = currently assigned to an agent, all = show everything. Default: all")});function Rse(e){e.tool("list_wallet_pool","List all wallets in the sub-agent wallet pool. Shows wallet addresses, status (idle/active), and which agent they are assigned to.",nGe.shape,async t=>{let n=rGe(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}function rGe(e){try{let t=e.filter==="all"?void 0:e.filter,n=D7(t),r=e.filter==="all"?n:D7(),a=r.filter(i=>i.status==="idle").length,s=r.filter(i=>i.status==="active").length,o=n.map(i=>({id:i.id,address:i.address,status:i.status,assignedTo:i.assignedTo,lastUsedAt:new Date(i.lastUsedAt).toISOString()}));return n.length===0?{success:!0,message:e.filter==="all"?"Wallet pool is empty. A wallet will be created when you create a sub-agent.":`No ${e.filter} wallets in pool.`,data:{wallets:[],summary:{total:r.length,idle:a,active:s}}}:{success:!0,message:`${n.length} wallet${n.length>1?"s":""} in pool (${a} idle, ${s} active)`,data:{wallets:o,summary:{total:r.length,idle:a,active:s}}}}catch(t){return{success:!1,message:"Failed to list wallet pool",error:t instanceof Error?t.message:"Unknown error"}}}var aGe=C.object({agentId:C.string().describe("The sub-agent ID (UUID) to get journal entries for"),offset:C.number().min(0).optional().describe("Number of entries to skip from the start. Default: 0 (most recent first)"),limit:C.number().min(1).max(200).optional().describe("Max number of entries to return. Default: 50, max: 200"),tag:C.string().optional().describe("Filter entries by tag. Only returns entries with matching tag. Common tags: baseline, watchlist, trade_plan, position_health, scan_result, post_trade")});function $se(e){e.tool("get_agent_log","Get paginated journal log for a sub-agent. Shows trade events, reasoning, status changes, and errors. Use offset/limit for pagination. Entries are ordered newest first.",aGe.shape,async t=>{let n=await sGe(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function sGe(e){try{if(!k2(e.agentId))return{success:!1,message:"Sub-agent not found",error:`No sub-agent found with ID: ${e.agentId}`};let t=e.offset??0,n=e.limit??50,r=e.tag?{tag:e.tag}:void 0,{entries:a,total:s}=jR(e.agentId,t,n,r);if(a.length===0&&s===0)return{success:!0,message:"No journal entries found for this agent.",data:{entries:[],metadata:{total:0,showing:0,offset:t}}};let o=a.reverse().map(i=>{let u=new Date(i.ts).toLocaleString(),d=[];i.pair&&d.push(i.pair),i.side&&d.push(i.side),i.margin&&d.push(`margin:${i.margin}`),i.leverage&&d.push(`${i.leverage}x`),i.pnl&&d.push(`pnl:${i.pnl}`),i.txHash&&d.push(`tx:${i.txHash.slice(0,10)}...`);let l=i.text||d.join(" | ")||i.type;return{timestamp:u,type:i.type,summary:l}});return{success:!0,message:`Showing ${a.length} of ${s} journal entries`,data:{entries:o,metadata:{total:s,showing:a.length,offset:t}}}}catch(t){return{success:!1,message:"Failed to load agent journal",error:t instanceof Error?t.message:"Unknown error"}}}var oGe=C.object({agentId:C.string().describe("The sub-agent ID (UUID) writing the memo"),text:C.string().describe("The memo content. Use structured format for readability. Examples: macro baselines, watchlists with trigger levels, kill switch results, bear case arguments, position health snapshots."),tag:C.string().optional().describe("Category tag for retrieval via get_agent_log(tag: ...). Recommended tags: 'baseline' (Phase 1 macro snapshot), 'watchlist' (Phase 2 pair watchlist with trigger levels), 'trade_plan' (Phase 3 kill switch + bear case + trade params), 'position_health' (Phase 5 monitoring snapshot), 'scan_result' (Phase 5 opportunity scan output), 'post_trade' (Phase 6/7 session summary).")});function Mse(e){e.tool("write_agent_memo","Write a memo to the agent's journal. Use this to persist structured state (macro baselines, watchlists, trade reasoning, position health checks) that survives context compaction. Read back with get_agent_log(tag: '...'). Zero cost \u2014 no delegation calls consumed.",oGe.shape,async t=>{let n=await iGe(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function iGe(e){try{let t=await c0(e.agentId);return t?t.status==="revoked"?{success:!1,message:"Cannot write memo to revoked agent",error:"This sub-agent has been revoked and cannot accept new memos"}:(ka(e.agentId,{ts:Date.now(),type:"memo",text:e.text,tag:e.tag}),{success:!0,message:e.tag?`Memo saved with tag: ${e.tag}`:"Memo saved",tag:e.tag}):{success:!1,message:"Sub-agent not found",error:`No sub-agent found with ID: ${e.agentId}`}}catch(t){return{success:!1,message:"Failed to write memo",error:t instanceof Error?t.message:"Unknown error"}}}function Dse(e){nF(e),HZ(e),Kne(e),rae(e),d0e(e),f0e(e),nae(e),sae(e),aae(e),Jre(e),tae(e),oae(e),w0e(e),jre(e),Gre(e),Kre(e),Xre(e),iae(e),cae(e),uae(e),dae(e),fae(e),lae(e),pae(e),yae(e),gae(e),Aae(e),_ae(e),Eae(e),$ae(e),Mae(e),Oae(e),Nae(e),Lae(e),Bae(e),Hae(e),Fae(e),qae(e),Gae(e),Vae(e),Wae(e),Zae(e),Kae(e),Xae(e),Jae(e),Qae(e),Yae(e),ese(e),tse(e),nse(e),rse(e),ase(e),sse(e),ose(e),ise(e),yse(e),hse(e),xse(e),wse(e),vse(e),Tse(e),Sse(e),Ase(e),Pse(e),Rse(e),$se(e),Mse(e)}import{homedir as cGe}from"os";var Ose=cGe().startsWith("/sessions/"),Nse=new I3({name:"pragma",version:"0.1.0"});Ose?console.error("[pragma] Cowork detected \u2014 skipping tool registration (DXT handles MCP tools)"):Dse(Nse);async function uGe(){let e=new P3;await Nse.connect(e),console.error(`pragma MCP server running on stdio${Ose?" (Cowork mode \u2014 no tools)":""}`)}uGe().catch(e=>{console.error("Fatal error:",e),process.exit(1)});
|
|
215
|
+
\u26A0\uFE0F WARNING: `+t.warnings.join(". ")),{success:!0,message:a,data:t}}catch(t){return{success:!1,message:`Failed to get LeverUp quote: ${t instanceof Error?t.message:"Unknown error"}`}}}Te();t0();D0();mt();We();Ar();Y();var wje=C.object({symbol:C.string().describe("Asset to trade (e.g. BTC, ETH, MON). NOTE: 500BTC and 500ETH are Zero-Fee pairs that ONLY support 500x, 750x, or 1001x leverage."),isLong:C.boolean().describe("true for Long, false for Short"),marginAmount:C.string().describe("Amount of collateral (e.g. '10' for 10 MON). Recommended minimum: $10 USD."),leverage:C.number().min(1).max(1001).describe("Leverage multiplier. Normal pairs: 1-100x. Zero-Fee pairs (500BTC/500ETH): ONLY 500, 750, or 1001. HARD LIMIT: Position size (margin \xD7 leverage) must be at least $200 USD."),collateralToken:C.enum(["MON","USDC","LVUSD","LVMON"]).default("MON").optional().describe("Collateral token: MON (native), USDC, LVUSD (vault USD), or LVMON (vault MON). Default: MON."),slippageBps:C.number().min(0).max(5e3).default(100).optional().describe("Slippage in basis points (default: 100 = 1%)"),stopLoss:C.string().optional().describe("Stop Loss price in USD (e.g. '85000' for $85,000). Set to automatically close position at this price to limit losses. Cannot be cancelled once set, but can be edited."),takeProfit:C.string().optional().describe("Take Profit price in USD (e.g. '100000' for $100,000). Set to automatically close position at this price to secure profits. Max TP: 500% for leverage <50x, 300% for leverage \u226550x. Cannot be cancelled once set, but can be edited."),agentId:C.string().optional().describe("Sub-agent ID for autonomous execution (no Touch ID). If omitted, uses assistant mode with Touch ID confirmation. Note: For ERC20 collateral, approval must be set via assistant mode first.")});function Lae(e){e.tool("leverup_open_trade","Open a market perpetual position on LeverUp. If agentId provided: uses autonomous mode (no Touch ID). If no agentId: uses assistant mode (requires Touch ID).",wje.shape,async t=>{try{let n=await q();if(!n||!Pe(n))throw new Error("Wallet not configured.");if(t.agentId){let j=await Hre(t.agentId,{symbol:t.symbol,isLong:t.isLong,marginAmount:t.marginAmount,leverage:t.leverage,collateralToken:t.collateralToken||"MON",slippageBps:t.slippageBps,stopLoss:t.stopLoss,takeProfit:t.takeProfit});return{content:[{type:"text",text:JSON.stringify(j,null,2)}]}}if(_t()){let j=await J6(t.symbol,t.isLong,t.marginAmount,t.leverage,t.collateralToken||"MON"),Z=Fn.find(fn=>fn.pair===`${t.symbol}/USD`||fn.pair===t.symbol);if(Z?.isHighLeverage&&!Qo(t.leverage))throw new Error(`${Z.pair} is a Zero-Fee pair that ONLY supports ${bo.join(", ")}x leverage.`);let de=BigInt(t.slippageBps??100),ne=ye(j.entryPrice,18),be=t.isLong?ne*(10000n+de)/10000n:ne*(10000n-de)/10000n,ze=t.collateralToken??"MON",pt=ye(t.marginAmount,Ca(ze)),rn=ye(j.positionSize,10),zt=await N2({symbol:t.symbol,isLong:t.isLong,amountIn:pt,leverage:t.leverage,qty:rn,price:be,collateralToken:t.collateralToken||"MON",stopLoss:t.stopLoss?ye(t.stopLoss,18):0n,takeProfit:t.takeProfit?ye(t.takeProfit,18):0n},n),ct;return ze==="MON"?ct=await zn({target:zt.to,value:zt.value,callData:zt.data},n):ct=await Vi(zt.tokenIn,zt.to,zt.amountIn,{target:zt.to,value:zt.value,callData:zt.data},n),{content:[{type:"text",text:JSON.stringify({success:ct.success,message:ct.success?`Successfully opened ${t.leverage}x ${t.isLong?"Long":"Short"} on ${t.symbol}`:ct.message,txHash:ct.txHash,explorerUrl:ct.explorerUrl,error:ct.error},null,2)}]}}let r=n.wallet.smartAccountAddress,a=n.wallet.sessionKeyAddress,s=n.network.chainId,o=await we(n),i=await J6(t.symbol,t.isLong,t.marginAmount,t.leverage,t.collateralToken||"MON"),u=Fn.find(j=>j.pair===`${t.symbol}/USD`||j.pair===t.symbol);if(u?.isHighLeverage&&!Qo(t.leverage))throw new Error(`${u.pair} is a Zero-Fee pair that ONLY supports ${bo.join(", ")}x leverage. Requested: ${t.leverage}x. Use a standard pair (BTC, ETH) for lower leverage.`);let d=parseFloat(i.entryPrice);if(t.takeProfit){let j=parseFloat(t.takeProfit),Z=X6(t.leverage),de=t.isLong?(j-d)/d*100:(d-j)/d*100;if(de<=0){let ne=t.isLong?"above":"below";throw new Error(`Invalid Take Profit price. For a ${t.isLong?"Long":"Short"} position, TP must be ${ne} entry price ($${d}).`)}if(de>Z)throw new Error(`Take Profit exceeds maximum allowed. For ${t.leverage}x leverage, max TP is ${Z}% profit. Requested TP would be ~${de.toFixed(1)}% profit.`)}if(t.stopLoss){let j=parseFloat(t.stopLoss);if(t.isLong?j>=d:j<=d){let de=t.isLong?"below":"above";throw new Error(`Invalid Stop Loss for ${t.isLong?"Long":"Short"} position. SL price ($${j}) must be ${de} entry price ($${d}).`)}}let l=BigInt(t.slippageBps??100),p=ye(i.entryPrice,18),y=t.isLong?p*(10000n+l)/10000n:p*(10000n-l)/10000n,m=t.collateralToken??"MON",g=ye(t.marginAmount,Ca(m)),h=ye(i.positionSize,10),w=await N2({symbol:t.symbol,isLong:t.isLong,amountIn:g,leverage:t.leverage,qty:h,price:y,collateralToken:t.collateralToken||"MON",stopLoss:t.stopLoss?ye(t.stopLoss,18):0n,takeProfit:t.takeProfit?ye(t.takeProfit,18):0n},n),v=Ee(s,o),T=_e({chain:v,transport:Ze(o,n)}),A=Ca(m);if(m==="MON"){let j=await T.getBalance({address:r});if(j<w.value){let Z=le(w.amountIn,A),de=le(w.amountIn-g,A),ne=le(w.value,A);throw new Error(`Insufficient native MON balance. Required: ${ne} MON (${t.marginAmount} margin + ${de} trading fee + Pyth fee). Available: ${le(j,A)} MON.`)}}else{let j=m==="USDC"?V0:m==="LVUSD"?g0:h0,Z=await T.readContract({address:j,abi:Xe,functionName:"balanceOf",args:[r]});if(Z<w.amountIn){let de=le(w.amountIn,A),ne=le(Z,A),be=le(w.amountIn-g,A);throw new Error(`Insufficient ${m} balance. Required: ${de} ${m} (${t.marginAmount} margin + ${be} fee), Available: ${ne} ${m}.`)}}let _=await Tn(T,r),E=[];if(m!=="MON"){let j=w.tokenIn,Z=await T.readContract({address:j,abi:Xe,functionName:"allowance",args:[r,w.to]});if(Z<w.amountIn){if(Z>0n){let ne=cs({tokenAddress:j,spender:w.to,amount:0n,delegator:r,sessionKey:a,nonce:_,chainId:s});E.push({delegation:ne.delegation,execution:{target:j,value:0n,callData:X({abi:Xe,functionName:"approve",args:[w.to,0n]})},kind:"approve"})}let de=cs({tokenAddress:j,spender:w.to,amount:w.amountIn,delegator:r,sessionKey:a,nonce:_,chainId:s});E.push({delegation:de.delegation,execution:{target:j,value:0n,callData:X({abi:Xe,functionName:"approve",args:[w.to,w.amountIn]})},kind:"approve"})}}let O=I0e({diamond:w.to,delegator:r,sessionKey:a,nonce:_,chainId:s,calldata:w.data,value:w.value});E.push({delegation:O.delegation,execution:{target:w.to,value:w.value,callData:w.data},kind:"leverup_open"});for(let j of E){let Z;j.kind==="approve"?Z=`Approve ${m} for LeverUp`:Z=`LeverUp: ${t.leverage}x ${t.isLong?"Long":"Short"} ${t.symbol}`;let de=await _n(j.delegation,s,n.wallet.keyId,Z);j.delegation.signature=de}let $=await ht(),B=on($),V=Tt({account:B,chain:v,transport:Ze(o,n)}),M=E.filter(j=>j.kind==="approve");if(M.length>0){let j=M.map(ne=>({permissionContext:[ne.delegation],executions:[Pt({target:ne.execution.target,value:ne.execution.value,callData:ne.execution.callData})],mode:nn.SingleDefault})),Z=await dn(V,T,Ue.delegationManager,j);if((await Xt(T,Z)).status!=="success")return{content:[{type:"text",text:JSON.stringify({success:!1,message:"Failed to approve token. Transaction reverted."},null,2)}]}}let G=E.find(j=>j.kind==="leverup_open");if(!G)return{content:[{type:"text",text:JSON.stringify({success:!1,message:"Internal error: trade delegation not found."},null,2)}]};let N=[{permissionContext:[G.delegation],executions:[Pt({target:G.execution.target,value:G.execution.value,callData:G.execution.callData})],mode:nn.SingleDefault}],W=await dn(V,T,Ue.delegationManager,N),me=await Xt(T,W);return{content:[{type:"text",text:JSON.stringify({success:me.status==="success",message:me.status==="success"?`Successfully opened ${t.leverage}x ${t.isLong?"Long":"Short"} on ${t.symbol}`:"Transaction reverted on-chain",txHash:W,explorerUrl:`https://monadvision.com/tx/${W}`},null,2)}]}}catch(n){return{content:[{type:"text",text:JSON.stringify({success:!1,message:n instanceof Error?n.message:"Unknown error"},null,2)}]}}})}Te();t0();D0();mt();We();Ar();Y();var vje=C.object({tradeHash:C.string().regex(/^0x[a-fA-F0-9]{64}$/).describe("The unique identifier of the position to close."),agentId:C.string().optional().describe("Sub-agent ID for autonomous execution (no Touch ID). If omitted, uses assistant mode with Touch ID confirmation.")});function Bae(e){e.tool("leverup_close_trade","Close an existing LeverUp perpetual position. If agentId provided: uses autonomous mode (no Touch ID). If no agentId: uses assistant mode (requires Touch ID).",vje.shape,async t=>{try{let n=await q();if(!n||!Pe(n))throw new Error("Wallet not configured.");if(t.agentId){let A=await Rre(t.agentId,t.tradeHash);return{content:[{type:"text",text:JSON.stringify(A,null,2)}]}}if(_t()){let A=await L2(t.tradeHash),_=await zn({target:A.to,value:A.value,callData:A.data},n);return{content:[{type:"text",text:JSON.stringify({success:_.success,message:_.success?`Successfully closed position ${t.tradeHash}`:_.message,txHash:_.txHash,explorerUrl:_.explorerUrl,error:_.error},null,2)}]}}let r=n.wallet.smartAccountAddress,a=n.wallet.sessionKeyAddress,s=n.network.chainId,o=await we(n),i=await L2(t.tradeHash),u=Ee(s,o),d=_e({chain:u,transport:Ze(o,n)}),l=await Tn(d,r),p=C0e({diamond:i.to,delegator:r,sessionKey:a,nonce:l,chainId:s,calldata:i.data}),y=`Close LeverUp Position: ${t.tradeHash.slice(0,10)}...`,m=await _n(p.delegation,s,n.wallet.keyId,y);p.delegation.signature=m;let g=await ht(),h=on(g),w=Tt({account:h,chain:u,transport:Ze(o,n)}),v=await dn(w,d,Ue.delegationManager,[{permissionContext:[p.delegation],executions:[Pt({target:i.to,value:i.value,callData:i.data})],mode:nn.SingleDefault}]),T=await Xt(d,v);return{content:[{type:"text",text:JSON.stringify({success:T.status==="success",message:T.status==="success"?`Successfully closed position ${t.tradeHash}`:"Transaction reverted on-chain",txHash:v,explorerUrl:`https://monadvision.com/tx/${v}`},null,2)}]}}catch(n){return{content:[{type:"text",text:JSON.stringify({success:!1,message:n instanceof Error?n.message:"Unknown error"},null,2)}]}}})}Te();t0();D0();mt();We();Ar();Y();m0();var Tje=C.object({tradeHash:C.string().regex(/^0x[a-fA-F0-9]{64}$/).describe("The unique identifier of the position."),amount:C.string().describe("Amount of collateral to add (e.g. '5' for 5 MON)."),collateralToken:C.enum(["MON","USDC","LVUSD","LVMON"]).default("MON").describe("Collateral token matching the position's collateral. IMPORTANT: Positions opened with 500x, 750x, or 1001x leverage (Zero-Fee mode) CANNOT add margin - this operation will fail for those positions."),agentId:C.string().optional().describe("Sub-agent ID for autonomous execution (no Touch ID). If omitted, uses assistant mode with Touch ID confirmation.")});function Uae(e){switch(e){case"USDC":return V0;case"LVUSD":return g0;case"LVMON":return h0;default:return Yr}}function Hae(e){e.tool("leverup_update_margin","Add collateral to an existing LeverUp position. If agentId provided: uses autonomous mode (no Touch ID). If no agentId: uses assistant mode (requires Touch ID). NOTE: Only ADDING margin is supported. This does NOT work for Zero-Fee positions (500x/750x/1001x leverage).",Tje.shape,async t=>{try{let n=await q();if(!n||!Pe(n))throw new Error("Wallet not configured.");if(t.agentId){let $=await Dre(t.agentId,t.tradeHash,t.amount,t.collateralToken||"MON");return{content:[{type:"text",text:JSON.stringify($,null,2)}]}}if(_t()){let $=t.collateralToken||"MON",B=Uae($),V=$==="MON",M=ye(t.amount,Ca($)),G=B2(t.tradeHash,B,M,V),N;return V?N=await zn({target:G.to,value:G.value,callData:G.data},n):N=await Vi(B,Kn,M,{target:G.to,value:G.value,callData:G.data},n),{content:[{type:"text",text:JSON.stringify({success:N.success,message:N.success?`Successfully added ${t.amount} ${$} margin`:N.message,txHash:N.txHash,explorerUrl:N.explorerUrl,error:N.error},null,2)}]}}let r=n.wallet.smartAccountAddress,a=n.wallet.sessionKeyAddress,s=n.network.chainId,o=await we(n),i=t.collateralToken||"MON",u=Uae(i),d=i==="MON",l=ye(t.amount,Ca(i)),p=B2(t.tradeHash,u,l,d),y=Ee(s,o),m=_e({chain:y,transport:Ze(o,n)}),g=[],h=await xt(()=>Tn(m,r),{operationName:"get-delegation-nonce"});if(!d&&await xt(async()=>m.readContract({address:u,abi:Xe,functionName:"allowance",args:[r,Kn]}),{operationName:"check-allowance"})<l){let B=cs({tokenAddress:u,spender:Kn,amount:l,delegator:r,sessionKey:a,nonce:h,chainId:s});g.push({delegation:B.delegation,execution:{target:u,value:0n,callData:X({abi:Xe,functionName:"approve",args:[Kn,l]})}})}let w=P0e({diamond:p.to,delegator:r,sessionKey:a,nonce:h,chainId:s,calldata:p.data,value:p.value});g.push({delegation:w.delegation,execution:{target:p.to,value:p.value,callData:p.data}});let v=`Add ${t.amount} ${i} Margin to ${t.tradeHash.slice(0,10)}...`;for(let $ of g){let B=await _n($.delegation,s,n.wallet.keyId,v);$.delegation.signature=B}let T=await ht(),A=on(T),_=Tt({account:A,chain:y,transport:Ze(o,n)}),E=await dn(_,m,Ue.delegationManager,g.map($=>({permissionContext:[$.delegation],executions:[Pt($.execution)],mode:nn.SingleDefault}))),O=await Xt(m,E);return{content:[{type:"text",text:JSON.stringify({success:O.status==="success",message:O.status==="success"?`Successfully added ${t.amount} ${i} margin`:"Transaction reverted on-chain",txHash:E,explorerUrl:`https://monadvision.com/tx/${E}`},null,2)}]}}catch(n){let r=n instanceof Error?n.message:"Unknown error";return{content:[{type:"text",text:JSON.stringify({success:!1,message:"Failed to add margin",error:r},null,2)}]}}})}Te();t0();D0();mt();We();Ar();Y();m0();var Sje=C.object({tradeHash:C.string().regex(/^0x[a-fA-F0-9]{64}$/).describe("The unique identifier of the position."),takeProfit:C.string().optional().describe("New take profit price in USD (e.g. '110000' for $110,000). Set to '0' or omit to disable TP."),stopLoss:C.string().optional().describe("New stop loss price in USD (e.g. '95000' for $95,000). Set to '0' or omit to disable SL."),agentId:C.string().optional().describe("Sub-agent ID for autonomous execution (no Touch ID). If omitted, uses assistant mode with Touch ID confirmation.")});function Fae(e){e.tool("leverup_update_tpsl","Update take profit and/or stop loss on an existing LeverUp position. If agentId provided: uses autonomous mode (no Touch ID). If no agentId: uses assistant mode (requires Touch ID). Set a price to '0' to disable that trigger. At least one of takeProfit or stopLoss must be provided.",Sje.shape,async t=>{try{let n=await q();if(!n||!Pe(n))throw new Error("Wallet not configured.");if(t.takeProfit===void 0&&t.stopLoss===void 0)throw new Error("At least one of takeProfit or stopLoss must be provided.");if(t.stopLoss&&t.stopLoss!=="0"){let B=n.wallet.smartAccountAddress,M=(await J5(B)).find(G=>G.position.positionHash===t.tradeHash);if(M){let G=Number(le(M.position.entryPrice,18)),N=Number(t.stopLoss),W=M.position.isLong,me=W&&N>=G,j=!W&&N<=G;if(me){let Z=(G*.99).toFixed(2);throw new Error(`Invalid SL for LONG: SL ($${N}) must be below entry ($${G.toFixed(2)}). LeverUp requires SL in loss direction. Suggested: $${Z}`)}if(j){let Z=(G*1.01).toFixed(2);throw new Error(`Invalid SL for SHORT: SL ($${N}) must be above entry ($${G.toFixed(2)}). LeverUp requires SL in loss direction. Suggested: $${Z}`)}}}if(t.agentId){let B=await $re(t.agentId,t.tradeHash,t.takeProfit,t.stopLoss);return{content:[{type:"text",text:JSON.stringify(B,null,2)}]}}if(_t()){let B=t.takeProfit?ye(t.takeProfit,18):0n,V=t.stopLoss?ye(t.stopLoss,18):0n,M=U2(t.tradeHash,B,V),G=await zn({target:M.to,value:M.value,callData:M.data},n),N=[];return t.takeProfit&&N.push(t.takeProfit==="0"?"TP disabled":`TP=$${t.takeProfit}`),t.stopLoss&&N.push(t.stopLoss==="0"?"SL disabled":`SL=$${t.stopLoss}`),{content:[{type:"text",text:JSON.stringify({success:G.success,message:G.success?`Successfully updated ${N.join(", ")}`:G.message,txHash:G.txHash,explorerUrl:G.explorerUrl,error:G.error},null,2)}]}}let r=n.wallet.smartAccountAddress,a=n.wallet.sessionKeyAddress,s=n.network.chainId,o=await we(n),i=t.takeProfit?ye(t.takeProfit,18):0n,u=t.stopLoss?ye(t.stopLoss,18):0n,d=U2(t.tradeHash,i,u),l=Ee(s,o),p=_e({chain:l,transport:Ze(o,n)}),y=await xt(()=>Tn(p,r),{operationName:"get-delegation-nonce"}),m=M0e({diamond:d.to,delegator:r,sessionKey:a,nonce:y,chainId:s,calldata:d.data}),g=t.takeProfit?`TP=$${t.takeProfit}`:"",h=t.stopLoss?`SL=$${t.stopLoss}`:"",w=`Update ${[g,h].filter(Boolean).join(", ")} on ${t.tradeHash.slice(0,10)}...`,v=await _n(m.delegation,s,n.wallet.keyId,w);m.delegation.signature=v;let T=await ht(),A=on(T),_=Tt({account:A,chain:l,transport:Ze(o,n)}),E=await dn(_,p,Ue.delegationManager,[{permissionContext:[m.delegation],executions:[Pt({target:d.to,value:d.value,callData:d.data})],mode:nn.SingleDefault}]),O=await Xt(p,E),$=[];return t.takeProfit&&$.push(t.takeProfit==="0"?"TP disabled":`TP=$${t.takeProfit}`),t.stopLoss&&$.push(t.stopLoss==="0"?"SL disabled":`SL=$${t.stopLoss}`),{content:[{type:"text",text:JSON.stringify({success:O.status==="success",message:O.status==="success"?`Successfully updated ${$.join(", ")}`:"Transaction reverted on-chain",txHash:E,explorerUrl:`https://monadvision.com/tx/${E}`},null,2)}]}}catch(n){let r=n instanceof Error?n.message:"Unknown error";return{content:[{type:"text",text:JSON.stringify({success:!1,message:"Failed to update TP/SL",error:r},null,2)}]}}})}Y();var h$="https://benchmarks.pyth.network/v1/shims/tradingview",gp={BTC:"Crypto.BTC/USD",ETH:"Crypto.ETH/USD",MON:"Crypto.MON/USD",SOL:"Crypto.SOL/USD",XRP:"Crypto.XRP/USD",DOGE:"Crypto.DOGE/USD",ADA:"Crypto.ADA/USD",AVAX:"Crypto.AVAX/USD",DOT:"Crypto.DOT/USD",LINK:"Crypto.LINK/USD",ATOM:"Crypto.ATOM/USD",NEAR:"Crypto.NEAR/USD",APT:"Crypto.APT/USD",SUI:"Crypto.SUI/USD",ARB:"Crypto.ARB/USD",OP:"Crypto.OP/USD",QQQ:"Equity.US.QQQ/USD",SPY:"Equity.US.SPY/USD",DIA:"Equity.US.DIA/USD",IWM:"Equity.US.IWM/USD",AAPL:"Equity.US.AAPL/USD",AMZN:"Equity.US.AMZN/USD",TSLA:"Equity.US.TSLA/USD",NVDA:"Equity.US.NVDA/USD",META:"Equity.US.META/USD",MSFT:"Equity.US.MSFT/USD",GOOG:"Equity.US.GOOG/USD",GOOGL:"Equity.US.GOOGL/USD",AMD:"Equity.US.AMD/USD",NFLX:"Equity.US.NFLX/USD",EUR:"FX.EUR/USD",GBP:"FX.GBP/USD",JPY:"FX.USD/JPY",CHF:"FX.USD/CHF",AUD:"FX.AUD/USD",CAD:"FX.USD/CAD","EUR/USD":"FX.EUR/USD","GBP/USD":"FX.GBP/USD","USD/JPY":"FX.USD/JPY","USD/CHF":"FX.USD/CHF","AUD/USD":"FX.AUD/USD","USD/CAD":"FX.USD/CAD",XAU:"Metal.XAU/USD",XAG:"Metal.XAG/USD",GOLD:"Metal.XAU/USD",SILVER:"Metal.XAG/USD"};var x$={1:"1 minute",5:"5 minutes",15:"15 minutes",30:"30 minutes",60:"1 hour",240:"4 hours",D:"Daily","1W":"Weekly","1M":"Monthly"},w$={1:60,5:300,15:900,30:1800,60:3600,240:14400,D:86400,"1W":604800,"1M":2592e3};m0();function G2(e,t=!1){let n;return e>=1e3?n=e.toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2}):e>=1?n=e.toFixed(2):n=e.toFixed(6),t?`$${n}`:n}function zae(e){let t=e.toUpperCase().trim();if(gp[t])return gp[t];if(t.startsWith("CRYPTO.")||t.startsWith("EQUITY.")||t.startsWith("FX.")||t.startsWith("METAL."))return t;let n=t.match(/^([A-Z0-9]+)\/USD$/);if(n){let r=n[1];return gp[r]?gp[r]:`Crypto.${r}/USD`}return`Crypto.${t}/USD`}function jae(e){let t=e.match(/(?:Crypto\.|Equity\.US\.|FX\.|Metal\.)?([A-Z0-9]+)(?:\/USD)?$/i);return t?t[1].toUpperCase():e}async function v$(e,t="60",n=100){let r=zae(e),a=jae(r),s=Math.floor(Date.now()/1e3),o=w$[t],i=s-n*o,u=new URL(`${h$}/history`);u.searchParams.set("symbol",r),u.searchParams.set("resolution",t),u.searchParams.set("from",String(i)),u.searchParams.set("to",String(s));let d=await xt(async()=>{let v=await fetch(u.toString(),{headers:{Accept:"application/json"}});if(!v.ok)throw new Error(`Pyth API error (${v.status}): ${v.statusText}`);return await v.json()},{operationName:`pyth-chart-${e}`,maxRetries:2});if(d.s==="error")throw new Error(d.errmsg||"Pyth Benchmark API error");if(d.s==="no_data"||!d.t||d.t.length===0)throw new Error(`No chart data available for ${e}. The symbol may not be supported or market may be closed.`);let l=d.t.map((v,T)=>({timestamp:v,datetime:new Date(v*1e3).toISOString(),open:d.o[T],high:d.h[T],low:d.l[T],close:d.c[T],volume:d.v?.[T]??0})),p=l[l.length-1].close,y=l[0].open,m=p-y,g=(m/y*100).toFixed(2),h=Math.max(...l.map(v=>v.high)),w=Math.min(...l.map(v=>v.low));return{symbol:a,pythSymbol:r,resolution:t,resolutionLabel:x$[t],candles:l,latestPrice:p,priceChange:m,priceChangePercent:`${m>=0?"+":""}${g}%`,periodHigh:h,periodLow:w}}var Aje=C.object({symbol:C.string().optional().describe("Asset symbol to get market stats for (e.g., 'BTC', 'ETH', 'MON', 'AAPL'). If omitted, returns stats for all supported LeverUp pairs. Use this to check current prices before opening positions.")});function qae(e){e.tool("leverup_get_market_stats","Get current market prices and stats for LeverUp trading pairs. Returns real-time Pyth oracle prices for all supported markets (crypto, stocks, forex, commodities). For holding fees, funding rates, and open interest, use leverup_get_funding_rates.",Aje.shape,async t=>{let n=await _je(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function _je(e){try{let t=Fn;if(e.symbol){let o=e.symbol.toUpperCase().trim();if(t=Fn.filter(i=>i.pair.toUpperCase().startsWith(o)||i.pair.toUpperCase()===`${o}/USD`||i.pair.toUpperCase().includes(o)),t.length===0)return{success:!1,message:`No LeverUp market found for '${e.symbol}'`,error:`Symbol '${e.symbol}' is not supported on LeverUp. Use leverup_list_pairs to see all available markets.`}}let n=t.map(o=>o.pythId),r=await K6(n),a=t.map(o=>{let i=r.parsed?.find(p=>`0x${p.id}`===o.pythId),u="N/A",d="N/A",l="N/A";if(i){let p=BigInt(i.price.price)*10n**BigInt(18+i.price.expo),y=Number(le(p,18));u=G2(y,!0);let m=BigInt(i.price.conf)*10n**BigInt(18+i.price.expo),g=Number(le(m,18));d=`\xB1$${g<1?g.toFixed(4):g.toFixed(2)}`,l=new Date(i.price.publish_time*1e3).toISOString()}return{symbol:o.pair,category:o.category,currentPrice:u,priceConfidence:d,publishTime:l,isHighLeveragePair:o.isHighLeverage??!1,pairBase:o.pairBase}}),s=[...new Set(a.map(o=>o.category))];return{success:!0,message:`Market stats for ${a.length} LeverUp pair${a.length>1?"s":""}`,data:{markets:a,supportedCategories:s,note:"For holding fees, funding rates, and open interest (long/short OI), use leverup_get_funding_rates."}}}catch(t){return{success:!1,message:"Failed to fetch market stats",error:t instanceof Error?t.message:"Unknown error"}}}var Eje=C.object({symbol:C.string().optional().describe("Asset symbol to get funding rates for (e.g., 'BTC', 'ETH', 'MON'). If omitted, returns funding rates for all supported LeverUp pairs. High-leverage pairs (500BTC, 500ETH) are excluded as they use zero-fee model.")});function Gae(e){e.tool("leverup_get_funding_rates","Get funding rates, holding fees, and open interest for LeverUp perpetual pairs. Returns: (1) Holding fee rates \u2014 flat per-second carry cost by direction. (2) Real-time funding rate \u2014 directional fee based on OI imbalance (dominant side pays). (3) Open interest \u2014 long/short quantities and OI ratio for squeeze detection. Use this to assess carry costs, directional crowding, and squeeze risk before opening positions.",Eje.shape,async t=>{let n=await kje(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function kje(e){try{let t=await Sre(e.symbol);if(t.length===0)return{success:!1,message:e.symbol?`No funding data found for '${e.symbol}'`:"No funding data available",error:e.symbol?`Symbol '${e.symbol}' is not supported on LeverUp. Use leverup_list_pairs to see available markets.`:"Could not fetch funding data from any pair."};let n=t.map(({symbol:r,category:a,holdingFeeRate8h:s,holdingFeeRate1h:o,fundingDirection:i,pairBase:u,marketInfo:d})=>{let l={symbol:r,category:a,holdingFeeRate8h:s,holdingFeeRate1h:o,fundingDirection:i,pairBase:u};return d&&(l.openInterest={longQty:d.longQty,shortQty:d.shortQty,oiRatio:d.oiRatio,dominantSide:d.dominantSide},l.realTimeFundingRate={rate8h:d.currentFundingRate8h,rate1h:d.currentFundingRate1h,direction:d.fundingRateDirection}),l});return{success:!0,message:`Funding rates and open interest for ${n.length} LeverUp pair${n.length>1?"s":""}`,data:{fundingRates:n,model:"LeverUp charges TWO separate fees: (1) Holding fee \u2014 flat per-second cost, varies by asset and direction. (2) Funding fee \u2014 directional, scales with OI imbalance (dominant side pays minority). The realTimeFundingRate shows the current per-second funding rate. Negative = shorts pay longs. openInterest shows long/short quantities (in asset units) and OI ratio for squeeze detection.",note:"High-leverage pairs (500BTC/500ETH) use zero-fee model and are excluded. All data read directly from on-chain Diamond Proxy contract."}}}catch(t){return{success:!1,message:"Failed to fetch funding rates",error:t instanceof Error?t.message:"Unknown error"}}}Te();t0();D0();mt();We();Ar();Y();var Ije=C.object({symbol:C.string().describe("Asset to trade (e.g. BTC, ETH, MON). NOTE: 500BTC and 500ETH are Zero-Fee pairs that ONLY support 500x, 750x, or 1001x leverage."),isLong:C.boolean().describe("true for Long (order triggers when price drops below trigger price), false for Short (order triggers when price rises above trigger price)"),marginAmount:C.string().describe("Amount of collateral (e.g. '10' for 10 MON). Recommended minimum: $10 USD."),leverage:C.number().min(1).max(1001).describe("Leverage multiplier. Normal pairs: 1-100x. Zero-Fee pairs (500BTC/500ETH): ONLY 500, 750, or 1001. HARD LIMIT: Position size (margin \xD7 leverage) must be at least $200 USD."),triggerPrice:C.string().describe("Price at which the order will trigger and fill. For LONG orders: must be BELOW current market price (buy the dip). For SHORT orders: must be ABOVE current market price (sell the top)."),collateralToken:C.enum(["MON","USDC","LVUSD","LVMON"]).default("MON").optional().describe("Collateral token: MON (native), USDC, LVUSD (vault USD), or LVMON (vault MON). Default: MON."),stopLoss:C.string().optional().describe("Stop Loss price in USD. Set to automatically close position at this price to limit losses. For Long orders, must be below the trigger price. For Short orders, must be above the trigger price."),takeProfit:C.string().optional().describe("Take Profit price in USD. Set to automatically close position at this price to secure profits. For Long orders, must be above the trigger price. For Short orders, must be below the trigger price. Max TP: 500% for leverage <50x, 300% for leverage \u226550x."),agentId:C.string().optional().describe("Sub-agent ID for autonomous execution (no Touch ID). If omitted, uses assistant mode with Touch ID confirmation. Note: For ERC20 collateral, approval must be set via assistant mode first.")});function Vae(e){e.tool("leverup_open_limit_order","Place a limit order on LeverUp that will trigger when the market reaches your specified price. For Long orders, the trigger price must be BELOW current market (buy the dip). For Short orders, the trigger price must be ABOVE current market (sell the top). If agentId provided: uses autonomous mode (no Touch ID). If no agentId: uses assistant mode (requires Touch ID).",Ije.shape,async t=>{let n=await Cje(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function Cje(e){try{let t=await q();if(!t||!Pe(t))return{success:!1,message:"Wallet not configured. Run setup_wallet first."};if(e.agentId){let N=await Fre(e.agentId,{symbol:e.symbol,isLong:e.isLong,marginAmount:e.marginAmount,leverage:e.leverage,triggerPrice:e.triggerPrice,collateralToken:e.collateralToken||"MON",stopLoss:e.stopLoss,takeProfit:e.takeProfit});return{success:N.success,message:N.message,data:N.success?{quote:{symbol:e.symbol,side:e.isLong?"LONG":"SHORT",leverage:e.leverage,triggerPrice:`$${e.triggerPrice}`,currentPrice:"N/A (autonomous)",marginAmount:e.marginAmount,positionSize:"N/A (autonomous)",stopLoss:e.stopLoss?`$${e.stopLoss}`:void 0,takeProfit:e.takeProfit?`$${e.takeProfit}`:void 0},txHash:N.txHash,explorerUrl:N.explorerUrl}:void 0,error:N.error}}if(_t()){let N=e.collateralToken??"MON",W=await O2(e.symbol,e.isLong,e.marginAmount,e.leverage,e.triggerPrice,N);if(!W.isTriggerValid)return{success:!1,message:W.triggerValidationMessage,error:"Invalid trigger price"};if(!W.meetsMinimums)return{success:!1,message:W.warnings.join(" "),error:"Quote validation failed"};let me=Fn.find(ze=>ze.pair===`${e.symbol}/USD`||ze.pair===e.symbol);if(me?.isHighLeverage&&!Qo(e.leverage))return{success:!1,message:`${me.pair} is a Zero-Fee pair that ONLY supports ${bo.join(", ")}x leverage.`,error:"Invalid leverage for Zero-Fee pair"};let j=ye(e.triggerPrice,18),Z=ye(e.marginAmount,Ca(N)),de=ye(W.positionSize,10),ne=await H2({symbol:e.symbol,isLong:e.isLong,amountIn:Z,leverage:e.leverage,qty:de,triggerPrice:j,collateralToken:N,stopLoss:e.stopLoss?ye(e.stopLoss,18):0n,takeProfit:e.takeProfit?ye(e.takeProfit,18):0n},t),be;return N==="MON"?be=await zn({target:ne.to,value:ne.value,callData:ne.data},t):be=await Vi(ne.tokenIn,ne.to,ne.amountIn,{target:ne.to,value:ne.value,callData:ne.data},t),be.success?{success:!0,message:`Successfully placed ${e.leverage}x ${e.isLong?"Long":"Short"} limit order on ${e.symbol} at $${e.triggerPrice}`,data:{quote:{symbol:W.symbol,side:e.isLong?"LONG":"SHORT",leverage:e.leverage,triggerPrice:`$${e.triggerPrice}`,currentPrice:`$${W.currentPrice}`,marginAmount:W.marginAmount,positionSize:`$${W.positionValueUsd}`,stopLoss:e.stopLoss?`$${e.stopLoss}`:void 0,takeProfit:e.takeProfit?`$${e.takeProfit}`:void 0},txHash:be.txHash,explorerUrl:be.explorerUrl}}:{success:!1,message:be.message,error:be.error}}let n=t.wallet.smartAccountAddress,r=t.wallet.sessionKeyAddress,a=t.network.chainId,s=await we(t),o=e.collateralToken??"MON",i=await O2(e.symbol,e.isLong,e.marginAmount,e.leverage,e.triggerPrice,o);if(!i.isTriggerValid)return{success:!1,message:i.triggerValidationMessage,error:"Invalid trigger price for order direction"};if(!i.meetsMinimums)return{success:!1,message:i.warnings.join(" "),error:"Quote validation failed"};let u=Fn.find(N=>N.pair===`${e.symbol}/USD`||N.pair===e.symbol);if(u?.isHighLeverage&&!Qo(e.leverage))return{success:!1,message:`${u.pair} is a Zero-Fee pair that ONLY supports ${bo.join(", ")}x leverage. Requested: ${e.leverage}x. Use a standard pair (BTC, ETH) for lower leverage.`,error:"Invalid leverage for Zero-Fee pair"};let d=parseFloat(e.triggerPrice);if(e.takeProfit){let N=parseFloat(e.takeProfit),W=X6(e.leverage),me=e.isLong?(N-d)/d*100:(d-N)/d*100;if(me<=0){let j=e.isLong?"above":"below";return{success:!1,message:`Invalid Take Profit price. For a ${e.isLong?"Long":"Short"} limit order, TP must be ${j} trigger price ($${d}).`,error:"Invalid TP direction"}}if(me>W)return{success:!1,message:`Take Profit exceeds maximum allowed. For ${e.leverage}x leverage, max TP is ${W}% profit from trigger price. Requested TP would be ~${me.toFixed(1)}% profit.`,error:"TP exceeds maximum"}}if(e.stopLoss){let N=parseFloat(e.stopLoss);if(e.isLong?N>=d:N<=d){let me=e.isLong?"below":"above";return{success:!1,message:`Invalid Stop Loss for ${e.isLong?"Long":"Short"} limit order. SL price ($${N}) must be ${me} trigger price ($${d}).`,error:"Invalid SL direction"}}}let l=ye(e.triggerPrice,18),p=ye(e.marginAmount,Ca(o)),y=ye(i.positionSize,10),m=await H2({symbol:e.symbol,isLong:e.isLong,amountIn:p,leverage:e.leverage,qty:y,triggerPrice:l,collateralToken:o,stopLoss:e.stopLoss?ye(e.stopLoss,18):0n,takeProfit:e.takeProfit?ye(e.takeProfit,18):0n},t),g=Ee(a,s),h=_e({chain:g,transport:Ze(s,t)}),w=Ca(o);if(o==="MON"){let N=await h.getBalance({address:n});if(N<m.value){let W=le(m.amountIn,w),me=le(m.amountIn-p,w);return{success:!1,message:`Insufficient native MON balance. Required: ${le(m.value,w)} MON (${e.marginAmount} margin + ${me} trading fee + Pyth fee). Available: ${le(N,w)} MON.`,error:"Insufficient balance"}}}else{let N=o==="USDC"?V0:o==="LVUSD"?g0:h0,W=await h.readContract({address:N,abi:Xe,functionName:"balanceOf",args:[n]});if(W<m.amountIn){let me=le(m.amountIn,w),j=le(W,w),Z=le(m.amountIn-p,w);return{success:!1,message:`Insufficient ${o} balance. Required: ${me} ${o} (${e.marginAmount} margin + ${Z} fee), Available: ${j} ${o}.`,error:"Insufficient balance"}}}let v=await Tn(h,n),T=[];if(o!=="MON"){let N=m.tokenIn,W=await h.readContract({address:N,abi:Xe,functionName:"allowance",args:[n,m.to]});if(W<m.amountIn){if(W>0n){let j=cs({tokenAddress:N,spender:m.to,amount:0n,delegator:n,sessionKey:r,nonce:v,chainId:a});T.push({delegation:j.delegation,execution:{target:N,value:0n,callData:X({abi:Xe,functionName:"approve",args:[m.to,0n]})},kind:"approve"})}let me=cs({tokenAddress:N,spender:m.to,amount:m.amountIn,delegator:n,sessionKey:r,nonce:v,chainId:a});T.push({delegation:me.delegation,execution:{target:N,value:0n,callData:X({abi:Xe,functionName:"approve",args:[m.to,m.amountIn]})},kind:"approve"})}}let A=R0e({diamond:m.to,delegator:n,sessionKey:r,nonce:v,chainId:a,calldata:m.data,value:m.value});T.push({delegation:A.delegation,execution:{target:m.to,value:m.value,callData:m.data},kind:"leverup_limit_order"});for(let N of T){let W;N.kind==="approve"?W=`Approve ${o} for LeverUp`:W=`LeverUp Limit: ${e.leverage}x ${e.isLong?"Long":"Short"} ${e.symbol} @ $${e.triggerPrice}`;let me=await _n(N.delegation,a,t.wallet.keyId,W);N.delegation.signature=me}let _=await ht(),E=on(_),O=Tt({account:E,chain:g,transport:Ze(s,t)}),$=T.filter(N=>N.kind==="approve");if($.length>0){let N=$.map(j=>({permissionContext:[j.delegation],executions:[Pt({target:j.execution.target,value:j.execution.value,callData:j.execution.callData})],mode:nn.SingleDefault})),W=await dn(O,h,Ue.delegationManager,N);if((await Xt(h,W)).status!=="success")return{success:!1,message:"Failed to approve token. Transaction reverted.",error:"Approve transaction failed"}}let B=T.find(N=>N.kind==="leverup_limit_order");if(!B)return{success:!1,message:"Internal error: trade delegation not found.",error:"Missing trade delegation"};let V=[{permissionContext:[B.delegation],executions:[Pt({target:B.execution.target,value:B.execution.value,callData:B.execution.callData})],mode:nn.SingleDefault}],M=await dn(O,h,Ue.delegationManager,V);return(await Xt(h,M)).status==="success"?{success:!0,message:`Successfully placed ${e.leverage}x ${e.isLong?"Long":"Short"} limit order on ${e.symbol} at $${e.triggerPrice}. Order will trigger when market ${e.isLong?"drops to":"rises to"} your price.`,data:{quote:{symbol:i.symbol,side:e.isLong?"LONG":"SHORT",leverage:e.leverage,triggerPrice:`$${e.triggerPrice}`,currentPrice:`$${i.currentPrice}`,marginAmount:i.marginAmount,positionSize:`$${i.positionValueUsd}`,stopLoss:e.stopLoss?`$${e.stopLoss}`:void 0,takeProfit:e.takeProfit?`$${e.takeProfit}`:void 0},txHash:M,explorerUrl:`https://monadvision.com/tx/${M}`}}:{success:!1,message:"Transaction reverted on-chain. Check your collateral balance and try again.",error:"Transaction reverted"}}catch(t){let n=t instanceof Error?t.message:"Unknown error";return{success:!1,message:`Failed to place limit order: ${n}`,error:n}}}Te();Y();var Pje=C.object({address:C.string().optional().describe("Optional address to check limit orders for. Defaults to your smart account.")});function Wae(e){e.tool("leverup_list_limit_orders","List all your pending LeverUp limit orders. These are orders that haven't been filled yet and will trigger when the market reaches the specified price. For filled positions, use leverup_list_positions instead.",Pje.shape,async t=>{let n=await Rje(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function Rje(e){try{let t=await q();if(!t||!Pe(t))return{success:!1,message:"Wallet not configured. Run setup_wallet first."};let n=e.address||t.wallet?.smartAccountAddress,r=await vre(n);if(r.length===0)return{success:!0,message:"No pending limit orders found.",data:{orders:[],note:"Limit orders trigger when the market price reaches your specified trigger price. Long orders trigger when price drops BELOW the trigger price. Short orders trigger when price rises ABOVE the trigger price."}};let a=r.map(o=>({orderHash:o.orderHash,pair:o.pair,side:o.isLong?"LONG":"SHORT",triggerPrice:`$${Number(le(o.limitPrice,18)).toFixed(2)}`,size:le(o.qty,10),margin:`${le(o.amountIn,18)} (collateral)`,stopLoss:o.stopLoss>0n?`$${Number(le(o.stopLoss,18)).toFixed(2)}`:"Not set",takeProfit:o.takeProfit>0n?`$${Number(le(o.takeProfit,18)).toFixed(2)}`:"Not set",createdAt:new Date(o.timestamp*1e3).toISOString()})),s=a.map(o=>`${o.pair} ${o.side} @ ${o.triggerPrice}`).join(", ");return{success:!0,message:`You have ${r.length} pending limit order${r.length>1?"s":""}. Summary: ${s}`,data:{orders:a,note:"To cancel an order, use leverup_cancel_limit_order with the orderHash. Orders will automatically fill when the market reaches your trigger price."}}}catch(t){return{success:!1,message:`Failed to fetch limit orders: ${t instanceof Error?t.message:"Unknown error"}`}}}Te();t0();D0();mt();We();Ar();Y();var $je=C.object({orderHashes:C.array(C.string().regex(/^0x[a-fA-F0-9]{64}$/)).min(1).describe("Array of limit order hashes to cancel. Use leverup_list_limit_orders to get the orderHashes of your pending orders."),agentId:C.string().optional().describe("Sub-agent ID for autonomous execution (no Touch ID). If omitted, uses assistant mode with Touch ID confirmation.")});function Zae(e){e.tool("leverup_cancel_limit_order","Cancel one or more pending LeverUp limit orders. If agentId provided: uses autonomous mode (no Touch ID). If no agentId: uses assistant mode (requires Touch ID). Use leverup_list_limit_orders first to see your pending orders and their orderHashes.",$je.shape,async t=>{let n=await Mje(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function Mje(e){try{let t=await q();if(!t||!Pe(t))return{success:!1,message:"Wallet not configured. Run setup_wallet first."};if(e.agentId){let A=await Mre(e.agentId,e.orderHashes);return{success:A.success,message:A.message,data:A.txHash?{cancelledOrders:e.orderHashes,txHash:A.txHash,explorerUrl:A.explorerUrl}:void 0,error:A.error}}if(_t()){let A=e.orderHashes,_=A.length===1?F2(A[0]):z2(A),E=await zn({target:_.to,value:_.value,callData:_.data},t);return{success:E.success,message:E.success?A.length===1?`Successfully cancelled limit order ${A[0]}`:`Successfully cancelled ${A.length} limit orders`:E.message,data:E.txHash?{cancelledOrders:A,txHash:E.txHash,explorerUrl:E.explorerUrl}:void 0,error:E.error}}let n=t.wallet.smartAccountAddress,r=t.wallet.sessionKeyAddress,a=t.network.chainId,s=await we(t),o=e.orderHashes,i=o.length===1?F2(o[0]):z2(o),u=Ee(a,s),d=_e({chain:u,transport:Ze(s,t)}),l=await Tn(d,n),p=$0e({diamond:i.to,delegator:n,sessionKey:r,nonce:l,chainId:a,calldata:i.data}),y=o.length===1?`Cancel limit order: ${o[0].slice(0,10)}...`:`Cancel ${o.length} limit orders`,m=await _n(p.delegation,a,t.wallet.keyId,y);p.delegation.signature=m;let g=await ht(),h=on(g),w=Tt({account:h,chain:u,transport:Ze(s,t)}),v=await dn(w,d,Ue.delegationManager,[{permissionContext:[p.delegation],executions:[Pt({target:i.to,value:i.value,callData:i.data})],mode:nn.SingleDefault}]);return(await Xt(d,v)).status==="success"?{success:!0,message:o.length===1?`Successfully cancelled limit order ${o[0]}`:`Successfully cancelled ${o.length} limit orders`,data:{cancelledOrders:o,txHash:v,explorerUrl:`https://monadvision.com/tx/${v}`}}:{success:!1,message:"Transaction reverted on-chain. The order may have already been filled or cancelled.",error:"Transaction reverted"}}catch(t){let n=t instanceof Error?t.message:"Unknown error";return{success:!1,message:`Failed to cancel limit order: ${n}`,error:n}}}var Dje=C.object({symbol:C.string().describe("Asset symbol to get chart data for. Examples: 'BTC', 'ETH', 'MON', 'SOL', 'AAPL', 'NVDA', 'TSLA', 'GOLD', 'EUR'. Also accepts pair format like 'BTC/USD'. CRITICAL: Use this to analyze price trends BEFORE making trading decisions."),resolution:C.enum(["1","5","15","30","60","240","D","1W","1M"]).optional().describe("Candlestick timeframe: '1' (1min), '5', '15', '30', '60' (1hr), '240' (4hr), 'D' (daily), '1W' (weekly), '1M' (monthly). Default: '60' (1 hour)."),bars:C.number().min(1).max(500).optional().describe("Number of candles to return (1-500). Default: 100. More bars = longer history but larger response.")});function Kae(e){e.tool("market_get_chart","Get OHLCV candlestick chart data for any asset (crypto, stocks, forex, commodities). Returns price history with open/high/low/close/volume for technical analysis. Data from Pyth Network - same oracle source used for LeverUp price feeds.",Dje.shape,async t=>{let n=await Oje(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function Oje(e){try{let t=e.resolution||"60",n=e.bars||100,r=await v$(e.symbol,t,n),a=G2(r.latestPrice);return{success:!0,message:`${r.symbol} ${r.resolutionLabel} chart: $${a} (${r.priceChangePercent})`,data:{symbol:r.symbol,pythSymbol:r.pythSymbol,resolution:r.resolution,resolutionLabel:r.resolutionLabel,latestPrice:r.latestPrice,priceChange:r.priceChangePercent,periodHigh:r.periodHigh,periodLow:r.periodLow,candleCount:r.candles.length,candles:r.candles}}}catch(t){let n=t instanceof Error?t.message:"Unknown error";return{success:!1,message:`Failed to get chart data for ${e.symbol}`,error:n}}}We();Te();var Nje=C.object({base:C.string().optional().describe("Base currency code for exchange rates. Default: 'USD'. Examples: 'USD', 'EUR', 'GBP', 'JPY'. Rates show how much of each currency equals 1 unit of base.")});function Xae(e){e.tool("market_get_fx_reference","Get current ECB exchange rates for major currencies. Use to understand FX market conditions and currency valuations. Returns rates relative to base currency (default USD).",Nje.shape,async t=>{let n=await Lje(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function Lje(e){if(!await Ct())return{success:!1,message:"Market intelligence requires x402 mode",error:"Please run set_mode with mode 'x402' first"};try{let r=(await q())?.network?.chainId||143,a=e.base?.toUpperCase()||"USD",s=`${gn()}/${r}/market/fx-ref?base=${a}`,o=await dt(s,{method:"GET",headers:{Accept:"application/json"}});if(!o.ok)throw new Error(`API error (${o.status}): ${o.statusText}`);let i=await o.json();if(!i.success)throw new Error(i.error||"API returned unsuccessful response");let u=Object.keys(i.data?.rates||{}).length;return{success:!0,message:`${a} exchange rates (${u} currencies) as of ${i.data?.date}`,data:i.data}}catch(n){return{success:!1,message:"Failed to get exchange rates",error:n instanceof Error?n.message:"Unknown error"}}}We();Te();var Bje=C.object({});function Jae(e){e.tool("market_get_currency_strength","Get currency strength matrix for major currencies (USD, EUR, GBP, JPY, etc.). Returns strength scores (0-100), 7-day momentum, and trend signals. Use to identify strong/weak currencies for FX trading decisions.",Bje.shape,async()=>{let t=await Uje();return{content:[{type:"text",text:JSON.stringify(t,null,2)}]}})}async function Uje(){if(!await Ct())return{success:!1,message:"Market intelligence requires x402 mode",error:"Please run set_mode with mode 'x402' first"};try{let n=(await q())?.network?.chainId||143,r=`${gn()}/${n}/market/strength`,a=await dt(r,{method:"GET",headers:{Accept:"application/json"}});if(!a.ok)throw new Error(`API error (${a.status}): ${a.statusText}`);let s=await a.json();if(!s.success)throw new Error(s.error||"API returned unsuccessful response");return{success:!0,message:`Currency strength (${s.data?.currencies?.length||0} currencies): Strongest=${s.data?.strongest}, Weakest=${s.data?.weakest}`,data:s.data}}catch(t){return{success:!1,message:"Failed to get currency strength",error:t instanceof Error?t.message:"Unknown error"}}}We();Te();var Hje=C.object({});function Qae(e){e.tool("market_get_economic_events","Get upcoming high-impact economic events (FOMC, NFP, CPI, GDP, etc.). Returns events from Forex Factory with impact ratings. Use to prepare for market-moving announcements.",Hje.shape,async()=>{let t=await Fje();return{content:[{type:"text",text:JSON.stringify(t,null,2)}]}})}async function Fje(){if(!await Ct())return{success:!1,message:"Market intelligence requires x402 mode",error:"Please run set_mode with mode 'x402' first"};try{let n=(await q())?.network?.chainId||143,r=`${gn()}/${n}/market/events`,a=await dt(r,{method:"GET",headers:{Accept:"application/json"}});if(!a.ok)throw new Error(`API error (${a.status}): ${a.statusText}`);let s=await a.json();if(!s.success)throw new Error(s.error||"API returned unsuccessful response");let o=s.events||[];return{success:!0,message:`${o.length} upcoming high-impact economic events`,data:{events:o,count:o.length}}}catch(t){return{success:!1,message:"Failed to get economic events",error:t instanceof Error?t.message:"Unknown error"}}}We();Te();var zje=C.object({});function Yae(e){e.tool("market_get_weekly_calendar","Get this week's economic calendar grouped by day. Returns high-impact events organized Monday-Friday. Use to plan trading around scheduled releases.",zje.shape,async()=>{let t=await jje();return{content:[{type:"text",text:JSON.stringify(t,null,2)}]}})}async function jje(){if(!await Ct())return{success:!1,message:"Market intelligence requires x402 mode",error:"Please run set_mode with mode 'x402' first"};try{let n=(await q())?.network?.chainId||143,r=`${gn()}/${n}/market/calendar`,a=await dt(r,{method:"GET",headers:{Accept:"application/json"}});if(!a.ok)throw new Error(`API error (${a.status}): ${a.statusText}`);let s=await a.json();if(!s.success)throw new Error(s.error||"API returned unsuccessful response");return{success:!0,message:`Weekly calendar (${s.data?.weekStart} to ${s.data?.weekEnd}): ${s.data?.totalEvents} events`,data:s.data}}catch(t){return{success:!1,message:"Failed to get weekly calendar",error:t instanceof Error?t.message:"Unknown error"}}}We();Te();var qje=C.object({limit:C.number().min(1).max(50).optional().describe("Maximum number of news items to return (1-50). Default: 50.")});function ese(e){e.tool("market_get_critical_news","Get critical and high-impact market news from the last 7 days. Uses 5-layer red detection for critical news identification. Includes central bank decisions, inflation data, and major market events.",qje.shape,async t=>{let n=await Gje(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function Gje(e){if(!await Ct())return{success:!1,message:"Market intelligence requires x402 mode",error:"Please run set_mode with mode 'x402' first"};try{let r=(await q())?.network?.chainId||143,a=e.limit||50,s=`${gn()}/${r}/market/news?limit=${a}`,o=await dt(s,{method:"GET",headers:{Accept:"application/json"}});if(!o.ok)throw new Error(`API error (${o.status}): ${o.statusText}`);let i=await o.json();if(!i.success)throw new Error(i.error||"API returned unsuccessful response");let u=i.events||[],d=u.filter(p=>p.isCritical).length,l=u.filter(p=>p.isHighImpact).length;return{success:!0,message:`${u.length} news items (${d} critical, ${l} high-impact)`,data:{events:u,count:u.length}}}catch(n){return{success:!1,message:"Failed to get critical news",error:n instanceof Error?n.message:"Unknown error"}}}We();Te();var Vje=C.object({query:C.string().describe("Search keyword to find in news headlines. Examples: 'fed', 'inflation', 'bitcoin', 'trump'."),days:C.number().min(1).max(7).optional().describe("Time window for search (1-7 days). Default: 7."),limit:C.number().min(1).max(50).optional().describe("Maximum number of results (1-50). Default: 20.")});function tse(e){e.tool("market_search_news","Search news headlines by keyword over the last 7 days. Use to find specific topics like 'fed', 'inflation', 'bitcoin', etc. Returns matching news items sorted by recency.",Vje.shape,async t=>{let n=await Wje(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function Wje(e){if(!await Ct())return{success:!1,message:"Market intelligence requires x402 mode",error:"Please run set_mode with mode 'x402' first"};try{let r=(await q())?.network?.chainId||143,{query:a}=e,s=e.days||7,o=e.limit||20,i=`${gn()}/${r}/market/search?q=${encodeURIComponent(a)}&days=${s}&limit=${o}`,u=await dt(i,{method:"GET",headers:{Accept:"application/json"}});if(!u.ok)throw new Error(`API error (${u.status}): ${u.statusText}`);let d=await u.json();if(!d.success)throw new Error(d.error||"API returned unsuccessful response");let l=d.events||[];return{success:!0,message:`Found ${l.length} news items matching "${a}" (last ${s} days)`,data:{query:a,days:s,events:l,count:l.length}}}catch(n){return{success:!1,message:`Failed to search news for "${e.query}"`,error:n instanceof Error?n.message:"Unknown error"}}}We();Te();var Zje=C.object({bank:C.string().optional().describe("Filter by central bank code. Options: 'FED', 'ECB', 'BOE', 'BOC', 'RBA', 'BOJ', 'SNB', 'RBNZ'. Leave empty for all banks."),limit:C.number().min(1).max(50).optional().describe("Maximum number of speeches to return (1-50). Default: 20.")});function nse(e){e.tool("market_get_cb_speeches","Get recent central bank speeches and policy announcements. Filter by bank (FED, ECB, BOE, etc.) or get all. Includes speaker names and content classification.",Zje.shape,async t=>{let n=await Kje(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function Kje(e){if(!await Ct())return{success:!1,message:"Market intelligence requires x402 mode",error:"Please run set_mode with mode 'x402' first"};try{let r=(await q())?.network?.chainId||143,a=e.bank?.toUpperCase(),s=e.limit||20,o=a?`&bank=${a}`:"",i=`${gn()}/${r}/market/speeches?limit=${s}${o}`,u=await dt(i,{method:"GET",headers:{Accept:"application/json"}});if(!u.ok)throw new Error(`API error (${u.status}): ${u.statusText}`);let d=await u.json();if(!d.success)throw new Error(d.error||"API returned unsuccessful response");let l=d.speeches||[],p=l.filter(y=>y.isCritical).length;return{success:!0,message:`${l.length} speeches from ${a||"all banks"} (${p} critical)`,data:{bank:d.bank||"all",speeches:l,count:l.length}}}catch(n){return{success:!1,message:"Failed to get central bank speeches",error:n instanceof Error?n.message:"Unknown error"}}}We();Te();var Xje=C.object({query:C.string().describe("Search query for recent tweets. Supports X search operators: 'lang:en', '-is:retweet', 'has:links', etc. Examples: 'monad', 'monad lang:en -is:retweet', '@pragma_xyz'."),max_results:C.number().min(10).max(100).optional().describe("Number of tweets to return (10-100). Default: 10. Cost scales linearly at $0.007/tweet."),sort_order:C.enum(["recency","relevancy"]).optional().describe("Sort order: 'recency' (default, newest first) or 'relevancy' (most relevant first).")});function rse(e){e.tool("x_search","Search recent tweets on X/Twitter. Returns tweets with author info and engagement metrics. Supports X search operators. Cost: $0.007 per tweet returned (variable pricing).",Xje.shape,async t=>{let n=await Jje(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function Jje(e){if(!await Ct())return{success:!1,message:"Social intelligence requires x402 mode",error:"Please run set_mode with mode 'x402' first"};try{let r=(await q())?.network?.chainId||143,{query:a}=e,s=e.max_results||10,o=e.sort_order||"recency",i=`${gn()}/${r}/x/search?q=${encodeURIComponent(a)}&max_results=${s}&sort_order=${o}`,u=await dt(i,{method:"GET",headers:{Accept:"application/json"}});if(!u.ok)throw new Error(`API error (${u.status}): ${u.statusText}`);let d=await u.json();if(!d.success)throw new Error(d.error||"API returned unsuccessful response");let l=d.tweets||[];return{success:!0,message:`Found ${l.length} tweets matching "${a}"`,data:{query:d.query||a,count:d.count||l.length,tweets:l,meta:d.meta||null}}}catch(n){return{success:!1,message:`Failed to search tweets for "${e.query}"`,error:n instanceof Error?n.message:"Unknown error"}}}We();Te();var Qje=C.object({tweet_id:C.string().describe("The numeric tweet ID to look up. Example: '1893024529028493352'. Found in tweet URLs: x.com/user/status/{tweet_id}.")});function ase(e){e.tool("x_get_tweet","Look up a specific tweet by ID. Returns full tweet text, author info, and engagement metrics (likes, retweets, replies, quotes, bookmarks, impressions). Cost: $0.007 per call.",Qje.shape,async t=>{let n=await Yje(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function Yje(e){if(!await Ct())return{success:!1,message:"Social intelligence requires x402 mode",error:"Please run set_mode with mode 'x402' first"};try{let r=(await q())?.network?.chainId||143,a=`${gn()}/${r}/x/tweet/${e.tweet_id}`,s=await dt(a,{method:"GET",headers:{Accept:"application/json"}});if(!s.ok)throw new Error(`API error (${s.status}): ${s.statusText}`);let o=await s.json();if(!o.success)throw new Error(o.error||"API returned unsuccessful response");if(!o.tweet)throw new Error("Tweet not found");return{success:!0,message:`Tweet by ${o.tweet.author?.username?`@${o.tweet.author.username}`:"unknown"}`,data:{tweet:o.tweet}}}catch(n){return{success:!1,message:`Failed to look up tweet "${e.tweet_id}"`,error:n instanceof Error?n.message:"Unknown error"}}}We();Te();var eqe=C.object({username:C.string().describe("X/Twitter username to look up (without @). Example: '0xelpabl0', 'vaborsh'.")});function sse(e){e.tool("x_get_user","Look up an X/Twitter user profile by username. Returns bio, follower count, tweet count, account age, and verification status. Cost: $0.014 per call.",eqe.shape,async t=>{let n=await tqe(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function tqe(e){if(!await Ct())return{success:!1,message:"Social intelligence requires x402 mode",error:"Please run set_mode with mode 'x402' first"};try{let r=(await q())?.network?.chainId||143,a=`${gn()}/${r}/x/user/${encodeURIComponent(e.username)}`,s=await dt(a,{method:"GET",headers:{Accept:"application/json"}});if(!s.ok)throw new Error(`API error (${s.status}): ${s.statusText}`);let o=await s.json();if(!o.success)throw new Error(o.error||"API returned unsuccessful response");if(!o.user)throw new Error("User not found");return{success:!0,message:`@${o.user.username}: ${o.user.metrics?.followers?.toLocaleString()||0} followers`,data:{user:o.user}}}catch(n){return{success:!1,message:`Failed to look up user "${e.username}"`,error:n instanceof Error?n.message:"Unknown error"}}}We();Te();var nqe=C.object({tweet_id:C.string().describe("The numeric tweet ID to get replies for. Example: '1893024529028493352'. Found in tweet URLs: x.com/user/status/{tweet_id}."),max_results:C.number().min(10).max(100).optional().describe("Number of replies to return (10-100). Default: 10. Cost scales linearly at $0.007/reply.")});function ose(e){e.tool("x_get_replies","Get replies to a specific tweet. Returns conversation participants sorted by recency with author info and engagement metrics. Cost: $0.007 per reply returned (variable pricing).",nqe.shape,async t=>{let n=await rqe(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function rqe(e){if(!await Ct())return{success:!1,message:"Social intelligence requires x402 mode",error:"Please run set_mode with mode 'x402' first"};try{let r=(await q())?.network?.chainId||143,a=e.max_results||10,s=`${gn()}/${r}/x/tweet/${e.tweet_id}/replies?max_results=${a}`,o=await dt(s,{method:"GET",headers:{Accept:"application/json"}});if(!o.ok)throw new Error(`API error (${o.status}): ${o.statusText}`);let i=await o.json();if(!i.success)throw new Error(i.error||"API returned unsuccessful response");let u=i.replies||[];return{success:!0,message:`Found ${u.length} replies to tweet ${e.tweet_id}`,data:{tweetId:e.tweet_id,count:i.count||u.length,replies:u,meta:i.meta||null}}}catch(n){return{success:!1,message:`Failed to get replies for tweet "${e.tweet_id}"`,error:n instanceof Error?n.message:"Unknown error"}}}We();Te();var aqe=C.object({username:C.string().describe("X/Twitter username to get tweets from (without @). Example: '0xelpabl0', 'naddotfun'."),max_results:C.number().min(10).max(100).optional().describe("Number of tweets to return (10-100). Default: 10. Cost scales linearly at $0.007/tweet."),exclude:C.enum(["replies","retweets"]).optional().describe("Exclude tweet type: 'replies' or 'retweets'. Omit to include all.")});function ise(e){e.tool("x_get_user_tweets","Get a user's recent tweets by username. Returns their timeline with engagement metrics. Can exclude replies or retweets. Cost: $0.007 per tweet returned (variable pricing).",aqe.shape,async t=>{let n=await sqe(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function sqe(e){if(!await Ct())return{success:!1,message:"Social intelligence requires x402 mode",error:"Please run set_mode with mode 'x402' first"};try{let r=(await q())?.network?.chainId||143,a=e.max_results||10,s=`${gn()}/${r}/x/user/${encodeURIComponent(e.username)}/tweets?max_results=${a}`;e.exclude&&(s+=`&exclude=${e.exclude}`);let o=await dt(s,{method:"GET",headers:{Accept:"application/json"}});if(!o.ok)throw new Error(`API error (${o.status}): ${o.statusText}`);let i=await o.json();if(!i.success)throw new Error(i.error||"API returned unsuccessful response");let u=i.tweets||[];return{success:!0,message:`Found ${u.length} tweets from @${e.username}`,data:{username:i.username||e.username,count:i.count||u.length,tweets:u,meta:i.meta||null}}}catch(n){return{success:!1,message:`Failed to get tweets from "@${e.username}"`,error:n instanceof Error?n.message:"Unknown error"}}}Y();Te();D0();Y();import{existsSync as T$,readFileSync as cqe,writeFileSync as uqe,unlinkSync as dqe,mkdirSync as fqe}from"node:fs";import{homedir as lqe}from"node:os";import*as S$ from"node:path";mt();m0();function cc(e){let t=-e.getTimezoneOffset(),n=t>=0?"+":"-",r=a=>String(Math.floor(Math.abs(a))).padStart(2,"0");return`${e.getFullYear()}-${r(e.getMonth()+1)}-${r(e.getDate())}T${r(e.getHours())}:${r(e.getMinutes())}:${r(e.getSeconds())}${n}${r(t/60)}:${r(t%60)}`}function Pa(e){let t=Date.now(),n=e-t;if(n<=0)return"Expired";let r=Math.floor(n/(1440*60*1e3)),a=Math.floor(n%(1440*60*1e3)/(3600*1e3));return r>0?`${r}d ${a}h`:a>0?`${a}h`:`${Math.floor(n%(3600*1e3)/(60*1e3))}m`}Y();var oqe="0x0000000000000000000000000000000000000000000000000000000000000000",cse=1440*60,z7={openMarketTrade:"0xca004414",closeTrade:"0x5177fd3b",addMargin:"0xe1379570",updateTpSl:"0x2f745df6",openLimitOrder:"0xf37afc20",cancelLimitOrder:"0x4584eff6",batchCancelLimitOrders:"0x54688625"},j7={buy:"0x6df9e92b",sell:"0x5de3085d",create:"0xba12cd8d"},V2={deposit:"0xd0e30db0",withdraw:"0x2e1a7d4d"},W2={execute:"0x1fff991f",exec:"0x2213bc0b"},Z2={transfer:"0xa9059cbb"};function use(e){switch(e){case"kairos":return[...Object.values(z7),...Object.values(V2),...Object.values(W2),...Object.values(Z2)];case"thymos":return[...Object.values(j7),...Object.values(V2),...Object.values(W2),...Object.values(Z2)];case"pragma":return[...Object.values(z7),...Object.values(j7),...Object.values(V2),...Object.values(W2),...Object.values(Z2)]}}function iqe(e,t,n){let s=[{type:"timestamp",afterThreshold:0,beforeThreshold:Math.floor(Date.now()/1e3)+e*cse},{type:"limitedCalls",limit:t}];return n!==void 0&&s.push({type:"nonce",nonce:ge(n)}),s}function dse(e){let{parentDelegation:t,subAgentAddress:n,mainAgentAddress:r,allowedTargets:a,allowedSelectors:s,expiryDays:o,valueLtePerTx:i,maxCalls:u,chainId:d,nonce:l}=e,p=E0(),m=Math.floor(Date.now()/1e3)+o*cse,g=iqe(o,u,l),h=s&&s.length>0?s:[],v=L0({environment:p,scope:{type:"functionCall",targets:a,selectors:h},from:r,to:n,caveats:g,salt:oqe}),T={...t,salt:typeof t.salt=="bigint"?t.salt:BigInt(t.salt)};v.authority=ec(T);let A=[ip.toLowerCase(),z5.toLowerCase(),z6.toLowerCase()];v.caveats=v.caveats.filter(O=>!A.includes(O.enforcer.toLowerCase()));let _=N7(a,h);v.caveats.unshift(_),v.caveats.push({enforcer:z6,terms:Zt([{type:"uint256"}],[i]),args:"0x"});let E=k0(v,d);return{delegation:v,typedData:E,expiresAt:m,approximateBudget:i*BigInt(u)}}function fse(e){let t=[];return(e.expiryDays<1||e.expiryDays>30)&&t.push("expiryDays must be between 1 and 30"),(e.maxCalls<1||e.maxCalls>1e3)&&t.push("maxCalls must be between 1 and 1000"),e.valueLtePerTx<0n&&t.push("valueLtePerTx must be non-negative"),e.allowedTargets.length===0&&t.push("allowedTargets must have at least one address"),{valid:t.length===0,errors:t}}var pqe="0x0000000000000000000000000000000000000000000000000000000000000000",lse=1440*60,mqe="root-delegation.json";function bqe(){let e=S$.join(lqe(),".pragma");return T$(e)||fqe(e,{recursive:!0}),e}function A$(){return S$.join(bqe(),mqe)}function yqe(e){let t=[],n=S6[e];return t.push(Yr),t.push(Kn),n?.aggregators?.router&&t.push(n.aggregators.router),e===143&&t.push(bp[143].router),t.push(V0),t.push(g0),t.push(h0),t}function gqe(){return[...Object.values(z7),...Object.values(j7),...Object.values(V2),...Object.values(W2),...Object.values(Z2)]}function hqe(e,t){return[{type:"timestamp",afterThreshold:0,beforeThreshold:Math.floor(Date.now()/1e3)+e*lse},{type:"limitedCalls",limit:t}]}function xqe(e){let{delegator:t,sessionKey:n,expiryDays:r,valueLtePerTx:a,maxCalls:s,chainId:o}=e,i=E0(),d=Math.floor(Date.now()/1e3)+r*lse,l=yqe(o),p=gqe(),y=hqe(r,s),g=L0({environment:i,scope:{type:"functionCall",targets:l,selectors:p},from:t,to:n,caveats:y,salt:pqe}),h=[ip.toLowerCase(),z5.toLowerCase(),z6.toLowerCase()];g.caveats=g.caveats.filter(T=>!h.includes(T.enforcer.toLowerCase()));let w=N7(l,p);g.caveats.unshift(w),g.caveats.push({enforcer:z6,terms:Zt([{type:"uint256"}],[a]),args:"0x"});let v=k0(g,o);return{delegation:g,typedData:v,expiresAt:d,approximateBudget:a*BigInt(s),allowedTargets:l}}async function pse(e){let{delegator:t,sessionKey:n,expiryDays:r,valueLtePerTx:a,maxCalls:s,chainId:o,keyId:i,touchIdMessage:u,budgetMon:d,budgetUsd:l,maxValuePerTx:p}=e,y=xqe({delegator:t,sessionKey:n,expiryDays:r,valueLtePerTx:a,maxCalls:s,chainId:o}),m=await _n(y.delegation,o,i,u??"Enable autonomous trading mode"),g={...y.delegation,signature:m},h={...y.delegation,salt:BigInt(y.delegation.salt)},v={delegationHash:ec(h),delegation:g,allowedTargets:y.allowedTargets,sessionKey:n,delegator:t,chainId:o,createdAt:Date.now(),expiresAt:y.expiresAt*1e3,valueLtePerTx:a.toString(),maxCalls:s,approximateBudget:y.approximateBudget.toString(),budgetMon:d??Ge(a*BigInt(s)),budgetUsd:l??"0",maxValuePerTx:p??Ge(a)},T=A$();return uqe(T,JSON.stringify(v,null,2)),v}function K2(){let e=A$();if(!T$(e))return null;try{let t=cqe(e,"utf-8");return JSON.parse(t)}catch{return null}}function hp(){let e=K2();if(!e)return{exists:!1,valid:!1};let t=Date.now()<e.expiresAt,n=t?Pa(e.expiresAt):"expired";return{exists:!0,valid:t,expiresAt:e.expiresAt,expiresIn:n,budgetMon:e.budgetMon??Ge(BigInt(e.approximateBudget)),budgetUsd:e.budgetUsd??"0",maxValuePerTx:e.maxValuePerTx??Ge(BigInt(e.valueLtePerTx)),maxCalls:e.maxCalls,sessionKey:e.sessionKey,delegator:e.delegator}}async function mse(){let e=0,t=0,n=await sc();for(let a of n){if(a.walletId)try{await Ia(a.walletId),t++}catch{}try{await mp(a.id),e++}catch{}}let r=A$();return T$(r)&&dqe(r),{subAgentsCleanedUp:e,walletsReleased:t}}function bse(e){let t=[];(e.expiryDays<1||e.expiryDays>30)&&t.push("expiryDays must be between 1 and 30"),(e.maxCalls<1||e.maxCalls>500)&&t.push("maxCalls must be between 1 and 500"),e.valueLtePerTx<0n&&t.push("valueLtePerTx cannot be negative");let n=Hr("100");return e.valueLtePerTx>n&&t.push("valueLtePerTx exceeds 100 MON per-tx safety limit"),{valid:t.length===0,errors:t}}var wqe=C.object({expiryDays:C.number().min(1).max(30).default(7).describe("How many days until delegation expires. Default: 7"),budgetMon:C.number().min(0).default(50).describe("Total MON budget authorized for all agents. Sub-agent allocations must fit within this ceiling. 0 = no native MON spending allowed. Default: 50"),budgetUsd:C.number().min(0).default(0).describe("Total USD-group budget (USDC + LVUSD) authorized for all agents. 0 = no USD spending limit. Default: 0"),maxValuePerTx:C.number().min(0).default(10).describe("Maximum native MON per single transaction. On-chain enforced via ValueLteEnforcer. 0 = block ALL native MON transactions including Pyth oracle fees (prevents LeverUp even with ERC20 collateral). Set > 0 if any agent will use LeverUp or native MON. Default: 10"),maxCalls:C.number().min(1).max(500).default(100).describe("Maximum delegation calls (trades + approvals combined). Each trade may need 1-2 calls (approve + execute). Default: 100"),force:C.boolean().default(!1).describe("Force creation even if a valid root delegation exists")});function yse(e){e.tool("create_root_delegation","Create a persistent root delegation for autonomous trading mode. This requires Touch ID ONCE to authorize the Main Agent (Claude's session key) to execute trades on your behalf. After this, sub-agents can be created without requiring additional Touch ID. The delegation is time-bound and call-count limited. Use this before creating sub-agents with create_sub_agent.",wqe.shape,async t=>{let n=await vqe(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function vqe(e){try{let t=await q();if(!t?.wallet)return{success:!1,message:"Wallet not configured",error:"Please run setup_wallet first"};let n=await ht();if(!n)return{success:!1,message:"Session key not found",error:"Please run setup_wallet to create a session key"};if(!e.force){let d=hp();if(d.exists&&d.valid)return{success:!1,message:"A valid root delegation already exists",existingDelegation:{expiresAt:d.expiresAt?new Date(d.expiresAt).toISOString():"unknown",expiresIn:d.expiresIn||"unknown",budgetMon:(d.budgetMon??"unknown")+" MON",budgetUsd:(d.budgetUsd??"0")+" USD",maxCalls:d.maxCalls??0},error:"Use force: true to replace the existing delegation, or wait for it to expire"}}let r=t.network.chainId,a=Hr(e.maxValuePerTx.toString()),s=bse({expiryDays:e.expiryDays,valueLtePerTx:a,maxCalls:e.maxCalls});if(!s.valid)return{success:!1,message:"Invalid delegation parameters",error:s.errors.join(", ")};let o=await pse({delegator:t.wallet.smartAccountAddress,sessionKey:n.address,expiryDays:e.expiryDays,valueLtePerTx:a,maxCalls:e.maxCalls,chainId:r,keyId:t.wallet.keyId,touchIdMessage:`Authorize autonomous trading: ${e.budgetMon} MON + ${e.budgetUsd} USD, max ${e.maxValuePerTx} MON/tx, ${e.maxCalls} calls, ${e.expiryDays} days`,budgetMon:e.budgetMon.toString(),budgetUsd:e.budgetUsd.toString(),maxValuePerTx:e.maxValuePerTx.toString()}),i=new Date(o.expiresAt),u=Pa(o.expiresAt);return{success:!0,message:"Root delegation created successfully. You can now create sub-agents without Touch ID.",rootDelegation:{delegationHash:o.delegationHash,sessionKey:o.sessionKey,delegator:o.delegator,budgetMon:e.budgetMon+" MON",budgetUsd:e.budgetUsd+" USD",maxValuePerTx:e.maxValuePerTx+" MON/tx",maxCalls:o.maxCalls,expiresAt:i.toISOString(),expiresIn:u,allowedTargets:o.allowedTargets}}}catch(t){let n=t instanceof Error?t.message:"Unknown error";return/cancell?ed|user denied/i.test(n)?{success:!1,message:"Touch ID cancelled",error:"User cancelled Touch ID authentication"}:{success:!1,message:"Failed to create root delegation",error:n}}}Y();Te();mt();D0();We();import{randomUUID as Sqe}from"node:crypto";m0();import{spawn as Tqe}from"node:child_process";var Wi=null;function gse(){if(Wi!==null){if(Wi.exitCode===null&&!Wi.killed)return;Wi=null}try{let e=Tqe("caffeinate",["-i","-s","-w",`${process.pid}`],{stdio:"ignore"});e.on("exit",()=>{Wi=null}),e.on("error",()=>{Wi=null}),Wi=e}catch{}}function q7(){if(Wi!==null){try{Wi.kill("SIGTERM")}catch{}Wi=null}}function Aqe(){let e=u$();if(!e)return null;try{let t={...e,salt:typeof e.salt=="bigint"?e.salt:BigInt(e.salt)},n=ec(t),r=_qe(e.caveats),a=Eqe(e.caveats),s=kqe(e.caveats);return{delegationHash:n,delegation:e,allowedTargets:[],sessionKey:e.delegate,delegator:e.delegator,chainId:143,createdAt:Date.now(),expiresAt:r*1e3,valueLtePerTx:a.toString(),maxCalls:s,approximateBudget:(a*BigInt(s)).toString(),budgetMon:Ge(a*BigInt(s)),budgetUsd:"0",maxValuePerTx:Ge(a)}}catch{return null}}function _qe(e){let t=e.find(a=>a.enforcer.toLowerCase()===Ue.enforcers.timestamp.toLowerCase());if(!t?.terms||t.terms==="0x")return 0;let n=t.terms,r=s9(`0x${n.slice(34)}`,"bigint");return Number(r)}function Eqe(e){let t=e.find(r=>r.enforcer.toLowerCase()===z6.toLowerCase());if(!t?.terms||t.terms==="0x")return 0n;let[n]=ua([{type:"uint256"}],t.terms);return n}function kqe(e){let t=e.find(r=>r.enforcer.toLowerCase()===Ue.enforcers.limitedCalls.toLowerCase());if(!t?.terms||t.terms==="0x")return 0;let[n]=ua([{type:"uint256"}],t.terms);return Number(n)}var Iqe=C.object({agentType:C.enum(["kairos","thymos","pragma"]).describe("Type of sub-agent to create. kairos: Strategic/macro trader for perps (patient, calculated). thymos: Momentum trader for memecoins (fast, conviction-based). pragma: General-purpose agent for any task."),budgetMon:C.number().min(0).describe("MON trading capital for this sub-agent. Must fit within root budgetMon. kairos/pragma require >= 1 (LeverUp's 1 wei Pyth fee needs ValueLteEnforcer > 0). For ERC20 strategies, 1 MON is a safety floor, not actual spend. thymos can use 0."),budgetUsd:C.number().min(0).optional().describe("USD group budget covering USDC + LVUSD (soft limit, agent self-tracks). Default: 0"),allowedGroups:C.array(C.enum(["MON","USD"])).optional().describe("Token groups this agent is allowed to spend. MON group: native MON, WMON, LVMON. USD group: USDC, LVUSD. Tokens acquired during trading are always sellable. Omit for unrestricted access."),allowedTokens:C.array(C.string()).optional().describe("Specific tokens this agent is allowed to spend (by symbol). More specific than allowedGroups \u2014 when set, takes priority. Examples: ['LVUSD'], ['USDC', 'LVUSD'], ['WMON']. Tokens acquired during trading are always sellable. Omit for no per-token restriction."),expiryDays:C.number().min(1).max(30).default(7).describe("How many days until delegation expires. Default: 7"),maxCalls:C.number().min(1).max(100).default(20).describe("Maximum delegation calls (trades + approvals). Each trade may need 1-2 calls (approve + execute). Default: 20"),fundAmount:C.number().min(0).max(10).default(1).describe("Initial gas funding in MON. Set to 0 to skip funding. Default: 1 MON. Max: 10 MON"),taskId:C.string().optional().describe("Optional Claude Code Task ID for tracking"),loopType:C.enum(["none","condition","continuous","interval"]).default("none").describe("Loop behavior. none=one-shot (agent runs once and stops), condition=until condition met (e.g., 'BTC >= 95000'), continuous=until budget/expiry exhausted, interval=periodic checks at fixed intervals"),loopCondition:C.string().optional().describe("For condition type: human-readable condition (e.g., 'BTC price >= 95000')"),loopIntervalMinutes:C.number().min(1).max(1440).optional().describe("For interval type: minutes between checks (e.g., 2 for every 2 minutes)"),mission:C.string().optional().describe("Natural language task re-injected as the agent's next prompt when the SubagentStop hook blocks exit. Must be actionable and self-contained. Example: 'Monitor BTC/USD. Buy when price hits $95,000. Budget: 10 MON.'"),maxIterations:C.number().min(0).max(1e4).default(0).describe("Safety valve: max loop iterations before forcing exit. 0 = unlimited. Default: 0")});function Cqe(e,t,n){switch(e){case"kairos":{let r=[Kn,Yr];return t&&r.push(t),r.push(V0,g0,h0),r}case"thymos":{let r=[];return n&&r.push(n),r.push(Yr),t&&r.push(t),r.push(V0,g0,h0),r}case"pragma":{let r=[Kn,Yr];return t&&r.push(t),n&&r.push(n),r.push(V0,g0,h0),r}}}function hse(e){e.tool("create_sub_agent","Create a new autonomous sub-agent with its own wallet and delegation. Sub-agents can execute trades within their budget constraints without requiring Touch ID. The delegation is signed by the session key and inherits from the user's root delegation. Use this for autonomous trading or monitoring tasks.",Iqe.shape,async t=>{let n=await Pqe(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function Pqe(e){try{let t=await q();if(!t?.wallet)return{success:!1,message:"Wallet not configured",error:"Please run setup_wallet first"};let n=await ht();if(!n)return{success:!1,message:"Session key not found",error:"Please run setup_wallet to create a session key"};let r=t.network.chainId,a=K2()??Aqe();if(!a)return{success:!1,message:"No root delegation found",error:"No delegation found. Use the delegation flow (request \u2192 approve \u2192 retrieve) to create one."};if(Date.now()>a.expiresAt)return{success:!1,message:"Root delegation has expired",error:"Delegation has expired. Please create a new one via the delegation flow."};if(a.sessionKey.toLowerCase()!==n.address.toLowerCase())return{success:!1,message:"Session key mismatch",error:"Delegation was created with a different session key. Please create a new delegation."};let s=Sqe(),o=e.taskId||`subagent-${s}`,i=await QR(o);if(!await oc(i.id))return await Ia(i.id),{success:!1,message:"Wallet key not found in Keychain",error:`Wallet ${i.id} exists in pool but private key missing from Keychain. This can happen if Keychain was reset or pragma-signer was rebuilt. Try running setup_wallet to repair, or delete ~/.pragma/wallet-pool.json and retry.`};try{let d=Hr(e.budgetMon.toString()),l=e.maxCalls>0?d/BigInt(e.maxCalls):0n;if(a.budgetMon!==void 0){let ct=parseFloat(a.budgetMon),fn=await BR(),Pn=parseFloat(Ge(fn));if(Pn+e.budgetMon>ct)return await Ia(i.id),{success:!1,message:"Exceeds root MON budget",error:`Root authorized ${ct} MON. Already allocated: ${Pn} MON. Requested: ${e.budgetMon} MON. Total ${Pn+e.budgetMon} exceeds ${ct}.`}}if(a.budgetUsd!==void 0&&e.budgetUsd&&e.budgetUsd>0){let ct=parseFloat(a.budgetUsd);if(ct>0){let fn=await UR(),Pn=parseFloat(fn.toString())/1e6;if(Pn+e.budgetUsd>ct)return await Ia(i.id),{success:!1,message:"Exceeds root USD budget",error:`Root authorized ${ct} USD. Already allocated: ${Pn} USD. Requested: ${e.budgetUsd} USD.`}}}if((e.agentType==="kairos"||e.agentType==="pragma")&&e.budgetMon<1)return await Ia(i.id),{success:!1,message:"Insufficient MON budget for LeverUp agent",error:`${e.agentType} agents require budgetMon >= 1. LeverUp's Pyth oracle fee (1 wei) is sent as execution.value \u2014 budgetMon: 0 sets ValueLteEnforcer to 0, blocking it. For ERC20 strategies this is a safety floor, not actual spend. Use budgetMon >= 1 or thymos agent type.`};if(a.maxValuePerTx!==void 0){let ct=Hr(a.maxValuePerTx);if(l>ct)return await Ia(i.id),{success:!1,message:"Sub-agent per-tx value exceeds root limit",error:`Sub-agent valueLtePerTx (${Ge(l)} MON) exceeds root maxValuePerTx (${a.maxValuePerTx} MON).`}}let m=S6[r]?.aggregators?.router,g=r===143?bp[143].router:void 0,h=Cqe(e.agentType,m,g),w=use(e.agentType),v=fse({subAgentAddress:i.address,mainAgentAddress:n.address,allowedTargets:h,allowedSelectors:w,expiryDays:e.expiryDays,valueLtePerTx:l,maxCalls:e.maxCalls,chainId:r});if(!v.valid)return await Ia(i.id),{success:!1,message:"Invalid delegation parameters",error:v.errors.join(", ")};let T=dse({subAgentAddress:i.address,mainAgentAddress:n.address,parentDelegation:a.delegation,allowedTargets:h,allowedSelectors:w,expiryDays:e.expiryDays,valueLtePerTx:l,maxCalls:e.maxCalls,chainId:r}),A=on(n),_=await A.signTypedData({domain:T.typedData.domain,types:T.typedData.types,primaryType:"Delegation",message:T.typedData.message}),E=e.budgetUsd&&e.budgetUsd>0?{[V0.toLowerCase()]:BigInt(Math.floor(e.budgetUsd*1e6))}:void 0,O=e.budgetUsd&&e.budgetUsd>0?{USD:BigInt(Math.floor(e.budgetUsd*1e6))}:void 0,$;if(e.allowedTokens&&e.allowedTokens.length>0){let ct=[],fn=[];for(let Pn of e.allowedTokens){let W0=Pn.toUpperCase(),Zi=E2[W0];if(Zi){ct.push(Zi);continue}let ea=fp(Pn);if(ea){ct.push(ea.address);continue}fn.push(Pn)}if(fn.length>0){let Pn=Object.keys(E2).join(", ");return await Ia(i.id),{success:!1,message:`Unknown token symbols in allowedTokens: [${fn.join(", ")}]. Core tokens: ${Pn}`}}$=ct}await $R({id:s,walletId:i.id,walletAddress:i.address,agentType:e.agentType,taskId:o,budget:{monAllocated:d,tokenLimits:E,groupBudgets:O,allowedGroups:e.allowedGroups,allowedTokens:$},maxCalls:e.maxCalls,expiresAt:T.expiresAt*1e3});let B={...T.delegation,signature:_},V={...T.delegation,salt:BigInt(T.delegation.salt)},G={delegationHash:ec(V),signedDelegation:B,parentDelegationHash:a.delegationHash,rootDelegation:a.delegation,createdAt:Date.now(),expiresAt:T.expiresAt*1e3};if(await OR(s,G),e.loopType&&e.loopType!=="none"){let ct=e.mission||`Continue your ${e.agentType} agent task. `+(e.loopCondition?`Condition: ${e.loopCondition}. `:"")+"Check get_sub_agent_state for current state.";switch(e.loopType){case"continuous":t$(s,ct,e.maxIterations??0);break;case"condition":n$(s,e.loopCondition||"condition not specified",ct,e.maxIterations??0);break;case"interval":r$(s,e.loopIntervalMinutes||5,ct,e.maxIterations??0);break}}gse();let N=await we(t),W=Ee(r,N),me=_e({chain:W,transport:gt(N,Ot(t))}),j=await O0(async()=>me.getBalance({address:i.address}),{operationName:"check-wallet-balance"}),Z=j.success?j.data??0n:0n,de,ne=0n,be="none";if(e.fundAmount>0){let ct=Hr(e.fundAmount.toString());if(Z>=ct)be="skipped";else{let fn=ct-Z,Pn=Tt({account:A,chain:W,transport:gt(N,Ot(t))}),W0=await O0(async()=>me.getBalance({address:n.address}),{operationName:"check-session-key-balance"});(W0.success?W0.data??0n:0n)>=fn&&(de=await Pn.sendTransaction({to:i.address,value:fn}),await me.waitForTransactionReceipt({hash:de}),ne=fn,be=Z>0n?"partial":"full")}}let ze=Z+ne,pt=T.expiresAt*1e3,rn=new Date(pt),zt=Pa(pt);return{success:!0,message:`Created ${e.agentType} sub-agent with ${e.budgetMon} MON budget`,subAgent:{id:s,walletAddress:i.address,walletBalance:Ge(ze)+" MON",agentType:e.agentType,budget:{mon:e.budgetMon+" MON",usd:(e.budgetUsd||0)+" USD",perTransaction:Ge(l)+" MON/tx",allowedGroups:e.allowedGroups||"unrestricted",allowedTokens:e.allowedTokens||"none (using allowedGroups)"},maxCalls:e.maxCalls,expiresAt:rn.toISOString(),expiresIn:zt,funding:{requested:e.fundAmount+" MON",existingBalance:Ge(Z)+" MON",transferred:Ge(ne)+" MON",decision:be},fundingTx:de,loop:e.loopType!=="none"?{type:e.loopType,active:!0,mission:e.mission,condition:e.loopCondition,intervalMinutes:e.loopIntervalMinutes,maxIterations:e.maxIterations??0}:void 0,keychainNote:"If macOS prompted for Keychain access, select 'Always Allow' to prevent interruptions during autonomous trading."}}}catch(d){try{await Ia(i.id)}catch{}throw d}}catch(t){return{success:!1,message:"Failed to create sub-agent",error:t instanceof Error?t.message:"Unknown error"}}}Y();Te();mt();D0();We();m0();var Rqe=C.object({subAgentId:C.string().describe("The sub-agent ID (UUID) to fund"),amountMon:C.number().min(.001).max(10).default(1).describe("Amount of MON to transfer for gas. Default: 1 MON. Max: 10 MON")});function xse(e){e.tool("fund_sub_agent","Transfer MON from session key to a sub-agent wallet for gas. Use to top up a sub-agent that needs more gas for transactions. Requires an active session key with sufficient balance.",Rqe.shape,async t=>{let n=await $qe(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function $qe(e){try{let t=await q();if(!t?.wallet)return{success:!1,message:"Wallet not configured",error:"Please run setup_wallet first"};let n=await ht();if(!n)return{success:!1,message:"Session key not found",error:"Please run setup_wallet to create a session key"};let r=await c0(e.subAgentId);if(!r)return{success:!1,message:"Sub-agent not found",error:`No sub-agent found with ID: ${e.subAgentId}`};let a=await oc(r.walletId);if(!a)return{success:!1,message:"Sub-agent wallet not found",error:`Wallet ${r.walletId} not found in pool or Keychain`};let s=t.network.chainId,o=await we(t),i=Ee(s,o),u=_e({chain:i,transport:gt(o,Ot(t))}),d=on(n),l=Tt({account:d,chain:i,transport:gt(o,Ot(t))}),p=await xt(async()=>u.getBalance({address:n.address}),{operationName:"check-session-key-balance"}),y=Hr(e.amountMon.toString());if(p<y)return{success:!1,message:"Insufficient session key balance",error:`Session key has ${Ge(p)} MON, need ${e.amountMon} MON`};let m=await xt(async()=>u.getBalance({address:a.address}),{operationName:"check-subagent-balance"}),g=await l.sendTransaction({to:a.address,value:y});await u.waitForTransactionReceipt({hash:g});let h=await xt(async()=>u.getBalance({address:a.address}),{operationName:"check-new-balance"});return{success:!0,message:`Funded sub-agent with ${e.amountMon} MON`,funding:{subAgentId:e.subAgentId,walletAddress:a.address,amountFunded:e.amountMon+" MON",previousBalance:Ge(m)+" MON",newBalance:Ge(h)+" MON",txHash:g}}}catch(t){return{success:!1,message:"Failed to fund sub-agent",error:t instanceof Error?t.message:"Unknown error"}}}Y();Te();var Mqe=C.object({status:C.enum(["all","pending","running","paused","completed","failed","revoked"]).optional().describe("Filter by status. Default: 'all'. Options: all, running, paused, completed, failed, revoked")});function wse(e){e.tool("list_sub_agents","List all sub-agents with their status, budget remaining, and trade counts. Use to monitor autonomous trading agents. Filter by status to see only running, completed, or failed agents.",Mqe.shape,async t=>{let n=await Oqe(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}function Dqe(e){let t=BigInt(e.budget.monAllocated),n=BigInt(e.budget.monSpent),r=e.budget.tokenSpent?Object.keys(e.budget.tokenSpent).length:0;return{id:e.id,agentType:e.agentType,status:e.status,taskAgentId:e.taskAgentId,walletAddress:e.walletAddress,budget:{monRemaining:Ge(t-n)+" MON",tokensTracked:r},trades:{executed:e.trades.executed,max:e.trades.maxAllowed},expiresIn:Pa(e.expiresAt),createdAt:cc(new Date(e.createdAt))}}async function Oqe(e){try{if(!(await q())?.wallet)return{success:!1,message:"Wallet not configured",subAgents:[],summary:{total:0,pending:0,running:0,paused:0,completed:0,failed:0,revoked:0},error:"Please run setup_wallet first"};let n=await sc(),r=n;e.status&&e.status!=="all"&&(r=n.filter(i=>i.status===e.status));let a=r.map(Dqe),s={total:n.length,pending:0,running:0,paused:0,completed:0,failed:0,revoked:0};for(let i of n)i.status in s&&s[i.status]++;let o;if(n.length===0)o="No sub-agents found";else if(e.status&&e.status!=="all")o=`Found ${r.length} ${e.status} sub-agent(s)`;else{let i=[];s.pending>0&&i.push(`${s.pending} pending`),s.running>0&&i.push(`${s.running} running`),s.completed>0&&i.push(`${s.completed} completed`),s.failed>0&&i.push(`${s.failed} failed`),s.revoked>0&&i.push(`${s.revoked} revoked`),o=`Found ${n.length} sub-agent(s): ${i.join(", ")}`}return{success:!0,message:o,subAgents:a,summary:s}}catch(t){return{success:!1,message:"Failed to list sub-agents",subAgents:[],summary:{total:0,pending:0,running:0,paused:0,completed:0,failed:0,revoked:0},error:t instanceof Error?t.message:"Unknown error"}}}Y();T6();Te();mt();We();m0();var Nqe=C.object({subAgentId:C.string().describe("The sub-agent ID (UUID) to revoke"),sweepBalance:C.boolean().default(!1).describe("Sweep remaining gas balance back to session key. Default: false (gas stays in wallet for reuse by future agents)")});function vse(e){e.tool("revoke_sub_agent","Revoke a sub-agent's delegation, optionally sweep its balance back to session key, and return its wallet to the pool for reuse. Use this to stop an autonomous agent and reclaim its resources. For on-chain invalidation, use revoke_root_delegation with revocationMode: 'onchain' which cascades to ALL sub-delegations via NonceEnforcer nonce increment.",Nqe.shape,async t=>{let n=await Lqe(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function Lqe(e){try{let t=await q();if(!t?.wallet)return{success:!1,message:"Wallet not configured",error:"Please run setup_wallet first"};let n=await c0(e.subAgentId);if(!n)return{success:!1,message:"Sub-agent not found",error:`No sub-agent found with ID: ${e.subAgentId}`};let r=n.status;if(n.status==="revoked")return{success:!1,message:"Sub-agent already revoked",error:"This sub-agent has already been revoked"};let a=await oc(n.walletId);if(!a){try{await Ia(n.walletId)}catch{}return await mp(e.subAgentId),{success:!0,message:"Sub-agent cleaned up (wallet not found in Keychain)",revocation:{subAgentId:e.subAgentId,previousStatus:r,balanceSwept:"0 MON",walletReturnedToPool:!0}}}let s=t.network.chainId,o=await we(t),i=Ee(s,o),u=_e({chain:i,transport:gt(o,Ot(t))}),d=0n,l;if(e.sweepBalance&&a.privateKey){let p=await O0(async()=>u.getBalance({address:a.address}),{operationName:"check-subagent-balance"}),y=p.success?p.data??0n:0n;if(y>0n){let m=await O0(async()=>u.getGasPrice(),{operationName:"get-gas-price"}),h=(m.success?m.data??0n:0n)*21000n;if(y>h){let w=ma(a.privateKey),v=Tt({account:w,chain:i,transport:gt(o,Ot(t))}),T=y-h;try{l=await v.sendTransaction({to:t.wallet.sessionKeyAddress,value:T}),await u.waitForTransactionReceipt({hash:l}),d=T}catch(A){console.error("Failed to sweep balance:",A)}}}}await Ia(n.walletId),await mp(e.subAgentId);try{(await sc()).some(m=>m.status==="running"||m.status==="pending"||m.status==="paused")||q7()}catch{}return{success:!0,message:`Revoked and cleaned up sub-agent ${n.agentType}.`,revocation:{subAgentId:e.subAgentId,previousStatus:r,balanceSwept:Ge(d)+" MON",sweepTxHash:l,walletReturnedToPool:!0}}}catch(t){return{success:!1,message:"Failed to revoke sub-agent",error:t instanceof Error?t.message:"Unknown error"}}}Y();Te();mt();We();m0();var Bqe=C.object({subAgentId:C.string().describe("The sub-agent ID (UUID) to get state for"),taskAgentId:C.string().optional().describe("Optional: Claude Code Task agent ID to store for resume capability. Pass this after spawning a Task to enable resume after gas top-up."),teammateName:C.string().optional().describe("Optional: Teammate name for TeammateIdle hook lookup. Pass the 'name' parameter from Task spawn (e.g., 'kairos-abc123')."),includeTrades:C.boolean().optional().describe("Include recent trade history. Default: true"),tradeLimit:C.number().min(1).max(100).optional().describe("Max number of trades to include. Default: 10")});function Tse(e){e.tool("get_sub_agent_state","Get detailed state for a specific sub-agent including budget, trades, errors, and loop config. Can store taskAgentId for resume and teammateName for TeammateIdle hook lookup. Use report_agent_status to update agent status.",Bqe.shape,async t=>{let n=await Uqe(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function Uqe(e){try{let h=function(N){return g[N]||{symbol:N.slice(0,10),decimals:18}},E=function(N,W,me,j){let Z=C7(_,N),de=Z>0n?Z:0n,ne=W-de,be=-Z,ze=W>0n?Number(de*10000n/W)/100:0,pt=zt=>`${le(zt,me)} ${j}`,rn=zt=>`${zt>=0n?"+":"-"}${pt(zt>=0n?zt:-zt)}`;return{group:N,budget:pt(W),budgetConsumed:pt(de),remaining:pt(ne),pnl:rn(be),trackedPositions:A,utilization:`${ze.toFixed(1)}%`}};var t=h,n=E;let r=await q();if(!r?.wallet)return{success:!1,message:"Wallet not configured",error:"Please run setup_wallet first"};let a=await c0(e.subAgentId);if(!a)return{success:!1,message:"Sub-agent not found",error:`No sub-agent found with ID: ${e.subAgentId}`};let s=!1;if((e.taskAgentId||e.teammateName)&&(await Fi(e.subAgentId,{...e.taskAgentId&&{taskAgentId:e.taskAgentId},...e.teammateName&&{teammateName:e.teammateName}}),s=!0,a=await c0(e.subAgentId),!a))return{success:!1,message:"Failed to reload state after update",error:"State was updated but could not be reloaded"};let o=await we(r),i=Ee(r.network.chainId,o),u=_e({chain:i,transport:gt(o,Ot(r))}),d=await O0(async()=>u.getBalance({address:a.walletAddress}),{operationName:"check-wallet-balance"}),l=d.success?d.data??0n:0n,p=BigInt(a.budget.monAllocated),y=BigInt(a.budget.monSpent),m=await LR(e.subAgentId),g={[Hn.toLowerCase()]:{symbol:"MON",decimals:18},[I7.toLowerCase()]:{symbol:"USDC",decimals:6},"0x754704bc059f8c67012fed69bc8a327a5aafb603":{symbol:"USDC",decimals:6},"0x0f0bdebf0f83cd1ee3974779bcb7315f9808c714":{symbol:"USDT",decimals:6},"0xe0590015a873bf326bd645c3e1266d4db41c4e6b":{symbol:"WMON",decimals:18},"0x3bd359c1119da7da1d913d1c4d2b7c461115433a":{symbol:"WMON",decimals:18},"0xfd44b35139ae53fff7d8f2a9869c503d987f00d1":{symbol:"LVUSD",decimals:18},"0x91b81bfbe3a747230f0529aa28d8b2bc898e6d56":{symbol:"LVMON",decimals:18}},w=m?Object.entries(m).map(([N,{spent:W,limit:me}])=>{let{symbol:j,decimals:Z}=h(N),de=ne=>`${le(ne,Z)} ${j}`;return{address:N,symbol:j,spent:de(W),limit:me!==null?de(me):null,remaining:me!==null?de(me-W):null}}):[],v=await FR(e.subAgentId),T=v?Object.entries(v).filter(([,N])=>N.out>0n||N.in>0n).map(([N,W])=>{let{symbol:me,decimals:j}=h(N),Z=de=>`${le(de<0n?-de:de,j)} ${me}`;return{address:N,symbol:me,out:Z(W.out),in:Z(W.in),net:`${W.net>=0n?"+":"-"}${Z(W.net>=0n?W.net:-W.net)}`,group:W.group}}):void 0,A=0;try{A=zi(e.subAgentId).length}catch{}let _=a,O=[],$=a.budget.groupBudgets?.MON?BigInt(a.budget.groupBudgets.MON):p;if(O.push(E("MON",$,18,"MON")),a.budget.groupBudgets?.USD){let N=BigInt(a.budget.groupBudgets.USD);O.push(E("USD",N,6,"USD"))}let B=R2(e.subAgentId),V;if(e.includeTrades!==!1){let N=await DR(e.subAgentId),W=e.tradeLimit||10;V=N.slice(-W).reverse().map(me=>({timestamp:cc(new Date(me.timestamp)),action:me.action,protocol:me.protocol,txHash:me.txHash,success:me.success}))}let M=Date.now(),G=a.expiresAt<M;return{success:!0,message:s?`Sub-agent ${a.agentType} updated and retrieved`:`Sub-agent ${a.agentType} (${a.status})`,updated:s,state:{id:a.id,agentType:a.agentType,status:a.status,walletAddress:a.walletAddress,walletBalance:Ge(l)+" MON",taskId:a.taskId,taskAgentId:a.taskAgentId,budget:{monAllocated:Ge(p)+" MON",monSpent:Ge(y)+" MON",monRemaining:Ge(p-y)+" MON",tokenSpending:w,tokenFlows:T,groupBudgets:O.length>0?O:void 0},trades:{executed:a.trades.executed,maxAllowed:a.trades.maxAllowed,remaining:a.trades.maxAllowed-a.trades.executed},timing:{createdAt:cc(new Date(a.createdAt)),lastActivityAt:cc(new Date(a.lastActivityAt)),expiresAt:cc(new Date(a.expiresAt)),expiresIn:Pa(a.expiresAt),isExpired:G},errors:a.errors.slice(-10).map(N=>({timestamp:cc(new Date(N.timestamp)),message:N.message,recoverable:N.recoverable})),loop:B?{type:B.type,active:B.active,mission:B.mission,condition:B.condition,intervalMinutes:B.intervalMinutes,currentIteration:B.currentIteration??0,maxIterations:B.maxIterations??0}:void 0,recentTrades:V}}}catch(r){return{success:!1,message:"Failed to get sub-agent state",error:r instanceof Error?r.message:"Unknown error"}}}Te();var Hqe=C.object({agentId:C.string().describe("The sub-agent ID (UUID) reporting its status"),status:C.enum(["running","paused","completed","failed"]).describe("The new status: 'running' = actively working, 'paused' = temporarily stopped (e.g., low gas), can resume, 'completed' = user's goal was achieved, 'failed' = user's goal was NOT achieved (expired, error, budget depleted, etc.)"),reason:C.string().optional().describe("Optional reason for the status. Examples: 'Task achieved - opened BTC long at $95,200', 'Low gas - 0.05 MON remaining', 'Delegation expired - target not reached', 'Max trades reached (10/10) - target not achieved'")});function Sse(e){e.tool("report_agent_status","Report sub-agent status. Sub-agents MUST call this to report their status: when task is completed/failed, when pausing (low gas), or when resuming. This is the unified method for all status updates.",Hqe.shape,async t=>{let n=await Fqe(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function Fqe(e){try{if(!(await q())?.wallet)return{success:!1,message:"Wallet not configured",error:"Please run setup_wallet first"};let n=await c0(e.agentId);if(!n)return{success:!1,message:"Sub-agent not found",error:`No sub-agent found with ID: ${e.agentId}`};let r=n.status;if(n.status==="revoked")return{success:!1,message:"Cannot update revoked agent",error:"This sub-agent has been revoked and cannot be updated"};if(await Fi(e.agentId,{status:e.status}),e.reason)try{ka(e.agentId,{ts:Date.now(),type:e.status==="running"?"reasoning":"status",text:`[${e.status}] ${e.reason}`})}catch{}if(e.status==="completed"||e.status==="failed")try{e$(e.agentId)}catch{}return{success:!0,message:`Status updated: ${r} \u2192 ${e.status}`,previousStatus:r,newStatus:e.status,reason:e.reason}}catch(t){return{success:!1,message:"Failed to report status",error:t instanceof Error?t.message:"Unknown error"}}}Y();Te();mt();We();m0();var zqe=[{type:"function",name:"callCounts",stateMutability:"view",inputs:[{name:"delegationManager",type:"address"},{name:"delegationHash",type:"bytes32"}],outputs:[{name:"count",type:"uint256"}]}],jqe=C.object({agentId:C.string().optional().describe("Optional sub-agent ID to check. If omitted, checks root delegation status.")});function Ase(e){e.tool("check_delegation_status","Check the validity of root delegation or a sub-agent's delegation. Includes on-chain call count verification. Use without agentId to check root delegation status. Use with agentId to check a specific sub-agent's delegation. Returns expiry info, validity, and remaining calls (on-chain).",jqe.shape,async t=>{let n=await qqe(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function qqe(e){try{let t=await q();return t?.wallet?e.agentId?Vqe(e.agentId,t):Gqe(t):{success:!1,message:"Wallet not configured",error:"Please run setup_wallet first"}}catch(t){return{success:!1,message:"Failed to check delegation status",error:t instanceof Error?t.message:"Unknown error"}}}async function _se(e,t,n){if(!e)return null;try{let r=e.network.chainId,a=await we(e),s=Ee(r,a),o=E0(),i=_e({chain:s,transport:gt(a,Ot(e))}),u=await O0(async()=>i.readContract({address:o.caveatEnforcers.LimitedCallsEnforcer,abi:zqe,functionName:"callCounts",args:[o.DelegationManager,t]}),{operationName:"callCounts"});if(!u.success||u.data===void 0)return null;let d=u.data,l=Number(d),p=Math.max(0,n-l);return{used:l,limit:n,remaining:p,exhausted:p===0}}catch(r){return console.error("Failed to fetch on-chain call count:",r),null}}async function Gqe(e){let t=hp();if(!t.exists)return{success:!0,message:"No root delegation found",delegation:{type:"root",exists:!1,valid:!1,expired:!1}};let n=!t.valid,r=K2(),a=null;r&&t.maxCalls&&(a=await _se(e,r.delegationHash,t.maxCalls));let s=a?.exhausted??!1,o=t.valid&&!s,i;return n?i="Root delegation has expired":s?i="Root delegation call limit exhausted":a?i=`Root delegation valid: ${a.remaining}/${a.limit} calls remaining, expires in ${t.expiresIn}`:i=`Root delegation valid for ${t.expiresIn}`,{success:!0,message:i,delegation:{type:"root",exists:!0,valid:o,expired:n,expiresAt:t.expiresAt?new Date(t.expiresAt).toISOString():void 0,expiresIn:t.expiresIn,callCount:a??void 0,maxCalls:t.maxCalls,budgetMon:t.budgetMon,budgetUsd:t.budgetUsd,maxValuePerTx:t.maxValuePerTx}}}async function Vqe(e,t){let n=await c0(e);if(!n)return{success:!1,message:"Sub-agent not found",error:`No sub-agent found with ID: ${e}`};let r=await pp(e);if(!r)return{success:!0,message:"Sub-agent exists but delegation not found",delegation:{type:"sub-agent",exists:!1,valid:!1,expired:!1,agentId:e,agentType:n.agentType,agentStatus:n.status}};let s=Date.now()>r.expiresAt,o=null,i=n.trades.maxAllowed;r.delegationHash&&(o=await _se(t,r.delegationHash,i));let u=o?.exhausted??!1,d=!s&&!u&&n.status!=="revoked"&&n.status!=="failed",l;return s?l="Sub-agent delegation has expired":u?l="Sub-agent call limit exhausted":o?l=`Sub-agent delegation valid: ${o.remaining}/${o.limit} calls remaining, expires in ${Pa(r.expiresAt)}`:l=`Sub-agent delegation valid for ${Pa(r.expiresAt)}`,{success:!0,message:l,delegation:{type:"sub-agent",exists:!0,valid:d,expired:s,expiresAt:new Date(r.expiresAt).toISOString(),expiresIn:s?"expired":Pa(r.expiresAt),callCount:o??void 0,agentId:e,agentType:n.agentType,agentStatus:n.status,tradesExecuted:n.trades.executed,tradesMax:n.trades.maxAllowed}}}Y();We();m0();D0();Te();var Wqe=[{type:"function",name:"incrementNonce",stateMutability:"nonpayable",inputs:[{name:"delegationManager",type:"address"}],outputs:[]}];var Zqe=[{type:"function",name:"execute",inputs:[{name:"_execution",type:"tuple",components:[{name:"target",type:"address"},{name:"value",type:"uint256"},{name:"callData",type:"bytes"}]}],outputs:[],stateMutability:"payable"}],Ese=500000n,kse=400000n,Ise=100000n;async function Kqe(e){return xt(async()=>{let t=await dt(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",method:"pimlico_getUserOperationGasPrice",params:[],id:1})});if(!t.ok)throw new Error(`Gas price request failed: ${t.status}`);let n=await t.json();if(n.error)throw new Error(`Gas price error: ${n.error.message}`);let r=n.result?.fast??n.result?.standard;if(!r)throw new Error("No gas price data returned");return{maxFeePerGas:BigInt(r.maxFeePerGas),maxPriorityFeePerGas:BigInt(r.maxPriorityFeePerGas)}},{operationName:"revocation-gas-price"})}function _$(e){if(!e||e==="0x")return;let t=BigInt(e);return t>0n?t:void 0}async function Xqe(e,t,n){return xt(async()=>{let r=await dt(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",method:"eth_estimateUserOperationGas",params:[t,n],id:1})});if(!r.ok)throw new Error(`Gas estimation failed: ${r.status}`);let a=await r.json();if(a.error)throw new Error(`Gas estimation error: ${a.error.message}`);let s=a.result??{};return{callGasLimit:_$(s.callGasLimit),verificationGasLimit:_$(s.verificationGasLimit),preVerificationGas:_$(s.preVerificationGas)}},{operationName:"revocation-estimate-gas"})}function E$(e,t){return e!==void 0&&e>t?e:t}function Jqe(e,t){e.callGasLimit=E$(t.callGasLimit,Ise),e.verificationGasLimit=E$(t.verificationGasLimit,Ese),e.preVerificationGas=E$(t.preVerificationGas,kse)}async function Qqe(e,t,n){let r=await dt(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",method:"eth_sendUserOperation",params:[t,n],id:1})}),a=await r.json();if(!r.ok){let s=a.error?.message||`HTTP ${r.status}`;throw new Error(`Send UserOp failed: ${s}`)}if(a.error)throw new Error(`UserOp error: ${a.error.message}`);if(!a.result)throw new Error("No userOpHash returned");return a.result}async function Yqe(e,t,n=6e4){let r=Date.now();for(;Date.now()-r<n;){let a=await dt(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",method:"eth_getUserOperationReceipt",params:[t],id:1})});if(a.ok){let s=await a.json();if(s.error){await new Promise(o=>setTimeout(o,2e3));continue}if(s.result?.receipt?.transactionHash)return{transactionHash:s.result.receipt.transactionHash}}await new Promise(s=>setTimeout(s,2e3))}throw new Error(`Timeout waiting for UserOp ${t}`)}async function Cse(e,t,n){let r=await Tn(t,e.address),a=X({abi:Wqe,functionName:"incrementNonce",args:[xe(Ue.delegationManager)]}),s=X({abi:Zqe,functionName:"execute",args:[{target:Ue.enforcers.nonce,value:0n,callData:a}]}),o=await Ol(n),i=await e.smartAccount.getNonce?.()??0n,u=await Kqe(o),d={sender:e.address,nonce:i,callData:s,callGasLimit:Ise,verificationGasLimit:Ese,preVerificationGas:kse,maxFeePerGas:u.maxFeePerGas,maxPriorityFeePerGas:u.maxPriorityFeePerGas,signature:"0x"},l=e.smartAccount.entryPoint.address;try{let w=Jo({...d,signature:"0x"}),v=await Xqe(o,w,l);Jqe(d,v)}catch(w){console.warn("Failed to estimate gas for nonce increment, using defaults:",w)}let p=await e.smartAccount.signUserOperation(d);d.signature=p;let y=Jo({...d,signature:p}),m=await Qqe(o,y,l),g=await Yqe(o,m);await new Promise(w=>setTimeout(w,2e3));let h=await Tn(t,e.address);return{userOpHash:m,transactionHash:g.transactionHash,previousNonce:r,newNonce:h}}Te();mt();Y();We();var eGe=C.object({confirm:C.boolean().describe("Must be true to confirm revocation. This is a destructive action that revokes ALL autonomous permissions, archives ALL sub-agent states, and releases ALL wallets."),revocationMode:C.enum(["local","onchain"]).default("local").describe("Revocation mode. 'local' (default): deletes local delegation files only. 'onchain': increments NonceEnforcer nonce via UserOp (Touch ID required), which invalidates ALL delegations on-chain, then performs local cleanup. Use 'onchain' if you suspect session key compromise or want immediate on-chain invalidation.")});function Pse(e){e.tool("revoke_root_delegation","Revoke the root delegation entirely, cascading cleanup to ALL sub-agents. Archives all sub-agent states, releases all wallets to pool, and deletes root-delegation.json. After this, no autonomous trading is possible until a new root delegation is created. Requires confirm: true as a safety measure. Set revocationMode to 'onchain' to also invalidate all delegations on-chain via NonceEnforcer (requires Touch ID, recommended if session key may be compromised).",eGe.shape,async t=>{let n=await tGe(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function tGe(e){try{if(!e.confirm)return{success:!1,message:"Confirmation required",error:"Set confirm: true to proceed. This will revoke ALL autonomous permissions and archive ALL sub-agent states."};if(!hp().exists)return{success:!1,message:"No root delegation found",error:"There is no root delegation to revoke."};let n;if(e.revocationMode==="onchain"){let o=await q();if(!o||!Pe(o))return{success:!1,message:"Wallet not configured",error:"Please run setup_wallet first to use on-chain revocation."};let i=await j5(o,{touchIdMessage:"Revoke ALL delegations (nuclear revoke)"}),u=await we(o),d=Ee(o.network.chainId,u),l=_e({chain:d,transport:gt(u,Ot(o))});try{let p=await Cse(i,l,o);n={userOpHash:p.userOpHash,transactionHash:p.transactionHash,previousNonce:p.previousNonce.toString(),newNonce:p.newNonce.toString()}}catch(p){let y=p instanceof Error?p.message:"Unknown error";return/cancell?ed|user denied/i.test(y)?{success:!1,message:"Touch ID cancelled",error:"On-chain revocation requires Touch ID confirmation. Please try again."}:{success:!1,message:"On-chain revocation failed",error:`Failed to increment nonce on-chain: ${y}. Local delegation files were NOT removed.`}}}let r=await mse();q7();let a=e.revocationMode==="onchain"?"on-chain + local":"local",s=n?` Nonce incremented from ${n.previousNonce} to ${n.newNonce} (all old delegations invalidated on-chain).`:"";return{success:!0,message:`Root delegation revoked (${a}). ${r.subAgentsCleanedUp} sub-agent(s) archived, ${r.walletsReleased} wallet(s) released.`+s,revocation:{subAgentsCleanedUp:r.subAgentsCleanedUp,walletsReleased:r.walletsReleased},onChainRevocation:n}}catch(t){return{success:!1,message:"Failed to revoke root delegation",error:t instanceof Error?t.message:"Unknown error"}}}var nGe=C.object({filter:C.enum(["all","idle","active"]).default("all").describe("Filter wallets by status. idle = available for new agents, active = currently assigned to an agent, all = show everything. Default: all")});function Rse(e){e.tool("list_wallet_pool","List all wallets in the sub-agent wallet pool. Shows wallet addresses, status (idle/active), and which agent they are assigned to.",nGe.shape,async t=>{let n=rGe(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}function rGe(e){try{let t=e.filter==="all"?void 0:e.filter,n=D7(t),r=e.filter==="all"?n:D7(),a=r.filter(i=>i.status==="idle").length,s=r.filter(i=>i.status==="active").length,o=n.map(i=>({id:i.id,address:i.address,status:i.status,assignedTo:i.assignedTo,lastUsedAt:new Date(i.lastUsedAt).toISOString()}));return n.length===0?{success:!0,message:e.filter==="all"?"Wallet pool is empty. A wallet will be created when you create a sub-agent.":`No ${e.filter} wallets in pool.`,data:{wallets:[],summary:{total:r.length,idle:a,active:s}}}:{success:!0,message:`${n.length} wallet${n.length>1?"s":""} in pool (${a} idle, ${s} active)`,data:{wallets:o,summary:{total:r.length,idle:a,active:s}}}}catch(t){return{success:!1,message:"Failed to list wallet pool",error:t instanceof Error?t.message:"Unknown error"}}}var aGe=C.object({agentId:C.string().describe("The sub-agent ID (UUID) to get journal entries for"),offset:C.number().min(0).optional().describe("Number of entries to skip from the start. Default: 0 (most recent first)"),limit:C.number().min(1).max(200).optional().describe("Max number of entries to return. Default: 50, max: 200"),tag:C.string().optional().describe("Filter entries by tag. Only returns entries with matching tag. Common tags: baseline, watchlist, trade_plan, position_health, scan_result, post_trade")});function $se(e){e.tool("get_agent_log","Get paginated journal log for a sub-agent. Shows trade events, reasoning, status changes, and errors. Use offset/limit for pagination. Entries are ordered newest first.",aGe.shape,async t=>{let n=await sGe(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function sGe(e){try{if(!k2(e.agentId))return{success:!1,message:"Sub-agent not found",error:`No sub-agent found with ID: ${e.agentId}`};let t=e.offset??0,n=e.limit??50,r=e.tag?{tag:e.tag}:void 0,{entries:a,total:s}=jR(e.agentId,t,n,r);if(a.length===0&&s===0)return{success:!0,message:"No journal entries found for this agent.",data:{entries:[],metadata:{total:0,showing:0,offset:t}}};let o=a.reverse().map(i=>{let u=new Date(i.ts).toLocaleString(),d=[];i.pair&&d.push(i.pair),i.side&&d.push(i.side),i.margin&&d.push(`margin:${i.margin}`),i.leverage&&d.push(`${i.leverage}x`),i.pnl&&d.push(`pnl:${i.pnl}`),i.txHash&&d.push(`tx:${i.txHash.slice(0,10)}...`);let l=i.text||d.join(" | ")||i.type;return{timestamp:u,type:i.type,summary:l}});return{success:!0,message:`Showing ${a.length} of ${s} journal entries`,data:{entries:o,metadata:{total:s,showing:a.length,offset:t}}}}catch(t){return{success:!1,message:"Failed to load agent journal",error:t instanceof Error?t.message:"Unknown error"}}}var oGe=C.object({agentId:C.string().describe("The sub-agent ID (UUID) writing the memo"),text:C.string().describe("The memo content. Use structured format for readability. Examples: macro baselines, watchlists with trigger levels, kill switch results, bear case arguments, position health snapshots."),tag:C.string().optional().describe("Category tag for retrieval via get_agent_log(tag: ...). Recommended tags: 'baseline' (Phase 1 macro snapshot), 'watchlist' (Phase 2 pair watchlist with trigger levels), 'trade_plan' (Phase 3 kill switch + bear case + trade params), 'position_health' (Phase 5 monitoring snapshot), 'scan_result' (Phase 5 opportunity scan output), 'post_trade' (Phase 6/7 session summary).")});function Mse(e){e.tool("write_agent_memo","Write a memo to the agent's journal. Use this to persist structured state (macro baselines, watchlists, trade reasoning, position health checks) that survives context compaction. Read back with get_agent_log(tag: '...'). Zero cost \u2014 no delegation calls consumed.",oGe.shape,async t=>{let n=await iGe(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function iGe(e){try{let t=await c0(e.agentId);return t?t.status==="revoked"?{success:!1,message:"Cannot write memo to revoked agent",error:"This sub-agent has been revoked and cannot accept new memos"}:(ka(e.agentId,{ts:Date.now(),type:"memo",text:e.text,tag:e.tag}),{success:!0,message:e.tag?`Memo saved with tag: ${e.tag}`:"Memo saved",tag:e.tag}):{success:!1,message:"Sub-agent not found",error:`No sub-agent found with ID: ${e.agentId}`}}catch(t){return{success:!1,message:"Failed to write memo",error:t instanceof Error?t.message:"Unknown error"}}}function Dse(e){nF(e),HZ(e),Kne(e),rae(e),d0e(e),f0e(e),nae(e),sae(e),aae(e),Jre(e),tae(e),oae(e),w0e(e),jre(e),Gre(e),Kre(e),Xre(e),iae(e),cae(e),uae(e),dae(e),fae(e),lae(e),pae(e),yae(e),gae(e),Aae(e),_ae(e),Eae(e),$ae(e),Mae(e),Oae(e),Nae(e),Lae(e),Bae(e),Hae(e),Fae(e),qae(e),Gae(e),Vae(e),Wae(e),Zae(e),Kae(e),Xae(e),Jae(e),Qae(e),Yae(e),ese(e),tse(e),nse(e),rse(e),ase(e),sse(e),ose(e),ise(e),yse(e),hse(e),xse(e),wse(e),vse(e),Tse(e),Sse(e),Ase(e),Pse(e),Rse(e),$se(e),Mse(e)}import{homedir as cGe}from"os";var Ose=cGe().startsWith("/sessions/"),Nse=new I3({name:"pragma",version:"0.1.0"});Ose?console.error("[pragma] Cowork detected \u2014 skipping tool registration (DXT handles MCP tools)"):Dse(Nse);async function uGe(){let e=new P3;await Nse.connect(e),console.error(`pragma MCP server running on stdio${Ose?" (Cowork mode \u2014 no tools)":""}`)}uGe().catch(e=>{console.error("Fatal error:",e),process.exit(1)});
|
|
216
216
|
/*! Bundled license information:
|
|
217
217
|
|
|
218
218
|
@noble/hashes/esm/utils.js:
|