/**
 * Minified by jsDelivr using Terser v5.39.0.
 * Original file: /npm/@xmtp/agent-sdk@2.3.0/dist/index.js
 *
 * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files
 */
import{Group,Dm,Client,encryptAttachment,decryptAttachment,isMarkdown,isText,isReply,isReaction,isReadReceipt,isRemoteAttachment,isTransactionReference,isWalletSendCalls,encodeMarkdown,encodeText,isHexString,isMultiRemoteAttachment,isLeaveRequest,isGroupUpdated,isIntent,isAttachment,isActions}from"@xmtp/node-sdk";export*from"@xmtp/node-sdk";import EventEmitter from"node:events";import fs from"node:fs";import path from"node:path";import{retry}from"ts-retry-promise";import{contentTypesAreEqual}from"@xmtp/content-type-primitives";import{toBytes,createWalletClient,http,isAddress,encodeFunctionData,toHex,createPublicClient}from"viem";import{generatePrivateKey,privateKeyToAccount}from"viem/accounts";import{sepolia}from"viem/chains";import{monitorEventLoopDelay,performance}from"node:perf_hooks";import v8 from"node:v8";import{randomUUID}from"node:crypto";import{escape}from"node:querystring";const version="2.3.0",fromSelf=(e,t)=>e.senderInboxId===t.inboxId,hasContent=e=>void 0!==e.content&&null!==e.content,isDM=e=>e instanceof Dm,isGroup=e=>e instanceof Group,isGroupAdmin=(e,t)=>!!isGroup(e)&&e.isAdmin(t.senderInboxId),isGroupSuperAdmin=(e,t)=>!!isGroup(e)&&e.isSuperAdmin(t.senderInboxId),usesCodec=(e,t)=>contentTypesAreEqual(e.contentType,(new t).contentType),filter={fromSelf:fromSelf,hasContent:hasContent,isDM:isDM,isGroup:isGroup,isGroupAdmin:isGroupAdmin,isGroupSuperAdmin:isGroupSuperAdmin,usesCodec:usesCodec},f=filter,validLogLevels=["Off","Error","Warn","Info","Debug","Trace"],isLogLevel=e=>validLogLevels.includes(e),getValidLogLevels=()=>[...validLogLevels],parseLogLevel=e=>{const t=e.charAt(0).toUpperCase()+e.slice(1).toLowerCase();return isLogLevel(t)?t:null},logDetails=async e=>{const t=e.client,s=t.accountIdentifier?.identifier,n=t.inboxId,i=t.installationId,a=t.env,r=[`http://xmtp.chat/${a}/dm/${s}`],o=await t.conversations.list(),c=await t.preferences.inboxState(),l=await t.fetchKeyPackageStatuses([i]);let d=new Date,h=new Date;const m=l[i]??{};m.lifetime&&(d=new Date(1e3*Number(m.lifetime.notBefore)),h=new Date(1e3*Number(m.lifetime.notAfter))),console.log(`\n    [38;2;252;76;52m\n    ██╗  ██╗███╗   ███╗████████╗██████╗\n    ╚██╗██╔╝████╗ ████║╚══██╔══╝██╔══██╗\n     ╚███╔╝ ██╔████╔██║   ██║   ██████╔╝\n     ██╔██╗ ██║╚██╔╝██║   ██║   ██╔═══╝\n    ██╔╝ ██╗██║ ╚═╝ ██║   ██║   ██║\n    ╚═╝  ╚═╝╚═╝     ╚═╝   ╚═╝   ╚═╝\n  [0m\n\n    ✓ XMTP Client:\n    • InboxId: ${n}\n    • LibXMTP Version: ${e.libxmtpVersion}\n    • Address: ${s}\n    • Conversations: ${o.length}\n    • Installations: ${c.installations.length}\n    • InstallationId: ${i}\n    • Key Package created: ${d.toLocaleString()}\n    • Key Package valid until: ${h.toLocaleString()}\n    • Networks: ${a}\n    ${r.map((e=>`• URL: ${e}`)).join("\n")}`)},getTestUrl=e=>{const t=e.accountIdentifier?.identifier;return`http://xmtp.chat/${e.env}/dm/${t}`},getInstallationInfo=async e=>{const t=e.inboxId,s=e.installationId,n=e.env,i=e.options&&"gatewayHost"in e.options?e.options.gatewayHost:void 0,a=await Client.fetchInboxStates([t],n,i),r=a.find((e=>e.inboxId===t))?.installations||[],o=[...r].sort(((e,t)=>{const s=e.clientTimestampNs??0n,n=t.clientTimestampNs??0n;return n>s?1:n<s?-1:0}))[0],c=Buffer.from(e.installationIdBytes).toString("hex"),l={totalInstallations:r.length,installationId:s,mostRecentInstallationId:null,isMostRecent:!1};if(o){const e=Buffer.from(o.bytes).toString("hex");l.mostRecentInstallationId=e,l.isMostRecent=c===e}return l},createUser=(e,t=sepolia)=>{const s=e??generatePrivateKey(),n=privateKeyToAccount(s);return{key:s,account:n,wallet:createWalletClient({account:n,chain:t,transport:http()})}},createIdentifier=e=>({identifier:e.account.address.toLowerCase(),identifierKind:0}),createSigner=e=>{const t=createIdentifier(e);return{type:"EOA",getIdentifier:()=>t,signMessage:async t=>{const s=await e.wallet.signMessage({account:e.account,message:t});return toBytes(s)}}};class AgentError extends Error{#e;constructor(e,t,s){super(t,{cause:s}),this.#e=e}get code(){return this.#e}}class AgentStreamingError extends AgentError{}class ClientContext{#t;constructor({client:e}){this.#t=e}getClientAddress(){return this.#t.accountIdentifier?.identifier}get client(){return this.#t}}async function downloadRemoteAttachment(e){const t=await fetch(e.url);if(!t.ok)throw new Error(`unable to fetch remote attachment at "${e.url}": [${t.status}] ${t.statusText}`);const s=new Uint8Array(await t.arrayBuffer());return decryptAttachment(s,e)}function createRemoteAttachment(e,t){const s=new URL(t);return{contentDigest:e.contentDigest,contentLength:e.payload.length,filename:e.filename,nonce:e.nonce,salt:e.salt,scheme:s.protocol,secret:e.secret,url:s.toString()}}async function createRemoteAttachmentFromFile(e,t){const s=await e.arrayBuffer(),n={content:new Uint8Array(s),filename:e.name,mimeType:e.type},i=encryptAttachment(n);return createRemoteAttachment(i,await t(i))}class ConversationContext extends ClientContext{#s;constructor({conversation:e,client:t}){super({client:t}),this.#s=e}isDm(){return filter.isDM(this.#s)}isGroup(){return filter.isGroup(this.#s)}async sendRemoteAttachment(e,t){const s=await createRemoteAttachmentFromFile(e,t);await this.#s.sendRemoteAttachment(s)}get conversation(){return this.#s}get isAllowed(){return 1===this.#s.consentState()}get isDenied(){return 2===this.#s.consentState()}get isUnknown(){return 0===this.#s.consentState()}}class MessageContext extends ConversationContext{#n;constructor({message:e,conversation:t,client:s}){super({conversation:t,client:s}),this.#n=e}usesCodec(e){return filter.usesCodec(this.#n,e)}isMarkdown(){return isMarkdown(this.#n)}isText(){return isText(this.#n)}isReply(){return isReply(this.#n)}isReaction(){return isReaction(this.#n)}isReadReceipt(){return isReadReceipt(this.#n)}isRemoteAttachment(){return isRemoteAttachment(this.#n)}isTransactionReference(){return isTransactionReference(this.#n)}isWalletSendCalls(){return isWalletSendCalls(this.#n)}async sendReaction(e,t=1){const s={action:1,reference:this.#n.id,referenceInboxId:this.#n.senderInboxId,schema:t,content:e};await this.conversation.sendReaction(s)}async#i(e){await this.conversation.sendReply({content:e,reference:this.#n.id,referenceInboxId:this.#n.senderInboxId})}async sendMarkdownReply(e){await this.#i(encodeMarkdown(e))}async sendTextReply(e){await this.#i(encodeText(e))}async getSenderAddress(){const e=await this.client.preferences.getInboxStates([this.#n.senderInboxId]);return e[0]?.identifiers[0]?.identifier}get message(){return this.#n}}class Agent extends EventEmitter{#t;#a;#r;#o=[];#c=[];#l=Object.freeze({use:(...e)=>{for(const t of e)Array.isArray(t)?this.#c.push(...t):"function"==typeof t&&this.#c.push(t);return this.#l}});#d=(e,t,s)=>{const n=e instanceof Error?e:new AgentError(9999,"Unhandled error caught by default error middleware.",e);this.emit("unhandledError",n),e instanceof AgentStreamingError&&s()};#h=!1;#m=!1;#p=!1;#u;constructor({client:e}){super(),this.#t=e}static async create(e,t){const s={...t??{}};if(s.appVersion??="agent-sdk/2.3.0",s.disableDeviceSync??=!0,process.env.XMTP_FORCE_DEBUG_LEVEL){const e=process.env.XMTP_FORCE_DEBUG_LEVEL,t=parseLogLevel(e);t?s.loggingLevel=t:(console.warn(`[WARNING] Invalid XMTP_FORCE_DEBUG_LEVEL "${e}". Defaulting to "Warn". Valid values are: ${getValidLogLevels().join(", ")}`),s.loggingLevel="Warn"),s.structuredLogging=!0}const n=await Client.create(e,{...s,codecs:s.codecs}),i=await getInstallationInfo(n);return i.totalInstallations>1&&i.isMostRecent&&console.warn(`[WARNING] You have "${i.totalInstallations}" installations. Installation ID "${i.installationId}" is the most recent. Make sure to persist and reload your installation data. If you exceed the installation limit, your Agent will stop working. Read more: https://docs.xmtp.org/agents/build-agents/local-database#installation-limits-and-revocation-rules`),new Agent({client:n})}static async createFromEnv(e){const{XMTP_DB_DIRECTORY:t,XMTP_DB_ENCRYPTION_KEY:s,XMTP_ENV:n,XMTP_WALLET_KEY:i,XMTP_GATEWAY_HOST:a}=process.env;if(!isHexString(i))throw new AgentError(1e3,"XMTP_WALLET_KEY env is not in hex (0x) format.");const r=createSigner(createUser(i)),o={...e??{}};o.dbEncryptionKey="string"==typeof s?isHexString(s)?s:`0x${s}`:void 0;return n&&["local","dev","production","testnet-staging","testnet-dev","testnet","mainnet"].includes(n)&&(o.env=n),"string"==typeof a&&(o.gatewayHost=a),"string"==typeof t&&(fs.mkdirSync(t,{recursive:!0,mode:448}),o.dbPath=e=>{const s=path.join(t,`xmtp-${e}.db3`);return console.info(`Saving local database to "${s}"`),s}),this.create(r,o)}get libxmtpVersion(){return this.#t.libxmtpVersion}use(...e){for(const t of e)Array.isArray(t)?this.#o.push(...t):"function"==typeof t&&this.#o.push(t);return this}async#g(){try{await(this.#a?.end())}finally{this.#a=void 0}try{await(this.#r?.end())}finally{this.#r=void 0}}async#f(e){if(this.#m)return;this.#m=!0,await this.#g();await this.#w(e,{client:this.#t})&&!this.#p?(await this.#y(),this.emit("start",new ClientContext({client:this.#t})),this.#h=!1):this.#h=!1,this.#m=!1}async#y(){return retry((async()=>{await this.#g(),await this.#v(this.#u)}),{retries:10,delay:1e3,backoff:"EXPONENTIAL",maxBackOff:3e4,timeout:"INFINITELY",retryIf:()=>!this.#p})}async#v(e){this.#a=await this.#t.conversations.stream({...e,onValue:async e=>{try{if(!e)return;this.emit("conversation",new ConversationContext({conversation:e,client:this.#t})),e instanceof Group?this.emit("group",new ConversationContext({conversation:e,client:this.#t})):e instanceof Dm&&this.emit("dm",new ConversationContext({conversation:e,client:this.#t}))}catch(e){await this.#w(new AgentError(1001,"Emitted value from conversation stream caused an error.",e),new ClientContext({client:this.#t}))||await this.stop()}},onError:async e=>{await this.#f(new AgentStreamingError(1002,"Error occurred during conversation streaming.",e))}}),this.#r=await this.#t.conversations.streamAllMessages({...e,onValue:async e=>{try{switch(!0){case isActions(e):await this.#C(e,"actions");break;case isAttachment(e):await this.#C(e,"inline-attachment");break;case isIntent(e):await this.#C(e,"intent");break;case isGroupUpdated(e):await this.#C(e,"group-update");break;case isLeaveRequest(e):await this.#C(e,"leave-request");break;case isMultiRemoteAttachment(e):await this.#C(e,"multi-attachment");break;case isRemoteAttachment(e):await this.#C(e,"attachment");break;case isReaction(e):await this.#C(e,"reaction");break;case isReadReceipt(e):await this.#C(e,"read-receipt");break;case isReply(e):await this.#C(e,"reply");break;case isTransactionReference(e):await this.#C(e,"transaction-reference");break;case isWalletSendCalls(e):await this.#C(e,"wallet-send-calls");break;case isMarkdown(e):await this.#C(e,"markdown");break;case isText(e):await this.#C(e,"text");break;default:await this.#C(e)}}catch(e){await this.#w(e,{client:this.#t})||await this.stop(),this.#h=!1}},onError:async e=>{await this.#f(new AgentStreamingError(1004,"Error occurred during message streaming.",e))}})}async start(e){if(!(this.#h||this.#a||this.#r)){this.#p=!1,this.#u=e,this.#h=!0;try{await this.#v(e),this.emit("start",new ClientContext({client:this.#t})),this.#h=!1}catch(e){await this.#f(new AgentStreamingError(1005,"Error occurred during stream setup.",e))}}}async#C(e,t="unknownMessage"){if(!filter.hasContent(e))return;if(filter.fromSelf(e,this.#t))return;const s=await this.#t.conversations.getConversationById(e.conversationId);if(!s)throw new AgentError(1003,`Failed to process message ID "${e.id}" for conversation ID "${e.conversationId}" because the conversation could not be found.`);const n=new MessageContext({message:e,conversation:s,client:this.#t});await this.#I(n,t)}async#I(e,t="unknownMessage"){const s=this.#o.reduceRight(((t,s)=>async()=>{try{await s(e,t)}catch(s){await this.#w(s,e)&&await t()}}),(async()=>{try{this.emit(t,e),this.emit("message",e)}catch(t){await this.#w(t,e)}}));await s()}async#A(e,t,s){let n=!1,i={kind:"stopped"};const a=e=>{n||(n=!0,i=void 0===e?{kind:"handled"}:{kind:"continue",error:e})};try{return await e(s,t,a),i}catch(e){return n?i:{kind:"continue",error:e}}}async#w(e,t){const s=[...this.#c,this.#d];let n=e;for(let e=0;e<s.length;e++){const i=s[e];if(!i)continue;const a=await this.#A(i,t,n);switch(a.kind){case"handled":return!0;case"stopped":return!1;case"continue":n=a.error}}return!1}get client(){return this.#t}get errors(){return this.#l}async stop(){this.#p=!0,this.#h=!0,await this.#g(),this.emit("stop",new ClientContext({client:this.#t})),this.#h=!1}createDmWithAddress(e,t){return this.#t.conversations.createDmWithIdentifier({identifier:e,identifierKind:0},t)}createGroupWithAddresses(e,t){const s=e.map((e=>({identifier:e,identifierKind:0})));return this.#t.conversations.createGroupWithIdentifiers(s,t)}addMembersWithAddresses(e,t){const s=t.map((e=>({identifier:e,identifierKind:0})));return e.addMembersByIdentifiers(s)}async getConversationContext(e){const t=await this.client.conversations.getConversationById(e);if(t){return new ConversationContext({conversation:t,client:this.#t})}}get address(){return this.#t.accountIdentifier?.identifier}}class CommandRouter{#x=new Map;#R=null;constructor(e={}){e.helpCommand&&this.#M(e.helpCommand)}#M(e){this.command(e,"Show available commands",(async e=>{const t=[];[...this.#x.entries()].sort(((e,t)=>e[0].localeCompare(t[0]))).forEach((([e,s],n)=>{s.description?t.push(`${n+1}. \`${e}\` - ${s.description}`):t.push(`${n+1}. \`${e}\``)})),await e.sendMarkdownReply(t.join("\n"))}))}get commandList(){return Array.from(this.#x.keys())}command(e,t,s){if(!e.startsWith("/"))throw new Error('Command must start with "/"');let n,i;if("function"==typeof t)n=t;else{if(i=t,!s)throw new Error("Handler implementation is required when description is provided.");n=s}return this.#x.set(e.toLowerCase(),{handler:n,description:i}),this}default(e){return this.#R=e,this}async handle(e){const t=e.message.content.split(" "),s=t[0]?.toLowerCase();if(!s)return!1;if(s.startsWith("/")){const n=this.#x.get(s);if(n){const s=t.slice(1).join(" ");return e.message.content=s,await n.handler(e),!0}}return!!this.#R&&(await this.#R(e),!0)}middleware(){return async(e,t)=>{if(e.isText()){await this.handle(e)||await t()}else await t()}}}class PerformanceMonitor{#b;#E;#S;#L;#T;#k;#$;#D;#H;#N;constructor(e={}){const{healthReportInterval:t=6e4,criticalThresholdInterval:s=1e4}=e;this.#T=s;this.#k=e.onCriticalResponse??(e=>{console.warn(`[PerformanceMonitor] Critical: Response time exceeded ${s/1e3}s (${e.toFixed(0)}ms)`)}),this.#$=e.onHealthReport??(e=>{console.log(`[${(new Date).toISOString()}] CPU: ${e.cpuPercent.toFixed(1)}% | Event Loop: ${e.eventLoopDelayMs.toFixed(1)}ms | Heap: ${e.heapPercent.toFixed(1)}% (${e.heapMB.toFixed(0)}MB/${e.totalMB.toFixed(1)}MB)`)}),this.#D=e.onResponse,this.#H=e.onShutdown??(()=>{console.log("[PerformanceMonitor] Monitoring shut down")}),this.#E=!1,this.#N=monitorEventLoopDelay(),this.#N.enable(),this.#S=process.cpuUsage(),this.#L=Date.now(),t>0&&(this.#P(),this.#b=setInterval((()=>{this.#P()}),t).unref())}#U(){const e=process.cpuUsage(this.#S),t=Date.now()-this.#L,s=e.user+e.system,n=1e3*t,i=n>0?s/n*100:0;return this.#S=process.cpuUsage(),this.#L=Date.now(),i}#_(){const e=process.memoryUsage(),t=v8.getHeapStatistics(),s=e.heapUsed/1024/1024,n=t.heap_size_limit/1024/1024;return{heapMB:s,heapPercent:s/n*100,heapLimitMB:n,totalMB:e.rss/1024/1024}}#P(){const e=this.#U(),t=this.#_(),s=this.#N.mean,n=Number.isNaN(s)?0:s/1e6;this.#N.reset(),this.#$({cpuPercent:e,eventLoopDelayMs:n,...t})}shutdown(){this.#E||(this.#E=!0,clearInterval(this.#b),this.#b=void 0,this.#N.disable(),this.#H())}middleware(){return async(e,t)=>{const s=performance.now();try{await t()}finally{const e=performance.now()-s;this.#D?.(e),e>this.#T&&this.#k(e)}}}}const CANCEL_ACTION_ID=randomUUID();class ActionWizard{#B;#W;#G;#F=[];#K=new Map;#O;#V;constructor(e,t){this.#B=e,this.#W=t?.dm??!1,t?.cancel&&(this.#G="object"==typeof t.cancel?t.cancel.label??"Cancel":"Cancel")}static sessionKey(e,t){return`${e}:${t}`}static stepKey(e,t){return`${e}:${t}`}select(e,t){return this.#F.push({type:"select",id:e,description:t.description,actions:t.actions}),this}text(e,t){return this.#F.push({type:"text",id:e,description:t.description,isMarkdown:t.isMarkdown??!1}),this}onComplete(e){return this.#O=e,this}onCancel(e){return this.#V=e,this}async start(e){const{senderInboxId:t}=e.message,s=this.#W?await e.client.conversations.createDm(t):e.conversation,n=ActionWizard.sessionKey(s.id,t);this.#K.set(n,{currentStepIndex:0,answers:{},conversation:s}),await this.#X(n)}isActive(e,t){return this.#K.has(ActionWizard.sessionKey(e,t))}async#X(e){const t=this.#K.get(e);if(!t)return;const s=this.#F[t.currentStepIndex];if(s)if("select"===s.type){const e=this.#G?[...s.actions,{id:CANCEL_ACTION_ID,label:this.#G}]:s.actions,n={id:ActionWizard.stepKey(this.#B,s.id),description:s.description,actions:e};await t.conversation.sendActions(n)}else s.isMarkdown?await t.conversation.sendMarkdown(s.description):await t.conversation.sendText(s.description)}async#j(e,t){this.#K.delete(e),await(this.#V?.(t))}async#z(e,t){const s=this.#K.get(e);if(!s)return;s.currentStepIndex++;if(s.currentStepIndex>=this.#F.length){const n={...s.answers};this.#K.delete(e),await(this.#O?.(n,t))}else await this.#X(e)}middleware(){return async(e,t)=>{const s=ActionWizard.sessionKey(e.conversation.id,e.message.senderInboxId);if(isText(e.message)&&e.message.content===`/${this.#B}`)return this.#K.has(s)&&await this.#j(s,e),void await this.start(e);const n=this.#K.get(s);if(!n)return void await t();const i=this.#F[n.currentStepIndex];if(i){if(isIntent(e.message)&&e.message.content){const{actionId:t}=e.message.content;if(this.#G&&t===CANCEL_ACTION_ID)return void await this.#j(s,e);if("select"===i.type)return n.answers[i.id]=t,void await this.#z(s,e)}if("text"===i.type&&isText(e.message)&&e.message.content)return n.answers[i.id]=e.message.content,void await this.#z(s,e);await t()}else await t()}}}class LimitedMap{#Y=new Map;#q;constructor(e){this.#q=e}set(e,t){if(this.#Y.size>=this.#q){const e=this.#Y.keys().next();e.done||this.#Y.delete(e.value)}this.#Y.set(e,t)}get(e){return this.#Y.get(e)}}const cache=new LimitedMap(1e3),fetchFromWeb3Bio=async(e,t)=>{const s=`https://api.web3.bio/ns/${escape(e)}`,n={"Content-Type":"application/json"};t&&(n["X-API-KEY"]=`Bearer ${t}`);const i=await fetch(s,{method:"GET",headers:n});if(!i.ok)throw new AgentError(2e3,`Could not resolve address for name "${e}": ${i.statusText} (${i.status})`);return i.json()},resolveName=async(e,t)=>{if(isAddress(e))return e;const s=cache.get(e);if(void 0!==s)return s;const n=await fetchFromWeb3Bio(e,t);if(0===n.length)return null;const i=n[0]?.address;return i?(cache.set(e,i),i):null},createNameResolver=e=>t=>resolveName(t,e),erc20Abi=[{type:"function",name:"transfer",inputs:[{name:"to",type:"address"},{name:"amount",type:"uint256"}],outputs:[{name:"",type:"bool"}],stateMutability:"nonpayable"},{type:"function",name:"balanceOf",inputs:[{name:"account",type:"address"}],outputs:[{name:"",type:"uint256"}],stateMutability:"view"},{type:"function",name:"decimals",inputs:[],outputs:[{name:"",type:"uint8"}],stateMutability:"view"}];function createERC20TransferCalls(e){const{chain:t,tokenAddress:s,from:n,to:i,amount:a,description:r}=e,o=encodeFunctionData({abi:erc20Abi,functionName:"transfer",args:[i,a]});return{version:"1.0",chainId:toHex(t.id),from:n,calls:[{to:s,data:o,value:"0x0",metadata:{description:r,transactionType:"transfer"}}]}}function createNativeTransferCalls(e){const{chain:t,from:s,to:n,amount:i,description:a}=e;return{version:"1.0",chainId:toHex(t.id),from:s,calls:[{to:n,value:toHex(i),metadata:{description:a,transactionType:"transfer"}}]}}async function getERC20Balance(e){const{chain:t,tokenAddress:s,address:n,transport:i}=e;return createPublicClient({chain:t,transport:i??http()}).readContract({address:s,abi:erc20Abi,functionName:"balanceOf",args:[n]})}async function getERC20Decimals(e){const{chain:t,tokenAddress:s,transport:n}=e;return createPublicClient({chain:t,transport:n??http()}).readContract({address:s,abi:erc20Abi,functionName:"decimals"})}export{ActionWizard,Agent,AgentError,AgentStreamingError,ClientContext,CommandRouter,ConversationContext,MessageContext,PerformanceMonitor,createERC20TransferCalls,createIdentifier,createNameResolver,createNativeTransferCalls,createRemoteAttachment,createRemoteAttachmentFromFile,createSigner,createUser,downloadRemoteAttachment,erc20Abi,f,filter,getERC20Balance,getERC20Decimals,getInstallationInfo,getTestUrl,getValidLogLevels,logDetails,parseLogLevel};
//# sourceMappingURL=/sm/7fad9e81e50dd85cd05f0d141ec752474482096e695ddf8474e838e0f0304df0.map