/**
 * goal is TX Prompt -> Moon Api calls + args
 * transcations we handle
 * Swap
 * Send
 *
 * 1 user query/intent to steps
 * 2 steps to moon api calls
 * 3 moon api calls to response.
 *
 **/
interface TransactionStep {
    title: string;
    description: string;
    successCondition: string;
    transaction: {
        to: string;
        from?: string;
        nonce?: number;
        gasLimit?: string;
        gasPrice?: string;
        data: string;
        value?: string;
        chainId?: number;
    };
}
interface BaseChatMessage {
    id: string;
    timestamp: Date;
    sender: "user" | "system";
    type: ChatMessageType;
    content?: string;
}
interface MultiStepTransactionMessage extends BaseChatMessage {
    type: "multiStepTransaction";
    steps: TransactionStep[];
}
type ChatMessageType = "protocolInfo" | "poolInfo" | "chainInfo" | "tokenInfo" | "walletInfo" | "transactionResult" | "portfolioChange" | "historicalTransaction" | "historicalPerformance" | "userMessage" | "multiStepTransaction";
interface UserMessage extends BaseChatMessage {
    type: "userMessage";
    content: string;
}
interface ProtocolInfo extends BaseChatMessage {
    type: "protocolInfo";
    name: string;
    description: string;
    tvl: number;
    apy: number;
}
interface PoolInfo extends BaseChatMessage {
    type: "poolInfo";
    name: string;
    tokens: string[];
    totalLiquidity: number;
    apy: number;
}
interface ChainInfo extends BaseChatMessage {
    type: "chainInfo";
    name: string;
    nativeCurrency: string;
    blockTime: number;
    gasPrice: number;
}
interface TokenInfo extends BaseChatMessage {
    type: "tokenInfo";
    name: string;
    symbol: string;
    price: number;
    marketCap: number;
}
interface WalletInfo extends BaseChatMessage {
    type: "walletInfo";
    address: string;
    balance: number;
    tokens: {
        symbol: string;
        balance: number;
    }[];
}
interface TransactionResultChat extends BaseChatMessage {
    type: "transactionResult";
    status: "success" | "failure";
    hash: string;
    from: string;
    to: string;
    amount: number;
    currency: string;
}
interface PortfolioChange extends BaseChatMessage {
    type: "portfolioChange";
    changePercentage: number;
    newTotal: number;
}
interface HistoricalTransaction extends BaseChatMessage {
    type: "historicalTransaction";
    transactions: {
        date: Date;
        type: string;
        amount: number;
        currency: string;
    }[];
}
interface HistoricalPerformance extends BaseChatMessage {
    type: "historicalPerformance";
    token: string;
    data: {
        date: Date;
        price: number;
    }[];
}
type ChatMessage = ProtocolInfo | PoolInfo | ChainInfo | TokenInfo | WalletInfo | TransactionResultChat | PortfolioChange | HistoricalTransaction | HistoricalPerformance | UserMessage | MultiStepTransactionMessage;

export { BaseChatMessage, ChainInfo, ChatMessage, ChatMessageType, HistoricalPerformance, HistoricalTransaction, MultiStepTransactionMessage, PoolInfo, PortfolioChange, ProtocolInfo, TokenInfo, TransactionResultChat, TransactionStep, UserMessage, WalletInfo };
