pragma-openclaw 0.2.0 → 0.2.1

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/server/index.js CHANGED
@@ -112,7 +112,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
112
112
  `);let a=rr.join(n,"state.json");if(Ea(a)){let s=JSON.parse(lp(a,"utf-8"));s.trades.executed+=1,s.lastActivityAt=Date.now(),W5(a,JSON.stringify(s,null,2))}}async function OR(e){let t=rr.join(us(e),"trades.jsonl");if(!Ea(t))return[];try{return lp(t,"utf-8").trim().split(`
113
113
  `).filter(Boolean).map(a=>JSON.parse(a))}catch{return[]}}async function NR(e,t){let n=rr.join(us(e),"delegation.json");W5(n,JSON.stringify(t,null,2))}async function pp(e){let t=rr.join(us(e),"delegation.json");if(!Ea(t))return null;try{let n=lp(t,"utf-8");return JSON.parse(n)}catch{return null}}async function Z5(e,t,n){let r=await c0(e);if(!r)throw new Error(`Agent state not found: ${e}`);r.errors.push({timestamp:Date.now(),message:t,recoverable:n}),r.errors.length>100&&(r.errors=r.errors.slice(-100));let a=rr.join(us(e),"state.json");W5(a,JSON.stringify(r,null,2))}async function LR(e,t,n){let r=await c0(e);if(!r)throw new Error(`Agent state not found: ${e}`);let a=t.toLowerCase(),o=(BigInt(r.budget.tokenSpent[a]||"0")+n).toString(),i=a===Pn.toLowerCase();await Fi(e,{budget:{...r.budget,monSpent:i?(BigInt(r.budget.monSpent)+n).toString():r.budget.monSpent,tokenSpent:{...r.budget.tokenSpent,[a]:o}}})}async function BR(e){let t=await c0(e);if(!t)return null;let n={},r=Pn.toLowerCase();for(let[s,o]of Object.entries(t.budget.tokenSpent)){let i=t.budget.tokenLimits?.[s];n[s]={spent:BigInt(o),limit:i?BigInt(i):null}}let a=n[r];return n[r]={spent:a?.spent??BigInt(t.budget.monSpent),limit:BigInt(t.budget.monAllocated)},n}async function sc(){let e=$R();if(!Ea(e))return[];let t=KHe(e,{withFileTypes:!0}),n=[];for(let r of t)if(r.isDirectory()&&r.name!=="archive"){let a=await c0(r.name);a&&n.push(a)}return n}async function UR(){let e=await sc(),t=0n;for(let n of e)(n.status==="running"||n.status==="pending"||n.status==="paused")&&(t+=BigInt(n.budget.monAllocated));return t}async function HR(){let e=await sc(),t=0n;for(let n of e)(n.status==="running"||n.status==="pending"||n.status==="paused")&&n.budget.groupBudgets?.USD&&(t+=BigInt(n.budget.groupBudgets.USD));return t}async function mp(e){let t=us(e);if(!Ea(t))return;let n=rr.join($R(),"archive");Ea(n)||A2(n,{recursive:!0});let r=rr.join(n,e);Ea(r)&&L0e(r,{recursive:!0,force:!0});try{XHe(t,r)}catch{L0e(t,{recursive:!0,force:!0})}}function k2(e){let t=rr.join(us(e),"state.json");return Ea(t)}async function K5(e,t){let n=await c0(e);if(!n)throw new Error(`Agent state not found: ${e}`);let r=n.budget.tokenFlows?{...n.budget.tokenFlows}:{},a=0n;for(let{token:s,amount:o}of t.outflows){let i=s.toLowerCase(),u=r[i]||{out:"0",in:"0"};r[i]={out:(BigInt(u.out)+o).toString(),in:u.in};let d=BigInt(n.budget.tokenSpent[i]||"0");n.budget.tokenSpent[i]=(d+o).toString(),i===Pn.toLowerCase()&&(a+=o)}for(let{token:s,amount:o}of t.inflows){let i=s.toLowerCase(),u=r[i]||{out:"0",in:"0"};r[i]={out:u.out,in:(BigInt(u.in)+o).toString()}}await Fi(e,{budget:{...n.budget,monSpent:(BigInt(n.budget.monSpent)+a).toString(),tokenSpent:n.budget.tokenSpent,tokenFlows:r}})}function S2(e,t,n){let r=U0e[t.toLowerCase()];return r===void 0||r===n?e:r>n?e/10n**BigInt(r-n):e*10n**BigInt(n-r)}function I7(e,t){let n=_2[t];if(!n)return 0n;let{tokens:r,canonicalDecimals:a}=n,s=e.budget.tokenFlows;if(!s){let i=0n;for(let u of r){let d=u.toLowerCase(),l=BigInt(e.budget.tokenSpent[d]||"0");i+=S2(l,d,a)}return i}let o=0n;for(let i of r){let u=i.toLowerCase(),d=s[u];if(d){let l=BigInt(d.out),p=BigInt(d.in),y=S2(l,u,a),m=S2(p,u,a);o+=y-m}}return o}function P7(e){let t=e.toLowerCase();for(let[n,r]of Object.entries(_2))if(r.tokens.some(a=>a.toLowerCase()===t))return n;return null}function YHe(e){let t=e.toLowerCase();for(let[n,r]of Object.entries(E2))if(r.toLowerCase()===t)return n;return null}function eFe(e){return e.map(t=>{let n=YHe(t);return n?`${n} (${t})`:t}).join(", ")}function R7(e,t){let n=e.budget.allowedTokens&&e.budget.allowedTokens.length>0,r=e.budget.allowedGroups&&e.budget.allowedGroups.length>0;if(!n&&!r)return{allowed:!0};let a=t.toLowerCase();if(a===Pn.toLowerCase()&&BigInt(e.budget.monAllocated)>0n)return{allowed:!0};let s=e.budget.tokenFlows?.[a];if(s&&BigInt(s.in)>0n)return{allowed:!0};if(n)return e.budget.allowedTokens.some(i=>i.toLowerCase()===a)?{allowed:!0}:{allowed:!1,reason:`Token ${t} not in allowedTokens [${eFe(e.budget.allowedTokens)}] and has no prior inflows`};let o=P7(t);return o&&e.budget.allowedGroups.includes(o)?{allowed:!0}:{allowed:!1,reason:`Token not in allowed groups [${e.budget.allowedGroups.join(", ")}] and has no prior inflows`}}function tFe(e,t){if(e.budget.groupBudgets?.[t])return BigInt(e.budget.groupBudgets[t]);if(t==="MON")return BigInt(e.budget.monAllocated);if(t==="USD"){let n=_2.USD.tokens[0].toLowerCase(),r=e.budget.tokenLimits?.[n];if(r)return BigInt(r)}return null}function $7(e,t,n){let r=P7(t);if(!r)return{allowed:!0};let{canonicalDecimals:a}=_2[r],s=tFe(e,r);if(s===null)return{allowed:!0};let o=S2(n,t,a),i=I7(e,r),u=i>0n?i:0n,d=s-u;return o>d?{allowed:!1,reason:`${r} group budget exceeded: need ${o} but only ${d} remaining (consumed: ${u}, budget: ${s}) [canonical ${a} decimals]`}:{allowed:!0}}async function FR(e){let t=await c0(e);if(!t)return null;let n=t.budget.tokenFlows;if(!n)return null;let r={};for(let[a,s]of Object.entries(n)){let o=BigInt(s.out),i=BigInt(s.in);r[a]={out:o,in:i,net:i-o,group:P7(a)}}return r}function H0e(e){return rr.join(us(e),"tracked-positions.json")}function zi(e){let t=H0e(e);if(!Ea(t))return[];try{return JSON.parse(lp(t,"utf-8"))}catch{return[]}}function X5(e,t){let n=H0e(e),r=us(e);Ea(r)||A2(r,{recursive:!0}),W5(n,JSON.stringify(t,null,2))}function D7(e,t){let n=zi(e);n.push(t),X5(e,n)}function C2(e,t){let r=zi(e).filter(a=>a.tradeHash!==t);X5(e,r)}function M7(e,t,n,r){let a=zi(e),s=a.find(o=>o.tradeHash===t);s&&(s.status=n,r!==void 0&&(s.detectedGoneAt=r),X5(e,a))}function zR(e,t,n){let r=zi(e);t>=0&&t<r.length&&(r[t].tradeHash=n,X5(e,r))}function F0e(e){return rr.join(us(e),"journal.jsonl")}function ka(e,t){let n=F0e(e),r=us(e);Ea(r)||A2(r,{recursive:!0}),B0e(n,JSON.stringify(t)+`
114
114
  `)}function jR(e,t=0,n=50,r){let a=F0e(e);if(!Ea(a))return{entries:[],total:0};try{let o=lp(a,"utf-8").trim().split(`
