starkfi 0.6.2 → 0.6.3
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/MCP.md +110 -450
- package/README.md +90 -470
- package/dist/index.js +2 -2
- package/package.json +1 -1
- package/skills/README.md +47 -21
- package/skills/config/SKILL.md +1 -1
- package/skills/dca/SKILL.md +2 -1
- package/skills/lending/SKILL.md +1 -1
- package/skills/staking/SKILL.md +1 -1
package/dist/index.js
CHANGED
|
@@ -129,7 +129,7 @@ ${e}`,R1e=Object.getOwnPropertyDescriptor(Function.prototype,"toString"),O1e=Obj
|
|
|
129
129
|
`:`[${n[c]}\r
|
|
130
130
|
]`;continue}o+=n[c],n[c]==="\\"?a=true:i&&n[c]==="]"?i=false:!i&&n[c]==="["&&(i=true);}try{new RegExp(o);}catch{return console.warn(`Could not convert regex pattern at ${e.currentPath.join("/")} to a flag-independent form! Falling back to the flag-ignorant source`),t.source}return o}function QA(t,e){if(e.target==="openAi"&&console.warn("Warning: OpenAI may not support records in schemas! Try an array of key-value pairs instead."),e.target==="openApi3"&&t.keyType?._def.typeName===ce.ZodEnum)return {type:"object",required:t.keyType._def.values,properties:t.keyType._def.values.reduce((n,o)=>({...n,[o]:Je(t.valueType._def,{...e,currentPath:[...e.currentPath,"properties",o]})??Nr(e)}),{}),additionalProperties:e.rejectedAdditionalProperties};let r={type:"object",additionalProperties:Je(t.valueType._def,{...e,currentPath:[...e.currentPath,"additionalProperties"]})??e.allowedAdditionalProperties};if(e.target==="openApi3")return r;if(t.keyType?._def.typeName===ce.ZodString&&t.keyType._def.checks?.length){let{type:n,...o}=YA(t.keyType._def,e);return {...r,propertyNames:o}}else {if(t.keyType?._def.typeName===ce.ZodEnum)return {...r,propertyNames:{enum:t.keyType._def.values}};if(t.keyType?._def.typeName===ce.ZodBranded&&t.keyType._def.type._def.typeName===ce.ZodString&&t.keyType._def.type._def.checks?.length){let{type:n,...o}=XA(t.keyType._def,e);return {...r,propertyNames:o}}}return r}function zJ(t,e){if(e.mapStrategy==="record")return QA(t,e);let r=Je(t.keyType._def,{...e,currentPath:[...e.currentPath,"items","items","0"]})||Nr(e),n=Je(t.valueType._def,{...e,currentPath:[...e.currentPath,"items","items","1"]})||Nr(e);return {type:"array",maxItems:125,items:{type:"array",items:[r,n],minItems:2,maxItems:2}}}function HJ(t){let e=t.values,n=Object.keys(t.values).filter(a=>typeof e[e[a]]!="number").map(a=>e[a]),o=Array.from(new Set(n.map(a=>typeof a)));return {type:o.length===1?o[0]==="string"?"string":"number":["string","number"],enum:n}}function VJ(t){return t.target==="openAi"?void 0:{not:Nr({...t,currentPath:[...t.currentPath,"not"]})}}function jJ(t){return t.target==="openApi3"?{enum:["null"],nullable:true}:{type:"null"}}var a1={ZodString:"string",ZodNumber:"number",ZodBigInt:"integer",ZodBoolean:"boolean",ZodNull:"null"};function JJ(t,e){if(e.target==="openApi3")return GJ(t,e);let r=t.options instanceof Map?Array.from(t.options.values()):t.options;if(r.every(n=>n._def.typeName in a1&&(!n._def.checks||!n._def.checks.length))){let n=r.reduce((o,a)=>{let i=a1[a._def.typeName];return i&&!o.includes(i)?[...o,i]:o},[]);return {type:n.length>1?n:n[0]}}else if(r.every(n=>n._def.typeName==="ZodLiteral"&&!n.description)){let n=r.reduce((o,a)=>{let i=typeof a._def.value;switch(i){case "string":case "number":case "boolean":return [...o,i];case "bigint":return [...o,"integer"];case "object":if(a._def.value===null)return [...o,"null"];default:return o}},[]);if(n.length===r.length){let o=n.filter((a,i,s)=>s.indexOf(a)===i);return {type:o.length>1?o:o[0],enum:r.reduce((a,i)=>a.includes(i._def.value)?a:[...a,i._def.value],[])}}}else if(r.every(n=>n._def.typeName==="ZodEnum"))return {type:"string",enum:r.reduce((n,o)=>[...n,...o._def.values.filter(a=>!n.includes(a))],[])};return GJ(t,e)}var GJ=(t,e)=>{let r=(t.options instanceof Map?Array.from(t.options.values()):t.options).map((n,o)=>Je(n._def,{...e,currentPath:[...e.currentPath,"anyOf",`${o}`]})).filter(n=>!!n&&(!e.strictUnions||typeof n=="object"&&Object.keys(n).length>0));return r.length?{anyOf:r}:void 0};function ZJ(t,e){if(["ZodString","ZodNumber","ZodBigInt","ZodBoolean","ZodNull"].includes(t.innerType._def.typeName)&&(!t.innerType._def.checks||!t.innerType._def.checks.length))return e.target==="openApi3"?{type:a1[t.innerType._def.typeName],nullable:true}:{type:[a1[t.innerType._def.typeName],"null"]};if(e.target==="openApi3"){let n=Je(t.innerType._def,{...e,currentPath:[...e.currentPath]});return n&&"$ref"in n?{allOf:[n],nullable:true}:n&&{...n,nullable:true}}let r=Je(t.innerType._def,{...e,currentPath:[...e.currentPath,"anyOf","0"]});return r&&{anyOf:[r,{type:"null"}]}}function qJ(t,e){let r={type:"number"};if(!t.checks)return r;for(let n of t.checks)switch(n.kind){case "int":r.type="integer",SO(r,"type",n.message,e);break;case "min":e.target==="jsonSchema7"?n.inclusive?_t(r,"minimum",n.value,n.message,e):_t(r,"exclusiveMinimum",n.value,n.message,e):(n.inclusive||(r.exclusiveMinimum=true),_t(r,"minimum",n.value,n.message,e));break;case "max":e.target==="jsonSchema7"?n.inclusive?_t(r,"maximum",n.value,n.message,e):_t(r,"exclusiveMaximum",n.value,n.message,e):(n.inclusive||(r.exclusiveMaximum=true),_t(r,"maximum",n.value,n.message,e));break;case "multipleOf":_t(r,"multipleOf",n.value,n.message,e);break}return r}function WJ(t,e){let r=e.target==="openAi",n={type:"object",properties:{}},o=[],a=t.shape();for(let s in a){let c=a[s];if(c===void 0||c._def===void 0)continue;let l=rTe(c);l&&r&&(c._def.typeName==="ZodOptional"&&(c=c._def.innerType),c.isNullable()||(c=c.nullable()),l=false);let d=Je(c._def,{...e,currentPath:[...e.currentPath,"properties",s],propertyPath:[...e.currentPath,"properties",s]});d!==void 0&&(n.properties[s]=d,l||o.push(s));}o.length&&(n.required=o);let i=tTe(t,e);return i!==void 0&&(n.additionalProperties=i),n}function tTe(t,e){if(t.catchall._def.typeName!=="ZodNever")return Je(t.catchall._def,{...e,currentPath:[...e.currentPath,"additionalProperties"]});switch(t.unknownKeys){case "passthrough":return e.allowedAdditionalProperties;case "strict":return e.rejectedAdditionalProperties;case "strip":return e.removeAdditionalStrategy==="strict"?e.allowedAdditionalProperties:e.rejectedAdditionalProperties}}function rTe(t){try{return t.isOptional()}catch{return true}}var KJ=(t,e)=>{if(e.currentPath.toString()===e.propertyPath?.toString())return Je(t.innerType._def,e);let r=Je(t.innerType._def,{...e,currentPath:[...e.currentPath,"anyOf","1"]});return r?{anyOf:[{not:Nr(e)},r]}:Nr(e)};var XJ=(t,e)=>{if(e.pipeStrategy==="input")return Je(t.in._def,e);if(e.pipeStrategy==="output")return Je(t.out._def,e);let r=Je(t.in._def,{...e,currentPath:[...e.currentPath,"allOf","0"]}),n=Je(t.out._def,{...e,currentPath:[...e.currentPath,"allOf",r?"1":"0"]});return {allOf:[r,n].filter(o=>o!==void 0)}};function YJ(t,e){return Je(t.type._def,e)}function QJ(t,e){let n={type:"array",uniqueItems:true,items:Je(t.valueType._def,{...e,currentPath:[...e.currentPath,"items"]})};return t.minSize&&_t(n,"minItems",t.minSize.value,t.minSize.message,e),t.maxSize&&_t(n,"maxItems",t.maxSize.value,t.maxSize.message,e),n}function eZ(t,e){return t.rest?{type:"array",minItems:t.items.length,items:t.items.map((r,n)=>Je(r._def,{...e,currentPath:[...e.currentPath,"items",`${n}`]})).reduce((r,n)=>n===void 0?r:[...r,n],[]),additionalItems:Je(t.rest._def,{...e,currentPath:[...e.currentPath,"additionalItems"]})}:{type:"array",minItems:t.items.length,maxItems:t.items.length,items:t.items.map((r,n)=>Je(r._def,{...e,currentPath:[...e.currentPath,"items",`${n}`]})).reduce((r,n)=>n===void 0?r:[...r,n],[])}}function tZ(t){return {not:Nr(t)}}function rZ(t){return Nr(t)}var nZ=(t,e)=>Je(t.innerType._def,e);var oZ=(t,e,r)=>{switch(e){case ce.ZodString:return YA(t,r);case ce.ZodNumber:return qJ(t,r);case ce.ZodObject:return WJ(t,r);case ce.ZodBigInt:return PJ(t,r);case ce.ZodBoolean:return NJ();case ce.ZodDate:return TO(t,r);case ce.ZodUndefined:return tZ(r);case ce.ZodNull:return jJ(r);case ce.ZodArray:return OJ(t,r);case ce.ZodUnion:case ce.ZodDiscriminatedUnion:return JJ(t,r);case ce.ZodIntersection:return BJ(t,r);case ce.ZodTuple:return eZ(t,r);case ce.ZodRecord:return QA(t,r);case ce.ZodLiteral:return MJ(t,r);case ce.ZodEnum:return UJ(t);case ce.ZodNativeEnum:return HJ(t);case ce.ZodNullable:return ZJ(t,r);case ce.ZodOptional:return KJ(t,r);case ce.ZodMap:return zJ(t,r);case ce.ZodSet:return QJ(t,r);case ce.ZodLazy:return ()=>t.getter()._def;case ce.ZodPromise:return YJ(t,r);case ce.ZodNaN:case ce.ZodNever:return VJ(r);case ce.ZodEffects:return LJ(t,r);case ce.ZodAny:return Nr(r);case ce.ZodUnknown:return rZ(r);case ce.ZodDefault:return DJ(t,r);case ce.ZodBranded:return XA(t,r);case ce.ZodReadonly:return nZ(t,r);case ce.ZodCatch:return $J(t,r);case ce.ZodPipeline:return XJ(t,r);case ce.ZodFunction:case ce.ZodVoid:case ce.ZodSymbol:return;default:return (n=>{})()}};function Je(t,e,r=false){let n=e.seen.get(t);if(e.override){let s=e.override?.(t,e,n,r);if(s!==IJ)return s}if(n&&!r){let s=nTe(n,e);if(s!==void 0)return s}let o={def:t,path:e.currentPath,jsonSchema:void 0};e.seen.set(t,o);let a=oZ(t,t.typeName,e),i=typeof a=="function"?Je(a(),e):a;if(i&&oTe(t,e,i),e.postProcess){let s=e.postProcess(i,t,e);return o.jsonSchema=i,s}return o.jsonSchema=i,i}var nTe=(t,e)=>{switch(e.$refStrategy){case "root":return {$ref:t.path.join("/")};case "relative":return {$ref:KA(e.currentPath,t.path)};case "none":case "seen":return t.path.length<e.currentPath.length&&t.path.every((r,n)=>e.currentPath[n]===r)?(console.warn(`Recursive reference detected at ${e.currentPath.join("/")}! Defaulting to any`),Nr(e)):e.$refStrategy==="seen"?Nr(e):void 0}},oTe=(t,e,r)=>(t.description&&(r.description=t.description,e.markdownDescription&&(r.markdownDescription=t.description)),r);var EO=(t,e)=>{let r=RJ(e),n=typeof e=="object"&&e.definitions?Object.entries(e.definitions).reduce((c,[l,d])=>({...c,[l]:Je(d._def,{...r,currentPath:[...r.basePath,r.definitionPath,l]},true)??Nr(r)}),{}):void 0,o=typeof e=="string"?e:e?.nameStrategy==="title"?void 0:e?.name,a=Je(t._def,o===void 0?r:{...r,currentPath:[...r.basePath,r.definitionPath,o]},false)??Nr(r),i=typeof e=="object"&&e.name!==void 0&&e.nameStrategy==="title"?e.name:void 0;i!==void 0&&(a.title=i),r.flags.hasReferencedOpenAiAnyType&&(n||(n={}),n[r.openAiAnyTypeName]||(n[r.openAiAnyTypeName]={type:["string","number","integer","boolean","array","null"],items:{$ref:r.$refStrategy==="relative"?"1":[...r.basePath,r.definitionPath,r.openAiAnyTypeName].join("/")}}));let s=o===void 0?n?{...a,[r.definitionPath]:n}:a:{$ref:[...r.$refStrategy==="relative"?[]:r.basePath,r.definitionPath,o].join("/"),[r.definitionPath]:{...n,[o]:a}};return r.target==="jsonSchema7"?s.$schema="http://json-schema.org/draft-07/schema#":(r.target==="jsonSchema2019-09"||r.target==="openAi")&&(s.$schema="https://json-schema.org/draft/2019-09/schema#"),r.target==="openAi"&&("anyOf"in s||"oneOf"in s||"allOf"in s||"type"in s&&Array.isArray(s.type))&&console.warn("Warning: OpenAI may not support schemas with unions as roots! Try wrapping it in an object property."),s};function aTe(t){return !t||t==="jsonSchema7"||t==="draft-7"?"draft-7":t==="jsonSchema2019-09"||t==="draft-2020-12"?"draft-2020-12":"draft-7"}function IO(t,e){return xi(t)?ap(t,{target:aTe(e?.target),io:e?.pipeStrategy??"input"}):EO(t,{strictUnions:e?.strictUnions??true,pipeStrategy:e?.pipeStrategy??"input"})}function CO(t){let r=Md(t)?.method;if(!r)throw new Error("Schema is missing a method literal");let n=XT(r);if(typeof n!="string")throw new Error("Schema method literal must be a string");return n}function RO(t,e){let r=Bd(t,e);if(!r.success)throw r.error;return r.data}var iTe=6e4,ek=class{constructor(e){this._options=e,this._requestMessageId=0,this._requestHandlers=new Map,this._requestHandlerAbortControllers=new Map,this._notificationHandlers=new Map,this._responseHandlers=new Map,this._progressHandlers=new Map,this._timeoutInfo=new Map,this._pendingDebouncedNotifications=new Set,this._taskProgressTokens=new Map,this._requestResolvers=new Map,this.setNotificationHandler(NA,r=>{this._oncancel(r);}),this.setNotificationHandler(DA,r=>{this._onprogress(r);}),this.setRequestHandler($A,r=>({})),this._taskStore=e?.taskStore,this._taskMessageQueue=e?.taskMessageQueue,this._taskStore&&(this.setRequestHandler(LA,async(r,n)=>{let o=await this._taskStore.getTask(r.params.taskId,n.sessionId);if(!o)throw new $e(Me.InvalidParams,"Failed to retrieve task: Task not found");return {...o}}),this.setRequestHandler(BA,async(r,n)=>{let o=async()=>{let a=r.params.taskId;if(this._taskMessageQueue){let s;for(;s=await this._taskMessageQueue.dequeue(a,n.sessionId);){if(s.type==="response"||s.type==="error"){let c=s.message,l=c.id,d=this._requestResolvers.get(l);if(d)if(this._requestResolvers.delete(l),s.type==="response")d(c);else {let u=c,p=new $e(u.error.code,u.error.message,u.error.data);d(p);}else {let u=s.type==="response"?"Response":"Error";this._onerror(new Error(`${u} handler missing for request ${l}`));}continue}await this._transport?.send(s.message,{relatedRequestId:n.requestId});}}let i=await this._taskStore.getTask(a,n.sessionId);if(!i)throw new $e(Me.InvalidParams,`Task not found: ${a}`);if(!Hd(i.status))return await this._waitForTaskUpdate(a,n.signal),await o();if(Hd(i.status)){let s=await this._taskStore.getTaskResult(a,n.sessionId);return this._clearTaskQueue(a),{...s,_meta:{...s._meta,[zd]:{taskId:a}}}}return await o()};return await o()}),this.setRequestHandler(MA,async(r,n)=>{try{let{tasks:o,nextCursor:a}=await this._taskStore.listTasks(r.params?.cursor,n.sessionId);return {tasks:o,nextCursor:a,_meta:{}}}catch(o){throw new $e(Me.InvalidParams,`Failed to list tasks: ${o instanceof Error?o.message:String(o)}`)}}),this.setRequestHandler(zA,async(r,n)=>{try{let o=await this._taskStore.getTask(r.params.taskId,n.sessionId);if(!o)throw new $e(Me.InvalidParams,`Task not found: ${r.params.taskId}`);if(Hd(o.status))throw new $e(Me.InvalidParams,`Cannot cancel task in terminal status: ${o.status}`);await this._taskStore.updateTaskStatus(r.params.taskId,"cancelled","Client cancelled task execution.",n.sessionId),this._clearTaskQueue(r.params.taskId);let a=await this._taskStore.getTask(r.params.taskId,n.sessionId);if(!a)throw new $e(Me.InvalidParams,`Task not found after cancellation: ${r.params.taskId}`);return {_meta:{},...a}}catch(o){throw o instanceof $e?o:new $e(Me.InvalidRequest,`Failed to cancel task: ${o instanceof Error?o.message:String(o)}`)}}));}async _oncancel(e){if(!e.params.requestId)return;this._requestHandlerAbortControllers.get(e.params.requestId)?.abort(e.params.reason);}_setupTimeout(e,r,n,o,a=false){this._timeoutInfo.set(e,{timeoutId:setTimeout(o,r),startTime:Date.now(),timeout:r,maxTotalTimeout:n,resetTimeoutOnProgress:a,onTimeout:o});}_resetTimeout(e){let r=this._timeoutInfo.get(e);if(!r)return false;let n=Date.now()-r.startTime;if(r.maxTotalTimeout&&n>=r.maxTotalTimeout)throw this._timeoutInfo.delete(e),$e.fromError(Me.RequestTimeout,"Maximum total timeout exceeded",{maxTotalTimeout:r.maxTotalTimeout,totalElapsed:n});return clearTimeout(r.timeoutId),r.timeoutId=setTimeout(r.onTimeout,r.timeout),true}_cleanupTimeout(e){let r=this._timeoutInfo.get(e);r&&(clearTimeout(r.timeoutId),this._timeoutInfo.delete(e));}async connect(e){if(this._transport)throw new Error("Already connected to a transport. Call close() before connecting to a new transport, or use a separate Protocol instance per connection.");this._transport=e;let r=this.transport?.onclose;this._transport.onclose=()=>{r?.(),this._onclose();};let n=this.transport?.onerror;this._transport.onerror=a=>{n?.(a),this._onerror(a);};let o=this._transport?.onmessage;this._transport.onmessage=(a,i)=>{o?.(a,i),Kx(a)||gJ(a)?this._onresponse(a):lO(a)?this._onrequest(a,i):hJ(a)?this._onnotification(a):this._onerror(new Error(`Unknown message type: ${JSON.stringify(a)}`));},await this._transport.start();}_onclose(){let e=this._responseHandlers;this._responseHandlers=new Map,this._progressHandlers.clear(),this._taskProgressTokens.clear(),this._pendingDebouncedNotifications.clear();for(let n of this._timeoutInfo.values())clearTimeout(n.timeoutId);this._timeoutInfo.clear();for(let n of this._requestHandlerAbortControllers.values())n.abort();this._requestHandlerAbortControllers.clear();let r=$e.fromError(Me.ConnectionClosed,"Connection closed");this._transport=void 0,this.onclose?.();for(let n of e.values())n(r);}_onerror(e){this.onerror?.(e);}_onnotification(e){let r=this._notificationHandlers.get(e.method)??this.fallbackNotificationHandler;r!==void 0&&Promise.resolve().then(()=>r(e)).catch(n=>this._onerror(new Error(`Uncaught error in notification handler: ${n}`)));}_onrequest(e,r){let n=this._requestHandlers.get(e.method)??this.fallbackRequestHandler,o=this._transport,a=e.params?._meta?.[zd]?.taskId;if(n===void 0){let d={jsonrpc:"2.0",id:e.id,error:{code:Me.MethodNotFound,message:"Method not found"}};a&&this._taskMessageQueue?this._enqueueTaskMessage(a,{type:"error",message:d,timestamp:Date.now()},o?.sessionId).catch(u=>this._onerror(new Error(`Failed to enqueue error response: ${u}`))):o?.send(d).catch(u=>this._onerror(new Error(`Failed to send an error response: ${u}`)));return}let i=new AbortController;this._requestHandlerAbortControllers.set(e.id,i);let s=fJ(e.params)?e.params.task:void 0,c=this._taskStore?this.requestTaskStore(e,o?.sessionId):void 0,l={signal:i.signal,sessionId:o?.sessionId,_meta:e.params?._meta,sendNotification:async d=>{if(i.signal.aborted)return;let u={relatedRequestId:e.id};a&&(u.relatedTask={taskId:a}),await this.notification(d,u);},sendRequest:async(d,u,p)=>{if(i.signal.aborted)throw new $e(Me.ConnectionClosed,"Request was cancelled");let m={...p,relatedRequestId:e.id};a&&!m.relatedTask&&(m.relatedTask={taskId:a});let g=m.relatedTask?.taskId??a;return g&&c&&await c.updateTaskStatus(g,"input_required"),await this.request(d,u,m)},authInfo:r?.authInfo,requestId:e.id,requestInfo:r?.requestInfo,taskId:a,taskStore:c,taskRequestedTtl:s?.ttl,closeSSEStream:r?.closeSSEStream,closeStandaloneSSEStream:r?.closeStandaloneSSEStream};Promise.resolve().then(()=>{s&&this.assertTaskHandlerCapability(e.method);}).then(()=>n(e,l)).then(async d=>{if(i.signal.aborted)return;let u={result:d,jsonrpc:"2.0",id:e.id};a&&this._taskMessageQueue?await this._enqueueTaskMessage(a,{type:"response",message:u,timestamp:Date.now()},o?.sessionId):await o?.send(u);},async d=>{if(i.signal.aborted)return;let u={jsonrpc:"2.0",id:e.id,error:{code:Number.isSafeInteger(d.code)?d.code:Me.InternalError,message:d.message??"Internal error",...d.data!==void 0&&{data:d.data}}};a&&this._taskMessageQueue?await this._enqueueTaskMessage(a,{type:"error",message:u,timestamp:Date.now()},o?.sessionId):await o?.send(u);}).catch(d=>this._onerror(new Error(`Failed to send response: ${d}`))).finally(()=>{this._requestHandlerAbortControllers.get(e.id)===i&&this._requestHandlerAbortControllers.delete(e.id);});}_onprogress(e){let{progressToken:r,...n}=e.params,o=Number(r),a=this._progressHandlers.get(o);if(!a){this._onerror(new Error(`Received a progress notification for an unknown token: ${JSON.stringify(e)}`));return}let i=this._responseHandlers.get(o),s=this._timeoutInfo.get(o);if(s&&i&&s.resetTimeoutOnProgress)try{this._resetTimeout(o);}catch(c){this._responseHandlers.delete(o),this._progressHandlers.delete(o),this._cleanupTimeout(o),i(c);return}a(n);}_onresponse(e){let r=Number(e.id),n=this._requestResolvers.get(r);if(n){if(this._requestResolvers.delete(r),Kx(e))n(e);else {let i=new $e(e.error.code,e.error.message,e.error.data);n(i);}return}let o=this._responseHandlers.get(r);if(o===void 0){this._onerror(new Error(`Received a response for an unknown message ID: ${JSON.stringify(e)}`));return}this._responseHandlers.delete(r),this._cleanupTimeout(r);let a=false;if(Kx(e)&&e.result&&typeof e.result=="object"){let i=e.result;if(i.task&&typeof i.task=="object"){let s=i.task;typeof s.taskId=="string"&&(a=true,this._taskProgressTokens.set(s.taskId,r));}}if(a||this._progressHandlers.delete(r),Kx(e))o(e);else {let i=$e.fromError(e.error.code,e.error.message,e.error.data);o(i);}}get transport(){return this._transport}async close(){await this._transport?.close();}async*requestStream(e,r,n){let{task:o}=n??{};if(!o){try{yield {type:"result",result:await this.request(e,r,n)};}catch(i){yield {type:"error",error:i instanceof $e?i:new $e(Me.InternalError,String(i))};}return}let a;try{let i=await this.request(e,_0,n);if(i.task)a=i.task.taskId,yield {type:"taskCreated",task:i.task};else throw new $e(Me.InternalError,"Task creation did not return a task");for(;;){let s=await this.getTask({taskId:a},n);if(yield {type:"taskStatus",task:s},Hd(s.status)){s.status==="completed"?yield {type:"result",result:await this.getTaskResult({taskId:a},r,n)}:s.status==="failed"?yield {type:"error",error:new $e(Me.InternalError,`Task ${a} failed`)}:s.status==="cancelled"&&(yield {type:"error",error:new $e(Me.InternalError,`Task ${a} was cancelled`)});return}if(s.status==="input_required"){yield {type:"result",result:await this.getTaskResult({taskId:a},r,n)};return}let c=s.pollInterval??this._options?.defaultTaskPollInterval??1e3;await new Promise(l=>setTimeout(l,c)),n?.signal?.throwIfAborted();}}catch(i){yield {type:"error",error:i instanceof $e?i:new $e(Me.InternalError,String(i))};}}request(e,r,n){let{relatedRequestId:o,resumptionToken:a,onresumptiontoken:i,task:s,relatedTask:c}=n??{};return new Promise((l,d)=>{let u=E=>{d(E);};if(!this._transport){u(new Error("Not connected"));return}if(this._options?.enforceStrictCapabilities===true)try{this.assertCapabilityForMethod(e.method),s&&this.assertTaskCapability(e.method);}catch(E){u(E);return}n?.signal?.throwIfAborted();let p=this._requestMessageId++,m={...e,jsonrpc:"2.0",id:p};n?.onprogress&&(this._progressHandlers.set(p,n.onprogress),m.params={...e.params,_meta:{...e.params?._meta||{},progressToken:p}}),s&&(m.params={...m.params,task:s}),c&&(m.params={...m.params,_meta:{...m.params?._meta||{},[zd]:c}});let g=E=>{this._responseHandlers.delete(p),this._progressHandlers.delete(p),this._cleanupTimeout(p),this._transport?.send({jsonrpc:"2.0",method:"notifications/cancelled",params:{requestId:p,reason:String(E)}},{relatedRequestId:o,resumptionToken:a,onresumptiontoken:i}).catch(I=>this._onerror(new Error(`Failed to send cancellation: ${I}`)));let A=E instanceof $e?E:new $e(Me.RequestTimeout,String(E));d(A);};this._responseHandlers.set(p,E=>{if(!n?.signal?.aborted){if(E instanceof Error)return d(E);try{let A=Bd(r,E.result);A.success?l(A.data):d(A.error);}catch(A){d(A);}}}),n?.signal?.addEventListener("abort",()=>{g(n?.signal?.reason);});let b=n?.timeout??iTe,x=()=>g($e.fromError(Me.RequestTimeout,"Request timed out",{timeout:b}));this._setupTimeout(p,b,n?.maxTotalTimeout,x,n?.resetTimeoutOnProgress??false);let v=c?.taskId;if(v){let E=A=>{let I=this._responseHandlers.get(p);I?I(A):this._onerror(new Error(`Response handler missing for side-channeled request ${p}`));};this._requestResolvers.set(p,E),this._enqueueTaskMessage(v,{type:"request",message:m,timestamp:Date.now()}).catch(A=>{this._cleanupTimeout(p),d(A);});}else this._transport.send(m,{relatedRequestId:o,resumptionToken:a,onresumptiontoken:i}).catch(E=>{this._cleanupTimeout(p),d(E);});})}async getTask(e,r){return this.request({method:"tasks/get",params:e},UA,r)}async getTaskResult(e,r,n){return this.request({method:"tasks/result",params:e},r,n)}async listTasks(e,r){return this.request({method:"tasks/list",params:e},FA,r)}async cancelTask(e,r){return this.request({method:"tasks/cancel",params:e},xJ,r)}async notification(e,r){if(!this._transport)throw new Error("Not connected");this.assertNotificationCapability(e.method);let n=r?.relatedTask?.taskId;if(n){let s={...e,jsonrpc:"2.0",params:{...e.params,_meta:{...e.params?._meta||{},[zd]:r.relatedTask}}};await this._enqueueTaskMessage(n,{type:"notification",message:s,timestamp:Date.now()});return}if((this._options?.debouncedNotificationMethods??[]).includes(e.method)&&!e.params&&!r?.relatedRequestId&&!r?.relatedTask){if(this._pendingDebouncedNotifications.has(e.method))return;this._pendingDebouncedNotifications.add(e.method),Promise.resolve().then(()=>{if(this._pendingDebouncedNotifications.delete(e.method),!this._transport)return;let s={...e,jsonrpc:"2.0"};r?.relatedTask&&(s={...s,params:{...s.params,_meta:{...s.params?._meta||{},[zd]:r.relatedTask}}}),this._transport?.send(s,r).catch(c=>this._onerror(c));});return}let i={...e,jsonrpc:"2.0"};r?.relatedTask&&(i={...i,params:{...i.params,_meta:{...i.params?._meta||{},[zd]:r.relatedTask}}}),await this._transport.send(i,r);}setRequestHandler(e,r){let n=CO(e);this.assertRequestHandlerCapability(n),this._requestHandlers.set(n,(o,a)=>{let i=RO(e,o);return Promise.resolve(r(i,a))});}removeRequestHandler(e){this._requestHandlers.delete(e);}assertCanSetRequestHandler(e){if(this._requestHandlers.has(e))throw new Error(`A request handler for ${e} already exists, which would be overridden`)}setNotificationHandler(e,r){let n=CO(e);this._notificationHandlers.set(n,o=>{let a=RO(e,o);return Promise.resolve(r(a))});}removeNotificationHandler(e){this._notificationHandlers.delete(e);}_cleanupTaskProgressHandler(e){let r=this._taskProgressTokens.get(e);r!==void 0&&(this._progressHandlers.delete(r),this._taskProgressTokens.delete(e));}async _enqueueTaskMessage(e,r,n){if(!this._taskStore||!this._taskMessageQueue)throw new Error("Cannot enqueue task message: taskStore and taskMessageQueue are not configured");let o=this._options?.maxTaskQueueSize;await this._taskMessageQueue.enqueue(e,r,n,o);}async _clearTaskQueue(e,r){if(this._taskMessageQueue){let n=await this._taskMessageQueue.dequeueAll(e,r);for(let o of n)if(o.type==="request"&&lO(o.message)){let a=o.message.id,i=this._requestResolvers.get(a);i?(i(new $e(Me.InternalError,"Task cancelled or completed")),this._requestResolvers.delete(a)):this._onerror(new Error(`Resolver missing for request ${a} during task ${e} cleanup`));}}}async _waitForTaskUpdate(e,r){let n=this._options?.defaultTaskPollInterval??1e3;try{let o=await this._taskStore?.getTask(e);o?.pollInterval&&(n=o.pollInterval);}catch{}return new Promise((o,a)=>{if(r.aborted){a(new $e(Me.InvalidRequest,"Request cancelled"));return}let i=setTimeout(o,n);r.addEventListener("abort",()=>{clearTimeout(i),a(new $e(Me.InvalidRequest,"Request cancelled"));},{once:true});})}requestTaskStore(e,r){let n=this._taskStore;if(!n)throw new Error("No task store configured");return {createTask:async o=>{if(!e)throw new Error("No request provided");return await n.createTask(o,e.id,{method:e.method,params:e.params},r)},getTask:async o=>{let a=await n.getTask(o,r);if(!a)throw new $e(Me.InvalidParams,"Failed to retrieve task: Task not found");return a},storeTaskResult:async(o,a,i)=>{await n.storeTaskResult(o,a,i,r);let s=await n.getTask(o,r);if(s){let c=t1.parse({method:"notifications/tasks/status",params:s});await this.notification(c),Hd(s.status)&&this._cleanupTaskProgressHandler(o);}},getTaskResult:o=>n.getTaskResult(o,r),updateTaskStatus:async(o,a,i)=>{let s=await n.getTask(o,r);if(!s)throw new $e(Me.InvalidParams,`Task "${o}" not found - it may have been cleaned up`);if(Hd(s.status))throw new $e(Me.InvalidParams,`Cannot update task "${o}" from terminal status "${s.status}" to "${a}". Terminal states (completed, failed, cancelled) cannot transition to other states.`);await n.updateTaskStatus(o,a,i,r);let c=await n.getTask(o,r);if(c){let l=t1.parse({method:"notifications/tasks/status",params:c});await this.notification(l),Hd(c.status)&&this._cleanupTaskProgressHandler(o);}},listTasks:o=>n.listTasks(o,r)}}};function aZ(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function iZ(t,e){let r={...t};for(let n in e){let o=n,a=e[o];if(a===void 0)continue;let i=r[o];aZ(i)&&aZ(a)?r[o]={...i,...a}:r[o]=a;}return r}var JW=pi(h7()),ZW=pi(GW());function X8e(){let t=new JW.default({strict:false,validateFormats:true,validateSchema:false,allErrors:true});return (0, ZW.default)(t),t}var Lk=class{constructor(e){this._ajv=e??X8e();}getValidator(e){let r="$id"in e&&typeof e.$id=="string"?this._ajv.getSchema(e.$id)??this._ajv.compile(e):this._ajv.compile(e);return n=>r(n)?{valid:true,data:n,errorMessage:void 0}:{valid:false,data:void 0,errorMessage:this._ajv.errorsText(r.errors)}}};var Uk=class{constructor(e){this._server=e;}requestStream(e,r,n){return this._server.requestStream(e,r,n)}createMessageStream(e,r){let n=this._server.getClientCapabilities();if((e.tools||e.toolChoice)&&!n?.sampling?.tools)throw new Error("Client does not support sampling tools capability.");if(e.messages.length>0){let o=e.messages[e.messages.length-1],a=Array.isArray(o.content)?o.content:[o.content],i=a.some(d=>d.type==="tool_result"),s=e.messages.length>1?e.messages[e.messages.length-2]:void 0,c=s?Array.isArray(s.content)?s.content:[s.content]:[],l=c.some(d=>d.type==="tool_use");if(i){if(a.some(d=>d.type!=="tool_result"))throw new Error("The last message must contain only tool_result content if any is present");if(!l)throw new Error("tool_result blocks are not matching any tool_use from the previous message")}if(l){let d=new Set(c.filter(p=>p.type==="tool_use").map(p=>p.id)),u=new Set(a.filter(p=>p.type==="tool_result").map(p=>p.toolUseId));if(d.size!==u.size||![...d].every(p=>u.has(p)))throw new Error("ids of tool_result blocks and tool_use blocks from previous message do not match")}}return this.requestStream({method:"sampling/createMessage",params:e},o1,r)}elicitInputStream(e,r){let n=this._server.getClientCapabilities(),o=e.mode??"form";switch(o){case "url":{if(!n?.elicitation?.url)throw new Error("Client does not support url elicitation.");break}case "form":{if(!n?.elicitation?.form)throw new Error("Client does not support form elicitation.");break}}let a=o==="form"&&e.mode===void 0?{...e,mode:"form"}:e;return this.requestStream({method:"elicitation/create",params:a},A0,r)}async getTask(e,r){return this._server.getTask({taskId:e},r)}async getTaskResult(e,r,n){return this._server.getTaskResult({taskId:e},r,n)}async listTasks(e,r){return this._server.listTasks(e?{cursor:e}:void 0,r)}async cancelTask(e,r){return this._server.cancelTask({taskId:e},r)}};function qW(t,e,r){if(!t)throw new Error(`${r} does not support task creation (required for ${e})`);switch(e){case "tools/call":if(!t.tools?.call)throw new Error(`${r} does not support task creation for tools/call (required for ${e})`);break;}}function WW(t,e,r){if(!t)throw new Error(`${r} does not support task creation (required for ${e})`);switch(e){case "sampling/createMessage":if(!t.sampling?.createMessage)throw new Error(`${r} does not support task creation for sampling/createMessage (required for ${e})`);break;case "elicitation/create":if(!t.elicitation?.create)throw new Error(`${r} does not support task creation for elicitation/create (required for ${e})`);break;}}var Bk=class extends ek{constructor(e,r){super(r),this._serverInfo=e,this._loggingLevels=new Map,this.LOG_LEVEL_SEVERITY=new Map(n1.options.map((n,o)=>[n,o])),this.isMessageIgnored=(n,o)=>{let a=this._loggingLevels.get(o);return a?this.LOG_LEVEL_SEVERITY.get(n)<this.LOG_LEVEL_SEVERITY.get(a):false},this._capabilities=r?.capabilities??{},this._instructions=r?.instructions,this._jsonSchemaValidator=r?.jsonSchemaValidator??new Lk,this.setRequestHandler(fO,n=>this._oninitialize(n)),this.setNotificationHandler(pO,()=>this.oninitialized?.()),this._capabilities.logging&&this.setRequestHandler(wO,async(n,o)=>{let a=o.sessionId||o.requestInfo?.headers["mcp-session-id"]||void 0,{level:i}=n.params,s=n1.safeParse(i);return s.success&&this._loggingLevels.set(a,s.data),{}});}get experimental(){return this._experimental||(this._experimental={tasks:new Uk(this)}),this._experimental}registerCapabilities(e){if(this.transport)throw new Error("Cannot register capabilities after connecting to transport");this._capabilities=iZ(this._capabilities,e);}setRequestHandler(e,r){let o=Md(e)?.method;if(!o)throw new Error("Schema is missing a method literal");let a;if(xi(o)){let s=o;a=s._zod?.def?.value??s.value;}else {let s=o;a=s._def?.value??s.value;}if(typeof a!="string")throw new Error("Schema method literal must be a string");if(a==="tools/call"){let s=async(c,l)=>{let d=Bd(T0,c);if(!d.success){let g=d.error instanceof Error?d.error.message:String(d.error);throw new $e(Me.InvalidParams,`Invalid tools/call request: ${g}`)}let{params:u}=d.data,p=await Promise.resolve(r(c,l));if(u.task){let g=Bd(_0,p);if(!g.success){let b=g.error instanceof Error?g.error.message:String(g.error);throw new $e(Me.InvalidParams,`Invalid task creation result: ${b}`)}return g.data}let m=Bd(qA,p);if(!m.success){let g=m.error instanceof Error?m.error.message:String(m.error);throw new $e(Me.InvalidParams,`Invalid tools/call result: ${g}`)}return m.data};return super.setRequestHandler(e,s)}return super.setRequestHandler(e,r)}assertCapabilityForMethod(e){switch(e){case "sampling/createMessage":if(!this._clientCapabilities?.sampling)throw new Error(`Client does not support sampling (required for ${e})`);break;case "elicitation/create":if(!this._clientCapabilities?.elicitation)throw new Error(`Client does not support elicitation (required for ${e})`);break;case "roots/list":if(!this._clientCapabilities?.roots)throw new Error(`Client does not support listing roots (required for ${e})`);break;}}assertNotificationCapability(e){switch(e){case "notifications/message":if(!this._capabilities.logging)throw new Error(`Server does not support logging (required for ${e})`);break;case "notifications/resources/updated":case "notifications/resources/list_changed":if(!this._capabilities.resources)throw new Error(`Server does not support notifying about resources (required for ${e})`);break;case "notifications/tools/list_changed":if(!this._capabilities.tools)throw new Error(`Server does not support notifying of tool list changes (required for ${e})`);break;case "notifications/prompts/list_changed":if(!this._capabilities.prompts)throw new Error(`Server does not support notifying of prompt list changes (required for ${e})`);break;case "notifications/elicitation/complete":if(!this._clientCapabilities?.elicitation?.url)throw new Error(`Client does not support URL elicitation (required for ${e})`);break;}}assertRequestHandlerCapability(e){if(this._capabilities)switch(e){case "completion/complete":if(!this._capabilities.completions)throw new Error(`Server does not support completions (required for ${e})`);break;case "logging/setLevel":if(!this._capabilities.logging)throw new Error(`Server does not support logging (required for ${e})`);break;case "prompts/get":case "prompts/list":if(!this._capabilities.prompts)throw new Error(`Server does not support prompts (required for ${e})`);break;case "resources/list":case "resources/templates/list":case "resources/read":if(!this._capabilities.resources)throw new Error(`Server does not support resources (required for ${e})`);break;case "tools/call":case "tools/list":if(!this._capabilities.tools)throw new Error(`Server does not support tools (required for ${e})`);break;case "tasks/get":case "tasks/list":case "tasks/result":case "tasks/cancel":if(!this._capabilities.tasks)throw new Error(`Server does not support tasks capability (required for ${e})`);break;}}assertTaskCapability(e){WW(this._clientCapabilities?.tasks?.requests,e,"Client");}assertTaskHandlerCapability(e){this._capabilities&&qW(this._capabilities.tasks?.requests,e,"Server");}async _oninitialize(e){let r=e.params.protocolVersion;return this._clientCapabilities=e.params.capabilities,this._clientVersion=e.params.clientInfo,{protocolVersion:lJ.includes(r)?r:sO,capabilities:this.getCapabilities(),serverInfo:this._serverInfo,...this._instructions&&{instructions:this._instructions}}}getClientCapabilities(){return this._clientCapabilities}getClientVersion(){return this._clientVersion}getCapabilities(){return this._capabilities}async ping(){return this.request({method:"ping"},PA)}async createMessage(e,r){if((e.tools||e.toolChoice)&&!this._clientCapabilities?.sampling?.tools)throw new Error("Client does not support sampling tools capability.");if(e.messages.length>0){let n=e.messages[e.messages.length-1],o=Array.isArray(n.content)?n.content:[n.content],a=o.some(l=>l.type==="tool_result"),i=e.messages.length>1?e.messages[e.messages.length-2]:void 0,s=i?Array.isArray(i.content)?i.content:[i.content]:[],c=s.some(l=>l.type==="tool_use");if(a){if(o.some(l=>l.type!=="tool_result"))throw new Error("The last message must contain only tool_result content if any is present");if(!c)throw new Error("tool_result blocks are not matching any tool_use from the previous message")}if(c){let l=new Set(s.filter(u=>u.type==="tool_use").map(u=>u.id)),d=new Set(o.filter(u=>u.type==="tool_result").map(u=>u.toolUseId));if(l.size!==d.size||![...l].every(u=>d.has(u)))throw new Error("ids of tool_result blocks and tool_use blocks from previous message do not match")}}return e.tools?this.request({method:"sampling/createMessage",params:e},vO,r):this.request({method:"sampling/createMessage",params:e},o1,r)}async elicitInput(e,r){switch(e.mode??"form"){case "url":{if(!this._clientCapabilities?.elicitation?.url)throw new Error("Client does not support url elicitation.");let o=e;return this.request({method:"elicitation/create",params:o},A0,r)}case "form":{if(!this._clientCapabilities?.elicitation?.form)throw new Error("Client does not support form elicitation.");let o=e.mode==="form"?e:{...e,mode:"form"},a=await this.request({method:"elicitation/create",params:o},A0,r);if(a.action==="accept"&&a.content&&o.requestedSchema)try{let s=this._jsonSchemaValidator.getValidator(o.requestedSchema)(a.content);if(!s.valid)throw new $e(Me.InvalidParams,`Elicitation response content does not match requested schema: ${s.errorMessage}`)}catch(i){throw i instanceof $e?i:new $e(Me.InternalError,`Error validating elicitation response: ${i instanceof Error?i.message:String(i)}`)}return a}}}createElicitationCompletionNotifier(e,r){if(!this._clientCapabilities?.elicitation?.url)throw new Error("Client does not support URL elicitation (required for notifications/elicitation/complete)");return ()=>this.notification({method:"notifications/elicitation/complete",params:{elicitationId:e}},r)}async listRoots(e,r){return this.request({method:"roots/list",params:e},_O,r)}async sendLoggingMessage(e,r){if(this._capabilities.logging&&!this.isMessageIgnored(e.level,r))return this.notification({method:"notifications/message",params:e})}async sendResourceUpdated(e){return this.notification({method:"notifications/resources/updated",params:e})}async sendResourceListChanged(){return this.notification({method:"notifications/resources/list_changed"})}async sendToolListChanged(){return this.notification({method:"notifications/tools/list_changed"})}async sendPromptListChanged(){return this.notification({method:"notifications/prompts/list_changed"})}};var XW=Symbol.for("mcp.completable");function S7(t){return !!t&&typeof t=="object"&&XW in t}function YW(t){return t[XW]?.complete}var KW;(function(t){t.Completable="McpCompletable";})(KW||(KW={}));var Y8e=/^[A-Za-z0-9._-]{1,128}$/;function Q8e(t){let e=[];if(t.length===0)return {isValid:false,warnings:["Tool name cannot be empty"]};if(t.length>128)return {isValid:false,warnings:[`Tool name exceeds maximum length of 128 characters (current: ${t.length})`]};if(t.includes(" ")&&e.push("Tool name contains spaces, which may cause parsing issues"),t.includes(",")&&e.push("Tool name contains commas, which may cause parsing issues"),(t.startsWith("-")||t.endsWith("-"))&&e.push("Tool name starts or ends with a dash, which may cause parsing issues in some contexts"),(t.startsWith(".")||t.endsWith("."))&&e.push("Tool name starts or ends with a dot, which may cause parsing issues in some contexts"),!Y8e.test(t)){let r=t.split("").filter(n=>!/[A-Za-z0-9._-]/.test(n)).filter((n,o,a)=>a.indexOf(n)===o);return e.push(`Tool name contains invalid characters: ${r.map(n=>`"${n}"`).join(", ")}`,"Allowed characters are: A-Z, a-z, 0-9, underscore (_), dash (-), and dot (.)"),{isValid:false,warnings:e}}return {isValid:true,warnings:e}}function e4e(t,e){if(e.length>0){console.warn(`Tool name validation warning for "${t}":`);for(let r of e)console.warn(` - ${r}`);console.warn("Tool registration will proceed, but this may cause compatibility issues."),console.warn("Consider updating the tool name to conform to the MCP tool naming standard."),console.warn("See SEP: Specify Format for Tool Names (https://github.com/modelcontextprotocol/modelcontextprotocol/issues/986) for more details.");}}function T7(t){let e=Q8e(t);return e4e(t,e.warnings),e.isValid}var Mk=class{constructor(e){this._mcpServer=e;}registerToolTask(e,r,n){let o={taskSupport:"required",...r.execution};if(o.taskSupport==="forbidden")throw new Error(`Cannot register task-based tool '${e}' with taskSupport 'forbidden'. Use registerTool() instead.`);return this._mcpServer._createRegisteredTool(e,r.title,r.description,r.inputSchema,r.outputSchema,r.annotations,o,r._meta,n)}};Vo();var Fk=class{constructor(e,r){this._registeredResources={},this._registeredResourceTemplates={},this._registeredTools={},this._registeredPrompts={},this._toolHandlersInitialized=false,this._completionHandlerInitialized=false,this._resourceHandlersInitialized=false,this._promptHandlersInitialized=false,this.server=new Bk(e,r);}get experimental(){return this._experimental||(this._experimental={tasks:new Mk(this)}),this._experimental}async connect(e){return await this.server.connect(e)}async close(){await this.server.close();}setToolRequestHandlers(){this._toolHandlersInitialized||(this.server.assertCanSetRequestHandler(Xd(ZA)),this.server.assertCanSetRequestHandler(Xd(T0)),this.server.registerCapabilities({tools:{listChanged:true}}),this.server.setRequestHandler(ZA,()=>({tools:Object.entries(this._registeredTools).filter(([,e])=>e.enabled).map(([e,r])=>{let n={name:e,title:r.title,description:r.description,inputSchema:(()=>{let o=f0(r.inputSchema);return o?IO(o,{strictUnions:true,pipeStrategy:"input"}):t4e})(),annotations:r.annotations,execution:r.execution,_meta:r._meta};if(r.outputSchema){let o=f0(r.outputSchema);o&&(n.outputSchema=IO(o,{strictUnions:true,pipeStrategy:"output"}));}return n})})),this.server.setRequestHandler(T0,async(e,r)=>{try{let n=this._registeredTools[e.params.name];if(!n)throw new $e(Me.InvalidParams,`Tool ${e.params.name} not found`);if(!n.enabled)throw new $e(Me.InvalidParams,`Tool ${e.params.name} disabled`);let o=!!e.params.task,a=n.execution?.taskSupport,i="createTask"in n.handler;if((a==="required"||a==="optional")&&!i)throw new $e(Me.InternalError,`Tool ${e.params.name} has taskSupport '${a}' but was not registered with registerToolTask`);if(a==="required"&&!o)throw new $e(Me.MethodNotFound,`Tool ${e.params.name} requires task augmentation (taskSupport: 'required')`);if(a==="optional"&&!o&&i)return await this.handleAutomaticTaskPolling(n,e,r);let s=await this.validateToolInput(n,e.params.arguments,e.params.name),c=await this.executeToolHandler(n,s,r);return o||await this.validateToolOutput(n,c,e.params.name),c}catch(n){if(n instanceof $e&&n.code===Me.UrlElicitationRequired)throw n;return this.createToolError(n instanceof Error?n.message:String(n))}}),this._toolHandlersInitialized=true);}createToolError(e){return {content:[{type:"text",text:e}],isError:true}}async validateToolInput(e,r,n){if(!e.inputSchema)return;let a=f0(e.inputSchema)??e.inputSchema,i=await WT(a,r);if(!i.success){let s="error"in i?i.error:"Unknown error",c=KT(s);throw new $e(Me.InvalidParams,`Input validation error: Invalid arguments for tool ${n}: ${c}`)}return i.data}async validateToolOutput(e,r,n){if(!e.outputSchema||!("content"in r)||r.isError)return;if(!r.structuredContent)throw new $e(Me.InvalidParams,`Output validation error: Tool ${n} has an output schema but no structured content was provided`);let o=f0(e.outputSchema),a=await WT(o,r.structuredContent);if(!a.success){let i="error"in a?a.error:"Unknown error",s=KT(i);throw new $e(Me.InvalidParams,`Output validation error: Invalid structured content for tool ${n}: ${s}`)}}async executeToolHandler(e,r,n){let o=e.handler;if("createTask"in o){if(!n.taskStore)throw new Error("No task store provided.");let i={...n,taskStore:n.taskStore};if(e.inputSchema){let s=o;return await Promise.resolve(s.createTask(r,i))}else {let s=o;return await Promise.resolve(s.createTask(i))}}if(e.inputSchema){let i=o;return await Promise.resolve(i(r,n))}else {let i=o;return await Promise.resolve(i(n))}}async handleAutomaticTaskPolling(e,r,n){if(!n.taskStore)throw new Error("No task store provided for task-capable tool.");let o=await this.validateToolInput(e,r.params.arguments,r.params.name),a=e.handler,i={...n,taskStore:n.taskStore},s=o?await Promise.resolve(a.createTask(o,i)):await Promise.resolve(a.createTask(i)),c=s.task.taskId,l=s.task,d=l.pollInterval??5e3;for(;l.status!=="completed"&&l.status!=="failed"&&l.status!=="cancelled";){await new Promise(p=>setTimeout(p,d));let u=await n.taskStore.getTask(c);if(!u)throw new $e(Me.InternalError,`Task ${c} not found during polling`);l=u;}return await n.taskStore.getTaskResult(c)}setCompletionRequestHandler(){this._completionHandlerInitialized||(this.server.assertCanSetRequestHandler(Xd(WA)),this.server.registerCapabilities({completions:{}}),this.server.setRequestHandler(WA,async e=>{switch(e.params.ref.type){case "ref/prompt":return AJ(e),this.handlePromptCompletion(e,e.params.ref);case "ref/resource":return kJ(e),this.handleResourceCompletion(e,e.params.ref);default:throw new $e(Me.InvalidParams,`Invalid completion reference: ${e.params.ref}`)}}),this._completionHandlerInitialized=true);}async handlePromptCompletion(e,r){let n=this._registeredPrompts[r.name];if(!n)throw new $e(Me.InvalidParams,`Prompt ${r.name} not found`);if(!n.enabled)throw new $e(Me.InvalidParams,`Prompt ${r.name} disabled`);if(!n.argsSchema)return D1;let a=Md(n.argsSchema)?.[e.params.argument.name];if(!S7(a))return D1;let i=YW(a);if(!i)return D1;let s=await i(e.params.argument.value,e.params.context);return eK(s)}async handleResourceCompletion(e,r){let n=Object.values(this._registeredResourceTemplates).find(i=>i.resourceTemplate.uriTemplate.toString()===r.uri);if(!n){if(this._registeredResources[r.uri])return D1;throw new $e(Me.InvalidParams,`Resource template ${e.params.ref.uri} not found`)}let o=n.resourceTemplate.completeCallback(e.params.argument.name);if(!o)return D1;let a=await o(e.params.argument.value,e.params.context);return eK(a)}setResourceRequestHandlers(){this._resourceHandlersInitialized||(this.server.assertCanSetRequestHandler(Xd(HA)),this.server.assertCanSetRequestHandler(Xd(VA)),this.server.assertCanSetRequestHandler(Xd(jA)),this.server.registerCapabilities({resources:{listChanged:true}}),this.server.setRequestHandler(HA,async(e,r)=>{let n=Object.entries(this._registeredResources).filter(([a,i])=>i.enabled).map(([a,i])=>({uri:a,name:i.name,...i.metadata})),o=[];for(let a of Object.values(this._registeredResourceTemplates)){if(!a.resourceTemplate.listCallback)continue;let i=await a.resourceTemplate.listCallback(r);for(let s of i.resources)o.push({...a.metadata,...s});}return {resources:[...n,...o]}}),this.server.setRequestHandler(VA,async()=>({resourceTemplates:Object.entries(this._registeredResourceTemplates).map(([r,n])=>({name:r,uriTemplate:n.resourceTemplate.uriTemplate.toString(),...n.metadata}))})),this.server.setRequestHandler(jA,async(e,r)=>{let n=new URL(e.params.uri),o=this._registeredResources[n.toString()];if(o){if(!o.enabled)throw new $e(Me.InvalidParams,`Resource ${n} disabled`);return o.readCallback(n,r)}for(let a of Object.values(this._registeredResourceTemplates)){let i=a.resourceTemplate.uriTemplate.match(n.toString());if(i)return a.readCallback(n,i,r)}throw new $e(Me.InvalidParams,`Resource ${n} not found`)}),this._resourceHandlersInitialized=true);}setPromptRequestHandlers(){this._promptHandlersInitialized||(this.server.assertCanSetRequestHandler(Xd(GA)),this.server.assertCanSetRequestHandler(Xd(JA)),this.server.registerCapabilities({prompts:{listChanged:true}}),this.server.setRequestHandler(GA,()=>({prompts:Object.entries(this._registeredPrompts).filter(([,e])=>e.enabled).map(([e,r])=>({name:e,title:r.title,description:r.description,arguments:r.argsSchema?r4e(r.argsSchema):void 0}))})),this.server.setRequestHandler(JA,async(e,r)=>{let n=this._registeredPrompts[e.params.name];if(!n)throw new $e(Me.InvalidParams,`Prompt ${e.params.name} not found`);if(!n.enabled)throw new $e(Me.InvalidParams,`Prompt ${e.params.name} disabled`);if(n.argsSchema){let o=f0(n.argsSchema),a=await WT(o,e.params.arguments);if(!a.success){let c="error"in a?a.error:"Unknown error",l=KT(c);throw new $e(Me.InvalidParams,`Invalid arguments for prompt ${e.params.name}: ${l}`)}let i=a.data,s=n.callback;return await Promise.resolve(s(i,r))}else {let o=n.callback;return await Promise.resolve(o(r))}}),this._promptHandlersInitialized=true);}resource(e,r,...n){let o;typeof n[0]=="object"&&(o=n.shift());let a=n[0];if(typeof r=="string"){if(this._registeredResources[r])throw new Error(`Resource ${r} is already registered`);let i=this._createRegisteredResource(e,void 0,r,o,a);return this.setResourceRequestHandlers(),this.sendResourceListChanged(),i}else {if(this._registeredResourceTemplates[e])throw new Error(`Resource template ${e} is already registered`);let i=this._createRegisteredResourceTemplate(e,void 0,r,o,a);return this.setResourceRequestHandlers(),this.sendResourceListChanged(),i}}registerResource(e,r,n,o){if(typeof r=="string"){if(this._registeredResources[r])throw new Error(`Resource ${r} is already registered`);let a=this._createRegisteredResource(e,n.title,r,n,o);return this.setResourceRequestHandlers(),this.sendResourceListChanged(),a}else {if(this._registeredResourceTemplates[e])throw new Error(`Resource template ${e} is already registered`);let a=this._createRegisteredResourceTemplate(e,n.title,r,n,o);return this.setResourceRequestHandlers(),this.sendResourceListChanged(),a}}_createRegisteredResource(e,r,n,o,a){let i={name:e,title:r,metadata:o,readCallback:a,enabled:true,disable:()=>i.update({enabled:false}),enable:()=>i.update({enabled:true}),remove:()=>i.update({uri:null}),update:s=>{typeof s.uri<"u"&&s.uri!==n&&(delete this._registeredResources[n],s.uri&&(this._registeredResources[s.uri]=i)),typeof s.name<"u"&&(i.name=s.name),typeof s.title<"u"&&(i.title=s.title),typeof s.metadata<"u"&&(i.metadata=s.metadata),typeof s.callback<"u"&&(i.readCallback=s.callback),typeof s.enabled<"u"&&(i.enabled=s.enabled),this.sendResourceListChanged();}};return this._registeredResources[n]=i,i}_createRegisteredResourceTemplate(e,r,n,o,a){let i={resourceTemplate:n,title:r,metadata:o,readCallback:a,enabled:true,disable:()=>i.update({enabled:false}),enable:()=>i.update({enabled:true}),remove:()=>i.update({name:null}),update:l=>{typeof l.name<"u"&&l.name!==e&&(delete this._registeredResourceTemplates[e],l.name&&(this._registeredResourceTemplates[l.name]=i)),typeof l.title<"u"&&(i.title=l.title),typeof l.template<"u"&&(i.resourceTemplate=l.template),typeof l.metadata<"u"&&(i.metadata=l.metadata),typeof l.callback<"u"&&(i.readCallback=l.callback),typeof l.enabled<"u"&&(i.enabled=l.enabled),this.sendResourceListChanged();}};this._registeredResourceTemplates[e]=i;let s=n.uriTemplate.variableNames;return Array.isArray(s)&&s.some(l=>!!n.completeCallback(l))&&this.setCompletionRequestHandler(),i}_createRegisteredPrompt(e,r,n,o,a){let i={title:r,description:n,argsSchema:o===void 0?void 0:ip(o),callback:a,enabled:true,disable:()=>i.update({enabled:false}),enable:()=>i.update({enabled:true}),remove:()=>i.update({name:null}),update:s=>{typeof s.name<"u"&&s.name!==e&&(delete this._registeredPrompts[e],s.name&&(this._registeredPrompts[s.name]=i)),typeof s.title<"u"&&(i.title=s.title),typeof s.description<"u"&&(i.description=s.description),typeof s.argsSchema<"u"&&(i.argsSchema=ip(s.argsSchema)),typeof s.callback<"u"&&(i.callback=s.callback),typeof s.enabled<"u"&&(i.enabled=s.enabled),this.sendPromptListChanged();}};return this._registeredPrompts[e]=i,o&&Object.values(o).some(c=>{let l=c instanceof w0?c._def?.innerType:c;return S7(l)})&&this.setCompletionRequestHandler(),i}_createRegisteredTool(e,r,n,o,a,i,s,c,l){T7(e);let d={title:r,description:n,inputSchema:QW(o),outputSchema:QW(a),annotations:i,execution:s,_meta:c,handler:l,enabled:true,disable:()=>d.update({enabled:false}),enable:()=>d.update({enabled:true}),remove:()=>d.update({name:null}),update:u=>{typeof u.name<"u"&&u.name!==e&&(typeof u.name=="string"&&T7(u.name),delete this._registeredTools[e],u.name&&(this._registeredTools[u.name]=d)),typeof u.title<"u"&&(d.title=u.title),typeof u.description<"u"&&(d.description=u.description),typeof u.paramsSchema<"u"&&(d.inputSchema=ip(u.paramsSchema)),typeof u.outputSchema<"u"&&(d.outputSchema=ip(u.outputSchema)),typeof u.callback<"u"&&(d.handler=u.callback),typeof u.annotations<"u"&&(d.annotations=u.annotations),typeof u._meta<"u"&&(d._meta=u._meta),typeof u.enabled<"u"&&(d.enabled=u.enabled),this.sendToolListChanged();}};return this._registeredTools[e]=d,this.setToolRequestHandlers(),this.sendToolListChanged(),d}tool(e,...r){if(this._registeredTools[e])throw new Error(`Tool ${e} is already registered`);let n,o,a,i;if(typeof r[0]=="string"&&(n=r.shift()),r.length>1){let c=r[0];if(A7(c))o=r.shift(),r.length>1&&typeof r[0]=="object"&&r[0]!==null&&!A7(r[0])&&(i=r.shift());else if(typeof c=="object"&&c!==null){if(Object.values(c).some(l=>typeof l=="object"&&l!==null))throw new Error(`Tool ${e} expected a Zod schema or ToolAnnotations, but received an unrecognized object`);i=r.shift();}}let s=r[0];return this._createRegisteredTool(e,void 0,n,o,a,i,{taskSupport:"forbidden"},void 0,s)}registerTool(e,r,n){if(this._registeredTools[e])throw new Error(`Tool ${e} is already registered`);let{title:o,description:a,inputSchema:i,outputSchema:s,annotations:c,_meta:l}=r;return this._createRegisteredTool(e,o,a,i,s,c,{taskSupport:"forbidden"},l,n)}prompt(e,...r){if(this._registeredPrompts[e])throw new Error(`Prompt ${e} is already registered`);let n;typeof r[0]=="string"&&(n=r.shift());let o;r.length>1&&(o=r.shift());let a=r[0],i=this._createRegisteredPrompt(e,void 0,n,o,a);return this.setPromptRequestHandlers(),this.sendPromptListChanged(),i}registerPrompt(e,r,n){if(this._registeredPrompts[e])throw new Error(`Prompt ${e} is already registered`);let{title:o,description:a,argsSchema:i}=r,s=this._createRegisteredPrompt(e,o,a,i,n);return this.setPromptRequestHandlers(),this.sendPromptListChanged(),s}isConnected(){return this.server.transport!==void 0}async sendLoggingMessage(e,r){return this.server.sendLoggingMessage(e,r)}sendResourceListChanged(){this.isConnected()&&this.server.sendResourceListChanged();}sendToolListChanged(){this.isConnected()&&this.server.sendToolListChanged();}sendPromptListChanged(){this.isConnected()&&this.server.sendPromptListChanged();}};var t4e={type:"object",properties:{}};function tK(t){return t!==null&&typeof t=="object"&&"parse"in t&&typeof t.parse=="function"&&"safeParse"in t&&typeof t.safeParse=="function"}function rK(t){return "_def"in t||"_zod"in t||tK(t)}function A7(t){return typeof t!="object"||t===null||rK(t)?false:Object.keys(t).length===0?true:Object.values(t).some(tK)}function QW(t){if(t){if(A7(t))return ip(t);if(!rK(t))throw new Error("inputSchema must be a Zod schema or raw shape, received an unrecognized object");return t}}function r4e(t){let e=Md(t);return e?Object.entries(e).map(([r,n])=>{let o=Zj(n),a=qj(n);return {name:r,description:o,required:!a}}):[]}function Xd(t){let r=Md(t)?.method;if(!r)throw new Error("Schema is missing a method literal");let n=XT(r);if(typeof n=="string")return n;throw new Error("Schema method literal must be a string")}function eK(t){return {completion:{values:t.slice(0,100),total:t.length,hasMore:t.length>100}}}var D1={completion:{values:[],hasMore:false}};var zk=class{append(e){this._buffer=this._buffer?Buffer.concat([this._buffer,e]):e;}readMessage(){if(!this._buffer)return null;let e=this._buffer.indexOf(`
|
|
131
131
|
`);if(e===-1)return null;let r=this._buffer.toString("utf8",0,e).replace(/\r$/,"");return this._buffer=this._buffer.subarray(e+1),n4e(r)}clear(){this._buffer=void 0;}};function n4e(t){return bJ.parse(JSON.parse(t))}function nK(t){return JSON.stringify(t)+`
|
|
132
|
-
`}var Hk=class{constructor(e=Ch.stdin,r=Ch.stdout){this._stdin=e,this._stdout=r,this._readBuffer=new zk,this._started=false,this._ondata=n=>{this._readBuffer.append(n),this.processReadBuffer();},this._onerror=n=>{this.onerror?.(n);};}async start(){if(this._started)throw new Error("StdioServerTransport already started! If using Server class, note that connect() calls start() automatically.");this._started=true,this._stdin.on("data",this._ondata),this._stdin.on("error",this._onerror);}processReadBuffer(){for(;;)try{let e=this._readBuffer.readMessage();if(e===null)break;this.onmessage?.(e);}catch(e){this.onerror?.(e);}}async close(){this._stdin.off("data",this._ondata),this._stdin.off("error",this._onerror),this._stdin.listenerCount("data")===0&&this._stdin.pause(),this._readBuffer.clear(),this.onclose?.();}send(e){return new Promise(r=>{let n=nK(e);this._stdout.write(n)?r():this._stdout.once("drain",r);})}};Vo();Vo();var Yd=aK.homedir(),E7=aK.tmpdir(),{env:V0}=Ch,o4e=t=>{let e=zr.join(Yd,"Library");return {data:zr.join(e,"Application Support",t),config:zr.join(e,"Preferences",t),cache:zr.join(e,"Caches",t),log:zr.join(e,"Logs",t),temp:zr.join(E7,t)}},a4e=t=>{let e=V0.APPDATA||zr.join(Yd,"AppData","Roaming"),r=V0.LOCALAPPDATA||zr.join(Yd,"AppData","Local");return {data:zr.join(r,t,"Data"),config:zr.join(e,t,"Config"),cache:zr.join(r,t,"Cache"),log:zr.join(r,t,"Log"),temp:zr.join(E7,t)}},i4e=t=>{let e=zr.basename(Yd);return {data:zr.join(V0.XDG_DATA_HOME||zr.join(Yd,".local","share"),t),config:zr.join(V0.XDG_CONFIG_HOME||zr.join(Yd,".config"),t),cache:zr.join(V0.XDG_CACHE_HOME||zr.join(Yd,".cache"),t),log:zr.join(V0.XDG_STATE_HOME||zr.join(Yd,".local","state"),t),temp:zr.join(E7,e,t)}};function I7(t,{suffix:e="nodejs"}={}){if(typeof t!="string")throw new TypeError(`Expected a string, got ${typeof t}`);return e&&(t+=`-${e}`),Ch.platform==="darwin"?o4e(t):Ch.platform==="win32"?a4e(t):i4e(t)}var iK=I7("starkfi"),Vk="https://starkfi-production.up.railway.app",L1=iK.data,jk=iK.config;function sK(t,e){return `${e==="mainnet"?"https://voyager.online":"https://sepolia.voyager.online"}/tx/${t}`}$r();var cK=S.object({type:S.literal("privy"),network:S.enum(["mainnet","sepolia"]),address:S.string(),userId:S.string(),walletId:S.string(),publicKey:S.string(),token:S.string(),serverUrl:S.string()}),C7=join(L1,"session.json");function xl(){try{let t=readFileSync(C7,"utf-8"),e=cK.safeParse(JSON.parse(t));return e.success?e.data:null}catch{return null}}function lK(t){let e=C7;mkdirSync(dirname$1(e),{recursive:true}),cK.parse(t),writeFileSync(e,JSON.stringify(t,null,2),"utf-8");}function R7(){try{unlinkSync(C7);}catch{}}function p4e(t){try{let e=t.split(".");if(e.length!==3||!e[1])return !1;let r=JSON.parse(Buffer.from(e[1],"base64url").toString());return r.exp?Date.now()>=(r.exp-300)*1e3:!1}catch{return false}}function Fe(){let t=xl();if(!t)throw new he("AUTH_REQUIRED","Not authenticated. Run 'starkfi auth login <email>' first.");if(p4e(t.token))throw R7(),new he("SESSION_EXPIRED","Session expired. Please re-authenticate with 'starkfi auth login <email>'");return t}var U1="https://api.fibrous.finance/starknet";var O7="0x00f6f4CF62E3C010E0aC2451cC7807b5eEc19a40b0FaaCd00CCA3914280FDf5a",dK=2n,uK=15n;async function j0(){try{let t=await fetch(`${U1}/healthCheck`);if(!t.ok)return {ok:!1,message:`Fibrous API returned ${t.status}`};let e=await t.json();return {ok:e.staus===200,message:e.message}}catch(t){return {ok:false,message:`Failed to reach Fibrous API: ${t instanceof Error?t.message:String(t)}`}}}function ic(t){return {content:[{type:"text",text:t}]}}function we(t){return ic(JSON.stringify(t,null,2))}function Zr(t,e){return we({success:t.success,mode:"SIMULATION (no TX sent)",...e,estimatedFee:t.estimatedFee,estimatedFeeUsd:t.estimatedFeeUsd,callCount:t.callCount,...t.revertReason?{revertReason:t.revertReason}:{}})}nr();var uh=join(jk,"config.json"),vn=class t{static instance;config;lastMtime=0;constructor(){this.config=this.load(),this.updateMtime();}static getInstance(){return t.instance||(t.instance=new t),t.instance}get(e){return this.refreshIfChanged(),this.config[e]}set(e,r){this.config[e]=r,this.save();}delete(e){delete this.config[e],this.save();}clear(){this.config={},this.save();}getAll(){return this.refreshIfChanged(),{...this.config}}refreshIfChanged(){try{if(!existsSync(uh))return;let e=statSync(uh).mtimeMs;e>this.lastMtime&&(this.config=this.load(),this.lastMtime=e);}catch{}}updateMtime(){try{existsSync(uh)&&(this.lastMtime=statSync(uh).mtimeMs);}catch{}}load(){if(!existsSync(uh))return {};try{let e=readFileSync(uh,"utf-8");return JSON.parse(e)}catch{return {}}}save(){existsSync(jk)||mkdirSync(jk,{recursive:true}),writeFileSync(uh,JSON.stringify(this.config,null,2),"utf-8"),this.updateMtime();}};function sHe(t){return t==="sepolia"?ko.SEPOLIA:ko.MAINNET}function bt(t){return vn.getInstance().get("network")??t.network}function ge(t){return sHe(bt(t))}async function Vme(){let t=xl(),e=await j0();return t?we({authenticated:true,type:t.type,network:bt(t),address:t.address,fibrous:e}):we({authenticated:false,fibrous:e,message:"Not authenticated. Use 'starkfi auth login'."})}nr();O_();var Zme="https://starknet.paymaster.avnu.fi",qme="https://sepolia.paymaster.avnu.fi",Wme="STRK",l5={ETH:"0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7",STRK:"0x04718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d",USDC:"0x033068f6539f8e6e6b131e6b2b814e6c34a5224bc66947c47dab9dfee93b35fb",USDT:"0x068f5c6a61780768455de69077e07e89787839bf8166decfbf92b645209c0fb8",DAI:"0x05574eb6b8789a91466f902c380d978e472db68170ff82a5b650b95a58ddf4ad"},Rf=Object.keys(l5),mF=process.env.AVNU_PAYMASTER_API_KEY;function Of(t,e){if(t)return {feeMode:"sponsored",gasTokenAddress:void 0,needsPaymaster:true};let n=l5[(e??Wme).toUpperCase()];return n?{feeMode:"sponsored",gasTokenAddress:n,needsPaymaster:true}:{feeMode:"sponsored",gasTokenAddress:l5.STRK,needsPaymaster:true}}function fHe(t,e){let r=t.getAccount(),n=r,o=n.executePaymasterTransaction;if(typeof o!="function"){console.warn("[StarkFi] Cannot patch gasless mode \u2014 executePaymasterTransaction not found on account. Gas will use default sponsored mode. Consider updating StarkZap SDK.");return}let a=o.bind(r);n.executePaymasterTransaction=async function(i,s,...c){let l={...s,feeMode:{mode:"default",gasToken:e}};return a(i,l,...c)};}function ph(t="mainnet",e,r=false,n,o){let a={network:t};if(e&&(a.rpcUrl=e),r){let i=t==="sepolia"?qme:Zme;a.paymaster={nodeUrl:n??i,...mF?{apiKey:mF}:{},...o?{headers:o}:{}};}return new I_(a)}async function hF(t,e){let r=vn.getInstance(),n=r.get("gasfreeMode")===true,o=r.get("gasToken"),{feeMode:a,gasTokenAddress:i}=Of(n,o),{wallet:s}=await t.onboard({strategy:Ane.Privy,privy:{resolve:async()=>({walletId:e.walletId,publicKey:e.publicKey,serverUrl:e.serverUrl,headers:{Authorization:`Bearer ${e.token}`}})},accountPreset:"argentXV050",feeMode:a,deploy:"never"});return !n&&i&&fHe(s,i),s.lending().registerProvider(new ud,true),s.registerSwapProvider(new Xb),s.registerSwapProvider(new V6),s.setDefaultSwapProvider("avnu"),s.dca().registerProvider(new Ef),s.dca().registerProvider(new F3),s.dca().setDefaultProvider("avnu"),s}async function je(t){let e=vn.getInstance(),r=e.get("rpcUrl"),n=e.get("gasfreeMode")===true,o=e.get("gasToken"),{gasTokenAddress:a,needsPaymaster:i}=Of(n,o),s=bt(t),c=t.type==="privy"&&t.serverUrl?t.serverUrl.replace("/sign/hash","/paymaster"):void 0,l=c&&t.token?{Authorization:`Bearer ${t.token}`}:void 0,d=ph(s,r,i,c,l),u=await hF(d,t);return Jme(u,ge(t)),{sdk:d,wallet:u,gasTokenAddress:a}}wr();async function d5(t,e,r){let n=[],o=0,a=async()=>{for(;o<t.length;){let s=o++,c=t[s];if(!c)continue;let l=await r(c);l!==void 0&&n.push(l);}},i=Array.from({length:Math.min(e,t.length)},()=>a());return await Promise.all(i),n}var pHe=10;async function oy(t,e){let r=uF(e);return d5(r,pHe,async n=>{try{let o=await t.balanceOf(n);if(o.isPositive())return {symbol:n.symbol,name:n.name,balance:o.toUnit()}}catch{}})}wr();nr();nr();wr();O_();$r();var Kme="STRK";async function Ye(t,e){let n=(await t.calls()).length;if(n===0)throw new he("SIMULATION_FAILED","No calls to simulate \u2014 builder is empty.");let o=await t.preflight();if(!o.ok)return {success:false,estimatedFee:"N/A",estimatedFeeUsd:"N/A",callCount:n,revertReason:o.reason};try{let a=await t.estimateFee(),i=BigInt(a.overall_fee),s=re(Kme,e),l=Q.fromRaw(i,s).toUnit(),d="unknown";try{let u=await ny(s,e);u>0&&(d=`$${(parseFloat(l)*u).toFixed(4)}`);}catch{}return {success:!0,estimatedFee:`${l} ${Kme}`,estimatedFeeUsd:d,callCount:n}}catch(a){return {success:true,estimatedFee:"estimation failed",estimatedFeeUsd:"unknown",callCount:n,revertReason:a instanceof Error?`Fee estimation failed: ${a.message}`:"Fee estimation failed"}}}async function Dt(t){let e=Fe(),{sdk:r,wallet:n}=await je(e);return await n.ensureReady({deploy:"if_needed"}),t({session:e,sdk:r,wallet:n})}async function _n(t){let e=Fe(),{sdk:r,wallet:n}=await je(e);return t({session:e,sdk:r,wallet:n})}Pf();async function Xme(t){return _n(async({session:e,wallet:r})=>{let n=ge(e);if(t.token){let a=re(t.token,n),i=await r.balanceOf(a);return we({symbol:a.symbol,name:a.name,balance:i.toUnit()})}let o=await oy(r,n);return we({network:bt(e),address:e.address,balances:o})})}async function Yme(){return _n(async({session:t,wallet:e})=>{let r=await e.isDeployed();if(!r){let n=vn.getInstance(),o=n.get("gasfreeMode")===true,a=n.get("gasToken"),{feeMode:i}=Of(o,a);await e.ensureReady({deploy:"if_needed",feeMode:i});}return we({alreadyDeployed:r,success:true,address:t.address,network:bt(t),message:r?"Account is already deployed. No action needed.":"Account deployed successfully. You can now send, swap, and stake."})})}async function Qme(t){return Dt(async({session:e,wallet:r})=>{let n=ge(e),o=re(t.token,n),a=Q.parse(t.amount,o),i=await r.balanceOf(o);if(i.lt(a))return we({success:false,error:`Insufficient balance. You have: ${i.toFormatted()}, attempting to send: ${a.toFormatted()}`});let s=r.tx().transfer(o,[{to:K(t.recipient),amount:a}]);if(t.simulate){let d=await Ye(s,n);return Zr(d,{amount:`${t.amount} ${t.token.toUpperCase()}`,to:t.recipient})}let{hash:c,explorerUrl:l}=await po(s);return we({success:true,txHash:c,explorerUrl:l,amount:`${t.amount} ${t.token.toUpperCase()}`,to:t.recipient})})}async function ehe(t){let e=Fe(),n=vn.getInstance().get("rpcUrl"),i=await ph(bt(e),n).getProvider().getTransactionReceipt(t.hash),s="actual_fee"in i?i.actual_fee:void 0,c=s?b2(s):void 0,l="block_number"in i?i.block_number:void 0;return we({hash:t.hash,status:i.statusReceipt,actualFee:c,blockNumber:l})}nr();wr();Pf();$r();var mHe=8e3;function hHe(t,e,r){let n,o=new Promise((a,i)=>{n=setTimeout(()=>i(new Error(r)),e);});return Promise.race([t,o]).finally(()=>clearTimeout(n))}function gHe(t){return t.status==="fulfilled"}async function ra(t,e){if(t.length===0)throw new he("ALL_PROVIDERS_FAILED","No swap providers configured");let n=(await Promise.allSettled(t.map(o=>hHe(o.getQuote(e),mHe,`${o.id} timed out`)))).filter(gHe).map(o=>({...o.value,isBest:false})).sort((o,a)=>Number(a.amountOutRaw-o.amountOutRaw));if(n.length===0)throw new he("ALL_PROVIDERS_FAILED","All swap providers failed or timed out");return n[0].isBest=true,n}function na(t){let e=t.find(r=>r.isBest);if(!e)throw new he("ALL_PROVIDERS_FAILED","All swap providers failed or returned no quotes");return e}function di(t,e){let r=t.find(n=>n.id===e);if(!r)throw new he("PROVIDER_UNAVAILABLE",`Provider "${e}" not found`);return r}function P_(t,e){if(e<=0n||t<=e)return null;let r=Number(t-e)/Number(e)*100;return r>.01?`+${r.toFixed(2)}%`:null}$r();nr();$r();$r();async function N_(t,e){let{maxRetries:r=2,baseDelayMs:n=500,retryOnCodes:o}=e??{},a;for(let i=0;i<=r;i++)try{return await t()}catch(s){if(a=s,s instanceof he&&o?.length&&!o.includes(s.code))throw s;if(i<r){let c=n*2**i;await new Promise(l=>setTimeout(l,c));}}throw a}function yHe(t){return !t.route.some(e=>e.swaps.flat().length>1)}function the(t,e){let r=yHe(e)?dK:uK;return t-t*r/10000n}async function rhe(t,e,r){let n=new URLSearchParams({amount:r,tokenInAddress:t.address,tokenOutAddress:e.address}),o=await N_(()=>fetch(`${U1}/route?${n.toString()}`),{retryOnCodes:["NETWORK_ERROR"]});if(!o.ok)throw new he("NO_ROUTE_FOUND",`Fibrous route API error: ${o.status}`);let a=await o.json();if(!a.success)throw new he("NO_ROUTE_FOUND",a.errorMessage||"No route found for this swap");return a}async function nhe(t,e,r,n=1,o){let a=new URLSearchParams({amount:r,tokenInAddress:t.address,tokenOutAddress:e.address,slippage:n.toString()});o&&a.append("destination",o);let i=await N_(()=>fetch(`${U1}/calldata?${a.toString()}`),{retryOnCodes:["NETWORK_ERROR"]});if(!i.ok){let c=await i.text().catch(()=>"");throw new he("SWAP_FAILED",`Fibrous calldata API error: ${i.status} ${c}`)}let s=await i.json();if(!s.route?.success)throw new he("NO_ROUTE_FOUND","Failed to generate calldata: no valid route");return s}var u5=class{id="fibrous";name="Fibrous";async getQuote(e){let r=await rhe(e.tokenIn,e.tokenOut,e.amountInRaw.toString()),n=the(BigInt(r.outputAmount),r);return {provider:this.id,amountInRaw:e.amountInRaw,amountOutRaw:n,amountOutFormatted:Q.fromRaw(n,e.tokenOut).toUnit(),estimatedGasUsd:r.estimatedGasUsedInUsd??null,routeSteps:r.route?.length??1,isBest:false}}async buildSwapTx(e,r){let n=Q.fromRaw(r.amountInRaw,r.tokenIn),o=await nhe(r.tokenIn,r.tokenOut,r.amountInRaw.toString(),r.slippage,r.walletAddress);e.approve(r.tokenIn,K(O7),n).add({contractAddress:O7,entrypoint:"swap",calldata:o.calldata});}async isAvailable(){return (await j0()).ok}};nr();var ay=class{constructor(e){this.wallet=e;}wallet;async getQuote(e){let r=await this.wallet.getQuote({tokenIn:e.tokenIn,tokenOut:e.tokenOut,amountIn:Q.fromRaw(e.amountInRaw,e.tokenIn),...e.slippageBps!=null?{slippageBps:e.slippageBps}:{},provider:this.id}),n=r.amountOutBase;return {provider:this.id,amountInRaw:r.amountInBase,amountOutRaw:n,amountOutFormatted:Q.fromRaw(n,e.tokenOut).toUnit(),estimatedGasUsd:null,routeSteps:r.routeCallCount??1,isBest:false}}async buildSwapTx(e,r){e.swap({tokenIn:r.tokenIn,tokenOut:r.tokenOut,amountIn:Q.fromRaw(r.amountInRaw,r.tokenIn),slippageBps:qc(r.slippage),provider:this.id});}async isAvailable(){try{return this.wallet.listSwapProviders().includes(this.id)}catch{return false}}};function qc(t){return BigInt(Math.round(t*100))}var f5=class extends ay{id="avnu";name="AVNU";constructor(e){super(e);}};var p5=class extends ay{id="ekubo";name="Ekubo";constructor(e){super(e);}};var ohe="fibrous";function oa(t,e=ohe){let r=[new u5,new f5(t),new p5(t)];if(e==="auto")return r;let n=r.filter(o=>o.id===e);if(n.length===0)throw new he("PROVIDER_UNAVAILABLE",`Unknown swap provider: "${e}". Available: ${r.map(o=>o.id).join(", ")}`);return n}async function ahe(t){return Dt(async({session:e,wallet:r})=>{let n=ge(e),o=re(t.from_token,n),a=re(t.to_token,n),i=Q.parse(t.amount,o).toBase(),s=t.provider,c=oa(r,s),l=await ra(c,{tokenIn:o,tokenOut:a,amountInRaw:i}),d=na(l),u=l.length>1?P_(l[0].amountOutRaw,l[l.length-1].amountOutRaw):null;return we({success:true,bestProvider:d.provider,amountIn:`${t.amount} ${o.symbol}`,expectedAmountOut:`~${d.amountOutFormatted} ${a.symbol}`,...u?{savings:u}:{},quotes:l.map(p=>({provider:p.provider,amountOut:p.amountOutFormatted,isBest:p.isBest})),message:"Quote generated. Use swap_tokens to execute."})})}async function ihe(t){return Dt(async({session:e,wallet:r})=>{let n=ge(e),o=re(t.from_token,n),a=re(t.to_token,n),i=Q.parse(t.amount,o).toBase(),s=t.slippage??1,c=t.provider,l=oa(r,c),d=await ra(l,{tokenIn:o,tokenOut:a,amountInRaw:i,slippageBps:qc(s)}),u=na(d),p=di(l,u.provider),m=r.tx();if(await p.buildSwapTx(m,{tokenIn:o,tokenOut:a,amountInRaw:i,walletAddress:e.address,slippage:s}),t.simulate){let x=await Ye(m,n);return Zr(x,{amountIn:`${t.amount} ${o.symbol}`,expectedAmountOut:`~${u.amountOutFormatted} ${a.symbol}`,provider:u.provider})}let{hash:g,explorerUrl:b}=await po(m);return we({success:true,txHash:g,explorerUrl:b,amountIn:`${t.amount} ${o.symbol}`,amountOut:`~${u.amountOutFormatted} ${a.symbol}`,provider:u.provider,slippage:`${s}%`})})}nr();wr();$r();function sy(t,e){let r=e.toUpperCase(),n=t.find(o=>o.tokenSymbol.toUpperCase()===r);if(!n){let o=t.map(a=>a.tokenSymbol).join(", ");throw new he("POOL_NOT_FOUND",`No ${e} pool found for this validator. Available: ${o}`)}return n}async function md(t,e,r){let n=await t.getStakerPools(K(e));return Promise.all(n.map(async o=>{let a=r?await r.getPoolCommission(o.poolContract):void 0;return {poolContract:o.poolContract.toString(),tokenSymbol:o.token.symbol,amount:o.amount.toFormatted(true),commission:a}}))}async function m5(t,e,r,n="STRK",o){let a=re(n,o),i=Q.parse(r,a),s=await t.stake(K(e),i);return {hash:s.hash,explorerUrl:s.explorerUrl}}async function h5(t,e){let r=await t.getPoolPosition(K(e));if(!r||r.rewards.isZero())throw new he("STAKING_FAILED","No rewards to claim for this pool.");let n=await t.claimPoolRewards(K(e));return {hash:n.hash,explorerUrl:n.explorerUrl}}async function g5(t,e){let r=await t.getPoolPosition(K(e));if(!r||r.rewards.isZero())throw new he("STAKING_FAILED","No rewards to compound for this pool.");let n=r.rewards.toFormatted(true),o=await t.tx().claimPoolRewards(K(e)).stake(K(e),r.rewards).send();return await o.wait(),{hash:o.hash,explorerUrl:o.explorerUrl,compounded:n}}async function b5(t,e,r,n="STRK",o){let a=re(n,o),i=Q.parse(r,a),s=await t.exitPoolIntent(K(e),i);return {hash:s.hash,explorerUrl:s.explorerUrl}}async function y5(t,e){let r=await t.getPoolPosition(K(e));if(!r)throw new he("STAKING_FAILED","Not a member of this pool.");if(r.unpooling.isZero())throw new he("EXIT_NOT_READY","No exit intent declared. Call 'unstake intent' first.");if(r.unpoolTime&&new Date<r.unpoolTime)throw new he("EXIT_NOT_READY",`Cooldown period is still active. Please wait until ${r.unpoolTime.toLocaleString()}`);let n=await t.exitPool(K(e));return {hash:n.hash,explorerUrl:n.explorerUrl}}async function che(t,e){let r=await t.getPoolPosition(K(e));return r?{staked:r.staked.toFormatted(true),rewards:r.rewards.toFormatted(true),total:r.total.toFormatted(true),unpooling:r.unpooling.toFormatted(true),unpoolTime:r.unpoolTime??void 0,commissionPercent:r.commissionPercent}:null}async function cy(t,e,r,n,o){let{getValidators:a,findValidator:i}=await Promise.resolve().then(()=>($_(),she)),s=a(r);if(o){let m=i(o,r);if(m)s=[m];else throw new he("VALIDATOR_NOT_FOUND",`Validator '${o}' not found`)}let l=(await Promise.all(s.map(async m=>{try{return (await t.getStakerPools(m.stakerAddress)).map(b=>({validator:m.name,pool:b}))}catch{return []}}))).flat(),p=(await Promise.all(l.map(async({validator:m,pool:g})=>{let b;try{b=await e.getPoolPosition(g.poolContract);}catch{return null}return b?{validator:m,pool:g.poolContract.toString(),tokenSymbol:g.token.symbol,staked:b.staked,rewards:b.rewards,total:b.total,unpooling:b.unpooling,unpoolTime:b.unpoolTime??null,commissionPercent:b.commissionPercent}:null}))).filter(m=>m!==null).map(m=>({validator:m.validator,pool:m.pool,token:m.tokenSymbol,staked:m.staked.toFormatted(true),rewards:m.rewards.toFormatted(true),total:m.total.toFormatted(true),unpooling:m.unpooling.toFormatted(true),cooldownEndsAt:m.unpoolTime?m.unpoolTime.toISOString():null,commission:`${m.commissionPercent}%`}));return {network:r,address:n,positions:p}}$_();async function dhe(t){return Dt(async({session:e,wallet:r})=>{let n=(t.token??"STRK").toUpperCase(),o=await m5(r,t.pool,t.amount,n,ge(e));return we({success:true,txHash:o.hash,explorerUrl:o.explorerUrl,amount:`${t.amount} ${n}`,pool:t.pool})})}async function uhe(t){return Dt(async({session:e,wallet:r})=>{if(t.action==="intent"){if(!t.amount)return ic("Amount is required for exit intent.");let o=(t.token??"STRK").toUpperCase(),a=await b5(r,t.pool,t.amount,o,ge(e));return we({success:true,action:"exit_intent",txHash:a.hash,explorerUrl:a.explorerUrl,message:"Exit intent declared. Wait for cooldown period, then call with action='exit'."})}let n=await y5(r,t.pool);return we({success:true,action:"exit_complete",txHash:n.hash,explorerUrl:n.explorerUrl,message:"Tokens withdrawn from pool."})})}async function fhe(t){return _n(async({wallet:e})=>{let r=await che(e,t.pool);return r?we({isMember:true,pool:t.pool,staked:r.staked,rewards:r.rewards,total:r.total,unpooling:r.unpooling,cooldownEndsAt:r.unpoolTime?r.unpoolTime.toISOString():null,commissionPercent:r.commissionPercent}):we({isMember:false,pool:t.pool,message:"Not a member of this pool."})})}async function phe(t){return _n(async({session:e,sdk:r,wallet:n})=>{let o=Wc(t.validator,bt(e)),a=o?o.stakerAddress.toString():t.validator,i=await md(r,a,n);return we({validator:o?o.name:t.validator,stakerAddress:a,pools:i})})}async function mhe(){let t=Fe(),e=bt(t),r=iy(e);return we({network:e,count:r.length,validators:r.map(n=>({name:n.name,stakerAddress:n.stakerAddress.toString()}))})}async function hhe(t){return Dt(async({wallet:e})=>{let r=await h5(e,t.pool);return we({success:true,txHash:r.hash,explorerUrl:r.explorerUrl})})}async function ghe(t){return Dt(async({wallet:e})=>{let r=await g5(e,t.pool);return we({success:true,txHash:r.hash,explorerUrl:r.explorerUrl,compounded:r.compounded})})}async function bhe({validator:t}={}){return _n(async({session:e,sdk:r,wallet:n})=>{let o=await cy(r,n,bt(e),e.address,t);return we(o)})}async function yhe(t){let e=vn.getInstance();switch(t.action){case "set-rpc":return t.value?(e.set("rpcUrl",t.value),we({success:true,rpcUrl:t.value})):ic("RPC URL value is required.");case "get-rpc":{let r=e.get("rpcUrl");return we({rpcUrl:r||"default (Cartridge RPC)"})}case "set-network":return !t.value||!["mainnet","sepolia"].includes(t.value)?ic("Network must be 'mainnet' or 'sepolia'."):(e.set("network",t.value),we({success:true,network:t.value}));case "set-gasfree":{if(!t.value||!["on","off"].includes(t.value))return ic("Gasfree mode must be 'on' or 'off'.");let r=t.value==="on";return e.set("gasfreeMode",r),r&&e.delete("gasToken"),we({success:true,gasfreeMode:r,note:r?"Developer sponsors gas via Paymaster (requires API key + credits)":"Gasfree disabled \u2014 using gasless mode (default: STRK)"})}case "set-gas-token":{if(!t.value)return ic("Token symbol or 'reset' is required.");if(["off","reset","default"].includes(t.value.toLowerCase()))return e.delete("gasToken"),we({success:true,gasToken:"STRK",note:"Gas token reset to default: STRK"});let r=t.value.toUpperCase();return Rf.includes(r)?(e.delete("gasfreeMode"),e.set("gasToken",r),we({success:true,gasToken:r,note:`Gas paid in ${r} via Paymaster`})):ic(`Unsupported token '${t.value}'. Supported: ${Rf.join(", ")}`)}case "list":{let r=e.getAll(),n=r.gasfreeMode===true,o=r.gasToken,a="gasless (pays STRK via Paymaster)";return n?a="gasfree (developer-sponsored via Paymaster)":o&&(a=`gasless (pays ${o} via Paymaster)`),we({...r,feeMode:a})}case "reset":return e.clear(),we({success:true,note:"All settings reset to defaults."});default:return ic(`Unknown action: ${t.action}`)}}nr();dy();hh();wr();$r();Pf();async function The(t){return _n(async({wallet:e})=>{let r=await mh(e);if(t.name){let n=t.name.toLowerCase();r=r.filter(o=>o.name?.toLowerCase().includes(n));}return we({success:true,pools:r.map(n=>({name:n.name,poolContract:n.address}))})})}async function Ahe(t){return _n(async({session:e,wallet:r})=>{let n=ge(e),o=await Ur(r,t.pool),a=await Nf(r,o.address,t.collateral_token,n),i=null;return t.borrow_token&&(i=await Ws(r,o.address,t.collateral_token,t.borrow_token,n)),!i&&(!a||a==="0.0")?we({success:true,position:null,suppliedYield:null,message:"No active position or supply found for this pool and token."}):we({success:true,suppliedYield:a&&a!=="0.0"?`${a} ${t.collateral_token.toUpperCase()}`:null,position:i})})}async function khe(t){return Dt(async({session:e,wallet:r})=>{let n=ge(e),o=await Ur(r,t.pool),a=re(t.token,n),i=r.tx().lendDeposit({token:a,amount:Q.parse(t.amount,a),poolAddress:o.address?K(o.address):void 0});if(t.simulate){let l=await Ye(i,n);return Zr(l,{action:"supply",amount:`${t.amount} ${a.symbol}`,pool:o.name??o.address})}let{hash:s,explorerUrl:c}=await po(i);return we({success:true,action:"supply",amount:`${t.amount} ${a.symbol}`,pool:o.address,poolName:o.name,txHash:s,explorerUrl:c})})}async function Ehe(t){return Dt(async({session:e,wallet:r})=>{let n=ge(e),o=await Ur(r,t.pool),a=re(t.token,n),i=r.tx().lendWithdraw({token:a,amount:Q.parse(t.amount,a),poolAddress:o.address?K(o.address):void 0});if(t.simulate){let l=await Ye(i,n);return Zr(l,{action:"withdraw",amount:`${t.amount} ${a.symbol}`,pool:o.name??o.address})}let{hash:s,explorerUrl:c}=await po(i);return we({success:true,action:"withdraw",amount:`${t.amount} ${a.symbol}`,pool:o.address,poolName:o.name,txHash:s,explorerUrl:c})})}async function Ihe(t){return Dt(async({session:e,wallet:r})=>{let n=ge(e),o=await Ur(r,t.pool),a=re(t.collateral_token,n),i=re(t.borrow_token,n);if(t.use_supplied){let d=await Nf(r,o.address,t.collateral_token,n);if(!d||parseFloat(d)<parseFloat(t.collateral_amount))throw new he("INSUFFICIENT_BALANCE",`Insufficient supplied balance. You have ${d||"0"} ${t.collateral_token} supplied, but want to use ${t.collateral_amount} as collateral.`)}let s=r.tx().lendBorrow({collateralToken:a,debtToken:i,amount:Q.parse(t.borrow_amount,i),collateralAmount:Q.parse(t.collateral_amount,a),poolAddress:o.address?K(o.address):void 0,useEarnPosition:t.use_supplied||void 0});if(t.simulate){let d=await Ye(s,n);return Zr(d,{action:"borrow",collateral:`${t.collateral_amount} ${a.symbol}`,borrowed:`${t.borrow_amount} ${i.symbol}`,pool:o.name??o.address})}let{hash:c,explorerUrl:l}=await po(s);return we({success:true,action:"borrow",collateral:`${t.collateral_amount} ${a.symbol}`,borrowed:`${t.borrow_amount} ${i.symbol}`,pool:o.address,poolName:o.name,txHash:c,explorerUrl:l})})}async function Che(t){return Dt(async({session:e,wallet:r})=>{let n=ge(e),o=await Ur(r,t.pool),a=re(t.collateral_token,n),i=re(t.token,n),s=r.tx().lendRepay({collateralToken:a,debtToken:i,amount:Q.parse(t.amount,i),poolAddress:o.address?K(o.address):void 0});if(t.simulate){let d=await Ye(s,n);return Zr(d,{action:"repay",repaid:`${t.amount} ${i.symbol}`,pool:o.name??o.address})}let{hash:c,explorerUrl:l}=await po(s);return we({success:true,action:"repay",repaid:`${t.amount} ${i.symbol}`,pool:o.address,poolName:o.name,txHash:c,explorerUrl:l})})}async function Rhe(t){return Dt(async({session:e,wallet:r})=>{let n=ge(e),o=await Ur(r,t.pool),a=await Ws(r,o.address,t.collateral_token,t.debt_token,n);if(!a)throw new he("LENDING_FAILED","No active position found to close.");let i=re(t.collateral_token,n),s=re(t.debt_token,n),c=r.tx().lendRepay({collateralToken:i,debtToken:s,amount:Q.parse(a.debtAmount,s),withdrawCollateral:true,poolAddress:o.address?K(o.address):void 0});if(t.simulate){let u=await Ye(c,n);return Zr(u,{action:"close_position",pool:o.name??o.address})}let{hash:l,explorerUrl:d}=await po(c);return we({success:true,action:"close_position",pool:o.address,poolName:o.name,txHash:l,explorerUrl:d})})}async function Ohe(t){return _n(async({session:e,wallet:r})=>{let n=ge(e),o=await Ur(r,t.pool),a=re(t.collateral_token,n),i=re(t.debt_token,n),s=K(o.address),c=t.action==="deposit"||t.action==="withdraw"?a:i,l=t.action==="repay"?{action:"repay",request:{collateralToken:a,debtToken:i,amount:Q.parse(t.amount,c),poolAddress:s}}:t.action==="deposit"?{action:"deposit",request:{token:a,amount:Q.parse(t.amount,c),poolAddress:s}}:t.action==="withdraw"?{action:"withdraw",request:{token:a,amount:Q.parse(t.amount,c),poolAddress:s}}:{action:"borrow",request:{collateralToken:a,debtToken:i,amount:Q.parse(t.amount,c),poolAddress:s}},d=await r.lending().quoteHealth({action:l,health:{collateralToken:a,debtToken:i,poolAddress:s}}),u=d.current,p=d.projected,m=u&&Number(u.debtValue)>0?Number(u.collateralValue)/Number(u.debtValue):null,g=p&&Number(p.debtValue)>0?Number(p.collateralValue)/Number(p.debtValue):null;return we({success:true,pool:o.address,poolName:o.name,action:t.action,amount:`${t.amount} ${c.symbol}`,currentHealthFactor:m?.toFixed(4)??"\u221E",projectedHealthFactor:g?.toFixed(4)??"\u221E",riskChange:m&&g?g>m?"IMPROVING":g<m?"DECLINING":"STABLE":"UNKNOWN"})})}nr();wr();$r();var xHe="P1D";async function _5(t,e,r){let n=re(e.sellToken,r),o=re(e.buyToken,r),a=Q.parse(e.sellAmount,n),i=Q.parse(e.amountPerCycle,n),s=await t.dca().create({sellToken:n,buyToken:o,sellAmount:a,sellAmountPerCycle:i,frequency:e.frequency??xHe,provider:e.provider});return await s.wait(),{hash:s.hash,explorerUrl:s.explorerUrl}}async function S5(t,e){if(!e.orderId&&!e.orderAddress)throw new he("DCA_FAILED","Provide either orderId or orderAddress to cancel a DCA order.");let r=await t.dca().cancel({orderId:e.orderId,orderAddress:e.orderAddress,provider:e.provider});return await r.wait(),{hash:r.hash,explorerUrl:r.explorerUrl}}async function uy(t,e){return t.dca().getOrders({status:e?.status,provider:e?.provider,page:e?.page,size:e?.size})}async function T5(t,e,r){let n=re(e.sellToken,r),o=re(e.buyToken,r),a=Q.parse(e.amountPerCycle,n),i={sellToken:n,buyToken:o,sellAmountPerCycle:a,swapProvider:e.provider,chainId:r};return t.dca().previewCycle(i)}wr();nr();async function Nhe(t){return Dt(async({session:e,wallet:r})=>{let n=ge(e);if(t.simulate){let a=re(t.sell_token,n),i=re(t.buy_token,n),s=Q.parse(t.sell_amount,a),c=Q.parse(t.amount_per_cycle,a),l=r.tx().dcaCreate({sellToken:a,buyToken:i,sellAmount:s,sellAmountPerCycle:c,frequency:t.frequency??"P1D",provider:t.provider}),d=await Ye(l,n);return Zr(d,{sellAmount:t.sell_amount,sellToken:t.sell_token,buyToken:t.buy_token,amountPerCycle:t.amount_per_cycle,frequency:t.frequency??"P1D"})}let o=await _5(r,{sellToken:t.sell_token,buyToken:t.buy_token,sellAmount:t.sell_amount,amountPerCycle:t.amount_per_cycle,frequency:t.frequency,provider:t.provider},n);return we({success:true,txHash:o.hash,explorerUrl:o.explorerUrl,sellAmount:t.sell_amount,sellToken:t.sell_token,buyToken:t.buy_token,amountPerCycle:t.amount_per_cycle,frequency:t.frequency??"P1D"})})}async function $he(t){return _n(async({wallet:e})=>{let r=await uy(e,{status:t.status,provider:t.provider,page:t.page,size:t.size});return we({orders:r.content.map(n=>({id:n.id,orderAddress:n.orderAddress.toString(),provider:n.providerId,status:n.status,sellToken:n.sellTokenAddress.toString(),buyToken:n.buyTokenAddress.toString(),sellAmount:n.sellAmountBase.toString(),amountSold:n.amountSoldBase.toString(),amountBought:n.amountBoughtBase.toString(),frequency:n.frequency,iterations:n.iterations,executedTrades:n.executedTradesCount,startDate:n.startDate.toISOString(),endDate:n.endDate.toISOString()})),totalElements:r.totalElements,pageNumber:r.pageNumber,totalPages:r.totalPages})})}async function Dhe(t){return Dt(async({wallet:e})=>{let r=await S5(e,{orderId:t.order_id,orderAddress:t.order_address,provider:t.provider});return we({success:true,txHash:r.hash,explorerUrl:r.explorerUrl})})}async function Lhe(t){return _n(async({session:e,wallet:r})=>{let n=ge(e),o=await T5(r,{sellToken:t.sell_token,buyToken:t.buy_token,amountPerCycle:t.sell_amount_per_cycle,provider:t.provider},n);return we({sellToken:t.sell_token,buyToken:t.buy_token,sellAmountPerCycle:t.sell_amount_per_cycle,expectedOutputBase:o.amountOutBase.toString(),provider:o.provider,priceImpactBps:o.priceImpactBps?.toString()??null})})}O_();wr();dy();hh();nr();wr();var bF="USDC";function $o(t,e){let r={privateKey:e.privateKey,contractAddress:K(e.contractAddress),provider:t.getProvider()};return new C_(r)}async function fy(t){let e=await t.getState();return {balance:e.balance.toString(),pending:e.pending.toString(),nonce:e.nonce.toString(),address:t.address}}async function A5(t,e,r,n){let o=re(r.token??bF,n),a=Q.parse(r.amount,o),i=await t.tx().confidentialFund(e,{amount:a,sender:t.address}).send();return await i.wait(),{hash:i.hash,explorerUrl:i.explorerUrl}}async function k5(t,e,r,n){let o=re(r.token??bF,n),a=Q.parse(r.amount,o),i=await t.tx().confidentialTransfer(e,{amount:a,to:{x:r.recipientX,y:r.recipientY},sender:t.address}).send();return await i.wait(),{hash:i.hash,explorerUrl:i.explorerUrl}}async function E5(t,e,r,n){let o=re(r.token??bF,n),a=Q.parse(r.amount,o),i=await t.tx().confidentialWithdraw(e,{amount:a,to:K(r.to??t.address.toString()),sender:t.address}).send();return await i.wait(),{hash:i.hash,explorerUrl:i.explorerUrl}}async function I5(t,e,r){let n=K(r.to??t.address.toString()),o=await e.ragequit({to:n,sender:t.address}),a=await t.tx().add(...o).send();return await a.wait(),{hash:a.hash,explorerUrl:a.explorerUrl}}async function C5(t,e){let r=await e.rollover({sender:t.address}),n=await t.tx().add(...r).send();return await n.wait(),{hash:n.hash,explorerUrl:n.explorerUrl}}Vo();$r();var Bhe=S.object({privateKey:S.string().min(1),contractAddress:S.string().startsWith("0x")}),yF=join(L1,"confidential.json");function xF(){try{let t=readFileSync(yF,"utf-8"),e=Bhe.safeParse(JSON.parse(t));return e.success?e.data:null}catch{return null}}function R5(t){Bhe.parse(t),mkdirSync(L1,{recursive:true}),writeFileSync(yF,JSON.stringify(t,null,2),{encoding:"utf-8",mode:384}),chmodSync(yF,384);}function Ia(){let t=xF();if(!t)throw new he("CONFIDENTIAL_NOT_CONFIGURED","Tongo not configured. Run 'starkfi conf-setup --key <KEY> --contract <ADDRESS>' first.");return t}async function $f(t,e,r){let n=ge(r),[o,a,i,s,c]=await Promise.allSettled([kHe(e,n),EHe(t,e,r),CHe(e,n),RHe(e),OHe(e)]),l=o.status==="fulfilled"?o.value:[],d=a.status==="fulfilled"?a.value:[],u=i.status==="fulfilled"?i.value:[],p=s.status==="fulfilled"?s.value:[],m=c.status==="fulfilled"?c.value:null,g=l.reduce((x,v)=>x+v.usdValue,0),b=d.reduce((x,v)=>x+v.usdValue,0);return {address:r.address,network:bt(r),balances:l,staking:d,lending:u,dca:p,confidential:m,totalUsdValue:g+b}}var AHe=5;async function kHe(t,e){let r=await oy(t,e);return (await d5(r,AHe,async o=>{let a=0;try{let i=re(o.symbol,e),s=await ny(i,e);a=parseFloat(o.balance)*s;}catch{}return {symbol:o.symbol,name:o.name,amount:o.balance,usdValue:a}})).sort((o,a)=>a.usdValue-o.usdValue)}async function EHe(t,e,r){let n=await cy(t,e,bt(r),r.address);if(n.positions.length===0)return [];let o=[...new Set(n.positions.map(s=>s.token))],a=await Promise.allSettled(o.map(async s=>{try{let c=re(s,ge(r));return {symbol:s,price:await ny(c,ge(r))}}catch{return {symbol:s,price:0}}})),i=new Map;for(let s of a)s.status==="fulfilled"&&i.set(s.value.symbol,s.value.price);return n.positions.map(s=>({validator:s.validator,pool:s.pool,token:s.token,staked:s.staked,rewards:s.rewards,unpooling:s.unpooling,cooldownEndsAt:s.cooldownEndsAt,usdValue:IHe(s.total)*(i.get(s.token)??0)}))}function IHe(t){let e=t.match(/([\d.]+)/);return e?parseFloat(e[1]):0}async function CHe(t,e){let r=await mh(t),n=[];for(let o of r){let a=await v5(t,o.address),s=[...new Set(a.map(c=>c.asset.symbol))].map(async c=>{let l=await Nf(t,o.address,c,e);l&&l!=="0"&&n.push({pool:o.name??o.address,asset:c,supplied:l});});await Promise.allSettled(s);}return n}async function RHe(t){try{return (await uy(t,{status:"ACTIVE"})).content.map(r=>({id:r.id.slice(0,8),orderAddress:r.orderAddress.toString(),provider:r.providerId,status:r.status,frequency:r.frequency,trades:`${r.executedTradesCount}/${r.iterations}`}))}catch{return []}}async function OHe(t,e){try{let r=xF();if(!r)return null;let n=$o(t,r),o=await fy(n),a="balance"in o?BigInt(o.balance):0n,i="pending"in o?BigInt(o.pending):0n,s=c=>{let l=c.toString().padStart(7,"0"),d=l.slice(0,-6)||"0",u=l.slice(-6).replace(/0+$/,"");return u?`${d}.${u}`:d};return {address:o.address,activeBalance:`${s(a)} USDC`,pendingBalance:`${s(i)} USDC`}}catch{return null}}async function Mhe(){return _n(async({session:t,sdk:e,wallet:r})=>{let n=await $f(e,r,t);return we(n)})}nr();wr();Pf();function Fhe(t,e){return t.map(r=>{let n=re(r.from_token,e),o=re(r.to_token,e),a=Q.parse(r.amount,n).toBase();return {tokenIn:n,tokenOut:o,amountInRaw:a}})}async function zhe(t){return Dt(async({session:e,wallet:r})=>{let n=ge(e),o=Fhe(t.swaps,n),a=t.provider,i=oa(r,a),s=await Promise.all(o.map(async(c,l)=>{let d=await ra(i,{tokenIn:c.tokenIn,tokenOut:c.tokenOut,amountInRaw:c.amountInRaw}),u=na(d);return {amountIn:`${t.swaps[l].amount} ${c.tokenIn.symbol}`,expectedAmountOut:`~${u.amountOutFormatted} ${c.tokenOut.symbol}`,provider:u.provider}}));return we({success:true,quotes:s,message:"Quotes generated. Use multi_swap to execute."})})}async function Hhe(t){return Dt(async({session:e,wallet:r})=>{let n=ge(e),o=Fhe(t.swaps,n),a=t.slippage??1,i=t.provider,s=oa(r,i),c=r.tx(),l=[];for(let p=0;p<o.length;p++){let m=o[p],g=await ra(s,{tokenIn:m.tokenIn,tokenOut:m.tokenOut,amountInRaw:m.amountInRaw,slippageBps:qc(a)}),b=na(g);await di(s,b.provider).buildSwapTx(c,{tokenIn:m.tokenIn,tokenOut:m.tokenOut,amountInRaw:m.amountInRaw,walletAddress:e.address,slippage:a}),l.push({amountIn:`${t.swaps[p].amount} ${m.tokenIn.symbol}`,expectedAmountOut:`~${b.amountOutFormatted} ${m.tokenOut.symbol}`,provider:b.provider});}if(t.simulate){let p=await Ye(c,n);return Zr(p,{swaps:l})}let{hash:d,explorerUrl:u}=await po(c);return we({success:true,txHash:d,explorerUrl:u,swaps:l,slippage:`${a}%`})})}nr();wr();hh();$_();Vo();var PHe=S.string().regex(/^0x[0-9a-fA-F]{1,64}$/,"Invalid Starknet address");function Kc(t){return PHe.parse(t)}$r();async function O5(t,e,r,n){if(r.length<2)throw new he("INVALID_AMOUNT","Batch requires at least 2 operations. Use individual commands for single operations.");let o=t.tx(),a=[],i=oa(t);for(let s of r){switch(s.type){case "swap":await NHe(o,s.params,i,e,n);break;case "stake":await $He(o,s.params,t,e,n);break;case "supply":await DHe(o,s.params,t,e,n);break;case "send":await LHe(o,s.params,n);break;case "dca-create":UHe(o,s.params,n);break;case "dca-cancel":BHe(o,s.params);break;case "borrow":await MHe(o,s.params,t,n);break;case "repay":await FHe(o,s.params,t,n);break;case "withdraw":await zHe(o,s.params,t,n);break;default:throw new he("INVALID_CONFIG",`Unknown batch operation type: ${String(s.type)}`)}a.push(HHe(s));}return {builder:o,summary:a}}async function NHe(t,e,r,n,o){let a=re(e.from_token,o),i=re(e.to_token,o),c=Q.parse(e.amount,a).toBase(),l=await ra(r,{tokenIn:a,tokenOut:i,amountInRaw:c}),d=na(l);await di(r,d.provider).buildSwapTx(t,{tokenIn:a,tokenOut:i,amountInRaw:c,walletAddress:n.address,slippage:e.slippage??1});}async function $He(t,e,r,n,o){let a=(e.token??"STRK").toUpperCase(),i=re(a,o),s=Q.parse(e.amount,i),c=e.pool;if(!c&&e.validator){let{sdk:l}=await je(n),d=Wc(e.validator,bt(n));if(!d)throw new he("VALIDATOR_NOT_FOUND",`Validator '${e.validator}' not found`);let u=await md(l,d.stakerAddress.toString());c=sy(u,a).poolContract;}if(!c)throw new he("INVALID_CONFIG","Stake operation requires pool or validator");t.stake(K(Kc(c)),s);}async function DHe(t,e,r,n,o){let a=re(e.token,o),i=Q.parse(e.amount,a),s=await Ur(r,e.pool);t.lendDeposit({token:a,amount:i,poolAddress:K(s.address)});}async function LHe(t,e,r){let n=re(e.token,r),o=Q.parse(e.amount,n),a=Kc(e.to);t.transfer(n,{to:K(a),amount:o});}function UHe(t,e,r){let n=re(e.sell_token,r),o=re(e.buy_token,r),a=Q.parse(e.sell_amount,n),i=Q.parse(e.amount_per_cycle,n);t.dcaCreate({sellToken:n,buyToken:o,sellAmount:a,sellAmountPerCycle:i,frequency:e.frequency??"P1D",provider:e.provider});}function BHe(t,e){if(!e.order_id&&!e.order_address)throw new he("DCA_FAILED","DCA cancel in batch requires order_id or order_address.");t.dcaCancel({orderId:e.order_id,orderAddress:e.order_address,provider:e.provider});}async function MHe(t,e,r,n){let o=re(e.collateral_token,n),a=re(e.borrow_token,n),i=await Ur(r,e.pool);t.lendBorrow({collateralToken:o,debtToken:a,amount:Q.parse(e.borrow_amount,a),collateralAmount:Q.parse(e.collateral_amount,o),poolAddress:K(i.address)});}async function FHe(t,e,r,n){let o=re(e.collateral_token,n),a=re(e.token,n),i=await Ur(r,e.pool);t.lendRepay({collateralToken:o,debtToken:a,amount:Q.parse(e.amount,a),poolAddress:K(i.address)});}async function zHe(t,e,r,n){let o=re(e.token,n),a=await Ur(r,e.pool);t.lendWithdraw({token:o,amount:Q.parse(e.amount,o),poolAddress:K(a.address)});}function HHe(t){let e=t.params;switch(t.type){case "swap":{let r=e;return `swap ${r.amount} ${r.from_token.toUpperCase()} \u2192 ${r.to_token.toUpperCase()}`}case "stake":{let r=e;return `stake ${r.amount} ${(r.token??"STRK").toUpperCase()}`}case "supply":{let r=e;return `supply ${r.amount} ${r.token.toUpperCase()}`}case "send":{let r=e;return `send ${r.amount} ${r.token.toUpperCase()} \u2192 ${r.to.slice(0,10)}\u2026`}case "dca-create":{let r=e;return `dca-create ${r.sell_amount} ${r.sell_token.toUpperCase()} \u2192 ${r.buy_token.toUpperCase()} (${r.amount_per_cycle}/cycle)`}case "dca-cancel":{let r=e;return `dca-cancel ${r.order_id??r.order_address??"unknown"}`}case "borrow":{let r=e;return `borrow ${r.borrow_amount} ${r.borrow_token.toUpperCase()} (collateral: ${r.collateral_amount} ${r.collateral_token.toUpperCase()})`}case "repay":{let r=e;return `repay ${r.amount} ${r.token.toUpperCase()}`}case "withdraw":{let r=e;return `withdraw ${r.amount} ${r.token.toUpperCase()}`}default:return `${t.type}: ${JSON.stringify(e)}`}}Pf();async function Vhe(t){return Dt(async({session:e,wallet:r})=>{let n=ge(e),o=t.operations.map(l=>({type:l.type,params:l.params})),{builder:a,summary:i}=await O5(r,e,o,n);if(t.simulate){let l=await Ye(a,n);return Zr(l,{operations:i})}let{hash:s,explorerUrl:c}=await po(a);return we({success:true,txHash:s,explorerUrl:c,operations:i})})}_F();TF();async function Zhe(t){return _n(async({session:e,wallet:r})=>{let n=ge(e),o=t.warning_threshold?{warningThreshold:t.warning_threshold}:void 0;if(t.pool){if(!t.collateral_token||!t.borrow_token)return we({success:false,error:"collateral_token and borrow_token are required when specifying a pool"});let s=await wF(r,t.pool,t.collateral_token,t.borrow_token,o,n);return we({success:true,positions:[s]})}let a=await vF(r,o,n),i=a.filter(s=>s.alert!==null);return we({success:true,positions:a,alertCount:i.length})})}async function qhe(t){return Dt(async({session:e,wallet:r})=>{let n=await SF(r,e,{pool:t.pool,collateralToken:t.collateral_token,debtToken:t.borrow_token,strategy:t.strategy??"auto",targetHealthFactor:t.target_health_factor,simulate:t.simulate},ge(e));return we({success:true,...n})})}nr();wr();$r();Pf();function P5(t,e){let r=t.split(",").map(a=>a.trim()).filter(Boolean);if(r.length===0)throw new he("INVALID_ALLOCATION",'Invalid allocation format. Expected: "50 ETH, 30 USDC, 20 STRK"');let n=r.map(a=>{let i=a.match(/^(\d+(?:\.\d+)?)\s+(\w+)$/);if(!i)throw new he("INVALID_ALLOCATION",`Invalid allocation entry: "${a}". Expected format: "50 ETH"`);let s=parseFloat(i[1]),c=i[2].toUpperCase();return re(c,e),{symbol:c,percentage:s}}),o=n.reduce((a,i)=>a+i.percentage,0);if(Math.abs(o-100)>.01)throw new he("INVALID_ALLOCATION",`Allocations must sum to 100%. Current total: ${o.toFixed(2)}%`);return n}async function N5(t,e,r){let n=new Map,o=0;for(let p of t.balances){let m=p.usdValue,g=p.symbol.toUpperCase();n.set(g,(n.get(g)??0)+m),o+=m;}if(o<=0)throw new he("REBALANCE_FAILED","Portfolio has no USD value. Cannot calculate rebalance plan.");let a=[...n.entries()].map(([p,m])=>({symbol:p,percentage:m/o*100,usdValue:m})),i=new Map;for(let[p,m]of n){let b=(e.find(x=>x.symbol===p)?.percentage??0)/100*o;i.set(p,b-m);}for(let p of e)if(!i.has(p.symbol)){let m=p.percentage/100*o;i.set(p.symbol,m);}let s=[],c=[];for(let[p,m]of i)m<-1?s.push({symbol:p,usdAmount:Math.abs(m)}):m>1&&c.push({symbol:p,usdAmount:m});let l=[],d=0,u=0;for(;d<s.length&&u<c.length;){let p=s[d],m=c[u],g=Math.min(p.usdAmount,m.usdAmount),b=re(p.symbol,r),x=t.balances.find(I=>I.symbol.toUpperCase()===p.symbol),v=parseFloat(x?.amount??"0"),E=v>0?(x?.usdValue??0)/v:0,A=E>0?g/E:0;A>0&&l.push({action:"sell",fromToken:p.symbol,toToken:m.symbol,amount:A.toFixed(b.decimals),usdValue:g}),p.usdAmount-=g,m.usdAmount-=g,p.usdAmount<1&&d++,m.usdAmount<1&&u++;}return {currentAllocations:a,targetAllocations:e,totalUsdValue:o,trades:l}}async function $5(t,e,r,n){if(r.trades.length===0)return {plan:r};let o=ge(e),a=n?.slippage??1,i=t.tx(),s=oa(t);for(let d of r.trades){let u=re(d.fromToken,o),p=re(d.toToken,o),g=Q.parse(d.amount,u).toBase(),b=await ra(s,{tokenIn:u,tokenOut:p,amountInRaw:g}),x=na(b);await di(s,x.provider).buildSwapTx(i,{tokenIn:u,tokenOut:p,amountInRaw:g,walletAddress:e.address,slippage:a});}if(n?.simulate){let d=await Ye(i,o);return {plan:r,simulation:d}}let{hash:c,explorerUrl:l}=await po(i);return {plan:r,txHash:c,explorerUrl:l}}async function Whe(t){return Dt(async({session:e,sdk:r,wallet:n})=>{let o=ge(e),a=P5(t.target,o),i=await $f(r,n,e),s=await N5(i,a,o);if(s.trades.length===0)return we({success:true,message:"Portfolio is already balanced \u2014 no trades needed",plan:s});let c=await $5(n,e,s,{slippage:t.slippage,simulate:t.simulate});return c.simulation?Zr(c.simulation,{plan:c.plan}):we({success:true,...c})})}wr();nr();async function Khe(t){return R5({privateKey:t.tongo_key,contractAddress:t.contract_address}),we({success:true,message:"Tongo configuration saved."})}async function Xhe(){return _n(async({wallet:t})=>{let e=Ia(),r=$o(t,e),n=await fy(r);return we({address:n.address,balance:n.balance,pending:n.pending,nonce:n.nonce})})}async function Yhe(t){return Dt(async({session:e,wallet:r})=>{let n=ge(e),o=Ia(),a=$o(r,o);if(t.simulate){let s=re(t.token??"USDC",n),c=Q.parse(t.amount,s),l=r.tx().confidentialFund(a,{amount:c,sender:r.address}),d=await Ye(l,n);return Zr(d,{amount:t.amount,token:t.token??"USDC",operation:"confidential-fund"})}let i=await A5(r,a,{amount:t.amount,token:t.token},n);return we({success:true,txHash:i.hash,explorerUrl:i.explorerUrl,amount:t.amount,token:t.token??"USDC"})})}async function Qhe(t){return Dt(async({session:e,wallet:r})=>{let n=ge(e),o=Ia(),a=$o(r,o);if(t.simulate){let s=re(t.token??"USDC",n),c=Q.parse(t.amount,s),l=r.tx().confidentialTransfer(a,{amount:c,to:{x:t.recipient_x,y:t.recipient_y},sender:r.address}),d=await Ye(l,n);return Zr(d,{amount:t.amount,token:t.token??"USDC",operation:"confidential-transfer"})}let i=await k5(r,a,{amount:t.amount,recipientX:t.recipient_x,recipientY:t.recipient_y,token:t.token},n);return we({success:true,txHash:i.hash,explorerUrl:i.explorerUrl,amount:t.amount,token:t.token??"USDC"})})}async function e0e(t){return Dt(async({session:e,wallet:r})=>{let n=ge(e),o=Ia(),a=$o(r,o);if(t.simulate){let s=re(t.token??"USDC",n),c=Q.parse(t.amount,s),l=r.tx().confidentialWithdraw(a,{amount:c,to:t.to?K(t.to):r.address,sender:r.address}),d=await Ye(l,n);return Zr(d,{amount:t.amount,token:t.token??"USDC",to:t.to??"own wallet",operation:"confidential-withdraw"})}let i=await E5(r,a,{amount:t.amount,to:t.to,token:t.token},n);return we({success:true,txHash:i.hash,explorerUrl:i.explorerUrl,amount:t.amount,token:t.token??"USDC",to:t.to??"own wallet"})})}async function t0e(t){return Dt(async({wallet:e})=>{let r=Ia(),n=$o(e,r),o=await I5(e,n,{to:t.to});return we({success:true,txHash:o.hash,explorerUrl:o.explorerUrl,to:t.to??"own wallet"})})}async function r0e(){return Dt(async({wallet:t})=>{let e=Ia(),r=$o(t,e),n=await C5(t,r);return we({success:true,txHash:n.hash,explorerUrl:n.explorerUrl})})}$r();function Ze(t){return async(...e)=>{try{return await t(...e)}catch(r){let n=r instanceof he,o=r instanceof Error?r.message:String(r);return we({success:false,error:g2(o),code:n?r.code:"UNKNOWN_ERROR",...n&&r.details?{details:r.details}:{}})}}}function n0e(t){return t.tool("get_auth_status","Check authentication status and Fibrous API health on Starknet. Use this to verify the user's active wallet.",{},{readOnlyHint:true,destructiveHint:false},Ze(Vme)),t.tool("config_action","View and modify starkfi global configuration such as active network, RPC URL, and Gas Payment mechanisms.",{action:S.enum(["list","set-rpc","get-rpc","set-network","set-gasfree","set-gas-token","reset"]).describe("list: view all. reset: clear all settings to defaults. set-gasfree: dev pays gas using paymaster credits. set-gas-token: user pays gas in ERC20 token instead of STRK."),value:S.string().optional().describe("set-gasfree: 'on'/'off'. set-gas-token: symbol 'USDC'/'ETH' or 'off'. set-rpc: URL string. set-network: 'mainnet'/'sepolia'.")},{readOnlyHint:false,destructiveHint:false},Ze(yhe)),2}Vo();function o0e(t){return t.tool("get_tx_status","Check Starknet transaction status by hash. Use this to verify if a recently submitted transaction has been accepted on L2 or L1.",{hash:S.string().describe("Transaction hash (0x...)")},{readOnlyHint:true,destructiveHint:false},Ze(ehe)),t.tool("get_balance","Get native token and ERC-20 token balances on Starknet for the authorized user.",{token:S.string().optional().describe("Specific token symbol (e.g. 'STRK', 'ETH', 'USDC'). Omit to fetch all balances.")},{readOnlyHint:true,destructiveHint:false},Ze(Xme)),t.tool("deploy_account","Deploy the Starknet smart contract account on-chain. Required once before sending transactions. Safe to call multiple times (idempotent) \u2014 returns status if already deployed.",{},{readOnlyHint:false,destructiveHint:true,idempotentHint:true},Ze(Yme)),t.tool("send_tokens","Transfer tokens to a recipient on Starknet. Set simulate=true to estimate fees without executing.",{amount:S.string().describe("Amount to send (e.g. '0.1', '100')"),token:S.string().describe("Token symbol (e.g. 'STRK', 'ETH', 'USDC')"),recipient:S.string().describe("Recipient Starknet address (0x...)"),simulate:S.boolean().optional().describe("Set true to simulate only \u2014 estimates fees without sending a transaction")},{readOnlyHint:false,destructiveHint:true,idempotentHint:false},Ze(Qme)),t.tool("get_portfolio","Get complete DeFi portfolio overview: all token balances (with USD values), staking positions, lending positions, DCA orders, and confidential Tongo balances in one call.",{},{readOnlyHint:true,destructiveHint:false},Ze(Mhe)),t.tool("rebalance_portfolio","Rebalance portfolio to match a target allocation. Calculates optimal swaps and executes as a single batch transaction. Supports simulation.",{target:S.string().describe('Target allocation, e.g. "50 ETH, 30 USDC, 20 STRK"'),slippage:S.number().optional().describe("Slippage tolerance % (default: 1)"),simulate:S.boolean().optional().describe("Set true to preview plan without executing")},{readOnlyHint:false,destructiveHint:true,idempotentHint:false},Ze(Whe)),6}Vo();var D5=S.enum(["auto","fibrous","avnu","ekubo"]).optional().default("fibrous").describe("Swap provider: fibrous (default), avnu, ekubo, or auto (race all)");function a0e(t){t.tool("get_swap_quote","Get a swap quote via Fibrous (default). Use provider='auto' to race all providers for best price. ALWAYS use this BEFORE calling swap_tokens so the user can review the expected output.",{amount:S.string().describe("Amount to swap in (e.g. '0.1', '100')"),from_token:S.string().describe("Source token symbol to sell (e.g. 'ETH', 'USDC')"),to_token:S.string().describe("Destination token symbol to buy (e.g. 'STRK', 'DAI')"),provider:D5},{readOnlyHint:true,destructiveHint:false},Ze(ahe)),t.tool("swap_tokens","Execute a token swap via Fibrous (default) or a specified provider. Set simulate=true to estimate fees without executing. ONLY call this after showing the user a quote via get_swap_quote.",{amount:S.string().describe("Amount to swap in (e.g. '0.1', '100')"),from_token:S.string().describe("Source token symbol to sell (e.g. 'ETH', 'STRK')"),to_token:S.string().describe("Destination token symbol to buy (e.g. 'USDC', 'DAI')"),slippage:S.number().optional().describe("Slippage tolerance % (default: 1)"),simulate:S.boolean().optional().describe("Set true to simulate only \u2014 estimates fees without sending a transaction"),provider:D5},{readOnlyHint:false,destructiveHint:true,idempotentHint:false},Ze(ihe));let e=S.object({amount:S.string().describe("Amount to swap in (e.g. '100', '0.5')"),from_token:S.string().describe("Source token symbol (e.g. 'USDC', 'ETH')"),to_token:S.string().describe("Destination token symbol (e.g. 'ETH', 'STRK')")});return t.tool("get_multi_swap_quote","Get multi-swap quotes via Fibrous (default) or a specified provider per pair.",{swaps:S.array(e).min(2).max(3).describe("Array of swap pairs (2-3 items)"),provider:D5},{readOnlyHint:true,destructiveHint:false},Ze(zhe)),t.tool("multi_swap","Execute multiple token swaps via Fibrous (default) in a single transaction. Call get_multi_swap_quote first to preview.",{swaps:S.array(e).min(2).max(3).describe("Array of swap pairs (2-3 items)"),slippage:S.number().optional().describe("Slippage tolerance % (default: 1)"),simulate:S.boolean().optional().describe("Set true to simulate only \u2014 estimates fees without executing"),provider:D5},{readOnlyHint:false,destructiveHint:true,idempotentHint:false},Ze(Hhe)),t.tool("batch_execute","Execute multiple DeFi operations in a single Starknet transaction (multicall). Supports: swap, stake, supply, send, borrow, repay, withdraw, dca-create, dca-cancel. Requires at least 2 operations.",{operations:S.array(S.object({type:S.enum(["swap","stake","supply","send","borrow","repay","withdraw","dca-create","dca-cancel"]).describe("Operation type"),params:S.record(S.string(),S.string()).describe("Operation params. swap: {amount, from_token, to_token}. stake: {amount, token?, pool? or validator?}. supply: {amount, token, pool}. send: {amount, token, to}. borrow: {collateral_amount, collateral_token, borrow_amount, borrow_token, pool}. repay: {amount, token, collateral_token, pool}. withdraw: {amount, token, pool}. dca-create: {sell_amount, sell_token, buy_token, amount_per_cycle, frequency?}. dca-cancel: {order_id?, order_address?, provider?}.")})).min(2).describe("Array of operations to batch (min 2)"),simulate:S.boolean().optional().describe("Set true to simulate only \u2014 estimates fees without executing")},{readOnlyHint:false,destructiveHint:true,idempotentHint:false},Ze(Vhe)),5}Vo();function i0e(t){return t.tool("list_validators","List all known Starknet staking validators. Use this FIRST to see available validators and their names before trying to find pools.",{},{readOnlyHint:true,destructiveHint:false},Ze(mhe)),t.tool("list_pools","List delegation pools for a specific validator. Look up a validator name via list_validators first.",{validator:S.string().describe("Validator name (e.g. 'Karnot', 'Kakarot') or staker address. Supports partial matches.")},{readOnlyHint:true,destructiveHint:false},Ze(phe)),t.tool("get_staking_info","Get staking position info (staked balance, unclaimed rewards, total balance, commission, unpooling cooldown) for a specific pool contract.",{pool:S.string().describe("Staking pool contract address (0x...)")},{readOnlyHint:true,destructiveHint:false},Ze(fhe)),t.tool("get_stake_status","Scan ALL known validators and pools to return a consolidated staking dashboard with total staked, total rewards, total value, and per-pool breakdown. Use this to give the user a full picture of their staking portfolio.",{validator:S.string().optional().describe("Optional validator name or staker address to strictly filter results.")},{readOnlyHint:true,destructiveHint:false},Ze(bhe)),t.tool("stake_tokens","Stake tokens in a delegation pool on Starknet. Smart stake: auto-detects whether the user needs to enter the pool or just add to an existing delegation. Supports STRK, WBTC, tBTC, SolvBTC, LBTC.",{amount:S.string().describe("Amount to stake (e.g. '100', '0.01')"),pool:S.string().describe("Staking pool contract address (0x...)"),token:S.string().optional().describe("Token symbol to stake (default: STRK). Supported: STRK, WBTC, tBTC, SolvBTC, LBTC")},{readOnlyHint:false,destructiveHint:true,idempotentHint:false},Ze(dhe)),t.tool("unstake_tokens","Unstake tokens from a pool. Unstaking is a TWO-STEP process: 1. call with action='intent', 2. wait for cooldown, 3. call with action='exit' to complete withdrawal.",{action:S.enum(["intent","exit"]).describe("'intent' strictly starts the unstaking process, 'exit' completes withdrawal after cooldown."),pool:S.string().describe("Staking pool contract address (0x...)"),amount:S.string().optional().describe("Amount to unstake (ONLY required when action='intent')"),token:S.string().optional().describe("Token symbol (default: STRK). Must match the pool's token.")},{readOnlyHint:false,destructiveHint:true,idempotentHint:false},Ze(uhe)),t.tool("claim_rewards","Extract earned rewards from a staking pool to the user's wallet.",{pool:S.string().describe("Staking pool contract address (0x...)")},{readOnlyHint:false,destructiveHint:true,idempotentHint:false},Ze(hhe)),t.tool("compound_rewards","Atomically claim staking rewards and re-stake them recursively into the same pool in a single transaction (compound interest).",{pool:S.string().describe("Staking pool contract address (0x...)")},{readOnlyHint:false,destructiveHint:true,idempotentHint:false},Ze(ghe)),8}Vo();function s0e(t){return t.tool("list_lending_pools","List available Vesu V2 lending pools on Starknet with their supported collateral/debt pairs. Use this FIRST to discover available pools before supplying, borrowing, or checking positions.",{name:S.string().optional().describe("Filter pools by name (partial match). Omit to list all.")},{readOnlyHint:true,destructiveHint:false},Ze(The)),t.tool("get_lending_position","Get the user's lending position (supplied collateral and outstanding debt) in a specific Vesu pool.",{pool:S.string().describe("Pool name (e.g. 'Prime', 'Re7') or contract address (0x...)"),collateral_token:S.string().describe("Collateral token symbol (e.g. 'ETH', 'STRK')"),borrow_token:S.string().optional().describe("Borrow token symbol (e.g. 'USDC', 'USDT')")},{readOnlyHint:true,destructiveHint:false},Ze(Ahe)),t.tool("supply_assets","Supply (lend) tokens into a Vesu V2 pool to earn interest as an earn position.",{pool:S.string().describe("Pool name (e.g. 'Prime', 'Re7') or contract address (0x...)"),amount:S.string().describe("Amount to supply (e.g. '100', '0.5')"),token:S.string().describe("Token symbol to supply (e.g. 'STRK', 'ETH', 'USDC')"),simulate:S.boolean().optional().describe("Set true to estimate fees without executing")},{readOnlyHint:false,destructiveHint:true,idempotentHint:false},Ze(khe)),t.tool("withdraw_assets","Withdraw previously supplied tokens from a Vesu V2 lending pool.",{pool:S.string().describe("Pool name (e.g. 'Prime', 'Re7') or contract address (0x...)"),amount:S.string().describe("Amount to withdraw (e.g. '100', '0.5')"),token:S.string().describe("Token symbol to withdraw (e.g. 'STRK', 'ETH', 'USDC')"),simulate:S.boolean().optional().describe("Set true to estimate fees without executing")},{readOnlyHint:false,destructiveHint:true,idempotentHint:false},Ze(Ehe)),t.tool("borrow_assets","Borrow tokens from a Vesu V2 pool by supplying collateral. Atomically deposits collateral and borrows the debt asset in a single transaction.",{pool:S.string().describe("Pool name (e.g. 'Prime', 'Re7') or contract address (0x...)"),collateral_amount:S.string().describe("Collateral amount to deposit (e.g. '1000')"),collateral_token:S.string().describe("Collateral token symbol (e.g. 'STRK', 'ETH')"),borrow_amount:S.string().describe("Amount to borrow (e.g. '100')"),borrow_token:S.string().describe("Token to borrow (e.g. 'USDC', 'USDT')"),use_supplied:S.boolean().optional().describe("Set to true to use previously supplied yield tokens as collateral via Multicall instead of transferring fresh tokens from wallet."),simulate:S.boolean().optional().describe("Set true to estimate fees without executing")},{readOnlyHint:false,destructiveHint:true,idempotentHint:false},Ze(Ihe)),t.tool("repay_debt","Repay borrowed tokens on an existing Vesu V2 lending position. Approves and repays the specified amount of debt.",{pool:S.string().describe("Pool name (e.g. 'Prime', 'Re7') or contract address (0x...)"),amount:S.string().describe("Amount to repay (e.g. '50', '100')"),token:S.string().describe("Token to repay (e.g. 'USDC', 'USDT')"),collateral_token:S.string().describe("Collateral token of the position (e.g. 'ETH', 'STRK'). Needed to identify the position."),simulate:S.boolean().optional().describe("Set true to estimate fees without executing")},{readOnlyHint:false,destructiveHint:true,idempotentHint:false},Ze(Che)),t.tool("close_position","Atomically close an active Vesu V2 lending position. Repays all outstanding debt and withdraws all collateral in a single transaction.",{pool:S.string().describe("Pool name (e.g. 'Prime', 'Re7') or contract address (0x...)"),collateral_token:S.string().describe("Collateral token symbol of the position (e.g. 'STRK', 'ETH')"),debt_token:S.string().describe("Borrowed token symbol of the position (e.g. 'USDC', 'USDT')"),simulate:S.boolean().optional().describe("Set true to estimate fees without executing")},{readOnlyHint:false,destructiveHint:true,idempotentHint:false},Ze(Rhe)),t.tool("monitor_lending_position","Monitor health factors across lending positions. Returns alerts and recommendations when health factor drops below thresholds. Omit pool to scan all pools.",{pool:S.string().optional().describe("Pool name or address. Omit to scan all pools."),collateral_token:S.string().optional().describe("Collateral token symbol (required with pool)"),borrow_token:S.string().optional().describe("Debt token symbol (required with pool)"),warning_threshold:S.number().optional().describe("Custom warning threshold (default: 1.3)")},{readOnlyHint:true,destructiveHint:false},Ze(Zhe)),t.tool("auto_rebalance_lending","Automatically adjust a lending position's health factor via repay or add-collateral. Supports simulation mode.",{pool:S.string().describe("Pool name or address"),collateral_token:S.string().describe("Collateral token symbol"),borrow_token:S.string().describe("Debt token symbol"),strategy:S.enum(["repay","add-collateral","auto"]).optional().describe("Adjustment strategy (default: auto)"),target_health_factor:S.number().optional().describe("Target health factor (default: 1.3)"),simulate:S.boolean().optional().describe("Set true to estimate fees without executing")},{readOnlyHint:false,destructiveHint:true,idempotentHint:false},Ze(qhe)),t.tool("lending_quote_health","Simulate the impact of a lending action (borrow, repay, deposit, withdraw) on position health factor WITHOUT executing. Returns current and projected health.",{pool:S.string().describe("Pool name or address"),collateral_token:S.string().describe("Collateral token symbol"),debt_token:S.string().describe("Debt token symbol"),action:S.enum(["borrow","repay","deposit","withdraw"]).describe("Action to simulate"),amount:S.string().describe("Amount for the action")},{readOnlyHint:true,destructiveHint:false},Ze(Ohe)),10}Vo();function c0e(t){return t.tool("dca_preview","Preview a single DCA cycle to see the expected buy amount and price impact before creating an order. Use this FIRST before dca_create.",{sell_amount_per_cycle:S.string().describe("Amount to sell per cycle (e.g. '10', '0.5')"),sell_token:S.string().describe("Token to sell (e.g. 'STRK', 'ETH')"),buy_token:S.string().describe("Token to buy (e.g. 'USDC', 'ETH')"),provider:S.enum(["avnu","ekubo"]).optional().describe("DCA provider (default: avnu)")},{readOnlyHint:true,destructiveHint:false},Ze(Lhe)),t.tool("dca_create","Create a recurring Dollar-Cost Averaging (DCA) order. Periodically swaps a fixed amount of sell_token into buy_token at the specified frequency.",{sell_amount:S.string().describe("Total amount to sell across all cycles (e.g. '100')"),sell_token:S.string().describe("Token to sell (e.g. 'STRK', 'ETH')"),buy_token:S.string().describe("Token to buy (e.g. 'USDC', 'ETH')"),amount_per_cycle:S.string().describe("Amount to sell per cycle (e.g. '10')"),frequency:S.string().optional().describe("ISO 8601 duration between cycles (default: 'P1D'=daily). Examples: 'PT12H'=12hrs, 'P1W'=weekly"),provider:S.enum(["avnu","ekubo"]).optional().describe("DCA provider (default: avnu)"),simulate:S.boolean().optional().describe("Set true to estimate fees without executing")},{readOnlyHint:false,destructiveHint:true,idempotentHint:false},Ze(Nhe)),t.tool("dca_list","List DCA orders for the current wallet. Optionally filter by status (ACTIVE, CLOSED, INDEXING) and provider.",{status:S.enum(["ACTIVE","CLOSED","INDEXING"]).optional().describe("Filter orders by status"),provider:S.enum(["avnu","ekubo"]).optional().describe("Filter by DCA provider"),page:S.number().optional().describe("Page number (0-based)"),size:S.number().optional().describe("Page size (default: provider default)")},{readOnlyHint:true,destructiveHint:false},Ze($he)),t.tool("dca_cancel","Cancel an active DCA order. Use the order_id (UUID from dca_list) or order_address (on-chain contract address from dca_list). At least one is required.",{order_id:S.string().optional().describe("DCA order UUID (the 'id' field from dca_list)"),order_address:S.string().optional().describe("DCA order on-chain contract address (the 'orderAddress' field from dca_list)"),provider:S.enum(["avnu","ekubo"]).optional().describe("DCA provider of the order")},{readOnlyHint:false,destructiveHint:true,idempotentHint:false},Ze(Dhe)),4}Vo();function l0e(t){return t.tool("confidential_setup","Configure Tongo Cash credentials for confidential transfers. Must be called before any other confidential operations.",{tongo_key:S.string().describe("Tongo private key (kept locally, never sent to network)"),contract_address:S.string().describe("Tongo contract address on Starknet (0x\u2026)")},{readOnlyHint:false,destructiveHint:false},Ze(Khe)),t.tool("confidential_balance","Check confidential account balance (active + pending). Call this FIRST before fund/transfer/withdraw.",{},{readOnlyHint:true,destructiveHint:false},Ze(Xhe)),t.tool("confidential_fund","Fund your confidential account from public balance. Moves public ERC20 tokens into a private confidential balance.",{amount:S.string().describe("Amount to fund (e.g. '100')"),token:S.string().optional().describe("Token symbol (default: USDC)"),simulate:S.boolean().optional().describe("Set true to estimate fees without executing")},{readOnlyHint:false,destructiveHint:true,idempotentHint:false},Ze(Yhe)),t.tool("confidential_transfer","Transfer tokens confidentially to another Tongo account. Amounts are hidden on-chain via ZK proofs. Recipient is identified by elliptic curve point (x, y), NOT a Starknet address.",{amount:S.string().describe("Amount to transfer"),recipient_x:S.string().describe("Recipient public key X coordinate (BigNumberish)"),recipient_y:S.string().describe("Recipient public key Y coordinate (BigNumberish)"),token:S.string().optional().describe("Token symbol (default: USDC)"),simulate:S.boolean().optional().describe("Set true to estimate fees without executing")},{readOnlyHint:false,destructiveHint:true,idempotentHint:false},Ze(Qhe)),t.tool("confidential_withdraw","Withdraw from confidential account to a public Starknet address. Converts private balance back to public ERC20 tokens.",{amount:S.string().describe("Amount to withdraw"),to:S.string().optional().describe("Recipient Starknet address (default: own wallet)"),token:S.string().optional().describe("Token symbol (default: USDC)"),simulate:S.boolean().optional().describe("Set true to estimate fees without executing")},{readOnlyHint:false,destructiveHint:true,idempotentHint:false},Ze(e0e)),t.tool("confidential_ragequit","Emergency exit \u2014 withdraw entire confidential balance to a public address. Use when you need to exit immediately.",{to:S.string().optional().describe("Recipient Starknet address (default: own wallet)")},{readOnlyHint:false,destructiveHint:true,idempotentHint:false},Ze(t0e)),t.tool("confidential_rollover","Activate pending confidential balance. Received transfers start as 'pending' and must be rolled over to become spendable.",{},{readOnlyHint:false,destructiveHint:false},Ze(r0e)),7}function d0e(t){let e=[{name:"Auth & Config",count:n0e(t)},{name:"Wallet",count:o0e(t)},{name:"Trade",count:a0e(t)},{name:"Staking",count:i0e(t)},{name:"Lending",count:s0e(t)},{name:"DCA",count:c0e(t)},{name:"Confidential",count:l0e(t)}];return {total:e.reduce((r,n)=>r+n.count,0),categories:e}}var AF={name:"starkfi",version:"0.6.2"},GHe=`StarkFi is a Starknet DeFi toolkit. You can:
|
|
132
|
+
`}var Hk=class{constructor(e=Ch.stdin,r=Ch.stdout){this._stdin=e,this._stdout=r,this._readBuffer=new zk,this._started=false,this._ondata=n=>{this._readBuffer.append(n),this.processReadBuffer();},this._onerror=n=>{this.onerror?.(n);};}async start(){if(this._started)throw new Error("StdioServerTransport already started! If using Server class, note that connect() calls start() automatically.");this._started=true,this._stdin.on("data",this._ondata),this._stdin.on("error",this._onerror);}processReadBuffer(){for(;;)try{let e=this._readBuffer.readMessage();if(e===null)break;this.onmessage?.(e);}catch(e){this.onerror?.(e);}}async close(){this._stdin.off("data",this._ondata),this._stdin.off("error",this._onerror),this._stdin.listenerCount("data")===0&&this._stdin.pause(),this._readBuffer.clear(),this.onclose?.();}send(e){return new Promise(r=>{let n=nK(e);this._stdout.write(n)?r():this._stdout.once("drain",r);})}};Vo();Vo();var Yd=aK.homedir(),E7=aK.tmpdir(),{env:V0}=Ch,o4e=t=>{let e=zr.join(Yd,"Library");return {data:zr.join(e,"Application Support",t),config:zr.join(e,"Preferences",t),cache:zr.join(e,"Caches",t),log:zr.join(e,"Logs",t),temp:zr.join(E7,t)}},a4e=t=>{let e=V0.APPDATA||zr.join(Yd,"AppData","Roaming"),r=V0.LOCALAPPDATA||zr.join(Yd,"AppData","Local");return {data:zr.join(r,t,"Data"),config:zr.join(e,t,"Config"),cache:zr.join(r,t,"Cache"),log:zr.join(r,t,"Log"),temp:zr.join(E7,t)}},i4e=t=>{let e=zr.basename(Yd);return {data:zr.join(V0.XDG_DATA_HOME||zr.join(Yd,".local","share"),t),config:zr.join(V0.XDG_CONFIG_HOME||zr.join(Yd,".config"),t),cache:zr.join(V0.XDG_CACHE_HOME||zr.join(Yd,".cache"),t),log:zr.join(V0.XDG_STATE_HOME||zr.join(Yd,".local","state"),t),temp:zr.join(E7,e,t)}};function I7(t,{suffix:e="nodejs"}={}){if(typeof t!="string")throw new TypeError(`Expected a string, got ${typeof t}`);return e&&(t+=`-${e}`),Ch.platform==="darwin"?o4e(t):Ch.platform==="win32"?a4e(t):i4e(t)}var iK=I7("starkfi"),Vk="https://starkfi-production.up.railway.app",L1=iK.data,jk=iK.config;function sK(t,e){return `${e==="mainnet"?"https://voyager.online":"https://sepolia.voyager.online"}/tx/${t}`}$r();var cK=S.object({type:S.literal("privy"),network:S.enum(["mainnet","sepolia"]),address:S.string(),userId:S.string(),walletId:S.string(),publicKey:S.string(),token:S.string(),serverUrl:S.string()}),C7=join(L1,"session.json");function xl(){try{let t=readFileSync(C7,"utf-8"),e=cK.safeParse(JSON.parse(t));return e.success?e.data:null}catch{return null}}function lK(t){let e=C7;mkdirSync(dirname$1(e),{recursive:true}),cK.parse(t),writeFileSync(e,JSON.stringify(t,null,2),"utf-8");}function R7(){try{unlinkSync(C7);}catch{}}function p4e(t){try{let e=t.split(".");if(e.length!==3||!e[1])return !1;let r=JSON.parse(Buffer.from(e[1],"base64url").toString());return r.exp?Date.now()>=(r.exp-300)*1e3:!1}catch{return false}}function Fe(){let t=xl();if(!t)throw new he("AUTH_REQUIRED","Not authenticated. Run 'starkfi auth login <email>' first.");if(p4e(t.token))throw R7(),new he("SESSION_EXPIRED","Session expired. Please re-authenticate with 'starkfi auth login <email>'");return t}var U1="https://api.fibrous.finance/starknet";var O7="0x00f6f4CF62E3C010E0aC2451cC7807b5eEc19a40b0FaaCd00CCA3914280FDf5a",dK=2n,uK=15n;async function j0(){try{let t=await fetch(`${U1}/healthCheck`);if(!t.ok)return {ok:!1,message:`Fibrous API returned ${t.status}`};let e=await t.json();return {ok:e.staus===200,message:e.message}}catch(t){return {ok:false,message:`Failed to reach Fibrous API: ${t instanceof Error?t.message:String(t)}`}}}function ic(t){return {content:[{type:"text",text:t}]}}function we(t){return ic(JSON.stringify(t,null,2))}function Zr(t,e){return we({success:t.success,mode:"SIMULATION (no TX sent)",...e,estimatedFee:t.estimatedFee,estimatedFeeUsd:t.estimatedFeeUsd,callCount:t.callCount,...t.revertReason?{revertReason:t.revertReason}:{}})}nr();var uh=join(jk,"config.json"),vn=class t{static instance;config;lastMtime=0;constructor(){this.config=this.load(),this.updateMtime();}static getInstance(){return t.instance||(t.instance=new t),t.instance}get(e){return this.refreshIfChanged(),this.config[e]}set(e,r){this.config[e]=r,this.save();}delete(e){delete this.config[e],this.save();}clear(){this.config={},this.save();}getAll(){return this.refreshIfChanged(),{...this.config}}refreshIfChanged(){try{if(!existsSync(uh))return;let e=statSync(uh).mtimeMs;e>this.lastMtime&&(this.config=this.load(),this.lastMtime=e);}catch{}}updateMtime(){try{existsSync(uh)&&(this.lastMtime=statSync(uh).mtimeMs);}catch{}}load(){if(!existsSync(uh))return {};try{let e=readFileSync(uh,"utf-8");return JSON.parse(e)}catch{return {}}}save(){existsSync(jk)||mkdirSync(jk,{recursive:true}),writeFileSync(uh,JSON.stringify(this.config,null,2),"utf-8"),this.updateMtime();}};function sHe(t){return t==="sepolia"?ko.SEPOLIA:ko.MAINNET}function bt(t){return vn.getInstance().get("network")??t.network}function ge(t){return sHe(bt(t))}async function Vme(){let t=xl(),e=await j0();return t?we({authenticated:true,type:t.type,network:bt(t),address:t.address,fibrous:e}):we({authenticated:false,fibrous:e,message:"Not authenticated. Use 'starkfi auth login'."})}nr();O_();var Zme="https://starknet.paymaster.avnu.fi",qme="https://sepolia.paymaster.avnu.fi",Wme="STRK",l5={ETH:"0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7",STRK:"0x04718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d",USDC:"0x033068f6539f8e6e6b131e6b2b814e6c34a5224bc66947c47dab9dfee93b35fb",USDT:"0x068f5c6a61780768455de69077e07e89787839bf8166decfbf92b645209c0fb8",DAI:"0x05574eb6b8789a91466f902c380d978e472db68170ff82a5b650b95a58ddf4ad"},Rf=Object.keys(l5),mF=process.env.AVNU_PAYMASTER_API_KEY;function Of(t,e){if(t)return {feeMode:"sponsored",gasTokenAddress:void 0,needsPaymaster:true};let n=l5[(e??Wme).toUpperCase()];return n?{feeMode:"sponsored",gasTokenAddress:n,needsPaymaster:true}:{feeMode:"sponsored",gasTokenAddress:l5.STRK,needsPaymaster:true}}function fHe(t,e){let r=t.getAccount(),n=r,o=n.executePaymasterTransaction;if(typeof o!="function"){console.warn("[StarkFi] Cannot patch gasless mode \u2014 executePaymasterTransaction not found on account. Gas will use default sponsored mode. Consider updating StarkZap SDK.");return}let a=o.bind(r);n.executePaymasterTransaction=async function(i,s,...c){let l={...s,feeMode:{mode:"default",gasToken:e}};return a(i,l,...c)};}function ph(t="mainnet",e,r=false,n,o){let a={network:t};if(e&&(a.rpcUrl=e),r){let i=t==="sepolia"?qme:Zme;a.paymaster={nodeUrl:n??i,...mF?{apiKey:mF}:{},...o?{headers:o}:{}};}return new I_(a)}async function hF(t,e){let r=vn.getInstance(),n=r.get("gasfreeMode")===true,o=r.get("gasToken"),{feeMode:a,gasTokenAddress:i}=Of(n,o),{wallet:s}=await t.onboard({strategy:Ane.Privy,privy:{resolve:async()=>({walletId:e.walletId,publicKey:e.publicKey,serverUrl:e.serverUrl,headers:{Authorization:`Bearer ${e.token}`}})},accountPreset:"argentXV050",feeMode:a,deploy:"never"});return !n&&i&&fHe(s,i),s.lending().registerProvider(new ud,true),s.registerSwapProvider(new Xb),s.registerSwapProvider(new V6),s.setDefaultSwapProvider("avnu"),s.dca().registerProvider(new Ef),s.dca().registerProvider(new F3),s.dca().setDefaultProvider("avnu"),s}async function je(t){let e=vn.getInstance(),r=e.get("rpcUrl"),n=e.get("gasfreeMode")===true,o=e.get("gasToken"),{gasTokenAddress:a,needsPaymaster:i}=Of(n,o),s=bt(t),c=t.type==="privy"&&t.serverUrl?t.serverUrl.replace("/sign/hash","/paymaster"):void 0,l=c&&t.token?{Authorization:`Bearer ${t.token}`}:void 0,d=ph(s,r,i,c,l),u=await hF(d,t);return Jme(u,ge(t)),{sdk:d,wallet:u,gasTokenAddress:a}}wr();async function d5(t,e,r){let n=[],o=0,a=async()=>{for(;o<t.length;){let s=o++,c=t[s];if(!c)continue;let l=await r(c);l!==void 0&&n.push(l);}},i=Array.from({length:Math.min(e,t.length)},()=>a());return await Promise.all(i),n}var pHe=10;async function oy(t,e){let r=uF(e);return d5(r,pHe,async n=>{try{let o=await t.balanceOf(n);if(o.isPositive())return {symbol:n.symbol,name:n.name,balance:o.toUnit()}}catch{}})}wr();nr();nr();wr();O_();$r();var Kme="STRK";async function Ye(t,e){let n=(await t.calls()).length;if(n===0)throw new he("SIMULATION_FAILED","No calls to simulate \u2014 builder is empty.");let o=await t.preflight();if(!o.ok)return {success:false,estimatedFee:"N/A",estimatedFeeUsd:"N/A",callCount:n,revertReason:o.reason};try{let a=await t.estimateFee(),i=BigInt(a.overall_fee),s=re(Kme,e),l=Q.fromRaw(i,s).toUnit(),d="unknown";try{let u=await ny(s,e);u>0&&(d=`$${(parseFloat(l)*u).toFixed(4)}`);}catch{}return {success:!0,estimatedFee:`${l} ${Kme}`,estimatedFeeUsd:d,callCount:n}}catch(a){return {success:true,estimatedFee:"estimation failed",estimatedFeeUsd:"unknown",callCount:n,revertReason:a instanceof Error?`Fee estimation failed: ${a.message}`:"Fee estimation failed"}}}async function Dt(t){let e=Fe(),{sdk:r,wallet:n}=await je(e);return await n.ensureReady({deploy:"if_needed"}),t({session:e,sdk:r,wallet:n})}async function _n(t){let e=Fe(),{sdk:r,wallet:n}=await je(e);return t({session:e,sdk:r,wallet:n})}Pf();async function Xme(t){return _n(async({session:e,wallet:r})=>{let n=ge(e);if(t.token){let a=re(t.token,n),i=await r.balanceOf(a);return we({symbol:a.symbol,name:a.name,balance:i.toUnit()})}let o=await oy(r,n);return we({network:bt(e),address:e.address,balances:o})})}async function Yme(){return _n(async({session:t,wallet:e})=>{let r=await e.isDeployed();if(!r){let n=vn.getInstance(),o=n.get("gasfreeMode")===true,a=n.get("gasToken"),{feeMode:i}=Of(o,a);await e.ensureReady({deploy:"if_needed",feeMode:i});}return we({alreadyDeployed:r,success:true,address:t.address,network:bt(t),message:r?"Account is already deployed. No action needed.":"Account deployed successfully. You can now send, swap, and stake."})})}async function Qme(t){return Dt(async({session:e,wallet:r})=>{let n=ge(e),o=re(t.token,n),a=Q.parse(t.amount,o),i=await r.balanceOf(o);if(i.lt(a))return we({success:false,error:`Insufficient balance. You have: ${i.toFormatted()}, attempting to send: ${a.toFormatted()}`});let s=r.tx().transfer(o,[{to:K(t.recipient),amount:a}]);if(t.simulate){let d=await Ye(s,n);return Zr(d,{amount:`${t.amount} ${t.token.toUpperCase()}`,to:t.recipient})}let{hash:c,explorerUrl:l}=await po(s);return we({success:true,txHash:c,explorerUrl:l,amount:`${t.amount} ${t.token.toUpperCase()}`,to:t.recipient})})}async function ehe(t){let e=Fe(),n=vn.getInstance().get("rpcUrl"),i=await ph(bt(e),n).getProvider().getTransactionReceipt(t.hash),s="actual_fee"in i?i.actual_fee:void 0,c=s?b2(s):void 0,l="block_number"in i?i.block_number:void 0;return we({hash:t.hash,status:i.statusReceipt,actualFee:c,blockNumber:l})}nr();wr();Pf();$r();var mHe=8e3;function hHe(t,e,r){let n,o=new Promise((a,i)=>{n=setTimeout(()=>i(new Error(r)),e);});return Promise.race([t,o]).finally(()=>clearTimeout(n))}function gHe(t){return t.status==="fulfilled"}async function ra(t,e){if(t.length===0)throw new he("ALL_PROVIDERS_FAILED","No swap providers configured");let n=(await Promise.allSettled(t.map(o=>hHe(o.getQuote(e),mHe,`${o.id} timed out`)))).filter(gHe).map(o=>({...o.value,isBest:false})).sort((o,a)=>Number(a.amountOutRaw-o.amountOutRaw));if(n.length===0)throw new he("ALL_PROVIDERS_FAILED","All swap providers failed or timed out");return n[0].isBest=true,n}function na(t){let e=t.find(r=>r.isBest);if(!e)throw new he("ALL_PROVIDERS_FAILED","All swap providers failed or returned no quotes");return e}function di(t,e){let r=t.find(n=>n.id===e);if(!r)throw new he("PROVIDER_UNAVAILABLE",`Provider "${e}" not found`);return r}function P_(t,e){if(e<=0n||t<=e)return null;let r=Number(t-e)/Number(e)*100;return r>.01?`+${r.toFixed(2)}%`:null}$r();nr();$r();$r();async function N_(t,e){let{maxRetries:r=2,baseDelayMs:n=500,retryOnCodes:o}=e??{},a;for(let i=0;i<=r;i++)try{return await t()}catch(s){if(a=s,s instanceof he&&o?.length&&!o.includes(s.code))throw s;if(i<r){let c=n*2**i;await new Promise(l=>setTimeout(l,c));}}throw a}function yHe(t){return !t.route.some(e=>e.swaps.flat().length>1)}function the(t,e){let r=yHe(e)?dK:uK;return t-t*r/10000n}async function rhe(t,e,r){let n=new URLSearchParams({amount:r,tokenInAddress:t.address,tokenOutAddress:e.address}),o=await N_(()=>fetch(`${U1}/route?${n.toString()}`),{retryOnCodes:["NETWORK_ERROR"]});if(!o.ok)throw new he("NO_ROUTE_FOUND",`Fibrous route API error: ${o.status}`);let a=await o.json();if(!a.success)throw new he("NO_ROUTE_FOUND",a.errorMessage||"No route found for this swap");return a}async function nhe(t,e,r,n=1,o){let a=new URLSearchParams({amount:r,tokenInAddress:t.address,tokenOutAddress:e.address,slippage:n.toString()});o&&a.append("destination",o);let i=await N_(()=>fetch(`${U1}/calldata?${a.toString()}`),{retryOnCodes:["NETWORK_ERROR"]});if(!i.ok){let c=await i.text().catch(()=>"");throw new he("SWAP_FAILED",`Fibrous calldata API error: ${i.status} ${c}`)}let s=await i.json();if(!s.route?.success)throw new he("NO_ROUTE_FOUND","Failed to generate calldata: no valid route");return s}var u5=class{id="fibrous";name="Fibrous";async getQuote(e){let r=await rhe(e.tokenIn,e.tokenOut,e.amountInRaw.toString()),n=the(BigInt(r.outputAmount),r);return {provider:this.id,amountInRaw:e.amountInRaw,amountOutRaw:n,amountOutFormatted:Q.fromRaw(n,e.tokenOut).toUnit(),estimatedGasUsd:r.estimatedGasUsedInUsd??null,routeSteps:r.route?.length??1,isBest:false}}async buildSwapTx(e,r){let n=Q.fromRaw(r.amountInRaw,r.tokenIn),o=await nhe(r.tokenIn,r.tokenOut,r.amountInRaw.toString(),r.slippage,r.walletAddress);e.approve(r.tokenIn,K(O7),n).add({contractAddress:O7,entrypoint:"swap",calldata:o.calldata});}async isAvailable(){return (await j0()).ok}};nr();var ay=class{constructor(e){this.wallet=e;}wallet;async getQuote(e){let r=await this.wallet.getQuote({tokenIn:e.tokenIn,tokenOut:e.tokenOut,amountIn:Q.fromRaw(e.amountInRaw,e.tokenIn),...e.slippageBps!=null?{slippageBps:e.slippageBps}:{},provider:this.id}),n=r.amountOutBase;return {provider:this.id,amountInRaw:r.amountInBase,amountOutRaw:n,amountOutFormatted:Q.fromRaw(n,e.tokenOut).toUnit(),estimatedGasUsd:null,routeSteps:r.routeCallCount??1,isBest:false}}async buildSwapTx(e,r){e.swap({tokenIn:r.tokenIn,tokenOut:r.tokenOut,amountIn:Q.fromRaw(r.amountInRaw,r.tokenIn),slippageBps:qc(r.slippage),provider:this.id});}async isAvailable(){try{return this.wallet.listSwapProviders().includes(this.id)}catch{return false}}};function qc(t){return BigInt(Math.round(t*100))}var f5=class extends ay{id="avnu";name="AVNU";constructor(e){super(e);}};var p5=class extends ay{id="ekubo";name="Ekubo";constructor(e){super(e);}};var ohe="fibrous";function oa(t,e=ohe){let r=[new u5,new f5(t),new p5(t)];if(e==="auto")return r;let n=r.filter(o=>o.id===e);if(n.length===0)throw new he("PROVIDER_UNAVAILABLE",`Unknown swap provider: "${e}". Available: ${r.map(o=>o.id).join(", ")}`);return n}async function ahe(t){return Dt(async({session:e,wallet:r})=>{let n=ge(e),o=re(t.from_token,n),a=re(t.to_token,n),i=Q.parse(t.amount,o).toBase(),s=t.provider,c=oa(r,s),l=await ra(c,{tokenIn:o,tokenOut:a,amountInRaw:i}),d=na(l),u=l.length>1?P_(l[0].amountOutRaw,l[l.length-1].amountOutRaw):null;return we({success:true,bestProvider:d.provider,amountIn:`${t.amount} ${o.symbol}`,expectedAmountOut:`~${d.amountOutFormatted} ${a.symbol}`,...u?{savings:u}:{},quotes:l.map(p=>({provider:p.provider,amountOut:p.amountOutFormatted,isBest:p.isBest})),message:"Quote generated. Use swap_tokens to execute."})})}async function ihe(t){return Dt(async({session:e,wallet:r})=>{let n=ge(e),o=re(t.from_token,n),a=re(t.to_token,n),i=Q.parse(t.amount,o).toBase(),s=t.slippage??1,c=t.provider,l=oa(r,c),d=await ra(l,{tokenIn:o,tokenOut:a,amountInRaw:i,slippageBps:qc(s)}),u=na(d),p=di(l,u.provider),m=r.tx();if(await p.buildSwapTx(m,{tokenIn:o,tokenOut:a,amountInRaw:i,walletAddress:e.address,slippage:s}),t.simulate){let x=await Ye(m,n);return Zr(x,{amountIn:`${t.amount} ${o.symbol}`,expectedAmountOut:`~${u.amountOutFormatted} ${a.symbol}`,provider:u.provider})}let{hash:g,explorerUrl:b}=await po(m);return we({success:true,txHash:g,explorerUrl:b,amountIn:`${t.amount} ${o.symbol}`,amountOut:`~${u.amountOutFormatted} ${a.symbol}`,provider:u.provider,slippage:`${s}%`})})}nr();wr();$r();function sy(t,e){let r=e.toUpperCase(),n=t.find(o=>o.tokenSymbol.toUpperCase()===r);if(!n){let o=t.map(a=>a.tokenSymbol).join(", ");throw new he("POOL_NOT_FOUND",`No ${e} pool found for this validator. Available: ${o}`)}return n}async function md(t,e,r){let n=await t.getStakerPools(K(e));return Promise.all(n.map(async o=>{let a=r?await r.getPoolCommission(o.poolContract):void 0;return {poolContract:o.poolContract.toString(),tokenSymbol:o.token.symbol,amount:o.amount.toFormatted(true),commission:a}}))}async function m5(t,e,r,n="STRK",o){let a=re(n,o),i=Q.parse(r,a),s=await t.stake(K(e),i);return {hash:s.hash,explorerUrl:s.explorerUrl}}async function h5(t,e){let r=await t.getPoolPosition(K(e));if(!r||r.rewards.isZero())throw new he("STAKING_FAILED","No rewards to claim for this pool.");let n=await t.claimPoolRewards(K(e));return {hash:n.hash,explorerUrl:n.explorerUrl}}async function g5(t,e){let r=await t.getPoolPosition(K(e));if(!r||r.rewards.isZero())throw new he("STAKING_FAILED","No rewards to compound for this pool.");let n=r.rewards.toFormatted(true),o=await t.tx().claimPoolRewards(K(e)).stake(K(e),r.rewards).send();return await o.wait(),{hash:o.hash,explorerUrl:o.explorerUrl,compounded:n}}async function b5(t,e,r,n="STRK",o){let a=re(n,o),i=Q.parse(r,a),s=await t.exitPoolIntent(K(e),i);return {hash:s.hash,explorerUrl:s.explorerUrl}}async function y5(t,e){let r=await t.getPoolPosition(K(e));if(!r)throw new he("STAKING_FAILED","Not a member of this pool.");if(r.unpooling.isZero())throw new he("EXIT_NOT_READY","No exit intent declared. Call 'unstake intent' first.");if(r.unpoolTime&&new Date<r.unpoolTime)throw new he("EXIT_NOT_READY",`Cooldown period is still active. Please wait until ${r.unpoolTime.toLocaleString()}`);let n=await t.exitPool(K(e));return {hash:n.hash,explorerUrl:n.explorerUrl}}async function che(t,e){let r=await t.getPoolPosition(K(e));return r?{staked:r.staked.toFormatted(true),rewards:r.rewards.toFormatted(true),total:r.total.toFormatted(true),unpooling:r.unpooling.toFormatted(true),unpoolTime:r.unpoolTime??void 0,commissionPercent:r.commissionPercent}:null}async function cy(t,e,r,n,o){let{getValidators:a,findValidator:i}=await Promise.resolve().then(()=>($_(),she)),s=a(r);if(o){let m=i(o,r);if(m)s=[m];else throw new he("VALIDATOR_NOT_FOUND",`Validator '${o}' not found`)}let l=(await Promise.all(s.map(async m=>{try{return (await t.getStakerPools(m.stakerAddress)).map(b=>({validator:m.name,pool:b}))}catch{return []}}))).flat(),p=(await Promise.all(l.map(async({validator:m,pool:g})=>{let b;try{b=await e.getPoolPosition(g.poolContract);}catch{return null}return b?{validator:m,pool:g.poolContract.toString(),tokenSymbol:g.token.symbol,staked:b.staked,rewards:b.rewards,total:b.total,unpooling:b.unpooling,unpoolTime:b.unpoolTime??null,commissionPercent:b.commissionPercent}:null}))).filter(m=>m!==null).map(m=>({validator:m.validator,pool:m.pool,token:m.tokenSymbol,staked:m.staked.toFormatted(true),rewards:m.rewards.toFormatted(true),total:m.total.toFormatted(true),unpooling:m.unpooling.toFormatted(true),cooldownEndsAt:m.unpoolTime?m.unpoolTime.toISOString():null,commission:`${m.commissionPercent}%`}));return {network:r,address:n,positions:p}}$_();async function dhe(t){return Dt(async({session:e,wallet:r})=>{let n=(t.token??"STRK").toUpperCase(),o=await m5(r,t.pool,t.amount,n,ge(e));return we({success:true,txHash:o.hash,explorerUrl:o.explorerUrl,amount:`${t.amount} ${n}`,pool:t.pool})})}async function uhe(t){return Dt(async({session:e,wallet:r})=>{if(t.action==="intent"){if(!t.amount)return ic("Amount is required for exit intent.");let o=(t.token??"STRK").toUpperCase(),a=await b5(r,t.pool,t.amount,o,ge(e));return we({success:true,action:"exit_intent",txHash:a.hash,explorerUrl:a.explorerUrl,message:"Exit intent declared. Wait for cooldown period, then call with action='exit'."})}let n=await y5(r,t.pool);return we({success:true,action:"exit_complete",txHash:n.hash,explorerUrl:n.explorerUrl,message:"Tokens withdrawn from pool."})})}async function fhe(t){return _n(async({wallet:e})=>{let r=await che(e,t.pool);return r?we({isMember:true,pool:t.pool,staked:r.staked,rewards:r.rewards,total:r.total,unpooling:r.unpooling,cooldownEndsAt:r.unpoolTime?r.unpoolTime.toISOString():null,commissionPercent:r.commissionPercent}):we({isMember:false,pool:t.pool,message:"Not a member of this pool."})})}async function phe(t){return _n(async({session:e,sdk:r,wallet:n})=>{let o=Wc(t.validator,bt(e)),a=o?o.stakerAddress.toString():t.validator,i=await md(r,a,n);return we({validator:o?o.name:t.validator,stakerAddress:a,pools:i})})}async function mhe(){let t=Fe(),e=bt(t),r=iy(e);return we({network:e,count:r.length,validators:r.map(n=>({name:n.name,stakerAddress:n.stakerAddress.toString()}))})}async function hhe(t){return Dt(async({wallet:e})=>{let r=await h5(e,t.pool);return we({success:true,txHash:r.hash,explorerUrl:r.explorerUrl})})}async function ghe(t){return Dt(async({wallet:e})=>{let r=await g5(e,t.pool);return we({success:true,txHash:r.hash,explorerUrl:r.explorerUrl,compounded:r.compounded})})}async function bhe({validator:t}={}){return _n(async({session:e,sdk:r,wallet:n})=>{let o=await cy(r,n,bt(e),e.address,t);return we(o)})}async function yhe(t){let e=vn.getInstance();switch(t.action){case "set-rpc":return t.value?(e.set("rpcUrl",t.value),we({success:true,rpcUrl:t.value})):ic("RPC URL value is required.");case "get-rpc":{let r=e.get("rpcUrl");return we({rpcUrl:r||"default (Cartridge RPC)"})}case "set-network":return !t.value||!["mainnet","sepolia"].includes(t.value)?ic("Network must be 'mainnet' or 'sepolia'."):(e.set("network",t.value),we({success:true,network:t.value}));case "set-gasfree":{if(!t.value||!["on","off"].includes(t.value))return ic("Gasfree mode must be 'on' or 'off'.");let r=t.value==="on";return e.set("gasfreeMode",r),r&&e.delete("gasToken"),we({success:true,gasfreeMode:r,note:r?"Developer sponsors gas via Paymaster (requires API key + credits)":"Gasfree disabled \u2014 using gasless mode (default: STRK)"})}case "set-gas-token":{if(!t.value)return ic("Token symbol or 'reset' is required.");if(["off","reset","default"].includes(t.value.toLowerCase()))return e.delete("gasToken"),we({success:true,gasToken:"STRK",note:"Gas token reset to default: STRK"});let r=t.value.toUpperCase();return Rf.includes(r)?(e.delete("gasfreeMode"),e.set("gasToken",r),we({success:true,gasToken:r,note:`Gas paid in ${r} via Paymaster`})):ic(`Unsupported token '${t.value}'. Supported: ${Rf.join(", ")}`)}case "list":{let r=e.getAll(),n=r.gasfreeMode===true,o=r.gasToken,a="gasless (pays STRK via Paymaster)";return n?a="gasfree (developer-sponsored via Paymaster)":o&&(a=`gasless (pays ${o} via Paymaster)`),we({...r,feeMode:a})}case "reset":return e.clear(),we({success:true,note:"All settings reset to defaults."});default:return ic(`Unknown action: ${t.action}`)}}nr();dy();hh();wr();$r();Pf();async function The(t){return _n(async({wallet:e})=>{let r=await mh(e);if(t.name){let n=t.name.toLowerCase();r=r.filter(o=>o.name?.toLowerCase().includes(n));}return we({success:true,pools:r.map(n=>({name:n.name,poolContract:n.address}))})})}async function Ahe(t){return _n(async({session:e,wallet:r})=>{let n=ge(e),o=await Ur(r,t.pool),a=await Nf(r,o.address,t.collateral_token,n),i=null;return t.borrow_token&&(i=await Ws(r,o.address,t.collateral_token,t.borrow_token,n)),!i&&(!a||a==="0.0")?we({success:true,position:null,suppliedYield:null,message:"No active position or supply found for this pool and token."}):we({success:true,suppliedYield:a&&a!=="0.0"?`${a} ${t.collateral_token.toUpperCase()}`:null,position:i})})}async function khe(t){return Dt(async({session:e,wallet:r})=>{let n=ge(e),o=await Ur(r,t.pool),a=re(t.token,n),i=r.tx().lendDeposit({token:a,amount:Q.parse(t.amount,a),poolAddress:o.address?K(o.address):void 0});if(t.simulate){let l=await Ye(i,n);return Zr(l,{action:"supply",amount:`${t.amount} ${a.symbol}`,pool:o.name??o.address})}let{hash:s,explorerUrl:c}=await po(i);return we({success:true,action:"supply",amount:`${t.amount} ${a.symbol}`,pool:o.address,poolName:o.name,txHash:s,explorerUrl:c})})}async function Ehe(t){return Dt(async({session:e,wallet:r})=>{let n=ge(e),o=await Ur(r,t.pool),a=re(t.token,n),i=r.tx().lendWithdraw({token:a,amount:Q.parse(t.amount,a),poolAddress:o.address?K(o.address):void 0});if(t.simulate){let l=await Ye(i,n);return Zr(l,{action:"withdraw",amount:`${t.amount} ${a.symbol}`,pool:o.name??o.address})}let{hash:s,explorerUrl:c}=await po(i);return we({success:true,action:"withdraw",amount:`${t.amount} ${a.symbol}`,pool:o.address,poolName:o.name,txHash:s,explorerUrl:c})})}async function Ihe(t){return Dt(async({session:e,wallet:r})=>{let n=ge(e),o=await Ur(r,t.pool),a=re(t.collateral_token,n),i=re(t.borrow_token,n);if(t.use_supplied){let d=await Nf(r,o.address,t.collateral_token,n);if(!d||parseFloat(d)<parseFloat(t.collateral_amount))throw new he("INSUFFICIENT_BALANCE",`Insufficient supplied balance. You have ${d||"0"} ${t.collateral_token} supplied, but want to use ${t.collateral_amount} as collateral.`)}let s=r.tx().lendBorrow({collateralToken:a,debtToken:i,amount:Q.parse(t.borrow_amount,i),collateralAmount:Q.parse(t.collateral_amount,a),poolAddress:o.address?K(o.address):void 0,useEarnPosition:t.use_supplied||void 0});if(t.simulate){let d=await Ye(s,n);return Zr(d,{action:"borrow",collateral:`${t.collateral_amount} ${a.symbol}`,borrowed:`${t.borrow_amount} ${i.symbol}`,pool:o.name??o.address})}let{hash:c,explorerUrl:l}=await po(s);return we({success:true,action:"borrow",collateral:`${t.collateral_amount} ${a.symbol}`,borrowed:`${t.borrow_amount} ${i.symbol}`,pool:o.address,poolName:o.name,txHash:c,explorerUrl:l})})}async function Che(t){return Dt(async({session:e,wallet:r})=>{let n=ge(e),o=await Ur(r,t.pool),a=re(t.collateral_token,n),i=re(t.token,n),s=r.tx().lendRepay({collateralToken:a,debtToken:i,amount:Q.parse(t.amount,i),poolAddress:o.address?K(o.address):void 0});if(t.simulate){let d=await Ye(s,n);return Zr(d,{action:"repay",repaid:`${t.amount} ${i.symbol}`,pool:o.name??o.address})}let{hash:c,explorerUrl:l}=await po(s);return we({success:true,action:"repay",repaid:`${t.amount} ${i.symbol}`,pool:o.address,poolName:o.name,txHash:c,explorerUrl:l})})}async function Rhe(t){return Dt(async({session:e,wallet:r})=>{let n=ge(e),o=await Ur(r,t.pool),a=await Ws(r,o.address,t.collateral_token,t.debt_token,n);if(!a)throw new he("LENDING_FAILED","No active position found to close.");let i=re(t.collateral_token,n),s=re(t.debt_token,n),c=r.tx().lendRepay({collateralToken:i,debtToken:s,amount:Q.parse(a.debtAmount,s),withdrawCollateral:true,poolAddress:o.address?K(o.address):void 0});if(t.simulate){let u=await Ye(c,n);return Zr(u,{action:"close_position",pool:o.name??o.address})}let{hash:l,explorerUrl:d}=await po(c);return we({success:true,action:"close_position",pool:o.address,poolName:o.name,txHash:l,explorerUrl:d})})}async function Ohe(t){return _n(async({session:e,wallet:r})=>{let n=ge(e),o=await Ur(r,t.pool),a=re(t.collateral_token,n),i=re(t.debt_token,n),s=K(o.address),c=t.action==="deposit"||t.action==="withdraw"?a:i,l=t.action==="repay"?{action:"repay",request:{collateralToken:a,debtToken:i,amount:Q.parse(t.amount,c),poolAddress:s}}:t.action==="deposit"?{action:"deposit",request:{token:a,amount:Q.parse(t.amount,c),poolAddress:s}}:t.action==="withdraw"?{action:"withdraw",request:{token:a,amount:Q.parse(t.amount,c),poolAddress:s}}:{action:"borrow",request:{collateralToken:a,debtToken:i,amount:Q.parse(t.amount,c),poolAddress:s}},d=await r.lending().quoteHealth({action:l,health:{collateralToken:a,debtToken:i,poolAddress:s}}),u=d.current,p=d.projected,m=u&&Number(u.debtValue)>0?Number(u.collateralValue)/Number(u.debtValue):null,g=p&&Number(p.debtValue)>0?Number(p.collateralValue)/Number(p.debtValue):null;return we({success:true,pool:o.address,poolName:o.name,action:t.action,amount:`${t.amount} ${c.symbol}`,currentHealthFactor:m?.toFixed(4)??"\u221E",projectedHealthFactor:g?.toFixed(4)??"\u221E",riskChange:m&&g?g>m?"IMPROVING":g<m?"DECLINING":"STABLE":"UNKNOWN"})})}nr();wr();$r();var xHe="P1D";async function _5(t,e,r){let n=re(e.sellToken,r),o=re(e.buyToken,r),a=Q.parse(e.sellAmount,n),i=Q.parse(e.amountPerCycle,n),s=await t.dca().create({sellToken:n,buyToken:o,sellAmount:a,sellAmountPerCycle:i,frequency:e.frequency??xHe,provider:e.provider});return await s.wait(),{hash:s.hash,explorerUrl:s.explorerUrl}}async function S5(t,e){if(!e.orderId&&!e.orderAddress)throw new he("DCA_FAILED","Provide either orderId or orderAddress to cancel a DCA order.");let r=await t.dca().cancel({orderId:e.orderId,orderAddress:e.orderAddress,provider:e.provider});return await r.wait(),{hash:r.hash,explorerUrl:r.explorerUrl}}async function uy(t,e){return t.dca().getOrders({status:e?.status,provider:e?.provider,page:e?.page,size:e?.size})}async function T5(t,e,r){let n=re(e.sellToken,r),o=re(e.buyToken,r),a=Q.parse(e.amountPerCycle,n),i={sellToken:n,buyToken:o,sellAmountPerCycle:a,swapProvider:e.provider,chainId:r};return t.dca().previewCycle(i)}wr();nr();async function Nhe(t){return Dt(async({session:e,wallet:r})=>{let n=ge(e);if(t.simulate){let a=re(t.sell_token,n),i=re(t.buy_token,n),s=Q.parse(t.sell_amount,a),c=Q.parse(t.amount_per_cycle,a),l=r.tx().dcaCreate({sellToken:a,buyToken:i,sellAmount:s,sellAmountPerCycle:c,frequency:t.frequency??"P1D",provider:t.provider}),d=await Ye(l,n);return Zr(d,{sellAmount:t.sell_amount,sellToken:t.sell_token,buyToken:t.buy_token,amountPerCycle:t.amount_per_cycle,frequency:t.frequency??"P1D"})}let o=await _5(r,{sellToken:t.sell_token,buyToken:t.buy_token,sellAmount:t.sell_amount,amountPerCycle:t.amount_per_cycle,frequency:t.frequency,provider:t.provider},n);return we({success:true,txHash:o.hash,explorerUrl:o.explorerUrl,sellAmount:t.sell_amount,sellToken:t.sell_token,buyToken:t.buy_token,amountPerCycle:t.amount_per_cycle,frequency:t.frequency??"P1D"})})}async function $he(t){return _n(async({wallet:e})=>{let r=await uy(e,{status:t.status,provider:t.provider,page:t.page,size:t.size});return we({orders:r.content.map(n=>({id:n.id,orderAddress:n.orderAddress.toString(),provider:n.providerId,status:n.status,sellToken:n.sellTokenAddress.toString(),buyToken:n.buyTokenAddress.toString(),sellAmount:n.sellAmountBase.toString(),amountSold:n.amountSoldBase.toString(),amountBought:n.amountBoughtBase.toString(),frequency:n.frequency,iterations:n.iterations,executedTrades:n.executedTradesCount,startDate:n.startDate.toISOString(),endDate:n.endDate.toISOString()})),totalElements:r.totalElements,pageNumber:r.pageNumber,totalPages:r.totalPages})})}async function Dhe(t){return Dt(async({wallet:e})=>{let r=await S5(e,{orderId:t.order_id,orderAddress:t.order_address,provider:t.provider});return we({success:true,txHash:r.hash,explorerUrl:r.explorerUrl})})}async function Lhe(t){return _n(async({session:e,wallet:r})=>{let n=ge(e),o=await T5(r,{sellToken:t.sell_token,buyToken:t.buy_token,amountPerCycle:t.sell_amount_per_cycle,provider:t.provider},n);return we({sellToken:t.sell_token,buyToken:t.buy_token,sellAmountPerCycle:t.sell_amount_per_cycle,expectedOutputBase:o.amountOutBase.toString(),provider:o.provider,priceImpactBps:o.priceImpactBps?.toString()??null})})}O_();wr();dy();hh();nr();wr();var bF="USDC";function $o(t,e){let r={privateKey:e.privateKey,contractAddress:K(e.contractAddress),provider:t.getProvider()};return new C_(r)}async function fy(t){let e=await t.getState();return {balance:e.balance.toString(),pending:e.pending.toString(),nonce:e.nonce.toString(),address:t.address}}async function A5(t,e,r,n){let o=re(r.token??bF,n),a=Q.parse(r.amount,o),i=await t.tx().confidentialFund(e,{amount:a,sender:t.address}).send();return await i.wait(),{hash:i.hash,explorerUrl:i.explorerUrl}}async function k5(t,e,r,n){let o=re(r.token??bF,n),a=Q.parse(r.amount,o),i=await t.tx().confidentialTransfer(e,{amount:a,to:{x:r.recipientX,y:r.recipientY},sender:t.address}).send();return await i.wait(),{hash:i.hash,explorerUrl:i.explorerUrl}}async function E5(t,e,r,n){let o=re(r.token??bF,n),a=Q.parse(r.amount,o),i=await t.tx().confidentialWithdraw(e,{amount:a,to:K(r.to??t.address.toString()),sender:t.address}).send();return await i.wait(),{hash:i.hash,explorerUrl:i.explorerUrl}}async function I5(t,e,r){let n=K(r.to??t.address.toString()),o=await e.ragequit({to:n,sender:t.address}),a=await t.tx().add(...o).send();return await a.wait(),{hash:a.hash,explorerUrl:a.explorerUrl}}async function C5(t,e){let r=await e.rollover({sender:t.address}),n=await t.tx().add(...r).send();return await n.wait(),{hash:n.hash,explorerUrl:n.explorerUrl}}Vo();$r();var Bhe=S.object({privateKey:S.string().min(1),contractAddress:S.string().startsWith("0x")}),yF=join(L1,"confidential.json");function xF(){try{let t=readFileSync(yF,"utf-8"),e=Bhe.safeParse(JSON.parse(t));return e.success?e.data:null}catch{return null}}function R5(t){Bhe.parse(t),mkdirSync(L1,{recursive:true}),writeFileSync(yF,JSON.stringify(t,null,2),{encoding:"utf-8",mode:384}),chmodSync(yF,384);}function Ia(){let t=xF();if(!t)throw new he("CONFIDENTIAL_NOT_CONFIGURED","Tongo not configured. Run 'starkfi conf-setup --key <KEY> --contract <ADDRESS>' first.");return t}async function $f(t,e,r){let n=ge(r),[o,a,i,s,c]=await Promise.allSettled([kHe(e,n),EHe(t,e,r),CHe(e,n),RHe(e),OHe(e)]),l=o.status==="fulfilled"?o.value:[],d=a.status==="fulfilled"?a.value:[],u=i.status==="fulfilled"?i.value:[],p=s.status==="fulfilled"?s.value:[],m=c.status==="fulfilled"?c.value:null,g=l.reduce((x,v)=>x+v.usdValue,0),b=d.reduce((x,v)=>x+v.usdValue,0);return {address:r.address,network:bt(r),balances:l,staking:d,lending:u,dca:p,confidential:m,totalUsdValue:g+b}}var AHe=5;async function kHe(t,e){let r=await oy(t,e);return (await d5(r,AHe,async o=>{let a=0;try{let i=re(o.symbol,e),s=await ny(i,e);a=parseFloat(o.balance)*s;}catch{}return {symbol:o.symbol,name:o.name,amount:o.balance,usdValue:a}})).sort((o,a)=>a.usdValue-o.usdValue)}async function EHe(t,e,r){let n=await cy(t,e,bt(r),r.address);if(n.positions.length===0)return [];let o=[...new Set(n.positions.map(s=>s.token))],a=await Promise.allSettled(o.map(async s=>{try{let c=re(s,ge(r));return {symbol:s,price:await ny(c,ge(r))}}catch{return {symbol:s,price:0}}})),i=new Map;for(let s of a)s.status==="fulfilled"&&i.set(s.value.symbol,s.value.price);return n.positions.map(s=>({validator:s.validator,pool:s.pool,token:s.token,staked:s.staked,rewards:s.rewards,unpooling:s.unpooling,cooldownEndsAt:s.cooldownEndsAt,usdValue:IHe(s.total)*(i.get(s.token)??0)}))}function IHe(t){let e=t.match(/([\d.]+)/);return e?parseFloat(e[1]):0}async function CHe(t,e){let r=await mh(t),n=[];for(let o of r){let a=await v5(t,o.address),s=[...new Set(a.map(c=>c.asset.symbol))].map(async c=>{let l=await Nf(t,o.address,c,e);l&&l!=="0"&&n.push({pool:o.name??o.address,asset:c,supplied:l});});await Promise.allSettled(s);}return n}async function RHe(t){try{return (await uy(t,{status:"ACTIVE"})).content.map(r=>({id:r.id.slice(0,8),orderAddress:r.orderAddress.toString(),provider:r.providerId,status:r.status,frequency:r.frequency,trades:`${r.executedTradesCount}/${r.iterations}`}))}catch{return []}}async function OHe(t,e){try{let r=xF();if(!r)return null;let n=$o(t,r),o=await fy(n),a="balance"in o?BigInt(o.balance):0n,i="pending"in o?BigInt(o.pending):0n,s=c=>{let l=c.toString().padStart(7,"0"),d=l.slice(0,-6)||"0",u=l.slice(-6).replace(/0+$/,"");return u?`${d}.${u}`:d};return {address:o.address,activeBalance:`${s(a)} USDC`,pendingBalance:`${s(i)} USDC`}}catch{return null}}async function Mhe(){return _n(async({session:t,sdk:e,wallet:r})=>{let n=await $f(e,r,t);return we(n)})}nr();wr();Pf();function Fhe(t,e){return t.map(r=>{let n=re(r.from_token,e),o=re(r.to_token,e),a=Q.parse(r.amount,n).toBase();return {tokenIn:n,tokenOut:o,amountInRaw:a}})}async function zhe(t){return Dt(async({session:e,wallet:r})=>{let n=ge(e),o=Fhe(t.swaps,n),a=t.provider,i=oa(r,a),s=await Promise.all(o.map(async(c,l)=>{let d=await ra(i,{tokenIn:c.tokenIn,tokenOut:c.tokenOut,amountInRaw:c.amountInRaw}),u=na(d);return {amountIn:`${t.swaps[l].amount} ${c.tokenIn.symbol}`,expectedAmountOut:`~${u.amountOutFormatted} ${c.tokenOut.symbol}`,provider:u.provider}}));return we({success:true,quotes:s,message:"Quotes generated. Use multi_swap to execute."})})}async function Hhe(t){return Dt(async({session:e,wallet:r})=>{let n=ge(e),o=Fhe(t.swaps,n),a=t.slippage??1,i=t.provider,s=oa(r,i),c=r.tx(),l=[];for(let p=0;p<o.length;p++){let m=o[p],g=await ra(s,{tokenIn:m.tokenIn,tokenOut:m.tokenOut,amountInRaw:m.amountInRaw,slippageBps:qc(a)}),b=na(g);await di(s,b.provider).buildSwapTx(c,{tokenIn:m.tokenIn,tokenOut:m.tokenOut,amountInRaw:m.amountInRaw,walletAddress:e.address,slippage:a}),l.push({amountIn:`${t.swaps[p].amount} ${m.tokenIn.symbol}`,expectedAmountOut:`~${b.amountOutFormatted} ${m.tokenOut.symbol}`,provider:b.provider});}if(t.simulate){let p=await Ye(c,n);return Zr(p,{swaps:l})}let{hash:d,explorerUrl:u}=await po(c);return we({success:true,txHash:d,explorerUrl:u,swaps:l,slippage:`${a}%`})})}nr();wr();hh();$_();Vo();var PHe=S.string().regex(/^0x[0-9a-fA-F]{1,64}$/,"Invalid Starknet address");function Kc(t){return PHe.parse(t)}$r();async function O5(t,e,r,n){if(r.length<2)throw new he("INVALID_AMOUNT","Batch requires at least 2 operations. Use individual commands for single operations.");let o=t.tx(),a=[],i=oa(t);for(let s of r){switch(s.type){case "swap":await NHe(o,s.params,i,e,n);break;case "stake":await $He(o,s.params,t,e,n);break;case "supply":await DHe(o,s.params,t,e,n);break;case "send":await LHe(o,s.params,n);break;case "dca-create":UHe(o,s.params,n);break;case "dca-cancel":BHe(o,s.params);break;case "borrow":await MHe(o,s.params,t,n);break;case "repay":await FHe(o,s.params,t,n);break;case "withdraw":await zHe(o,s.params,t,n);break;default:throw new he("INVALID_CONFIG",`Unknown batch operation type: ${String(s.type)}`)}a.push(HHe(s));}return {builder:o,summary:a}}async function NHe(t,e,r,n,o){let a=re(e.from_token,o),i=re(e.to_token,o),c=Q.parse(e.amount,a).toBase(),l=await ra(r,{tokenIn:a,tokenOut:i,amountInRaw:c}),d=na(l);await di(r,d.provider).buildSwapTx(t,{tokenIn:a,tokenOut:i,amountInRaw:c,walletAddress:n.address,slippage:e.slippage??1});}async function $He(t,e,r,n,o){let a=(e.token??"STRK").toUpperCase(),i=re(a,o),s=Q.parse(e.amount,i),c=e.pool;if(!c&&e.validator){let{sdk:l}=await je(n),d=Wc(e.validator,bt(n));if(!d)throw new he("VALIDATOR_NOT_FOUND",`Validator '${e.validator}' not found`);let u=await md(l,d.stakerAddress.toString());c=sy(u,a).poolContract;}if(!c)throw new he("INVALID_CONFIG","Stake operation requires pool or validator");t.stake(K(Kc(c)),s);}async function DHe(t,e,r,n,o){let a=re(e.token,o),i=Q.parse(e.amount,a),s=await Ur(r,e.pool);t.lendDeposit({token:a,amount:i,poolAddress:K(s.address)});}async function LHe(t,e,r){let n=re(e.token,r),o=Q.parse(e.amount,n),a=Kc(e.to);t.transfer(n,{to:K(a),amount:o});}function UHe(t,e,r){let n=re(e.sell_token,r),o=re(e.buy_token,r),a=Q.parse(e.sell_amount,n),i=Q.parse(e.amount_per_cycle,n);t.dcaCreate({sellToken:n,buyToken:o,sellAmount:a,sellAmountPerCycle:i,frequency:e.frequency??"P1D",provider:e.provider});}function BHe(t,e){if(!e.order_id&&!e.order_address)throw new he("DCA_FAILED","DCA cancel in batch requires order_id or order_address.");t.dcaCancel({orderId:e.order_id,orderAddress:e.order_address,provider:e.provider});}async function MHe(t,e,r,n){let o=re(e.collateral_token,n),a=re(e.borrow_token,n),i=await Ur(r,e.pool);t.lendBorrow({collateralToken:o,debtToken:a,amount:Q.parse(e.borrow_amount,a),collateralAmount:Q.parse(e.collateral_amount,o),poolAddress:K(i.address)});}async function FHe(t,e,r,n){let o=re(e.collateral_token,n),a=re(e.token,n),i=await Ur(r,e.pool);t.lendRepay({collateralToken:o,debtToken:a,amount:Q.parse(e.amount,a),poolAddress:K(i.address)});}async function zHe(t,e,r,n){let o=re(e.token,n),a=await Ur(r,e.pool);t.lendWithdraw({token:o,amount:Q.parse(e.amount,o),poolAddress:K(a.address)});}function HHe(t){let e=t.params;switch(t.type){case "swap":{let r=e;return `swap ${r.amount} ${r.from_token.toUpperCase()} \u2192 ${r.to_token.toUpperCase()}`}case "stake":{let r=e;return `stake ${r.amount} ${(r.token??"STRK").toUpperCase()}`}case "supply":{let r=e;return `supply ${r.amount} ${r.token.toUpperCase()}`}case "send":{let r=e;return `send ${r.amount} ${r.token.toUpperCase()} \u2192 ${r.to.slice(0,10)}\u2026`}case "dca-create":{let r=e;return `dca-create ${r.sell_amount} ${r.sell_token.toUpperCase()} \u2192 ${r.buy_token.toUpperCase()} (${r.amount_per_cycle}/cycle)`}case "dca-cancel":{let r=e;return `dca-cancel ${r.order_id??r.order_address??"unknown"}`}case "borrow":{let r=e;return `borrow ${r.borrow_amount} ${r.borrow_token.toUpperCase()} (collateral: ${r.collateral_amount} ${r.collateral_token.toUpperCase()})`}case "repay":{let r=e;return `repay ${r.amount} ${r.token.toUpperCase()}`}case "withdraw":{let r=e;return `withdraw ${r.amount} ${r.token.toUpperCase()}`}default:return `${t.type}: ${JSON.stringify(e)}`}}Pf();async function Vhe(t){return Dt(async({session:e,wallet:r})=>{let n=ge(e),o=t.operations.map(l=>({type:l.type,params:l.params})),{builder:a,summary:i}=await O5(r,e,o,n);if(t.simulate){let l=await Ye(a,n);return Zr(l,{operations:i})}let{hash:s,explorerUrl:c}=await po(a);return we({success:true,txHash:s,explorerUrl:c,operations:i})})}_F();TF();async function Zhe(t){return _n(async({session:e,wallet:r})=>{let n=ge(e),o=t.warning_threshold?{warningThreshold:t.warning_threshold}:void 0;if(t.pool){if(!t.collateral_token||!t.borrow_token)return we({success:false,error:"collateral_token and borrow_token are required when specifying a pool"});let s=await wF(r,t.pool,t.collateral_token,t.borrow_token,o,n);return we({success:true,positions:[s]})}let a=await vF(r,o,n),i=a.filter(s=>s.alert!==null);return we({success:true,positions:a,alertCount:i.length})})}async function qhe(t){return Dt(async({session:e,wallet:r})=>{let n=await SF(r,e,{pool:t.pool,collateralToken:t.collateral_token,debtToken:t.borrow_token,strategy:t.strategy??"auto",targetHealthFactor:t.target_health_factor,simulate:t.simulate},ge(e));return we({success:true,...n})})}nr();wr();$r();Pf();function P5(t,e){let r=t.split(",").map(a=>a.trim()).filter(Boolean);if(r.length===0)throw new he("INVALID_ALLOCATION",'Invalid allocation format. Expected: "50 ETH, 30 USDC, 20 STRK"');let n=r.map(a=>{let i=a.match(/^(\d+(?:\.\d+)?)\s+(\w+)$/);if(!i)throw new he("INVALID_ALLOCATION",`Invalid allocation entry: "${a}". Expected format: "50 ETH"`);let s=parseFloat(i[1]),c=i[2].toUpperCase();return re(c,e),{symbol:c,percentage:s}}),o=n.reduce((a,i)=>a+i.percentage,0);if(Math.abs(o-100)>.01)throw new he("INVALID_ALLOCATION",`Allocations must sum to 100%. Current total: ${o.toFixed(2)}%`);return n}async function N5(t,e,r){let n=new Map,o=0;for(let p of t.balances){let m=p.usdValue,g=p.symbol.toUpperCase();n.set(g,(n.get(g)??0)+m),o+=m;}if(o<=0)throw new he("REBALANCE_FAILED","Portfolio has no USD value. Cannot calculate rebalance plan.");let a=[...n.entries()].map(([p,m])=>({symbol:p,percentage:m/o*100,usdValue:m})),i=new Map;for(let[p,m]of n){let b=(e.find(x=>x.symbol===p)?.percentage??0)/100*o;i.set(p,b-m);}for(let p of e)if(!i.has(p.symbol)){let m=p.percentage/100*o;i.set(p.symbol,m);}let s=[],c=[];for(let[p,m]of i)m<-1?s.push({symbol:p,usdAmount:Math.abs(m)}):m>1&&c.push({symbol:p,usdAmount:m});let l=[],d=0,u=0;for(;d<s.length&&u<c.length;){let p=s[d],m=c[u],g=Math.min(p.usdAmount,m.usdAmount),b=re(p.symbol,r),x=t.balances.find(I=>I.symbol.toUpperCase()===p.symbol),v=parseFloat(x?.amount??"0"),E=v>0?(x?.usdValue??0)/v:0,A=E>0?g/E:0;A>0&&l.push({action:"sell",fromToken:p.symbol,toToken:m.symbol,amount:A.toFixed(b.decimals),usdValue:g}),p.usdAmount-=g,m.usdAmount-=g,p.usdAmount<1&&d++,m.usdAmount<1&&u++;}return {currentAllocations:a,targetAllocations:e,totalUsdValue:o,trades:l}}async function $5(t,e,r,n){if(r.trades.length===0)return {plan:r};let o=ge(e),a=n?.slippage??1,i=t.tx(),s=oa(t);for(let d of r.trades){let u=re(d.fromToken,o),p=re(d.toToken,o),g=Q.parse(d.amount,u).toBase(),b=await ra(s,{tokenIn:u,tokenOut:p,amountInRaw:g}),x=na(b);await di(s,x.provider).buildSwapTx(i,{tokenIn:u,tokenOut:p,amountInRaw:g,walletAddress:e.address,slippage:a});}if(n?.simulate){let d=await Ye(i,o);return {plan:r,simulation:d}}let{hash:c,explorerUrl:l}=await po(i);return {plan:r,txHash:c,explorerUrl:l}}async function Whe(t){return Dt(async({session:e,sdk:r,wallet:n})=>{let o=ge(e),a=P5(t.target,o),i=await $f(r,n,e),s=await N5(i,a,o);if(s.trades.length===0)return we({success:true,message:"Portfolio is already balanced \u2014 no trades needed",plan:s});let c=await $5(n,e,s,{slippage:t.slippage,simulate:t.simulate});return c.simulation?Zr(c.simulation,{plan:c.plan}):we({success:true,...c})})}wr();nr();async function Khe(t){return R5({privateKey:t.tongo_key,contractAddress:t.contract_address}),we({success:true,message:"Tongo configuration saved."})}async function Xhe(){return _n(async({wallet:t})=>{let e=Ia(),r=$o(t,e),n=await fy(r);return we({address:n.address,balance:n.balance,pending:n.pending,nonce:n.nonce})})}async function Yhe(t){return Dt(async({session:e,wallet:r})=>{let n=ge(e),o=Ia(),a=$o(r,o);if(t.simulate){let s=re(t.token??"USDC",n),c=Q.parse(t.amount,s),l=r.tx().confidentialFund(a,{amount:c,sender:r.address}),d=await Ye(l,n);return Zr(d,{amount:t.amount,token:t.token??"USDC",operation:"confidential-fund"})}let i=await A5(r,a,{amount:t.amount,token:t.token},n);return we({success:true,txHash:i.hash,explorerUrl:i.explorerUrl,amount:t.amount,token:t.token??"USDC"})})}async function Qhe(t){return Dt(async({session:e,wallet:r})=>{let n=ge(e),o=Ia(),a=$o(r,o);if(t.simulate){let s=re(t.token??"USDC",n),c=Q.parse(t.amount,s),l=r.tx().confidentialTransfer(a,{amount:c,to:{x:t.recipient_x,y:t.recipient_y},sender:r.address}),d=await Ye(l,n);return Zr(d,{amount:t.amount,token:t.token??"USDC",operation:"confidential-transfer"})}let i=await k5(r,a,{amount:t.amount,recipientX:t.recipient_x,recipientY:t.recipient_y,token:t.token},n);return we({success:true,txHash:i.hash,explorerUrl:i.explorerUrl,amount:t.amount,token:t.token??"USDC"})})}async function e0e(t){return Dt(async({session:e,wallet:r})=>{let n=ge(e),o=Ia(),a=$o(r,o);if(t.simulate){let s=re(t.token??"USDC",n),c=Q.parse(t.amount,s),l=r.tx().confidentialWithdraw(a,{amount:c,to:t.to?K(t.to):r.address,sender:r.address}),d=await Ye(l,n);return Zr(d,{amount:t.amount,token:t.token??"USDC",to:t.to??"own wallet",operation:"confidential-withdraw"})}let i=await E5(r,a,{amount:t.amount,to:t.to,token:t.token},n);return we({success:true,txHash:i.hash,explorerUrl:i.explorerUrl,amount:t.amount,token:t.token??"USDC",to:t.to??"own wallet"})})}async function t0e(t){return Dt(async({wallet:e})=>{let r=Ia(),n=$o(e,r),o=await I5(e,n,{to:t.to});return we({success:true,txHash:o.hash,explorerUrl:o.explorerUrl,to:t.to??"own wallet"})})}async function r0e(){return Dt(async({wallet:t})=>{let e=Ia(),r=$o(t,e),n=await C5(t,r);return we({success:true,txHash:n.hash,explorerUrl:n.explorerUrl})})}$r();function Ze(t){return async(...e)=>{try{return await t(...e)}catch(r){let n=r instanceof he,o=r instanceof Error?r.message:String(r);return we({success:false,error:g2(o),code:n?r.code:"UNKNOWN_ERROR",...n&&r.details?{details:r.details}:{}})}}}function n0e(t){return t.tool("get_auth_status","Check authentication status and Fibrous API health on Starknet. Use this to verify the user's active wallet.",{},{readOnlyHint:true,destructiveHint:false},Ze(Vme)),t.tool("config_action","View and modify starkfi global configuration such as active network, RPC URL, and Gas Payment mechanisms.",{action:S.enum(["list","set-rpc","get-rpc","set-network","set-gasfree","set-gas-token","reset"]).describe("list: view all. reset: clear all settings to defaults. set-gasfree: dev pays gas using paymaster credits. set-gas-token: user pays gas in ERC20 token instead of STRK."),value:S.string().optional().describe("set-gasfree: 'on'/'off'. set-gas-token: symbol 'USDC'/'ETH' or 'off'. set-rpc: URL string. set-network: 'mainnet'/'sepolia'.")},{readOnlyHint:false,destructiveHint:false},Ze(yhe)),2}Vo();function o0e(t){return t.tool("get_tx_status","Check Starknet transaction status by hash. Use this to verify if a recently submitted transaction has been accepted on L2 or L1.",{hash:S.string().describe("Transaction hash (0x...)")},{readOnlyHint:true,destructiveHint:false},Ze(ehe)),t.tool("get_balance","Get native token and ERC-20 token balances on Starknet for the authorized user.",{token:S.string().optional().describe("Specific token symbol (e.g. 'STRK', 'ETH', 'USDC'). Omit to fetch all balances.")},{readOnlyHint:true,destructiveHint:false},Ze(Xme)),t.tool("deploy_account","Deploy the Starknet smart contract account on-chain. Required once before sending transactions. Safe to call multiple times (idempotent) \u2014 returns status if already deployed.",{},{readOnlyHint:false,destructiveHint:true,idempotentHint:true},Ze(Yme)),t.tool("send_tokens","Transfer tokens to a recipient on Starknet. Set simulate=true to estimate fees without executing.",{amount:S.string().describe("Amount to send (e.g. '0.1', '100')"),token:S.string().describe("Token symbol (e.g. 'STRK', 'ETH', 'USDC')"),recipient:S.string().describe("Recipient Starknet address (0x...)"),simulate:S.boolean().optional().describe("Set true to simulate only \u2014 estimates fees without sending a transaction")},{readOnlyHint:false,destructiveHint:true,idempotentHint:false},Ze(Qme)),t.tool("get_portfolio","Get complete DeFi portfolio overview: all token balances (with USD values), staking positions, lending positions, DCA orders, and confidential Tongo balances in one call.",{},{readOnlyHint:true,destructiveHint:false},Ze(Mhe)),t.tool("rebalance_portfolio","Rebalance portfolio to match a target allocation. Calculates optimal swaps and executes as a single batch transaction. Supports simulation.",{target:S.string().describe('Target allocation, e.g. "50 ETH, 30 USDC, 20 STRK"'),slippage:S.number().optional().describe("Slippage tolerance % (default: 1)"),simulate:S.boolean().optional().describe("Set true to preview plan without executing")},{readOnlyHint:false,destructiveHint:true,idempotentHint:false},Ze(Whe)),6}Vo();var D5=S.enum(["auto","fibrous","avnu","ekubo"]).optional().default("fibrous").describe("Swap provider: fibrous (default), avnu, ekubo, or auto (race all)");function a0e(t){t.tool("get_swap_quote","Get a swap quote via Fibrous (default). Use provider='auto' to race all providers for best price. ALWAYS use this BEFORE calling swap_tokens so the user can review the expected output.",{amount:S.string().describe("Amount to swap in (e.g. '0.1', '100')"),from_token:S.string().describe("Source token symbol to sell (e.g. 'ETH', 'USDC')"),to_token:S.string().describe("Destination token symbol to buy (e.g. 'STRK', 'DAI')"),provider:D5},{readOnlyHint:true,destructiveHint:false},Ze(ahe)),t.tool("swap_tokens","Execute a token swap via Fibrous (default) or a specified provider. Set simulate=true to estimate fees without executing. ONLY call this after showing the user a quote via get_swap_quote.",{amount:S.string().describe("Amount to swap in (e.g. '0.1', '100')"),from_token:S.string().describe("Source token symbol to sell (e.g. 'ETH', 'STRK')"),to_token:S.string().describe("Destination token symbol to buy (e.g. 'USDC', 'DAI')"),slippage:S.number().optional().describe("Slippage tolerance % (default: 1)"),simulate:S.boolean().optional().describe("Set true to simulate only \u2014 estimates fees without sending a transaction"),provider:D5},{readOnlyHint:false,destructiveHint:true,idempotentHint:false},Ze(ihe));let e=S.object({amount:S.string().describe("Amount to swap in (e.g. '100', '0.5')"),from_token:S.string().describe("Source token symbol (e.g. 'USDC', 'ETH')"),to_token:S.string().describe("Destination token symbol (e.g. 'ETH', 'STRK')")});return t.tool("get_multi_swap_quote","Get multi-swap quotes via Fibrous (default) or a specified provider per pair.",{swaps:S.array(e).min(2).max(3).describe("Array of swap pairs (2-3 items)"),provider:D5},{readOnlyHint:true,destructiveHint:false},Ze(zhe)),t.tool("multi_swap","Execute multiple token swaps via Fibrous (default) in a single transaction. Call get_multi_swap_quote first to preview.",{swaps:S.array(e).min(2).max(3).describe("Array of swap pairs (2-3 items)"),slippage:S.number().optional().describe("Slippage tolerance % (default: 1)"),simulate:S.boolean().optional().describe("Set true to simulate only \u2014 estimates fees without executing"),provider:D5},{readOnlyHint:false,destructiveHint:true,idempotentHint:false},Ze(Hhe)),t.tool("batch_execute","Execute multiple DeFi operations in a single Starknet transaction (multicall). Supports: swap, stake, supply, send, borrow, repay, withdraw, dca-create, dca-cancel. Requires at least 2 operations.",{operations:S.array(S.object({type:S.enum(["swap","stake","supply","send","borrow","repay","withdraw","dca-create","dca-cancel"]).describe("Operation type"),params:S.record(S.string(),S.string()).describe("Operation params. swap: {amount, from_token, to_token}. stake: {amount, token?, pool? or validator?}. supply: {amount, token, pool}. send: {amount, token, to}. borrow: {collateral_amount, collateral_token, borrow_amount, borrow_token, pool}. repay: {amount, token, collateral_token, pool}. withdraw: {amount, token, pool}. dca-create: {sell_amount, sell_token, buy_token, amount_per_cycle, frequency?}. dca-cancel: {order_id?, order_address?, provider?}.")})).min(2).describe("Array of operations to batch (min 2)"),simulate:S.boolean().optional().describe("Set true to simulate only \u2014 estimates fees without executing")},{readOnlyHint:false,destructiveHint:true,idempotentHint:false},Ze(Vhe)),5}Vo();function i0e(t){return t.tool("list_validators","List all known Starknet staking validators. Use this FIRST to see available validators and their names before trying to find pools.",{},{readOnlyHint:true,destructiveHint:false},Ze(mhe)),t.tool("list_pools","List delegation pools for a specific validator. Look up a validator name via list_validators first.",{validator:S.string().describe("Validator name (e.g. 'Karnot', 'Kakarot') or staker address. Supports partial matches.")},{readOnlyHint:true,destructiveHint:false},Ze(phe)),t.tool("get_staking_info","Get staking position info (staked balance, unclaimed rewards, total balance, commission, unpooling cooldown) for a specific pool contract.",{pool:S.string().describe("Staking pool contract address (0x...)")},{readOnlyHint:true,destructiveHint:false},Ze(fhe)),t.tool("get_stake_status","Scan ALL known validators and pools to return a consolidated staking dashboard with total staked, total rewards, total value, and per-pool breakdown. Use this to give the user a full picture of their staking portfolio.",{validator:S.string().optional().describe("Optional validator name or staker address to strictly filter results.")},{readOnlyHint:true,destructiveHint:false},Ze(bhe)),t.tool("stake_tokens","Stake tokens in a delegation pool on Starknet. Smart stake: auto-detects whether the user needs to enter the pool or just add to an existing delegation. Supports STRK, WBTC, tBTC, SolvBTC, LBTC.",{amount:S.string().describe("Amount to stake (e.g. '100', '0.01')"),pool:S.string().describe("Staking pool contract address (0x...)"),token:S.string().optional().describe("Token symbol to stake (default: STRK). Supported: STRK, WBTC, tBTC, SolvBTC, LBTC")},{readOnlyHint:false,destructiveHint:true,idempotentHint:false},Ze(dhe)),t.tool("unstake_tokens","Unstake tokens from a pool. Unstaking is a TWO-STEP process: 1. call with action='intent', 2. wait for cooldown, 3. call with action='exit' to complete withdrawal.",{action:S.enum(["intent","exit"]).describe("'intent' strictly starts the unstaking process, 'exit' completes withdrawal after cooldown."),pool:S.string().describe("Staking pool contract address (0x...)"),amount:S.string().optional().describe("Amount to unstake (ONLY required when action='intent')"),token:S.string().optional().describe("Token symbol (default: STRK). Must match the pool's token.")},{readOnlyHint:false,destructiveHint:true,idempotentHint:false},Ze(uhe)),t.tool("claim_rewards","Extract earned rewards from a staking pool to the user's wallet.",{pool:S.string().describe("Staking pool contract address (0x...)")},{readOnlyHint:false,destructiveHint:true,idempotentHint:false},Ze(hhe)),t.tool("compound_rewards","Atomically claim staking rewards and re-stake them recursively into the same pool in a single transaction (compound interest).",{pool:S.string().describe("Staking pool contract address (0x...)")},{readOnlyHint:false,destructiveHint:true,idempotentHint:false},Ze(ghe)),8}Vo();function s0e(t){return t.tool("list_lending_pools","List available Vesu V2 lending pools on Starknet with their supported collateral/debt pairs. Use this FIRST to discover available pools before supplying, borrowing, or checking positions.",{name:S.string().optional().describe("Filter pools by name (partial match). Omit to list all.")},{readOnlyHint:true,destructiveHint:false},Ze(The)),t.tool("get_lending_position","Get the user's lending position (supplied collateral and outstanding debt) in a specific Vesu pool.",{pool:S.string().describe("Pool name (e.g. 'Prime', 'Re7') or contract address (0x...)"),collateral_token:S.string().describe("Collateral token symbol (e.g. 'ETH', 'STRK')"),borrow_token:S.string().optional().describe("Borrow token symbol (e.g. 'USDC', 'USDT')")},{readOnlyHint:true,destructiveHint:false},Ze(Ahe)),t.tool("supply_assets","Supply (lend) tokens into a Vesu V2 pool to earn interest as an earn position.",{pool:S.string().describe("Pool name (e.g. 'Prime', 'Re7') or contract address (0x...)"),amount:S.string().describe("Amount to supply (e.g. '100', '0.5')"),token:S.string().describe("Token symbol to supply (e.g. 'STRK', 'ETH', 'USDC')"),simulate:S.boolean().optional().describe("Set true to estimate fees without executing")},{readOnlyHint:false,destructiveHint:true,idempotentHint:false},Ze(khe)),t.tool("withdraw_assets","Withdraw previously supplied tokens from a Vesu V2 lending pool.",{pool:S.string().describe("Pool name (e.g. 'Prime', 'Re7') or contract address (0x...)"),amount:S.string().describe("Amount to withdraw (e.g. '100', '0.5')"),token:S.string().describe("Token symbol to withdraw (e.g. 'STRK', 'ETH', 'USDC')"),simulate:S.boolean().optional().describe("Set true to estimate fees without executing")},{readOnlyHint:false,destructiveHint:true,idempotentHint:false},Ze(Ehe)),t.tool("borrow_assets","Borrow tokens from a Vesu V2 pool by supplying collateral. Atomically deposits collateral and borrows the debt asset in a single transaction.",{pool:S.string().describe("Pool name (e.g. 'Prime', 'Re7') or contract address (0x...)"),collateral_amount:S.string().describe("Collateral amount to deposit (e.g. '1000')"),collateral_token:S.string().describe("Collateral token symbol (e.g. 'STRK', 'ETH')"),borrow_amount:S.string().describe("Amount to borrow (e.g. '100')"),borrow_token:S.string().describe("Token to borrow (e.g. 'USDC', 'USDT')"),use_supplied:S.boolean().optional().describe("Set to true to use previously supplied yield tokens as collateral via Multicall instead of transferring fresh tokens from wallet."),simulate:S.boolean().optional().describe("Set true to estimate fees without executing")},{readOnlyHint:false,destructiveHint:true,idempotentHint:false},Ze(Ihe)),t.tool("repay_debt","Repay borrowed tokens on an existing Vesu V2 lending position. Approves and repays the specified amount of debt.",{pool:S.string().describe("Pool name (e.g. 'Prime', 'Re7') or contract address (0x...)"),amount:S.string().describe("Amount to repay (e.g. '50', '100')"),token:S.string().describe("Token to repay (e.g. 'USDC', 'USDT')"),collateral_token:S.string().describe("Collateral token of the position (e.g. 'ETH', 'STRK'). Needed to identify the position."),simulate:S.boolean().optional().describe("Set true to estimate fees without executing")},{readOnlyHint:false,destructiveHint:true,idempotentHint:false},Ze(Che)),t.tool("close_position","Atomically close an active Vesu V2 lending position. Repays all outstanding debt and withdraws all collateral in a single transaction.",{pool:S.string().describe("Pool name (e.g. 'Prime', 'Re7') or contract address (0x...)"),collateral_token:S.string().describe("Collateral token symbol of the position (e.g. 'STRK', 'ETH')"),debt_token:S.string().describe("Borrowed token symbol of the position (e.g. 'USDC', 'USDT')"),simulate:S.boolean().optional().describe("Set true to estimate fees without executing")},{readOnlyHint:false,destructiveHint:true,idempotentHint:false},Ze(Rhe)),t.tool("monitor_lending_position","Monitor health factors across lending positions. Returns alerts and recommendations when health factor drops below thresholds. Omit pool to scan all pools.",{pool:S.string().optional().describe("Pool name or address. Omit to scan all pools."),collateral_token:S.string().optional().describe("Collateral token symbol (required with pool)"),borrow_token:S.string().optional().describe("Debt token symbol (required with pool)"),warning_threshold:S.number().optional().describe("Custom warning threshold (default: 1.3)")},{readOnlyHint:true,destructiveHint:false},Ze(Zhe)),t.tool("auto_rebalance_lending","Automatically adjust a lending position's health factor via repay or add-collateral. Supports simulation mode.",{pool:S.string().describe("Pool name or address"),collateral_token:S.string().describe("Collateral token symbol"),borrow_token:S.string().describe("Debt token symbol"),strategy:S.enum(["repay","add-collateral","auto"]).optional().describe("Adjustment strategy (default: auto)"),target_health_factor:S.number().optional().describe("Target health factor (default: 1.3)"),simulate:S.boolean().optional().describe("Set true to estimate fees without executing")},{readOnlyHint:false,destructiveHint:true,idempotentHint:false},Ze(qhe)),t.tool("lending_quote_health","Simulate the impact of a lending action (borrow, repay, deposit, withdraw) on position health factor WITHOUT executing. Returns current and projected health.",{pool:S.string().describe("Pool name or address"),collateral_token:S.string().describe("Collateral token symbol"),debt_token:S.string().describe("Debt token symbol"),action:S.enum(["borrow","repay","deposit","withdraw"]).describe("Action to simulate"),amount:S.string().describe("Amount for the action")},{readOnlyHint:true,destructiveHint:false},Ze(Ohe)),10}Vo();function c0e(t){return t.tool("dca_preview","Preview a single DCA cycle to see the expected buy amount and price impact before creating an order. Use this FIRST before dca_create.",{sell_amount_per_cycle:S.string().describe("Amount to sell per cycle (e.g. '10', '0.5')"),sell_token:S.string().describe("Token to sell (e.g. 'STRK', 'ETH')"),buy_token:S.string().describe("Token to buy (e.g. 'USDC', 'ETH')"),provider:S.enum(["avnu","ekubo"]).optional().describe("DCA provider (default: avnu)")},{readOnlyHint:true,destructiveHint:false},Ze(Lhe)),t.tool("dca_create","Create a recurring Dollar-Cost Averaging (DCA) order. Periodically swaps a fixed amount of sell_token into buy_token at the specified frequency.",{sell_amount:S.string().describe("Total amount to sell across all cycles (e.g. '100')"),sell_token:S.string().describe("Token to sell (e.g. 'STRK', 'ETH')"),buy_token:S.string().describe("Token to buy (e.g. 'USDC', 'ETH')"),amount_per_cycle:S.string().describe("Amount to sell per cycle (e.g. '10')"),frequency:S.string().optional().describe("ISO 8601 duration between cycles (default: 'P1D'=daily). Examples: 'PT12H'=12hrs, 'P1W'=weekly"),provider:S.enum(["avnu","ekubo"]).optional().describe("DCA provider (default: avnu)"),simulate:S.boolean().optional().describe("Set true to estimate fees without executing")},{readOnlyHint:false,destructiveHint:true,idempotentHint:false},Ze(Nhe)),t.tool("dca_list","List DCA orders for the current wallet. Optionally filter by status (ACTIVE, CLOSED, INDEXING) and provider.",{status:S.enum(["ACTIVE","CLOSED","INDEXING"]).optional().describe("Filter orders by status"),provider:S.enum(["avnu","ekubo"]).optional().describe("Filter by DCA provider"),page:S.number().optional().describe("Page number (0-based)"),size:S.number().optional().describe("Page size (default: provider default)")},{readOnlyHint:true,destructiveHint:false},Ze($he)),t.tool("dca_cancel","Cancel an active DCA order. Use the order_id (UUID from dca_list) or order_address (on-chain contract address from dca_list). At least one is required.",{order_id:S.string().optional().describe("DCA order UUID (the 'id' field from dca_list)"),order_address:S.string().optional().describe("DCA order on-chain contract address (the 'orderAddress' field from dca_list)"),provider:S.enum(["avnu","ekubo"]).optional().describe("DCA provider of the order")},{readOnlyHint:false,destructiveHint:true,idempotentHint:false},Ze(Dhe)),4}Vo();function l0e(t){return t.tool("confidential_setup","Configure Tongo Cash credentials for confidential transfers. Must be called before any other confidential operations.",{tongo_key:S.string().describe("Tongo private key (kept locally, never sent to network)"),contract_address:S.string().describe("Tongo contract address on Starknet (0x\u2026)")},{readOnlyHint:false,destructiveHint:false},Ze(Khe)),t.tool("confidential_balance","Check confidential account balance (active + pending). Call this FIRST before fund/transfer/withdraw.",{},{readOnlyHint:true,destructiveHint:false},Ze(Xhe)),t.tool("confidential_fund","Fund your confidential account from public balance. Moves public ERC20 tokens into a private confidential balance.",{amount:S.string().describe("Amount to fund (e.g. '100')"),token:S.string().optional().describe("Token symbol (default: USDC)"),simulate:S.boolean().optional().describe("Set true to estimate fees without executing")},{readOnlyHint:false,destructiveHint:true,idempotentHint:false},Ze(Yhe)),t.tool("confidential_transfer","Transfer tokens confidentially to another Tongo account. Amounts are hidden on-chain via ZK proofs. Recipient is identified by elliptic curve point (x, y), NOT a Starknet address.",{amount:S.string().describe("Amount to transfer"),recipient_x:S.string().describe("Recipient public key X coordinate (BigNumberish)"),recipient_y:S.string().describe("Recipient public key Y coordinate (BigNumberish)"),token:S.string().optional().describe("Token symbol (default: USDC)"),simulate:S.boolean().optional().describe("Set true to estimate fees without executing")},{readOnlyHint:false,destructiveHint:true,idempotentHint:false},Ze(Qhe)),t.tool("confidential_withdraw","Withdraw from confidential account to a public Starknet address. Converts private balance back to public ERC20 tokens.",{amount:S.string().describe("Amount to withdraw"),to:S.string().optional().describe("Recipient Starknet address (default: own wallet)"),token:S.string().optional().describe("Token symbol (default: USDC)"),simulate:S.boolean().optional().describe("Set true to estimate fees without executing")},{readOnlyHint:false,destructiveHint:true,idempotentHint:false},Ze(e0e)),t.tool("confidential_ragequit","Emergency exit \u2014 withdraw entire confidential balance to a public address. Use when you need to exit immediately.",{to:S.string().optional().describe("Recipient Starknet address (default: own wallet)")},{readOnlyHint:false,destructiveHint:true,idempotentHint:false},Ze(t0e)),t.tool("confidential_rollover","Activate pending confidential balance. Received transfers start as 'pending' and must be rolled over to become spendable.",{},{readOnlyHint:false,destructiveHint:false},Ze(r0e)),7}function d0e(t){let e=[{name:"Auth & Config",count:n0e(t)},{name:"Wallet",count:o0e(t)},{name:"Trade",count:a0e(t)},{name:"Staking",count:i0e(t)},{name:"Lending",count:s0e(t)},{name:"DCA",count:c0e(t)},{name:"Confidential",count:l0e(t)}];return {total:e.reduce((r,n)=>r+n.count,0),categories:e}}var AF={name:"starkfi",version:"0.6.3"},GHe=`StarkFi is a Starknet DeFi toolkit. You can:
|
|
133
133
|
- Check auth status and configure settings (network, RPC, gas payment mode)
|
|
134
134
|
- Query balances, deploy accounts, send tokens, and view full portfolio with USD values
|
|
135
135
|
- Get swap quotes and execute token swaps via Fibrous aggregation
|
|
@@ -338,7 +338,7 @@ Examples:
|
|
|
338
338
|
$ starkfi conf-ragequit
|
|
339
339
|
$ starkfi conf-ragequit --to 0x1234\u2026`).action(async e=>{let r=Ue("Executing ragequit...").start();try{let n=Fe(),{wallet:o}=await je(n),a=Ia(),i=$o(o,a);await o.ensureReady({deploy:"if_needed"});let s=await I5(o,i,{to:e.to});r.succeed("Ragequit complete \u2014 all funds withdrawn"),Gt({to:e.to??"own wallet",txHash:s.hash,explorer:s.explorerUrl},e);}catch(n){r.fail("Ragequit failed"),console.error(Be(n)),process.exit(1);}});}function oge(t){t.command("conf-rollover").description("Activate pending confidential balance").option("--json","Output raw JSON").addHelpText("after",`
|
|
340
340
|
Examples:
|
|
341
|
-
$ starkfi conf-rollover`).action(async e=>{let r=Ue("Rolling over pending balance...").start();try{let n=Fe(),{wallet:o}=await je(n),a=Ia(),i=$o(o,a);await o.ensureReady({deploy:"if_needed"});let s=await C5(o,i);r.succeed("Rollover complete \u2014 pending balance is now active"),Gt({txHash:s.hash,explorer:s.explorerUrl},e);}catch(n){r.fail("Rollover failed"),console.error(Be(n)),process.exit(1);}});}var age="0.6.
|
|
341
|
+
$ starkfi conf-rollover`).action(async e=>{let r=Ue("Rolling over pending balance...").start();try{let n=Fe(),{wallet:o}=await je(n),a=Ia(),i=$o(o,a);await o.ensureReady({deploy:"if_needed"});let s=await C5(o,i);r.succeed("Rollover complete \u2014 pending balance is now active"),Gt({txHash:s.hash,explorer:s.explorerUrl},e);}catch(n){r.fail("Rollover failed"),console.error(Be(n)),process.exit(1);}});}var age="0.6.3";process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));var WHe=["\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2557","\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2554\u255D\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2551","\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2554\u255D \u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551","\u255A\u2550\u2550\u2550\u2550\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2588\u2588\u2557 \u2588\u2588\u2554\u2550\u2550\u255D \u2588\u2588\u2551","\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2551","\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u255D"],KHe=WHe.map((t,e)=>fe.bold.hex(nH[e]??Rh)(t)).join(`
|
|
342
342
|
`),XHe=fe.dim("v")+fe.hex(wd).bold(age)+fe.dim(" \xB7 ")+fe.white("Starknet DeFi CLI + MCP Server"),YHe=`
|
|
343
343
|
${KHe}
|
|
344
344
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "starkfi",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.3",
|
|
4
4
|
"description": "AI-native Starknet DeFi CLI + MCP Server + Agent Skills — Swaps, multi-swap, batch (multicall), staking, lending, DCA, confidential transfers, simulation, portfolio, gas abstraction",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|