115
- `).filter(Boolean).map(u=>JSON.parse(u));return r?.tag&&(o=o.filter(u=>u.tag===r.tag)),o.reverse(),{entries:o.slice(t,t+n),total:o.length}}catch{return{entries:[],total:0}}}T6();t0();import{randomUUID as nFe}from"node:crypto";function z0e(){let e=nFe(),t=h8(),n=ma(t);return{id:e,address:n.address,privateKey:t}}async function j0e(e){await Y_(e.id,e.privateKey)}async function qR(e){let t=await eE(e);if(!t)return null;let n=ma(t);return{id:e,address:n.address,privateKey:t}}function GR(e){return ma(e.privateKey)}async function VR(){let e=z0e();return await j0e(e),e}import{existsSync as q0e,mkdirSync as sFe,readFileSync as G0e,writeFileSync as V0e,openSync as oFe,closeSync as iFe,unlinkSync as W0e,statSync as cFe,constants as WR}from"node:fs";import{homedir as uFe}from"node:os";import*as ZR from"node:path";function KR(){let e=ZR.join(uFe(),".pragma");return q0e(e)||sFe(e,{recursive:!0}),ZR.join(e,"wallet-pool.json")}function Z0e(){return KR()+".lock"}var dFe=3e4;function fFe(e){try{return process.kill(e,0),!0}catch{return!1}}function lFe(e){try{let t=G0e(e,"utf-8"),n=parseInt(t,10);if(Number.isNaN(n)||!fFe(n))return!0;let r=cFe(e);return Date.now()-r.mtimeMs>dFe}catch{return!0}}async function pFe(e=5e3,t=50){let n=Z0e(),r=Date.now();for(;Date.now()-r<e;)try{let a=oFe(n,WR.O_CREAT|WR.O_EXCL|WR.O_WRONLY);V0e(a,process.pid.toString()),iFe(a);return}catch(a){if(a.code==="EEXIST"){if(lFe(n)){try{W0e(n)}catch{}continue}await new Promise(s=>setTimeout(s,t));continue}throw a}throw new Error(`Failed to acquire wallet pool lock after ${e}ms`)}function mFe(){let e=Z0e();try{W0e(e)}catch{}}async function XR(e){await pFe();try{return await e()}finally{mFe()}}function I2(){let e=KR();if(!q0e(e))return{wallets:[],version:1};try{let t=G0e(e,"utf-8");return JSON.parse(t)}catch{return{wallets:[],version:1}}}function JR(e){let t=KR();V0e(t,JSON.stringify(e,null,2))}async function K0e(){return XR(async()=>{let e=I2(),t=0,n=0,r=!1;for(let a of e.wallets)if(a.status==="active")if(!a.assignedTo)a.status="idle",a.lastUsedAt=Date.now(),t++,r=!0;else{let s=a.assignedTo.replace("subagent-","");k2(s)||(a.status="idle",a.assignedTo=null,a.lastUsedAt=Date.now(),n++,r=!0)}return r&&(e.version++,JR(e)),{inconsistenciesFixed:t,orphansFixed:n}})}async function QR(e){return await K0e(),XR(async()=>{let t=I2(),n=t.wallets.find(r=>r.status==="idle");if(!n){let r=await VR(),a=Date.now();n={id:r.id,address:r.address,status:"idle",assignedTo:null,createdAt:a,lastUsedAt:a},t.wallets.push(n)}return n.status="active",n.assignedTo=e,n.lastUsedAt=Date.now(),t.version++,JR(t),n})}async function Ca(e){return XR(async()=>{let t=I2(),n=t.wallets.find(r=>r.id===e);if(!n)throw new Error(`Wallet not found in pool: ${e}`);n.status="idle",n.assignedTo=null,n.lastUsedAt=Date.now(),t.version++,JR(t)})}function O7(e){let t=I2();return e?t.wallets.filter(n=>n.status===e):t.wallets}async function oc(e){return qR(e)}import{existsSync as X0e,readFileSync as bFe,writeFileSync as J0e,unlinkSync as fkt}from"node:fs";import{homedir as yFe}from"node:os";import*as P2 from"node:path";function YR(e){let t=P2.join(yFe(),".pragma","agents",e);return P2.join(t,"loop.json")}function N7(e,t){let n=YR(e),r=P2.dirname(n);if(!X0e(r))throw new Error(`Agent directory not found: ${e}`);let a={...t,createdAt:Date.now()};J0e(n,JSON.stringify(a,null,2))}function R2(e){let t=YR(e);if(!X0e(t))return null;try{let n=bFe(t,"utf-8");return JSON.parse(n)}catch{return null}}function Q0e(e,t){let n=R2(e);if(!n)throw new Error(`Loop config not found for agent: ${e}`);let r={...n,...t,lastCheckedAt:Date.now()},a=YR(e);J0e(a,JSON.stringify(r,null,2))}function e$(e){R2(e)&&Q0e(e,{active:!1})}function t$(e,t,n=0){N7(e,{type:"continuous",active:!0,mission:t,maxIterations:n,currentIteration:0,until:["budget_exhausted","delegation_expired","user_cancelled"]})}function n$(e,t,n,r=0){N7(e,{type:"condition",active:!0,condition:t,mission:n,maxIterations:r,currentIteration:0})}function r$(e,t,n,r=0){N7(e,{type:"interval",active:!0,intervalMinutes:t,mission:n,maxIterations:r,currentIteration:0})}Te();mt();We();Ar();Y();function Y0e(e){return e.length===0?"0x":Ae(e)}function gFe(e){return e.length===0?"0x":`0x${e.map(n=>n.slice(2).toLowerCase()).join("")}`}function hFe(){return{caveats:[{enforcer:z5,terms:Y0e([cp]),args:"0x"}]}}function xFe(e,t){return{caveats:[{enforcer:ip,terms:gFe(e),args:"0x"},{enforcer:z5,terms:Y0e(t),args:"0x"}]}}function wFe(e){return Zt([{type:"tuple[]",components:[{name:"caveats",type:"tuple[]",components:[{name:"enforcer",type:"address"},{name:"terms",type:"bytes"},{name:"args",type:"bytes"}]}]}],[e.map(t=>({caveats:t.caveats.map(n=>({enforcer:n.enforcer,terms:n.terms,args:n.args}))}))])}function vFe(e,t=[]){return Zt([{type:"tuple",components:[{name:"groupIndex",type:"uint256"},{name:"caveatArgs",type:"bytes[]"}]}],[{groupIndex:BigInt(e),caveatArgs:t}])}function L7(e,t){let n=[hFe(),xFe(e,t)];return{enforcer:b2,terms:wFe(n),args:"0x"}}function $2(e,t){let n=e.caveats.find(r=>r.enforcer.toLowerCase()===b2.toLowerCase());if(n){let r=t===0?["0x"]:["0x","0x"];n.args=vFe(t,r)}}Y();Y();mt();Te();We();m0();var bp={143:{lens:"0x7e78A8DE94f21804F7a17F4E8BF9EC2c872187ea",router:"0x6F6B8F1a20703309951a5127c45B49b1CD981A22"}},D2=[{name:"getInitialBuyAmountOut",type:"function",stateMutability:"view",inputs:[{name:"amountIn",type:"uint256"}],outputs:[{name:"amountOut",type:"uint256"}]},{name:"getAmountOut",type:"function",stateMutability:"view",inputs:[{name:"token",type:"address"},{name:"amountIn",type:"uint256"},{name:"isBuy",type:"bool"}],outputs:[{name:"router",type:"address"},{name:"amountOut",type:"uint256"}]},{name:"getAmountIn",type:"function",stateMutability:"view",inputs:[{name:"token",type:"address"},{name:"amountOut",type:"uint256"},{name:"isBuy",type:"bool"}],outputs:[{name:"router",type:"address"},{name:"amountIn",type:"uint256"}]},{name:"getProgress",type:"function",stateMutability:"view",inputs:[{name:"token",type:"address"}],outputs:[{name:"",type:"uint256"}]},{name:"isGraduated",type:"function",stateMutability:"view",inputs:[{name:"token",type:"address"}],outputs:[{name:"",type:"bool"}]},{name:"isLocked",type:"function",stateMutability:"view",inputs:[{name:"token",type:"address"}],outputs:[{name:"",type:"bool"}]},{name:"availableBuyTokens",type:"function",stateMutability:"view",inputs:[{name:"token",type:"address"}],outputs:[{name:"",type:"uint256"},{name:"",type:"uint256"}]}],a$=[{name:"buy",type:"function",stateMutability:"payable",inputs:[{name:"params",type:"tuple",components:[{name:"amountOutMin",type:"uint256"},{name:"token",type:"address"},{name:"to",type:"address"},{name:"deadline",type:"uint256"}]}],outputs:[{name:"",type:"uint256"}]},{name:"sell",type:"function",stateMutability:"nonpayable",inputs:[{name:"params",type:"tuple",components:[{name:"amountIn",type:"uint256"},{name:"amountOutMin",type:"uint256"},{name:"token",type:"address"},{name:"to",type:"address"},{name:"deadline",type:"uint256"}]}],outputs:[{name:"",type:"uint256"}]}];var ere=[{name:"create",type:"function",stateMutability:"payable",inputs:[{name:"params",type:"tuple",components:[{name:"name",type:"string"},{name:"symbol",type:"string"},{name:"tokenURI",type:"string"},{name:"amountOut",type:"uint256"},{name:"salt",type:"bytes32"},{name:"actionId",type:"uint8"}]}],outputs:[{name:"token",type:"address"}]}];var tre=10000000000000000000n,nre=300*1e3,rre=300,ic=500,V6=5e3,are=1e4;async function B7(){let e=await q();if(!e)throw new Error("Config not loaded. Run setup_wallet first.");let t=await we(e),n=Ee(e.network.chainId,t);return _e({chain:n,transport:gt(t,Ot(e))})}function W6(e){let t=bp[e];if(!t)throw new Error(`nad.fun not supported on chain ${e}`);return t}async function ji(e,t=143){let n=await B7(),r=W6(t),a=h5({address:r.lens,abi:D2,client:n}),s=h5({address:e,abi:Xe,client:n}),[o,i,u,d,l]=await xt(async()=>Promise.all([a.read.isGraduated([e]),a.read.isLocked([e]),a.read.getProgress([e]),s.read.symbol().catch(()=>{}),s.read.name().catch(()=>{})]),{operationName:"nadfun-status"}),p=o?"dex":"bonding_curve",y=Number(u),m=`${(y/100).toFixed(1)}%`,g={token:e,tokenSymbol:d,tokenName:l,isGraduated:o,isLocked:i,progress:y,progressPercent:m,tradingVenue:p};if(!o&&!i)try{let[h,w]=await xt(async()=>a.read.availableBuyTokens([e]),{operationName:"nadfun-available"});g.availableTokensWei=h,g.requiredMonWei=w,g.availableTokens=le(h,18),g.requiredMon=le(w,18)}catch(h){console.error("[nadfun] Could not fetch availability:",h)}return g}async function sre(e,t,n,r=143){let a=await B7(),s=W6(r),o=h5({address:s.lens,abi:D2,client:a}),[i,u]=await xt(async()=>o.read.getAmountOut([e,t,n]),{operationName:"nadfun-quote"});return{router:i,amountOut:u}}async function ore(e,t,n,r=143){let a=await B7(),s=W6(r),o=h5({address:s.lens,abi:D2,client:a}),[i,u]=await xt(async()=>o.read.getAmountIn([e,t,n]),{operationName:"nadfun-quote-reverse"});return{router:i,amountIn:u}}function ire(e){return e>=are*.9}async function cre(e,t=143){let n=await B7(),r=W6(t),a=h5({address:r.lens,abi:D2,client:n});return await xt(async()=>a.read.getInitialBuyAmountOut([e]),{operationName:"nadfun-initial-buy-quote"})}var Z6=new Map;function TFe(){let e=Date.now().toString(36),t=Math.random().toString(36).substring(2,8);return`nadfun-${e}-${t}`}function SFe(){let e=Date.now();for(let[t,n]of Z6.entries())n.expiresAt<e&&Z6.delete(t)}function AFe(e,t,n,r){return X({abi:a$,functionName:"buy",args:[{amountOutMin:e,token:t,to:n,deadline:r}]})}function _Fe(e,t,n,r,a){return X({abi:a$,functionName:"sell",args:[{amountIn:e,amountOutMin:t,token:n,to:r,deadline:a}]})}async function ure(e){SFe();let{token:t,amount:n,isBuy:r,slippageBps:a=ic,chainId:s,sender:o,tokenSymbol:i="TOKEN",tokenDecimals:u=18,exactOutput:d=!1}=e;if(a<0||a>V6)throw new Error(`Slippage must be between 0 and ${V6} bps`);let l=await ji(t,s);if(l.isGraduated)throw new Error("Token has graduated to DEX. Use regular swap tools (get_swap_quote + execute_swap) instead.");if(l.isLocked)throw new Error("Token is locked during graduation process. Cannot trade until graduation completes.");let p,y,m;if(d){let W=await ore(t,n,r,s);p=W.router,y=W.amountIn,m=n}else{let W=await sre(t,n,r,s);p=W.router,y=n,m=W.amountOut}let g=W6(s);p.toLowerCase()!==g.router.toLowerCase()&&console.error(`[nadfun] Using Lens-returned router: ${p} (expected ${g.router})`);let h=BigInt(1e4-a),w=m*h/BigInt(1e4),v=d?y*BigInt(1e4+a)/BigInt(1e4):y,T=BigInt(Math.floor(Date.now()/1e3)+rre),A,_;r?(A=AFe(w,t,o,T),_=v):(A=_Fe(v,w,t,o,T),_=0n);let E=r?"BUY":"SELL",O=TFe(),$=l.tokenSymbol||i,B={quoteId:O,token:t,tokenSymbol:$,tokenDecimals:u,direction:E,amountIn:r?le(v,18):le(v,u),amountInWei:v,expectedOutput:r?le(m,u):le(m,18),expectedOutputWei:m,minOutput:r?le(w,u):le(w,18),minOutputWei:w,slippageBps:a,progress:l.progress,progressPercent:l.progressPercent,router:p,expiresAt:Date.now()+nre,chainId:s,_calldata:A,_value:_};Z6.set(O,B);let{_calldata:V,_value:D,...G}=B,N;return ire(l.progress)&&(N=`Token is ${l.progressPercent} toward graduation. Large buys may trigger graduation.`),{quote:G,warning:N}}function po(e){let t=Z6.get(e);if(!t)return null;if(mo(t))return Z6.delete(e),null;let{_calldata:n,_value:r,...a}=t;return a}function qi(e){let t=Z6.get(e);return!t||!t._calldata?null:mo(t)?(Z6.delete(e),null):{calldata:t._calldata,router:t.router,value:t._value,direction:t.direction}}function mo(e){return Date.now()>=e.expiresAt}function dre(e){let t=e.expiresAt-Date.now();return Math.max(0,Math.floor(t/1e3))}function Gi(e){Z6.delete(e)}Y();var Kn="0xea1b8E4aB7f14F7dCA68c5B214303B13078FC5ec",s$="0x2880aB155794e7179c9eE2e38200202908C17B43",V0="0x754704Bc059F8C67012fEd69BC8A327a5aafb603",g0="0xFD44B35139Ae53FFF7d8F2A9869c503D987f00d1",h0="0x91b81bfbe3A747230F0529Aa28d8b2Bc898E6D56";var _r="0x3bd359C1119dA7Da1D913D1C4D2B7c461115433A";var o$=8500n,bo=[500,750,1001];var fre=500,lre=300,pre=50,mre="https://hermes.pyth.network",bre=[{type:"function",inputs:[{type:"address",name:"user"},{type:"address",name:"pairBase"}],name:"getPositionsV2",outputs:[{components:[{type:"bytes32",name:"positionHash"},{type:"string",name:"pair"},{type:"address",name:"pairBase"},{type:"address",name:"tokenIn"},{type:"address",name:"marginToken"},{type:"bool",name:"isLong"},{type:"uint96",name:"margin"},{type:"uint128",name:"qty"},{type:"uint128",name:"entryPrice"},{type:"uint128",name:"stopLoss"},{type:"uint128",name:"takeProfit"},{type:"uint96",name:"openFee"},{type:"uint96",name:"executionFee"},{type:"int256",name:"fundingFee"},{type:"uint32",name:"timestamp"},{type:"uint96",name:"holdingFee"}],type:"tuple[]",name:""}],stateMutability:"view"}],M2=[{inputs:[{components:[{type:"address",name:"pairBase"},{type:"bool",name:"isLong"},{type:"address",name:"tokenIn"},{type:"address",name:"lvToken"},{type:"uint96",name:"amountIn"},{type:"uint128",name:"qty"},{type:"uint128",name:"price"},{type:"uint128",name:"stopLoss"},{type:"uint128",name:"takeProfit"},{type:"uint24",name:"broker"}],name:"data",type:"tuple"},{type:"bytes[]",name:"priceUpdateData"}],name:"openMarketTradeWithPyth",outputs:[{type:"bytes32",name:"tradeHash"}],stateMutability:"payable",type:"function"},{name:"closeTrade",type:"function",stateMutability:"nonpayable",inputs:[{name:"tradeHash",type:"bytes32"}],outputs:[]},{name:"addMargin",type:"function",stateMutability:"payable",inputs:[{name:"tradeHash",type:"bytes32"},{name:"token",type:"address"},{name:"amount",type:"uint96"}],outputs:[]},{name:"updateTradeTpAndSl",type:"function",stateMutability:"nonpayable",inputs:[{name:"tradeHash",type:"bytes32"},{name:"takeProfit",type:"uint128"},{name:"stopLoss",type:"uint128"}],outputs:[]}],U7=[{inputs:[{components:[{type:"address",name:"pairBase"},{type:"bool",name:"isLong"},{type:"address",name:"tokenIn"},{type:"address",name:"lvToken"},{type:"uint96",name:"amountIn"},{type:"uint128",name:"qty"},{type:"uint128",name:"price"},{type:"uint128",name:"stopLoss"},{type:"uint128",name:"takeProfit"},{type:"uint24",name:"broker"}],name:"data",type:"tuple"},{type:"bytes[]",name:"priceUpdateData"}],name:"openLimitOrderWithPyth",outputs:[{type:"bytes32",name:"orderHash"}],stateMutability:"payable",type:"function"},{name:"cancelLimitOrder",type:"function",stateMutability:"nonpayable",inputs:[{name:"orderHash",type:"bytes32"}],outputs:[]},{name:"batchCancelLimitOrders",type:"function",stateMutability:"nonpayable",inputs:[{name:"orderHashes",type:"bytes32[]"}],outputs:[]}],yre=[{type:"function",inputs:[{type:"address",name:"user"},{type:"address",name:"pairBase"}],name:"getLimitOrders",outputs:[{components:[{type:"bytes32",name:"orderHash"},{type:"string",name:"pair"},{type:"address",name:"pairBase"},{type:"bool",name:"isLong"},{type:"address",name:"tokenIn"},{type:"address",name:"lvToken"},{type:"uint96",name:"amountIn"},{type:"uint128",name:"qty"},{type:"uint128",name:"limitPrice"},{type:"uint128",name:"stopLoss"},{type:"uint128",name:"takeProfit"},{type:"uint24",name:"broker"},{type:"uint32",name:"timestamp"}],type:"tuple[]",name:""}],stateMutability:"view"}],i$=[{type:"function",name:"getPairHoldingFeeRate",inputs:[{type:"address",name:"pairBase"},{type:"bool",name:"isLong"}],outputs:[{type:"uint256",name:""}],stateMutability:"view"}],gre=[{type:"function",name:"lastLongAccFundingFeePerShare",inputs:[{type:"address",name:"pairBase"}],outputs:[{type:"int256",name:""}],stateMutability:"view"}],hre=[{type:"function",name:"getMarketInfo",inputs:[{type:"address",name:"pairBase"}],outputs:[{type:"address",name:"pairBase"},{type:"uint256",name:"longQty"},{type:"uint256",name:"shortQty"},{type:"uint256",name:"longNotional"},{type:"uint256",name:"shortNotional"},{type:"int256",name:"currentFundingFeePerSec"}],stateMutability:"view"}],c$=[{name:"getUpdateFee",type:"function",stateMutability:"view",inputs:[{name:"updateData",type:"bytes[]"}],outputs:[{name:"fee",type:"uint256"}]}],Fn=[{pair:"BTC/USD",pairBase:"0xcf5a6076cfa32686c0df13abada2b40dec133f1d",pythId:"0xe62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43",category:"Crypto"},{pair:"ETH/USD",pairBase:"0xb5a30b0fdc5ea94a52fdc42e3e9760cb8449fb37",pythId:"0xff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace",category:"Crypto"},{pair:"MON/USD",pairBase:"0x3bd359c1119da7da1d913d1c4d2b7c461115433a",pythId:"0x31491744e2dbf6df7fcf4ac0820d18a609b49076d45066d3568424e62f686cd1",category:"Crypto"},{pair:"SOL/USD",pairBase:"0x0a3ec4fc70eaf64faf6eeda4e9b2bd4742a78546",pythId:"0xef0d8b6fda2ceba41da15d4095d1da392a0d2f8ed0c6c7bc0f4cfac8c280b56d",category:"Crypto"},{pair:"XRP/USD",pairBase:"0xaeb724422620edb430dcaf22aeeff2e9388a578c",pythId:"0xec5d399846a9209f3fe5881d70aae9268c94339ff9817e8d18ff19fa05eea1c8",category:"Crypto"},{pair:"QQQ/USD",pairBase:"0xb589511c51d1ffda5d943ac1c9733e112abeff7b",pythId:"0x9695e2b96ea7b3859da9ed25b7a46a920a776e2fdae19a7bcfdf2b219230452d",category:"Indices"},{pair:"SPY/USD",pairBase:"0xcb8900160bd4a86d3b80f5ad5a44ee15823b0592",pythId:"0x19e09bb805456ada3979a7d1cbb4b6d63babc3a0f8e8a9509f68afa5c4c11cd5",category:"Indices"},{pair:"AAPL/USD",pairBase:"0x3a54a9a690616fbc26cfc409bf11f89d51f1d57a",pythId:"0x49f6b65cb1de6b10eaf75e7c03ca029c306d0357e91b5311b175084a5ad55688",category:"Stocks"},{pair:"AMZN/USD",pairBase:"0x6c755094f1cdd95e2e4170549dc12e7555151536",pythId:"0xb5d0e0fa58a1f8b81498ae670ce93c872d14434b72c364885d4fa1b257cbb07a",category:"Stocks"},{pair:"TSLA/USD",pairBase:"0x0a8f1f385fed9c77a2e0daa363ccc865e971bdbe",pythId:"0x16dad506d7db8da01c87581c87ca897a012a153557d4d578c3b9c9e1bc0632f1",category:"Stocks"},{pair:"NVDA/USD",pairBase:"0xe108948b9667048232851f26a1427d3a908b22da",pythId:"0xb1073854ed24cbc755dc527418f52b7d271f6cc967bbf8d8129112b18860a593",category:"Stocks"},{pair:"META/USD",pairBase:"0x0057355892fab25ddc63a7482ec1696d6ada6703",pythId:"0x78a3e3b8e676a8f73c439f5d749737034b139bbbe899ba5775216fba596607fe",category:"Stocks"},{pair:"MSFT/USD",pairBase:"0xb2023082f01404dd0ce6937cab03c4f5d6db9ba8",pythId:"0xd0ca23c1cc005e004ccf1db5bf76aeb6a49218f43dac3d4b275e92de12ded4d1",category:"Stocks"},{pair:"GOOG/USD",pairBase:"0x9a4f772de1a5f6df5913fa2c98dd7177eaa23dc2",pythId:"0xe65ff435be42630439c96396653a342829e877e2aafaeaf1a10d0ee5fd2cf3f2",category:"Stocks"},{pair:"EUR/USD",pairBase:"0xa9226449042e36bf6865099eec57482aa55e3ad0",pythId:"0xa995d00bb36a63cef7fd2c287dc105fc8f3d93779f062f09551b0af3e81ec30b",category:"Forex"},{pair:"USD/JPY",pairBase:"0x35b8bafff3570683af968b8d36b91b1a19465141",pythId:"0xef2c98c804ba503c6a707e38be4dfbb16683775f195b091252bf24693042fd52",category:"Forex"},{pair:"XAU/USD",pairBase:"0x7c687a3207cd9c05b4b11d8dd7ac337919c22001",pythId:"0x765d2ba906dbc32ca17cc11f5310a89e9ee1f6420508c63861f2f8ba4ee34bb2",category:"Commodities"},{pair:"XAG/USD",pairBase:"0x5ccc5c04130d272bf07d6e066f4cae40cfc03136",pythId:"0xf2fb02c32b055c805e7238d628e5e9dadef274376114eb1f012337cabe93871e",category:"Commodities"},{pair:"500BTC/USD",pairBase:"0x0000000000000000000000000000000000000003",pythId:"0xe62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43",category:"Crypto",isHighLeverage:!0},{pair:"500ETH/USD",pairBase:"0x0000000000000000000000000000000000000004",pythId:"0xff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace",category:"Crypto",isHighLeverage:!0}];m0();async function K6(e){let t=new URL(`${mre}/v2/updates/price/latest`);return e.forEach(n=>t.searchParams.append("ids[]",n)),await xt(async()=>{let n=await fetch(t.toString());if(!n.ok)throw new Error(`Pyth API error: ${n.statusText}`);return await n.json()},{operationName:"fetch-pyth-price"})}Y();Te();mt();We();m0();var EFe=["MON","LVMON"];function xre(e){return EFe.includes(e)}function Qo(e){return bo.includes(e)}function X6(e){return e<pre?fre:lre}function Ia(e){return e==="USDC"?6:18}async function yp(e){let t=await we(e),n=e.network?.chainId||143,r=Ee(n,t);return await It()?_e({chain:r,transport:gt(t,Ot(e))}):_e({chain:r,transport:gt(t)})}async function J5(e,t){let n=await q();if(!n||!Pe(n))throw new Error("Wallet not configured.");let r=await yp(n),a=[],s=t?Fn.filter(o=>t.includes(o.pair)):Fn;for(let o of s){let i=await xt(async()=>r.readContract({address:Kn,abi:bre,functionName:"getPositionsV2",args:[e,o.pairBase]}),{operationName:`leverup-get-positions-${o.pair}`});if(i&&i.length>0){let d=(await K6([o.pythId])).parsed?.[0]?.price;if(!d)continue;let l=BigInt(d.price)*10n**BigInt(18+d.expo);for(let p of i){let y=p,m=kFe(y,l);a.push({position:y,analysis:m})}}}return a}async function J6(e,t,n,r,a="MON"){let s=Fn.find(D=>D.pair===`${e}/USD`||D.pair===e);if(!s)throw new Error(`Unsupported pair: ${e}`);let o=[s.pythId],i=Fn.find(D=>D.pair==="MON/USD");xre(a)&&i&&o.push(i.pythId);let u=await K6(o),d=u.parsed?.find(D=>`0x${D.id}`===s.pythId)?.price;if(!d)throw new Error("Could not fetch asset price from Pyth");let l=BigInt(d.price)*10n**BigInt(18+d.expo),p;if(xre(a)){let D=u.parsed?.find(W=>`0x${W.id}`===i?.pythId)?.price;if(!D)throw new Error("Could not fetch MON price from Pyth");let G=BigInt(D.price)*10n**BigInt(18+D.expo);p=ye(n,18)*G/10n**18n}else p=ye(n,18);let y=p*BigInt(r),m=y*10n**10n/l,g=y*45n/100000n,w=p*o$/10000n-g,v;t?v=l-w*10n**10n/m:v=l+w*10n**10n/m;let T=t?(l-v)*10000n/l:(v-l)*10000n/l,A=le(p,18),_=Number(le(y,18)),E=Number(A),O=200,$=10,B=[],V=!1;return _<O&&(B.push(`Position size is below the protocol minimum of $200.00 USD (Current: $${_.toFixed(2)}). This will be rejected by the contract.`),V=!0),E<$&&B.push(`Margin is below the recommended $10.00 USD (Current: $${E.toFixed(2)}). This may work but is not recommended.`),s.isHighLeverage&&!Qo(r)&&(B.push(`${s.pair} is a high-leverage (Zero-Fee) pair that ONLY supports ${bo.join(", ")}x leverage. Current leverage (${r}x) will be rejected by the protocol.`),V=!0),{symbol:s.pair,isLong:t,leverage:r,entryPrice:Number(le(l,18)).toFixed(2),marginAmount:`${n} ${a}`,marginUsd:E.toFixed(2),positionSize:le(m,10),positionValueUsd:_.toFixed(2),liqPrice:Number(le(v,18)).toFixed(2),openFee:Number(le(g,18)).toFixed(4),healthFactor:Math.max(0,Math.min(100,Number(T))),distanceToLiq:`${(Number(T)/100).toFixed(2)}%`,meetsMinimums:!V,warnings:B,isHighLeveragePair:s.isHighLeverage??!1,maxTpPercent:X6(r),canAddMargin:!Qo(r)}}function kFe(e,t){let{isLong:n,entryPrice:r,qty:a,margin:s,openFee:o,holdingFee:i,fundingFee:u}=e,d=n?(t-r)*a/10n**10n:(r-t)*a/10n**10n,l=o+i+u,p=d-l,m=s*o$/10000n-l,g=n?r-m*10n**10n/a:r+m*10n**10n/a,h=n?(t-g)*10000n/t:(g-t)*10000n/t;return{unrealizedPnL:`$${Number(le(p,18)).toFixed(2)}`,pnlPercentage:`${(Number(p*10000n/s)/100).toFixed(2)}%`,liqPrice:Number(le(g,18)).toFixed(2),distanceToLiq:`${(Number(h)/100).toFixed(2)}%`,healthFactor:Math.max(0,Math.min(100,Number(h))),isLiquidatable:h<=0}}async function vre(e){let t=await q();if(!t||!Pe(t))throw new Error("Wallet not configured.");let n=await yp(t);return(await Promise.all(Fn.map(async a=>{try{let s=await xt(async()=>n.readContract({address:Kn,abi:yre,functionName:"getLimitOrders",args:[e,a.pairBase]}),{operationName:`leverup-get-limit-orders-${a.pair}`});return s&&s.length>0?s.map(o=>({...o,pair:a.pair})):[]}catch{return[]}}))).flat()}async function O2(e,t,n,r,a,s="MON"){let o=await J6(e,t,n,r,s),i=ye(a,18),u=ye(o.entryPrice,18),d,l;if(t)if(d=i<u,d){let y=(u-i)*10000n/u;l=`Valid: Trigger price is ${(Number(y)/100).toFixed(2)}% below current market.`}else l=`Invalid: Long limit orders require trigger price BELOW current market ($${o.entryPrice}).`;else if(d=i>u,d){let y=(i-u)*10000n/u;l=`Valid: Trigger price is ${(Number(y)/100).toFixed(2)}% above current market.`}else l=`Invalid: Short limit orders require trigger price ABOVE current market ($${o.entryPrice}).`;let p=[...o.warnings];return d||p.unshift(l),{...o,triggerPrice:a,triggerPriceUsd:`$${Number(a).toFixed(2)}`,currentPrice:o.entryPrice,isTriggerValid:d,triggerValidationMessage:l,warnings:p,meetsMinimums:o.meetsMinimums&&d}}function H7(e,t){let n=e*t;return`${(Number(n)/1e10*100).toFixed(6)}%`}function Tre(e){return e>0n?"longs pay":e<0n?"shorts pay":"neutral"}function CFe(e){let t=e;return{longQty:t[1],shortQty:t[2],currentFundingFeePerSec:t[5]}}function wre(e,t){let n=e*t,r=n<0n?-n:n;return`${n<0n?"-":"+"}${(Number(r)/1e18*100).toFixed(4)}%`}function IFe(e){let{longQty:t,shortQty:n,currentFundingFeePerSec:r}=e,a=le(t,10),s=le(n,10),o,i;if(t===0n&&n===0n)o="0:0",i="balanced";else if(n===0n)o="100% longs",i="longs";else if(t===0n)o="100% shorts",i="shorts";else{let u=Number(t)/Number(n);u>1.1?(o=`${u.toFixed(2)}:1 long-heavy`,i="longs"):u<.9?(o=`1:${(1/u).toFixed(2)} short-heavy`,i="shorts"):(o=`${u.toFixed(2)}:1 balanced`,i="balanced")}return{longQty:a,shortQty:s,oiRatio:o,dominantSide:i,currentFundingRate8h:wre(r,28800n),currentFundingRate1h:wre(r,3600n),fundingRateDirection:Tre(r)}}async function Sre(e){let t=await q();if(!t)throw new Error("Config not loaded. Run setup_wallet first.");let n=await yp(t),r=Fn.filter(o=>!o.isHighLeverage);if(e){let o=e.toUpperCase().trim();if(r=r.filter(i=>i.pair.toUpperCase().startsWith(o)||i.pair.toUpperCase()===`${o}/USD`||i.pair.toUpperCase().includes(o)),r.length===0)throw new Error(`No LeverUp pair found for '${e}'. Use leverup_list_pairs to see available markets.`)}let s=(await Promise.all(r.map(async o=>{try{let[i,u,d,l]=await Promise.all([xt(async()=>n.readContract({address:Kn,abi:i$,functionName:"getPairHoldingFeeRate",args:[o.pairBase,!0]}),{operationName:`funding-long-${o.pair}`}),xt(async()=>n.readContract({address:Kn,abi:i$,functionName:"getPairHoldingFeeRate",args:[o.pairBase,!1]}),{operationName:`funding-short-${o.pair}`}),xt(async()=>n.readContract({address:Kn,abi:gre,functionName:"lastLongAccFundingFeePerShare",args:[o.pairBase]}),{operationName:`acc-funding-${o.pair}`}),xt(async()=>n.readContract({address:Kn,abi:hre,functionName:"getMarketInfo",args:[o.pairBase]}),{operationName:`market-info-${o.pair}`}).catch(()=>null)]),p=i,y=u,m=d,g={symbol:o.pair,category:o.category,pairBase:o.pairBase,holdingFeeRatePerSecond:{long:p,short:y},holdingFeeRate8h:{long:H7(p,28800n),short:H7(y,28800n)},holdingFeeRate1h:{long:H7(p,3600n),short:H7(y,3600n)},accumulatedFunding:m,fundingDirection:Tre(m)};if(l){let h=CFe(l);g.marketInfo=IFe(h)}return g}catch{return null}}))).filter(o=>o!==null);return s.sort((o,i)=>o.category!==i.category?o.category.localeCompare(i.category):o.symbol.localeCompare(i.symbol)),s}m0();async function N2(e,t){let n=Fn.find(T=>T.pair===`${e.symbol}/USD`||T.pair===e.symbol);if(!n)throw new Error(`Unsupported pair: ${e.symbol}`);let r=await yp(t),a=[n.pythId],s=Fn.find(T=>T.pair==="MON/USD");(e.collateralToken==="MON"||e.collateralToken==="LVMON")&&s&&a.push(s.pythId);let i=(await K6(a)).binary.data.map(T=>T.startsWith("0x")?T:`0x${T}`),u=await xt(async()=>r.readContract({address:s$,abi:c$,functionName:"getUpdateFee",args:[i]}),{operationName:"leverup-pyth-fee"}),d,l;switch(e.collateralToken){case"USDC":d=V0,l=g0;break;case"LVUSD":d=g0,l=g0;break;case"LVMON":d=h0,l=h0;break;default:d=_r,l=h0;break}let y=e.amountIn*BigInt(e.leverage)*45n/100000n,m=e.amountIn+y,g={pairBase:xe(n.pairBase),isLong:e.isLong,tokenIn:d,lvToken:l,amountIn:m,qty:e.qty,price:e.price,stopLoss:e.stopLoss||0n,takeProfit:e.takeProfit||0n,broker:0},h=X({abi:M2,functionName:"openMarketTradeWithPyth",args:[g,i]}),v=e.collateralToken==="MON"?u+m:u;return{to:Kn,data:h,value:v,tokenIn:d,amountIn:m}}async function L2(e){let t=X({abi:M2,functionName:"closeTrade",args:[e]});return{to:Kn,data:t,value:0n}}function B2(e,t,n,r){let a=X({abi:M2,functionName:"addMargin",args:[e,t,n]});return{to:Kn,data:a,value:r?n:0n,tokenIn:t,amountIn:n}}function U2(e,t,n){let r=X({abi:M2,functionName:"updateTradeTpAndSl",args:[e,t,n]});return{to:Kn,data:r,value:0n}}async function H2(e,t){let n=Fn.find(T=>T.pair===`${e.symbol}/USD`||T.pair===e.symbol);if(!n)throw new Error(`Unsupported pair: ${e.symbol}`);let r=await yp(t),a=[n.pythId],s=Fn.find(T=>T.pair==="MON/USD");(e.collateralToken==="MON"||e.collateralToken==="LVMON")&&s&&a.push(s.pythId);let i=(await K6(a)).binary.data.map(T=>T.startsWith("0x")?T:`0x${T}`),u=await xt(async()=>r.readContract({address:s$,abi:c$,functionName:"getUpdateFee",args:[i]}),{operationName:"leverup-limit-pyth-fee"}),d,l;switch(e.collateralToken){case"USDC":d=V0,l=g0;break;case"LVUSD":d=g0,l=g0;break;case"LVMON":d=h0,l=h0;break;default:d=_r,l=h0;break}let y=e.amountIn*BigInt(e.leverage)*45n/100000n,m=e.amountIn+y,g={pairBase:xe(n.pairBase),isLong:e.isLong,tokenIn:d,lvToken:l,amountIn:m,qty:e.qty,price:e.triggerPrice,stopLoss:e.stopLoss||0n,takeProfit:e.takeProfit||0n,broker:0},h=X({abi:U7,functionName:"openLimitOrderWithPyth",args:[g,i]}),v=e.collateralToken==="MON"?u+m:u;return{to:Kn,data:h,value:v,tokenIn:d,amountIn:m}}function F2(e){let t=X({abi:U7,functionName:"cancelLimitOrder",args:[e]});return{to:Kn,data:t,value:0n}}function z2(e){let t=X({abi:U7,functionName:"batchCancelLimitOrders",args:[e]});return{to:Kn,data:t,value:0n}}function PFe(e,t){return e>t?e-t:t-e}var F7={MON:Pn,USDC:V0,LVUSD:g0,LVMON:h0};function RFe(e,t){return zo({abi:Xe,logs:e.logs,eventName:"Transfer"}).filter(r=>r.args.to?.toLowerCase()===t.toLowerCase()).map(r=>({token:r.address,amount:r.args.value}))}var $Fe=qu("event Transfer(address indexed from, address indexed to, uint256 value)");async function _re(){let e=await q();if(!e)return null;let t=await we(e),n=e.network?.chainId??143,r=Ee(n,t);return _e({chain:r,transport:Ze(t,e)})}var Are=200n;async function Ere(e,t,n,r){let a=r==="latest"?await e.getBlockNumber():r;if(a<n)return[];let s=[];for(let o=n;o<=a;o+=Are){let i=o+Are-1n,u=i>a?a:i,d=await e.getLogs({event:$Fe,args:{from:up.leverUpDiamond,to:t},fromBlock:o,toBlock:u});for(let l of d)s.push({token:l.address,amount:l.args.value})}return s}async function DFe(e,t){let n=await _re();if(!n)return[];let r=8,a=2e3;for(let s=0;s<r;s++){await new Promise(o=>setTimeout(o,a));try{let o=await Ere(n,t,e+1n,"latest");if(o.length>0)return o}catch{}}return[]}async function kre(e,t,n){let r=await _re();if(!r)return[];let a=3;for(let s=0;s<a;s++)try{return await Ere(r,n,e,t)}catch{s<a-1&&await new Promise(o=>setTimeout(o,1e3*(s+1)))}return[]}async function ds(e,t,n,r){let a=await q();if(!a?.wallet)return{success:!1,error:"Wallet not configured"};let s=await c0(e);if(!s)return{success:!1,error:`Agent not found: ${e}`};if(s.status!=="running")return{success:!1,error:`Agent not running (status: ${s.status})`};if(Date.now()>s.expiresAt)return await Fi(e,{status:"failed"}),{success:!1,error:"Delegation expired"};if(s.trades.executed>=s.trades.maxAllowed)return await Fi(e,{status:"completed"}),{success:!1,error:"Max trades reached"};let o=await pp(e);if(!o?.rootDelegation||!o?.signedDelegation)return{success:!1,error:"Missing delegation chain in storage"};if(!r?.skipBudgetTracking){if(t.value>0n){let D=$7(s,Pn,t.value);if(!D.allowed)return{success:!1,error:`MON budget exceeded: ${D.reason}`};let G=R7(s,Pn);if(!G.allowed)return{success:!1,error:`Native MON not allowed: ${G.reason}`}}if(r?.tokenFlows)for(let{token:D,amount:G}of r.tokenFlows.outflows){if(D.toLowerCase()===Pn.toLowerCase())continue;let N=$7(s,D,G);if(!N.allowed)return{success:!1,error:`Budget exceeded: ${N.reason}`};let W=R7(s,D);if(!W.allowed)return{success:!1,error:`Token not allowed: ${W.reason}`}}}let i=await oc(s.walletId);if(!i)return{success:!1,error:"Sub-agent wallet not found in Keychain"};let u=a.network.chainId,d=await we(a),l=Ee(u,d),p=Qe(u),y=_e({chain:l,transport:Ze(d,a)}),m=await y.getBalance({address:i.address});if(m<10000000000000000n)return{success:!1,error:`Sub-agent wallet needs gas. Balance: ${m} wei. Fund with fund_sub_agent tool.`};let g=GR(i),h=Tt({account:g,chain:l,transport:Ze(d,a)}),w=structuredClone(o.rootDelegation),v=structuredClone(o.signedDelegation),A=t.callData.toLowerCase().startsWith(cp.toLowerCase())?j6.APPROVE:j6.TRADING;$2(w,A),$2(v,A);let _=[v,w],E;function O(D){return`${p.blockExplorer}/tx/${D}`}function $(){let D={outflows:[...r?.tokenFlows?.outflows||[]],inflows:[...r?.tokenFlows?.inflows||[]]};return t.value>0n&&!D.outflows.some(G=>G.token.toLowerCase()===Pn.toLowerCase())&&D.outflows.push({token:Pn,amount:t.value}),D}async function B(){r?.skipTradeLogging||await MR(e,{timestamp:Date.now(),action:n.action,protocol:n.protocol,details:n.details,txHash:E,success:!0}),r?.skipBudgetTracking||(r?.tokenFlows?await K5(e,$()):t.value>0n&&await LR(e,Pn,t.value))}function V(D){return D instanceof Error&&(D.name==="WaitForTransactionReceiptTimeoutError"||D.message.includes("Timed out while waiting for transaction"))}try{E=await dn(h,y,Ue.delegationManager,[{permissionContext:_,executions:[Pt({target:t.target,value:t.value,callData:t.callData})],mode:nn.SingleDefault}]);let D=await Xt(y,E);return D.status==="reverted"?(await Z5(e,"Transaction reverted on-chain",!0),{success:!1,txHash:E,error:"Transaction reverted on-chain"}):(await B(),{success:!0,txHash:E,explorerUrl:O(E),receipt:D})}catch(D){let G=D instanceof Error?D.message:"Unknown error";if(V(D)&&E)try{await new Promise(W=>setTimeout(W,1e4));let N=await y.getTransactionReceipt({hash:E});return N?.status==="success"?(await B(),{success:!0,txHash:E,explorerUrl:O(E),receipt:N}):N?.status==="reverted"?(await Z5(e,"Transaction reverted (recovered from timeout)",!0),{success:!1,txHash:E,error:"Transaction reverted on-chain"}):(await Z5(e,`Timeout: tx ${E} submitted but unconfirmed`,!0),{success:!1,txHash:E,error:`Timeout: tx submitted (${E}) but unconfirmed`})}catch{return await Z5(e,`Timeout + recovery failed: ${G}`,!0),{success:!1,txHash:E,error:`Timeout: recovery failed (${E})`}}return await Z5(e,G,!0),{success:!1,txHash:E,error:G}}}function Cre(e){let t=e.toLowerCase();return Object.values(up).some(n=>n.toLowerCase()===t)}async function MFe(e,t,n,r,a){try{let s=await e.readContract({address:t,abi:Xe,functionName:"allowance",args:[n,r]});return{hasApproval:s>=a,currentAllowance:s}}catch{return{hasApproval:!1,currentAllowance:0n}}}async function OFe(e,t,n){if(!Cre(n))return{success:!1,error:`Spender ${n} is not whitelisted for autonomous approvals. Whitelisted: ${Object.entries(up).map(([s,o])=>`${s}: ${o}`).join(", ")}`};let r=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"),a=X({abi:Xe,functionName:"approve",args:[n,r]});return await ds(e,{target:t,value:0n,callData:a},{action:"other",protocol:"other",details:{operation:"approve",token:t,spender:n}},{skipBudgetTracking:!0,skipTradeLogging:!0})}async function j2(e,t,n,r,a,s,o){let i=await q();if(!i?.wallet)return{success:!1,error:"Wallet not configured"};if(t.toLowerCase()===Pn.toLowerCase())return await ds(e,a,s,o);if(!Cre(n))return{success:!1,error:`Spender ${n} is not whitelisted for autonomous approvals.`};let u=i.network.chainId,d=await we(i),l=Ee(u,d),p=_e({chain:l,transport:Ze(d,i)}),y=i.wallet.smartAccountAddress,{hasApproval:m}=await MFe(p,t,y,n,r);if(!m){let g=await OFe(e,t,n);if(!g.success)return{success:!1,error:`Approval failed: ${g.error}`};await new Promise(h=>setTimeout(h,1e3))}return await ds(e,a,s,o)}async function Ire(e,t){let n=po(t);if(!n)return{success:!1,message:"Quote not found",error:"Quote not found or expired. Please get a fresh quote with nadfun_quote."};if(mo(n))return Gi(t),{success:!1,message:"Quote expired",error:"Quote has expired. Please get a fresh quote with nadfun_quote."};if(n.direction!=="BUY")return{success:!1,message:"Wrong quote type",error:"This quote is for selling, not buying. Use nadfun_sell instead."};let r=qi(t);if(!r)return{success:!1,message:"Execution data missing",error:"Execution data missing. Please get a fresh quote."};let a={outflows:[{token:Pn,amount:r.value}],inflows:[{token:n.token,amount:n.expectedOutputWei}]},s=await ds(e,{target:r.router,value:r.value,callData:r.calldata},{action:"buy",protocol:"nadfun",details:{token:n.tokenSymbol,tokenOutAddress:n.token,amountIn:n.amountIn,amountOut:n.expectedOutput}},{tokenFlows:a});if(!s.success)return{success:!1,message:"Autonomous buy failed",error:s.error};Gi(t);try{await ka(e,{ts:Date.now(),type:"trade_buy",pair:`${n.tokenSymbol}/MON`,margin:n.amountIn,text:`Bought ${n.expectedOutput} ${n.tokenSymbol} for ${n.amountIn} MON`,txHash:s.txHash,protocol:"nadfun"})}catch{}return{success:!0,message:`Successfully bought ${n.expectedOutput} ${n.tokenSymbol} for ${n.amountIn} MON (autonomous)`,transaction:{hash:s.txHash,explorerUrl:s.explorerUrl},trade:{tokenSymbol:n.tokenSymbol,monSpent:n.amountIn,tokensReceived:n.expectedOutput,progress:n.progressPercent}}}async function Pre(e,t){let n=po(t);if(!n)return{success:!1,message:"Quote not found",error:"Quote not found or expired. Please get a fresh quote with nadfun_quote."};if(mo(n))return Gi(t),{success:!1,message:"Quote expired",error:"Quote has expired. Please get a fresh quote with nadfun_quote."};if(n.direction!=="SELL")return{success:!1,message:"Wrong quote type",error:"This quote is for buying, not selling. Use nadfun_buy instead."};let r=qi(t);if(!r)return{success:!1,message:"Execution data missing",error:"Execution data missing. Please get a fresh quote."};let a=ye(n.amountIn,18),s={outflows:[{token:n.token,amount:a}],inflows:[{token:Pn,amount:n.expectedOutputWei}]},o=await j2(e,n.token,r.router,a,{target:r.router,value:0n,callData:r.calldata},{action:"sell",protocol:"nadfun",details:{token:n.tokenSymbol,tokenInAddress:n.token,amountIn:n.amountIn,amountOut:n.expectedOutput}},{tokenFlows:s});if(!o.success)return{success:!1,message:"Autonomous sell failed",error:o.error};Gi(t);try{await ka(e,{ts:Date.now(),type:"trade_sell",pair:`${n.tokenSymbol}/MON`,margin:n.amountIn,text:`Sold ${n.amountIn} ${n.tokenSymbol} for ${n.expectedOutput} MON`,txHash:o.txHash,protocol:"nadfun"})}catch{}return{success:!0,message:`Successfully sold ${n.amountIn} ${n.tokenSymbol} for ${n.expectedOutput} MON (autonomous)`,transaction:{hash:o.txHash,explorerUrl:o.explorerUrl},trade:{tokenSymbol:n.tokenSymbol,tokensSold:n.amountIn,monReceived:n.expectedOutput,progress:n.progressPercent}}}async function Rre(e,t){let n=await L2(t),r=await ds(e,{target:n.to,value:n.value,callData:n.data},{action:"close",protocol:"leverup",details:{positionId:t}});if(!r.success)return{success:!1,message:"Autonomous close failed",error:r.error};if(r.receipt)try{let s=(await q())?.wallet?.smartAccountAddress;if(s){let o=await DFe(r.receipt.blockNumber,s);o.length>0&&await K5(e,{outflows:[],inflows:o})}}catch{}try{await C2(e,t)}catch{}try{await ka(e,{ts:Date.now(),type:"trade_close",tradeHash:t,text:`Closed position ${t.slice(0,10)}...`,txHash:r.txHash,protocol:"leverup"})}catch{}return{success:!0,message:`Successfully closed position ${t.slice(0,10)}... (autonomous)`,txHash:r.txHash,explorerUrl:r.explorerUrl}}async function $re(e,t,n,r){if(n===void 0&&r===void 0)return{success:!1,message:"Invalid parameters",error:"At least one of takeProfit or stopLoss must be provided."};if(r&&r!=="0"){let d=await c0(e),l=await pp(e);if(d&&l?.rootDelegation){let p=l.rootDelegation.delegator,m=(await J5(p)).find(g=>g.position.positionHash===t);if(m){let g=Number(le(m.position.entryPrice,18)),h=Number(r),w=m.position.isLong,v=w&&h>=g,T=!w&&h<=g;if(v){let A=(g*.99).toFixed(2);return{success:!1,message:"Invalid SL direction",error:`Invalid SL for LONG: SL ($${h}) must be below entry ($${g.toFixed(2)}). LeverUp requires SL in loss direction. Suggested: $${A}`}}if(T){let A=(g*1.01).toFixed(2);return{success:!1,message:"Invalid SL direction",error:`Invalid SL for SHORT: SL ($${h}) must be above entry ($${g.toFixed(2)}). LeverUp requires SL in loss direction. Suggested: $${A}`}}}}}let a=n?ye(n,18):0n,s=r?ye(r,18):0n,o=U2(t,a,s),i=await ds(e,{target:o.to,value:o.value,callData:o.data},{action:"other",protocol:"leverup",details:{operation:"updateTpSl",positionId:t,takeProfit:n||"unchanged",stopLoss:r||"unchanged"}});if(!i.success)return{success:!1,message:"Autonomous TP/SL update failed",error:i.error};let u=[];return n&&u.push(n==="0"?"TP disabled":`TP=$${n}`),r&&u.push(r==="0"?"SL disabled":`SL=$${r}`),{success:!0,message:`Successfully updated ${u.join(", ")} (autonomous)`,txHash:i.txHash,explorerUrl:i.explorerUrl}}async function Dre(e,t){if(t.length===0)return{success:!1,message:"No orders to cancel",error:"Please provide at least one order hash."};let n=t.length===1?F2(t[0]):z2(t),r=await ds(e,{target:n.to,value:n.value,callData:n.data},{action:"other",protocol:"leverup",details:{operation:"cancelLimitOrder",orderCount:String(t.length)}});if(!r.success)return{success:!1,message:"Autonomous cancel failed",error:r.error};if(r.receipt)try{let s=(await q())?.wallet?.smartAccountAddress;if(s){let o=RFe(r.receipt,s);o.length>0&&await K5(e,{outflows:[],inflows:o})}}catch{}try{await ka(e,{ts:Date.now(),type:"cancel_order",text:`Cancelled ${t.length} limit order(s)`,txHash:r.txHash,protocol:"leverup"})}catch{}return{success:!0,message:t.length===1?"Successfully cancelled limit order (autonomous)":`Successfully cancelled ${t.length} limit orders (autonomous)`,txHash:r.txHash,explorerUrl:r.explorerUrl}}async function Mre(e,t,n,r="MON"){let a=r==="MON",s=Ia(r),o=ye(n,s);function i(m){switch(m){case"MON":return _r;case"USDC":return V0;case"LVUSD":return g0;case"LVMON":return h0}}let u=i(r),d=B2(t,u,o,a),p={outflows:[{token:a?Pn:u,amount:o}],inflows:[]},y;return a?y=await ds(e,{target:d.to,value:d.value,callData:d.data},{action:"other",protocol:"leverup",details:{operation:"addMargin",positionId:t,amount:n,collateral:r}},{tokenFlows:p}):y=await j2(e,u,d.to,o,{target:d.to,value:d.value,callData:d.data},{action:"other",protocol:"leverup",details:{operation:"addMargin",positionId:t,amount:n,collateral:r}},{tokenFlows:p}),y.success?{success:!0,message:`Successfully added ${n} ${r} margin (autonomous)`,txHash:y.txHash,explorerUrl:y.explorerUrl}:{success:!1,message:"Autonomous add margin failed",error:y.error}}async function Ore(e,t,n,r){let a=await q();if(!a?.wallet)return{success:!1,message:"Wallet not configured",error:"Wallet not configured"};let s=a.network.chainId,o=t.toUpperCase()==="MON"||t.toLowerCase()===Pn.toLowerCase(),i,u,d;if(o)i="MON",u=18,d=Pn;else{let w=await is(t,s);if(!w)return{success:!1,message:"Token not found",error:`Token not found: ${t}. Please provide a valid symbol or address.`};i=w.symbol,u=w.decimals,d=w.address}let l=ye(r,u),p,y,m;o?(p=n,y=l,m="0x"):(p=d,y=0n,m=X({abi:Xe,functionName:"transfer",args:[n,l]}));let h=await ds(e,{target:p,value:y,callData:m},{action:"other",protocol:"other",details:{operation:"transfer",token:i,recipient:n,amount:r}},{tokenFlows:{outflows:[{token:d,amount:l}],inflows:[]}});return h.success?{success:!0,message:`Successfully transferred ${r} ${i} (autonomous)`,txHash:h.txHash,explorerUrl:h.explorerUrl,transfer:{token:i,recipient:n,amount:r,isNative:o}}:!o&&(h.error?.includes("allowance")||h.error?.includes("approve"))?{success:!1,message:"Token approval needed",error:`${i} approval required. Use assistant mode first.`}:{success:!1,message:"Autonomous transfer failed",error:h.error}}var Nre=[{type:"function",name:"deposit",inputs:[],outputs:[],stateMutability:"payable"},{type:"function",name:"withdraw",inputs:[{name:"wad",type:"uint256"}],outputs:[],stateMutability:"nonpayable"}];async function Lre(e,t){let n=await q();if(!n?.wallet)return{success:!1,message:"Wallet not configured",error:"Wallet not configured"};let a=Qe(n.network.chainId).tokens.wmon;if(!a)return{success:!1,message:"WMON not configured",error:"WMON address not configured for this chain"};let s=ye(t,18),o=X({abi:Nre,functionName:"deposit"}),u=await ds(e,{target:a,value:s,callData:o},{action:"other",protocol:"other",details:{operation:"wrap",amount:t}},{tokenFlows:{outflows:[{token:Pn,amount:s}],inflows:[{token:a,amount:s}]}});return u.success?{success:!0,message:`Successfully wrapped ${t} MON \u2192 WMON (autonomous)`,txHash:u.txHash,explorerUrl:u.explorerUrl,wrap:{direction:"wrap",amount:t}}:{success:!1,message:"Autonomous wrap failed",error:u.error}}async function Bre(e,t){let n=await q();if(!n?.wallet)return{success:!1,message:"Wallet not configured",error:"Wallet not configured"};let a=Qe(n.network.chainId).tokens.wmon;if(!a)return{success:!1,message:"WMON not configured",error:"WMON address not configured for this chain"};let s=ye(t,18),o=X({abi:Nre,functionName:"withdraw",args:[s]}),u=await ds(e,{target:a,value:0n,callData:o},{action:"other",protocol:"other",details:{operation:"unwrap",amount:t}},{tokenFlows:{outflows:[{token:a,amount:s}],inflows:[{token:Pn,amount:s}]}});return u.success?{success:!0,message:`Successfully unwrapped ${t} WMON \u2192 MON (autonomous)`,txHash:u.txHash,explorerUrl:u.explorerUrl,wrap:{direction:"unwrap",amount:t}}:{success:!1,message:"Autonomous unwrap failed",error:u.error}}async function Ure(e,t,n=500){let r=await q();if(!r?.wallet)return{success:!1,message:"Wallet not configured",results:[],summary:{total:0,successful:0,failed:0},error:"Wallet not configured"};let a=Qe(r.network.chainId),s=[];for(let u of t){let d=await G6(u);if(!d){s.push({quoteId:u,success:!1,error:"Quote not found or expired. Please get a fresh quote."});continue}if(ac(d)){s.push({quoteId:u,success:!1,error:"Quote has expired. Please get a fresh quote."});continue}let l=await V5(u);if(!l){s.push({quoteId:u,success:!1,error:"Execution data missing. Please get a fresh quote."});continue}let p=d.fromToken.address.toLowerCase()===Pn.toLowerCase(),y=p?l.value||d.amountInWei:0n,m={outflows:[{token:d.fromToken.address,amount:p?y:d.amountInWei}],inflows:[{token:d.toToken.address,amount:d.expectedOutputWei}]},g=d.fromToken.address.toLowerCase(),w=g===Pn||g===_r.toLowerCase()?"buy":"sell",v;if(p?v=await ds(e,{target:l.router,value:y,callData:l.calldata},{action:w,protocol:"dex",details:{fromToken:d.fromToken.symbol,toToken:d.toToken.symbol,amountIn:d.amountIn,amountOut:d.expectedOutput}},{tokenFlows:m}):v=await j2(e,d.fromToken.address,l.router,d.amountInWei,{target:l.router,value:0n,callData:l.calldata},{action:w,protocol:"dex",details:{fromToken:d.fromToken.symbol,toToken:d.toToken.symbol,amountIn:d.amountIn,amountOut:d.expectedOutput}},{tokenFlows:m}),!v.success){s.push({quoteId:u,success:!1,error:v.error});continue}try{await ka(e,{ts:Date.now(),type:w==="buy"?"trade_buy":"trade_sell",pair:`${d.fromToken.symbol}/${d.toToken.symbol}`,margin:d.amountIn,text:`Swapped ${d.amountIn} ${d.fromToken.symbol} for ${d.expectedOutput} ${d.toToken.symbol}`,txHash:v.txHash,protocol:"dex"})}catch{}s.push({quoteId:u,success:!0,txHash:v.txHash,explorerUrl:v.explorerUrl,swap:{fromToken:d.fromToken.symbol,toToken:d.toToken.symbol,amountIn:`${d.amountIn} ${d.fromToken.symbol}`,amountOut:`${d.expectedOutput} ${d.toToken.symbol}`}})}let o=s.filter(u=>u.success).length,i=s.filter(u=>!u.success).length;return{success:o>0,message:`Executed ${o}/${t.length} swaps (autonomous)`,results:s,summary:{total:t.length,successful:o,failed:i}}}async function Hre(e,t){let n=await q();if(!n?.wallet)return{success:!1,message:"Wallet not configured",error:"Wallet not configured"};let r=t.collateralToken||"MON",a=Fn.find(w=>w.pair===`${t.symbol}/USD`||w.pair===t.symbol);if(!a)return{success:!1,message:"Unsupported pair",error:`Pair not supported: ${t.symbol}. Check leverup_list_pairs for available pairs.`};if(a.isHighLeverage&&!Qo(t.leverage))return{success:!1,message:"Invalid leverage for Zero-Fee pair",error:`${a.pair} ONLY supports ${bo.join(", ")}x leverage. Requested: ${t.leverage}x.`};let s;try{s=await J6(t.symbol,t.isLong,t.marginAmount,t.leverage,r)}catch(w){return{success:!1,message:"Quote failed",error:w instanceof Error?w.message:"Failed to get quote"}}let o=parseFloat(s.entryPrice);if(t.takeProfit){let w=parseFloat(t.takeProfit),v=X6(t.leverage),T=t.isLong?(w-o)/o*100:(o-w)/o*100;if(T<=0){let A=t.isLong?"above":"below";return{success:!1,message:"Invalid TP",error:`For ${t.isLong?"Long":"Short"}, TP must be ${A} entry price ($${o}).`}}if(T>v)return{success:!1,message:"TP exceeds max",error:`Max TP for ${t.leverage}x is ${v}%. Requested: ${T.toFixed(1)}%.`}}if(t.stopLoss){let w=parseFloat(t.stopLoss);if(t.isLong?w>=o:w<=o){let T=t.isLong?"below":"above";return{success:!1,message:"Invalid SL",error:`For ${t.isLong?"Long":"Short"}, SL must be ${T} entry price ($${o}).`}}}let i=BigInt(t.slippageBps??100),u=ye(s.entryPrice,18),d=t.isLong?u*(10000n+i)/10000n:u*(10000n-i)/10000n,l=ye(t.marginAmount,Ia(r)),p=ye(s.positionSize,10),y;try{y=await N2({symbol:t.symbol,isLong:t.isLong,amountIn:l,leverage:t.leverage,qty:p,price:d,collateralToken:r,stopLoss:t.stopLoss?ye(t.stopLoss,18):0n,takeProfit:t.takeProfit?ye(t.takeProfit,18):0n},n)}catch(w){return{success:!1,message:"Execution build failed",error:w instanceof Error?w.message:"Failed to build execution"}}let m=F7[r],g={outflows:[{token:m,amount:l}],inflows:[]},h;if(r==="MON")h=await ds(e,{target:y.to,value:y.value,callData:y.data},{action:"open",protocol:"leverup",details:{symbol:t.symbol,side:t.isLong?"LONG":"SHORT",leverage:String(t.leverage),margin:t.marginAmount,collateral:r}},{tokenFlows:g});else{let w=F7[r];h=await j2(e,w,y.to,l,{target:y.to,value:y.value,callData:y.data},{action:"open",protocol:"leverup",details:{symbol:t.symbol,side:t.isLong?"LONG":"SHORT",leverage:String(t.leverage),margin:t.marginAmount,collateral:r}},{tokenFlows:g})}if(!h.success)return{success:!1,message:"Autonomous open failed",error:h.error};try{await ka(e,{ts:Date.now(),type:"trade_open",pair:a.pair,side:t.isLong?"LONG":"SHORT",margin:t.marginAmount,leverage:String(t.leverage),text:`Opened ${t.leverage}x ${t.isLong?"Long":"Short"} ${t.symbol} with ${t.marginAmount} ${r}`,txHash:h.txHash,protocol:"leverup"})}catch{}try{let w=n.wallet?.smartAccountAddress,v=a.pair,A=(await J5(w,[v])).find(_=>_.position.pair===v&&_.position.isLong===t.isLong&&PFe(_.position.margin,l)*100n<=l*5n);D7(e,{tradeHash:A?.position.positionHash,pair:v,side:t.isLong?"LONG":"SHORT",margin:l.toString(),collateralToken:m,leverage:t.leverage,entryPrice:s.entryPrice,stopLoss:t.stopLoss||"0",takeProfit:t.takeProfit||"0",openedAt:Date.now(),status:"open"})}catch{}return{success:!0,message:`Successfully opened ${t.leverage}x ${t.isLong?"Long":"Short"} ${t.symbol} (autonomous)`,txHash:h.txHash,explorerUrl:h.explorerUrl}}async function Fre(e,t){let n=await q();if(!n?.wallet)return{success:!1,message:"Wallet not configured",error:"Wallet not configured"};let r=t.collateralToken||"MON",a=Fn.find(g=>g.pair===`${t.symbol}/USD`||g.pair===t.symbol);if(!a)return{success:!1,message:"Unsupported pair",error:`Pair not supported: ${t.symbol}`};if(a.isHighLeverage&&!Qo(t.leverage))return{success:!1,message:"Invalid leverage for Zero-Fee pair",error:`${a.pair} ONLY supports ${bo.join(", ")}x leverage.`};let s;try{s=await O2(t.symbol,t.isLong,t.marginAmount,t.leverage,t.triggerPrice,r)}catch(g){return{success:!1,message:"Quote failed",error:g instanceof Error?g.message:"Failed to get quote"}}if(!s.isTriggerValid)return{success:!1,message:"Invalid trigger price",error:s.triggerValidationMessage};if(!s.meetsMinimums)return{success:!1,message:"Position too small",error:s.warnings.join(" ")};let o=parseFloat(t.triggerPrice);if(t.takeProfit){let g=parseFloat(t.takeProfit),h=X6(t.leverage),w=t.isLong?(g-o)/o*100:(o-g)/o*100;if(w<=0){let v=t.isLong?"above":"below";return{success:!1,message:"Invalid TP",error:`For ${t.isLong?"Long":"Short"} limit, TP must be ${v} trigger price ($${o}).`}}if(w>h)return{success:!1,message:"TP exceeds max",error:`Max TP for ${t.leverage}x is ${h}%.`}}if(t.stopLoss){let g=parseFloat(t.stopLoss);if(t.isLong?g>=o:g<=o){let w=t.isLong?"below":"above";return{success:!1,message:"Invalid SL",error:`For ${t.isLong?"Long":"Short"} limit, SL must be ${w} trigger price ($${o}).`}}}let i=ye(t.triggerPrice,18),u=ye(t.marginAmount,Ia(r)),d=ye(s.positionSize,10),l;try{l=await H2({symbol:t.symbol,isLong:t.isLong,amountIn:u,leverage:t.leverage,qty:d,triggerPrice:i,collateralToken:r,stopLoss:t.stopLoss?ye(t.stopLoss,18):0n,takeProfit:t.takeProfit?ye(t.takeProfit,18):0n},n)}catch(g){return{success:!1,message:"Execution build failed",error:g instanceof Error?g.message:"Failed to build execution"}}let p=F7[r],y={outflows:[{token:p,amount:u}],inflows:[]},m;if(r==="MON")m=await ds(e,{target:l.to,value:l.value,callData:l.data},{action:"open",protocol:"leverup",details:{operation:"limitOrder",symbol:t.symbol,side:t.isLong?"LONG":"SHORT",leverage:String(t.leverage),triggerPrice:t.triggerPrice,margin:t.marginAmount,collateral:r}},{tokenFlows:y});else{let g=F7[r];m=await j2(e,g,l.to,u,{target:l.to,value:l.value,callData:l.data},{action:"open",protocol:"leverup",details:{operation:"limitOrder",symbol:t.symbol,side:t.isLong?"LONG":"SHORT",leverage:String(t.leverage),triggerPrice:t.triggerPrice,margin:t.marginAmount,collateral:r}},{tokenFlows:y})}if(!m.success)return{success:!1,message:"Autonomous limit order failed",error:m.error};try{await ka(e,{ts:Date.now(),type:"limit_order",pair:a.pair,side:t.isLong?"LONG":"SHORT",margin:t.marginAmount,leverage:String(t.leverage),text:`Placed ${t.leverage}x ${t.isLong?"Long":"Short"} limit on ${t.symbol} @ $${t.triggerPrice}`,txHash:m.txHash,protocol:"leverup"})}catch{}try{D7(e,{pair:a.pair,side:t.isLong?"LONG":"SHORT",margin:u.toString(),collateralToken:p,leverage:t.leverage,entryPrice:t.triggerPrice,stopLoss:t.stopLoss||"0",takeProfit:t.takeProfit||"0",openedAt:Date.now(),status:"pending_fill"})}catch{}return{success:!0,message:`Successfully placed ${t.leverage}x ${t.isLong?"Long":"Short"} limit order on ${t.symbol} @ $${t.triggerPrice} (autonomous)`,txHash:m.txHash,explorerUrl:m.explorerUrl}}Y();Te();mt();We();Ar();M0();import{existsSync as NFe,readFileSync as LFe}from"fs";import{homedir as BFe}from"os";import UFe from"path";function u$(){let e=UFe.join(BFe(),".pragma","delegations","root","delegation.json");if(!NFe(e))return null;try{let t=LFe(e,"utf-8");return JSON.parse(t).signedDelegation??null}catch{return null}}function HFe(e){let t=e.caveats.find(n=>n.enforcer.toLowerCase()===b2.toLowerCase());if(!t)return 2;try{let[n]=ca([{type:"tuple[]",components:[{name:"caveats",type:"tuple[]",components:[{name:"enforcer",type:"address"},{name:"terms",type:"bytes"},{name:"args",type:"bytes"}]}]}],t.terms);return n.length}catch{return 2}}function FFe(e,t){let n=e.callData.toLowerCase();if(n.startsWith(cp.toLowerCase()))return j6.APPROVE;if(HFe(t)>=4){if((e.callData==="0x"||e.callData==="0x00")&&e.value>0n)return j6.NATIVE_TRANSFER;if(n.startsWith(Rne.toLowerCase()))return j6.ERC20_TRANSFER}return j6.TRADING}async function zn(e,t){let n=u$();if(!n)return{success:!1,message:"No delegation found",error:"Root delegation not found at ~/.pragma/delegations/root/delegation.json. Please run the delegation flow first (request_delegation \u2192 approve \u2192 retrieve_delegation)."};let r=structuredClone(n),a=FFe(e,n);$2(r,a);let s=await ht();if(!s)return{success:!1,message:"Session key not found",error:"File-based session key not found. Run setup_wallet first."};let o=t.network.chainId,i=await we(t),u=Ee(o,i),d=Qe(o),l=on(s),p=Tt({account:l,chain:u,transport:Ze(i,t)}),y=_e({chain:u,transport:Ze(i,t)});try{let m=await dn(p,y,Ue.delegationManager,[{permissionContext:[r],executions:[Pt({target:e.target,value:e.value,callData:e.callData})],mode:nn.SingleDefault}]);return(await Xt(y,m)).status==="reverted"?{success:!1,message:"Transaction reverted on-chain",txHash:m,explorerUrl:`${d.blockExplorer}/tx/${m}`,error:"Transaction reverted on-chain"}:{success:!0,message:"Transaction successful",txHash:m,explorerUrl:`${d.blockExplorer}/tx/${m}`}}catch(m){return{success:!1,message:"Transaction failed",error:m instanceof Error?m.message:"Unknown error"}}}function zFe(e){let t=e.toLowerCase();return Object.values(up).some(n=>n.toLowerCase()===t)}async function Vi(e,t,n,r,a){if(!zFe(t))return{success:!1,message:"Spender not whitelisted",error:`Spender ${t} is not whitelisted for headless approvals.`};let s=a.wallet.smartAccountAddress,o=a.network.chainId,i=await we(a),u=Ee(o,i),d=_e({chain:u,transport:Ze(i,a)}),l=!1;try{l=await d.readContract({address:e,abi:Xe,functionName:"allowance",args:[s,t]})>=n}catch{}if(!l){let p=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"),y=X({abi:Xe,functionName:"approve",args:[t,p]}),m=await zn({target:e,value:0n,callData:y},a);if(!m.success)return{success:!1,message:"Approval failed",error:`ERC20 approval failed: ${m.error}`};await new Promise(g=>setTimeout(g,1e3))}return await zn(r,a)}t0();Te();mt();var d$=500,zre=5e3,jFe=I.object({quoteIds:I.array(I.string()).min(1).describe("List of Quote IDs to execute. Pass multiple IDs for parallel batch execution."),slippageBps:I.number().optional().describe("Max slippage in basis points. NOTE: Slippage is already baked into the quote - set slippage at quote time via get_swap_quote instead."),agentId:I.string().optional().describe("Sub-agent ID for autonomous execution (no Touch ID). If omitted, uses assistant mode with Touch ID confirmation.")});function jre(e){e.tool("execute_swap","Execute one or more swaps. If agentId provided: uses autonomous mode (no Touch ID). If no agentId: uses assistant mode (requires Touch ID). Handles approvals automatically. Supports parallel batch execution.",jFe.shape,async t=>{let n=await qFe(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function qFe(e){try{let t=await q();if(!t||!Pe(t))return{success:!1,message:"Wallet not configured",results:[],summary:{total:0,successful:0,failed:0},error:"Please run setup_wallet first to create your pragma wallet"};if(e.agentId){let d=e.slippageBps??d$;return await Ure(e.agentId,e.quoteIds,d)}if(_t()){let d=[];for(let p of e.quoteIds){let y=await G6(p);if(!y){d.push({quoteId:p,success:!1,error:"Quote not found or expired. Get a fresh quote."});continue}if(ac(y)){d.push({quoteId:p,success:!1,error:"Quote expired. Get a fresh quote."});continue}let m=V5(p);if(!m){d.push({quoteId:p,success:!1,error:"Execution data missing. Get a fresh quote."});continue}let g=y.fromToken.address.toLowerCase()===B0.toLowerCase(),h;g?h=await zn({target:m.router,value:m.value,callData:m.calldata},t):h=await Vi(y.fromToken.address,m.router,y.amountInWei,{target:m.router,value:m.value,callData:m.calldata},t),d.push({quoteId:p,success:h.success,txHash:h.txHash,explorerUrl:h.explorerUrl,error:h.error,swap:{fromToken:y.fromToken.symbol,toToken:y.toToken.symbol,amountIn:`${y.amountIn} ${y.fromToken.symbol}`,amountOut:`${y.expectedOutput} ${y.toToken.symbol}`}})}let l=d.filter(p=>p.success).length;return{success:l>0,message:`Executed ${l}/${e.quoteIds.length} swaps`,results:d,summary:{total:e.quoteIds.length,successful:l,failed:e.quoteIds.length-l}}}for(let d of e.quoteIds){let l=await G6(d);if(!l)return{success:!1,message:"Quote validation failed",results:[],summary:{total:0,successful:0,failed:0},error:`Quote ${d} not found or expired. Please get a fresh quote.`};if(ac(l))return{success:!1,message:"Quote expired",results:[],summary:{total:0,successful:0,failed:0},error:`Quote ${d} has expired. Please get a fresh quote.`}}let n=e.slippageBps??d$;n>zre&&(n=zre),n<0&&(n=d$);let r=await N0e(e.quoteIds,n),s=Qe(t.network.chainId).blockExplorer||"https://monadvision.com",o=r.results.map(d=>({quoteId:d.quoteId,success:d.success,txHash:d.txHash,explorerUrl:d.txHash?`${s}/tx/${d.txHash}`:void 0,error:d.error,swap:d.quote?{fromToken:d.quote.fromToken.symbol,toToken:d.quote.toToken.symbol,amountIn:`${d.quote.amountIn} ${d.quote.fromToken.symbol}`,amountOut:`${d.quote.expectedOutput} ${d.quote.toToken.symbol}`}:void 0})),i=o.filter(d=>d.success).length,u=o.filter(d=>!d.success).length;return{success:i>0,message:`Executed ${i}/${e.quoteIds.length} swaps`,results:o,summary:{total:e.quoteIds.length,successful:i,failed:u}}}catch(t){let n=t instanceof Error?t.message:"Unknown error";return{success:!1,message:"Batch execution failed",results:[],summary:{total:0,successful:0,failed:0},error:n}}}Y();Y();M0();Te();mt();We();Ar();function GFe(e){return e.toUpperCase().trim()==="MON"||e.toLowerCase()===B0.toLowerCase()}async function qre(e){let t=await q();if(!t?.wallet)throw new Error("Wallet not configured. Please run setup_wallet first.");let n=t.wallet.smartAccountAddress,r=t.wallet.sessionKeyAddress,a=t.network.chainId,s=GFe(e.token),o,i,u;if(s)o="MON",i=18,u=B0;else{let D=await is(e.token,a);if(!D)throw new Error(`Token not found: ${e.token}. Please provide a valid symbol or address.`);D.kind==="native"?(o="MON",i=18,u=B0):(o=D.symbol,i=D.decimals,u=D.address)}let d=ye(e.amount,i);if(d<=0n)throw new Error("Amount must be greater than 0");let l=await we(t),p=Ee(a,l),y=_e({chain:p,transport:Ze(l,t)});if(s||u===B0){let D=await y.getBalance({address:n});if(D<d){let G=Ge(D);throw new Error(`Insufficient MON balance. Have: ${G} MON, Need: ${e.amount} MON`)}}else{let D=await y.readContract({address:u,abi:Xe,functionName:"balanceOf",args:[n]});if(D<d){let G=le(D,i);throw new Error(`Insufficient ${o} balance. Have: ${G}, Need: ${e.amount}`)}}let m=await ht();if(!m)throw new Error("Session key not found. Please run setup_wallet first.");let g=await y.getBalance({address:r}),h=lo("transfer");if(g<h)throw new Error(`Session key balance too low: ${G0(g)} (minimum for transfer: ${G0(h)}). Please call fund_session_key first with operationType: "transfer".`);let w=await Tn(y,n),v;if(s||u===B0)v={delegation:k7({recipient:e.to,amount:d,delegator:n,sessionKey:r,nonce:w,chainId:a}).delegation,execution:{target:e.to,value:d,callData:"0x"},kind:"transfer"};else{let D=E7({tokenAddress:u,recipient:e.to,amount:d,delegator:n,sessionKey:r,nonce:w,chainId:a}),G=X({abi:Xe,functionName:"transfer",args:[e.to,d]});v={delegation:D.delegation,execution:{target:u,value:0n,callData:G},kind:"transfer"}}let T=t.wallet.keyId;if(!T)throw new Error("Key ID not found in config. Please run setup_wallet first.");let A=`${e.to.slice(0,8)}...${e.to.slice(-6)}`,_=`Transfer ${e.amount} ${o} to ${A}`,E=await _n(v.delegation,a,T,_);v.delegation.signature=E;let O=on(m),$=Tt({account:O,chain:p,transport:Ze(l,t)}),B=Pt({target:v.execution.target,value:v.execution.value,callData:v.execution.callData}),V=await dn($,y,Ue.delegationManager,[{permissionContext:[v.delegation],executions:[B],mode:nn.SingleDefault}]);return await Xt(y,V),{txHash:V,status:"success",token:{symbol:o,address:u,isNative:s||u===B0},recipient:e.to,amount:e.amount,amountWei:d}}t0();Te();mt();var VFe=I.object({token:I.string().describe("Token to transfer: 'MON' for native, or symbol like 'USDC', 'WMON', or contract address (0x...)"),to:I.string().describe("Recipient address (0x...)"),amount:I.string().describe("Amount to transfer in human-readable format (e.g., '1.5' for 1.5 tokens)"),agentId:I.string().optional().describe("Sub-agent ID for autonomous execution (no Touch ID). If omitted, uses assistant mode with Touch ID confirmation.")});function Gre(e){e.tool("transfer","Transfer tokens to another address. Supports both native MON and ERC20 tokens. If agentId provided: uses autonomous mode (no Touch ID). If no agentId: uses assistant mode (requires Touch ID). Always verify the recipient address with the user before executing.",VFe.shape,async t=>{let n=await WFe(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function WFe(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){if(!e.to||!Se(e.to))return{success:!1,message:"Invalid recipient address",error:"Please provide a valid recipient address (0x...)"};let u=await Ore(e.agentId,e.token,xe(e.to),e.amount);return{success:u.success,message:u.message,transaction:u.txHash?{hash:u.txHash,explorerUrl:u.explorerUrl,status:"success"}:void 0,transfer:u.transfer?{token:u.transfer.token,tokenAddress:u.transfer.isNative?"native":u.transfer.token,isNative:u.transfer.isNative,recipient:u.transfer.recipient,amount:u.transfer.amount}:void 0,error:u.error}}if(_t()){if(!e.to||!Se(e.to))return{success:!1,message:"Invalid recipient address",error:"Please provide a valid recipient address (0x...)"};let u=xe(e.to),d=t.network.chainId,l=e.token.toUpperCase()==="MON"||e.token.toLowerCase()===B0.toLowerCase(),p,y,m,g;if(l){let v=ye(e.amount,18);p=u,y=v,m="0x",g="MON"}else{let v=await is(e.token,d);if(!v)return{success:!1,message:"Token not found",error:`Token not found: ${e.token}`};let T=ye(e.amount,v.decimals);p=v.address,y=0n,m=X({abi:Xe,functionName:"transfer",args:[u,T]}),g=v.symbol}let h=await zn({target:p,value:y,callData:m},t),w=Qe(d);return{success:h.success,message:h.success?`Transferred ${e.amount} ${g} to ${u}`:h.message,transaction:h.txHash?{hash:h.txHash,explorerUrl:h.explorerUrl||`${w.blockExplorer}/tx/${h.txHash}`,status:"success"}:void 0,transfer:h.success?{token:g,tokenAddress:l?"native":p,isNative:l,recipient:u,amount:e.amount}:void 0,error:h.error}}if(!e.to||!Se(e.to))return{success:!1,message:"Invalid recipient address",error:"Please provide a valid recipient address (0x...)"};let n=xe(e.to),r=parseFloat(e.amount);if(isNaN(r)||r<=0)return{success:!1,message:"Invalid amount",error:"Please provide a valid amount greater than 0"};let a=await qre({token:e.token,to:n,amount:e.amount}),s=Qe(t.network.chainId),o=s.blockExplorer?`${s.blockExplorer}/tx/${a.txHash}`:`https://monadvision.com/tx/${a.txHash}`,i=a.token.isNative?"native MON":a.token.symbol;return{success:!0,message:`Transferred ${e.amount} ${i} to ${n}`,transaction:{hash:a.txHash,explorerUrl:o,status:a.status},transfer:{token:a.token.symbol,tokenAddress:a.token.address,isNative:a.token.isNative,recipient:n,amount:e.amount}}}catch(t){let n=t instanceof Error?t.message:"Unknown error";return n.includes("Touch ID")||n.includes("authentication")?{success:!1,message:"Authentication required",error:"Touch ID authentication was cancelled or failed. Please try again."}:n.includes("insufficient")||n.includes("balance")?{success:!1,message:"Insufficient balance",error:n}:n.includes("nonce")?{success:!1,message:"Nonce error",error:"A delegation was already used. Please try again."}:n.includes("reverted")?{success:!1,message:"Transaction reverted",error:`The transfer transaction was reverted: ${n}`}:{success:!1,message:"Transfer failed",error:n}}}Y();M0();Te();mt();We();Ar();var Vre=[{type:"function",name:"deposit",inputs:[],outputs:[],stateMutability:"payable"},{type:"function",name:"withdraw",inputs:[{name:"wad",type:"uint256"}],outputs:[],stateMutability:"nonpayable"}];async function Wre(e){let t=await q();if(!t?.wallet)throw new Error("Wallet not configured. Please run setup_wallet first.");let n=t.wallet.smartAccountAddress,r=t.wallet.sessionKeyAddress,a=t.network.chainId,o=Qe(a).tokens.wmon;if(!o)throw new Error(`WMON address not configured for chain ${a}`);let i=ye(e.amount,18);if(i<=0n)throw new Error("Amount must be greater than 0");let u=await we(t),d=Ee(a,u),l=_e({chain:d,transport:Ze(u,t)}),p=await l.getBalance({address:n});if(p<i){let D=le(p,18);throw new Error(`Insufficient MON balance. Have: ${D} MON, Need: ${e.amount} MON`)}let y=await ht();if(!y)throw new Error("Session key not found. Please run setup_wallet first.");let m=await l.getBalance({address:r}),g=lo("wrap");if(m<g)throw new Error(`Session key balance too low: ${G0(m)} (minimum for wrap: ${G0(g)}). Please call fund_session_key first with operationType: "wrap".`);let h=await Tn(l,n),w=S0e({wmonAddress:o,amount:i,delegator:n,sessionKey:r,nonce:h,chainId:a}),v=X({abi:Vre,functionName:"deposit"}),T={delegation:w.delegation,execution:{target:o,value:i,callData:v},kind:"wrap"},A=t.wallet.keyId;if(!A)throw new Error("Key ID not found in config. Please run setup_wallet first.");let _=`Wrap ${e.amount} MON \u2192 WMON`,E=await _n(T.delegation,a,A,_);T.delegation.signature=E;let O=on(y),$=Tt({account:O,chain:d,transport:Ze(u,t)}),B=Pt({target:T.execution.target,value:T.execution.value,callData:T.execution.callData}),V=await dn($,l,Ue.delegationManager,[{permissionContext:[T.delegation],executions:[B],mode:nn.SingleDefault}]);return await Xt(l,V),{txHash:V,status:"success",amount:e.amount,amountWei:i,direction:"wrap"}}async function Zre(e){let t=await q();if(!t?.wallet)throw new Error("Wallet not configured. Please run setup_wallet first.");let n=t.wallet.smartAccountAddress,r=t.wallet.sessionKeyAddress,a=t.network.chainId,o=Qe(a).tokens.wmon;if(!o)throw new Error(`WMON address not configured for chain ${a}`);let i=ye(e.amount,18);if(i<=0n)throw new Error("Amount must be greater than 0");let u=await we(t),d=Ee(a,u),l=_e({chain:d,transport:Ze(u,t)}),p=await l.readContract({address:o,abi:Xe,functionName:"balanceOf",args:[n]});if(p<i){let D=le(p,18);throw new Error(`Insufficient WMON balance. Have: ${D} WMON, Need: ${e.amount} WMON`)}let y=await ht();if(!y)throw new Error("Session key not found. Please run setup_wallet first.");let m=await l.getBalance({address:r}),g=lo("unwrap");if(m<g)throw new Error(`Session key balance too low: ${G0(m)} (minimum for unwrap: ${G0(g)}). Please call fund_session_key first with operationType: "unwrap".`);let h=await Tn(l,n),w=A0e({wmonAddress:o,delegator:n,sessionKey:r,nonce:h,chainId:a}),v=X({abi:Vre,functionName:"withdraw",args:[i]}),T={delegation:w.delegation,execution:{target:o,value:0n,callData:v},kind:"unwrap"},A=t.wallet.keyId;if(!A)throw new Error("Key ID not found in config. Please run setup_wallet first.");let _=`Unwrap ${e.amount} WMON \u2192 MON`,E=await _n(T.delegation,a,A,_);T.delegation.signature=E;let O=on(y),$=Tt({account:O,chain:d,transport:Ze(u,t)}),B=Pt({target:T.execution.target,value:T.execution.value,callData:T.execution.callData}),V=await dn($,l,Ue.delegationManager,[{permissionContext:[T.delegation],executions:[B],mode:nn.SingleDefault}]);return await Xt(l,V),{txHash:V,status:"success",amount:e.amount,amountWei:i,direction:"unwrap"}}t0();Te();mt();Y();var ZFe=I.object({amount:I.string().describe("Amount of MON to wrap in human-readable format (e.g., '10' for 10 MON)"),agentId:I.string().optional().describe("Sub-agent ID for autonomous execution (no Touch ID). If omitted, uses assistant mode with Touch ID confirmation.")}),KFe=I.object({amount:I.string().describe("Amount of WMON to unwrap in human-readable format (e.g., '10' for 10 WMON)"),agentId:I.string().optional().describe("Sub-agent ID for autonomous execution (no Touch ID). If omitted, uses assistant mode with Touch ID confirmation.")});function Kre(e){e.tool("wrap","Wrap MON to WMON. If agentId provided: uses autonomous mode (no Touch ID). If no agentId: uses assistant mode (requires Touch ID). WMON is useful for DeFi operations that require ERC20 tokens.",ZFe.shape,async t=>{let n=await XFe(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}function Xre(e){e.tool("unwrap","Unwrap WMON back to MON. If agentId provided: uses autonomous mode (no Touch ID). If no agentId: uses assistant mode (requires Touch ID). Converts wrapped MON back to native MON.",KFe.shape,async t=>{let n=await JFe(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function XFe(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){let o=await Lre(e.agentId,e.amount),i=Qe(t.network.chainId);return{success:o.success,message:o.message,transaction:o.txHash?{hash:o.txHash,explorerUrl:o.explorerUrl||`${i.blockExplorer}/tx/${o.txHash}`,status:"success"}:void 0,wrap:o.wrap?{direction:o.wrap.direction,amount:o.wrap.amount,from:"MON",to:"WMON"}:void 0,error:o.error}}if(_t()){let o=pa(e.amount),i=X({abi:[{type:"function",name:"deposit",inputs:[],outputs:[],stateMutability:"payable"}],functionName:"deposit"}),u=await zn({target:_r,value:o,callData:i},t),d=Qe(t.network.chainId);return{success:u.success,message:u.success?`Wrapped ${e.amount} MON \u2192 WMON`:u.message,transaction:u.txHash?{hash:u.txHash,explorerUrl:u.explorerUrl||`${d.blockExplorer}/tx/${u.txHash}`,status:"success"}:void 0,wrap:u.success?{direction:"wrap",amount:e.amount,from:"MON",to:"WMON"}:void 0,error:u.error}}let n=parseFloat(e.amount);if(isNaN(n)||n<=0)return{success:!1,message:"Invalid amount",error:"Please provide a valid amount greater than 0"};let r=await Wre({amount:e.amount}),a=Qe(t.network.chainId),s=a.blockExplorer?`${a.blockExplorer}/tx/${r.txHash}`:`https://monadvision.com/tx/${r.txHash}`;return{success:!0,message:`Wrapped ${e.amount} MON \u2192 WMON`,transaction:{hash:r.txHash,explorerUrl:s,status:r.status},wrap:{direction:"wrap",amount:e.amount,from:"MON",to:"WMON"}}}catch(t){let n=t instanceof Error?t.message:"Unknown error";return n.includes("Touch ID")||n.includes("authentication")?{success:!1,message:"Authentication required",error:"Touch ID authentication was cancelled or failed. Please try again."}:n.includes("insufficient")||n.includes("balance")?{success:!1,message:"Insufficient balance",error:n}:n.includes("nonce")?{success:!1,message:"Nonce error",error:"A delegation was already used. Please try again."}:n.includes("reverted")?{success:!1,message:"Transaction reverted",error:`The wrap transaction was reverted: ${n}`}:{success:!1,message:"Wrap failed",error:n}}}async function JFe(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){let o=await Bre(e.agentId,e.amount),i=Qe(t.network.chainId);return{success:o.success,message:o.message,transaction:o.txHash?{hash:o.txHash,explorerUrl:o.explorerUrl||`${i.blockExplorer}/tx/${o.txHash}`,status:"success"}:void 0,wrap:o.wrap?{direction:o.wrap.direction,amount:o.wrap.amount,from:"WMON",to:"MON"}:void 0,error:o.error}}if(_t()){let o=pa(e.amount),i=X({abi:[{type:"function",name:"withdraw",inputs:[{name:"wad",type:"uint256"}],outputs:[],stateMutability:"nonpayable"}],functionName:"withdraw",args:[o]}),u=await zn({target:_r,value:0n,callData:i},t),d=Qe(t.network.chainId);return{success:u.success,message:u.success?`Unwrapped ${e.amount} WMON \u2192 MON`:u.message,transaction:u.txHash?{hash:u.txHash,explorerUrl:u.explorerUrl||`${d.blockExplorer}/tx/${u.txHash}`,status:"success"}:void 0,wrap:u.success?{direction:"unwrap",amount:e.amount,from:"WMON",to:"MON"}:void 0,error:u.error}}let n=parseFloat(e.amount);if(isNaN(n)||n<=0)return{success:!1,message:"Invalid amount",error:"Please provide a valid amount greater than 0"};let r=await Zre({amount:e.amount}),a=Qe(t.network.chainId),s=a.blockExplorer?`${a.blockExplorer}/tx/${r.txHash}`:`https://monadvision.com/tx/${r.txHash}`;return{success:!0,message:`Unwrapped ${e.amount} WMON \u2192 MON`,transaction:{hash:r.txHash,explorerUrl:s,status:r.status},wrap:{direction:"unwrap",amount:e.amount,from:"WMON",to:"MON"}}}catch(t){let n=t instanceof Error?t.message:"Unknown error";return n.includes("Touch ID")||n.includes("authentication")?{success:!1,message:"Authentication required",error:"Touch ID authentication was cancelled or failed. Please try again."}:n.includes("insufficient")||n.includes("balance")?{success:!1,message:"Insufficient balance",error:n}:n.includes("nonce")?{success:!1,message:"Nonce error",error:"A delegation was already used. Please try again."}:n.includes("reverted")?{success:!1,message:"Transaction reverted",error:`The unwrap transaction was reverted: ${n}`}:{success:!1,message:"Unwrap failed",error:n}}}Y();Te();mt();We();w8();var QFe=I.object({operationType:I.enum(["swap","transfer","wrap","unwrap"]).optional().describe("Type of operation to check balance for. Each operation has different gas costs: swap=0.14 MON, transfer/wrap/unwrap=0.04 MON"),estimatedOperations:I.number().optional().describe("Number of operations planned. Combined with operationType for accurate calculation. Examples: 1 swap = 0.16 MON needed, 3 swaps = 0.44 MON needed"),includeUsdc:I.boolean().optional().describe("Also check USDC balance for x402 payments. Auto-enabled when x402 mode is detected. Set to true to always include USDC info.")});function Jre(e){e.tool("check_session_key_balance","Check if session key has enough MON for gas and USDC for x402 payments. Pass operationType and estimatedOperations for accurate calculation. Returns current balance, required amount, and whether funding is needed. USDC balance is auto-checked in x402 mode.",QFe.shape,async t=>{let n=await YFe(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function YFe(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=t.wallet?.sessionKeyAddress;if(!n)return{success:!1,message:"Session key not found",error:"Session key address is not configured"};let r=await we(t),a=Ee(t.network.chainId,r),s=_e({chain:a,transport:gt(r,Ot(t))}),o=await T2(n,s,e.operationType,e.estimatedOperations),i;if((e.includeUsdc===!0||e.includeUsdc!==!1&&t.mode==="x402")&&RZ(t.network.chainId))try{let p=await PZ(n,s,t.network.chainId),y=p<kZ,m=p<CZ;i={balance:p.toString(),balanceFormatted:fI(p),needsFunding:y,lowBalanceWarning:m,recommendedAmount:y?fI(IZ):"0 USDC"}}catch(p){console.warn("Failed to check USDC balance:",p)}let d=e.operationType&&e.estimatedOperations?`${e.estimatedOperations} ${e.operationType} operation(s)`:e.estimatedOperations?`${e.estimatedOperations} operation(s)`:"general operations",l;return o.needsFunding?l=`Session key needs MON funding for ${d}`:l=`Session key has sufficient MON for ${d}`,i?.needsFunding?l+=`. USDC balance low (${i.balanceFormatted}) - fund with token="USDC"`:i?.lowBalanceWarning&&(l+=`. USDC balance warning: ${i.balanceFormatted}`),o.needsFunding?{success:!0,message:l,balance:{address:n,current:`${o.balanceFormatted} MON`,currentWei:o.balance.toString(),required:`${o.requiredBalanceFormatted} MON`,requiredWei:o.requiredBalance.toString()},funding:{needsFunding:!0,recommendedAmount:G0(o.recommendedFundingAmount),recommendedAmountWei:o.recommendedFundingAmount.toString(),fundingMethod:o.fundingMethod},usdc:i}:{success:!0,message:l,balance:{address:n,current:`${o.balanceFormatted} MON`,currentWei:o.balance.toString(),required:`${o.requiredBalanceFormatted} MON`,requiredWei:o.requiredBalance.toString()},funding:{needsFunding:!1,recommendedAmount:"0 MON",recommendedAmountWei:"0",fundingMethod:o.fundingMethod},usdc:i}}catch(t){return{success:!1,message:"Failed to check session key balance",error:t instanceof Error?t.message:"Unknown error"}}}Y();Te();mt();Y();We();Ar();m0();M0();Te();w8();var eze=[{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"}],l$=500000n,p$=400000n,m$=100000n;async function tze(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:"bundler-gas-price"})}function f$(e){if(!(!e||e==="0x"))try{let t=BigInt(e);return t>0n?t:void 0}catch{return}}async function nze(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:f$(s.callGasLimit),verificationGasLimit:f$(s.verificationGasLimit),preVerificationGas:f$(s.preVerificationGas)}},{operationName:"bundler-estimate-gas"})}function rze(e,t){e.callGasLimit=t.callGasLimit&&t.callGasLimit>m$?t.callGasLimit:m$,e.verificationGasLimit=t.verificationGasLimit&&t.verificationGasLimit>l$?t.verificationGasLimit:l$,e.preVerificationGas=t.preVerificationGas&&t.preVerificationGas>p$?t.preVerificationGas:p$}async function aze(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 sze(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)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 Qre(e){let{handle:t,sessionKeyAddress:n,publicClient:r,config:a,fundingAmount:s=op}=e,o=await r.getBalance({address:n}),i=t.chain.id,u=await Tn(r,t.address),d=k7({recipient:n,amount:s,delegator:t.address,sessionKey:n,nonce:u,chainId:i}),l=`Fund session key: ${Ge(s)} MON (delegation)`,p=await _n(d.delegation,i,t.keyId,l);d.delegation.signature=p;let y=Pt({target:n,value:s,callData:"0x"}),m=await ht();if(!m)throw new Error("Session key not found");let g=on(m),h=await we(a),w=Tt({account:g,chain:t.chain,transport:Ze(h,a)}),v=await dn(w,r,Ue.delegationManager,[{permissionContext:[d.delegation],executions:[y],mode:nn.SingleDefault}]);await Xt(r,v),await new Promise(A=>setTimeout(A,2e3));let T=await r.getBalance({address:n});return{userOpHash:"0x",transactionHash:v,newBalance:T,fundedAmount:T-o}}async function Yre(e){let{handle:t,sessionKeyAddress:n,publicClient:r,config:a,fundingAmount:s=0n}=e,o=t.chain.id,i=A5[o];if(!i)throw new Error(`USDC not configured for chain ${o}`);let u=await Tn(r,t.address),d=E7({tokenAddress:i,recipient:n,amount:s,delegator:t.address,sessionKey:n,nonce:u,chainId:o}),l=`Fund session key: ${le(s,x8)} USDC (delegation)`,p=await _n(d.delegation,o,t.keyId,l);d.delegation.signature=p;let y=Pt({target:i,value:0n,callData:X({abi:Xe,functionName:"transfer",args:[n,s]})}),m=await ht();if(!m)throw new Error("Session key not found");let g=on(m),h=await we(a),w=Tt({account:g,chain:t.chain,transport:Ze(h,a)}),v=await dn(w,r,Ue.delegationManager,[{permissionContext:[d.delegation],executions:[y],mode:nn.SingleDefault}]);return await Xt(r,v),{userOpHash:"0x",transactionHash:v,newBalance:0n,fundedAmount:s}}async function eae(e){let{handle:t,sessionKeyAddress:n,publicClient:r,bundlerUrl:a,fundingAmount:s=op,customExecution:o}=e;if(!a)throw new Error("Bundler URL required for UserOp path");let i=await r.getBalance({address:n}),d=X({abi:eze,functionName:"execute",args:[o??{target:n,value:s,callData:"0x"}]}),l=await t.smartAccount.getNonce?.()??0n,p=await tze(a),y={sender:t.address,nonce:l,callData:d,callGasLimit:m$,verificationGasLimit:l$,preVerificationGas:p$,maxFeePerGas:p.maxFeePerGas,maxPriorityFeePerGas:p.maxPriorityFeePerGas,signature:"0x"},m=t.smartAccount.entryPoint.address;try{let A=Jo({...y,signature:"0x"}),_=await nze(a,A,m);rze(y,_)}catch(A){console.warn("Failed to estimate gas, using defaults:",A)}let g=await t.smartAccount.signUserOperation(y);y.signature=g;let h=Jo({...y,signature:g}),w=await aze(a,h,m),v=await sze(a,w);await new Promise(A=>setTimeout(A,2e3));let T=await r.getBalance({address:n});return{userOpHash:w,transactionHash:v.transactionHash,newBalance:T,fundedAmount:T-i}}t0();We();w8();var oze=I.object({operationType:I.enum(["swap","transfer","wrap","unwrap"]).optional().describe("Type of operation to fund for. IMPORTANT: Always specify this for accurate gas calculation! Each operation has different gas costs: swap=0.14 MON, transfer/wrap/unwrap=0.04 MON"),estimatedOperations:I.number().optional().describe("Number of operations planned. Combined with operationType for accurate calculation. Examples: 1 swap = 0.16 MON needed, 3 swaps = 0.44 MON needed"),token:I.enum(["MON","USDC"]).optional().describe("Token to fund session key with. MON for gas (default), USDC for x402 payments. USDC funding requires specifying amount."),amount:I.string().optional().describe("Amount to fund (e.g., '10' for 10 MON or 10 USDC). If not specified for MON, uses intelligent calculation based on operations.")});function tae(e){e.tool("fund_session_key","Fund session key with MON (for gas) or USDC (for x402 payments) from smart account. Supports UserOp (when session key has < 0.02 MON) and Delegation methods. Pass operationType for MON, token='USDC' with amount for x402. On macOS: requires Touch ID. On headless/OpenClaw: uses root delegation automatically.",oze.shape,async t=>{let n=await ize(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function ize(e){try{let t=await q();if(!t?.wallet)return{success:!1,message:"Wallet not configured",error:"Please run setup_wallet first to create your pragma wallet"};let n=t.wallet.sessionKeyAddress,r=t.network.chainId;if(_t())return cze(e,t,n,r);let a=await we(t),s=Ee(r,a),o=_e({chain:s,transport:gt(a,Ot(t))});if(e.token==="USDC"){if(!e.amount)return{success:!1,message:"Amount required for USDC funding",error:"Please specify the amount of USDC to fund (e.g., amount: '1.0')"};let g=ye(e.amount,6),h=`Fund session key with ${e.amount} USDC (delegation)`,w=await j5(t,{touchIdMessage:h}),v=await Yre({handle:w,sessionKeyAddress:n,publicClient:o,config:t,fundingAmount:g});return{success:!0,message:`Session key funded with ${e.amount} USDC via delegation`,funding:{token:"USDC",method:"delegation",fundedAmount:`${e.amount} USDC`,fundedAmountWei:g.toString(),newBalance:"unknown",newBalanceWei:"0",txHash:v.transactionHash||"0x"}}}let i=await T2(n,o,e.operationType,e.estimatedOperations),u=e.amount&&e.amount.trim()!=="";if(!u&&!i.needsFunding)return{success:!0,message:"Session key already has sufficient balance",funding:{token:"MON",method:i.fundingMethod,fundedAmount:"0 MON",fundedAmountWei:"0",newBalance:i.balanceFormatted,newBalanceWei:i.balance.toString(),txHash:"0x"}};let d=u?ye(e.amount,18):i.recommendedFundingAmount,l=i.fundingMethod,p=`Fund session key: ${Ge(d)} MON (${l})`,y=await j5(t,{touchIdMessage:p}),m;return l==="delegation"?m=await Qre({handle:y,sessionKeyAddress:n,publicClient:o,config:t,fundingAmount:d}):m=await eae({handle:y,sessionKeyAddress:n,publicClient:o,config:t,bundlerUrl:await Ol(t),fundingAmount:d}),{success:!0,message:`Session key funded with ${Ge(m.fundedAmount)} MON via ${l}`,funding:{token:"MON",method:l,fundedAmount:`${Ge(m.fundedAmount)} MON`,fundedAmountWei:m.fundedAmount.toString(),newBalance:`${Ge(m.newBalance)} MON`,newBalanceWei:m.newBalance.toString(),txHash:m.transactionHash||m.userOpHash}}}catch(t){return{success:!1,message:"Session key funding failed",error:t instanceof Error?t.message:"Unknown error"}}}async function cze(e,t,n,r){try{let a=Qe(r),s=await we(t),o=Ee(r,s),i=_e({chain:o,transport:gt(s,Ot(t))});if(e.token==="USDC"){if(!e.amount)return{success:!1,message:"Amount required for USDC funding",error:"Please specify the amount of USDC to fund (e.g., amount: '1.0')"};let m=A5[r];if(!m)return{success:!1,message:"USDC not configured",error:`USDC not found for chain ${r}`};let g=ye(e.amount,x8),h=X({abi:[{type:"function",name:"transfer",stateMutability:"nonpayable",inputs:[{name:"to",type:"address"},{name:"amount",type:"uint256"}],outputs:[{name:"",type:"bool"}]}],functionName:"transfer",args:[n,g]}),w=await zn({target:m,value:0n,callData:h},t);return w.success?{success:!0,message:`Session key funded with ${e.amount} USDC via delegation (headless)`,funding:{token:"USDC",method:"delegation",fundedAmount:`${e.amount} USDC`,fundedAmountWei:g.toString(),newBalance:"unknown",newBalanceWei:"0",txHash:w.txHash||"0x"}}:{success:!1,message:"USDC funding failed",error:w.error}}let u=await T2(n,i,e.operationType,e.estimatedOperations),d=e.amount&&e.amount.trim()!=="";if(!d&&!u.needsFunding)return{success:!0,message:"Session key already has sufficient balance",funding:{token:"MON",method:"delegation",fundedAmount:"0 MON",fundedAmountWei:"0",newBalance:u.balanceFormatted,newBalanceWei:u.balance.toString(),txHash:"0x"}};let l=d?ye(e.amount,18):u.recommendedFundingAmount,p=await zn({target:n,value:l,callData:"0x"},t);if(!p.success)return{success:!1,message:"MON funding failed",error:p.error};await new Promise(m=>setTimeout(m,2e3));let y=await i.getBalance({address:n});return{success:!0,message:`Session key funded with ${Ge(l)} MON via delegation (headless)`,funding:{token:"MON",method:"delegation",fundedAmount:`${Ge(l)} MON`,fundedAmountWei:l.toString(),newBalance:`${Ge(y)} MON`,newBalanceWei:y.toString(),txHash:p.txHash||"0x"}}}catch(a){return{success:!1,message:"Session key funding failed (headless)",error:a instanceof Error?a.message:"Unknown error"}}}Te();var uze=I.object({includeApi:I.boolean().optional().describe("Include tokens from Data API in addition to static list (default: true)")});function nae(e){e.tool("list_verified_tokens","List all verified/trusted tokens available for trading. Use to discover tokens or answer 'what tokens can I trade?'. Returns 23+ tokens from static verified list plus any additional from Data API.",uze.shape,async t=>{let n=await dze(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function dze(e){let t=e.includeApi!==!1,n=["static-verified-list"],r=q5.length,a=0,s=new Map;for(let i of q5)s.set(i.address.toLowerCase(),{symbol:i.symbol,name:i.name,address:i.address,decimals:i.decimals,categories:i.categories});if(t)try{let i=await q();if(i?.network?.chainId){await w7(i.network.chainId);for(let u of Yne())s.has(u.address.toLowerCase())||(s.set(u.address.toLowerCase(),{symbol:u.symbol,name:u.name,address:u.address,decimals:u.decimals,categories:u.categories}),a++);a>0&&n.push("data-api")}}catch{}let o=Array.from(s.values());return o.sort((i,u)=>i.symbol==="MON"?-1:u.symbol==="MON"?1:i.symbol==="WMON"?-1:u.symbol==="WMON"?1:i.symbol.localeCompare(u.symbol)),{success:!0,message:`Found ${o.length} verified tokens (${r} static + ${a} from API)`,tokens:o,sources:n,counts:{total:o.length,staticList:r,fromApi:a}}}Te();var fze=I.object({mode:I.enum(["byok","x402"]).describe("Mode to switch to. 'byok' (Bring Your Own Keys) = free, you provide API keys. 'x402' = pay per API call with USDC, no keys needed.")});function rae(e){e.tool("set_mode","Switch between BYOK mode (free, provide your own API keys) and x402 mode (pay per API call with USDC). In x402 mode, all API calls go through the x402 proxy and are paid with USDC from your session key.",fze.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)return{success:!1,message:"Config not found",error:"Please run setup_wallet first to create your pragma wallet"};let n=e.mode;if(t.mode===n)return{success:!0,message:`Already in ${n} mode`,mode:n};t.mode=n,await Ml(t);let r=n==="x402"?["Ensure your session key has USDC for API payments","Check your session key balance","Fund your session key with USDC if needed"]:["Configure your API providers using /pragma:providers","Required: RPC endpoint URL","Required: Bundler for transactions","Optional: Quote and data providers for trading"];return{success:!0,message:`Switched to ${n} mode`,mode:n,nextSteps:r}}catch(t){return{success:!1,message:"Failed to switch mode",error:t instanceof Error?t.message:"Unknown error"}}}Te();mt();var pze=I.object({});function aae(e){e.tool("get_account_info","Get pragma wallet and account configuration. Returns smart account address, session key address, network info, and current mode (BYOK vs x402). Use to verify wallet setup or show user their account details.",pze.shape,async()=>{let t=await mze();return{content:[{type:"text",text:JSON.stringify(t,null,2)}]}})}async function mze(){try{let e=await q();if(!e)return{success:!1,message:"Wallet not initialized",status:{walletConfigured:!1,providersConfigured:!1},error:"No pragma configuration found. Run setup_wallet to create your wallet."};let t=Pe(e),n=Qe(e.network.chainId),r=e.mode==="byok"?!!(e.providers&&((e.providers.quote?.length??0)>0||(e.providers.data?.length??0)>0)):!0;return t?{success:!0,message:`Pragma wallet on ${n.displayName} (${e.mode} mode)`,account:{smartAccountAddress:e.wallet.smartAccountAddress,sessionKeyAddress:e.wallet.sessionKeyAddress,keyId:e.wallet.keyId},network:{chainId:e.network.chainId,chainName:n.displayName,nativeCurrency:n.nativeCurrency.symbol,blockExplorer:n.blockExplorer},mode:e.mode,providers:e.mode==="byok"?e.providers:void 0,status:{walletConfigured:!0,providersConfigured:e.mode==="x402"||r}}:{success:!0,message:"Wallet partially configured - missing wallet addresses",network:{chainId:e.network.chainId,chainName:n.displayName,nativeCurrency:n.nativeCurrency.symbol,blockExplorer:n.blockExplorer},mode:e.mode,providers:e.mode==="byok"?e.providers:void 0,status:{walletConfigured:!1,providersConfigured:r}}}catch(e){let t=e instanceof Error?e.message:"Unknown error";return{success:!1,message:"Failed to load account info",status:{walletConfigured:!1,providersConfigured:!1},error:t}}}Te();mt();var bze=I.object({token:I.string().describe("Token symbol (e.g., 'MON', 'USDC', 'WMON') or contract address (e.g., '0x123...'). Use this to look up token details before trading or to verify token information.")});function sae(e){e.tool("get_token_info","Get detailed information about a token by symbol or address. Returns symbol, name, decimals, contract address, USD price, and verification status. Use to look up token details or verify a token before trading.",bze.shape,async t=>{let n=await yze(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function yze(e){try{let t=await q();if(!t)return{success:!1,message:"Wallet not configured",error:"Please run setup_wallet first to configure pragma."};let n=t.network.chainId,r=Qe(n),a=e.token.trim(),s=!!(fp(a)||a.startsWith("0x")&&v7(a)),o=await is(e.token,n);if(!o)return{success:!1,message:"Token not found",network:{chainId:n,chainName:r.displayName},error:`Could not find token '${e.token}'. It may not exist on ${r.displayName} or the symbol/address is incorrect.`};let i;try{i=await w2(o.address,n)}catch{}return{success:!0,message:`${o.symbol} (${o.name})`,token:{symbol:o.symbol,name:o.name,address:o.address,decimals:o.decimals,kind:o.kind,verified:s,usdPrice:i?`$${i.toFixed(6)}`:void 0,categories:o.categories?.length?o.categories:void 0,logoURI:o.logoURI},network:{chainId:n,chainName:r.displayName}}}catch(t){return{success:!1,message:"Failed to fetch token info",error:t instanceof Error?t.message:"Unknown error"}}}Y();T6();Te();mt();We();Ar();M0();m0();var gze=50000n,hze=80000n,xze=2n,wze=I.object({token:I.string().optional().describe("Token to withdraw. Defaults to 'MON' for native token. Use token symbol (e.g., 'USDC', 'WMON') or contract address."),amount:I.string().describe("Amount to withdraw. Use 'all' for maximum possible amount, or specify a decimal amount like '0.5'. For MON, some is reserved for gas."),recipient:I.string().optional().describe("Recipient address for the withdrawal. If not specified, withdraws to user's smart account. Use when user wants to send to an external address.")});function oae(e){e.tool("withdraw_session_key","Withdraw MON or ERC20 tokens from session key to smart account or external address. Use 'all' for maximum amount. Defaults to MON if no token specified. Session key funds are used for gas - withdraw to reclaim unused funds.",wze.shape,async t=>{let n=await vze(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function vze(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=t.network.chainId,r=Qe(n),a=await ht();if(!a)return{success:!1,message:"Session key not found",error:"No session key found in Keychain. Run setup_wallet to create one."};let s=await we(t);if(!s)return{success:!1,message:"RPC not configured",error:"Please configure RPC provider"};let o=Ee(n,s),i=_e({chain:o,transport:Ze(s,t)}),u=e.token||"MON",d=await is(u,n);if(!d)return{success:!1,message:"Token not found",error:`Could not find token '${u}'. Check the symbol or address.`};let l=d.address.toLowerCase()===B0.toLowerCase(),p;l?p=await i.getBalance({address:a.address}):p=await i.readContract({address:d.address,abi:Xe,functionName:"balanceOf",args:[a.address]});let y=l?Ge(p):le(p,d.decimals);if(p===0n)return{success:!1,message:"No balance to withdraw",sessionKey:{address:a.address,previousBalance:`0 ${d.symbol}`,newBalance:`0 ${d.symbol}`},error:`Session key has no ${d.symbol} balance. Nothing to withdraw.`};let m=e.recipient?xe(e.recipient):xe(t.wallet.smartAccountAddress),w=await xt(async()=>i.getGasPrice(),{operationName:"getGasPrice"})*(l?gze:hze)*xze,v=l?p:await i.getBalance({address:a.address});if(v<w)return{success:!1,message:"Insufficient MON for gas",sessionKey:{address:a.address,previousBalance:`${y} ${d.symbol}`,newBalance:`${y} ${d.symbol}`},error:`Session key has ${Ge(v)} MON but needs ${Ge(w)} MON for gas.`};let T;if(e.amount.toLowerCase()==="all")if(l){if(p<=w)return{success:!1,message:"Insufficient balance for gas",sessionKey:{address:a.address,previousBalance:`${y} ${d.symbol}`,newBalance:`${y} ${d.symbol}`},error:`Balance (${y} MON) is less than gas cost (${Ge(w)} MON). Nothing to withdraw.`};T=p-w}else T=p;else{if(T=l?pa(e.amount):ye(e.amount,d.decimals),T<=0n)return{success:!1,message:"Invalid amount",error:"Withdrawal amount must be greater than 0"};if(T>p)return{success:!1,message:"Insufficient balance",sessionKey:{address:a.address,previousBalance:`${y} ${d.symbol}`,newBalance:`${y} ${d.symbol}`},error:`Requested ${e.amount} ${d.symbol} but only have ${y} ${d.symbol}`};if(l&&p-T<w)return{success:!1,message:"Insufficient balance for gas after withdrawal",sessionKey:{address:a.address,previousBalance:`${y} ${d.symbol}`,newBalance:`${y} ${d.symbol}`},error:`Not enough MON left for gas (${Ge(w)} MON needed). Try withdrawing less or use 'all'.`}}let A=ma(a.privateKey),_=Tt({account:A,chain:o,transport:Ze(s,t)}),E;if(l?E=await _.sendTransaction({to:m,value:T}):E=await _.writeContract({address:d.address,abi:Xe,functionName:"transfer",args:[m,T]}),(await Xt(i,E)).status!=="success")return{success:!1,message:"Transaction failed",error:`Withdrawal transaction failed. Hash: ${E}`};let $;l?$=await i.getBalance({address:a.address}):$=await i.readContract({address:d.address,abi:Xe,functionName:"balanceOf",args:[a.address]});let B=l?Ge($):le($,d.decimals),V=l?Ge(T):le(T,d.decimals),D=`${r.blockExplorer}/tx/${E}`;return{success:!0,message:m.toLowerCase()===t.wallet.smartAccountAddress.toLowerCase()?`Withdrew ${V} ${d.symbol} to your smart account`:`Withdrew ${V} ${d.symbol} to ${m}`,withdrawal:{token:d.symbol,amount:`${V} ${d.symbol}`,recipient:m,txHash:E,explorerUrl:D},sessionKey:{address:a.address,previousBalance:`${y} ${d.symbol}`,newBalance:`${B} ${d.symbol}`}}}catch(t){return{success:!1,message:"Withdrawal failed",error:t instanceof Error?t.message:"Unknown error"}}}Y();Te();mt();We();var Tze=I.object({blockIdentifier:I.union([I.string(),I.number()]).optional().describe("Block number (e.g., 12345), block hash (e.g., '0x...'), or 'latest'/'pending'. If not provided, returns the latest block."),includeTransactions:I.boolean().optional().describe("Include full transaction objects. Default: false (only hashes).")});function iae(e){e.tool("get_block","Get block information by number, hash, or latest. Returns block details including timestamp, gas usage, and transaction count. Works in both BYOK and x402 modes.",Tze.shape,async t=>{let n=await _ze(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}function Sze(e){let t=new Date(Number(e)*1e3),n=Intl.DateTimeFormat().resolvedOptions().timeZone;return{formatted:t.toLocaleString("en-US",{timeZone:n,year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1}),timezone:n}}function Aze(e){return e.startsWith("0x")&&e.length===66}async function _ze(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=await we(t),r=t.network.chainId,a=t.network.name||"Monad",s=Ee(r,n),o=_e({chain:s,transport:gt(n,Ot(t))}),i=e.includeTransactions??!1,u,d=e.blockIdentifier;if(d===void 0||d==="latest")u=await o.getBlock({includeTransactions:i});else if(d==="pending")u=await o.getBlock({blockTag:"pending",includeTransactions:i});else if(typeof d=="number")u=await o.getBlock({blockNumber:BigInt(d),includeTransactions:i});else if(typeof d=="string")if(Aze(d))u=await o.getBlock({blockHash:d,includeTransactions:i});else{let w=parseInt(d,10);if(isNaN(w))return{success:!1,message:"Invalid block identifier",error:`Could not parse '${d}' as block number or hash. Use a number, '0x...' hash, 'latest', or 'pending'.`};u=await o.getBlock({blockNumber:BigInt(w),includeTransactions:i})}if(!u)return{success:!1,message:"Block not found",error:`Could not find block with identifier: ${d??"latest"}`};let{formatted:l,timezone:p}=Sze(u.timestamp),y=u.transactions.length,m=u.number?.toString()??"pending",g=u.hash??"pending",h=u.transactions.map(w=>typeof w=="string"?w:w.hash);return{success:!0,message:`Block #${m} (${y} txs) at ${l}`,block:{number:m,hash:g,timestamp:u.timestamp.toString(),timestampFormatted:l,timezone:p,parentHash:u.parentHash,gasUsed:u.gasUsed.toString(),gasLimit:u.gasLimit.toString(),baseFeePerGas:u.baseFeePerGas?.toString(),transactionCount:y,transactions:h,miner:u.miner,nonce:u.nonce??void 0,difficulty:u.difficulty?.toString(),extraData:u.extraData},network:{chainId:r,chainName:a}}}catch(t){return{success:!1,message:"Failed to get block",error:t instanceof Error?t.message:"Unknown error"}}}Y();Te();mt();We();var Eze=I.object({}),b$={simpleTransfer:21000n,swap:250000n,stake:150000n};function cae(e){e.tool("get_gas_price","Get current gas price in wei, Gwei, and MON with estimated costs for common operations. Works in both BYOK and x402 modes.",Eze.shape,async()=>{let t=await kze();return{content:[{type:"text",text:JSON.stringify(t,null,2)}]}})}function q2(e,t=6){let n=le(e,18);return`${parseFloat(n).toFixed(t)} MON`}async function kze(){try{let e=await q();if(!e||!Pe(e))return{success:!1,message:"Wallet not configured",error:"Please run setup_wallet first to create your pragma wallet"};let t=await we(e),n=e.network.chainId,r=e.network.name||"Monad",a=Ee(n,t),o=await _e({chain:a,transport:gt(t,Ot(e))}).getGasPrice(),i=o*b$.simpleTransfer,u=o*b$.swap,d=o*b$.stake,l=S0(o);return{success:!0,message:`Current gas price: ${l} Gwei (~${q2(u)} per swap)`,gas:{gasPrice:o.toString(),gasPriceGwei:`${l} Gwei`,gasPriceMon:q2(o,12),estimatedCosts:{simpleTransfer:q2(i),swap:q2(u),stake:q2(d)}},network:{chainId:n,chainName:r}}}catch(e){return{success:!1,message:"Failed to get gas price",error:e instanceof Error?e.message:"Unknown error"}}}Te();We();var Cze=I.object({txHash:I.string().describe("Transaction hash to explain. Must be a valid 66-character hex string (0x + 64 hex chars). Example: '0x1234...abcd'. Use this to get detailed explanation of any on-chain transaction."),userAddress:I.string().optional().describe("Optional user address for context. Helps determine if tokens were sent or received. If not provided, uses the from address of the transaction.")});function uae(e){e.tool("explain_transaction",`Decode and explain any transaction in detail. Returns transaction type, token movements, gas info, and for Pragma transactions: delegation details and security analysis. x402 mode only.
115
+ `).filter(Boolean).map(u=>JSON.parse(u));return r?.tag&&(o=o.filter(u=>u.tag===r.tag)),o.reverse(),{entries:o.slice(t,t+n),total:o.length}}catch{return{entries:[],total:0}}}T6();t0();import{randomUUID as nFe}from"node:crypto";function z0e(){let e=nFe(),t=h8(),n=ma(t);return{id:e,address:n.address,privateKey:t}}async function j0e(e){await Y_(e.id,e.privateKey)}async function qR(e){let t=await eE(e);if(!t)return null;let n=ma(t);return{id:e,address:n.address,privateKey:t}}function GR(e){return ma(e.privateKey)}async function VR(){let e=z0e();return await j0e(e),e}import{existsSync as q0e,mkdirSync as sFe,readFileSync as G0e,writeFileSync as V0e,openSync as oFe,closeSync as iFe,unlinkSync as W0e,statSync as cFe,constants as WR}from"node:fs";import{homedir as uFe}from"node:os";import*as ZR from"node:path";function KR(){let e=ZR.join(uFe(),".pragma");return q0e(e)||sFe(e,{recursive:!0}),ZR.join(e,"wallet-pool.json")}function Z0e(){return KR()+".lock"}var dFe=3e4;function fFe(e){try{return process.kill(e,0),!0}catch{return!1}}function lFe(e){try{let t=G0e(e,"utf-8"),n=parseInt(t,10);if(Number.isNaN(n)||!fFe(n))return!0;let r=cFe(e);return Date.now()-r.mtimeMs>dFe}catch{return!0}}async function pFe(e=5e3,t=50){let n=Z0e(),r=Date.now();for(;Date.now()-r<e;)try{let a=oFe(n,WR.O_CREAT|WR.O_EXCL|WR.O_WRONLY);V0e(a,process.pid.toString()),iFe(a);return}catch(a){if(a.code==="EEXIST"){if(lFe(n)){try{W0e(n)}catch{}continue}await new Promise(s=>setTimeout(s,t));continue}throw a}throw new Error(`Failed to acquire wallet pool lock after ${e}ms`)}function mFe(){let e=Z0e();try{W0e(e)}catch{}}async function XR(e){await pFe();try{return await e()}finally{mFe()}}function I2(){let e=KR();if(!q0e(e))return{wallets:[],version:1};try{let t=G0e(e,"utf-8");return JSON.parse(t)}catch{return{wallets:[],version:1}}}function JR(e){let t=KR();V0e(t,JSON.stringify(e,null,2))}async function K0e(){return XR(async()=>{let e=I2(),t=0,n=0,r=!1;for(let a of e.wallets)if(a.status==="active")if(!a.assignedTo)a.status="idle",a.lastUsedAt=Date.now(),t++,r=!0;else{let s=a.assignedTo.replace("subagent-","");k2(s)||(a.status="idle",a.assignedTo=null,a.lastUsedAt=Date.now(),n++,r=!0)}return r&&(e.version++,JR(e)),{inconsistenciesFixed:t,orphansFixed:n}})}async function QR(e){return await K0e(),XR(async()=>{let t=I2(),n=t.wallets.find(r=>r.status==="idle");if(!n){let r=await VR(),a=Date.now();n={id:r.id,address:r.address,status:"idle",assignedTo:null,createdAt:a,lastUsedAt:a},t.wallets.push(n)}return n.status="active",n.assignedTo=e,n.lastUsedAt=Date.now(),t.version++,JR(t),n})}async function Ca(e){return XR(async()=>{let t=I2(),n=t.wallets.find(r=>r.id===e);if(!n)throw new Error(`Wallet not found in pool: ${e}`);n.status="idle",n.assignedTo=null,n.lastUsedAt=Date.now(),t.version++,JR(t)})}function O7(e){let t=I2();return e?t.wallets.filter(n=>n.status===e):t.wallets}async function oc(e){return qR(e)}import{existsSync as X0e,readFileSync as bFe,writeFileSync as J0e,unlinkSync as fkt}from"node:fs";import{homedir as yFe}from"node:os";import*as P2 from"node:path";function YR(e){let t=P2.join(yFe(),".pragma","agents",e);return P2.join(t,"loop.json")}function N7(e,t){let n=YR(e),r=P2.dirname(n);if(!X0e(r))throw new Error(`Agent directory not found: ${e}`);let a={...t,createdAt:Date.now()};J0e(n,JSON.stringify(a,null,2))}function R2(e){let t=YR(e);if(!X0e(t))return null;try{let n=bFe(t,"utf-8");return JSON.parse(n)}catch{return null}}function Q0e(e,t){let n=R2(e);if(!n)throw new Error(`Loop config not found for agent: ${e}`);let r={...n,...t,lastCheckedAt:Date.now()},a=YR(e);J0e(a,JSON.stringify(r,null,2))}function e$(e){R2(e)&&Q0e(e,{active:!1})}function t$(e,t){N7(e,{type:"continuous",active:!0,mission:t,until:["budget_exhausted","delegation_expired","user_cancelled"]})}function n$(e,t,n){N7(e,{type:"condition",active:!0,condition:t,mission:n})}function r$(e,t,n){N7(e,{type:"interval",active:!0,intervalMinutes:t,mission:n})}Te();mt();We();Ar();Y();function Y0e(e){return e.length===0?"0x":Ae(e)}function gFe(e){return e.length===0?"0x":`0x${e.map(n=>n.slice(2).toLowerCase()).join("")}`}function hFe(){return{caveats:[{enforcer:z5,terms:Y0e([cp]),args:"0x"}]}}function xFe(e,t){return{caveats:[{enforcer:ip,terms:gFe(e),args:"0x"},{enforcer:z5,terms:Y0e(t),args:"0x"}]}}function wFe(e){return Zt([{type:"tuple[]",components:[{name:"caveats",type:"tuple[]",components:[{name:"enforcer",type:"address"},{name:"terms",type:"bytes"},{name:"args",type:"bytes"}]}]}],[e.map(t=>({caveats:t.caveats.map(n=>({enforcer:n.enforcer,terms:n.terms,args:n.args}))}))])}function vFe(e,t=[]){return Zt([{type:"tuple",components:[{name:"groupIndex",type:"uint256"},{name:"caveatArgs",type:"bytes[]"}]}],[{groupIndex:BigInt(e),caveatArgs:t}])}function L7(e,t){let n=[hFe(),xFe(e,t)];return{enforcer:b2,terms:wFe(n),args:"0x"}}function $2(e,t){let n=e.caveats.find(r=>r.enforcer.toLowerCase()===b2.toLowerCase());if(n){let r=t===0?["0x"]:["0x","0x"];n.args=vFe(t,r)}}Y();Y();mt();Te();We();m0();var bp={143:{lens:"0x7e78A8DE94f21804F7a17F4E8BF9EC2c872187ea",router:"0x6F6B8F1a20703309951a5127c45B49b1CD981A22"}},D2=[{name:"getInitialBuyAmountOut",type:"function",stateMutability:"view",inputs:[{name:"amountIn",type:"uint256"}],outputs:[{name:"amountOut",type:"uint256"}]},{name:"getAmountOut",type:"function",stateMutability:"view",inputs:[{name:"token",type:"address"},{name:"amountIn",type:"uint256"},{name:"isBuy",type:"bool"}],outputs:[{name:"router",type:"address"},{name:"amountOut",type:"uint256"}]},{name:"getAmountIn",type:"function",stateMutability:"view",inputs:[{name:"token",type:"address"},{name:"amountOut",type:"uint256"},{name:"isBuy",type:"bool"}],outputs:[{name:"router",type:"address"},{name:"amountIn",type:"uint256"}]},{name:"getProgress",type:"function",stateMutability:"view",inputs:[{name:"token",type:"address"}],outputs:[{name:"",type:"uint256"}]},{name:"isGraduated",type:"function",stateMutability:"view",inputs:[{name:"token",type:"address"}],outputs:[{name:"",type:"bool"}]},{name:"isLocked",type:"function",stateMutability:"view",inputs:[{name:"token",type:"address"}],outputs:[{name:"",type:"bool"}]},{name:"availableBuyTokens",type:"function",stateMutability:"view",inputs:[{name:"token",type:"address"}],outputs:[{name:"",type:"uint256"},{name:"",type:"uint256"}]}],a$=[{name:"buy",type:"function",stateMutability:"payable",inputs:[{name:"params",type:"tuple",components:[{name:"amountOutMin",type:"uint256"},{name:"token",type:"address"},{name:"to",type:"address"},{name:"deadline",type:"uint256"}]}],outputs:[{name:"",type:"uint256"}]},{name:"sell",type:"function",stateMutability:"nonpayable",inputs:[{name:"params",type:"tuple",components:[{name:"amountIn",type:"uint256"},{name:"amountOutMin",type:"uint256"},{name:"token",type:"address"},{name:"to",type:"address"},{name:"deadline",type:"uint256"}]}],outputs:[{name:"",type:"uint256"}]}];var ere=[{name:"create",type:"function",stateMutability:"payable",inputs:[{name:"params",type:"tuple",components:[{name:"name",type:"string"},{name:"symbol",type:"string"},{name:"tokenURI",type:"string"},{name:"amountOut",type:"uint256"},{name:"salt",type:"bytes32"},{name:"actionId",type:"uint8"}]}],outputs:[{name:"token",type:"address"}]}];var tre=10000000000000000000n,nre=300*1e3,rre=300,ic=500,V6=5e3,are=1e4;async function B7(){let e=await q();if(!e)throw new Error("Config not loaded. Run setup_wallet first.");let t=await we(e),n=Ee(e.network.chainId,t);return _e({chain:n,transport:gt(t,Ot(e))})}function W6(e){let t=bp[e];if(!t)throw new Error(`nad.fun not supported on chain ${e}`);return t}async function ji(e,t=143){let n=await B7(),r=W6(t),a=h5({address:r.lens,abi:D2,client:n}),s=h5({address:e,abi:Xe,client:n}),[o,i,u,d,l]=await xt(async()=>Promise.all([a.read.isGraduated([e]),a.read.isLocked([e]),a.read.getProgress([e]),s.read.symbol().catch(()=>{}),s.read.name().catch(()=>{})]),{operationName:"nadfun-status"}),p=o?"dex":"bonding_curve",y=Number(u),m=`${(y/100).toFixed(1)}%`,g={token:e,tokenSymbol:d,tokenName:l,isGraduated:o,isLocked:i,progress:y,progressPercent:m,tradingVenue:p};if(!o&&!i)try{let[h,w]=await xt(async()=>a.read.availableBuyTokens([e]),{operationName:"nadfun-available"});g.availableTokensWei=h,g.requiredMonWei=w,g.availableTokens=le(h,18),g.requiredMon=le(w,18)}catch(h){console.error("[nadfun] Could not fetch availability:",h)}return g}async function sre(e,t,n,r=143){let a=await B7(),s=W6(r),o=h5({address:s.lens,abi:D2,client:a}),[i,u]=await xt(async()=>o.read.getAmountOut([e,t,n]),{operationName:"nadfun-quote"});return{router:i,amountOut:u}}async function ore(e,t,n,r=143){let a=await B7(),s=W6(r),o=h5({address:s.lens,abi:D2,client:a}),[i,u]=await xt(async()=>o.read.getAmountIn([e,t,n]),{operationName:"nadfun-quote-reverse"});return{router:i,amountIn:u}}function ire(e){return e>=are*.9}async function cre(e,t=143){let n=await B7(),r=W6(t),a=h5({address:r.lens,abi:D2,client:n});return await xt(async()=>a.read.getInitialBuyAmountOut([e]),{operationName:"nadfun-initial-buy-quote"})}var Z6=new Map;function TFe(){let e=Date.now().toString(36),t=Math.random().toString(36).substring(2,8);return`nadfun-${e}-${t}`}function SFe(){let e=Date.now();for(let[t,n]of Z6.entries())n.expiresAt<e&&Z6.delete(t)}function AFe(e,t,n,r){return X({abi:a$,functionName:"buy",args:[{amountOutMin:e,token:t,to:n,deadline:r}]})}function _Fe(e,t,n,r,a){return X({abi:a$,functionName:"sell",args:[{amountIn:e,amountOutMin:t,token:n,to:r,deadline:a}]})}async function ure(e){SFe();let{token:t,amount:n,isBuy:r,slippageBps:a=ic,chainId:s,sender:o,tokenSymbol:i="TOKEN",tokenDecimals:u=18,exactOutput:d=!1}=e;if(a<0||a>V6)throw new Error(`Slippage must be between 0 and ${V6} bps`);let l=await ji(t,s);if(l.isGraduated)throw new Error("Token has graduated to DEX. Use regular swap tools (get_swap_quote + execute_swap) instead.");if(l.isLocked)throw new Error("Token is locked during graduation process. Cannot trade until graduation completes.");let p,y,m;if(d){let W=await ore(t,n,r,s);p=W.router,y=W.amountIn,m=n}else{let W=await sre(t,n,r,s);p=W.router,y=n,m=W.amountOut}let g=W6(s);p.toLowerCase()!==g.router.toLowerCase()&&console.error(`[nadfun] Using Lens-returned router: ${p} (expected ${g.router})`);let h=BigInt(1e4-a),w=m*h/BigInt(1e4),v=d?y*BigInt(1e4+a)/BigInt(1e4):y,T=BigInt(Math.floor(Date.now()/1e3)+rre),A,_;r?(A=AFe(w,t,o,T),_=v):(A=_Fe(v,w,t,o,T),_=0n);let E=r?"BUY":"SELL",O=TFe(),$=l.tokenSymbol||i,B={quoteId:O,token:t,tokenSymbol:$,tokenDecimals:u,direction:E,amountIn:r?le(v,18):le(v,u),amountInWei:v,expectedOutput:r?le(m,u):le(m,18),expectedOutputWei:m,minOutput:r?le(w,u):le(w,18),minOutputWei:w,slippageBps:a,progress:l.progress,progressPercent:l.progressPercent,router:p,expiresAt:Date.now()+nre,chainId:s,_calldata:A,_value:_};Z6.set(O,B);let{_calldata:V,_value:D,...G}=B,N;return ire(l.progress)&&(N=`Token is ${l.progressPercent} toward graduation. Large buys may trigger graduation.`),{quote:G,warning:N}}function po(e){let t=Z6.get(e);if(!t)return null;if(mo(t))return Z6.delete(e),null;let{_calldata:n,_value:r,...a}=t;return a}function qi(e){let t=Z6.get(e);return!t||!t._calldata?null:mo(t)?(Z6.delete(e),null):{calldata:t._calldata,router:t.router,value:t._value,direction:t.direction}}function mo(e){return Date.now()>=e.expiresAt}function dre(e){let t=e.expiresAt-Date.now();return Math.max(0,Math.floor(t/1e3))}function Gi(e){Z6.delete(e)}Y();var Kn="0xea1b8E4aB7f14F7dCA68c5B214303B13078FC5ec",s$="0x2880aB155794e7179c9eE2e38200202908C17B43",V0="0x754704Bc059F8C67012fEd69BC8A327a5aafb603",g0="0xFD44B35139Ae53FFF7d8F2A9869c503D987f00d1",h0="0x91b81bfbe3A747230F0529Aa28d8b2Bc898E6D56";var _r="0x3bd359C1119dA7Da1D913D1C4D2B7c461115433A";var o$=8500n,bo=[500,750,1001];var fre=500,lre=300,pre=50,mre="https://hermes.pyth.network",bre=[{type:"function",inputs:[{type:"address",name:"user"},{type:"address",name:"pairBase"}],name:"getPositionsV2",outputs:[{components:[{type:"bytes32",name:"positionHash"},{type:"string",name:"pair"},{type:"address",name:"pairBase"},{type:"address",name:"tokenIn"},{type:"address",name:"marginToken"},{type:"bool",name:"isLong"},{type:"uint96",name:"margin"},{type:"uint128",name:"qty"},{type:"uint128",name:"entryPrice"},{type:"uint128",name:"stopLoss"},{type:"uint128",name:"takeProfit"},{type:"uint96",name:"openFee"},{type:"uint96",name:"executionFee"},{type:"int256",name:"fundingFee"},{type:"uint32",name:"timestamp"},{type:"uint96",name:"holdingFee"}],type:"tuple[]",name:""}],stateMutability:"view"}],M2=[{inputs:[{components:[{type:"address",name:"pairBase"},{type:"bool",name:"isLong"},{type:"address",name:"tokenIn"},{type:"address",name:"lvToken"},{type:"uint96",name:"amountIn"},{type:"uint128",name:"qty"},{type:"uint128",name:"price"},{type:"uint128",name:"stopLoss"},{type:"uint128",name:"takeProfit"},{type:"uint24",name:"broker"}],name:"data",type:"tuple"},{type:"bytes[]",name:"priceUpdateData"}],name:"openMarketTradeWithPyth",outputs:[{type:"bytes32",name:"tradeHash"}],stateMutability:"payable",type:"function"},{name:"closeTrade",type:"function",stateMutability:"nonpayable",inputs:[{name:"tradeHash",type:"bytes32"}],outputs:[]},{name:"addMargin",type:"function",stateMutability:"payable",inputs:[{name:"tradeHash",type:"bytes32"},{name:"token",type:"address"},{name:"amount",type:"uint96"}],outputs:[]},{name:"updateTradeTpAndSl",type:"function",stateMutability:"nonpayable",inputs:[{name:"tradeHash",type:"bytes32"},{name:"takeProfit",type:"uint128"},{name:"stopLoss",type:"uint128"}],outputs:[]}],U7=[{inputs:[{components:[{type:"address",name:"pairBase"},{type:"bool",name:"isLong"},{type:"address",name:"tokenIn"},{type:"address",name:"lvToken"},{type:"uint96",name:"amountIn"},{type:"uint128",name:"qty"},{type:"uint128",name:"price"},{type:"uint128",name:"stopLoss"},{type:"uint128",name:"takeProfit"},{type:"uint24",name:"broker"}],name:"data",type:"tuple"},{type:"bytes[]",name:"priceUpdateData"}],name:"openLimitOrderWithPyth",outputs:[{type:"bytes32",name:"orderHash"}],stateMutability:"payable",type:"function"},{name:"cancelLimitOrder",type:"function",stateMutability:"nonpayable",inputs:[{name:"orderHash",type:"bytes32"}],outputs:[]},{name:"batchCancelLimitOrders",type:"function",stateMutability:"nonpayable",inputs:[{name:"orderHashes",type:"bytes32[]"}],outputs:[]}],yre=[{type:"function",inputs:[{type:"address",name:"user"},{type:"address",name:"pairBase"}],name:"getLimitOrders",outputs:[{components:[{type:"bytes32",name:"orderHash"},{type:"string",name:"pair"},{type:"address",name:"pairBase"},{type:"bool",name:"isLong"},{type:"address",name:"tokenIn"},{type:"address",name:"lvToken"},{type:"uint96",name:"amountIn"},{type:"uint128",name:"qty"},{type:"uint128",name:"limitPrice"},{type:"uint128",name:"stopLoss"},{type:"uint128",name:"takeProfit"},{type:"uint24",name:"broker"},{type:"uint32",name:"timestamp"}],type:"tuple[]",name:""}],stateMutability:"view"}],i$=[{type:"function",name:"getPairHoldingFeeRate",inputs:[{type:"address",name:"pairBase"},{type:"bool",name:"isLong"}],outputs:[{type:"uint256",name:""}],stateMutability:"view"}],gre=[{type:"function",name:"lastLongAccFundingFeePerShare",inputs:[{type:"address",name:"pairBase"}],outputs:[{type:"int256",name:""}],stateMutability:"view"}],hre=[{type:"function",name:"getMarketInfo",inputs:[{type:"address",name:"pairBase"}],outputs:[{type:"address",name:"pairBase"},{type:"uint256",name:"longQty"},{type:"uint256",name:"shortQty"},{type:"uint256",name:"longNotional"},{type:"uint256",name:"shortNotional"},{type:"int256",name:"currentFundingFeePerSec"}],stateMutability:"view"}],c$=[{name:"getUpdateFee",type:"function",stateMutability:"view",inputs:[{name:"updateData",type:"bytes[]"}],outputs:[{name:"fee",type:"uint256"}]}],Fn=[{pair:"BTC/USD",pairBase:"0xcf5a6076cfa32686c0df13abada2b40dec133f1d",pythId:"0xe62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43",category:"Crypto"},{pair:"ETH/USD",pairBase:"0xb5a30b0fdc5ea94a52fdc42e3e9760cb8449fb37",pythId:"0xff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace",category:"Crypto"},{pair:"MON/USD",pairBase:"0x3bd359c1119da7da1d913d1c4d2b7c461115433a",pythId:"0x31491744e2dbf6df7fcf4ac0820d18a609b49076d45066d3568424e62f686cd1",category:"Crypto"},{pair:"SOL/USD",pairBase:"0x0a3ec4fc70eaf64faf6eeda4e9b2bd4742a78546",pythId:"0xef0d8b6fda2ceba41da15d4095d1da392a0d2f8ed0c6c7bc0f4cfac8c280b56d",category:"Crypto"},{pair:"XRP/USD",pairBase:"0xaeb724422620edb430dcaf22aeeff2e9388a578c",pythId:"0xec5d399846a9209f3fe5881d70aae9268c94339ff9817e8d18ff19fa05eea1c8",category:"Crypto"},{pair:"QQQ/USD",pairBase:"0xb589511c51d1ffda5d943ac1c9733e112abeff7b",pythId:"0x9695e2b96ea7b3859da9ed25b7a46a920a776e2fdae19a7bcfdf2b219230452d",category:"Indices"},{pair:"SPY/USD",pairBase:"0xcb8900160bd4a86d3b80f5ad5a44ee15823b0592",pythId:"0x19e09bb805456ada3979a7d1cbb4b6d63babc3a0f8e8a9509f68afa5c4c11cd5",category:"Indices"},{pair:"AAPL/USD",pairBase:"0x3a54a9a690616fbc26cfc409bf11f89d51f1d57a",pythId:"0x49f6b65cb1de6b10eaf75e7c03ca029c306d0357e91b5311b175084a5ad55688",category:"Stocks"},{pair:"AMZN/USD",pairBase:"0x6c755094f1cdd95e2e4170549dc12e7555151536",pythId:"0xb5d0e0fa58a1f8b81498ae670ce93c872d14434b72c364885d4fa1b257cbb07a",category:"Stocks"},{pair:"TSLA/USD",pairBase:"0x0a8f1f385fed9c77a2e0daa363ccc865e971bdbe",pythId:"0x16dad506d7db8da01c87581c87ca897a012a153557d4d578c3b9c9e1bc0632f1",category:"Stocks"},{pair:"NVDA/USD",pairBase:"0xe108948b9667048232851f26a1427d3a908b22da",pythId:"0xb1073854ed24cbc755dc527418f52b7d271f6cc967bbf8d8129112b18860a593",category:"Stocks"},{pair:"META/USD",pairBase:"0x0057355892fab25ddc63a7482ec1696d6ada6703",pythId:"0x78a3e3b8e676a8f73c439f5d749737034b139bbbe899ba5775216fba596607fe",category:"Stocks"},{pair:"MSFT/USD",pairBase:"0xb2023082f01404dd0ce6937cab03c4f5d6db9ba8",pythId:"0xd0ca23c1cc005e004ccf1db5bf76aeb6a49218f43dac3d4b275e92de12ded4d1",category:"Stocks"},{pair:"GOOG/USD",pairBase:"0x9a4f772de1a5f6df5913fa2c98dd7177eaa23dc2",pythId:"0xe65ff435be42630439c96396653a342829e877e2aafaeaf1a10d0ee5fd2cf3f2",category:"Stocks"},{pair:"EUR/USD",pairBase:"0xa9226449042e36bf6865099eec57482aa55e3ad0",pythId:"0xa995d00bb36a63cef7fd2c287dc105fc8f3d93779f062f09551b0af3e81ec30b",category:"Forex"},{pair:"USD/JPY",pairBase:"0x35b8bafff3570683af968b8d36b91b1a19465141",pythId:"0xef2c98c804ba503c6a707e38be4dfbb16683775f195b091252bf24693042fd52",category:"Forex"},{pair:"XAU/USD",pairBase:"0x7c687a3207cd9c05b4b11d8dd7ac337919c22001",pythId:"0x765d2ba906dbc32ca17cc11f5310a89e9ee1f6420508c63861f2f8ba4ee34bb2",category:"Commodities"},{pair:"XAG/USD",pairBase:"0x5ccc5c04130d272bf07d6e066f4cae40cfc03136",pythId:"0xf2fb02c32b055c805e7238d628e5e9dadef274376114eb1f012337cabe93871e",category:"Commodities"},{pair:"500BTC/USD",pairBase:"0x0000000000000000000000000000000000000003",pythId:"0xe62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43",category:"Crypto",isHighLeverage:!0},{pair:"500ETH/USD",pairBase:"0x0000000000000000000000000000000000000004",pythId:"0xff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace",category:"Crypto",isHighLeverage:!0}];m0();async function K6(e){let t=new URL(`${mre}/v2/updates/price/latest`);return e.forEach(n=>t.searchParams.append("ids[]",n)),await xt(async()=>{let n=await fetch(t.toString());if(!n.ok)throw new Error(`Pyth API error: ${n.statusText}`);return await n.json()},{operationName:"fetch-pyth-price"})}Y();Te();mt();We();m0();var EFe=["MON","LVMON"];function xre(e){return EFe.includes(e)}function Qo(e){return bo.includes(e)}function X6(e){return e<pre?fre:lre}function Ia(e){return e==="USDC"?6:18}async function yp(e){let t=await we(e),n=e.network?.chainId||143,r=Ee(n,t);return await It()?_e({chain:r,transport:gt(t,Ot(e))}):_e({chain:r,transport:gt(t)})}async function J5(e,t){let n=await q();if(!n||!Pe(n))throw new Error("Wallet not configured.");let r=await yp(n),a=[],s=t?Fn.filter(o=>t.includes(o.pair)):Fn;for(let o of s){let i=await xt(async()=>r.readContract({address:Kn,abi:bre,functionName:"getPositionsV2",args:[e,o.pairBase]}),{operationName:`leverup-get-positions-${o.pair}`});if(i&&i.length>0){let d=(await K6([o.pythId])).parsed?.[0]?.price;if(!d)continue;let l=BigInt(d.price)*10n**BigInt(18+d.expo);for(let p of i){let y=p,m=kFe(y,l);a.push({position:y,analysis:m})}}}return a}async function J6(e,t,n,r,a="MON"){let s=Fn.find(D=>D.pair===`${e}/USD`||D.pair===e);if(!s)throw new Error(`Unsupported pair: ${e}`);let o=[s.pythId],i=Fn.find(D=>D.pair==="MON/USD");xre(a)&&i&&o.push(i.pythId);let u=await K6(o),d=u.parsed?.find(D=>`0x${D.id}`===s.pythId)?.price;if(!d)throw new Error("Could not fetch asset price from Pyth");let l=BigInt(d.price)*10n**BigInt(18+d.expo),p;if(xre(a)){let D=u.parsed?.find(W=>`0x${W.id}`===i?.pythId)?.price;if(!D)throw new Error("Could not fetch MON price from Pyth");let G=BigInt(D.price)*10n**BigInt(18+D.expo);p=ye(n,18)*G/10n**18n}else p=ye(n,18);let y=p*BigInt(r),m=y*10n**10n/l,g=y*45n/100000n,w=p*o$/10000n-g,v;t?v=l-w*10n**10n/m:v=l+w*10n**10n/m;let T=t?(l-v)*10000n/l:(v-l)*10000n/l,A=le(p,18),_=Number(le(y,18)),E=Number(A),O=200,$=10,B=[],V=!1;return _<O&&(B.push(`Position size is below the protocol minimum of $200.00 USD (Current: $${_.toFixed(2)}). This will be rejected by the contract.`),V=!0),E<$&&B.push(`Margin is below the recommended $10.00 USD (Current: $${E.toFixed(2)}). This may work but is not recommended.`),s.isHighLeverage&&!Qo(r)&&(B.push(`${s.pair} is a high-leverage (Zero-Fee) pair that ONLY supports ${bo.join(", ")}x leverage. Current leverage (${r}x) will be rejected by the protocol.`),V=!0),{symbol:s.pair,isLong:t,leverage:r,entryPrice:Number(le(l,18)).toFixed(2),marginAmount:`${n} ${a}`,marginUsd:E.toFixed(2),positionSize:le(m,10),positionValueUsd:_.toFixed(2),liqPrice:Number(le(v,18)).toFixed(2),openFee:Number(le(g,18)).toFixed(4),healthFactor:Math.max(0,Math.min(100,Number(T))),distanceToLiq:`${(Number(T)/100).toFixed(2)}%`,meetsMinimums:!V,warnings:B,isHighLeveragePair:s.isHighLeverage??!1,maxTpPercent:X6(r),canAddMargin:!Qo(r)}}function kFe(e,t){let{isLong:n,entryPrice:r,qty:a,margin:s,openFee:o,holdingFee:i,fundingFee:u}=e,d=n?(t-r)*a/10n**10n:(r-t)*a/10n**10n,l=o+i+u,p=d-l,m=s*o$/10000n-l,g=n?r-m*10n**10n/a:r+m*10n**10n/a,h=n?(t-g)*10000n/t:(g-t)*10000n/t;return{unrealizedPnL:`$${Number(le(p,18)).toFixed(2)}`,pnlPercentage:`${(Number(p*10000n/s)/100).toFixed(2)}%`,liqPrice:Number(le(g,18)).toFixed(2),distanceToLiq:`${(Number(h)/100).toFixed(2)}%`,healthFactor:Math.max(0,Math.min(100,Number(h))),isLiquidatable:h<=0}}async function vre(e){let t=await q();if(!t||!Pe(t))throw new Error("Wallet not configured.");let n=await yp(t);return(await Promise.all(Fn.map(async a=>{try{let s=await xt(async()=>n.readContract({address:Kn,abi:yre,functionName:"getLimitOrders",args:[e,a.pairBase]}),{operationName:`leverup-get-limit-orders-${a.pair}`});return s&&s.length>0?s.map(o=>({...o,pair:a.pair})):[]}catch{return[]}}))).flat()}async function O2(e,t,n,r,a,s="MON"){let o=await J6(e,t,n,r,s),i=ye(a,18),u=ye(o.entryPrice,18),d,l;if(t)if(d=i<u,d){let y=(u-i)*10000n/u;l=`Valid: Trigger price is ${(Number(y)/100).toFixed(2)}% below current market.`}else l=`Invalid: Long limit orders require trigger price BELOW current market ($${o.entryPrice}).`;else if(d=i>u,d){let y=(i-u)*10000n/u;l=`Valid: Trigger price is ${(Number(y)/100).toFixed(2)}% above current market.`}else l=`Invalid: Short limit orders require trigger price ABOVE current market ($${o.entryPrice}).`;let p=[...o.warnings];return d||p.unshift(l),{...o,triggerPrice:a,triggerPriceUsd:`$${Number(a).toFixed(2)}`,currentPrice:o.entryPrice,isTriggerValid:d,triggerValidationMessage:l,warnings:p,meetsMinimums:o.meetsMinimums&&d}}function H7(e,t){let n=e*t;return`${(Number(n)/1e10*100).toFixed(6)}%`}function Tre(e){return e>0n?"longs pay":e<0n?"shorts pay":"neutral"}function CFe(e){let t=e;return{longQty:t[1],shortQty:t[2],currentFundingFeePerSec:t[5]}}function wre(e,t){let n=e*t,r=n<0n?-n:n;return`${n<0n?"-":"+"}${(Number(r)/1e18*100).toFixed(4)}%`}function IFe(e){let{longQty:t,shortQty:n,currentFundingFeePerSec:r}=e,a=le(t,10),s=le(n,10),o,i;if(t===0n&&n===0n)o="0:0",i="balanced";else if(n===0n)o="100% longs",i="longs";else if(t===0n)o="100% shorts",i="shorts";else{let u=Number(t)/Number(n);u>1.1?(o=`${u.toFixed(2)}:1 long-heavy`,i="longs"):u<.9?(o=`1:${(1/u).toFixed(2)} short-heavy`,i="shorts"):(o=`${u.toFixed(2)}:1 balanced`,i="balanced")}return{longQty:a,shortQty:s,oiRatio:o,dominantSide:i,currentFundingRate8h:wre(r,28800n),currentFundingRate1h:wre(r,3600n),fundingRateDirection:Tre(r)}}async function Sre(e){let t=await q();if(!t)throw new Error("Config not loaded. Run setup_wallet first.");let n=await yp(t),r=Fn.filter(o=>!o.isHighLeverage);if(e){let o=e.toUpperCase().trim();if(r=r.filter(i=>i.pair.toUpperCase().startsWith(o)||i.pair.toUpperCase()===`${o}/USD`||i.pair.toUpperCase().includes(o)),r.length===0)throw new Error(`No LeverUp pair found for '${e}'. Use leverup_list_pairs to see available markets.`)}let s=(await Promise.all(r.map(async o=>{try{let[i,u,d,l]=await Promise.all([xt(async()=>n.readContract({address:Kn,abi:i$,functionName:"getPairHoldingFeeRate",args:[o.pairBase,!0]}),{operationName:`funding-long-${o.pair}`}),xt(async()=>n.readContract({address:Kn,abi:i$,functionName:"getPairHoldingFeeRate",args:[o.pairBase,!1]}),{operationName:`funding-short-${o.pair}`}),xt(async()=>n.readContract({address:Kn,abi:gre,functionName:"lastLongAccFundingFeePerShare",args:[o.pairBase]}),{operationName:`acc-funding-${o.pair}`}),xt(async()=>n.readContract({address:Kn,abi:hre,functionName:"getMarketInfo",args:[o.pairBase]}),{operationName:`market-info-${o.pair}`}).catch(()=>null)]),p=i,y=u,m=d,g={symbol:o.pair,category:o.category,pairBase:o.pairBase,holdingFeeRatePerSecond:{long:p,short:y},holdingFeeRate8h:{long:H7(p,28800n),short:H7(y,28800n)},holdingFeeRate1h:{long:H7(p,3600n),short:H7(y,3600n)},accumulatedFunding:m,fundingDirection:Tre(m)};if(l){let h=CFe(l);g.marketInfo=IFe(h)}return g}catch{return null}}))).filter(o=>o!==null);return s.sort((o,i)=>o.category!==i.category?o.category.localeCompare(i.category):o.symbol.localeCompare(i.symbol)),s}m0();async function N2(e,t){let n=Fn.find(T=>T.pair===`${e.symbol}/USD`||T.pair===e.symbol);if(!n)throw new Error(`Unsupported pair: ${e.symbol}`);let r=await yp(t),a=[n.pythId],s=Fn.find(T=>T.pair==="MON/USD");(e.collateralToken==="MON"||e.collateralToken==="LVMON")&&s&&a.push(s.pythId);let i=(await K6(a)).binary.data.map(T=>T.startsWith("0x")?T:`0x${T}`),u=await xt(async()=>r.readContract({address:s$,abi:c$,functionName:"getUpdateFee",args:[i]}),{operationName:"leverup-pyth-fee"}),d,l;switch(e.collateralToken){case"USDC":d=V0,l=g0;break;case"LVUSD":d=g0,l=g0;break;case"LVMON":d=h0,l=h0;break;default:d=_r,l=h0;break}let y=e.amountIn*BigInt(e.leverage)*45n/100000n,m=e.amountIn+y,g={pairBase:xe(n.pairBase),isLong:e.isLong,tokenIn:d,lvToken:l,amountIn:m,qty:e.qty,price:e.price,stopLoss:e.stopLoss||0n,takeProfit:e.takeProfit||0n,broker:0},h=X({abi:M2,functionName:"openMarketTradeWithPyth",args:[g,i]}),v=e.collateralToken==="MON"?u+m:u;return{to:Kn,data:h,value:v,tokenIn:d,amountIn:m}}async function L2(e){let t=X({abi:M2,functionName:"closeTrade",args:[e]});return{to:Kn,data:t,value:0n}}function B2(e,t,n,r){let a=X({abi:M2,functionName:"addMargin",args:[e,t,n]});return{to:Kn,data:a,value:r?n:0n,tokenIn:t,amountIn:n}}function U2(e,t,n){let r=X({abi:M2,functionName:"updateTradeTpAndSl",args:[e,t,n]});return{to:Kn,data:r,value:0n}}async function H2(e,t){let n=Fn.find(T=>T.pair===`${e.symbol}/USD`||T.pair===e.symbol);if(!n)throw new Error(`Unsupported pair: ${e.symbol}`);let r=await yp(t),a=[n.pythId],s=Fn.find(T=>T.pair==="MON/USD");(e.collateralToken==="MON"||e.collateralToken==="LVMON")&&s&&a.push(s.pythId);let i=(await K6(a)).binary.data.map(T=>T.startsWith("0x")?T:`0x${T}`),u=await xt(async()=>r.readContract({address:s$,abi:c$,functionName:"getUpdateFee",args:[i]}),{operationName:"leverup-limit-pyth-fee"}),d,l;switch(e.collateralToken){case"USDC":d=V0,l=g0;break;case"LVUSD":d=g0,l=g0;break;case"LVMON":d=h0,l=h0;break;default:d=_r,l=h0;break}let y=e.amountIn*BigInt(e.leverage)*45n/100000n,m=e.amountIn+y,g={pairBase:xe(n.pairBase),isLong:e.isLong,tokenIn:d,lvToken:l,amountIn:m,qty:e.qty,price:e.triggerPrice,stopLoss:e.stopLoss||0n,takeProfit:e.takeProfit||0n,broker:0},h=X({abi:U7,functionName:"openLimitOrderWithPyth",args:[g,i]}),v=e.collateralToken==="MON"?u+m:u;return{to:Kn,data:h,value:v,tokenIn:d,amountIn:m}}function F2(e){let t=X({abi:U7,functionName:"cancelLimitOrder",args:[e]});return{to:Kn,data:t,value:0n}}function z2(e){let t=X({abi:U7,functionName:"batchCancelLimitOrders",args:[e]});return{to:Kn,data:t,value:0n}}function PFe(e,t){return e>t?e-t:t-e}var F7={MON:Pn,USDC:V0,LVUSD:g0,LVMON:h0};function RFe(e,t){return zo({abi:Xe,logs:e.logs,eventName:"Transfer"}).filter(r=>r.args.to?.toLowerCase()===t.toLowerCase()).map(r=>({token:r.address,amount:r.args.value}))}var $Fe=qu("event Transfer(address indexed from, address indexed to, uint256 value)");async function _re(){let e=await q();if(!e)return null;let t=await we(e),n=e.network?.chainId??143,r=Ee(n,t);return _e({chain:r,transport:Ze(t,e)})}var Are=200n;async function Ere(e,t,n,r){let a=r==="latest"?await e.getBlockNumber():r;if(a<n)return[];let s=[];for(let o=n;o<=a;o+=Are){let i=o+Are-1n,u=i>a?a:i,d=await e.getLogs({event:$Fe,args:{from:up.leverUpDiamond,to:t},fromBlock:o,toBlock:u});for(let l of d)s.push({token:l.address,amount:l.args.value})}return s}async function DFe(e,t){let n=await _re();if(!n)return[];let r=8,a=2e3;for(let s=0;s<r;s++){await new Promise(o=>setTimeout(o,a));try{let o=await Ere(n,t,e+1n,"latest");if(o.length>0)return o}catch{}}return[]}async function kre(e,t,n){let r=await _re();if(!r)return[];let a=3;for(let s=0;s<a;s++)try{return await Ere(r,n,e,t)}catch{s<a-1&&await new Promise(o=>setTimeout(o,1e3*(s+1)))}return[]}async function ds(e,t,n,r){let a=await q();if(!a?.wallet)return{success:!1,error:"Wallet not configured"};let s=await c0(e);if(!s)return{success:!1,error:`Agent not found: ${e}`};if(s.status!=="running")return{success:!1,error:`Agent not running (status: ${s.status})`};if(Date.now()>s.expiresAt)return await Fi(e,{status:"failed"}),{success:!1,error:"Delegation expired"};if(s.trades.executed>=s.trades.maxAllowed)return await Fi(e,{status:"completed"}),{success:!1,error:"Max trades reached"};let o=await pp(e);if(!o?.rootDelegation||!o?.signedDelegation)return{success:!1,error:"Missing delegation chain in storage"};if(!r?.skipBudgetTracking){if(t.value>0n){let D=$7(s,Pn,t.value);if(!D.allowed)return{success:!1,error:`MON budget exceeded: ${D.reason}`};let G=R7(s,Pn);if(!G.allowed)return{success:!1,error:`Native MON not allowed: ${G.reason}`}}if(r?.tokenFlows)for(let{token:D,amount:G}of r.tokenFlows.outflows){if(D.toLowerCase()===Pn.toLowerCase())continue;let N=$7(s,D,G);if(!N.allowed)return{success:!1,error:`Budget exceeded: ${N.reason}`};let W=R7(s,D);if(!W.allowed)return{success:!1,error:`Token not allowed: ${W.reason}`}}}let i=await oc(s.walletId);if(!i)return{success:!1,error:"Sub-agent wallet not found in Keychain"};let u=a.network.chainId,d=await we(a),l=Ee(u,d),p=Qe(u),y=_e({chain:l,transport:Ze(d,a)}),m=await y.getBalance({address:i.address});if(m<10000000000000000n)return{success:!1,error:`Sub-agent wallet needs gas. Balance: ${m} wei. Fund with fund_sub_agent tool.`};let g=GR(i),h=Tt({account:g,chain:l,transport:Ze(d,a)}),w=structuredClone(o.rootDelegation),v=structuredClone(o.signedDelegation),A=t.callData.toLowerCase().startsWith(cp.toLowerCase())?j6.APPROVE:j6.TRADING;$2(w,A),$2(v,A);let _=[v,w],E;function O(D){return`${p.blockExplorer}/tx/${D}`}function $(){let D={outflows:[...r?.tokenFlows?.outflows||[]],inflows:[...r?.tokenFlows?.inflows||[]]};return t.value>0n&&!D.outflows.some(G=>G.token.toLowerCase()===Pn.toLowerCase())&&D.outflows.push({token:Pn,amount:t.value}),D}async function B(){r?.skipTradeLogging||await MR(e,{timestamp:Date.now(),action:n.action,protocol:n.protocol,details:n.details,txHash:E,success:!0}),r?.skipBudgetTracking||(r?.tokenFlows?await K5(e,$()):t.value>0n&&await LR(e,Pn,t.value))}function V(D){return D instanceof Error&&(D.name==="WaitForTransactionReceiptTimeoutError"||D.message.includes("Timed out while waiting for transaction"))}try{E=await dn(h,y,Ue.delegationManager,[{permissionContext:_,executions:[Pt({target:t.target,value:t.value,callData:t.callData})],mode:nn.SingleDefault}]);let D=await Xt(y,E);return D.status==="reverted"?(await Z5(e,"Transaction reverted on-chain",!0),{success:!1,txHash:E,error:"Transaction reverted on-chain"}):(await B(),{success:!0,txHash:E,explorerUrl:O(E),receipt:D})}catch(D){let G=D instanceof Error?D.message:"Unknown error";if(V(D)&&E)try{await new Promise(W=>setTimeout(W,1e4));let N=await y.getTransactionReceipt({hash:E});return N?.status==="success"?(await B(),{success:!0,txHash:E,explorerUrl:O(E),receipt:N}):N?.status==="reverted"?(await Z5(e,"Transaction reverted (recovered from timeout)",!0),{success:!1,txHash:E,error:"Transaction reverted on-chain"}):(await Z5(e,`Timeout: tx ${E} submitted but unconfirmed`,!0),{success:!1,txHash:E,error:`Timeout: tx submitted (${E}) but unconfirmed`})}catch{return await Z5(e,`Timeout + recovery failed: ${G}`,!0),{success:!1,txHash:E,error:`Timeout: recovery failed (${E})`}}return await Z5(e,G,!0),{success:!1,txHash:E,error:G}}}function Cre(e){let t=e.toLowerCase();return Object.values(up).some(n=>n.toLowerCase()===t)}async function MFe(e,t,n,r,a){try{let s=await e.readContract({address:t,abi:Xe,functionName:"allowance",args:[n,r]});return{hasApproval:s>=a,currentAllowance:s}}catch{return{hasApproval:!1,currentAllowance:0n}}}async function OFe(e,t,n){if(!Cre(n))return{success:!1,error:`Spender ${n} is not whitelisted for autonomous approvals. Whitelisted: ${Object.entries(up).map(([s,o])=>`${s}: ${o}`).join(", ")}`};let r=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"),a=X({abi:Xe,functionName:"approve",args:[n,r]});return await ds(e,{target:t,value:0n,callData:a},{action:"other",protocol:"other",details:{operation:"approve",token:t,spender:n}},{skipBudgetTracking:!0,skipTradeLogging:!0})}async function j2(e,t,n,r,a,s,o){let i=await q();if(!i?.wallet)return{success:!1,error:"Wallet not configured"};if(t.toLowerCase()===Pn.toLowerCase())return await ds(e,a,s,o);if(!Cre(n))return{success:!1,error:`Spender ${n} is not whitelisted for autonomous approvals.`};let u=i.network.chainId,d=await we(i),l=Ee(u,d),p=_e({chain:l,transport:Ze(d,i)}),y=i.wallet.smartAccountAddress,{hasApproval:m}=await MFe(p,t,y,n,r);if(!m){let g=await OFe(e,t,n);if(!g.success)return{success:!1,error:`Approval failed: ${g.error}`};await new Promise(h=>setTimeout(h,1e3))}return await ds(e,a,s,o)}async function Ire(e,t){let n=po(t);if(!n)return{success:!1,message:"Quote not found",error:"Quote not found or expired. Please get a fresh quote with nadfun_quote."};if(mo(n))return Gi(t),{success:!1,message:"Quote expired",error:"Quote has expired. Please get a fresh quote with nadfun_quote."};if(n.direction!=="BUY")return{success:!1,message:"Wrong quote type",error:"This quote is for selling, not buying. Use nadfun_sell instead."};let r=qi(t);if(!r)return{success:!1,message:"Execution data missing",error:"Execution data missing. Please get a fresh quote."};let a={outflows:[{token:Pn,amount:r.value}],inflows:[{token:n.token,amount:n.expectedOutputWei}]},s=await ds(e,{target:r.router,value:r.value,callData:r.calldata},{action:"buy",protocol:"nadfun",details:{token:n.tokenSymbol,tokenOutAddress:n.token,amountIn:n.amountIn,amountOut:n.expectedOutput}},{tokenFlows:a});if(!s.success)return{success:!1,message:"Autonomous buy failed",error:s.error};Gi(t);try{await ka(e,{ts:Date.now(),type:"trade_buy",pair:`${n.tokenSymbol}/MON`,margin:n.amountIn,text:`Bought ${n.expectedOutput} ${n.tokenSymbol} for ${n.amountIn} MON`,txHash:s.txHash,protocol:"nadfun"})}catch{}return{success:!0,message:`Successfully bought ${n.expectedOutput} ${n.tokenSymbol} for ${n.amountIn} MON (autonomous)`,transaction:{hash:s.txHash,explorerUrl:s.explorerUrl},trade:{tokenSymbol:n.tokenSymbol,monSpent:n.amountIn,tokensReceived:n.expectedOutput,progress:n.progressPercent}}}async function Pre(e,t){let n=po(t);if(!n)return{success:!1,message:"Quote not found",error:"Quote not found or expired. Please get a fresh quote with nadfun_quote."};if(mo(n))return Gi(t),{success:!1,message:"Quote expired",error:"Quote has expired. Please get a fresh quote with nadfun_quote."};if(n.direction!=="SELL")return{success:!1,message:"Wrong quote type",error:"This quote is for buying, not selling. Use nadfun_buy instead."};let r=qi(t);if(!r)return{success:!1,message:"Execution data missing",error:"Execution data missing. Please get a fresh quote."};let a=ye(n.amountIn,18),s={outflows:[{token:n.token,amount:a}],inflows:[{token:Pn,amount:n.expectedOutputWei}]},o=await j2(e,n.token,r.router,a,{target:r.router,value:0n,callData:r.calldata},{action:"sell",protocol:"nadfun",details:{token:n.tokenSymbol,tokenInAddress:n.token,amountIn:n.amountIn,amountOut:n.expectedOutput}},{tokenFlows:s});if(!o.success)return{success:!1,message:"Autonomous sell failed",error:o.error};Gi(t);try{await ka(e,{ts:Date.now(),type:"trade_sell",pair:`${n.tokenSymbol}/MON`,margin:n.amountIn,text:`Sold ${n.amountIn} ${n.tokenSymbol} for ${n.expectedOutput} MON`,txHash:o.txHash,protocol:"nadfun"})}catch{}return{success:!0,message:`Successfully sold ${n.amountIn} ${n.tokenSymbol} for ${n.expectedOutput} MON (autonomous)`,transaction:{hash:o.txHash,explorerUrl:o.explorerUrl},trade:{tokenSymbol:n.tokenSymbol,tokensSold:n.amountIn,monReceived:n.expectedOutput,progress:n.progressPercent}}}async function Rre(e,t){let n=await L2(t),r=await ds(e,{target:n.to,value:n.value,callData:n.data},{action:"close",protocol:"leverup",details:{positionId:t}});if(!r.success)return{success:!1,message:"Autonomous close failed",error:r.error};if(r.receipt)try{let s=(await q())?.wallet?.smartAccountAddress;if(s){let o=await DFe(r.receipt.blockNumber,s);o.length>0&&await K5(e,{outflows:[],inflows:o})}}catch{}try{await C2(e,t)}catch{}try{await ka(e,{ts:Date.now(),type:"trade_close",tradeHash:t,text:`Closed position ${t.slice(0,10)}...`,txHash:r.txHash,protocol:"leverup"})}catch{}return{success:!0,message:`Successfully closed position ${t.slice(0,10)}... (autonomous)`,txHash:r.txHash,explorerUrl:r.explorerUrl}}async function $re(e,t,n,r){if(n===void 0&&r===void 0)return{success:!1,message:"Invalid parameters",error:"At least one of takeProfit or stopLoss must be provided."};if(r&&r!=="0"){let d=await c0(e),l=await pp(e);if(d&&l?.rootDelegation){let p=l.rootDelegation.delegator,m=(await J5(p)).find(g=>g.position.positionHash===t);if(m){let g=Number(le(m.position.entryPrice,18)),h=Number(r),w=m.position.isLong,v=w&&h>=g,T=!w&&h<=g;if(v){let A=(g*.99).toFixed(2);return{success:!1,message:"Invalid SL direction",error:`Invalid SL for LONG: SL ($${h}) must be below entry ($${g.toFixed(2)}). LeverUp requires SL in loss direction. Suggested: $${A}`}}if(T){let A=(g*1.01).toFixed(2);return{success:!1,message:"Invalid SL direction",error:`Invalid SL for SHORT: SL ($${h}) must be above entry ($${g.toFixed(2)}). LeverUp requires SL in loss direction. Suggested: $${A}`}}}}}let a=n?ye(n,18):0n,s=r?ye(r,18):0n,o=U2(t,a,s),i=await ds(e,{target:o.to,value:o.value,callData:o.data},{action:"other",protocol:"leverup",details:{operation:"updateTpSl",positionId:t,takeProfit:n||"unchanged",stopLoss:r||"unchanged"}});if(!i.success)return{success:!1,message:"Autonomous TP/SL update failed",error:i.error};let u=[];return n&&u.push(n==="0"?"TP disabled":`TP=$${n}`),r&&u.push(r==="0"?"SL disabled":`SL=$${r}`),{success:!0,message:`Successfully updated ${u.join(", ")} (autonomous)`,txHash:i.txHash,explorerUrl:i.explorerUrl}}async function Dre(e,t){if(t.length===0)return{success:!1,message:"No orders to cancel",error:"Please provide at least one order hash."};let n=t.length===1?F2(t[0]):z2(t),r=await ds(e,{target:n.to,value:n.value,callData:n.data},{action:"other",protocol:"leverup",details:{operation:"cancelLimitOrder",orderCount:String(t.length)}});if(!r.success)return{success:!1,message:"Autonomous cancel failed",error:r.error};if(r.receipt)try{let s=(await q())?.wallet?.smartAccountAddress;if(s){let o=RFe(r.receipt,s);o.length>0&&await K5(e,{outflows:[],inflows:o})}}catch{}try{await ka(e,{ts:Date.now(),type:"cancel_order",text:`Cancelled ${t.length} limit order(s)`,txHash:r.txHash,protocol:"leverup"})}catch{}return{success:!0,message:t.length===1?"Successfully cancelled limit order (autonomous)":`Successfully cancelled ${t.length} limit orders (autonomous)`,txHash:r.txHash,explorerUrl:r.explorerUrl}}async function Mre(e,t,n,r="MON"){let a=r==="MON",s=Ia(r),o=ye(n,s);function i(m){switch(m){case"MON":return _r;case"USDC":return V0;case"LVUSD":return g0;case"LVMON":return h0}}let u=i(r),d=B2(t,u,o,a),p={outflows:[{token:a?Pn:u,amount:o}],inflows:[]},y;return a?y=await ds(e,{target:d.to,value:d.value,callData:d.data},{action:"other",protocol:"leverup",details:{operation:"addMargin",positionId:t,amount:n,collateral:r}},{tokenFlows:p}):y=await j2(e,u,d.to,o,{target:d.to,value:d.value,callData:d.data},{action:"other",protocol:"leverup",details:{operation:"addMargin",positionId:t,amount:n,collateral:r}},{tokenFlows:p}),y.success?{success:!0,message:`Successfully added ${n} ${r} margin (autonomous)`,txHash:y.txHash,explorerUrl:y.explorerUrl}:{success:!1,message:"Autonomous add margin failed",error:y.error}}async function Ore(e,t,n,r){let a=await q();if(!a?.wallet)return{success:!1,message:"Wallet not configured",error:"Wallet not configured"};let s=a.network.chainId,o=t.toUpperCase()==="MON"||t.toLowerCase()===Pn.toLowerCase(),i,u,d;if(o)i="MON",u=18,d=Pn;else{let w=await is(t,s);if(!w)return{success:!1,message:"Token not found",error:`Token not found: ${t}. Please provide a valid symbol or address.`};i=w.symbol,u=w.decimals,d=w.address}let l=ye(r,u),p,y,m;o?(p=n,y=l,m="0x"):(p=d,y=0n,m=X({abi:Xe,functionName:"transfer",args:[n,l]}));let h=await ds(e,{target:p,value:y,callData:m},{action:"other",protocol:"other",details:{operation:"transfer",token:i,recipient:n,amount:r}},{tokenFlows:{outflows:[{token:d,amount:l}],inflows:[]}});return h.success?{success:!0,message:`Successfully transferred ${r} ${i} (autonomous)`,txHash:h.txHash,explorerUrl:h.explorerUrl,transfer:{token:i,recipient:n,amount:r,isNative:o}}:!o&&(h.error?.includes("allowance")||h.error?.includes("approve"))?{success:!1,message:"Token approval needed",error:`${i} approval required. Use assistant mode first.`}:{success:!1,message:"Autonomous transfer failed",error:h.error}}var Nre=[{type:"function",name:"deposit",inputs:[],outputs:[],stateMutability:"payable"},{type:"function",name:"withdraw",inputs:[{name:"wad",type:"uint256"}],outputs:[],stateMutability:"nonpayable"}];async function Lre(e,t){let n=await q();if(!n?.wallet)return{success:!1,message:"Wallet not configured",error:"Wallet not configured"};let a=Qe(n.network.chainId).tokens.wmon;if(!a)return{success:!1,message:"WMON not configured",error:"WMON address not configured for this chain"};let s=ye(t,18),o=X({abi:Nre,functionName:"deposit"}),u=await ds(e,{target:a,value:s,callData:o},{action:"other",protocol:"other",details:{operation:"wrap",amount:t}},{tokenFlows:{outflows:[{token:Pn,amount:s}],inflows:[{token:a,amount:s}]}});return u.success?{success:!0,message:`Successfully wrapped ${t} MON \u2192 WMON (autonomous)`,txHash:u.txHash,explorerUrl:u.explorerUrl,wrap:{direction:"wrap",amount:t}}:{success:!1,message:"Autonomous wrap failed",error:u.error}}async function Bre(e,t){let n=await q();if(!n?.wallet)return{success:!1,message:"Wallet not configured",error:"Wallet not configured"};let a=Qe(n.network.chainId).tokens.wmon;if(!a)return{success:!1,message:"WMON not configured",error:"WMON address not configured for this chain"};let s=ye(t,18),o=X({abi:Nre,functionName:"withdraw",args:[s]}),u=await ds(e,{target:a,value:0n,callData:o},{action:"other",protocol:"other",details:{operation:"unwrap",amount:t}},{tokenFlows:{outflows:[{token:a,amount:s}],inflows:[{token:Pn,amount:s}]}});return u.success?{success:!0,message:`Successfully unwrapped ${t} WMON \u2192 MON (autonomous)`,txHash:u.txHash,explorerUrl:u.explorerUrl,wrap:{direction:"unwrap",amount:t}}:{success:!1,message:"Autonomous unwrap failed",error:u.error}}async function Ure(e,t,n=500){let r=await q();if(!r?.wallet)return{success:!1,message:"Wallet not configured",results:[],summary:{total:0,successful:0,failed:0},error:"Wallet not configured"};let a=Qe(r.network.chainId),s=[];for(let u of t){let d=await G6(u);if(!d){s.push({quoteId:u,success:!1,error:"Quote not found or expired. Please get a fresh quote."});continue}if(ac(d)){s.push({quoteId:u,success:!1,error:"Quote has expired. Please get a fresh quote."});continue}let l=await V5(u);if(!l){s.push({quoteId:u,success:!1,error:"Execution data missing. Please get a fresh quote."});continue}let p=d.fromToken.address.toLowerCase()===Pn.toLowerCase(),y=p?l.value||d.amountInWei:0n,m={outflows:[{token:d.fromToken.address,amount:p?y:d.amountInWei}],inflows:[{token:d.toToken.address,amount:d.expectedOutputWei}]},g=d.fromToken.address.toLowerCase(),w=g===Pn||g===_r.toLowerCase()?"buy":"sell",v;if(p?v=await ds(e,{target:l.router,value:y,callData:l.calldata},{action:w,protocol:"dex",details:{fromToken:d.fromToken.symbol,toToken:d.toToken.symbol,amountIn:d.amountIn,amountOut:d.expectedOutput}},{tokenFlows:m}):v=await j2(e,d.fromToken.address,l.router,d.amountInWei,{target:l.router,value:0n,callData:l.calldata},{action:w,protocol:"dex",details:{fromToken:d.fromToken.symbol,toToken:d.toToken.symbol,amountIn:d.amountIn,amountOut:d.expectedOutput}},{tokenFlows:m}),!v.success){s.push({quoteId:u,success:!1,error:v.error});continue}try{await ka(e,{ts:Date.now(),type:w==="buy"?"trade_buy":"trade_sell",pair:`${d.fromToken.symbol}/${d.toToken.symbol}`,margin:d.amountIn,text:`Swapped ${d.amountIn} ${d.fromToken.symbol} for ${d.expectedOutput} ${d.toToken.symbol}`,txHash:v.txHash,protocol:"dex"})}catch{}s.push({quoteId:u,success:!0,txHash:v.txHash,explorerUrl:v.explorerUrl,swap:{fromToken:d.fromToken.symbol,toToken:d.toToken.symbol,amountIn:`${d.amountIn} ${d.fromToken.symbol}`,amountOut:`${d.expectedOutput} ${d.toToken.symbol}`}})}let o=s.filter(u=>u.success).length,i=s.filter(u=>!u.success).length;return{success:o>0,message:`Executed ${o}/${t.length} swaps (autonomous)`,results:s,summary:{total:t.length,successful:o,failed:i}}}async function Hre(e,t){let n=await q();if(!n?.wallet)return{success:!1,message:"Wallet not configured",error:"Wallet not configured"};let r=t.collateralToken||"MON",a=Fn.find(w=>w.pair===`${t.symbol}/USD`||w.pair===t.symbol);if(!a)return{success:!1,message:"Unsupported pair",error:`Pair not supported: ${t.symbol}. Check leverup_list_pairs for available pairs.`};if(a.isHighLeverage&&!Qo(t.leverage))return{success:!1,message:"Invalid leverage for Zero-Fee pair",error:`${a.pair} ONLY supports ${bo.join(", ")}x leverage. Requested: ${t.leverage}x.`};let s;try{s=await J6(t.symbol,t.isLong,t.marginAmount,t.leverage,r)}catch(w){return{success:!1,message:"Quote failed",error:w instanceof Error?w.message:"Failed to get quote"}}let o=parseFloat(s.entryPrice);if(t.takeProfit){let w=parseFloat(t.takeProfit),v=X6(t.leverage),T=t.isLong?(w-o)/o*100:(o-w)/o*100;if(T<=0){let A=t.isLong?"above":"below";return{success:!1,message:"Invalid TP",error:`For ${t.isLong?"Long":"Short"}, TP must be ${A} entry price ($${o}).`}}if(T>v)return{success:!1,message:"TP exceeds max",error:`Max TP for ${t.leverage}x is ${v}%. Requested: ${T.toFixed(1)}%.`}}if(t.stopLoss){let w=parseFloat(t.stopLoss);if(t.isLong?w>=o:w<=o){let T=t.isLong?"below":"above";return{success:!1,message:"Invalid SL",error:`For ${t.isLong?"Long":"Short"}, SL must be ${T} entry price ($${o}).`}}}let i=BigInt(t.slippageBps??100),u=ye(s.entryPrice,18),d=t.isLong?u*(10000n+i)/10000n:u*(10000n-i)/10000n,l=ye(t.marginAmount,Ia(r)),p=ye(s.positionSize,10),y;try{y=await N2({symbol:t.symbol,isLong:t.isLong,amountIn:l,leverage:t.leverage,qty:p,price:d,collateralToken:r,stopLoss:t.stopLoss?ye(t.stopLoss,18):0n,takeProfit:t.takeProfit?ye(t.takeProfit,18):0n},n)}catch(w){return{success:!1,message:"Execution build failed",error:w instanceof Error?w.message:"Failed to build execution"}}let m=F7[r],g={outflows:[{token:m,amount:l}],inflows:[]},h;if(r==="MON")h=await ds(e,{target:y.to,value:y.value,callData:y.data},{action:"open",protocol:"leverup",details:{symbol:t.symbol,side:t.isLong?"LONG":"SHORT",leverage:String(t.leverage),margin:t.marginAmount,collateral:r}},{tokenFlows:g});else{let w=F7[r];h=await j2(e,w,y.to,l,{target:y.to,value:y.value,callData:y.data},{action:"open",protocol:"leverup",details:{symbol:t.symbol,side:t.isLong?"LONG":"SHORT",leverage:String(t.leverage),margin:t.marginAmount,collateral:r}},{tokenFlows:g})}if(!h.success)return{success:!1,message:"Autonomous open failed",error:h.error};try{await ka(e,{ts:Date.now(),type:"trade_open",pair:a.pair,side:t.isLong?"LONG":"SHORT",margin:t.marginAmount,leverage:String(t.leverage),text:`Opened ${t.leverage}x ${t.isLong?"Long":"Short"} ${t.symbol} with ${t.marginAmount} ${r}`,txHash:h.txHash,protocol:"leverup"})}catch{}try{let w=n.wallet?.smartAccountAddress,v=a.pair,A=(await J5(w,[v])).find(_=>_.position.pair===v&&_.position.isLong===t.isLong&&PFe(_.position.margin,l)*100n<=l*5n);D7(e,{tradeHash:A?.position.positionHash,pair:v,side:t.isLong?"LONG":"SHORT",margin:l.toString(),collateralToken:m,leverage:t.leverage,entryPrice:s.entryPrice,stopLoss:t.stopLoss||"0",takeProfit:t.takeProfit||"0",openedAt:Date.now(),status:"open"})}catch{}return{success:!0,message:`Successfully opened ${t.leverage}x ${t.isLong?"Long":"Short"} ${t.symbol} (autonomous)`,txHash:h.txHash,explorerUrl:h.explorerUrl}}async function Fre(e,t){let n=await q();if(!n?.wallet)return{success:!1,message:"Wallet not configured",error:"Wallet not configured"};let r=t.collateralToken||"MON",a=Fn.find(g=>g.pair===`${t.symbol}/USD`||g.pair===t.symbol);if(!a)return{success:!1,message:"Unsupported pair",error:`Pair not supported: ${t.symbol}`};if(a.isHighLeverage&&!Qo(t.leverage))return{success:!1,message:"Invalid leverage for Zero-Fee pair",error:`${a.pair} ONLY supports ${bo.join(", ")}x leverage.`};let s;try{s=await O2(t.symbol,t.isLong,t.marginAmount,t.leverage,t.triggerPrice,r)}catch(g){return{success:!1,message:"Quote failed",error:g instanceof Error?g.message:"Failed to get quote"}}if(!s.isTriggerValid)return{success:!1,message:"Invalid trigger price",error:s.triggerValidationMessage};if(!s.meetsMinimums)return{success:!1,message:"Position too small",error:s.warnings.join(" ")};let o=parseFloat(t.triggerPrice);if(t.takeProfit){let g=parseFloat(t.takeProfit),h=X6(t.leverage),w=t.isLong?(g-o)/o*100:(o-g)/o*100;if(w<=0){let v=t.isLong?"above":"below";return{success:!1,message:"Invalid TP",error:`For ${t.isLong?"Long":"Short"} limit, TP must be ${v} trigger price ($${o}).`}}if(w>h)return{success:!1,message:"TP exceeds max",error:`Max TP for ${t.leverage}x is ${h}%.`}}if(t.stopLoss){let g=parseFloat(t.stopLoss);if(t.isLong?g>=o:g<=o){let w=t.isLong?"below":"above";return{success:!1,message:"Invalid SL",error:`For ${t.isLong?"Long":"Short"} limit, SL must be ${w} trigger price ($${o}).`}}}let i=ye(t.triggerPrice,18),u=ye(t.marginAmount,Ia(r)),d=ye(s.positionSize,10),l;try{l=await H2({symbol:t.symbol,isLong:t.isLong,amountIn:u,leverage:t.leverage,qty:d,triggerPrice:i,collateralToken:r,stopLoss:t.stopLoss?ye(t.stopLoss,18):0n,takeProfit:t.takeProfit?ye(t.takeProfit,18):0n},n)}catch(g){return{success:!1,message:"Execution build failed",error:g instanceof Error?g.message:"Failed to build execution"}}let p=F7[r],y={outflows:[{token:p,amount:u}],inflows:[]},m;if(r==="MON")m=await ds(e,{target:l.to,value:l.value,callData:l.data},{action:"open",protocol:"leverup",details:{operation:"limitOrder",symbol:t.symbol,side:t.isLong?"LONG":"SHORT",leverage:String(t.leverage),triggerPrice:t.triggerPrice,margin:t.marginAmount,collateral:r}},{tokenFlows:y});else{let g=F7[r];m=await j2(e,g,l.to,u,{target:l.to,value:l.value,callData:l.data},{action:"open",protocol:"leverup",details:{operation:"limitOrder",symbol:t.symbol,side:t.isLong?"LONG":"SHORT",leverage:String(t.leverage),triggerPrice:t.triggerPrice,margin:t.marginAmount,collateral:r}},{tokenFlows:y})}if(!m.success)return{success:!1,message:"Autonomous limit order failed",error:m.error};try{await ka(e,{ts:Date.now(),type:"limit_order",pair:a.pair,side:t.isLong?"LONG":"SHORT",margin:t.marginAmount,leverage:String(t.leverage),text:`Placed ${t.leverage}x ${t.isLong?"Long":"Short"} limit on ${t.symbol} @ $${t.triggerPrice}`,txHash:m.txHash,protocol:"leverup"})}catch{}try{D7(e,{pair:a.pair,side:t.isLong?"LONG":"SHORT",margin:u.toString(),collateralToken:p,leverage:t.leverage,entryPrice:t.triggerPrice,stopLoss:t.stopLoss||"0",takeProfit:t.takeProfit||"0",openedAt:Date.now(),status:"pending_fill"})}catch{}return{success:!0,message:`Successfully placed ${t.leverage}x ${t.isLong?"Long":"Short"} limit order on ${t.symbol} @ $${t.triggerPrice} (autonomous)`,txHash:m.txHash,explorerUrl:m.explorerUrl}}Y();Te();mt();We();Ar();M0();import{existsSync as NFe,readFileSync as LFe}from"fs";import{homedir as BFe}from"os";import UFe from"path";function u$(){let e=UFe.join(BFe(),".pragma","delegations","root","delegation.json");if(!NFe(e))return null;try{let t=LFe(e,"utf-8");return JSON.parse(t).signedDelegation??null}catch{return null}}function HFe(e){let t=e.caveats.find(n=>n.enforcer.toLowerCase()===b2.toLowerCase());if(!t)return 2;try{let[n]=ca([{type:"tuple[]",components:[{name:"caveats",type:"tuple[]",components:[{name:"enforcer",type:"address"},{name:"terms",type:"bytes"},{name:"args",type:"bytes"}]}]}],t.terms);return n.length}catch{return 2}}function FFe(e,t){let n=e.callData.toLowerCase();if(n.startsWith(cp.toLowerCase()))return j6.APPROVE;if(HFe(t)>=4){if((e.callData==="0x"||e.callData==="0x00")&&e.value>0n)return j6.NATIVE_TRANSFER;if(n.startsWith(Rne.toLowerCase()))return j6.ERC20_TRANSFER}return j6.TRADING}async function zn(e,t){let n=u$();if(!n)return{success:!1,message:"No delegation found",error:"Root delegation not found at ~/.pragma/delegations/root/delegation.json. Please run the delegation flow first (request_delegation \u2192 approve \u2192 retrieve_delegation)."};let r=structuredClone(n),a=FFe(e,n);$2(r,a);let s=await ht();if(!s)return{success:!1,message:"Session key not found",error:"File-based session key not found. Run setup_wallet first."};let o=t.network.chainId,i=await we(t),u=Ee(o,i),d=Qe(o),l=on(s),p=Tt({account:l,chain:u,transport:Ze(i,t)}),y=_e({chain:u,transport:Ze(i,t)});try{let m=await dn(p,y,Ue.delegationManager,[{permissionContext:[r],executions:[Pt({target:e.target,value:e.value,callData:e.callData})],mode:nn.SingleDefault}]);return(await Xt(y,m)).status==="reverted"?{success:!1,message:"Transaction reverted on-chain",txHash:m,explorerUrl:`${d.blockExplorer}/tx/${m}`,error:"Transaction reverted on-chain"}:{success:!0,message:"Transaction successful",txHash:m,explorerUrl:`${d.blockExplorer}/tx/${m}`}}catch(m){return{success:!1,message:"Transaction failed",error:m instanceof Error?m.message:"Unknown error"}}}function zFe(e){let t=e.toLowerCase();return Object.values(up).some(n=>n.toLowerCase()===t)}async function Vi(e,t,n,r,a){if(!zFe(t))return{success:!1,message:"Spender not whitelisted",error:`Spender ${t} is not whitelisted for headless approvals.`};let s=a.wallet.smartAccountAddress,o=a.network.chainId,i=await we(a),u=Ee(o,i),d=_e({chain:u,transport:Ze(i,a)}),l=!1;try{l=await d.readContract({address:e,abi:Xe,functionName:"allowance",args:[s,t]})>=n}catch{}if(!l){let p=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"),y=X({abi:Xe,functionName:"approve",args:[t,p]}),m=await zn({target:e,value:0n,callData:y},a);if(!m.success)return{success:!1,message:"Approval failed",error:`ERC20 approval failed: ${m.error}`};await new Promise(g=>setTimeout(g,1e3))}return await zn(r,a)}t0();Te();mt();var d$=500,zre=5e3,jFe=I.object({quoteIds:I.array(I.string()).min(1).describe("List of Quote IDs to execute. Pass multiple IDs for parallel batch execution."),slippageBps:I.number().optional().describe("Max slippage in basis points. NOTE: Slippage is already baked into the quote - set slippage at quote time via get_swap_quote instead."),agentId:I.string().optional().describe("Sub-agent ID for autonomous execution (no Touch ID). If omitted, uses assistant mode with Touch ID confirmation.")});function jre(e){e.tool("execute_swap","Execute one or more swaps. If agentId provided: uses autonomous mode (no Touch ID). If no agentId: uses assistant mode (requires Touch ID). Handles approvals automatically. Supports parallel batch execution.",jFe.shape,async t=>{let n=await qFe(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function qFe(e){try{let t=await q();if(!t||!Pe(t))return{success:!1,message:"Wallet not configured",results:[],summary:{total:0,successful:0,failed:0},error:"Please run setup_wallet first to create your pragma wallet"};if(e.agentId){let d=e.slippageBps??d$;return await Ure(e.agentId,e.quoteIds,d)}if(_t()){let d=[];for(let p of e.quoteIds){let y=await G6(p);if(!y){d.push({quoteId:p,success:!1,error:"Quote not found or expired. Get a fresh quote."});continue}if(ac(y)){d.push({quoteId:p,success:!1,error:"Quote expired. Get a fresh quote."});continue}let m=V5(p);if(!m){d.push({quoteId:p,success:!1,error:"Execution data missing. Get a fresh quote."});continue}let g=y.fromToken.address.toLowerCase()===B0.toLowerCase(),h;g?h=await zn({target:m.router,value:m.value,callData:m.calldata},t):h=await Vi(y.fromToken.address,m.router,y.amountInWei,{target:m.router,value:m.value,callData:m.calldata},t),d.push({quoteId:p,success:h.success,txHash:h.txHash,explorerUrl:h.explorerUrl,error:h.error,swap:{fromToken:y.fromToken.symbol,toToken:y.toToken.symbol,amountIn:`${y.amountIn} ${y.fromToken.symbol}`,amountOut:`${y.expectedOutput} ${y.toToken.symbol}`}})}let l=d.filter(p=>p.success).length;return{success:l>0,message:`Executed ${l}/${e.quoteIds.length} swaps`,results:d,summary:{total:e.quoteIds.length,successful:l,failed:e.quoteIds.length-l}}}for(let d of e.quoteIds){let l=await G6(d);if(!l)return{success:!1,message:"Quote validation failed",results:[],summary:{total:0,successful:0,failed:0},error:`Quote ${d} not found or expired. Please get a fresh quote.`};if(ac(l))return{success:!1,message:"Quote expired",results:[],summary:{total:0,successful:0,failed:0},error:`Quote ${d} has expired. Please get a fresh quote.`}}let n=e.slippageBps??d$;n>zre&&(n=zre),n<0&&(n=d$);let r=await N0e(e.quoteIds,n),s=Qe(t.network.chainId).blockExplorer||"https://monadvision.com",o=r.results.map(d=>({quoteId:d.quoteId,success:d.success,txHash:d.txHash,explorerUrl:d.txHash?`${s}/tx/${d.txHash}`:void 0,error:d.error,swap:d.quote?{fromToken:d.quote.fromToken.symbol,toToken:d.quote.toToken.symbol,amountIn:`${d.quote.amountIn} ${d.quote.fromToken.symbol}`,amountOut:`${d.quote.expectedOutput} ${d.quote.toToken.symbol}`}:void 0})),i=o.filter(d=>d.success).length,u=o.filter(d=>!d.success).length;return{success:i>0,message:`Executed ${i}/${e.quoteIds.length} swaps`,results:o,summary:{total:e.quoteIds.length,successful:i,failed:u}}}catch(t){let n=t instanceof Error?t.message:"Unknown error";return{success:!1,message:"Batch execution failed",results:[],summary:{total:0,successful:0,failed:0},error:n}}}Y();Y();M0();Te();mt();We();Ar();function GFe(e){return e.toUpperCase().trim()==="MON"||e.toLowerCase()===B0.toLowerCase()}async function qre(e){let t=await q();if(!t?.wallet)throw new Error("Wallet not configured. Please run setup_wallet first.");let n=t.wallet.smartAccountAddress,r=t.wallet.sessionKeyAddress,a=t.network.chainId,s=GFe(e.token),o,i,u;if(s)o="MON",i=18,u=B0;else{let D=await is(e.token,a);if(!D)throw new Error(`Token not found: ${e.token}. Please provide a valid symbol or address.`);D.kind==="native"?(o="MON",i=18,u=B0):(o=D.symbol,i=D.decimals,u=D.address)}let d=ye(e.amount,i);if(d<=0n)throw new Error("Amount must be greater than 0");let l=await we(t),p=Ee(a,l),y=_e({chain:p,transport:Ze(l,t)});if(s||u===B0){let D=await y.getBalance({address:n});if(D<d){let G=Ge(D);throw new Error(`Insufficient MON balance. Have: ${G} MON, Need: ${e.amount} MON`)}}else{let D=await y.readContract({address:u,abi:Xe,functionName:"balanceOf",args:[n]});if(D<d){let G=le(D,i);throw new Error(`Insufficient ${o} balance. Have: ${G}, Need: ${e.amount}`)}}let m=await ht();if(!m)throw new Error("Session key not found. Please run setup_wallet first.");let g=await y.getBalance({address:r}),h=lo("transfer");if(g<h)throw new Error(`Session key balance too low: ${G0(g)} (minimum for transfer: ${G0(h)}). Please call fund_session_key first with operationType: "transfer".`);let w=await Tn(y,n),v;if(s||u===B0)v={delegation:k7({recipient:e.to,amount:d,delegator:n,sessionKey:r,nonce:w,chainId:a}).delegation,execution:{target:e.to,value:d,callData:"0x"},kind:"transfer"};else{let D=E7({tokenAddress:u,recipient:e.to,amount:d,delegator:n,sessionKey:r,nonce:w,chainId:a}),G=X({abi:Xe,functionName:"transfer",args:[e.to,d]});v={delegation:D.delegation,execution:{target:u,value:0n,callData:G},kind:"transfer"}}let T=t.wallet.keyId;if(!T)throw new Error("Key ID not found in config. Please run setup_wallet first.");let A=`${e.to.slice(0,8)}...${e.to.slice(-6)}`,_=`Transfer ${e.amount} ${o} to ${A}`,E=await _n(v.delegation,a,T,_);v.delegation.signature=E;let O=on(m),$=Tt({account:O,chain:p,transport:Ze(l,t)}),B=Pt({target:v.execution.target,value:v.execution.value,callData:v.execution.callData}),V=await dn($,y,Ue.delegationManager,[{permissionContext:[v.delegation],executions:[B],mode:nn.SingleDefault}]);return await Xt(y,V),{txHash:V,status:"success",token:{symbol:o,address:u,isNative:s||u===B0},recipient:e.to,amount:e.amount,amountWei:d}}t0();Te();mt();var VFe=I.object({token:I.string().describe("Token to transfer: 'MON' for native, or symbol like 'USDC', 'WMON', or contract address (0x...)"),to:I.string().describe("Recipient address (0x...)"),amount:I.string().describe("Amount to transfer in human-readable format (e.g., '1.5' for 1.5 tokens)"),agentId:I.string().optional().describe("Sub-agent ID for autonomous execution (no Touch ID). If omitted, uses assistant mode with Touch ID confirmation.")});function Gre(e){e.tool("transfer","Transfer tokens to another address. Supports both native MON and ERC20 tokens. If agentId provided: uses autonomous mode (no Touch ID). If no agentId: uses assistant mode (requires Touch ID). Always verify the recipient address with the user before executing.",VFe.shape,async t=>{let n=await WFe(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function WFe(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){if(!e.to||!Se(e.to))return{success:!1,message:"Invalid recipient address",error:"Please provide a valid recipient address (0x...)"};let u=await Ore(e.agentId,e.token,xe(e.to),e.amount);return{success:u.success,message:u.message,transaction:u.txHash?{hash:u.txHash,explorerUrl:u.explorerUrl,status:"success"}:void 0,transfer:u.transfer?{token:u.transfer.token,tokenAddress:u.transfer.isNative?"native":u.transfer.token,isNative:u.transfer.isNative,recipient:u.transfer.recipient,amount:u.transfer.amount}:void 0,error:u.error}}if(_t()){if(!e.to||!Se(e.to))return{success:!1,message:"Invalid recipient address",error:"Please provide a valid recipient address (0x...)"};let u=xe(e.to),d=t.network.chainId,l=e.token.toUpperCase()==="MON"||e.token.toLowerCase()===B0.toLowerCase(),p,y,m,g;if(l){let v=ye(e.amount,18);p=u,y=v,m="0x",g="MON"}else{let v=await is(e.token,d);if(!v)return{success:!1,message:"Token not found",error:`Token not found: ${e.token}`};let T=ye(e.amount,v.decimals);p=v.address,y=0n,m=X({abi:Xe,functionName:"transfer",args:[u,T]}),g=v.symbol}let h=await zn({target:p,value:y,callData:m},t),w=Qe(d);return{success:h.success,message:h.success?`Transferred ${e.amount} ${g} to ${u}`:h.message,transaction:h.txHash?{hash:h.txHash,explorerUrl:h.explorerUrl||`${w.blockExplorer}/tx/${h.txHash}`,status:"success"}:void 0,transfer:h.success?{token:g,tokenAddress:l?"native":p,isNative:l,recipient:u,amount:e.amount}:void 0,error:h.error}}if(!e.to||!Se(e.to))return{success:!1,message:"Invalid recipient address",error:"Please provide a valid recipient address (0x...)"};let n=xe(e.to),r=parseFloat(e.amount);if(isNaN(r)||r<=0)return{success:!1,message:"Invalid amount",error:"Please provide a valid amount greater than 0"};let a=await qre({token:e.token,to:n,amount:e.amount}),s=Qe(t.network.chainId),o=s.blockExplorer?`${s.blockExplorer}/tx/${a.txHash}`:`https://monadvision.com/tx/${a.txHash}`,i=a.token.isNative?"native MON":a.token.symbol;return{success:!0,message:`Transferred ${e.amount} ${i} to ${n}`,transaction:{hash:a.txHash,explorerUrl:o,status:a.status},transfer:{token:a.token.symbol,tokenAddress:a.token.address,isNative:a.token.isNative,recipient:n,amount:e.amount}}}catch(t){let n=t instanceof Error?t.message:"Unknown error";return n.includes("Touch ID")||n.includes("authentication")?{success:!1,message:"Authentication required",error:"Touch ID authentication was cancelled or failed. Please try again."}:n.includes("insufficient")||n.includes("balance")?{success:!1,message:"Insufficient balance",error:n}:n.includes("nonce")?{success:!1,message:"Nonce error",error:"A delegation was already used. Please try again."}:n.includes("reverted")?{success:!1,message:"Transaction reverted",error:`The transfer transaction was reverted: ${n}`}:{success:!1,message:"Transfer failed",error:n}}}Y();M0();Te();mt();We();Ar();var Vre=[{type:"function",name:"deposit",inputs:[],outputs:[],stateMutability:"payable"},{type:"function",name:"withdraw",inputs:[{name:"wad",type:"uint256"}],outputs:[],stateMutability:"nonpayable"}];async function Wre(e){let t=await q();if(!t?.wallet)throw new Error("Wallet not configured. Please run setup_wallet first.");let n=t.wallet.smartAccountAddress,r=t.wallet.sessionKeyAddress,a=t.network.chainId,o=Qe(a).tokens.wmon;if(!o)throw new Error(`WMON address not configured for chain ${a}`);let i=ye(e.amount,18);if(i<=0n)throw new Error("Amount must be greater than 0");let u=await we(t),d=Ee(a,u),l=_e({chain:d,transport:Ze(u,t)}),p=await l.getBalance({address:n});if(p<i){let D=le(p,18);throw new Error(`Insufficient MON balance. Have: ${D} MON, Need: ${e.amount} MON`)}let y=await ht();if(!y)throw new Error("Session key not found. Please run setup_wallet first.");let m=await l.getBalance({address:r}),g=lo("wrap");if(m<g)throw new Error(`Session key balance too low: ${G0(m)} (minimum for wrap: ${G0(g)}). Please call fund_session_key first with operationType: "wrap".`);let h=await Tn(l,n),w=S0e({wmonAddress:o,amount:i,delegator:n,sessionKey:r,nonce:h,chainId:a}),v=X({abi:Vre,functionName:"deposit"}),T={delegation:w.delegation,execution:{target:o,value:i,callData:v},kind:"wrap"},A=t.wallet.keyId;if(!A)throw new Error("Key ID not found in config. Please run setup_wallet first.");let _=`Wrap ${e.amount} MON \u2192 WMON`,E=await _n(T.delegation,a,A,_);T.delegation.signature=E;let O=on(y),$=Tt({account:O,chain:d,transport:Ze(u,t)}),B=Pt({target:T.execution.target,value:T.execution.value,callData:T.execution.callData}),V=await dn($,l,Ue.delegationManager,[{permissionContext:[T.delegation],executions:[B],mode:nn.SingleDefault}]);return await Xt(l,V),{txHash:V,status:"success",amount:e.amount,amountWei:i,direction:"wrap"}}async function Zre(e){let t=await q();if(!t?.wallet)throw new Error("Wallet not configured. Please run setup_wallet first.");let n=t.wallet.smartAccountAddress,r=t.wallet.sessionKeyAddress,a=t.network.chainId,o=Qe(a).tokens.wmon;if(!o)throw new Error(`WMON address not configured for chain ${a}`);let i=ye(e.amount,18);if(i<=0n)throw new Error("Amount must be greater than 0");let u=await we(t),d=Ee(a,u),l=_e({chain:d,transport:Ze(u,t)}),p=await l.readContract({address:o,abi:Xe,functionName:"balanceOf",args:[n]});if(p<i){let D=le(p,18);throw new Error(`Insufficient WMON balance. Have: ${D} WMON, Need: ${e.amount} WMON`)}let y=await ht();if(!y)throw new Error("Session key not found. Please run setup_wallet first.");let m=await l.getBalance({address:r}),g=lo("unwrap");if(m<g)throw new Error(`Session key balance too low: ${G0(m)} (minimum for unwrap: ${G0(g)}). Please call fund_session_key first with operationType: "unwrap".`);let h=await Tn(l,n),w=A0e({wmonAddress:o,delegator:n,sessionKey:r,nonce:h,chainId:a}),v=X({abi:Vre,functionName:"withdraw",args:[i]}),T={delegation:w.delegation,execution:{target:o,value:0n,callData:v},kind:"unwrap"},A=t.wallet.keyId;if(!A)throw new Error("Key ID not found in config. Please run setup_wallet first.");let _=`Unwrap ${e.amount} WMON \u2192 MON`,E=await _n(T.delegation,a,A,_);T.delegation.signature=E;let O=on(y),$=Tt({account:O,chain:d,transport:Ze(u,t)}),B=Pt({target:T.execution.target,value:T.execution.value,callData:T.execution.callData}),V=await dn($,l,Ue.delegationManager,[{permissionContext:[T.delegation],executions:[B],mode:nn.SingleDefault}]);return await Xt(l,V),{txHash:V,status:"success",amount:e.amount,amountWei:i,direction:"unwrap"}}t0();Te();mt();Y();var ZFe=I.object({amount:I.string().describe("Amount of MON to wrap in human-readable format (e.g., '10' for 10 MON)"),agentId:I.string().optional().describe("Sub-agent ID for autonomous execution (no Touch ID). If omitted, uses assistant mode with Touch ID confirmation.")}),KFe=I.object({amount:I.string().describe("Amount of WMON to unwrap in human-readable format (e.g., '10' for 10 WMON)"),agentId:I.string().optional().describe("Sub-agent ID for autonomous execution (no Touch ID). If omitted, uses assistant mode with Touch ID confirmation.")});function Kre(e){e.tool("wrap","Wrap MON to WMON. If agentId provided: uses autonomous mode (no Touch ID). If no agentId: uses assistant mode (requires Touch ID). WMON is useful for DeFi operations that require ERC20 tokens.",ZFe.shape,async t=>{let n=await XFe(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}function Xre(e){e.tool("unwrap","Unwrap WMON back to MON. If agentId provided: uses autonomous mode (no Touch ID). If no agentId: uses assistant mode (requires Touch ID). Converts wrapped MON back to native MON.",KFe.shape,async t=>{let n=await JFe(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function XFe(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){let o=await Lre(e.agentId,e.amount),i=Qe(t.network.chainId);return{success:o.success,message:o.message,transaction:o.txHash?{hash:o.txHash,explorerUrl:o.explorerUrl||`${i.blockExplorer}/tx/${o.txHash}`,status:"success"}:void 0,wrap:o.wrap?{direction:o.wrap.direction,amount:o.wrap.amount,from:"MON",to:"WMON"}:void 0,error:o.error}}if(_t()){let o=pa(e.amount),i=X({abi:[{type:"function",name:"deposit",inputs:[],outputs:[],stateMutability:"payable"}],functionName:"deposit"}),u=await zn({target:_r,value:o,callData:i},t),d=Qe(t.network.chainId);return{success:u.success,message:u.success?`Wrapped ${e.amount} MON \u2192 WMON`:u.message,transaction:u.txHash?{hash:u.txHash,explorerUrl:u.explorerUrl||`${d.blockExplorer}/tx/${u.txHash}`,status:"success"}:void 0,wrap:u.success?{direction:"wrap",amount:e.amount,from:"MON",to:"WMON"}:void 0,error:u.error}}let n=parseFloat(e.amount);if(isNaN(n)||n<=0)return{success:!1,message:"Invalid amount",error:"Please provide a valid amount greater than 0"};let r=await Wre({amount:e.amount}),a=Qe(t.network.chainId),s=a.blockExplorer?`${a.blockExplorer}/tx/${r.txHash}`:`https://monadvision.com/tx/${r.txHash}`;return{success:!0,message:`Wrapped ${e.amount} MON \u2192 WMON`,transaction:{hash:r.txHash,explorerUrl:s,status:r.status},wrap:{direction:"wrap",amount:e.amount,from:"MON",to:"WMON"}}}catch(t){let n=t instanceof Error?t.message:"Unknown error";return n.includes("Touch ID")||n.includes("authentication")?{success:!1,message:"Authentication required",error:"Touch ID authentication was cancelled or failed. Please try again."}:n.includes("insufficient")||n.includes("balance")?{success:!1,message:"Insufficient balance",error:n}:n.includes("nonce")?{success:!1,message:"Nonce error",error:"A delegation was already used. Please try again."}:n.includes("reverted")?{success:!1,message:"Transaction reverted",error:`The wrap transaction was reverted: ${n}`}:{success:!1,message:"Wrap failed",error:n}}}async function JFe(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){let o=await Bre(e.agentId,e.amount),i=Qe(t.network.chainId);return{success:o.success,message:o.message,transaction:o.txHash?{hash:o.txHash,explorerUrl:o.explorerUrl||`${i.blockExplorer}/tx/${o.txHash}`,status:"success"}:void 0,wrap:o.wrap?{direction:o.wrap.direction,amount:o.wrap.amount,from:"WMON",to:"MON"}:void 0,error:o.error}}if(_t()){let o=pa(e.amount),i=X({abi:[{type:"function",name:"withdraw",inputs:[{name:"wad",type:"uint256"}],outputs:[],stateMutability:"nonpayable"}],functionName:"withdraw",args:[o]}),u=await zn({target:_r,value:0n,callData:i},t),d=Qe(t.network.chainId);return{success:u.success,message:u.success?`Unwrapped ${e.amount} WMON \u2192 MON`:u.message,transaction:u.txHash?{hash:u.txHash,explorerUrl:u.explorerUrl||`${d.blockExplorer}/tx/${u.txHash}`,status:"success"}:void 0,wrap:u.success?{direction:"unwrap",amount:e.amount,from:"WMON",to:"MON"}:void 0,error:u.error}}let n=parseFloat(e.amount);if(isNaN(n)||n<=0)return{success:!1,message:"Invalid amount",error:"Please provide a valid amount greater than 0"};let r=await Zre({amount:e.amount}),a=Qe(t.network.chainId),s=a.blockExplorer?`${a.blockExplorer}/tx/${r.txHash}`:`https://monadvision.com/tx/${r.txHash}`;return{success:!0,message:`Unwrapped ${e.amount} WMON \u2192 MON`,transaction:{hash:r.txHash,explorerUrl:s,status:r.status},wrap:{direction:"unwrap",amount:e.amount,from:"WMON",to:"MON"}}}catch(t){let n=t instanceof Error?t.message:"Unknown error";return n.includes("Touch ID")||n.includes("authentication")?{success:!1,message:"Authentication required",error:"Touch ID authentication was cancelled or failed. Please try again."}:n.includes("insufficient")||n.includes("balance")?{success:!1,message:"Insufficient balance",error:n}:n.includes("nonce")?{success:!1,message:"Nonce error",error:"A delegation was already used. Please try again."}:n.includes("reverted")?{success:!1,message:"Transaction reverted",error:`The unwrap transaction was reverted: ${n}`}:{success:!1,message:"Unwrap failed",error:n}}}Y();Te();mt();We();w8();var QFe=I.object({operationType:I.enum(["swap","transfer","wrap","unwrap"]).optional().describe("Type of operation to check balance for. Each operation has different gas costs: swap=0.14 MON, transfer/wrap/unwrap=0.04 MON"),estimatedOperations:I.number().optional().describe("Number of operations planned. Combined with operationType for accurate calculation. Examples: 1 swap = 0.16 MON needed, 3 swaps = 0.44 MON needed"),includeUsdc:I.boolean().optional().describe("Also check USDC balance for x402 payments. Auto-enabled when x402 mode is detected. Set to true to always include USDC info.")});function Jre(e){e.tool("check_session_key_balance","Check if session key has enough MON for gas and USDC for x402 payments. Pass operationType and estimatedOperations for accurate calculation. Returns current balance, required amount, and whether funding is needed. USDC balance is auto-checked in x402 mode.",QFe.shape,async t=>{let n=await YFe(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function YFe(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=t.wallet?.sessionKeyAddress;if(!n)return{success:!1,message:"Session key not found",error:"Session key address is not configured"};let r=await we(t),a=Ee(t.network.chainId,r),s=_e({chain:a,transport:gt(r,Ot(t))}),o=await T2(n,s,e.operationType,e.estimatedOperations),i;if((e.includeUsdc===!0||e.includeUsdc!==!1&&t.mode==="x402")&&RZ(t.network.chainId))try{let p=await PZ(n,s,t.network.chainId),y=p<kZ,m=p<CZ;i={balance:p.toString(),balanceFormatted:fI(p),needsFunding:y,lowBalanceWarning:m,recommendedAmount:y?fI(IZ):"0 USDC"}}catch(p){console.warn("Failed to check USDC balance:",p)}let d=e.operationType&&e.estimatedOperations?`${e.estimatedOperations} ${e.operationType} operation(s)`:e.estimatedOperations?`${e.estimatedOperations} operation(s)`:"general operations",l;return o.needsFunding?l=`Session key needs MON funding for ${d}`:l=`Session key has sufficient MON for ${d}`,i?.needsFunding?l+=`. USDC balance low (${i.balanceFormatted}) - fund with token="USDC"`:i?.lowBalanceWarning&&(l+=`. USDC balance warning: ${i.balanceFormatted}`),o.needsFunding?{success:!0,message:l,balance:{address:n,current:`${o.balanceFormatted} MON`,currentWei:o.balance.toString(),required:`${o.requiredBalanceFormatted} MON`,requiredWei:o.requiredBalance.toString()},funding:{needsFunding:!0,recommendedAmount:G0(o.recommendedFundingAmount),recommendedAmountWei:o.recommendedFundingAmount.toString(),fundingMethod:o.fundingMethod},usdc:i}:{success:!0,message:l,balance:{address:n,current:`${o.balanceFormatted} MON`,currentWei:o.balance.toString(),required:`${o.requiredBalanceFormatted} MON`,requiredWei:o.requiredBalance.toString()},funding:{needsFunding:!1,recommendedAmount:"0 MON",recommendedAmountWei:"0",fundingMethod:o.fundingMethod},usdc:i}}catch(t){return{success:!1,message:"Failed to check session key balance",error:t instanceof Error?t.message:"Unknown error"}}}Y();Te();mt();Y();We();Ar();m0();M0();Te();w8();var eze=[{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"}],l$=500000n,p$=400000n,m$=100000n;async function tze(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:"bundler-gas-price"})}function f$(e){if(!(!e||e==="0x"))try{let t=BigInt(e);return t>0n?t:void 0}catch{return}}async function nze(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:f$(s.callGasLimit),verificationGasLimit:f$(s.verificationGasLimit),preVerificationGas:f$(s.preVerificationGas)}},{operationName:"bundler-estimate-gas"})}function rze(e,t){e.callGasLimit=t.callGasLimit&&t.callGasLimit>m$?t.callGasLimit:m$,e.verificationGasLimit=t.verificationGasLimit&&t.verificationGasLimit>l$?t.verificationGasLimit:l$,e.preVerificationGas=t.preVerificationGas&&t.preVerificationGas>p$?t.preVerificationGas:p$}async function aze(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 sze(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)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 Qre(e){let{handle:t,sessionKeyAddress:n,publicClient:r,config:a,fundingAmount:s=op}=e,o=await r.getBalance({address:n}),i=t.chain.id,u=await Tn(r,t.address),d=k7({recipient:n,amount:s,delegator:t.address,sessionKey:n,nonce:u,chainId:i}),l=`Fund session key: ${Ge(s)} MON (delegation)`,p=await _n(d.delegation,i,t.keyId,l);d.delegation.signature=p;let y=Pt({target:n,value:s,callData:"0x"}),m=await ht();if(!m)throw new Error("Session key not found");let g=on(m),h=await we(a),w=Tt({account:g,chain:t.chain,transport:Ze(h,a)}),v=await dn(w,r,Ue.delegationManager,[{permissionContext:[d.delegation],executions:[y],mode:nn.SingleDefault}]);await Xt(r,v),await new Promise(A=>setTimeout(A,2e3));let T=await r.getBalance({address:n});return{userOpHash:"0x",transactionHash:v,newBalance:T,fundedAmount:T-o}}async function Yre(e){let{handle:t,sessionKeyAddress:n,publicClient:r,config:a,fundingAmount:s=0n}=e,o=t.chain.id,i=A5[o];if(!i)throw new Error(`USDC not configured for chain ${o}`);let u=await Tn(r,t.address),d=E7({tokenAddress:i,recipient:n,amount:s,delegator:t.address,sessionKey:n,nonce:u,chainId:o}),l=`Fund session key: ${le(s,x8)} USDC (delegation)`,p=await _n(d.delegation,o,t.keyId,l);d.delegation.signature=p;let y=Pt({target:i,value:0n,callData:X({abi:Xe,functionName:"transfer",args:[n,s]})}),m=await ht();if(!m)throw new Error("Session key not found");let g=on(m),h=await we(a),w=Tt({account:g,chain:t.chain,transport:Ze(h,a)}),v=await dn(w,r,Ue.delegationManager,[{permissionContext:[d.delegation],executions:[y],mode:nn.SingleDefault}]);return await Xt(r,v),{userOpHash:"0x",transactionHash:v,newBalance:0n,fundedAmount:s}}async function eae(e){let{handle:t,sessionKeyAddress:n,publicClient:r,bundlerUrl:a,fundingAmount:s=op,customExecution:o}=e;if(!a)throw new Error("Bundler URL required for UserOp path");let i=await r.getBalance({address:n}),d=X({abi:eze,functionName:"execute",args:[o??{target:n,value:s,callData:"0x"}]}),l=await t.smartAccount.getNonce?.()??0n,p=await tze(a),y={sender:t.address,nonce:l,callData:d,callGasLimit:m$,verificationGasLimit:l$,preVerificationGas:p$,maxFeePerGas:p.maxFeePerGas,maxPriorityFeePerGas:p.maxPriorityFeePerGas,signature:"0x"},m=t.smartAccount.entryPoint.address;try{let A=Jo({...y,signature:"0x"}),_=await nze(a,A,m);rze(y,_)}catch(A){console.warn("Failed to estimate gas, using defaults:",A)}let g=await t.smartAccount.signUserOperation(y);y.signature=g;let h=Jo({...y,signature:g}),w=await aze(a,h,m),v=await sze(a,w);await new Promise(A=>setTimeout(A,2e3));let T=await r.getBalance({address:n});return{userOpHash:w,transactionHash:v.transactionHash,newBalance:T,fundedAmount:T-i}}t0();We();w8();var oze=I.object({operationType:I.enum(["swap","transfer","wrap","unwrap"]).optional().describe("Type of operation to fund for. IMPORTANT: Always specify this for accurate gas calculation! Each operation has different gas costs: swap=0.14 MON, transfer/wrap/unwrap=0.04 MON"),estimatedOperations:I.number().optional().describe("Number of operations planned. Combined with operationType for accurate calculation. Examples: 1 swap = 0.16 MON needed, 3 swaps = 0.44 MON needed"),token:I.enum(["MON","USDC"]).optional().describe("Token to fund session key with. MON for gas (default), USDC for x402 payments. USDC funding requires specifying amount."),amount:I.string().optional().describe("Amount to fund (e.g., '10' for 10 MON or 10 USDC). If not specified for MON, uses intelligent calculation based on operations.")});function tae(e){e.tool("fund_session_key","Fund session key with MON (for gas) or USDC (for x402 payments) from smart account. Supports UserOp (when session key has < 0.02 MON) and Delegation methods. Pass operationType for MON, token='USDC' with amount for x402. On macOS: requires Touch ID. On headless/OpenClaw: uses root delegation automatically.",oze.shape,async t=>{let n=await ize(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function ize(e){try{let t=await q();if(!t?.wallet)return{success:!1,message:"Wallet not configured",error:"Please run setup_wallet first to create your pragma wallet"};let n=t.wallet.sessionKeyAddress,r=t.network.chainId;if(_t())return cze(e,t,n,r);let a=await we(t),s=Ee(r,a),o=_e({chain:s,transport:gt(a,Ot(t))});if(e.token==="USDC"){if(!e.amount)return{success:!1,message:"Amount required for USDC funding",error:"Please specify the amount of USDC to fund (e.g., amount: '1.0')"};let g=ye(e.amount,6),h=`Fund session key with ${e.amount} USDC (delegation)`,w=await j5(t,{touchIdMessage:h}),v=await Yre({handle:w,sessionKeyAddress:n,publicClient:o,config:t,fundingAmount:g});return{success:!0,message:`Session key funded with ${e.amount} USDC via delegation`,funding:{token:"USDC",method:"delegation",fundedAmount:`${e.amount} USDC`,fundedAmountWei:g.toString(),newBalance:"unknown",newBalanceWei:"0",txHash:v.transactionHash||"0x"}}}let i=await T2(n,o,e.operationType,e.estimatedOperations),u=e.amount&&e.amount.trim()!=="";if(!u&&!i.needsFunding)return{success:!0,message:"Session key already has sufficient balance",funding:{token:"MON",method:i.fundingMethod,fundedAmount:"0 MON",fundedAmountWei:"0",newBalance:i.balanceFormatted,newBalanceWei:i.balance.toString(),txHash:"0x"}};let d=u?ye(e.amount,18):i.recommendedFundingAmount,l=i.fundingMethod,p=`Fund session key: ${Ge(d)} MON (${l})`,y=await j5(t,{touchIdMessage:p}),m;return l==="delegation"?m=await Qre({handle:y,sessionKeyAddress:n,publicClient:o,config:t,fundingAmount:d}):m=await eae({handle:y,sessionKeyAddress:n,publicClient:o,config:t,bundlerUrl:await Ol(t),fundingAmount:d}),{success:!0,message:`Session key funded with ${Ge(m.fundedAmount)} MON via ${l}`,funding:{token:"MON",method:l,fundedAmount:`${Ge(m.fundedAmount)} MON`,fundedAmountWei:m.fundedAmount.toString(),newBalance:`${Ge(m.newBalance)} MON`,newBalanceWei:m.newBalance.toString(),txHash:m.transactionHash||m.userOpHash}}}catch(t){return{success:!1,message:"Session key funding failed",error:t instanceof Error?t.message:"Unknown error"}}}async function cze(e,t,n,r){try{let a=Qe(r),s=await we(t),o=Ee(r,s),i=_e({chain:o,transport:gt(s,Ot(t))});if(e.token==="USDC"){if(!e.amount)return{success:!1,message:"Amount required for USDC funding",error:"Please specify the amount of USDC to fund (e.g., amount: '1.0')"};let m=A5[r];if(!m)return{success:!1,message:"USDC not configured",error:`USDC not found for chain ${r}`};let g=ye(e.amount,x8),h=X({abi:[{type:"function",name:"transfer",stateMutability:"nonpayable",inputs:[{name:"to",type:"address"},{name:"amount",type:"uint256"}],outputs:[{name:"",type:"bool"}]}],functionName:"transfer",args:[n,g]}),w=await zn({target:m,value:0n,callData:h},t);return w.success?{success:!0,message:`Session key funded with ${e.amount} USDC via delegation (headless)`,funding:{token:"USDC",method:"delegation",fundedAmount:`${e.amount} USDC`,fundedAmountWei:g.toString(),newBalance:"unknown",newBalanceWei:"0",txHash:w.txHash||"0x"}}:{success:!1,message:"USDC funding failed",error:w.error}}let u=await T2(n,i,e.operationType,e.estimatedOperations),d=e.amount&&e.amount.trim()!=="";if(!d&&!u.needsFunding)return{success:!0,message:"Session key already has sufficient balance",funding:{token:"MON",method:"delegation",fundedAmount:"0 MON",fundedAmountWei:"0",newBalance:u.balanceFormatted,newBalanceWei:u.balance.toString(),txHash:"0x"}};let l=d?ye(e.amount,18):u.recommendedFundingAmount,p=await zn({target:n,value:l,callData:"0x"},t);if(!p.success)return{success:!1,message:"MON funding failed",error:p.error};await new Promise(m=>setTimeout(m,2e3));let y=await i.getBalance({address:n});return{success:!0,message:`Session key funded with ${Ge(l)} MON via delegation (headless)`,funding:{token:"MON",method:"delegation",fundedAmount:`${Ge(l)} MON`,fundedAmountWei:l.toString(),newBalance:`${Ge(y)} MON`,newBalanceWei:y.toString(),txHash:p.txHash||"0x"}}}catch(a){return{success:!1,message:"Session key funding failed (headless)",error:a instanceof Error?a.message:"Unknown error"}}}Te();var uze=I.object({includeApi:I.boolean().optional().describe("Include tokens from Data API in addition to static list (default: true)")});function nae(e){e.tool("list_verified_tokens","List all verified/trusted tokens available for trading. Use to discover tokens or answer 'what tokens can I trade?'. Returns 23+ tokens from static verified list plus any additional from Data API.",uze.shape,async t=>{let n=await dze(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function dze(e){let t=e.includeApi!==!1,n=["static-verified-list"],r=q5.length,a=0,s=new Map;for(let i of q5)s.set(i.address.toLowerCase(),{symbol:i.symbol,name:i.name,address:i.address,decimals:i.decimals,categories:i.categories});if(t)try{let i=await q();if(i?.network?.chainId){await w7(i.network.chainId);for(let u of Yne())s.has(u.address.toLowerCase())||(s.set(u.address.toLowerCase(),{symbol:u.symbol,name:u.name,address:u.address,decimals:u.decimals,categories:u.categories}),a++);a>0&&n.push("data-api")}}catch{}let o=Array.from(s.values());return o.sort((i,u)=>i.symbol==="MON"?-1:u.symbol==="MON"?1:i.symbol==="WMON"?-1:u.symbol==="WMON"?1:i.symbol.localeCompare(u.symbol)),{success:!0,message:`Found ${o.length} verified tokens (${r} static + ${a} from API)`,tokens:o,sources:n,counts:{total:o.length,staticList:r,fromApi:a}}}Te();var fze=I.object({mode:I.enum(["byok","x402"]).describe("Mode to switch to. 'byok' (Bring Your Own Keys) = free, you provide API keys. 'x402' = pay per API call with USDC, no keys needed.")});function rae(e){e.tool("set_mode","Switch between BYOK mode (free, provide your own API keys) and x402 mode (pay per API call with USDC). In x402 mode, all API calls go through the x402 proxy and are paid with USDC from your session key.",fze.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)return{success:!1,message:"Config not found",error:"Please run setup_wallet first to create your pragma wallet"};let n=e.mode;if(t.mode===n)return{success:!0,message:`Already in ${n} mode`,mode:n};t.mode=n,await Ml(t);let r=n==="x402"?["Ensure your session key has USDC for API payments","Check your session key balance","Fund your session key with USDC if needed"]:["Configure your API providers using /pragma:providers","Required: RPC endpoint URL","Required: Bundler for transactions","Optional: Quote and data providers for trading"];return{success:!0,message:`Switched to ${n} mode`,mode:n,nextSteps:r}}catch(t){return{success:!1,message:"Failed to switch mode",error:t instanceof Error?t.message:"Unknown error"}}}Te();mt();var pze=I.object({});function aae(e){e.tool("get_account_info","Get pragma wallet and account configuration. Returns smart account address, session key address, network info, and current mode (BYOK vs x402). Use to verify wallet setup or show user their account details.",pze.shape,async()=>{let t=await mze();return{content:[{type:"text",text:JSON.stringify(t,null,2)}]}})}async function mze(){try{let e=await q();if(!e)return{success:!1,message:"Wallet not initialized",status:{walletConfigured:!1,providersConfigured:!1},error:"No pragma configuration found. Run setup_wallet to create your wallet."};let t=Pe(e),n=Qe(e.network.chainId),r=e.mode==="byok"?!!(e.providers&&((e.providers.quote?.length??0)>0||(e.providers.data?.length??0)>0)):!0;return t?{success:!0,message:`Pragma wallet on ${n.displayName} (${e.mode} mode)`,account:{smartAccountAddress:e.wallet.smartAccountAddress,sessionKeyAddress:e.wallet.sessionKeyAddress,keyId:e.wallet.keyId},network:{chainId:e.network.chainId,chainName:n.displayName,nativeCurrency:n.nativeCurrency.symbol,blockExplorer:n.blockExplorer},mode:e.mode,providers:e.mode==="byok"?e.providers:void 0,status:{walletConfigured:!0,providersConfigured:e.mode==="x402"||r}}:{success:!0,message:"Wallet partially configured - missing wallet addresses",network:{chainId:e.network.chainId,chainName:n.displayName,nativeCurrency:n.nativeCurrency.symbol,blockExplorer:n.blockExplorer},mode:e.mode,providers:e.mode==="byok"?e.providers:void 0,status:{walletConfigured:!1,providersConfigured:r}}}catch(e){let t=e instanceof Error?e.message:"Unknown error";return{success:!1,message:"Failed to load account info",status:{walletConfigured:!1,providersConfigured:!1},error:t}}}Te();mt();var bze=I.object({token:I.string().describe("Token symbol (e.g., 'MON', 'USDC', 'WMON') or contract address (e.g., '0x123...'). Use this to look up token details before trading or to verify token information.")});function sae(e){e.tool("get_token_info","Get detailed information about a token by symbol or address. Returns symbol, name, decimals, contract address, USD price, and verification status. Use to look up token details or verify a token before trading.",bze.shape,async t=>{let n=await yze(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function yze(e){try{let t=await q();if(!t)return{success:!1,message:"Wallet not configured",error:"Please run setup_wallet first to configure pragma."};let n=t.network.chainId,r=Qe(n),a=e.token.trim(),s=!!(fp(a)||a.startsWith("0x")&&v7(a)),o=await is(e.token,n);if(!o)return{success:!1,message:"Token not found",network:{chainId:n,chainName:r.displayName},error:`Could not find token '${e.token}'. It may not exist on ${r.displayName} or the symbol/address is incorrect.`};let i;try{i=await w2(o.address,n)}catch{}return{success:!0,message:`${o.symbol} (${o.name})`,token:{symbol:o.symbol,name:o.name,address:o.address,decimals:o.decimals,kind:o.kind,verified:s,usdPrice:i?`$${i.toFixed(6)}`:void 0,categories:o.categories?.length?o.categories:void 0,logoURI:o.logoURI},network:{chainId:n,chainName:r.displayName}}}catch(t){return{success:!1,message:"Failed to fetch token info",error:t instanceof Error?t.message:"Unknown error"}}}Y();T6();Te();mt();We();Ar();M0();m0();var gze=50000n,hze=80000n,xze=2n,wze=I.object({token:I.string().optional().describe("Token to withdraw. Defaults to 'MON' for native token. Use token symbol (e.g., 'USDC', 'WMON') or contract address."),amount:I.string().describe("Amount to withdraw. Use 'all' for maximum possible amount, or specify a decimal amount like '0.5'. For MON, some is reserved for gas."),recipient:I.string().optional().describe("Recipient address for the withdrawal. If not specified, withdraws to user's smart account. Use when user wants to send to an external address.")});function oae(e){e.tool("withdraw_session_key","Withdraw MON or ERC20 tokens from session key to smart account or external address. Use 'all' for maximum amount. Defaults to MON if no token specified. Session key funds are used for gas - withdraw to reclaim unused funds.",wze.shape,async t=>{let n=await vze(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function vze(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=t.network.chainId,r=Qe(n),a=await ht();if(!a)return{success:!1,message:"Session key not found",error:"No session key found in Keychain. Run setup_wallet to create one."};let s=await we(t);if(!s)return{success:!1,message:"RPC not configured",error:"Please configure RPC provider"};let o=Ee(n,s),i=_e({chain:o,transport:Ze(s,t)}),u=e.token||"MON",d=await is(u,n);if(!d)return{success:!1,message:"Token not found",error:`Could not find token '${u}'. Check the symbol or address.`};let l=d.address.toLowerCase()===B0.toLowerCase(),p;l?p=await i.getBalance({address:a.address}):p=await i.readContract({address:d.address,abi:Xe,functionName:"balanceOf",args:[a.address]});let y=l?Ge(p):le(p,d.decimals);if(p===0n)return{success:!1,message:"No balance to withdraw",sessionKey:{address:a.address,previousBalance:`0 ${d.symbol}`,newBalance:`0 ${d.symbol}`},error:`Session key has no ${d.symbol} balance. Nothing to withdraw.`};let m=e.recipient?xe(e.recipient):xe(t.wallet.smartAccountAddress),w=await xt(async()=>i.getGasPrice(),{operationName:"getGasPrice"})*(l?gze:hze)*xze,v=l?p:await i.getBalance({address:a.address});if(v<w)return{success:!1,message:"Insufficient MON for gas",sessionKey:{address:a.address,previousBalance:`${y} ${d.symbol}`,newBalance:`${y} ${d.symbol}`},error:`Session key has ${Ge(v)} MON but needs ${Ge(w)} MON for gas.`};let T;if(e.amount.toLowerCase()==="all")if(l){if(p<=w)return{success:!1,message:"Insufficient balance for gas",sessionKey:{address:a.address,previousBalance:`${y} ${d.symbol}`,newBalance:`${y} ${d.symbol}`},error:`Balance (${y} MON) is less than gas cost (${Ge(w)} MON). Nothing to withdraw.`};T=p-w}else T=p;else{if(T=l?pa(e.amount):ye(e.amount,d.decimals),T<=0n)return{success:!1,message:"Invalid amount",error:"Withdrawal amount must be greater than 0"};if(T>p)return{success:!1,message:"Insufficient balance",sessionKey:{address:a.address,previousBalance:`${y} ${d.symbol}`,newBalance:`${y} ${d.symbol}`},error:`Requested ${e.amount} ${d.symbol} but only have ${y} ${d.symbol}`};if(l&&p-T<w)return{success:!1,message:"Insufficient balance for gas after withdrawal",sessionKey:{address:a.address,previousBalance:`${y} ${d.symbol}`,newBalance:`${y} ${d.symbol}`},error:`Not enough MON left for gas (${Ge(w)} MON needed). Try withdrawing less or use 'all'.`}}let A=ma(a.privateKey),_=Tt({account:A,chain:o,transport:Ze(s,t)}),E;if(l?E=await _.sendTransaction({to:m,value:T}):E=await _.writeContract({address:d.address,abi:Xe,functionName:"transfer",args:[m,T]}),(await Xt(i,E)).status!=="success")return{success:!1,message:"Transaction failed",error:`Withdrawal transaction failed. Hash: ${E}`};let $;l?$=await i.getBalance({address:a.address}):$=await i.readContract({address:d.address,abi:Xe,functionName:"balanceOf",args:[a.address]});let B=l?Ge($):le($,d.decimals),V=l?Ge(T):le(T,d.decimals),D=`${r.blockExplorer}/tx/${E}`;return{success:!0,message:m.toLowerCase()===t.wallet.smartAccountAddress.toLowerCase()?`Withdrew ${V} ${d.symbol} to your smart account`:`Withdrew ${V} ${d.symbol} to ${m}`,withdrawal:{token:d.symbol,amount:`${V} ${d.symbol}`,recipient:m,txHash:E,explorerUrl:D},sessionKey:{address:a.address,previousBalance:`${y} ${d.symbol}`,newBalance:`${B} ${d.symbol}`}}}catch(t){return{success:!1,message:"Withdrawal failed",error:t instanceof Error?t.message:"Unknown error"}}}Y();Te();mt();We();var Tze=I.object({blockIdentifier:I.union([I.string(),I.number()]).optional().describe("Block number (e.g., 12345), block hash (e.g., '0x...'), or 'latest'/'pending'. If not provided, returns the latest block."),includeTransactions:I.boolean().optional().describe("Include full transaction objects. Default: false (only hashes).")});function iae(e){e.tool("get_block","Get block information by number, hash, or latest. Returns block details including timestamp, gas usage, and transaction count. Works in both BYOK and x402 modes.",Tze.shape,async t=>{let n=await _ze(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}function Sze(e){let t=new Date(Number(e)*1e3),n=Intl.DateTimeFormat().resolvedOptions().timeZone;return{formatted:t.toLocaleString("en-US",{timeZone:n,year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1}),timezone:n}}function Aze(e){return e.startsWith("0x")&&e.length===66}async function _ze(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=await we(t),r=t.network.chainId,a=t.network.name||"Monad",s=Ee(r,n),o=_e({chain:s,transport:gt(n,Ot(t))}),i=e.includeTransactions??!1,u,d=e.blockIdentifier;if(d===void 0||d==="latest")u=await o.getBlock({includeTransactions:i});else if(d==="pending")u=await o.getBlock({blockTag:"pending",includeTransactions:i});else if(typeof d=="number")u=await o.getBlock({blockNumber:BigInt(d),includeTransactions:i});else if(typeof d=="string")if(Aze(d))u=await o.getBlock({blockHash:d,includeTransactions:i});else{let w=parseInt(d,10);if(isNaN(w))return{success:!1,message:"Invalid block identifier",error:`Could not parse '${d}' as block number or hash. Use a number, '0x...' hash, 'latest', or 'pending'.`};u=await o.getBlock({blockNumber:BigInt(w),includeTransactions:i})}if(!u)return{success:!1,message:"Block not found",error:`Could not find block with identifier: ${d??"latest"}`};let{formatted:l,timezone:p}=Sze(u.timestamp),y=u.transactions.length,m=u.number?.toString()??"pending",g=u.hash??"pending",h=u.transactions.map(w=>typeof w=="string"?w:w.hash);return{success:!0,message:`Block #${m} (${y} txs) at ${l}`,block:{number:m,hash:g,timestamp:u.timestamp.toString(),timestampFormatted:l,timezone:p,parentHash:u.parentHash,gasUsed:u.gasUsed.toString(),gasLimit:u.gasLimit.toString(),baseFeePerGas:u.baseFeePerGas?.toString(),transactionCount:y,transactions:h,miner:u.miner,nonce:u.nonce??void 0,difficulty:u.difficulty?.toString(),extraData:u.extraData},network:{chainId:r,chainName:a}}}catch(t){return{success:!1,message:"Failed to get block",error:t instanceof Error?t.message:"Unknown error"}}}Y();Te();mt();We();var Eze=I.object({}),b$={simpleTransfer:21000n,swap:250000n,stake:150000n};function cae(e){e.tool("get_gas_price","Get current gas price in wei, Gwei, and MON with estimated costs for common operations. Works in both BYOK and x402 modes.",Eze.shape,async()=>{let t=await kze();return{content:[{type:"text",text:JSON.stringify(t,null,2)}]}})}function q2(e,t=6){let n=le(e,18);return`${parseFloat(n).toFixed(t)} MON`}async function kze(){try{let e=await q();if(!e||!Pe(e))return{success:!1,message:"Wallet not configured",error:"Please run setup_wallet first to create your pragma wallet"};let t=await we(e),n=e.network.chainId,r=e.network.name||"Monad",a=Ee(n,t),o=await _e({chain:a,transport:gt(t,Ot(e))}).getGasPrice(),i=o*b$.simpleTransfer,u=o*b$.swap,d=o*b$.stake,l=S0(o);return{success:!0,message:`Current gas price: ${l} Gwei (~${q2(u)} per swap)`,gas:{gasPrice:o.toString(),gasPriceGwei:`${l} Gwei`,gasPriceMon:q2(o,12),estimatedCosts:{simpleTransfer:q2(i),swap:q2(u),stake:q2(d)}},network:{chainId:n,chainName:r}}}catch(e){return{success:!1,message:"Failed to get gas price",error:e instanceof Error?e.message:"Unknown error"}}}Te();We();var Cze=I.object({txHash:I.string().describe("Transaction hash to explain. Must be a valid 66-character hex string (0x + 64 hex chars). Example: '0x1234...abcd'. Use this to get detailed explanation of any on-chain transaction."),userAddress:I.string().optional().describe("Optional user address for context. Helps determine if tokens were sent or received. If not provided, uses the from address of the transaction.")});function uae(e){e.tool("explain_transaction",`Decode and explain any transaction in detail. Returns transaction type, token movements, gas info, and for Pragma transactions: delegation details and security analysis. x402 mode only.
116
116
 
117
117
  PRESENTATION GUIDE - TWO SECTIONS:
118
118
 
@@ -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 Dze(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function Dze(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 It())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 Mze=I.object({token:I.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.",Mze.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=I.object({token:I.string().describe("Token address on nad.fun bonding curve. Must be a 0x address."),amount:I.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:I.boolean().describe("true = buy tokens with MON, false = sell tokens for MON"),slippageBps:I.number().optional().describe(`Slippage tolerance in basis points. Default: ${ic} (5%). Max: ${V6} (50%).`),exactOutput:I.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();M0();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=I.object({quoteId:I.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:I.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 Ire(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=I.object({quoteId:I.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:I.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 z7(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=I.object({sortBy:I.enum(["market_cap","new","active","hackathon"]).optional().describe("How to sort: 'market_cap' (default), 'new' (newest), 'active' (most traded), 'hackathon' (Moltiverse hackathon submissions)"),limit:I.number().optional().describe("Max tokens to return (default: 10, max: 50)"),page:I.number().optional().describe("Page number for pagination (default: 1)"),excludeGraduated:I.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:z7(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=I.object({token:I.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?z7(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=I.object({address:I.string().optional().describe("Wallet address to check (default: your smart account)"),positionType:I.enum(["all","open","closed"]).optional().describe("Filter by position type (default: 'all')"),limit:I.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();M0();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 Cae(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 Iae(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 D=`Token ${n.symbol} created successfully!`;return n.initialBuyMon&&(D+=` 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:D,initialBuyMon:n.initialBuyMon}}catch($){return{success:!1,error:`Token creation failed: ${$ instanceof Error?$.message:"Unknown error"}`}}}var oje=I.object({name:I.string().min(1).max(32).describe("Token name (1-32 chars). Example: 'Moon Cat'. This is the full display name shown to users."),symbol:I.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:I.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:I.string().max(500).optional().describe("Token description (max 500 chars). Optional. Shown on nad.fun token page."),twitter:I.string().optional().describe("Twitter/X URL. Must contain 'x.com'. Optional. Example: 'https://x.com/mytoken'"),telegram:I.string().optional().describe("Telegram URL. Must contain 't.me'. Optional. Example: 'https://t.me/mytokengroup'"),website:I.string().optional().describe("Website URL. Must be https. Optional. Example: 'https://mytoken.xyz'"),initialBuyMon:I.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:I.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 Cae({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 Iae(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=I.object({});function Dae(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=I.object({address:I.string().optional().describe("Optional address to check positions for. Defaults to your smart account."),agentId:I.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,Mae=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 D=ye(V.margin,18);return bje(D,$)*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)>Mae?BigInt(E)-Mae: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 D=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:D,text:`Keeper close: ${V.pair} ${V.side} \u2014 inflows: ${D}`,protocol:"leverup"}),C2(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=I.object({symbol:I.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:I.boolean().describe("True for Long, False for Short."),marginAmount:I.string().describe("The amount of collateral to use (e.g. '10' for 10 MON). Recommended minimum: $10 USD."),leverage:I.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:I.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();M0();mt();We();Ar();Y();var wje=I.object({symbol:I.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:I.boolean().describe("true for Long, false for Short"),marginAmount:I.string().describe("Amount of collateral (e.g. '10' for 10 MON). Recommended minimum: $10 USD."),leverage:I.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:I.enum(["MON","USDC","LVUSD","LVMON"]).default("MON").optional().describe("Collateral token: MON (native), USDC, LVUSD (vault USD), or LVMON (vault MON). Default: MON."),slippageBps:I.number().min(0).max(5e3).default(100).optional().describe("Slippage in basis points (default: 100 = 1%)"),stopLoss:I.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:I.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:I.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,Ia(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,Ia(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=Ia(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=C0e({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)}),D=E.filter(j=>j.kind==="approve");if(D.length>0){let j=D.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();M0();mt();We();Ar();Y();var vje=I.object({tradeHash:I.string().regex(/^0x[a-fA-F0-9]{64}$/).describe("The unique identifier of the position to close."),agentId:I.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=I0e({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();M0();mt();We();Ar();Y();m0();var Tje=I.object({tradeHash:I.string().regex(/^0x[a-fA-F0-9]{64}$/).describe("The unique identifier of the position."),amount:I.string().describe("Amount of collateral to add (e.g. '5' for 5 MON)."),collateralToken:I.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:I.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 _r}}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 Mre(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",D=ye(t.amount,Ia($)),G=B2(t.tradeHash,B,D,V),N;return V?N=await zn({target:G.to,value:G.value,callData:G.data},n):N=await Vi(B,Kn,D,{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,Ia(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();M0();mt();We();Ar();Y();m0();var Sje=I.object({tradeHash:I.string().regex(/^0x[a-fA-F0-9]{64}$/).describe("The unique identifier of the position."),takeProfit:I.string().optional().describe("New take profit price in USD (e.g. '110000' for $110,000). Set to '0' or omit to disable TP."),stopLoss:I.string().optional().describe("New stop loss price in USD (e.g. '95000' for $95,000). Set to '0' or omit to disable SL."),agentId:I.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,D=(await J5(B)).find(G=>G.position.positionHash===t.tradeHash);if(D){let G=Number(le(D.position.entryPrice,18)),N=Number(t.stopLoss),W=D.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,D=U2(t.tradeHash,B,V),G=await zn({target:D.to,value:D.value,callData:D.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=D0e({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=I.object({symbol:I.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=I.object({symbol:I.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();M0();mt();We();Ar();Y();var Cje=I.object({symbol:I.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:I.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:I.string().describe("Amount of collateral (e.g. '10' for 10 MON). Recommended minimum: $10 USD."),leverage:I.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:I.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:I.enum(["MON","USDC","LVUSD","LVMON"]).default("MON").optional().describe("Collateral token: MON (native), USDC, LVUSD (vault USD), or LVMON (vault MON). Default: MON."),stopLoss:I.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:I.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:I.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).",Cje.shape,async t=>{let n=await Ije(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function Ije(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,Ia(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,Ia(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=Ia(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}],D=await dn(O,h,Ue.delegationManager,V);return(await Xt(h,D)).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:D,explorerUrl:`https://monadvision.com/tx/${D}`}}:{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=I.object({address:I.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();M0();mt();We();Ar();Y();var $je=I.object({orderHashes:I.array(I.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:I.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 Dje(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function Dje(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 Dre(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 Mje=I.object({symbol:I.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:I.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:I.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.",Mje.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=I.object({base:I.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 It())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=I.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 It())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=I.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 It())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=I.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 It())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=I.object({limit:I.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 It())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=I.object({query:I.string().describe("Search keyword to find in news headlines. Examples: 'fed', 'inflation', 'bitcoin', 'trump'."),days:I.number().min(1).max(7).optional().describe("Time window for search (1-7 days). Default: 7."),limit:I.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 It())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=I.object({bank:I.string().optional().describe("Filter by central bank code. Options: 'FED', 'ECB', 'BOE', 'BOC', 'RBA', 'BOJ', 'SNB', 'RBNZ'. Leave empty for all banks."),limit:I.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 It())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=I.object({query:I.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:I.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:I.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 It())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=I.object({tweet_id:I.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 It())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=I.object({username:I.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 It())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=I.object({tweet_id:I.string().describe("The numeric tweet ID to get replies for. Example: '1893024529028493352'. Found in tweet URLs: x.com/user/status/{tweet_id}."),max_results:I.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 It())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=I.object({username:I.string().describe("X/Twitter username to get tweets from (without @). Example: '0xelpabl0', 'naddotfun'."),max_results:I.number().min(10).max(100).optional().describe("Number of tweets to return (10-100). Default: 10. Cost scales linearly at $0.007/tweet."),exclude:I.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 It())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();M0();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,j7={openMarketTrade:"0xca004414",closeTrade:"0x5177fd3b",addMargin:"0xe1379570",updateTpSl:"0x2f745df6",openLimitOrder:"0xf37afc20",cancelLimitOrder:"0x4584eff6",batchCancelLimitOrders:"0x54688625"},q7={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(j7),...Object.values(V2),...Object.values(W2),...Object.values(Z2)];case"thymos":return[...Object.values(q7),...Object.values(V2),...Object.values(W2),...Object.values(Z2)];case"pragma":return[...Object.values(j7),...Object.values(q7),...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 _=L7(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&&t.push("maxCalls must be at least 1"),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(_r),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(j7),...Object.values(q7),...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=L7(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 Ca(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=[];return(e.expiryDays<1||e.expiryDays>30)&&t.push("expiryDays must be between 1 and 30"),e.maxCalls<1&&t.push("maxCalls must be at least 1"),e.valueLtePerTx<0n&&t.push("valueLtePerTx cannot be negative"),{valid:t.length===0,errors:t}}var wqe=I.object({expiryDays:I.number().min(1).max(30).default(7).describe("How many days until delegation expires. Default: 7"),budgetMon:I.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:I.number().min(0).default(0).describe("Total USD-group budget (USDC + LVUSD) authorized for all agents. 0 = no USD spending limit. Default: 0"),maxValuePerTx:I.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:I.number().min(1).default(100).describe("Maximum delegation calls (trades + approvals combined). Each trade may need 1-2 calls (approve + execute). Default: 100"),force:I.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=pa(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();M0();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 G7(){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]=ca([{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]=ca([{type:"uint256"}],t.terms);return Number(n)}var Cqe=I.object({agentType:I.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:I.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:I.number().min(0).optional().describe("USD group budget covering USDC + LVUSD (soft limit, agent self-tracks). Default: 0"),allowedGroups:I.array(I.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:I.array(I.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:I.number().min(1).max(30).default(7).describe("How many days until delegation expires. Default: 7"),maxCalls:I.number().min(1).default(20).describe("Maximum delegation calls (trades + approvals). Each trade may need 1-2 calls (approve + execute). Default: 20"),maxValuePerTx:I.number().min(0).optional().describe("Maximum native MON per single transaction. On-chain enforced via ValueLteEnforcer. If not specified, defaults to full budgetMon (each tx can spend up to the entire budget; total budget is enforced separately via LimitedCallsEnforcer). Set this lower to limit per-trade risk."),fundAmount:I.number().min(0).default(1).describe("Initial gas funding in MON. Set to 0 to skip funding. Default: 1 MON"),taskId:I.string().optional().describe("Optional Claude Code Task ID for tracking"),loopType:I.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:I.string().optional().describe("For condition type: human-readable condition (e.g., 'BTC price >= 95000')"),loopIntervalMinutes:I.number().min(1).max(1440).optional().describe("For interval type: minutes between checks (e.g., 2 for every 2 minutes)"),mission:I.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:I.number().min(0).max(1e4).default(0).describe("Safety valve: max loop iterations before forcing exit. 0 = unlimited. Default: 0")});function Iqe(e,t,n){switch(e){case"kairos":{let r=[Kn,_r];return t&&r.push(t),r.push(V0,g0,h0),r}case"thymos":{let r=[];return n&&r.push(n),r.push(_r),t&&r.push(t),r.push(V0,g0,h0),r}case"pragma":{let r=[Kn,_r];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.",Cqe.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 Ca(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=pa(e.budgetMon.toString()),l=e.maxValuePerTx!==void 0?pa(e.maxValuePerTx.toString()):d;if(a.budgetMon!==void 0){let ct=parseFloat(a.budgetMon),fn=await UR(),Rn=parseFloat(Ge(fn));if(Rn+e.budgetMon>ct)return await Ca(i.id),{success:!1,message:"Exceeds root MON budget",error:`Root authorized ${ct} MON. Already allocated: ${Rn} MON. Requested: ${e.budgetMon} MON. Total ${Rn+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 HR(),Rn=parseFloat(fn.toString())/1e6;if(Rn+e.budgetUsd>ct)return await Ca(i.id),{success:!1,message:"Exceeds root USD budget",error:`Root authorized ${ct} USD. Already allocated: ${Rn} USD. Requested: ${e.budgetUsd} USD.`}}}if((e.agentType==="kairos"||e.agentType==="pragma")&&e.budgetMon<1)return await Ca(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=pa(a.maxValuePerTx);if(l>ct)return await Ca(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=Iqe(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 Ca(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 Rn of e.allowedTokens){let W0=Rn.toUpperCase(),Zi=E2[W0];if(Zi){ct.push(Zi);continue}let Yr=fp(Rn);if(Yr){ct.push(Yr.address);continue}fn.push(Rn)}if(fn.length>0){let Rn=Object.keys(E2).join(", ");return await Ca(i.id),{success:!1,message:`Unknown token symbols in allowedTokens: [${fn.join(", ")}]. Core tokens: ${Rn}`}}$=ct}await DR({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 NR(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=pa(e.fundAmount.toString());if(Z>=ct)be="skipped";else{let fn=ct-Z,Rn=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 Rn.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 Ca(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();M0();We();m0();var Rqe=I.object({subAgentId:I.string().describe("The sub-agent ID (UUID) to fund"),amountMon:I.number().min(.001).default(1).describe("Amount of MON to transfer for gas. Default: 1 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=pa(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 Dqe=I.object({status:I.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.",Dqe.shape,async t=>{let n=await Oqe(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}function Mqe(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(Mqe),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=I.object({subAgentId:I.string().describe("The sub-agent ID (UUID) to revoke"),sweepBalance:I.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 Ca(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 Ca(n.walletId),await mp(e.subAgentId);try{(await sc()).some(m=>m.status==="running"||m.status==="pending"||m.status==="paused")||G7()}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=I.object({subAgentId:I.string().describe("The sub-agent ID (UUID) to get state for"),taskAgentId:I.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:I.string().optional().describe("Optional: Teammate name for TeammateIdle hook lookup. Pass the 'name' parameter from Task spawn (e.g., 'kairos-abc123')."),includeTrades:I.boolean().optional().describe("Include recent trade history. Default: true"),tradeLimit:I.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=I7(_,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 BR(e.subAgentId),g={[Pn.toLowerCase()]:{symbol:"MON",decimals:18},[C7.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 OR(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 D=Date.now(),G=a.expiresAt<D;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=I.object({agentId:I.string().describe("The sub-agent ID (UUID) reporting its status"),status:I.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:I.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=I.object({agentId:I.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();M0();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,Cse=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,Cse),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 Ise(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:Cse,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=I.object({confirm:I.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:I.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 Ise(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();G7();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=I.object({filter:I.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=O7(t),r=e.filter==="all"?n:O7(),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=I.object({agentId:I.string().describe("The sub-agent ID (UUID) to get journal entries for"),offset:I.number().min(0).optional().describe("Number of entries to skip from the start. Default: 0 (most recent first)"),limit:I.number().min(1).max(200).optional().describe("Max number of entries to return. Default: 50, max: 200"),tag:I.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.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=I.object({agentId:I.string().describe("The sub-agent ID (UUID) writing the memo"),text:I.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:I.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 Dse(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 Mse(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),Dae(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),Dse(e)}import{homedir as cGe}from"os";var Ose=cGe().startsWith("/sessions/"),Nse=new C3({name:"pragma",version:"0.1.0"});Ose?console.error("[pragma] Cowork detected \u2014 skipping tool registration (DXT handles MCP tools)"):Mse(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();M0();mt();We();Ar();Y();var wje=I.object({symbol:I.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:I.boolean().describe("true for Long, false for Short"),marginAmount:I.string().describe("Amount of collateral (e.g. '10' for 10 MON). Recommended minimum: $10 USD."),leverage:I.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:I.enum(["MON","USDC","LVUSD","LVMON"]).default("MON").optional().describe("Collateral token: MON (native), USDC, LVUSD (vault USD), or LVMON (vault MON). Default: MON."),slippageBps:I.number().min(0).max(5e3).default(100).optional().describe("Slippage in basis points (default: 100 = 1%)"),stopLoss:I.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:I.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:I.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,Ia(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,Ia(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=Ia(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=C0e({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)}),D=E.filter(j=>j.kind==="approve");if(D.length>0){let j=D.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();M0();mt();We();Ar();Y();var vje=I.object({tradeHash:I.string().regex(/^0x[a-fA-F0-9]{64}$/).describe("The unique identifier of the position to close."),agentId:I.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=I0e({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();M0();mt();We();Ar();Y();m0();var Tje=I.object({tradeHash:I.string().regex(/^0x[a-fA-F0-9]{64}$/).describe("The unique identifier of the position."),amount:I.string().describe("Amount of collateral to add (e.g. '5' for 5 MON)."),collateralToken:I.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:I.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 _r}}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 Mre(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",D=ye(t.amount,Ia($)),G=B2(t.tradeHash,B,D,V),N;return V?N=await zn({target:G.to,value:G.value,callData:G.data},n):N=await Vi(B,Kn,D,{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,Ia(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();M0();mt();We();Ar();Y();m0();var Sje=I.object({tradeHash:I.string().regex(/^0x[a-fA-F0-9]{64}$/).describe("The unique identifier of the position."),takeProfit:I.string().optional().describe("New take profit price in USD (e.g. '110000' for $110,000). Set to '0' or omit to disable TP."),stopLoss:I.string().optional().describe("New stop loss price in USD (e.g. '95000' for $95,000). Set to '0' or omit to disable SL."),agentId:I.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,D=(await J5(B)).find(G=>G.position.positionHash===t.tradeHash);if(D){let G=Number(le(D.position.entryPrice,18)),N=Number(t.stopLoss),W=D.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,D=U2(t.tradeHash,B,V),G=await zn({target:D.to,value:D.value,callData:D.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=D0e({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=I.object({symbol:I.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=I.object({symbol:I.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();M0();mt();We();Ar();Y();var Cje=I.object({symbol:I.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:I.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:I.string().describe("Amount of collateral (e.g. '10' for 10 MON). Recommended minimum: $10 USD."),leverage:I.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:I.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:I.enum(["MON","USDC","LVUSD","LVMON"]).default("MON").optional().describe("Collateral token: MON (native), USDC, LVUSD (vault USD), or LVMON (vault MON). Default: MON."),stopLoss:I.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:I.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:I.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).",Cje.shape,async t=>{let n=await Ije(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function Ije(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,Ia(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,Ia(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=Ia(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}],D=await dn(O,h,Ue.delegationManager,V);return(await Xt(h,D)).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:D,explorerUrl:`https://monadvision.com/tx/${D}`}}:{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=I.object({address:I.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();M0();mt();We();Ar();Y();var $je=I.object({orderHashes:I.array(I.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:I.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 Dje(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}async function Dje(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 Dre(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 Mje=I.object({symbol:I.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:I.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:I.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.",Mje.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=I.object({base:I.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 It())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=I.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 It())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=I.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 It())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=I.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 It())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=I.object({limit:I.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 It())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=I.object({query:I.string().describe("Search keyword to find in news headlines. Examples: 'fed', 'inflation', 'bitcoin', 'trump'."),days:I.number().min(1).max(7).optional().describe("Time window for search (1-7 days). Default: 7."),limit:I.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 It())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=I.object({bank:I.string().optional().describe("Filter by central bank code. Options: 'FED', 'ECB', 'BOE', 'BOC', 'RBA', 'BOJ', 'SNB', 'RBNZ'. Leave empty for all banks."),limit:I.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 It())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=I.object({query:I.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:I.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:I.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 It())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=I.object({tweet_id:I.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 It())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=I.object({username:I.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 It())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=I.object({tweet_id:I.string().describe("The numeric tweet ID to get replies for. Example: '1893024529028493352'. Found in tweet URLs: x.com/user/status/{tweet_id}."),max_results:I.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 It())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=I.object({username:I.string().describe("X/Twitter username to get tweets from (without @). Example: '0xelpabl0', 'naddotfun'."),max_results:I.number().min(10).max(100).optional().describe("Number of tweets to return (10-100). Default: 10. Cost scales linearly at $0.007/tweet."),exclude:I.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 It())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();M0();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,j7={openMarketTrade:"0xca004414",closeTrade:"0x5177fd3b",addMargin:"0xe1379570",updateTpSl:"0x2f745df6",openLimitOrder:"0xf37afc20",cancelLimitOrder:"0x4584eff6",batchCancelLimitOrders:"0x54688625"},q7={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(j7),...Object.values(V2),...Object.values(W2),...Object.values(Z2)];case"thymos":return[...Object.values(q7),...Object.values(V2),...Object.values(W2),...Object.values(Z2)];case"pragma":return[...Object.values(j7),...Object.values(q7),...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 _=L7(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&&t.push("maxCalls must be at least 1"),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(_r),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(j7),...Object.values(q7),...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=L7(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 Ca(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=[];return(e.expiryDays<1||e.expiryDays>30)&&t.push("expiryDays must be between 1 and 30"),e.maxCalls<1&&t.push("maxCalls must be at least 1"),e.valueLtePerTx<0n&&t.push("valueLtePerTx cannot be negative"),{valid:t.length===0,errors:t}}var wqe=I.object({expiryDays:I.number().min(1).max(30).default(7).describe("How many days until delegation expires. Default: 7"),budgetMon:I.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:I.number().min(0).default(0).describe("Total USD-group budget (USDC + LVUSD) authorized for all agents. 0 = no USD spending limit. Default: 0"),maxValuePerTx:I.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:I.number().min(1).default(100).describe("Maximum delegation calls (trades + approvals combined). Each trade may need 1-2 calls (approve + execute). Default: 100"),force:I.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=pa(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();M0();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 G7(){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]=ca([{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]=ca([{type:"uint256"}],t.terms);return Number(n)}var Cqe=I.object({agentType:I.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:I.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:I.number().min(0).optional().describe("USD group budget covering USDC + LVUSD (soft limit, agent self-tracks). Default: 0"),allowedGroups:I.array(I.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:I.array(I.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:I.number().min(1).max(30).default(7).describe("How many days until delegation expires. Default: 7"),maxCalls:I.number().min(1).default(20).describe("Maximum delegation calls (trades + approvals). Each trade may need 1-2 calls (approve + execute). Default: 20"),maxValuePerTx:I.number().min(0).optional().describe("Maximum native MON per single transaction. On-chain enforced via ValueLteEnforcer. If not specified, defaults to full budgetMon (each tx can spend up to the entire budget; total budget is enforced separately via LimitedCallsEnforcer). Set this lower to limit per-trade risk."),fundAmount:I.number().min(0).default(1).describe("Initial gas funding in MON. Set to 0 to skip funding. Default: 1 MON"),taskId:I.string().optional().describe("Optional Claude Code Task ID for tracking"),loopType:I.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:I.string().optional().describe("For condition type: human-readable condition (e.g., 'BTC price >= 95000')"),loopIntervalMinutes:I.number().min(1).max(1440).optional().describe("For interval type: minutes between checks (e.g., 2 for every 2 minutes)"),mission:I.string().optional().describe("Natural language task sent by the leader as a wake message between cycles. Must be actionable and self-contained. Example: 'Monitor BTC/USD. Buy when price hits $95,000. Budget: 10 MON.'")});function Iqe(e,t,n){switch(e){case"kairos":{let r=[Kn,_r];return t&&r.push(t),r.push(V0,g0,h0),r}case"thymos":{let r=[];return n&&r.push(n),r.push(_r),t&&r.push(t),r.push(V0,g0,h0),r}case"pragma":{let r=[Kn,_r];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.",Cqe.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 Ca(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=pa(e.budgetMon.toString()),l=e.maxValuePerTx!==void 0?pa(e.maxValuePerTx.toString()):d;if(a.budgetMon!==void 0){let ct=parseFloat(a.budgetMon),fn=await UR(),Rn=parseFloat(Ge(fn));if(Rn+e.budgetMon>ct)return await Ca(i.id),{success:!1,message:"Exceeds root MON budget",error:`Root authorized ${ct} MON. Already allocated: ${Rn} MON. Requested: ${e.budgetMon} MON. Total ${Rn+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 HR(),Rn=parseFloat(fn.toString())/1e6;if(Rn+e.budgetUsd>ct)return await Ca(i.id),{success:!1,message:"Exceeds root USD budget",error:`Root authorized ${ct} USD. Already allocated: ${Rn} USD. Requested: ${e.budgetUsd} USD.`}}}if((e.agentType==="kairos"||e.agentType==="pragma")&&e.budgetMon<1)return await Ca(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=pa(a.maxValuePerTx);if(l>ct)return await Ca(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=Iqe(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 Ca(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 Rn of e.allowedTokens){let W0=Rn.toUpperCase(),Zi=E2[W0];if(Zi){ct.push(Zi);continue}let Yr=fp(Rn);if(Yr){ct.push(Yr.address);continue}fn.push(Rn)}if(fn.length>0){let Rn=Object.keys(E2).join(", ");return await Ca(i.id),{success:!1,message:`Unknown token symbols in allowedTokens: [${fn.join(", ")}]. Core tokens: ${Rn}`}}$=ct}await DR({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 NR(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);break;case"condition":n$(s,e.loopCondition||"condition not specified",ct);break;case"interval":r$(s,e.loopIntervalMinutes||5,ct);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=pa(e.fundAmount.toString());if(Z>=ct)be="skipped";else{let fn=ct-Z,Rn=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 Rn.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}:void 0,keychainNote:"If macOS prompted for Keychain access, select 'Always Allow' to prevent interruptions during autonomous trading."}}}catch(d){try{await Ca(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();M0();We();m0();var Rqe=I.object({subAgentId:I.string().describe("The sub-agent ID (UUID) to fund"),amountMon:I.number().min(.001).default(1).describe("Amount of MON to transfer for gas. Default: 1 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=pa(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 Dqe=I.object({status:I.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.",Dqe.shape,async t=>{let n=await Oqe(t);return{content:[{type:"text",text:JSON.stringify(n,null,2)}]}})}function Mqe(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(Mqe),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=I.object({subAgentId:I.string().describe("The sub-agent ID (UUID) to revoke"),sweepBalance:I.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 Ca(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 Ca(n.walletId),await mp(e.subAgentId);try{(await sc()).some(m=>m.status==="running"||m.status==="pending"||m.status==="paused")||G7()}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=I.object({subAgentId:I.string().describe("The sub-agent ID (UUID) to get state for"),taskAgentId:I.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:I.string().optional().describe("Optional: Teammate name for leader wake lookup. Pass the 'name' parameter from Task spawn (e.g., 'kairos-abc123')."),includeTrades:I.boolean().optional().describe("Include recent trade history. Default: true"),tradeLimit:I.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 leader wake 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=I7(_,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 BR(e.subAgentId),g={[Pn.toLowerCase()]:{symbol:"MON",decimals:18},[C7.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 OR(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 D=Date.now(),G=a.expiresAt<D;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}: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=I.object({agentId:I.string().describe("The sub-agent ID (UUID) reporting its status"),status:I.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:I.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=I.object({agentId:I.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();M0();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,Cse=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,Cse),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 Ise(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:Cse,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=I.object({confirm:I.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:I.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 Ise(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();G7();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=I.object({filter:I.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=O7(t),r=e.filter==="all"?n:O7(),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=I.object({agentId:I.string().describe("The sub-agent ID (UUID) to get journal entries for"),offset:I.number().min(0).optional().describe("Number of entries to skip from the start. Default: 0 (most recent first)"),limit:I.number().min(1).max(200).optional().describe("Max number of entries to return. Default: 50, max: 200"),tag:I.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.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=I.object({agentId:I.string().describe("The sub-agent ID (UUID) writing the memo"),text:I.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:I.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 Dse(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 Mse(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),Dae(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),Dse(e)}import{homedir as cGe}from"os";var Ose=cGe().startsWith("/sessions/"),Nse=new C3({name:"pragma",version:"0.1.0"});Ose?console.error("[pragma] Cowork detected \u2014 skipping tool registration (DXT handles MCP tools)"):Mse(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: